c1b5df7b61e5c55b49aca9e0b401b0be84069031
[sdk/tools/web-simulator.git] / web / ripple.js
1 /*! 
2   Ripple Mobile Environment Emulator v0.9.8 :: Built On Thu May 29 2014 19:06:01 GMT+0800 (CST)
3
4                                 Apache License
5                            Version 2.0, January 2004
6                         http://www.apache.org/licenses/
7
8    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
9
10    1. Definitions.
11
12       "License" shall mean the terms and conditions for use, reproduction,
13       and distribution as defined by Sections 1 through 9 of this document.
14
15       "Licensor" shall mean the copyright owner or entity authorized by
16       the copyright owner that is granting the License.
17
18       "Legal Entity" shall mean the union of the acting entity and all
19       other entities that control, are controlled by, or are under common
20       control with that entity. For the purposes of this definition,
21       "control" means (i) the power, direct or indirect, to cause the
22       direction or management of such entity, whether by contract or
23       otherwise, or (ii) ownership of fifty percent (50%) or more of the
24       outstanding shares, or (iii) beneficial ownership of such entity.
25
26       "You" (or "Your") shall mean an individual or Legal Entity
27       exercising permissions granted by this License.
28
29       "Source" form shall mean the preferred form for making modifications,
30       including but not limited to software source code, documentation
31       source, and configuration files.
32
33       "Object" form shall mean any form resulting from mechanical
34       transformation or translation of a Source form, including but
35       not limited to compiled object code, generated documentation,
36       and conversions to other media types.
37
38       "Work" shall mean the work of authorship, whether in Source or
39       Object form, made available under the License, as indicated by a
40       copyright notice that is included in or attached to the work
41       (an example is provided in the Appendix below).
42
43       "Derivative Works" shall mean any work, whether in Source or Object
44       form, that is based on (or derived from) the Work and for which the
45       editorial revisions, annotations, elaborations, or other modifications
46       represent, as a whole, an original work of authorship. For the purposes
47       of this License, Derivative Works shall not include works that remain
48       separable from, or merely link (or bind by name) to the interfaces of,
49       the Work and Derivative Works thereof.
50
51       "Contribution" shall mean any work of authorship, including
52       the original version of the Work and any modifications or additions
53       to that Work or Derivative Works thereof, that is intentionally
54       submitted to Licensor for inclusion in the Work by the copyright owner
55       or by an individual or Legal Entity authorized to submit on behalf of
56       the copyright owner. For the purposes of this definition, "submitted"
57       means any form of electronic, verbal, or written communication sent
58       to the Licensor or its representatives, including but not limited to
59       communication on electronic mailing lists, source code control systems,
60       and issue tracking systems that are managed by, or on behalf of, the
61       Licensor for the purpose of discussing and improving the Work, but
62       excluding communication that is conspicuously marked or otherwise
63       designated in writing by the copyright owner as "Not a Contribution."
64
65       "Contributor" shall mean Licensor and any individual or Legal Entity
66       on behalf of whom a Contribution has been received by Licensor and
67       subsequently incorporated within the Work.
68
69    2. Grant of Copyright License. Subject to the terms and conditions of
70       this License, each Contributor hereby grants to You a perpetual,
71       worldwide, non-exclusive, no-charge, royalty-free, irrevocable
72       copyright license to reproduce, prepare Derivative Works of,
73       publicly display, publicly perform, sublicense, and distribute the
74       Work and such Derivative Works in Source or Object form.
75
76    3. Grant of Patent License. Subject to the terms and conditions of
77       this License, each Contributor hereby grants to You a perpetual,
78       worldwide, non-exclusive, no-charge, royalty-free, irrevocable
79       (except as stated in this section) patent license to make, have made,
80       use, offer to sell, sell, import, and otherwise transfer the Work,
81       where such license applies only to those patent claims licensable
82       by such Contributor that are necessarily infringed by their
83       Contribution(s) alone or by combination of their Contribution(s)
84       with the Work to which such Contribution(s) was submitted. If You
85       institute patent litigation against any entity (including a
86       cross-claim or counterclaim in a lawsuit) alleging that the Work
87       or a Contribution incorporated within the Work constitutes direct
88       or contributory patent infringement, then any patent licenses
89       granted to You under this License for that Work shall terminate
90       as of the date such litigation is filed.
91
92    4. Redistribution. You may reproduce and distribute copies of the
93       Work or Derivative Works thereof in any medium, with or without
94       modifications, and in Source or Object form, provided that You
95       meet the following conditions:
96
97       (a) You must give any other recipients of the Work or
98           Derivative Works a copy of this License; and
99
100       (b) You must cause any modified files to carry prominent notices
101           stating that You changed the files; and
102
103       (c) You must retain, in the Source form of any Derivative Works
104           that You distribute, all copyright, patent, trademark, and
105           attribution notices from the Source form of the Work,
106           excluding those notices that do not pertain to any part of
107           the Derivative Works; and
108
109       (d) If the Work includes a "NOTICE" text file as part of its
110           distribution, then any Derivative Works that You distribute must
111           include a readable copy of the attribution notices contained
112           within such NOTICE file, excluding those notices that do not
113           pertain to any part of the Derivative Works, in at least one
114           of the following places: within a NOTICE text file distributed
115           as part of the Derivative Works; within the Source form or
116           documentation, if provided along with the Derivative Works; or,
117           within a display generated by the Derivative Works, if and
118           wherever such third-party notices normally appear. The contents
119           of the NOTICE file are for informational purposes only and
120           do not modify the License. You may add Your own attribution
121           notices within Derivative Works that You distribute, alongside
122           or as an addendum to the NOTICE text from the Work, provided
123           that such additional attribution notices cannot be construed
124           as modifying the License.
125
126       You may add Your own copyright statement to Your modifications and
127       may provide additional or different license terms and conditions
128       for use, reproduction, or distribution of Your modifications, or
129       for any such Derivative Works as a whole, provided Your use,
130       reproduction, and distribution of the Work otherwise complies with
131       the conditions stated in this License.
132
133    5. Submission of Contributions. Unless You explicitly state otherwise,
134       any Contribution intentionally submitted for inclusion in the Work
135       by You to the Licensor shall be under the terms and conditions of
136       this License, without any additional terms or conditions.
137       Notwithstanding the above, nothing herein shall supersede or modify
138       the terms of any separate license agreement you may have executed
139       with Licensor regarding such Contributions.
140
141    6. Trademarks. This License does not grant permission to use the trade
142       names, trademarks, service marks, or product names of the Licensor,
143       except as required for reasonable and customary use in describing the
144       origin of the Work and reproducing the content of the NOTICE file.
145
146    7. Disclaimer of Warranty. Unless required by applicable law or
147       agreed to in writing, Licensor provides the Work (and each
148       Contributor provides its Contributions) on an "AS IS" BASIS,
149       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
150       implied, including, without limitation, any warranties or conditions
151       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
152       PARTICULAR PURPOSE. You are solely responsible for determining the
153       appropriateness of using or redistributing the Work and assume any
154       risks associated with Your exercise of permissions under this License.
155
156    8. Limitation of Liability. In no event and under no legal theory,
157       whether in tort (including negligence), contract, or otherwise,
158       unless required by applicable law (such as deliberate and grossly
159       negligent acts) or agreed to in writing, shall any Contributor be
160       liable to You for damages, including any direct, indirect, special,
161       incidental, or consequential damages of any character arising as a
162       result of this License or out of the use or inability to use the
163       Work (including but not limited to damages for loss of goodwill,
164       work stoppage, computer failure or malfunction, or any and all
165       other commercial damages or losses), even if such Contributor
166       has been advised of the possibility of such damages.
167
168    9. Accepting Warranty or Additional Liability. While redistributing
169       the Work or Derivative Works thereof, You may choose to offer,
170       and charge a fee for, acceptance of support, warranty, indemnity,
171       or other liability obligations and/or rights consistent with this
172       License. However, in accepting such obligations, You may act only
173       on Your own behalf and on Your sole responsibility, not on behalf
174       of any other Contributor, and only if You agree to indemnify,
175       defend, and hold each Contributor harmless for any liability
176       incurred by, or claims asserted against, such Contributor by reason
177       of your accepting any such warranty or additional liability.
178
179    END OF TERMS AND CONDITIONS
180
181    APPENDIX: How to apply the Apache License to your work.
182
183       To apply the Apache License to your work, attach the following
184       boilerplate notice, with the fields enclosed by brackets "[]"
185       replaced with your own identifying information. (Don't include
186       the brackets!)  The text should be enclosed in the appropriate
187       comment syntax for the file format. We also recommend that a
188       file or class name and description of purpose be included on the
189       same "printed page" as the copyright notice for easier
190       identification within third-party archives.
191
192    Copyright [yyyy] [name of copyright owner]
193
194    Licensed under the Apache License, Version 2.0 (the "License");
195    you may not use this file except in compliance with the License.
196    You may obtain a copy of the License at
197
198        http://www.apache.org/licenses/LICENSE-2.0
199
200    Unless required by applicable law or agreed to in writing, software
201    distributed under the License is distributed on an "AS IS" BASIS,
202    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
203    See the License for the specific language governing permissions and
204    limitations under the License.
205
206 -------------------------------------------------------
207 Copyright 2011 Research In Motion Limited.
208
209 Contributors:
210         Brent Lintner (blintner@rim.com)
211         Dan Silivestru (dsilivestru@rim.com)
212         Gord Tanner (gtanner@rim.com)
213         Nino D'Aversa (ndaversa@rim.com)
214         Nukul Bhasin (nbhasin@rim.com)
215
216 -------------------------------------------------------
217 --> Kudos to third party awesomeness:
218
219 * browser-require *
220
221 https://github.com/rsms/browser-require
222
223 The MIT License
224 http://www.opensource.org/licenses/mit-license.php
225 Copyright (c) 2010 Rasmus Andersson http://hunch.se/
226
227 -------------------------------------------------------
228 * jWorkflow *
229
230 http://github.com/tinyhippos/jWorkflow/
231
232 The MIT License
233 http://www.opensource.org/licenses/mit-license.php
234 Copyright (c) 2010 all contributors:
235 Gord Tanner
236
237 -------------------------------------------------------
238 * jXHR.js (JSON-P XHR) *
239  v0.1 (c) Kyle Simpson 
240  MIT License
241
242 -------------------------------------------------------
243 * UI.Acceleromter Control (panel plugin) *
244
245 Licensed under the MIT license:
246   Copyright Train Hack 2010
247   Contributors: Wolfram Kriesing, Dan Silivestru, Brent Lintner
248   http://www.opensource.org/licenses/mit-license.php
249
250 -------------------------------------------------------
251 * jQuery JavaScript Library *
252
253 http://jquery.com/
254
255 Copyright 2010, John Resig
256 Licensed under MIT
257 http://jquery.org/license
258
259 Includes Sizzle.js
260 http://sizzlejs.com/
261 Copyright 2010, The Dojo Foundation
262 Released under the MIT, BSD, and GPL Licenses.
263
264 -------------------------------------------------------
265 * jQuery UI *
266
267 Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
268 licensed under the MIT (MIT-LICENSE.txt)
269
270 http://docs.jquery.com/UI
271
272 -------------------------------------------------------
273 * jQuery Tooltip plugin *
274
275 http://bassistance.de/jquery-plugins/jquery-plugin-tooltip/
276 http://docs.jquery.com/Plugins/Tooltip
277
278 Copyright (c) 2006 - 2008 Jörn Zaefferer
279
280 Dual licensed under the MIT and GPL licenses:
281   http://www.opensource.org/licenses/mit-license.php
282   http://www.gnu.org/licenses/gpl.html
283
284 -------------------------------------------------------
285 * Math.uuid.js (v1.4) *
286
287 http://www.broofa.com
288 mailto:robert@broofa.com
289
290 Copyright (c) 2010 Robert Kieffer
291 Dual licensed under the MIT and GPL licenses.
292
293 -------------------------------------------------------
294 * Wii Opera SDK - 3D Math Class v2.7.22 2008-12-14 *
295 (c) 2007-2008 Daniel Gump. All Rights Reserved.                          
296  http://wiioperasdk.com, http://hullbreachonline.com                      
297  hullbreach@hullbreachonline.com                                          
298                                                                           
299 * Wii Opera SDK - Drawing Class v2.6.16 2008-12-14 * 
300 (c) 2007-2008 Daniel Gump. All Rights Reserved
301 http://wiioperasdk.com, http://hullbreachonline.com
302 hullbreach@hullbreachonline.com
303
304   Wii is a trademark of Nintendo Co., Ltd.                                
305   Opera is a trademark of Opera, ASA.                                     
306   This software package is not associated with either company             
307   but was created to support users of both.  Its alternative name         
308   when supporting other products is the HULLBREACH SDK.                   
309                                                                           
310   Redistribution and use in source and binary forms, with or without      
311   modification, are permitted provided that the following conditions      
312   are met:                                                                
313     * Redistributions of source code must retain the above copyright      
314       notice, this list of conditions and the following disclaimer.       
315     * Redistributions in binary form must reproduce the above copyright   
316       notice, this list of conditions and the following disclaimer in     
317       the documentation and/or other materials provided with the          
318       distribution.                                                       
319     * Neither the names HULLBREACH ONLINE nor WII OPERA SDK nor the names 
320       of its contributors may be used to endorse or promote products      
321       derived from this software without specific prior written           
322       permission.                                                         
323     * If the explicit purpose of the software is not to support the       
324       Nintendo Wii or the Opera Web browser, then the names of such must  
325       not be used in any derived product. The name shall be the           
326       HULLBREACH SDK with a reference link to http://hullbreachonline.    
327                                                                           
328   THIS SOFTWARE IS PROVIDED BY Daniel Gump ''AS IS'' AND ANY EXPRESS OR   
329   IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED          
330   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE  
331   DISCLAIMED. IN NO EVENT SHALL Daniel Gump BE LIABLE FOR ANY DIRECT,     
332   INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES      
333   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR      
334   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)      
335   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,     
336   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING   
337   IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE      
338   POSSIBILITY OF SUCH DAMAGE.                                             
339
340 -------------------------------------------------------
341   OpenLayers.js -- OpenLayers Map Viewer Library
342
343   Copyright 2005-2010 OpenLayers Contributors, released under the Clear BSD
344   license. Full license text below taken from http://svn.openlayers.org/trunk/openlayers/license.txt
345
346         Copyright 2005-2011 OpenLayers Contributors. All rights reserved. See
347         authors.txt for full list.
348          
349         Redistribution and use in source and binary forms, with or without modification,
350         are permitted provided that the following conditions are met:
351          
352         1. Redistributions of source code must retain the above copyright notice, this
353         list of conditions and the following disclaimer.
354          
355         2. Redistributions in binary form must reproduce the above copyright notice,
356         this list of conditions and the following disclaimer in the documentation and/or
357         other materials provided with the distribution.
358          
359         THIS SOFTWARE IS PROVIDED BY OPENLAYERS CONTRIBUTORS ``AS IS'' AND ANY EXPRESS
360         OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
361         MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
362         SHALL COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
363         INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
364         LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
365         PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
366         LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
367         OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
368         ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
369          
370         The views and conclusions contained in the software and documentation are those
371         of the authors and should not be interpreted as representing official policies,
372         either expressed or implied, of OpenLayers Contributors.
373
374   Includes compressed code under the following licenses:
375
376   (For uncompressed versions of the code used please see the
377   OpenLayers SVN repository: <http://openlayers.org/>)
378
379 -------------------------------------------------------
380   Contains portions of Rico <http://openrico.org/>
381  
382   Copyright 2005 Sabre Airline Solutions  
383   
384   Licensed under the Apache License, Version 2.0 (the "License"); you
385   may not use this file except in compliance with the License. You
386   may obtain a copy of the License at the top of this file or a the following
387   link:
388   
389          http://www.apache.org/licenses/LICENSE-2.0  
390   
391   Unless required by applicable law or agreed to in writing, software
392   distributed under the License is distributed on an "AS IS" BASIS,
393   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
394   implied. See the License for the specific language governing
395   permissions and limitations under the License. 
396
397 -------------------------------------------------------
398   Contains XMLHttpRequest.js <http://code.google.com/p/xmlhttprequest/>
399   Copyright 2007 Sergey Ilinsky (http://www.ilinsky.com)
400  
401   Licensed under the Apache License, Version 2.0 (the "License");
402   you may not use this file except in compliance with the License.
403   You may obtain a copy of the License at
404   http://www.apache.org/licenses/LICENSE-2.0
405
406 -------------------------------------------------------
407   Contains portions of Gears <http://code.google.com/apis/gears/>
408
409   Copyright 2007, Google Inc.
410
411   Redistribution and use in source and binary forms, with or without
412   modification, are permitted provided that the following conditions are met:
413
414    1. Redistributions of source code must retain the above copyright notice,
415       this list of conditions and the following disclaimer.
416    2. Redistributions in binary form must reproduce the above copyright notice,
417       this list of conditions and the following disclaimer in the documentation
418       and/or other materials provided with the distribution.
419    3. Neither the name of Google Inc. nor the names of its contributors may be
420       used to endorse or promote products derived from this software without
421       specific prior written permission.
422  
423   THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
424   WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
425   MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
426   EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
427   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
428   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
429   OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
430   WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
431   OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
432   ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
433  
434   Sets up google.gears.*, which is *the only* supported way to access Gears.
435
436   Circumvent this file at your own risk!
437  
438   In the future, Gears may automatically define google.gears.* without this
439   file. Gears may use these objects to transparently fix bugs and compatibility
440   issues. Applications that use the code below will continue to work seamlessly
441   when that happens.
442 */
443 window.require = null;window.define = null;/**
444  * almond 0.0.3 Copyright (c) 2011, The Dojo Foundation All Rights Reserved.
445  * Available via the MIT or new BSD license.
446  * see: http://github.com/jrburke/almond for details
447  */
448 /*jslint strict: false, plusplus: false */
449 /*global setTimeout: false */
450
451 var requirejs, require, define;
452 (function (undef) {
453
454     var defined = {},
455         waiting = {},
456         aps = [].slice,
457         main, req;
458
459     if (typeof define === "function") {
460         //If a define is already in play via another AMD loader,
461         //do not overwrite.
462         return;
463     }
464
465     /**
466      * Given a relative module name, like ./something, normalize it to
467      * a real name that can be mapped to a path.
468      * @param {String} name the relative name
469      * @param {String} baseName a real name that the name arg is relative
470      * to.
471      * @returns {String} normalized name
472      */
473     function normalize(name, baseName) {
474         //Adjust any relative paths.
475         if (name && name.charAt(0) === ".") {
476             //If have a base name, try to normalize against it,
477             //otherwise, assume it is a top-level require that will
478             //be relative to baseUrl in the end.
479             if (baseName) {
480                 //Convert baseName to array, and lop off the last part,
481                 //so that . matches that "directory" and not name of the baseName's
482                 //module. For instance, baseName of "one/two/three", maps to
483                 //"one/two/three.js", but we want the directory, "one/two" for
484                 //this normalization.
485                 baseName = baseName.split("/");
486                 baseName = baseName.slice(0, baseName.length - 1);
487
488                 name = baseName.concat(name.split("/"));
489
490                 //start trimDots
491                 var i, part;
492                 for (i = 0; (part = name[i]); i++) {
493                     if (part === ".") {
494                         name.splice(i, 1);
495                         i -= 1;
496                     } else if (part === "..") {
497                         if (i === 1 && (name[2] === '..' || name[0] === '..')) {
498                             //End of the line. Keep at least one non-dot
499                             //path segment at the front so it can be mapped
500                             //correctly to disk. Otherwise, there is likely
501                             //no path mapping for a path starting with '..'.
502                             //This can still fail, but catches the most reasonable
503                             //uses of ..
504                             break;
505                         } else if (i > 0) {
506                             name.splice(i - 1, 2);
507                             i -= 2;
508                         }
509                     }
510                 }
511                 //end trimDots
512
513                 name = name.join("/");
514             }
515         }
516         return name;
517     }
518
519     function makeRequire(relName, forceSync) {
520         return function () {
521             //A version of a require function that passes a moduleName
522             //value for items that may need to
523             //look up paths relative to the moduleName
524             return req.apply(undef, aps.call(arguments, 0).concat([relName, forceSync]));
525         };
526     }
527
528     function makeNormalize(relName) {
529         return function (name) {
530             return normalize(name, relName);
531         };
532     }
533
534     function makeLoad(depName) {
535         return function (value) {
536             defined[depName] = value;
537         };
538     }
539
540     function callDep(name) {
541         if (waiting.hasOwnProperty(name)) {
542             var args = waiting[name];
543             delete waiting[name];
544             main.apply(undef, args);
545         }
546         return defined[name];
547     }
548
549     /**
550      * Makes a name map, normalizing the name, and using a plugin
551      * for normalization if necessary. Grabs a ref to plugin
552      * too, as an optimization.
553      */
554     function makeMap(name, relName) {
555         var prefix, plugin,
556             index = name.indexOf('!');
557
558         if (index !== -1) {
559             prefix = normalize(name.slice(0, index), relName);
560             name = name.slice(index + 1);
561             plugin = callDep(prefix);
562
563             //Normalize according
564             if (plugin && plugin.normalize) {
565                 name = plugin.normalize(name, makeNormalize(relName));
566             } else {
567                 name = normalize(name, relName);
568             }
569         } else {
570             name = normalize(name, relName);
571         }
572
573         //Using ridiculous property names for space reasons
574         return {
575             f: prefix ? prefix + '!' + name : name, //fullName
576             n: name,
577             p: plugin
578         };
579     }
580
581     main = function (name, deps, callback, relName) {
582         var args = [],
583             usingExports,
584             cjsModule, depName, i, ret, map;
585
586         //Use name if no relName
587         if (!relName) {
588             relName = name;
589         }
590
591         //Call the callback to define the module, if necessary.
592         if (typeof callback === 'function') {
593
594             //Default to require, exports, module if no deps if
595             //the factory arg has any arguments specified.
596             if (!deps.length && callback.length) {
597                 deps = ['require', 'exports', 'module'];
598             }
599
600             //Pull out the defined dependencies and pass the ordered
601             //values to the callback.
602             for (i = 0; i < deps.length; i++) {
603                 map = makeMap(deps[i], relName);
604                 depName = map.f;
605
606                 //Fast path CommonJS standard dependencies.
607                 if (depName === "require") {
608                     args[i] = makeRequire(name);
609                 } else if (depName === "exports") {
610                     //CommonJS module spec 1.1
611                     args[i] = defined[name] = {};
612                     usingExports = true;
613                 } else if (depName === "module") {
614                     //CommonJS module spec 1.1
615                     cjsModule = args[i] = {
616                         id: name,
617                         uri: '',
618                         exports: defined[name]
619                     };
620                 } else if (defined.hasOwnProperty(depName) || waiting.hasOwnProperty(depName)) {
621                     args[i] = callDep(depName);
622                 } else if (map.p) {
623                     map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});
624                     args[i] = defined[depName];
625                 } else {
626                     throw name + ' missing ' + depName;
627                 }
628             }
629
630             ret = callback.apply(defined[name], args);
631
632             if (name) {
633                 //If setting exports via "module" is in play,
634                 //favor that over return value and exports. After that,
635                 //favor a non-undefined return value over exports use.
636                 if (cjsModule && cjsModule.exports !== undef) {
637                     defined[name] = cjsModule.exports;
638                 } else if (!usingExports) {
639                     //Use the return value from the function.
640                     defined[name] = ret;
641                 }
642             }
643         } else if (name) {
644             //May just be an object definition for the module. Only
645             //worry about defining if have a module name.
646             defined[name] = callback;
647         }
648     };
649
650     requirejs = req = function (deps, callback, relName, forceSync) {
651         if (typeof deps === "string") {
652
653             //Just return the module wanted. In this scenario, the
654             //deps arg is the module name, and second arg (if passed)
655             //is just the relName.
656             //Normalize module name, if it contains . or ..
657             return callDep(makeMap(deps, callback).f);
658         } else if (!deps.splice) {
659             //deps is a config object, not an array.
660             //Drop the config stuff on the ground.
661             if (callback.splice) {
662                 //callback is an array, which means it is a dependency list.
663                 //Adjust args if there are dependencies
664                 deps = callback;
665                 callback = arguments[2];
666             } else {
667                 deps = [];
668             }
669         }
670
671         //Simulate async callback;
672         if (forceSync) {
673             main(undef, deps, callback, relName);
674         } else {
675             setTimeout(function () {
676                 main(undef, deps, callback, relName);
677             }, 15);
678         }
679
680         return req;
681     };
682
683     /**
684      * Just drops the config on the floor, but returns req in case
685      * the config return value is used.
686      */
687     req.config = function () {
688         return req;
689     };
690
691     /**
692      * Export require as a global, but only if it does not already exist.
693      */
694     if (!require) {
695         require = req;
696     }
697
698     define = function (name, deps, callback) {
699
700         //This module may not have dependencies
701         if (!deps.splice) {
702             //deps is not an array, so probably means
703             //an object literal or factory function for
704             //the value. Adjust args.
705             callback = deps;
706             deps = [];
707         }
708
709         if (define.unordered) {
710             waiting[name] = [name, deps, callback];
711         } else {
712             main(name, deps, callback);
713         }
714     };
715
716     define.amd = {
717         jQuery: true
718     };
719 }());
720 /*!
721  * jQuery JavaScript Library v1.6
722  * http://jquery.com/
723  *
724  * Copyright 2011, John Resig
725  * licensed under the MIT 
726  * http://jquery.org/license
727  *
728  * Includes Sizzle.js
729  * http://sizzlejs.com/
730  * Copyright 2011, The Dojo Foundation
731  * Released under the MIT, BSD, and GPL Licenses.
732  *
733  * Date: Mon May 2 13:50:00 2011 -0400
734  */
735 (function( window, undefined ) {
736
737 // Use the correct document accordingly with window argument (sandbox)
738 var document = window.document,
739         navigator = window.navigator,
740         location = window.location;
741 var jQuery = (function() {
742
743 // Define a local copy of jQuery
744 var jQuery = function( selector, context ) {
745                 // The jQuery object is actually just the init constructor 'enhanced'
746                 return new jQuery.fn.init( selector, context, rootjQuery );
747         },
748
749         // Map over jQuery in case of overwrite
750         _jQuery = window.jQuery,
751
752         // Map over the $ in case of overwrite
753         _$ = window.$,
754
755         // A central reference to the root jQuery(document)
756         rootjQuery,
757
758         // A simple way to check for HTML strings or ID strings
759         // (both of which we optimize for)
760         quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
761
762         // Check if a string has a non-whitespace character in it
763         rnotwhite = /\S/,
764
765         // Used for trimming whitespace
766         trimLeft = /^\s+/,
767         trimRight = /\s+$/,
768
769         // Check for digits
770         rdigit = /\d/,
771
772         // Match a standalone tag
773         rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
774
775         // JSON RegExp
776         rvalidchars = /^[\],:{}\s]*$/,
777         rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
778         rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
779         rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
780
781         // Useragent RegExp
782         rwebkit = /(webkit)[ \/]([\w.]+)/,
783         ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
784         rmsie = /(msie) ([\w.]+)/,
785         rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
786
787         // Keep a UserAgent string for use with jQuery.browser
788         userAgent = navigator.userAgent,
789
790         // For matching the engine and version of the browser
791         browserMatch,
792
793         // The deferred used on DOM ready
794         readyList,
795
796         // The ready event handler
797         DOMContentLoaded,
798
799         // Save a reference to some core methods
800         toString = Object.prototype.toString,
801         hasOwn = Object.prototype.hasOwnProperty,
802         push = Array.prototype.push,
803         slice = Array.prototype.slice,
804         trim = String.prototype.trim,
805         indexOf = Array.prototype.indexOf,
806
807         // [[Class]] -> type pairs
808         class2type = {};
809
810 jQuery.fn = jQuery.prototype = {
811         constructor: jQuery,
812         init: function( selector, context, rootjQuery ) {
813                 var match, elem, ret, doc;
814
815                 // Handle $(""), $(null), or $(undefined)
816                 if ( !selector ) {
817                         return this;
818                 }
819
820                 // Handle $(DOMElement)
821                 if ( selector.nodeType ) {
822                         this.context = this[0] = selector;
823                         this.length = 1;
824                         return this;
825                 }
826
827                 // The body element only exists once, optimize finding it
828                 if ( selector === "body" && !context && document.body ) {
829                         this.context = document;
830                         this[0] = document.body;
831                         this.selector = selector;
832                         this.length = 1;
833                         return this;
834                 }
835
836                 // Handle HTML strings
837                 if ( typeof selector === "string" ) {
838                         // Are we dealing with HTML string or an ID?
839                         if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
840                                 // Assume that strings that start and end with <> are HTML and skip the regex check
841                                 match = [ null, selector, null ];
842
843                         } else {
844                                 match = quickExpr.exec( selector );
845                         }
846
847                         // Verify a match, and that no context was specified for #id
848                         if ( match && (match[1] || !context) ) {
849
850                                 // HANDLE: $(html) -> $(array)
851                                 if ( match[1] ) {
852                                         context = context instanceof jQuery ? context[0] : context;
853                                         doc = (context ? context.ownerDocument || context : document);
854
855                                         // If a single string is passed in and it's a single tag
856                                         // just do a createElement and skip the rest
857                                         ret = rsingleTag.exec( selector );
858
859                                         if ( ret ) {
860                                                 if ( jQuery.isPlainObject( context ) ) {
861                                                         selector = [ document.createElement( ret[1] ) ];
862                                                         jQuery.fn.attr.call( selector, context, true );
863
864                                                 } else {
865                                                         selector = [ doc.createElement( ret[1] ) ];
866                                                 }
867
868                                         } else {
869                                                 ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
870                                                 selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes;
871                                         }
872
873                                         return jQuery.merge( this, selector );
874
875                                 // HANDLE: $("#id")
876                                 } else {
877                                         elem = document.getElementById( match[2] );
878
879                                         // Check parentNode to catch when Blackberry 4.6 returns
880                                         // nodes that are no longer in the document #6963
881                                         if ( elem && elem.parentNode ) {
882                                                 // Handle the case where IE and Opera return items
883                                                 // by name instead of ID
884                                                 if ( elem.id !== match[2] ) {
885                                                         return rootjQuery.find( selector );
886                                                 }
887
888                                                 // Otherwise, we inject the element directly into the jQuery object
889                                                 this.length = 1;
890                                                 this[0] = elem;
891                                         }
892
893                                         this.context = document;
894                                         this.selector = selector;
895                                         return this;
896                                 }
897
898                         // HANDLE: $(expr, $(...))
899                         } else if ( !context || context.jquery ) {
900                                 return (context || rootjQuery).find( selector );
901
902                         // HANDLE: $(expr, context)
903                         // (which is just equivalent to: $(context).find(expr)
904                         } else {
905                                 return this.constructor( context ).find( selector );
906                         }
907
908                 // HANDLE: $(function)
909                 // Shortcut for document ready
910                 } else if ( jQuery.isFunction( selector ) ) {
911                         return rootjQuery.ready( selector );
912                 }
913
914                 if (selector.selector !== undefined) {
915                         this.selector = selector.selector;
916                         this.context = selector.context;
917                 }
918
919                 return jQuery.makeArray( selector, this );
920         },
921
922         // Start with an empty selector
923         selector: "",
924
925         // The current version of jQuery being used
926         jquery: "1.6",
927
928         // The default length of a jQuery object is 0
929         length: 0,
930
931         // The number of elements contained in the matched element set
932         size: function() {
933                 return this.length;
934         },
935
936         toArray: function() {
937                 return slice.call( this, 0 );
938         },
939
940         // Get the Nth element in the matched element set OR
941         // Get the whole matched element set as a clean array
942         get: function( num ) {
943                 return num == null ?
944
945                         // Return a 'clean' array
946                         this.toArray() :
947
948                         // Return just the object
949                         ( num < 0 ? this[ this.length + num ] : this[ num ] );
950         },
951
952         // Take an array of elements and push it onto the stack
953         // (returning the new matched element set)
954         pushStack: function( elems, name, selector ) {
955                 // Build a new jQuery matched element set
956                 var ret = this.constructor();
957
958                 if ( jQuery.isArray( elems ) ) {
959                         push.apply( ret, elems );
960
961                 } else {
962                         jQuery.merge( ret, elems );
963                 }
964
965                 // Add the old object onto the stack (as a reference)
966                 ret.prevObject = this;
967
968                 ret.context = this.context;
969
970                 if ( name === "find" ) {
971                         ret.selector = this.selector + (this.selector ? " " : "") + selector;
972                 } else if ( name ) {
973                         ret.selector = this.selector + "." + name + "(" + selector + ")";
974                 }
975
976                 // Return the newly-formed element set
977                 return ret;
978         },
979
980         // Execute a callback for every element in the matched set.
981         // (You can seed the arguments with an array of args, but this is
982         // only used internally.)
983         each: function( callback, args ) {
984                 return jQuery.each( this, callback, args );
985         },
986
987         ready: function( fn ) {
988                 // Attach the listeners
989                 jQuery.bindReady();
990
991                 // Add the callback
992                 readyList.done( fn );
993
994                 return this;
995         },
996
997         eq: function( i ) {
998                 return i === -1 ?
999                         this.slice( i ) :
1000                         this.slice( i, +i + 1 );
1001         },
1002
1003         first: function() {
1004                 return this.eq( 0 );
1005         },
1006
1007         last: function() {
1008                 return this.eq( -1 );
1009         },
1010
1011         slice: function() {
1012                 return this.pushStack( slice.apply( this, arguments ),
1013                         "slice", slice.call(arguments).join(",") );
1014         },
1015
1016         map: function( callback ) {
1017                 return this.pushStack( jQuery.map(this, function( elem, i ) {
1018                         return callback.call( elem, i, elem );
1019                 }));
1020         },
1021
1022         end: function() {
1023                 return this.prevObject || this.constructor(null);
1024         },
1025
1026         // For internal use only.
1027         // Behaves like an Array's method, not like a jQuery method.
1028         push: push,
1029         sort: [].sort,
1030         splice: [].splice
1031 };
1032
1033 // Give the init function the jQuery prototype for later instantiation
1034 jQuery.fn.init.prototype = jQuery.fn;
1035
1036 jQuery.extend = jQuery.fn.extend = function() {
1037         var options, name, src, copy, copyIsArray, clone,
1038                 target = arguments[0] || {},
1039                 i = 1,
1040                 length = arguments.length,
1041                 deep = false;
1042
1043         // Handle a deep copy situation
1044         if ( typeof target === "boolean" ) {
1045                 deep = target;
1046                 target = arguments[1] || {};
1047                 // skip the boolean and the target
1048                 i = 2;
1049         }
1050
1051         // Handle case when target is a string or something (possible in deep copy)
1052         if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
1053                 target = {};
1054         }
1055
1056         // extend jQuery itself if only one argument is passed
1057         if ( length === i ) {
1058                 target = this;
1059                 --i;
1060         }
1061
1062         for ( ; i < length; i++ ) {
1063                 // Only deal with non-null/undefined values
1064                 if ( (options = arguments[ i ]) != null ) {
1065                         // Extend the base object
1066                         for ( name in options ) {
1067                                 src = target[ name ];
1068                                 copy = options[ name ];
1069
1070                                 // Prevent never-ending loop
1071                                 if ( target === copy ) {
1072                                         continue;
1073                                 }
1074
1075                                 // Recurse if we're merging plain objects or arrays
1076                                 if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
1077                                         if ( copyIsArray ) {
1078                                                 copyIsArray = false;
1079                                                 clone = src && jQuery.isArray(src) ? src : [];
1080
1081                                         } else {
1082                                                 clone = src && jQuery.isPlainObject(src) ? src : {};
1083                                         }
1084
1085                                         // Never move original objects, clone them
1086                                         target[ name ] = jQuery.extend( deep, clone, copy );
1087
1088                                 // Don't bring in undefined values
1089                                 } else if ( copy !== undefined ) {
1090                                         target[ name ] = copy;
1091                                 }
1092                         }
1093                 }
1094         }
1095
1096         // Return the modified object
1097         return target;
1098 };
1099
1100 jQuery.extend({
1101         noConflict: function( deep ) {
1102                 if ( window.$ === jQuery ) {
1103                         window.$ = _$;
1104                 }
1105
1106                 if ( deep && window.jQuery === jQuery ) {
1107                         window.jQuery = _jQuery;
1108                 }
1109
1110                 return jQuery;
1111         },
1112
1113         // Is the DOM ready to be used? Set to true once it occurs.
1114         isReady: false,
1115
1116         // A counter to track how many items to wait for before
1117         // the ready event fires. See #6781
1118         readyWait: 1,
1119
1120         // Hold (or release) the ready event
1121         holdReady: function( hold ) {
1122                 if ( hold ) {
1123                         jQuery.readyWait++;
1124                 } else {
1125                         jQuery.ready( true );
1126                 }
1127         },
1128
1129         // Handle when the DOM is ready
1130         ready: function( wait ) {
1131                 // Either a released hold or an DOMready/load event and not yet ready
1132                 if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
1133                         // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
1134                         if ( !document.body ) {
1135                                 return setTimeout( jQuery.ready, 1 );
1136                         }
1137
1138                         // Remember that the DOM is ready
1139                         jQuery.isReady = true;
1140
1141                         // If a normal DOM Ready event fired, decrement, and wait if need be
1142                         if ( wait !== true && --jQuery.readyWait > 0 ) {
1143                                 return;
1144                         }
1145
1146                         // If there are functions bound, to execute
1147                         readyList.resolveWith( document, [ jQuery ] );
1148
1149                         // Trigger any bound ready events
1150                         if ( jQuery.fn.trigger ) {
1151                                 jQuery( document ).trigger( "ready" ).unbind( "ready" );
1152                         }
1153                 }
1154         },
1155
1156         bindReady: function() {
1157                 if ( readyList ) {
1158                         return;
1159                 }
1160
1161                 readyList = jQuery._Deferred();
1162
1163                 // Catch cases where $(document).ready() is called after the
1164                 // browser event has already occurred.
1165                 if ( document.readyState === "complete" ) {
1166                         // Handle it asynchronously to allow scripts the opportunity to delay ready
1167                         return setTimeout( jQuery.ready, 1 );
1168                 }
1169
1170                 // Mozilla, Opera and webkit nightlies currently support this event
1171                 if ( document.addEventListener ) {
1172                         // Use the handy event callback
1173                         document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
1174
1175                         // A fallback to window.onload, that will always work
1176                         window.addEventListener( "load", jQuery.ready, false );
1177
1178                 // If IE event model is used
1179                 } else if ( document.attachEvent ) {
1180                         // ensure firing before onload,
1181                         // maybe late but safe also for iframes
1182                         document.attachEvent( "onreadystatechange", DOMContentLoaded );
1183
1184                         // A fallback to window.onload, that will always work
1185                         window.attachEvent( "onload", jQuery.ready );
1186
1187                         // If IE and not a frame
1188                         // continually check to see if the document is ready
1189                         var toplevel = false;
1190
1191                         try {
1192                                 toplevel = window.frameElement == null;
1193                         } catch(e) {}
1194
1195                         if ( document.documentElement.doScroll && toplevel ) {
1196                                 doScrollCheck();
1197                         }
1198                 }
1199         },
1200
1201         // See test/unit/core.js for details concerning isFunction.
1202         // Since version 1.3, DOM methods and functions like alert
1203         // aren't supported. They return false on IE (#2968).
1204         isFunction: function( obj ) {
1205                 return jQuery.type(obj) === "function";
1206         },
1207
1208         isArray: Array.isArray || function( obj ) {
1209                 return jQuery.type(obj) === "array";
1210         },
1211
1212         // A crude way of determining if an object is a window
1213         isWindow: function( obj ) {
1214                 return obj && typeof obj === "object" && "setInterval" in obj;
1215         },
1216
1217         isNaN: function( obj ) {
1218                 return obj == null || !rdigit.test( obj ) || isNaN( obj );
1219         },
1220
1221         type: function( obj ) {
1222                 return obj == null ?
1223                         String( obj ) :
1224                         class2type[ toString.call(obj) ] || "object";
1225         },
1226
1227         isPlainObject: function( obj ) {
1228                 // Must be an Object.
1229                 // Because of IE, we also have to check the presence of the constructor property.
1230                 // Make sure that DOM nodes and window objects don't pass through, as well
1231                 if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
1232                         return false;
1233                 }
1234
1235                 // Not own constructor property must be Object
1236                 if ( obj.constructor &&
1237                         !hasOwn.call(obj, "constructor") &&
1238                         !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
1239                         return false;
1240                 }
1241
1242                 // Own properties are enumerated firstly, so to speed up,
1243                 // if last one is own, then all properties are own.
1244
1245                 var key;
1246                 for ( key in obj ) {}
1247
1248                 return key === undefined || hasOwn.call( obj, key );
1249         },
1250
1251         isEmptyObject: function( obj ) {
1252                 for ( var name in obj ) {
1253                         return false;
1254                 }
1255                 return true;
1256         },
1257
1258         error: function( msg ) {
1259                 throw msg;
1260         },
1261
1262         parseJSON: function( data ) {
1263                 if ( typeof data !== "string" || !data ) {
1264                         return null;
1265                 }
1266
1267                 // Make sure leading/trailing whitespace is removed (IE can't handle it)
1268                 data = jQuery.trim( data );
1269
1270                 // Attempt to parse using the native JSON parser first
1271                 if ( window.JSON && window.JSON.parse ) {
1272                         return window.JSON.parse( data );
1273                 }
1274
1275                 // Make sure the incoming data is actual JSON
1276                 // Logic borrowed from http://json.org/json2.js
1277                 if ( rvalidchars.test( data.replace( rvalidescape, "@" )
1278                         .replace( rvalidtokens, "]" )
1279                         .replace( rvalidbraces, "")) ) {
1280
1281                         return (new Function( "return " + data ))();
1282
1283                 }
1284                 jQuery.error( "Invalid JSON: " + data );
1285         },
1286
1287         // Cross-browser xml parsing
1288         // (xml & tmp used internally)
1289         parseXML: function( data , xml , tmp ) {
1290
1291                 if ( window.DOMParser ) { // Standard
1292                         tmp = new DOMParser();
1293                         xml = tmp.parseFromString( data , "text/xml" );
1294                 } else { // IE
1295                         xml = new ActiveXObject( "Microsoft.XMLDOM" );
1296                         xml.async = "false";
1297                         xml.loadXML( data );
1298                 }
1299
1300                 tmp = xml.documentElement;
1301
1302                 if ( ! tmp || ! tmp.nodeName || tmp.nodeName === "parsererror" ) {
1303                         jQuery.error( "Invalid XML: " + data );
1304                 }
1305
1306                 return xml;
1307         },
1308
1309         noop: function() {},
1310
1311         // Evaluates a script in a global context
1312         // Workarounds based on findings by Jim Driscoll
1313         // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
1314         globalEval: function( data ) {
1315                 if ( data && rnotwhite.test( data ) ) {
1316                         // We use execScript on Internet Explorer
1317                         // We use an anonymous function so that context is window
1318                         // rather than jQuery in Firefox
1319                         ( window.execScript || function( data ) {
1320                                 window[ "eval" ].call( window, data );
1321                         } )( data );
1322                 }
1323         },
1324
1325         nodeName: function( elem, name ) {
1326                 return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
1327         },
1328
1329         // args is for internal usage only
1330         each: function( object, callback, args ) {
1331                 var name, i = 0,
1332                         length = object.length,
1333                         isObj = length === undefined || jQuery.isFunction( object );
1334
1335                 if ( args ) {
1336                         if ( isObj ) {
1337                                 for ( name in object ) {
1338                                         if ( callback.apply( object[ name ], args ) === false ) {
1339                                                 break;
1340                                         }
1341                                 }
1342                         } else {
1343                                 for ( ; i < length; ) {
1344                                         if ( callback.apply( object[ i++ ], args ) === false ) {
1345                                                 break;
1346                                         }
1347                                 }
1348                         }
1349
1350                 // A special, fast, case for the most common use of each
1351                 } else {
1352                         if ( isObj ) {
1353                                 for ( name in object ) {
1354                                         if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
1355                                                 break;
1356                                         }
1357                                 }
1358                         } else {
1359                                 for ( ; i < length; ) {
1360                                         if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
1361                                                 break;
1362                                         }
1363                                 }
1364                         }
1365                 }
1366
1367                 return object;
1368         },
1369
1370         // Use native String.trim function wherever possible
1371         trim: trim ?
1372                 function( text ) {
1373                         return text == null ?
1374                                 "" :
1375                                 trim.call( text );
1376                 } :
1377
1378                 // Otherwise use our own trimming functionality
1379                 function( text ) {
1380                         return text == null ?
1381                                 "" :
1382                                 text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
1383                 },
1384
1385         // results is for internal usage only
1386         makeArray: function( array, results ) {
1387                 var ret = results || [];
1388
1389                 if ( array != null ) {
1390                         // The window, strings (and functions) also have 'length'
1391                         // The extra typeof function check is to prevent crashes
1392                         // in Safari 2 (See: #3039)
1393                         // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
1394                         var type = jQuery.type( array );
1395
1396                         if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
1397                                 push.call( ret, array );
1398                         } else {
1399                                 jQuery.merge( ret, array );
1400                         }
1401                 }
1402
1403                 return ret;
1404         },
1405
1406         inArray: function( elem, array ) {
1407
1408                 if ( indexOf ) {
1409                         return indexOf.call( array, elem );
1410                 }
1411
1412                 for ( var i = 0, length = array.length; i < length; i++ ) {
1413                         if ( array[ i ] === elem ) {
1414                                 return i;
1415                         }
1416                 }
1417
1418                 return -1;
1419         },
1420
1421         merge: function( first, second ) {
1422                 var i = first.length,
1423                         j = 0;
1424
1425                 if ( typeof second.length === "number" ) {
1426                         for ( var l = second.length; j < l; j++ ) {
1427                                 first[ i++ ] = second[ j ];
1428                         }
1429
1430                 } else {
1431                         while ( second[j] !== undefined ) {
1432                                 first[ i++ ] = second[ j++ ];
1433                         }
1434                 }
1435
1436                 first.length = i;
1437
1438                 return first;
1439         },
1440
1441         grep: function( elems, callback, inv ) {
1442                 var ret = [], retVal;
1443                 inv = !!inv;
1444
1445                 // Go through the array, only saving the items
1446                 // that pass the validator function
1447                 for ( var i = 0, length = elems.length; i < length; i++ ) {
1448                         retVal = !!callback( elems[ i ], i );
1449                         if ( inv !== retVal ) {
1450                                 ret.push( elems[ i ] );
1451                         }
1452                 }
1453
1454                 return ret;
1455         },
1456
1457         // arg is for internal usage only
1458         map: function( elems, callback, arg ) {
1459                 var value, key, ret = [],
1460                         i = 0,
1461                         length = elems.length,
1462                         // jquery objects are treated as arrays
1463                         isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
1464
1465                 // Go through the array, translating each of the items to their
1466                 if ( isArray ) {
1467                         for ( ; i < length; i++ ) {
1468                                 value = callback( elems[ i ], i, arg );
1469
1470                                 if ( value != null ) {
1471                                         ret[ ret.length ] = value;
1472                                 }
1473                         }
1474
1475                 // Go through every key on the object,
1476                 } else {
1477                         for ( key in elems ) {
1478                                 value = callback( elems[ key ], key, arg );
1479
1480                                 if ( value != null ) {
1481                                         ret[ ret.length ] = value;
1482                                 }
1483                         }
1484                 }
1485
1486                 // Flatten any nested arrays
1487                 return ret.concat.apply( [], ret );
1488         },
1489
1490         // A global GUID counter for objects
1491         guid: 1,
1492
1493         // Bind a function to a context, optionally partially applying any
1494         // arguments.
1495         proxy: function( fn, context ) {
1496                 if ( typeof context === "string" ) {
1497                         var tmp = fn[ context ];
1498                         context = fn;
1499                         fn = tmp;
1500                 }
1501
1502                 // Quick check to determine if target is callable, in the spec
1503                 // this throws a TypeError, but we will just return undefined.
1504                 if ( !jQuery.isFunction( fn ) ) {
1505                         return undefined;
1506                 }
1507
1508                 // Simulated bind
1509                 var args = slice.call( arguments, 2 ),
1510                         proxy = function() {
1511                                 return fn.apply( context, args.concat( slice.call( arguments ) ) );
1512                         };
1513
1514                 // Set the guid of unique handler to the same of original handler, so it can be removed
1515                 proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
1516
1517                 return proxy;
1518         },
1519
1520         // Mutifunctional method to get and set values to a collection
1521         // The value/s can be optionally by executed if its a function
1522         access: function( elems, key, value, exec, fn, pass ) {
1523                 var length = elems.length;
1524
1525                 // Setting many attributes
1526                 if ( typeof key === "object" ) {
1527                         for ( var k in key ) {
1528                                 jQuery.access( elems, k, key[k], exec, fn, value );
1529                         }
1530                         return elems;
1531                 }
1532
1533                 // Setting one attribute
1534                 if ( value !== undefined ) {
1535                         // Optionally, function values get executed if exec is true
1536                         exec = !pass && exec && jQuery.isFunction(value);
1537
1538                         for ( var i = 0; i < length; i++ ) {
1539                                 fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
1540                         }
1541
1542                         return elems;
1543                 }
1544
1545                 // Getting an attribute
1546                 return length ? fn( elems[0], key ) : undefined;
1547         },
1548
1549         now: function() {
1550                 return (new Date()).getTime();
1551         },
1552
1553         // Use of jQuery.browser is frowned upon.
1554         // More details: http://docs.jquery.com/Utilities/jQuery.browser
1555         uaMatch: function( ua ) {
1556                 ua = ua.toLowerCase();
1557
1558                 var match = rwebkit.exec( ua ) ||
1559                         ropera.exec( ua ) ||
1560                         rmsie.exec( ua ) ||
1561                         ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
1562                         [];
1563
1564                 return { browser: match[1] || "", version: match[2] || "0" };
1565         },
1566
1567         sub: function() {
1568                 function jQuerySub( selector, context ) {
1569                         return new jQuerySub.fn.init( selector, context );
1570                 }
1571                 jQuery.extend( true, jQuerySub, this );
1572                 jQuerySub.superclass = this;
1573                 jQuerySub.fn = jQuerySub.prototype = this();
1574                 jQuerySub.fn.constructor = jQuerySub;
1575                 jQuerySub.sub = this.sub;
1576                 jQuerySub.fn.init = function init( selector, context ) {
1577                         if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
1578                                 context = jQuerySub( context );
1579                         }
1580
1581                         return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
1582                 };
1583                 jQuerySub.fn.init.prototype = jQuerySub.fn;
1584                 var rootjQuerySub = jQuerySub(document);
1585                 return jQuerySub;
1586         },
1587
1588         browser: {}
1589 });
1590
1591 // Populate the class2type map
1592 jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
1593         class2type[ "[object " + name + "]" ] = name.toLowerCase();
1594 });
1595
1596 browserMatch = jQuery.uaMatch( userAgent );
1597 if ( browserMatch.browser ) {
1598         jQuery.browser[ browserMatch.browser ] = true;
1599         jQuery.browser.version = browserMatch.version;
1600 }
1601
1602 // Deprecated, use jQuery.browser.webkit instead
1603 if ( jQuery.browser.webkit ) {
1604         jQuery.browser.safari = true;
1605 }
1606
1607 // IE doesn't match non-breaking spaces with \s
1608 if ( rnotwhite.test( "\xA0" ) ) {
1609         trimLeft = /^[\s\xA0]+/;
1610         trimRight = /[\s\xA0]+$/;
1611 }
1612
1613 // All jQuery objects should point back to these
1614 rootjQuery = jQuery(document);
1615
1616 // Cleanup functions for the document ready method
1617 if ( document.addEventListener ) {
1618         DOMContentLoaded = function() {
1619                 document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
1620                 jQuery.ready();
1621         };
1622
1623 } else if ( document.attachEvent ) {
1624         DOMContentLoaded = function() {
1625                 // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
1626                 if ( document.readyState === "complete" ) {
1627                         document.detachEvent( "onreadystatechange", DOMContentLoaded );
1628                         jQuery.ready();
1629                 }
1630         };
1631 }
1632
1633 // The DOM ready check for Internet Explorer
1634 function doScrollCheck() {
1635         if ( jQuery.isReady ) {
1636                 return;
1637         }
1638
1639         try {
1640                 // If IE is used, use the trick by Diego Perini
1641                 // http://javascript.nwbox.com/IEContentLoaded/
1642                 document.documentElement.doScroll("left");
1643         } catch(e) {
1644                 setTimeout( doScrollCheck, 1 );
1645                 return;
1646         }
1647
1648         // and execute any waiting functions
1649         jQuery.ready();
1650 }
1651
1652 // Expose jQuery to the global object
1653 return jQuery;
1654
1655 })();
1656
1657
1658 var // Promise methods
1659         promiseMethods = "done fail isResolved isRejected promise then always pipe".split( " " ),
1660         // Static reference to slice
1661         sliceDeferred = [].slice;
1662
1663 jQuery.extend({
1664         // Create a simple deferred (one callbacks list)
1665         _Deferred: function() {
1666                 var // callbacks list
1667                         callbacks = [],
1668                         // stored [ context , args ]
1669                         fired,
1670                         // to avoid firing when already doing so
1671                         firing,
1672                         // flag to know if the deferred has been cancelled
1673                         cancelled,
1674                         // the deferred itself
1675                         deferred  = {
1676
1677                                 // done( f1, f2, ...)
1678                                 done: function() {
1679                                         if ( !cancelled ) {
1680                                                 var args = arguments,
1681                                                         i,
1682                                                         length,
1683                                                         elem,
1684                                                         type,
1685                                                         _fired;
1686                                                 if ( fired ) {
1687                                                         _fired = fired;
1688                                                         fired = 0;
1689                                                 }
1690                                                 for ( i = 0, length = args.length; i < length; i++ ) {
1691                                                         elem = args[ i ];
1692                                                         type = jQuery.type( elem );
1693                                                         if ( type === "array" ) {
1694                                                                 deferred.done.apply( deferred, elem );
1695                                                         } else if ( type === "function" ) {
1696                                                                 callbacks.push( elem );
1697                                                         }
1698                                                 }
1699                                                 if ( _fired ) {
1700                                                         deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] );
1701                                                 }
1702                                         }
1703                                         return this;
1704                                 },
1705
1706                                 // resolve with given context and args
1707                                 resolveWith: function( context, args ) {
1708                                         if ( !cancelled && !fired && !firing ) {
1709                                                 // make sure args are available (#8421)
1710                                                 args = args || [];
1711                                                 firing = 1;
1712                                                 try {
1713                                                         while( callbacks[ 0 ] ) {
1714                                                                 callbacks.shift().apply( context, args );
1715                                                         }
1716                                                 }
1717                                                 finally {
1718                                                         fired = [ context, args ];
1719                                                         firing = 0;
1720                                                 }
1721                                         }
1722                                         return this;
1723                                 },
1724
1725                                 // resolve with this as context and given arguments
1726                                 resolve: function() {
1727                                         deferred.resolveWith( this, arguments );
1728                                         return this;
1729                                 },
1730
1731                                 // Has this deferred been resolved?
1732                                 isResolved: function() {
1733                                         return !!( firing || fired );
1734                                 },
1735
1736                                 // Cancel
1737                                 cancel: function() {
1738                                         cancelled = 1;
1739                                         callbacks = [];
1740                                         return this;
1741                                 }
1742                         };
1743
1744                 return deferred;
1745         },
1746
1747         // Full fledged deferred (two callbacks list)
1748         Deferred: function( func ) {
1749                 var deferred = jQuery._Deferred(),
1750                         failDeferred = jQuery._Deferred(),
1751                         promise;
1752                 // Add errorDeferred methods, then and promise
1753                 jQuery.extend( deferred, {
1754                         then: function( doneCallbacks, failCallbacks ) {
1755                                 deferred.done( doneCallbacks ).fail( failCallbacks );
1756                                 return this;
1757                         },
1758                         always: function() {
1759                                 return deferred.done.apply( deferred, arguments ).fail.apply( this, arguments );
1760                         },
1761                         fail: failDeferred.done,
1762                         rejectWith: failDeferred.resolveWith,
1763                         reject: failDeferred.resolve,
1764                         isRejected: failDeferred.isResolved,
1765                         pipe: function( fnDone, fnFail ) {
1766                                 return jQuery.Deferred(function( newDefer ) {
1767                                         jQuery.each( {
1768                                                 done: [ fnDone, "resolve" ],
1769                                                 fail: [ fnFail, "reject" ]
1770                                         }, function( handler, data ) {
1771                                                 var fn = data[ 0 ],
1772                                                         action = data[ 1 ],
1773                                                         returned;
1774                                                 if ( jQuery.isFunction( fn ) ) {
1775                                                         deferred[ handler ](function() {
1776                                                                 returned = fn.apply( this, arguments );
1777                                                                 if ( jQuery.isFunction( returned.promise ) ) {
1778                                                                         returned.promise().then( newDefer.resolve, newDefer.reject );
1779                                                                 } else {
1780                                                                         newDefer[ action ]( returned );
1781                                                                 }
1782                                                         });
1783                                                 } else {
1784                                                         deferred[ handler ]( newDefer[ action ] );
1785                                                 }
1786                                         });
1787                                 }).promise();
1788                         },
1789                         // Get a promise for this deferred
1790                         // If obj is provided, the promise aspect is added to the object
1791                         promise: function( obj ) {
1792                                 if ( obj == null ) {
1793                                         if ( promise ) {
1794                                                 return promise;
1795                                         }
1796                                         promise = obj = {};
1797                                 }
1798                                 var i = promiseMethods.length;
1799                                 while( i-- ) {
1800                                         obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ];
1801                                 }
1802                                 return obj;
1803                         }
1804                 });
1805                 // Make sure only one callback list will be used
1806                 deferred.done( failDeferred.cancel ).fail( deferred.cancel );
1807                 // Unexpose cancel
1808                 delete deferred.cancel;
1809                 // Call given func if any
1810                 if ( func ) {
1811                         func.call( deferred, deferred );
1812                 }
1813                 return deferred;
1814         },
1815
1816         // Deferred helper
1817         when: function( firstParam ) {
1818                 var args = arguments,
1819                         i = 0,
1820                         length = args.length,
1821                         count = length,
1822                         deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
1823                                 firstParam :
1824                                 jQuery.Deferred();
1825                 function resolveFunc( i ) {
1826                         return function( value ) {
1827                                 args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
1828                                 if ( !( --count ) ) {
1829                                         // Strange bug in FF4:
1830                                         // Values changed onto the arguments object sometimes end up as undefined values
1831                                         // outside the $.when method. Cloning the object into a fresh array solves the issue
1832                                         deferred.resolveWith( deferred, sliceDeferred.call( args, 0 ) );
1833                                 }
1834                         };
1835                 }
1836                 if ( length > 1 ) {
1837                         for( ; i < length; i++ ) {
1838                                 if ( args[ i ] && jQuery.isFunction( args[ i ].promise ) ) {
1839                                         args[ i ].promise().then( resolveFunc(i), deferred.reject );
1840                                 } else {
1841                                         --count;
1842                                 }
1843                         }
1844                         if ( !count ) {
1845                                 deferred.resolveWith( deferred, args );
1846                         }
1847                 } else if ( deferred !== firstParam ) {
1848                         deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
1849                 }
1850                 return deferred.promise();
1851         }
1852 });
1853
1854
1855
1856 jQuery.support = (function() {
1857
1858         var div = document.createElement( "div" ),
1859                 all,
1860                 a,
1861                 select,
1862                 opt,
1863                 input,
1864                 marginDiv,
1865                 support,
1866                 fragment,
1867                 body,
1868                 bodyStyle,
1869                 tds,
1870                 events,
1871                 eventName,
1872                 i,
1873                 isSupported;
1874
1875         // Preliminary tests
1876         div.setAttribute("className", "t");
1877         div.innerHTML = "   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
1878
1879         all = div.getElementsByTagName( "*" );
1880         a = div.getElementsByTagName( "a" )[ 0 ];
1881
1882         // Can't get basic test support
1883         if ( !all || !all.length || !a ) {
1884                 return {};
1885         }
1886
1887         // First batch of supports tests
1888         select = document.createElement( "select" );
1889         opt = select.appendChild( document.createElement("option") );
1890         input = div.getElementsByTagName( "input" )[ 0 ];
1891
1892         support = {
1893                 // IE strips leading whitespace when .innerHTML is used
1894                 leadingWhitespace: ( div.firstChild.nodeType === 3 ),
1895
1896                 // Make sure that tbody elements aren't automatically inserted
1897                 // IE will insert them into empty tables
1898                 tbody: !div.getElementsByTagName( "tbody" ).length,
1899
1900                 // Make sure that link elements get serialized correctly by innerHTML
1901                 // This requires a wrapper element in IE
1902                 htmlSerialize: !!div.getElementsByTagName( "link" ).length,
1903
1904                 // Get the style information from getAttribute
1905                 // (IE uses .cssText instead)
1906                 style: /top/.test( a.getAttribute("style") ),
1907
1908                 // Make sure that URLs aren't manipulated
1909                 // (IE normalizes it by default)
1910                 hrefNormalized: ( a.getAttribute( "href" ) === "/a" ),
1911
1912                 // Make sure that element opacity exists
1913                 // (IE uses filter instead)
1914                 // Use a regex to work around a WebKit issue. See #5145
1915                 opacity: /^0.55$/.test( a.style.opacity ),
1916
1917                 // Verify style float existence
1918                 // (IE uses styleFloat instead of cssFloat)
1919                 cssFloat: !!a.style.cssFloat,
1920
1921                 // Make sure that if no value is specified for a checkbox
1922                 // that it defaults to "on".
1923                 // (WebKit defaults to "" instead)
1924                 checkOn: ( input.value === "on" ),
1925
1926                 // Make sure that a selected-by-default option has a working selected property.
1927                 // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
1928                 optSelected: opt.selected,
1929
1930                 // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
1931                 getSetAttribute: div.className !== "t",
1932
1933                 // Will be defined later
1934                 submitBubbles: true,
1935                 changeBubbles: true,
1936                 focusinBubbles: false,
1937                 deleteExpando: true,
1938                 noCloneEvent: true,
1939                 inlineBlockNeedsLayout: false,
1940                 shrinkWrapBlocks: false,
1941                 reliableMarginRight: true
1942         };
1943
1944         // Make sure checked status is properly cloned
1945         input.checked = true;
1946         support.noCloneChecked = input.cloneNode( true ).checked;
1947
1948         // Make sure that the options inside disabled selects aren't marked as disabled
1949         // (WebKit marks them as disabled)
1950         select.disabled = true;
1951         support.optDisabled = !opt.disabled;
1952
1953         // Test to see if it's possible to delete an expando from an element
1954         // Fails in Internet Explorer
1955         try {
1956                 delete div.test;
1957         } catch( e ) {
1958                 support.deleteExpando = false;
1959         }
1960
1961         if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
1962                 div.attachEvent( "onclick", function click() {
1963                         // Cloning a node shouldn't copy over any
1964                         // bound event handlers (IE does this)
1965                         support.noCloneEvent = false;
1966                         div.detachEvent( "onclick", click );
1967                 });
1968                 div.cloneNode( true ).fireEvent( "onclick" );
1969         }
1970
1971         // Check if a radio maintains it's value
1972         // after being appended to the DOM
1973         input = document.createElement("input");
1974         input.value = "t";
1975         input.setAttribute("type", "radio");
1976         support.radioValue = input.value === "t";
1977
1978         input.setAttribute("checked", "checked");
1979         div.appendChild( input );
1980         fragment = document.createDocumentFragment();
1981         fragment.appendChild( div.firstChild );
1982
1983         // WebKit doesn't clone checked state correctly in fragments
1984         support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
1985
1986         div.innerHTML = "";
1987
1988         // Figure out if the W3C box model works as expected
1989         div.style.width = div.style.paddingLeft = "1px";
1990
1991         // We use our own, invisible, body
1992         body = document.createElement( "body" );
1993         bodyStyle = {
1994                 visibility: "hidden",
1995                 width: 0,
1996                 height: 0,
1997                 border: 0,
1998                 margin: 0,
1999                 // Set background to avoid IE crashes when removing (#9028)
2000                 background: "none"
2001         };
2002         for ( i in bodyStyle ) {
2003                 body.style[ i ] = bodyStyle[ i ];
2004         }
2005         body.appendChild( div );
2006         document.documentElement.appendChild( body );
2007
2008         // Check if a disconnected checkbox will retain its checked
2009         // value of true after appended to the DOM (IE6/7)
2010         support.appendChecked = input.checked;
2011
2012         support.boxModel = div.offsetWidth === 2;
2013
2014         if ( "zoom" in div.style ) {
2015                 // Check if natively block-level elements act like inline-block
2016                 // elements when setting their display to 'inline' and giving
2017                 // them layout
2018                 // (IE < 8 does this)
2019                 div.style.display = "inline";
2020                 div.style.zoom = 1;
2021                 support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );
2022
2023                 // Check if elements with layout shrink-wrap their children
2024                 // (IE 6 does this)
2025                 div.style.display = "";
2026                 div.innerHTML = "<div style='width:4px;'></div>";
2027                 support.shrinkWrapBlocks = ( div.offsetWidth !== 2 );
2028         }
2029
2030         div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
2031         tds = div.getElementsByTagName( "td" );
2032
2033         // Check if table cells still have offsetWidth/Height when they are set
2034         // to display:none and there are still other visible table cells in a
2035         // table row; if so, offsetWidth/Height are not reliable for use when
2036         // determining if an element has been hidden directly using
2037         // display:none (it is still safe to use offsets if a parent element is
2038         // hidden; don safety goggles and see bug #4512 for more information).
2039         // (only IE 8 fails this test)
2040         isSupported = ( tds[ 0 ].offsetHeight === 0 );
2041
2042         tds[ 0 ].style.display = "";
2043         tds[ 1 ].style.display = "none";
2044
2045         // Check if empty table cells still have offsetWidth/Height
2046         // (IE < 8 fail this test)
2047         support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
2048         div.innerHTML = "";
2049
2050         // Check if div with explicit width and no margin-right incorrectly
2051         // gets computed margin-right based on width of container. For more
2052         // info see bug #3333
2053         // Fails in WebKit before Feb 2011 nightlies
2054         // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
2055         if ( document.defaultView && document.defaultView.getComputedStyle ) {
2056                 marginDiv = document.createElement( "div" );
2057                 marginDiv.style.width = "0";
2058                 marginDiv.style.marginRight = "0";
2059                 div.appendChild( marginDiv );
2060                 support.reliableMarginRight =
2061                         ( parseInt( document.defaultView.getComputedStyle( marginDiv, null ).marginRight, 10 ) || 0 ) === 0;
2062         }
2063
2064         // Remove the body element we added
2065         body.innerHTML = "";
2066         document.documentElement.removeChild( body );
2067
2068         // Technique from Juriy Zaytsev
2069         // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
2070         // We only care about the case where non-standard event systems
2071         // are used, namely in IE. Short-circuiting here helps us to
2072         // avoid an eval call (in setAttribute) which can cause CSP
2073         // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
2074         if ( div.attachEvent ) {
2075                 for( i in {
2076                         submit: 1,
2077                         change: 1,
2078                         focusin: 1
2079                 } ) {
2080                         eventName = "on" + i;
2081                         isSupported = ( eventName in div );
2082                         if ( !isSupported ) {
2083                                 div.setAttribute( eventName, "return;" );
2084                                 isSupported = ( typeof div[ eventName ] === "function" );
2085                         }
2086                         support[ i + "Bubbles" ] = isSupported;
2087                 }
2088         }
2089
2090         return support;
2091 })();
2092
2093 // Keep track of boxModel
2094 jQuery.boxModel = jQuery.support.boxModel;
2095
2096
2097
2098
2099 var rbrace = /^(?:\{.*\}|\[.*\])$/,
2100         rmultiDash = /([a-z])([A-Z])/g;
2101
2102 jQuery.extend({
2103         cache: {},
2104
2105         // Please use with caution
2106         uuid: 0,
2107
2108         // Unique for each copy of jQuery on the page
2109         // Non-digits removed to match rinlinejQuery
2110         expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
2111
2112         // The following elements throw uncatchable exceptions if you
2113         // attempt to add expando properties to them.
2114         noData: {
2115                 "embed": true,
2116                 // Ban all objects except for Flash (which handle expandos)
2117                 "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
2118                 "applet": true
2119         },
2120
2121         hasData: function( elem ) {
2122                 elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
2123
2124                 return !!elem && !isEmptyDataObject( elem );
2125         },
2126
2127         data: function( elem, name, data, pvt /* Internal Use Only */ ) {
2128                 if ( !jQuery.acceptData( elem ) ) {
2129                         return;
2130                 }
2131
2132                 var internalKey = jQuery.expando, getByName = typeof name === "string", thisCache,
2133
2134                         // We have to handle DOM nodes and JS objects differently because IE6-7
2135                         // can't GC object references properly across the DOM-JS boundary
2136                         isNode = elem.nodeType,
2137
2138                         // Only DOM nodes need the global jQuery cache; JS object data is
2139                         // attached directly to the object so GC can occur automatically
2140                         cache = isNode ? jQuery.cache : elem,
2141
2142                         // Only defining an ID for JS objects if its cache already exists allows
2143                         // the code to shortcut on the same path as a DOM node with no cache
2144                         id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando;
2145
2146                 // Avoid doing any more work than we need to when trying to get data on an
2147                 // object that has no data at all
2148                 if ( (!id || (pvt && id && !cache[ id ][ internalKey ])) && getByName && data === undefined ) {
2149                         return;
2150                 }
2151
2152                 if ( !id ) {
2153                         // Only DOM nodes need a new unique ID for each element since their data
2154                         // ends up in the global cache
2155                         if ( isNode ) {
2156                                 elem[ jQuery.expando ] = id = ++jQuery.uuid;
2157                         } else {
2158                                 id = jQuery.expando;
2159                         }
2160                 }
2161
2162                 if ( !cache[ id ] ) {
2163                         cache[ id ] = {};
2164
2165                         // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
2166                         // metadata on plain JS objects when the object is serialized using
2167                         // JSON.stringify
2168                         if ( !isNode ) {
2169                                 cache[ id ].toJSON = jQuery.noop;
2170                         }
2171                 }
2172
2173                 // An object can be passed to jQuery.data instead of a key/value pair; this gets
2174                 // shallow copied over onto the existing cache
2175                 if ( typeof name === "object" || typeof name === "function" ) {
2176                         if ( pvt ) {
2177                                 cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name);
2178                         } else {
2179                                 cache[ id ] = jQuery.extend(cache[ id ], name);
2180                         }
2181                 }
2182
2183                 thisCache = cache[ id ];
2184
2185                 // Internal jQuery data is stored in a separate object inside the object's data
2186                 // cache in order to avoid key collisions between internal data and user-defined
2187                 // data
2188                 if ( pvt ) {
2189                         if ( !thisCache[ internalKey ] ) {
2190                                 thisCache[ internalKey ] = {};
2191                         }
2192
2193                         thisCache = thisCache[ internalKey ];
2194                 }
2195
2196                 if ( data !== undefined ) {
2197                         thisCache[ name ] = data;
2198                 }
2199
2200                 // TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should
2201                 // not attempt to inspect the internal events object using jQuery.data, as this
2202                 // internal data object is undocumented and subject to change.
2203                 if ( name === "events" && !thisCache[name] ) {
2204                         return thisCache[ internalKey ] && thisCache[ internalKey ].events;
2205                 }
2206
2207                 return getByName ? thisCache[ name ] : thisCache;
2208         },
2209
2210         removeData: function( elem, name, pvt /* Internal Use Only */ ) {
2211                 if ( !jQuery.acceptData( elem ) ) {
2212                         return;
2213                 }
2214
2215                 var internalKey = jQuery.expando, isNode = elem.nodeType,
2216
2217                         // See jQuery.data for more information
2218                         cache = isNode ? jQuery.cache : elem,
2219
2220                         // See jQuery.data for more information
2221                         id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
2222
2223                 // If there is already no cache entry for this object, there is no
2224                 // purpose in continuing
2225                 if ( !cache[ id ] ) {
2226                         return;
2227                 }
2228
2229                 if ( name ) {
2230                         var thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ];
2231
2232                         if ( thisCache ) {
2233                                 delete thisCache[ name ];
2234
2235                                 // If there is no data left in the cache, we want to continue
2236                                 // and let the cache object itself get destroyed
2237                                 if ( !isEmptyDataObject(thisCache) ) {
2238                                         return;
2239                                 }
2240                         }
2241                 }
2242
2243                 // See jQuery.data for more information
2244                 if ( pvt ) {
2245                         delete cache[ id ][ internalKey ];
2246
2247                         // Don't destroy the parent cache unless the internal data object
2248                         // had been the only thing left in it
2249                         if ( !isEmptyDataObject(cache[ id ]) ) {
2250                                 return;
2251                         }
2252                 }
2253
2254                 var internalCache = cache[ id ][ internalKey ];
2255
2256                 // Browsers that fail expando deletion also refuse to delete expandos on
2257                 // the window, but it will allow it on all other JS objects; other browsers
2258                 // don't care
2259                 if ( jQuery.support.deleteExpando || cache != window ) {
2260                         delete cache[ id ];
2261                 } else {
2262                         cache[ id ] = null;
2263                 }
2264
2265                 // We destroyed the entire user cache at once because it's faster than
2266                 // iterating through each key, but we need to continue to persist internal
2267                 // data if it existed
2268                 if ( internalCache ) {
2269                         cache[ id ] = {};
2270                         // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
2271                         // metadata on plain JS objects when the object is serialized using
2272                         // JSON.stringify
2273                         if ( !isNode ) {
2274                                 cache[ id ].toJSON = jQuery.noop;
2275                         }
2276
2277                         cache[ id ][ internalKey ] = internalCache;
2278
2279                 // Otherwise, we need to eliminate the expando on the node to avoid
2280                 // false lookups in the cache for entries that no longer exist
2281                 } else if ( isNode ) {
2282                         // IE does not allow us to delete expando properties from nodes,
2283                         // nor does it have a removeAttribute function on Document nodes;
2284                         // we must handle all of these cases
2285                         if ( jQuery.support.deleteExpando ) {
2286                                 delete elem[ jQuery.expando ];
2287                         } else if ( elem.removeAttribute ) {
2288                                 elem.removeAttribute( jQuery.expando );
2289                         } else {
2290                                 elem[ jQuery.expando ] = null;
2291                         }
2292                 }
2293         },
2294
2295         // For internal use only.
2296         _data: function( elem, name, data ) {
2297                 return jQuery.data( elem, name, data, true );
2298         },
2299
2300         // A method for determining if a DOM node can handle the data expando
2301         acceptData: function( elem ) {
2302                 if ( elem.nodeName ) {
2303                         var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
2304
2305                         if ( match ) {
2306                                 return !(match === true || elem.getAttribute("classid") !== match);
2307                         }
2308                 }
2309
2310                 return true;
2311         }
2312 });
2313
2314 jQuery.fn.extend({
2315         data: function( key, value ) {
2316                 var data = null;
2317
2318                 if ( typeof key === "undefined" ) {
2319                         if ( this.length ) {
2320                                 data = jQuery.data( this[0] );
2321
2322                                 if ( this[0].nodeType === 1 ) {
2323                             var attr = this[0].attributes, name;
2324                                         for ( var i = 0, l = attr.length; i < l; i++ ) {
2325                                                 name = attr[i].name;
2326
2327                                                 if ( name.indexOf( "data-" ) === 0 ) {
2328                                                         name = jQuery.camelCase( name.substring(5) );
2329
2330                                                         dataAttr( this[0], name, data[ name ] );
2331                                                 }
2332                                         }
2333                                 }
2334                         }
2335
2336                         return data;
2337
2338                 } else if ( typeof key === "object" ) {
2339                         return this.each(function() {
2340                                 jQuery.data( this, key );
2341                         });
2342                 }
2343
2344                 var parts = key.split(".");
2345                 parts[1] = parts[1] ? "." + parts[1] : "";
2346
2347                 if ( value === undefined ) {
2348                         data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
2349
2350                         // Try to fetch any internally stored data first
2351                         if ( data === undefined && this.length ) {
2352                                 data = jQuery.data( this[0], key );
2353                                 data = dataAttr( this[0], key, data );
2354                         }
2355
2356                         return data === undefined && parts[1] ?
2357                                 this.data( parts[0] ) :
2358                                 data;
2359
2360                 } else {
2361                         return this.each(function() {
2362                                 var $this = jQuery( this ),
2363                                         args = [ parts[0], value ];
2364
2365                                 $this.triggerHandler( "setData" + parts[1] + "!", args );
2366                                 jQuery.data( this, key, value );
2367                                 $this.triggerHandler( "changeData" + parts[1] + "!", args );
2368                         });
2369                 }
2370         },
2371
2372         removeData: function( key ) {
2373                 return this.each(function() {
2374                         jQuery.removeData( this, key );
2375                 });
2376         }
2377 });
2378
2379 function dataAttr( elem, key, data ) {
2380         // If nothing was found internally, try to fetch any
2381         // data from the HTML5 data-* attribute
2382         if ( data === undefined && elem.nodeType === 1 ) {
2383                 name = "data-" + key.replace( rmultiDash, "$1-$2" ).toLowerCase();
2384
2385                 data = elem.getAttribute( name );
2386
2387                 if ( typeof data === "string" ) {
2388                         try {
2389                                 data = data === "true" ? true :
2390                                 data === "false" ? false :
2391                                 data === "null" ? null :
2392                                 !jQuery.isNaN( data ) ? parseFloat( data ) :
2393                                         rbrace.test( data ) ? jQuery.parseJSON( data ) :
2394                                         data;
2395                         } catch( e ) {}
2396
2397                         // Make sure we set the data so it isn't changed later
2398                         jQuery.data( elem, key, data );
2399
2400                 } else {
2401                         data = undefined;
2402                 }
2403         }
2404
2405         return data;
2406 }
2407
2408 // TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON
2409 // property to be considered empty objects; this property always exists in
2410 // order to make sure JSON.stringify does not expose internal metadata
2411 function isEmptyDataObject( obj ) {
2412         for ( var name in obj ) {
2413                 if ( name !== "toJSON" ) {
2414                         return false;
2415                 }
2416         }
2417
2418         return true;
2419 }
2420
2421
2422
2423
2424 function handleQueueMarkDefer( elem, type, src ) {
2425         var deferDataKey = type + "defer",
2426                 queueDataKey = type + "queue",
2427                 markDataKey = type + "mark",
2428                 defer = jQuery.data( elem, deferDataKey, undefined, true );
2429         if ( defer &&
2430                 ( src === "queue" || !jQuery.data( elem, queueDataKey, undefined, true ) ) &&
2431                 ( src === "mark" || !jQuery.data( elem, markDataKey, undefined, true ) ) ) {
2432                 // Give room for hard-coded callbacks to fire first
2433                 // and eventually mark/queue something else on the element
2434                 setTimeout( function() {
2435                         if ( !jQuery.data( elem, queueDataKey, undefined, true ) &&
2436                                 !jQuery.data( elem, markDataKey, undefined, true ) ) {
2437                                 jQuery.removeData( elem, deferDataKey, true );
2438                                 defer.resolve();
2439                         }
2440                 }, 0 );
2441         }
2442 }
2443
2444 jQuery.extend({
2445
2446         _mark: function( elem, type ) {
2447                 if ( elem ) {
2448                         type = (type || "fx") + "mark";
2449                         jQuery.data( elem, type, (jQuery.data(elem,type,undefined,true) || 0) + 1, true );
2450                 }
2451         },
2452
2453         _unmark: function( force, elem, type ) {
2454                 if ( force !== true ) {
2455                         type = elem;
2456                         elem = force;
2457                         force = false;
2458                 }
2459                 if ( elem ) {
2460                         type = type || "fx";
2461                         var key = type + "mark",
2462                                 count = force ? 0 : ( (jQuery.data( elem, key, undefined, true) || 1 ) - 1 );
2463                         if ( count ) {
2464                                 jQuery.data( elem, key, count, true );
2465                         } else {
2466                                 jQuery.removeData( elem, key, true );
2467                                 handleQueueMarkDefer( elem, type, "mark" );
2468                         }
2469                 }
2470         },
2471
2472         queue: function( elem, type, data ) {
2473                 if ( elem ) {
2474                         type = (type || "fx") + "queue";
2475                         var q = jQuery.data( elem, type, undefined, true );
2476                         // Speed up dequeue by getting out quickly if this is just a lookup
2477                         if ( data ) {
2478                                 if ( !q || jQuery.isArray(data) ) {
2479                                         q = jQuery.data( elem, type, jQuery.makeArray(data), true );
2480                                 } else {
2481                                         q.push( data );
2482                                 }
2483                         }
2484                         return q || [];
2485                 }
2486         },
2487
2488         dequeue: function( elem, type ) {
2489                 type = type || "fx";
2490
2491                 var queue = jQuery.queue( elem, type ),
2492                         fn = queue.shift(),
2493                         defer;
2494
2495                 // If the fx queue is dequeued, always remove the progress sentinel
2496                 if ( fn === "inprogress" ) {
2497                         fn = queue.shift();
2498                 }
2499
2500                 if ( fn ) {
2501                         // Add a progress sentinel to prevent the fx queue from being
2502                         // automatically dequeued
2503                         if ( type === "fx" ) {
2504                                 queue.unshift("inprogress");
2505                         }
2506
2507                         fn.call(elem, function() {
2508                                 jQuery.dequeue(elem, type);
2509                         });
2510                 }
2511
2512                 if ( !queue.length ) {
2513                         jQuery.removeData( elem, type + "queue", true );
2514                         handleQueueMarkDefer( elem, type, "queue" );
2515                 }
2516         }
2517 });
2518
2519 jQuery.fn.extend({
2520         queue: function( type, data ) {
2521                 if ( typeof type !== "string" ) {
2522                         data = type;
2523                         type = "fx";
2524                 }
2525
2526                 if ( data === undefined ) {
2527                         return jQuery.queue( this[0], type );
2528                 }
2529                 return this.each(function() {
2530                         var queue = jQuery.queue( this, type, data );
2531
2532                         if ( type === "fx" && queue[0] !== "inprogress" ) {
2533                                 jQuery.dequeue( this, type );
2534                         }
2535                 });
2536         },
2537         dequeue: function( type ) {
2538                 return this.each(function() {
2539                         jQuery.dequeue( this, type );
2540                 });
2541         },
2542         // Based off of the plugin by Clint Helfers, with permission.
2543         // http://blindsignals.com/index.php/2009/07/jquery-delay/
2544         delay: function( time, type ) {
2545                 time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
2546                 type = type || "fx";
2547
2548                 return this.queue( type, function() {
2549                         var elem = this;
2550                         setTimeout(function() {
2551                                 jQuery.dequeue( elem, type );
2552                         }, time );
2553                 });
2554         },
2555         clearQueue: function( type ) {
2556                 return this.queue( type || "fx", [] );
2557         },
2558         // Get a promise resolved when queues of a certain type
2559         // are emptied (fx is the type by default)
2560         promise: function( type, object ) {
2561                 if ( typeof type !== "string" ) {
2562                         object = type;
2563                         type = undefined;
2564                 }
2565                 type = type || "fx";
2566                 var defer = jQuery.Deferred(),
2567                         elements = this,
2568                         i = elements.length,
2569                         count = 1,
2570                         deferDataKey = type + "defer",
2571                         queueDataKey = type + "queue",
2572                         markDataKey = type + "mark";
2573                 function resolve() {
2574                         if ( !( --count ) ) {
2575                                 defer.resolveWith( elements, [ elements ] );
2576                         }
2577                 }
2578                 while( i-- ) {
2579                         if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
2580                                         ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
2581                                                 jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
2582                                         jQuery.data( elements[ i ], deferDataKey, jQuery._Deferred(), true ) )) {
2583                                 count++;
2584                                 tmp.done( resolve );
2585                         }
2586                 }
2587                 resolve();
2588                 return defer.promise();
2589         }
2590 });
2591
2592
2593
2594
2595 var rclass = /[\n\t\r]/g,
2596         rspace = /\s+/,
2597         rreturn = /\r/g,
2598         rtype = /^(?:button|input)$/i,
2599         rfocusable = /^(?:button|input|object|select|textarea)$/i,
2600         rclickable = /^a(?:rea)?$/i,
2601         rspecial = /^(?:data-|aria-)/,
2602         rinvalidChar = /\:/,
2603         formHook;
2604
2605 jQuery.fn.extend({
2606         attr: function( name, value ) {
2607                 return jQuery.access( this, name, value, true, jQuery.attr );
2608         },
2609
2610         removeAttr: function( name ) {
2611                 return this.each(function() {
2612                         jQuery.removeAttr( this, name );
2613                 });
2614         },
2615         
2616         prop: function( name, value ) {
2617                 return jQuery.access( this, name, value, true, jQuery.prop );
2618         },
2619         
2620         removeProp: function( name ) {
2621                 return this.each(function() {
2622                         // try/catch handles cases where IE balks (such as removing a property on window)
2623                         try {
2624                                 this[ name ] = undefined;
2625                                 delete this[ name ];
2626                         } catch( e ) {}
2627                 });
2628         },
2629
2630         addClass: function( value ) {
2631                 if ( jQuery.isFunction( value ) ) {
2632                         return this.each(function(i) {
2633                                 var self = jQuery(this);
2634                                 self.addClass( value.call(this, i, self.attr("class") || "") );
2635                         });
2636                 }
2637
2638                 if ( value && typeof value === "string" ) {
2639                         var classNames = (value || "").split( rspace );
2640
2641                         for ( var i = 0, l = this.length; i < l; i++ ) {
2642                                 var elem = this[i];
2643
2644                                 if ( elem.nodeType === 1 ) {
2645                                         if ( !elem.className ) {
2646                                                 elem.className = value;
2647
2648                                         } else {
2649                                                 var className = " " + elem.className + " ",
2650                                                         setClass = elem.className;
2651
2652                                                 for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
2653                                                         if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {
2654                                                                 setClass += " " + classNames[c];
2655                                                         }
2656                                                 }
2657                                                 elem.className = jQuery.trim( setClass );
2658                                         }
2659                                 }
2660                         }
2661                 }
2662
2663                 return this;
2664         },
2665
2666         removeClass: function( value ) {
2667                 if ( jQuery.isFunction(value) ) {
2668                         return this.each(function(i) {
2669                                 var self = jQuery(this);
2670                                 self.removeClass( value.call(this, i, self.attr("class")) );
2671                         });
2672                 }
2673
2674                 if ( (value && typeof value === "string") || value === undefined ) {
2675                         var classNames = (value || "").split( rspace );
2676
2677                         for ( var i = 0, l = this.length; i < l; i++ ) {
2678                                 var elem = this[i];
2679
2680                                 if ( elem.nodeType === 1 && elem.className ) {
2681                                         if ( value ) {
2682                                                 var className = (" " + elem.className + " ").replace(rclass, " ");
2683                                                 for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
2684                                                         className = className.replace(" " + classNames[c] + " ", " ");
2685                                                 }
2686                                                 elem.className = jQuery.trim( className );
2687
2688                                         } else {
2689                                                 elem.className = "";
2690                                         }
2691                                 }
2692                         }
2693                 }
2694
2695                 return this;
2696         },
2697
2698         toggleClass: function( value, stateVal ) {
2699                 var type = typeof value,
2700                         isBool = typeof stateVal === "boolean";
2701
2702                 if ( jQuery.isFunction( value ) ) {
2703                         return this.each(function(i) {
2704                                 var self = jQuery(this);
2705                                 self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal );
2706                         });
2707                 }
2708
2709                 return this.each(function() {
2710                         if ( type === "string" ) {
2711                                 // toggle individual class names
2712                                 var className,
2713                                         i = 0,
2714                                         self = jQuery( this ),
2715                                         state = stateVal,
2716                                         classNames = value.split( rspace );
2717
2718                                 while ( (className = classNames[ i++ ]) ) {
2719                                         // check each className given, space seperated list
2720                                         state = isBool ? state : !self.hasClass( className );
2721                                         self[ state ? "addClass" : "removeClass" ]( className );
2722                                 }
2723
2724                         } else if ( type === "undefined" || type === "boolean" ) {
2725                                 if ( this.className ) {
2726                                         // store className if set
2727                                         jQuery._data( this, "__className__", this.className );
2728                                 }
2729
2730                                 // toggle whole className
2731                                 this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
2732                         }
2733                 });
2734         },
2735
2736         hasClass: function( selector ) {
2737                 var className = " " + selector + " ";
2738                 for ( var i = 0, l = this.length; i < l; i++ ) {
2739                         if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
2740                                 return true;
2741                         }
2742                 }
2743
2744                 return false;
2745         },
2746
2747         val: function( value ) {
2748                 var hooks, ret,
2749                         elem = this[0];
2750                 
2751                 if ( !arguments.length ) {
2752                         if ( elem ) {
2753                                 hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];
2754
2755                                 if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
2756                                         return ret;
2757                                 }
2758
2759                                 return (elem.value || "").replace(rreturn, "");
2760                         }
2761
2762                         return undefined;
2763                 }
2764
2765                 var isFunction = jQuery.isFunction( value );
2766
2767                 return this.each(function( i ) {
2768                         var self = jQuery(this), val;
2769
2770                         if ( this.nodeType !== 1 ) {
2771                                 return;
2772                         }
2773
2774                         if ( isFunction ) {
2775                                 val = value.call( this, i, self.val() );
2776                         } else {
2777                                 val = value;
2778                         }
2779
2780                         // Treat null/undefined as ""; convert numbers to string
2781                         if ( val == null ) {
2782                                 val = "";
2783                         } else if ( typeof val === "number" ) {
2784                                 val += "";
2785                         } else if ( jQuery.isArray( val ) ) {
2786                                 val = jQuery.map(val, function ( value ) {
2787                                         return value == null ? "" : value + "";
2788                                 });
2789                         }
2790
2791                         hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];
2792
2793                         // If set returns undefined, fall back to normal setting
2794                         if ( !hooks || ("set" in hooks && hooks.set( this, val, "value" ) === undefined) ) {
2795                                 this.value = val;
2796                         }
2797                 });
2798         }
2799 });
2800
2801 jQuery.extend({
2802         valHooks: {
2803                 option: {
2804                         get: function( elem ) {
2805                                 // attributes.value is undefined in Blackberry 4.7 but
2806                                 // uses .value. See #6932
2807                                 var val = elem.attributes.value;
2808                                 return !val || val.specified ? elem.value : elem.text;
2809                         }
2810                 },
2811                 select: {
2812                         get: function( elem ) {
2813                                 var index = elem.selectedIndex,
2814                                         values = [],
2815                                         options = elem.options,
2816                                         one = elem.type === "select-one";
2817
2818                                 // Nothing was selected
2819                                 if ( index < 0 ) {
2820                                         return null;
2821                                 }
2822
2823                                 // Loop through all the selected options
2824                                 for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
2825                                         var option = options[ i ];
2826
2827                                         // Don't return options that are disabled or in a disabled optgroup
2828                                         if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
2829                                                         (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
2830
2831                                                 // Get the specific value for the option
2832                                                 value = jQuery( option ).val();
2833
2834                                                 // We don't need an array for one selects
2835                                                 if ( one ) {
2836                                                         return value;
2837                                                 }
2838
2839                                                 // Multi-Selects return an array
2840                                                 values.push( value );
2841                                         }
2842                                 }
2843
2844                                 // Fixes Bug #2551 -- select.val() broken in IE after form.reset()
2845                                 if ( one && !values.length && options.length ) {
2846                                         return jQuery( options[ index ] ).val();
2847                                 }
2848
2849                                 return values;
2850                         },
2851
2852                         set: function( elem, value ) {
2853                                 var values = jQuery.makeArray( value );
2854
2855                                 jQuery(elem).find("option").each(function() {
2856                                         this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
2857                                 });
2858
2859                                 if ( !values.length ) {
2860                                         elem.selectedIndex = -1;
2861                                 }
2862                                 return values;
2863                         }
2864                 }
2865         },
2866
2867         attrFn: {
2868                 val: true,
2869                 css: true,
2870                 html: true,
2871                 text: true,
2872                 data: true,
2873                 width: true,
2874                 height: true,
2875                 offset: true
2876         },
2877         
2878         attrFix: {
2879                 // Always normalize to ensure hook usage
2880                 tabindex: "tabIndex",
2881                 readonly: "readOnly"
2882         },
2883         
2884         attr: function( elem, name, value, pass ) {
2885                 var nType = elem.nodeType;
2886                 
2887                 // don't get/set attributes on text, comment and attribute nodes
2888                 if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
2889                         return undefined;
2890                 }
2891
2892                 if ( pass && name in jQuery.attrFn ) {
2893                         return jQuery( elem )[ name ]( value );
2894                 }
2895                 
2896                 var ret, hooks,
2897                         notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
2898                 
2899                 // Normalize the name if needed
2900                 name = notxml && jQuery.attrFix[ name ] || name;
2901
2902                 // Get the appropriate hook, or the formHook
2903                 // if getSetAttribute is not supported and we have form objects in IE6/7
2904                 hooks = jQuery.attrHooks[ name ] ||
2905                         ( formHook && (jQuery.nodeName( elem, "form" ) || rinvalidChar.test( name )) ?
2906                                 formHook :
2907                                 undefined );
2908
2909                 if ( value !== undefined ) {
2910
2911                         if ( value === null || (value === false && !rspecial.test( name )) ) {
2912                                 jQuery.removeAttr( elem, name );
2913                                 return undefined;
2914
2915                         } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
2916                                 return ret;
2917
2918                         } else {
2919
2920                                 // Set boolean attributes to the same name
2921                                 if ( value === true && !rspecial.test( name ) ) {
2922                                         value = name;
2923                                 }
2924
2925                                 elem.setAttribute( name, "" + value );
2926                                 return value;
2927                         }
2928
2929                 } else {
2930
2931                         if ( hooks && "get" in hooks && notxml ) {
2932                                 return hooks.get( elem, name );
2933
2934                         } else {
2935
2936                                 ret = elem.getAttribute( name );
2937
2938                                 // Non-existent attributes return null, we normalize to undefined
2939                                 return ret === null ?
2940                                         undefined :
2941                                         ret;
2942                         }
2943                 }
2944         },
2945         
2946         removeAttr: function( elem, name ) {
2947                 if ( elem.nodeType === 1 ) {
2948                         name = jQuery.attrFix[ name ] || name;
2949                 
2950                         if ( jQuery.support.getSetAttribute ) {
2951                                 // Use removeAttribute in browsers that support it
2952                                 elem.removeAttribute( name );
2953                         } else {
2954                                 jQuery.attr( elem, name, "" );
2955                                 elem.removeAttributeNode( elem.getAttributeNode( name ) );
2956                         }
2957                 }
2958         },
2959
2960         attrHooks: {
2961                 type: {
2962                         set: function( elem, value ) {
2963                                 // We can't allow the type property to be changed (since it causes problems in IE)
2964                                 if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
2965                                         jQuery.error( "type property can't be changed" );
2966                                 } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
2967                                         // Setting the type on a radio button after the value resets the value in IE6-9
2968                                         // Reset value to it's default in case type is set after value
2969                                         // This is for element creation
2970                                         var val = elem.getAttribute("value");
2971                                         elem.setAttribute( "type", value );
2972                                         if ( val ) {
2973                                                 elem.value = val;
2974                                         }
2975                                         return value;
2976                                 }
2977                         }
2978                 },
2979                 tabIndex: {
2980                         get: function( elem ) {
2981                                 // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
2982                                 // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
2983                                 var attributeNode = elem.getAttributeNode("tabIndex");
2984
2985                                 return attributeNode && attributeNode.specified ?
2986                                         parseInt( attributeNode.value, 10 ) :
2987                                         rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
2988                                                 0 :
2989                                                 undefined;
2990                         }
2991                 }
2992         },
2993         
2994         propFix: {},
2995         
2996         prop: function( elem, name, value ) {
2997                 var nType = elem.nodeType;
2998                 
2999                 // don't get/set properties on text, comment and attribute nodes
3000                 if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
3001                         return undefined;
3002                 }
3003                 
3004                 var ret, hooks,
3005                         notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
3006                 
3007                 // Try to normalize/fix the name
3008                 name = notxml && jQuery.propFix[ name ] || name;
3009                 
3010                 hooks = jQuery.propHooks[ name ];
3011                 
3012                 if ( value !== undefined ) {
3013                         if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
3014                                 return ret;
3015                         
3016                         } else {
3017                                 return (elem[ name ] = value);
3018                         }
3019                 
3020                 } else {
3021                         if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== undefined ) {
3022                                 return ret;
3023                                 
3024                         } else {
3025                                 return elem[ name ];
3026                         }
3027                 }
3028         },
3029         
3030         propHooks: {}
3031 });
3032
3033 // IE6/7 do not support getting/setting some attributes with get/setAttribute
3034 if ( !jQuery.support.getSetAttribute ) {
3035         jQuery.attrFix = jQuery.extend( jQuery.attrFix, {
3036                 "for": "htmlFor",
3037                 "class": "className",
3038                 maxlength: "maxLength",
3039                 cellspacing: "cellSpacing",
3040                 cellpadding: "cellPadding",
3041                 rowspan: "rowSpan",
3042                 colspan: "colSpan",
3043                 usemap: "useMap",
3044                 frameborder: "frameBorder"
3045         });
3046         
3047         // Use this for any attribute on a form in IE6/7
3048         formHook = jQuery.attrHooks.name = jQuery.attrHooks.value = jQuery.valHooks.button = {
3049                 get: function( elem, name ) {
3050                         var ret;
3051                         if ( name === "value" && !jQuery.nodeName( elem, "button" ) ) {
3052                                 return elem.getAttribute( name );
3053                         }
3054                         ret = elem.getAttributeNode( name );
3055                         // Return undefined if not specified instead of empty string
3056                         return ret && ret.specified ?
3057                                 ret.nodeValue :
3058                                 undefined;
3059                 },
3060                 set: function( elem, value, name ) {
3061                         // Check form objects in IE (multiple bugs related)
3062                         // Only use nodeValue if the attribute node exists on the form
3063                         var ret = elem.getAttributeNode( name );
3064                         if ( ret ) {
3065                                 ret.nodeValue = value;
3066                                 return value;
3067                         }
3068                 }
3069         };
3070
3071         // Set width and height to auto instead of 0 on empty string( Bug #8150 )
3072         // This is for removals
3073         jQuery.each([ "width", "height" ], function( i, name ) {
3074                 jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
3075                         set: function( elem, value ) {
3076                                 if ( value === "" ) {
3077                                         elem.setAttribute( name, "auto" );
3078                                         return value;
3079                                 }
3080                         }
3081                 });
3082         });
3083 }
3084
3085
3086 // Some attributes require a special call on IE
3087 if ( !jQuery.support.hrefNormalized ) {
3088         jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
3089                 jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
3090                         get: function( elem ) {
3091                                 var ret = elem.getAttribute( name, 2 );
3092                                 return ret === null ? undefined : ret;
3093                         }
3094                 });
3095         });
3096 }
3097
3098 if ( !jQuery.support.style ) {
3099         jQuery.attrHooks.style = {
3100                 get: function( elem ) {
3101                         // Return undefined in the case of empty string
3102                         // Normalize to lowercase since IE uppercases css property names
3103                         return elem.style.cssText.toLowerCase() || undefined;
3104                 },
3105                 set: function( elem, value ) {
3106                         return (elem.style.cssText = "" + value);
3107                 }
3108         };
3109 }
3110
3111 // Safari mis-reports the default selected property of an option
3112 // Accessing the parent's selectedIndex property fixes it
3113 if ( !jQuery.support.optSelected ) {
3114         jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
3115                 get: function( elem ) {
3116                         var parent = elem.parentNode;
3117
3118                         if ( parent ) {
3119                                 parent.selectedIndex;
3120
3121                                 // Make sure that it also works with optgroups, see #5701
3122                                 if ( parent.parentNode ) {
3123                                         parent.parentNode.selectedIndex;
3124                                 }
3125                         }
3126                 }
3127         });
3128 }
3129
3130 // Radios and checkboxes getter/setter
3131 if ( !jQuery.support.checkOn ) {
3132         jQuery.each([ "radio", "checkbox" ], function() {
3133                 jQuery.valHooks[ this ] = {
3134                         get: function( elem ) {
3135                                 // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
3136                                 return elem.getAttribute("value") === null ? "on" : elem.value;
3137                         }
3138                 };
3139         });
3140 }
3141 jQuery.each([ "radio", "checkbox" ], function() {
3142         jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
3143                 set: function( elem, value ) {
3144                         if ( jQuery.isArray( value ) ) {
3145                                 return (elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0);
3146                         }
3147                 }
3148         });
3149 });
3150
3151
3152
3153
3154 var hasOwn = Object.prototype.hasOwnProperty,
3155         rnamespaces = /\.(.*)$/,
3156         rformElems = /^(?:textarea|input|select)$/i,
3157         rperiod = /\./g,
3158         rspaces = / /g,
3159         rescape = /[^\w\s.|`]/g,
3160         fcleanup = function( nm ) {
3161                 return nm.replace(rescape, "\\$&");
3162         };
3163
3164 /*
3165  * A number of helper functions used for managing events.
3166  * Many of the ideas behind this code originated from
3167  * Dean Edwards' addEvent library.
3168  */
3169 jQuery.event = {
3170
3171         // Bind an event to an element
3172         // Original by Dean Edwards
3173         add: function( elem, types, handler, data ) {
3174                 if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
3175                         return;
3176                 }
3177
3178                 if ( handler === false ) {
3179                         handler = returnFalse;
3180                 } else if ( !handler ) {
3181                         // Fixes bug #7229. Fix recommended by jdalton
3182                         return;
3183                 }
3184
3185                 var handleObjIn, handleObj;
3186
3187                 if ( handler.handler ) {
3188                         handleObjIn = handler;
3189                         handler = handleObjIn.handler;
3190                 }
3191
3192                 // Make sure that the function being executed has a unique ID
3193                 if ( !handler.guid ) {
3194                         handler.guid = jQuery.guid++;
3195                 }
3196
3197                 // Init the element's event structure
3198                 var elemData = jQuery._data( elem );
3199
3200                 // If no elemData is found then we must be trying to bind to one of the
3201                 // banned noData elements
3202                 if ( !elemData ) {
3203                         return;
3204                 }
3205
3206                 var events = elemData.events,
3207                         eventHandle = elemData.handle;
3208
3209                 if ( !events ) {
3210                         elemData.events = events = {};
3211                 }
3212
3213                 if ( !eventHandle ) {
3214                         elemData.handle = eventHandle = function( e ) {
3215                                 // Discard the second event of a jQuery.event.trigger() and
3216                                 // when an event is called after a page has unloaded
3217                                 return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
3218                                         jQuery.event.handle.apply( eventHandle.elem, arguments ) :
3219                                         undefined;
3220                         };
3221                 }
3222
3223                 // Add elem as a property of the handle function
3224                 // This is to prevent a memory leak with non-native events in IE.
3225                 eventHandle.elem = elem;
3226
3227                 // Handle multiple events separated by a space
3228                 // jQuery(...).bind("mouseover mouseout", fn);
3229                 types = types.split(" ");
3230
3231                 var type, i = 0, namespaces;
3232
3233                 while ( (type = types[ i++ ]) ) {
3234                         handleObj = handleObjIn ?
3235                                 jQuery.extend({}, handleObjIn) :
3236                                 { handler: handler, data: data };
3237
3238                         // Namespaced event handlers
3239                         if ( type.indexOf(".") > -1 ) {
3240                                 namespaces = type.split(".");
3241                                 type = namespaces.shift();
3242                                 handleObj.namespace = namespaces.slice(0).sort().join(".");
3243
3244                         } else {
3245                                 namespaces = [];
3246                                 handleObj.namespace = "";
3247                         }
3248
3249                         handleObj.type = type;
3250                         if ( !handleObj.guid ) {
3251                                 handleObj.guid = handler.guid;
3252                         }
3253
3254                         // Get the current list of functions bound to this event
3255                         var handlers = events[ type ],
3256                                 special = jQuery.event.special[ type ] || {};
3257
3258                         // Init the event handler queue
3259                         if ( !handlers ) {
3260                                 handlers = events[ type ] = [];
3261
3262                                 // Check for a special event handler
3263                                 // Only use addEventListener/attachEvent if the special
3264                                 // events handler returns false
3265                                 if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
3266                                         // Bind the global event handler to the element
3267                                         if ( elem.addEventListener ) {
3268                                                 elem.addEventListener( type, eventHandle, false );
3269
3270                                         } else if ( elem.attachEvent ) {
3271                                                 elem.attachEvent( "on" + type, eventHandle );
3272                                         }
3273                                 }
3274                         }
3275
3276                         if ( special.add ) {
3277                                 special.add.call( elem, handleObj );
3278
3279                                 if ( !handleObj.handler.guid ) {
3280                                         handleObj.handler.guid = handler.guid;
3281                                 }
3282                         }
3283
3284                         // Add the function to the element's handler list
3285                         handlers.push( handleObj );
3286
3287                         // Keep track of which events have been used, for event optimization
3288                         jQuery.event.global[ type ] = true;
3289                 }
3290
3291                 // Nullify elem to prevent memory leaks in IE
3292                 elem = null;
3293         },
3294
3295         global: {},
3296
3297         // Detach an event or set of events from an element
3298         remove: function( elem, types, handler, pos ) {
3299                 // don't do events on text and comment nodes
3300                 if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
3301                         return;
3302                 }
3303
3304                 if ( handler === false ) {
3305                         handler = returnFalse;
3306                 }
3307
3308                 var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
3309                         elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
3310                         events = elemData && elemData.events;
3311
3312                 if ( !elemData || !events ) {
3313                         return;
3314                 }
3315
3316                 // types is actually an event object here
3317                 if ( types && types.type ) {
3318                         handler = types.handler;
3319                         types = types.type;
3320                 }
3321
3322                 // Unbind all events for the element
3323                 if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
3324                         types = types || "";
3325
3326                         for ( type in events ) {
3327                                 jQuery.event.remove( elem, type + types );
3328                         }
3329
3330                         return;
3331                 }
3332
3333                 // Handle multiple events separated by a space
3334                 // jQuery(...).unbind("mouseover mouseout", fn);
3335                 types = types.split(" ");
3336
3337                 while ( (type = types[ i++ ]) ) {
3338                         origType = type;
3339                         handleObj = null;
3340                         all = type.indexOf(".") < 0;
3341                         namespaces = [];
3342
3343                         if ( !all ) {
3344                                 // Namespaced event handlers
3345                                 namespaces = type.split(".");
3346                                 type = namespaces.shift();
3347
3348                                 namespace = new RegExp("(^|\\.)" +
3349                                         jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)");
3350                         }
3351
3352                         eventType = events[ type ];
3353
3354                         if ( !eventType ) {
3355                                 continue;
3356                         }
3357
3358                         if ( !handler ) {
3359                                 for ( j = 0; j < eventType.length; j++ ) {
3360                                         handleObj = eventType[ j ];
3361
3362                                         if ( all || namespace.test( handleObj.namespace ) ) {
3363                                                 jQuery.event.remove( elem, origType, handleObj.handler, j );
3364                                                 eventType.splice( j--, 1 );
3365                                         }
3366                                 }
3367
3368                                 continue;
3369                         }
3370
3371                         special = jQuery.event.special[ type ] || {};
3372
3373                         for ( j = pos || 0; j < eventType.length; j++ ) {
3374                                 handleObj = eventType[ j ];
3375
3376                                 if ( handler.guid === handleObj.guid ) {
3377                                         // remove the given handler for the given type
3378                                         if ( all || namespace.test( handleObj.namespace ) ) {
3379                                                 if ( pos == null ) {
3380                                                         eventType.splice( j--, 1 );
3381                                                 }
3382
3383                                                 if ( special.remove ) {
3384                                                         special.remove.call( elem, handleObj );
3385                                                 }
3386                                         }
3387
3388                                         if ( pos != null ) {
3389                                                 break;
3390                                         }
3391                                 }
3392                         }
3393
3394                         // remove generic event handler if no more handlers exist
3395                         if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
3396                                 if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
3397                                         jQuery.removeEvent( elem, type, elemData.handle );
3398                                 }
3399
3400                                 ret = null;
3401                                 delete events[ type ];
3402                         }
3403                 }
3404
3405                 // Remove the expando if it's no longer used
3406                 if ( jQuery.isEmptyObject( events ) ) {
3407                         var handle = elemData.handle;
3408                         if ( handle ) {
3409                                 handle.elem = null;
3410                         }
3411
3412                         delete elemData.events;
3413                         delete elemData.handle;
3414
3415                         if ( jQuery.isEmptyObject( elemData ) ) {
3416                                 jQuery.removeData( elem, undefined, true );
3417                         }
3418                 }
3419         },
3420         
3421         // Events that are safe to short-circuit if no handlers are attached.
3422         // Native DOM events should not be added, they may have inline handlers.
3423         customEvent: {
3424                 "getData": true,
3425                 "setData": true,
3426                 "changeData": true
3427         },
3428
3429         trigger: function( event, data, elem, onlyHandlers ) {
3430                 // Event object or event type
3431                 var type = event.type || event,
3432                         namespaces = [],
3433                         exclusive;
3434
3435                 if ( type.indexOf("!") >= 0 ) {
3436                         // Exclusive events trigger only for the exact event (no namespaces)
3437                         type = type.slice(0, -1);
3438                         exclusive = true;
3439                 }
3440
3441                 if ( type.indexOf(".") >= 0 ) {
3442                         // Namespaced trigger; create a regexp to match event type in handle()
3443                         namespaces = type.split(".");
3444                         type = namespaces.shift();
3445                         namespaces.sort();
3446                 }
3447
3448                 if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
3449                         // No jQuery handlers for this event type, and it can't have inline handlers
3450                         return;
3451                 }
3452
3453                 // Caller can pass in an Event, Object, or just an event type string
3454                 event = typeof event === "object" ?
3455                         // jQuery.Event object
3456                         event[ jQuery.expando ] ? event :
3457                         // Object literal
3458                         new jQuery.Event( type, event ) :
3459                         // Just the event type (string)
3460                         new jQuery.Event( type );
3461
3462                 event.type = type;
3463                 event.exclusive = exclusive;
3464                 event.namespace = namespaces.join(".");
3465                 event.namespace_re = new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)");
3466                 
3467                 // triggerHandler() and global events don't bubble or run the default action
3468                 if ( onlyHandlers || !elem ) {
3469                         event.preventDefault();
3470                         event.stopPropagation();
3471                 }
3472
3473                 // Handle a global trigger
3474                 if ( !elem ) {
3475                         // TODO: Stop taunting the data cache; remove global events and always attach to document
3476                         jQuery.each( jQuery.cache, function() {
3477                                 // internalKey variable is just used to make it easier to find
3478                                 // and potentially change this stuff later; currently it just
3479                                 // points to jQuery.expando
3480                                 var internalKey = jQuery.expando,
3481                                         internalCache = this[ internalKey ];
3482                                 if ( internalCache && internalCache.events && internalCache.events[ type ] ) {
3483                                         jQuery.event.trigger( event, data, internalCache.handle.elem );
3484                                 }
3485                         });
3486                         return;
3487                 }
3488
3489                 // Don't do events on text and comment nodes
3490                 if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
3491                         return;
3492                 }
3493
3494                 // Clean up the event in case it is being reused
3495                 event.result = undefined;
3496                 event.target = elem;
3497
3498                 // Clone any incoming data and prepend the event, creating the handler arg list
3499                 data = data ? jQuery.makeArray( data ) : [];
3500                 data.unshift( event );
3501
3502                 var cur = elem,
3503                         // IE doesn't like method names with a colon (#3533, #8272)
3504                         ontype = type.indexOf(":") < 0 ? "on" + type : "";
3505
3506                 // Fire event on the current element, then bubble up the DOM tree
3507                 do {
3508                         var handle = jQuery._data( cur, "handle" );
3509
3510                         event.currentTarget = cur;
3511                         if ( handle ) {
3512                                 handle.apply( cur, data );
3513                         }
3514
3515                         // Trigger an inline bound script
3516                         if ( ontype && jQuery.acceptData( cur ) && cur[ ontype ] && cur[ ontype ].apply( cur, data ) === false ) {
3517                                 event.result = false;
3518                                 event.preventDefault();
3519                         }
3520
3521                         // Bubble up to document, then to window
3522                         cur = cur.parentNode || cur.ownerDocument || cur === event.target.ownerDocument && window;
3523                 } while ( cur && !event.isPropagationStopped() );
3524
3525                 // If nobody prevented the default action, do it now
3526                 if ( !event.isDefaultPrevented() ) {
3527                         var old,
3528                                 special = jQuery.event.special[ type ] || {};
3529
3530                         if ( (!special._default || special._default.call( elem.ownerDocument, event ) === false) &&
3531                                 !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
3532
3533                                 // Call a native DOM method on the target with the same name name as the event.
3534                                 // Can't use an .isFunction)() check here because IE6/7 fails that test.
3535                                 // IE<9 dies on focus to hidden element (#1486), may want to revisit a try/catch.
3536                                 try {
3537                                         if ( ontype && elem[ type ] ) {
3538                                                 // Don't re-trigger an onFOO event when we call its FOO() method
3539                                                 old = elem[ ontype ];
3540
3541                                                 if ( old ) {
3542                                                         elem[ ontype ] = null;
3543                                                 }
3544
3545                                                 jQuery.event.triggered = type;
3546                                                 elem[ type ]();
3547                                         }
3548                                 } catch ( ieError ) {}
3549
3550                                 if ( old ) {
3551                                         elem[ ontype ] = old;
3552                                 }
3553
3554                                 jQuery.event.triggered = undefined;
3555                         }
3556                 }
3557                 
3558                 return event.result;
3559         },
3560
3561         handle: function( event ) {
3562                 event = jQuery.event.fix( event || window.event );
3563                 // Snapshot the handlers list since a called handler may add/remove events.
3564                 var handlers = ((jQuery._data( this, "events" ) || {})[ event.type ] || []).slice(0),
3565                         run_all = !event.exclusive && !event.namespace,
3566                         args = Array.prototype.slice.call( arguments, 0 );
3567
3568                 // Use the fix-ed Event rather than the (read-only) native event
3569                 args[0] = event;
3570                 event.currentTarget = this;
3571
3572                 for ( var j = 0, l = handlers.length; j < l; j++ ) {
3573                         var handleObj = handlers[ j ];
3574
3575                         // Triggered event must 1) be non-exclusive and have no namespace, or
3576                         // 2) have namespace(s) a subset or equal to those in the bound event.
3577                         if ( run_all || event.namespace_re.test( handleObj.namespace ) ) {
3578                                 // Pass in a reference to the handler function itself
3579                                 // So that we can later remove it
3580                                 event.handler = handleObj.handler;
3581                                 event.data = handleObj.data;
3582                                 event.handleObj = handleObj;
3583
3584                                 var ret = handleObj.handler.apply( this, args );
3585
3586                                 if ( ret !== undefined ) {
3587                                         event.result = ret;
3588                                         if ( ret === false ) {
3589                                                 event.preventDefault();
3590                                                 event.stopPropagation();
3591                                         }
3592                                 }
3593
3594                                 if ( event.isImmediatePropagationStopped() ) {
3595                                         break;
3596                                 }
3597                         }
3598                 }
3599                 return event.result;
3600         },
3601
3602         props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
3603
3604         fix: function( event ) {
3605                 if ( event[ jQuery.expando ] ) {
3606                         return event;
3607                 }
3608
3609                 // store a copy of the original event object
3610                 // and "clone" to set read-only properties
3611                 var originalEvent = event;
3612                 event = jQuery.Event( originalEvent );
3613
3614                 for ( var i = this.props.length, prop; i; ) {
3615                         prop = this.props[ --i ];
3616                         event[ prop ] = originalEvent[ prop ];
3617                 }
3618
3619                 // Fix target property, if necessary
3620                 if ( !event.target ) {
3621                         // Fixes #1925 where srcElement might not be defined either
3622                         event.target = event.srcElement || document;
3623                 }
3624
3625                 // check if target is a textnode (safari)
3626                 if ( event.target.nodeType === 3 ) {
3627                         event.target = event.target.parentNode;
3628                 }
3629
3630                 // Add relatedTarget, if necessary
3631                 if ( !event.relatedTarget && event.fromElement ) {
3632                         event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
3633                 }
3634
3635                 // Calculate pageX/Y if missing and clientX/Y available
3636                 if ( event.pageX == null && event.clientX != null ) {
3637                         var eventDocument = event.target.ownerDocument || document,
3638                                 doc = eventDocument.documentElement,
3639                                 body = eventDocument.body;
3640
3641                         event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
3642                         event.pageY = event.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0);
3643                 }
3644
3645                 // Add which for key events
3646                 if ( event.which == null && (event.charCode != null || event.keyCode != null) ) {
3647                         event.which = event.charCode != null ? event.charCode : event.keyCode;
3648                 }
3649
3650                 // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
3651                 if ( !event.metaKey && event.ctrlKey ) {
3652                         event.metaKey = event.ctrlKey;
3653                 }
3654
3655                 // Add which for click: 1 === left; 2 === middle; 3 === right
3656                 // Note: button is not normalized, so don't use it
3657                 if ( !event.which && event.button !== undefined ) {
3658                         event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
3659                 }
3660
3661                 return event;
3662         },
3663
3664         // Deprecated, use jQuery.guid instead
3665         guid: 1E8,
3666
3667         // Deprecated, use jQuery.proxy instead
3668         proxy: jQuery.proxy,
3669
3670         special: {
3671                 ready: {
3672                         // Make sure the ready event is setup
3673                         setup: jQuery.bindReady,
3674                         teardown: jQuery.noop
3675                 },
3676
3677                 live: {
3678                         add: function( handleObj ) {
3679                                 jQuery.event.add( this,
3680                                         liveConvert( handleObj.origType, handleObj.selector ),
3681                                         jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) );
3682                         },
3683
3684                         remove: function( handleObj ) {
3685                                 jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj );
3686                         }
3687                 },
3688
3689                 beforeunload: {
3690                         setup: function( data, namespaces, eventHandle ) {
3691                                 // We only want to do this special case on windows
3692                                 if ( jQuery.isWindow( this ) ) {
3693                                         this.onbeforeunload = eventHandle;
3694                                 }
3695                         },
3696
3697                         teardown: function( namespaces, eventHandle ) {
3698                                 if ( this.onbeforeunload === eventHandle ) {
3699                                         this.onbeforeunload = null;
3700                                 }
3701                         }
3702                 }
3703         }
3704 };
3705
3706 jQuery.removeEvent = document.removeEventListener ?
3707         function( elem, type, handle ) {
3708                 if ( elem.removeEventListener ) {
3709                         elem.removeEventListener( type, handle, false );
3710                 }
3711         } :
3712         function( elem, type, handle ) {
3713                 if ( elem.detachEvent ) {
3714                         elem.detachEvent( "on" + type, handle );
3715                 }
3716         };
3717
3718 jQuery.Event = function( src, props ) {
3719         // Allow instantiation without the 'new' keyword
3720         if ( !this.preventDefault ) {
3721                 return new jQuery.Event( src, props );
3722         }
3723
3724         // Event object
3725         if ( src && src.type ) {
3726                 this.originalEvent = src;
3727                 this.type = src.type;
3728
3729                 // Events bubbling up the document may have been marked as prevented
3730                 // by a handler lower down the tree; reflect the correct value.
3731                 this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false ||
3732                         src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse;
3733
3734         // Event type
3735         } else {
3736                 this.type = src;
3737         }
3738
3739         // Put explicitly provided properties onto the event object
3740         if ( props ) {
3741                 jQuery.extend( this, props );
3742         }
3743
3744         // timeStamp is buggy for some events on Firefox(#3843)
3745         // So we won't rely on the native value
3746         this.timeStamp = jQuery.now();
3747
3748         // Mark it as fixed
3749         this[ jQuery.expando ] = true;
3750 };
3751
3752 function returnFalse() {
3753         return false;
3754 }
3755 function returnTrue() {
3756         return true;
3757 }
3758
3759 // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
3760 // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
3761 jQuery.Event.prototype = {
3762         preventDefault: function() {
3763                 this.isDefaultPrevented = returnTrue;
3764
3765                 var e = this.originalEvent;
3766                 if ( !e ) {
3767                         return;
3768                 }
3769
3770                 // if preventDefault exists run it on the original event
3771                 if ( e.preventDefault ) {
3772                         e.preventDefault();
3773
3774                 // otherwise set the returnValue property of the original event to false (IE)
3775                 } else {
3776                         e.returnValue = false;
3777                 }
3778         },
3779         stopPropagation: function() {
3780                 this.isPropagationStopped = returnTrue;
3781
3782                 var e = this.originalEvent;
3783                 if ( !e ) {
3784                         return;
3785                 }
3786                 // if stopPropagation exists run it on the original event
3787                 if ( e.stopPropagation ) {
3788                         e.stopPropagation();
3789                 }
3790                 // otherwise set the cancelBubble property of the original event to true (IE)
3791                 e.cancelBubble = true;
3792         },
3793         stopImmediatePropagation: function() {
3794                 this.isImmediatePropagationStopped = returnTrue;
3795                 this.stopPropagation();
3796         },
3797         isDefaultPrevented: returnFalse,
3798         isPropagationStopped: returnFalse,
3799         isImmediatePropagationStopped: returnFalse
3800 };
3801
3802 // Checks if an event happened on an element within another element
3803 // Used in jQuery.event.special.mouseenter and mouseleave handlers
3804 var withinElement = function( event ) {
3805         // Check if mouse(over|out) are still within the same parent element
3806         var parent = event.relatedTarget;
3807
3808         // Firefox sometimes assigns relatedTarget a XUL element
3809         // which we cannot access the parentNode property of
3810         try {
3811
3812                 // Chrome does something similar, the parentNode property
3813                 // can be accessed but is null.
3814                 if ( parent && parent !== document && !parent.parentNode ) {
3815                         return;
3816                 }
3817                 // Traverse up the tree
3818                 while ( parent && parent !== this ) {
3819                         parent = parent.parentNode;
3820                 }
3821
3822                 if ( parent !== this ) {
3823                         // set the correct event type
3824                         event.type = event.data;
3825
3826                         // handle event if we actually just moused on to a non sub-element
3827                         jQuery.event.handle.apply( this, arguments );
3828                 }
3829
3830         // assuming we've left the element since we most likely mousedover a xul element
3831         } catch(e) { }
3832 },
3833
3834 // In case of event delegation, we only need to rename the event.type,
3835 // liveHandler will take care of the rest.
3836 delegate = function( event ) {
3837         event.type = event.data;
3838         jQuery.event.handle.apply( this, arguments );
3839 };
3840
3841 // Create mouseenter and mouseleave events
3842 jQuery.each({
3843         mouseenter: "mouseover",
3844         mouseleave: "mouseout"
3845 }, function( orig, fix ) {
3846         jQuery.event.special[ orig ] = {
3847                 setup: function( data ) {
3848                         jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
3849                 },
3850                 teardown: function( data ) {
3851                         jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
3852                 }
3853         };
3854 });
3855
3856 // submit delegation
3857 if ( !jQuery.support.submitBubbles ) {
3858
3859         jQuery.event.special.submit = {
3860                 setup: function( data, namespaces ) {
3861                         if ( !jQuery.nodeName( this, "form" ) ) {
3862                                 jQuery.event.add(this, "click.specialSubmit", function( e ) {
3863                                         var elem = e.target,
3864                                                 type = elem.type;
3865
3866                                         if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
3867                                                 trigger( "submit", this, arguments );
3868                                         }
3869                                 });
3870
3871                                 jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
3872                                         var elem = e.target,
3873                                                 type = elem.type;
3874
3875                                         if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
3876                                                 trigger( "submit", this, arguments );
3877                                         }
3878                                 });
3879
3880                         } else {
3881                                 return false;
3882                         }
3883                 },
3884
3885                 teardown: function( namespaces ) {
3886                         jQuery.event.remove( this, ".specialSubmit" );
3887                 }
3888         };
3889
3890 }
3891
3892 // change delegation, happens here so we have bind.
3893 if ( !jQuery.support.changeBubbles ) {
3894
3895         var changeFilters,
3896
3897         getVal = function( elem ) {
3898                 var type = elem.type, val = elem.value;
3899
3900                 if ( type === "radio" || type === "checkbox" ) {
3901                         val = elem.checked;
3902
3903                 } else if ( type === "select-multiple" ) {
3904                         val = elem.selectedIndex > -1 ?
3905                                 jQuery.map( elem.options, function( elem ) {
3906                                         return elem.selected;
3907                                 }).join("-") :
3908                                 "";
3909
3910                 } else if ( jQuery.nodeName( elem, "select" ) ) {
3911                         val = elem.selectedIndex;
3912                 }
3913
3914                 return val;
3915         },
3916
3917         testChange = function testChange( e ) {
3918                 var elem = e.target, data, val;
3919
3920                 if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) {
3921                         return;
3922                 }
3923
3924                 data = jQuery._data( elem, "_change_data" );
3925                 val = getVal(elem);
3926
3927                 // the current data will be also retrieved by beforeactivate
3928                 if ( e.type !== "focusout" || elem.type !== "radio" ) {
3929                         jQuery._data( elem, "_change_data", val );
3930                 }
3931
3932                 if ( data === undefined || val === data ) {
3933                         return;
3934                 }
3935
3936                 if ( data != null || val ) {
3937                         e.type = "change";
3938                         e.liveFired = undefined;
3939                         jQuery.event.trigger( e, arguments[1], elem );
3940                 }
3941         };
3942
3943         jQuery.event.special.change = {
3944                 filters: {
3945                         focusout: testChange,
3946
3947                         beforedeactivate: testChange,
3948
3949                         click: function( e ) {
3950                                 var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : "";
3951
3952                                 if ( type === "radio" || type === "checkbox" || jQuery.nodeName( elem, "select" ) ) {
3953                                         testChange.call( this, e );
3954                                 }
3955                         },
3956
3957                         // Change has to be called before submit
3958                         // Keydown will be called before keypress, which is used in submit-event delegation
3959                         keydown: function( e ) {
3960                                 var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : "";
3961
3962                                 if ( (e.keyCode === 13 && !jQuery.nodeName( elem, "textarea" ) ) ||
3963                                         (e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
3964                                         type === "select-multiple" ) {
3965                                         testChange.call( this, e );
3966                                 }
3967                         },
3968
3969                         // Beforeactivate happens also before the previous element is blurred
3970                         // with this event you can't trigger a change event, but you can store
3971                         // information
3972                         beforeactivate: function( e ) {
3973                                 var elem = e.target;
3974                                 jQuery._data( elem, "_change_data", getVal(elem) );
3975                         }
3976                 },
3977
3978                 setup: function( data, namespaces ) {
3979                         if ( this.type === "file" ) {
3980                                 return false;
3981                         }
3982
3983                         for ( var type in changeFilters ) {
3984                                 jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
3985                         }
3986
3987                         return rformElems.test( this.nodeName );
3988                 },
3989
3990                 teardown: function( namespaces ) {
3991                         jQuery.event.remove( this, ".specialChange" );
3992
3993                         return rformElems.test( this.nodeName );
3994                 }
3995         };
3996
3997         changeFilters = jQuery.event.special.change.filters;
3998
3999         // Handle when the input is .focus()'d
4000         changeFilters.focus = changeFilters.beforeactivate;
4001 }
4002
4003 function trigger( type, elem, args ) {
4004         // Piggyback on a donor event to simulate a different one.
4005         // Fake originalEvent to avoid donor's stopPropagation, but if the
4006         // simulated event prevents default then we do the same on the donor.
4007         // Don't pass args or remember liveFired; they apply to the donor event.
4008         var event = jQuery.extend( {}, args[ 0 ] );
4009         event.type = type;
4010         event.originalEvent = {};
4011         event.liveFired = undefined;
4012         jQuery.event.handle.call( elem, event );
4013         if ( event.isDefaultPrevented() ) {
4014                 args[ 0 ].preventDefault();
4015         }
4016 }
4017
4018 // Create "bubbling" focus and blur events
4019 if ( !jQuery.support.focusinBubbles ) {
4020         jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
4021
4022                 // Attach a single capturing handler while someone wants focusin/focusout
4023                 var attaches = 0;
4024
4025                 jQuery.event.special[ fix ] = {
4026                         setup: function() {
4027                                 if ( attaches++ === 0 ) {
4028                                         document.addEventListener( orig, handler, true );
4029                                 }
4030                         },
4031                         teardown: function() {
4032                                 if ( --attaches === 0 ) {
4033                                         document.removeEventListener( orig, handler, true );
4034                                 }
4035                         }
4036                 };
4037
4038                 function handler( donor ) {
4039                         // Donor event is always a native one; fix it and switch its type.
4040                         // Let focusin/out handler cancel the donor focus/blur event.
4041                         var e = jQuery.event.fix( donor );
4042                         e.type = fix;
4043                         e.originalEvent = {};
4044                         jQuery.event.trigger( e, null, e.target );
4045                         if ( e.isDefaultPrevented() ) {
4046                                 donor.preventDefault();
4047                         }
4048                 }
4049         });
4050 }
4051
4052 jQuery.each(["bind", "one"], function( i, name ) {
4053         jQuery.fn[ name ] = function( type, data, fn ) {
4054                 var handler;
4055
4056                 // Handle object literals
4057                 if ( typeof type === "object" ) {
4058                         for ( var key in type ) {
4059                                 this[ name ](key, data, type[key], fn);
4060                         }
4061                         return this;
4062                 }
4063
4064                 if ( arguments.length === 2 || data === false ) {
4065                         fn = data;
4066                         data = undefined;
4067                 }
4068
4069                 if ( name === "one" ) {
4070                         handler = function( event ) {
4071                                 jQuery( this ).unbind( event, handler );
4072                                 return fn.apply( this, arguments );
4073                         };
4074                         handler.guid = fn.guid || jQuery.guid++;
4075                 } else {
4076                         handler = fn;
4077                 }
4078
4079                 if ( type === "unload" && name !== "one" ) {
4080                         this.one( type, data, fn );
4081
4082                 } else {
4083                         for ( var i = 0, l = this.length; i < l; i++ ) {
4084                                 jQuery.event.add( this[i], type, handler, data );
4085                         }
4086                 }
4087
4088                 return this;
4089         };
4090 });
4091
4092 jQuery.fn.extend({
4093         unbind: function( type, fn ) {
4094                 // Handle object literals
4095                 if ( typeof type === "object" && !type.preventDefault ) {
4096                         for ( var key in type ) {
4097                                 this.unbind(key, type[key]);
4098                         }
4099
4100                 } else {
4101                         for ( var i = 0, l = this.length; i < l; i++ ) {
4102                                 jQuery.event.remove( this[i], type, fn );
4103                         }
4104                 }
4105
4106                 return this;
4107         },
4108
4109         delegate: function( selector, types, data, fn ) {
4110                 return this.live( types, data, fn, selector );
4111         },
4112
4113         undelegate: function( selector, types, fn ) {
4114                 if ( arguments.length === 0 ) {
4115                         return this.unbind( "live" );
4116
4117                 } else {
4118                         return this.die( types, null, fn, selector );
4119                 }
4120         },
4121
4122         trigger: function( type, data ) {
4123                 return this.each(function() {
4124                         jQuery.event.trigger( type, data, this );
4125                 });
4126         },
4127
4128         triggerHandler: function( type, data ) {
4129                 if ( this[0] ) {
4130                         return jQuery.event.trigger( type, data, this[0], true );
4131                 }
4132         },
4133
4134         toggle: function( fn ) {
4135                 // Save reference to arguments for access in closure
4136                 var args = arguments,
4137                         guid = fn.guid || jQuery.guid++,
4138                         i = 0,
4139                         toggler = function( event ) {
4140                                 // Figure out which function to execute
4141                                 var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i;
4142                                 jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 );
4143
4144                                 // Make sure that clicks stop
4145                                 event.preventDefault();
4146
4147                                 // and execute the function
4148                                 return args[ lastToggle ].apply( this, arguments ) || false;
4149                         };
4150
4151                 // link all the functions, so any of them can unbind this click handler
4152                 toggler.guid = guid;
4153                 while ( i < args.length ) {
4154                         args[ i++ ].guid = guid;
4155                 }
4156
4157                 return this.click( toggler );
4158         },
4159
4160         hover: function( fnOver, fnOut ) {
4161                 return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
4162         }
4163 });
4164
4165 var liveMap = {
4166         focus: "focusin",
4167         blur: "focusout",
4168         mouseenter: "mouseover",
4169         mouseleave: "mouseout"
4170 };
4171
4172 jQuery.each(["live", "die"], function( i, name ) {
4173         jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
4174                 var type, i = 0, match, namespaces, preType,
4175                         selector = origSelector || this.selector,
4176                         context = origSelector ? this : jQuery( this.context );
4177
4178                 if ( typeof types === "object" && !types.preventDefault ) {
4179                         for ( var key in types ) {
4180                                 context[ name ]( key, data, types[key], selector );
4181                         }
4182
4183                         return this;
4184                 }
4185
4186                 if ( name === "die" && !types &&
4187                                         origSelector && origSelector.charAt(0) === "." ) {
4188
4189                         context.unbind( origSelector );
4190
4191                         return this;
4192                 }
4193
4194                 if ( data === false || jQuery.isFunction( data ) ) {
4195                         fn = data || returnFalse;
4196                         data = undefined;
4197                 }
4198
4199                 types = (types || "").split(" ");
4200
4201                 while ( (type = types[ i++ ]) != null ) {
4202                         match = rnamespaces.exec( type );
4203                         namespaces = "";
4204
4205                         if ( match )  {
4206                                 namespaces = match[0];
4207                                 type = type.replace( rnamespaces, "" );
4208                         }
4209
4210                         if ( type === "hover" ) {
4211                                 types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
4212                                 continue;
4213                         }
4214
4215                         preType = type;
4216
4217                         if ( liveMap[ type ] ) {
4218                                 types.push( liveMap[ type ] + namespaces );
4219                                 type = type + namespaces;
4220
4221                         } else {
4222                                 type = (liveMap[ type ] || type) + namespaces;
4223                         }
4224
4225                         if ( name === "live" ) {
4226                                 // bind live handler
4227                                 for ( var j = 0, l = context.length; j < l; j++ ) {
4228                                         jQuery.event.add( context[j], "live." + liveConvert( type, selector ),
4229                                                 { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
4230                                 }
4231
4232                         } else {
4233                                 // unbind live handler
4234                                 context.unbind( "live." + liveConvert( type, selector ), fn );
4235                         }
4236                 }
4237
4238                 return this;
4239         };
4240 });
4241
4242 function liveHandler( event ) {
4243         var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret,
4244                 elems = [],
4245                 selectors = [],
4246                 events = jQuery._data( this, "events" );
4247
4248         // Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911)
4249         if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) {
4250                 return;
4251         }
4252
4253         if ( event.namespace ) {
4254                 namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)");
4255         }
4256
4257         event.liveFired = this;
4258
4259         var live = events.live.slice(0);
4260
4261         for ( j = 0; j < live.length; j++ ) {
4262                 handleObj = live[j];
4263
4264                 if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
4265                         selectors.push( handleObj.selector );
4266
4267                 } else {
4268                         live.splice( j--, 1 );
4269                 }
4270         }
4271
4272         match = jQuery( event.target ).closest( selectors, event.currentTarget );
4273
4274         for ( i = 0, l = match.length; i < l; i++ ) {
4275                 close = match[i];
4276
4277                 for ( j = 0; j < live.length; j++ ) {
4278                         handleObj = live[j];
4279
4280                         if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) {
4281                                 elem = close.elem;
4282                                 related = null;
4283
4284                                 // Those two events require additional checking
4285                                 if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
4286                                         event.type = handleObj.preType;
4287                                         related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
4288
4289                                         // Make sure not to accidentally match a child element with the same selector
4290                                         if ( related && jQuery.contains( elem, related ) ) {
4291                                                 related = elem;
4292                                         }
4293                                 }
4294
4295                                 if ( !related || related !== elem ) {
4296                                         elems.push({ elem: elem, handleObj: handleObj, level: close.level });
4297                                 }
4298                         }
4299                 }
4300         }
4301
4302         for ( i = 0, l = elems.length; i < l; i++ ) {
4303                 match = elems[i];
4304
4305                 if ( maxLevel && match.level > maxLevel ) {
4306                         break;
4307                 }
4308
4309                 event.currentTarget = match.elem;
4310                 event.data = match.handleObj.data;
4311                 event.handleObj = match.handleObj;
4312
4313                 ret = match.handleObj.origHandler.apply( match.elem, arguments );
4314
4315                 if ( ret === false || event.isPropagationStopped() ) {
4316                         maxLevel = match.level;
4317
4318                         if ( ret === false ) {
4319                                 stop = false;
4320                         }
4321                         if ( event.isImmediatePropagationStopped() ) {
4322                                 break;
4323                         }
4324                 }
4325         }
4326
4327         return stop;
4328 }
4329
4330 function liveConvert( type, selector ) {
4331         return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspaces, "&");
4332 }
4333
4334 jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
4335         "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
4336         "change select submit keydown keypress keyup error").split(" "), function( i, name ) {
4337
4338         // Handle event binding
4339         jQuery.fn[ name ] = function( data, fn ) {
4340                 if ( fn == null ) {
4341                         fn = data;
4342                         data = null;
4343                 }
4344
4345                 return arguments.length > 0 ?
4346                         this.bind( name, data, fn ) :
4347                         this.trigger( name );
4348         };
4349
4350         if ( jQuery.attrFn ) {
4351                 jQuery.attrFn[ name ] = true;
4352         }
4353 });
4354
4355
4356
4357 /*!
4358  * Sizzle CSS Selector Engine
4359  *  Copyright 2011, The Dojo Foundation
4360  *  Released under the MIT, BSD, and GPL Licenses.
4361  *  More information: http://sizzlejs.com/
4362  */
4363 (function(){
4364
4365 var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
4366         done = 0,
4367         toString = Object.prototype.toString,
4368         hasDuplicate = false,
4369         baseHasDuplicate = true,
4370         rBackslash = /\\/g,
4371         rNonWord = /\W/;
4372
4373 // Here we check if the JavaScript engine is using some sort of
4374 // optimization where it does not always call our comparision
4375 // function. If that is the case, discard the hasDuplicate value.
4376 //   Thus far that includes Google Chrome.
4377 [0, 0].sort(function() {
4378         baseHasDuplicate = false;
4379         return 0;
4380 });
4381
4382 var Sizzle = function( selector, context, results, seed ) {
4383         results = results || [];
4384         context = context || document;
4385
4386         var origContext = context;
4387
4388         if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
4389                 return [];
4390         }
4391         
4392         if ( !selector || typeof selector !== "string" ) {
4393                 return results;
4394         }
4395
4396         var m, set, checkSet, extra, ret, cur, pop, i,
4397                 prune = true,
4398                 contextXML = Sizzle.isXML( context ),
4399                 parts = [],
4400                 soFar = selector;
4401         
4402         // Reset the position of the chunker regexp (start from head)
4403         do {
4404                 chunker.exec( "" );
4405                 m = chunker.exec( soFar );
4406
4407                 if ( m ) {
4408                         soFar = m[3];
4409                 
4410                         parts.push( m[1] );
4411                 
4412                         if ( m[2] ) {
4413                                 extra = m[3];
4414                                 break;
4415                         }
4416                 }
4417         } while ( m );
4418
4419         if ( parts.length > 1 && origPOS.exec( selector ) ) {
4420
4421                 if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
4422                         set = posProcess( parts[0] + parts[1], context );
4423
4424                 } else {
4425                         set = Expr.relative[ parts[0] ] ?
4426                                 [ context ] :
4427                                 Sizzle( parts.shift(), context );
4428
4429                         while ( parts.length ) {
4430                                 selector = parts.shift();
4431
4432                                 if ( Expr.relative[ selector ] ) {
4433                                         selector += parts.shift();
4434                                 }
4435                                 
4436                                 set = posProcess( selector, set );
4437                         }
4438                 }
4439
4440         } else {
4441                 // Take a shortcut and set the context if the root selector is an ID
4442                 // (but not if it'll be faster if the inner selector is an ID)
4443                 if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
4444                                 Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
4445
4446                         ret = Sizzle.find( parts.shift(), context, contextXML );
4447                         context = ret.expr ?
4448                                 Sizzle.filter( ret.expr, ret.set )[0] :
4449                                 ret.set[0];
4450                 }
4451
4452                 if ( context ) {
4453                         ret = seed ?
4454                                 { expr: parts.pop(), set: makeArray(seed) } :
4455                                 Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
4456
4457                         set = ret.expr ?
4458                                 Sizzle.filter( ret.expr, ret.set ) :
4459                                 ret.set;
4460
4461                         if ( parts.length > 0 ) {
4462                                 checkSet = makeArray( set );
4463
4464                         } else {
4465                                 prune = false;
4466                         }
4467
4468                         while ( parts.length ) {
4469                                 cur = parts.pop();
4470                                 pop = cur;
4471
4472                                 if ( !Expr.relative[ cur ] ) {
4473                                         cur = "";
4474                                 } else {
4475                                         pop = parts.pop();
4476                                 }
4477
4478                                 if ( pop == null ) {
4479                                         pop = context;
4480                                 }
4481
4482                                 Expr.relative[ cur ]( checkSet, pop, contextXML );
4483                         }
4484
4485                 } else {
4486                         checkSet = parts = [];
4487                 }
4488         }
4489
4490         if ( !checkSet ) {
4491                 checkSet = set;
4492         }
4493
4494         if ( !checkSet ) {
4495                 Sizzle.error( cur || selector );
4496         }
4497
4498         if ( toString.call(checkSet) === "[object Array]" ) {
4499                 if ( !prune ) {
4500                         results.push.apply( results, checkSet );
4501
4502                 } else if ( context && context.nodeType === 1 ) {
4503                         for ( i = 0; checkSet[i] != null; i++ ) {
4504                                 if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
4505                                         results.push( set[i] );
4506                                 }
4507                         }
4508
4509                 } else {
4510                         for ( i = 0; checkSet[i] != null; i++ ) {
4511                                 if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
4512                                         results.push( set[i] );
4513                                 }
4514                         }
4515                 }
4516
4517         } else {
4518                 makeArray( checkSet, results );
4519         }
4520
4521         if ( extra ) {
4522                 Sizzle( extra, origContext, results, seed );
4523                 Sizzle.uniqueSort( results );
4524         }
4525
4526         return results;
4527 };
4528
4529 Sizzle.uniqueSort = function( results ) {
4530         if ( sortOrder ) {
4531                 hasDuplicate = baseHasDuplicate;
4532                 results.sort( sortOrder );
4533
4534                 if ( hasDuplicate ) {
4535                         for ( var i = 1; i < results.length; i++ ) {
4536                                 if ( results[i] === results[ i - 1 ] ) {
4537                                         results.splice( i--, 1 );
4538                                 }
4539                         }
4540                 }
4541         }
4542
4543         return results;
4544 };
4545
4546 Sizzle.matches = function( expr, set ) {
4547         return Sizzle( expr, null, null, set );
4548 };
4549
4550 Sizzle.matchesSelector = function( node, expr ) {
4551         return Sizzle( expr, null, null, [node] ).length > 0;
4552 };
4553
4554 Sizzle.find = function( expr, context, isXML ) {
4555         var set;
4556
4557         if ( !expr ) {
4558                 return [];
4559         }
4560
4561         for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
4562                 var match,
4563                         type = Expr.order[i];
4564                 
4565                 if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
4566                         var left = match[1];
4567                         match.splice( 1, 1 );
4568
4569                         if ( left.substr( left.length - 1 ) !== "\\" ) {
4570                                 match[1] = (match[1] || "").replace( rBackslash, "" );
4571                                 set = Expr.find[ type ]( match, context, isXML );
4572
4573                                 if ( set != null ) {
4574                                         expr = expr.replace( Expr.match[ type ], "" );
4575                                         break;
4576                                 }
4577                         }
4578                 }
4579         }
4580
4581         if ( !set ) {
4582                 set = typeof context.getElementsByTagName !== "undefined" ?
4583                         context.getElementsByTagName( "*" ) :
4584                         [];
4585         }
4586
4587         return { set: set, expr: expr };
4588 };
4589
4590 Sizzle.filter = function( expr, set, inplace, not ) {
4591         var match, anyFound,
4592                 old = expr,
4593                 result = [],
4594                 curLoop = set,
4595                 isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
4596
4597         while ( expr && set.length ) {
4598                 for ( var type in Expr.filter ) {
4599                         if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
4600                                 var found, item,
4601                                         filter = Expr.filter[ type ],
4602                                         left = match[1];
4603
4604                                 anyFound = false;
4605
4606                                 match.splice(1,1);
4607
4608                                 if ( left.substr( left.length - 1 ) === "\\" ) {
4609                                         continue;
4610                                 }
4611
4612                                 if ( curLoop === result ) {
4613                                         result = [];
4614                                 }
4615
4616                                 if ( Expr.preFilter[ type ] ) {
4617                                         match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
4618
4619                                         if ( !match ) {
4620                                                 anyFound = found = true;
4621
4622                                         } else if ( match === true ) {
4623                                                 continue;
4624                                         }
4625                                 }
4626
4627                                 if ( match ) {
4628                                         for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
4629                                                 if ( item ) {
4630                                                         found = filter( item, match, i, curLoop );
4631                                                         var pass = not ^ !!found;
4632
4633                                                         if ( inplace && found != null ) {
4634                                                                 if ( pass ) {
4635                                                                         anyFound = true;
4636
4637                                                                 } else {
4638                                                                         curLoop[i] = false;
4639                                                                 }
4640
4641                                                         } else if ( pass ) {
4642                                                                 result.push( item );
4643                                                                 anyFound = true;
4644                                                         }
4645                                                 }
4646                                         }
4647                                 }
4648
4649                                 if ( found !== undefined ) {
4650                                         if ( !inplace ) {
4651                                                 curLoop = result;
4652                                         }
4653
4654                                         expr = expr.replace( Expr.match[ type ], "" );
4655
4656                                         if ( !anyFound ) {
4657                                                 return [];
4658                                         }
4659
4660                                         break;
4661                                 }
4662                         }
4663                 }
4664
4665                 // Improper expression
4666                 if ( expr === old ) {
4667                         if ( anyFound == null ) {
4668                                 Sizzle.error( expr );
4669
4670                         } else {
4671                                 break;
4672                         }
4673                 }
4674
4675                 old = expr;
4676         }
4677
4678         return curLoop;
4679 };
4680
4681 Sizzle.error = function( msg ) {
4682         throw "Syntax error, unrecognized expression: " + msg;
4683 };
4684
4685 var Expr = Sizzle.selectors = {
4686         order: [ "ID", "NAME", "TAG" ],
4687
4688         match: {
4689                 ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
4690                 CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
4691                 NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
4692                 ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
4693                 TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
4694                 CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
4695                 POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
4696                 PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
4697         },
4698
4699         leftMatch: {},
4700
4701         attrMap: {
4702                 "class": "className",
4703                 "for": "htmlFor"
4704         },
4705
4706         attrHandle: {
4707                 href: function( elem ) {
4708                         return elem.getAttribute( "href" );
4709                 },
4710                 type: function( elem ) {
4711                         return elem.getAttribute( "type" );
4712                 }
4713         },
4714
4715         relative: {
4716                 "+": function(checkSet, part){
4717                         var isPartStr = typeof part === "string",
4718                                 isTag = isPartStr && !rNonWord.test( part ),
4719                                 isPartStrNotTag = isPartStr && !isTag;
4720
4721                         if ( isTag ) {
4722                                 part = part.toLowerCase();
4723                         }
4724
4725                         for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
4726                                 if ( (elem = checkSet[i]) ) {
4727                                         while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
4728
4729                                         checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
4730                                                 elem || false :
4731                                                 elem === part;
4732                                 }
4733                         }
4734
4735                         if ( isPartStrNotTag ) {
4736                                 Sizzle.filter( part, checkSet, true );
4737                         }
4738                 },
4739
4740                 ">": function( checkSet, part ) {
4741                         var elem,
4742                                 isPartStr = typeof part === "string",
4743                                 i = 0,
4744                                 l = checkSet.length;
4745
4746                         if ( isPartStr && !rNonWord.test( part ) ) {
4747                                 part = part.toLowerCase();
4748
4749                                 for ( ; i < l; i++ ) {
4750                                         elem = checkSet[i];
4751
4752                                         if ( elem ) {
4753                                                 var parent = elem.parentNode;
4754                                                 checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
4755                                         }
4756                                 }
4757
4758                         } else {
4759                                 for ( ; i < l; i++ ) {
4760                                         elem = checkSet[i];
4761
4762                                         if ( elem ) {
4763                                                 checkSet[i] = isPartStr ?
4764                                                         elem.parentNode :
4765                                                         elem.parentNode === part;
4766                                         }
4767                                 }
4768
4769                                 if ( isPartStr ) {
4770                                         Sizzle.filter( part, checkSet, true );
4771                                 }
4772                         }
4773                 },
4774
4775                 "": function(checkSet, part, isXML){
4776                         var nodeCheck,
4777                                 doneName = done++,
4778                                 checkFn = dirCheck;
4779
4780                         if ( typeof part === "string" && !rNonWord.test( part ) ) {
4781                                 part = part.toLowerCase();
4782                                 nodeCheck = part;
4783                                 checkFn = dirNodeCheck;
4784                         }
4785
4786                         checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
4787                 },
4788
4789                 "~": function( checkSet, part, isXML ) {
4790                         var nodeCheck,
4791                                 doneName = done++,
4792                                 checkFn = dirCheck;
4793
4794                         if ( typeof part === "string" && !rNonWord.test( part ) ) {
4795                                 part = part.toLowerCase();
4796                                 nodeCheck = part;
4797                                 checkFn = dirNodeCheck;
4798                         }
4799
4800                         checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
4801                 }
4802         },
4803
4804         find: {
4805                 ID: function( match, context, isXML ) {
4806                         if ( typeof context.getElementById !== "undefined" && !isXML ) {
4807                                 var m = context.getElementById(match[1]);
4808                                 // Check parentNode to catch when Blackberry 4.6 returns
4809                                 // nodes that are no longer in the document #6963
4810                                 return m && m.parentNode ? [m] : [];
4811                         }
4812                 },
4813
4814                 NAME: function( match, context ) {
4815                         if ( typeof context.getElementsByName !== "undefined" ) {
4816                                 var ret = [],
4817                                         results = context.getElementsByName( match[1] );
4818
4819                                 for ( var i = 0, l = results.length; i < l; i++ ) {
4820                                         if ( results[i].getAttribute("name") === match[1] ) {
4821                                                 ret.push( results[i] );
4822                                         }
4823                                 }
4824
4825                                 return ret.length === 0 ? null : ret;
4826                         }
4827                 },
4828
4829                 TAG: function( match, context ) {
4830                         if ( typeof context.getElementsByTagName !== "undefined" ) {
4831                                 return context.getElementsByTagName( match[1] );
4832                         }
4833                 }
4834         },
4835         preFilter: {
4836                 CLASS: function( match, curLoop, inplace, result, not, isXML ) {
4837                         match = " " + match[1].replace( rBackslash, "" ) + " ";
4838
4839                         if ( isXML ) {
4840                                 return match;
4841                         }
4842
4843                         for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
4844                                 if ( elem ) {
4845                                         if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
4846                                                 if ( !inplace ) {
4847                                                         result.push( elem );
4848                                                 }
4849
4850                                         } else if ( inplace ) {
4851                                                 curLoop[i] = false;
4852                                         }
4853                                 }
4854                         }
4855
4856                         return false;
4857                 },
4858
4859                 ID: function( match ) {
4860                         return match[1].replace( rBackslash, "" );
4861                 },
4862
4863                 TAG: function( match, curLoop ) {
4864                         return match[1].replace( rBackslash, "" ).toLowerCase();
4865                 },
4866
4867                 CHILD: function( match ) {
4868                         if ( match[1] === "nth" ) {
4869                                 if ( !match[2] ) {
4870                                         Sizzle.error( match[0] );
4871                                 }
4872
4873                                 match[2] = match[2].replace(/^\+|\s*/g, '');
4874
4875                                 // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
4876                                 var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
4877                                         match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
4878                                         !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
4879
4880                                 // calculate the numbers (first)n+(last) including if they are negative
4881                                 match[2] = (test[1] + (test[2] || 1)) - 0;
4882                                 match[3] = test[3] - 0;
4883                         }
4884                         else if ( match[2] ) {
4885                                 Sizzle.error( match[0] );
4886                         }
4887
4888                         // TODO: Move to normal caching system
4889                         match[0] = done++;
4890
4891                         return match;
4892                 },
4893
4894                 ATTR: function( match, curLoop, inplace, result, not, isXML ) {
4895                         var name = match[1] = match[1].replace( rBackslash, "" );
4896                         
4897                         if ( !isXML && Expr.attrMap[name] ) {
4898                                 match[1] = Expr.attrMap[name];
4899                         }
4900
4901                         // Handle if an un-quoted value was used
4902                         match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
4903
4904                         if ( match[2] === "~=" ) {
4905                                 match[4] = " " + match[4] + " ";
4906                         }
4907
4908                         return match;
4909                 },
4910
4911                 PSEUDO: function( match, curLoop, inplace, result, not ) {
4912                         if ( match[1] === "not" ) {
4913                                 // If we're dealing with a complex expression, or a simple one
4914                                 if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
4915                                         match[3] = Sizzle(match[3], null, null, curLoop);
4916
4917                                 } else {
4918                                         var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
4919
4920                                         if ( !inplace ) {
4921                                                 result.push.apply( result, ret );
4922                                         }
4923
4924                                         return false;
4925                                 }
4926
4927                         } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
4928                                 return true;
4929                         }
4930                         
4931                         return match;
4932                 },
4933
4934                 POS: function( match ) {
4935                         match.unshift( true );
4936
4937                         return match;
4938                 }
4939         },
4940         
4941         filters: {
4942                 enabled: function( elem ) {
4943                         return elem.disabled === false && elem.type !== "hidden";
4944                 },
4945
4946                 disabled: function( elem ) {
4947                         return elem.disabled === true;
4948                 },
4949
4950                 checked: function( elem ) {
4951                         return elem.checked === true;
4952                 },
4953                 
4954                 selected: function( elem ) {
4955                         // Accessing this property makes selected-by-default
4956                         // options in Safari work properly
4957                         if ( elem.parentNode ) {
4958                                 elem.parentNode.selectedIndex;
4959                         }
4960                         
4961                         return elem.selected === true;
4962                 },
4963
4964                 parent: function( elem ) {
4965                         return !!elem.firstChild;
4966                 },
4967
4968                 empty: function( elem ) {
4969                         return !elem.firstChild;
4970                 },
4971
4972                 has: function( elem, i, match ) {
4973                         return !!Sizzle( match[3], elem ).length;
4974                 },
4975
4976                 header: function( elem ) {
4977                         return (/h\d/i).test( elem.nodeName );
4978                 },
4979
4980                 text: function( elem ) {
4981                         var attr = elem.getAttribute( "type" ), type = elem.type;
4982                         // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) 
4983                         // use getAttribute instead to test this case
4984                         return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
4985                 },
4986
4987                 radio: function( elem ) {
4988                         return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
4989                 },
4990
4991                 checkbox: function( elem ) {
4992                         return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
4993                 },
4994
4995                 file: function( elem ) {
4996                         return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
4997                 },
4998
4999                 password: function( elem ) {
5000                         return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
5001                 },
5002
5003                 submit: function( elem ) {
5004                         var name = elem.nodeName.toLowerCase();
5005                         return (name === "input" || name === "button") && "submit" === elem.type;
5006                 },
5007
5008                 image: function( elem ) {
5009                         return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
5010                 },
5011
5012                 reset: function( elem ) {
5013                         return elem.nodeName.toLowerCase() === "input" && "reset" === elem.type;
5014                 },
5015
5016                 button: function( elem ) {
5017                         var name = elem.nodeName.toLowerCase();
5018                         return name === "input" && "button" === elem.type || name === "button";
5019                 },
5020
5021                 input: function( elem ) {
5022                         return (/input|select|textarea|button/i).test( elem.nodeName );
5023                 },
5024
5025                 focus: function( elem ) {
5026                         return elem === elem.ownerDocument.activeElement;
5027                 }
5028         },
5029         setFilters: {
5030                 first: function( elem, i ) {
5031                         return i === 0;
5032                 },
5033
5034                 last: function( elem, i, match, array ) {
5035                         return i === array.length - 1;
5036                 },
5037
5038                 even: function( elem, i ) {
5039                         return i % 2 === 0;
5040                 },
5041
5042                 odd: function( elem, i ) {
5043                         return i % 2 === 1;
5044                 },
5045
5046                 lt: function( elem, i, match ) {
5047                         return i < match[3] - 0;
5048                 },
5049
5050                 gt: function( elem, i, match ) {
5051                         return i > match[3] - 0;
5052                 },
5053
5054                 nth: function( elem, i, match ) {
5055                         return match[3] - 0 === i;
5056                 },
5057
5058                 eq: function( elem, i, match ) {
5059                         return match[3] - 0 === i;
5060                 }
5061         },
5062         filter: {
5063                 PSEUDO: function( elem, match, i, array ) {
5064                         var name = match[1],
5065                                 filter = Expr.filters[ name ];
5066
5067                         if ( filter ) {
5068                                 return filter( elem, i, match, array );
5069
5070                         } else if ( name === "contains" ) {
5071                                 return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0;
5072
5073                         } else if ( name === "not" ) {
5074                                 var not = match[3];
5075
5076                                 for ( var j = 0, l = not.length; j < l; j++ ) {
5077                                         if ( not[j] === elem ) {
5078                                                 return false;
5079                                         }
5080                                 }
5081
5082                                 return true;
5083
5084                         } else {
5085                                 Sizzle.error( name );
5086                         }
5087                 },
5088
5089                 CHILD: function( elem, match ) {
5090                         var type = match[1],
5091                                 node = elem;
5092
5093                         switch ( type ) {
5094                                 case "only":
5095                                 case "first":
5096                                         while ( (node = node.previousSibling) )  {
5097                                                 if ( node.nodeType === 1 ) { 
5098                                                         return false; 
5099                                                 }
5100                                         }
5101
5102                                         if ( type === "first" ) { 
5103                                                 return true; 
5104                                         }
5105
5106                                         node = elem;
5107
5108                                 case "last":
5109                                         while ( (node = node.nextSibling) )      {
5110                                                 if ( node.nodeType === 1 ) { 
5111                                                         return false; 
5112                                                 }
5113                                         }
5114
5115                                         return true;
5116
5117                                 case "nth":
5118                                         var first = match[2],
5119                                                 last = match[3];
5120
5121                                         if ( first === 1 && last === 0 ) {
5122                                                 return true;
5123                                         }
5124                                         
5125                                         var doneName = match[0],
5126                                                 parent = elem.parentNode;
5127         
5128                                         if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
5129                                                 var count = 0;
5130                                                 
5131                                                 for ( node = parent.firstChild; node; node = node.nextSibling ) {
5132                                                         if ( node.nodeType === 1 ) {
5133                                                                 node.nodeIndex = ++count;
5134                                                         }
5135                                                 } 
5136
5137                                                 parent.sizcache = doneName;
5138                                         }
5139                                         
5140                                         var diff = elem.nodeIndex - last;
5141
5142                                         if ( first === 0 ) {
5143                                                 return diff === 0;
5144
5145                                         } else {
5146                                                 return ( diff % first === 0 && diff / first >= 0 );
5147                                         }
5148                         }
5149                 },
5150
5151                 ID: function( elem, match ) {
5152                         return elem.nodeType === 1 && elem.getAttribute("id") === match;
5153                 },
5154
5155                 TAG: function( elem, match ) {
5156                         return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
5157                 },
5158                 
5159                 CLASS: function( elem, match ) {
5160                         return (" " + (elem.className || elem.getAttribute("class")) + " ")
5161                                 .indexOf( match ) > -1;
5162                 },
5163
5164                 ATTR: function( elem, match ) {
5165                         var name = match[1],
5166                                 result = Expr.attrHandle[ name ] ?
5167                                         Expr.attrHandle[ name ]( elem ) :
5168                                         elem[ name ] != null ?
5169                                                 elem[ name ] :
5170                                                 elem.getAttribute( name ),
5171                                 value = result + "",
5172                                 type = match[2],
5173                                 check = match[4];
5174
5175                         return result == null ?
5176                                 type === "!=" :
5177                                 type === "=" ?
5178                                 value === check :
5179                                 type === "*=" ?
5180                                 value.indexOf(check) >= 0 :
5181                                 type === "~=" ?
5182                                 (" " + value + " ").indexOf(check) >= 0 :
5183                                 !check ?
5184                                 value && result !== false :
5185                                 type === "!=" ?
5186                                 value !== check :
5187                                 type === "^=" ?
5188                                 value.indexOf(check) === 0 :
5189                                 type === "$=" ?
5190                                 value.substr(value.length - check.length) === check :
5191                                 type === "|=" ?
5192                                 value === check || value.substr(0, check.length + 1) === check + "-" :
5193                                 false;
5194                 },
5195
5196                 POS: function( elem, match, i, array ) {
5197                         var name = match[2],
5198                                 filter = Expr.setFilters[ name ];
5199
5200                         if ( filter ) {
5201                                 return filter( elem, i, match, array );
5202                         }
5203                 }
5204         }
5205 };
5206
5207 var origPOS = Expr.match.POS,
5208         fescape = function(all, num){
5209                 return "\\" + (num - 0 + 1);
5210         };
5211
5212 for ( var type in Expr.match ) {
5213         Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
5214         Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
5215 }
5216
5217 var makeArray = function( array, results ) {
5218         array = Array.prototype.slice.call( array, 0 );
5219
5220         if ( results ) {
5221                 results.push.apply( results, array );
5222                 return results;
5223         }
5224         
5225         return array;
5226 };
5227
5228 // Perform a simple check to determine if the browser is capable of
5229 // converting a NodeList to an array using builtin methods.
5230 // Also verifies that the returned array holds DOM nodes
5231 // (which is not the case in the Blackberry browser)
5232 try {
5233         Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
5234
5235 // Provide a fallback method if it does not work
5236 } catch( e ) {
5237         makeArray = function( array, results ) {
5238                 var i = 0,
5239                         ret = results || [];
5240
5241                 if ( toString.call(array) === "[object Array]" ) {
5242                         Array.prototype.push.apply( ret, array );
5243
5244                 } else {
5245                         if ( typeof array.length === "number" ) {
5246                                 for ( var l = array.length; i < l; i++ ) {
5247                                         ret.push( array[i] );
5248                                 }
5249
5250                         } else {
5251                                 for ( ; array[i]; i++ ) {
5252                                         ret.push( array[i] );
5253                                 }
5254                         }
5255                 }
5256
5257                 return ret;
5258         };
5259 }
5260
5261 var sortOrder, siblingCheck;
5262
5263 if ( document.documentElement.compareDocumentPosition ) {
5264         sortOrder = function( a, b ) {
5265                 if ( a === b ) {
5266                         hasDuplicate = true;
5267                         return 0;
5268                 }
5269
5270                 if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
5271                         return a.compareDocumentPosition ? -1 : 1;
5272                 }
5273
5274                 return a.compareDocumentPosition(b) & 4 ? -1 : 1;
5275         };
5276
5277 } else {
5278         sortOrder = function( a, b ) {
5279                 var al, bl,
5280                         ap = [],
5281                         bp = [],
5282                         aup = a.parentNode,
5283                         bup = b.parentNode,
5284                         cur = aup;
5285
5286                 // The nodes are identical, we can exit early
5287                 if ( a === b ) {
5288                         hasDuplicate = true;
5289                         return 0;
5290
5291                 // If the nodes are siblings (or identical) we can do a quick check
5292                 } else if ( aup === bup ) {
5293                         return siblingCheck( a, b );
5294
5295                 // If no parents were found then the nodes are disconnected
5296                 } else if ( !aup ) {
5297                         return -1;
5298
5299                 } else if ( !bup ) {
5300                         return 1;
5301                 }
5302
5303                 // Otherwise they're somewhere else in the tree so we need
5304                 // to build up a full list of the parentNodes for comparison
5305                 while ( cur ) {
5306                         ap.unshift( cur );
5307                         cur = cur.parentNode;
5308                 }
5309
5310                 cur = bup;
5311
5312                 while ( cur ) {
5313                         bp.unshift( cur );
5314                         cur = cur.parentNode;
5315                 }
5316
5317                 al = ap.length;
5318                 bl = bp.length;
5319
5320                 // Start walking down the tree looking for a discrepancy
5321                 for ( var i = 0; i < al && i < bl; i++ ) {
5322                         if ( ap[i] !== bp[i] ) {
5323                                 return siblingCheck( ap[i], bp[i] );
5324                         }
5325                 }
5326
5327                 // We ended someplace up the tree so do a sibling check
5328                 return i === al ?
5329                         siblingCheck( a, bp[i], -1 ) :
5330                         siblingCheck( ap[i], b, 1 );
5331         };
5332
5333         siblingCheck = function( a, b, ret ) {
5334                 if ( a === b ) {
5335                         return ret;
5336                 }
5337
5338                 var cur = a.nextSibling;
5339
5340                 while ( cur ) {
5341                         if ( cur === b ) {
5342                                 return -1;
5343                         }
5344
5345                         cur = cur.nextSibling;
5346                 }
5347
5348                 return 1;
5349         };
5350 }
5351
5352 // Utility function for retreiving the text value of an array of DOM nodes
5353 Sizzle.getText = function( elems ) {
5354         var ret = "", elem;
5355
5356         for ( var i = 0; elems[i]; i++ ) {
5357                 elem = elems[i];
5358
5359                 // Get the text from text nodes and CDATA nodes
5360                 if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
5361                         ret += elem.nodeValue;
5362
5363                 // Traverse everything else, except comment nodes
5364                 } else if ( elem.nodeType !== 8 ) {
5365                         ret += Sizzle.getText( elem.childNodes );
5366                 }
5367         }
5368
5369         return ret;
5370 };
5371
5372 // Check to see if the browser returns elements by name when
5373 // querying by getElementById (and provide a workaround)
5374 (function(){
5375         // We're going to inject a fake input element with a specified name
5376         var form = document.createElement("div"),
5377                 id = "script" + (new Date()).getTime(),
5378                 root = document.documentElement;
5379
5380         form.innerHTML = "<a name='" + id + "'/>";
5381
5382         // Inject it into the root element, check its status, and remove it quickly
5383         root.insertBefore( form, root.firstChild );
5384
5385         // The workaround has to do additional checks after a getElementById
5386         // Which slows things down for other browsers (hence the branching)
5387         if ( document.getElementById( id ) ) {
5388                 Expr.find.ID = function( match, context, isXML ) {
5389                         if ( typeof context.getElementById !== "undefined" && !isXML ) {
5390                                 var m = context.getElementById(match[1]);
5391
5392                                 return m ?
5393                                         m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
5394                                                 [m] :
5395                                                 undefined :
5396                                         [];
5397                         }
5398                 };
5399
5400                 Expr.filter.ID = function( elem, match ) {
5401                         var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
5402
5403                         return elem.nodeType === 1 && node && node.nodeValue === match;
5404                 };
5405         }
5406
5407         root.removeChild( form );
5408
5409         // release memory in IE
5410         root = form = null;
5411 })();
5412
5413 (function(){
5414         // Check to see if the browser returns only elements
5415         // when doing getElementsByTagName("*")
5416
5417         // Create a fake element
5418         var div = document.createElement("div");
5419         div.appendChild( document.createComment("") );
5420
5421         // Make sure no comments are found
5422         if ( div.getElementsByTagName("*").length > 0 ) {
5423                 Expr.find.TAG = function( match, context ) {
5424                         var results = context.getElementsByTagName( match[1] );
5425
5426                         // Filter out possible comments
5427                         if ( match[1] === "*" ) {
5428                                 var tmp = [];
5429
5430                                 for ( var i = 0; results[i]; i++ ) {
5431                                         if ( results[i].nodeType === 1 ) {
5432                                                 tmp.push( results[i] );
5433                                         }
5434                                 }
5435
5436                                 results = tmp;
5437                         }
5438
5439                         return results;
5440                 };
5441         }
5442
5443         // Check to see if an attribute returns normalized href attributes
5444         div.innerHTML = "<a href='#'></a>";
5445
5446         if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
5447                         div.firstChild.getAttribute("href") !== "#" ) {
5448
5449                 Expr.attrHandle.href = function( elem ) {
5450                         return elem.getAttribute( "href", 2 );
5451                 };
5452         }
5453
5454         // release memory in IE
5455         div = null;
5456 })();
5457
5458 if ( document.querySelectorAll ) {
5459         (function(){
5460                 var oldSizzle = Sizzle,
5461                         div = document.createElement("div"),
5462                         id = "__sizzle__";
5463
5464                 div.innerHTML = "<p class='TEST'></p>";
5465
5466                 // Safari can't handle uppercase or unicode characters when
5467                 // in quirks mode.
5468                 if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
5469                         return;
5470                 }
5471         
5472                 Sizzle = function( query, context, extra, seed ) {
5473                         context = context || document;
5474
5475                         // Only use querySelectorAll on non-XML documents
5476                         // (ID selectors don't work in non-HTML documents)
5477                         if ( !seed && !Sizzle.isXML(context) ) {
5478                                 // See if we find a selector to speed up
5479                                 var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
5480                                 
5481                                 if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
5482                                         // Speed-up: Sizzle("TAG")
5483                                         if ( match[1] ) {
5484                                                 return makeArray( context.getElementsByTagName( query ), extra );
5485                                         
5486                                         // Speed-up: Sizzle(".CLASS")
5487                                         } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
5488                                                 return makeArray( context.getElementsByClassName( match[2] ), extra );
5489                                         }
5490                                 }
5491                                 
5492                                 if ( context.nodeType === 9 ) {
5493                                         // Speed-up: Sizzle("body")
5494                                         // The body element only exists once, optimize finding it
5495                                         if ( query === "body" && context.body ) {
5496                                                 return makeArray( [ context.body ], extra );
5497                                                 
5498                                         // Speed-up: Sizzle("#ID")
5499                                         } else if ( match && match[3] ) {
5500                                                 var elem = context.getElementById( match[3] );
5501
5502                                                 // Check parentNode to catch when Blackberry 4.6 returns
5503                                                 // nodes that are no longer in the document #6963
5504                                                 if ( elem && elem.parentNode ) {
5505                                                         // Handle the case where IE and Opera return items
5506                                                         // by name instead of ID
5507                                                         if ( elem.id === match[3] ) {
5508                                                                 return makeArray( [ elem ], extra );
5509                                                         }
5510                                                         
5511                                                 } else {
5512                                                         return makeArray( [], extra );
5513                                                 }
5514                                         }
5515                                         
5516                                         try {
5517                                                 return makeArray( context.querySelectorAll(query), extra );
5518                                         } catch(qsaError) {}
5519
5520                                 // qSA works strangely on Element-rooted queries
5521                                 // We can work around this by specifying an extra ID on the root
5522                                 // and working up from there (Thanks to Andrew Dupont for the technique)
5523                                 // IE 8 doesn't work on object elements
5524                                 } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
5525                                         var oldContext = context,
5526                                                 old = context.getAttribute( "id" ),
5527                                                 nid = old || id,
5528                                                 hasParent = context.parentNode,
5529                                                 relativeHierarchySelector = /^\s*[+~]/.test( query );
5530
5531                                         if ( !old ) {
5532                                                 context.setAttribute( "id", nid );
5533                                         } else {
5534                                                 nid = nid.replace( /'/g, "\\$&" );
5535                                         }
5536                                         if ( relativeHierarchySelector && hasParent ) {
5537                                                 context = context.parentNode;
5538                                         }
5539
5540                                         try {
5541                                                 if ( !relativeHierarchySelector || hasParent ) {
5542                                                         return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
5543                                                 }
5544
5545                                         } catch(pseudoError) {
5546                                         } finally {
5547                                                 if ( !old ) {
5548                                                         oldContext.removeAttribute( "id" );
5549                                                 }
5550                                         }
5551                                 }
5552                         }
5553                 
5554                         return oldSizzle(query, context, extra, seed);
5555                 };
5556
5557                 for ( var prop in oldSizzle ) {
5558                         Sizzle[ prop ] = oldSizzle[ prop ];
5559                 }
5560
5561                 // release memory in IE
5562                 div = null;
5563         })();
5564 }
5565
5566 (function(){
5567         var html = document.documentElement,
5568                 matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
5569
5570         if ( matches ) {
5571                 // Check to see if it's possible to do matchesSelector
5572                 // on a disconnected node (IE 9 fails this)
5573                 var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
5574                         pseudoWorks = false;
5575
5576                 try {
5577                         // This should fail with an exception
5578                         // Gecko does not error, returns false instead
5579                         matches.call( document.documentElement, "[test!='']:sizzle" );
5580         
5581                 } catch( pseudoError ) {
5582                         pseudoWorks = true;
5583                 }
5584
5585                 Sizzle.matchesSelector = function( node, expr ) {
5586                         // Make sure that attribute selectors are quoted
5587                         expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
5588
5589                         if ( !Sizzle.isXML( node ) ) {
5590                                 try { 
5591                                         if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
5592                                                 var ret = matches.call( node, expr );
5593
5594                                                 // IE 9's matchesSelector returns false on disconnected nodes
5595                                                 if ( ret || !disconnectedMatch ||
5596                                                                 // As well, disconnected nodes are said to be in a document
5597                                                                 // fragment in IE 9, so check for that
5598                                                                 node.document && node.document.nodeType !== 11 ) {
5599                                                         return ret;
5600                                                 }
5601                                         }
5602                                 } catch(e) {}
5603                         }
5604
5605                         return Sizzle(expr, null, null, [node]).length > 0;
5606                 };
5607         }
5608 })();
5609
5610 (function(){
5611         var div = document.createElement("div");
5612
5613         div.innerHTML = "<div class='test e'></div><div class='test'></div>";
5614
5615         // Opera can't find a second classname (in 9.6)
5616         // Also, make sure that getElementsByClassName actually exists
5617         if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
5618                 return;
5619         }
5620
5621         // Safari caches class attributes, doesn't catch changes (in 3.2)
5622         div.lastChild.className = "e";
5623
5624         if ( div.getElementsByClassName("e").length === 1 ) {
5625                 return;
5626         }
5627         
5628         Expr.order.splice(1, 0, "CLASS");
5629         Expr.find.CLASS = function( match, context, isXML ) {
5630                 if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
5631                         return context.getElementsByClassName(match[1]);
5632                 }
5633         };
5634
5635         // release memory in IE
5636         div = null;
5637 })();
5638
5639 function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
5640         for ( var i = 0, l = checkSet.length; i < l; i++ ) {
5641                 var elem = checkSet[i];
5642
5643                 if ( elem ) {
5644                         var match = false;
5645
5646                         elem = elem[dir];
5647
5648                         while ( elem ) {
5649                                 if ( elem.sizcache === doneName ) {
5650                                         match = checkSet[elem.sizset];
5651                                         break;
5652                                 }
5653
5654                                 if ( elem.nodeType === 1 && !isXML ){
5655                                         elem.sizcache = doneName;
5656                                         elem.sizset = i;
5657                                 }
5658
5659                                 if ( elem.nodeName.toLowerCase() === cur ) {
5660                                         match = elem;
5661                                         break;
5662                                 }
5663
5664                                 elem = elem[dir];
5665                         }
5666
5667                         checkSet[i] = match;
5668                 }
5669         }
5670 }
5671
5672 function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
5673         for ( var i = 0, l = checkSet.length; i < l; i++ ) {
5674                 var elem = checkSet[i];
5675
5676                 if ( elem ) {
5677                         var match = false;
5678                         
5679                         elem = elem[dir];
5680
5681                         while ( elem ) {
5682                                 if ( elem.sizcache === doneName ) {
5683                                         match = checkSet[elem.sizset];
5684                                         break;
5685                                 }
5686
5687                                 if ( elem.nodeType === 1 ) {
5688                                         if ( !isXML ) {
5689                                                 elem.sizcache = doneName;
5690                                                 elem.sizset = i;
5691                                         }
5692
5693                                         if ( typeof cur !== "string" ) {
5694                                                 if ( elem === cur ) {
5695                                                         match = true;
5696                                                         break;
5697                                                 }
5698
5699                                         } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
5700                                                 match = elem;
5701                                                 break;
5702                                         }
5703                                 }
5704
5705                                 elem = elem[dir];
5706                         }
5707
5708                         checkSet[i] = match;
5709                 }
5710         }
5711 }
5712
5713 if ( document.documentElement.contains ) {
5714         Sizzle.contains = function( a, b ) {
5715                 return a !== b && (a.contains ? a.contains(b) : true);
5716         };
5717
5718 } else if ( document.documentElement.compareDocumentPosition ) {
5719         Sizzle.contains = function( a, b ) {
5720                 return !!(a.compareDocumentPosition(b) & 16);
5721         };
5722
5723 } else {
5724         Sizzle.contains = function() {
5725                 return false;
5726         };
5727 }
5728
5729 Sizzle.isXML = function( elem ) {
5730         // documentElement is verified for cases where it doesn't yet exist
5731         // (such as loading iframes in IE - #4833) 
5732         var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
5733
5734         return documentElement ? documentElement.nodeName !== "HTML" : false;
5735 };
5736
5737 var posProcess = function( selector, context ) {
5738         var match,
5739                 tmpSet = [],
5740                 later = "",
5741                 root = context.nodeType ? [context] : context;
5742
5743         // Position selectors must be done after the filter
5744         // And so must :not(positional) so we move all PSEUDOs to the end
5745         while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
5746                 later += match[0];
5747                 selector = selector.replace( Expr.match.PSEUDO, "" );
5748         }
5749
5750         selector = Expr.relative[selector] ? selector + "*" : selector;
5751
5752         for ( var i = 0, l = root.length; i < l; i++ ) {
5753                 Sizzle( selector, root[i], tmpSet );
5754         }
5755
5756         return Sizzle.filter( later, tmpSet );
5757 };
5758
5759 // EXPOSE
5760 jQuery.find = Sizzle;
5761 jQuery.expr = Sizzle.selectors;
5762 jQuery.expr[":"] = jQuery.expr.filters;
5763 jQuery.unique = Sizzle.uniqueSort;
5764 jQuery.text = Sizzle.getText;
5765 jQuery.isXMLDoc = Sizzle.isXML;
5766 jQuery.contains = Sizzle.contains;
5767
5768
5769 })();
5770
5771
5772 var runtil = /Until$/,
5773         rparentsprev = /^(?:parents|prevUntil|prevAll)/,
5774         // Note: This RegExp should be improved, or likely pulled from Sizzle
5775         rmultiselector = /,/,
5776         isSimple = /^.[^:#\[\.,]*$/,
5777         slice = Array.prototype.slice,
5778         POS = jQuery.expr.match.POS,
5779         // methods guaranteed to produce a unique set when starting from a unique set
5780         guaranteedUnique = {
5781                 children: true,
5782                 contents: true,
5783                 next: true,
5784                 prev: true
5785         };
5786
5787 jQuery.fn.extend({
5788         find: function( selector ) {
5789                 var self = this,
5790                         i, l;
5791
5792                 if ( typeof selector !== "string" ) {
5793                         return jQuery( selector ).filter(function() {
5794                                 for ( i = 0, l = self.length; i < l; i++ ) {
5795                                         if ( jQuery.contains( self[ i ], this ) ) {
5796                                                 return true;
5797                                         }
5798                                 }
5799                         });
5800                 }
5801
5802                 var ret = this.pushStack( "", "find", selector ),
5803                         length, n, r;
5804
5805                 for ( i = 0, l = this.length; i < l; i++ ) {
5806                         length = ret.length;
5807                         jQuery.find( selector, this[i], ret );
5808
5809                         if ( i > 0 ) {
5810                                 // Make sure that the results are unique
5811                                 for ( n = length; n < ret.length; n++ ) {
5812                                         for ( r = 0; r < length; r++ ) {
5813                                                 if ( ret[r] === ret[n] ) {
5814                                                         ret.splice(n--, 1);
5815                                                         break;
5816                                                 }
5817                                         }
5818                                 }
5819                         }
5820                 }
5821
5822                 return ret;
5823         },
5824
5825         has: function( target ) {
5826                 var targets = jQuery( target );
5827                 return this.filter(function() {
5828                         for ( var i = 0, l = targets.length; i < l; i++ ) {
5829                                 if ( jQuery.contains( this, targets[i] ) ) {
5830                                         return true;
5831                                 }
5832                         }
5833                 });
5834         },
5835
5836         not: function( selector ) {
5837                 return this.pushStack( winnow(this, selector, false), "not", selector);
5838         },
5839
5840         filter: function( selector ) {
5841                 return this.pushStack( winnow(this, selector, true), "filter", selector );
5842         },
5843
5844         is: function( selector ) {
5845                 return !!selector && ( typeof selector === "string" ?
5846                         jQuery.filter( selector, this ).length > 0 :
5847                         this.filter( selector ).length > 0 );
5848         },
5849
5850         closest: function( selectors, context ) {
5851                 var ret = [], i, l, cur = this[0];
5852                 
5853                 // Array
5854                 if ( jQuery.isArray( selectors ) ) {
5855                         var match, selector,
5856                                 matches = {},
5857                                 level = 1;
5858
5859                         if ( cur && selectors.length ) {
5860                                 for ( i = 0, l = selectors.length; i < l; i++ ) {
5861                                         selector = selectors[i];
5862
5863                                         if ( !matches[ selector ] ) {
5864                                                 matches[ selector ] = POS.test( selector ) ?
5865                                                         jQuery( selector, context || this.context ) :
5866                                                         selector;
5867                                         }
5868                                 }
5869
5870                                 while ( cur && cur.ownerDocument && cur !== context ) {
5871                                         for ( selector in matches ) {
5872                                                 match = matches[ selector ];
5873
5874                                                 if ( match.jquery ? match.index( cur ) > -1 : jQuery( cur ).is( match ) ) {
5875                                                         ret.push({ selector: selector, elem: cur, level: level });
5876                                                 }
5877                                         }
5878
5879                                         cur = cur.parentNode;
5880                                         level++;
5881                                 }
5882                         }
5883
5884                         return ret;
5885                 }
5886
5887                 // String
5888                 var pos = POS.test( selectors ) || typeof selectors !== "string" ?
5889                                 jQuery( selectors, context || this.context ) :
5890                                 0;
5891
5892                 for ( i = 0, l = this.length; i < l; i++ ) {
5893                         cur = this[i];
5894
5895                         while ( cur ) {
5896                                 if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
5897                                         ret.push( cur );
5898                                         break;
5899
5900                                 } else {
5901                                         cur = cur.parentNode;
5902                                         if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
5903                                                 break;
5904                                         }
5905                                 }
5906                         }
5907                 }
5908
5909                 ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
5910
5911                 return this.pushStack( ret, "closest", selectors );
5912         },
5913
5914         // Determine the position of an element within
5915         // the matched set of elements
5916         index: function( elem ) {
5917                 if ( !elem || typeof elem === "string" ) {
5918                         return jQuery.inArray( this[0],
5919                                 // If it receives a string, the selector is used
5920                                 // If it receives nothing, the siblings are used
5921                                 elem ? jQuery( elem ) : this.parent().children() );
5922                 }
5923                 // Locate the position of the desired element
5924                 return jQuery.inArray(
5925                         // If it receives a jQuery object, the first element is used
5926                         elem.jquery ? elem[0] : elem, this );
5927         },
5928
5929         add: function( selector, context ) {
5930                 var set = typeof selector === "string" ?
5931                                 jQuery( selector, context ) :
5932                                 jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
5933                         all = jQuery.merge( this.get(), set );
5934
5935                 return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
5936                         all :
5937                         jQuery.unique( all ) );
5938         },
5939
5940         andSelf: function() {
5941                 return this.add( this.prevObject );
5942         }
5943 });
5944
5945 // A painfully simple check to see if an element is disconnected
5946 // from a document (should be improved, where feasible).
5947 function isDisconnected( node ) {
5948         return !node || !node.parentNode || node.parentNode.nodeType === 11;
5949 }
5950
5951 jQuery.each({
5952         parent: function( elem ) {
5953                 var parent = elem.parentNode;
5954                 return parent && parent.nodeType !== 11 ? parent : null;
5955         },
5956         parents: function( elem ) {
5957                 return jQuery.dir( elem, "parentNode" );
5958         },
5959         parentsUntil: function( elem, i, until ) {
5960                 return jQuery.dir( elem, "parentNode", until );
5961         },
5962         next: function( elem ) {
5963                 return jQuery.nth( elem, 2, "nextSibling" );
5964         },
5965         prev: function( elem ) {
5966                 return jQuery.nth( elem, 2, "previousSibling" );
5967         },
5968         nextAll: function( elem ) {
5969                 return jQuery.dir( elem, "nextSibling" );
5970         },
5971         prevAll: function( elem ) {
5972                 return jQuery.dir( elem, "previousSibling" );
5973         },
5974         nextUntil: function( elem, i, until ) {
5975                 return jQuery.dir( elem, "nextSibling", until );
5976         },
5977         prevUntil: function( elem, i, until ) {
5978                 return jQuery.dir( elem, "previousSibling", until );
5979         },
5980         siblings: function( elem ) {
5981                 return jQuery.sibling( elem.parentNode.firstChild, elem );
5982         },
5983         children: function( elem ) {
5984                 return jQuery.sibling( elem.firstChild );
5985         },
5986         contents: function( elem ) {
5987                 return jQuery.nodeName( elem, "iframe" ) ?
5988                         elem.contentDocument || elem.contentWindow.document :
5989                         jQuery.makeArray( elem.childNodes );
5990         }
5991 }, function( name, fn ) {
5992         jQuery.fn[ name ] = function( until, selector ) {
5993                 var ret = jQuery.map( this, fn, until ),
5994                         // The variable 'args' was introduced in
5995                         // https://github.com/jquery/jquery/commit/52a0238
5996                         // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed.
5997                         // http://code.google.com/p/v8/issues/detail?id=1050
5998                         args = slice.call(arguments);
5999
6000                 if ( !runtil.test( name ) ) {
6001                         selector = until;
6002                 }
6003
6004                 if ( selector && typeof selector === "string" ) {
6005                         ret = jQuery.filter( selector, ret );
6006                 }
6007
6008                 ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
6009
6010                 if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
6011                         ret = ret.reverse();
6012                 }
6013
6014                 return this.pushStack( ret, name, args.join(",") );
6015         };
6016 });
6017
6018 jQuery.extend({
6019         filter: function( expr, elems, not ) {
6020                 if ( not ) {
6021                         expr = ":not(" + expr + ")";
6022                 }
6023
6024                 return elems.length === 1 ?
6025                         jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
6026                         jQuery.find.matches(expr, elems);
6027         },
6028
6029         dir: function( elem, dir, until ) {
6030                 var matched = [],
6031                         cur = elem[ dir ];
6032
6033                 while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
6034                         if ( cur.nodeType === 1 ) {
6035                                 matched.push( cur );
6036                         }
6037                         cur = cur[dir];
6038                 }
6039                 return matched;
6040         },
6041
6042         nth: function( cur, result, dir, elem ) {
6043                 result = result || 1;
6044                 var num = 0;
6045
6046                 for ( ; cur; cur = cur[dir] ) {
6047                         if ( cur.nodeType === 1 && ++num === result ) {
6048                                 break;
6049                         }
6050                 }
6051
6052                 return cur;
6053         },
6054
6055         sibling: function( n, elem ) {
6056                 var r = [];
6057
6058                 for ( ; n; n = n.nextSibling ) {
6059                         if ( n.nodeType === 1 && n !== elem ) {
6060                                 r.push( n );
6061                         }
6062                 }
6063
6064                 return r;
6065         }
6066 });
6067
6068 // Implement the identical functionality for filter and not
6069 function winnow( elements, qualifier, keep ) {
6070
6071         // Can't pass null or undefined to indexOf in Firefox 4
6072         // Set to 0 to skip string check
6073         qualifier = qualifier || 0;
6074
6075         if ( jQuery.isFunction( qualifier ) ) {
6076                 return jQuery.grep(elements, function( elem, i ) {
6077                         var retVal = !!qualifier.call( elem, i, elem );
6078                         return retVal === keep;
6079                 });
6080
6081         } else if ( qualifier.nodeType ) {
6082                 return jQuery.grep(elements, function( elem, i ) {
6083                         return (elem === qualifier) === keep;
6084                 });
6085
6086         } else if ( typeof qualifier === "string" ) {
6087                 var filtered = jQuery.grep(elements, function( elem ) {
6088                         return elem.nodeType === 1;
6089                 });
6090
6091                 if ( isSimple.test( qualifier ) ) {
6092                         return jQuery.filter(qualifier, filtered, !keep);
6093                 } else {
6094                         qualifier = jQuery.filter( qualifier, filtered );
6095                 }
6096         }
6097
6098         return jQuery.grep(elements, function( elem, i ) {
6099                 return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
6100         });
6101 }
6102
6103
6104
6105
6106 var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
6107         rleadingWhitespace = /^\s+/,
6108         rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
6109         rtagName = /<([\w:]+)/,
6110         rtbody = /<tbody/i,
6111         rhtml = /<|&#?\w+;/,
6112         rnocache = /<(?:script|object|embed|option|style)/i,
6113         // checked="checked" or checked
6114         rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
6115         rscriptType = /\/(java|ecma)script/i,
6116         wrapMap = {
6117                 option: [ 1, "<select multiple='multiple'>", "</select>" ],
6118                 legend: [ 1, "<fieldset>", "</fieldset>" ],
6119                 thead: [ 1, "<table>", "</table>" ],
6120                 tr: [ 2, "<table><tbody>", "</tbody></table>" ],
6121                 td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
6122                 col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
6123                 area: [ 1, "<map>", "</map>" ],
6124                 _default: [ 0, "", "" ]
6125         };
6126
6127 wrapMap.optgroup = wrapMap.option;
6128 wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
6129 wrapMap.th = wrapMap.td;
6130
6131 // IE can't serialize <link> and <script> tags normally
6132 if ( !jQuery.support.htmlSerialize ) {
6133         wrapMap._default = [ 1, "div<div>", "</div>" ];
6134 }
6135
6136 jQuery.fn.extend({
6137         text: function( text ) {
6138                 if ( jQuery.isFunction(text) ) {
6139                         return this.each(function(i) {
6140                                 var self = jQuery( this );
6141
6142                                 self.text( text.call(this, i, self.text()) );
6143                         });
6144                 }
6145
6146                 if ( typeof text !== "object" && text !== undefined ) {
6147                         return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
6148                 }
6149
6150                 return jQuery.text( this );
6151         },
6152
6153         wrapAll: function( html ) {
6154                 if ( jQuery.isFunction( html ) ) {
6155                         return this.each(function(i) {
6156                                 jQuery(this).wrapAll( html.call(this, i) );
6157                         });
6158                 }
6159
6160                 if ( this[0] ) {
6161                         // The elements to wrap the target around
6162                         var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
6163
6164                         if ( this[0].parentNode ) {
6165                                 wrap.insertBefore( this[0] );
6166                         }
6167
6168                         wrap.map(function() {
6169                                 var elem = this;
6170
6171                                 while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
6172                                         elem = elem.firstChild;
6173                                 }
6174
6175                                 return elem;
6176                         }).append( this );
6177                 }
6178
6179                 return this;
6180         },
6181
6182         wrapInner: function( html ) {
6183                 if ( jQuery.isFunction( html ) ) {
6184                         return this.each(function(i) {
6185                                 jQuery(this).wrapInner( html.call(this, i) );
6186                         });
6187                 }
6188
6189                 return this.each(function() {
6190                         var self = jQuery( this ),
6191                                 contents = self.contents();
6192
6193                         if ( contents.length ) {
6194                                 contents.wrapAll( html );
6195
6196                         } else {
6197                                 self.append( html );
6198                         }
6199                 });
6200         },
6201
6202         wrap: function( html ) {
6203                 return this.each(function() {
6204                         jQuery( this ).wrapAll( html );
6205                 });
6206         },
6207
6208         unwrap: function() {
6209                 return this.parent().each(function() {
6210                         if ( !jQuery.nodeName( this, "body" ) ) {
6211                                 jQuery( this ).replaceWith( this.childNodes );
6212                         }
6213                 }).end();
6214         },
6215
6216         append: function() {
6217                 return this.domManip(arguments, true, function( elem ) {
6218                         if ( this.nodeType === 1 ) {
6219                                 this.appendChild( elem );
6220                         }
6221                 });
6222         },
6223
6224         prepend: function() {
6225                 return this.domManip(arguments, true, function( elem ) {
6226                         if ( this.nodeType === 1 ) {
6227                                 this.insertBefore( elem, this.firstChild );
6228                         }
6229                 });
6230         },
6231
6232         before: function() {
6233                 if ( this[0] && this[0].parentNode ) {
6234                         return this.domManip(arguments, false, function( elem ) {
6235                                 this.parentNode.insertBefore( elem, this );
6236                         });
6237                 } else if ( arguments.length ) {
6238                         var set = jQuery(arguments[0]);
6239                         set.push.apply( set, this.toArray() );
6240                         return this.pushStack( set, "before", arguments );
6241                 }
6242         },
6243
6244         after: function() {
6245                 if ( this[0] && this[0].parentNode ) {
6246                         return this.domManip(arguments, false, function( elem ) {
6247                                 this.parentNode.insertBefore( elem, this.nextSibling );
6248                         });
6249                 } else if ( arguments.length ) {
6250                         var set = this.pushStack( this, "after", arguments );
6251                         set.push.apply( set, jQuery(arguments[0]).toArray() );
6252                         return set;
6253                 }
6254         },
6255
6256         // keepData is for internal use only--do not document
6257         remove: function( selector, keepData ) {
6258                 for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
6259                         if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
6260                                 if ( !keepData && elem.nodeType === 1 ) {
6261                                         jQuery.cleanData( elem.getElementsByTagName("*") );
6262                                         jQuery.cleanData( [ elem ] );
6263                                 }
6264
6265                                 if ( elem.parentNode ) {
6266                                         elem.parentNode.removeChild( elem );
6267                                 }
6268                         }
6269                 }
6270
6271                 return this;
6272         },
6273
6274         empty: function() {
6275                 for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
6276                         // Remove element nodes and prevent memory leaks
6277                         if ( elem.nodeType === 1 ) {
6278                                 jQuery.cleanData( elem.getElementsByTagName("*") );
6279                         }
6280
6281                         // Remove any remaining nodes
6282                         while ( elem.firstChild ) {
6283                                 elem.removeChild( elem.firstChild );
6284                         }
6285                 }
6286
6287                 return this;
6288         },
6289
6290         clone: function( dataAndEvents, deepDataAndEvents ) {
6291                 dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
6292                 deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
6293
6294                 return this.map( function () {
6295                         return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
6296                 });
6297         },
6298
6299         html: function( value ) {
6300                 if ( value === undefined ) {
6301                         return this[0] && this[0].nodeType === 1 ?
6302                                 this[0].innerHTML.replace(rinlinejQuery, "") :
6303                                 null;
6304
6305                 // See if we can take a shortcut and just use innerHTML
6306                 } else if ( typeof value === "string" && !rnocache.test( value ) &&
6307                         (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
6308                         !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
6309
6310                         value = value.replace(rxhtmlTag, "<$1></$2>");
6311
6312                         try {
6313                                 for ( var i = 0, l = this.length; i < l; i++ ) {
6314                                         // Remove element nodes and prevent memory leaks
6315                                         if ( this[i].nodeType === 1 ) {
6316                                                 jQuery.cleanData( this[i].getElementsByTagName("*") );
6317                                                 this[i].innerHTML = value;
6318                                         }
6319                                 }
6320
6321                         // If using innerHTML throws an exception, use the fallback method
6322                         } catch(e) {
6323                                 this.empty().append( value );
6324                         }
6325
6326                 } else if ( jQuery.isFunction( value ) ) {
6327                         this.each(function(i){
6328                                 var self = jQuery( this );
6329
6330                                 self.html( value.call(this, i, self.html()) );
6331                         });
6332
6333                 } else {
6334                         this.empty().append( value );
6335                 }
6336
6337                 return this;
6338         },
6339
6340         replaceWith: function( value ) {
6341                 if ( this[0] && this[0].parentNode ) {
6342                         // Make sure that the elements are removed from the DOM before they are inserted
6343                         // this can help fix replacing a parent with child elements
6344                         if ( jQuery.isFunction( value ) ) {
6345                                 return this.each(function(i) {
6346                                         var self = jQuery(this), old = self.html();
6347                                         self.replaceWith( value.call( this, i, old ) );
6348                                 });
6349                         }
6350
6351                         if ( typeof value !== "string" ) {
6352                                 value = jQuery( value ).detach();
6353                         }
6354
6355                         return this.each(function() {
6356                                 var next = this.nextSibling,
6357                                         parent = this.parentNode;
6358
6359                                 jQuery( this ).remove();
6360
6361                                 if ( next ) {
6362                                         jQuery(next).before( value );
6363                                 } else {
6364                                         jQuery(parent).append( value );
6365                                 }
6366                         });
6367                 } else {
6368                         return this.length ?
6369                                 this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
6370                                 this;
6371                 }
6372         },
6373
6374         detach: function( selector ) {
6375                 return this.remove( selector, true );
6376         },
6377
6378         domManip: function( args, table, callback ) {
6379                 var results, first, fragment, parent,
6380                         value = args[0],
6381                         scripts = [];
6382
6383                 // We can't cloneNode fragments that contain checked, in WebKit
6384                 if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
6385                         return this.each(function() {
6386                                 jQuery(this).domManip( args, table, callback, true );
6387                         });
6388                 }
6389
6390                 if ( jQuery.isFunction(value) ) {
6391                         return this.each(function(i) {
6392                                 var self = jQuery(this);
6393                                 args[0] = value.call(this, i, table ? self.html() : undefined);
6394                                 self.domManip( args, table, callback );
6395                         });
6396                 }
6397
6398                 if ( this[0] ) {
6399                         parent = value && value.parentNode;
6400
6401                         // If we're in a fragment, just use that instead of building a new one
6402                         if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
6403                                 results = { fragment: parent };
6404
6405                         } else {
6406                                 results = jQuery.buildFragment( args, this, scripts );
6407                         }
6408
6409                         fragment = results.fragment;
6410
6411                         if ( fragment.childNodes.length === 1 ) {
6412                                 first = fragment = fragment.firstChild;
6413                         } else {
6414                                 first = fragment.firstChild;
6415                         }
6416
6417                         if ( first ) {
6418                                 table = table && jQuery.nodeName( first, "tr" );
6419
6420                                 for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
6421                                         callback.call(
6422                                                 table ?
6423                                                         root(this[i], first) :
6424                                                         this[i],
6425                                                 // Make sure that we do not leak memory by inadvertently discarding
6426                                                 // the original fragment (which might have attached data) instead of
6427                                                 // using it; in addition, use the original fragment object for the last
6428                                                 // item instead of first because it can end up being emptied incorrectly
6429                                                 // in certain situations (Bug #8070).
6430                                                 // Fragments from the fragment cache must always be cloned and never used
6431                                                 // in place.
6432                                                 results.cacheable || (l > 1 && i < lastIndex) ?
6433                                                         jQuery.clone( fragment, true, true ) :
6434                                                         fragment
6435                                         );
6436                                 }
6437                         }
6438
6439                         if ( scripts.length ) {
6440                                 jQuery.each( scripts, evalScript );
6441                         }
6442                 }
6443
6444                 return this;
6445         }
6446 });
6447
6448 function root( elem, cur ) {
6449         return jQuery.nodeName(elem, "table") ?
6450                 (elem.getElementsByTagName("tbody")[0] ||
6451                 elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
6452                 elem;
6453 }
6454
6455 function cloneCopyEvent( src, dest ) {
6456
6457         if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
6458                 return;
6459         }
6460
6461         var internalKey = jQuery.expando,
6462                 oldData = jQuery.data( src ),
6463                 curData = jQuery.data( dest, oldData );
6464
6465         // Switch to use the internal data object, if it exists, for the next
6466         // stage of data copying
6467         if ( (oldData = oldData[ internalKey ]) ) {
6468                 var events = oldData.events;
6469                                 curData = curData[ internalKey ] = jQuery.extend({}, oldData);
6470
6471                 if ( events ) {
6472                         delete curData.handle;
6473                         curData.events = {};
6474
6475                         for ( var type in events ) {
6476                                 for ( var i = 0, l = events[ type ].length; i < l; i++ ) {
6477                                         jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
6478                                 }
6479                         }
6480                 }
6481         }
6482 }
6483
6484 function cloneFixAttributes( src, dest ) {
6485         var nodeName;
6486
6487         // We do not need to do anything for non-Elements
6488         if ( dest.nodeType !== 1 ) {
6489                 return;
6490         }
6491
6492         // clearAttributes removes the attributes, which we don't want,
6493         // but also removes the attachEvent events, which we *do* want
6494         if ( dest.clearAttributes ) {
6495                 dest.clearAttributes();
6496         }
6497
6498         // mergeAttributes, in contrast, only merges back on the
6499         // original attributes, not the events
6500         if ( dest.mergeAttributes ) {
6501                 dest.mergeAttributes( src );
6502         }
6503
6504         nodeName = dest.nodeName.toLowerCase();
6505
6506         // IE6-8 fail to clone children inside object elements that use
6507         // the proprietary classid attribute value (rather than the type
6508         // attribute) to identify the type of content to display
6509         if ( nodeName === "object" ) {
6510                 dest.outerHTML = src.outerHTML;
6511
6512         } else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
6513                 // IE6-8 fails to persist the checked state of a cloned checkbox
6514                 // or radio button. Worse, IE6-7 fail to give the cloned element
6515                 // a checked appearance if the defaultChecked value isn't also set
6516                 if ( src.checked ) {
6517                         dest.defaultChecked = dest.checked = src.checked;
6518                 }
6519
6520                 // IE6-7 get confused and end up setting the value of a cloned
6521                 // checkbox/radio button to an empty string instead of "on"
6522                 if ( dest.value !== src.value ) {
6523                         dest.value = src.value;
6524                 }
6525
6526         // IE6-8 fails to return the selected option to the default selected
6527         // state when cloning options
6528         } else if ( nodeName === "option" ) {
6529                 dest.selected = src.defaultSelected;
6530
6531         // IE6-8 fails to set the defaultValue to the correct value when
6532         // cloning other types of input fields
6533         } else if ( nodeName === "input" || nodeName === "textarea" ) {
6534                 dest.defaultValue = src.defaultValue;
6535         }
6536
6537         // Event data gets referenced instead of copied if the expando
6538         // gets copied too
6539         dest.removeAttribute( jQuery.expando );
6540 }
6541
6542 jQuery.buildFragment = function( args, nodes, scripts ) {
6543         var fragment, cacheable, cacheresults,
6544                 doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);
6545
6546         // Only cache "small" (1/2 KB) HTML strings that are associated with the main document
6547         // Cloning options loses the selected state, so don't cache them
6548         // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
6549         // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
6550         if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
6551                 args[0].charAt(0) === "<" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
6552
6553                 cacheable = true;
6554
6555                 cacheresults = jQuery.fragments[ args[0] ];
6556                 if ( cacheresults && cacheresults !== 1 ) {
6557                         fragment = cacheresults;
6558                 }
6559         }
6560
6561         if ( !fragment ) {
6562                 fragment = doc.createDocumentFragment();
6563                 jQuery.clean( args, doc, fragment, scripts );
6564         }
6565
6566         if ( cacheable ) {
6567                 jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
6568         }
6569
6570         return { fragment: fragment, cacheable: cacheable };
6571 };
6572
6573 jQuery.fragments = {};
6574
6575 jQuery.each({
6576         appendTo: "append",
6577         prependTo: "prepend",
6578         insertBefore: "before",
6579         insertAfter: "after",
6580         replaceAll: "replaceWith"
6581 }, function( name, original ) {
6582         jQuery.fn[ name ] = function( selector ) {
6583                 var ret = [],
6584                         insert = jQuery( selector ),
6585                         parent = this.length === 1 && this[0].parentNode;
6586
6587                 if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
6588                         insert[ original ]( this[0] );
6589                         return this;
6590
6591                 } else {
6592                         for ( var i = 0, l = insert.length; i < l; i++ ) {
6593                                 var elems = (i > 0 ? this.clone(true) : this).get();
6594                                 jQuery( insert[i] )[ original ]( elems );
6595                                 ret = ret.concat( elems );
6596                         }
6597
6598                         return this.pushStack( ret, name, insert.selector );
6599                 }
6600         };
6601 });
6602
6603 function getAll( elem ) {
6604         if ( "getElementsByTagName" in elem ) {
6605                 return elem.getElementsByTagName( "*" );
6606         
6607         } else if ( "querySelectorAll" in elem ) {
6608                 return elem.querySelectorAll( "*" );
6609
6610         } else {
6611                 return [];
6612         }
6613 }
6614
6615 // Used in clean, fixes the defaultChecked property
6616 function fixDefaultChecked( elem ) {
6617         if ( elem.type === "checkbox" || elem.type === "radio" ) {
6618                 elem.defaultChecked = elem.checked;
6619         }
6620 }
6621 // Finds all inputs and passes them to fixDefaultChecked
6622 function findInputs( elem ) {
6623         if ( jQuery.nodeName( elem, "input" ) ) {
6624                 fixDefaultChecked( elem );
6625         } else if ( elem.getElementsByTagName ) {
6626                 jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
6627         }
6628 }
6629
6630 jQuery.extend({
6631         clone: function( elem, dataAndEvents, deepDataAndEvents ) {
6632                 var clone = elem.cloneNode(true),
6633                                 srcElements,
6634                                 destElements,
6635                                 i;
6636
6637                 if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
6638                                 (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
6639                         // IE copies events bound via attachEvent when using cloneNode.
6640                         // Calling detachEvent on the clone will also remove the events
6641                         // from the original. In order to get around this, we use some
6642                         // proprietary methods to clear the events. Thanks to MooTools
6643                         // guys for this hotness.
6644
6645                         cloneFixAttributes( elem, clone );
6646
6647                         // Using Sizzle here is crazy slow, so we use getElementsByTagName
6648                         // instead
6649                         srcElements = getAll( elem );
6650                         destElements = getAll( clone );
6651
6652                         // Weird iteration because IE will replace the length property
6653                         // with an element if you are cloning the body and one of the
6654                         // elements on the page has a name or id of "length"
6655                         for ( i = 0; srcElements[i]; ++i ) {
6656                                 cloneFixAttributes( srcElements[i], destElements[i] );
6657                         }
6658                 }
6659
6660                 // Copy the events from the original to the clone
6661                 if ( dataAndEvents ) {
6662                         cloneCopyEvent( elem, clone );
6663
6664                         if ( deepDataAndEvents ) {
6665                                 srcElements = getAll( elem );
6666                                 destElements = getAll( clone );
6667
6668                                 for ( i = 0; srcElements[i]; ++i ) {
6669                                         cloneCopyEvent( srcElements[i], destElements[i] );
6670                                 }
6671                         }
6672                 }
6673
6674                 // Return the cloned set
6675                 return clone;
6676         },
6677
6678         clean: function( elems, context, fragment, scripts ) {
6679                 var checkScriptType;
6680
6681                 context = context || document;
6682
6683                 // !context.createElement fails in IE with an error but returns typeof 'object'
6684                 if ( typeof context.createElement === "undefined" ) {
6685                         context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
6686                 }
6687
6688                 var ret = [];
6689
6690                 for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
6691                         if ( typeof elem === "number" ) {
6692                                 elem += "";
6693                         }
6694
6695                         if ( !elem ) {
6696                                 continue;
6697                         }
6698
6699                         // Convert html string into DOM nodes
6700                         if ( typeof elem === "string" ) {
6701                                 if ( !rhtml.test( elem ) ) {
6702                                         elem = context.createTextNode( elem );
6703                                 } else {
6704                                         // Fix "XHTML"-style tags in all browsers
6705                                         elem = elem.replace(rxhtmlTag, "<$1></$2>");
6706
6707                                         // Trim whitespace, otherwise indexOf won't work as expected
6708                                         var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
6709                                                 wrap = wrapMap[ tag ] || wrapMap._default,
6710                                                 depth = wrap[0],
6711                                                 div = context.createElement("div");
6712
6713                                         // Go to html and back, then peel off extra wrappers
6714                                         div.innerHTML = wrap[1] + elem + wrap[2];
6715
6716                                         // Move to the right depth
6717                                         while ( depth-- ) {
6718                                                 div = div.lastChild;
6719                                         }
6720
6721                                         // Remove IE's autoinserted <tbody> from table fragments
6722                                         if ( !jQuery.support.tbody ) {
6723
6724                                                 // String was a <table>, *may* have spurious <tbody>
6725                                                 var hasBody = rtbody.test(elem),
6726                                                         tbody = tag === "table" && !hasBody ?
6727                                                                 div.firstChild && div.firstChild.childNodes :
6728
6729                                                                 // String was a bare <thead> or <tfoot>
6730                                                                 wrap[1] === "<table>" && !hasBody ?
6731                                                                         div.childNodes :
6732                                                                         [];
6733
6734                                                 for ( var j = tbody.length - 1; j >= 0 ; --j ) {
6735                                                         if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
6736                                                                 tbody[ j ].parentNode.removeChild( tbody[ j ] );
6737                                                         }
6738                                                 }
6739                                         }
6740
6741                                         // IE completely kills leading whitespace when innerHTML is used
6742                                         if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
6743                                                 div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
6744                                         }
6745
6746                                         elem = div.childNodes;
6747                                 }
6748                         }
6749
6750                         // Resets defaultChecked for any radios and checkboxes
6751                         // about to be appended to the DOM in IE 6/7 (#8060)
6752                         var len;
6753                         if ( !jQuery.support.appendChecked ) {
6754                                 if ( elem[0] && typeof (len = elem.length) === "number" ) {
6755                                         for ( i = 0; i < len; i++ ) {
6756                                                 findInputs( elem[i] );
6757                                         }
6758                                 } else {
6759                                         findInputs( elem );
6760                                 }
6761                         }
6762
6763                         if ( elem.nodeType ) {
6764                                 ret.push( elem );
6765                         } else {
6766                                 ret = jQuery.merge( ret, elem );
6767                         }
6768                 }
6769
6770                 if ( fragment ) {
6771                         checkScriptType = function( elem ) {
6772                                 return !elem.type || rscriptType.test( elem.type );
6773                         };
6774                         for ( i = 0; ret[i]; i++ ) {
6775                                 if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
6776                                         scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
6777
6778                                 } else {
6779                                         if ( ret[i].nodeType === 1 ) {
6780                                                 var jsTags = jQuery.grep( ret[i].getElementsByTagName( "script" ), checkScriptType );
6781
6782                                                 ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
6783                                         }
6784                                         fragment.appendChild( ret[i] );
6785                                 }
6786                         }
6787                 }
6788
6789                 return ret;
6790         },
6791
6792         cleanData: function( elems ) {
6793                 var data, id, cache = jQuery.cache, internalKey = jQuery.expando, special = jQuery.event.special,
6794                         deleteExpando = jQuery.support.deleteExpando;
6795
6796                 for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
6797                         if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
6798                                 continue;
6799                         }
6800
6801                         id = elem[ jQuery.expando ];
6802
6803                         if ( id ) {
6804                                 data = cache[ id ] && cache[ id ][ internalKey ];
6805
6806                                 if ( data && data.events ) {
6807                                         for ( var type in data.events ) {
6808                                                 if ( special[ type ] ) {
6809                                                         jQuery.event.remove( elem, type );
6810
6811                                                 // This is a shortcut to avoid jQuery.event.remove's overhead
6812                                                 } else {
6813                                                         jQuery.removeEvent( elem, type, data.handle );
6814                                                 }
6815                                         }
6816
6817                                         // Null the DOM reference to avoid IE6/7/8 leak (#7054)
6818                                         if ( data.handle ) {
6819                                                 data.handle.elem = null;
6820                                         }
6821                                 }
6822
6823                                 if ( deleteExpando ) {
6824                                         delete elem[ jQuery.expando ];
6825
6826                                 } else if ( elem.removeAttribute ) {
6827                                         elem.removeAttribute( jQuery.expando );
6828                                 }
6829
6830                                 delete cache[ id ];
6831                         }
6832                 }
6833         }
6834 });
6835
6836 function evalScript( i, elem ) {
6837         if ( elem.src ) {
6838                 jQuery.ajax({
6839                         url: elem.src,
6840                         async: false,
6841                         dataType: "script"
6842                 });
6843         } else {
6844                 jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
6845         }
6846
6847         if ( elem.parentNode ) {
6848                 elem.parentNode.removeChild( elem );
6849         }
6850 }
6851
6852
6853
6854
6855 var ralpha = /alpha\([^)]*\)/i,
6856         ropacity = /opacity=([^)]*)/,
6857         rdashAlpha = /-([a-z])/ig,
6858         // fixed for IE9, see #8346
6859         rupper = /([A-Z]|^ms)/g,
6860         rnumpx = /^-?\d+(?:px)?$/i,
6861         rnum = /^-?\d/,
6862         rrelNum = /^[+\-]=/,
6863         rrelNumFilter = /[^+\-\.\de]+/g,
6864
6865         cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6866         cssWidth = [ "Left", "Right" ],
6867         cssHeight = [ "Top", "Bottom" ],
6868         curCSS,
6869
6870         getComputedStyle,
6871         currentStyle,
6872
6873         fcamelCase = function( all, letter ) {
6874                 return letter.toUpperCase();
6875         };
6876
6877 jQuery.fn.css = function( name, value ) {
6878         // Setting 'undefined' is a no-op
6879         if ( arguments.length === 2 && value === undefined ) {
6880                 return this;
6881         }
6882
6883         return jQuery.access( this, name, value, true, function( elem, name, value ) {
6884                 return value !== undefined ?
6885                         jQuery.style( elem, name, value ) :
6886                         jQuery.css( elem, name );
6887         });
6888 };
6889
6890 jQuery.extend({
6891         // Add in style property hooks for overriding the default
6892         // behavior of getting and setting a style property
6893         cssHooks: {
6894                 opacity: {
6895                         get: function( elem, computed ) {
6896                                 if ( computed ) {
6897                                         // We should always get a number back from opacity
6898                                         var ret = curCSS( elem, "opacity", "opacity" );
6899                                         return ret === "" ? "1" : ret;
6900
6901                                 } else {
6902                                         return elem.style.opacity;
6903                                 }
6904                         }
6905                 }
6906         },
6907
6908         // Exclude the following css properties to add px
6909         cssNumber: {
6910                 "zIndex": true,
6911                 "fontWeight": true,
6912                 "opacity": true,
6913                 "zoom": true,
6914                 "lineHeight": true,
6915                 "widows": true,
6916                 "orphans": true
6917         },
6918
6919         // Add in properties whose names you wish to fix before
6920         // setting or getting the value
6921         cssProps: {
6922                 // normalize float css property
6923                 "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
6924         },
6925
6926         // Get and set the style property on a DOM Node
6927         style: function( elem, name, value, extra ) {
6928                 // Don't set styles on text and comment nodes
6929                 if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
6930                         return;
6931                 }
6932
6933                 // Make sure that we're working with the right name
6934                 var ret, type, origName = jQuery.camelCase( name ),
6935                         style = elem.style, hooks = jQuery.cssHooks[ origName ];
6936
6937                 name = jQuery.cssProps[ origName ] || origName;
6938
6939                 // Check if we're setting a value
6940                 if ( value !== undefined ) {
6941                         type = typeof value;
6942
6943                         // Make sure that NaN and null values aren't set. See: #7116
6944                         if ( type === "number" && isNaN( value ) || value == null ) {
6945                                 return;
6946                         }
6947
6948                         // convert relative number strings (+= or -=) to relative numbers. #7345
6949                         if ( type === "string" && rrelNum.test( value ) ) {
6950                                 value = +value.replace( rrelNumFilter, "" ) + parseFloat( jQuery.css( elem, name ) );
6951                         }
6952
6953                         // If a number was passed in, add 'px' to the (except for certain CSS properties)
6954                         if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
6955                                 value += "px";
6956                         }
6957
6958                         // If a hook was provided, use that value, otherwise just set the specified value
6959                         if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
6960                                 // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
6961                                 // Fixes bug #5509
6962                                 try {
6963                                         style[ name ] = value;
6964                                 } catch(e) {}
6965                         }
6966
6967                 } else {
6968                         // If a hook was provided get the non-computed value from there
6969                         if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
6970                                 return ret;
6971                         }
6972
6973                         // Otherwise just get the value from the style object
6974                         return style[ name ];
6975                 }
6976         },
6977
6978         css: function( elem, name, extra ) {
6979                 var ret, hooks;
6980
6981                 // Make sure that we're working with the right name
6982                 name = jQuery.camelCase( name );
6983                 hooks = jQuery.cssHooks[ name ];
6984                 name = jQuery.cssProps[ name ] || name;
6985
6986                 // cssFloat needs a special treatment
6987                 if ( name === "cssFloat" ) {
6988                         name = "float";
6989                 }
6990
6991                 // If a hook was provided get the computed value from there
6992                 if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
6993                         return ret;
6994
6995                 // Otherwise, if a way to get the computed value exists, use that
6996                 } else if ( curCSS ) {
6997                         return curCSS( elem, name );
6998                 }
6999         },
7000
7001         // A method for quickly swapping in/out CSS properties to get correct calculations
7002         swap: function( elem, options, callback ) {
7003                 var old = {};
7004
7005                 // Remember the old values, and insert the new ones
7006                 for ( var name in options ) {
7007                         old[ name ] = elem.style[ name ];
7008                         elem.style[ name ] = options[ name ];
7009                 }
7010
7011                 callback.call( elem );
7012
7013                 // Revert the old values
7014                 for ( name in options ) {
7015                         elem.style[ name ] = old[ name ];
7016                 }
7017         },
7018
7019         camelCase: function( string ) {
7020                 return string.replace( rdashAlpha, fcamelCase );
7021         }
7022 });
7023
7024 // DEPRECATED, Use jQuery.css() instead
7025 jQuery.curCSS = jQuery.css;
7026
7027 jQuery.each(["height", "width"], function( i, name ) {
7028         jQuery.cssHooks[ name ] = {
7029                 get: function( elem, computed, extra ) {
7030                         var val;
7031
7032                         if ( computed ) {
7033                                 if ( elem.offsetWidth !== 0 ) {
7034                                         val = getWH( elem, name, extra );
7035
7036                                 } else {
7037                                         jQuery.swap( elem, cssShow, function() {
7038                                                 val = getWH( elem, name, extra );
7039                                         });
7040                                 }
7041
7042                                 if ( val <= 0 ) {
7043                                         val = curCSS( elem, name, name );
7044
7045                                         if ( val === "0px" && currentStyle ) {
7046                                                 val = currentStyle( elem, name, name );
7047                                         }
7048
7049                                         if ( val != null ) {
7050                                                 // Should return "auto" instead of 0, use 0 for
7051                                                 // temporary backwards-compat
7052                                                 return val === "" || val === "auto" ? "0px" : val;
7053                                         }
7054                                 }
7055
7056                                 if ( val < 0 || val == null ) {
7057                                         val = elem.style[ name ];
7058
7059                                         // Should return "auto" instead of 0, use 0 for
7060                                         // temporary backwards-compat
7061                                         return val === "" || val === "auto" ? "0px" : val;
7062                                 }
7063
7064                                 return typeof val === "string" ? val : val + "px";
7065                         }
7066                 },
7067
7068                 set: function( elem, value ) {
7069                         if ( rnumpx.test( value ) ) {
7070                                 // ignore negative width and height values #1599
7071                                 value = parseFloat(value);
7072
7073                                 if ( value >= 0 ) {
7074                                         return value + "px";
7075                                 }
7076
7077                         } else {
7078                                 return value;
7079                         }
7080                 }
7081         };
7082 });
7083
7084 if ( !jQuery.support.opacity ) {
7085         jQuery.cssHooks.opacity = {
7086                 get: function( elem, computed ) {
7087                         // IE uses filters for opacity
7088                         return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
7089                                 ( parseFloat( RegExp.$1 ) / 100 ) + "" :
7090                                 computed ? "1" : "";
7091                 },
7092
7093                 set: function( elem, value ) {
7094                         var style = elem.style,
7095                                 currentStyle = elem.currentStyle;
7096
7097                         // IE has trouble with opacity if it does not have layout
7098                         // Force it by setting the zoom level
7099                         style.zoom = 1;
7100
7101                         // Set the alpha filter to set the opacity
7102                         var opacity = jQuery.isNaN( value ) ?
7103                                 "" :
7104                                 "alpha(opacity=" + value * 100 + ")",
7105                                 filter = currentStyle && currentStyle.filter || style.filter || "";
7106
7107                         style.filter = ralpha.test( filter ) ?
7108                                 filter.replace( ralpha, opacity ) :
7109                                 filter + " " + opacity;
7110                 }
7111         };
7112 }
7113
7114 jQuery(function() {
7115         // This hook cannot be added until DOM ready because the support test
7116         // for it is not run until after DOM ready
7117         if ( !jQuery.support.reliableMarginRight ) {
7118                 jQuery.cssHooks.marginRight = {
7119                         get: function( elem, computed ) {
7120                                 // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
7121                                 // Work around by temporarily setting element display to inline-block
7122                                 var ret;
7123                                 jQuery.swap( elem, { "display": "inline-block" }, function() {
7124                                         if ( computed ) {
7125                                                 ret = curCSS( elem, "margin-right", "marginRight" );
7126                                         } else {
7127                                                 ret = elem.style.marginRight;
7128                                         }
7129                                 });
7130                                 return ret;
7131                         }
7132                 };
7133         }
7134 });
7135
7136 if ( document.defaultView && document.defaultView.getComputedStyle ) {
7137         getComputedStyle = function( elem, name ) {
7138                 var ret, defaultView, computedStyle;
7139
7140                 name = name.replace( rupper, "-$1" ).toLowerCase();
7141
7142                 if ( !(defaultView = elem.ownerDocument.defaultView) ) {
7143                         return undefined;
7144                 }
7145
7146                 if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
7147                         ret = computedStyle.getPropertyValue( name );
7148                         if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
7149                                 ret = jQuery.style( elem, name );
7150                         }
7151                 }
7152
7153                 return ret;
7154         };
7155 }
7156
7157 if ( document.documentElement.currentStyle ) {
7158         currentStyle = function( elem, name ) {
7159                 var left,
7160                         ret = elem.currentStyle && elem.currentStyle[ name ],
7161                         rsLeft = elem.runtimeStyle && elem.runtimeStyle[ name ],
7162                         style = elem.style;
7163
7164                 // From the awesome hack by Dean Edwards
7165                 // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
7166
7167                 // If we're not dealing with a regular pixel number
7168                 // but a number that has a weird ending, we need to convert it to pixels
7169                 if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
7170                         // Remember the original values
7171                         left = style.left;
7172
7173                         // Put in the new values to get a computed value out
7174                         if ( rsLeft ) {
7175                                 elem.runtimeStyle.left = elem.currentStyle.left;
7176                         }
7177                         style.left = name === "fontSize" ? "1em" : (ret || 0);
7178                         ret = style.pixelLeft + "px";
7179
7180                         // Revert the changed values
7181                         style.left = left;
7182                         if ( rsLeft ) {
7183                                 elem.runtimeStyle.left = rsLeft;
7184                         }
7185                 }
7186
7187                 return ret === "" ? "auto" : ret;
7188         };
7189 }
7190
7191 curCSS = getComputedStyle || currentStyle;
7192
7193 function getWH( elem, name, extra ) {
7194         var which = name === "width" ? cssWidth : cssHeight,
7195                 val = name === "width" ? elem.offsetWidth : elem.offsetHeight;
7196
7197         if ( extra === "border" ) {
7198                 return val;
7199         }
7200
7201         jQuery.each( which, function() {
7202                 if ( !extra ) {
7203                         val -= parseFloat(jQuery.css( elem, "padding" + this )) || 0;
7204                 }
7205
7206                 if ( extra === "margin" ) {
7207                         val += parseFloat(jQuery.css( elem, "margin" + this )) || 0;
7208
7209                 } else {
7210                         val -= parseFloat(jQuery.css( elem, "border" + this + "Width" )) || 0;
7211                 }
7212         });
7213
7214         return val;
7215 }
7216
7217 if ( jQuery.expr && jQuery.expr.filters ) {
7218         jQuery.expr.filters.hidden = function( elem ) {
7219                 var width = elem.offsetWidth,
7220                         height = elem.offsetHeight;
7221
7222                 return (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, "display" )) === "none");
7223         };
7224
7225         jQuery.expr.filters.visible = function( elem ) {
7226                 return !jQuery.expr.filters.hidden( elem );
7227         };
7228 }
7229
7230
7231
7232
7233 var r20 = /%20/g,
7234         rbracket = /\[\]$/,
7235         rCRLF = /\r?\n/g,
7236         rhash = /#.*$/,
7237         rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
7238         rinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
7239         // #7653, #8125, #8152: local protocol detection
7240         rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|widget):$/,
7241         rnoContent = /^(?:GET|HEAD)$/,
7242         rprotocol = /^\/\//,
7243         rquery = /\?/,
7244         rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
7245         rselectTextarea = /^(?:select|textarea)/i,
7246         rspacesAjax = /\s+/,
7247         rts = /([?&])_=[^&]*/,
7248         rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
7249
7250         // Keep a copy of the old load method
7251         _load = jQuery.fn.load,
7252
7253         /* Prefilters
7254          * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
7255          * 2) These are called:
7256          *    - BEFORE asking for a transport
7257          *    - AFTER param serialization (s.data is a string if s.processData is true)
7258          * 3) key is the dataType
7259          * 4) the catchall symbol "*" can be used
7260          * 5) execution will start with transport dataType and THEN continue down to "*" if needed
7261          */
7262         prefilters = {},
7263
7264         /* Transports bindings
7265          * 1) key is the dataType
7266          * 2) the catchall symbol "*" can be used
7267          * 3) selection will start with transport dataType and THEN go to "*" if needed
7268          */
7269         transports = {},
7270
7271         // Document location
7272         ajaxLocation,
7273
7274         // Document location segments
7275         ajaxLocParts;
7276
7277 // #8138, IE may throw an exception when accessing
7278 // a field from window.location if document.domain has been set
7279 try {
7280         ajaxLocation = location.href;
7281 } catch( e ) {
7282         // Use the href attribute of an A element
7283         // since IE will modify it given document.location
7284         ajaxLocation = document.createElement( "a" );
7285         ajaxLocation.href = "";
7286         ajaxLocation = ajaxLocation.href;
7287 }
7288
7289 // Segment location into parts
7290 ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
7291
7292 // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
7293 function addToPrefiltersOrTransports( structure ) {
7294
7295         // dataTypeExpression is optional and defaults to "*"
7296         return function( dataTypeExpression, func ) {
7297
7298                 if ( typeof dataTypeExpression !== "string" ) {
7299                         func = dataTypeExpression;
7300                         dataTypeExpression = "*";
7301                 }
7302
7303                 if ( jQuery.isFunction( func ) ) {
7304                         var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
7305                                 i = 0,
7306                                 length = dataTypes.length,
7307                                 dataType,
7308                                 list,
7309                                 placeBefore;
7310
7311                         // For each dataType in the dataTypeExpression
7312                         for(; i < length; i++ ) {
7313                                 dataType = dataTypes[ i ];
7314                                 // We control if we're asked to add before
7315                                 // any existing element
7316                                 placeBefore = /^\+/.test( dataType );
7317                                 if ( placeBefore ) {
7318                                         dataType = dataType.substr( 1 ) || "*";
7319                                 }
7320                                 list = structure[ dataType ] = structure[ dataType ] || [];
7321                                 // then we add to the structure accordingly
7322                                 list[ placeBefore ? "unshift" : "push" ]( func );
7323                         }
7324                 }
7325         };
7326 }
7327
7328 // Base inspection function for prefilters and transports
7329 function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
7330                 dataType /* internal */, inspected /* internal */ ) {
7331
7332         dataType = dataType || options.dataTypes[ 0 ];
7333         inspected = inspected || {};
7334
7335         inspected[ dataType ] = true;
7336
7337         var list = structure[ dataType ],
7338                 i = 0,
7339                 length = list ? list.length : 0,
7340                 executeOnly = ( structure === prefilters ),
7341                 selection;
7342
7343         for(; i < length && ( executeOnly || !selection ); i++ ) {
7344                 selection = list[ i ]( options, originalOptions, jqXHR );
7345                 // If we got redirected to another dataType
7346                 // we try there if executing only and not done already
7347                 if ( typeof selection === "string" ) {
7348                         if ( !executeOnly || inspected[ selection ] ) {
7349                                 selection = undefined;
7350                         } else {
7351                                 options.dataTypes.unshift( selection );
7352                                 selection = inspectPrefiltersOrTransports(
7353                                                 structure, options, originalOptions, jqXHR, selection, inspected );
7354                         }
7355                 }
7356         }
7357         // If we're only executing or nothing was selected
7358         // we try the catchall dataType if not done already
7359         if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
7360                 selection = inspectPrefiltersOrTransports(
7361                                 structure, options, originalOptions, jqXHR, "*", inspected );
7362         }
7363         // unnecessary when only executing (prefilters)
7364         // but it'll be ignored by the caller in that case
7365         return selection;
7366 }
7367
7368 jQuery.fn.extend({
7369         load: function( url, params, callback ) {
7370                 if ( typeof url !== "string" && _load ) {
7371                         return _load.apply( this, arguments );
7372
7373                 // Don't do a request if no elements are being requested
7374                 } else if ( !this.length ) {
7375                         return this;
7376                 }
7377
7378                 var off = url.indexOf( " " );
7379                 if ( off >= 0 ) {
7380                         var selector = url.slice( off, url.length );
7381                         url = url.slice( 0, off );
7382                 }
7383
7384                 // Default to a GET request
7385                 var type = "GET";
7386
7387                 // If the second parameter was provided
7388                 if ( params ) {
7389                         // If it's a function
7390                         if ( jQuery.isFunction( params ) ) {
7391                                 // We assume that it's the callback
7392                                 callback = params;
7393                                 params = undefined;
7394
7395                         // Otherwise, build a param string
7396                         } else if ( typeof params === "object" ) {
7397                                 params = jQuery.param( params, jQuery.ajaxSettings.traditional );
7398                                 type = "POST";
7399                         }
7400                 }
7401
7402                 var self = this;
7403
7404                 // Request the remote document
7405                 jQuery.ajax({
7406                         url: url,
7407                         type: type,
7408                         dataType: "html",
7409                         data: params,
7410                         // Complete callback (responseText is used internally)
7411                         complete: function( jqXHR, status, responseText ) {
7412                                 // Store the response as specified by the jqXHR object
7413                                 responseText = jqXHR.responseText;
7414                                 // If successful, inject the HTML into all the matched elements
7415                                 if ( jqXHR.isResolved() ) {
7416                                         // #4825: Get the actual response in case
7417                                         // a dataFilter is present in ajaxSettings
7418                                         jqXHR.done(function( r ) {
7419                                                 responseText = r;
7420                                         });
7421                                         // See if a selector was specified
7422                                         self.html( selector ?
7423                                                 // Create a dummy div to hold the results
7424                                                 jQuery("<div>")
7425                                                         // inject the contents of the document in, removing the scripts
7426                                                         // to avoid any 'Permission Denied' errors in IE
7427                                                         .append(responseText.replace(rscript, ""))
7428
7429                                                         // Locate the specified elements
7430                                                         .find(selector) :
7431
7432                                                 // If not, just inject the full result
7433                                                 responseText );
7434                                 }
7435
7436                                 if ( callback ) {
7437                                         self.each( callback, [ responseText, status, jqXHR ] );
7438                                 }
7439                         }
7440                 });
7441
7442                 return this;
7443         },
7444
7445         serialize: function() {
7446                 return jQuery.param( this.serializeArray() );
7447         },
7448
7449         serializeArray: function() {
7450                 return this.map(function(){
7451                         return this.elements ? jQuery.makeArray( this.elements ) : this;
7452                 })
7453                 .filter(function(){
7454                         return this.name && !this.disabled &&
7455                                 ( this.checked || rselectTextarea.test( this.nodeName ) ||
7456                                         rinput.test( this.type ) );
7457                 })
7458                 .map(function( i, elem ){
7459                         var val = jQuery( this ).val();
7460
7461                         return val == null ?
7462                                 null :
7463                                 jQuery.isArray( val ) ?
7464                                         jQuery.map( val, function( val, i ){
7465                                                 return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
7466                                         }) :
7467                                         { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
7468                 }).get();
7469         }
7470 });
7471
7472 // Attach a bunch of functions for handling common AJAX events
7473 jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
7474         jQuery.fn[ o ] = function( f ){
7475                 return this.bind( o, f );
7476         };
7477 });
7478
7479 jQuery.each( [ "get", "post" ], function( i, method ) {
7480         jQuery[ method ] = function( url, data, callback, type ) {
7481                 // shift arguments if data argument was omitted
7482                 if ( jQuery.isFunction( data ) ) {
7483                         type = type || callback;
7484                         callback = data;
7485                         data = undefined;
7486                 }
7487
7488                 return jQuery.ajax({
7489                         type: method,
7490                         url: url,
7491                         data: data,
7492                         success: callback,
7493                         dataType: type
7494                 });
7495         };
7496 });
7497
7498 jQuery.extend({
7499
7500         getScript: function( url, callback ) {
7501                 return jQuery.get( url, undefined, callback, "script" );
7502         },
7503
7504         getJSON: function( url, data, callback ) {
7505                 return jQuery.get( url, data, callback, "json" );
7506         },
7507
7508         // Creates a full fledged settings object into target
7509         // with both ajaxSettings and settings fields.
7510         // If target is omitted, writes into ajaxSettings.
7511         ajaxSetup: function ( target, settings ) {
7512                 if ( !settings ) {
7513                         // Only one parameter, we extend ajaxSettings
7514                         settings = target;
7515                         target = jQuery.extend( true, jQuery.ajaxSettings, settings );
7516                 } else {
7517                         // target was provided, we extend into it
7518                         jQuery.extend( true, target, jQuery.ajaxSettings, settings );
7519                 }
7520                 // Flatten fields we don't want deep extended
7521                 for( var field in { context: 1, url: 1 } ) {
7522                         if ( field in settings ) {
7523                                 target[ field ] = settings[ field ];
7524                         } else if( field in jQuery.ajaxSettings ) {
7525                                 target[ field ] = jQuery.ajaxSettings[ field ];
7526                         }
7527                 }
7528                 return target;
7529         },
7530
7531         ajaxSettings: {
7532                 url: ajaxLocation,
7533                 isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
7534                 global: true,
7535                 type: "GET",
7536                 contentType: "application/x-www-form-urlencoded",
7537                 processData: true,
7538                 async: true,
7539                 /*
7540                 timeout: 0,
7541                 data: null,
7542                 dataType: null,
7543                 username: null,
7544                 password: null,
7545                 cache: null,
7546                 traditional: false,
7547                 headers: {},
7548                 */
7549
7550                 accepts: {
7551                         xml: "application/xml, text/xml",
7552                         html: "text/html",
7553                         text: "text/plain",
7554                         json: "application/json, text/javascript",
7555                         "*": "*/*"
7556                 },
7557
7558                 contents: {
7559                         xml: /xml/,
7560                         html: /html/,
7561                         json: /json/
7562                 },
7563
7564                 responseFields: {
7565                         xml: "responseXML",
7566                         text: "responseText"
7567                 },
7568
7569                 // List of data converters
7570                 // 1) key format is "source_type destination_type" (a single space in-between)
7571                 // 2) the catchall symbol "*" can be used for source_type
7572                 converters: {
7573
7574                         // Convert anything to text
7575                         "* text": window.String,
7576
7577                         // Text to html (true = no transformation)
7578                         "text html": true,
7579
7580                         // Evaluate text as a json expression
7581                         "text json": jQuery.parseJSON,
7582
7583                         // Parse text as xml
7584                         "text xml": jQuery.parseXML
7585                 }
7586         },
7587
7588         ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
7589         ajaxTransport: addToPrefiltersOrTransports( transports ),
7590
7591         // Main method
7592         ajax: function( url, options ) {
7593
7594                 // If url is an object, simulate pre-1.5 signature
7595                 if ( typeof url === "object" ) {
7596                         options = url;
7597                         url = undefined;
7598                 }
7599
7600                 // Force options to be an object
7601                 options = options || {};
7602
7603                 var // Create the final options object
7604                         s = jQuery.ajaxSetup( {}, options ),
7605                         // Callbacks context
7606                         callbackContext = s.context || s,
7607                         // Context for global events
7608                         // It's the callbackContext if one was provided in the options
7609                         // and if it's a DOM node or a jQuery collection
7610                         globalEventContext = callbackContext !== s &&
7611                                 ( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
7612                                                 jQuery( callbackContext ) : jQuery.event,
7613                         // Deferreds
7614                         deferred = jQuery.Deferred(),
7615                         completeDeferred = jQuery._Deferred(),
7616                         // Status-dependent callbacks
7617                         statusCode = s.statusCode || {},
7618                         // ifModified key
7619                         ifModifiedKey,
7620                         // Headers (they are sent all at once)
7621                         requestHeaders = {},
7622                         requestHeadersNames = {},
7623                         // Response headers
7624                         responseHeadersString,
7625                         responseHeaders,
7626                         // transport
7627                         transport,
7628                         // timeout handle
7629                         timeoutTimer,
7630                         // Cross-domain detection vars
7631                         parts,
7632                         // The jqXHR state
7633                         state = 0,
7634                         // To know if global events are to be dispatched
7635                         fireGlobals,
7636                         // Loop variable
7637                         i,
7638                         // Fake xhr
7639                         jqXHR = {
7640
7641                                 readyState: 0,
7642
7643                                 // Caches the header
7644                                 setRequestHeader: function( name, value ) {
7645                                         if ( !state ) {
7646                                                 var lname = name.toLowerCase();
7647                                                 name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
7648                                                 requestHeaders[ name ] = value;
7649                                         }
7650                                         return this;
7651                                 },
7652
7653                                 // Raw string
7654                                 getAllResponseHeaders: function() {
7655                                         return state === 2 ? responseHeadersString : null;
7656                                 },
7657
7658                                 // Builds headers hashtable if needed
7659                                 getResponseHeader: function( key ) {
7660                                         var match;
7661                                         if ( state === 2 ) {
7662                                                 if ( !responseHeaders ) {
7663                                                         responseHeaders = {};
7664                                                         while( ( match = rheaders.exec( responseHeadersString ) ) ) {
7665                                                                 responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
7666                                                         }
7667                                                 }
7668                                                 match = responseHeaders[ key.toLowerCase() ];
7669                                         }
7670                                         return match === undefined ? null : match;
7671                                 },
7672
7673                                 // Overrides response content-type header
7674                                 overrideMimeType: function( type ) {
7675                                         if ( !state ) {
7676                                                 s.mimeType = type;
7677                                         }
7678                                         return this;
7679                                 },
7680
7681                                 // Cancel the request
7682                                 abort: function( statusText ) {
7683                                         statusText = statusText || "abort";
7684                                         if ( transport ) {
7685                                                 transport.abort( statusText );
7686                                         }
7687                                         done( 0, statusText );
7688                                         return this;
7689                                 }
7690                         };
7691
7692                 // Callback for when everything is done
7693                 // It is defined here because jslint complains if it is declared
7694                 // at the end of the function (which would be more logical and readable)
7695                 function done( status, statusText, responses, headers ) {
7696
7697                         // Called once
7698                         if ( state === 2 ) {
7699                                 return;
7700                         }
7701
7702                         // State is "done" now
7703                         state = 2;
7704
7705                         // Clear timeout if it exists
7706                         if ( timeoutTimer ) {
7707                                 clearTimeout( timeoutTimer );
7708                         }
7709
7710                         // Dereference transport for early garbage collection
7711                         // (no matter how long the jqXHR object will be used)
7712                         transport = undefined;
7713
7714                         // Cache response headers
7715                         responseHeadersString = headers || "";
7716
7717                         // Set readyState
7718                         jqXHR.readyState = status ? 4 : 0;
7719
7720                         var isSuccess,
7721                                 success,
7722                                 error,
7723                                 response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
7724                                 lastModified,
7725                                 etag;
7726
7727                         // If successful, handle type chaining
7728                         if ( status >= 200 && status < 300 || status === 304 ) {
7729
7730                                 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
7731                                 if ( s.ifModified ) {
7732
7733                                         if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
7734                                                 jQuery.lastModified[ ifModifiedKey ] = lastModified;
7735                                         }
7736                                         if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
7737                                                 jQuery.etag[ ifModifiedKey ] = etag;
7738                                         }
7739                                 }
7740
7741                                 // If not modified
7742                                 if ( status === 304 ) {
7743
7744                                         statusText = "notmodified";
7745                                         isSuccess = true;
7746
7747                                 // If we have data
7748                                 } else {
7749
7750                                         try {
7751                                                 success = ajaxConvert( s, response );
7752                                                 statusText = "success";
7753                                                 isSuccess = true;
7754                                         } catch(e) {
7755                                                 // We have a parsererror
7756                                                 statusText = "parsererror";
7757                                                 error = e;
7758                                         }
7759                                 }
7760                         } else {
7761                                 // We extract error from statusText
7762                                 // then normalize statusText and status for non-aborts
7763                                 error = statusText;
7764                                 if( !statusText || status ) {
7765                                         statusText = "error";
7766                                         if ( status < 0 ) {
7767                                                 status = 0;
7768                                         }
7769                                 }
7770                         }
7771
7772                         // Set data for the fake xhr object
7773                         jqXHR.status = status;
7774                         jqXHR.statusText = statusText;
7775
7776                         // Success/Error
7777                         if ( isSuccess ) {
7778                                 deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
7779                         } else {
7780                                 deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
7781                         }
7782
7783                         // Status-dependent callbacks
7784                         jqXHR.statusCode( statusCode );
7785                         statusCode = undefined;
7786
7787                         if ( fireGlobals ) {
7788                                 globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
7789                                                 [ jqXHR, s, isSuccess ? success : error ] );
7790                         }
7791
7792                         // Complete
7793                         completeDeferred.resolveWith( callbackContext, [ jqXHR, statusText ] );
7794
7795                         if ( fireGlobals ) {
7796                                 globalEventContext.trigger( "ajaxComplete", [ jqXHR, s] );
7797                                 // Handle the global AJAX counter
7798                                 if ( !( --jQuery.active ) ) {
7799                                         jQuery.event.trigger( "ajaxStop" );
7800                                 }
7801                         }
7802                 }
7803
7804                 // Attach deferreds
7805                 deferred.promise( jqXHR );
7806                 jqXHR.success = jqXHR.done;
7807                 jqXHR.error = jqXHR.fail;
7808                 jqXHR.complete = completeDeferred.done;
7809
7810                 // Status-dependent callbacks
7811                 jqXHR.statusCode = function( map ) {
7812                         if ( map ) {
7813                                 var tmp;
7814                                 if ( state < 2 ) {
7815                                         for( tmp in map ) {
7816                                                 statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
7817                                         }
7818                                 } else {
7819                                         tmp = map[ jqXHR.status ];
7820                                         jqXHR.then( tmp, tmp );
7821                                 }
7822                         }
7823                         return this;
7824                 };
7825
7826                 // Remove hash character (#7531: and string promotion)
7827                 // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
7828                 // We also use the url parameter if available
7829                 s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
7830
7831                 // Extract dataTypes list
7832                 s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
7833
7834                 // Determine if a cross-domain request is in order
7835                 if ( s.crossDomain == null ) {
7836                         parts = rurl.exec( s.url.toLowerCase() );
7837                         s.crossDomain = !!( parts &&
7838                                 ( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
7839                                         ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
7840                                                 ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
7841                         );
7842                 }
7843
7844                 // Convert data if not already a string
7845                 if ( s.data && s.processData && typeof s.data !== "string" ) {
7846                         s.data = jQuery.param( s.data, s.traditional );
7847                 }
7848
7849                 // Apply prefilters
7850                 inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
7851
7852                 // If request was aborted inside a prefiler, stop there
7853                 if ( state === 2 ) {
7854                         return false;
7855                 }
7856
7857                 // We can fire global events as of now if asked to
7858                 fireGlobals = s.global;
7859
7860                 // Uppercase the type
7861                 s.type = s.type.toUpperCase();
7862
7863                 // Determine if request has content
7864                 s.hasContent = !rnoContent.test( s.type );
7865
7866                 // Watch for a new set of requests
7867                 if ( fireGlobals && jQuery.active++ === 0 ) {
7868                         jQuery.event.trigger( "ajaxStart" );
7869                 }
7870
7871                 // More options handling for requests with no content
7872                 if ( !s.hasContent ) {
7873
7874                         // If data is available, append data to url
7875                         if ( s.data ) {
7876                                 s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
7877                         }
7878
7879                         // Get ifModifiedKey before adding the anti-cache parameter
7880                         ifModifiedKey = s.url;
7881
7882                         // Add anti-cache in url if needed
7883                         if ( s.cache === false ) {
7884
7885                                 var ts = jQuery.now(),
7886                                         // try replacing _= if it is there
7887                                         ret = s.url.replace( rts, "$1_=" + ts );
7888
7889                                 // if nothing was replaced, add timestamp to the end
7890                                 s.url = ret + ( (ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
7891                         }
7892                 }
7893
7894                 // Set the correct header, if data is being sent
7895                 if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
7896                         jqXHR.setRequestHeader( "Content-Type", s.contentType );
7897                 }
7898
7899                 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
7900                 if ( s.ifModified ) {
7901                         ifModifiedKey = ifModifiedKey || s.url;
7902                         if ( jQuery.lastModified[ ifModifiedKey ] ) {
7903                                 jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
7904                         }
7905                         if ( jQuery.etag[ ifModifiedKey ] ) {
7906                                 jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
7907                         }
7908                 }
7909
7910                 // Set the Accepts header for the server, depending on the dataType
7911                 jqXHR.setRequestHeader(
7912                         "Accept",
7913                         s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
7914                                 s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", */*; q=0.01" : "" ) :
7915                                 s.accepts[ "*" ]
7916                 );
7917
7918                 // Check for headers option
7919                 for ( i in s.headers ) {
7920                         jqXHR.setRequestHeader( i, s.headers[ i ] );
7921                 }
7922
7923                 // Allow custom headers/mimetypes and early abort
7924                 if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
7925                                 // Abort if not done already
7926                                 jqXHR.abort();
7927                                 return false;
7928
7929                 }
7930
7931                 // Install callbacks on deferreds
7932                 for ( i in { success: 1, error: 1, complete: 1 } ) {
7933                         jqXHR[ i ]( s[ i ] );
7934                 }
7935
7936                 // Get transport
7937                 transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
7938
7939                 // If no transport, we auto-abort
7940                 if ( !transport ) {
7941                         done( -1, "No Transport" );
7942                 } else {
7943                         jqXHR.readyState = 1;
7944                         // Send global event
7945                         if ( fireGlobals ) {
7946                                 globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
7947                         }
7948                         // Timeout
7949                         if ( s.async && s.timeout > 0 ) {
7950                                 timeoutTimer = setTimeout( function(){
7951                                         jqXHR.abort( "timeout" );
7952                                 }, s.timeout );
7953                         }
7954
7955                         try {
7956                                 state = 1;
7957                                 transport.send( requestHeaders, done );
7958                         } catch (e) {
7959                                 // Propagate exception as error if not done
7960                                 if ( status < 2 ) {
7961                                         done( -1, e );
7962                                 // Simply rethrow otherwise
7963                                 } else {
7964                                         jQuery.error( e );
7965                                 }
7966                         }
7967                 }
7968
7969                 return jqXHR;
7970         },
7971
7972         // Serialize an array of form elements or a set of
7973         // key/values into a query string
7974         param: function( a, traditional ) {
7975                 var s = [],
7976                         add = function( key, value ) {
7977                                 // If value is a function, invoke it and return its value
7978                                 value = jQuery.isFunction( value ) ? value() : value;
7979                                 s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
7980                         };
7981
7982                 // Set traditional to true for jQuery <= 1.3.2 behavior.
7983                 if ( traditional === undefined ) {
7984                         traditional = jQuery.ajaxSettings.traditional;
7985                 }
7986
7987                 // If an array was passed in, assume that it is an array of form elements.
7988                 if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
7989                         // Serialize the form elements
7990                         jQuery.each( a, function() {
7991                                 add( this.name, this.value );
7992                         });
7993
7994                 } else {
7995                         // If traditional, encode the "old" way (the way 1.3.2 or older
7996                         // did it), otherwise encode params recursively.
7997                         for ( var prefix in a ) {
7998                                 buildParams( prefix, a[ prefix ], traditional, add );
7999                         }
8000                 }
8001
8002                 // Return the resulting serialization
8003                 return s.join( "&" ).replace( r20, "+" );
8004         }
8005 });
8006
8007 function buildParams( prefix, obj, traditional, add ) {
8008         if ( jQuery.isArray( obj ) ) {
8009                 // Serialize array item.
8010                 jQuery.each( obj, function( i, v ) {
8011                         if ( traditional || rbracket.test( prefix ) ) {
8012                                 // Treat each array item as a scalar.
8013                                 add( prefix, v );
8014
8015                         } else {
8016                                 // If array item is non-scalar (array or object), encode its
8017                                 // numeric index to resolve deserialization ambiguity issues.
8018                                 // Note that rack (as of 1.0.0) can't currently deserialize
8019                                 // nested arrays properly, and attempting to do so may cause
8020                                 // a server error. Possible fixes are to modify rack's
8021                                 // deserialization algorithm or to provide an option or flag
8022                                 // to force array serialization to be shallow.
8023                                 buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
8024                         }
8025                 });
8026
8027         } else if ( !traditional && obj != null && typeof obj === "object" ) {
8028                 // Serialize object item.
8029                 for ( var name in obj ) {
8030                         buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
8031                 }
8032
8033         } else {
8034                 // Serialize scalar item.
8035                 add( prefix, obj );
8036         }
8037 }
8038
8039 // This is still on the jQuery object... for now
8040 // Want to move this to jQuery.ajax some day
8041 jQuery.extend({
8042
8043         // Counter for holding the number of active queries
8044         active: 0,
8045
8046         // Last-Modified header cache for next request
8047         lastModified: {},
8048         etag: {}
8049
8050 });
8051
8052 /* Handles responses to an ajax request:
8053  * - sets all responseXXX fields accordingly
8054  * - finds the right dataType (mediates between content-type and expected dataType)
8055  * - returns the corresponding response
8056  */
8057 function ajaxHandleResponses( s, jqXHR, responses ) {
8058
8059         var contents = s.contents,
8060                 dataTypes = s.dataTypes,
8061                 responseFields = s.responseFields,
8062                 ct,
8063                 type,
8064                 finalDataType,
8065                 firstDataType;
8066
8067         // Fill responseXXX fields
8068         for( type in responseFields ) {
8069                 if ( type in responses ) {
8070                         jqXHR[ responseFields[type] ] = responses[ type ];
8071                 }
8072         }
8073
8074         // Remove auto dataType and get content-type in the process
8075         while( dataTypes[ 0 ] === "*" ) {
8076                 dataTypes.shift();
8077                 if ( ct === undefined ) {
8078                         ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
8079                 }
8080         }
8081
8082         // Check if we're dealing with a known content-type
8083         if ( ct ) {
8084                 for ( type in contents ) {
8085                         if ( contents[ type ] && contents[ type ].test( ct ) ) {
8086                                 dataTypes.unshift( type );
8087                                 break;
8088                         }
8089                 }
8090         }
8091
8092         // Check to see if we have a response for the expected dataType
8093         if ( dataTypes[ 0 ] in responses ) {
8094                 finalDataType = dataTypes[ 0 ];
8095         } else {
8096                 // Try convertible dataTypes
8097                 for ( type in responses ) {
8098                         if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
8099                                 finalDataType = type;
8100                                 break;
8101                         }
8102                         if ( !firstDataType ) {
8103                                 firstDataType = type;
8104                         }
8105                 }
8106                 // Or just use first one
8107                 finalDataType = finalDataType || firstDataType;
8108         }
8109
8110         // If we found a dataType
8111         // We add the dataType to the list if needed
8112         // and return the corresponding response
8113         if ( finalDataType ) {
8114                 if ( finalDataType !== dataTypes[ 0 ] ) {
8115                         dataTypes.unshift( finalDataType );
8116                 }
8117                 return responses[ finalDataType ];
8118         }
8119 }
8120
8121 // Chain conversions given the request and the original response
8122 function ajaxConvert( s, response ) {
8123
8124         // Apply the dataFilter if provided
8125         if ( s.dataFilter ) {
8126                 response = s.dataFilter( response, s.dataType );
8127         }
8128
8129         var dataTypes = s.dataTypes,
8130                 converters = {},
8131                 i,
8132                 key,
8133                 length = dataTypes.length,
8134                 tmp,
8135                 // Current and previous dataTypes
8136                 current = dataTypes[ 0 ],
8137                 prev,
8138                 // Conversion expression
8139                 conversion,
8140                 // Conversion function
8141                 conv,
8142                 // Conversion functions (transitive conversion)
8143                 conv1,
8144                 conv2;
8145
8146         // For each dataType in the chain
8147         for( i = 1; i < length; i++ ) {
8148
8149                 // Create converters map
8150                 // with lowercased keys
8151                 if ( i === 1 ) {
8152                         for( key in s.converters ) {
8153                                 if( typeof key === "string" ) {
8154                                         converters[ key.toLowerCase() ] = s.converters[ key ];
8155                                 }
8156                         }
8157                 }
8158
8159                 // Get the dataTypes
8160                 prev = current;
8161                 current = dataTypes[ i ];
8162
8163                 // If current is auto dataType, update it to prev
8164                 if( current === "*" ) {
8165                         current = prev;
8166                 // If no auto and dataTypes are actually different
8167                 } else if ( prev !== "*" && prev !== current ) {
8168
8169                         // Get the converter
8170                         conversion = prev + " " + current;
8171                         conv = converters[ conversion ] || converters[ "* " + current ];
8172
8173                         // If there is no direct converter, search transitively
8174                         if ( !conv ) {
8175                                 conv2 = undefined;
8176                                 for( conv1 in converters ) {
8177                                         tmp = conv1.split( " " );
8178                                         if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
8179                                                 conv2 = converters[ tmp[1] + " " + current ];
8180                                                 if ( conv2 ) {
8181                                                         conv1 = converters[ conv1 ];
8182                                                         if ( conv1 === true ) {
8183                                                                 conv = conv2;
8184                                                         } else if ( conv2 === true ) {
8185                                                                 conv = conv1;
8186                                                         }
8187                                                         break;
8188                                                 }
8189                                         }
8190                                 }
8191                         }
8192                         // If we found no converter, dispatch an error
8193                         if ( !( conv || conv2 ) ) {
8194                                 jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
8195                         }
8196                         // If found converter is not an equivalence
8197                         if ( conv !== true ) {
8198                                 // Convert with 1 or 2 converters accordingly
8199                                 response = conv ? conv( response ) : conv2( conv1(response) );
8200                         }
8201                 }
8202         }
8203         return response;
8204 }
8205
8206
8207
8208
8209 var jsc = jQuery.now(),
8210         jsre = /(\=)\?(&|$)|\?\?/i;
8211
8212 // Default jsonp settings
8213 jQuery.ajaxSetup({
8214         jsonp: "callback",
8215         jsonpCallback: function() {
8216                 return jQuery.expando + "_" + ( jsc++ );
8217         }
8218 });
8219
8220 // Detect, normalize options and install callbacks for jsonp requests
8221 jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
8222
8223         var inspectData = s.contentType === "application/x-www-form-urlencoded" &&
8224                 ( typeof s.data === "string" );
8225
8226         if ( s.dataTypes[ 0 ] === "jsonp" ||
8227                 s.jsonp !== false && ( jsre.test( s.url ) ||
8228                                 inspectData && jsre.test( s.data ) ) ) {
8229
8230                 var responseContainer,
8231                         jsonpCallback = s.jsonpCallback =
8232                                 jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
8233                         previous = window[ jsonpCallback ],
8234                         url = s.url,
8235                         data = s.data,
8236                         replace = "$1" + jsonpCallback + "$2";
8237
8238                 if ( s.jsonp !== false ) {
8239                         url = url.replace( jsre, replace );
8240                         if ( s.url === url ) {
8241                                 if ( inspectData ) {
8242                                         data = data.replace( jsre, replace );
8243                                 }
8244                                 if ( s.data === data ) {
8245                                         // Add callback manually
8246                                         url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
8247                                 }
8248                         }
8249                 }
8250
8251                 s.url = url;
8252                 s.data = data;
8253
8254                 // Install callback
8255                 window[ jsonpCallback ] = function( response ) {
8256                         responseContainer = [ response ];
8257                 };
8258
8259                 // Clean-up function
8260                 jqXHR.always(function() {
8261                         // Set callback back to previous value
8262                         window[ jsonpCallback ] = previous;
8263                         // Call if it was a function and we have a response
8264                         if ( responseContainer && jQuery.isFunction( previous ) ) {
8265                                 window[ jsonpCallback ]( responseContainer[ 0 ] );
8266                         }
8267                 });
8268
8269                 // Use data converter to retrieve json after script execution
8270                 s.converters["script json"] = function() {
8271                         if ( !responseContainer ) {
8272                                 jQuery.error( jsonpCallback + " was not called" );
8273                         }
8274                         return responseContainer[ 0 ];
8275                 };
8276
8277                 // force json dataType
8278                 s.dataTypes[ 0 ] = "json";
8279
8280                 // Delegate to script
8281                 return "script";
8282         }
8283 });
8284
8285
8286
8287
8288 // Install script dataType
8289 jQuery.ajaxSetup({
8290         accepts: {
8291                 script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
8292         },
8293         contents: {
8294                 script: /javascript|ecmascript/
8295         },
8296         converters: {
8297                 "text script": function( text ) {
8298                         jQuery.globalEval( text );
8299                         return text;
8300                 }
8301         }
8302 });
8303
8304 // Handle cache's special case and global
8305 jQuery.ajaxPrefilter( "script", function( s ) {
8306         if ( s.cache === undefined ) {
8307                 s.cache = false;
8308         }
8309         if ( s.crossDomain ) {
8310                 s.type = "GET";
8311                 s.global = false;
8312         }
8313 });
8314
8315 // Bind script tag hack transport
8316 jQuery.ajaxTransport( "script", function(s) {
8317
8318         // This transport only deals with cross domain requests
8319         if ( s.crossDomain ) {
8320
8321                 var script,
8322                         head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
8323
8324                 return {
8325
8326                         send: function( _, callback ) {
8327
8328                                 script = document.createElement( "script" );
8329
8330                                 script.async = "async";
8331
8332                                 if ( s.scriptCharset ) {
8333                                         script.charset = s.scriptCharset;
8334                                 }
8335
8336                                 script.src = s.url;
8337
8338                                 // Attach handlers for all browsers
8339                                 script.onload = script.onreadystatechange = function( _, isAbort ) {
8340
8341                                         if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
8342
8343                                                 // Handle memory leak in IE
8344                                                 script.onload = script.onreadystatechange = null;
8345
8346                                                 // Remove the script
8347                                                 if ( head && script.parentNode ) {
8348                                                         head.removeChild( script );
8349                                                 }
8350
8351                                                 // Dereference the script
8352                                                 script = undefined;
8353
8354                                                 // Callback if not abort
8355                                                 if ( !isAbort ) {
8356                                                         callback( 200, "success" );
8357                                                 }
8358                                         }
8359                                 };
8360                                 // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
8361                                 // This arises when a base node is used (#2709 and #4378).
8362                                 head.insertBefore( script, head.firstChild );
8363                         },
8364
8365                         abort: function() {
8366                                 if ( script ) {
8367                                         script.onload( 0, 1 );
8368                                 }
8369                         }
8370                 };
8371         }
8372 });
8373
8374
8375
8376
8377 var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
8378         xhrOnUnloadAbort = window.ActiveXObject ? function() {
8379                 // Abort all pending requests
8380                 for ( var key in xhrCallbacks ) {
8381                         xhrCallbacks[ key ]( 0, 1 );
8382                 }
8383         } : false,
8384         xhrId = 0,
8385         xhrCallbacks;
8386
8387 // Functions to create xhrs
8388 function createStandardXHR() {
8389         try {
8390                 return new window.XMLHttpRequest();
8391         } catch( e ) {}
8392 }
8393
8394 function createActiveXHR() {
8395         try {
8396                 return new window.ActiveXObject( "Microsoft.XMLHTTP" );
8397         } catch( e ) {}
8398 }
8399
8400 // Create the request object
8401 // (This is still attached to ajaxSettings for backward compatibility)
8402 jQuery.ajaxSettings.xhr = window.ActiveXObject ?
8403         /* Microsoft failed to properly
8404          * implement the XMLHttpRequest in IE7 (can't request local files),
8405          * so we use the ActiveXObject when it is available
8406          * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
8407          * we need a fallback.
8408          */
8409         function() {
8410                 return !this.isLocal && createStandardXHR() || createActiveXHR();
8411         } :
8412         // For all other browsers, use the standard XMLHttpRequest object
8413         createStandardXHR;
8414
8415 // Determine support properties
8416 (function( xhr ) {
8417         jQuery.extend( jQuery.support, {
8418                 ajax: !!xhr,
8419                 cors: !!xhr && ( "withCredentials" in xhr )
8420         });
8421 })( jQuery.ajaxSettings.xhr() );
8422
8423 // Create transport if the browser can provide an xhr
8424 if ( jQuery.support.ajax ) {
8425
8426         jQuery.ajaxTransport(function( s ) {
8427                 // Cross domain only allowed if supported through XMLHttpRequest
8428                 if ( !s.crossDomain || jQuery.support.cors ) {
8429
8430                         var callback;
8431
8432                         return {
8433                                 send: function( headers, complete ) {
8434
8435                                         // Get a new xhr
8436                                         var xhr = s.xhr(),
8437                                                 handle,
8438                                                 i;
8439
8440                                         // Open the socket
8441                                         // Passing null username, generates a login popup on Opera (#2865)
8442                                         if ( s.username ) {
8443                                                 xhr.open( s.type, s.url, s.async, s.username, s.password );
8444                                         } else {
8445                                                 xhr.open( s.type, s.url, s.async );
8446                                         }
8447
8448                                         // Apply custom fields if provided
8449                                         if ( s.xhrFields ) {
8450                                                 for ( i in s.xhrFields ) {
8451                                                         xhr[ i ] = s.xhrFields[ i ];
8452                                                 }
8453                                         }
8454
8455                                         // Override mime type if needed
8456                                         if ( s.mimeType && xhr.overrideMimeType ) {
8457                                                 xhr.overrideMimeType( s.mimeType );
8458                                         }
8459
8460                                         // X-Requested-With header
8461                                         // For cross-domain requests, seeing as conditions for a preflight are
8462                                         // akin to a jigsaw puzzle, we simply never set it to be sure.
8463                                         // (it can always be set on a per-request basis or even using ajaxSetup)
8464                                         // For same-domain requests, won't change header if already provided.
8465                                         if ( !s.crossDomain && !headers["X-Requested-With"] ) {
8466                                                 headers[ "X-Requested-With" ] = "XMLHttpRequest";
8467                                         }
8468
8469                                         // Need an extra try/catch for cross domain requests in Firefox 3
8470                                         try {
8471                                                 for ( i in headers ) {
8472                                                         xhr.setRequestHeader( i, headers[ i ] );
8473                                                 }
8474                                         } catch( _ ) {}
8475
8476                                         // Do send the request
8477                                         // This may raise an exception which is actually
8478                                         // handled in jQuery.ajax (so no try/catch here)
8479                                         xhr.send( ( s.hasContent && s.data ) || null );
8480
8481                                         // Listener
8482                                         callback = function( _, isAbort ) {
8483
8484                                                 var status,
8485                                                         statusText,
8486                                                         responseHeaders,
8487                                                         responses,
8488                                                         xml;
8489
8490                                                 // Firefox throws exceptions when accessing properties
8491                                                 // of an xhr when a network error occured
8492                                                 // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
8493                                                 try {
8494
8495                                                         // Was never called and is aborted or complete
8496                                                         if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
8497
8498                                                                 // Only called once
8499                                                                 callback = undefined;
8500
8501                                                                 // Do not keep as active anymore
8502                                                                 if ( handle ) {
8503                                                                         xhr.onreadystatechange = jQuery.noop;
8504                                                                         if ( xhrOnUnloadAbort ) {
8505                                                                                 delete xhrCallbacks[ handle ];
8506                                                                         }
8507                                                                 }
8508
8509                                                                 // If it's an abort
8510                                                                 if ( isAbort ) {
8511                                                                         // Abort it manually if needed
8512                                                                         if ( xhr.readyState !== 4 ) {
8513                                                                                 xhr.abort();
8514                                                                         }
8515                                                                 } else {
8516                                                                         status = xhr.status;
8517                                                                         responseHeaders = xhr.getAllResponseHeaders();
8518                                                                         responses = {};
8519                                                                         xml = xhr.responseXML;
8520
8521                                                                         // Construct response list
8522                                                                         if ( xml && xml.documentElement /* #4958 */ ) {
8523                                                                                 responses.xml = xml;
8524                                                                         }
8525                                                                         responses.text = xhr.responseText;
8526
8527                                                                         // Firefox throws an exception when accessing
8528                                                                         // statusText for faulty cross-domain requests
8529                                                                         try {
8530                                                                                 statusText = xhr.statusText;
8531                                                                         } catch( e ) {
8532                                                                                 // We normalize with Webkit giving an empty statusText
8533                                                                                 statusText = "";
8534                                                                         }
8535
8536                                                                         // Filter status for non standard behaviors
8537
8538                                                                         // If the request is local and we have data: assume a success
8539                                                                         // (success with no data won't get notified, that's the best we
8540                                                                         // can do given current implementations)
8541                                                                         if ( !status && s.isLocal && !s.crossDomain ) {
8542                                                                                 status = responses.text ? 200 : 404;
8543                                                                         // IE - #1450: sometimes returns 1223 when it should be 204
8544                                                                         } else if ( status === 1223 ) {
8545                                                                                 status = 204;
8546                                                                         }
8547                                                                 }
8548                                                         }
8549                                                 } catch( firefoxAccessException ) {
8550                                                         if ( !isAbort ) {
8551                                                                 complete( -1, firefoxAccessException );
8552                                                         }
8553                                                 }
8554
8555                                                 // Call complete if needed
8556                                                 if ( responses ) {
8557                                                         complete( status, statusText, responses, responseHeaders );
8558                                                 }
8559                                         };
8560
8561                                         // if we're in sync mode or it's in cache
8562                                         // and has been retrieved directly (IE6 & IE7)
8563                                         // we need to manually fire the callback
8564                                         if ( !s.async || xhr.readyState === 4 ) {
8565                                                 callback();
8566                                         } else {
8567                                                 handle = ++xhrId;
8568                                                 if ( xhrOnUnloadAbort ) {
8569                                                         // Create the active xhrs callbacks list if needed
8570                                                         // and attach the unload handler
8571                                                         if ( !xhrCallbacks ) {
8572                                                                 xhrCallbacks = {};
8573                                                                 jQuery( window ).unload( xhrOnUnloadAbort );
8574                                                         }
8575                                                         // Add to list of active xhrs callbacks
8576                                                         xhrCallbacks[ handle ] = callback;
8577                                                 }
8578                                                 xhr.onreadystatechange = callback;
8579                                         }
8580                                 },
8581
8582                                 abort: function() {
8583                                         if ( callback ) {
8584                                                 callback(0,1);
8585                                         }
8586                                 }
8587                         };
8588                 }
8589         });
8590 }
8591
8592
8593
8594
8595 var elemdisplay = {},
8596         iframe, iframeDoc,
8597         rfxtypes = /^(?:toggle|show|hide)$/,
8598         rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
8599         timerId,
8600         fxAttrs = [
8601                 // height animations
8602                 [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
8603                 // width animations
8604                 [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
8605                 // opacity animations
8606                 [ "opacity" ]
8607         ],
8608         fxNow,
8609         requestAnimationFrame = window.webkitRequestAnimationFrame ||
8610             window.mozRequestAnimationFrame ||
8611             window.oRequestAnimationFrame;
8612
8613 jQuery.fn.extend({
8614         show: function( speed, easing, callback ) {
8615                 var elem, display;
8616
8617                 if ( speed || speed === 0 ) {
8618                         return this.animate( genFx("show", 3), speed, easing, callback);
8619
8620                 } else {
8621                         for ( var i = 0, j = this.length; i < j; i++ ) {
8622                                 elem = this[i];
8623
8624                                 if ( elem.style ) {
8625                                         display = elem.style.display;
8626
8627                                         // Reset the inline display of this element to learn if it is
8628                                         // being hidden by cascaded rules or not
8629                                         if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
8630                                                 display = elem.style.display = "";
8631                                         }
8632
8633                                         // Set elements which have been overridden with display: none
8634                                         // in a stylesheet to whatever the default browser style is
8635                                         // for such an element
8636                                         if ( display === "" && jQuery.css( elem, "display" ) === "none" ) {
8637                                                 jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName));
8638                                         }
8639                                 }
8640                         }
8641
8642                         // Set the display of most of the elements in a second loop
8643                         // to avoid the constant reflow
8644                         for ( i = 0; i < j; i++ ) {
8645                                 elem = this[i];
8646
8647                                 if ( elem.style ) {
8648                                         display = elem.style.display;
8649
8650                                         if ( display === "" || display === "none" ) {
8651                                                 elem.style.display = jQuery._data(elem, "olddisplay") || "";
8652                                         }
8653                                 }
8654                         }
8655
8656                         return this;
8657                 }
8658         },
8659
8660         hide: function( speed, easing, callback ) {
8661                 if ( speed || speed === 0 ) {
8662                         return this.animate( genFx("hide", 3), speed, easing, callback);
8663
8664                 } else {
8665                         for ( var i = 0, j = this.length; i < j; i++ ) {
8666                                 if ( this[i].style ) {
8667                                         var display = jQuery.css( this[i], "display" );
8668
8669                                         if ( display !== "none" && !jQuery._data( this[i], "olddisplay" ) ) {
8670                                                 jQuery._data( this[i], "olddisplay", display );
8671                                         }
8672                                 }
8673                         }
8674
8675                         // Set the display of the elements in a second loop
8676                         // to avoid the constant reflow
8677                         for ( i = 0; i < j; i++ ) {
8678                                 if ( this[i].style ) {
8679                                         this[i].style.display = "none";
8680                                 }
8681                         }
8682
8683                         return this;
8684                 }
8685         },
8686
8687         // Save the old toggle function
8688         _toggle: jQuery.fn.toggle,
8689
8690         toggle: function( fn, fn2, callback ) {
8691                 var bool = typeof fn === "boolean";
8692
8693                 if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
8694                         this._toggle.apply( this, arguments );
8695
8696                 } else if ( fn == null || bool ) {
8697                         this.each(function() {
8698                                 var state = bool ? fn : jQuery(this).is(":hidden");
8699                                 jQuery(this)[ state ? "show" : "hide" ]();
8700                         });
8701
8702                 } else {
8703                         this.animate(genFx("toggle", 3), fn, fn2, callback);
8704                 }
8705
8706                 return this;
8707         },
8708
8709         fadeTo: function( speed, to, easing, callback ) {
8710                 return this.filter(":hidden").css("opacity", 0).show().end()
8711                                         .animate({opacity: to}, speed, easing, callback);
8712         },
8713
8714         animate: function( prop, speed, easing, callback ) {
8715                 var optall = jQuery.speed(speed, easing, callback);
8716
8717                 if ( jQuery.isEmptyObject( prop ) ) {
8718                         return this.each( optall.complete, [ false ] );
8719                 }
8720
8721                 return this[ optall.queue === false ? "each" : "queue" ](function() {
8722                         // XXX 'this' does not always have a nodeName when running the
8723                         // test suite
8724
8725                         if ( optall.queue === false ) {
8726                                 jQuery._mark( this );
8727                         }
8728
8729                         var opt = jQuery.extend({}, optall),
8730                                 isElement = this.nodeType === 1,
8731                                 hidden = isElement && jQuery(this).is(":hidden"),
8732                                 name, val, p,
8733                                 display, e,
8734                                 parts, start, end, unit;
8735
8736                         // will store per property easing and be used to determine when an animation is complete
8737                         opt.animatedProperties = {};
8738
8739                         for ( p in prop ) {
8740
8741                                 // property name normalization
8742                                 name = jQuery.camelCase( p );
8743                                 if ( p !== name ) {
8744                                         prop[ name ] = prop[ p ];
8745                                         delete prop[ p ];
8746                                 }
8747
8748                                 val = prop[name];
8749
8750                                 if ( val === "hide" && hidden || val === "show" && !hidden ) {
8751                                         return opt.complete.call(this);
8752                                 }
8753
8754                                 if ( isElement && ( name === "height" || name === "width" ) ) {
8755                                         // Make sure that nothing sneaks out
8756                                         // Record all 3 overflow attributes because IE does not
8757                                         // change the overflow attribute when overflowX and
8758                                         // overflowY are set to the same value
8759                                         opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
8760
8761                                         // Set display property to inline-block for height/width
8762                                         // animations on inline elements that are having width/height
8763                                         // animated
8764                                         if ( jQuery.css( this, "display" ) === "inline" &&
8765                                                         jQuery.css( this, "float" ) === "none" ) {
8766                                                 if ( !jQuery.support.inlineBlockNeedsLayout ) {
8767                                                         this.style.display = "inline-block";
8768
8769                                                 } else {
8770                                                         display = defaultDisplay(this.nodeName);
8771
8772                                                         // inline-level elements accept inline-block;
8773                                                         // block-level elements need to be inline with layout
8774                                                         if ( display === "inline" ) {
8775                                                                 this.style.display = "inline-block";
8776
8777                                                         } else {
8778                                                                 this.style.display = "inline";
8779                                                                 this.style.zoom = 1;
8780                                                         }
8781                                                 }
8782                                         }
8783                                 }
8784
8785                                 // easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
8786                                 opt.animatedProperties[name] = jQuery.isArray( val ) ?
8787                                         val[1]:
8788                                         opt.specialEasing && opt.specialEasing[name] || opt.easing || 'swing';
8789                         }
8790
8791                         if ( opt.overflow != null ) {
8792                                 this.style.overflow = "hidden";
8793                         }
8794
8795                         for ( p in prop ) {
8796                                 e = new jQuery.fx( this, opt, p );
8797
8798                                 val = prop[p];
8799
8800                                 if ( rfxtypes.test(val) ) {
8801                                         e[ val === "toggle" ? hidden ? "show" : "hide" : val ]();
8802
8803                                 } else {
8804                                         parts = rfxnum.exec(val);
8805                                         start = e.cur();
8806
8807                                         if ( parts ) {
8808                                                 end = parseFloat( parts[2] );
8809                                                 unit = parts[3] || ( jQuery.cssNumber[ name ] ? "" : "px" );
8810
8811                                                 // We need to compute starting value
8812                                                 if ( unit !== "px" ) {
8813                                                         jQuery.style( this, p, (end || 1) + unit);
8814                                                         start = ((end || 1) / e.cur()) * start;
8815                                                         jQuery.style( this, p, start + unit);
8816                                                 }
8817
8818                                                 // If a +=/-= token was provided, we're doing a relative animation
8819                                                 if ( parts[1] ) {
8820                                                         end = ((parts[1] === "-=" ? -1 : 1) * end) + start;
8821                                                 }
8822
8823                                                 e.custom( start, end, unit );
8824
8825                                         } else {
8826                                                 e.custom( start, val, "" );
8827                                         }
8828                                 }
8829                         }
8830
8831                         // For JS strict compliance
8832                         return true;
8833                 });
8834         },
8835
8836         stop: function( clearQueue, gotoEnd ) {
8837                 if ( clearQueue ) {
8838                         this.queue([]);
8839                 }
8840
8841                 this.each(function() {
8842                         var timers = jQuery.timers,
8843                                 i = timers.length;
8844                         // clear marker counters if we know they won't be
8845                         if ( !gotoEnd ) {
8846                                 jQuery._unmark( true, this );
8847                         }
8848                         // go in reverse order so anything added to the queue during the loop is ignored
8849                         while ( i-- ) {
8850                                 if ( timers[i].elem === this ) {
8851                                         if (gotoEnd) {
8852                                                 // force the next step to be the last
8853                                                 timers[i](true);
8854                                         }
8855
8856                                         timers.splice(i, 1);
8857                                 }
8858                         }
8859                 });
8860
8861                 // start the next in the queue if the last step wasn't forced
8862                 if ( !gotoEnd ) {
8863                         this.dequeue();
8864                 }
8865
8866                 return this;
8867         }
8868
8869 });
8870
8871 // Animations created synchronously will run synchronously
8872 function createFxNow() {
8873         setTimeout( clearFxNow, 0 );
8874         return ( fxNow = jQuery.now() );
8875 }
8876
8877 function clearFxNow() {
8878         fxNow = undefined;
8879 }
8880
8881 // Generate parameters to create a standard animation
8882 function genFx( type, num ) {
8883         var obj = {};
8884
8885         jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
8886                 obj[ this ] = type;
8887         });
8888
8889         return obj;
8890 }
8891
8892 // Generate shortcuts for custom animations
8893 jQuery.each({
8894         slideDown: genFx("show", 1),
8895         slideUp: genFx("hide", 1),
8896         slideToggle: genFx("toggle", 1),
8897         fadeIn: { opacity: "show" },
8898         fadeOut: { opacity: "hide" },
8899         fadeToggle: { opacity: "toggle" }
8900 }, function( name, props ) {
8901         jQuery.fn[ name ] = function( speed, easing, callback ) {
8902                 return this.animate( props, speed, easing, callback );
8903         };
8904 });
8905
8906 jQuery.extend({
8907         speed: function( speed, easing, fn ) {
8908                 var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
8909                         complete: fn || !fn && easing ||
8910                                 jQuery.isFunction( speed ) && speed,
8911                         duration: speed,
8912                         easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
8913                 };
8914
8915                 opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
8916                         opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default;
8917
8918                 // Queueing
8919                 opt.old = opt.complete;
8920                 opt.complete = function( noUnmark ) {
8921                         if ( opt.queue !== false ) {
8922                                 jQuery.dequeue( this );
8923                         } else if ( noUnmark !== false ) {
8924                                 jQuery._unmark( this );
8925                         }
8926
8927                         if ( jQuery.isFunction( opt.old ) ) {
8928                                 opt.old.call( this );
8929                         }
8930                 };
8931
8932                 return opt;
8933         },
8934
8935         easing: {
8936                 linear: function( p, n, firstNum, diff ) {
8937                         return firstNum + diff * p;
8938                 },
8939                 swing: function( p, n, firstNum, diff ) {
8940                         return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
8941                 }
8942         },
8943
8944         timers: [],
8945
8946         fx: function( elem, options, prop ) {
8947                 this.options = options;
8948                 this.elem = elem;
8949                 this.prop = prop;
8950
8951                 options.orig = options.orig || {};
8952         }
8953
8954 });
8955
8956 jQuery.fx.prototype = {
8957         // Simple function for setting a style value
8958         update: function() {
8959                 if ( this.options.step ) {
8960                         this.options.step.call( this.elem, this.now, this );
8961                 }
8962
8963                 (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
8964         },
8965
8966         // Get the current size
8967         cur: function() {
8968                 if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
8969                         return this.elem[ this.prop ];
8970                 }
8971
8972                 var parsed,
8973                         r = jQuery.css( this.elem, this.prop );
8974                 // Empty strings, null, undefined and "auto" are converted to 0,
8975                 // complex values such as "rotate(1rad)" are returned as is,
8976                 // simple values such as "10px" are parsed to Float.
8977                 return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
8978         },
8979
8980         // Start an animation from one number to another
8981         custom: function( from, to, unit ) {
8982                 var self = this,
8983                         fx = jQuery.fx,
8984                         raf;
8985
8986                 this.startTime = fxNow || createFxNow();
8987                 this.start = from;
8988                 this.end = to;
8989                 this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
8990                 this.now = this.start;
8991                 this.pos = this.state = 0;
8992
8993                 function t( gotoEnd ) {
8994                         return self.step(gotoEnd);
8995                 }
8996
8997                 t.elem = this.elem;
8998
8999                 if ( t() && jQuery.timers.push(t) && !timerId ) {
9000                         // Use requestAnimationFrame instead of setInterval if available
9001                         if ( requestAnimationFrame ) {
9002                                 timerId = 1;
9003                                 raf = function() {
9004                                         // When timerId gets set to null at any point, this stops
9005                                         if ( timerId ) {
9006                                                 requestAnimationFrame( raf );
9007                                                 fx.tick();
9008                                         }
9009                                 };
9010                                 requestAnimationFrame( raf );
9011                         } else {
9012                                 timerId = setInterval( fx.tick, fx.interval );
9013                         }
9014                 }
9015         },
9016
9017         // Simple 'show' function
9018         show: function() {
9019                 // Remember where we started, so that we can go back to it later
9020                 this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
9021                 this.options.show = true;
9022
9023                 // Begin the animation
9024                 // Make sure that we start at a small width/height to avoid any
9025                 // flash of content
9026                 this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());
9027
9028                 // Start by showing the element
9029                 jQuery( this.elem ).show();
9030         },
9031
9032         // Simple 'hide' function
9033         hide: function() {
9034                 // Remember where we started, so that we can go back to it later
9035                 this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
9036                 this.options.hide = true;
9037
9038                 // Begin the animation
9039                 this.custom(this.cur(), 0);
9040         },
9041
9042         // Each step of an animation
9043         step: function( gotoEnd ) {
9044                 var t = fxNow || createFxNow(),
9045                         done = true,
9046                         elem = this.elem,
9047                         options = this.options,
9048                         i, n;
9049
9050                 if ( gotoEnd || t >= options.duration + this.startTime ) {
9051                         this.now = this.end;
9052                         this.pos = this.state = 1;
9053                         this.update();
9054
9055                         options.animatedProperties[ this.prop ] = true;
9056
9057                         for ( i in options.animatedProperties ) {
9058                                 if ( options.animatedProperties[i] !== true ) {
9059                                         done = false;
9060                                 }
9061                         }
9062
9063                         if ( done ) {
9064                                 // Reset the overflow
9065                                 if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
9066
9067                                         jQuery.each( [ "", "X", "Y" ], function (index, value) {
9068                                                 elem.style[ "overflow" + value ] = options.overflow[index];
9069                                         });
9070                                 }
9071
9072                                 // Hide the element if the "hide" operation was done
9073                                 if ( options.hide ) {
9074                                         jQuery(elem).hide();
9075                                 }
9076
9077                                 // Reset the properties, if the item has been hidden or shown
9078                                 if ( options.hide || options.show ) {
9079                                         for ( var p in options.animatedProperties ) {
9080                                                 jQuery.style( elem, p, options.orig[p] );
9081                                         }
9082                                 }
9083
9084                                 // Execute the complete function
9085                                 options.complete.call( elem );
9086                         }
9087
9088                         return false;
9089
9090                 } else {
9091                         // classical easing cannot be used with an Infinity duration
9092                         if ( options.duration == Infinity ) {
9093                                 this.now = t;
9094                         } else {
9095                                 n = t - this.startTime;
9096
9097                                 this.state = n / options.duration;
9098                                 // Perform the easing function, defaults to swing
9099                                 this.pos = jQuery.easing[options.animatedProperties[this.prop]](this.state, n, 0, 1, options.duration);
9100                                 this.now = this.start + ((this.end - this.start) * this.pos);
9101                         }
9102                         // Perform the next step of the animation
9103                         this.update();
9104                 }
9105
9106                 return true;
9107         }
9108 };
9109
9110 jQuery.extend( jQuery.fx, {
9111         tick: function() {
9112                 var timers = jQuery.timers,
9113                         i = timers.length;
9114                 while ( i-- ) {
9115                         if ( !timers[i]() ) {
9116                                 timers.splice(i, 1);
9117                         }
9118                 }
9119
9120                 if ( !timers.length ) {
9121                         jQuery.fx.stop();
9122                 }
9123         },
9124
9125         interval: 13,
9126
9127         stop: function() {
9128                 clearInterval( timerId );
9129                 timerId = null;
9130         },
9131
9132         speeds: {
9133                 slow: 600,
9134                 fast: 200,
9135                 // Default speed
9136                 _default: 400
9137         },
9138
9139         step: {
9140                 opacity: function( fx ) {
9141                         jQuery.style( fx.elem, "opacity", fx.now );
9142                 },
9143
9144                 _default: function( fx ) {
9145                         if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
9146                                 fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
9147                         } else {
9148                                 fx.elem[ fx.prop ] = fx.now;
9149                         }
9150                 }
9151         }
9152 });
9153
9154 if ( jQuery.expr && jQuery.expr.filters ) {
9155         jQuery.expr.filters.animated = function( elem ) {
9156                 return jQuery.grep(jQuery.timers, function( fn ) {
9157                         return elem === fn.elem;
9158                 }).length;
9159         };
9160 }
9161
9162 // Try to restore the default display value of an element
9163 function defaultDisplay( nodeName ) {
9164
9165         if ( !elemdisplay[ nodeName ] ) {
9166
9167                 var elem = jQuery( "<" + nodeName + ">" ).appendTo( "body" ),
9168                         display = elem.css( "display" );
9169
9170                 elem.remove();
9171
9172                 // If the simple way fails,
9173                 // get element's real default display by attaching it to a temp iframe
9174                 if ( display === "none" || display === "" ) {
9175                         // No iframe to use yet, so create it
9176                         if ( !iframe ) {
9177                                 iframe = document.createElement( "iframe" );
9178                                 iframe.frameBorder = iframe.width = iframe.height = 0;
9179                         }
9180
9181                         document.body.appendChild( iframe );
9182
9183                         // Create a cacheable copy of the iframe document on first call.
9184                         // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake html
9185                         // document to it, Webkit & Firefox won't allow reusing the iframe document
9186                         if ( !iframeDoc || !iframe.createElement ) {
9187                                 iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
9188                                 iframeDoc.write( "<!doctype><html><body></body></html>" );
9189                         }
9190
9191                         elem = iframeDoc.createElement( nodeName );
9192
9193                         iframeDoc.body.appendChild( elem );
9194
9195                         display = jQuery.css( elem, "display" );
9196
9197                         document.body.removeChild( iframe );
9198                 }
9199
9200                 // Store the correct default display
9201                 elemdisplay[ nodeName ] = display;
9202         }
9203
9204         return elemdisplay[ nodeName ];
9205 }
9206
9207
9208
9209
9210 var rtable = /^t(?:able|d|h)$/i,
9211         rroot = /^(?:body|html)$/i;
9212
9213 if ( "getBoundingClientRect" in document.documentElement ) {
9214         jQuery.fn.offset = function( options ) {
9215                 var elem = this[0], box;
9216
9217                 if ( options ) {
9218                         return this.each(function( i ) {
9219                                 jQuery.offset.setOffset( this, options, i );
9220                         });
9221                 }
9222
9223                 if ( !elem || !elem.ownerDocument ) {
9224                         return null;
9225                 }
9226
9227                 if ( elem === elem.ownerDocument.body ) {
9228                         return jQuery.offset.bodyOffset( elem );
9229                 }
9230
9231                 try {
9232                         box = elem.getBoundingClientRect();
9233                 } catch(e) {}
9234
9235                 var doc = elem.ownerDocument,
9236                         docElem = doc.documentElement;
9237
9238                 // Make sure we're not dealing with a disconnected DOM node
9239                 if ( !box || !jQuery.contains( docElem, elem ) ) {
9240                         return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
9241                 }
9242
9243                 var body = doc.body,
9244                         win = getWindow(doc),
9245                         clientTop  = docElem.clientTop  || body.clientTop  || 0,
9246                         clientLeft = docElem.clientLeft || body.clientLeft || 0,
9247                         scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,
9248                         scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
9249                         top  = box.top  + scrollTop  - clientTop,
9250                         left = box.left + scrollLeft - clientLeft;
9251
9252                 return { top: top, left: left };
9253         };
9254
9255 } else {
9256         jQuery.fn.offset = function( options ) {
9257                 var elem = this[0];
9258
9259                 if ( options ) {
9260                         return this.each(function( i ) {
9261                                 jQuery.offset.setOffset( this, options, i );
9262                         });
9263                 }
9264
9265                 if ( !elem || !elem.ownerDocument ) {
9266                         return null;
9267                 }
9268
9269                 if ( elem === elem.ownerDocument.body ) {
9270                         return jQuery.offset.bodyOffset( elem );
9271                 }
9272
9273                 jQuery.offset.initialize();
9274
9275                 var computedStyle,
9276                         offsetParent = elem.offsetParent,
9277                         prevOffsetParent = elem,
9278                         doc = elem.ownerDocument,
9279                         docElem = doc.documentElement,
9280                         body = doc.body,
9281                         defaultView = doc.defaultView,
9282                         prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
9283                         top = elem.offsetTop,
9284                         left = elem.offsetLeft;
9285
9286                 while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
9287                         if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
9288                                 break;
9289                         }
9290
9291                         computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
9292                         top  -= elem.scrollTop;
9293                         left -= elem.scrollLeft;
9294
9295                         if ( elem === offsetParent ) {
9296                                 top  += elem.offsetTop;
9297                                 left += elem.offsetLeft;
9298
9299                                 if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
9300                                         top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
9301                                         left += parseFloat( computedStyle.borderLeftWidth ) || 0;
9302                                 }
9303
9304                                 prevOffsetParent = offsetParent;
9305                                 offsetParent = elem.offsetParent;
9306                         }
9307
9308                         if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
9309                                 top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
9310                                 left += parseFloat( computedStyle.borderLeftWidth ) || 0;
9311                         }
9312
9313                         prevComputedStyle = computedStyle;
9314                 }
9315
9316                 if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
9317                         top  += body.offsetTop;
9318                         left += body.offsetLeft;
9319                 }
9320
9321                 if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
9322                         top  += Math.max( docElem.scrollTop, body.scrollTop );
9323                         left += Math.max( docElem.scrollLeft, body.scrollLeft );
9324                 }
9325
9326                 return { top: top, left: left };
9327         };
9328 }
9329
9330 jQuery.offset = {
9331         initialize: function() {
9332                 var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.css(body, "marginTop") ) || 0,
9333                         html = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
9334
9335                 jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
9336
9337                 container.innerHTML = html;
9338                 body.insertBefore( container, body.firstChild );
9339                 innerDiv = container.firstChild;
9340                 checkDiv = innerDiv.firstChild;
9341                 td = innerDiv.nextSibling.firstChild.firstChild;
9342
9343                 this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
9344                 this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
9345
9346                 checkDiv.style.position = "fixed";
9347                 checkDiv.style.top = "20px";
9348
9349                 // safari subtracts parent border width here which is 5px
9350                 this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
9351                 checkDiv.style.position = checkDiv.style.top = "";
9352
9353                 innerDiv.style.overflow = "hidden";
9354                 innerDiv.style.position = "relative";
9355
9356                 this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
9357
9358                 this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
9359
9360                 body.removeChild( container );
9361                 jQuery.offset.initialize = jQuery.noop;
9362         },
9363
9364         bodyOffset: function( body ) {
9365                 var top = body.offsetTop,
9366                         left = body.offsetLeft;
9367
9368                 jQuery.offset.initialize();
9369
9370                 if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
9371                         top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
9372                         left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
9373                 }
9374
9375                 return { top: top, left: left };
9376         },
9377
9378         setOffset: function( elem, options, i ) {
9379                 var position = jQuery.css( elem, "position" );
9380
9381                 // set position first, in-case top/left are set even on static elem
9382                 if ( position === "static" ) {
9383                         elem.style.position = "relative";
9384                 }
9385
9386                 var curElem = jQuery( elem ),
9387                         curOffset = curElem.offset(),
9388                         curCSSTop = jQuery.css( elem, "top" ),
9389                         curCSSLeft = jQuery.css( elem, "left" ),
9390                         calculatePosition = (position === "absolute" || position === "fixed") && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
9391                         props = {}, curPosition = {}, curTop, curLeft;
9392
9393                 // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
9394                 if ( calculatePosition ) {
9395                         curPosition = curElem.position();
9396                         curTop = curPosition.top;
9397                         curLeft = curPosition.left;
9398                 } else {
9399                         curTop = parseFloat( curCSSTop ) || 0;
9400                         curLeft = parseFloat( curCSSLeft ) || 0;
9401                 }
9402
9403                 if ( jQuery.isFunction( options ) ) {
9404                         options = options.call( elem, i, curOffset );
9405                 }
9406
9407                 if (options.top != null) {
9408                         props.top = (options.top - curOffset.top) + curTop;
9409                 }
9410                 if (options.left != null) {
9411                         props.left = (options.left - curOffset.left) + curLeft;
9412                 }
9413
9414                 if ( "using" in options ) {
9415                         options.using.call( elem, props );
9416                 } else {
9417                         curElem.css( props );
9418                 }
9419         }
9420 };
9421
9422
9423 jQuery.fn.extend({
9424         position: function() {
9425                 if ( !this[0] ) {
9426                         return null;
9427                 }
9428
9429                 var elem = this[0],
9430
9431                 // Get *real* offsetParent
9432                 offsetParent = this.offsetParent(),
9433
9434                 // Get correct offsets
9435                 offset       = this.offset(),
9436                 parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
9437
9438                 // Subtract element margins
9439                 // note: when an element has margin: auto the offsetLeft and marginLeft
9440                 // are the same in Safari causing offset.left to incorrectly be 0
9441                 offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
9442                 offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
9443
9444                 // Add offsetParent borders
9445                 parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
9446                 parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
9447
9448                 // Subtract the two offsets
9449                 return {
9450                         top:  offset.top  - parentOffset.top,
9451                         left: offset.left - parentOffset.left
9452                 };
9453         },
9454
9455         offsetParent: function() {
9456                 return this.map(function() {
9457                         var offsetParent = this.offsetParent || document.body;
9458                         while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
9459                                 offsetParent = offsetParent.offsetParent;
9460                         }
9461                         return offsetParent;
9462                 });
9463         }
9464 });
9465
9466
9467 // Create scrollLeft and scrollTop methods
9468 jQuery.each( ["Left", "Top"], function( i, name ) {
9469         var method = "scroll" + name;
9470
9471         jQuery.fn[ method ] = function( val ) {
9472                 var elem, win;
9473
9474                 if ( val === undefined ) {
9475                         elem = this[ 0 ];
9476
9477                         if ( !elem ) {
9478                                 return null;
9479                         }
9480
9481                         win = getWindow( elem );
9482
9483                         // Return the scroll offset
9484                         return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
9485                                 jQuery.support.boxModel && win.document.documentElement[ method ] ||
9486                                         win.document.body[ method ] :
9487                                 elem[ method ];
9488                 }
9489
9490                 // Set the scroll offset
9491                 return this.each(function() {
9492                         win = getWindow( this );
9493
9494                         if ( win ) {
9495                                 win.scrollTo(
9496                                         !i ? val : jQuery( win ).scrollLeft(),
9497                                          i ? val : jQuery( win ).scrollTop()
9498                                 );
9499
9500                         } else {
9501                                 this[ method ] = val;
9502                         }
9503                 });
9504         };
9505 });
9506
9507 function getWindow( elem ) {
9508         return jQuery.isWindow( elem ) ?
9509                 elem :
9510                 elem.nodeType === 9 ?
9511                         elem.defaultView || elem.parentWindow :
9512                         false;
9513 }
9514
9515
9516
9517
9518 // Create innerHeight, innerWidth, outerHeight and outerWidth methods
9519 jQuery.each([ "Height", "Width" ], function( i, name ) {
9520
9521         var type = name.toLowerCase();
9522
9523         // innerHeight and innerWidth
9524         jQuery.fn["inner" + name] = function() {
9525                 return this[0] ?
9526                         parseFloat( jQuery.css( this[0], type, "padding" ) ) :
9527                         null;
9528         };
9529
9530         // outerHeight and outerWidth
9531         jQuery.fn["outer" + name] = function( margin ) {
9532                 return this[0] ?
9533                         parseFloat( jQuery.css( this[0], type, margin ? "margin" : "border" ) ) :
9534                         null;
9535         };
9536
9537         jQuery.fn[ type ] = function( size ) {
9538                 // Get window width or height
9539                 var elem = this[0];
9540                 if ( !elem ) {
9541                         return size == null ? null : this;
9542                 }
9543
9544                 if ( jQuery.isFunction( size ) ) {
9545                         return this.each(function( i ) {
9546                                 var self = jQuery( this );
9547                                 self[ type ]( size.call( this, i, self[ type ]() ) );
9548                         });
9549                 }
9550
9551                 if ( jQuery.isWindow( elem ) ) {
9552                         // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
9553                         // 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
9554                         var docElemProp = elem.document.documentElement[ "client" + name ];
9555                         return elem.document.compatMode === "CSS1Compat" && docElemProp ||
9556                                 elem.document.body[ "client" + name ] || docElemProp;
9557
9558                 // Get document width or height
9559                 } else if ( elem.nodeType === 9 ) {
9560                         // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
9561                         return Math.max(
9562                                 elem.documentElement["client" + name],
9563                                 elem.body["scroll" + name], elem.documentElement["scroll" + name],
9564                                 elem.body["offset" + name], elem.documentElement["offset" + name]
9565                         );
9566
9567                 // Get or set width or height on the element
9568                 } else if ( size === undefined ) {
9569                         var orig = jQuery.css( elem, type ),
9570                                 ret = parseFloat( orig );
9571
9572                         return jQuery.isNaN( ret ) ? orig : ret;
9573
9574                 // Set the width or height on the element (default to pixels if value is unitless)
9575                 } else {
9576                         return this.css( type, typeof size === "string" ? size : size + "px" );
9577                 }
9578         };
9579
9580 });
9581
9582
9583 window.jQuery = window.$ = jQuery;
9584 })(window);
9585 /*!
9586  * jQuery UI 1.8.12
9587  *
9588  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
9589  * licensed under MIT 
9590  * http://jquery.org/license
9591  *
9592  * http://docs.jquery.com/UI
9593  */
9594 (function( $, undefined ) {
9595
9596 // prevent duplicate loading
9597 // this is only a problem because we proxy existing functions
9598 // and we don't want to double proxy them
9599 $.ui = $.ui || {};
9600 if ( $.ui.version ) {
9601         return;
9602 }
9603
9604 $.extend( $.ui, {
9605         version: "1.8.12",
9606
9607         keyCode: {
9608                 ALT: 18,
9609                 BACKSPACE: 8,
9610                 CAPS_LOCK: 20,
9611                 COMMA: 188,
9612                 COMMAND: 91,
9613                 COMMAND_LEFT: 91, // COMMAND
9614                 COMMAND_RIGHT: 93,
9615                 CONTROL: 17,
9616                 DELETE: 46,
9617                 DOWN: 40,
9618                 END: 35,
9619                 ENTER: 13,
9620                 ESCAPE: 27,
9621                 HOME: 36,
9622                 INSERT: 45,
9623                 LEFT: 37,
9624                 MENU: 93, // COMMAND_RIGHT
9625                 NUMPAD_ADD: 107,
9626                 NUMPAD_DECIMAL: 110,
9627                 NUMPAD_DIVIDE: 111,
9628                 NUMPAD_ENTER: 108,
9629                 NUMPAD_MULTIPLY: 106,
9630                 NUMPAD_SUBTRACT: 109,
9631                 PAGE_DOWN: 34,
9632                 PAGE_UP: 33,
9633                 PERIOD: 190,
9634                 RIGHT: 39,
9635                 SHIFT: 16,
9636                 SPACE: 32,
9637                 TAB: 9,
9638                 UP: 38,
9639                 WINDOWS: 91 // COMMAND
9640         }
9641 });
9642
9643 // plugins
9644 $.fn.extend({
9645         _focus: $.fn.focus,
9646         focus: function( delay, fn ) {
9647                 return typeof delay === "number" ?
9648                         this.each(function() {
9649                                 var elem = this;
9650                                 setTimeout(function() {
9651                                         $( elem ).focus();
9652                                         if ( fn ) {
9653                                                 fn.call( elem );
9654                                         }
9655                                 }, delay );
9656                         }) :
9657                         this._focus.apply( this, arguments );
9658         },
9659
9660         scrollParent: function() {
9661                 var scrollParent;
9662                 if (($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {
9663                         scrollParent = this.parents().filter(function() {
9664                                 return (/(relative|absolute|fixed)/).test($.curCSS(this,'position',1)) && (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
9665                         }).eq(0);
9666                 } else {
9667                         scrollParent = this.parents().filter(function() {
9668                                 return (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
9669                         }).eq(0);
9670                 }
9671
9672                 return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent;
9673         },
9674
9675         zIndex: function( zIndex ) {
9676                 if ( zIndex !== undefined ) {
9677                         return this.css( "zIndex", zIndex );
9678                 }
9679
9680                 if ( this.length ) {
9681                         var elem = $( this[ 0 ] ), position, value;
9682                         while ( elem.length && elem[ 0 ] !== document ) {
9683                                 // Ignore z-index if position is set to a value where z-index is ignored by the browser
9684                                 // This makes behavior of this function consistent across browsers
9685                                 // WebKit always returns auto if the element is positioned
9686                                 position = elem.css( "position" );
9687                                 if ( position === "absolute" || position === "relative" || position === "fixed" ) {
9688                                         // IE returns 0 when zIndex is not specified
9689                                         // other browsers return a string
9690                                         // we ignore the case of nested elements with an explicit value of 0
9691                                         // <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
9692                                         value = parseInt( elem.css( "zIndex" ), 10 );
9693                                         if ( !isNaN( value ) && value !== 0 ) {
9694                                                 return value;
9695                                         }
9696                                 }
9697                                 elem = elem.parent();
9698                         }
9699                 }
9700
9701                 return 0;
9702         },
9703
9704         disableSelection: function() {
9705                 return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
9706                         ".ui-disableSelection", function( event ) {
9707                                 event.preventDefault();
9708                         });
9709         },
9710
9711         enableSelection: function() {
9712                 return this.unbind( ".ui-disableSelection" );
9713         }
9714 });
9715
9716 $.each( [ "Width", "Height" ], function( i, name ) {
9717         var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
9718                 type = name.toLowerCase(),
9719                 orig = {
9720                         innerWidth: $.fn.innerWidth,
9721                         innerHeight: $.fn.innerHeight,
9722                         outerWidth: $.fn.outerWidth,
9723                         outerHeight: $.fn.outerHeight
9724                 };
9725
9726         function reduce( elem, size, border, margin ) {
9727                 $.each( side, function() {
9728                         size -= parseFloat( $.curCSS( elem, "padding" + this, true) ) || 0;
9729                         if ( border ) {
9730                                 size -= parseFloat( $.curCSS( elem, "border" + this + "Width", true) ) || 0;
9731                         }
9732                         if ( margin ) {
9733                                 size -= parseFloat( $.curCSS( elem, "margin" + this, true) ) || 0;
9734                         }
9735                 });
9736                 return size;
9737         }
9738
9739         $.fn[ "inner" + name ] = function( size ) {
9740                 if ( size === undefined ) {
9741                         return orig[ "inner" + name ].call( this );
9742                 }
9743
9744                 return this.each(function() {
9745                         $( this ).css( type, reduce( this, size ) + "px" );
9746                 });
9747         };
9748
9749         $.fn[ "outer" + name] = function( size, margin ) {
9750                 if ( typeof size !== "number" ) {
9751                         return orig[ "outer" + name ].call( this, size );
9752                 }
9753
9754                 return this.each(function() {
9755                         $( this).css( type, reduce( this, size, true, margin ) + "px" );
9756                 });
9757         };
9758 });
9759
9760 // selectors
9761 function visible( element ) {
9762         return !$( element ).parents().andSelf().filter(function() {
9763                 return $.curCSS( this, "visibility" ) === "hidden" ||
9764                         $.expr.filters.hidden( this );
9765         }).length;
9766 }
9767
9768 $.extend( $.expr[ ":" ], {
9769         data: function( elem, i, match ) {
9770                 return !!$.data( elem, match[ 3 ] );
9771         },
9772
9773         focusable: function( element ) {
9774                 var nodeName = element.nodeName.toLowerCase(),
9775                         tabIndex = $.attr( element, "tabindex" );
9776                 if ( "area" === nodeName ) {
9777                         var map = element.parentNode,
9778                                 mapName = map.name,
9779                                 img;
9780                         if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
9781                                 return false;
9782                         }
9783                         img = $( "img[usemap=#" + mapName + "]" )[0];
9784                         return !!img && visible( img );
9785                 }
9786                 return ( /input|select|textarea|button|object/.test( nodeName )
9787                         ? !element.disabled
9788                         : "a" == nodeName
9789                                 ? element.href || !isNaN( tabIndex )
9790                                 : !isNaN( tabIndex ))
9791                         // the element and all of its ancestors must be visible
9792                         && visible( element );
9793         },
9794
9795         tabbable: function( element ) {
9796                 var tabIndex = $.attr( element, "tabindex" );
9797                 return ( isNaN( tabIndex ) || tabIndex >= 0 ) && $( element ).is( ":focusable" );
9798         }
9799 });
9800
9801 // support
9802 $(function() {
9803         var body = document.body,
9804                 div = body.appendChild( div = document.createElement( "div" ) );
9805
9806         $.extend( div.style, {
9807                 minHeight: "100px",
9808                 height: "auto",
9809                 padding: 0,
9810                 borderWidth: 0
9811         });
9812
9813         $.support.minHeight = div.offsetHeight === 100;
9814         $.support.selectstart = "onselectstart" in div;
9815
9816         // set display to none to avoid a layout bug in IE
9817         // http://dev.jquery.com/ticket/4014
9818         body.removeChild( div ).style.display = "none";
9819 });
9820
9821
9822
9823
9824
9825 // deprecated
9826 $.extend( $.ui, {
9827         // $.ui.plugin is deprecated.  Use the proxy pattern instead.
9828         plugin: {
9829                 add: function( module, option, set ) {
9830                         var proto = $.ui[ module ].prototype;
9831                         for ( var i in set ) {
9832                                 proto.plugins[ i ] = proto.plugins[ i ] || [];
9833                                 proto.plugins[ i ].push( [ option, set[ i ] ] );
9834                         }
9835                 },
9836                 call: function( instance, name, args ) {
9837                         var set = instance.plugins[ name ];
9838                         if ( !set || !instance.element[ 0 ].parentNode ) {
9839                                 return;
9840                         }
9841         
9842                         for ( var i = 0; i < set.length; i++ ) {
9843                                 if ( instance.options[ set[ i ][ 0 ] ] ) {
9844                                         set[ i ][ 1 ].apply( instance.element, args );
9845                                 }
9846                         }
9847                 }
9848         },
9849         
9850         // will be deprecated when we switch to jQuery 1.4 - use jQuery.contains()
9851         contains: function( a, b ) {
9852                 return document.compareDocumentPosition ?
9853                         a.compareDocumentPosition( b ) & 16 :
9854                         a !== b && a.contains( b );
9855         },
9856         
9857         // only used by resizable
9858         hasScroll: function( el, a ) {
9859         
9860                 //If overflow is hidden, the element might have extra content, but the user wants to hide it
9861                 if ( $( el ).css( "overflow" ) === "hidden") {
9862                         return false;
9863                 }
9864         
9865                 var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
9866                         has = false;
9867         
9868                 if ( el[ scroll ] > 0 ) {
9869                         return true;
9870                 }
9871         
9872                 // TODO: determine which cases actually cause this to happen
9873                 // if the element doesn't have the scroll set, see if it's possible to
9874                 // set the scroll
9875                 el[ scroll ] = 1;
9876                 has = ( el[ scroll ] > 0 );
9877                 el[ scroll ] = 0;
9878                 return has;
9879         },
9880         
9881         // these are odd functions, fix the API or move into individual plugins
9882         isOverAxis: function( x, reference, size ) {
9883                 //Determines when x coordinate is over "b" element axis
9884                 return ( x > reference ) && ( x < ( reference + size ) );
9885         },
9886         isOver: function( y, x, top, left, height, width ) {
9887                 //Determines when x, y coordinates is over "b" element
9888                 return $.ui.isOverAxis( y, top, height ) && $.ui.isOverAxis( x, left, width );
9889         }
9890 });
9891
9892 })( jQuery );
9893 /*!
9894  * jQuery UI Widget 1.8.12
9895  *
9896  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
9897  * Dual licensed under the MIT or GPL Version 2 licenses.
9898  * http://jquery.org/license
9899  *
9900  * http://docs.jquery.com/UI/Widget
9901  */
9902 (function( $, undefined ) {
9903
9904 // jQuery 1.4+
9905 if ( $.cleanData ) {
9906         var _cleanData = $.cleanData;
9907         $.cleanData = function( elems ) {
9908                 for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
9909                         $( elem ).triggerHandler( "remove" );
9910                 }
9911                 _cleanData( elems );
9912         };
9913 } else {
9914         var _remove = $.fn.remove;
9915         $.fn.remove = function( selector, keepData ) {
9916                 return this.each(function() {
9917                         if ( !keepData ) {
9918                                 if ( !selector || $.filter( selector, [ this ] ).length ) {
9919                                         $( "*", this ).add( [ this ] ).each(function() {
9920                                                 $( this ).triggerHandler( "remove" );
9921                                         });
9922                                 }
9923                         }
9924                         return _remove.call( $(this), selector, keepData );
9925                 });
9926         };
9927 }
9928
9929 $.widget = function( name, base, prototype ) {
9930         var namespace = name.split( "." )[ 0 ],
9931                 fullName;
9932         name = name.split( "." )[ 1 ];
9933         fullName = namespace + "-" + name;
9934
9935         if ( !prototype ) {
9936                 prototype = base;
9937                 base = $.Widget;
9938         }
9939
9940         // create selector for plugin
9941         $.expr[ ":" ][ fullName ] = function( elem ) {
9942                 return !!$.data( elem, name );
9943         };
9944
9945         $[ namespace ] = $[ namespace ] || {};
9946         $[ namespace ][ name ] = function( options, element ) {
9947                 // allow instantiation without initializing for simple inheritance
9948                 if ( arguments.length ) {
9949                         this._createWidget( options, element );
9950                 }
9951         };
9952
9953         var basePrototype = new base();
9954         // we need to make the options hash a property directly on the new instance
9955         // otherwise we'll modify the options hash on the prototype that we're
9956         // inheriting from
9957 //      $.each( basePrototype, function( key, val ) {
9958 //              if ( $.isPlainObject(val) ) {
9959 //                      basePrototype[ key ] = $.extend( {}, val );
9960 //              }
9961 //      });
9962         basePrototype.options = $.extend( true, {}, basePrototype.options );
9963         $[ namespace ][ name ].prototype = $.extend( true, basePrototype, {
9964                 namespace: namespace,
9965                 widgetName: name,
9966                 widgetEventPrefix: $[ namespace ][ name ].prototype.widgetEventPrefix || name,
9967                 widgetBaseClass: fullName
9968         }, prototype );
9969
9970         $.widget.bridge( name, $[ namespace ][ name ] );
9971 };
9972
9973 $.widget.bridge = function( name, object ) {
9974         $.fn[ name ] = function( options ) {
9975                 var isMethodCall = typeof options === "string",
9976                         args = Array.prototype.slice.call( arguments, 1 ),
9977                         returnValue = this;
9978
9979                 // allow multiple hashes to be passed on init
9980                 options = !isMethodCall && args.length ?
9981                         $.extend.apply( null, [ true, options ].concat(args) ) :
9982                         options;
9983
9984                 // prevent calls to internal methods
9985                 if ( isMethodCall && options.charAt( 0 ) === "_" ) {
9986                         return returnValue;
9987                 }
9988
9989                 if ( isMethodCall ) {
9990                         this.each(function() {
9991                                 var instance = $.data( this, name ),
9992                                         methodValue = instance && $.isFunction( instance[options] ) ?
9993                                                 instance[ options ].apply( instance, args ) :
9994                                                 instance;
9995                                 // TODO: add this back in 1.9 and use $.error() (see #5972)
9996 //                              if ( !instance ) {
9997 //                                      throw "cannot call methods on " + name + " prior to initialization; " +
9998 //                                              "attempted to call method '" + options + "'";
9999 //                              }
10000 //                              if ( !$.isFunction( instance[options] ) ) {
10001 //                                      throw "no such method '" + options + "' for " + name + " widget instance";
10002 //                              }
10003 //                              var methodValue = instance[ options ].apply( instance, args );
10004                                 if ( methodValue !== instance && methodValue !== undefined ) {
10005                                         returnValue = methodValue;
10006                                         return false;
10007                                 }
10008                         });
10009                 } else {
10010                         this.each(function() {
10011                                 var instance = $.data( this, name );
10012                                 if ( instance ) {
10013                                         instance.option( options || {} )._init();
10014                                 } else {
10015                                         $.data( this, name, new object( options, this ) );
10016                                 }
10017                         });
10018                 }
10019
10020                 return returnValue;
10021         };
10022 };
10023
10024 $.Widget = function( options, element ) {
10025         // allow instantiation without initializing for simple inheritance
10026         if ( arguments.length ) {
10027                 this._createWidget( options, element );
10028         }
10029 };
10030
10031 $.Widget.prototype = {
10032         widgetName: "widget",
10033         widgetEventPrefix: "",
10034         options: {
10035                 disabled: false
10036         },
10037         _createWidget: function( options, element ) {
10038                 // $.widget.bridge stores the plugin instance, but we do it anyway
10039                 // so that it's stored even before the _create function runs
10040                 $.data( element, this.widgetName, this );
10041                 this.element = $( element );
10042                 this.options = $.extend( true, {},
10043                         this.options,
10044                         this._getCreateOptions(),
10045                         options );
10046
10047                 var self = this;
10048                 this.element.bind( "remove." + this.widgetName, function() {
10049                         self.destroy();
10050                 });
10051
10052                 this._create();
10053                 this._trigger( "create" );
10054                 this._init();
10055         },
10056         _getCreateOptions: function() {
10057                 return $.metadata && $.metadata.get( this.element[0] )[ this.widgetName ];
10058         },
10059         _create: function() {},
10060         _init: function() {},
10061
10062         destroy: function() {
10063                 this.element
10064                         .unbind( "." + this.widgetName )
10065                         .removeData( this.widgetName );
10066                 this.widget()
10067                         .unbind( "." + this.widgetName )
10068                         .removeAttr( "aria-disabled" )
10069                         .removeClass(
10070                                 this.widgetBaseClass + "-disabled " +
10071                                 "ui-state-disabled" );
10072         },
10073
10074         widget: function() {
10075                 return this.element;
10076         },
10077
10078         option: function( key, value ) {
10079                 var options = key;
10080
10081                 if ( arguments.length === 0 ) {
10082                         // don't return a reference to the internal hash
10083                         return $.extend( {}, this.options );
10084                 }
10085
10086                 if  (typeof key === "string" ) {
10087                         if ( value === undefined ) {
10088                                 return this.options[ key ];
10089                         }
10090                         options = {};
10091                         options[ key ] = value;
10092                 }
10093
10094                 this._setOptions( options );
10095
10096                 return this;
10097         },
10098         _setOptions: function( options ) {
10099                 var self = this;
10100                 $.each( options, function( key, value ) {
10101                         self._setOption( key, value );
10102                 });
10103
10104                 return this;
10105         },
10106         _setOption: function( key, value ) {
10107                 this.options[ key ] = value;
10108
10109                 if ( key === "disabled" ) {
10110                         this.widget()
10111                                 [ value ? "addClass" : "removeClass"](
10112                                         this.widgetBaseClass + "-disabled" + " " +
10113                                         "ui-state-disabled" )
10114                                 .attr( "aria-disabled", value );
10115                 }
10116
10117                 return this;
10118         },
10119
10120         enable: function() {
10121                 return this._setOption( "disabled", false );
10122         },
10123         disable: function() {
10124                 return this._setOption( "disabled", true );
10125         },
10126
10127         _trigger: function( type, event, data ) {
10128                 var callback = this.options[ type ];
10129
10130                 event = $.Event( event );
10131                 event.type = ( type === this.widgetEventPrefix ?
10132                         type :
10133                         this.widgetEventPrefix + type ).toLowerCase();
10134                 data = data || {};
10135
10136                 // copy original event properties over to the new event
10137                 // this would happen if we could call $.event.fix instead of $.Event
10138                 // but we don't have a way to force an event to be fixed multiple times
10139                 if ( event.originalEvent ) {
10140                         for ( var i = $.event.props.length, prop; i; ) {
10141                                 prop = $.event.props[ --i ];
10142                                 event[ prop ] = event.originalEvent[ prop ];
10143                         }
10144                 }
10145
10146                 this.element.trigger( event, data );
10147
10148                 return !( $.isFunction(callback) &&
10149                         callback.call( this.element[0], event, data ) === false ||
10150                         event.isDefaultPrevented() );
10151         }
10152 };
10153
10154 })( jQuery );
10155 /*!
10156  * jQuery UI Mouse 1.8.12
10157  *
10158  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
10159  * Dual licensed under the MIT or GPL Version 2 licenses.
10160  * http://jquery.org/license
10161  *
10162  * http://docs.jquery.com/UI/Mouse
10163  *
10164  * Depends:
10165  *      jquery.ui.widget.js
10166  */
10167 (function( $, undefined ) {
10168
10169 $.widget("ui.mouse", {
10170         options: {
10171                 cancel: ':input,option',
10172                 distance: 1,
10173                 delay: 0
10174         },
10175         _mouseInit: function() {
10176                 var self = this;
10177
10178                 this.element
10179                         .bind('mousedown.'+this.widgetName, function(event) {
10180                                 return self._mouseDown(event);
10181                         })
10182                         .bind('click.'+this.widgetName, function(event) {
10183                                 if (true === $.data(event.target, self.widgetName + '.preventClickEvent')) {
10184                                     $.removeData(event.target, self.widgetName + '.preventClickEvent');
10185                                         event.stopImmediatePropagation();
10186                                         return false;
10187                                 }
10188                         });
10189
10190                 this.started = false;
10191         },
10192
10193         // TODO: make sure destroying one instance of mouse doesn't mess with
10194         // other instances of mouse
10195         _mouseDestroy: function() {
10196                 this.element.unbind('.'+this.widgetName);
10197         },
10198
10199         _mouseDown: function(event) {
10200                 // don't let more than one widget handle mouseStart
10201                 // TODO: figure out why we have to use originalEvent
10202                 event.originalEvent = event.originalEvent || {};
10203                 if (event.originalEvent.mouseHandled) { return; }
10204
10205                 // we may have missed mouseup (out of window)
10206                 (this._mouseStarted && this._mouseUp(event));
10207
10208                 this._mouseDownEvent = event;
10209
10210                 var self = this,
10211                         btnIsLeft = (event.which == 1),
10212                         elIsCancel = (typeof this.options.cancel == "string" ? $(event.target).parents().add(event.target).filter(this.options.cancel).length : false);
10213                 if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
10214                         return true;
10215                 }
10216
10217                 this.mouseDelayMet = !this.options.delay;
10218                 if (!this.mouseDelayMet) {
10219                         this._mouseDelayTimer = setTimeout(function() {
10220                                 self.mouseDelayMet = true;
10221                         }, this.options.delay);
10222                 }
10223
10224                 if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
10225                         this._mouseStarted = (this._mouseStart(event) !== false);
10226                         if (!this._mouseStarted) {
10227                                 event.preventDefault();
10228                                 return true;
10229                         }
10230                 }
10231
10232                 // Click event may never have fired (Gecko & Opera)
10233                 if (true === $.data(event.target, this.widgetName + '.preventClickEvent')) {
10234                         $.removeData(event.target, this.widgetName + '.preventClickEvent');
10235                 }
10236
10237                 // these delegates are required to keep context
10238                 this._mouseMoveDelegate = function(event) {
10239                         return self._mouseMove(event);
10240                 };
10241                 this._mouseUpDelegate = function(event) {
10242                         return self._mouseUp(event);
10243                 };
10244                 $(document)
10245                         .bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
10246                         .bind('mouseup.'+this.widgetName, this._mouseUpDelegate);
10247
10248                 event.preventDefault();
10249                 event.originalEvent.mouseHandled = true;
10250                 return true;
10251         },
10252
10253         _mouseMove: function(event) {
10254                 // IE mouseup check - mouseup happened when mouse was out of window
10255                 if ($.browser.msie && !(document.documentMode >= 9) && !event.button) {
10256                         return this._mouseUp(event);
10257                 }
10258
10259                 if (this._mouseStarted) {
10260                         this._mouseDrag(event);
10261                         return event.preventDefault();
10262                 }
10263
10264                 if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
10265                         this._mouseStarted =
10266                                 (this._mouseStart(this._mouseDownEvent, event) !== false);
10267                         (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
10268                 }
10269
10270                 return !this._mouseStarted;
10271         },
10272
10273         _mouseUp: function(event) {
10274                 $(document)
10275                         .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
10276                         .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
10277
10278                 if (this._mouseStarted) {
10279                         this._mouseStarted = false;
10280
10281                         if (event.target == this._mouseDownEvent.target) {
10282                             $.data(event.target, this.widgetName + '.preventClickEvent', true);
10283                         }
10284
10285                         this._mouseStop(event);
10286                 }
10287
10288                 return false;
10289         },
10290
10291         _mouseDistanceMet: function(event) {
10292                 return (Math.max(
10293                                 Math.abs(this._mouseDownEvent.pageX - event.pageX),
10294                                 Math.abs(this._mouseDownEvent.pageY - event.pageY)
10295                         ) >= this.options.distance
10296                 );
10297         },
10298
10299         _mouseDelayMet: function(event) {
10300                 return this.mouseDelayMet;
10301         },
10302
10303         // These are placeholder methods, to be overriden by extending plugin
10304         _mouseStart: function(event) {},
10305         _mouseDrag: function(event) {},
10306         _mouseStop: function(event) {},
10307         _mouseCapture: function(event) { return true; }
10308 });
10309
10310 })(jQuery);
10311 /*
10312  * jQuery UI Draggable 1.8.12
10313  *
10314  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
10315  * Dual licensed under the MIT or GPL Version 2 licenses.
10316  * http://jquery.org/license
10317  *
10318  * http://docs.jquery.com/UI/Draggables
10319  *
10320  * Depends:
10321  *      jquery.ui.core.js
10322  *      jquery.ui.mouse.js
10323  *      jquery.ui.widget.js
10324  */
10325 (function( $, undefined ) {
10326
10327 $.widget("ui.draggable", $.ui.mouse, {
10328         widgetEventPrefix: "drag",
10329         options: {
10330                 addClasses: true,
10331                 appendTo: "parent",
10332                 axis: false,
10333                 connectToSortable: false,
10334                 containment: false,
10335                 cursor: "auto",
10336                 cursorAt: false,
10337                 grid: false,
10338                 handle: false,
10339                 helper: "original",
10340                 iframeFix: false,
10341                 opacity: false,
10342                 refreshPositions: false,
10343                 revert: false,
10344                 revertDuration: 500,
10345                 scope: "default",
10346                 scroll: true,
10347                 scrollSensitivity: 20,
10348                 scrollSpeed: 20,
10349                 snap: false,
10350                 snapMode: "both",
10351                 snapTolerance: 20,
10352                 stack: false,
10353                 zIndex: false
10354         },
10355         _create: function() {
10356
10357                 if (this.options.helper == 'original' && !(/^(?:r|a|f)/).test(this.element.css("position")))
10358                         this.element[0].style.position = 'relative';
10359
10360                 (this.options.addClasses && this.element.addClass("ui-draggable"));
10361                 (this.options.disabled && this.element.addClass("ui-draggable-disabled"));
10362
10363                 this._mouseInit();
10364
10365         },
10366
10367         destroy: function() {
10368                 if(!this.element.data('draggable')) return;
10369                 this.element
10370                         .removeData("draggable")
10371                         .unbind(".draggable")
10372                         .removeClass("ui-draggable"
10373                                 + " ui-draggable-dragging"
10374                                 + " ui-draggable-disabled");
10375                 this._mouseDestroy();
10376
10377                 return this;
10378         },
10379
10380         _mouseCapture: function(event) {
10381
10382                 var o = this.options;
10383
10384                 // among others, prevent a drag on a resizable-handle
10385                 if (this.helper || o.disabled || $(event.target).is('.ui-resizable-handle'))
10386                         return false;
10387
10388                 //Quit if we're not on a valid handle
10389                 this.handle = this._getHandle(event);
10390                 if (!this.handle)
10391                         return false;
10392
10393                 return true;
10394
10395         },
10396
10397         _mouseStart: function(event) {
10398
10399                 var o = this.options;
10400
10401                 //Create and append the visible helper
10402                 this.helper = this._createHelper(event);
10403
10404                 //Cache the helper size
10405                 this._cacheHelperProportions();
10406
10407                 //If ddmanager is used for droppables, set the global draggable
10408                 if($.ui.ddmanager)
10409                         $.ui.ddmanager.current = this;
10410
10411                 /*
10412                  * - Position generation -
10413                  * This block generates everything position related - it's the core of draggables.
10414                  */
10415
10416                 //Cache the margins of the original element
10417                 this._cacheMargins();
10418
10419                 //Store the helper's css position
10420                 this.cssPosition = this.helper.css("position");
10421                 this.scrollParent = this.helper.scrollParent();
10422
10423                 //The element's absolute position on the page minus margins
10424                 this.offset = this.positionAbs = this.element.offset();
10425                 this.offset = {
10426                         top: this.offset.top - this.margins.top,
10427                         left: this.offset.left - this.margins.left
10428                 };
10429
10430                 $.extend(this.offset, {
10431                         click: { //Where the click happened, relative to the element
10432                                 left: event.pageX - this.offset.left,
10433                                 top: event.pageY - this.offset.top
10434                         },
10435                         parent: this._getParentOffset(),
10436                         relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
10437                 });
10438
10439                 //Generate the original position
10440                 this.originalPosition = this.position = this._generatePosition(event);
10441                 this.originalPageX = event.pageX;
10442                 this.originalPageY = event.pageY;
10443
10444                 //Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
10445                 (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
10446
10447                 //Set a containment if given in the options
10448                 if(o.containment)
10449                         this._setContainment();
10450
10451                 //Trigger event + callbacks
10452                 if(this._trigger("start", event) === false) {
10453                         this._clear();
10454                         return false;
10455                 }
10456
10457                 //Recache the helper size
10458                 this._cacheHelperProportions();
10459
10460                 //Prepare the droppable offsets
10461                 if ($.ui.ddmanager && !o.dropBehaviour)
10462                         $.ui.ddmanager.prepareOffsets(this, event);
10463
10464                 this.helper.addClass("ui-draggable-dragging");
10465                 this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
10466                 return true;
10467         },
10468
10469         _mouseDrag: function(event, noPropagation) {
10470
10471                 //Compute the helpers position
10472                 this.position = this._generatePosition(event);
10473                 this.positionAbs = this._convertPositionTo("absolute");
10474
10475                 //Call plugins and callbacks and use the resulting position if something is returned
10476                 if (!noPropagation) {
10477                         var ui = this._uiHash();
10478                         if(this._trigger('drag', event, ui) === false) {
10479                                 this._mouseUp({});
10480                                 return false;
10481                         }
10482                         this.position = ui.position;
10483                 }
10484
10485                 if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
10486                 if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
10487                 if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
10488
10489                 return false;
10490         },
10491
10492         _mouseStop: function(event) {
10493
10494                 //If we are using droppables, inform the manager about the drop
10495                 var dropped = false;
10496                 if ($.ui.ddmanager && !this.options.dropBehaviour)
10497                         dropped = $.ui.ddmanager.drop(this, event);
10498
10499                 //if a drop comes from outside (a sortable)
10500                 if(this.dropped) {
10501                         dropped = this.dropped;
10502                         this.dropped = false;
10503                 }
10504                 
10505                 //if the original element is removed, don't bother to continue if helper is set to "original"
10506                 if((!this.element[0] || !this.element[0].parentNode) && this.options.helper == "original")
10507                         return false;
10508
10509                 if((this.options.revert == "invalid" && !dropped) || (this.options.revert == "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {
10510                         var self = this;
10511                         $(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {
10512                                 if(self._trigger("stop", event) !== false) {
10513                                         self._clear();
10514                                 }
10515                         });
10516                 } else {
10517                         if(this._trigger("stop", event) !== false) {
10518                                 this._clear();
10519                         }
10520                 }
10521
10522                 return false;
10523         },
10524         
10525         cancel: function() {
10526                 
10527                 if(this.helper.is(".ui-draggable-dragging")) {
10528                         this._mouseUp({});
10529                 } else {
10530                         this._clear();
10531                 }
10532                 
10533                 return this;
10534                 
10535         },
10536
10537         _getHandle: function(event) {
10538
10539                 var handle = !this.options.handle || !$(this.options.handle, this.element).length ? true : false;
10540                 $(this.options.handle, this.element)
10541                         .find("*")
10542                         .andSelf()
10543                         .each(function() {
10544                                 if(this == event.target) handle = true;
10545                         });
10546
10547                 return handle;
10548
10549         },
10550
10551         _createHelper: function(event) {
10552
10553                 var o = this.options;
10554                 var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper == 'clone' ? this.element.clone() : this.element);
10555
10556                 if(!helper.parents('body').length)
10557                         helper.appendTo((o.appendTo == 'parent' ? this.element[0].parentNode : o.appendTo));
10558
10559                 if(helper[0] != this.element[0] && !(/(fixed|absolute)/).test(helper.css("position")))
10560                         helper.css("position", "absolute");
10561
10562                 return helper;
10563
10564         },
10565
10566         _adjustOffsetFromHelper: function(obj) {
10567                 if (typeof obj == 'string') {
10568                         obj = obj.split(' ');
10569                 }
10570                 if ($.isArray(obj)) {
10571                         obj = {left: +obj[0], top: +obj[1] || 0};
10572                 }
10573                 if ('left' in obj) {
10574                         this.offset.click.left = obj.left + this.margins.left;
10575                 }
10576                 if ('right' in obj) {
10577                         this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
10578                 }
10579                 if ('top' in obj) {
10580                         this.offset.click.top = obj.top + this.margins.top;
10581                 }
10582                 if ('bottom' in obj) {
10583                         this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
10584                 }
10585         },
10586
10587         _getParentOffset: function() {
10588
10589                 //Get the offsetParent and cache its position
10590                 this.offsetParent = this.helper.offsetParent();
10591                 var po = this.offsetParent.offset();
10592
10593                 // This is a special case where we need to modify a offset calculated on start, since the following happened:
10594                 // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
10595                 // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
10596                 //    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
10597                 if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {
10598                         po.left += this.scrollParent.scrollLeft();
10599                         po.top += this.scrollParent.scrollTop();
10600                 }
10601
10602                 if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
10603                 || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix
10604                         po = { top: 0, left: 0 };
10605
10606                 return {
10607                         top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
10608                         left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
10609                 };
10610
10611         },
10612
10613         _getRelativeOffset: function() {
10614
10615                 if(this.cssPosition == "relative") {
10616                         var p = this.element.position();
10617                         return {
10618                                 top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
10619                                 left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
10620                         };
10621                 } else {
10622                         return { top: 0, left: 0 };
10623                 }
10624
10625         },
10626
10627         _cacheMargins: function() {
10628                 this.margins = {
10629                         left: (parseInt(this.element.css("marginLeft"),10) || 0),
10630                         top: (parseInt(this.element.css("marginTop"),10) || 0),
10631                         right: (parseInt(this.element.css("marginRight"),10) || 0),
10632                         bottom: (parseInt(this.element.css("marginBottom"),10) || 0)
10633                 };
10634         },
10635
10636         _cacheHelperProportions: function() {
10637                 this.helperProportions = {
10638                         width: this.helper.outerWidth(),
10639                         height: this.helper.outerHeight()
10640                 };
10641         },
10642
10643         _setContainment: function() {
10644
10645                 var o = this.options;
10646                 if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
10647                 if(o.containment == 'document' || o.containment == 'window') this.containment = [
10648                         (o.containment == 'document' ? 0 : $(window).scrollLeft()) - this.offset.relative.left - this.offset.parent.left,
10649                         (o.containment == 'document' ? 0 : $(window).scrollTop()) - this.offset.relative.top - this.offset.parent.top,
10650                         (o.containment == 'document' ? 0 : $(window).scrollLeft()) + $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
10651                         (o.containment == 'document' ? 0 : $(window).scrollTop()) + ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
10652                 ];
10653
10654                 if(!(/^(document|window|parent)$/).test(o.containment) && o.containment.constructor != Array) {
10655                         var ce = $(o.containment)[0]; if(!ce) return;
10656                         var co = $(o.containment).offset();
10657                         var over = ($(ce).css("overflow") != 'hidden');
10658
10659                         this.containment = [
10660                                 co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0),
10661                                 co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0),
10662                                 co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left - this.margins.right,
10663                                 co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top  - this.margins.bottom
10664                         ];
10665                 } else if(o.containment.constructor == Array) {
10666                         this.containment = o.containment;
10667                 }
10668
10669         },
10670
10671         _convertPositionTo: function(d, pos) {
10672
10673                 if(!pos) pos = this.position;
10674                 var mod = d == "absolute" ? 1 : -1;
10675                 var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
10676
10677                 return {
10678                         top: (
10679                                 pos.top                                                                                                                                 // The absolute mouse position
10680                                 + this.offset.relative.top * mod                                                                                // Only for relative positioned nodes: Relative offset from element to offset parent
10681                                 + this.offset.parent.top * mod                                                                                  // The offsetParent's offset without borders (offset + border)
10682                                 - ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
10683                         ),
10684                         left: (
10685                                 pos.left                                                                                                                                // The absolute mouse position
10686                                 + this.offset.relative.left * mod                                                                               // Only for relative positioned nodes: Relative offset from element to offset parent
10687                                 + this.offset.parent.left * mod                                                                                 // The offsetParent's offset without borders (offset + border)
10688                                 - ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
10689                         )
10690                 };
10691
10692         },
10693
10694         _generatePosition: function(event) {
10695
10696                 var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
10697                 var pageX = event.pageX;
10698                 var pageY = event.pageY;
10699
10700                 /*
10701                  * - Position constraining -
10702                  * Constrain the position to a mix of grid, containment.
10703                  */
10704
10705                 if(this.originalPosition) { //If we are not dragging yet, we won't check for options
10706
10707                         if(this.containment) {
10708                                 if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left;
10709                                 if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top;
10710                                 if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left;
10711                                 if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top;
10712                         }
10713
10714                         if(o.grid) {
10715                                 var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
10716                                 pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
10717
10718                                 var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
10719                                 pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
10720                         }
10721
10722                 }
10723
10724                 return {
10725                         top: (
10726                                 pageY                                                                                                                           // The absolute mouse position
10727                                 - this.offset.click.top                                                                                                 // Click offset (relative to the element)
10728                                 - this.offset.relative.top                                                                                              // Only for relative positioned nodes: Relative offset from element to offset parent
10729                                 - this.offset.parent.top                                                                                                // The offsetParent's offset without borders (offset + border)
10730                                 + ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
10731                         ),
10732                         left: (
10733                                 pageX                                                                                                                           // The absolute mouse position
10734                                 - this.offset.click.left                                                                                                // Click offset (relative to the element)
10735                                 - this.offset.relative.left                                                                                             // Only for relative positioned nodes: Relative offset from element to offset parent
10736                                 - this.offset.parent.left                                                                                               // The offsetParent's offset without borders (offset + border)
10737                                 + ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
10738                         )
10739                 };
10740
10741         },
10742
10743         _clear: function() {
10744                 this.helper.removeClass("ui-draggable-dragging");
10745                 if(this.helper[0] != this.element[0] && !this.cancelHelperRemoval) this.helper.remove();
10746                 //if($.ui.ddmanager) $.ui.ddmanager.current = null;
10747                 this.helper = null;
10748                 this.cancelHelperRemoval = false;
10749         },
10750
10751         // From now on bulk stuff - mainly helpers
10752
10753         _trigger: function(type, event, ui) {
10754                 ui = ui || this._uiHash();
10755                 $.ui.plugin.call(this, type, [event, ui]);
10756                 if(type == "drag") this.positionAbs = this._convertPositionTo("absolute"); //The absolute position has to be recalculated after plugins
10757                 return $.Widget.prototype._trigger.call(this, type, event, ui);
10758         },
10759
10760         plugins: {},
10761
10762         _uiHash: function(event) {
10763                 return {
10764                         helper: this.helper,
10765                         position: this.position,
10766                         originalPosition: this.originalPosition,
10767                         offset: this.positionAbs
10768                 };
10769         }
10770
10771 });
10772
10773 $.extend($.ui.draggable, {
10774         version: "1.8.12"
10775 });
10776
10777 $.ui.plugin.add("draggable", "connectToSortable", {
10778         start: function(event, ui) {
10779
10780                 var inst = $(this).data("draggable"), o = inst.options,
10781                         uiSortable = $.extend({}, ui, { item: inst.element });
10782                 inst.sortables = [];
10783                 $(o.connectToSortable).each(function() {
10784                         var sortable = $.data(this, 'sortable');
10785                         if (sortable && !sortable.options.disabled) {
10786                                 inst.sortables.push({
10787                                         instance: sortable,
10788                                         shouldRevert: sortable.options.revert
10789                                 });
10790                                 sortable.refreshPositions();    // Call the sortable's refreshPositions at drag start to refresh the containerCache since the sortable container cache is used in drag and needs to be up to date (this will ensure it's initialised as well as being kept in step with any changes that might have happened on the page).
10791                                 sortable._trigger("activate", event, uiSortable);
10792                         }
10793                 });
10794
10795         },
10796         stop: function(event, ui) {
10797
10798                 //If we are still over the sortable, we fake the stop event of the sortable, but also remove helper
10799                 var inst = $(this).data("draggable"),
10800                         uiSortable = $.extend({}, ui, { item: inst.element });
10801
10802                 $.each(inst.sortables, function() {
10803                         if(this.instance.isOver) {
10804
10805                                 this.instance.isOver = 0;
10806
10807                                 inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance
10808                                 this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work)
10809
10810                                 //The sortable revert is supported, and we have to set a temporary dropped variable on the draggable to support revert: 'valid/invalid'
10811                                 if(this.shouldRevert) this.instance.options.revert = true;
10812
10813                                 //Trigger the stop of the sortable
10814                                 this.instance._mouseStop(event);
10815
10816                                 this.instance.options.helper = this.instance.options._helper;
10817
10818                                 //If the helper has been the original item, restore properties in the sortable
10819                                 if(inst.options.helper == 'original')
10820                                         this.instance.currentItem.css({ top: 'auto', left: 'auto' });
10821
10822                         } else {
10823                                 this.instance.cancelHelperRemoval = false; //Remove the helper in the sortable instance
10824                                 this.instance._trigger("deactivate", event, uiSortable);
10825                         }
10826
10827                 });
10828
10829         },
10830         drag: function(event, ui) {
10831
10832                 var inst = $(this).data("draggable"), self = this;
10833
10834                 var checkPos = function(o) {
10835                         var dyClick = this.offset.click.top, dxClick = this.offset.click.left;
10836                         var helperTop = this.positionAbs.top, helperLeft = this.positionAbs.left;
10837                         var itemHeight = o.height, itemWidth = o.width;
10838                         var itemTop = o.top, itemLeft = o.left;
10839
10840                         return $.ui.isOver(helperTop + dyClick, helperLeft + dxClick, itemTop, itemLeft, itemHeight, itemWidth);
10841                 };
10842
10843                 $.each(inst.sortables, function(i) {
10844                         
10845                         //Copy over some variables to allow calling the sortable's native _intersectsWith
10846                         this.instance.positionAbs = inst.positionAbs;
10847                         this.instance.helperProportions = inst.helperProportions;
10848                         this.instance.offset.click = inst.offset.click;
10849                         
10850                         if(this.instance._intersectsWith(this.instance.containerCache)) {
10851
10852                                 //If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once
10853                                 if(!this.instance.isOver) {
10854
10855                                         this.instance.isOver = 1;
10856                                         //Now we fake the start of dragging for the sortable instance,
10857                                         //by cloning the list group item, appending it to the sortable and using it as inst.currentItem
10858                                         //We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one)
10859                                         this.instance.currentItem = $(self).clone().appendTo(this.instance.element).data("sortable-item", true);
10860                                         this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it
10861                                         this.instance.options.helper = function() { return ui.helper[0]; };
10862
10863                                         event.target = this.instance.currentItem[0];
10864                                         this.instance._mouseCapture(event, true);
10865                                         this.instance._mouseStart(event, true, true);
10866
10867                                         //Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes
10868                                         this.instance.offset.click.top = inst.offset.click.top;
10869                                         this.instance.offset.click.left = inst.offset.click.left;
10870                                         this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left;
10871                                         this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top;
10872
10873                                         inst._trigger("toSortable", event);
10874                                         inst.dropped = this.instance.element; //draggable revert needs that
10875                                         //hack so receive/update callbacks work (mostly)
10876                                         inst.currentItem = inst.element;
10877                                         this.instance.fromOutside = inst;
10878
10879                                 }
10880
10881                                 //Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable
10882                                 if(this.instance.currentItem) this.instance._mouseDrag(event);
10883
10884                         } else {
10885
10886                                 //If it doesn't intersect with the sortable, and it intersected before,
10887                                 //we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval
10888                                 if(this.instance.isOver) {
10889
10890                                         this.instance.isOver = 0;
10891                                         this.instance.cancelHelperRemoval = true;
10892                                         
10893                                         //Prevent reverting on this forced stop
10894                                         this.instance.options.revert = false;
10895                                         
10896                                         // The out event needs to be triggered independently
10897                                         this.instance._trigger('out', event, this.instance._uiHash(this.instance));
10898                                         
10899                                         this.instance._mouseStop(event, true);
10900                                         this.instance.options.helper = this.instance.options._helper;
10901
10902                                         //Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size
10903                                         this.instance.currentItem.remove();
10904                                         if(this.instance.placeholder) this.instance.placeholder.remove();
10905
10906                                         inst._trigger("fromSortable", event);
10907                                         inst.dropped = false; //draggable revert needs that
10908                                 }
10909
10910                         };
10911
10912                 });
10913
10914         }
10915 });
10916
10917 $.ui.plugin.add("draggable", "cursor", {
10918         start: function(event, ui) {
10919                 var t = $('body'), o = $(this).data('draggable').options;
10920                 if (t.css("cursor")) o._cursor = t.css("cursor");
10921                 t.css("cursor", o.cursor);
10922         },
10923         stop: function(event, ui) {
10924                 var o = $(this).data('draggable').options;
10925                 if (o._cursor) $('body').css("cursor", o._cursor);
10926         }
10927 });
10928
10929 $.ui.plugin.add("draggable", "iframeFix", {
10930         start: function(event, ui) {
10931                 var o = $(this).data('draggable').options;
10932                 $(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() {
10933                         $('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>')
10934                         .css({
10935                                 width: this.offsetWidth+"px", height: this.offsetHeight+"px",
10936                                 position: "absolute", opacity: "0.001", zIndex: 1000
10937                         })
10938                         .css($(this).offset())
10939                         .appendTo("body");
10940                 });
10941         },
10942         stop: function(event, ui) {
10943                 $("div.ui-draggable-iframeFix").each(function() { this.parentNode.removeChild(this); }); //Remove frame helpers
10944         }
10945 });
10946
10947 $.ui.plugin.add("draggable", "opacity", {
10948         start: function(event, ui) {
10949                 var t = $(ui.helper), o = $(this).data('draggable').options;
10950                 if(t.css("opacity")) o._opacity = t.css("opacity");
10951                 t.css('opacity', o.opacity);
10952         },
10953         stop: function(event, ui) {
10954                 var o = $(this).data('draggable').options;
10955                 if(o._opacity) $(ui.helper).css('opacity', o._opacity);
10956         }
10957 });
10958
10959 $.ui.plugin.add("draggable", "scroll", {
10960         start: function(event, ui) {
10961                 var i = $(this).data("draggable");
10962                 if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') i.overflowOffset = i.scrollParent.offset();
10963         },
10964         drag: function(event, ui) {
10965
10966                 var i = $(this).data("draggable"), o = i.options, scrolled = false;
10967
10968                 if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') {
10969
10970                         if(!o.axis || o.axis != 'x') {
10971                                 if((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
10972                                         i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed;
10973                                 else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity)
10974                                         i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed;
10975                         }
10976
10977                         if(!o.axis || o.axis != 'y') {
10978                                 if((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
10979                                         i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed;
10980                                 else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity)
10981                                         i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed;
10982                         }
10983
10984                 } else {
10985
10986                         if(!o.axis || o.axis != 'x') {
10987                                 if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
10988                                         scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
10989                                 else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
10990                                         scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
10991                         }
10992
10993                         if(!o.axis || o.axis != 'y') {
10994                                 if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
10995                                         scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
10996                                 else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
10997                                         scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
10998                         }
10999
11000                 }
11001
11002                 if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
11003                         $.ui.ddmanager.prepareOffsets(i, event);
11004
11005         }
11006 });
11007
11008 $.ui.plugin.add("draggable", "snap", {
11009         start: function(event, ui) {
11010
11011                 var i = $(this).data("draggable"), o = i.options;
11012                 i.snapElements = [];
11013
11014                 $(o.snap.constructor != String ? ( o.snap.items || ':data(draggable)' ) : o.snap).each(function() {
11015                         var $t = $(this); var $o = $t.offset();
11016                         if(this != i.element[0]) i.snapElements.push({
11017                                 item: this,
11018                                 width: $t.outerWidth(), height: $t.outerHeight(),
11019                                 top: $o.top, left: $o.left
11020                         });
11021                 });
11022
11023         },
11024         drag: function(event, ui) {
11025
11026                 var inst = $(this).data("draggable"), o = inst.options;
11027                 var d = o.snapTolerance;
11028
11029                 var x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
11030                         y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
11031
11032                 for (var i = inst.snapElements.length - 1; i >= 0; i--){
11033
11034                         var l = inst.snapElements[i].left, r = l + inst.snapElements[i].width,
11035                                 t = inst.snapElements[i].top, b = t + inst.snapElements[i].height;
11036
11037                         //Yes, I know, this is insane ;)
11038                         if(!((l-d < x1 && x1 < r+d && t-d < y1 && y1 < b+d) || (l-d < x1 && x1 < r+d && t-d < y2 && y2 < b+d) || (l-d < x2 && x2 < r+d && t-d < y1 && y1 < b+d) || (l-d < x2 && x2 < r+d && t-d < y2 && y2 < b+d))) {
11039                                 if(inst.snapElements[i].snapping) (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
11040                                 inst.snapElements[i].snapping = false;
11041                                 continue;
11042                         }
11043
11044                         if(o.snapMode != 'inner') {
11045                                 var ts = Math.abs(t - y2) <= d;
11046                                 var bs = Math.abs(b - y1) <= d;
11047                                 var ls = Math.abs(l - x2) <= d;
11048                                 var rs = Math.abs(r - x1) <= d;
11049                                 if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
11050                                 if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top - inst.margins.top;
11051                                 if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left - inst.margins.left;
11052                                 if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left - inst.margins.left;
11053                         }
11054
11055                         var first = (ts || bs || ls || rs);
11056
11057                         if(o.snapMode != 'outer') {
11058                                 var ts = Math.abs(t - y1) <= d;
11059                                 var bs = Math.abs(b - y2) <= d;
11060                                 var ls = Math.abs(l - x1) <= d;
11061                                 var rs = Math.abs(r - x2) <= d;
11062                                 if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top - inst.margins.top;
11063                                 if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
11064                                 if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left - inst.margins.left;
11065                                 if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left - inst.margins.left;
11066                         }
11067
11068                         if(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first))
11069                                 (inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
11070                         inst.snapElements[i].snapping = (ts || bs || ls || rs || first);
11071
11072                 };
11073
11074         }
11075 });
11076
11077 $.ui.plugin.add("draggable", "stack", {
11078         start: function(event, ui) {
11079
11080                 var o = $(this).data("draggable").options;
11081
11082                 var group = $.makeArray($(o.stack)).sort(function(a,b) {
11083                         return (parseInt($(a).css("zIndex"),10) || 0) - (parseInt($(b).css("zIndex"),10) || 0);
11084                 });
11085                 if (!group.length) { return; }
11086                 
11087                 var min = parseInt(group[0].style.zIndex) || 0;
11088                 $(group).each(function(i) {
11089                         this.style.zIndex = min + i;
11090                 });
11091
11092                 this[0].style.zIndex = min + group.length;
11093
11094         }
11095 });
11096
11097 $.ui.plugin.add("draggable", "zIndex", {
11098         start: function(event, ui) {
11099                 var t = $(ui.helper), o = $(this).data("draggable").options;
11100                 if(t.css("zIndex")) o._zIndex = t.css("zIndex");
11101                 t.css('zIndex', o.zIndex);
11102         },
11103         stop: function(event, ui) {
11104                 var o = $(this).data("draggable").options;
11105                 if(o._zIndex) $(ui.helper).css('zIndex', o._zIndex);
11106         }
11107 });
11108
11109 })(jQuery);
11110 /*
11111  * jQuery UI Droppable 1.8.12
11112  *
11113  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
11114  * Dual licensed under the MIT or GPL Version 2 licenses.
11115  * http://jquery.org/license
11116  *
11117  * http://docs.jquery.com/UI/Droppables
11118  *
11119  * Depends:
11120  *      jquery.ui.core.js
11121  *      jquery.ui.widget.js
11122  *      jquery.ui.mouse.js
11123  *      jquery.ui.draggable.js
11124  */
11125 (function( $, undefined ) {
11126
11127 $.widget("ui.droppable", {
11128         widgetEventPrefix: "drop",
11129         options: {
11130                 accept: '*',
11131                 activeClass: false,
11132                 addClasses: true,
11133                 greedy: false,
11134                 hoverClass: false,
11135                 scope: 'default',
11136                 tolerance: 'intersect'
11137         },
11138         _create: function() {
11139
11140                 var o = this.options, accept = o.accept;
11141                 this.isover = 0; this.isout = 1;
11142
11143                 this.accept = $.isFunction(accept) ? accept : function(d) {
11144                         return d.is(accept);
11145                 };
11146
11147                 //Store the droppable's proportions
11148                 this.proportions = { width: this.element[0].offsetWidth, height: this.element[0].offsetHeight };
11149
11150                 // Add the reference and positions to the manager
11151                 $.ui.ddmanager.droppables[o.scope] = $.ui.ddmanager.droppables[o.scope] || [];
11152                 $.ui.ddmanager.droppables[o.scope].push(this);
11153
11154                 (o.addClasses && this.element.addClass("ui-droppable"));
11155
11156         },
11157
11158         destroy: function() {
11159                 var drop = $.ui.ddmanager.droppables[this.options.scope];
11160                 for ( var i = 0; i < drop.length; i++ )
11161                         if ( drop[i] == this )
11162                                 drop.splice(i, 1);
11163
11164                 this.element
11165                         .removeClass("ui-droppable ui-droppable-disabled")
11166                         .removeData("droppable")
11167                         .unbind(".droppable");
11168
11169                 return this;
11170         },
11171
11172         _setOption: function(key, value) {
11173
11174                 if(key == 'accept') {
11175                         this.accept = $.isFunction(value) ? value : function(d) {
11176                                 return d.is(value);
11177                         };
11178                 }
11179                 $.Widget.prototype._setOption.apply(this, arguments);
11180         },
11181
11182         _activate: function(event) {
11183                 var draggable = $.ui.ddmanager.current;
11184                 if(this.options.activeClass) this.element.addClass(this.options.activeClass);
11185                 (draggable && this._trigger('activate', event, this.ui(draggable)));
11186         },
11187
11188         _deactivate: function(event) {
11189                 var draggable = $.ui.ddmanager.current;
11190                 if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
11191                 (draggable && this._trigger('deactivate', event, this.ui(draggable)));
11192         },
11193
11194         _over: function(event) {
11195
11196                 var draggable = $.ui.ddmanager.current;
11197                 if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
11198
11199                 if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
11200                         if(this.options.hoverClass) this.element.addClass(this.options.hoverClass);
11201                         this._trigger('over', event, this.ui(draggable));
11202                 }
11203
11204         },
11205
11206         _out: function(event) {
11207
11208                 var draggable = $.ui.ddmanager.current;
11209                 if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
11210
11211                 if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
11212                         if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
11213                         this._trigger('out', event, this.ui(draggable));
11214                 }
11215
11216         },
11217
11218         _drop: function(event,custom) {
11219
11220                 var draggable = custom || $.ui.ddmanager.current;
11221                 if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return false; // Bail if draggable and droppable are same element
11222
11223                 var childrenIntersection = false;
11224                 this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function() {
11225                         var inst = $.data(this, 'droppable');
11226                         if(
11227                                 inst.options.greedy
11228                                 && !inst.options.disabled
11229                                 && inst.options.scope == draggable.options.scope
11230                                 && inst.accept.call(inst.element[0], (draggable.currentItem || draggable.element))
11231                                 && $.ui.intersect(draggable, $.extend(inst, { offset: inst.element.offset() }), inst.options.tolerance)
11232                         ) { childrenIntersection = true; return false; }
11233                 });
11234                 if(childrenIntersection) return false;
11235
11236                 if(this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
11237                         if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
11238                         if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
11239                         this._trigger('drop', event, this.ui(draggable));
11240                         return this.element;
11241                 }
11242
11243                 return false;
11244
11245         },
11246
11247         ui: function(c) {
11248                 return {
11249                         draggable: (c.currentItem || c.element),
11250                         helper: c.helper,
11251                         position: c.position,
11252                         offset: c.positionAbs
11253                 };
11254         }
11255
11256 });
11257
11258 $.extend($.ui.droppable, {
11259         version: "1.8.12"
11260 });
11261
11262 $.ui.intersect = function(draggable, droppable, toleranceMode) {
11263
11264         if (!droppable.offset) return false;
11265
11266         var x1 = (draggable.positionAbs || draggable.position.absolute).left, x2 = x1 + draggable.helperProportions.width,
11267                 y1 = (draggable.positionAbs || draggable.position.absolute).top, y2 = y1 + draggable.helperProportions.height;
11268         var l = droppable.offset.left, r = l + droppable.proportions.width,
11269                 t = droppable.offset.top, b = t + droppable.proportions.height;
11270
11271         switch (toleranceMode) {
11272                 case 'fit':
11273                         return (l <= x1 && x2 <= r
11274                                 && t <= y1 && y2 <= b);
11275                         break;
11276                 case 'intersect':
11277                         return (l < x1 + (draggable.helperProportions.width / 2) // Right Half
11278                                 && x2 - (draggable.helperProportions.width / 2) < r // Left Half
11279                                 && t < y1 + (draggable.helperProportions.height / 2) // Bottom Half
11280                                 && y2 - (draggable.helperProportions.height / 2) < b ); // Top Half
11281                         break;
11282                 case 'pointer':
11283                         var draggableLeft = ((draggable.positionAbs || draggable.position.absolute).left + (draggable.clickOffset || draggable.offset.click).left),
11284                                 draggableTop = ((draggable.positionAbs || draggable.position.absolute).top + (draggable.clickOffset || draggable.offset.click).top),
11285                                 isOver = $.ui.isOver(draggableTop, draggableLeft, t, l, droppable.proportions.height, droppable.proportions.width);
11286                         return isOver;
11287                         break;
11288                 case 'touch':
11289                         return (
11290                                         (y1 >= t && y1 <= b) || // Top edge touching
11291                                         (y2 >= t && y2 <= b) || // Bottom edge touching
11292                                         (y1 < t && y2 > b)              // Surrounded vertically
11293                                 ) && (
11294                                         (x1 >= l && x1 <= r) || // Left edge touching
11295                                         (x2 >= l && x2 <= r) || // Right edge touching
11296                                         (x1 < l && x2 > r)              // Surrounded horizontally
11297                                 );
11298                         break;
11299                 default:
11300                         return false;
11301                         break;
11302                 }
11303
11304 };
11305
11306 /*
11307         This manager tracks offsets of draggables and droppables
11308 */
11309 $.ui.ddmanager = {
11310         current: null,
11311         droppables: { 'default': [] },
11312         prepareOffsets: function(t, event) {
11313
11314                 var m = $.ui.ddmanager.droppables[t.options.scope] || [];
11315                 var type = event ? event.type : null; // workaround for #2317
11316                 var list = (t.currentItem || t.element).find(":data(droppable)").andSelf();
11317
11318                 droppablesLoop: for (var i = 0; i < m.length; i++) {
11319
11320                         if(m[i].options.disabled || (t && !m[i].accept.call(m[i].element[0],(t.currentItem || t.element)))) continue;   //No disabled and non-accepted
11321                         for (var j=0; j < list.length; j++) { if(list[j] == m[i].element[0]) { m[i].proportions.height = 0; continue droppablesLoop; } }; //Filter out elements in the current dragged item
11322                         m[i].visible = m[i].element.css("display") != "none"; if(!m[i].visible) continue;                                                                       //If the element is not visible, continue
11323
11324                         if(type == "mousedown") m[i]._activate.call(m[i], event); //Activate the droppable if used directly from draggables
11325
11326                         m[i].offset = m[i].element.offset();
11327                         m[i].proportions = { width: m[i].element[0].offsetWidth, height: m[i].element[0].offsetHeight };
11328
11329                 }
11330
11331         },
11332         drop: function(draggable, event) {
11333
11334                 var dropped = false;
11335                 $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
11336
11337                         if(!this.options) return;
11338                         if (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance))
11339                                 dropped = dropped || this._drop.call(this, event);
11340
11341                         if (!this.options.disabled && this.visible && this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
11342                                 this.isout = 1; this.isover = 0;
11343                                 this._deactivate.call(this, event);
11344                         }
11345
11346                 });
11347                 return dropped;
11348
11349         },
11350         drag: function(draggable, event) {
11351
11352                 //If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.
11353                 if(draggable.options.refreshPositions) $.ui.ddmanager.prepareOffsets(draggable, event);
11354
11355                 //Run through all droppables and check their positions based on specific tolerance options
11356                 $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
11357
11358                         if(this.options.disabled || this.greedyChild || !this.visible) return;
11359                         var intersects = $.ui.intersect(draggable, this, this.options.tolerance);
11360
11361                         var c = !intersects && this.isover == 1 ? 'isout' : (intersects && this.isover == 0 ? 'isover' : null);
11362                         if(!c) return;
11363
11364                         var parentInstance;
11365                         if (this.options.greedy) {
11366                                 var parent = this.element.parents(':data(droppable):eq(0)');
11367                                 if (parent.length) {
11368                                         parentInstance = $.data(parent[0], 'droppable');
11369                                         parentInstance.greedyChild = (c == 'isover' ? 1 : 0);
11370                                 }
11371                         }
11372
11373                         // we just moved into a greedy child
11374                         if (parentInstance && c == 'isover') {
11375                                 parentInstance['isover'] = 0;
11376                                 parentInstance['isout'] = 1;
11377                                 parentInstance._out.call(parentInstance, event);
11378                         }
11379
11380                         this[c] = 1; this[c == 'isout' ? 'isover' : 'isout'] = 0;
11381                         this[c == "isover" ? "_over" : "_out"].call(this, event);
11382
11383                         // we just moved out of a greedy child
11384                         if (parentInstance && c == 'isout') {
11385                                 parentInstance['isout'] = 0;
11386                                 parentInstance['isover'] = 1;
11387                                 parentInstance._over.call(parentInstance, event);
11388                         }
11389                 });
11390
11391         }
11392 };
11393
11394 })(jQuery);
11395 /*
11396  * jQuery UI Resizable 1.8.12
11397  *
11398  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
11399  * Dual licensed under the MIT or GPL Version 2 licenses.
11400  * http://jquery.org/license
11401  *
11402  * http://docs.jquery.com/UI/Resizables
11403  *
11404  * Depends:
11405  *      jquery.ui.core.js
11406  *      jquery.ui.mouse.js
11407  *      jquery.ui.widget.js
11408  */
11409 (function( $, undefined ) {
11410
11411 $.widget("ui.resizable", $.ui.mouse, {
11412         widgetEventPrefix: "resize",
11413         options: {
11414                 alsoResize: false,
11415                 animate: false,
11416                 animateDuration: "slow",
11417                 animateEasing: "swing",
11418                 aspectRatio: false,
11419                 autoHide: false,
11420                 containment: false,
11421                 ghost: false,
11422                 grid: false,
11423                 handles: "e,s,se",
11424                 helper: false,
11425                 maxHeight: null,
11426                 maxWidth: null,
11427                 minHeight: 10,
11428                 minWidth: 10,
11429                 zIndex: 1000
11430         },
11431         _create: function() {
11432
11433                 var self = this, o = this.options;
11434                 this.element.addClass("ui-resizable");
11435
11436                 $.extend(this, {
11437                         _aspectRatio: !!(o.aspectRatio),
11438                         aspectRatio: o.aspectRatio,
11439                         originalElement: this.element,
11440                         _proportionallyResizeElements: [],
11441                         _helper: o.helper || o.ghost || o.animate ? o.helper || 'ui-resizable-helper' : null
11442                 });
11443
11444                 //Wrap the element if it cannot hold child nodes
11445                 if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)) {
11446
11447                         //Opera fix for relative positioning
11448                         if (/relative/.test(this.element.css('position')) && $.browser.opera)
11449                                 this.element.css({ position: 'relative', top: 'auto', left: 'auto' });
11450
11451                         //Create a wrapper element and set the wrapper to the new current internal element
11452                         this.element.wrap(
11453                                 $('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({
11454                                         position: this.element.css('position'),
11455                                         width: this.element.outerWidth(),
11456                                         height: this.element.outerHeight(),
11457                                         top: this.element.css('top'),
11458                                         left: this.element.css('left')
11459                                 })
11460                         );
11461
11462                         //Overwrite the original this.element
11463                         this.element = this.element.parent().data(
11464                                 "resizable", this.element.data('resizable')
11465                         );
11466
11467                         this.elementIsWrapper = true;
11468
11469                         //Move margins to the wrapper
11470                         this.element.css({ marginLeft: this.originalElement.css("marginLeft"), marginTop: this.originalElement.css("marginTop"), marginRight: this.originalElement.css("marginRight"), marginBottom: this.originalElement.css("marginBottom") });
11471                         this.originalElement.css({ marginLeft: 0, marginTop: 0, marginRight: 0, marginBottom: 0});
11472
11473                         //Prevent Safari textarea resize
11474                         this.originalResizeStyle = this.originalElement.css('resize');
11475                         this.originalElement.css('resize', 'none');
11476
11477                         //Push the actual element to our proportionallyResize internal array
11478                         this._proportionallyResizeElements.push(this.originalElement.css({ position: 'static', zoom: 1, display: 'block' }));
11479
11480                         // avoid IE jump (hard set the margin)
11481                         this.originalElement.css({ margin: this.originalElement.css('margin') });
11482
11483                         // fix handlers offset
11484                         this._proportionallyResize();
11485
11486                 }
11487
11488                 this.handles = o.handles || (!$('.ui-resizable-handle', this.element).length ? "e,s,se" : { n: '.ui-resizable-n', e: '.ui-resizable-e', s: '.ui-resizable-s', w: '.ui-resizable-w', se: '.ui-resizable-se', sw: '.ui-resizable-sw', ne: '.ui-resizable-ne', nw: '.ui-resizable-nw' });
11489                 if(this.handles.constructor == String) {
11490
11491                         if(this.handles == 'all') this.handles = 'n,e,s,w,se,sw,ne,nw';
11492                         var n = this.handles.split(","); this.handles = {};
11493
11494                         for(var i = 0; i < n.length; i++) {
11495
11496                                 var handle = $.trim(n[i]), hname = 'ui-resizable-'+handle;
11497                                 var axis = $('<div class="ui-resizable-handle ' + hname + '"></div>');
11498
11499                                 // increase zIndex of sw, se, ne, nw axis
11500                                 //TODO : this modifies original option
11501                                 if(/sw|se|ne|nw/.test(handle)) axis.css({ zIndex: ++o.zIndex });
11502
11503                                 //TODO : What's going on here?
11504                                 if ('se' == handle) {
11505                                         axis.addClass('ui-icon ui-icon-gripsmall-diagonal-se');
11506                                 };
11507
11508                                 //Insert into internal handles object and append to element
11509                                 this.handles[handle] = '.ui-resizable-'+handle;
11510                                 this.element.append(axis);
11511                         }
11512
11513                 }
11514
11515                 this._renderAxis = function(target) {
11516
11517                         target = target || this.element;
11518
11519                         for(var i in this.handles) {
11520
11521                                 if(this.handles[i].constructor == String)
11522                                         this.handles[i] = $(this.handles[i], this.element).show();
11523
11524                                 //Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls)
11525                                 if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/textarea|input|select|button/i)) {
11526
11527                                         var axis = $(this.handles[i], this.element), padWrapper = 0;
11528
11529                                         //Checking the correct pad and border
11530                                         padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();
11531
11532                                         //The padding type i have to apply...
11533                                         var padPos = [ 'padding',
11534                                                 /ne|nw|n/.test(i) ? 'Top' :
11535                                                 /se|sw|s/.test(i) ? 'Bottom' :
11536                                                 /^e$/.test(i) ? 'Right' : 'Left' ].join("");
11537
11538                                         target.css(padPos, padWrapper);
11539
11540                                         this._proportionallyResize();
11541
11542                                 }
11543
11544                                 //TODO: What's that good for? There's not anything to be executed left
11545                                 if(!$(this.handles[i]).length)
11546                                         continue;
11547
11548                         }
11549                 };
11550
11551                 //TODO: make renderAxis a prototype function
11552                 this._renderAxis(this.element);
11553
11554                 this._handles = $('.ui-resizable-handle', this.element)
11555                         .disableSelection();
11556
11557                 //Matching axis name
11558                 this._handles.mouseover(function() {
11559                         if (!self.resizing) {
11560                                 if (this.className)
11561                                         var axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
11562                                 //Axis, default = se
11563                                 self.axis = axis && axis[1] ? axis[1] : 'se';
11564                         }
11565                 });
11566
11567                 //If we want to auto hide the elements
11568                 if (o.autoHide) {
11569                         this._handles.hide();
11570                         $(this.element)
11571                                 .addClass("ui-resizable-autohide")
11572                                 .hover(function() {
11573                                         $(this).removeClass("ui-resizable-autohide");
11574                                         self._handles.show();
11575                                 },
11576                                 function(){
11577                                         if (!self.resizing) {
11578                                                 $(this).addClass("ui-resizable-autohide");
11579                                                 self._handles.hide();
11580                                         }
11581                                 });
11582                 }
11583
11584                 //Initialize the mouse interaction
11585                 this._mouseInit();
11586
11587         },
11588
11589         destroy: function() {
11590
11591                 this._mouseDestroy();
11592
11593                 var _destroy = function(exp) {
11594                         $(exp).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing")
11595                                 .removeData("resizable").unbind(".resizable").find('.ui-resizable-handle').remove();
11596                 };
11597
11598                 //TODO: Unwrap at same DOM position
11599                 if (this.elementIsWrapper) {
11600                         _destroy(this.element);
11601                         var wrapper = this.element;
11602                         wrapper.after(
11603                                 this.originalElement.css({
11604                                         position: wrapper.css('position'),
11605                                         width: wrapper.outerWidth(),
11606                                         height: wrapper.outerHeight(),
11607                                         top: wrapper.css('top'),
11608                                         left: wrapper.css('left')
11609                                 })
11610                         ).remove();
11611                 }
11612
11613                 this.originalElement.css('resize', this.originalResizeStyle);
11614                 _destroy(this.originalElement);
11615
11616                 return this;
11617         },
11618
11619         _mouseCapture: function(event) {
11620                 var handle = false;
11621                 for (var i in this.handles) {
11622                         if ($(this.handles[i])[0] == event.target) {
11623                                 handle = true;
11624                         }
11625                 }
11626
11627                 return !this.options.disabled && handle;
11628         },
11629
11630         _mouseStart: function(event) {
11631
11632                 var o = this.options, iniPos = this.element.position(), el = this.element;
11633
11634                 this.resizing = true;
11635                 this.documentScroll = { top: $(document).scrollTop(), left: $(document).scrollLeft() };
11636
11637                 // bugfix for http://dev.jquery.com/ticket/1749
11638                 if (el.is('.ui-draggable') || (/absolute/).test(el.css('position'))) {
11639                         el.css({ position: 'absolute', top: iniPos.top, left: iniPos.left });
11640                 }
11641
11642                 //Opera fixing relative position
11643                 if ($.browser.opera && (/relative/).test(el.css('position')))
11644                         el.css({ position: 'relative', top: 'auto', left: 'auto' });
11645
11646                 this._renderProxy();
11647
11648                 var curleft = num(this.helper.css('left')), curtop = num(this.helper.css('top'));
11649
11650                 if (o.containment) {
11651                         curleft += $(o.containment).scrollLeft() || 0;
11652                         curtop += $(o.containment).scrollTop() || 0;
11653                 }
11654
11655                 //Store needed variables
11656                 this.offset = this.helper.offset();
11657                 this.position = { left: curleft, top: curtop };
11658                 this.size = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
11659                 this.originalSize = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
11660                 this.originalPosition = { left: curleft, top: curtop };
11661                 this.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() };
11662                 this.originalMousePosition = { left: event.pageX, top: event.pageY };
11663
11664                 //Aspect Ratio
11665                 this.aspectRatio = (typeof o.aspectRatio == 'number') ? o.aspectRatio : ((this.originalSize.width / this.originalSize.height) || 1);
11666
11667             var cursor = $('.ui-resizable-' + this.axis).css('cursor');
11668             $('body').css('cursor', cursor == 'auto' ? this.axis + '-resize' : cursor);
11669
11670                 el.addClass("ui-resizable-resizing");
11671                 this._propagate("start", event);
11672                 return true;
11673         },
11674
11675         _mouseDrag: function(event) {
11676
11677                 //Increase performance, avoid regex
11678                 var el = this.helper, o = this.options, props = {},
11679                         self = this, smp = this.originalMousePosition, a = this.axis;
11680
11681                 var dx = (event.pageX-smp.left)||0, dy = (event.pageY-smp.top)||0;
11682                 var trigger = this._change[a];
11683                 if (!trigger) return false;
11684
11685                 // Calculate the attrs that will be change
11686                 var data = trigger.apply(this, [event, dx, dy]), ie6 = $.browser.msie && $.browser.version < 7, csdif = this.sizeDiff;
11687
11688                 if (this._aspectRatio || event.shiftKey)
11689                         data = this._updateRatio(data, event);
11690
11691                 data = this._respectSize(data, event);
11692
11693                 // plugins callbacks need to be called first
11694                 this._propagate("resize", event);
11695
11696                 el.css({
11697                         top: this.position.top + "px", left: this.position.left + "px",
11698                         width: this.size.width + "px", height: this.size.height + "px"
11699                 });
11700
11701                 if (!this._helper && this._proportionallyResizeElements.length)
11702                         this._proportionallyResize();
11703
11704                 this._updateCache(data);
11705
11706                 // calling the user callback at the end
11707                 this._trigger('resize', event, this.ui());
11708
11709                 return false;
11710         },
11711
11712         _mouseStop: function(event) {
11713
11714                 this.resizing = false;
11715                 var o = this.options, self = this;
11716
11717                 if(this._helper) {
11718                         var pr = this._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
11719                                 soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
11720                                 soffsetw = ista ? 0 : self.sizeDiff.width;
11721
11722                         var s = { width: (self.helper.width()  - soffsetw), height: (self.helper.height() - soffseth) },
11723                                 left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
11724                                 top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;
11725
11726                         if (!o.animate)
11727                                 this.element.css($.extend(s, { top: top, left: left }));
11728
11729                         self.helper.height(self.size.height);
11730                         self.helper.width(self.size.width);
11731
11732                         if (this._helper && !o.animate) this._proportionallyResize();
11733                 }
11734
11735                 $('body').css('cursor', 'auto');
11736
11737                 this.element.removeClass("ui-resizable-resizing");
11738
11739                 this._propagate("stop", event);
11740
11741                 if (this._helper) this.helper.remove();
11742                 return false;
11743
11744         },
11745
11746         _updateCache: function(data) {
11747                 var o = this.options;
11748                 this.offset = this.helper.offset();
11749                 if (isNumber(data.left)) this.position.left = data.left;
11750                 if (isNumber(data.top)) this.position.top = data.top;
11751                 if (isNumber(data.height)) this.size.height = data.height;
11752                 if (isNumber(data.width)) this.size.width = data.width;
11753         },
11754
11755         _updateRatio: function(data, event) {
11756
11757                 var o = this.options, cpos = this.position, csize = this.size, a = this.axis;
11758
11759                 if (data.height) data.width = (csize.height * this.aspectRatio);
11760                 else if (data.width) data.height = (csize.width / this.aspectRatio);
11761
11762                 if (a == 'sw') {
11763                         data.left = cpos.left + (csize.width - data.width);
11764                         data.top = null;
11765                 }
11766                 if (a == 'nw') {
11767                         data.top = cpos.top + (csize.height - data.height);
11768                         data.left = cpos.left + (csize.width - data.width);
11769                 }
11770
11771                 return data;
11772         },
11773
11774         _respectSize: function(data, event) {
11775
11776                 var el = this.helper, o = this.options, pRatio = this._aspectRatio || event.shiftKey, a = this.axis,
11777                                 ismaxw = isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width), ismaxh = isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),
11778                                         isminw = isNumber(data.width) && o.minWidth && (o.minWidth > data.width), isminh = isNumber(data.height) && o.minHeight && (o.minHeight > data.height);
11779
11780                 if (isminw) data.width = o.minWidth;
11781                 if (isminh) data.height = o.minHeight;
11782                 if (ismaxw) data.width = o.maxWidth;
11783                 if (ismaxh) data.height = o.maxHeight;
11784
11785                 var dw = this.originalPosition.left + this.originalSize.width, dh = this.position.top + this.size.height;
11786                 var cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);
11787
11788                 if (isminw && cw) data.left = dw - o.minWidth;
11789                 if (ismaxw && cw) data.left = dw - o.maxWidth;
11790                 if (isminh && ch)       data.top = dh - o.minHeight;
11791                 if (ismaxh && ch)       data.top = dh - o.maxHeight;
11792
11793                 // fixing jump error on top/left - bug #2330
11794                 var isNotwh = !data.width && !data.height;
11795                 if (isNotwh && !data.left && data.top) data.top = null;
11796                 else if (isNotwh && !data.top && data.left) data.left = null;
11797
11798                 return data;
11799         },
11800
11801         _proportionallyResize: function() {
11802
11803                 var o = this.options;
11804                 if (!this._proportionallyResizeElements.length) return;
11805                 var element = this.helper || this.element;
11806
11807                 for (var i=0; i < this._proportionallyResizeElements.length; i++) {
11808
11809                         var prel = this._proportionallyResizeElements[i];
11810
11811                         if (!this.borderDif) {
11812                                 var b = [prel.css('borderTopWidth'), prel.css('borderRightWidth'), prel.css('borderBottomWidth'), prel.css('borderLeftWidth')],
11813                                         p = [prel.css('paddingTop'), prel.css('paddingRight'), prel.css('paddingBottom'), prel.css('paddingLeft')];
11814
11815                                 this.borderDif = $.map(b, function(v, i) {
11816                                         var border = parseInt(v,10)||0, padding = parseInt(p[i],10)||0;
11817                                         return border + padding;
11818                                 });
11819                         }
11820
11821                         if ($.browser.msie && !(!($(element).is(':hidden') || $(element).parents(':hidden').length)))
11822                                 continue;
11823
11824                         prel.css({
11825                                 height: (element.height() - this.borderDif[0] - this.borderDif[2]) || 0,
11826                                 width: (element.width() - this.borderDif[1] - this.borderDif[3]) || 0
11827                         });
11828
11829                 };
11830
11831         },
11832
11833         _renderProxy: function() {
11834
11835                 var el = this.element, o = this.options;
11836                 this.elementOffset = el.offset();
11837
11838                 if(this._helper) {
11839
11840                         this.helper = this.helper || $('<div style="overflow:hidden;"></div>');
11841
11842                         // fix ie6 offset TODO: This seems broken
11843                         var ie6 = $.browser.msie && $.browser.version < 7, ie6offset = (ie6 ? 1 : 0),
11844                         pxyoffset = ( ie6 ? 2 : -1 );
11845
11846                         this.helper.addClass(this._helper).css({
11847                                 width: this.element.outerWidth() + pxyoffset,
11848                                 height: this.element.outerHeight() + pxyoffset,
11849                                 position: 'absolute',
11850                                 left: this.elementOffset.left - ie6offset +'px',
11851                                 top: this.elementOffset.top - ie6offset +'px',
11852                                 zIndex: ++o.zIndex //TODO: Don't modify option
11853                         });
11854
11855                         this.helper
11856                                 .appendTo("body")
11857                                 .disableSelection();
11858
11859                 } else {
11860                         this.helper = this.element;
11861                 }
11862
11863         },
11864
11865         _change: {
11866                 e: function(event, dx, dy) {
11867                         return { width: this.originalSize.width + dx };
11868                 },
11869                 w: function(event, dx, dy) {
11870                         var o = this.options, cs = this.originalSize, sp = this.originalPosition;
11871                         return { left: sp.left + dx, width: cs.width - dx };
11872                 },
11873                 n: function(event, dx, dy) {
11874                         var o = this.options, cs = this.originalSize, sp = this.originalPosition;
11875                         return { top: sp.top + dy, height: cs.height - dy };
11876                 },
11877                 s: function(event, dx, dy) {
11878                         return { height: this.originalSize.height + dy };
11879                 },
11880                 se: function(event, dx, dy) {
11881                         return $.extend(this._change.s.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
11882                 },
11883                 sw: function(event, dx, dy) {
11884                         return $.extend(this._change.s.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
11885                 },
11886                 ne: function(event, dx, dy) {
11887                         return $.extend(this._change.n.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
11888                 },
11889                 nw: function(event, dx, dy) {
11890                         return $.extend(this._change.n.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
11891                 }
11892         },
11893
11894         _propagate: function(n, event) {
11895                 $.ui.plugin.call(this, n, [event, this.ui()]);
11896                 (n != "resize" && this._trigger(n, event, this.ui()));
11897         },
11898
11899         plugins: {},
11900
11901         ui: function() {
11902                 return {
11903                         originalElement: this.originalElement,
11904                         element: this.element,
11905                         helper: this.helper,
11906                         position: this.position,
11907                         size: this.size,
11908                         originalSize: this.originalSize,
11909                         originalPosition: this.originalPosition
11910                 };
11911         }
11912
11913 });
11914
11915 $.extend($.ui.resizable, {
11916         version: "1.8.12"
11917 });
11918
11919 /*
11920  * Resizable Extensions
11921  */
11922
11923 $.ui.plugin.add("resizable", "alsoResize", {
11924
11925         start: function (event, ui) {
11926                 var self = $(this).data("resizable"), o = self.options;
11927
11928                 var _store = function (exp) {
11929                         $(exp).each(function() {
11930                                 var el = $(this);
11931                                 el.data("resizable-alsoresize", {
11932                                         width: parseInt(el.width(), 10), height: parseInt(el.height(), 10),
11933                                         left: parseInt(el.css('left'), 10), top: parseInt(el.css('top'), 10),
11934                                         position: el.css('position') // to reset Opera on stop()
11935                                 });
11936                         });
11937                 };
11938
11939                 if (typeof(o.alsoResize) == 'object' && !o.alsoResize.parentNode) {
11940                         if (o.alsoResize.length) { o.alsoResize = o.alsoResize[0]; _store(o.alsoResize); }
11941                         else { $.each(o.alsoResize, function (exp) { _store(exp); }); }
11942                 }else{
11943                         _store(o.alsoResize);
11944                 }
11945         },
11946
11947         resize: function (event, ui) {
11948                 var self = $(this).data("resizable"), o = self.options, os = self.originalSize, op = self.originalPosition;
11949
11950                 var delta = {
11951                         height: (self.size.height - os.height) || 0, width: (self.size.width - os.width) || 0,
11952                         top: (self.position.top - op.top) || 0, left: (self.position.left - op.left) || 0
11953                 },
11954
11955                 _alsoResize = function (exp, c) {
11956                         $(exp).each(function() {
11957                                 var el = $(this), start = $(this).data("resizable-alsoresize"), style = {}, 
11958                                         css = c && c.length ? c : el.parents(ui.originalElement[0]).length ? ['width', 'height'] : ['width', 'height', 'top', 'left'];
11959
11960                                 $.each(css, function (i, prop) {
11961                                         var sum = (start[prop]||0) + (delta[prop]||0);
11962                                         if (sum && sum >= 0)
11963                                                 style[prop] = sum || null;
11964                                 });
11965
11966                                 // Opera fixing relative position
11967                                 if ($.browser.opera && /relative/.test(el.css('position'))) {
11968                                         self._revertToRelativePosition = true;
11969                                         el.css({ position: 'absolute', top: 'auto', left: 'auto' });
11970                                 }
11971
11972                                 el.css(style);
11973                         });
11974                 };
11975
11976                 if (typeof(o.alsoResize) == 'object' && !o.alsoResize.nodeType) {
11977                         $.each(o.alsoResize, function (exp, c) { _alsoResize(exp, c); });
11978                 }else{
11979                         _alsoResize(o.alsoResize);
11980                 }
11981         },
11982
11983         stop: function (event, ui) {
11984                 var self = $(this).data("resizable"), o = self.options;
11985
11986                 var _reset = function (exp) {
11987                         $(exp).each(function() {
11988                                 var el = $(this);
11989                                 // reset position for Opera - no need to verify it was changed
11990                                 el.css({ position: el.data("resizable-alsoresize").position });
11991                         });
11992                 };
11993
11994                 if (self._revertToRelativePosition) {
11995                         self._revertToRelativePosition = false;
11996                         if (typeof(o.alsoResize) == 'object' && !o.alsoResize.nodeType) {
11997                                 $.each(o.alsoResize, function (exp) { _reset(exp); });
11998                         }else{
11999                                 _reset(o.alsoResize);
12000                         }
12001                 }
12002
12003                 $(this).removeData("resizable-alsoresize");
12004         }
12005 });
12006
12007 $.ui.plugin.add("resizable", "animate", {
12008
12009         stop: function(event, ui) {
12010                 var self = $(this).data("resizable"), o = self.options;
12011
12012                 var pr = self._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
12013                                         soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
12014                                                 soffsetw = ista ? 0 : self.sizeDiff.width;
12015
12016                 var style = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) },
12017                                         left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
12018                                                 top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;
12019
12020                 self.element.animate(
12021                         $.extend(style, top && left ? { top: top, left: left } : {}), {
12022                                 duration: o.animateDuration,
12023                                 easing: o.animateEasing,
12024                                 step: function() {
12025
12026                                         var data = {
12027                                                 width: parseInt(self.element.css('width'), 10),
12028                                                 height: parseInt(self.element.css('height'), 10),
12029                                                 top: parseInt(self.element.css('top'), 10),
12030                                                 left: parseInt(self.element.css('left'), 10)
12031                                         };
12032
12033                                         if (pr && pr.length) $(pr[0]).css({ width: data.width, height: data.height });
12034
12035                                         // propagating resize, and updating values for each animation step
12036                                         self._updateCache(data);
12037                                         self._propagate("resize", event);
12038
12039                                 }
12040                         }
12041                 );
12042         }
12043
12044 });
12045
12046 $.ui.plugin.add("resizable", "containment", {
12047
12048         start: function(event, ui) {
12049                 var self = $(this).data("resizable"), o = self.options, el = self.element;
12050                 var oc = o.containment, ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc;
12051                 if (!ce) return;
12052
12053                 self.containerElement = $(ce);
12054
12055                 if (/document/.test(oc) || oc == document) {
12056                         self.containerOffset = { left: 0, top: 0 };
12057                         self.containerPosition = { left: 0, top: 0 };
12058
12059                         self.parentData = {
12060                                 element: $(document), left: 0, top: 0,
12061                                 width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight
12062                         };
12063                 }
12064
12065                 // i'm a node, so compute top, left, right, bottom
12066                 else {
12067                         var element = $(ce), p = [];
12068                         $([ "Top", "Right", "Left", "Bottom" ]).each(function(i, name) { p[i] = num(element.css("padding" + name)); });
12069
12070                         self.containerOffset = element.offset();
12071                         self.containerPosition = element.position();
12072                         self.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) };
12073
12074                         var co = self.containerOffset, ch = self.containerSize.height,  cw = self.containerSize.width,
12075                                                 width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw ), height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch);
12076
12077                         self.parentData = {
12078                                 element: ce, left: co.left, top: co.top, width: width, height: height
12079                         };
12080                 }
12081         },
12082
12083         resize: function(event, ui) {
12084                 var self = $(this).data("resizable"), o = self.options,
12085                                 ps = self.containerSize, co = self.containerOffset, cs = self.size, cp = self.position,
12086                                 pRatio = self._aspectRatio || event.shiftKey, cop = { top:0, left:0 }, ce = self.containerElement;
12087
12088                 if (ce[0] != document && (/static/).test(ce.css('position'))) cop = co;
12089
12090                 if (cp.left < (self._helper ? co.left : 0)) {
12091                         self.size.width = self.size.width + (self._helper ? (self.position.left - co.left) : (self.position.left - cop.left));
12092                         if (pRatio) self.size.height = self.size.width / o.aspectRatio;
12093                         self.position.left = o.helper ? co.left : 0;
12094                 }
12095
12096                 if (cp.top < (self._helper ? co.top : 0)) {
12097                         self.size.height = self.size.height + (self._helper ? (self.position.top - co.top) : self.position.top);
12098                         if (pRatio) self.size.width = self.size.height * o.aspectRatio;
12099                         self.position.top = self._helper ? co.top : 0;
12100                 }
12101
12102                 self.offset.left = self.parentData.left+self.position.left;
12103                 self.offset.top = self.parentData.top+self.position.top;
12104
12105                 var woset = Math.abs( (self._helper ? self.offset.left - cop.left : (self.offset.left - cop.left)) + self.sizeDiff.width ),
12106                                         hoset = Math.abs( (self._helper ? self.offset.top - cop.top : (self.offset.top - co.top)) + self.sizeDiff.height );
12107
12108                 var isParent = self.containerElement.get(0) == self.element.parent().get(0),
12109                     isOffsetRelative = /relative|absolute/.test(self.containerElement.css('position'));
12110
12111                 if(isParent && isOffsetRelative) woset -= self.parentData.left;
12112
12113                 if (woset + self.size.width >= self.parentData.width) {
12114                         self.size.width = self.parentData.width - woset;
12115                         if (pRatio) self.size.height = self.size.width / self.aspectRatio;
12116                 }
12117
12118                 if (hoset + self.size.height >= self.parentData.height) {
12119                         self.size.height = self.parentData.height - hoset;
12120                         if (pRatio) self.size.width = self.size.height * self.aspectRatio;
12121                 }
12122         },
12123
12124         stop: function(event, ui){
12125                 var self = $(this).data("resizable"), o = self.options, cp = self.position,
12126                                 co = self.containerOffset, cop = self.containerPosition, ce = self.containerElement;
12127
12128                 var helper = $(self.helper), ho = helper.offset(), w = helper.outerWidth() - self.sizeDiff.width, h = helper.outerHeight() - self.sizeDiff.height;
12129
12130                 if (self._helper && !o.animate && (/relative/).test(ce.css('position')))
12131                         $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
12132
12133                 if (self._helper && !o.animate && (/static/).test(ce.css('position')))
12134                         $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
12135
12136         }
12137 });
12138
12139 $.ui.plugin.add("resizable", "ghost", {
12140
12141         start: function(event, ui) {
12142
12143                 var self = $(this).data("resizable"), o = self.options, cs = self.size;
12144
12145                 self.ghost = self.originalElement.clone();
12146                 self.ghost
12147                         .css({ opacity: .25, display: 'block', position: 'relative', height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 })
12148                         .addClass('ui-resizable-ghost')
12149                         .addClass(typeof o.ghost == 'string' ? o.ghost : '');
12150
12151                 self.ghost.appendTo(self.helper);
12152
12153         },
12154
12155         resize: function(event, ui){
12156                 var self = $(this).data("resizable"), o = self.options;
12157                 if (self.ghost) self.ghost.css({ position: 'relative', height: self.size.height, width: self.size.width });
12158         },
12159
12160         stop: function(event, ui){
12161                 var self = $(this).data("resizable"), o = self.options;
12162                 if (self.ghost && self.helper) self.helper.get(0).removeChild(self.ghost.get(0));
12163         }
12164
12165 });
12166
12167 $.ui.plugin.add("resizable", "grid", {
12168
12169         resize: function(event, ui) {
12170                 var self = $(this).data("resizable"), o = self.options, cs = self.size, os = self.originalSize, op = self.originalPosition, a = self.axis, ratio = o._aspectRatio || event.shiftKey;
12171                 o.grid = typeof o.grid == "number" ? [o.grid, o.grid] : o.grid;
12172                 var ox = Math.round((cs.width - os.width) / (o.grid[0]||1)) * (o.grid[0]||1), oy = Math.round((cs.height - os.height) / (o.grid[1]||1)) * (o.grid[1]||1);
12173
12174                 if (/^(se|s|e)$/.test(a)) {
12175                         self.size.width = os.width + ox;
12176                         self.size.height = os.height + oy;
12177                 }
12178                 else if (/^(ne)$/.test(a)) {
12179                         self.size.width = os.width + ox;
12180                         self.size.height = os.height + oy;
12181                         self.position.top = op.top - oy;
12182                 }
12183                 else if (/^(sw)$/.test(a)) {
12184                         self.size.width = os.width + ox;
12185                         self.size.height = os.height + oy;
12186                         self.position.left = op.left - ox;
12187                 }
12188                 else {
12189                         self.size.width = os.width + ox;
12190                         self.size.height = os.height + oy;
12191                         self.position.top = op.top - oy;
12192                         self.position.left = op.left - ox;
12193                 }
12194         }
12195
12196 });
12197
12198 var num = function(v) {
12199         return parseInt(v, 10) || 0;
12200 };
12201
12202 var isNumber = function(value) {
12203         return !isNaN(parseInt(value, 10));
12204 };
12205
12206 })(jQuery);
12207 /*
12208  * jQuery UI Selectable 1.8.12
12209  *
12210  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
12211  * Dual licensed under the MIT or GPL Version 2 licenses.
12212  * http://jquery.org/license
12213  *
12214  * http://docs.jquery.com/UI/Selectables
12215  *
12216  * Depends:
12217  *      jquery.ui.core.js
12218  *      jquery.ui.mouse.js
12219  *      jquery.ui.widget.js
12220  */
12221 (function( $, undefined ) {
12222
12223 $.widget("ui.selectable", $.ui.mouse, {
12224         options: {
12225                 appendTo: 'body',
12226                 autoRefresh: true,
12227                 distance: 0,
12228                 filter: '*',
12229                 tolerance: 'touch'
12230         },
12231         _create: function() {
12232                 var self = this;
12233
12234                 this.element.addClass("ui-selectable");
12235
12236                 this.dragged = false;
12237
12238                 // cache selectee children based on filter
12239                 var selectees;
12240                 this.refresh = function() {
12241                         selectees = $(self.options.filter, self.element[0]);
12242                         selectees.each(function() {
12243                                 var $this = $(this);
12244                                 var pos = $this.offset();
12245                                 $.data(this, "selectable-item", {
12246                                         element: this,
12247                                         $element: $this,
12248                                         left: pos.left,
12249                                         top: pos.top,
12250                                         right: pos.left + $this.outerWidth(),
12251                                         bottom: pos.top + $this.outerHeight(),
12252                                         startselected: false,
12253                                         selected: $this.hasClass('ui-selected'),
12254                                         selecting: $this.hasClass('ui-selecting'),
12255                                         unselecting: $this.hasClass('ui-unselecting')
12256                                 });
12257                         });
12258                 };
12259                 this.refresh();
12260
12261                 this.selectees = selectees.addClass("ui-selectee");
12262
12263                 this._mouseInit();
12264
12265                 this.helper = $("<div class='ui-selectable-helper'></div>");
12266         },
12267
12268         destroy: function() {
12269                 this.selectees
12270                         .removeClass("ui-selectee")
12271                         .removeData("selectable-item");
12272                 this.element
12273                         .removeClass("ui-selectable ui-selectable-disabled")
12274                         .removeData("selectable")
12275                         .unbind(".selectable");
12276                 this._mouseDestroy();
12277
12278                 return this;
12279         },
12280
12281         _mouseStart: function(event) {
12282                 var self = this;
12283
12284                 this.opos = [event.pageX, event.pageY];
12285
12286                 if (this.options.disabled)
12287                         return;
12288
12289                 var options = this.options;
12290
12291                 this.selectees = $(options.filter, this.element[0]);
12292
12293                 this._trigger("start", event);
12294
12295                 $(options.appendTo).append(this.helper);
12296                 // position helper (lasso)
12297                 this.helper.css({
12298                         "left": event.clientX,
12299                         "top": event.clientY,
12300                         "width": 0,
12301                         "height": 0
12302                 });
12303
12304                 if (options.autoRefresh) {
12305                         this.refresh();
12306                 }
12307
12308                 this.selectees.filter('.ui-selected').each(function() {
12309                         var selectee = $.data(this, "selectable-item");
12310                         selectee.startselected = true;
12311                         if (!event.metaKey) {
12312                                 selectee.$element.removeClass('ui-selected');
12313                                 selectee.selected = false;
12314                                 selectee.$element.addClass('ui-unselecting');
12315                                 selectee.unselecting = true;
12316                                 // selectable UNSELECTING callback
12317                                 self._trigger("unselecting", event, {
12318                                         unselecting: selectee.element
12319                                 });
12320                         }
12321                 });
12322
12323                 $(event.target).parents().andSelf().each(function() {
12324                         var selectee = $.data(this, "selectable-item");
12325                         if (selectee) {
12326                                 var doSelect = !event.metaKey || !selectee.$element.hasClass('ui-selected');
12327                                 selectee.$element
12328                                         .removeClass(doSelect ? "ui-unselecting" : "ui-selected")
12329                                         .addClass(doSelect ? "ui-selecting" : "ui-unselecting");
12330                                 selectee.unselecting = !doSelect;
12331                                 selectee.selecting = doSelect;
12332                                 selectee.selected = doSelect;
12333                                 // selectable (UN)SELECTING callback
12334                                 if (doSelect) {
12335                                         self._trigger("selecting", event, {
12336                                                 selecting: selectee.element
12337                                         });
12338                                 } else {
12339                                         self._trigger("unselecting", event, {
12340                                                 unselecting: selectee.element
12341                                         });
12342                                 }
12343                                 return false;
12344                         }
12345                 });
12346
12347         },
12348
12349         _mouseDrag: function(event) {
12350                 var self = this;
12351                 this.dragged = true;
12352
12353                 if (this.options.disabled)
12354                         return;
12355
12356                 var options = this.options;
12357
12358                 var x1 = this.opos[0], y1 = this.opos[1], x2 = event.pageX, y2 = event.pageY;
12359                 if (x1 > x2) { var tmp = x2; x2 = x1; x1 = tmp; }
12360                 if (y1 > y2) { var tmp = y2; y2 = y1; y1 = tmp; }
12361                 this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1});
12362
12363                 this.selectees.each(function() {
12364                         var selectee = $.data(this, "selectable-item");
12365                         //prevent helper from being selected if appendTo: selectable
12366                         if (!selectee || selectee.element == self.element[0])
12367                                 return;
12368                         var hit = false;
12369                         if (options.tolerance == 'touch') {
12370                                 hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
12371                         } else if (options.tolerance == 'fit') {
12372                                 hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
12373                         }
12374
12375                         if (hit) {
12376                                 // SELECT
12377                                 if (selectee.selected) {
12378                                         selectee.$element.removeClass('ui-selected');
12379                                         selectee.selected = false;
12380                                 }
12381                                 if (selectee.unselecting) {
12382                                         selectee.$element.removeClass('ui-unselecting');
12383                                         selectee.unselecting = false;
12384                                 }
12385                                 if (!selectee.selecting) {
12386                                         selectee.$element.addClass('ui-selecting');
12387                                         selectee.selecting = true;
12388                                         // selectable SELECTING callback
12389                                         self._trigger("selecting", event, {
12390                                                 selecting: selectee.element
12391                                         });
12392                                 }
12393                         } else {
12394                                 // UNSELECT
12395                                 if (selectee.selecting) {
12396                                         if (event.metaKey && selectee.startselected) {
12397                                                 selectee.$element.removeClass('ui-selecting');
12398                                                 selectee.selecting = false;
12399                                                 selectee.$element.addClass('ui-selected');
12400                                                 selectee.selected = true;
12401                                         } else {
12402                                                 selectee.$element.removeClass('ui-selecting');
12403                                                 selectee.selecting = false;
12404                                                 if (selectee.startselected) {
12405                                                         selectee.$element.addClass('ui-unselecting');
12406                                                         selectee.unselecting = true;
12407                                                 }
12408                                                 // selectable UNSELECTING callback
12409                                                 self._trigger("unselecting", event, {
12410                                                         unselecting: selectee.element
12411                                                 });
12412                                         }
12413                                 }
12414                                 if (selectee.selected) {
12415                                         if (!event.metaKey && !selectee.startselected) {
12416                                                 selectee.$element.removeClass('ui-selected');
12417                                                 selectee.selected = false;
12418
12419                                                 selectee.$element.addClass('ui-unselecting');
12420                                                 selectee.unselecting = true;
12421                                                 // selectable UNSELECTING callback
12422                                                 self._trigger("unselecting", event, {
12423                                                         unselecting: selectee.element
12424                                                 });
12425                                         }
12426                                 }
12427                         }
12428                 });
12429
12430                 return false;
12431         },
12432
12433         _mouseStop: function(event) {
12434                 var self = this;
12435
12436                 this.dragged = false;
12437
12438                 var options = this.options;
12439
12440                 $('.ui-unselecting', this.element[0]).each(function() {
12441                         var selectee = $.data(this, "selectable-item");
12442                         selectee.$element.removeClass('ui-unselecting');
12443                         selectee.unselecting = false;
12444                         selectee.startselected = false;
12445                         self._trigger("unselected", event, {
12446                                 unselected: selectee.element
12447                         });
12448                 });
12449                 $('.ui-selecting', this.element[0]).each(function() {
12450                         var selectee = $.data(this, "selectable-item");
12451                         selectee.$element.removeClass('ui-selecting').addClass('ui-selected');
12452                         selectee.selecting = false;
12453                         selectee.selected = true;
12454                         selectee.startselected = true;
12455                         self._trigger("selected", event, {
12456                                 selected: selectee.element
12457                         });
12458                 });
12459                 this._trigger("stop", event);
12460
12461                 this.helper.remove();
12462
12463                 return false;
12464         }
12465
12466 });
12467
12468 $.extend($.ui.selectable, {
12469         version: "1.8.12"
12470 });
12471
12472 })(jQuery);
12473 /*
12474  * jQuery UI Sortable 1.8.12
12475  *
12476  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
12477  * Dual licensed under the MIT or GPL Version 2 licenses.
12478  * http://jquery.org/license
12479  *
12480  * http://docs.jquery.com/UI/Sortables
12481  *
12482  * Depends:
12483  *      jquery.ui.core.js
12484  *      jquery.ui.mouse.js
12485  *      jquery.ui.widget.js
12486  */
12487 (function( $, undefined ) {
12488
12489 $.widget("ui.sortable", $.ui.mouse, {
12490         widgetEventPrefix: "sort",
12491         options: {
12492                 appendTo: "parent",
12493                 axis: false,
12494                 connectWith: false,
12495                 containment: false,
12496                 cursor: 'auto',
12497                 cursorAt: false,
12498                 dropOnEmpty: true,
12499                 forcePlaceholderSize: false,
12500                 forceHelperSize: false,
12501                 grid: false,
12502                 handle: false,
12503                 helper: "original",
12504                 items: '> *',
12505                 opacity: false,
12506                 placeholder: false,
12507                 revert: false,
12508                 scroll: true,
12509                 scrollSensitivity: 20,
12510                 scrollSpeed: 20,
12511                 scope: "default",
12512                 tolerance: "intersect",
12513                 zIndex: 1000
12514         },
12515         _create: function() {
12516
12517                 var o = this.options;
12518                 this.containerCache = {};
12519                 this.element.addClass("ui-sortable");
12520
12521                 //Get the items
12522                 this.refresh();
12523
12524                 //Let's determine if the items are being displayed horizontally
12525                 this.floating = this.items.length ? (/left|right/).test(this.items[0].item.css('float')) || (/inline|table-cell/).test(this.items[0].item.css('display')) : false;
12526
12527                 //Let's determine the parent's offset
12528                 this.offset = this.element.offset();
12529
12530                 //Initialize mouse events for interaction
12531                 this._mouseInit();
12532
12533         },
12534
12535         destroy: function() {
12536                 this.element
12537                         .removeClass("ui-sortable ui-sortable-disabled")
12538                         .removeData("sortable")
12539                         .unbind(".sortable");
12540                 this._mouseDestroy();
12541
12542                 for ( var i = this.items.length - 1; i >= 0; i-- )
12543                         this.items[i].item.removeData("sortable-item");
12544
12545                 return this;
12546         },
12547
12548         _setOption: function(key, value){
12549                 if ( key === "disabled" ) {
12550                         this.options[ key ] = value;
12551         
12552                         this.widget()
12553                                 [ value ? "addClass" : "removeClass"]( "ui-sortable-disabled" );
12554                 } else {
12555                         // Don't call widget base _setOption for disable as it adds ui-state-disabled class
12556                         $.Widget.prototype._setOption.apply(this, arguments);
12557                 }
12558         },
12559
12560         _mouseCapture: function(event, overrideHandle) {
12561
12562                 if (this.reverting) {
12563                         return false;
12564                 }
12565
12566                 if(this.options.disabled || this.options.type == 'static') return false;
12567
12568                 //We have to refresh the items data once first
12569                 this._refreshItems(event);
12570
12571                 //Find out if the clicked node (or one of its parents) is a actual item in this.items
12572                 var currentItem = null, self = this, nodes = $(event.target).parents().each(function() {
12573                         if($.data(this, 'sortable-item') == self) {
12574                                 currentItem = $(this);
12575                                 return false;
12576                         }
12577                 });
12578                 if($.data(event.target, 'sortable-item') == self) currentItem = $(event.target);
12579
12580                 if(!currentItem) return false;
12581                 if(this.options.handle && !overrideHandle) {
12582                         var validHandle = false;
12583
12584                         $(this.options.handle, currentItem).find("*").andSelf().each(function() { if(this == event.target) validHandle = true; });
12585                         if(!validHandle) return false;
12586                 }
12587
12588                 this.currentItem = currentItem;
12589                 this._removeCurrentsFromItems();
12590                 return true;
12591
12592         },
12593
12594         _mouseStart: function(event, overrideHandle, noActivation) {
12595
12596                 var o = this.options, self = this;
12597                 this.currentContainer = this;
12598
12599                 //We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
12600                 this.refreshPositions();
12601
12602                 //Create and append the visible helper
12603                 this.helper = this._createHelper(event);
12604
12605                 //Cache the helper size
12606                 this._cacheHelperProportions();
12607
12608                 /*
12609                  * - Position generation -
12610                  * This block generates everything position related - it's the core of draggables.
12611                  */
12612
12613                 //Cache the margins of the original element
12614                 this._cacheMargins();
12615
12616                 //Get the next scrolling parent
12617                 this.scrollParent = this.helper.scrollParent();
12618
12619                 //The element's absolute position on the page minus margins
12620                 this.offset = this.currentItem.offset();
12621                 this.offset = {
12622                         top: this.offset.top - this.margins.top,
12623                         left: this.offset.left - this.margins.left
12624                 };
12625
12626                 // Only after we got the offset, we can change the helper's position to absolute
12627                 // TODO: Still need to figure out a way to make relative sorting possible
12628                 this.helper.css("position", "absolute");
12629                 this.cssPosition = this.helper.css("position");
12630
12631                 $.extend(this.offset, {
12632                         click: { //Where the click happened, relative to the element
12633                                 left: event.pageX - this.offset.left,
12634                                 top: event.pageY - this.offset.top
12635                         },
12636                         parent: this._getParentOffset(),
12637                         relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
12638                 });
12639
12640                 //Generate the original position
12641                 this.originalPosition = this._generatePosition(event);
12642                 this.originalPageX = event.pageX;
12643                 this.originalPageY = event.pageY;
12644
12645                 //Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
12646                 (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
12647
12648                 //Cache the former DOM position
12649                 this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };
12650
12651                 //If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way
12652                 if(this.helper[0] != this.currentItem[0]) {
12653                         this.currentItem.hide();
12654                 }
12655
12656                 //Create the placeholder
12657                 this._createPlaceholder();
12658
12659                 //Set a containment if given in the options
12660                 if(o.containment)
12661                         this._setContainment();
12662
12663                 if(o.cursor) { // cursor option
12664                         if ($('body').css("cursor")) this._storedCursor = $('body').css("cursor");
12665                         $('body').css("cursor", o.cursor);
12666                 }
12667
12668                 if(o.opacity) { // opacity option
12669                         if (this.helper.css("opacity")) this._storedOpacity = this.helper.css("opacity");
12670                         this.helper.css("opacity", o.opacity);
12671                 }
12672
12673                 if(o.zIndex) { // zIndex option
12674                         if (this.helper.css("zIndex")) this._storedZIndex = this.helper.css("zIndex");
12675                         this.helper.css("zIndex", o.zIndex);
12676                 }
12677
12678                 //Prepare scrolling
12679                 if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML')
12680                         this.overflowOffset = this.scrollParent.offset();
12681
12682                 //Call callbacks
12683                 this._trigger("start", event, this._uiHash());
12684
12685                 //Recache the helper size
12686                 if(!this._preserveHelperProportions)
12687                         this._cacheHelperProportions();
12688
12689
12690                 //Post 'activate' events to possible containers
12691                 if(!noActivation) {
12692                          for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i]._trigger("activate", event, self._uiHash(this)); }
12693                 }
12694
12695                 //Prepare possible droppables
12696                 if($.ui.ddmanager)
12697                         $.ui.ddmanager.current = this;
12698
12699                 if ($.ui.ddmanager && !o.dropBehaviour)
12700                         $.ui.ddmanager.prepareOffsets(this, event);
12701
12702                 this.dragging = true;
12703
12704                 this.helper.addClass("ui-sortable-helper");
12705                 this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position
12706                 return true;
12707
12708         },
12709
12710         _mouseDrag: function(event) {
12711
12712                 //Compute the helpers position
12713                 this.position = this._generatePosition(event);
12714                 this.positionAbs = this._convertPositionTo("absolute");
12715
12716                 if (!this.lastPositionAbs) {
12717                         this.lastPositionAbs = this.positionAbs;
12718                 }
12719
12720                 //Do scrolling
12721                 if(this.options.scroll) {
12722                         var o = this.options, scrolled = false;
12723                         if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML') {
12724
12725                                 if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
12726                                         this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
12727                                 else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity)
12728                                         this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
12729
12730                                 if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
12731                                         this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
12732                                 else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity)
12733                                         this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
12734
12735                         } else {
12736
12737                                 if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
12738                                         scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
12739                                 else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
12740                                         scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
12741
12742                                 if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
12743                                         scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
12744                                 else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
12745                                         scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
12746
12747                         }
12748
12749                         if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
12750                                 $.ui.ddmanager.prepareOffsets(this, event);
12751                 }
12752
12753                 //Regenerate the absolute position used for position checks
12754                 this.positionAbs = this._convertPositionTo("absolute");
12755
12756                 //Set the helper position
12757                 if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
12758                 if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
12759
12760                 //Rearrange
12761                 for (var i = this.items.length - 1; i >= 0; i--) {
12762
12763                         //Cache variables and intersection, continue if no intersection
12764                         var item = this.items[i], itemElement = item.item[0], intersection = this._intersectsWithPointer(item);
12765                         if (!intersection) continue;
12766
12767                         if(itemElement != this.currentItem[0] //cannot intersect with itself
12768                                 &&      this.placeholder[intersection == 1 ? "next" : "prev"]()[0] != itemElement //no useless actions that have been done before
12769                                 &&      !$.ui.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked
12770                                 && (this.options.type == 'semi-dynamic' ? !$.ui.contains(this.element[0], itemElement) : true)
12771                                 //&& itemElement.parentNode == this.placeholder[0].parentNode // only rearrange items within the same container
12772                         ) {
12773
12774                                 this.direction = intersection == 1 ? "down" : "up";
12775
12776                                 if (this.options.tolerance == "pointer" || this._intersectsWithSides(item)) {
12777                                         this._rearrange(event, item);
12778                                 } else {
12779                                         break;
12780                                 }
12781
12782                                 this._trigger("change", event, this._uiHash());
12783                                 break;
12784                         }
12785                 }
12786
12787                 //Post events to containers
12788                 this._contactContainers(event);
12789
12790                 //Interconnect with droppables
12791                 if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
12792
12793                 //Call callbacks
12794                 this._trigger('sort', event, this._uiHash());
12795
12796                 this.lastPositionAbs = this.positionAbs;
12797                 return false;
12798
12799         },
12800
12801         _mouseStop: function(event, noPropagation) {
12802
12803                 if(!event) return;
12804
12805                 //If we are using droppables, inform the manager about the drop
12806                 if ($.ui.ddmanager && !this.options.dropBehaviour)
12807                         $.ui.ddmanager.drop(this, event);
12808
12809                 if(this.options.revert) {
12810                         var self = this;
12811                         var cur = self.placeholder.offset();
12812
12813                         self.reverting = true;
12814
12815                         $(this.helper).animate({
12816                                 left: cur.left - this.offset.parent.left - self.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft),
12817                                 top: cur.top - this.offset.parent.top - self.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop)
12818                         }, parseInt(this.options.revert, 10) || 500, function() {
12819                                 self._clear(event);
12820                         });
12821                 } else {
12822                         this._clear(event, noPropagation);
12823                 }
12824
12825                 return false;
12826
12827         },
12828
12829         cancel: function() {
12830
12831                 var self = this;
12832
12833                 if(this.dragging) {
12834
12835                         this._mouseUp({ target: null });
12836
12837                         if(this.options.helper == "original")
12838                                 this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
12839                         else
12840                                 this.currentItem.show();
12841
12842                         //Post deactivating events to containers
12843                         for (var i = this.containers.length - 1; i >= 0; i--){
12844                                 this.containers[i]._trigger("deactivate", null, self._uiHash(this));
12845                                 if(this.containers[i].containerCache.over) {
12846                                         this.containers[i]._trigger("out", null, self._uiHash(this));
12847                                         this.containers[i].containerCache.over = 0;
12848                                 }
12849                         }
12850
12851                 }
12852
12853                 if (this.placeholder) {
12854                         //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
12855                         if(this.placeholder[0].parentNode) this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
12856                         if(this.options.helper != "original" && this.helper && this.helper[0].parentNode) this.helper.remove();
12857
12858                         $.extend(this, {
12859                                 helper: null,
12860                                 dragging: false,
12861                                 reverting: false,
12862                                 _noFinalSort: null
12863                         });
12864
12865                         if(this.domPosition.prev) {
12866                                 $(this.domPosition.prev).after(this.currentItem);
12867                         } else {
12868                                 $(this.domPosition.parent).prepend(this.currentItem);
12869                         }
12870                 }
12871
12872                 return this;
12873
12874         },
12875
12876         serialize: function(o) {
12877
12878                 var items = this._getItemsAsjQuery(o && o.connected);
12879                 var str = []; o = o || {};
12880
12881                 $(items).each(function() {
12882                         var res = ($(o.item || this).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/));
12883                         if(res) str.push((o.key || res[1]+'[]')+'='+(o.key && o.expression ? res[1] : res[2]));
12884                 });
12885
12886                 if(!str.length && o.key) {
12887                         str.push(o.key + '=');
12888                 }
12889
12890                 return str.join('&');
12891
12892         },
12893
12894         toArray: function(o) {
12895
12896                 var items = this._getItemsAsjQuery(o && o.connected);
12897                 var ret = []; o = o || {};
12898
12899                 items.each(function() { ret.push($(o.item || this).attr(o.attribute || 'id') || ''); });
12900                 return ret;
12901
12902         },
12903
12904         /* Be careful with the following core functions */
12905         _intersectsWith: function(item) {
12906
12907                 var x1 = this.positionAbs.left,
12908                         x2 = x1 + this.helperProportions.width,
12909                         y1 = this.positionAbs.top,
12910                         y2 = y1 + this.helperProportions.height;
12911
12912                 var l = item.left,
12913                         r = l + item.width,
12914                         t = item.top,
12915                         b = t + item.height;
12916
12917                 var dyClick = this.offset.click.top,
12918                         dxClick = this.offset.click.left;
12919
12920                 var isOverElement = (y1 + dyClick) > t && (y1 + dyClick) < b && (x1 + dxClick) > l && (x1 + dxClick) < r;
12921
12922                 if(        this.options.tolerance == "pointer"
12923                         || this.options.forcePointerForContainers
12924                         || (this.options.tolerance != "pointer" && this.helperProportions[this.floating ? 'width' : 'height'] > item[this.floating ? 'width' : 'height'])
12925                 ) {
12926                         return isOverElement;
12927                 } else {
12928
12929                         return (l < x1 + (this.helperProportions.width / 2) // Right Half
12930                                 && x2 - (this.helperProportions.width / 2) < r // Left Half
12931                                 && t < y1 + (this.helperProportions.height / 2) // Bottom Half
12932                                 && y2 - (this.helperProportions.height / 2) < b ); // Top Half
12933
12934                 }
12935         },
12936
12937         _intersectsWithPointer: function(item) {
12938
12939                 var isOverElementHeight = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
12940                         isOverElementWidth = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
12941                         isOverElement = isOverElementHeight && isOverElementWidth,
12942                         verticalDirection = this._getDragVerticalDirection(),
12943                         horizontalDirection = this._getDragHorizontalDirection();
12944
12945                 if (!isOverElement)
12946                         return false;
12947
12948                 return this.floating ?
12949                         ( ((horizontalDirection && horizontalDirection == "right") || verticalDirection == "down") ? 2 : 1 )
12950                         : ( verticalDirection && (verticalDirection == "down" ? 2 : 1) );
12951
12952         },
12953
12954         _intersectsWithSides: function(item) {
12955
12956                 var isOverBottomHalf = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),
12957                         isOverRightHalf = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
12958                         verticalDirection = this._getDragVerticalDirection(),
12959                         horizontalDirection = this._getDragHorizontalDirection();
12960
12961                 if (this.floating && horizontalDirection) {
12962                         return ((horizontalDirection == "right" && isOverRightHalf) || (horizontalDirection == "left" && !isOverRightHalf));
12963                 } else {
12964                         return verticalDirection && ((verticalDirection == "down" && isOverBottomHalf) || (verticalDirection == "up" && !isOverBottomHalf));
12965                 }
12966
12967         },
12968
12969         _getDragVerticalDirection: function() {
12970                 var delta = this.positionAbs.top - this.lastPositionAbs.top;
12971                 return delta != 0 && (delta > 0 ? "down" : "up");
12972         },
12973
12974         _getDragHorizontalDirection: function() {
12975                 var delta = this.positionAbs.left - this.lastPositionAbs.left;
12976                 return delta != 0 && (delta > 0 ? "right" : "left");
12977         },
12978
12979         refresh: function(event) {
12980                 this._refreshItems(event);
12981                 this.refreshPositions();
12982                 return this;
12983         },
12984
12985         _connectWith: function() {
12986                 var options = this.options;
12987                 return options.connectWith.constructor == String
12988                         ? [options.connectWith]
12989                         : options.connectWith;
12990         },
12991         
12992         _getItemsAsjQuery: function(connected) {
12993
12994                 var self = this;
12995                 var items = [];
12996                 var queries = [];
12997                 var connectWith = this._connectWith();
12998
12999                 if(connectWith && connected) {
13000                         for (var i = connectWith.length - 1; i >= 0; i--){
13001                                 var cur = $(connectWith[i]);
13002                                 for (var j = cur.length - 1; j >= 0; j--){
13003                                         var inst = $.data(cur[j], 'sortable');
13004                                         if(inst && inst != this && !inst.options.disabled) {
13005                                                 queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), inst]);
13006                                         }
13007                                 };
13008                         };
13009                 }
13010
13011                 queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), this]);
13012
13013                 for (var i = queries.length - 1; i >= 0; i--){
13014                         queries[i][0].each(function() {
13015                                 items.push(this);
13016                         });
13017                 };
13018
13019                 return $(items);
13020
13021         },
13022
13023         _removeCurrentsFromItems: function() {
13024
13025                 var list = this.currentItem.find(":data(sortable-item)");
13026
13027                 for (var i=0; i < this.items.length; i++) {
13028
13029                         for (var j=0; j < list.length; j++) {
13030                                 if(list[j] == this.items[i].item[0])
13031                                         this.items.splice(i,1);
13032                         };
13033
13034                 };
13035
13036         },
13037
13038         _refreshItems: function(event) {
13039
13040                 this.items = [];
13041                 this.containers = [this];
13042                 var items = this.items;
13043                 var self = this;
13044                 var queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]];
13045                 var connectWith = this._connectWith();
13046
13047                 if(connectWith) {
13048                         for (var i = connectWith.length - 1; i >= 0; i--){
13049                                 var cur = $(connectWith[i]);
13050                                 for (var j = cur.length - 1; j >= 0; j--){
13051                                         var inst = $.data(cur[j], 'sortable');
13052                                         if(inst && inst != this && !inst.options.disabled) {
13053                                                 queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);
13054                                                 this.containers.push(inst);
13055                                         }
13056                                 };
13057                         };
13058                 }
13059
13060                 for (var i = queries.length - 1; i >= 0; i--) {
13061                         var targetData = queries[i][1];
13062                         var _queries = queries[i][0];
13063
13064                         for (var j=0, queriesLength = _queries.length; j < queriesLength; j++) {
13065                                 var item = $(_queries[j]);
13066
13067                                 item.data('sortable-item', targetData); // Data for target checking (mouse manager)
13068
13069                                 items.push({
13070                                         item: item,
13071                                         instance: targetData,
13072                                         width: 0, height: 0,
13073                                         left: 0, top: 0
13074                                 });
13075                         };
13076                 };
13077
13078         },
13079
13080         refreshPositions: function(fast) {
13081
13082                 //This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
13083                 if(this.offsetParent && this.helper) {
13084                         this.offset.parent = this._getParentOffset();
13085                 }
13086
13087                 for (var i = this.items.length - 1; i >= 0; i--){
13088                         var item = this.items[i];
13089
13090                         //We ignore calculating positions of all connected containers when we're not over them
13091                         if(item.instance != this.currentContainer && this.currentContainer && item.item[0] != this.currentItem[0])
13092                                 continue;
13093
13094                         var t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;
13095
13096                         if (!fast) {
13097                                 item.width = t.outerWidth();
13098                                 item.height = t.outerHeight();
13099                         }
13100
13101                         var p = t.offset();
13102                         item.left = p.left;
13103                         item.top = p.top;
13104                 };
13105
13106                 if(this.options.custom && this.options.custom.refreshContainers) {
13107                         this.options.custom.refreshContainers.call(this);
13108                 } else {
13109                         for (var i = this.containers.length - 1; i >= 0; i--){
13110                                 var p = this.containers[i].element.offset();
13111                                 this.containers[i].containerCache.left = p.left;
13112                                 this.containers[i].containerCache.top = p.top;
13113                                 this.containers[i].containerCache.width = this.containers[i].element.outerWidth();
13114                                 this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
13115                         };
13116                 }
13117
13118                 return this;
13119         },
13120
13121         _createPlaceholder: function(that) {
13122
13123                 var self = that || this, o = self.options;
13124
13125                 if(!o.placeholder || o.placeholder.constructor == String) {
13126                         var className = o.placeholder;
13127                         o.placeholder = {
13128                                 element: function() {
13129
13130                                         var el = $(document.createElement(self.currentItem[0].nodeName))
13131                                                 .addClass(className || self.currentItem[0].className+" ui-sortable-placeholder")
13132                                                 .removeClass("ui-sortable-helper")[0];
13133
13134                                         if(!className)
13135                                                 el.style.visibility = "hidden";
13136
13137                                         return el;
13138                                 },
13139                                 update: function(container, p) {
13140
13141                                         // 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
13142                                         // 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
13143                                         if(className && !o.forcePlaceholderSize) return;
13144
13145                                         //If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item
13146                                         if(!p.height()) { p.height(self.currentItem.innerHeight() - parseInt(self.currentItem.css('paddingTop')||0, 10) - parseInt(self.currentItem.css('paddingBottom')||0, 10)); };
13147                                         if(!p.width()) { p.width(self.currentItem.innerWidth() - parseInt(self.currentItem.css('paddingLeft')||0, 10) - parseInt(self.currentItem.css('paddingRight')||0, 10)); };
13148                                 }
13149                         };
13150                 }
13151
13152                 //Create the placeholder
13153                 self.placeholder = $(o.placeholder.element.call(self.element, self.currentItem));
13154
13155                 //Append it after the actual current item
13156                 self.currentItem.after(self.placeholder);
13157
13158                 //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
13159                 o.placeholder.update(self, self.placeholder);
13160
13161         },
13162
13163         _contactContainers: function(event) {
13164                 
13165                 // get innermost container that intersects with item 
13166                 var innermostContainer = null, innermostIndex = null;           
13167                 
13168                 
13169                 for (var i = this.containers.length - 1; i >= 0; i--){
13170
13171                         // never consider a container that's located within the item itself 
13172                         if($.ui.contains(this.currentItem[0], this.containers[i].element[0]))
13173                                 continue;
13174
13175                         if(this._intersectsWith(this.containers[i].containerCache)) {
13176
13177                                 // if we've already found a container and it's more "inner" than this, then continue 
13178                                 if(innermostContainer && $.ui.contains(this.containers[i].element[0], innermostContainer.element[0]))
13179                                         continue;
13180
13181                                 innermostContainer = this.containers[i]; 
13182                                 innermostIndex = i;
13183                                         
13184                         } else {
13185                                 // container doesn't intersect. trigger "out" event if necessary 
13186                                 if(this.containers[i].containerCache.over) {
13187                                         this.containers[i]._trigger("out", event, this._uiHash(this));
13188                                         this.containers[i].containerCache.over = 0;
13189                                 }
13190                         }
13191
13192                 }
13193                 
13194                 // if no intersecting containers found, return 
13195                 if(!innermostContainer) return; 
13196
13197                 // move the item into the container if it's not there already
13198                 if(this.containers.length === 1) {
13199                         this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
13200                         this.containers[innermostIndex].containerCache.over = 1;
13201                 } else if(this.currentContainer != this.containers[innermostIndex]) { 
13202
13203                         //When entering a new container, we will find the item with the least distance and append our item near it 
13204                         var dist = 10000; var itemWithLeastDistance = null; var base = this.positionAbs[this.containers[innermostIndex].floating ? 'left' : 'top']; 
13205                         for (var j = this.items.length - 1; j >= 0; j--) { 
13206                                 if(!$.ui.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue; 
13207                                 var cur = this.items[j][this.containers[innermostIndex].floating ? 'left' : 'top']; 
13208                                 if(Math.abs(cur - base) < dist) { 
13209                                         dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j]; 
13210                                 } 
13211                         } 
13212
13213                         if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled 
13214                                 return; 
13215
13216                         this.currentContainer = this.containers[innermostIndex]; 
13217                         itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true); 
13218                         this._trigger("change", event, this._uiHash()); 
13219                         this.containers[innermostIndex]._trigger("change", event, this._uiHash(this)); 
13220
13221                         //Update the placeholder 
13222                         this.options.placeholder.update(this.currentContainer, this.placeholder); 
13223                 
13224                         this.containers[innermostIndex]._trigger("over", event, this._uiHash(this)); 
13225                         this.containers[innermostIndex].containerCache.over = 1;
13226                 } 
13227         
13228                 
13229         },
13230
13231         _createHelper: function(event) {
13232
13233                 var o = this.options;
13234                 var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper == 'clone' ? this.currentItem.clone() : this.currentItem);
13235
13236                 if(!helper.parents('body').length) //Add the helper to the DOM if that didn't happen already
13237                         $(o.appendTo != 'parent' ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);
13238
13239                 if(helper[0] == this.currentItem[0])
13240                         this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") };
13241
13242                 if(helper[0].style.width == '' || o.forceHelperSize) helper.width(this.currentItem.width());
13243                 if(helper[0].style.height == '' || o.forceHelperSize) helper.height(this.currentItem.height());
13244
13245                 return helper;
13246
13247         },
13248
13249         _adjustOffsetFromHelper: function(obj) {
13250                 if (typeof obj == 'string') {
13251                         obj = obj.split(' ');
13252                 }
13253                 if ($.isArray(obj)) {
13254                         obj = {left: +obj[0], top: +obj[1] || 0};
13255                 }
13256                 if ('left' in obj) {
13257                         this.offset.click.left = obj.left + this.margins.left;
13258                 }
13259                 if ('right' in obj) {
13260                         this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
13261                 }
13262                 if ('top' in obj) {
13263                         this.offset.click.top = obj.top + this.margins.top;
13264                 }
13265                 if ('bottom' in obj) {
13266                         this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
13267                 }
13268         },
13269
13270         _getParentOffset: function() {
13271
13272
13273                 //Get the offsetParent and cache its position
13274                 this.offsetParent = this.helper.offsetParent();
13275                 var po = this.offsetParent.offset();
13276
13277                 // This is a special case where we need to modify a offset calculated on start, since the following happened:
13278                 // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
13279                 // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
13280                 //    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
13281                 if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {
13282                         po.left += this.scrollParent.scrollLeft();
13283                         po.top += this.scrollParent.scrollTop();
13284                 }
13285
13286                 if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
13287                 || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix
13288                         po = { top: 0, left: 0 };
13289
13290                 return {
13291                         top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
13292                         left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
13293                 };
13294
13295         },
13296
13297         _getRelativeOffset: function() {
13298
13299                 if(this.cssPosition == "relative") {
13300                         var p = this.currentItem.position();
13301                         return {
13302                                 top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
13303                                 left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
13304                         };
13305                 } else {
13306                         return { top: 0, left: 0 };
13307                 }
13308
13309         },
13310
13311         _cacheMargins: function() {
13312                 this.margins = {
13313                         left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
13314                         top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
13315                 };
13316         },
13317
13318         _cacheHelperProportions: function() {
13319                 this.helperProportions = {
13320                         width: this.helper.outerWidth(),
13321                         height: this.helper.outerHeight()
13322                 };
13323         },
13324
13325         _setContainment: function() {
13326
13327                 var o = this.options;
13328                 if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
13329                 if(o.containment == 'document' || o.containment == 'window') this.containment = [
13330                         0 - this.offset.relative.left - this.offset.parent.left,
13331                         0 - this.offset.relative.top - this.offset.parent.top,
13332                         $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
13333                         ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
13334                 ];
13335
13336                 if(!(/^(document|window|parent)$/).test(o.containment)) {
13337                         var ce = $(o.containment)[0];
13338                         var co = $(o.containment).offset();
13339                         var over = ($(ce).css("overflow") != 'hidden');
13340
13341                         this.containment = [
13342                                 co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
13343                                 co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
13344                                 co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
13345                                 co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
13346                         ];
13347                 }
13348
13349         },
13350
13351         _convertPositionTo: function(d, pos) {
13352
13353                 if(!pos) pos = this.position;
13354                 var mod = d == "absolute" ? 1 : -1;
13355                 var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
13356
13357                 return {
13358                         top: (
13359                                 pos.top                                                                                                                                 // The absolute mouse position
13360                                 + this.offset.relative.top * mod                                                                                // Only for relative positioned nodes: Relative offset from element to offset parent
13361                                 + this.offset.parent.top * mod                                                                                  // The offsetParent's offset without borders (offset + border)
13362                                 - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
13363                         ),
13364                         left: (
13365                                 pos.left                                                                                                                                // The absolute mouse position
13366                                 + this.offset.relative.left * mod                                                                               // Only for relative positioned nodes: Relative offset from element to offset parent
13367                                 + this.offset.parent.left * mod                                                                                 // The offsetParent's offset without borders (offset + border)
13368                                 - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
13369                         )
13370                 };
13371
13372         },
13373
13374         _generatePosition: function(event) {
13375
13376                 var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
13377
13378                 // This is another very weird special case that only happens for relative elements:
13379                 // 1. If the css position is relative
13380                 // 2. and the scroll parent is the document or similar to the offset parent
13381                 // we have to refresh the relative offset during the scroll so there are no jumps
13382                 if(this.cssPosition == 'relative' && !(this.scrollParent[0] != document && this.scrollParent[0] != this.offsetParent[0])) {
13383                         this.offset.relative = this._getRelativeOffset();
13384                 }
13385
13386                 var pageX = event.pageX;
13387                 var pageY = event.pageY;
13388
13389                 /*
13390                  * - Position constraining -
13391                  * Constrain the position to a mix of grid, containment.
13392                  */
13393
13394                 if(this.originalPosition) { //If we are not dragging yet, we won't check for options
13395
13396                         if(this.containment) {
13397                                 if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left;
13398                                 if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top;
13399                                 if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left;
13400                                 if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top;
13401                         }
13402
13403                         if(o.grid) {
13404                                 var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
13405                                 pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
13406
13407                                 var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
13408                                 pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
13409                         }
13410
13411                 }
13412
13413                 return {
13414                         top: (
13415                                 pageY                                                                                                                           // The absolute mouse position
13416                                 - this.offset.click.top                                                                                                 // Click offset (relative to the element)
13417                                 - this.offset.relative.top                                                                                              // Only for relative positioned nodes: Relative offset from element to offset parent
13418                                 - this.offset.parent.top                                                                                                // The offsetParent's offset without borders (offset + border)
13419                                 + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
13420                         ),
13421                         left: (
13422                                 pageX                                                                                                                           // The absolute mouse position
13423                                 - this.offset.click.left                                                                                                // Click offset (relative to the element)
13424                                 - this.offset.relative.left                                                                                             // Only for relative positioned nodes: Relative offset from element to offset parent
13425                                 - this.offset.parent.left                                                                                               // The offsetParent's offset without borders (offset + border)
13426                                 + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
13427                         )
13428                 };
13429
13430         },
13431
13432         _rearrange: function(event, i, a, hardRefresh) {
13433
13434                 a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction == 'down' ? i.item[0] : i.item[0].nextSibling));
13435
13436                 //Various things done here to improve the performance:
13437                 // 1. we create a setTimeout, that calls refreshPositions
13438                 // 2. on the instance, we have a counter variable, that get's higher after every append
13439                 // 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
13440                 // 4. this lets only the last addition to the timeout stack through
13441                 this.counter = this.counter ? ++this.counter : 1;
13442                 var self = this, counter = this.counter;
13443
13444                 window.setTimeout(function() {
13445                         if(counter == self.counter) self.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
13446                 },0);
13447
13448         },
13449
13450         _clear: function(event, noPropagation) {
13451
13452                 this.reverting = false;
13453                 // We delay all events that have to be triggered to after the point where the placeholder has been removed and
13454                 // everything else normalized again
13455                 var delayedTriggers = [], self = this;
13456
13457                 // We first have to update the dom position of the actual currentItem
13458                 // Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
13459                 if(!this._noFinalSort && this.currentItem[0].parentNode) this.placeholder.before(this.currentItem);
13460                 this._noFinalSort = null;
13461
13462                 if(this.helper[0] == this.currentItem[0]) {
13463                         for(var i in this._storedCSS) {
13464                                 if(this._storedCSS[i] == 'auto' || this._storedCSS[i] == 'static') this._storedCSS[i] = '';
13465                         }
13466                         this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
13467                 } else {
13468                         this.currentItem.show();
13469                 }
13470
13471                 if(this.fromOutside && !noPropagation) delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
13472                 if((this.fromOutside || this.domPosition.prev != this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent != this.currentItem.parent()[0]) && !noPropagation) delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
13473                 if(!$.ui.contains(this.element[0], this.currentItem[0])) { //Node was moved out of the current element
13474                         if(!noPropagation) delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
13475                         for (var i = this.containers.length - 1; i >= 0; i--){
13476                                 if($.ui.contains(this.containers[i].element[0], this.currentItem[0]) && !noPropagation) {
13477                                         delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
13478                                         delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this));  }; }).call(this, this.containers[i]));
13479                                 }
13480                         };
13481                 };
13482
13483                 //Post events to containers
13484                 for (var i = this.containers.length - 1; i >= 0; i--){
13485                         if(!noPropagation) delayedTriggers.push((function(c) { return function(event) { c._trigger("deactivate", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
13486                         if(this.containers[i].containerCache.over) {
13487                                 delayedTriggers.push((function(c) { return function(event) { c._trigger("out", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
13488                                 this.containers[i].containerCache.over = 0;
13489                         }
13490                 }
13491
13492                 //Do what was originally in plugins
13493                 if(this._storedCursor) $('body').css("cursor", this._storedCursor); //Reset cursor
13494                 if(this._storedOpacity) this.helper.css("opacity", this._storedOpacity); //Reset opacity
13495                 if(this._storedZIndex) this.helper.css("zIndex", this._storedZIndex == 'auto' ? '' : this._storedZIndex); //Reset z-index
13496
13497                 this.dragging = false;
13498                 if(this.cancelHelperRemoval) {
13499                         if(!noPropagation) {
13500                                 this._trigger("beforeStop", event, this._uiHash());
13501                                 for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
13502                                 this._trigger("stop", event, this._uiHash());
13503                         }
13504                         return false;
13505                 }
13506
13507                 if(!noPropagation) this._trigger("beforeStop", event, this._uiHash());
13508
13509                 //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
13510                 this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
13511
13512                 if(this.helper[0] != this.currentItem[0]) this.helper.remove(); this.helper = null;
13513
13514                 if(!noPropagation) {
13515                         for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
13516                         this._trigger("stop", event, this._uiHash());
13517                 }
13518
13519                 this.fromOutside = false;
13520                 return true;
13521
13522         },
13523
13524         _trigger: function() {
13525                 if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
13526                         this.cancel();
13527                 }
13528         },
13529
13530         _uiHash: function(inst) {
13531                 var self = inst || this;
13532                 return {
13533                         helper: self.helper,
13534                         placeholder: self.placeholder || $([]),
13535                         position: self.position,
13536                         originalPosition: self.originalPosition,
13537                         offset: self.positionAbs,
13538                         item: self.currentItem,
13539                         sender: inst ? inst.element : null
13540                 };
13541         }
13542
13543 });
13544
13545 $.extend($.ui.sortable, {
13546         version: "1.8.12"
13547 });
13548
13549 })(jQuery);
13550 /*
13551  * jQuery UI Effects 1.8.12
13552  *
13553  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
13554  * Dual licensed under the MIT or GPL Version 2 licenses.
13555  * http://jquery.org/license
13556  *
13557  * http://docs.jquery.com/UI/Effects/
13558  */
13559 ;jQuery.effects || (function($, undefined) {
13560
13561 $.effects = {};
13562
13563
13564
13565 /******************************************************************************/
13566 /****************************** COLOR ANIMATIONS ******************************/
13567 /******************************************************************************/
13568
13569 // override the animation for color styles
13570 $.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor',
13571         'borderRightColor', 'borderTopColor', 'borderColor', 'color', 'outlineColor'],
13572 function(i, attr) {
13573         $.fx.step[attr] = function(fx) {
13574                 if (!fx.colorInit) {
13575                         fx.start = getColor(fx.elem, attr);
13576                         fx.end = getRGB(fx.end);
13577                         fx.colorInit = true;
13578                 }
13579
13580                 fx.elem.style[attr] = 'rgb(' +
13581                         Math.max(Math.min(parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0], 10), 255), 0) + ',' +
13582                         Math.max(Math.min(parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1], 10), 255), 0) + ',' +
13583                         Math.max(Math.min(parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2], 10), 255), 0) + ')';
13584         };
13585 });
13586
13587 // Color Conversion functions from highlightFade
13588 // By Blair Mitchelmore
13589 // http://jquery.offput.ca/highlightFade/
13590
13591 // Parse strings looking for color tuples [255,255,255]
13592 function getRGB(color) {
13593                 var result;
13594
13595                 // Check if we're already dealing with an array of colors
13596                 if ( color && color.constructor == Array && color.length == 3 )
13597                                 return color;
13598
13599                 // Look for rgb(num,num,num)
13600                 if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color))
13601                                 return [parseInt(result[1],10), parseInt(result[2],10), parseInt(result[3],10)];
13602
13603                 // Look for rgb(num%,num%,num%)
13604                 if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color))
13605                                 return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55];
13606
13607                 // Look for #a0b1c2
13608                 if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color))
13609                                 return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];
13610
13611                 // Look for #fff
13612                 if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color))
13613                                 return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)];
13614
13615                 // Look for rgba(0, 0, 0, 0) == transparent in Safari 3
13616                 if (result = /rgba\(0, 0, 0, 0\)/.exec(color))
13617                                 return colors['transparent'];
13618
13619                 // Otherwise, we're most likely dealing with a named color
13620                 return colors[$.trim(color).toLowerCase()];
13621 }
13622
13623 function getColor(elem, attr) {
13624                 var color;
13625
13626                 do {
13627                                 color = $.curCSS(elem, attr);
13628
13629                                 // Keep going until we find an element that has color, or we hit the body
13630                                 if ( color != '' && color != 'transparent' || $.nodeName(elem, "body") )
13631                                                 break;
13632
13633                                 attr = "backgroundColor";
13634                 } while ( elem = elem.parentNode );
13635
13636                 return getRGB(color);
13637 };
13638
13639 // Some named colors to work with
13640 // From Interface by Stefan Petre
13641 // http://interface.eyecon.ro/
13642
13643 var colors = {
13644         aqua:[0,255,255],
13645         azure:[240,255,255],
13646         beige:[245,245,220],
13647         black:[0,0,0],
13648         blue:[0,0,255],
13649         brown:[165,42,42],
13650         cyan:[0,255,255],
13651         darkblue:[0,0,139],
13652         darkcyan:[0,139,139],
13653         darkgrey:[169,169,169],
13654         darkgreen:[0,100,0],
13655         darkkhaki:[189,183,107],
13656         darkmagenta:[139,0,139],
13657         darkolivegreen:[85,107,47],
13658         darkorange:[255,140,0],
13659         darkorchid:[153,50,204],
13660         darkred:[139,0,0],
13661         darksalmon:[233,150,122],
13662         darkviolet:[148,0,211],
13663         fuchsia:[255,0,255],
13664         gold:[255,215,0],
13665         green:[0,128,0],
13666         indigo:[75,0,130],
13667         khaki:[240,230,140],
13668         lightblue:[173,216,230],
13669         lightcyan:[224,255,255],
13670         lightgreen:[144,238,144],
13671         lightgrey:[211,211,211],
13672         lightpink:[255,182,193],
13673         lightyellow:[255,255,224],
13674         lime:[0,255,0],
13675         magenta:[255,0,255],
13676         maroon:[128,0,0],
13677         navy:[0,0,128],
13678         olive:[128,128,0],
13679         orange:[255,165,0],
13680         pink:[255,192,203],
13681         purple:[128,0,128],
13682         violet:[128,0,128],
13683         red:[255,0,0],
13684         silver:[192,192,192],
13685         white:[255,255,255],
13686         yellow:[255,255,0],
13687         transparent: [255,255,255]
13688 };
13689
13690
13691
13692 /******************************************************************************/
13693 /****************************** CLASS ANIMATIONS ******************************/
13694 /******************************************************************************/
13695
13696 var classAnimationActions = ['add', 'remove', 'toggle'],
13697         shorthandStyles = {
13698                 border: 1,
13699                 borderBottom: 1,
13700                 borderColor: 1,
13701                 borderLeft: 1,
13702                 borderRight: 1,
13703                 borderTop: 1,
13704                 borderWidth: 1,
13705                 margin: 1,
13706                 padding: 1
13707         };
13708
13709 function getElementStyles() {
13710         var style = document.defaultView
13711                         ? document.defaultView.getComputedStyle(this, null)
13712                         : this.currentStyle,
13713                 newStyle = {},
13714                 key,
13715                 camelCase;
13716
13717         // webkit enumerates style porperties
13718         if (style && style.length && style[0] && style[style[0]]) {
13719                 var len = style.length;
13720                 while (len--) {
13721                         key = style[len];
13722                         if (typeof style[key] == 'string') {
13723                                 camelCase = key.replace(/\-(\w)/g, function(all, letter){
13724                                         return letter.toUpperCase();
13725                                 });
13726                                 newStyle[camelCase] = style[key];
13727                         }
13728                 }
13729         } else {
13730                 for (key in style) {
13731                         if (typeof style[key] === 'string') {
13732                                 newStyle[key] = style[key];
13733                         }
13734                 }
13735         }
13736         
13737         return newStyle;
13738 }
13739
13740 function filterStyles(styles) {
13741         var name, value;
13742         for (name in styles) {
13743                 value = styles[name];
13744                 if (
13745                         // ignore null and undefined values
13746                         value == null ||
13747                         // ignore functions (when does this occur?)
13748                         $.isFunction(value) ||
13749                         // shorthand styles that need to be expanded
13750                         name in shorthandStyles ||
13751                         // ignore scrollbars (break in IE)
13752                         (/scrollbar/).test(name) ||
13753
13754                         // only colors or values that can be converted to numbers
13755                         (!(/color/i).test(name) && isNaN(parseFloat(value)))
13756                 ) {
13757                         delete styles[name];
13758                 }
13759         }
13760         
13761         return styles;
13762 }
13763
13764 function styleDifference(oldStyle, newStyle) {
13765         var diff = { _: 0 }, // http://dev.jquery.com/ticket/5459
13766                 name;
13767
13768         for (name in newStyle) {
13769                 if (oldStyle[name] != newStyle[name]) {
13770                         diff[name] = newStyle[name];
13771                 }
13772         }
13773
13774         return diff;
13775 }
13776
13777 $.effects.animateClass = function(value, duration, easing, callback) {
13778         if ($.isFunction(easing)) {
13779                 callback = easing;
13780                 easing = null;
13781         }
13782
13783         return this.queue('fx', function() {
13784                 var that = $(this),
13785                         originalStyleAttr = that.attr('style') || ' ',
13786                         originalStyle = filterStyles(getElementStyles.call(this)),
13787                         newStyle,
13788                         className = that.attr('className');
13789
13790                 $.each(classAnimationActions, function(i, action) {
13791                         if (value[action]) {
13792                                 that[action + 'Class'](value[action]);
13793                         }
13794                 });
13795                 newStyle = filterStyles(getElementStyles.call(this));
13796                 that.attr('className', className);
13797
13798                 that.animate(styleDifference(originalStyle, newStyle), duration, easing, function() {
13799                         $.each(classAnimationActions, function(i, action) {
13800                                 if (value[action]) { that[action + 'Class'](value[action]); }
13801                         });
13802                         // work around bug in IE by clearing the cssText before setting it
13803                         if (typeof that.attr('style') == 'object') {
13804                                 that.attr('style').cssText = '';
13805                                 that.attr('style').cssText = originalStyleAttr;
13806                         } else {
13807                                 that.attr('style', originalStyleAttr);
13808                         }
13809                         if (callback) { callback.apply(this, arguments); }
13810                 });
13811
13812                 // $.animate adds a function to the end of the queue
13813                 // but we want it at the front
13814                 var queue = $.queue(this),
13815                         anim = queue.splice(queue.length - 1, 1)[0];
13816                 queue.splice(1, 0, anim);
13817                 $.dequeue(this);
13818         });
13819 };
13820
13821 $.fn.extend({
13822         _addClass: $.fn.addClass,
13823         addClass: function(classNames, speed, easing, callback) {
13824                 return speed ? $.effects.animateClass.apply(this, [{ add: classNames },speed,easing,callback]) : this._addClass(classNames);
13825         },
13826
13827         _removeClass: $.fn.removeClass,
13828         removeClass: function(classNames,speed,easing,callback) {
13829                 return speed ? $.effects.animateClass.apply(this, [{ remove: classNames },speed,easing,callback]) : this._removeClass(classNames);
13830         },
13831
13832         _toggleClass: $.fn.toggleClass,
13833         toggleClass: function(classNames, force, speed, easing, callback) {
13834                 if ( typeof force == "boolean" || force === undefined ) {
13835                         if ( !speed ) {
13836                                 // without speed parameter;
13837                                 return this._toggleClass(classNames, force);
13838                         } else {
13839                                 return $.effects.animateClass.apply(this, [(force?{add:classNames}:{remove:classNames}),speed,easing,callback]);
13840                         }
13841                 } else {
13842                         // without switch parameter;
13843                         return $.effects.animateClass.apply(this, [{ toggle: classNames },force,speed,easing]);
13844                 }
13845         },
13846
13847         switchClass: function(remove,add,speed,easing,callback) {
13848                 return $.effects.animateClass.apply(this, [{ add: add, remove: remove },speed,easing,callback]);
13849         }
13850 });
13851
13852
13853
13854 /******************************************************************************/
13855 /*********************************** EFFECTS **********************************/
13856 /******************************************************************************/
13857
13858 $.extend($.effects, {
13859         version: "1.8.12",
13860
13861         // Saves a set of properties in a data storage
13862         save: function(element, set) {
13863                 for(var i=0; i < set.length; i++) {
13864                         if(set[i] !== null) element.data("ec.storage."+set[i], element[0].style[set[i]]);
13865                 }
13866         },
13867
13868         // Restores a set of previously saved properties from a data storage
13869         restore: function(element, set) {
13870                 for(var i=0; i < set.length; i++) {
13871                         if(set[i] !== null) element.css(set[i], element.data("ec.storage."+set[i]));
13872                 }
13873         },
13874
13875         setMode: function(el, mode) {
13876                 if (mode == 'toggle') mode = el.is(':hidden') ? 'show' : 'hide'; // Set for toggle
13877                 return mode;
13878         },
13879
13880         getBaseline: function(origin, original) { // Translates a [top,left] array into a baseline value
13881                 // this should be a little more flexible in the future to handle a string & hash
13882                 var y, x;
13883                 switch (origin[0]) {
13884                         case 'top': y = 0; break;
13885                         case 'middle': y = 0.5; break;
13886                         case 'bottom': y = 1; break;
13887                         default: y = origin[0] / original.height;
13888                 };
13889                 switch (origin[1]) {
13890                         case 'left': x = 0; break;
13891                         case 'center': x = 0.5; break;
13892                         case 'right': x = 1; break;
13893                         default: x = origin[1] / original.width;
13894                 };
13895                 return {x: x, y: y};
13896         },
13897
13898         // Wraps the element around a wrapper that copies position properties
13899         createWrapper: function(element) {
13900
13901                 // if the element is already wrapped, return it
13902                 if (element.parent().is('.ui-effects-wrapper')) {
13903                         return element.parent();
13904                 }
13905
13906                 // wrap the element
13907                 var props = {
13908                                 width: element.outerWidth(true),
13909                                 height: element.outerHeight(true),
13910                                 'float': element.css('float')
13911                         },
13912                         wrapper = $('<div></div>')
13913                                 .addClass('ui-effects-wrapper')
13914                                 .css({
13915                                         fontSize: '100%',
13916                                         background: 'transparent',
13917                                         border: 'none',
13918                                         margin: 0,
13919                                         padding: 0
13920                                 });
13921
13922                 element.wrap(wrapper);
13923                 wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually loose the reference to the wrapped element
13924
13925                 // transfer positioning properties to the wrapper
13926                 if (element.css('position') == 'static') {
13927                         wrapper.css({ position: 'relative' });
13928                         element.css({ position: 'relative' });
13929                 } else {
13930                         $.extend(props, {
13931                                 position: element.css('position'),
13932                                 zIndex: element.css('z-index')
13933                         });
13934                         $.each(['top', 'left', 'bottom', 'right'], function(i, pos) {
13935                                 props[pos] = element.css(pos);
13936                                 if (isNaN(parseInt(props[pos], 10))) {
13937                                         props[pos] = 'auto';
13938                                 }
13939                         });
13940                         element.css({position: 'relative', top: 0, left: 0, right: 'auto', bottom: 'auto' });
13941                 }
13942
13943                 return wrapper.css(props).show();
13944         },
13945
13946         removeWrapper: function(element) {
13947                 if (element.parent().is('.ui-effects-wrapper'))
13948                         return element.parent().replaceWith(element);
13949                 return element;
13950         },
13951
13952         setTransition: function(element, list, factor, value) {
13953                 value = value || {};
13954                 $.each(list, function(i, x){
13955                         unit = element.cssUnit(x);
13956                         if (unit[0] > 0) value[x] = unit[0] * factor + unit[1];
13957                 });
13958                 return value;
13959         }
13960 });
13961
13962
13963 function _normalizeArguments(effect, options, speed, callback) {
13964         // shift params for method overloading
13965         if (typeof effect == 'object') {
13966                 callback = options;
13967                 speed = null;
13968                 options = effect;
13969                 effect = options.effect;
13970         }
13971         if ($.isFunction(options)) {
13972                 callback = options;
13973                 speed = null;
13974                 options = {};
13975         }
13976         if (typeof options == 'number' || $.fx.speeds[options]) {
13977                 callback = speed;
13978                 speed = options;
13979                 options = {};
13980         }
13981         if ($.isFunction(speed)) {
13982                 callback = speed;
13983                 speed = null;
13984         }
13985
13986         options = options || {};
13987
13988         speed = speed || options.duration;
13989         speed = $.fx.off ? 0 : typeof speed == 'number'
13990                 ? speed : speed in $.fx.speeds ? $.fx.speeds[speed] : $.fx.speeds._default;
13991
13992         callback = callback || options.complete;
13993
13994         return [effect, options, speed, callback];
13995 }
13996
13997 function standardSpeed( speed ) {
13998         // valid standard speeds
13999         if ( !speed || typeof speed === "number" || $.fx.speeds[ speed ] ) {
14000                 return true;
14001         }
14002         
14003         // invalid strings - treat as "normal" speed
14004         if ( typeof speed === "string" && !$.effects[ speed ] ) {
14005                 return true;
14006         }
14007         
14008         return false;
14009 }
14010
14011 $.fn.extend({
14012         effect: function(effect, options, speed, callback) {
14013                 var args = _normalizeArguments.apply(this, arguments),
14014                         // TODO: make effects take actual parameters instead of a hash
14015                         args2 = {
14016                                 options: args[1],
14017                                 duration: args[2],
14018                                 callback: args[3]
14019                         },
14020                         mode = args2.options.mode,
14021                         effectMethod = $.effects[effect];
14022                 
14023                 if ( $.fx.off || !effectMethod ) {
14024                         // delegate to the original method (e.g., .show()) if possible
14025                         if ( mode ) {
14026                                 return this[ mode ]( args2.duration, args2.callback );
14027                         } else {
14028                                 return this.each(function() {
14029                                         if ( args2.callback ) {
14030                                                 args2.callback.call( this );
14031                                         }
14032                                 });
14033                         }
14034                 }
14035                 
14036                 return effectMethod.call(this, args2);
14037         },
14038
14039         _show: $.fn.show,
14040         show: function(speed) {
14041                 if ( standardSpeed( speed ) ) {
14042                         return this._show.apply(this, arguments);
14043                 } else {
14044                         var args = _normalizeArguments.apply(this, arguments);
14045                         args[1].mode = 'show';
14046                         return this.effect.apply(this, args);
14047                 }
14048         },
14049
14050         _hide: $.fn.hide,
14051         hide: function(speed) {
14052                 if ( standardSpeed( speed ) ) {
14053                         return this._hide.apply(this, arguments);
14054                 } else {
14055                         var args = _normalizeArguments.apply(this, arguments);
14056                         args[1].mode = 'hide';
14057                         return this.effect.apply(this, args);
14058                 }
14059         },
14060
14061         // jQuery core overloads toggle and creates _toggle
14062         __toggle: $.fn.toggle,
14063         toggle: function(speed) {
14064                 if ( standardSpeed( speed ) || typeof speed === "boolean" || $.isFunction( speed ) ) {
14065                         return this.__toggle.apply(this, arguments);
14066                 } else {
14067                         var args = _normalizeArguments.apply(this, arguments);
14068                         args[1].mode = 'toggle';
14069                         return this.effect.apply(this, args);
14070                 }
14071         },
14072
14073         // helper functions
14074         cssUnit: function(key) {
14075                 var style = this.css(key), val = [];
14076                 $.each( ['em','px','%','pt'], function(i, unit){
14077                         if(style.indexOf(unit) > 0)
14078                                 val = [parseFloat(style), unit];
14079                 });
14080                 return val;
14081         }
14082 });
14083
14084
14085
14086 /******************************************************************************/
14087 /*********************************** EASING ***********************************/
14088 /******************************************************************************/
14089
14090 /*
14091  * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
14092  *
14093  * Uses the built in easing capabilities added In jQuery 1.1
14094  * to offer multiple easing options
14095  *
14096  * TERMS OF USE - jQuery Easing
14097  *
14098  * Open source under the BSD License.
14099  *
14100  * Copyright 2008 George McGinley Smith
14101  * All rights reserved.
14102  *
14103  * Redistribution and use in source and binary forms, with or without modification,
14104  * are permitted provided that the following conditions are met:
14105  *
14106  * Redistributions of source code must retain the above copyright notice, this list of
14107  * conditions and the following disclaimer.
14108  * Redistributions in binary form must reproduce the above copyright notice, this list
14109  * of conditions and the following disclaimer in the documentation and/or other materials
14110  * provided with the distribution.
14111  *
14112  * Neither the name of the author nor the names of contributors may be used to endorse
14113  * or promote products derived from this software without specific prior written permission.
14114  *
14115  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
14116  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
14117  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
14118  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
14119  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
14120  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
14121  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
14122  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
14123  * OF THE POSSIBILITY OF SUCH DAMAGE.
14124  *
14125 */
14126
14127 // t: current time, b: begInnIng value, c: change In value, d: duration
14128 $.easing.jswing = $.easing.swing;
14129
14130 $.extend($.easing,
14131 {
14132         def: 'easeOutQuad',
14133         swing: function (x, t, b, c, d) {
14134                 //alert($.easing.default);
14135                 return $.easing[$.easing.def](x, t, b, c, d);
14136         },
14137         easeInQuad: function (x, t, b, c, d) {
14138                 return c*(t/=d)*t + b;
14139         },
14140         easeOutQuad: function (x, t, b, c, d) {
14141                 return -c *(t/=d)*(t-2) + b;
14142         },
14143         easeInOutQuad: function (x, t, b, c, d) {
14144                 if ((t/=d/2) < 1) return c/2*t*t + b;
14145                 return -c/2 * ((--t)*(t-2) - 1) + b;
14146         },
14147         easeInCubic: function (x, t, b, c, d) {
14148                 return c*(t/=d)*t*t + b;
14149         },
14150         easeOutCubic: function (x, t, b, c, d) {
14151                 return c*((t=t/d-1)*t*t + 1) + b;
14152         },
14153         easeInOutCubic: function (x, t, b, c, d) {
14154                 if ((t/=d/2) < 1) return c/2*t*t*t + b;
14155                 return c/2*((t-=2)*t*t + 2) + b;
14156         },
14157         easeInQuart: function (x, t, b, c, d) {
14158                 return c*(t/=d)*t*t*t + b;
14159         },
14160         easeOutQuart: function (x, t, b, c, d) {
14161                 return -c * ((t=t/d-1)*t*t*t - 1) + b;
14162         },
14163         easeInOutQuart: function (x, t, b, c, d) {
14164                 if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
14165                 return -c/2 * ((t-=2)*t*t*t - 2) + b;
14166         },
14167         easeInQuint: function (x, t, b, c, d) {
14168                 return c*(t/=d)*t*t*t*t + b;
14169         },
14170         easeOutQuint: function (x, t, b, c, d) {
14171                 return c*((t=t/d-1)*t*t*t*t + 1) + b;
14172         },
14173         easeInOutQuint: function (x, t, b, c, d) {
14174                 if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
14175                 return c/2*((t-=2)*t*t*t*t + 2) + b;
14176         },
14177         easeInSine: function (x, t, b, c, d) {
14178                 return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
14179         },
14180         easeOutSine: function (x, t, b, c, d) {
14181                 return c * Math.sin(t/d * (Math.PI/2)) + b;
14182         },
14183         easeInOutSine: function (x, t, b, c, d) {
14184                 return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
14185         },
14186         easeInExpo: function (x, t, b, c, d) {
14187                 return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
14188         },
14189         easeOutExpo: function (x, t, b, c, d) {
14190                 return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
14191         },
14192         easeInOutExpo: function (x, t, b, c, d) {
14193                 if (t==0) return b;
14194                 if (t==d) return b+c;
14195                 if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
14196                 return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
14197         },
14198         easeInCirc: function (x, t, b, c, d) {
14199                 return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
14200         },
14201         easeOutCirc: function (x, t, b, c, d) {
14202                 return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
14203         },
14204         easeInOutCirc: function (x, t, b, c, d) {
14205                 if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
14206                 return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
14207         },
14208         easeInElastic: function (x, t, b, c, d) {
14209                 var s=1.70158;var p=0;var a=c;
14210                 if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
14211                 if (a < Math.abs(c)) { a=c; var s=p/4; }
14212                 else var s = p/(2*Math.PI) * Math.asin (c/a);
14213                 return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
14214         },
14215         easeOutElastic: function (x, t, b, c, d) {
14216                 var s=1.70158;var p=0;var a=c;
14217                 if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
14218                 if (a < Math.abs(c)) { a=c; var s=p/4; }
14219                 else var s = p/(2*Math.PI) * Math.asin (c/a);
14220                 return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
14221         },
14222         easeInOutElastic: function (x, t, b, c, d) {
14223                 var s=1.70158;var p=0;var a=c;
14224                 if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);
14225                 if (a < Math.abs(c)) { a=c; var s=p/4; }
14226                 else var s = p/(2*Math.PI) * Math.asin (c/a);
14227                 if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
14228                 return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
14229         },
14230         easeInBack: function (x, t, b, c, d, s) {
14231                 if (s == undefined) s = 1.70158;
14232                 return c*(t/=d)*t*((s+1)*t - s) + b;
14233         },
14234         easeOutBack: function (x, t, b, c, d, s) {
14235                 if (s == undefined) s = 1.70158;
14236                 return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
14237         },
14238         easeInOutBack: function (x, t, b, c, d, s) {
14239                 if (s == undefined) s = 1.70158;
14240                 if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
14241                 return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
14242         },
14243         easeInBounce: function (x, t, b, c, d) {
14244                 return c - $.easing.easeOutBounce (x, d-t, 0, c, d) + b;
14245         },
14246         easeOutBounce: function (x, t, b, c, d) {
14247                 if ((t/=d) < (1/2.75)) {
14248                         return c*(7.5625*t*t) + b;
14249                 } else if (t < (2/2.75)) {
14250                         return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
14251                 } else if (t < (2.5/2.75)) {
14252                         return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
14253                 } else {
14254                         return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
14255                 }
14256         },
14257         easeInOutBounce: function (x, t, b, c, d) {
14258                 if (t < d/2) return $.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
14259                 return $.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
14260         }
14261 });
14262
14263 /*
14264  *
14265  * TERMS OF USE - EASING EQUATIONS
14266  *
14267  * Open source under the BSD License.
14268  *
14269  * Copyright 2001 Robert Penner
14270  * All rights reserved.
14271  *
14272  * Redistribution and use in source and binary forms, with or without modification,
14273  * are permitted provided that the following conditions are met:
14274  *
14275  * Redistributions of source code must retain the above copyright notice, this list of
14276  * conditions and the following disclaimer.
14277  * Redistributions in binary form must reproduce the above copyright notice, this list
14278  * of conditions and the following disclaimer in the documentation and/or other materials
14279  * provided with the distribution.
14280  *
14281  * Neither the name of the author nor the names of contributors may be used to endorse
14282  * or promote products derived from this software without specific prior written permission.
14283  *
14284  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
14285  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
14286  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
14287  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
14288  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
14289  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
14290  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
14291  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
14292  * OF THE POSSIBILITY OF SUCH DAMAGE.
14293  *
14294  */
14295
14296 })(jQuery);
14297 /*
14298  * jQuery UI Effects Blind 1.8.12
14299  *
14300  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
14301  * Dual licensed under the MIT or GPL Version 2 licenses.
14302  * http://jquery.org/license
14303  *
14304  * http://docs.jquery.com/UI/Effects/Blind
14305  *
14306  * Depends:
14307  *      jquery.effects.core.js
14308  */
14309 (function( $, undefined ) {
14310
14311 $.effects.blind = function(o) {
14312
14313         return this.queue(function() {
14314
14315                 // Create element
14316                 var el = $(this), props = ['position','top','bottom','left','right'];
14317
14318                 // Set options
14319                 var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
14320                 var direction = o.options.direction || 'vertical'; // Default direction
14321
14322                 // Adjust
14323                 $.effects.save(el, props); el.show(); // Save & Show
14324                 var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
14325                 var ref = (direction == 'vertical') ? 'height' : 'width';
14326                 var distance = (direction == 'vertical') ? wrapper.height() : wrapper.width();
14327                 if(mode == 'show') wrapper.css(ref, 0); // Shift
14328
14329                 // Animation
14330                 var animation = {};
14331                 animation[ref] = mode == 'show' ? distance : 0;
14332
14333                 // Animate
14334                 wrapper.animate(animation, o.duration, o.options.easing, function() {
14335                         if(mode == 'hide') el.hide(); // Hide
14336                         $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
14337                         if(o.callback) o.callback.apply(el[0], arguments); // Callback
14338                         el.dequeue();
14339                 });
14340
14341         });
14342
14343 };
14344
14345 })(jQuery);
14346 /*
14347  * jQuery UI Effects Bounce 1.8.12
14348  *
14349  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
14350  * Dual licensed under the MIT or GPL Version 2 licenses.
14351  * http://jquery.org/license
14352  *
14353  * http://docs.jquery.com/UI/Effects/Bounce
14354  *
14355  * Depends:
14356  *      jquery.effects.core.js
14357  */
14358 (function( $, undefined ) {
14359
14360 $.effects.bounce = function(o) {
14361
14362         return this.queue(function() {
14363
14364                 // Create element
14365                 var el = $(this), props = ['position','top','bottom','left','right'];
14366
14367                 // Set options
14368                 var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
14369                 var direction = o.options.direction || 'up'; // Default direction
14370                 var distance = o.options.distance || 20; // Default distance
14371                 var times = o.options.times || 5; // Default # of times
14372                 var speed = o.duration || 250; // Default speed per bounce
14373                 if (/show|hide/.test(mode)) props.push('opacity'); // Avoid touching opacity to prevent clearType and PNG issues in IE
14374
14375                 // Adjust
14376                 $.effects.save(el, props); el.show(); // Save & Show
14377                 $.effects.createWrapper(el); // Create Wrapper
14378                 var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
14379                 var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
14380                 var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 3 : el.outerWidth({margin:true}) / 3);
14381                 if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift
14382                 if (mode == 'hide') distance = distance / (times * 2);
14383                 if (mode != 'hide') times--;
14384
14385                 // Animate
14386                 if (mode == 'show') { // Show Bounce
14387                         var animation = {opacity: 1};
14388                         animation[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
14389                         el.animate(animation, speed / 2, o.options.easing);
14390                         distance = distance / 2;
14391                         times--;
14392                 };
14393                 for (var i = 0; i < times; i++) { // Bounces
14394                         var animation1 = {}, animation2 = {};
14395                         animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
14396                         animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
14397                         el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing);
14398                         distance = (mode == 'hide') ? distance * 2 : distance / 2;
14399                 };
14400                 if (mode == 'hide') { // Last Bounce
14401                         var animation = {opacity: 0};
14402                         animation[ref] = (motion == 'pos' ? '-=' : '+=')  + distance;
14403                         el.animate(animation, speed / 2, o.options.easing, function(){
14404                                 el.hide(); // Hide
14405                                 $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
14406                                 if(o.callback) o.callback.apply(this, arguments); // Callback
14407                         });
14408                 } else {
14409                         var animation1 = {}, animation2 = {};
14410                         animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
14411                         animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
14412                         el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing, function(){
14413                                 $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
14414                                 if(o.callback) o.callback.apply(this, arguments); // Callback
14415                         });
14416                 };
14417                 el.queue('fx', function() { el.dequeue(); });
14418                 el.dequeue();
14419         });
14420
14421 };
14422
14423 })(jQuery);
14424 /*
14425  * jQuery UI Effects Clip 1.8.12
14426  *
14427  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
14428  * Dual licensed under the MIT or GPL Version 2 licenses.
14429  * http://jquery.org/license
14430  *
14431  * http://docs.jquery.com/UI/Effects/Clip
14432  *
14433  * Depends:
14434  *      jquery.effects.core.js
14435  */
14436 (function( $, undefined ) {
14437
14438 $.effects.clip = function(o) {
14439
14440         return this.queue(function() {
14441
14442                 // Create element
14443                 var el = $(this), props = ['position','top','bottom','left','right','height','width'];
14444
14445                 // Set options
14446                 var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
14447                 var direction = o.options.direction || 'vertical'; // Default direction
14448
14449                 // Adjust
14450                 $.effects.save(el, props); el.show(); // Save & Show
14451                 var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
14452                 var animate = el[0].tagName == 'IMG' ? wrapper : el;
14453                 var ref = {
14454                         size: (direction == 'vertical') ? 'height' : 'width',
14455                         position: (direction == 'vertical') ? 'top' : 'left'
14456                 };
14457                 var distance = (direction == 'vertical') ? animate.height() : animate.width();
14458                 if(mode == 'show') { animate.css(ref.size, 0); animate.css(ref.position, distance / 2); } // Shift
14459
14460                 // Animation
14461                 var animation = {};
14462                 animation[ref.size] = mode == 'show' ? distance : 0;
14463                 animation[ref.position] = mode == 'show' ? 0 : distance / 2;
14464
14465                 // Animate
14466                 animate.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
14467                         if(mode == 'hide') el.hide(); // Hide
14468                         $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
14469                         if(o.callback) o.callback.apply(el[0], arguments); // Callback
14470                         el.dequeue();
14471                 }});
14472
14473         });
14474
14475 };
14476
14477 })(jQuery);
14478 /*
14479  * jQuery UI Effects Drop 1.8.12
14480  *
14481  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
14482  * Dual licensed under the MIT or GPL Version 2 licenses.
14483  * http://jquery.org/license
14484  *
14485  * http://docs.jquery.com/UI/Effects/Drop
14486  *
14487  * Depends:
14488  *      jquery.effects.core.js
14489  */
14490 (function( $, undefined ) {
14491
14492 $.effects.drop = function(o) {
14493
14494         return this.queue(function() {
14495
14496                 // Create element
14497                 var el = $(this), props = ['position','top','bottom','left','right','opacity'];
14498
14499                 // Set options
14500                 var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
14501                 var direction = o.options.direction || 'left'; // Default Direction
14502
14503                 // Adjust
14504                 $.effects.save(el, props); el.show(); // Save & Show
14505                 $.effects.createWrapper(el); // Create Wrapper
14506                 var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
14507                 var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
14508                 var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 2 : el.outerWidth({margin:true}) / 2);
14509                 if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift
14510
14511                 // Animation
14512                 var animation = {opacity: mode == 'show' ? 1 : 0};
14513                 animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance;
14514
14515                 // Animate
14516                 el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
14517                         if(mode == 'hide') el.hide(); // Hide
14518                         $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
14519                         if(o.callback) o.callback.apply(this, arguments); // Callback
14520                         el.dequeue();
14521                 }});
14522
14523         });
14524
14525 };
14526
14527 })(jQuery);
14528 /*
14529  * jQuery UI Effects Explode 1.8.12
14530  *
14531  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
14532  * Dual licensed under the MIT or GPL Version 2 licenses.
14533  * http://jquery.org/license
14534  *
14535  * http://docs.jquery.com/UI/Effects/Explode
14536  *
14537  * Depends:
14538  *      jquery.effects.core.js
14539  */
14540 (function( $, undefined ) {
14541
14542 $.effects.explode = function(o) {
14543
14544         return this.queue(function() {
14545
14546         var rows = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3;
14547         var cells = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3;
14548
14549         o.options.mode = o.options.mode == 'toggle' ? ($(this).is(':visible') ? 'hide' : 'show') : o.options.mode;
14550         var el = $(this).show().css('visibility', 'hidden');
14551         var offset = el.offset();
14552
14553         //Substract the margins - not fixing the problem yet.
14554         offset.top -= parseInt(el.css("marginTop"),10) || 0;
14555         offset.left -= parseInt(el.css("marginLeft"),10) || 0;
14556
14557         var width = el.outerWidth(true);
14558         var height = el.outerHeight(true);
14559
14560         for(var i=0;i<rows;i++) { // =
14561                 for(var j=0;j<cells;j++) { // ||
14562                         el
14563                                 .clone()
14564                                 .appendTo('body')
14565                                 .wrap('<div></div>')
14566                                 .css({
14567                                         position: 'absolute',
14568                                         visibility: 'visible',
14569                                         left: -j*(width/cells),
14570                                         top: -i*(height/rows)
14571                                 })
14572                                 .parent()
14573                                 .addClass('ui-effects-explode')
14574                                 .css({
14575                                         position: 'absolute',
14576                                         overflow: 'hidden',
14577                                         width: width/cells,
14578                                         height: height/rows,
14579                                         left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? (j-Math.floor(cells/2))*(width/cells) : 0),
14580                                         top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? (i-Math.floor(rows/2))*(height/rows) : 0),
14581                                         opacity: o.options.mode == 'show' ? 0 : 1
14582                                 }).animate({
14583                                         left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? 0 : (j-Math.floor(cells/2))*(width/cells)),
14584                                         top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? 0 : (i-Math.floor(rows/2))*(height/rows)),
14585                                         opacity: o.options.mode == 'show' ? 1 : 0
14586                                 }, o.duration || 500);
14587                 }
14588         }
14589
14590         // Set a timeout, to call the callback approx. when the other animations have finished
14591         setTimeout(function() {
14592
14593                 o.options.mode == 'show' ? el.css({ visibility: 'visible' }) : el.css({ visibility: 'visible' }).hide();
14594                                 if(o.callback) o.callback.apply(el[0]); // Callback
14595                                 el.dequeue();
14596
14597                                 $('div.ui-effects-explode').remove();
14598
14599         }, o.duration || 500);
14600
14601
14602         });
14603
14604 };
14605
14606 })(jQuery);
14607 /*
14608  * jQuery UI Effects Fade 1.8.12
14609  *
14610  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
14611  * Dual licensed under the MIT or GPL Version 2 licenses.
14612  * http://jquery.org/license
14613  *
14614  * http://docs.jquery.com/UI/Effects/Fade
14615  *
14616  * Depends:
14617  *      jquery.effects.core.js
14618  */
14619 (function( $, undefined ) {
14620
14621 $.effects.fade = function(o) {
14622         return this.queue(function() {
14623                 var elem = $(this),
14624                         mode = $.effects.setMode(elem, o.options.mode || 'hide');
14625
14626                 elem.animate({ opacity: mode }, {
14627                         queue: false,
14628                         duration: o.duration,
14629                         easing: o.options.easing,
14630                         complete: function() {
14631                                 (o.callback && o.callback.apply(this, arguments));
14632                                 elem.dequeue();
14633                         }
14634                 });
14635         });
14636 };
14637
14638 })(jQuery);
14639 /*
14640  * jQuery UI Effects Fold 1.8.12
14641  *
14642  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
14643  * Dual licensed under the MIT or GPL Version 2 licenses.
14644  * http://jquery.org/license
14645  *
14646  * http://docs.jquery.com/UI/Effects/Fold
14647  *
14648  * Depends:
14649  *      jquery.effects.core.js
14650  */
14651 (function( $, undefined ) {
14652
14653 $.effects.fold = function(o) {
14654
14655         return this.queue(function() {
14656
14657                 // Create element
14658                 var el = $(this), props = ['position','top','bottom','left','right'];
14659
14660                 // Set options
14661                 var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
14662                 var size = o.options.size || 15; // Default fold size
14663                 var horizFirst = !(!o.options.horizFirst); // Ensure a boolean value
14664                 var duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2;
14665
14666                 // Adjust
14667                 $.effects.save(el, props); el.show(); // Save & Show
14668                 var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
14669                 var widthFirst = ((mode == 'show') != horizFirst);
14670                 var ref = widthFirst ? ['width', 'height'] : ['height', 'width'];
14671                 var distance = widthFirst ? [wrapper.width(), wrapper.height()] : [wrapper.height(), wrapper.width()];
14672                 var percent = /([0-9]+)%/.exec(size);
14673                 if(percent) size = parseInt(percent[1],10) / 100 * distance[mode == 'hide' ? 0 : 1];
14674                 if(mode == 'show') wrapper.css(horizFirst ? {height: 0, width: size} : {height: size, width: 0}); // Shift
14675
14676                 // Animation
14677                 var animation1 = {}, animation2 = {};
14678                 animation1[ref[0]] = mode == 'show' ? distance[0] : size;
14679                 animation2[ref[1]] = mode == 'show' ? distance[1] : 0;
14680
14681                 // Animate
14682                 wrapper.animate(animation1, duration, o.options.easing)
14683                 .animate(animation2, duration, o.options.easing, function() {
14684                         if(mode == 'hide') el.hide(); // Hide
14685                         $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
14686                         if(o.callback) o.callback.apply(el[0], arguments); // Callback
14687                         el.dequeue();
14688                 });
14689
14690         });
14691
14692 };
14693
14694 })(jQuery);
14695 /*
14696  * jQuery UI Effects Highlight 1.8.12
14697  *
14698  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
14699  * Dual licensed under the MIT or GPL Version 2 licenses.
14700  * http://jquery.org/license
14701  *
14702  * http://docs.jquery.com/UI/Effects/Highlight
14703  *
14704  * Depends:
14705  *      jquery.effects.core.js
14706  */
14707 (function( $, undefined ) {
14708
14709 $.effects.highlight = function(o) {
14710         return this.queue(function() {
14711                 var elem = $(this),
14712                         props = ['backgroundImage', 'backgroundColor', 'opacity'],
14713                         mode = $.effects.setMode(elem, o.options.mode || 'show'),
14714                         animation = {
14715                                 backgroundColor: elem.css('backgroundColor')
14716                         };
14717
14718                 if (mode == 'hide') {
14719                         animation.opacity = 0;
14720                 }
14721
14722                 $.effects.save(elem, props);
14723                 elem
14724                         .show()
14725                         .css({
14726                                 backgroundImage: 'none',
14727                                 backgroundColor: o.options.color || '#ffff99'
14728                         })
14729                         .animate(animation, {
14730                                 queue: false,
14731                                 duration: o.duration,
14732                                 easing: o.options.easing,
14733                                 complete: function() {
14734                                         (mode == 'hide' && elem.hide());
14735                                         $.effects.restore(elem, props);
14736                                         (mode == 'show' && !$.support.opacity && this.style.removeAttribute('filter'));
14737                                         (o.callback && o.callback.apply(this, arguments));
14738                                         elem.dequeue();
14739                                 }
14740                         });
14741         });
14742 };
14743
14744 })(jQuery);
14745 /*
14746  * jQuery UI Effects Pulsate 1.8.12
14747  *
14748  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
14749  * Dual licensed under the MIT or GPL Version 2 licenses.
14750  * http://jquery.org/license
14751  *
14752  * http://docs.jquery.com/UI/Effects/Pulsate
14753  *
14754  * Depends:
14755  *      jquery.effects.core.js
14756  */
14757 (function( $, undefined ) {
14758
14759 $.effects.pulsate = function(o) {
14760         return this.queue(function() {
14761                 var elem = $(this),
14762                         mode = $.effects.setMode(elem, o.options.mode || 'show');
14763                         times = ((o.options.times || 5) * 2) - 1;
14764                         duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2,
14765                         isVisible = elem.is(':visible'),
14766                         animateTo = 0;
14767
14768                 if (!isVisible) {
14769                         elem.css('opacity', 0).show();
14770                         animateTo = 1;
14771                 }
14772
14773                 if ((mode == 'hide' && isVisible) || (mode == 'show' && !isVisible)) {
14774                         times--;
14775                 }
14776
14777                 for (var i = 0; i < times; i++) {
14778                         elem.animate({ opacity: animateTo }, duration, o.options.easing);
14779                         animateTo = (animateTo + 1) % 2;
14780                 }
14781
14782                 elem.animate({ opacity: animateTo }, duration, o.options.easing, function() {
14783                         if (animateTo == 0) {
14784                                 elem.hide();
14785                         }
14786                         (o.callback && o.callback.apply(this, arguments));
14787                 });
14788
14789                 elem
14790                         .queue('fx', function() { elem.dequeue(); })
14791                         .dequeue();
14792         });
14793 };
14794
14795 })(jQuery);
14796 /*
14797  * jQuery UI Effects Scale 1.8.12
14798  *
14799  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
14800  * Dual licensed under the MIT or GPL Version 2 licenses.
14801  * http://jquery.org/license
14802  *
14803  * http://docs.jquery.com/UI/Effects/Scale
14804  *
14805  * Depends:
14806  *      jquery.effects.core.js
14807  */
14808 (function( $, undefined ) {
14809
14810 $.effects.puff = function(o) {
14811         return this.queue(function() {
14812                 var elem = $(this),
14813                         mode = $.effects.setMode(elem, o.options.mode || 'hide'),
14814                         percent = parseInt(o.options.percent, 10) || 150,
14815                         factor = percent / 100,
14816                         original = { height: elem.height(), width: elem.width() };
14817
14818                 $.extend(o.options, {
14819                         fade: true,
14820                         mode: mode,
14821                         percent: mode == 'hide' ? percent : 100,
14822                         from: mode == 'hide'
14823                                 ? original
14824                                 : {
14825                                         height: original.height * factor,
14826                                         width: original.width * factor
14827                                 }
14828                 });
14829
14830                 elem.effect('scale', o.options, o.duration, o.callback);
14831                 elem.dequeue();
14832         });
14833 };
14834
14835 $.effects.scale = function(o) {
14836
14837         return this.queue(function() {
14838
14839                 // Create element
14840                 var el = $(this);
14841
14842                 // Set options
14843                 var options = $.extend(true, {}, o.options);
14844                 var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
14845                 var percent = parseInt(o.options.percent,10) || (parseInt(o.options.percent,10) == 0 ? 0 : (mode == 'hide' ? 0 : 100)); // Set default scaling percent
14846                 var direction = o.options.direction || 'both'; // Set default axis
14847                 var origin = o.options.origin; // The origin of the scaling
14848                 if (mode != 'effect') { // Set default origin and restore for show/hide
14849                         options.origin = origin || ['middle','center'];
14850                         options.restore = true;
14851                 }
14852                 var original = {height: el.height(), width: el.width()}; // Save original
14853                 el.from = o.options.from || (mode == 'show' ? {height: 0, width: 0} : original); // Default from state
14854
14855                 // Adjust
14856                 var factor = { // Set scaling factor
14857                         y: direction != 'horizontal' ? (percent / 100) : 1,
14858                         x: direction != 'vertical' ? (percent / 100) : 1
14859                 };
14860                 el.to = {height: original.height * factor.y, width: original.width * factor.x}; // Set to state
14861
14862                 if (o.options.fade) { // Fade option to support puff
14863                         if (mode == 'show') {el.from.opacity = 0; el.to.opacity = 1;};
14864                         if (mode == 'hide') {el.from.opacity = 1; el.to.opacity = 0;};
14865                 };
14866
14867                 // Animation
14868                 options.from = el.from; options.to = el.to; options.mode = mode;
14869
14870                 // Animate
14871                 el.effect('size', options, o.duration, o.callback);
14872                 el.dequeue();
14873         });
14874
14875 };
14876
14877 $.effects.size = function(o) {
14878
14879         return this.queue(function() {
14880
14881                 // Create element
14882                 var el = $(this), props = ['position','top','bottom','left','right','width','height','overflow','opacity'];
14883                 var props1 = ['position','top','bottom','left','right','overflow','opacity']; // Always restore
14884                 var props2 = ['width','height','overflow']; // Copy for children
14885                 var cProps = ['fontSize'];
14886                 var vProps = ['borderTopWidth', 'borderBottomWidth', 'paddingTop', 'paddingBottom'];
14887                 var hProps = ['borderLeftWidth', 'borderRightWidth', 'paddingLeft', 'paddingRight'];
14888
14889                 // Set options
14890                 var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
14891                 var restore = o.options.restore || false; // Default restore
14892                 var scale = o.options.scale || 'both'; // Default scale mode
14893                 var origin = o.options.origin; // The origin of the sizing
14894                 var original = {height: el.height(), width: el.width()}; // Save original
14895                 el.from = o.options.from || original; // Default from state
14896                 el.to = o.options.to || original; // Default to state
14897                 // Adjust
14898                 if (origin) { // Calculate baseline shifts
14899                         var baseline = $.effects.getBaseline(origin, original);
14900                         el.from.top = (original.height - el.from.height) * baseline.y;
14901                         el.from.left = (original.width - el.from.width) * baseline.x;
14902                         el.to.top = (original.height - el.to.height) * baseline.y;
14903                         el.to.left = (original.width - el.to.width) * baseline.x;
14904                 };
14905                 var factor = { // Set scaling factor
14906                         from: {y: el.from.height / original.height, x: el.from.width / original.width},
14907                         to: {y: el.to.height / original.height, x: el.to.width / original.width}
14908                 };
14909                 if (scale == 'box' || scale == 'both') { // Scale the css box
14910                         if (factor.from.y != factor.to.y) { // Vertical props scaling
14911                                 props = props.concat(vProps);
14912                                 el.from = $.effects.setTransition(el, vProps, factor.from.y, el.from);
14913                                 el.to = $.effects.setTransition(el, vProps, factor.to.y, el.to);
14914                         };
14915                         if (factor.from.x != factor.to.x) { // Horizontal props scaling
14916                                 props = props.concat(hProps);
14917                                 el.from = $.effects.setTransition(el, hProps, factor.from.x, el.from);
14918                                 el.to = $.effects.setTransition(el, hProps, factor.to.x, el.to);
14919                         };
14920                 };
14921                 if (scale == 'content' || scale == 'both') { // Scale the content
14922                         if (factor.from.y != factor.to.y) { // Vertical props scaling
14923                                 props = props.concat(cProps);
14924                                 el.from = $.effects.setTransition(el, cProps, factor.from.y, el.from);
14925                                 el.to = $.effects.setTransition(el, cProps, factor.to.y, el.to);
14926                         };
14927                 };
14928                 $.effects.save(el, restore ? props : props1); el.show(); // Save & Show
14929                 $.effects.createWrapper(el); // Create Wrapper
14930                 el.css('overflow','hidden').css(el.from); // Shift
14931
14932                 // Animate
14933                 if (scale == 'content' || scale == 'both') { // Scale the children
14934                         vProps = vProps.concat(['marginTop','marginBottom']).concat(cProps); // Add margins/font-size
14935                         hProps = hProps.concat(['marginLeft','marginRight']); // Add margins
14936                         props2 = props.concat(vProps).concat(hProps); // Concat
14937                         el.find("*[width]").each(function(){
14938                                 child = $(this);
14939                                 if (restore) $.effects.save(child, props2);
14940                                 var c_original = {height: child.height(), width: child.width()}; // Save original
14941                                 child.from = {height: c_original.height * factor.from.y, width: c_original.width * factor.from.x};
14942                                 child.to = {height: c_original.height * factor.to.y, width: c_original.width * factor.to.x};
14943                                 if (factor.from.y != factor.to.y) { // Vertical props scaling
14944                                         child.from = $.effects.setTransition(child, vProps, factor.from.y, child.from);
14945                                         child.to = $.effects.setTransition(child, vProps, factor.to.y, child.to);
14946                                 };
14947                                 if (factor.from.x != factor.to.x) { // Horizontal props scaling
14948                                         child.from = $.effects.setTransition(child, hProps, factor.from.x, child.from);
14949                                         child.to = $.effects.setTransition(child, hProps, factor.to.x, child.to);
14950                                 };
14951                                 child.css(child.from); // Shift children
14952                                 child.animate(child.to, o.duration, o.options.easing, function(){
14953                                         if (restore) $.effects.restore(child, props2); // Restore children
14954                                 }); // Animate children
14955                         });
14956                 };
14957
14958                 // Animate
14959                 el.animate(el.to, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
14960                         if (el.to.opacity === 0) {
14961                                 el.css('opacity', el.from.opacity);
14962                         }
14963                         if(mode == 'hide') el.hide(); // Hide
14964                         $.effects.restore(el, restore ? props : props1); $.effects.removeWrapper(el); // Restore
14965                         if(o.callback) o.callback.apply(this, arguments); // Callback
14966                         el.dequeue();
14967                 }});
14968
14969         });
14970
14971 };
14972
14973 })(jQuery);
14974 /*
14975  * jQuery UI Effects Shake 1.8.12
14976  *
14977  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
14978  * Dual licensed under the MIT or GPL Version 2 licenses.
14979  * http://jquery.org/license
14980  *
14981  * http://docs.jquery.com/UI/Effects/Shake
14982  *
14983  * Depends:
14984  *      jquery.effects.core.js
14985  */
14986 (function( $, undefined ) {
14987
14988 $.effects.shake = function(o) {
14989
14990         return this.queue(function() {
14991
14992                 // Create element
14993                 var el = $(this), props = ['position','top','bottom','left','right'];
14994
14995                 // Set options
14996                 var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
14997                 var direction = o.options.direction || 'left'; // Default direction
14998                 var distance = o.options.distance || 20; // Default distance
14999                 var times = o.options.times || 3; // Default # of times
15000                 var speed = o.duration || o.options.duration || 140; // Default speed per shake
15001
15002                 // Adjust
15003                 $.effects.save(el, props); el.show(); // Save & Show
15004                 $.effects.createWrapper(el); // Create Wrapper
15005                 var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
15006                 var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
15007
15008                 // Animation
15009                 var animation = {}, animation1 = {}, animation2 = {};
15010                 animation[ref] = (motion == 'pos' ? '-=' : '+=')  + distance;
15011                 animation1[ref] = (motion == 'pos' ? '+=' : '-=')  + distance * 2;
15012                 animation2[ref] = (motion == 'pos' ? '-=' : '+=')  + distance * 2;
15013
15014                 // Animate
15015                 el.animate(animation, speed, o.options.easing);
15016                 for (var i = 1; i < times; i++) { // Shakes
15017                         el.animate(animation1, speed, o.options.easing).animate(animation2, speed, o.options.easing);
15018                 };
15019                 el.animate(animation1, speed, o.options.easing).
15020                 animate(animation, speed / 2, o.options.easing, function(){ // Last shake
15021                         $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
15022                         if(o.callback) o.callback.apply(this, arguments); // Callback
15023                 });
15024                 el.queue('fx', function() { el.dequeue(); });
15025                 el.dequeue();
15026         });
15027
15028 };
15029
15030 })(jQuery);
15031 /*
15032  * jQuery UI Effects Slide 1.8.12
15033  *
15034  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
15035  * Dual licensed under the MIT or GPL Version 2 licenses.
15036  * http://jquery.org/license
15037  *
15038  * http://docs.jquery.com/UI/Effects/Slide
15039  *
15040  * Depends:
15041  *      jquery.effects.core.js
15042  */
15043 (function( $, undefined ) {
15044
15045 $.effects.slide = function(o) {
15046
15047         return this.queue(function() {
15048
15049                 // Create element
15050                 var el = $(this), props = ['position','top','bottom','left','right'];
15051
15052                 // Set options
15053                 var mode = $.effects.setMode(el, o.options.mode || 'show'); // Set Mode
15054                 var direction = o.options.direction || 'left'; // Default Direction
15055
15056                 // Adjust
15057                 $.effects.save(el, props); el.show(); // Save & Show
15058                 $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
15059                 var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
15060                 var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
15061                 var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) : el.outerWidth({margin:true}));
15062                 if (mode == 'show') el.css(ref, motion == 'pos' ? (isNaN(distance) ? "-" + distance : -distance) : distance); // Shift
15063
15064                 // Animation
15065                 var animation = {};
15066                 animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance;
15067
15068                 // Animate
15069                 el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
15070                         if(mode == 'hide') el.hide(); // Hide
15071                         $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
15072                         if(o.callback) o.callback.apply(this, arguments); // Callback
15073                         el.dequeue();
15074                 }});
15075
15076         });
15077
15078 };
15079
15080 })(jQuery);
15081 /*
15082  * jQuery UI Effects Transfer 1.8.12
15083  *
15084  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
15085  * Dual licensed under the MIT or GPL Version 2 licenses.
15086  * http://jquery.org/license
15087  *
15088  * http://docs.jquery.com/UI/Effects/Transfer
15089  *
15090  * Depends:
15091  *      jquery.effects.core.js
15092  */
15093 (function( $, undefined ) {
15094
15095 $.effects.transfer = function(o) {
15096         return this.queue(function() {
15097                 var elem = $(this),
15098                         target = $(o.options.to),
15099                         endPosition = target.offset(),
15100                         animation = {
15101                                 top: endPosition.top,
15102                                 left: endPosition.left,
15103                                 height: target.innerHeight(),
15104                                 width: target.innerWidth()
15105                         },
15106                         startPosition = elem.offset(),
15107                         transfer = $('<div class="ui-effects-transfer"></div>')
15108                                 .appendTo(document.body)
15109                                 .addClass(o.options.className)
15110                                 .css({
15111                                         top: startPosition.top,
15112                                         left: startPosition.left,
15113                                         height: elem.innerHeight(),
15114                                         width: elem.innerWidth(),
15115                                         position: 'absolute'
15116                                 })
15117                                 .animate(animation, o.duration, o.options.easing, function() {
15118                                         transfer.remove();
15119                                         (o.callback && o.callback.apply(elem[0], arguments));
15120                                         elem.dequeue();
15121                                 });
15122         });
15123 };
15124
15125 })(jQuery);
15126 /*
15127  * jQuery UI Accordion 1.8.12
15128  *
15129  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
15130  * Dual licensed under the MIT or GPL Version 2 licenses.
15131  * http://jquery.org/license
15132  *
15133  * http://docs.jquery.com/UI/Accordion
15134  *
15135  * Depends:
15136  *      jquery.ui.core.js
15137  *      jquery.ui.widget.js
15138  */
15139 (function( $, undefined ) {
15140
15141 $.widget( "ui.accordion", {
15142         options: {
15143                 active: 0,
15144                 animated: "slide",
15145                 autoHeight: true,
15146                 clearStyle: false,
15147                 collapsible: false,
15148                 event: "click",
15149                 fillSpace: false,
15150                 header: "> li > :first-child,> :not(li):even",
15151                 icons: {
15152                         header: "ui-icon-triangle-1-e",
15153                         headerSelected: "ui-icon-triangle-1-s"
15154                 },
15155                 navigation: false,
15156                 navigationFilter: function() {
15157                         return this.href.toLowerCase() === location.href.toLowerCase();
15158                 }
15159         },
15160
15161         _create: function() {
15162                 var self = this,
15163                         options = self.options;
15164
15165                 self.running = 0;
15166
15167                 self.element
15168                         .addClass( "ui-accordion ui-widget ui-helper-reset" )
15169                         // in lack of child-selectors in CSS
15170                         // we need to mark top-LIs in a UL-accordion for some IE-fix
15171                         .children( "li" )
15172                                 .addClass( "ui-accordion-li-fix" );
15173
15174                 self.headers = self.element.find( options.header )
15175                         .addClass( "ui-accordion-header ui-helper-reset ui-state-default ui-corner-all" )
15176                         .bind( "mouseenter.accordion", function() {
15177                                 if ( options.disabled ) {
15178                                         return;
15179                                 }
15180                                 $( this ).addClass( "ui-state-hover" );
15181                         })
15182                         .bind( "mouseleave.accordion", function() {
15183                                 if ( options.disabled ) {
15184                                         return;
15185                                 }
15186                                 $( this ).removeClass( "ui-state-hover" );
15187                         })
15188                         .bind( "focus.accordion", function() {
15189                                 if ( options.disabled ) {
15190                                         return;
15191                                 }
15192                                 $( this ).addClass( "ui-state-focus" );
15193                         })
15194                         .bind( "blur.accordion", function() {
15195                                 if ( options.disabled ) {
15196                                         return;
15197                                 }
15198                                 $( this ).removeClass( "ui-state-focus" );
15199                         });
15200
15201                 self.headers.next()
15202                         .addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" );
15203
15204                 if ( options.navigation ) {
15205                         var current = self.element.find( "a" ).filter( options.navigationFilter ).eq( 0 );
15206                         if ( current.length ) {
15207                                 var header = current.closest( ".ui-accordion-header" );
15208                                 if ( header.length ) {
15209                                         // anchor within header
15210                                         self.active = header;
15211                                 } else {
15212                                         // anchor within content
15213                                         self.active = current.closest( ".ui-accordion-content" ).prev();
15214                                 }
15215                         }
15216                 }
15217
15218                 self.active = self._findActive( self.active || options.active )
15219                         .addClass( "ui-state-default ui-state-active" )
15220                         .toggleClass( "ui-corner-all" )
15221                         .toggleClass( "ui-corner-top" );
15222                 self.active.next().addClass( "ui-accordion-content-active" );
15223
15224                 self._createIcons();
15225                 self.resize();
15226                 
15227                 // ARIA
15228                 self.element.attr( "role", "tablist" );
15229
15230                 self.headers
15231                         .attr( "role", "tab" )
15232                         .bind( "keydown.accordion", function( event ) {
15233                                 return self._keydown( event );
15234                         })
15235                         .next()
15236                                 .attr( "role", "tabpanel" );
15237
15238                 self.headers
15239                         .not( self.active || "" )
15240                         .attr({
15241                                 "aria-expanded": "false",
15242                                 "aria-selected": "false",
15243                                 tabIndex: -1
15244                         })
15245                         .next()
15246                                 .hide();
15247
15248                 // make sure at least one header is in the tab order
15249                 if ( !self.active.length ) {
15250                         self.headers.eq( 0 ).attr( "tabIndex", 0 );
15251                 } else {
15252                         self.active
15253                                 .attr({
15254                                         "aria-expanded": "true",
15255                                         "aria-selected": "true",
15256                                         tabIndex: 0
15257                                 });
15258                 }
15259
15260                 // only need links in tab order for Safari
15261                 if ( !$.browser.safari ) {
15262                         self.headers.find( "a" ).attr( "tabIndex", -1 );
15263                 }
15264
15265                 if ( options.event ) {
15266                         self.headers.bind( options.event.split(" ").join(".accordion ") + ".accordion", function(event) {
15267                                 self._clickHandler.call( self, event, this );
15268                                 event.preventDefault();
15269                         });
15270                 }
15271         },
15272
15273         _createIcons: function() {
15274                 var options = this.options;
15275                 if ( options.icons ) {
15276                         $( "<span></span>" )
15277                                 .addClass( "ui-icon " + options.icons.header )
15278                                 .prependTo( this.headers );
15279                         this.active.children( ".ui-icon" )
15280                                 .toggleClass(options.icons.header)
15281                                 .toggleClass(options.icons.headerSelected);
15282                         this.element.addClass( "ui-accordion-icons" );
15283                 }
15284         },
15285
15286         _destroyIcons: function() {
15287                 this.headers.children( ".ui-icon" ).remove();
15288                 this.element.removeClass( "ui-accordion-icons" );
15289         },
15290
15291         destroy: function() {
15292                 var options = this.options;
15293
15294                 this.element
15295                         .removeClass( "ui-accordion ui-widget ui-helper-reset" )
15296                         .removeAttr( "role" );
15297
15298                 this.headers
15299                         .unbind( ".accordion" )
15300                         .removeClass( "ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top" )
15301                         .removeAttr( "role" )
15302                         .removeAttr( "aria-expanded" )
15303                         .removeAttr( "aria-selected" )
15304                         .removeAttr( "tabIndex" );
15305
15306                 this.headers.find( "a" ).removeAttr( "tabIndex" );
15307                 this._destroyIcons();
15308                 var contents = this.headers.next()
15309                         .css( "display", "" )
15310                         .removeAttr( "role" )
15311                         .removeClass( "ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled" );
15312                 if ( options.autoHeight || options.fillHeight ) {
15313                         contents.css( "height", "" );
15314                 }
15315
15316                 return $.Widget.prototype.destroy.call( this );
15317         },
15318
15319         _setOption: function( key, value ) {
15320                 $.Widget.prototype._setOption.apply( this, arguments );
15321                         
15322                 if ( key == "active" ) {
15323                         this.activate( value );
15324                 }
15325                 if ( key == "icons" ) {
15326                         this._destroyIcons();
15327                         if ( value ) {
15328                                 this._createIcons();
15329                         }
15330                 }
15331                 // #5332 - opacity doesn't cascade to positioned elements in IE
15332                 // so we need to add the disabled class to the headers and panels
15333                 if ( key == "disabled" ) {
15334                         this.headers.add(this.headers.next())
15335                                 [ value ? "addClass" : "removeClass" ](
15336                                         "ui-accordion-disabled ui-state-disabled" );
15337                 }
15338         },
15339
15340         _keydown: function( event ) {
15341                 if ( this.options.disabled || event.altKey || event.ctrlKey ) {
15342                         return;
15343                 }
15344
15345                 var keyCode = $.ui.keyCode,
15346                         length = this.headers.length,
15347                         currentIndex = this.headers.index( event.target ),
15348                         toFocus = false;
15349
15350                 switch ( event.keyCode ) {
15351                         case keyCode.RIGHT:
15352                         case keyCode.DOWN:
15353                                 toFocus = this.headers[ ( currentIndex + 1 ) % length ];
15354                                 break;
15355                         case keyCode.LEFT:
15356                         case keyCode.UP:
15357                                 toFocus = this.headers[ ( currentIndex - 1 + length ) % length ];
15358                                 break;
15359                         case keyCode.SPACE:
15360                         case keyCode.ENTER:
15361                                 this._clickHandler( { target: event.target }, event.target );
15362                                 event.preventDefault();
15363                 }
15364
15365                 if ( toFocus ) {
15366                         $( event.target ).attr( "tabIndex", -1 );
15367                         $( toFocus ).attr( "tabIndex", 0 );
15368                         toFocus.focus();
15369                         return false;
15370                 }
15371
15372                 return true;
15373         },
15374
15375         resize: function() {
15376                 var options = this.options,
15377                         maxHeight;
15378
15379                 if ( options.fillSpace ) {
15380                         if ( $.browser.msie ) {
15381                                 var defOverflow = this.element.parent().css( "overflow" );
15382                                 this.element.parent().css( "overflow", "hidden");
15383                         }
15384                         maxHeight = this.element.parent().height();
15385                         if ($.browser.msie) {
15386                                 this.element.parent().css( "overflow", defOverflow );
15387                         }
15388
15389                         this.headers.each(function() {
15390                                 maxHeight -= $( this ).outerHeight( true );
15391                         });
15392
15393                         this.headers.next()
15394                                 .each(function() {
15395                                         $( this ).height( Math.max( 0, maxHeight -
15396                                                 $( this ).innerHeight() + $( this ).height() ) );
15397                                 })
15398                                 .css( "overflow", "auto" );
15399                 } else if ( options.autoHeight ) {
15400                         maxHeight = 0;
15401                         this.headers.next()
15402                                 .each(function() {
15403                                         maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
15404                                 })
15405                                 .height( maxHeight );
15406                 }
15407
15408                 return this;
15409         },
15410
15411         activate: function( index ) {
15412                 // TODO this gets called on init, changing the option without an explicit call for that
15413                 this.options.active = index;
15414                 // call clickHandler with custom event
15415                 var active = this._findActive( index )[ 0 ];
15416                 this._clickHandler( { target: active }, active );
15417
15418                 return this;
15419         },
15420
15421         _findActive: function( selector ) {
15422                 return selector
15423                         ? typeof selector === "number"
15424                                 ? this.headers.filter( ":eq(" + selector + ")" )
15425                                 : this.headers.not( this.headers.not( selector ) )
15426                         : selector === false
15427                                 ? $( [] )
15428                                 : this.headers.filter( ":eq(0)" );
15429         },
15430
15431         // TODO isn't event.target enough? why the separate target argument?
15432         _clickHandler: function( event, target ) {
15433                 var options = this.options;
15434                 if ( options.disabled ) {
15435                         return;
15436                 }
15437
15438                 // called only when using activate(false) to close all parts programmatically
15439                 if ( !event.target ) {
15440                         if ( !options.collapsible ) {
15441                                 return;
15442                         }
15443                         this.active
15444                                 .removeClass( "ui-state-active ui-corner-top" )
15445                                 .addClass( "ui-state-default ui-corner-all" )
15446                                 .children( ".ui-icon" )
15447                                         .removeClass( options.icons.headerSelected )
15448                                         .addClass( options.icons.header );
15449                         this.active.next().addClass( "ui-accordion-content-active" );
15450                         var toHide = this.active.next(),
15451                                 data = {
15452                                         options: options,
15453                                         newHeader: $( [] ),
15454                                         oldHeader: options.active,
15455                                         newContent: $( [] ),
15456                                         oldContent: toHide
15457                                 },
15458                                 toShow = ( this.active = $( [] ) );
15459                         this._toggle( toShow, toHide, data );
15460                         return;
15461                 }
15462
15463                 // get the click target
15464                 var clicked = $( event.currentTarget || target ),
15465                         clickedIsActive = clicked[0] === this.active[0];
15466
15467                 // TODO the option is changed, is that correct?
15468                 // TODO if it is correct, shouldn't that happen after determining that the click is valid?
15469                 options.active = options.collapsible && clickedIsActive ?
15470                         false :
15471                         this.headers.index( clicked );
15472
15473                 // if animations are still active, or the active header is the target, ignore click
15474                 if ( this.running || ( !options.collapsible && clickedIsActive ) ) {
15475                         return;
15476                 }
15477
15478                 // find elements to show and hide
15479                 var active = this.active,
15480                         toShow = clicked.next(),
15481                         toHide = this.active.next(),
15482                         data = {
15483                                 options: options,
15484                                 newHeader: clickedIsActive && options.collapsible ? $([]) : clicked,
15485                                 oldHeader: this.active,
15486                                 newContent: clickedIsActive && options.collapsible ? $([]) : toShow,
15487                                 oldContent: toHide
15488                         },
15489                         down = this.headers.index( this.active[0] ) > this.headers.index( clicked[0] );
15490
15491                 // when the call to ._toggle() comes after the class changes
15492                 // it causes a very odd bug in IE 8 (see #6720)
15493                 this.active = clickedIsActive ? $([]) : clicked;
15494                 this._toggle( toShow, toHide, data, clickedIsActive, down );
15495
15496                 // switch classes
15497                 active
15498                         .removeClass( "ui-state-active ui-corner-top" )
15499                         .addClass( "ui-state-default ui-corner-all" )
15500                         .children( ".ui-icon" )
15501                                 .removeClass( options.icons.headerSelected )
15502                                 .addClass( options.icons.header );
15503                 if ( !clickedIsActive ) {
15504                         clicked
15505                                 .removeClass( "ui-state-default ui-corner-all" )
15506                                 .addClass( "ui-state-active ui-corner-top" )
15507                                 .children( ".ui-icon" )
15508                                         .removeClass( options.icons.header )
15509                                         .addClass( options.icons.headerSelected );
15510                         clicked
15511                                 .next()
15512                                 .addClass( "ui-accordion-content-active" );
15513                 }
15514
15515                 return;
15516         },
15517
15518         _toggle: function( toShow, toHide, data, clickedIsActive, down ) {
15519                 var self = this,
15520                         options = self.options;
15521
15522                 self.toShow = toShow;
15523                 self.toHide = toHide;
15524                 self.data = data;
15525
15526                 var complete = function() {
15527                         if ( !self ) {
15528                                 return;
15529                         }
15530                         return self._completed.apply( self, arguments );
15531                 };
15532
15533                 // trigger changestart event
15534                 self._trigger( "changestart", null, self.data );
15535
15536                 // count elements to animate
15537                 self.running = toHide.size() === 0 ? toShow.size() : toHide.size();
15538
15539                 if ( options.animated ) {
15540                         var animOptions = {};
15541
15542                         if ( options.collapsible && clickedIsActive ) {
15543                                 animOptions = {
15544                                         toShow: $( [] ),
15545                                         toHide: toHide,
15546                                         complete: complete,
15547                                         down: down,
15548                                         autoHeight: options.autoHeight || options.fillSpace
15549                                 };
15550                         } else {
15551                                 animOptions = {
15552                                         toShow: toShow,
15553                                         toHide: toHide,
15554                                         complete: complete,
15555                                         down: down,
15556                                         autoHeight: options.autoHeight || options.fillSpace
15557                                 };
15558                         }
15559
15560                         if ( !options.proxied ) {
15561                                 options.proxied = options.animated;
15562                         }
15563
15564                         if ( !options.proxiedDuration ) {
15565                                 options.proxiedDuration = options.duration;
15566                         }
15567
15568                         options.animated = $.isFunction( options.proxied ) ?
15569                                 options.proxied( animOptions ) :
15570                                 options.proxied;
15571
15572                         options.duration = $.isFunction( options.proxiedDuration ) ?
15573                                 options.proxiedDuration( animOptions ) :
15574                                 options.proxiedDuration;
15575
15576                         var animations = $.ui.accordion.animations,
15577                                 duration = options.duration,
15578                                 easing = options.animated;
15579
15580                         if ( easing && !animations[ easing ] && !$.easing[ easing ] ) {
15581                                 easing = "slide";
15582                         }
15583                         if ( !animations[ easing ] ) {
15584                                 animations[ easing ] = function( options ) {
15585                                         this.slide( options, {
15586                                                 easing: easing,
15587                                                 duration: duration || 700
15588                                         });
15589                                 };
15590                         }
15591
15592                         animations[ easing ]( animOptions );
15593                 } else {
15594                         if ( options.collapsible && clickedIsActive ) {
15595                                 toShow.toggle();
15596                         } else {
15597                                 toHide.hide();
15598                                 toShow.show();
15599                         }
15600
15601                         complete( true );
15602                 }
15603
15604                 // TODO assert that the blur and focus triggers are really necessary, remove otherwise
15605                 toHide.prev()
15606                         .attr({
15607                                 "aria-expanded": "false",
15608                                 "aria-selected": "false",
15609                                 tabIndex: -1
15610                         })
15611                         .blur();
15612                 toShow.prev()
15613                         .attr({
15614                                 "aria-expanded": "true",
15615                                 "aria-selected": "true",
15616                                 tabIndex: 0
15617                         })
15618                         .focus();
15619         },
15620
15621         _completed: function( cancel ) {
15622                 this.running = cancel ? 0 : --this.running;
15623                 if ( this.running ) {
15624                         return;
15625                 }
15626
15627                 if ( this.options.clearStyle ) {
15628                         this.toShow.add( this.toHide ).css({
15629                                 height: "",
15630                                 overflow: ""
15631                         });
15632                 }
15633
15634                 // other classes are removed before the animation; this one needs to stay until completed
15635                 this.toHide.removeClass( "ui-accordion-content-active" );
15636                 // Work around for rendering bug in IE (#5421)
15637                 if ( this.toHide.length ) {
15638                         this.toHide.parent()[0].className = this.toHide.parent()[0].className;
15639                 }
15640
15641                 this._trigger( "change", null, this.data );
15642         }
15643 });
15644
15645 $.extend( $.ui.accordion, {
15646         version: "1.8.12",
15647         animations: {
15648                 slide: function( options, additions ) {
15649                         options = $.extend({
15650                                 easing: "swing",
15651                                 duration: 300
15652                         }, options, additions );
15653                         if ( !options.toHide.size() ) {
15654                                 options.toShow.animate({
15655                                         height: "show",
15656                                         paddingTop: "show",
15657                                         paddingBottom: "show"
15658                                 }, options );
15659                                 return;
15660                         }
15661                         if ( !options.toShow.size() ) {
15662                                 options.toHide.animate({
15663                                         height: "hide",
15664                                         paddingTop: "hide",
15665                                         paddingBottom: "hide"
15666                                 }, options );
15667                                 return;
15668                         }
15669                         var overflow = options.toShow.css( "overflow" ),
15670                                 percentDone = 0,
15671                                 showProps = {},
15672                                 hideProps = {},
15673                                 fxAttrs = [ "height", "paddingTop", "paddingBottom" ],
15674                                 originalWidth;
15675                         // fix width before calculating height of hidden element
15676                         var s = options.toShow;
15677                         originalWidth = s[0].style.width;
15678                         s.width( parseInt( s.parent().width(), 10 )
15679                                 - parseInt( s.css( "paddingLeft" ), 10 )
15680                                 - parseInt( s.css( "paddingRight" ), 10 )
15681                                 - ( parseInt( s.css( "borderLeftWidth" ), 10 ) || 0 )
15682                                 - ( parseInt( s.css( "borderRightWidth" ), 10) || 0 ) );
15683
15684                         $.each( fxAttrs, function( i, prop ) {
15685                                 hideProps[ prop ] = "hide";
15686
15687                                 var parts = ( "" + $.css( options.toShow[0], prop ) ).match( /^([\d+-.]+)(.*)$/ );
15688                                 showProps[ prop ] = {
15689                                         value: parts[ 1 ],
15690                                         unit: parts[ 2 ] || "px"
15691                                 };
15692                         });
15693                         options.toShow.css({ height: 0, overflow: "hidden" }).show();
15694                         options.toHide
15695                                 .filter( ":hidden" )
15696                                         .each( options.complete )
15697                                 .end()
15698                                 .filter( ":visible" )
15699                                 .animate( hideProps, {
15700                                 step: function( now, settings ) {
15701                                         // only calculate the percent when animating height
15702                                         // IE gets very inconsistent results when animating elements
15703                                         // with small values, which is common for padding
15704                                         if ( settings.prop == "height" ) {
15705                                                 percentDone = ( settings.end - settings.start === 0 ) ? 0 :
15706                                                         ( settings.now - settings.start ) / ( settings.end - settings.start );
15707                                         }
15708
15709                                         options.toShow[ 0 ].style[ settings.prop ] =
15710                                                 ( percentDone * showProps[ settings.prop ].value )
15711                                                 + showProps[ settings.prop ].unit;
15712                                 },
15713                                 duration: options.duration,
15714                                 easing: options.easing,
15715                                 complete: function() {
15716                                         if ( !options.autoHeight ) {
15717                                                 options.toShow.css( "height", "" );
15718                                         }
15719                                         options.toShow.css({
15720                                                 width: originalWidth,
15721                                                 overflow: overflow
15722                                         });
15723                                         options.complete();
15724                                 }
15725                         });
15726                 },
15727                 bounceslide: function( options ) {
15728                         this.slide( options, {
15729                                 easing: options.down ? "easeOutBounce" : "swing",
15730                                 duration: options.down ? 1000 : 200
15731                         });
15732                 }
15733         }
15734 });
15735
15736 })( jQuery );
15737 /*
15738  * jQuery UI Autocomplete 1.8.12
15739  *
15740  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
15741  * Dual licensed under the MIT or GPL Version 2 licenses.
15742  * http://jquery.org/license
15743  *
15744  * http://docs.jquery.com/UI/Autocomplete
15745  *
15746  * Depends:
15747  *      jquery.ui.core.js
15748  *      jquery.ui.widget.js
15749  *      jquery.ui.position.js
15750  */
15751 (function( $, undefined ) {
15752
15753 // used to prevent race conditions with remote data sources
15754 var requestIndex = 0;
15755
15756 $.widget( "ui.autocomplete", {
15757         options: {
15758                 appendTo: "body",
15759                 autoFocus: false,
15760                 delay: 300,
15761                 minLength: 1,
15762                 position: {
15763                         my: "left top",
15764                         at: "left bottom",
15765                         collision: "none"
15766                 },
15767                 source: null
15768         },
15769
15770         pending: 0,
15771
15772         _create: function() {
15773                 var self = this,
15774                         doc = this.element[ 0 ].ownerDocument,
15775                         suppressKeyPress;
15776
15777                 this.element
15778                         .addClass( "ui-autocomplete-input" )
15779                         .attr( "autocomplete", "off" )
15780                         // TODO verify these actually work as intended
15781                         .attr({
15782                                 role: "textbox",
15783                                 "aria-autocomplete": "list",
15784                                 "aria-haspopup": "true"
15785                         })
15786                         .bind( "keydown.autocomplete", function( event ) {
15787                                 if ( self.options.disabled || self.element.attr( "readonly" ) ) {
15788                                         return;
15789                                 }
15790
15791                                 suppressKeyPress = false;
15792                                 var keyCode = $.ui.keyCode;
15793                                 switch( event.keyCode ) {
15794                                 case keyCode.PAGE_UP:
15795                                         self._move( "previousPage", event );
15796                                         break;
15797                                 case keyCode.PAGE_DOWN:
15798                                         self._move( "nextPage", event );
15799                                         break;
15800                                 case keyCode.UP:
15801                                         self._move( "previous", event );
15802                                         // prevent moving cursor to beginning of text field in some browsers
15803                                         event.preventDefault();
15804                                         break;
15805                                 case keyCode.DOWN:
15806                                         self._move( "next", event );
15807                                         // prevent moving cursor to end of text field in some browsers
15808                                         event.preventDefault();
15809                                         break;
15810                                 case keyCode.ENTER:
15811                                 case keyCode.NUMPAD_ENTER:
15812                                         // when menu is open and has focus
15813                                         if ( self.menu.active ) {
15814                                                 // #6055 - Opera still allows the keypress to occur
15815                                                 // which causes forms to submit
15816                                                 suppressKeyPress = true;
15817                                                 event.preventDefault();
15818                                         }
15819                                         //passthrough - ENTER and TAB both select the current element
15820                                 case keyCode.TAB:
15821                                         if ( !self.menu.active ) {
15822                                                 return;
15823                                         }
15824                                         self.menu.select( event );
15825                                         break;
15826                                 case keyCode.ESCAPE:
15827                                         self.element.val( self.term );
15828                                         self.close( event );
15829                                         break;
15830                                 default:
15831                                         // keypress is triggered before the input value is changed
15832                                         clearTimeout( self.searching );
15833                                         self.searching = setTimeout(function() {
15834                                                 // only search if the value has changed
15835                                                 if ( self.term != self.element.val() ) {
15836                                                         self.selectedItem = null;
15837                                                         self.search( null, event );
15838                                                 }
15839                                         }, self.options.delay );
15840                                         break;
15841                                 }
15842                         })
15843                         .bind( "keypress.autocomplete", function( event ) {
15844                                 if ( suppressKeyPress ) {
15845                                         suppressKeyPress = false;
15846                                         event.preventDefault();
15847                                 }
15848                         })
15849                         .bind( "focus.autocomplete", function() {
15850                                 if ( self.options.disabled ) {
15851                                         return;
15852                                 }
15853
15854                                 self.selectedItem = null;
15855                                 self.previous = self.element.val();
15856                         })
15857                         .bind( "blur.autocomplete", function( event ) {
15858                                 if ( self.options.disabled ) {
15859                                         return;
15860                                 }
15861
15862                                 clearTimeout( self.searching );
15863                                 // clicks on the menu (or a button to trigger a search) will cause a blur event
15864                                 self.closing = setTimeout(function() {
15865                                         self.close( event );
15866                                         self._change( event );
15867                                 }, 150 );
15868                         });
15869                 this._initSource();
15870                 this.response = function() {
15871                         return self._response.apply( self, arguments );
15872                 };
15873                 this.menu = $( "<ul></ul>" )
15874                         .addClass( "ui-autocomplete" )
15875                         .appendTo( $( this.options.appendTo || "body", doc )[0] )
15876                         // prevent the close-on-blur in case of a "slow" click on the menu (long mousedown)
15877                         .mousedown(function( event ) {
15878                                 // clicking on the scrollbar causes focus to shift to the body
15879                                 // but we can't detect a mouseup or a click immediately afterward
15880                                 // so we have to track the next mousedown and close the menu if
15881                                 // the user clicks somewhere outside of the autocomplete
15882                                 var menuElement = self.menu.element[ 0 ];
15883                                 if ( !$( event.target ).closest( ".ui-menu-item" ).length ) {
15884                                         setTimeout(function() {
15885                                                 $( document ).one( 'mousedown', function( event ) {
15886                                                         if ( event.target !== self.element[ 0 ] &&
15887                                                                 event.target !== menuElement &&
15888                                                                 !$.ui.contains( menuElement, event.target ) ) {
15889                                                                 self.close();
15890                                                         }
15891                                                 });
15892                                         }, 1 );
15893                                 }
15894
15895                                 // use another timeout to make sure the blur-event-handler on the input was already triggered
15896                                 setTimeout(function() {
15897                                         clearTimeout( self.closing );
15898                                 }, 13);
15899                         })
15900                         .menu({
15901                                 focus: function( event, ui ) {
15902                                         var item = ui.item.data( "item.autocomplete" );
15903                                         if ( false !== self._trigger( "focus", event, { item: item } ) ) {
15904                                                 // use value to match what will end up in the input, if it was a key event
15905                                                 if ( /^key/.test(event.originalEvent.type) ) {
15906                                                         self.element.val( item.value );
15907                                                 }
15908                                         }
15909                                 },
15910                                 selected: function( event, ui ) {
15911                                         var item = ui.item.data( "item.autocomplete" ),
15912                                                 previous = self.previous;
15913
15914                                         // only trigger when focus was lost (click on menu)
15915                                         if ( self.element[0] !== doc.activeElement ) {
15916                                                 self.element.focus();
15917                                                 self.previous = previous;
15918                                                 // #6109 - IE triggers two focus events and the second
15919                                                 // is asynchronous, so we need to reset the previous
15920                                                 // term synchronously and asynchronously :-(
15921                                                 setTimeout(function() {
15922                                                         self.previous = previous;
15923                                                         self.selectedItem = item;
15924                                                 }, 1);
15925                                         }
15926
15927                                         if ( false !== self._trigger( "select", event, { item: item } ) ) {
15928                                                 self.element.val( item.value );
15929                                         }
15930                                         // reset the term after the select event
15931                                         // this allows custom select handling to work properly
15932                                         self.term = self.element.val();
15933
15934                                         self.close( event );
15935                                         self.selectedItem = item;
15936                                 },
15937                                 blur: function( event, ui ) {
15938                                         // don't set the value of the text field if it's already correct
15939                                         // this prevents moving the cursor unnecessarily
15940                                         if ( self.menu.element.is(":visible") &&
15941                                                 ( self.element.val() !== self.term ) ) {
15942                                                 self.element.val( self.term );
15943                                         }
15944                                 }
15945                         })
15946                         .zIndex( this.element.zIndex() + 1 )
15947                         // workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781
15948                         .css({ top: 0, left: 0 })
15949                         .hide()
15950                         .data( "menu" );
15951                 if ( $.fn.bgiframe ) {
15952                          this.menu.element.bgiframe();
15953                 }
15954         },
15955
15956         destroy: function() {
15957                 this.element
15958                         .removeClass( "ui-autocomplete-input" )
15959                         .removeAttr( "autocomplete" )
15960                         .removeAttr( "role" )
15961                         .removeAttr( "aria-autocomplete" )
15962                         .removeAttr( "aria-haspopup" );
15963                 this.menu.element.remove();
15964                 $.Widget.prototype.destroy.call( this );
15965         },
15966
15967         _setOption: function( key, value ) {
15968                 $.Widget.prototype._setOption.apply( this, arguments );
15969                 if ( key === "source" ) {
15970                         this._initSource();
15971                 }
15972                 if ( key === "appendTo" ) {
15973                         this.menu.element.appendTo( $( value || "body", this.element[0].ownerDocument )[0] )
15974                 }
15975                 if ( key === "disabled" && value && this.xhr ) {
15976                         this.xhr.abort();
15977                 }
15978         },
15979
15980         _initSource: function() {
15981                 var self = this,
15982                         array,
15983                         url;
15984                 if ( $.isArray(this.options.source) ) {
15985                         array = this.options.source;
15986                         this.source = function( request, response ) {
15987                                 response( $.ui.autocomplete.filter(array, request.term) );
15988                         };
15989                 } else if ( typeof this.options.source === "string" ) {
15990                         url = this.options.source;
15991                         this.source = function( request, response ) {
15992                                 if ( self.xhr ) {
15993                                         self.xhr.abort();
15994                                 }
15995                                 self.xhr = $.ajax({
15996                                         url: url,
15997                                         data: request,
15998                                         dataType: "json",
15999                                         autocompleteRequest: ++requestIndex,
16000                                         success: function( data, status ) {
16001                                                 if ( this.autocompleteRequest === requestIndex ) {
16002                                                         response( data );
16003                                                 }
16004                                         },
16005                                         error: function() {
16006                                                 if ( this.autocompleteRequest === requestIndex ) {
16007                                                         response( [] );
16008                                                 }
16009                                         }
16010                                 });
16011                         };
16012                 } else {
16013                         this.source = this.options.source;
16014                 }
16015         },
16016
16017         search: function( value, event ) {
16018                 value = value != null ? value : this.element.val();
16019
16020                 // always save the actual value, not the one passed as an argument
16021                 this.term = this.element.val();
16022
16023                 if ( value.length < this.options.minLength ) {
16024                         return this.close( event );
16025                 }
16026
16027                 clearTimeout( this.closing );
16028                 if ( this._trigger( "search", event ) === false ) {
16029                         return;
16030                 }
16031
16032                 return this._search( value );
16033         },
16034
16035         _search: function( value ) {
16036                 this.pending++;
16037                 this.element.addClass( "ui-autocomplete-loading" );
16038
16039                 this.source( { term: value }, this.response );
16040         },
16041
16042         _response: function( content ) {
16043                 if ( !this.options.disabled && content && content.length ) {
16044                         content = this._normalize( content );
16045                         this._suggest( content );
16046                         this._trigger( "open" );
16047                 } else {
16048                         this.close();
16049                 }
16050                 this.pending--;
16051                 if ( !this.pending ) {
16052                         this.element.removeClass( "ui-autocomplete-loading" );
16053                 }
16054         },
16055
16056         close: function( event ) {
16057                 clearTimeout( this.closing );
16058                 if ( this.menu.element.is(":visible") ) {
16059                         this.menu.element.hide();
16060                         this.menu.deactivate();
16061                         this._trigger( "close", event );
16062                 }
16063         },
16064         
16065         _change: function( event ) {
16066                 if ( this.previous !== this.element.val() ) {
16067                         this._trigger( "change", event, { item: this.selectedItem } );
16068                 }
16069         },
16070
16071         _normalize: function( items ) {
16072                 // assume all items have the right format when the first item is complete
16073                 if ( items.length && items[0].label && items[0].value ) {
16074                         return items;
16075                 }
16076                 return $.map( items, function(item) {
16077                         if ( typeof item === "string" ) {
16078                                 return {
16079                                         label: item,
16080                                         value: item
16081                                 };
16082                         }
16083                         return $.extend({
16084                                 label: item.label || item.value,
16085                                 value: item.value || item.label
16086                         }, item );
16087                 });
16088         },
16089
16090         _suggest: function( items ) {
16091                 var ul = this.menu.element
16092                         .empty()
16093                         .zIndex( this.element.zIndex() + 1 );
16094                 this._renderMenu( ul, items );
16095                 // TODO refresh should check if the active item is still in the dom, removing the need for a manual deactivate
16096                 this.menu.deactivate();
16097                 this.menu.refresh();
16098
16099                 // size and position menu
16100                 ul.show();
16101                 this._resizeMenu();
16102                 ul.position( $.extend({
16103                         of: this.element
16104                 }, this.options.position ));
16105
16106                 if ( this.options.autoFocus ) {
16107                         this.menu.next( new $.Event("mouseover") );
16108                 }
16109         },
16110
16111         _resizeMenu: function() {
16112                 var ul = this.menu.element;
16113                 ul.outerWidth( Math.max(
16114                         ul.width( "" ).outerWidth(),
16115                         this.element.outerWidth()
16116                 ) );
16117         },
16118
16119         _renderMenu: function( ul, items ) {
16120                 var self = this;
16121                 $.each( items, function( index, item ) {
16122                         self._renderItem( ul, item );
16123                 });
16124         },
16125
16126         _renderItem: function( ul, item) {
16127                 return $( "<li></li>" )
16128                         .data( "item.autocomplete", item )
16129                         .append( $( "<a></a>" ).text( item.label ) )
16130                         .appendTo( ul );
16131         },
16132
16133         _move: function( direction, event ) {
16134                 if ( !this.menu.element.is(":visible") ) {
16135                         this.search( null, event );
16136                         return;
16137                 }
16138                 if ( this.menu.first() && /^previous/.test(direction) ||
16139                                 this.menu.last() && /^next/.test(direction) ) {
16140                         this.element.val( this.term );
16141                         this.menu.deactivate();
16142                         return;
16143                 }
16144                 this.menu[ direction ]( event );
16145         },
16146
16147         widget: function() {
16148                 return this.menu.element;
16149         }
16150 });
16151
16152 $.extend( $.ui.autocomplete, {
16153         escapeRegex: function( value ) {
16154                 return value.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
16155         },
16156         filter: function(array, term) {
16157                 var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
16158                 return $.grep( array, function(value) {
16159                         return matcher.test( value.label || value.value || value );
16160                 });
16161         }
16162 });
16163
16164 }( jQuery ));
16165
16166 /*
16167  * jQuery UI Menu (not officially released)
16168  * 
16169  * This widget isn't yet finished and the API is subject to change. We plan to finish
16170  * it for the next release. You're welcome to give it a try anyway and give us feedback,
16171  * as long as you're okay with migrating your code later on. We can help with that, too.
16172  *
16173  * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
16174  * Dual licensed under the MIT or GPL Version 2 licenses.
16175  * http://jquery.org/license
16176  *
16177  * http://docs.jquery.com/UI/Menu
16178  *
16179  * Depends:
16180  *      jquery.ui.core.js
16181  *  jquery.ui.widget.js
16182  */
16183 (function($) {
16184
16185 $.widget("ui.menu", {
16186         _create: function() {
16187                 var self = this;
16188                 this.element
16189                         .addClass("ui-menu ui-widget ui-widget-content ui-corner-all")
16190                         .attr({
16191                                 role: "listbox",
16192                                 "aria-activedescendant": "ui-active-menuitem"
16193                         })
16194                         .click(function( event ) {
16195                                 if ( !$( event.target ).closest( ".ui-menu-item a" ).length ) {
16196                                         return;
16197                                 }
16198                                 // temporary
16199                                 event.preventDefault();
16200                                 self.select( event );
16201                         });
16202                 this.refresh();
16203         },
16204         
16205         refresh: function() {
16206                 var self = this;
16207
16208                 // don't refresh list items that are already adapted
16209                 var items = this.element.children("li:not(.ui-menu-item):has(a)")
16210                         .addClass("ui-menu-item")
16211                         .attr("role", "menuitem");
16212                 
16213                 items.children("a")
16214                         .addClass("ui-corner-all")
16215                         .attr("tabindex", -1)
16216                         // mouseenter doesn't work with event delegation
16217                         .mouseenter(function( event ) {
16218                                 self.activate( event, $(this).parent() );
16219                         })
16220                         .mouseleave(function() {
16221                                 self.deactivate();
16222                         });
16223         },
16224
16225         activate: function( event, item ) {
16226                 this.deactivate();
16227                 if (this.hasScroll()) {
16228                         var offset = item.offset().top - this.element.offset().top,
16229                                 scroll = this.element.attr("scrollTop"),
16230                                 elementHeight = this.element.height();
16231                         if (offset < 0) {
16232                                 this.element.attr("scrollTop", scroll + offset);
16233                         } else if (offset >= elementHeight) {
16234                                 this.element.attr("scrollTop", scroll + offset - elementHeight + item.height());
16235                         }
16236                 }
16237                 this.active = item.eq(0)
16238                         .children("a")
16239                                 .addClass("ui-state-hover")
16240                                 .attr("id", "ui-active-menuitem")
16241                         .end();
16242                 this._trigger("focus", event, { item: item });
16243         },
16244
16245         deactivate: function() {
16246                 if (!this.active) { return; }
16247
16248                 this.active.children("a")
16249                         .removeClass("ui-state-hover")
16250                         .removeAttr("id");
16251                 this._trigger("blur");
16252                 this.active = null;
16253         },
16254
16255         next: function(event) {
16256                 this.move("next", ".ui-menu-item:first", event);
16257         },
16258
16259         previous: function(event) {
16260                 this.move("prev", ".ui-menu-item:last", event);
16261         },
16262
16263         first: function() {
16264                 return this.active && !this.active.prevAll(".ui-menu-item").length;
16265         },
16266
16267         last: function() {
16268                 return this.active && !this.active.nextAll(".ui-menu-item").length;
16269         },
16270
16271         move: function(direction, edge, event) {
16272                 if (!this.active) {
16273                         this.activate(event, this.element.children(edge));
16274                         return;
16275                 }
16276                 var next = this.active[direction + "All"](".ui-menu-item").eq(0);
16277                 if (next.length) {
16278                         this.activate(event, next);
16279                 } else {
16280                         this.activate(event, this.element.children(edge));
16281                 }
16282         },
16283
16284         // TODO merge with previousPage
16285         nextPage: function(event) {
16286                 if (this.hasScroll()) {
16287                         // TODO merge with no-scroll-else
16288                         if (!this.active || this.last()) {
16289                                 this.activate(event, this.element.children(".ui-menu-item:first"));
16290                                 return;
16291                         }
16292                         var base = this.active.offset().top,
16293                                 height = this.element.height(),
16294                                 result = this.element.children(".ui-menu-item").filter(function() {
16295                                         var close = $(this).offset().top - base - height + $(this).height();
16296                                         // TODO improve approximation
16297                                         return close < 10 && close > -10;
16298                                 });
16299
16300                         // TODO try to catch this earlier when scrollTop indicates the last page anyway
16301                         if (!result.length) {
16302                                 result = this.element.children(".ui-menu-item:last");
16303                         }
16304                         this.activate(event, result);
16305                 } else {
16306                         this.activate(event, this.element.children(".ui-menu-item")
16307                                 .filter(!this.active || this.last() ? ":first" : ":last"));
16308                 }
16309         },
16310
16311         // TODO merge with nextPage
16312         previousPage: function(event) {
16313                 if (this.hasScroll()) {
16314                         // TODO merge with no-scroll-else
16315                         if (!this.active || this.first()) {
16316                                 this.activate(event, this.element.children(".ui-menu-item:last"));
16317                                 return;
16318                         }
16319
16320                         var base = this.active.offset().top,
16321                                 height = this.element.height();
16322                                 result = this.element.children(".ui-menu-item").filter(function() {
16323                                         var close = $(this).offset().top - base + height - $(this).height();
16324                                         // TODO improve approximation
16325                                         return close < 10 && close > -10;
16326                                 });
16327
16328                         // TODO try to catch this earlier when scrollTop indicates the last page anyway
16329                         if (!result.length) {
16330                                 result = this.element.children(".ui-menu-item:first");
16331                         }
16332                         this.activate(event, result);
16333                 } else {
16334                         this.activate(event, this.element.children(".ui-menu-item")
16335                                 .filter(!this.active || this.first() ? ":last" : ":first"));
16336                 }
16337         },
16338
16339         hasScroll: function() {
16340                 return this.element.height() < this.element.attr("scrollHeight");
16341         },
16342
16343         select: function( event ) {
16344                 this._trigger("selected", event, { item: this.active });
16345         }
16346 });
16347
16348 }(jQuery));
16349 /*
16350  * jQuery UI Button 1.8.12
16351  *
16352  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
16353  * Dual licensed under the MIT or GPL Version 2 licenses.
16354  * http://jquery.org/license
16355  *
16356  * http://docs.jquery.com/UI/Button
16357  *
16358  * Depends:
16359  *      jquery.ui.core.js
16360  *      jquery.ui.widget.js
16361  */
16362 (function( $, undefined ) {
16363
16364 var lastActive,
16365         baseClasses = "ui-button ui-widget ui-state-default ui-corner-all",
16366         stateClasses = "ui-state-hover ui-state-active ",
16367         typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",
16368         formResetHandler = function( event ) {
16369                 $( ":ui-button", event.target.form ).each(function() {
16370                         var inst = $( this ).data( "button" );
16371                         setTimeout(function() {
16372                                 inst.refresh();
16373                         }, 1 );
16374                 });
16375         },
16376         radioGroup = function( radio ) {
16377                 var name = radio.name,
16378                         form = radio.form,
16379                         radios = $( [] );
16380                 if ( name ) {
16381                         if ( form ) {
16382                                 radios = $( form ).find( "[name='" + name + "']" );
16383                         } else {
16384                                 radios = $( "[name='" + name + "']", radio.ownerDocument )
16385                                         .filter(function() {
16386                                                 return !this.form;
16387                                         });
16388                         }
16389                 }
16390                 return radios;
16391         };
16392
16393 $.widget( "ui.button", {
16394         options: {
16395                 disabled: null,
16396                 text: true,
16397                 label: null,
16398                 icons: {
16399                         primary: null,
16400                         secondary: null
16401                 }
16402         },
16403         _create: function() {
16404                 this.element.closest( "form" )
16405                         .unbind( "reset.button" )
16406                         .bind( "reset.button", formResetHandler );
16407
16408                 if ( typeof this.options.disabled !== "boolean" ) {
16409                         this.options.disabled = this.element.attr( "disabled" );
16410                 }
16411
16412                 this._determineButtonType();
16413                 this.hasTitle = !!this.buttonElement.attr( "title" );
16414
16415                 var self = this,
16416                         options = this.options,
16417                         toggleButton = this.type === "checkbox" || this.type === "radio",
16418                         hoverClass = "ui-state-hover" + ( !toggleButton ? " ui-state-active" : "" ),
16419                         focusClass = "ui-state-focus";
16420
16421                 if ( options.label === null ) {
16422                         options.label = this.buttonElement.html();
16423                 }
16424
16425                 if ( this.element.is( ":disabled" ) ) {
16426                         options.disabled = true;
16427                 }
16428
16429                 this.buttonElement
16430                         .addClass( baseClasses )
16431                         .attr( "role", "button" )
16432                         .bind( "mouseenter.button", function() {
16433                                 if ( options.disabled ) {
16434                                         return;
16435                                 }
16436                                 $( this ).addClass( "ui-state-hover" );
16437                                 if ( this === lastActive ) {
16438                                         $( this ).addClass( "ui-state-active" );
16439                                 }
16440                         })
16441                         .bind( "mouseleave.button", function() {
16442                                 if ( options.disabled ) {
16443                                         return;
16444                                 }
16445                                 $( this ).removeClass( hoverClass );
16446                         })
16447                         .bind( "focus.button", function() {
16448                                 // no need to check disabled, focus won't be triggered anyway
16449                                 $( this ).addClass( focusClass );
16450                         })
16451                         .bind( "blur.button", function() {
16452                                 $( this ).removeClass( focusClass );
16453                         });
16454
16455                 if ( toggleButton ) {
16456                         this.element.bind( "change.button", function() {
16457                                 self.refresh();
16458                         });
16459                 }
16460
16461                 if ( this.type === "checkbox" ) {
16462                         this.buttonElement.bind( "click.button", function() {
16463                                 if ( options.disabled ) {
16464                                         return false;
16465                                 }
16466                                 $( this ).toggleClass( "ui-state-active" );
16467                                 self.buttonElement.attr( "aria-pressed", self.element[0].checked );
16468                         });
16469                 } else if ( this.type === "radio" ) {
16470                         this.buttonElement.bind( "click.button", function() {
16471                                 if ( options.disabled ) {
16472                                         return false;
16473                                 }
16474                                 $( this ).addClass( "ui-state-active" );
16475                                 self.buttonElement.attr( "aria-pressed", true );
16476
16477                                 var radio = self.element[ 0 ];
16478                                 radioGroup( radio )
16479                                         .not( radio )
16480                                         .map(function() {
16481                                                 return $( this ).button( "widget" )[ 0 ];
16482                                         })
16483                                         .removeClass( "ui-state-active" )
16484                                         .attr( "aria-pressed", false );
16485                         });
16486                 } else {
16487                         this.buttonElement
16488                                 .bind( "mousedown.button", function() {
16489                                         if ( options.disabled ) {
16490                                                 return false;
16491                                         }
16492                                         $( this ).addClass( "ui-state-active" );
16493                                         lastActive = this;
16494                                         $( document ).one( "mouseup", function() {
16495                                                 lastActive = null;
16496                                         });
16497                                 })
16498                                 .bind( "mouseup.button", function() {
16499                                         if ( options.disabled ) {
16500                                                 return false;
16501                                         }
16502                                         $( this ).removeClass( "ui-state-active" );
16503                                 })
16504                                 .bind( "keydown.button", function(event) {
16505                                         if ( options.disabled ) {
16506                                                 return false;
16507                                         }
16508                                         if ( event.keyCode == $.ui.keyCode.SPACE || event.keyCode == $.ui.keyCode.ENTER ) {
16509                                                 $( this ).addClass( "ui-state-active" );
16510                                         }
16511                                 })
16512                                 .bind( "keyup.button", function() {
16513                                         $( this ).removeClass( "ui-state-active" );
16514                                 });
16515
16516                         if ( this.buttonElement.is("a") ) {
16517                                 this.buttonElement.keyup(function(event) {
16518                                         if ( event.keyCode === $.ui.keyCode.SPACE ) {
16519                                                 // TODO pass through original event correctly (just as 2nd argument doesn't work)
16520                                                 $( this ).click();
16521                                         }
16522                                 });
16523                         }
16524                 }
16525
16526                 // TODO: pull out $.Widget's handling for the disabled option into
16527                 // $.Widget.prototype._setOptionDisabled so it's easy to proxy and can
16528                 // be overridden by individual plugins
16529                 this._setOption( "disabled", options.disabled );
16530         },
16531
16532         _determineButtonType: function() {
16533
16534                 if ( this.element.is(":checkbox") ) {
16535                         this.type = "checkbox";
16536                 } else if ( this.element.is(":radio") ) {
16537                         this.type = "radio";
16538                 } else if ( this.element.is("input") ) {
16539                         this.type = "input";
16540                 } else {
16541                         this.type = "button";
16542                 }
16543
16544                 if ( this.type === "checkbox" || this.type === "radio" ) {
16545                         // we don't search against the document in case the element
16546                         // is disconnected from the DOM
16547                         var ancestor = this.element.parents().filter(":last"),
16548                                 labelSelector = "label[for=" + this.element.attr("id") + "]";
16549                         this.buttonElement = ancestor.find( labelSelector );
16550                         if ( !this.buttonElement.length ) {
16551                                 ancestor = ancestor.length ? ancestor.siblings() : this.element.siblings();
16552                                 this.buttonElement = ancestor.filter( labelSelector );
16553                                 if ( !this.buttonElement.length ) {
16554                                         this.buttonElement = ancestor.find( labelSelector );
16555                                 }
16556                         }
16557                         this.element.addClass( "ui-helper-hidden-accessible" );
16558
16559                         var checked = this.element.is( ":checked" );
16560                         if ( checked ) {
16561                                 this.buttonElement.addClass( "ui-state-active" );
16562                         }
16563                         this.buttonElement.attr( "aria-pressed", checked );
16564                 } else {
16565                         this.buttonElement = this.element;
16566                 }
16567         },
16568
16569         widget: function() {
16570                 return this.buttonElement;
16571         },
16572
16573         destroy: function() {
16574                 this.element
16575                         .removeClass( "ui-helper-hidden-accessible" );
16576                 this.buttonElement
16577                         .removeClass( baseClasses + " " + stateClasses + " " + typeClasses )
16578                         .removeAttr( "role" )
16579                         .removeAttr( "aria-pressed" )
16580                         .html( this.buttonElement.find(".ui-button-text").html() );
16581
16582                 if ( !this.hasTitle ) {
16583                         this.buttonElement.removeAttr( "title" );
16584                 }
16585
16586                 $.Widget.prototype.destroy.call( this );
16587         },
16588
16589         _setOption: function( key, value ) {
16590                 $.Widget.prototype._setOption.apply( this, arguments );
16591                 if ( key === "disabled" ) {
16592                         if ( value ) {
16593                                 this.element.attr( "disabled", true );
16594                         } else {
16595                                 this.element.removeAttr( "disabled" );
16596                         }
16597                 }
16598                 this._resetButton();
16599         },
16600
16601         refresh: function() {
16602                 var isDisabled = this.element.is( ":disabled" );
16603                 if ( isDisabled !== this.options.disabled ) {
16604                         this._setOption( "disabled", isDisabled );
16605                 }
16606                 if ( this.type === "radio" ) {
16607                         radioGroup( this.element[0] ).each(function() {
16608                                 if ( $( this ).is( ":checked" ) ) {
16609                                         $( this ).button( "widget" )
16610                                                 .addClass( "ui-state-active" )
16611                                                 .attr( "aria-pressed", true );
16612                                 } else {
16613                                         $( this ).button( "widget" )
16614                                                 .removeClass( "ui-state-active" )
16615                                                 .attr( "aria-pressed", false );
16616                                 }
16617                         });
16618                 } else if ( this.type === "checkbox" ) {
16619                         if ( this.element.is( ":checked" ) ) {
16620                                 this.buttonElement
16621                                         .addClass( "ui-state-active" )
16622                                         .attr( "aria-pressed", true );
16623                         } else {
16624                                 this.buttonElement
16625                                         .removeClass( "ui-state-active" )
16626                                         .attr( "aria-pressed", false );
16627                         }
16628                 }
16629         },
16630
16631         _resetButton: function() {
16632                 if ( this.type === "input" ) {
16633                         if ( this.options.label ) {
16634                                 this.element.val( this.options.label );
16635                         }
16636                         return;
16637                 }
16638                 var buttonElement = this.buttonElement.removeClass( typeClasses ),
16639                         buttonText = $( "<span></span>" )
16640                                 .addClass( "ui-button-text" )
16641                                 .html( this.options.label )
16642                                 .appendTo( buttonElement.empty() )
16643                                 .text(),
16644                         icons = this.options.icons,
16645                         multipleIcons = icons.primary && icons.secondary,
16646                         buttonClasses = [];  
16647
16648                 if ( icons.primary || icons.secondary ) {
16649                         if ( this.options.text ) {
16650                                 buttonClasses.push( "ui-button-text-icon" + ( multipleIcons ? "s" : ( icons.primary ? "-primary" : "-secondary" ) ) );
16651                         }
16652
16653                         if ( icons.primary ) {
16654                                 buttonElement.prepend( "<span class='ui-button-icon-primary ui-icon " + icons.primary + "'></span>" );
16655                         }
16656
16657                         if ( icons.secondary ) {
16658                                 buttonElement.append( "<span class='ui-button-icon-secondary ui-icon " + icons.secondary + "'></span>" );
16659                         }
16660
16661                         if ( !this.options.text ) {
16662                                 buttonClasses.push( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" );
16663
16664                                 if ( !this.hasTitle ) {
16665                                         buttonElement.attr( "title", buttonText );
16666                                 }
16667                         }
16668                 } else {
16669                         buttonClasses.push( "ui-button-text-only" );
16670                 }
16671                 buttonElement.addClass( buttonClasses.join( " " ) );
16672         }
16673 });
16674
16675 $.widget( "ui.buttonset", {
16676         options: {
16677                 items: ":button, :submit, :reset, :checkbox, :radio, a, :data(button)"
16678         },
16679
16680         _create: function() {
16681                 this.element.addClass( "ui-buttonset" );
16682         },
16683         
16684         _init: function() {
16685                 this.refresh();
16686         },
16687
16688         _setOption: function( key, value ) {
16689                 if ( key === "disabled" ) {
16690                         this.buttons.button( "option", key, value );
16691                 }
16692
16693                 $.Widget.prototype._setOption.apply( this, arguments );
16694         },
16695         
16696         refresh: function() {
16697                 this.buttons = this.element.find( this.options.items )
16698                         .filter( ":ui-button" )
16699                                 .button( "refresh" )
16700                         .end()
16701                         .not( ":ui-button" )
16702                                 .button()
16703                         .end()
16704                         .map(function() {
16705                                 return $( this ).button( "widget" )[ 0 ];
16706                         })
16707                                 .removeClass( "ui-corner-all ui-corner-left ui-corner-right" )
16708                                 .filter( ":first" )
16709                                         .addClass( "ui-corner-left" )
16710                                 .end()
16711                                 .filter( ":last" )
16712                                         .addClass( "ui-corner-right" )
16713                                 .end()
16714                         .end();
16715         },
16716
16717         destroy: function() {
16718                 this.element.removeClass( "ui-buttonset" );
16719                 this.buttons
16720                         .map(function() {
16721                                 return $( this ).button( "widget" )[ 0 ];
16722                         })
16723                                 .removeClass( "ui-corner-left ui-corner-right" )
16724                         .end()
16725                         .button( "destroy" );
16726
16727                 $.Widget.prototype.destroy.call( this );
16728         }
16729 });
16730
16731 }( jQuery ) );
16732 /*
16733  * jQuery UI Datepicker 1.8.12
16734  *
16735  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
16736  * Dual licensed under the MIT or GPL Version 2 licenses.
16737  * http://jquery.org/license
16738  *
16739  * http://docs.jquery.com/UI/Datepicker
16740  *
16741  * Depends:
16742  *      jquery.ui.core.js
16743  */
16744 (function( $, undefined ) {
16745
16746 $.extend($.ui, { datepicker: { version: "1.8.12" } });
16747
16748 var PROP_NAME = 'datepicker';
16749 var dpuuid = new Date().getTime();
16750
16751 /* Date picker manager.
16752    Use the singleton instance of this class, $.datepicker, to interact with the date picker.
16753    Settings for (groups of) date pickers are maintained in an instance object,
16754    allowing multiple different settings on the same page. */
16755
16756 function Datepicker() {
16757         this.debug = false; // Change this to true to start debugging
16758         this._curInst = null; // The current instance in use
16759         this._keyEvent = false; // If the last event was a key event
16760         this._disabledInputs = []; // List of date picker inputs that have been disabled
16761         this._datepickerShowing = false; // True if the popup picker is showing , false if not
16762         this._inDialog = false; // True if showing within a "dialog", false if not
16763         this._mainDivId = 'ui-datepicker-div'; // The ID of the main datepicker division
16764         this._inlineClass = 'ui-datepicker-inline'; // The name of the inline marker class
16765         this._appendClass = 'ui-datepicker-append'; // The name of the append marker class
16766         this._triggerClass = 'ui-datepicker-trigger'; // The name of the trigger marker class
16767         this._dialogClass = 'ui-datepicker-dialog'; // The name of the dialog marker class
16768         this._disableClass = 'ui-datepicker-disabled'; // The name of the disabled covering marker class
16769         this._unselectableClass = 'ui-datepicker-unselectable'; // The name of the unselectable cell marker class
16770         this._currentClass = 'ui-datepicker-current-day'; // The name of the current day marker class
16771         this._dayOverClass = 'ui-datepicker-days-cell-over'; // The name of the day hover marker class
16772         this.regional = []; // Available regional settings, indexed by language code
16773         this.regional[''] = { // Default regional settings
16774                 closeText: 'Done', // Display text for close link
16775                 prevText: 'Prev', // Display text for previous month link
16776                 nextText: 'Next', // Display text for next month link
16777                 currentText: 'Today', // Display text for current month link
16778                 monthNames: ['January','February','March','April','May','June',
16779                         'July','August','September','October','November','December'], // Names of months for drop-down and formatting
16780                 monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], // For formatting
16781                 dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], // For formatting
16782                 dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], // For formatting
16783                 dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'], // Column headings for days starting at Sunday
16784                 weekHeader: 'Wk', // Column header for week of the year
16785                 dateFormat: 'mm/dd/yy', // See format options on parseDate
16786                 firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
16787                 isRTL: false, // True if right-to-left language, false if left-to-right
16788                 showMonthAfterYear: false, // True if the year select precedes month, false for month then year
16789                 yearSuffix: '' // Additional text to append to the year in the month headers
16790         };
16791         this._defaults = { // Global defaults for all the date picker instances
16792                 showOn: 'focus', // 'focus' for popup on focus,
16793                         // 'button' for trigger button, or 'both' for either
16794                 showAnim: 'fadeIn', // Name of jQuery animation for popup
16795                 showOptions: {}, // Options for enhanced animations
16796                 defaultDate: null, // Used when field is blank: actual date,
16797                         // +/-number for offset from today, null for today
16798                 appendText: '', // Display text following the input box, e.g. showing the format
16799                 buttonText: '...', // Text for trigger button
16800                 buttonImage: '', // URL for trigger button image
16801                 buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
16802                 hideIfNoPrevNext: false, // True to hide next/previous month links
16803                         // if not applicable, false to just disable them
16804                 navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
16805                 gotoCurrent: false, // True if today link goes back to current selection instead
16806                 changeMonth: false, // True if month can be selected directly, false if only prev/next
16807                 changeYear: false, // True if year can be selected directly, false if only prev/next
16808                 yearRange: 'c-10:c+10', // Range of years to display in drop-down,
16809                         // either relative to today's year (-nn:+nn), relative to currently displayed year
16810                         // (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
16811                 showOtherMonths: false, // True to show dates in other months, false to leave blank
16812                 selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
16813                 showWeek: false, // True to show week of the year, false to not show it
16814                 calculateWeek: this.iso8601Week, // How to calculate the week of the year,
16815                         // takes a Date and returns the number of the week for it
16816                 shortYearCutoff: '+10', // Short year values < this are in the current century,
16817                         // > this are in the previous century,
16818                         // string value starting with '+' for current year + value
16819                 minDate: null, // The earliest selectable date, or null for no limit
16820                 maxDate: null, // The latest selectable date, or null for no limit
16821                 duration: 'fast', // Duration of display/closure
16822                 beforeShowDay: null, // Function that takes a date and returns an array with
16823                         // [0] = true if selectable, false if not, [1] = custom CSS class name(s) or '',
16824                         // [2] = cell title (optional), e.g. $.datepicker.noWeekends
16825                 beforeShow: null, // Function that takes an input field and
16826                         // returns a set of custom settings for the date picker
16827                 onSelect: null, // Define a callback function when a date is selected
16828                 onChangeMonthYear: null, // Define a callback function when the month or year is changed
16829                 onClose: null, // Define a callback function when the datepicker is closed
16830                 numberOfMonths: 1, // Number of months to show at a time
16831                 showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
16832                 stepMonths: 1, // Number of months to step back/forward
16833                 stepBigMonths: 12, // Number of months to step back/forward for the big links
16834                 altField: '', // Selector for an alternate field to store selected dates into
16835                 altFormat: '', // The date format to use for the alternate field
16836                 constrainInput: true, // The input is constrained by the current date format
16837                 showButtonPanel: false, // True to show button panel, false to not show it
16838                 autoSize: false // True to size the input for the date format, false to leave as is
16839         };
16840         $.extend(this._defaults, this.regional['']);
16841         this.dpDiv = $('<div id="' + this._mainDivId + '" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>');
16842 }
16843
16844 $.extend(Datepicker.prototype, {
16845         /* Class name added to elements to indicate already configured with a date picker. */
16846         markerClassName: 'hasDatepicker',
16847
16848         /* Debug logging (if enabled). */
16849         log: function () {
16850                 if (this.debug)
16851                         console.log.apply('', arguments);
16852         },
16853         
16854         // TODO rename to "widget" when switching to widget factory
16855         _widgetDatepicker: function() {
16856                 return this.dpDiv;
16857         },
16858
16859         /* Override the default settings for all instances of the date picker.
16860            @param  settings  object - the new settings to use as defaults (anonymous object)
16861            @return the manager object */
16862         setDefaults: function(settings) {
16863                 extendRemove(this._defaults, settings || {});
16864                 return this;
16865         },
16866
16867         /* Attach the date picker to a jQuery selection.
16868            @param  target    element - the target input field or division or span
16869            @param  settings  object - the new settings to use for this date picker instance (anonymous) */
16870         _attachDatepicker: function(target, settings) {
16871                 // check for settings on the control itself - in namespace 'date:'
16872                 var inlineSettings = null;
16873                 for (var attrName in this._defaults) {
16874                         var attrValue = target.getAttribute('date:' + attrName);
16875                         if (attrValue) {
16876                                 inlineSettings = inlineSettings || {};
16877                                 try {
16878                                         inlineSettings[attrName] = eval(attrValue);
16879                                 } catch (err) {
16880                                         inlineSettings[attrName] = attrValue;
16881                                 }
16882                         }
16883                 }
16884                 var nodeName = target.nodeName.toLowerCase();
16885                 var inline = (nodeName == 'div' || nodeName == 'span');
16886                 if (!target.id) {
16887                         this.uuid += 1;
16888                         target.id = 'dp' + this.uuid;
16889                 }
16890                 var inst = this._newInst($(target), inline);
16891                 inst.settings = $.extend({}, settings || {}, inlineSettings || {});
16892                 if (nodeName == 'input') {
16893                         this._connectDatepicker(target, inst);
16894                 } else if (inline) {
16895                         this._inlineDatepicker(target, inst);
16896                 }
16897         },
16898
16899         /* Create a new instance object. */
16900         _newInst: function(target, inline) {
16901                 var id = target[0].id.replace(/([^A-Za-z0-9_-])/g, '\\\\$1'); // escape jQuery meta chars
16902                 return {id: id, input: target, // associated target
16903                         selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
16904                         drawMonth: 0, drawYear: 0, // month being drawn
16905                         inline: inline, // is datepicker inline or not
16906                         dpDiv: (!inline ? this.dpDiv : // presentation div
16907                         $('<div class="' + this._inlineClass + ' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'))};
16908         },
16909
16910         /* Attach the date picker to an input field. */
16911         _connectDatepicker: function(target, inst) {
16912                 var input = $(target);
16913                 inst.append = $([]);
16914                 inst.trigger = $([]);
16915                 if (input.hasClass(this.markerClassName))
16916                         return;
16917                 this._attachments(input, inst);
16918                 input.addClass(this.markerClassName).keydown(this._doKeyDown).
16919                         keypress(this._doKeyPress).keyup(this._doKeyUp).
16920                         bind("setData.datepicker", function(event, key, value) {
16921                                 inst.settings[key] = value;
16922                         }).bind("getData.datepicker", function(event, key) {
16923                                 return this._get(inst, key);
16924                         });
16925                 this._autoSize(inst);
16926                 $.data(target, PROP_NAME, inst);
16927         },
16928
16929         /* Make attachments based on settings. */
16930         _attachments: function(input, inst) {
16931                 var appendText = this._get(inst, 'appendText');
16932                 var isRTL = this._get(inst, 'isRTL');
16933                 if (inst.append)
16934                         inst.append.remove();
16935                 if (appendText) {
16936                         inst.append = $('<span class="' + this._appendClass + '">' + appendText + '</span>');
16937                         input[isRTL ? 'before' : 'after'](inst.append);
16938                 }
16939                 input.unbind('focus', this._showDatepicker);
16940                 if (inst.trigger)
16941                         inst.trigger.remove();
16942                 var showOn = this._get(inst, 'showOn');
16943                 if (showOn == 'focus' || showOn == 'both') // pop-up date picker when in the marked field
16944                         input.focus(this._showDatepicker);
16945                 if (showOn == 'button' || showOn == 'both') { // pop-up date picker when button clicked
16946                         var buttonText = this._get(inst, 'buttonText');
16947                         var buttonImage = this._get(inst, 'buttonImage');
16948                         inst.trigger = $(this._get(inst, 'buttonImageOnly') ?
16949                                 $('<img/>').addClass(this._triggerClass).
16950                                         attr({ src: buttonImage, alt: buttonText, title: buttonText }) :
16951                                 $('<button type="button"></button>').addClass(this._triggerClass).
16952                                         html(buttonImage == '' ? buttonText : $('<img/>').attr(
16953                                         { src:buttonImage, alt:buttonText, title:buttonText })));
16954                         input[isRTL ? 'before' : 'after'](inst.trigger);
16955                         inst.trigger.click(function() {
16956                                 if ($.datepicker._datepickerShowing && $.datepicker._lastInput == input[0])
16957                                         $.datepicker._hideDatepicker();
16958                                 else
16959                                         $.datepicker._showDatepicker(input[0]);
16960                                 return false;
16961                         });
16962                 }
16963         },
16964
16965         /* Apply the maximum length for the date format. */
16966         _autoSize: function(inst) {
16967                 if (this._get(inst, 'autoSize') && !inst.inline) {
16968                         var date = new Date(2009, 12 - 1, 20); // Ensure double digits
16969                         var dateFormat = this._get(inst, 'dateFormat');
16970                         if (dateFormat.match(/[DM]/)) {
16971                                 var findMax = function(names) {
16972                                         var max = 0;
16973                                         var maxI = 0;
16974                                         for (var i = 0; i < names.length; i++) {
16975                                                 if (names[i].length > max) {
16976                                                         max = names[i].length;
16977                                                         maxI = i;
16978                                                 }
16979                                         }
16980                                         return maxI;
16981                                 };
16982                                 date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ?
16983                                         'monthNames' : 'monthNamesShort'))));
16984                                 date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ?
16985                                         'dayNames' : 'dayNamesShort'))) + 20 - date.getDay());
16986                         }
16987                         inst.input.attr('size', this._formatDate(inst, date).length);
16988                 }
16989         },
16990
16991         /* Attach an inline date picker to a div. */
16992         _inlineDatepicker: function(target, inst) {
16993                 var divSpan = $(target);
16994                 if (divSpan.hasClass(this.markerClassName))
16995                         return;
16996                 divSpan.addClass(this.markerClassName).append(inst.dpDiv).
16997                         bind("setData.datepicker", function(event, key, value){
16998                                 inst.settings[key] = value;
16999                         }).bind("getData.datepicker", function(event, key){
17000                                 return this._get(inst, key);
17001                         });
17002                 $.data(target, PROP_NAME, inst);
17003                 this._setDate(inst, this._getDefaultDate(inst), true);
17004                 this._updateDatepicker(inst);
17005                 this._updateAlternate(inst);
17006                 inst.dpDiv.show();
17007         },
17008
17009         /* Pop-up the date picker in a "dialog" box.
17010            @param  input     element - ignored
17011            @param  date      string or Date - the initial date to display
17012            @param  onSelect  function - the function to call when a date is selected
17013            @param  settings  object - update the dialog date picker instance's settings (anonymous object)
17014            @param  pos       int[2] - coordinates for the dialog's position within the screen or
17015                              event - with x/y coordinates or
17016                              leave empty for default (screen centre)
17017            @return the manager object */
17018         _dialogDatepicker: function(input, date, onSelect, settings, pos) {
17019                 var inst = this._dialogInst; // internal instance
17020                 if (!inst) {
17021                         this.uuid += 1;
17022                         var id = 'dp' + this.uuid;
17023                         this._dialogInput = $('<input type="text" id="' + id +
17024                                 '" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>');
17025                         this._dialogInput.keydown(this._doKeyDown);
17026                         $('body').append(this._dialogInput);
17027                         inst = this._dialogInst = this._newInst(this._dialogInput, false);
17028                         inst.settings = {};
17029                         $.data(this._dialogInput[0], PROP_NAME, inst);
17030                 }
17031                 extendRemove(inst.settings, settings || {});
17032                 date = (date && date.constructor == Date ? this._formatDate(inst, date) : date);
17033                 this._dialogInput.val(date);
17034
17035                 this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null);
17036                 if (!this._pos) {
17037                         var browserWidth = document.documentElement.clientWidth;
17038                         var browserHeight = document.documentElement.clientHeight;
17039                         var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
17040                         var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
17041                         this._pos = // should use actual width/height below
17042                                 [(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY];
17043                 }
17044
17045                 // move input on screen for focus, but hidden behind dialog
17046                 this._dialogInput.css('left', (this._pos[0] + 20) + 'px').css('top', this._pos[1] + 'px');
17047                 inst.settings.onSelect = onSelect;
17048                 this._inDialog = true;
17049                 this.dpDiv.addClass(this._dialogClass);
17050                 this._showDatepicker(this._dialogInput[0]);
17051                 if ($.blockUI)
17052                         $.blockUI(this.dpDiv);
17053                 $.data(this._dialogInput[0], PROP_NAME, inst);
17054                 return this;
17055         },
17056
17057         /* Detach a datepicker from its control.
17058            @param  target    element - the target input field or division or span */
17059         _destroyDatepicker: function(target) {
17060                 var $target = $(target);
17061                 var inst = $.data(target, PROP_NAME);
17062                 if (!$target.hasClass(this.markerClassName)) {
17063                         return;
17064                 }
17065                 var nodeName = target.nodeName.toLowerCase();
17066                 $.removeData(target, PROP_NAME);
17067                 if (nodeName == 'input') {
17068                         inst.append.remove();
17069                         inst.trigger.remove();
17070                         $target.removeClass(this.markerClassName).
17071                                 unbind('focus', this._showDatepicker).
17072                                 unbind('keydown', this._doKeyDown).
17073                                 unbind('keypress', this._doKeyPress).
17074                                 unbind('keyup', this._doKeyUp);
17075                 } else if (nodeName == 'div' || nodeName == 'span')
17076                         $target.removeClass(this.markerClassName).empty();
17077         },
17078
17079         /* Enable the date picker to a jQuery selection.
17080            @param  target    element - the target input field or division or span */
17081         _enableDatepicker: function(target) {
17082                 var $target = $(target);
17083                 var inst = $.data(target, PROP_NAME);
17084                 if (!$target.hasClass(this.markerClassName)) {
17085                         return;
17086                 }
17087                 var nodeName = target.nodeName.toLowerCase();
17088                 if (nodeName == 'input') {
17089                         target.disabled = false;
17090                         inst.trigger.filter('button').
17091                                 each(function() { this.disabled = false; }).end().
17092                                 filter('img').css({opacity: '1.0', cursor: ''});
17093                 }
17094                 else if (nodeName == 'div' || nodeName == 'span') {
17095                         var inline = $target.children('.' + this._inlineClass);
17096                         inline.children().removeClass('ui-state-disabled');
17097                 }
17098                 this._disabledInputs = $.map(this._disabledInputs,
17099                         function(value) { return (value == target ? null : value); }); // delete entry
17100         },
17101
17102         /* Disable the date picker to a jQuery selection.
17103            @param  target    element - the target input field or division or span */
17104         _disableDatepicker: function(target) {
17105                 var $target = $(target);
17106                 var inst = $.data(target, PROP_NAME);
17107                 if (!$target.hasClass(this.markerClassName)) {
17108                         return;
17109                 }
17110                 var nodeName = target.nodeName.toLowerCase();
17111                 if (nodeName == 'input') {
17112                         target.disabled = true;
17113                         inst.trigger.filter('button').
17114                                 each(function() { this.disabled = true; }).end().
17115                                 filter('img').css({opacity: '0.5', cursor: 'default'});
17116                 }
17117                 else if (nodeName == 'div' || nodeName == 'span') {
17118                         var inline = $target.children('.' + this._inlineClass);
17119                         inline.children().addClass('ui-state-disabled');
17120                 }
17121                 this._disabledInputs = $.map(this._disabledInputs,
17122                         function(value) { return (value == target ? null : value); }); // delete entry
17123                 this._disabledInputs[this._disabledInputs.length] = target;
17124         },
17125
17126         /* Is the first field in a jQuery collection disabled as a datepicker?
17127            @param  target    element - the target input field or division or span
17128            @return boolean - true if disabled, false if enabled */
17129         _isDisabledDatepicker: function(target) {
17130                 if (!target) {
17131                         return false;
17132                 }
17133                 for (var i = 0; i < this._disabledInputs.length; i++) {
17134                         if (this._disabledInputs[i] == target)
17135                                 return true;
17136                 }
17137                 return false;
17138         },
17139
17140         /* Retrieve the instance data for the target control.
17141            @param  target  element - the target input field or division or span
17142            @return  object - the associated instance data
17143            @throws  error if a jQuery problem getting data */
17144         _getInst: function(target) {
17145                 try {
17146                         return $.data(target, PROP_NAME);
17147                 }
17148                 catch (err) {
17149                         throw 'Missing instance data for this datepicker';
17150                 }
17151         },
17152
17153         /* Update or retrieve the settings for a date picker attached to an input field or division.
17154            @param  target  element - the target input field or division or span
17155            @param  name    object - the new settings to update or
17156                            string - the name of the setting to change or retrieve,
17157                            when retrieving also 'all' for all instance settings or
17158                            'defaults' for all global defaults
17159            @param  value   any - the new value for the setting
17160                            (omit if above is an object or to retrieve a value) */
17161         _optionDatepicker: function(target, name, value) {
17162                 var inst = this._getInst(target);
17163                 if (arguments.length == 2 && typeof name == 'string') {
17164                         return (name == 'defaults' ? $.extend({}, $.datepicker._defaults) :
17165                                 (inst ? (name == 'all' ? $.extend({}, inst.settings) :
17166                                 this._get(inst, name)) : null));
17167                 }
17168                 var settings = name || {};
17169                 if (typeof name == 'string') {
17170                         settings = {};
17171                         settings[name] = value;
17172                 }
17173                 if (inst) {
17174                         if (this._curInst == inst) {
17175                                 this._hideDatepicker();
17176                         }
17177                         var date = this._getDateDatepicker(target, true);
17178                         var minDate = this._getMinMaxDate(inst, 'min');
17179                         var maxDate = this._getMinMaxDate(inst, 'max');
17180                         extendRemove(inst.settings, settings);
17181                         // reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided
17182                         if (minDate !== null && settings['dateFormat'] !== undefined && settings['minDate'] === undefined)
17183                                 inst.settings.minDate = this._formatDate(inst, minDate);
17184                         if (maxDate !== null && settings['dateFormat'] !== undefined && settings['maxDate'] === undefined)
17185                                 inst.settings.maxDate = this._formatDate(inst, maxDate);
17186                         this._attachments($(target), inst);
17187                         this._autoSize(inst);
17188                         this._setDateDatepicker(target, date);
17189                         this._updateDatepicker(inst);
17190                 }
17191         },
17192
17193         // change method deprecated
17194         _changeDatepicker: function(target, name, value) {
17195                 this._optionDatepicker(target, name, value);
17196         },
17197
17198         /* Redraw the date picker attached to an input field or division.
17199            @param  target  element - the target input field or division or span */
17200         _refreshDatepicker: function(target) {
17201                 var inst = this._getInst(target);
17202                 if (inst) {
17203                         this._updateDatepicker(inst);
17204                 }
17205         },
17206
17207         /* Set the dates for a jQuery selection.
17208            @param  target   element - the target input field or division or span
17209            @param  date     Date - the new date */
17210         _setDateDatepicker: function(target, date) {
17211                 var inst = this._getInst(target);
17212                 if (inst) {
17213                         this._setDate(inst, date);
17214                         this._updateDatepicker(inst);
17215                         this._updateAlternate(inst);
17216                 }
17217         },
17218
17219         /* Get the date(s) for the first entry in a jQuery selection.
17220            @param  target     element - the target input field or division or span
17221            @param  noDefault  boolean - true if no default date is to be used
17222            @return Date - the current date */
17223         _getDateDatepicker: function(target, noDefault) {
17224                 var inst = this._getInst(target);
17225                 if (inst && !inst.inline)
17226                         this._setDateFromField(inst, noDefault);
17227                 return (inst ? this._getDate(inst) : null);
17228         },
17229
17230         /* Handle keystrokes. */
17231         _doKeyDown: function(event) {
17232                 var inst = $.datepicker._getInst(event.target);
17233                 var handled = true;
17234                 var isRTL = inst.dpDiv.is('.ui-datepicker-rtl');
17235                 inst._keyEvent = true;
17236                 if ($.datepicker._datepickerShowing)
17237                         switch (event.keyCode) {
17238                                 case 9: $.datepicker._hideDatepicker();
17239                                                 handled = false;
17240                                                 break; // hide on tab out
17241                                 case 13: var sel = $('td.' + $.datepicker._dayOverClass + ':not(.' + 
17242                                                                         $.datepicker._currentClass + ')', inst.dpDiv);
17243                                                 if (sel[0])
17244                                                         $.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]);
17245                                                 else
17246                                                         $.datepicker._hideDatepicker();
17247                                                 return false; // don't submit the form
17248                                                 break; // select the value on enter
17249                                 case 27: $.datepicker._hideDatepicker();
17250                                                 break; // hide on escape
17251                                 case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
17252                                                         -$.datepicker._get(inst, 'stepBigMonths') :
17253                                                         -$.datepicker._get(inst, 'stepMonths')), 'M');
17254                                                 break; // previous month/year on page up/+ ctrl
17255                                 case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
17256                                                         +$.datepicker._get(inst, 'stepBigMonths') :
17257                                                         +$.datepicker._get(inst, 'stepMonths')), 'M');
17258                                                 break; // next month/year on page down/+ ctrl
17259                                 case 35: if (event.ctrlKey || event.metaKey) $.datepicker._clearDate(event.target);
17260                                                 handled = event.ctrlKey || event.metaKey;
17261                                                 break; // clear on ctrl or command +end
17262                                 case 36: if (event.ctrlKey || event.metaKey) $.datepicker._gotoToday(event.target);
17263                                                 handled = event.ctrlKey || event.metaKey;
17264                                                 break; // current on ctrl or command +home
17265                                 case 37: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), 'D');
17266                                                 handled = event.ctrlKey || event.metaKey;
17267                                                 // -1 day on ctrl or command +left
17268                                                 if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ?
17269                                                                         -$.datepicker._get(inst, 'stepBigMonths') :
17270                                                                         -$.datepicker._get(inst, 'stepMonths')), 'M');
17271                                                 // next month/year on alt +left on Mac
17272                                                 break;
17273                                 case 38: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, -7, 'D');
17274                                                 handled = event.ctrlKey || event.metaKey;
17275                                                 break; // -1 week on ctrl or command +up
17276                                 case 39: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), 'D');
17277                                                 handled = event.ctrlKey || event.metaKey;
17278                                                 // +1 day on ctrl or command +right
17279                                                 if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ?
17280                                                                         +$.datepicker._get(inst, 'stepBigMonths') :
17281                                                                         +$.datepicker._get(inst, 'stepMonths')), 'M');
17282                                                 // next month/year on alt +right
17283                                                 break;
17284                                 case 40: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, +7, 'D');
17285                                                 handled = event.ctrlKey || event.metaKey;
17286                                                 break; // +1 week on ctrl or command +down
17287                                 default: handled = false;
17288                         }
17289                 else if (event.keyCode == 36 && event.ctrlKey) // display the date picker on ctrl+home
17290                         $.datepicker._showDatepicker(this);
17291                 else {
17292                         handled = false;
17293                 }
17294                 if (handled) {
17295                         event.preventDefault();
17296                         event.stopPropagation();
17297                 }
17298         },
17299
17300         /* Filter entered characters - based on date format. */
17301         _doKeyPress: function(event) {
17302                 var inst = $.datepicker._getInst(event.target);
17303                 if ($.datepicker._get(inst, 'constrainInput')) {
17304                         var chars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat'));
17305                         var chr = String.fromCharCode(event.charCode == undefined ? event.keyCode : event.charCode);
17306                         return event.ctrlKey || event.metaKey || (chr < ' ' || !chars || chars.indexOf(chr) > -1);
17307                 }
17308         },
17309
17310         /* Synchronise manual entry and field/alternate field. */
17311         _doKeyUp: function(event) {
17312                 var inst = $.datepicker._getInst(event.target);
17313                 if (inst.input.val() != inst.lastVal) {
17314                         try {
17315                                 var date = $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'),
17316                                         (inst.input ? inst.input.val() : null),
17317                                         $.datepicker._getFormatConfig(inst));
17318                                 if (date) { // only if valid
17319                                         $.datepicker._setDateFromField(inst);
17320                                         $.datepicker._updateAlternate(inst);
17321                                         $.datepicker._updateDatepicker(inst);
17322                                 }
17323                         }
17324                         catch (event) {
17325                                 $.datepicker.log(event);
17326                         }
17327                 }
17328                 return true;
17329         },
17330
17331         /* Pop-up the date picker for a given input field.
17332            @param  input  element - the input field attached to the date picker or
17333                           event - if triggered by focus */
17334         _showDatepicker: function(input) {
17335                 input = input.target || input;
17336                 if (input.nodeName.toLowerCase() != 'input') // find from button/image trigger
17337                         input = $('input', input.parentNode)[0];
17338                 if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput == input) // already here
17339                         return;
17340                 var inst = $.datepicker._getInst(input);
17341                 if ($.datepicker._curInst && $.datepicker._curInst != inst) {
17342                         $.datepicker._curInst.dpDiv.stop(true, true);
17343                 }
17344                 var beforeShow = $.datepicker._get(inst, 'beforeShow');
17345                 extendRemove(inst.settings, (beforeShow ? beforeShow.apply(input, [input, inst]) : {}));
17346                 inst.lastVal = null;
17347                 $.datepicker._lastInput = input;
17348                 $.datepicker._setDateFromField(inst);
17349                 if ($.datepicker._inDialog) // hide cursor
17350                         input.value = '';
17351                 if (!$.datepicker._pos) { // position below input
17352                         $.datepicker._pos = $.datepicker._findPos(input);
17353                         $.datepicker._pos[1] += input.offsetHeight; // add the height
17354                 }
17355                 var isFixed = false;
17356                 $(input).parents().each(function() {
17357                         isFixed |= $(this).css('position') == 'fixed';
17358                         return !isFixed;
17359                 });
17360                 if (isFixed && $.browser.opera) { // correction for Opera when fixed and scrolled
17361                         $.datepicker._pos[0] -= document.documentElement.scrollLeft;
17362                         $.datepicker._pos[1] -= document.documentElement.scrollTop;
17363                 }
17364                 var offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]};
17365                 $.datepicker._pos = null;
17366                 //to avoid flashes on Firefox
17367                 inst.dpDiv.empty();
17368                 // determine sizing offscreen
17369                 inst.dpDiv.css({position: 'absolute', display: 'block', top: '-1000px'});
17370                 $.datepicker._updateDatepicker(inst);
17371                 // fix width for dynamic number of date pickers
17372                 // and adjust position before showing
17373                 offset = $.datepicker._checkOffset(inst, offset, isFixed);
17374                 inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ?
17375                         'static' : (isFixed ? 'fixed' : 'absolute')), display: 'none',
17376                         left: offset.left + 'px', top: offset.top + 'px'});
17377                 if (!inst.inline) {
17378                         var showAnim = $.datepicker._get(inst, 'showAnim');
17379                         var duration = $.datepicker._get(inst, 'duration');
17380                         var postProcess = function() {
17381                                 $.datepicker._datepickerShowing = true;
17382                                 var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only
17383                                 if( !! cover.length ){
17384                                         var borders = $.datepicker._getBorders(inst.dpDiv);
17385                                         cover.css({left: -borders[0], top: -borders[1],
17386                                                 width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()});
17387                                 }
17388                         };
17389                         inst.dpDiv.zIndex($(input).zIndex()+1);
17390                         if ($.effects && $.effects[showAnim])
17391                                 inst.dpDiv.show(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
17392                         else
17393                                 inst.dpDiv[showAnim || 'show']((showAnim ? duration : null), postProcess);
17394                         if (!showAnim || !duration)
17395                                 postProcess();
17396                         if (inst.input.is(':visible') && !inst.input.is(':disabled'))
17397                                 inst.input.focus();
17398                         $.datepicker._curInst = inst;
17399                 }
17400         },
17401
17402         /* Generate the date picker content. */
17403         _updateDatepicker: function(inst) {
17404                 var self = this;
17405                 var borders = $.datepicker._getBorders(inst.dpDiv);
17406                 inst.dpDiv.empty().append(this._generateHTML(inst));
17407                 var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only
17408                 if( !!cover.length ){ //avoid call to outerXXXX() when not in IE6
17409                         cover.css({left: -borders[0], top: -borders[1], width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()})
17410                 }
17411                 inst.dpDiv.find('button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a')
17412                                 .bind('mouseout', function(){
17413                                         $(this).removeClass('ui-state-hover');
17414                                         if(this.className.indexOf('ui-datepicker-prev') != -1) $(this).removeClass('ui-datepicker-prev-hover');
17415                                         if(this.className.indexOf('ui-datepicker-next') != -1) $(this).removeClass('ui-datepicker-next-hover');
17416                                 })
17417                                 .bind('mouseover', function(){
17418                                         if (!self._isDisabledDatepicker( inst.inline ? inst.dpDiv.parent()[0] : inst.input[0])) {
17419                                                 $(this).parents('.ui-datepicker-calendar').find('a').removeClass('ui-state-hover');
17420                                                 $(this).addClass('ui-state-hover');
17421                                                 if(this.className.indexOf('ui-datepicker-prev') != -1) $(this).addClass('ui-datepicker-prev-hover');
17422                                                 if(this.className.indexOf('ui-datepicker-next') != -1) $(this).addClass('ui-datepicker-next-hover');
17423                                         }
17424                                 })
17425                         .end()
17426                         .find('.' + this._dayOverClass + ' a')
17427                                 .trigger('mouseover')
17428                         .end();
17429                 var numMonths = this._getNumberOfMonths(inst);
17430                 var cols = numMonths[1];
17431                 var width = 17;
17432                 if (cols > 1)
17433                         inst.dpDiv.addClass('ui-datepicker-multi-' + cols).css('width', (width * cols) + 'em');
17434                 else
17435                         inst.dpDiv.removeClass('ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4').width('');
17436                 inst.dpDiv[(numMonths[0] != 1 || numMonths[1] != 1 ? 'add' : 'remove') +
17437                         'Class']('ui-datepicker-multi');
17438                 inst.dpDiv[(this._get(inst, 'isRTL') ? 'add' : 'remove') +
17439                         'Class']('ui-datepicker-rtl');
17440                 if (inst == $.datepicker._curInst && $.datepicker._datepickerShowing && inst.input &&
17441                                 // #6694 - don't focus the input if it's already focused
17442                                 // this breaks the change event in IE
17443                                 inst.input.is(':visible') && !inst.input.is(':disabled') && inst.input[0] != document.activeElement)
17444                         inst.input.focus();
17445                 // deffered render of the years select (to avoid flashes on Firefox) 
17446                 if( inst.yearshtml ){
17447                         var origyearshtml = inst.yearshtml;
17448                         setTimeout(function(){
17449                                 //assure that inst.yearshtml didn't change.
17450                                 if( origyearshtml === inst.yearshtml ){
17451                                         inst.dpDiv.find('select.ui-datepicker-year:first').replaceWith(inst.yearshtml);
17452                                 }
17453                                 origyearshtml = inst.yearshtml = null;
17454                         }, 0);
17455                 }
17456         },
17457
17458         /* Retrieve the size of left and top borders for an element.
17459            @param  elem  (jQuery object) the element of interest
17460            @return  (number[2]) the left and top borders */
17461         _getBorders: function(elem) {
17462                 var convert = function(value) {
17463                         return {thin: 1, medium: 2, thick: 3}[value] || value;
17464                 };
17465                 return [parseFloat(convert(elem.css('border-left-width'))),
17466                         parseFloat(convert(elem.css('border-top-width')))];
17467         },
17468
17469         /* Check positioning to remain on screen. */
17470         _checkOffset: function(inst, offset, isFixed) {
17471                 var dpWidth = inst.dpDiv.outerWidth();
17472                 var dpHeight = inst.dpDiv.outerHeight();
17473                 var inputWidth = inst.input ? inst.input.outerWidth() : 0;
17474                 var inputHeight = inst.input ? inst.input.outerHeight() : 0;
17475                 var viewWidth = document.documentElement.clientWidth + $(document).scrollLeft();
17476                 var viewHeight = document.documentElement.clientHeight + $(document).scrollTop();
17477
17478                 offset.left -= (this._get(inst, 'isRTL') ? (dpWidth - inputWidth) : 0);
17479                 offset.left -= (isFixed && offset.left == inst.input.offset().left) ? $(document).scrollLeft() : 0;
17480                 offset.top -= (isFixed && offset.top == (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0;
17481
17482                 // now check if datepicker is showing outside window viewport - move to a better place if so.
17483                 offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ?
17484                         Math.abs(offset.left + dpWidth - viewWidth) : 0);
17485                 offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ?
17486                         Math.abs(dpHeight + inputHeight) : 0);
17487
17488                 return offset;
17489         },
17490
17491         /* Find an object's position on the screen. */
17492         _findPos: function(obj) {
17493                 var inst = this._getInst(obj);
17494                 var isRTL = this._get(inst, 'isRTL');
17495         while (obj && (obj.type == 'hidden' || obj.nodeType != 1 || $.expr.filters.hidden(obj))) {
17496             obj = obj[isRTL ? 'previousSibling' : 'nextSibling'];
17497         }
17498         var position = $(obj).offset();
17499             return [position.left, position.top];
17500         },
17501
17502         /* Hide the date picker from view.
17503            @param  input  element - the input field attached to the date picker */
17504         _hideDatepicker: function(input) {
17505                 var inst = this._curInst;
17506                 if (!inst || (input && inst != $.data(input, PROP_NAME)))
17507                         return;
17508                 if (this._datepickerShowing) {
17509                         var showAnim = this._get(inst, 'showAnim');
17510                         var duration = this._get(inst, 'duration');
17511                         var postProcess = function() {
17512                                 $.datepicker._tidyDialog(inst);
17513                                 this._curInst = null;
17514                         };
17515                         if ($.effects && $.effects[showAnim])
17516                                 inst.dpDiv.hide(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
17517                         else
17518                                 inst.dpDiv[(showAnim == 'slideDown' ? 'slideUp' :
17519                                         (showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))]((showAnim ? duration : null), postProcess);
17520                         if (!showAnim)
17521                                 postProcess();
17522                         var onClose = this._get(inst, 'onClose');
17523                         if (onClose)
17524                                 onClose.apply((inst.input ? inst.input[0] : null),
17525                                         [(inst.input ? inst.input.val() : ''), inst]);  // trigger custom callback
17526                         this._datepickerShowing = false;
17527                         this._lastInput = null;
17528                         if (this._inDialog) {
17529                                 this._dialogInput.css({ position: 'absolute', left: '0', top: '-100px' });
17530                                 if ($.blockUI) {
17531                                         $.unblockUI();
17532                                         $('body').append(this.dpDiv);
17533                                 }
17534                         }
17535                         this._inDialog = false;
17536                 }
17537         },
17538
17539         /* Tidy up after a dialog display. */
17540         _tidyDialog: function(inst) {
17541                 inst.dpDiv.removeClass(this._dialogClass).unbind('.ui-datepicker-calendar');
17542         },
17543
17544         /* Close date picker if clicked elsewhere. */
17545         _checkExternalClick: function(event) {
17546                 if (!$.datepicker._curInst)
17547                         return;
17548                 var $target = $(event.target);
17549                 if ($target[0].id != $.datepicker._mainDivId &&
17550                                 $target.parents('#' + $.datepicker._mainDivId).length == 0 &&
17551                                 !$target.hasClass($.datepicker.markerClassName) &&
17552                                 !$target.hasClass($.datepicker._triggerClass) &&
17553                                 $.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI))
17554                         $.datepicker._hideDatepicker();
17555         },
17556
17557         /* Adjust one of the date sub-fields. */
17558         _adjustDate: function(id, offset, period) {
17559                 var target = $(id);
17560                 var inst = this._getInst(target[0]);
17561                 if (this._isDisabledDatepicker(target[0])) {
17562                         return;
17563                 }
17564                 this._adjustInstDate(inst, offset +
17565                         (period == 'M' ? this._get(inst, 'showCurrentAtPos') : 0), // undo positioning
17566                         period);
17567                 this._updateDatepicker(inst);
17568         },
17569
17570         /* Action for current link. */
17571         _gotoToday: function(id) {
17572                 var target = $(id);
17573                 var inst = this._getInst(target[0]);
17574                 if (this._get(inst, 'gotoCurrent') && inst.currentDay) {
17575                         inst.selectedDay = inst.currentDay;
17576                         inst.drawMonth = inst.selectedMonth = inst.currentMonth;
17577                         inst.drawYear = inst.selectedYear = inst.currentYear;
17578                 }
17579                 else {
17580                         var date = new Date();
17581                         inst.selectedDay = date.getDate();
17582                         inst.drawMonth = inst.selectedMonth = date.getMonth();
17583                         inst.drawYear = inst.selectedYear = date.getFullYear();
17584                 }
17585                 this._notifyChange(inst);
17586                 this._adjustDate(target);
17587         },
17588
17589         /* Action for selecting a new month/year. */
17590         _selectMonthYear: function(id, select, period) {
17591                 var target = $(id);
17592                 var inst = this._getInst(target[0]);
17593                 inst._selectingMonthYear = false;
17594                 inst['selected' + (period == 'M' ? 'Month' : 'Year')] =
17595                 inst['draw' + (period == 'M' ? 'Month' : 'Year')] =
17596                         parseInt(select.options[select.selectedIndex].value,10);
17597                 this._notifyChange(inst);
17598                 this._adjustDate(target);
17599         },
17600
17601         /* Restore input focus after not changing month/year. */
17602         _clickMonthYear: function(id) {
17603                 var target = $(id);
17604                 var inst = this._getInst(target[0]);
17605                 if (inst.input && inst._selectingMonthYear) {
17606                         setTimeout(function() {
17607                                 inst.input.focus();
17608                         }, 0);
17609                 }
17610                 inst._selectingMonthYear = !inst._selectingMonthYear;
17611         },
17612
17613         /* Action for selecting a day. */
17614         _selectDay: function(id, month, year, td) {
17615                 var target = $(id);
17616                 if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) {
17617                         return;
17618                 }
17619                 var inst = this._getInst(target[0]);
17620                 inst.selectedDay = inst.currentDay = $('a', td).html();
17621                 inst.selectedMonth = inst.currentMonth = month;
17622                 inst.selectedYear = inst.currentYear = year;
17623                 this._selectDate(id, this._formatDate(inst,
17624                         inst.currentDay, inst.currentMonth, inst.currentYear));
17625         },
17626
17627         /* Erase the input field and hide the date picker. */
17628         _clearDate: function(id) {
17629                 var target = $(id);
17630                 var inst = this._getInst(target[0]);
17631                 this._selectDate(target, '');
17632         },
17633
17634         /* Update the input field with the selected date. */
17635         _selectDate: function(id, dateStr) {
17636                 var target = $(id);
17637                 var inst = this._getInst(target[0]);
17638                 dateStr = (dateStr != null ? dateStr : this._formatDate(inst));
17639                 if (inst.input)
17640                         inst.input.val(dateStr);
17641                 this._updateAlternate(inst);
17642                 var onSelect = this._get(inst, 'onSelect');
17643                 if (onSelect)
17644                         onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);  // trigger custom callback
17645                 else if (inst.input)
17646                         inst.input.trigger('change'); // fire the change event
17647                 if (inst.inline)
17648                         this._updateDatepicker(inst);
17649                 else {
17650                         this._hideDatepicker();
17651                         this._lastInput = inst.input[0];
17652                         if (typeof(inst.input[0]) != 'object')
17653                                 inst.input.focus(); // restore focus
17654                         this._lastInput = null;
17655                 }
17656         },
17657
17658         /* Update any alternate field to synchronise with the main field. */
17659         _updateAlternate: function(inst) {
17660                 var altField = this._get(inst, 'altField');
17661                 if (altField) { // update alternate field too
17662                         var altFormat = this._get(inst, 'altFormat') || this._get(inst, 'dateFormat');
17663                         var date = this._getDate(inst);
17664                         var dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst));
17665                         $(altField).each(function() { $(this).val(dateStr); });
17666                 }
17667         },
17668
17669         /* Set as beforeShowDay function to prevent selection of weekends.
17670            @param  date  Date - the date to customise
17671            @return [boolean, string] - is this date selectable?, what is its CSS class? */
17672         noWeekends: function(date) {
17673                 var day = date.getDay();
17674                 return [(day > 0 && day < 6), ''];
17675         },
17676
17677         /* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
17678            @param  date  Date - the date to get the week for
17679            @return  number - the number of the week within the year that contains this date */
17680         iso8601Week: function(date) {
17681                 var checkDate = new Date(date.getTime());
17682                 // Find Thursday of this week starting on Monday
17683                 checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
17684                 var time = checkDate.getTime();
17685                 checkDate.setMonth(0); // Compare with Jan 1
17686                 checkDate.setDate(1);
17687                 return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;
17688         },
17689
17690         /* Parse a string value into a date object.
17691            See formatDate below for the possible formats.
17692
17693            @param  format    string - the expected format of the date
17694            @param  value     string - the date in the above format
17695            @param  settings  Object - attributes include:
17696                              shortYearCutoff  number - the cutoff year for determining the century (optional)
17697                              dayNamesShort    string[7] - abbreviated names of the days from Sunday (optional)
17698                              dayNames         string[7] - names of the days from Sunday (optional)
17699                              monthNamesShort  string[12] - abbreviated names of the months (optional)
17700                              monthNames       string[12] - names of the months (optional)
17701            @return  Date - the extracted date value or null if value is blank */
17702         parseDate: function (format, value, settings) {
17703                 if (format == null || value == null)
17704                         throw 'Invalid arguments';
17705                 value = (typeof value == 'object' ? value.toString() : value + '');
17706                 if (value == '')
17707                         return null;
17708                 var shortYearCutoff = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff;
17709                 shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff :
17710                                 new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
17711                 var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
17712                 var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
17713                 var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
17714                 var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
17715                 var year = -1;
17716                 var month = -1;
17717                 var day = -1;
17718                 var doy = -1;
17719                 var literal = false;
17720                 // Check whether a format character is doubled
17721                 var lookAhead = function(match) {
17722                         var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
17723                         if (matches)
17724                                 iFormat++;
17725                         return matches;
17726                 };
17727                 // Extract a number from the string value
17728                 var getNumber = function(match) {
17729                         var isDoubled = lookAhead(match);
17730                         var size = (match == '@' ? 14 : (match == '!' ? 20 :
17731                                 (match == 'y' && isDoubled ? 4 : (match == 'o' ? 3 : 2))));
17732                         var digits = new RegExp('^\\d{1,' + size + '}');
17733                         var num = value.substring(iValue).match(digits);
17734                         if (!num)
17735                                 throw 'Missing number at position ' + iValue;
17736                         iValue += num[0].length;
17737                         return parseInt(num[0], 10);
17738                 };
17739                 // Extract a name from the string value and convert to an index
17740                 var getName = function(match, shortNames, longNames) {
17741                         var names = (lookAhead(match) ? longNames : shortNames);
17742                         for (var i = 0; i < names.length; i++) {
17743                                 if (value.substr(iValue, names[i].length).toLowerCase() == names[i].toLowerCase()) {
17744                                         iValue += names[i].length;
17745                                         return i + 1;
17746                                 }
17747                         }
17748                         throw 'Unknown name at position ' + iValue;
17749                 };
17750                 // Confirm that a literal character matches the string value
17751                 var checkLiteral = function() {
17752                         if (value.charAt(iValue) != format.charAt(iFormat))
17753                                 throw 'Unexpected literal at position ' + iValue;
17754                         iValue++;
17755                 };
17756                 var iValue = 0;
17757                 for (var iFormat = 0; iFormat < format.length; iFormat++) {
17758                         if (literal)
17759                                 if (format.charAt(iFormat) == "'" && !lookAhead("'"))
17760                                         literal = false;
17761                                 else
17762                                         checkLiteral();
17763                         else
17764                                 switch (format.charAt(iFormat)) {
17765                                         case 'd':
17766                                                 day = getNumber('d');
17767                                                 break;
17768                                         case 'D':
17769                                                 getName('D', dayNamesShort, dayNames);
17770                                                 break;
17771                                         case 'o':
17772                                                 doy = getNumber('o');
17773                                                 break;
17774                                         case 'm':
17775                                                 month = getNumber('m');
17776                                                 break;
17777                                         case 'M':
17778                                                 month = getName('M', monthNamesShort, monthNames);
17779                                                 break;
17780                                         case 'y':
17781                                                 year = getNumber('y');
17782                                                 break;
17783                                         case '@':
17784                                                 var date = new Date(getNumber('@'));
17785                                                 year = date.getFullYear();
17786                                                 month = date.getMonth() + 1;
17787                                                 day = date.getDate();
17788                                                 break;
17789                                         case '!':
17790                                                 var date = new Date((getNumber('!') - this._ticksTo1970) / 10000);
17791                                                 year = date.getFullYear();
17792                                                 month = date.getMonth() + 1;
17793                                                 day = date.getDate();
17794                                                 break;
17795                                         case "'":
17796                                                 if (lookAhead("'"))
17797                                                         checkLiteral();
17798                                                 else
17799                                                         literal = true;
17800                                                 break;
17801                                         default:
17802                                                 checkLiteral();
17803                                 }
17804                 }
17805                 if (year == -1)
17806                         year = new Date().getFullYear();
17807                 else if (year < 100)
17808                         year += new Date().getFullYear() - new Date().getFullYear() % 100 +
17809                                 (year <= shortYearCutoff ? 0 : -100);
17810                 if (doy > -1) {
17811                         month = 1;
17812                         day = doy;
17813                         do {
17814                                 var dim = this._getDaysInMonth(year, month - 1);
17815                                 if (day <= dim)
17816                                         break;
17817                                 month++;
17818                                 day -= dim;
17819                         } while (true);
17820                 }
17821                 var date = this._daylightSavingAdjust(new Date(year, month - 1, day));
17822                 if (date.getFullYear() != year || date.getMonth() + 1 != month || date.getDate() != day)
17823                         throw 'Invalid date'; // E.g. 31/02/00
17824                 return date;
17825         },
17826
17827         /* Standard date formats. */
17828         ATOM: 'yy-mm-dd', // RFC 3339 (ISO 8601)
17829         COOKIE: 'D, dd M yy',
17830         ISO_8601: 'yy-mm-dd',
17831         RFC_822: 'D, d M y',
17832         RFC_850: 'DD, dd-M-y',
17833         RFC_1036: 'D, d M y',
17834         RFC_1123: 'D, d M yy',
17835         RFC_2822: 'D, d M yy',
17836         RSS: 'D, d M y', // RFC 822
17837         TICKS: '!',
17838         TIMESTAMP: '@',
17839         W3C: 'yy-mm-dd', // ISO 8601
17840
17841         _ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) +
17842                 Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000),
17843
17844         /* Format a date object into a string value.
17845            The format can be combinations of the following:
17846            d  - day of month (no leading zero)
17847            dd - day of month (two digit)
17848            o  - day of year (no leading zeros)
17849            oo - day of year (three digit)
17850            D  - day name short
17851            DD - day name long
17852            m  - month of year (no leading zero)
17853            mm - month of year (two digit)
17854            M  - month name short
17855            MM - month name long
17856            y  - year (two digit)
17857            yy - year (four digit)
17858            @ - Unix timestamp (ms since 01/01/1970)
17859            ! - Windows ticks (100ns since 01/01/0001)
17860            '...' - literal text
17861            '' - single quote
17862
17863            @param  format    string - the desired format of the date
17864            @param  date      Date - the date value to format
17865            @param  settings  Object - attributes include:
17866                              dayNamesShort    string[7] - abbreviated names of the days from Sunday (optional)
17867                              dayNames         string[7] - names of the days from Sunday (optional)
17868                              monthNamesShort  string[12] - abbreviated names of the months (optional)
17869                              monthNames       string[12] - names of the months (optional)
17870            @return  string - the date in the above format */
17871         formatDate: function (format, date, settings) {
17872                 if (!date)
17873                         return '';
17874                 var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
17875                 var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
17876                 var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
17877                 var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
17878                 // Check whether a format character is doubled
17879                 var lookAhead = function(match) {
17880                         var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
17881                         if (matches)
17882                                 iFormat++;
17883                         return matches;
17884                 };
17885                 // Format a number, with leading zero if necessary
17886                 var formatNumber = function(match, value, len) {
17887                         var num = '' + value;
17888                         if (lookAhead(match))
17889                                 while (num.length < len)
17890                                         num = '0' + num;
17891                         return num;
17892                 };
17893                 // Format a name, short or long as requested
17894                 var formatName = function(match, value, shortNames, longNames) {
17895                         return (lookAhead(match) ? longNames[value] : shortNames[value]);
17896                 };
17897                 var output = '';
17898                 var literal = false;
17899                 if (date)
17900                         for (var iFormat = 0; iFormat < format.length; iFormat++) {
17901                                 if (literal)
17902                                         if (format.charAt(iFormat) == "'" && !lookAhead("'"))
17903                                                 literal = false;
17904                                         else
17905                                                 output += format.charAt(iFormat);
17906                                 else
17907                                         switch (format.charAt(iFormat)) {
17908                                                 case 'd':
17909                                                         output += formatNumber('d', date.getDate(), 2);
17910                                                         break;
17911                                                 case 'D':
17912                                                         output += formatName('D', date.getDay(), dayNamesShort, dayNames);
17913                                                         break;
17914                                                 case 'o':
17915                                                         output += formatNumber('o',
17916                                                                 (date.getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000, 3);
17917                                                         break;
17918                                                 case 'm':
17919                                                         output += formatNumber('m', date.getMonth() + 1, 2);
17920                                                         break;
17921                                                 case 'M':
17922                                                         output += formatName('M', date.getMonth(), monthNamesShort, monthNames);
17923                                                         break;
17924                                                 case 'y':
17925                                                         output += (lookAhead('y') ? date.getFullYear() :
17926                                                                 (date.getYear() % 100 < 10 ? '0' : '') + date.getYear() % 100);
17927                                                         break;
17928                                                 case '@':
17929                                                         output += date.getTime();
17930                                                         break;
17931                                                 case '!':
17932                                                         output += date.getTime() * 10000 + this._ticksTo1970;
17933                                                         break;
17934                                                 case "'":
17935                                                         if (lookAhead("'"))
17936                                                                 output += "'";
17937                                                         else
17938                                                                 literal = true;
17939                                                         break;
17940                                                 default:
17941                                                         output += format.charAt(iFormat);
17942                                         }
17943                         }
17944                 return output;
17945         },
17946
17947         /* Extract all possible characters from the date format. */
17948         _possibleChars: function (format) {
17949                 var chars = '';
17950                 var literal = false;
17951                 // Check whether a format character is doubled
17952                 var lookAhead = function(match) {
17953                         var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
17954                         if (matches)
17955                                 iFormat++;
17956                         return matches;
17957                 };
17958                 for (var iFormat = 0; iFormat < format.length; iFormat++)
17959                         if (literal)
17960                                 if (format.charAt(iFormat) == "'" && !lookAhead("'"))
17961                                         literal = false;
17962                                 else
17963                                         chars += format.charAt(iFormat);
17964                         else
17965                                 switch (format.charAt(iFormat)) {
17966                                         case 'd': case 'm': case 'y': case '@':
17967                                                 chars += '0123456789';
17968                                                 break;
17969                                         case 'D': case 'M':
17970                                                 return null; // Accept anything
17971                                         case "'":
17972                                                 if (lookAhead("'"))
17973                                                         chars += "'";
17974                                                 else
17975                                                         literal = true;
17976                                                 break;
17977                                         default:
17978                                                 chars += format.charAt(iFormat);
17979                                 }
17980                 return chars;
17981         },
17982
17983         /* Get a setting value, defaulting if necessary. */
17984         _get: function(inst, name) {
17985                 return inst.settings[name] !== undefined ?
17986                         inst.settings[name] : this._defaults[name];
17987         },
17988
17989         /* Parse existing date and initialise date picker. */
17990         _setDateFromField: function(inst, noDefault) {
17991                 if (inst.input.val() == inst.lastVal) {
17992                         return;
17993                 }
17994                 var dateFormat = this._get(inst, 'dateFormat');
17995                 var dates = inst.lastVal = inst.input ? inst.input.val() : null;
17996                 var date, defaultDate;
17997                 date = defaultDate = this._getDefaultDate(inst);
17998                 var settings = this._getFormatConfig(inst);
17999                 try {
18000                         date = this.parseDate(dateFormat, dates, settings) || defaultDate;
18001                 } catch (event) {
18002                         this.log(event);
18003                         dates = (noDefault ? '' : dates);
18004                 }
18005                 inst.selectedDay = date.getDate();
18006                 inst.drawMonth = inst.selectedMonth = date.getMonth();
18007                 inst.drawYear = inst.selectedYear = date.getFullYear();
18008                 inst.currentDay = (dates ? date.getDate() : 0);
18009                 inst.currentMonth = (dates ? date.getMonth() : 0);
18010                 inst.currentYear = (dates ? date.getFullYear() : 0);
18011                 this._adjustInstDate(inst);
18012         },
18013
18014         /* Retrieve the default date shown on opening. */
18015         _getDefaultDate: function(inst) {
18016                 return this._restrictMinMax(inst,
18017                         this._determineDate(inst, this._get(inst, 'defaultDate'), new Date()));
18018         },
18019
18020         /* A date may be specified as an exact value or a relative one. */
18021         _determineDate: function(inst, date, defaultDate) {
18022                 var offsetNumeric = function(offset) {
18023                         var date = new Date();
18024                         date.setDate(date.getDate() + offset);
18025                         return date;
18026                 };
18027                 var offsetString = function(offset) {
18028                         try {
18029                                 return $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'),
18030                                         offset, $.datepicker._getFormatConfig(inst));
18031                         }
18032                         catch (e) {
18033                                 // Ignore
18034                         }
18035                         var date = (offset.toLowerCase().match(/^c/) ?
18036                                 $.datepicker._getDate(inst) : null) || new Date();
18037                         var year = date.getFullYear();
18038                         var month = date.getMonth();
18039                         var day = date.getDate();
18040                         var pattern = /([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g;
18041                         var matches = pattern.exec(offset);
18042                         while (matches) {
18043                                 switch (matches[2] || 'd') {
18044                                         case 'd' : case 'D' :
18045                                                 day += parseInt(matches[1],10); break;
18046                                         case 'w' : case 'W' :
18047                                                 day += parseInt(matches[1],10) * 7; break;
18048                                         case 'm' : case 'M' :
18049                                                 month += parseInt(matches[1],10);
18050                                                 day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
18051                                                 break;
18052                                         case 'y': case 'Y' :
18053                                                 year += parseInt(matches[1],10);
18054                                                 day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
18055                                                 break;
18056                                 }
18057                                 matches = pattern.exec(offset);
18058                         }
18059                         return new Date(year, month, day);
18060                 };
18061                 var newDate = (date == null || date === '' ? defaultDate : (typeof date == 'string' ? offsetString(date) :
18062                         (typeof date == 'number' ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime()))));
18063                 newDate = (newDate && newDate.toString() == 'Invalid Date' ? defaultDate : newDate);
18064                 if (newDate) {
18065                         newDate.setHours(0);
18066                         newDate.setMinutes(0);
18067                         newDate.setSeconds(0);
18068                         newDate.setMilliseconds(0);
18069                 }
18070                 return this._daylightSavingAdjust(newDate);
18071         },
18072
18073         /* Handle switch to/from daylight saving.
18074            Hours may be non-zero on daylight saving cut-over:
18075            > 12 when midnight changeover, but then cannot generate
18076            midnight datetime, so jump to 1AM, otherwise reset.
18077            @param  date  (Date) the date to check
18078            @return  (Date) the corrected date */
18079         _daylightSavingAdjust: function(date) {
18080                 if (!date) return null;
18081                 date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);
18082                 return date;
18083         },
18084
18085         /* Set the date(s) directly. */
18086         _setDate: function(inst, date, noChange) {
18087                 var clear = !date;
18088                 var origMonth = inst.selectedMonth;
18089                 var origYear = inst.selectedYear;
18090                 var newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date()));
18091                 inst.selectedDay = inst.currentDay = newDate.getDate();
18092                 inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
18093                 inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
18094                 if ((origMonth != inst.selectedMonth || origYear != inst.selectedYear) && !noChange)
18095                         this._notifyChange(inst);
18096                 this._adjustInstDate(inst);
18097                 if (inst.input) {
18098                         inst.input.val(clear ? '' : this._formatDate(inst));
18099                 }
18100         },
18101
18102         /* Retrieve the date(s) directly. */
18103         _getDate: function(inst) {
18104                 var startDate = (!inst.currentYear || (inst.input && inst.input.val() == '') ? null :
18105                         this._daylightSavingAdjust(new Date(
18106                         inst.currentYear, inst.currentMonth, inst.currentDay)));
18107                         return startDate;
18108         },
18109
18110         /* Generate the HTML for the current state of the date picker. */
18111         _generateHTML: function(inst) {
18112                 var today = new Date();
18113                 today = this._daylightSavingAdjust(
18114                         new Date(today.getFullYear(), today.getMonth(), today.getDate())); // clear time
18115                 var isRTL = this._get(inst, 'isRTL');
18116                 var showButtonPanel = this._get(inst, 'showButtonPanel');
18117                 var hideIfNoPrevNext = this._get(inst, 'hideIfNoPrevNext');
18118                 var navigationAsDateFormat = this._get(inst, 'navigationAsDateFormat');
18119                 var numMonths = this._getNumberOfMonths(inst);
18120                 var showCurrentAtPos = this._get(inst, 'showCurrentAtPos');
18121                 var stepMonths = this._get(inst, 'stepMonths');
18122                 var isMultiMonth = (numMonths[0] != 1 || numMonths[1] != 1);
18123                 var currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) :
18124                         new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
18125                 var minDate = this._getMinMaxDate(inst, 'min');
18126                 var maxDate = this._getMinMaxDate(inst, 'max');
18127                 var drawMonth = inst.drawMonth - showCurrentAtPos;
18128                 var drawYear = inst.drawYear;
18129                 if (drawMonth < 0) {
18130                         drawMonth += 12;
18131                         drawYear--;
18132                 }
18133                 if (maxDate) {
18134                         var maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(),
18135                                 maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate()));
18136                         maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);
18137                         while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) {
18138                                 drawMonth--;
18139                                 if (drawMonth < 0) {
18140                                         drawMonth = 11;
18141                                         drawYear--;
18142                                 }
18143                         }
18144                 }
18145                 inst.drawMonth = drawMonth;
18146                 inst.drawYear = drawYear;
18147                 var prevText = this._get(inst, 'prevText');
18148                 prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText,
18149                         this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)),
18150                         this._getFormatConfig(inst)));
18151                 var prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ?
18152                         '<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_' + dpuuid +
18153                         '.datepicker._adjustDate(\'#' + inst.id + '\', -' + stepMonths + ', \'M\');"' +
18154                         ' title="' + prevText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>' :
18155                         (hideIfNoPrevNext ? '' : '<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+ prevText +'"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>'));
18156                 var nextText = this._get(inst, 'nextText');
18157                 nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText,
18158                         this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)),
18159                         this._getFormatConfig(inst)));
18160                 var next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ?
18161                         '<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_' + dpuuid +
18162                         '.datepicker._adjustDate(\'#' + inst.id + '\', +' + stepMonths + ', \'M\');"' +
18163                         ' title="' + nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>' :
18164                         (hideIfNoPrevNext ? '' : '<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+ nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>'));
18165                 var currentText = this._get(inst, 'currentText');
18166                 var gotoDate = (this._get(inst, 'gotoCurrent') && inst.currentDay ? currentDate : today);
18167                 currentText = (!navigationAsDateFormat ? currentText :
18168                         this.formatDate(currentText, gotoDate, this._getFormatConfig(inst)));
18169                 var controls = (!inst.inline ? '<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_' + dpuuid +
18170                         '.datepicker._hideDatepicker();">' + this._get(inst, 'closeText') + '</button>' : '');
18171                 var buttonPanel = (showButtonPanel) ? '<div class="ui-datepicker-buttonpane ui-widget-content">' + (isRTL ? controls : '') +
18172                         (this._isInRange(inst, gotoDate) ? '<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_' + dpuuid +
18173                         '.datepicker._gotoToday(\'#' + inst.id + '\');"' +
18174                         '>' + currentText + '</button>' : '') + (isRTL ? '' : controls) + '</div>' : '';
18175                 var firstDay = parseInt(this._get(inst, 'firstDay'),10);
18176                 firstDay = (isNaN(firstDay) ? 0 : firstDay);
18177                 var showWeek = this._get(inst, 'showWeek');
18178                 var dayNames = this._get(inst, 'dayNames');
18179                 var dayNamesShort = this._get(inst, 'dayNamesShort');
18180                 var dayNamesMin = this._get(inst, 'dayNamesMin');
18181                 var monthNames = this._get(inst, 'monthNames');
18182                 var monthNamesShort = this._get(inst, 'monthNamesShort');
18183                 var beforeShowDay = this._get(inst, 'beforeShowDay');
18184                 var showOtherMonths = this._get(inst, 'showOtherMonths');
18185                 var selectOtherMonths = this._get(inst, 'selectOtherMonths');
18186                 var calculateWeek = this._get(inst, 'calculateWeek') || this.iso8601Week;
18187                 var defaultDate = this._getDefaultDate(inst);
18188                 var html = '';
18189                 for (var row = 0; row < numMonths[0]; row++) {
18190                         var group = '';
18191                         for (var col = 0; col < numMonths[1]; col++) {
18192                                 var selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay));
18193                                 var cornerClass = ' ui-corner-all';
18194                                 var calender = '';
18195                                 if (isMultiMonth) {
18196                                         calender += '<div class="ui-datepicker-group';
18197                                         if (numMonths[1] > 1)
18198                                                 switch (col) {
18199                                                         case 0: calender += ' ui-datepicker-group-first';
18200                                                                 cornerClass = ' ui-corner-' + (isRTL ? 'right' : 'left'); break;
18201                                                         case numMonths[1]-1: calender += ' ui-datepicker-group-last';
18202                                                                 cornerClass = ' ui-corner-' + (isRTL ? 'left' : 'right'); break;
18203                                                         default: calender += ' ui-datepicker-group-middle'; cornerClass = ''; break;
18204                                                 }
18205                                         calender += '">';
18206                                 }
18207                                 calender += '<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix' + cornerClass + '">' +
18208                                         (/all|left/.test(cornerClass) && row == 0 ? (isRTL ? next : prev) : '') +
18209                                         (/all|right/.test(cornerClass) && row == 0 ? (isRTL ? prev : next) : '') +
18210                                         this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate,
18211                                         row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers
18212                                         '</div><table class="ui-datepicker-calendar"><thead>' +
18213                                         '<tr>';
18214                                 var thead = (showWeek ? '<th class="ui-datepicker-week-col">' + this._get(inst, 'weekHeader') + '</th>' : '');
18215                                 for (var dow = 0; dow < 7; dow++) { // days of the week
18216                                         var day = (dow + firstDay) % 7;
18217                                         thead += '<th' + ((dow + firstDay + 6) % 7 >= 5 ? ' class="ui-datepicker-week-end"' : '') + '>' +
18218                                                 '<span title="' + dayNames[day] + '">' + dayNamesMin[day] + '</span></th>';
18219                                 }
18220                                 calender += thead + '</tr></thead><tbody>';
18221                                 var daysInMonth = this._getDaysInMonth(drawYear, drawMonth);
18222                                 if (drawYear == inst.selectedYear && drawMonth == inst.selectedMonth)
18223                                         inst.selectedDay = Math.min(inst.selectedDay, daysInMonth);
18224                                 var leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
18225                                 var numRows = (isMultiMonth ? 6 : Math.ceil((leadDays + daysInMonth) / 7)); // calculate the number of rows to generate
18226                                 var printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));
18227                                 for (var dRow = 0; dRow < numRows; dRow++) { // create date picker rows
18228                                         calender += '<tr>';
18229                                         var tbody = (!showWeek ? '' : '<td class="ui-datepicker-week-col">' +
18230                                                 this._get(inst, 'calculateWeek')(printDate) + '</td>');
18231                                         for (var dow = 0; dow < 7; dow++) { // create date picker days
18232                                                 var daySettings = (beforeShowDay ?
18233                                                         beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, '']);
18234                                                 var otherMonth = (printDate.getMonth() != drawMonth);
18235                                                 var unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] ||
18236                                                         (minDate && printDate < minDate) || (maxDate && printDate > maxDate);
18237                                                 tbody += '<td class="' +
18238                                                         ((dow + firstDay + 6) % 7 >= 5 ? ' ui-datepicker-week-end' : '') + // highlight weekends
18239                                                         (otherMonth ? ' ui-datepicker-other-month' : '') + // highlight days from other months
18240                                                         ((printDate.getTime() == selectedDate.getTime() && drawMonth == inst.selectedMonth && inst._keyEvent) || // user pressed key
18241                                                         (defaultDate.getTime() == printDate.getTime() && defaultDate.getTime() == selectedDate.getTime()) ?
18242                                                         // or defaultDate is current printedDate and defaultDate is selectedDate
18243                                                         ' ' + this._dayOverClass : '') + // highlight selected day
18244                                                         (unselectable ? ' ' + this._unselectableClass + ' ui-state-disabled': '') +  // highlight unselectable days
18245                                                         (otherMonth && !showOtherMonths ? '' : ' ' + daySettings[1] + // highlight custom dates
18246                                                         (printDate.getTime() == currentDate.getTime() ? ' ' + this._currentClass : '') + // highlight selected day
18247                                                         (printDate.getTime() == today.getTime() ? ' ui-datepicker-today' : '')) + '"' + // highlight today (if different)
18248                                                         ((!otherMonth || showOtherMonths) && daySettings[2] ? ' title="' + daySettings[2] + '"' : '') + // cell title
18249                                                         (unselectable ? '' : ' onclick="DP_jQuery_' + dpuuid + '.datepicker._selectDay(\'#' +
18250                                                         inst.id + '\',' + printDate.getMonth() + ',' + printDate.getFullYear() + ', this);return false;"') + '>' + // actions
18251                                                         (otherMonth && !showOtherMonths ? '&#xa0;' : // display for other months
18252                                                         (unselectable ? '<span class="ui-state-default">' + printDate.getDate() + '</span>' : '<a class="ui-state-default' +
18253                                                         (printDate.getTime() == today.getTime() ? ' ui-state-highlight' : '') +
18254                                                         (printDate.getTime() == currentDate.getTime() ? ' ui-state-active' : '') + // highlight selected day
18255                                                         (otherMonth ? ' ui-priority-secondary' : '') + // distinguish dates from other months
18256                                                         '" href="#">' + printDate.getDate() + '</a>')) + '</td>'; // display selectable date
18257                                                 printDate.setDate(printDate.getDate() + 1);
18258                                                 printDate = this._daylightSavingAdjust(printDate);
18259                                         }
18260                                         calender += tbody + '</tr>';
18261                                 }
18262                                 drawMonth++;
18263                                 if (drawMonth > 11) {
18264                                         drawMonth = 0;
18265                                         drawYear++;
18266                                 }
18267                                 calender += '</tbody></table>' + (isMultiMonth ? '</div>' + 
18268                                                         ((numMonths[0] > 0 && col == numMonths[1]-1) ? '<div class="ui-datepicker-row-break"></div>' : '') : '');
18269                                 group += calender;
18270                         }
18271                         html += group;
18272                 }
18273                 html += buttonPanel + ($.browser.msie && parseInt($.browser.version,10) < 7 && !inst.inline ?
18274                         '<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>' : '');
18275                 inst._keyEvent = false;
18276                 return html;
18277         },
18278
18279         /* Generate the month and year header. */
18280         _generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate,
18281                         secondary, monthNames, monthNamesShort) {
18282                 var changeMonth = this._get(inst, 'changeMonth');
18283                 var changeYear = this._get(inst, 'changeYear');
18284                 var showMonthAfterYear = this._get(inst, 'showMonthAfterYear');
18285                 var html = '<div class="ui-datepicker-title">';
18286                 var monthHtml = '';
18287                 // month selection
18288                 if (secondary || !changeMonth)
18289                         monthHtml += '<span class="ui-datepicker-month">' + monthNames[drawMonth] + '</span>';
18290                 else {
18291                         var inMinYear = (minDate && minDate.getFullYear() == drawYear);
18292                         var inMaxYear = (maxDate && maxDate.getFullYear() == drawYear);
18293                         monthHtml += '<select class="ui-datepicker-month" ' +
18294                                 'onchange="DP_jQuery_' + dpuuid + '.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'M\');" ' +
18295                                 'onclick="DP_jQuery_' + dpuuid + '.datepicker._clickMonthYear(\'#' + inst.id + '\');"' +
18296                                 '>';
18297                         for (var month = 0; month < 12; month++) {
18298                                 if ((!inMinYear || month >= minDate.getMonth()) &&
18299                                                 (!inMaxYear || month <= maxDate.getMonth()))
18300                                         monthHtml += '<option value="' + month + '"' +
18301                                                 (month == drawMonth ? ' selected="selected"' : '') +
18302                                                 '>' + monthNamesShort[month] + '</option>';
18303                         }
18304                         monthHtml += '</select>';
18305                 }
18306                 if (!showMonthAfterYear)
18307                         html += monthHtml + (secondary || !(changeMonth && changeYear) ? '&#xa0;' : '');
18308                 // year selection
18309                 if ( !inst.yearshtml ) {
18310                         inst.yearshtml = '';
18311                         if (secondary || !changeYear)
18312                                 html += '<span class="ui-datepicker-year">' + drawYear + '</span>';
18313                         else {
18314                                 // determine range of years to display
18315                                 var years = this._get(inst, 'yearRange').split(':');
18316                                 var thisYear = new Date().getFullYear();
18317                                 var determineYear = function(value) {
18318                                         var year = (value.match(/c[+-].*/) ? drawYear + parseInt(value.substring(1), 10) :
18319                                                 (value.match(/[+-].*/) ? thisYear + parseInt(value, 10) :
18320                                                 parseInt(value, 10)));
18321                                         return (isNaN(year) ? thisYear : year);
18322                                 };
18323                                 var year = determineYear(years[0]);
18324                                 var endYear = Math.max(year, determineYear(years[1] || ''));
18325                                 year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
18326                                 endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
18327                                 inst.yearshtml += '<select class="ui-datepicker-year" ' +
18328                                         'onchange="DP_jQuery_' + dpuuid + '.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'Y\');" ' +
18329                                         'onclick="DP_jQuery_' + dpuuid + '.datepicker._clickMonthYear(\'#' + inst.id + '\');"' +
18330                                         '>';
18331                                 for (; year <= endYear; year++) {
18332                                         inst.yearshtml += '<option value="' + year + '"' +
18333                                                 (year == drawYear ? ' selected="selected"' : '') +
18334                                                 '>' + year + '</option>';
18335                                 }
18336                                 inst.yearshtml += '</select>';
18337                                 //when showing there is no need for later update
18338                                 if( ! $.browser.mozilla ){
18339                                         html += inst.yearshtml;
18340                                         inst.yearshtml = null;
18341                                 } else {
18342                                         // will be replaced later with inst.yearshtml
18343                                         html += '<select class="ui-datepicker-year"><option value="' + drawYear + '" selected="selected">' + drawYear + '</option></select>';
18344                                 }
18345                         }
18346                 }
18347                 html += this._get(inst, 'yearSuffix');
18348                 if (showMonthAfterYear)
18349                         html += (secondary || !(changeMonth && changeYear) ? '&#xa0;' : '') + monthHtml;
18350                 html += '</div>'; // Close datepicker_header
18351                 return html;
18352         },
18353
18354         /* Adjust one of the date sub-fields. */
18355         _adjustInstDate: function(inst, offset, period) {
18356                 var year = inst.drawYear + (period == 'Y' ? offset : 0);
18357                 var month = inst.drawMonth + (period == 'M' ? offset : 0);
18358                 var day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) +
18359                         (period == 'D' ? offset : 0);
18360                 var date = this._restrictMinMax(inst,
18361                         this._daylightSavingAdjust(new Date(year, month, day)));
18362                 inst.selectedDay = date.getDate();
18363                 inst.drawMonth = inst.selectedMonth = date.getMonth();
18364                 inst.drawYear = inst.selectedYear = date.getFullYear();
18365                 if (period == 'M' || period == 'Y')
18366                         this._notifyChange(inst);
18367         },
18368
18369         /* Ensure a date is within any min/max bounds. */
18370         _restrictMinMax: function(inst, date) {
18371                 var minDate = this._getMinMaxDate(inst, 'min');
18372                 var maxDate = this._getMinMaxDate(inst, 'max');
18373                 var newDate = (minDate && date < minDate ? minDate : date);
18374                 newDate = (maxDate && newDate > maxDate ? maxDate : newDate);
18375                 return newDate;
18376         },
18377
18378         /* Notify change of month/year. */
18379         _notifyChange: function(inst) {
18380                 var onChange = this._get(inst, 'onChangeMonthYear');
18381                 if (onChange)
18382                         onChange.apply((inst.input ? inst.input[0] : null),
18383                                 [inst.selectedYear, inst.selectedMonth + 1, inst]);
18384         },
18385
18386         /* Determine the number of months to show. */
18387         _getNumberOfMonths: function(inst) {
18388                 var numMonths = this._get(inst, 'numberOfMonths');
18389                 return (numMonths == null ? [1, 1] : (typeof numMonths == 'number' ? [1, numMonths] : numMonths));
18390         },
18391
18392         /* Determine the current maximum date - ensure no time components are set. */
18393         _getMinMaxDate: function(inst, minMax) {
18394                 return this._determineDate(inst, this._get(inst, minMax + 'Date'), null);
18395         },
18396
18397         /* Find the number of days in a given month. */
18398         _getDaysInMonth: function(year, month) {
18399                 return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate();
18400         },
18401
18402         /* Find the day of the week of the first of a month. */
18403         _getFirstDayOfMonth: function(year, month) {
18404                 return new Date(year, month, 1).getDay();
18405         },
18406
18407         /* Determines if we should allow a "next/prev" month display change. */
18408         _canAdjustMonth: function(inst, offset, curYear, curMonth) {
18409                 var numMonths = this._getNumberOfMonths(inst);
18410                 var date = this._daylightSavingAdjust(new Date(curYear,
18411                         curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1));
18412                 if (offset < 0)
18413                         date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));
18414                 return this._isInRange(inst, date);
18415         },
18416
18417         /* Is the given date in the accepted range? */
18418         _isInRange: function(inst, date) {
18419                 var minDate = this._getMinMaxDate(inst, 'min');
18420                 var maxDate = this._getMinMaxDate(inst, 'max');
18421                 return ((!minDate || date.getTime() >= minDate.getTime()) &&
18422                         (!maxDate || date.getTime() <= maxDate.getTime()));
18423         },
18424
18425         /* Provide the configuration settings for formatting/parsing. */
18426         _getFormatConfig: function(inst) {
18427                 var shortYearCutoff = this._get(inst, 'shortYearCutoff');
18428                 shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff :
18429                         new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
18430                 return {shortYearCutoff: shortYearCutoff,
18431                         dayNamesShort: this._get(inst, 'dayNamesShort'), dayNames: this._get(inst, 'dayNames'),
18432                         monthNamesShort: this._get(inst, 'monthNamesShort'), monthNames: this._get(inst, 'monthNames')};
18433         },
18434
18435         /* Format the given date for display. */
18436         _formatDate: function(inst, day, month, year) {
18437                 if (!day) {
18438                         inst.currentDay = inst.selectedDay;
18439                         inst.currentMonth = inst.selectedMonth;
18440                         inst.currentYear = inst.selectedYear;
18441                 }
18442                 var date = (day ? (typeof day == 'object' ? day :
18443                         this._daylightSavingAdjust(new Date(year, month, day))) :
18444                         this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
18445                 return this.formatDate(this._get(inst, 'dateFormat'), date, this._getFormatConfig(inst));
18446         }
18447 });
18448
18449 /* jQuery extend now ignores nulls! */
18450 function extendRemove(target, props) {
18451         $.extend(target, props);
18452         for (var name in props)
18453                 if (props[name] == null || props[name] == undefined)
18454                         target[name] = props[name];
18455         return target;
18456 };
18457
18458 /* Determine whether an object is an array. */
18459 function isArray(a) {
18460         return (a && (($.browser.safari && typeof a == 'object' && a.length) ||
18461                 (a.constructor && a.constructor.toString().match(/\Array\(\)/))));
18462 };
18463
18464 /* Invoke the datepicker functionality.
18465    @param  options  string - a command, optionally followed by additional parameters or
18466                     Object - settings for attaching new datepicker functionality
18467    @return  jQuery object */
18468 $.fn.datepicker = function(options){
18469         
18470         /* Verify an empty collection wasn't passed - Fixes #6976 */
18471         if ( !this.length ) {
18472                 return this;
18473         }
18474         
18475         /* Initialise the date picker. */
18476         if (!$.datepicker.initialized) {
18477                 $(document).mousedown($.datepicker._checkExternalClick).
18478                         find('body').append($.datepicker.dpDiv);
18479                 $.datepicker.initialized = true;
18480         }
18481
18482         var otherArgs = Array.prototype.slice.call(arguments, 1);
18483         if (typeof options == 'string' && (options == 'isDisabled' || options == 'getDate' || options == 'widget'))
18484                 return $.datepicker['_' + options + 'Datepicker'].
18485                         apply($.datepicker, [this[0]].concat(otherArgs));
18486         if (options == 'option' && arguments.length == 2 && typeof arguments[1] == 'string')
18487                 return $.datepicker['_' + options + 'Datepicker'].
18488                         apply($.datepicker, [this[0]].concat(otherArgs));
18489         return this.each(function() {
18490                 typeof options == 'string' ?
18491                         $.datepicker['_' + options + 'Datepicker'].
18492                                 apply($.datepicker, [this].concat(otherArgs)) :
18493                         $.datepicker._attachDatepicker(this, options);
18494         });
18495 };
18496
18497 $.datepicker = new Datepicker(); // singleton instance
18498 $.datepicker.initialized = false;
18499 $.datepicker.uuid = new Date().getTime();
18500 $.datepicker.version = "1.8.12";
18501
18502 // Workaround for #4055
18503 // Add another global to avoid noConflict issues with inline event handlers
18504 window['DP_jQuery_' + dpuuid] = $;
18505
18506 })(jQuery);
18507 /*
18508  * jQuery UI Dialog 1.8.12
18509  *
18510  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
18511  * Dual licensed under the MIT or GPL Version 2 licenses.
18512  * http://jquery.org/license
18513  *
18514  * http://docs.jquery.com/UI/Dialog
18515  *
18516  * Depends:
18517  *      jquery.ui.core.js
18518  *      jquery.ui.widget.js
18519  *  jquery.ui.button.js
18520  *      jquery.ui.draggable.js
18521  *      jquery.ui.mouse.js
18522  *      jquery.ui.position.js
18523  *      jquery.ui.resizable.js
18524  */
18525 (function( $, undefined ) {
18526
18527 var uiDialogClasses =
18528                 'ui-dialog ' +
18529                 'ui-widget ' +
18530                 'ui-widget-content ' +
18531                 'ui-corner-all ',
18532         sizeRelatedOptions = {
18533                 buttons: true,
18534                 height: true,
18535                 maxHeight: true,
18536                 maxWidth: true,
18537                 minHeight: true,
18538                 minWidth: true,
18539                 width: true
18540         },
18541         resizableRelatedOptions = {
18542                 maxHeight: true,
18543                 maxWidth: true,
18544                 minHeight: true,
18545                 minWidth: true
18546         },
18547         // support for jQuery 1.3.2 - handle common attrFn methods for dialog
18548         attrFn = $.attrFn || {
18549                 val: true,
18550                 css: true,
18551                 html: true,
18552                 text: true,
18553                 data: true,
18554                 width: true,
18555                 height: true,
18556                 offset: true,
18557                 click: true
18558         };
18559
18560 $.widget("ui.dialog", {
18561         options: {
18562                 autoOpen: true,
18563                 buttons: {},
18564                 closeOnEscape: true,
18565                 closeText: 'close',
18566                 dialogClass: '',
18567                 draggable: true,
18568                 hide: null,
18569                 height: 'auto',
18570                 maxHeight: false,
18571                 maxWidth: false,
18572                 minHeight: 150,
18573                 minWidth: 150,
18574                 modal: false,
18575                 position: {
18576                         my: 'center',
18577                         at: 'center',
18578                         collision: 'fit',
18579                         // ensure that the titlebar is never outside the document
18580                         using: function(pos) {
18581                                 var topOffset = $(this).css(pos).offset().top;
18582                                 if (topOffset < 0) {
18583                                         $(this).css('top', pos.top - topOffset);
18584                                 }
18585                         }
18586                 },
18587                 resizable: true,
18588                 show: null,
18589                 stack: true,
18590                 title: '',
18591                 width: 300,
18592                 zIndex: 1000
18593         },
18594
18595         _create: function() {
18596                 this.originalTitle = this.element.attr('title');
18597                 // #5742 - .attr() might return a DOMElement
18598                 if ( typeof this.originalTitle !== "string" ) {
18599                         this.originalTitle = "";
18600                 }
18601
18602                 this.options.title = this.options.title || this.originalTitle;
18603                 var self = this,
18604                         options = self.options,
18605
18606                         title = options.title || '&#160;',
18607                         titleId = $.ui.dialog.getTitleId(self.element),
18608
18609                         uiDialog = (self.uiDialog = $('<div></div>'))
18610                                 .appendTo(document.body)
18611                                 .hide()
18612                                 .addClass(uiDialogClasses + options.dialogClass)
18613                                 .css({
18614                                         zIndex: options.zIndex
18615                                 })
18616                                 // setting tabIndex makes the div focusable
18617                                 // setting outline to 0 prevents a border on focus in Mozilla
18618                                 .attr('tabIndex', -1).css('outline', 0).keydown(function(event) {
18619                                         if (options.closeOnEscape && event.keyCode &&
18620                                                 event.keyCode === $.ui.keyCode.ESCAPE) {
18621                                                 
18622                                                 self.close(event);
18623                                                 event.preventDefault();
18624                                         }
18625                                 })
18626                                 .attr({
18627                                         role: 'dialog',
18628                                         'aria-labelledby': titleId
18629                                 })
18630                                 .mousedown(function(event) {
18631                                         self.moveToTop(false, event);
18632                                 }),
18633
18634                         uiDialogContent = self.element
18635                                 .show()
18636                                 .removeAttr('title')
18637                                 .addClass(
18638                                         'ui-dialog-content ' +
18639                                         'ui-widget-content')
18640                                 .appendTo(uiDialog),
18641
18642                         uiDialogTitlebar = (self.uiDialogTitlebar = $('<div></div>'))
18643                                 .addClass(
18644                                         'ui-dialog-titlebar ' +
18645                                         'ui-widget-header ' +
18646                                         'ui-corner-top ' +
18647                                         'ui-helper-clearfix'
18648                                 )
18649                                 .prependTo(uiDialog),
18650
18651                         uiDialogTitlebarClose = $('<a href="#"></a>')
18652                                 .addClass(
18653                                         'ui-dialog-titlebar-close ' +
18654                                         'ui-corner-all'
18655                                 )
18656                                 .attr('role', 'button')
18657                                 .hover(
18658                                         function() {
18659                                                 uiDialogTitlebarClose.addClass('ui-state-hover');
18660                                         },
18661                                         function() {
18662                                                 uiDialogTitlebarClose.removeClass('ui-state-hover');
18663                                         }
18664                                 )
18665                                 .focus(function() {
18666                                         uiDialogTitlebarClose.addClass('ui-state-focus');
18667                                 })
18668                                 .blur(function() {
18669                                         uiDialogTitlebarClose.removeClass('ui-state-focus');
18670                                 })
18671                                 .click(function(event) {
18672                                         self.close(event);
18673                                         return false;
18674                                 })
18675                                 .appendTo(uiDialogTitlebar),
18676
18677                         uiDialogTitlebarCloseText = (self.uiDialogTitlebarCloseText = $('<span></span>'))
18678                                 .addClass(
18679                                         'ui-icon ' +
18680                                         'ui-icon-closethick'
18681                                 )
18682                                 .text(options.closeText)
18683                                 .appendTo(uiDialogTitlebarClose),
18684
18685                         uiDialogTitle = $('<span></span>')
18686                                 .addClass('ui-dialog-title')
18687                                 .attr('id', titleId)
18688                                 .html(title)
18689                                 .prependTo(uiDialogTitlebar);
18690
18691                 //handling of deprecated beforeclose (vs beforeClose) option
18692                 //Ticket #4669 http://dev.jqueryui.com/ticket/4669
18693                 //TODO: remove in 1.9pre
18694                 if ($.isFunction(options.beforeclose) && !$.isFunction(options.beforeClose)) {
18695                         options.beforeClose = options.beforeclose;
18696                 }
18697
18698                 uiDialogTitlebar.find("*").add(uiDialogTitlebar).disableSelection();
18699
18700                 if (options.draggable && $.fn.draggable) {
18701                         self._makeDraggable();
18702                 }
18703                 if (options.resizable && $.fn.resizable) {
18704                         self._makeResizable();
18705                 }
18706
18707                 self._createButtons(options.buttons);
18708                 self._isOpen = false;
18709
18710                 if ($.fn.bgiframe) {
18711                         uiDialog.bgiframe();
18712                 }
18713         },
18714
18715         _init: function() {
18716                 if ( this.options.autoOpen ) {
18717                         this.open();
18718                 }
18719         },
18720
18721         destroy: function() {
18722                 var self = this;
18723                 
18724                 if (self.overlay) {
18725                         self.overlay.destroy();
18726                 }
18727                 self.uiDialog.hide();
18728                 self.element
18729                         .unbind('.dialog')
18730                         .removeData('dialog')
18731                         .removeClass('ui-dialog-content ui-widget-content')
18732                         .hide().appendTo('body');
18733                 self.uiDialog.remove();
18734
18735                 if (self.originalTitle) {
18736                         self.element.attr('title', self.originalTitle);
18737                 }
18738
18739                 return self;
18740         },
18741
18742         widget: function() {
18743                 return this.uiDialog;
18744         },
18745
18746         close: function(event) {
18747                 var self = this,
18748                         maxZ, thisZ;
18749                 
18750                 if (false === self._trigger('beforeClose', event)) {
18751                         return;
18752                 }
18753
18754                 if (self.overlay) {
18755                         self.overlay.destroy();
18756                 }
18757                 self.uiDialog.unbind('keypress.ui-dialog');
18758
18759                 self._isOpen = false;
18760
18761                 if (self.options.hide) {
18762                         self.uiDialog.hide(self.options.hide, function() {
18763                                 self._trigger('close', event);
18764                         });
18765                 } else {
18766                         self.uiDialog.hide();
18767                         self._trigger('close', event);
18768                 }
18769
18770                 $.ui.dialog.overlay.resize();
18771
18772                 // adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
18773                 if (self.options.modal) {
18774                         maxZ = 0;
18775                         $('.ui-dialog').each(function() {
18776                                 if (this !== self.uiDialog[0]) {
18777                                         thisZ = $(this).css('z-index');
18778                                         if(!isNaN(thisZ)) {
18779                                                 maxZ = Math.max(maxZ, thisZ);
18780                                         }
18781                                 }
18782                         });
18783                         $.ui.dialog.maxZ = maxZ;
18784                 }
18785
18786                 return self;
18787         },
18788
18789         isOpen: function() {
18790                 return this._isOpen;
18791         },
18792
18793         // the force parameter allows us to move modal dialogs to their correct
18794         // position on open
18795         moveToTop: function(force, event) {
18796                 var self = this,
18797                         options = self.options,
18798                         saveScroll;
18799
18800                 if ((options.modal && !force) ||
18801                         (!options.stack && !options.modal)) {
18802                         return self._trigger('focus', event);
18803                 }
18804
18805                 if (options.zIndex > $.ui.dialog.maxZ) {
18806                         $.ui.dialog.maxZ = options.zIndex;
18807                 }
18808                 if (self.overlay) {
18809                         $.ui.dialog.maxZ += 1;
18810                         self.overlay.$el.css('z-index', $.ui.dialog.overlay.maxZ = $.ui.dialog.maxZ);
18811                 }
18812
18813                 //Save and then restore scroll since Opera 9.5+ resets when parent z-Index is changed.
18814                 //  http://ui.jquery.com/bugs/ticket/3193
18815                 saveScroll = { scrollTop: self.element.attr('scrollTop'), scrollLeft: self.element.attr('scrollLeft') };
18816                 $.ui.dialog.maxZ += 1;
18817                 self.uiDialog.css('z-index', $.ui.dialog.maxZ);
18818                 self.element.attr(saveScroll);
18819                 self._trigger('focus', event);
18820
18821                 return self;
18822         },
18823
18824         open: function() {
18825                 if (this._isOpen) { return; }
18826
18827                 var self = this,
18828                         options = self.options,
18829                         uiDialog = self.uiDialog;
18830
18831                 self.overlay = options.modal ? new $.ui.dialog.overlay(self) : null;
18832                 self._size();
18833                 self._position(options.position);
18834                 uiDialog.show(options.show);
18835                 self.moveToTop(true);
18836
18837                 // prevent tabbing out of modal dialogs
18838                 if (options.modal) {
18839                         uiDialog.bind('keypress.ui-dialog', function(event) {
18840                                 if (event.keyCode !== $.ui.keyCode.TAB) {
18841                                         return;
18842                                 }
18843
18844                                 var tabbables = $(':tabbable', this),
18845                                         first = tabbables.filter(':first'),
18846                                         last  = tabbables.filter(':last');
18847
18848                                 if (event.target === last[0] && !event.shiftKey) {
18849                                         first.focus(1);
18850                                         return false;
18851                                 } else if (event.target === first[0] && event.shiftKey) {
18852                                         last.focus(1);
18853                                         return false;
18854                                 }
18855                         });
18856                 }
18857
18858                 // set focus to the first tabbable element in the content area or the first button
18859                 // if there are no tabbable elements, set focus on the dialog itself
18860                 $(self.element.find(':tabbable').get().concat(
18861                         uiDialog.find('.ui-dialog-buttonpane :tabbable').get().concat(
18862                                 uiDialog.get()))).eq(0).focus();
18863
18864                 self._isOpen = true;
18865                 self._trigger('open');
18866
18867                 return self;
18868         },
18869
18870         _createButtons: function(buttons) {
18871                 var self = this,
18872                         hasButtons = false,
18873                         uiDialogButtonPane = $('<div></div>')
18874                                 .addClass(
18875                                         'ui-dialog-buttonpane ' +
18876                                         'ui-widget-content ' +
18877                                         'ui-helper-clearfix'
18878                                 ),
18879                         uiButtonSet = $( "<div></div>" )
18880                                 .addClass( "ui-dialog-buttonset" )
18881                                 .appendTo( uiDialogButtonPane );
18882
18883                 // if we already have a button pane, remove it
18884                 self.uiDialog.find('.ui-dialog-buttonpane').remove();
18885
18886                 if (typeof buttons === 'object' && buttons !== null) {
18887                         $.each(buttons, function() {
18888                                 return !(hasButtons = true);
18889                         });
18890                 }
18891                 if (hasButtons) {
18892                         $.each(buttons, function(name, props) {
18893                                 props = $.isFunction( props ) ?
18894                                         { click: props, text: name } :
18895                                         props;
18896                                 var button = $('<button type="button"></button>')
18897                                         .click(function() {
18898                                                 props.click.apply(self.element[0], arguments);
18899                                         })
18900                                         .appendTo(uiButtonSet);
18901                                 // can't use .attr( props, true ) with jQuery 1.3.2.
18902                                 $.each( props, function( key, value ) {
18903                                         if ( key === "click" ) {
18904                                                 return;
18905                                         }
18906                                         if ( key in attrFn ) {
18907                                                 button[ key ]( value );
18908                                         } else {
18909                                                 button.attr( key, value );
18910                                         }
18911                                 });
18912                                 if ($.fn.button) {
18913                                         button.button();
18914                                 }
18915                         });
18916                         uiDialogButtonPane.appendTo(self.uiDialog);
18917                 }
18918         },
18919
18920         _makeDraggable: function() {
18921                 var self = this,
18922                         options = self.options,
18923                         doc = $(document),
18924                         heightBeforeDrag;
18925
18926                 function filteredUi(ui) {
18927                         return {
18928                                 position: ui.position,
18929                                 offset: ui.offset
18930                         };
18931                 }
18932
18933                 self.uiDialog.draggable({
18934                         cancel: '.ui-dialog-content, .ui-dialog-titlebar-close',
18935                         handle: '.ui-dialog-titlebar',
18936                         containment: 'document',
18937                         start: function(event, ui) {
18938                                 heightBeforeDrag = options.height === "auto" ? "auto" : $(this).height();
18939                                 $(this).height($(this).height()).addClass("ui-dialog-dragging");
18940                                 self._trigger('dragStart', event, filteredUi(ui));
18941                         },
18942                         drag: function(event, ui) {
18943                                 self._trigger('drag', event, filteredUi(ui));
18944                         },
18945                         stop: function(event, ui) {
18946                                 options.position = [ui.position.left - doc.scrollLeft(),
18947                                         ui.position.top - doc.scrollTop()];
18948                                 $(this).removeClass("ui-dialog-dragging").height(heightBeforeDrag);
18949                                 self._trigger('dragStop', event, filteredUi(ui));
18950                                 $.ui.dialog.overlay.resize();
18951                         }
18952                 });
18953         },
18954
18955         _makeResizable: function(handles) {
18956                 handles = (handles === undefined ? this.options.resizable : handles);
18957                 var self = this,
18958                         options = self.options,
18959                         // .ui-resizable has position: relative defined in the stylesheet
18960                         // but dialogs have to use absolute or fixed positioning
18961                         position = self.uiDialog.css('position'),
18962                         resizeHandles = (typeof handles === 'string' ?
18963                                 handles :
18964                                 'n,e,s,w,se,sw,ne,nw'
18965                         );
18966
18967                 function filteredUi(ui) {
18968                         return {
18969                                 originalPosition: ui.originalPosition,
18970                                 originalSize: ui.originalSize,
18971                                 position: ui.position,
18972                                 size: ui.size
18973                         };
18974                 }
18975
18976                 self.uiDialog.resizable({
18977                         cancel: '.ui-dialog-content',
18978                         containment: 'document',
18979                         alsoResize: self.element,
18980                         maxWidth: options.maxWidth,
18981                         maxHeight: options.maxHeight,
18982                         minWidth: options.minWidth,
18983                         minHeight: self._minHeight(),
18984                         handles: resizeHandles,
18985                         start: function(event, ui) {
18986                                 $(this).addClass("ui-dialog-resizing");
18987                                 self._trigger('resizeStart', event, filteredUi(ui));
18988                         },
18989                         resize: function(event, ui) {
18990                                 self._trigger('resize', event, filteredUi(ui));
18991                         },
18992                         stop: function(event, ui) {
18993                                 $(this).removeClass("ui-dialog-resizing");
18994                                 options.height = $(this).height();
18995                                 options.width = $(this).width();
18996                                 self._trigger('resizeStop', event, filteredUi(ui));
18997                                 $.ui.dialog.overlay.resize();
18998                         }
18999                 })
19000                 .css('position', position)
19001                 .find('.ui-resizable-se').addClass('ui-icon ui-icon-grip-diagonal-se');
19002         },
19003
19004         _minHeight: function() {
19005                 var options = this.options;
19006
19007                 if (options.height === 'auto') {
19008                         return options.minHeight;
19009                 } else {
19010                         return Math.min(options.minHeight, options.height);
19011                 }
19012         },
19013
19014         _position: function(position) {
19015                 var myAt = [],
19016                         offset = [0, 0],
19017                         isVisible;
19018
19019                 if (position) {
19020                         // deep extending converts arrays to objects in jQuery <= 1.3.2 :-(
19021         //              if (typeof position == 'string' || $.isArray(position)) {
19022         //                      myAt = $.isArray(position) ? position : position.split(' ');
19023
19024                         if (typeof position === 'string' || (typeof position === 'object' && '0' in position)) {
19025                                 myAt = position.split ? position.split(' ') : [position[0], position[1]];
19026                                 if (myAt.length === 1) {
19027                                         myAt[1] = myAt[0];
19028                                 }
19029
19030                                 $.each(['left', 'top'], function(i, offsetPosition) {
19031                                         if (+myAt[i] === myAt[i]) {
19032                                                 offset[i] = myAt[i];
19033                                                 myAt[i] = offsetPosition;
19034                                         }
19035                                 });
19036
19037                                 position = {
19038                                         my: myAt.join(" "),
19039                                         at: myAt.join(" "),
19040                                         offset: offset.join(" ")
19041                                 };
19042                         } 
19043
19044                         position = $.extend({}, $.ui.dialog.prototype.options.position, position);
19045                 } else {
19046                         position = $.ui.dialog.prototype.options.position;
19047                 }
19048
19049                 // need to show the dialog to get the actual offset in the position plugin
19050                 isVisible = this.uiDialog.is(':visible');
19051                 if (!isVisible) {
19052                         this.uiDialog.show();
19053                 }
19054                 this.uiDialog
19055                         // workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781
19056                         .css({ top: 0, left: 0 })
19057                         .position($.extend({ of: window }, position));
19058                 if (!isVisible) {
19059                         this.uiDialog.hide();
19060                 }
19061         },
19062
19063         _setOptions: function( options ) {
19064                 var self = this,
19065                         resizableOptions = {},
19066                         resize = false;
19067
19068                 $.each( options, function( key, value ) {
19069                         self._setOption( key, value );
19070                         
19071                         if ( key in sizeRelatedOptions ) {
19072                                 resize = true;
19073                         }
19074                         if ( key in resizableRelatedOptions ) {
19075                                 resizableOptions[ key ] = value;
19076                         }
19077                 });
19078
19079                 if ( resize ) {
19080                         this._size();
19081                 }
19082                 if ( this.uiDialog.is( ":data(resizable)" ) ) {
19083                         this.uiDialog.resizable( "option", resizableOptions );
19084                 }
19085         },
19086
19087         _setOption: function(key, value){
19088                 var self = this,
19089                         uiDialog = self.uiDialog;
19090
19091                 switch (key) {
19092                         //handling of deprecated beforeclose (vs beforeClose) option
19093                         //Ticket #4669 http://dev.jqueryui.com/ticket/4669
19094                         //TODO: remove in 1.9pre
19095                         case "beforeclose":
19096                                 key = "beforeClose";
19097                                 break;
19098                         case "buttons":
19099                                 self._createButtons(value);
19100                                 break;
19101                         case "closeText":
19102                                 // ensure that we always pass a string
19103                                 self.uiDialogTitlebarCloseText.text("" + value);
19104                                 break;
19105                         case "dialogClass":
19106                                 uiDialog
19107                                         .removeClass(self.options.dialogClass)
19108                                         .addClass(uiDialogClasses + value);
19109                                 break;
19110                         case "disabled":
19111                                 if (value) {
19112                                         uiDialog.addClass('ui-dialog-disabled');
19113                                 } else {
19114                                         uiDialog.removeClass('ui-dialog-disabled');
19115                                 }
19116                                 break;
19117                         case "draggable":
19118                                 var isDraggable = uiDialog.is( ":data(draggable)" );
19119                                 if ( isDraggable && !value ) {
19120                                         uiDialog.draggable( "destroy" );
19121                                 }
19122                                 
19123                                 if ( !isDraggable && value ) {
19124                                         self._makeDraggable();
19125                                 }
19126                                 break;
19127                         case "position":
19128                                 self._position(value);
19129                                 break;
19130                         case "resizable":
19131                                 // currently resizable, becoming non-resizable
19132                                 var isResizable = uiDialog.is( ":data(resizable)" );
19133                                 if (isResizable && !value) {
19134                                         uiDialog.resizable('destroy');
19135                                 }
19136
19137                                 // currently resizable, changing handles
19138                                 if (isResizable && typeof value === 'string') {
19139                                         uiDialog.resizable('option', 'handles', value);
19140                                 }
19141
19142                                 // currently non-resizable, becoming resizable
19143                                 if (!isResizable && value !== false) {
19144                                         self._makeResizable(value);
19145                                 }
19146                                 break;
19147                         case "title":
19148                                 // convert whatever was passed in o a string, for html() to not throw up
19149                                 $(".ui-dialog-title", self.uiDialogTitlebar).html("" + (value || '&#160;'));
19150                                 break;
19151                 }
19152
19153                 $.Widget.prototype._setOption.apply(self, arguments);
19154         },
19155
19156         _size: function() {
19157                 /* If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
19158                  * divs will both have width and height set, so we need to reset them
19159                  */
19160                 var options = this.options,
19161                         nonContentHeight,
19162                         minContentHeight,
19163                         isVisible = this.uiDialog.is( ":visible" );
19164
19165                 // reset content sizing
19166                 this.element.show().css({
19167                         width: 'auto',
19168                         minHeight: 0,
19169                         height: 0
19170                 });
19171
19172                 if (options.minWidth > options.width) {
19173                         options.width = options.minWidth;
19174                 }
19175
19176                 // reset wrapper sizing
19177                 // determine the height of all the non-content elements
19178                 nonContentHeight = this.uiDialog.css({
19179                                 height: 'auto',
19180                                 width: options.width
19181                         })
19182                         .height();
19183                 minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
19184                 
19185                 if ( options.height === "auto" ) {
19186                         // only needed for IE6 support
19187                         if ( $.support.minHeight ) {
19188                                 this.element.css({
19189                                         minHeight: minContentHeight,
19190                                         height: "auto"
19191                                 });
19192                         } else {
19193                                 this.uiDialog.show();
19194                                 var autoHeight = this.element.css( "height", "auto" ).height();
19195                                 if ( !isVisible ) {
19196                                         this.uiDialog.hide();
19197                                 }
19198                                 this.element.height( Math.max( autoHeight, minContentHeight ) );
19199                         }
19200                 } else {
19201                         this.element.height( Math.max( options.height - nonContentHeight, 0 ) );
19202                 }
19203
19204                 if (this.uiDialog.is(':data(resizable)')) {
19205                         this.uiDialog.resizable('option', 'minHeight', this._minHeight());
19206                 }
19207         }
19208 });
19209
19210 $.extend($.ui.dialog, {
19211         version: "1.8.12",
19212
19213         uuid: 0,
19214         maxZ: 0,
19215
19216         getTitleId: function($el) {
19217                 var id = $el.attr('id');
19218                 if (!id) {
19219                         this.uuid += 1;
19220                         id = this.uuid;
19221                 }
19222                 return 'ui-dialog-title-' + id;
19223         },
19224
19225         overlay: function(dialog) {
19226                 this.$el = $.ui.dialog.overlay.create(dialog);
19227         }
19228 });
19229
19230 $.extend($.ui.dialog.overlay, {
19231         instances: [],
19232         // reuse old instances due to IE memory leak with alpha transparency (see #5185)
19233         oldInstances: [],
19234         maxZ: 0,
19235         events: $.map('focus,mousedown,mouseup,keydown,keypress,click'.split(','),
19236                 function(event) { return event + '.dialog-overlay'; }).join(' '),
19237         create: function(dialog) {
19238                 if (this.instances.length === 0) {
19239                         // prevent use of anchors and inputs
19240                         // we use a setTimeout in case the overlay is created from an
19241                         // event that we're going to be cancelling (see #2804)
19242                         setTimeout(function() {
19243                                 // handle $(el).dialog().dialog('close') (see #4065)
19244                                 if ($.ui.dialog.overlay.instances.length) {
19245                                         $(document).bind($.ui.dialog.overlay.events, function(event) {
19246                                                 // stop events if the z-index of the target is < the z-index of the overlay
19247                                                 // we cannot return true when we don't want to cancel the event (#3523)
19248                                                 if ($(event.target).zIndex() < $.ui.dialog.overlay.maxZ) {
19249                                                         return false;
19250                                                 }
19251                                         });
19252                                 }
19253                         }, 1);
19254
19255                         // allow closing by pressing the escape key
19256                         $(document).bind('keydown.dialog-overlay', function(event) {
19257                                 if (dialog.options.closeOnEscape && event.keyCode &&
19258                                         event.keyCode === $.ui.keyCode.ESCAPE) {
19259                                         
19260                                         dialog.close(event);
19261                                         event.preventDefault();
19262                                 }
19263                         });
19264
19265                         // handle window resize
19266                         $(window).bind('resize.dialog-overlay', $.ui.dialog.overlay.resize);
19267                 }
19268
19269                 var $el = (this.oldInstances.pop() || $('<div></div>').addClass('ui-widget-overlay'))
19270                         .appendTo(document.body)
19271                         .css({
19272                                 width: this.width(),
19273                                 height: this.height()
19274                         });
19275
19276                 if ($.fn.bgiframe) {
19277                         $el.bgiframe();
19278                 }
19279
19280                 this.instances.push($el);
19281                 return $el;
19282         },
19283
19284         destroy: function($el) {
19285                 var indexOf = $.inArray($el, this.instances);
19286                 if (indexOf != -1){
19287                         this.oldInstances.push(this.instances.splice(indexOf, 1)[0]);
19288                 }
19289
19290                 if (this.instances.length === 0) {
19291                         $([document, window]).unbind('.dialog-overlay');
19292                 }
19293
19294                 $el.remove();
19295                 
19296                 // adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
19297                 var maxZ = 0;
19298                 $.each(this.instances, function() {
19299                         maxZ = Math.max(maxZ, this.css('z-index'));
19300                 });
19301                 this.maxZ = maxZ;
19302         },
19303
19304         height: function() {
19305                 var scrollHeight,
19306                         offsetHeight;
19307                 // handle IE 6
19308                 if ($.browser.msie && $.browser.version < 7) {
19309                         scrollHeight = Math.max(
19310                                 document.documentElement.scrollHeight,
19311                                 document.body.scrollHeight
19312                         );
19313                         offsetHeight = Math.max(
19314                                 document.documentElement.offsetHeight,
19315                                 document.body.offsetHeight
19316                         );
19317
19318                         if (scrollHeight < offsetHeight) {
19319                                 return $(window).height() + 'px';
19320                         } else {
19321                                 return scrollHeight + 'px';
19322                         }
19323                 // handle "good" browsers
19324                 } else {
19325                         return $(document).height() + 'px';
19326                 }
19327         },
19328
19329         width: function() {
19330                 var scrollWidth,
19331                         offsetWidth;
19332                 // handle IE 6
19333                 if ($.browser.msie && $.browser.version < 7) {
19334                         scrollWidth = Math.max(
19335                                 document.documentElement.scrollWidth,
19336                                 document.body.scrollWidth
19337                         );
19338                         offsetWidth = Math.max(
19339                                 document.documentElement.offsetWidth,
19340                                 document.body.offsetWidth
19341                         );
19342
19343                         if (scrollWidth < offsetWidth) {
19344                                 return $(window).width() + 'px';
19345                         } else {
19346                                 return scrollWidth + 'px';
19347                         }
19348                 // handle "good" browsers
19349                 } else {
19350                         return $(document).width() + 'px';
19351                 }
19352         },
19353
19354         resize: function() {
19355                 /* If the dialog is draggable and the user drags it past the
19356                  * right edge of the window, the document becomes wider so we
19357                  * need to stretch the overlay. If the user then drags the
19358                  * dialog back to the left, the document will become narrower,
19359                  * so we need to shrink the overlay to the appropriate size.
19360                  * This is handled by shrinking the overlay before setting it
19361                  * to the full document size.
19362                  */
19363                 var $overlays = $([]);
19364                 $.each($.ui.dialog.overlay.instances, function() {
19365                         $overlays = $overlays.add(this);
19366                 });
19367
19368                 $overlays.css({
19369                         width: 0,
19370                         height: 0
19371                 }).css({
19372                         width: $.ui.dialog.overlay.width(),
19373                         height: $.ui.dialog.overlay.height()
19374                 });
19375         }
19376 });
19377
19378 $.extend($.ui.dialog.overlay.prototype, {
19379         destroy: function() {
19380                 $.ui.dialog.overlay.destroy(this.$el);
19381         }
19382 });
19383
19384 }(jQuery));
19385 /*
19386  * jQuery UI Position 1.8.12
19387  *
19388  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
19389  * Dual licensed under the MIT or GPL Version 2 licenses.
19390  * http://jquery.org/license
19391  *
19392  * http://docs.jquery.com/UI/Position
19393  */
19394 (function( $, undefined ) {
19395
19396 $.ui = $.ui || {};
19397
19398 var horizontalPositions = /left|center|right/,
19399         verticalPositions = /top|center|bottom/,
19400         center = "center",
19401         _position = $.fn.position,
19402         _offset = $.fn.offset;
19403
19404 $.fn.position = function( options ) {
19405         if ( !options || !options.of ) {
19406                 return _position.apply( this, arguments );
19407         }
19408
19409         // make a copy, we don't want to modify arguments
19410         options = $.extend( {}, options );
19411
19412         var target = $( options.of ),
19413                 targetElem = target[0],
19414                 collision = ( options.collision || "flip" ).split( " " ),
19415                 offset = options.offset ? options.offset.split( " " ) : [ 0, 0 ],
19416                 targetWidth,
19417                 targetHeight,
19418                 basePosition;
19419
19420         if ( targetElem.nodeType === 9 ) {
19421                 targetWidth = target.width();
19422                 targetHeight = target.height();
19423                 basePosition = { top: 0, left: 0 };
19424         // TODO: use $.isWindow() in 1.9
19425         } else if ( targetElem.setTimeout ) {
19426                 targetWidth = target.width();
19427                 targetHeight = target.height();
19428                 basePosition = { top: target.scrollTop(), left: target.scrollLeft() };
19429         } else if ( targetElem.preventDefault ) {
19430                 // force left top to allow flipping
19431                 options.at = "left top";
19432                 targetWidth = targetHeight = 0;
19433                 basePosition = { top: options.of.pageY, left: options.of.pageX };
19434         } else {
19435                 targetWidth = target.outerWidth();
19436                 targetHeight = target.outerHeight();
19437                 basePosition = target.offset();
19438         }
19439
19440         // force my and at to have valid horizontal and veritcal positions
19441         // if a value is missing or invalid, it will be converted to center 
19442         $.each( [ "my", "at" ], function() {
19443                 var pos = ( options[this] || "" ).split( " " );
19444                 if ( pos.length === 1) {
19445                         pos = horizontalPositions.test( pos[0] ) ?
19446                                 pos.concat( [center] ) :
19447                                 verticalPositions.test( pos[0] ) ?
19448                                         [ center ].concat( pos ) :
19449                                         [ center, center ];
19450                 }
19451                 pos[ 0 ] = horizontalPositions.test( pos[0] ) ? pos[ 0 ] : center;
19452                 pos[ 1 ] = verticalPositions.test( pos[1] ) ? pos[ 1 ] : center;
19453                 options[ this ] = pos;
19454         });
19455
19456         // normalize collision option
19457         if ( collision.length === 1 ) {
19458                 collision[ 1 ] = collision[ 0 ];
19459         }
19460
19461         // normalize offset option
19462         offset[ 0 ] = parseInt( offset[0], 10 ) || 0;
19463         if ( offset.length === 1 ) {
19464                 offset[ 1 ] = offset[ 0 ];
19465         }
19466         offset[ 1 ] = parseInt( offset[1], 10 ) || 0;
19467
19468         if ( options.at[0] === "right" ) {
19469                 basePosition.left += targetWidth;
19470         } else if ( options.at[0] === center ) {
19471                 basePosition.left += targetWidth / 2;
19472         }
19473
19474         if ( options.at[1] === "bottom" ) {
19475                 basePosition.top += targetHeight;
19476         } else if ( options.at[1] === center ) {
19477                 basePosition.top += targetHeight / 2;
19478         }
19479
19480         basePosition.left += offset[ 0 ];
19481         basePosition.top += offset[ 1 ];
19482
19483         return this.each(function() {
19484                 var elem = $( this ),
19485                         elemWidth = elem.outerWidth(),
19486                         elemHeight = elem.outerHeight(),
19487                         marginLeft = parseInt( $.curCSS( this, "marginLeft", true ) ) || 0,
19488                         marginTop = parseInt( $.curCSS( this, "marginTop", true ) ) || 0,
19489                         collisionWidth = elemWidth + marginLeft +
19490                                 ( parseInt( $.curCSS( this, "marginRight", true ) ) || 0 ),
19491                         collisionHeight = elemHeight + marginTop +
19492                                 ( parseInt( $.curCSS( this, "marginBottom", true ) ) || 0 ),
19493                         position = $.extend( {}, basePosition ),
19494                         collisionPosition;
19495
19496                 if ( options.my[0] === "right" ) {
19497                         position.left -= elemWidth;
19498                 } else if ( options.my[0] === center ) {
19499                         position.left -= elemWidth / 2;
19500                 }
19501
19502                 if ( options.my[1] === "bottom" ) {
19503                         position.top -= elemHeight;
19504                 } else if ( options.my[1] === center ) {
19505                         position.top -= elemHeight / 2;
19506                 }
19507
19508                 // prevent fractions (see #5280)
19509                 position.left = Math.round( position.left );
19510                 position.top = Math.round( position.top );
19511
19512                 collisionPosition = {
19513                         left: position.left - marginLeft,
19514                         top: position.top - marginTop
19515                 };
19516
19517                 $.each( [ "left", "top" ], function( i, dir ) {
19518                         if ( $.ui.position[ collision[i] ] ) {
19519                                 $.ui.position[ collision[i] ][ dir ]( position, {
19520                                         targetWidth: targetWidth,
19521                                         targetHeight: targetHeight,
19522                                         elemWidth: elemWidth,
19523                                         elemHeight: elemHeight,
19524                                         collisionPosition: collisionPosition,
19525                                         collisionWidth: collisionWidth,
19526                                         collisionHeight: collisionHeight,
19527                                         offset: offset,
19528                                         my: options.my,
19529                                         at: options.at
19530                                 });
19531                         }
19532                 });
19533
19534                 if ( $.fn.bgiframe ) {
19535                         elem.bgiframe();
19536                 }
19537                 elem.offset( $.extend( position, { using: options.using } ) );
19538         });
19539 };
19540
19541 $.ui.position = {
19542         fit: {
19543                 left: function( position, data ) {
19544                         var win = $( window ),
19545                                 over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft();
19546                         position.left = over > 0 ? position.left - over : Math.max( position.left - data.collisionPosition.left, position.left );
19547                 },
19548                 top: function( position, data ) {
19549                         var win = $( window ),
19550                                 over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop();
19551                         position.top = over > 0 ? position.top - over : Math.max( position.top - data.collisionPosition.top, position.top );
19552                 }
19553         },
19554
19555         flip: {
19556                 left: function( position, data ) {
19557                         if ( data.at[0] === center ) {
19558                                 return;
19559                         }
19560                         var win = $( window ),
19561                                 over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft(),
19562                                 myOffset = data.my[ 0 ] === "left" ?
19563                                         -data.elemWidth :
19564                                         data.my[ 0 ] === "right" ?
19565                                                 data.elemWidth :
19566                                                 0,
19567                                 atOffset = data.at[ 0 ] === "left" ?
19568                                         data.targetWidth :
19569                                         -data.targetWidth,
19570                                 offset = -2 * data.offset[ 0 ];
19571                         position.left += data.collisionPosition.left < 0 ?
19572                                 myOffset + atOffset + offset :
19573                                 over > 0 ?
19574                                         myOffset + atOffset + offset :
19575                                         0;
19576                 },
19577                 top: function( position, data ) {
19578                         if ( data.at[1] === center ) {
19579                                 return;
19580                         }
19581                         var win = $( window ),
19582                                 over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop(),
19583                                 myOffset = data.my[ 1 ] === "top" ?
19584                                         -data.elemHeight :
19585                                         data.my[ 1 ] === "bottom" ?
19586                                                 data.elemHeight :
19587                                                 0,
19588                                 atOffset = data.at[ 1 ] === "top" ?
19589                                         data.targetHeight :
19590                                         -data.targetHeight,
19591                                 offset = -2 * data.offset[ 1 ];
19592                         position.top += data.collisionPosition.top < 0 ?
19593                                 myOffset + atOffset + offset :
19594                                 over > 0 ?
19595                                         myOffset + atOffset + offset :
19596                                         0;
19597                 }
19598         }
19599 };
19600
19601 // offset setter from jQuery 1.4
19602 if ( !$.offset.setOffset ) {
19603         $.offset.setOffset = function( elem, options ) {
19604                 // set position first, in-case top/left are set even on static elem
19605                 if ( /static/.test( $.curCSS( elem, "position" ) ) ) {
19606                         elem.style.position = "relative";
19607                 }
19608                 var curElem   = $( elem ),
19609                         curOffset = curElem.offset(),
19610                         curTop    = parseInt( $.curCSS( elem, "top",  true ), 10 ) || 0,
19611                         curLeft   = parseInt( $.curCSS( elem, "left", true ), 10)  || 0,
19612                         props     = {
19613                                 top:  (options.top  - curOffset.top)  + curTop,
19614                                 left: (options.left - curOffset.left) + curLeft
19615                         };
19616                 
19617                 if ( 'using' in options ) {
19618                         options.using.call( elem, props );
19619                 } else {
19620                         curElem.css( props );
19621                 }
19622         };
19623
19624         $.fn.offset = function( options ) {
19625                 var elem = this[ 0 ];
19626                 if ( !elem || !elem.ownerDocument ) { return null; }
19627                 if ( options ) { 
19628                         return this.each(function() {
19629                                 $.offset.setOffset( this, options );
19630                         });
19631                 }
19632                 return _offset.call( this );
19633         };
19634 }
19635
19636 }( jQuery ));
19637 /*
19638  * jQuery UI Progressbar 1.8.12
19639  *
19640  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
19641  * Dual licensed under the MIT or GPL Version 2 licenses.
19642  * http://jquery.org/license
19643  *
19644  * http://docs.jquery.com/UI/Progressbar
19645  *
19646  * Depends:
19647  *   jquery.ui.core.js
19648  *   jquery.ui.widget.js
19649  */
19650 (function( $, undefined ) {
19651
19652 $.widget( "ui.progressbar", {
19653         options: {
19654                 value: 0,
19655                 max: 100
19656         },
19657
19658         min: 0,
19659
19660         _create: function() {
19661                 this.element
19662                         .addClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
19663                         .attr({
19664                                 role: "progressbar",
19665                                 "aria-valuemin": this.min,
19666                                 "aria-valuemax": this.options.max,
19667                                 "aria-valuenow": this._value()
19668                         });
19669
19670                 this.valueDiv = $( "<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>" )
19671                         .appendTo( this.element );
19672
19673                 this.oldValue = this._value();
19674                 this._refreshValue();
19675         },
19676
19677         destroy: function() {
19678                 this.element
19679                         .removeClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
19680                         .removeAttr( "role" )
19681                         .removeAttr( "aria-valuemin" )
19682                         .removeAttr( "aria-valuemax" )
19683                         .removeAttr( "aria-valuenow" );
19684
19685                 this.valueDiv.remove();
19686
19687                 $.Widget.prototype.destroy.apply( this, arguments );
19688         },
19689
19690         value: function( newValue ) {
19691                 if ( newValue === undefined ) {
19692                         return this._value();
19693                 }
19694
19695                 this._setOption( "value", newValue );
19696                 return this;
19697         },
19698
19699         _setOption: function( key, value ) {
19700                 if ( key === "value" ) {
19701                         this.options.value = value;
19702                         this._refreshValue();
19703                         if ( this._value() === this.options.max ) {
19704                                 this._trigger( "complete" );
19705                         }
19706                 }
19707
19708                 $.Widget.prototype._setOption.apply( this, arguments );
19709         },
19710
19711         _value: function() {
19712                 var val = this.options.value;
19713                 // normalize invalid value
19714                 if ( typeof val !== "number" ) {
19715                         val = 0;
19716                 }
19717                 return Math.min( this.options.max, Math.max( this.min, val ) );
19718         },
19719
19720         _percentage: function() {
19721                 return 100 * this._value() / this.options.max;
19722         },
19723
19724         _refreshValue: function() {
19725                 var value = this.value();
19726                 var percentage = this._percentage();
19727
19728                 if ( this.oldValue !== value ) {
19729                         this.oldValue = value;
19730                         this._trigger( "change" );
19731                 }
19732
19733                 this.valueDiv
19734                         .toggle( value > this.min )
19735                         .toggleClass( "ui-corner-right", value === this.options.max )
19736                         .width( percentage.toFixed(0) + "%" );
19737                 this.element.attr( "aria-valuenow", value );
19738         }
19739 });
19740
19741 $.extend( $.ui.progressbar, {
19742         version: "1.8.12"
19743 });
19744
19745 })( jQuery );
19746 /*
19747  * jQuery UI Slider 1.8.12
19748  *
19749  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
19750  * Dual licensed under the MIT or GPL Version 2 licenses.
19751  * http://jquery.org/license
19752  *
19753  * http://docs.jquery.com/UI/Slider
19754  *
19755  * Depends:
19756  *      jquery.ui.core.js
19757  *      jquery.ui.mouse.js
19758  *      jquery.ui.widget.js
19759  */
19760 (function( $, undefined ) {
19761
19762 // number of pages in a slider
19763 // (how many times can you page up/down to go through the whole range)
19764 var numPages = 5;
19765
19766 $.widget( "ui.slider", $.ui.mouse, {
19767
19768         widgetEventPrefix: "slide",
19769
19770         options: {
19771                 animate: false,
19772                 distance: 0,
19773                 max: 100,
19774                 min: 0,
19775                 orientation: "horizontal",
19776                 range: false,
19777                 step: 1,
19778                 value: 0,
19779                 values: null
19780         },
19781
19782         _create: function() {
19783                 var self = this,
19784                         o = this.options;
19785
19786                 this._keySliding = false;
19787                 this._mouseSliding = false;
19788                 this._animateOff = true;
19789                 this._handleIndex = null;
19790                 this._detectOrientation();
19791                 this._mouseInit();
19792
19793                 this.element
19794                         .addClass( "ui-slider" +
19795                                 " ui-slider-" + this.orientation +
19796                                 " ui-widget" +
19797                                 " ui-widget-content" +
19798                                 " ui-corner-all" );
19799                 
19800                 if ( o.disabled ) {
19801                         this.element.addClass( "ui-slider-disabled ui-disabled" );
19802                 }
19803
19804                 this.range = $([]);
19805
19806                 if ( o.range ) {
19807                         if ( o.range === true ) {
19808                                 this.range = $( "<div></div>" );
19809                                 if ( !o.values ) {
19810                                         o.values = [ this._valueMin(), this._valueMin() ];
19811                                 }
19812                                 if ( o.values.length && o.values.length !== 2 ) {
19813                                         o.values = [ o.values[0], o.values[0] ];
19814                                 }
19815                         } else {
19816                                 this.range = $( "<div></div>" );
19817                         }
19818
19819                         this.range
19820                                 .appendTo( this.element )
19821                                 .addClass( "ui-slider-range" );
19822
19823                         if ( o.range === "min" || o.range === "max" ) {
19824                                 this.range.addClass( "ui-slider-range-" + o.range );
19825                         }
19826
19827                         // note: this isn't the most fittingly semantic framework class for this element,
19828                         // but worked best visually with a variety of themes
19829                         this.range.addClass( "ui-widget-header" );
19830                 }
19831
19832                 if ( $( ".ui-slider-handle", this.element ).length === 0 ) {
19833                         $( "<a href='#'></a>" )
19834                                 .appendTo( this.element )
19835                                 .addClass( "ui-slider-handle" );
19836                 }
19837
19838                 if ( o.values && o.values.length ) {
19839                         while ( $(".ui-slider-handle", this.element).length < o.values.length ) {
19840                                 $( "<a href='#'></a>" )
19841                                         .appendTo( this.element )
19842                                         .addClass( "ui-slider-handle" );
19843                         }
19844                 }
19845
19846                 this.handles = $( ".ui-slider-handle", this.element )
19847                         .addClass( "ui-state-default" +
19848                                 " ui-corner-all" );
19849
19850                 this.handle = this.handles.eq( 0 );
19851
19852                 this.handles.add( this.range ).filter( "a" )
19853                         .click(function( event ) {
19854                                 event.preventDefault();
19855                         })
19856                         .hover(function() {
19857                                 if ( !o.disabled ) {
19858                                         $( this ).addClass( "ui-state-hover" );
19859                                 }
19860                         }, function() {
19861                                 $( this ).removeClass( "ui-state-hover" );
19862                         })
19863                         .focus(function() {
19864                                 if ( !o.disabled ) {
19865                                         $( ".ui-slider .ui-state-focus" ).removeClass( "ui-state-focus" );
19866                                         $( this ).addClass( "ui-state-focus" );
19867                                 } else {
19868                                         $( this ).blur();
19869                                 }
19870                         })
19871                         .blur(function() {
19872                                 $( this ).removeClass( "ui-state-focus" );
19873                         });
19874
19875                 this.handles.each(function( i ) {
19876                         $( this ).data( "index.ui-slider-handle", i );
19877                 });
19878
19879                 this.handles
19880                         .keydown(function( event ) {
19881                                 var ret = true,
19882                                         index = $( this ).data( "index.ui-slider-handle" ),
19883                                         allowed,
19884                                         curVal,
19885                                         newVal,
19886                                         step;
19887         
19888                                 if ( self.options.disabled ) {
19889                                         return;
19890                                 }
19891         
19892                                 switch ( event.keyCode ) {
19893                                         case $.ui.keyCode.HOME:
19894                                         case $.ui.keyCode.END:
19895                                         case $.ui.keyCode.PAGE_UP:
19896                                         case $.ui.keyCode.PAGE_DOWN:
19897                                         case $.ui.keyCode.UP:
19898                                         case $.ui.keyCode.RIGHT:
19899                                         case $.ui.keyCode.DOWN:
19900                                         case $.ui.keyCode.LEFT:
19901                                                 ret = false;
19902                                                 if ( !self._keySliding ) {
19903                                                         self._keySliding = true;
19904                                                         $( this ).addClass( "ui-state-active" );
19905                                                         allowed = self._start( event, index );
19906                                                         if ( allowed === false ) {
19907                                                                 return;
19908                                                         }
19909                                                 }
19910                                                 break;
19911                                 }
19912         
19913                                 step = self.options.step;
19914                                 if ( self.options.values && self.options.values.length ) {
19915                                         curVal = newVal = self.values( index );
19916                                 } else {
19917                                         curVal = newVal = self.value();
19918                                 }
19919         
19920                                 switch ( event.keyCode ) {
19921                                         case $.ui.keyCode.HOME:
19922                                                 newVal = self._valueMin();
19923                                                 break;
19924                                         case $.ui.keyCode.END:
19925                                                 newVal = self._valueMax();
19926                                                 break;
19927                                         case $.ui.keyCode.PAGE_UP:
19928                                                 newVal = self._trimAlignValue( curVal + ( (self._valueMax() - self._valueMin()) / numPages ) );
19929                                                 break;
19930                                         case $.ui.keyCode.PAGE_DOWN:
19931                                                 newVal = self._trimAlignValue( curVal - ( (self._valueMax() - self._valueMin()) / numPages ) );
19932                                                 break;
19933                                         case $.ui.keyCode.UP:
19934                                         case $.ui.keyCode.RIGHT:
19935                                                 if ( curVal === self._valueMax() ) {
19936                                                         return;
19937                                                 }
19938                                                 newVal = self._trimAlignValue( curVal + step );
19939                                                 break;
19940                                         case $.ui.keyCode.DOWN:
19941                                         case $.ui.keyCode.LEFT:
19942                                                 if ( curVal === self._valueMin() ) {
19943                                                         return;
19944                                                 }
19945                                                 newVal = self._trimAlignValue( curVal - step );
19946                                                 break;
19947                                 }
19948         
19949                                 self._slide( event, index, newVal );
19950         
19951                                 return ret;
19952         
19953                         })
19954                         .keyup(function( event ) {
19955                                 var index = $( this ).data( "index.ui-slider-handle" );
19956         
19957                                 if ( self._keySliding ) {
19958                                         self._keySliding = false;
19959                                         self._stop( event, index );
19960                                         self._change( event, index );
19961                                         $( this ).removeClass( "ui-state-active" );
19962                                 }
19963         
19964                         });
19965
19966                 this._refreshValue();
19967
19968                 this._animateOff = false;
19969         },
19970
19971         destroy: function() {
19972                 this.handles.remove();
19973                 this.range.remove();
19974
19975                 this.element
19976                         .removeClass( "ui-slider" +
19977                                 " ui-slider-horizontal" +
19978                                 " ui-slider-vertical" +
19979                                 " ui-slider-disabled" +
19980                                 " ui-widget" +
19981                                 " ui-widget-content" +
19982                                 " ui-corner-all" )
19983                         .removeData( "slider" )
19984                         .unbind( ".slider" );
19985
19986                 this._mouseDestroy();
19987
19988                 return this;
19989         },
19990
19991         _mouseCapture: function( event ) {
19992                 var o = this.options,
19993                         position,
19994                         normValue,
19995                         distance,
19996                         closestHandle,
19997                         self,
19998                         index,
19999                         allowed,
20000                         offset,
20001                         mouseOverHandle;
20002
20003                 if ( o.disabled ) {
20004                         return false;
20005                 }
20006
20007                 this.elementSize = {
20008                         width: this.element.outerWidth(),
20009                         height: this.element.outerHeight()
20010                 };
20011                 this.elementOffset = this.element.offset();
20012
20013                 position = { x: event.pageX, y: event.pageY };
20014                 normValue = this._normValueFromMouse( position );
20015                 distance = this._valueMax() - this._valueMin() + 1;
20016                 self = this;
20017                 this.handles.each(function( i ) {
20018                         var thisDistance = Math.abs( normValue - self.values(i) );
20019                         if ( distance > thisDistance ) {
20020                                 distance = thisDistance;
20021                                 closestHandle = $( this );
20022                                 index = i;
20023                         }
20024                 });
20025
20026                 // workaround for bug #3736 (if both handles of a range are at 0,
20027                 // the first is always used as the one with least distance,
20028                 // and moving it is obviously prevented by preventing negative ranges)
20029                 if( o.range === true && this.values(1) === o.min ) {
20030                         index += 1;
20031                         closestHandle = $( this.handles[index] );
20032                 }
20033
20034                 allowed = this._start( event, index );
20035                 if ( allowed === false ) {
20036                         return false;
20037                 }
20038                 this._mouseSliding = true;
20039
20040                 self._handleIndex = index;
20041
20042                 closestHandle
20043                         .addClass( "ui-state-active" )
20044                         .focus();
20045                 
20046                 offset = closestHandle.offset();
20047                 mouseOverHandle = !$( event.target ).parents().andSelf().is( ".ui-slider-handle" );
20048                 this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
20049                         left: event.pageX - offset.left - ( closestHandle.width() / 2 ),
20050                         top: event.pageY - offset.top -
20051                                 ( closestHandle.height() / 2 ) -
20052                                 ( parseInt( closestHandle.css("borderTopWidth"), 10 ) || 0 ) -
20053                                 ( parseInt( closestHandle.css("borderBottomWidth"), 10 ) || 0) +
20054                                 ( parseInt( closestHandle.css("marginTop"), 10 ) || 0)
20055                 };
20056
20057                 if ( !this.handles.hasClass( "ui-state-hover" ) ) {
20058                         this._slide( event, index, normValue );
20059                 }
20060                 this._animateOff = true;
20061                 return true;
20062         },
20063
20064         _mouseStart: function( event ) {
20065                 return true;
20066         },
20067
20068         _mouseDrag: function( event ) {
20069                 var position = { x: event.pageX, y: event.pageY },
20070                         normValue = this._normValueFromMouse( position );
20071                 
20072                 this._slide( event, this._handleIndex, normValue );
20073
20074                 return false;
20075         },
20076
20077         _mouseStop: function( event ) {
20078                 this.handles.removeClass( "ui-state-active" );
20079                 this._mouseSliding = false;
20080
20081                 this._stop( event, this._handleIndex );
20082                 this._change( event, this._handleIndex );
20083
20084                 this._handleIndex = null;
20085                 this._clickOffset = null;
20086                 this._animateOff = false;
20087
20088                 return false;
20089         },
20090         
20091         _detectOrientation: function() {
20092                 this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal";
20093         },
20094
20095         _normValueFromMouse: function( position ) {
20096                 var pixelTotal,
20097                         pixelMouse,
20098                         percentMouse,
20099                         valueTotal,
20100                         valueMouse;
20101
20102                 if ( this.orientation === "horizontal" ) {
20103                         pixelTotal = this.elementSize.width;
20104                         pixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 );
20105                 } else {
20106                         pixelTotal = this.elementSize.height;
20107                         pixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 );
20108                 }
20109
20110                 percentMouse = ( pixelMouse / pixelTotal );
20111                 if ( percentMouse > 1 ) {
20112                         percentMouse = 1;
20113                 }
20114                 if ( percentMouse < 0 ) {
20115                         percentMouse = 0;
20116                 }
20117                 if ( this.orientation === "vertical" ) {
20118                         percentMouse = 1 - percentMouse;
20119                 }
20120
20121                 valueTotal = this._valueMax() - this._valueMin();
20122                 valueMouse = this._valueMin() + percentMouse * valueTotal;
20123
20124                 return this._trimAlignValue( valueMouse );
20125         },
20126
20127         _start: function( event, index ) {
20128                 var uiHash = {
20129                         handle: this.handles[ index ],
20130                         value: this.value()
20131                 };
20132                 if ( this.options.values && this.options.values.length ) {
20133                         uiHash.value = this.values( index );
20134                         uiHash.values = this.values();
20135                 }
20136                 return this._trigger( "start", event, uiHash );
20137         },
20138
20139         _slide: function( event, index, newVal ) {
20140                 var otherVal,
20141                         newValues,
20142                         allowed;
20143
20144                 if ( this.options.values && this.options.values.length ) {
20145                         otherVal = this.values( index ? 0 : 1 );
20146
20147                         if ( ( this.options.values.length === 2 && this.options.range === true ) && 
20148                                         ( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) )
20149                                 ) {
20150                                 newVal = otherVal;
20151                         }
20152
20153                         if ( newVal !== this.values( index ) ) {
20154                                 newValues = this.values();
20155                                 newValues[ index ] = newVal;
20156                                 // A slide can be canceled by returning false from the slide callback
20157                                 allowed = this._trigger( "slide", event, {
20158                                         handle: this.handles[ index ],
20159                                         value: newVal,
20160                                         values: newValues
20161                                 } );
20162                                 otherVal = this.values( index ? 0 : 1 );
20163                                 if ( allowed !== false ) {
20164                                         this.values( index, newVal, true );
20165                                 }
20166                         }
20167                 } else {
20168                         if ( newVal !== this.value() ) {
20169                                 // A slide can be canceled by returning false from the slide callback
20170                                 allowed = this._trigger( "slide", event, {
20171                                         handle: this.handles[ index ],
20172                                         value: newVal
20173                                 } );
20174                                 if ( allowed !== false ) {
20175                                         this.value( newVal );
20176                                 }
20177                         }
20178                 }
20179         },
20180
20181         _stop: function( event, index ) {
20182                 var uiHash = {
20183                         handle: this.handles[ index ],
20184                         value: this.value()
20185                 };
20186                 if ( this.options.values && this.options.values.length ) {
20187                         uiHash.value = this.values( index );
20188                         uiHash.values = this.values();
20189                 }
20190
20191                 this._trigger( "stop", event, uiHash );
20192         },
20193
20194         _change: function( event, index ) {
20195                 if ( !this._keySliding && !this._mouseSliding ) {
20196                         var uiHash = {
20197                                 handle: this.handles[ index ],
20198                                 value: this.value()
20199                         };
20200                         if ( this.options.values && this.options.values.length ) {
20201                                 uiHash.value = this.values( index );
20202                                 uiHash.values = this.values();
20203                         }
20204
20205                         this._trigger( "change", event, uiHash );
20206                 }
20207         },
20208
20209         value: function( newValue ) {
20210                 if ( arguments.length ) {
20211                         this.options.value = this._trimAlignValue( newValue );
20212                         this._refreshValue();
20213                         this._change( null, 0 );
20214                         return;
20215                 }
20216
20217                 return this._value();
20218         },
20219
20220         values: function( index, newValue ) {
20221                 var vals,
20222                         newValues,
20223                         i;
20224
20225                 if ( arguments.length > 1 ) {
20226                         this.options.values[ index ] = this._trimAlignValue( newValue );
20227                         this._refreshValue();
20228                         this._change( null, index );
20229                         return;
20230                 }
20231
20232                 if ( arguments.length ) {
20233                         if ( $.isArray( arguments[ 0 ] ) ) {
20234                                 vals = this.options.values;
20235                                 newValues = arguments[ 0 ];
20236                                 for ( i = 0; i < vals.length; i += 1 ) {
20237                                         vals[ i ] = this._trimAlignValue( newValues[ i ] );
20238                                         this._change( null, i );
20239                                 }
20240                                 this._refreshValue();
20241                         } else {
20242                                 if ( this.options.values && this.options.values.length ) {
20243                                         return this._values( index );
20244                                 } else {
20245                                         return this.value();
20246                                 }
20247                         }
20248                 } else {
20249                         return this._values();
20250                 }
20251         },
20252
20253         _setOption: function( key, value ) {
20254                 var i,
20255                         valsLength = 0;
20256
20257                 if ( $.isArray( this.options.values ) ) {
20258                         valsLength = this.options.values.length;
20259                 }
20260
20261                 $.Widget.prototype._setOption.apply( this, arguments );
20262
20263                 switch ( key ) {
20264                         case "disabled":
20265                                 if ( value ) {
20266                                         this.handles.filter( ".ui-state-focus" ).blur();
20267                                         this.handles.removeClass( "ui-state-hover" );
20268                                         this.handles.attr( "disabled", "disabled" );
20269                                         this.element.addClass( "ui-disabled" );
20270                                 } else {
20271                                         this.handles.removeAttr( "disabled" );
20272                                         this.element.removeClass( "ui-disabled" );
20273                                 }
20274                                 break;
20275                         case "orientation":
20276                                 this._detectOrientation();
20277                                 this.element
20278                                         .removeClass( "ui-slider-horizontal ui-slider-vertical" )
20279                                         .addClass( "ui-slider-" + this.orientation );
20280                                 this._refreshValue();
20281                                 break;
20282                         case "value":
20283                                 this._animateOff = true;
20284                                 this._refreshValue();
20285                                 this._change( null, 0 );
20286                                 this._animateOff = false;
20287                                 break;
20288                         case "values":
20289                                 this._animateOff = true;
20290                                 this._refreshValue();
20291                                 for ( i = 0; i < valsLength; i += 1 ) {
20292                                         this._change( null, i );
20293                                 }
20294                                 this._animateOff = false;
20295                                 break;
20296                 }
20297         },
20298
20299         //internal value getter
20300         // _value() returns value trimmed by min and max, aligned by step
20301         _value: function() {
20302                 var val = this.options.value;
20303                 val = this._trimAlignValue( val );
20304
20305                 return val;
20306         },
20307
20308         //internal values getter
20309         // _values() returns array of values trimmed by min and max, aligned by step
20310         // _values( index ) returns single value trimmed by min and max, aligned by step
20311         _values: function( index ) {
20312                 var val,
20313                         vals,
20314                         i;
20315
20316                 if ( arguments.length ) {
20317                         val = this.options.values[ index ];
20318                         val = this._trimAlignValue( val );
20319
20320                         return val;
20321                 } else {
20322                         // .slice() creates a copy of the array
20323                         // this copy gets trimmed by min and max and then returned
20324                         vals = this.options.values.slice();
20325                         for ( i = 0; i < vals.length; i+= 1) {
20326                                 vals[ i ] = this._trimAlignValue( vals[ i ] );
20327                         }
20328
20329                         return vals;
20330                 }
20331         },
20332         
20333         // returns the step-aligned value that val is closest to, between (inclusive) min and max
20334         _trimAlignValue: function( val ) {
20335                 if ( val <= this._valueMin() ) {
20336                         return this._valueMin();
20337                 }
20338                 if ( val >= this._valueMax() ) {
20339                         return this._valueMax();
20340                 }
20341                 var step = ( this.options.step > 0 ) ? this.options.step : 1,
20342                         valModStep = (val - this._valueMin()) % step;
20343                         alignValue = val - valModStep;
20344
20345                 if ( Math.abs(valModStep) * 2 >= step ) {
20346                         alignValue += ( valModStep > 0 ) ? step : ( -step );
20347                 }
20348
20349                 // Since JavaScript has problems with large floats, round
20350                 // the final value to 5 digits after the decimal point (see #4124)
20351                 return parseFloat( alignValue.toFixed(5) );
20352         },
20353
20354         _valueMin: function() {
20355                 return this.options.min;
20356         },
20357
20358         _valueMax: function() {
20359                 return this.options.max;
20360         },
20361         
20362         _refreshValue: function() {
20363                 var oRange = this.options.range,
20364                         o = this.options,
20365                         self = this,
20366                         animate = ( !this._animateOff ) ? o.animate : false,
20367                         valPercent,
20368                         _set = {},
20369                         lastValPercent,
20370                         value,
20371                         valueMin,
20372                         valueMax;
20373
20374                 if ( this.options.values && this.options.values.length ) {
20375                         this.handles.each(function( i, j ) {
20376                                 valPercent = ( self.values(i) - self._valueMin() ) / ( self._valueMax() - self._valueMin() ) * 100;
20377                                 _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
20378                                 $( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
20379                                 if ( self.options.range === true ) {
20380                                         if ( self.orientation === "horizontal" ) {
20381                                                 if ( i === 0 ) {
20382                                                         self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate );
20383                                                 }
20384                                                 if ( i === 1 ) {
20385                                                         self.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
20386                                                 }
20387                                         } else {
20388                                                 if ( i === 0 ) {
20389                                                         self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate );
20390                                                 }
20391                                                 if ( i === 1 ) {
20392                                                         self.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
20393                                                 }
20394                                         }
20395                                 }
20396                                 lastValPercent = valPercent;
20397                         });
20398                 } else {
20399                         value = this.value();
20400                         valueMin = this._valueMin();
20401                         valueMax = this._valueMax();
20402                         valPercent = ( valueMax !== valueMin ) ?
20403                                         ( value - valueMin ) / ( valueMax - valueMin ) * 100 :
20404                                         0;
20405                         _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
20406                         this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
20407
20408                         if ( oRange === "min" && this.orientation === "horizontal" ) {
20409                                 this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { width: valPercent + "%" }, o.animate );
20410                         }
20411                         if ( oRange === "max" && this.orientation === "horizontal" ) {
20412                                 this.range[ animate ? "animate" : "css" ]( { width: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
20413                         }
20414                         if ( oRange === "min" && this.orientation === "vertical" ) {
20415                                 this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { height: valPercent + "%" }, o.animate );
20416                         }
20417                         if ( oRange === "max" && this.orientation === "vertical" ) {
20418                                 this.range[ animate ? "animate" : "css" ]( { height: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
20419                         }
20420                 }
20421         }
20422
20423 });
20424
20425 $.extend( $.ui.slider, {
20426         version: "1.8.12"
20427 });
20428
20429 }(jQuery));
20430 /*
20431  * jQuery UI Tabs 1.8.12
20432  *
20433  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
20434  * Dual licensed under the MIT or GPL Version 2 licenses.
20435  * http://jquery.org/license
20436  *
20437  * http://docs.jquery.com/UI/Tabs
20438  *
20439  * Depends:
20440  *      jquery.ui.core.js
20441  *      jquery.ui.widget.js
20442  */
20443 (function( $, undefined ) {
20444
20445 var tabId = 0,
20446         listId = 0;
20447
20448 function getNextTabId() {
20449         return ++tabId;
20450 }
20451
20452 function getNextListId() {
20453         return ++listId;
20454 }
20455
20456 $.widget( "ui.tabs", {
20457         options: {
20458                 add: null,
20459                 ajaxOptions: null,
20460                 cache: false,
20461                 cookie: null, // e.g. { expires: 7, path: '/', domain: 'jquery.com', secure: true }
20462                 collapsible: false,
20463                 disable: null,
20464                 disabled: [],
20465                 enable: null,
20466                 event: "click",
20467                 fx: null, // e.g. { height: 'toggle', opacity: 'toggle', duration: 200 }
20468                 idPrefix: "ui-tabs-",
20469                 load: null,
20470                 panelTemplate: "<div></div>",
20471                 remove: null,
20472                 select: null,
20473                 show: null,
20474                 spinner: "<em>Loading&#8230;</em>",
20475                 tabTemplate: "<li><a href='#{href}'><span>#{label}</span></a></li>"
20476         },
20477
20478         _create: function() {
20479                 this._tabify( true );
20480         },
20481
20482         _setOption: function( key, value ) {
20483                 if ( key == "selected" ) {
20484                         if (this.options.collapsible && value == this.options.selected ) {
20485                                 return;
20486                         }
20487                         this.select( value );
20488                 } else {
20489                         this.options[ key ] = value;
20490                         this._tabify();
20491                 }
20492         },
20493
20494         _tabId: function( a ) {
20495                 return a.title && a.title.replace( /\s/g, "_" ).replace( /[^\w\u00c0-\uFFFF-]/g, "" ) ||
20496                         this.options.idPrefix + getNextTabId();
20497         },
20498
20499         _sanitizeSelector: function( hash ) {
20500                 // we need this because an id may contain a ":"
20501                 return hash.replace( /:/g, "\\:" );
20502         },
20503
20504         _cookie: function() {
20505                 var cookie = this.cookie ||
20506                         ( this.cookie = this.options.cookie.name || "ui-tabs-" + getNextListId() );
20507                 return $.cookie.apply( null, [ cookie ].concat( $.makeArray( arguments ) ) );
20508         },
20509
20510         _ui: function( tab, panel ) {
20511                 return {
20512                         tab: tab,
20513                         panel: panel,
20514                         index: this.anchors.index( tab )
20515                 };
20516         },
20517
20518         _cleanup: function() {
20519                 // restore all former loading tabs labels
20520                 this.lis.filter( ".ui-state-processing" )
20521                         .removeClass( "ui-state-processing" )
20522                         .find( "span:data(label.tabs)" )
20523                                 .each(function() {
20524                                         var el = $( this );
20525                                         el.html( el.data( "label.tabs" ) ).removeData( "label.tabs" );
20526                                 });
20527         },
20528
20529         _tabify: function( init ) {
20530                 var self = this,
20531                         o = this.options,
20532                         fragmentId = /^#.+/; // Safari 2 reports '#' for an empty hash
20533
20534                 this.list = this.element.find( "ol,ul" ).eq( 0 );
20535                 this.lis = $( " > li:has(a[href])", this.list );
20536                 this.anchors = this.lis.map(function() {
20537                         return $( "a", this )[ 0 ];
20538                 });
20539                 this.panels = $( [] );
20540
20541                 this.anchors.each(function( i, a ) {
20542                         var href = $( a ).attr( "href" );
20543                         // For dynamically created HTML that contains a hash as href IE < 8 expands
20544                         // such href to the full page url with hash and then misinterprets tab as ajax.
20545                         // Same consideration applies for an added tab with a fragment identifier
20546                         // since a[href=#fragment-identifier] does unexpectedly not match.
20547                         // Thus normalize href attribute...
20548                         var hrefBase = href.split( "#" )[ 0 ],
20549                                 baseEl;
20550                         if ( hrefBase && ( hrefBase === location.toString().split( "#" )[ 0 ] ||
20551                                         ( baseEl = $( "base" )[ 0 ]) && hrefBase === baseEl.href ) ) {
20552                                 href = a.hash;
20553                                 a.href = href;
20554                         }
20555
20556                         // inline tab
20557                         if ( fragmentId.test( href ) ) {
20558                                 self.panels = self.panels.add( self.element.find( self._sanitizeSelector( href ) ) );
20559                         // remote tab
20560                         // prevent loading the page itself if href is just "#"
20561                         } else if ( href && href !== "#" ) {
20562                                 // required for restore on destroy
20563                                 $.data( a, "href.tabs", href );
20564
20565                                 // TODO until #3808 is fixed strip fragment identifier from url
20566                                 // (IE fails to load from such url)
20567                                 $.data( a, "load.tabs", href.replace( /#.*$/, "" ) );
20568
20569                                 var id = self._tabId( a );
20570                                 a.href = "#" + id;
20571                                 var $panel = self.element.find( "#" + id );
20572                                 if ( !$panel.length ) {
20573                                         $panel = $( o.panelTemplate )
20574                                                 .attr( "id", id )
20575                                                 .addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
20576                                                 .insertAfter( self.panels[ i - 1 ] || self.list );
20577                                         $panel.data( "destroy.tabs", true );
20578                                 }
20579                                 self.panels = self.panels.add( $panel );
20580                         // invalid tab href
20581                         } else {
20582                                 o.disabled.push( i );
20583                         }
20584                 });
20585
20586                 // initialization from scratch
20587                 if ( init ) {
20588                         // attach necessary classes for styling
20589                         this.element.addClass( "ui-tabs ui-widget ui-widget-content ui-corner-all" );
20590                         this.list.addClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" );
20591                         this.lis.addClass( "ui-state-default ui-corner-top" );
20592                         this.panels.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" );
20593
20594                         // Selected tab
20595                         // use "selected" option or try to retrieve:
20596                         // 1. from fragment identifier in url
20597                         // 2. from cookie
20598                         // 3. from selected class attribute on <li>
20599                         if ( o.selected === undefined ) {
20600                                 if ( location.hash ) {
20601                                         this.anchors.each(function( i, a ) {
20602                                                 if ( a.hash == location.hash ) {
20603                                                         o.selected = i;
20604                                                         return false;
20605                                                 }
20606                                         });
20607                                 }
20608                                 if ( typeof o.selected !== "number" && o.cookie ) {
20609                                         o.selected = parseInt( self._cookie(), 10 );
20610                                 }
20611                                 if ( typeof o.selected !== "number" && this.lis.filter( ".ui-tabs-selected" ).length ) {
20612                                         o.selected = this.lis.index( this.lis.filter( ".ui-tabs-selected" ) );
20613                                 }
20614                                 o.selected = o.selected || ( this.lis.length ? 0 : -1 );
20615                         } else if ( o.selected === null ) { // usage of null is deprecated, TODO remove in next release
20616                                 o.selected = -1;
20617                         }
20618
20619                         // sanity check - default to first tab...
20620                         o.selected = ( ( o.selected >= 0 && this.anchors[ o.selected ] ) || o.selected < 0 )
20621                                 ? o.selected
20622                                 : 0;
20623
20624                         // Take disabling tabs via class attribute from HTML
20625                         // into account and update option properly.
20626                         // A selected tab cannot become disabled.
20627                         o.disabled = $.unique( o.disabled.concat(
20628                                 $.map( this.lis.filter( ".ui-state-disabled" ), function( n, i ) {
20629                                         return self.lis.index( n );
20630                                 })
20631                         ) ).sort();
20632
20633                         if ( $.inArray( o.selected, o.disabled ) != -1 ) {
20634                                 o.disabled.splice( $.inArray( o.selected, o.disabled ), 1 );
20635                         }
20636
20637                         // highlight selected tab
20638                         this.panels.addClass( "ui-tabs-hide" );
20639                         this.lis.removeClass( "ui-tabs-selected ui-state-active" );
20640                         // check for length avoids error when initializing empty list
20641                         if ( o.selected >= 0 && this.anchors.length ) {
20642                                 self.element.find( self._sanitizeSelector( self.anchors[ o.selected ].hash ) ).removeClass( "ui-tabs-hide" );
20643                                 this.lis.eq( o.selected ).addClass( "ui-tabs-selected ui-state-active" );
20644
20645                                 // seems to be expected behavior that the show callback is fired
20646                                 self.element.queue( "tabs", function() {
20647                                         self._trigger( "show", null,
20648                                                 self._ui( self.anchors[ o.selected ], self.element.find( self._sanitizeSelector( self.anchors[ o.selected ].hash ) )[ 0 ] ) );
20649                                 });
20650
20651                                 this.load( o.selected );
20652                         }
20653
20654                         // clean up to avoid memory leaks in certain versions of IE 6
20655                         // TODO: namespace this event
20656                         $( window ).bind( "unload", function() {
20657                                 self.lis.add( self.anchors ).unbind( ".tabs" );
20658                                 self.lis = self.anchors = self.panels = null;
20659                         });
20660                 // update selected after add/remove
20661                 } else {
20662                         o.selected = this.lis.index( this.lis.filter( ".ui-tabs-selected" ) );
20663                 }
20664
20665                 // update collapsible
20666                 // TODO: use .toggleClass()
20667                 this.element[ o.collapsible ? "addClass" : "removeClass" ]( "ui-tabs-collapsible" );
20668
20669                 // set or update cookie after init and add/remove respectively
20670                 if ( o.cookie ) {
20671                         this._cookie( o.selected, o.cookie );
20672                 }
20673
20674                 // disable tabs
20675                 for ( var i = 0, li; ( li = this.lis[ i ] ); i++ ) {
20676                         $( li )[ $.inArray( i, o.disabled ) != -1 &&
20677                                 // TODO: use .toggleClass()
20678                                 !$( li ).hasClass( "ui-tabs-selected" ) ? "addClass" : "removeClass" ]( "ui-state-disabled" );
20679                 }
20680
20681                 // reset cache if switching from cached to not cached
20682                 if ( o.cache === false ) {
20683                         this.anchors.removeData( "cache.tabs" );
20684                 }
20685
20686                 // remove all handlers before, tabify may run on existing tabs after add or option change
20687                 this.lis.add( this.anchors ).unbind( ".tabs" );
20688
20689                 if ( o.event !== "mouseover" ) {
20690                         var addState = function( state, el ) {
20691                                 if ( el.is( ":not(.ui-state-disabled)" ) ) {
20692                                         el.addClass( "ui-state-" + state );
20693                                 }
20694                         };
20695                         var removeState = function( state, el ) {
20696                                 el.removeClass( "ui-state-" + state );
20697                         };
20698                         this.lis.bind( "mouseover.tabs" , function() {
20699                                 addState( "hover", $( this ) );
20700                         });
20701                         this.lis.bind( "mouseout.tabs", function() {
20702                                 removeState( "hover", $( this ) );
20703                         });
20704                         this.anchors.bind( "focus.tabs", function() {
20705                                 addState( "focus", $( this ).closest( "li" ) );
20706                         });
20707                         this.anchors.bind( "blur.tabs", function() {
20708                                 removeState( "focus", $( this ).closest( "li" ) );
20709                         });
20710                 }
20711
20712                 // set up animations
20713                 var hideFx, showFx;
20714                 if ( o.fx ) {
20715                         if ( $.isArray( o.fx ) ) {
20716                                 hideFx = o.fx[ 0 ];
20717                                 showFx = o.fx[ 1 ];
20718                         } else {
20719                                 hideFx = showFx = o.fx;
20720                         }
20721                 }
20722
20723                 // Reset certain styles left over from animation
20724                 // and prevent IE's ClearType bug...
20725                 function resetStyle( $el, fx ) {
20726                         $el.css( "display", "" );
20727                         if ( !$.support.opacity && fx.opacity ) {
20728                                 $el[ 0 ].style.removeAttribute( "filter" );
20729                         }
20730                 }
20731
20732                 // Show a tab...
20733                 var showTab = showFx
20734                         ? function( clicked, $show ) {
20735                                 $( clicked ).closest( "li" ).addClass( "ui-tabs-selected ui-state-active" );
20736                                 $show.hide().removeClass( "ui-tabs-hide" ) // avoid flicker that way
20737                                         .animate( showFx, showFx.duration || "normal", function() {
20738                                                 resetStyle( $show, showFx );
20739                                                 self._trigger( "show", null, self._ui( clicked, $show[ 0 ] ) );
20740                                         });
20741                         }
20742                         : function( clicked, $show ) {
20743                                 $( clicked ).closest( "li" ).addClass( "ui-tabs-selected ui-state-active" );
20744                                 $show.removeClass( "ui-tabs-hide" );
20745                                 self._trigger( "show", null, self._ui( clicked, $show[ 0 ] ) );
20746                         };
20747
20748                 // Hide a tab, $show is optional...
20749                 var hideTab = hideFx
20750                         ? function( clicked, $hide ) {
20751                                 $hide.animate( hideFx, hideFx.duration || "normal", function() {
20752                                         self.lis.removeClass( "ui-tabs-selected ui-state-active" );
20753                                         $hide.addClass( "ui-tabs-hide" );
20754                                         resetStyle( $hide, hideFx );
20755                                         self.element.dequeue( "tabs" );
20756                                 });
20757                         }
20758                         : function( clicked, $hide, $show ) {
20759                                 self.lis.removeClass( "ui-tabs-selected ui-state-active" );
20760                                 $hide.addClass( "ui-tabs-hide" );
20761                                 self.element.dequeue( "tabs" );
20762                         };
20763
20764                 // attach tab event handler, unbind to avoid duplicates from former tabifying...
20765                 this.anchors.bind( o.event + ".tabs", function() {
20766                         var el = this,
20767                                 $li = $(el).closest( "li" ),
20768                                 $hide = self.panels.filter( ":not(.ui-tabs-hide)" ),
20769                                 $show = self.element.find( self._sanitizeSelector( el.hash ) );
20770
20771                         // If tab is already selected and not collapsible or tab disabled or
20772                         // or is already loading or click callback returns false stop here.
20773                         // Check if click handler returns false last so that it is not executed
20774                         // for a disabled or loading tab!
20775                         if ( ( $li.hasClass( "ui-tabs-selected" ) && !o.collapsible) ||
20776                                 $li.hasClass( "ui-state-disabled" ) ||
20777                                 $li.hasClass( "ui-state-processing" ) ||
20778                                 self.panels.filter( ":animated" ).length ||
20779                                 self._trigger( "select", null, self._ui( this, $show[ 0 ] ) ) === false ) {
20780                                 this.blur();
20781                                 return false;
20782                         }
20783
20784                         o.selected = self.anchors.index( this );
20785
20786                         self.abort();
20787
20788                         // if tab may be closed
20789                         if ( o.collapsible ) {
20790                                 if ( $li.hasClass( "ui-tabs-selected" ) ) {
20791                                         o.selected = -1;
20792
20793                                         if ( o.cookie ) {
20794                                                 self._cookie( o.selected, o.cookie );
20795                                         }
20796
20797                                         self.element.queue( "tabs", function() {
20798                                                 hideTab( el, $hide );
20799                                         }).dequeue( "tabs" );
20800
20801                                         this.blur();
20802                                         return false;
20803                                 } else if ( !$hide.length ) {
20804                                         if ( o.cookie ) {
20805                                                 self._cookie( o.selected, o.cookie );
20806                                         }
20807
20808                                         self.element.queue( "tabs", function() {
20809                                                 showTab( el, $show );
20810                                         });
20811
20812                                         // TODO make passing in node possible, see also http://dev.jqueryui.com/ticket/3171
20813                                         self.load( self.anchors.index( this ) );
20814
20815                                         this.blur();
20816                                         return false;
20817                                 }
20818                         }
20819
20820                         if ( o.cookie ) {
20821                                 self._cookie( o.selected, o.cookie );
20822                         }
20823
20824                         // show new tab
20825                         if ( $show.length ) {
20826                                 if ( $hide.length ) {
20827                                         self.element.queue( "tabs", function() {
20828                                                 hideTab( el, $hide );
20829                                         });
20830                                 }
20831                                 self.element.queue( "tabs", function() {
20832                                         showTab( el, $show );
20833                                 });
20834
20835                                 self.load( self.anchors.index( this ) );
20836                         } else {
20837                                 throw "jQuery UI Tabs: Mismatching fragment identifier.";
20838                         }
20839
20840                         // Prevent IE from keeping other link focussed when using the back button
20841                         // and remove dotted border from clicked link. This is controlled via CSS
20842                         // in modern browsers; blur() removes focus from address bar in Firefox
20843                         // which can become a usability and annoying problem with tabs('rotate').
20844                         if ( $.browser.msie ) {
20845                                 this.blur();
20846                         }
20847                 });
20848
20849                 // disable click in any case
20850                 this.anchors.bind( "click.tabs", function(){
20851                         return false;
20852                 });
20853         },
20854
20855     _getIndex: function( index ) {
20856                 // meta-function to give users option to provide a href string instead of a numerical index.
20857                 // also sanitizes numerical indexes to valid values.
20858                 if ( typeof index == "string" ) {
20859                         index = this.anchors.index( this.anchors.filter( "[href$=" + index + "]" ) );
20860                 }
20861
20862                 return index;
20863         },
20864
20865         destroy: function() {
20866                 var o = this.options;
20867
20868                 this.abort();
20869
20870                 this.element
20871                         .unbind( ".tabs" )
20872                         .removeClass( "ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible" )
20873                         .removeData( "tabs" );
20874
20875                 this.list.removeClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" );
20876
20877                 this.anchors.each(function() {
20878                         var href = $.data( this, "href.tabs" );
20879                         if ( href ) {
20880                                 this.href = href;
20881                         }
20882                         var $this = $( this ).unbind( ".tabs" );
20883                         $.each( [ "href", "load", "cache" ], function( i, prefix ) {
20884                                 $this.removeData( prefix + ".tabs" );
20885                         });
20886                 });
20887
20888                 this.lis.unbind( ".tabs" ).add( this.panels ).each(function() {
20889                         if ( $.data( this, "destroy.tabs" ) ) {
20890                                 $( this ).remove();
20891                         } else {
20892                                 $( this ).removeClass([
20893                                         "ui-state-default",
20894                                         "ui-corner-top",
20895                                         "ui-tabs-selected",
20896                                         "ui-state-active",
20897                                         "ui-state-hover",
20898                                         "ui-state-focus",
20899                                         "ui-state-disabled",
20900                                         "ui-tabs-panel",
20901                                         "ui-widget-content",
20902                                         "ui-corner-bottom",
20903                                         "ui-tabs-hide"
20904                                 ].join( " " ) );
20905                         }
20906                 });
20907
20908                 if ( o.cookie ) {
20909                         this._cookie( null, o.cookie );
20910                 }
20911
20912                 return this;
20913         },
20914
20915         add: function( url, label, index ) {
20916                 if ( index === undefined ) {
20917                         index = this.anchors.length;
20918                 }
20919
20920                 var self = this,
20921                         o = this.options,
20922                         $li = $( o.tabTemplate.replace( /#\{href\}/g, url ).replace( /#\{label\}/g, label ) ),
20923                         id = !url.indexOf( "#" ) ? url.replace( "#", "" ) : this._tabId( $( "a", $li )[ 0 ] );
20924
20925                 $li.addClass( "ui-state-default ui-corner-top" ).data( "destroy.tabs", true );
20926
20927                 // try to find an existing element before creating a new one
20928                 var $panel = self.element.find( "#" + id );
20929                 if ( !$panel.length ) {
20930                         $panel = $( o.panelTemplate )
20931                                 .attr( "id", id )
20932                                 .data( "destroy.tabs", true );
20933                 }
20934                 $panel.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" );
20935
20936                 if ( index >= this.lis.length ) {
20937                         $li.appendTo( this.list );
20938                         $panel.appendTo( this.list[ 0 ].parentNode );
20939                 } else {
20940                         $li.insertBefore( this.lis[ index ] );
20941                         $panel.insertBefore( this.panels[ index ] );
20942                 }
20943
20944                 o.disabled = $.map( o.disabled, function( n, i ) {
20945                         return n >= index ? ++n : n;
20946                 });
20947
20948                 this._tabify();
20949
20950                 if ( this.anchors.length == 1 ) {
20951                         o.selected = 0;
20952                         $li.addClass( "ui-tabs-selected ui-state-active" );
20953                         $panel.removeClass( "ui-tabs-hide" );
20954                         this.element.queue( "tabs", function() {
20955                                 self._trigger( "show", null, self._ui( self.anchors[ 0 ], self.panels[ 0 ] ) );
20956                         });
20957
20958                         this.load( 0 );
20959                 }
20960
20961                 this._trigger( "add", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
20962                 return this;
20963         },
20964
20965         remove: function( index ) {
20966                 index = this._getIndex( index );
20967                 var o = this.options,
20968                         $li = this.lis.eq( index ).remove(),
20969                         $panel = this.panels.eq( index ).remove();
20970
20971                 // If selected tab was removed focus tab to the right or
20972                 // in case the last tab was removed the tab to the left.
20973                 if ( $li.hasClass( "ui-tabs-selected" ) && this.anchors.length > 1) {
20974                         this.select( index + ( index + 1 < this.anchors.length ? 1 : -1 ) );
20975                 }
20976
20977                 o.disabled = $.map(
20978                         $.grep( o.disabled, function(n, i) {
20979                                 return n != index;
20980                         }),
20981                         function( n, i ) {
20982                                 return n >= index ? --n : n;
20983                         });
20984
20985                 this._tabify();
20986
20987                 this._trigger( "remove", null, this._ui( $li.find( "a" )[ 0 ], $panel[ 0 ] ) );
20988                 return this;
20989         },
20990
20991         enable: function( index ) {
20992                 index = this._getIndex( index );
20993                 var o = this.options;
20994                 if ( $.inArray( index, o.disabled ) == -1 ) {
20995                         return;
20996                 }
20997
20998                 this.lis.eq( index ).removeClass( "ui-state-disabled" );
20999                 o.disabled = $.grep( o.disabled, function( n, i ) {
21000                         return n != index;
21001                 });
21002
21003                 this._trigger( "enable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
21004                 return this;
21005         },
21006
21007         disable: function( index ) {
21008                 index = this._getIndex( index );
21009                 var self = this, o = this.options;
21010                 // cannot disable already selected tab
21011                 if ( index != o.selected ) {
21012                         this.lis.eq( index ).addClass( "ui-state-disabled" );
21013
21014                         o.disabled.push( index );
21015                         o.disabled.sort();
21016
21017                         this._trigger( "disable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
21018                 }
21019
21020                 return this;
21021         },
21022
21023         select: function( index ) {
21024                 index = this._getIndex( index );
21025                 if ( index == -1 ) {
21026                         if ( this.options.collapsible && this.options.selected != -1 ) {
21027                                 index = this.options.selected;
21028                         } else {
21029                                 return this;
21030                         }
21031                 }
21032                 this.anchors.eq( index ).trigger( this.options.event + ".tabs" );
21033                 return this;
21034         },
21035
21036         load: function( index ) {
21037                 index = this._getIndex( index );
21038                 var self = this,
21039                         o = this.options,
21040                         a = this.anchors.eq( index )[ 0 ],
21041                         url = $.data( a, "load.tabs" );
21042
21043                 this.abort();
21044
21045                 // not remote or from cache
21046                 if ( !url || this.element.queue( "tabs" ).length !== 0 && $.data( a, "cache.tabs" ) ) {
21047                         this.element.dequeue( "tabs" );
21048                         return;
21049                 }
21050
21051                 // load remote from here on
21052                 this.lis.eq( index ).addClass( "ui-state-processing" );
21053
21054                 if ( o.spinner ) {
21055                         var span = $( "span", a );
21056                         span.data( "label.tabs", span.html() ).html( o.spinner );
21057                 }
21058
21059                 this.xhr = $.ajax( $.extend( {}, o.ajaxOptions, {
21060                         url: url,
21061                         success: function( r, s ) {
21062                                 self.element.find( self._sanitizeSelector( a.hash ) ).html( r );
21063
21064                                 // take care of tab labels
21065                                 self._cleanup();
21066
21067                                 if ( o.cache ) {
21068                                         $.data( a, "cache.tabs", true );
21069                                 }
21070
21071                                 self._trigger( "load", null, self._ui( self.anchors[ index ], self.panels[ index ] ) );
21072                                 try {
21073                                         o.ajaxOptions.success( r, s );
21074                                 }
21075                                 catch ( e ) {}
21076                         },
21077                         error: function( xhr, s, e ) {
21078                                 // take care of tab labels
21079                                 self._cleanup();
21080
21081                                 self._trigger( "load", null, self._ui( self.anchors[ index ], self.panels[ index ] ) );
21082                                 try {
21083                                         // Passing index avoid a race condition when this method is
21084                                         // called after the user has selected another tab.
21085                                         // Pass the anchor that initiated this request allows
21086                                         // loadError to manipulate the tab content panel via $(a.hash)
21087                                         o.ajaxOptions.error( xhr, s, index, a );
21088                                 }
21089                                 catch ( e ) {}
21090                         }
21091                 } ) );
21092
21093                 // last, so that load event is fired before show...
21094                 self.element.dequeue( "tabs" );
21095
21096                 return this;
21097         },
21098
21099         abort: function() {
21100                 // stop possibly running animations
21101                 this.element.queue( [] );
21102                 this.panels.stop( false, true );
21103
21104                 // "tabs" queue must not contain more than two elements,
21105                 // which are the callbacks for the latest clicked tab...
21106                 this.element.queue( "tabs", this.element.queue( "tabs" ).splice( -2, 2 ) );
21107
21108                 // terminate pending requests from other tabs
21109                 if ( this.xhr ) {
21110                         this.xhr.abort();
21111                         delete this.xhr;
21112                 }
21113
21114                 // take care of tab labels
21115                 this._cleanup();
21116                 return this;
21117         },
21118
21119         url: function( index, url ) {
21120                 this.anchors.eq( index ).removeData( "cache.tabs" ).data( "load.tabs", url );
21121                 return this;
21122         },
21123
21124         length: function() {
21125                 return this.anchors.length;
21126         }
21127 });
21128
21129 $.extend( $.ui.tabs, {
21130         version: "1.8.12"
21131 });
21132
21133 /*
21134  * Tabs Extensions
21135  */
21136
21137 /*
21138  * Rotate
21139  */
21140 $.extend( $.ui.tabs.prototype, {
21141         rotation: null,
21142         rotate: function( ms, continuing ) {
21143                 var self = this,
21144                         o = this.options;
21145
21146                 var rotate = self._rotate || ( self._rotate = function( e ) {
21147                         clearTimeout( self.rotation );
21148                         self.rotation = setTimeout(function() {
21149                                 var t = o.selected;
21150                                 self.select( ++t < self.anchors.length ? t : 0 );
21151                         }, ms );
21152                         
21153                         if ( e ) {
21154                                 e.stopPropagation();
21155                         }
21156                 });
21157
21158                 var stop = self._unrotate || ( self._unrotate = !continuing
21159                         ? function(e) {
21160                                 if (e.clientX) { // in case of a true click
21161                                         self.rotate(null);
21162                                 }
21163                         }
21164                         : function( e ) {
21165                                 t = o.selected;
21166                                 rotate();
21167                         });
21168
21169                 // start rotation
21170                 if ( ms ) {
21171                         this.element.bind( "tabsshow", rotate );
21172                         this.anchors.bind( o.event + ".tabs", stop );
21173                         rotate();
21174                 // stop rotation
21175                 } else {
21176                         clearTimeout( self.rotation );
21177                         this.element.unbind( "tabsshow", rotate );
21178                         this.anchors.unbind( o.event + ".tabs", stop );
21179                         delete this._rotate;
21180                         delete this._unrotate;
21181                 }
21182
21183                 return this;
21184         }
21185 });
21186
21187 })( jQuery );
21188 /*
21189  * jQuery Tooltip plugin 1.3
21190  *
21191  * http://bassistance.de/jquery-plugins/jquery-plugin-tooltip/
21192  * http://docs.jquery.com/Plugins/Tooltip
21193  *
21194  * Copyright (c) 2006 - 2008 Jörn Zaefferer
21195  *
21196  * $Id: jquery.tooltip.js 5741 2008-06-21 15:22:16Z joern.zaefferer $
21197  * 
21198  * Dual licensed under the MIT and GPL licenses:
21199  *   http://www.opensource.org/licenses/mit-license.php
21200  *   http://www.gnu.org/licenses/gpl.html
21201  */
21202  
21203 ;(function($) {
21204         
21205                 // the tooltip element
21206         var helper = {},
21207                 // the current tooltipped element
21208                 current,
21209                 // the title of the current element, used for restoring
21210                 title,
21211                 // timeout id for delayed tooltips
21212                 tID,
21213                 // IE 5.5 or 6
21214                 IE = $.browser.msie && /MSIE\s(5\.5|6\.)/.test(navigator.userAgent),
21215                 // flag for mouse tracking
21216                 track = false;
21217         
21218         $.tooltip = {
21219                 blocked: false,
21220                 defaults: {
21221                         delay: 200,
21222                         fade: false,
21223                         showURL: true,
21224                         extraClass: "",
21225                         top: 15,
21226                         left: 15,
21227                         id: "tooltip"
21228                 },
21229                 block: function() {
21230                         $.tooltip.blocked = !$.tooltip.blocked;
21231                 }
21232         };
21233         
21234         $.fn.extend({
21235                 tooltip: function(settings) {
21236                         settings = $.extend({}, $.tooltip.defaults, settings);
21237                         createHelper(settings);
21238                         return this.each(function() {
21239                                         $.data(this, "tooltip", settings);
21240                                         this.tOpacity = helper.parent.css("opacity");
21241                                         // copy tooltip into its own expando and remove the title
21242                                         this.tooltipText = this.title;
21243                                         $(this).removeAttr("title");
21244                                         // also remove alt attribute to prevent default tooltip in IE
21245                                         this.alt = "";
21246                                 })
21247                                 .mouseover(save)
21248                                 .mouseout(hide)
21249                                 .click(hide);
21250                 },
21251                 fixPNG: IE ? function() {
21252                         return this.each(function () {
21253                                 var image = $(this).css('backgroundImage');
21254                                 if (image.match(/^url\(["']?(.*\.png)["']?\)$/i)) {
21255                                         image = RegExp.$1;
21256                                         $(this).css({
21257                                                 'backgroundImage': 'none',
21258                                                 'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=crop, src='" + image + "')"
21259                                         }).each(function () {
21260                                                 var position = $(this).css('position');
21261                                                 if (position != 'absolute' && position != 'relative')
21262                                                         $(this).css('position', 'relative');
21263                                         });
21264                                 }
21265                         });
21266                 } : function() { return this; },
21267                 unfixPNG: IE ? function() {
21268                         return this.each(function () {
21269                                 $(this).css({'filter': '', backgroundImage: ''});
21270                         });
21271                 } : function() { return this; },
21272                 hideWhenEmpty: function() {
21273                         return this.each(function() {
21274                                 $(this)[ $(this).html() ? "show" : "hide" ]();
21275                         });
21276                 },
21277                 url: function() {
21278                         return this.attr('href') || this.attr('src');
21279                 }
21280         });
21281         
21282         function createHelper(settings) {
21283                 // there can be only one tooltip helper
21284                 if( helper.parent )
21285                         return;
21286                 // create the helper, h3 for title, div for url
21287                 helper.parent = $('<div id="' + settings.id + '"><h3></h3><div class="body"></div><div class="url"></div></div>')
21288                         // add to document
21289                         .appendTo(document.body)
21290                         // hide it at first
21291                         .hide();
21292                         
21293                 // apply bgiframe if available
21294                 if ( $.fn.bgiframe )
21295                         helper.parent.bgiframe();
21296                 
21297                 // save references to title and url elements
21298                 helper.title = $('h3', helper.parent);
21299                 helper.body = $('div.body', helper.parent);
21300                 helper.url = $('div.url', helper.parent);
21301         }
21302         
21303         function settings(element) {
21304                 return $.data(element, "tooltip");
21305         }
21306         
21307         // main event handler to start showing tooltips
21308         function handle(event) {
21309                 // show helper, either with timeout or on instant
21310                 if( settings(this).delay )
21311                         tID = setTimeout(show, settings(this).delay);
21312                 else
21313                         show();
21314                 
21315                 // if selected, update the helper position when the mouse moves
21316                 track = !!settings(this).track;
21317                 $(document.body).bind('mousemove', update);
21318                         
21319                 // update at least once
21320                 update(event);
21321         }
21322         
21323         // save elements title before the tooltip is displayed
21324         function save() {
21325                 // if this is the current source, or it has no title (occurs with click event), stop
21326                 if ( $.tooltip.blocked || this == current || (!this.tooltipText && !settings(this).bodyHandler) )
21327                         return;
21328
21329                 // save current
21330                 current = this;
21331                 title = this.tooltipText;
21332                 
21333                 if ( settings(this).bodyHandler ) {
21334                         helper.title.hide();
21335                         var bodyContent = settings(this).bodyHandler.call(this);
21336                         if (bodyContent.nodeType || bodyContent.jquery) {
21337                                 helper.body.empty().append(bodyContent)
21338                         } else {
21339                                 helper.body.html( bodyContent );
21340                         }
21341                         helper.body.show();
21342                 } else if ( settings(this).showBody ) {
21343                         var parts = title.split(settings(this).showBody);
21344                         helper.title.html(parts.shift()).show();
21345                         helper.body.empty();
21346                         for(var i = 0, part; (part = parts[i]); i++) {
21347                                 if(i > 0)
21348                                         helper.body.append("<br/>");
21349                                 helper.body.append(part);
21350                         }
21351                         helper.body.hideWhenEmpty();
21352                 } else {
21353                         helper.title.html(title).show();
21354                         helper.body.hide();
21355                 }
21356                 
21357                 // if element has href or src, add and show it, otherwise hide it
21358                 if( settings(this).showURL && $(this).url() )
21359                         helper.url.html( $(this).url().replace('http://', '') ).show();
21360                 else 
21361                         helper.url.hide();
21362                 
21363                 // add an optional class for this tip
21364                 helper.parent.addClass(settings(this).extraClass);
21365
21366                 // fix PNG background for IE
21367                 if (settings(this).fixPNG )
21368                         helper.parent.fixPNG();
21369                         
21370                 handle.apply(this, arguments);
21371         }
21372         
21373         // delete timeout and show helper
21374         function show() {
21375                 tID = null;
21376                 if ((!IE || !$.fn.bgiframe) && settings(current).fade) {
21377                         if (helper.parent.is(":animated"))
21378                                 helper.parent.stop().show().fadeTo(settings(current).fade, current.tOpacity);
21379                         else
21380                                 helper.parent.is(':visible') ? helper.parent.fadeTo(settings(current).fade, current.tOpacity) : helper.parent.fadeIn(settings(current).fade);
21381                 } else {
21382                         helper.parent.show();
21383                 }
21384                 update();
21385         }
21386         
21387         /**
21388          * callback for mousemove
21389          * updates the helper position
21390          * removes itself when no current element
21391          */
21392         function update(event)  {
21393                 if($.tooltip.blocked)
21394                         return;
21395                 
21396                 if (event && event.target.tagName == "OPTION") {
21397                         return;
21398                 }
21399                 
21400                 // stop updating when tracking is disabled and the tooltip is visible
21401                 if ( !track && helper.parent.is(":visible")) {
21402                         $(document.body).unbind('mousemove', update)
21403                 }
21404                 
21405                 // if no current element is available, remove this listener
21406                 if( current == null ) {
21407                         $(document.body).unbind('mousemove', update);
21408                         return; 
21409                 }
21410                 
21411                 // remove position helper classes
21412                 helper.parent.removeClass("viewport-right").removeClass("viewport-bottom");
21413                 
21414                 var left = helper.parent[0].offsetLeft;
21415                 var top = helper.parent[0].offsetTop;
21416                 if (event) {
21417                         // position the helper 15 pixel to bottom right, starting from mouse position
21418                         left = event.pageX + settings(current).left;
21419                         top = event.pageY + settings(current).top;
21420                         var right='auto';
21421                         if (settings(current).positionLeft) {
21422                                 right = $(window).width() - left;
21423                                 left = 'auto';
21424                         }
21425                         helper.parent.css({
21426                                 left: left,
21427                                 right: right,
21428                                 top: top
21429                         });
21430                 }
21431                 
21432                 var v = viewport(),
21433                         h = helper.parent[0];
21434                 // check horizontal position
21435                 if (v.x + v.cx < h.offsetLeft + h.offsetWidth) {
21436                         left -= h.offsetWidth + 20 + settings(current).left;
21437                         helper.parent.css({left: left + 'px'}).addClass("viewport-right");
21438                 }
21439                 // check vertical position
21440                 if (v.y + v.cy < h.offsetTop + h.offsetHeight) {
21441                         top -= h.offsetHeight + 20 + settings(current).top;
21442                         helper.parent.css({top: top + 'px'}).addClass("viewport-bottom");
21443                 }
21444         }
21445         
21446         function viewport() {
21447                 return {
21448                         x: $(window).scrollLeft(),
21449                         y: $(window).scrollTop(),
21450                         cx: $(window).width(),
21451                         cy: $(window).height()
21452                 };
21453         }
21454         
21455         // hide helper and restore added classes and the title
21456         function hide(event) {
21457                 if($.tooltip.blocked)
21458                         return;
21459                 // clear timeout if possible
21460                 if(tID)
21461                         clearTimeout(tID);
21462                 // no more current element
21463                 current = null;
21464                 
21465                 var tsettings = settings(this);
21466                 function complete() {
21467                         helper.parent.removeClass( tsettings.extraClass ).hide().css("opacity", "");
21468                 }
21469                 if ((!IE || !$.fn.bgiframe) && tsettings.fade) {
21470                         if (helper.parent.is(':animated'))
21471                                 helper.parent.stop().fadeTo(tsettings.fade, 0, complete);
21472                         else
21473                                 helper.parent.stop().fadeOut(tsettings.fade, complete);
21474                 } else
21475                         complete();
21476                 
21477                 if( settings(this).fixPNG )
21478                         helper.parent.unfixPNG();
21479         }
21480         
21481 })(jQuery);
21482 /*!
21483 Math.uuid.js (v1.4)
21484 http://www.broofa.com
21485 mailto:robert@broofa.com
21486
21487 Copyright (c) 2010 Robert Kieffer
21488 Dual licensed under the MIT and GPL licenses.
21489 */
21490
21491 /*
21492  * Generate a random uuid.
21493  *
21494  * USAGE: Math.uuid(length, radix)
21495  *   length - the desired number of characters
21496  *   radix  - the number of allowable values for each character.
21497  *
21498  * EXAMPLES:
21499  *   // No arguments  - returns RFC4122, version 4 ID
21500  *   >>> Math.uuid()
21501  *   "92329D39-6F5C-4520-ABFC-AAB64544E172"
21502  *
21503  *   // One argument - returns ID of the specified length
21504  *   >>> Math.uuid(15)     // 15 character ID (default base=62)
21505  *   "VcydxgltxrVZSTV"
21506  *
21507  *   // Two arguments - returns ID of the specified length, and radix. (Radix must be <= 62)
21508  *   >>> Math.uuid(8, 2)  // 8 character ID (base=2)
21509  *   "01001010"
21510  *   >>> Math.uuid(8, 10) // 8 character ID (base=10)
21511  *   "47473046"
21512  *   >>> Math.uuid(8, 16) // 8 character ID (base=16)
21513  *   "098F4D35"
21514  */
21515 (function() {
21516   // Private array of chars to use
21517   var CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
21518
21519   Math.uuid = function (len, radix) {
21520     var chars = CHARS, uuid = [], i;
21521     radix = radix || chars.length;
21522
21523     if (len) {
21524       // Compact form
21525       for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random()*radix];
21526     } else {
21527       // rfc4122, version 4 form
21528       var r;
21529
21530       // rfc4122 requires these characters
21531       uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
21532       uuid[14] = '4';
21533
21534       // Fill in random data.  At i==19 set the high bits of clock sequence as
21535       // per rfc4122, sec. 4.1.5
21536       for (i = 0; i < 36; i++) {
21537         if (!uuid[i]) {
21538           r = 0 | Math.random()*16;
21539           uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
21540         }
21541       }
21542     }
21543
21544     return uuid.join('');
21545   };
21546
21547   // A more performant, but slightly bulkier, RFC4122v4 solution.  We boost performance
21548   // by minimizing calls to random()
21549   Math.uuidFast = function() {
21550     var chars = CHARS, uuid = new Array(36), rnd=0, r;
21551     for (var i = 0; i < 36; i++) {
21552       if (i==8 || i==13 ||  i==18 || i==23) {
21553         uuid[i] = '-';
21554       } else if (i==14) {
21555         uuid[i] = '4';
21556       } else {
21557         if (rnd <= 0x02) rnd = 0x2000000 + (Math.random()*0x1000000)|0;
21558         r = rnd & 0xf;
21559         rnd = rnd >> 4;
21560         uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
21561       }
21562     }
21563     return uuid.join('');
21564   };
21565
21566   // A more compact, but less performant, RFC4122v4 solution:
21567   Math.uuidCompact = function() {
21568     return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
21569       var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
21570       return v.toString(16);
21571     });
21572   };
21573 })();
21574 // jXHR.js (JSON-P XHR)\r
21575 // v0.1 (c) Kyle Simpson\r
21576 // MIT License\r
21577 \r
21578 (function(global){\r
21579         var SETTIMEOUT = global.setTimeout, // for better compression\r
21580                 doc = global.document,\r
21581                 callback_counter = 0;\r
21582                 \r
21583         global.jXHR = function() {\r
21584                 var script_url,\r
21585                         script_loaded,\r
21586                         jsonp_callback,\r
21587                         scriptElem,\r
21588                         publicAPI = null;\r
21589                         \r
21590                 function removeScript() { try { scriptElem.parentNode.removeChild(scriptElem); } catch (err) { } }\r
21591                         \r
21592                 function reset() {\r
21593                         script_loaded = false;\r
21594                         script_url = "";\r
21595                         removeScript();\r
21596                         scriptElem = null;\r
21597                         fireReadyStateChange(0);\r
21598                 }\r
21599                 \r
21600                 function ThrowError(msg) {\r
21601                         try { publicAPI.onerror.call(publicAPI,msg,script_url); } catch (err) { throw new Error(msg); }\r
21602                 }\r
21603 \r
21604                 function handleScriptLoad() {\r
21605                         if ((this.readyState && this.readyState!=="complete" && this.readyState!=="loaded") || script_loaded) { return; }\r
21606                         this.onload = this.onreadystatechange = null; // prevent memory leak\r
21607                         script_loaded = true;\r
21608                         if (publicAPI.readyState !== 4) ThrowError("Script failed to load ["+script_url+"].");\r
21609                         removeScript();\r
21610                 }\r
21611                 \r
21612                 function fireReadyStateChange(rs,args) {\r
21613                         args = args || [];\r
21614                         publicAPI.readyState = rs;\r
21615                         if (typeof publicAPI.onreadystatechange === "function") publicAPI.onreadystatechange.apply(publicAPI,args);\r
21616                 }\r
21617                                 \r
21618                 publicAPI = {\r
21619                         onerror:null,\r
21620                         onreadystatechange:null,\r
21621                         readyState:0,\r
21622                         open:function(method,url){\r
21623                                 reset();\r
21624                                 internal_callback = "cb"+(callback_counter++);\r
21625                                 (function(icb){\r
21626                                         global.jXHR[icb] = function() {\r
21627                                                 try { fireReadyStateChange.call(publicAPI,4,arguments); } \r
21628                                                 catch(err) { \r
21629                                                         publicAPI.readyState = -1;\r
21630                                                         ThrowError("Script failed to run ["+script_url+"]."); \r
21631                                                 }\r
21632                                                 global.jXHR[icb] = null;\r
21633                                         };\r
21634                                 })(internal_callback);\r
21635                                 script_url = url.replace(/=\?/,"=jXHR."+internal_callback);\r
21636                                 fireReadyStateChange(1);\r
21637                         },\r
21638                         send:function(){\r
21639                                 SETTIMEOUT(function(){\r
21640                                         scriptElem = doc.createElement("script");\r
21641                                         scriptElem.setAttribute("type","text/javascript");\r
21642                                         scriptElem.onload = scriptElem.onreadystatechange = function(){handleScriptLoad.call(scriptElem);};\r
21643                                         scriptElem.setAttribute("src",script_url);\r
21644                                         doc.getElementsByTagName("head")[0].appendChild(scriptElem);\r
21645                                 },0);\r
21646                                 fireReadyStateChange(2);\r
21647                         },\r
21648                         setRequestHeader:function(){}, // noop\r
21649                         getResponseHeader:function(){return "";}, // basically noop\r
21650                         getAllResponseHeaders:function(){return [];} // ditto\r
21651                 };\r
21652 \r
21653                 reset();\r
21654                 \r
21655                 return publicAPI;\r
21656         };\r
21657 })(window);//////////////////////////////////////////////////////////////////////////////
21658 //                                                                          //
21659 // Wii Opera SDK - 3D Math Class v2.7.22 2008-12-14                         //
21660 // (c) 2007-2008 Daniel Gump. All Rights Reserved.                          //
21661 // http://wiioperasdk.com, http://hullbreachonline.com                      //
21662 // hullbreach@hullbreachonline.com                                          //
21663 //                                                                          //
21664 //  Wii is a trademark of Nintendo Co., Ltd.                                //
21665 //  Opera is a trademark of Opera, ASA.                                     //
21666 //  This software package is not associated with either company             //
21667 //  but was created to support users of both.  Its alternative name         //
21668 //  when supporting other products is the HULLBREACH SDK.                   //
21669 //                                                                          //
21670 //  Redistribution and use in source and binary forms, with or without      //
21671 //  modification, are permitted provided that the following conditions      //
21672 //  are met:                                                                //
21673 //    * Redistributions of source code must retain the above copyright      //
21674 //      notice, this list of conditions and the following disclaimer.       //
21675 //    * Redistributions in binary form must reproduce the above copyright   //
21676 //      notice, this list of conditions and the following disclaimer in     //
21677 //      the documentation and/or other materials provided with the          //
21678 //      distribution.                                                       //
21679 //    * Neither the names HULLBREACH ONLINE nor WII OPERA SDK nor the names //
21680 //      of its contributors may be used to endorse or promote products      //
21681 //      derived from this software without specific prior written           //
21682 //      permission.                                                         //
21683 //    * If the explicit purpose of the software is not to support the       //
21684 //      Nintendo Wii or the Opera Web browser, then the names of such must  //
21685 //      not be used in any derived product. The name shall be the           //
21686 //      HULLBREACH SDK with a reference link to http://hullbreachonline.    //
21687 //                                                                          //
21688 //  THIS SOFTWARE IS PROVIDED BY Daniel Gump ''AS IS'' AND ANY EXPRESS OR   //
21689 //  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED          //
21690 //  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE  //
21691 //  DISCLAIMED. IN NO EVENT SHALL Daniel Gump BE LIABLE FOR ANY DIRECT,     //
21692 //  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES      //
21693 //  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR      //
21694 //  SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)      //
21695 //  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,     //
21696 //  STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING   //
21697 //  IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE      //
21698 //  POSSIBILITY OF SUCH DAMAGE.                                             //
21699 //////////////////////////////////////////////////////////////////////////////
21700
21701 function ThreeD(){
21702         POLYMESH = new Array();
21703
21704         CENTERX = 400; CENTERY = 240;
21705         LIGHTX = -1000; LIGHTY = -1000; LIGHTZ = -1000;
21706         ORIGINX = 0; ORIGINY = 0; ORIGINZ = 0;
21707         ANGLEX = 0; ANGLEY = 0; ANGLEZ = 0;
21708 }
21709
21710 ThreeD.prototype.setPoints = function(Points){
21711         POLYMESH = [];
21712         for(var value=Points.length;--value>=0;) POLYMESH[value] = Points[value].slice();
21713 }
21714 ThreeD.prototype.loadMesh = function(array){
21715         if(POLYMESH = array.split(";")) for(i=POLYMESH.length;--i>=0;) POLYMESH[i] = POLYMESH[i].split(",");
21716 }
21717 ThreeD.prototype.getPoints = function(){ return POLYMESH; }
21718
21719 ThreeD.prototype.setCenter = function(x,y){ CENTERX = x|0; CENTERY = y|0; }
21720 ThreeD.prototype.setLight = function(x,y,z){ LIGHTX = x|0; LIGHTY = y|0; LIGHTZ = z|0; }
21721
21722 ThreeD.prototype.explode = function(z){
21723         var x1, y1, z1, x2, y2, z2;
21724         var normali, normalj, normalk, magNormal;
21725
21726         for(var value=POLYMESH.length;--value>=0;){
21727                 x1 = POLYMESH[value][3]-POLYMESH[value][0]; y1 = POLYMESH[value][4]-POLYMESH[value][1]; z1 = POLYMESH[value][5]-POLYMESH[value][2]; 
21728                 x2 = POLYMESH[value][6]-POLYMESH[value][0]; y2 = POLYMESH[value][7]-POLYMESH[value][1]; z2 = POLYMESH[value][8]-POLYMESH[value][2]; 
21729
21730                 normali = y2*z1-y1*z2; normalj = x1*z2-x2*z1; normalk = x2*y1-x1*y2;
21731                 magNormal = z/Math.sqrt(normali*normali+normalj*normalj+normalk*normalk);
21732
21733                 var movex = -normali*magNormal|0;
21734                 var movey = -normalj*magNormal|0;
21735                 var movez = -normalk*magNormal|0;
21736
21737                 POLYMESH[value][0] += movex; POLYMESH[value][1] += movey; POLYMESH[value][2] += movez;
21738                 POLYMESH[value][3] += movex; POLYMESH[value][4] += movey; POLYMESH[value][5] += movez;
21739                 POLYMESH[value][6] += movex; POLYMESH[value][7] += movey; POLYMESH[value][8] += movez;
21740         }
21741 }
21742 ThreeD.prototype.normalMap = function(normalMap){
21743         var x1, y1, z1, x2, y2, z2;
21744         var normali, normalj, normalk, magNormal;
21745
21746         for(var value=POLYMESH.length;--value>=0;){
21747                 x1 = POLYMESH[value][3]-POLYMESH[value][0]; y1 = POLYMESH[value][4]-POLYMESH[value][1]; z1 = POLYMESH[value][5]-POLYMESH[value][2]; 
21748                 x2 = POLYMESH[value][6]-POLYMESH[value][0]; y2 = POLYMESH[value][7]-POLYMESH[value][1]; z2 = POLYMESH[value][8]-POLYMESH[value][2]; 
21749
21750                 normali = y2*z1-y1*z2; normalj = x1*z2-x2*z1; normalk = x2*y1-x1*y2;
21751                 normal = 1/Math.sqrt(normali*normali+normalj*normalj+normalk*normalk);
21752                 
21753                 for(index2=0; index2<4; index2++){
21754                         for(index=0; index<=index2; index++){
21755                                 magNormal = normalMap[index][index2]*normal|0;
21756
21757                                 var movex = -normali*magNormal;
21758                                 var movey = -normalj*magNormal;
21759                                 var movez = -normalk*magNormal;
21760                                 
21761                                 POLYMESH[POLYMESH.length] = new Array(POLYMESH[value][0]+movex,POLYMESH[value][1]+movey,POLYMESH[value][2]+movez,
21762                                                         POLYMESH[value][3]+movex,POLYMESH[value][4]+movey,POLYMESH[value][7]+movez,
21763                                                         POLYMESH[value][6]+movex,POLYMESH[value][7]+movey,POLYMESH[value][8]+movez,
21764                                                         POLYMESH[value][9],POLYMESH[value][10],POLYMESH[value][11],
21765                                                         POLYMESH[value][12],POLYMESH[value][13], true, index, index2);
21766                         }
21767                 }
21768         }
21769 }
21770 ThreeD.prototype.move = function(x,y,z){
21771         for(var value=POLYMESH.length;--value>=0;)
21772                 for(var point=-1;++point<3;){
21773                         POLYMESH[value][point*3+2] += z;
21774                         POLYMESH[value][point*3+1] += y;
21775                         POLYMESH[value][point*3] += x;
21776                 }
21777 }
21778 ThreeD.prototype.rotate = function(anglex,angley,anglez){
21779         var cosx = Math.cos(anglex*0.01745329); var sinx = Math.sin(anglex*0.01745329);
21780         var cosy = Math.cos(angley*0.01745329); var siny = Math.sin(angley*0.01745329);
21781         var cosz = Math.cos(anglez*0.01745329); var sinz = Math.sin(anglez*0.01745329);
21782
21783         for(var value=POLYMESH.length;--value>=0;)
21784                 for(var point=-1;++point<3;){
21785                         var tempz = sinx*POLYMESH[value][point*3+1]+cosx*POLYMESH[value][point*3+2];
21786                         var tempy = cosx*POLYMESH[value][point*3+1]-sinx*POLYMESH[value][point*3+2];
21787                         var tempx = cosy*POLYMESH[value][point*3]+siny*tempz;
21788                         POLYMESH[value][point*3+2] = cosy*tempz-siny*POLYMESH[value][point*3];
21789                         POLYMESH[value][point*3+1] = sinz*tempx+cosz*tempy;
21790                         POLYMESH[value][point*3] = cosz*tempx-sinz*tempy;
21791                 }
21792 }
21793 ThreeD.prototype.scale = function(scalex,scaley,scalez){
21794         for(var value=POLYMESH.length;--value>=0;)
21795                 for(var point=-1;++point<3;){
21796                         POLYMESH[value][point*3+2] *= scalex;
21797                         POLYMESH[value][point*3+1] *= scaley;
21798                         POLYMESH[value][point*3] *= scalez;
21799                 }
21800 }
21801
21802 ThreeD.prototype.backface = function(){
21803         for(var value=POLYMESH.length, newvalue=0, TempPOLYMESH = [];--value>=0;)
21804                 if((POLYMESH[value][3]-POLYMESH[value][0])*(POLYMESH[value][7]-POLYMESH[value][1])-(POLYMESH[value][6]-POLYMESH[value][0])*(POLYMESH[value][4]-POLYMESH[value][1])>0){
21805                         TempPOLYMESH[newvalue++] = POLYMESH[value].slice();
21806                 }
21807         POLYMESH = TempPOLYMESH;
21808 }
21809 ThreeD.prototype.zSort = function(){ POLYMESH.sort(function(b,a){return b[2]+b[5]+b[8]-a[2]-a[5]-a[8]}); }
21810
21811 ThreeD.prototype.fade = function(bright){
21812         for(var value=POLYMESH.length;--value>=0;) POLYMESH[value][13] += bright;
21813 }
21814 ThreeD.prototype.shade = function(){
21815         var x1, y1, z1, x2, y2, z2;
21816         var normali, normalj, normalk, magNormal;
21817         var lighti, lightj, lightk, magLight;
21818
21819         for(var value=POLYMESH.length;--value>=0;){
21820                 x1 = POLYMESH[value][3]-POLYMESH[value][0]; y1 = POLYMESH[value][4]-POLYMESH[value][1]; z1 = POLYMESH[value][5]-POLYMESH[value][2]; 
21821                 x2 = POLYMESH[value][6]-POLYMESH[value][0]; y2 = POLYMESH[value][7]-POLYMESH[value][1]; z2 = POLYMESH[value][8]-POLYMESH[value][2]; 
21822
21823                 normali = y1*z2-y2*z1; normalj = x2*z1-x1*z2; normalk = x1*y2-x2*y1;
21824
21825                 lighti = LIGHTX-(POLYMESH[value][0]+POLYMESH[value][3]+POLYMESH[value][6])*0.33333333333333333;
21826                 lightj = LIGHTY-(POLYMESH[value][1]+POLYMESH[value][4]+POLYMESH[value][7])*0.33333333333333333;
21827                 lightk = LIGHTZ-(POLYMESH[value][2]+POLYMESH[value][5]+POLYMESH[value][8])*0.33333333333333333;
21828
21829                 POLYMESH[value][13] = 2*(normali*lighti + normalj*lightj + normalk*lightk)/Math.sqrt((normali*normali+normalj*normalj+normalk*normalk)*(lighti*lighti+lightj*lightj+lightk*lightk))-1;
21830         }
21831 }
21832 ThreeD.prototype.reColor = function(r,g,b){
21833         r=r>255?255:(r<0?0:r|0);
21834         g=g>255?255:(g<0?0:g|0);
21835         b=b>255?255:(b<0?0:b|0);
21836         for(var value=POLYMESH.length;--value>=0;){
21837                 POLYMESH[value][9]=r;
21838                 POLYMESH[value][10]=g;
21839                 POLYMESH[value][11]=b;
21840         }
21841 }
21842 ThreeD.prototype.shadow = function(){
21843         rayorigins = []; 
21844         raynormals = [];
21845         edge1 = [];
21846         edge2 = [];
21847
21848         for(var value=0, normali, normalj, normalk, magNormal;value<POLYMESH.length;value++){
21849                 edge1[value] = new Array(POLYMESH[value][3]-POLYMESH[value][0], POLYMESH[value][4]-POLYMESH[value][1], POLYMESH[value][5]-POLYMESH[value][2]);
21850                 edge2[value] = new Array(POLYMESH[value][6]-POLYMESH[value][0], POLYMESH[value][7]-POLYMESH[value][1], POLYMESH[value][8]-POLYMESH[value][2]);
21851
21852                 rayorigins[value] = new Array((POLYMESH[value][0]+POLYMESH[value][3]+POLYMESH[value][6])*0.33333333333333333, (POLYMESH[value][1]+POLYMESH[value][4]+POLYMESH[value][7])*0.33333333333333333, (POLYMESH[value][2]+POLYMESH[value][5]+POLYMESH[value][8])*0.33333333333333333);
21853
21854                 normali = LIGHTX-rayorigins[value][0];
21855                 normalj = LIGHTY-rayorigins[value][1];
21856                 normalk = LIGHTZ-rayorigins[value][2];
21857                 magNormal = 1/Math.sqrt(normali*normali+normalj*normalj+normalk*normalk);
21858                 raynormals[value] = new Array(normali*magNormal, normalj*magNormal, normalk*magNormal);
21859         }
21860
21861         for(var value=POLYMESH.length;--value>=0;){
21862                 for(var value2=POLYMESH.length;--value2>=0;){
21863                         if(value2!=value){
21864                                 var pvecti = raynormals[value][1]*edge2[value2][2]-edge2[value2][1]*raynormals[value][2];
21865                                 var pvectj = edge2[value2][0]*raynormals[value][2]-raynormals[value][0]*edge2[value2][2];
21866                                 var pvectk = raynormals[value][0]*edge2[value2][1]-edge2[value2][0]*raynormals[value][1];
21867
21868                                 if((det = edge1[value2][0]*pvecti+edge1[value2][1]*pvectj+edge1[value2][2]*pvectk)<0){
21869                                         det=1/det;
21870
21871                                         var tvecti = rayorigins[value][0]-POLYMESH[value2][0];
21872                                         var tvectj = rayorigins[value][1]-POLYMESH[value2][1];
21873                                         var tvectk = rayorigins[value][2]-POLYMESH[value2][2];
21874
21875                                         if((u = (pvecti*tvecti+pvectj*tvectj+pvectk*tvectk) * det)>=0 && u<=1){
21876                                                 if((v = (raynormals[value][0]*(tvectj*edge1[value2][2]-edge1[value2][1]*tvectk)+raynormals[value][1]*(edge1[value2][0]*tvectk-tvecti*edge1[value2][2])+raynormals[value][2]*(tvecti*edge1[value2][1]-edge1[value2][0]*tvectj)) * det)>=0 && u+v<=1){
21877                                                         POLYMESH[value][13] -=.5;
21878                                                         break;
21879                                                 }
21880                                         }
21881                                 }
21882                                 
21883                         }
21884                 }
21885         }
21886 }
21887
21888 ThreeD.prototype.getTranslation = function(){
21889         for(var value=POLYMESH.length,newvalue=0,TransPOLYMESH = [];--value>=0;){
21890                 var POLYMESH2=5000/(5000-POLYMESH[value][2]), POLYMESH5=5000/(5000-POLYMESH[value][5]), POLYMESH8=5000/(5000-POLYMESH[value][8]);
21891                 TransPOLYMESH[newvalue++] = new Array((CENTERX+POLYMESH[value][0]*POLYMESH2),(CENTERY+POLYMESH[value][1]*POLYMESH2),
21892                                                                         (CENTERX+POLYMESH[value][3]*POLYMESH5),(CENTERY+POLYMESH[value][4]*POLYMESH5),
21893                                                                         (CENTERX+POLYMESH[value][6]*POLYMESH8),(CENTERY+POLYMESH[value][7]*POLYMESH8),
21894                                                                         POLYMESH[value][9]|0,POLYMESH[value][10]|0,POLYMESH[value][11]|0,POLYMESH[value][12]|0,POLYMESH[value][13]);
21895         }
21896         return TransPOLYMESH;
21897 }
21898
21899 ThreeDee = new ThreeD();/**
21900  * @author mrdoob / http://mrdoob.com/
21901  */
21902
21903 var THREE = THREE || { REVISION: '51' };
21904
21905 if ( self.console === undefined ) {
21906
21907     self.console = {
21908
21909         info: function () {},
21910         log: function () {},
21911         debug: function () {},
21912         warn: function () {},
21913         error: function () {}
21914
21915     };
21916
21917 }
21918
21919 if ( self.Int32Array === undefined ) {
21920
21921     self.Int32Array = Array;
21922     self.Float32Array = Array;
21923
21924 }
21925
21926 // Shims for "startsWith", "endsWith", and "trim" for browsers where this is not yet implemented
21927 // not sure we should have this, or at least not have it here
21928
21929 // http://stackoverflow.com/questions/646628/javascript-startswith
21930 // http://stackoverflow.com/questions/498970/how-do-i-trim-a-string-in-javascript
21931 // http://wiki.ecmascript.org/doku.php?id=harmony%3astring_extras
21932
21933 if ( String.prototype.startsWith === undefined ) {
21934
21935     String.prototype.startsWith = function ( str ) {
21936
21937         return this.slice( 0, str.length ) === str;
21938
21939     };
21940
21941 }
21942
21943 if ( String.prototype.endsWith === undefined ) {
21944
21945     String.prototype.endsWith = function ( str ) {
21946
21947         var t = String( str );
21948         var index = this.lastIndexOf( t );
21949         return index >= 0 && index === this.length - t.length;
21950
21951     };
21952
21953 }
21954
21955 if ( ! String.prototype.trim === undefined ) {
21956
21957     String.prototype.trim = function () {
21958
21959         return this.replace( /^\s+|\s+$/g, '' );
21960
21961     };
21962
21963 }
21964
21965 // http://paulirish.com/2011/requestanimationframe-for-smart-animating/
21966 // http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating
21967
21968 // requestAnimationFrame polyfill by Erik Möller
21969 // fixes from Paul Irish and Tino Zijdel
21970
21971 ( function () {
21972
21973     var lastTime = 0;
21974     var vendors = [ 'ms', 'moz', 'webkit', 'o' ];
21975
21976     for ( var x = 0; x < vendors.length && !window.requestAnimationFrame; ++ x ) {
21977
21978         window.requestAnimationFrame = window[ vendors[ x ] + 'RequestAnimationFrame' ];
21979         window.cancelAnimationFrame = window[ vendors[ x ] + 'CancelAnimationFrame' ] || window[ vendors[ x ] + 'CancelRequestAnimationFrame' ];
21980
21981     }
21982
21983     if ( window.requestAnimationFrame === undefined ) {
21984
21985         window.requestAnimationFrame = function ( callback, element ) {
21986
21987             var currTime = Date.now(), timeToCall = Math.max( 0, 16 - ( currTime - lastTime ) );
21988             var id = window.setTimeout( function() { callback( currTime + timeToCall ); }, timeToCall );
21989             lastTime = currTime + timeToCall;
21990             return id;
21991
21992         };
21993
21994     }
21995
21996
21997     if ( window.cancelAnimationFrame === undefined ) {
21998
21999         window.cancelAnimationFrame = function ( id ) { clearTimeout( id ); };
22000
22001     }
22002
22003 }() );
22004
22005
22006 // MATERIAL CONSTANTS
22007
22008 // side
22009
22010 THREE.FrontSide = 0;
22011 THREE.BackSide = 1;
22012 THREE.DoubleSide = 2;
22013
22014 // shading
22015
22016 THREE.NoShading = 0;
22017 THREE.FlatShading = 1;
22018 THREE.SmoothShading = 2;
22019
22020 // colors
22021
22022 THREE.NoColors = 0;
22023 THREE.FaceColors = 1;
22024 THREE.VertexColors = 2;
22025
22026 // blending modes
22027
22028 THREE.NoBlending = 0;
22029 THREE.NormalBlending = 1;
22030 THREE.AdditiveBlending = 2;
22031 THREE.SubtractiveBlending = 3;
22032 THREE.MultiplyBlending = 4;
22033 THREE.CustomBlending = 5;
22034
22035 // custom blending equations
22036 // (numbers start from 100 not to clash with other
22037 //  mappings to OpenGL constants defined in Texture.js)
22038
22039 THREE.AddEquation = 100;
22040 THREE.SubtractEquation = 101;
22041 THREE.ReverseSubtractEquation = 102;
22042
22043 // custom blending destination factors
22044
22045 THREE.ZeroFactor = 200;
22046 THREE.OneFactor = 201;
22047 THREE.SrcColorFactor = 202;
22048 THREE.OneMinusSrcColorFactor = 203;
22049 THREE.SrcAlphaFactor = 204;
22050 THREE.OneMinusSrcAlphaFactor = 205;
22051 THREE.DstAlphaFactor = 206;
22052 THREE.OneMinusDstAlphaFactor = 207;
22053
22054 // custom blending source factors
22055
22056 //THREE.ZeroFactor = 200;
22057 //THREE.OneFactor = 201;
22058 //THREE.SrcAlphaFactor = 204;
22059 //THREE.OneMinusSrcAlphaFactor = 205;
22060 //THREE.DstAlphaFactor = 206;
22061 //THREE.OneMinusDstAlphaFactor = 207;
22062 THREE.DstColorFactor = 208;
22063 THREE.OneMinusDstColorFactor = 209;
22064 THREE.SrcAlphaSaturateFactor = 210;
22065
22066
22067 // TEXTURE CONSTANTS
22068
22069 THREE.MultiplyOperation = 0;
22070 THREE.MixOperation = 1;
22071
22072 // Mapping modes
22073
22074 THREE.UVMapping = function () {};
22075
22076 THREE.CubeReflectionMapping = function () {};
22077 THREE.CubeRefractionMapping = function () {};
22078
22079 THREE.SphericalReflectionMapping = function () {};
22080 THREE.SphericalRefractionMapping = function () {};
22081
22082 // Wrapping modes
22083
22084 THREE.RepeatWrapping = 1000;
22085 THREE.ClampToEdgeWrapping = 1001;
22086 THREE.MirroredRepeatWrapping = 1002;
22087
22088 // Filters
22089
22090 THREE.NearestFilter = 1003;
22091 THREE.NearestMipMapNearestFilter = 1004;
22092 THREE.NearestMipMapLinearFilter = 1005;
22093 THREE.LinearFilter = 1006;
22094 THREE.LinearMipMapNearestFilter = 1007;
22095 THREE.LinearMipMapLinearFilter = 1008;
22096
22097 // Data types
22098
22099 THREE.UnsignedByteType = 1009;
22100 THREE.ByteType = 1010;
22101 THREE.ShortType = 1011;
22102 THREE.UnsignedShortType = 1012;
22103 THREE.IntType = 1013;
22104 THREE.UnsignedIntType = 1014;
22105 THREE.FloatType = 1015;
22106
22107 // Pixel types
22108
22109 //THREE.UnsignedByteType = 1009;
22110 THREE.UnsignedShort4444Type = 1016;
22111 THREE.UnsignedShort5551Type = 1017;
22112 THREE.UnsignedShort565Type = 1018;
22113
22114 // Pixel formats
22115
22116 THREE.AlphaFormat = 1019;
22117 THREE.RGBFormat = 1020;
22118 THREE.RGBAFormat = 1021;
22119 THREE.LuminanceFormat = 1022;
22120 THREE.LuminanceAlphaFormat = 1023;
22121
22122 // Compressed texture formats
22123
22124 THREE.RGB_S3TC_DXT1_Format = 2001;
22125 THREE.RGBA_S3TC_DXT1_Format = 2002;
22126 THREE.RGBA_S3TC_DXT3_Format = 2003;
22127 THREE.RGBA_S3TC_DXT5_Format = 2004;
22128
22129 /*
22130 // Potential future PVRTC compressed texture formats
22131 THREE.RGB_PVRTC_4BPPV1_Format = 2100;
22132 THREE.RGB_PVRTC_2BPPV1_Format = 2101;
22133 THREE.RGBA_PVRTC_4BPPV1_Format = 2102;
22134 THREE.RGBA_PVRTC_2BPPV1_Format = 2103;
22135 */
22136 /**
22137  * @author alteredq / http://alteredqualia.com/
22138  */
22139
22140 THREE.Clock = function ( autoStart ) {
22141
22142     this.autoStart = ( autoStart !== undefined ) ? autoStart : true;
22143
22144     this.startTime = 0;
22145     this.oldTime = 0;
22146     this.elapsedTime = 0;
22147
22148     this.running = false;
22149
22150 };
22151
22152 THREE.Clock.prototype.start = function () {
22153
22154     this.startTime = Date.now();
22155     this.oldTime = this.startTime;
22156
22157     this.running = true;
22158
22159 };
22160
22161 THREE.Clock.prototype.stop = function () {
22162
22163     this.getElapsedTime();
22164
22165     this.running = false;
22166
22167 };
22168
22169 THREE.Clock.prototype.getElapsedTime = function () {
22170
22171     this.elapsedTime += this.getDelta();
22172
22173     return this.elapsedTime;
22174
22175 };
22176
22177
22178 THREE.Clock.prototype.getDelta = function () {
22179
22180     var diff = 0;
22181
22182     if ( this.autoStart && ! this.running ) {
22183
22184         this.start();
22185
22186     }
22187
22188     if ( this.running ) {
22189
22190         var newTime = Date.now();
22191         diff = 0.001 * ( newTime - this.oldTime );
22192         this.oldTime = newTime;
22193
22194         this.elapsedTime += diff;
22195
22196     }
22197
22198     return diff;
22199
22200 };/**
22201  * @author mrdoob / http://mrdoob.com/
22202  */
22203
22204 THREE.Color = function ( hex ) {
22205
22206     if ( hex !== undefined ) this.setHex( hex );
22207
22208     return this;
22209
22210 };
22211
22212 THREE.Color.prototype = {
22213
22214     constructor: THREE.Color,
22215
22216     r: 1, g: 1, b: 1,
22217
22218     copy: function ( color ) {
22219
22220         this.r = color.r;
22221         this.g = color.g;
22222         this.b = color.b;
22223
22224         return this;
22225
22226     },
22227
22228     copyGammaToLinear: function ( color ) {
22229
22230         this.r = color.r * color.r;
22231         this.g = color.g * color.g;
22232         this.b = color.b * color.b;
22233
22234         return this;
22235
22236     },
22237
22238     copyLinearToGamma: function ( color ) {
22239
22240         this.r = Math.sqrt( color.r );
22241         this.g = Math.sqrt( color.g );
22242         this.b = Math.sqrt( color.b );
22243
22244         return this;
22245
22246     },
22247
22248     convertGammaToLinear: function () {
22249
22250         var r = this.r, g = this.g, b = this.b;
22251
22252         this.r = r * r;
22253         this.g = g * g;
22254         this.b = b * b;
22255
22256         return this;
22257
22258     },
22259
22260     convertLinearToGamma: function () {
22261
22262         this.r = Math.sqrt( this.r );
22263         this.g = Math.sqrt( this.g );
22264         this.b = Math.sqrt( this.b );
22265
22266         return this;
22267
22268     },
22269
22270     setRGB: function ( r, g, b ) {
22271
22272         this.r = r;
22273         this.g = g;
22274         this.b = b;
22275
22276         return this;
22277
22278     },
22279
22280     setHSV: function ( h, s, v ) {
22281
22282         // based on MochiKit implementation by Bob Ippolito
22283         // h,s,v ranges are < 0.0 - 1.0 >
22284
22285         var i, f, p, q, t;
22286
22287         if ( v === 0 ) {
22288
22289             this.r = this.g = this.b = 0;
22290
22291         } else {
22292
22293             i = Math.floor( h * 6 );
22294             f = ( h * 6 ) - i;
22295             p = v * ( 1 - s );
22296             q = v * ( 1 - ( s * f ) );
22297             t = v * ( 1 - ( s * ( 1 - f ) ) );
22298
22299             if ( i === 0 ) {
22300
22301                 this.r = v;
22302                 this.g = t;
22303                 this.b = p;
22304
22305             } else if ( i === 1 ) {
22306
22307                 this.r = q;
22308                 this.g = v;
22309                 this.b = p;
22310
22311             } else if ( i === 2 ) {
22312
22313                 this.r = p;
22314                 this.g = v;
22315                 this.b = t;
22316
22317             } else if ( i === 3 ) {
22318
22319                 this.r = p;
22320                 this.g = q;
22321                 this.b = v;
22322
22323             } else if ( i === 4 ) {
22324
22325                 this.r = t;
22326                 this.g = p;
22327                 this.b = v;
22328
22329             } else if ( i === 5 ) {
22330
22331                 this.r = v;
22332                 this.g = p;
22333                 this.b = q;
22334
22335             }
22336
22337         }
22338
22339         return this;
22340
22341     },
22342
22343     setHex: function ( hex ) {
22344
22345         hex = Math.floor( hex );
22346
22347         this.r = ( hex >> 16 & 255 ) / 255;
22348         this.g = ( hex >> 8 & 255 ) / 255;
22349         this.b = ( hex & 255 ) / 255;
22350
22351         return this;
22352
22353     },
22354
22355     lerpSelf: function ( color, alpha ) {
22356
22357         this.r += ( color.r - this.r ) * alpha;
22358         this.g += ( color.g - this.g ) * alpha;
22359         this.b += ( color.b - this.b ) * alpha;
22360
22361         return this;
22362
22363     },
22364
22365     getHex: function () {
22366
22367         return ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0;
22368
22369     },
22370
22371     getContextStyle: function () {
22372
22373         return 'rgb(' + ( ( this.r * 255 ) | 0 )  + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')';
22374
22375     },
22376
22377     clone: function () {
22378
22379         return new THREE.Color().setRGB( this.r, this.g, this.b );
22380
22381     }
22382
22383 };
22384 /**
22385  * @author mrdoob / http://mrdoob.com/
22386  * @author philogb / http://blog.thejit.org/
22387  * @author egraether / http://egraether.com/
22388  * @author zz85 / http://www.lab4games.net/zz85/blog
22389  */
22390
22391 THREE.Vector2 = function ( x, y ) {
22392
22393     this.x = x || 0;
22394     this.y = y || 0;
22395
22396 };
22397
22398 THREE.Vector2.prototype = {
22399
22400     constructor: THREE.Vector2,
22401
22402     set: function ( x, y ) {
22403
22404         this.x = x;
22405         this.y = y;
22406
22407         return this;
22408
22409     },
22410
22411     copy: function ( v ) {
22412
22413         this.x = v.x;
22414         this.y = v.y;
22415
22416         return this;
22417
22418     },
22419
22420     add: function ( a, b ) {
22421
22422         this.x = a.x + b.x;
22423         this.y = a.y + b.y;
22424
22425         return this;
22426
22427     },
22428
22429     addSelf: function ( v ) {
22430
22431         this.x += v.x;
22432         this.y += v.y;
22433
22434         return this;
22435
22436     },
22437
22438     sub: function ( a, b ) {
22439
22440         this.x = a.x - b.x;
22441         this.y = a.y - b.y;
22442
22443         return this;
22444
22445     },
22446
22447     subSelf: function ( v ) {
22448
22449         this.x -= v.x;
22450         this.y -= v.y;
22451
22452         return this;
22453
22454     },
22455
22456     multiplyScalar: function ( s ) {
22457
22458         this.x *= s;
22459         this.y *= s;
22460
22461         return this;
22462
22463     },
22464
22465     divideScalar: function ( s ) {
22466
22467         if ( s ) {
22468
22469             this.x /= s;
22470             this.y /= s;
22471
22472         } else {
22473
22474             this.set( 0, 0 );
22475
22476         }
22477
22478         return this;
22479
22480     },
22481
22482     negate: function() {
22483
22484         return this.multiplyScalar( - 1 );
22485
22486     },
22487
22488     dot: function ( v ) {
22489
22490         return this.x * v.x + this.y * v.y;
22491
22492     },
22493
22494     lengthSq: function () {
22495
22496         return this.x * this.x + this.y * this.y;
22497
22498     },
22499
22500     length: function () {
22501
22502         return Math.sqrt( this.lengthSq() );
22503
22504     },
22505
22506     normalize: function () {
22507
22508         return this.divideScalar( this.length() );
22509
22510     },
22511
22512     distanceTo: function ( v ) {
22513
22514         return Math.sqrt( this.distanceToSquared( v ) );
22515
22516     },
22517
22518     distanceToSquared: function ( v ) {
22519
22520         var dx = this.x - v.x, dy = this.y - v.y;
22521         return dx * dx + dy * dy;
22522
22523     },
22524
22525     setLength: function ( l ) {
22526
22527         return this.normalize().multiplyScalar( l );
22528
22529     },
22530
22531     lerpSelf: function ( v, alpha ) {
22532
22533         this.x += ( v.x - this.x ) * alpha;
22534         this.y += ( v.y - this.y ) * alpha;
22535
22536         return this;
22537
22538     },
22539
22540     equals: function( v ) {
22541
22542         return ( ( v.x === this.x ) && ( v.y === this.y ) );
22543
22544     },
22545
22546     isZero: function () {
22547
22548         return ( this.lengthSq() < 0.0001 /* almostZero */ );
22549
22550     },
22551
22552     clone: function () {
22553
22554         return new THREE.Vector2( this.x, this.y );
22555
22556     }
22557
22558 };
22559 /**
22560  * @author mrdoob / http://mrdoob.com/
22561  * @author kile / http://kile.stravaganza.org/
22562  * @author philogb / http://blog.thejit.org/
22563  * @author mikael emtinger / http://gomo.se/
22564  * @author egraether / http://egraether.com/
22565  * @author WestLangley / http://github.com/WestLangley
22566  */
22567
22568 THREE.Vector3 = function ( x, y, z ) {
22569
22570     this.x = x || 0;
22571     this.y = y || 0;
22572     this.z = z || 0;
22573
22574 };
22575
22576
22577 THREE.Vector3.prototype = {
22578
22579     constructor: THREE.Vector3,
22580
22581     set: function ( x, y, z ) {
22582
22583         this.x = x;
22584         this.y = y;
22585         this.z = z;
22586
22587         return this;
22588
22589     },
22590
22591     setX: function ( x ) {
22592
22593         this.x = x;
22594
22595         return this;
22596
22597     },
22598
22599     setY: function ( y ) {
22600
22601         this.y = y;
22602
22603         return this;
22604
22605     },
22606
22607     setZ: function ( z ) {
22608
22609         this.z = z;
22610
22611         return this;
22612
22613     },
22614
22615     copy: function ( v ) {
22616
22617         this.x = v.x;
22618         this.y = v.y;
22619         this.z = v.z;
22620
22621         return this;
22622
22623     },
22624
22625     add: function ( a, b ) {
22626
22627         this.x = a.x + b.x;
22628         this.y = a.y + b.y;
22629         this.z = a.z + b.z;
22630
22631         return this;
22632
22633     },
22634
22635     addSelf: function ( v ) {
22636
22637         this.x += v.x;
22638         this.y += v.y;
22639         this.z += v.z;
22640
22641         return this;
22642
22643     },
22644
22645     addScalar: function ( s ) {
22646
22647         this.x += s;
22648         this.y += s;
22649         this.z += s;
22650
22651         return this;
22652
22653     },
22654
22655     sub: function ( a, b ) {
22656
22657         this.x = a.x - b.x;
22658         this.y = a.y - b.y;
22659         this.z = a.z - b.z;
22660
22661         return this;
22662
22663     },
22664
22665     subSelf: function ( v ) {
22666
22667         this.x -= v.x;
22668         this.y -= v.y;
22669         this.z -= v.z;
22670
22671         return this;
22672
22673     },
22674
22675     multiply: function ( a, b ) {
22676
22677         this.x = a.x * b.x;
22678         this.y = a.y * b.y;
22679         this.z = a.z * b.z;
22680
22681         return this;
22682
22683     },
22684
22685     multiplySelf: function ( v ) {
22686
22687         this.x *= v.x;
22688         this.y *= v.y;
22689         this.z *= v.z;
22690
22691         return this;
22692
22693     },
22694
22695     multiplyScalar: function ( s ) {
22696
22697         this.x *= s;
22698         this.y *= s;
22699         this.z *= s;
22700
22701         return this;
22702
22703     },
22704
22705     divideSelf: function ( v ) {
22706
22707         this.x /= v.x;
22708         this.y /= v.y;
22709         this.z /= v.z;
22710
22711         return this;
22712
22713     },
22714
22715     divideScalar: function ( s ) {
22716
22717         if ( s ) {
22718
22719             this.x /= s;
22720             this.y /= s;
22721             this.z /= s;
22722
22723         } else {
22724
22725             this.x = 0;
22726             this.y = 0;
22727             this.z = 0;
22728
22729         }
22730
22731         return this;
22732
22733     },
22734
22735
22736     negate: function() {
22737
22738         return this.multiplyScalar( - 1 );
22739
22740     },
22741
22742     dot: function ( v ) {
22743
22744         return this.x * v.x + this.y * v.y + this.z * v.z;
22745
22746     },
22747
22748     lengthSq: function () {
22749
22750         return this.x * this.x + this.y * this.y + this.z * this.z;
22751
22752     },
22753
22754     length: function () {
22755
22756         return Math.sqrt( this.lengthSq() );
22757
22758     },
22759
22760     lengthManhattan: function () {
22761
22762         return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );
22763
22764     },
22765
22766     normalize: function () {
22767
22768         return this.divideScalar( this.length() );
22769
22770     },
22771
22772     setLength: function ( l ) {
22773
22774         return this.normalize().multiplyScalar( l );
22775
22776     },
22777
22778     lerpSelf: function ( v, alpha ) {
22779
22780         this.x += ( v.x - this.x ) * alpha;
22781         this.y += ( v.y - this.y ) * alpha;
22782         this.z += ( v.z - this.z ) * alpha;
22783
22784         return this;
22785
22786     },
22787
22788     cross: function ( a, b ) {
22789
22790         this.x = a.y * b.z - a.z * b.y;
22791         this.y = a.z * b.x - a.x * b.z;
22792         this.z = a.x * b.y - a.y * b.x;
22793
22794         return this;
22795
22796     },
22797
22798     crossSelf: function ( v ) {
22799
22800         var x = this.x, y = this.y, z = this.z;
22801
22802         this.x = y * v.z - z * v.y;
22803         this.y = z * v.x - x * v.z;
22804         this.z = x * v.y - y * v.x;
22805
22806         return this;
22807
22808     },
22809
22810     distanceTo: function ( v ) {
22811
22812         return Math.sqrt( this.distanceToSquared( v ) );
22813
22814     },
22815
22816     distanceToSquared: function ( v ) {
22817
22818         return new THREE.Vector3().sub( this, v ).lengthSq();
22819
22820     },
22821
22822     getPositionFromMatrix: function ( m ) {
22823
22824         this.x = m.elements[12];
22825         this.y = m.elements[13];
22826         this.z = m.elements[14];
22827
22828         return this;
22829
22830     },
22831
22832     setEulerFromRotationMatrix: function ( m, order ) {
22833
22834         // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
22835
22836         // clamp, to handle numerical problems
22837
22838         function clamp( x ) {
22839
22840             return Math.min( Math.max( x, -1 ), 1 );
22841
22842         }
22843
22844         var te = m.elements;
22845         var m11 = te[0], m12 = te[4], m13 = te[8];
22846         var m21 = te[1], m22 = te[5], m23 = te[9];
22847         var m31 = te[2], m32 = te[6], m33 = te[10];
22848
22849         if ( order === undefined || order === 'XYZ' ) {
22850
22851             this.y = Math.asin( clamp( m13 ) );
22852
22853             if ( Math.abs( m13 ) < 0.99999 ) {
22854
22855                 this.x = Math.atan2( - m23, m33 );
22856                 this.z = Math.atan2( - m12, m11 );
22857
22858             } else {
22859
22860                 this.x = Math.atan2( m32, m22 );
22861                 this.z = 0;
22862
22863             }
22864
22865         } else if ( order === 'YXZ' ) {
22866
22867             this.x = Math.asin( - clamp( m23 ) );
22868
22869             if ( Math.abs( m23 ) < 0.99999 ) {
22870
22871                 this.y = Math.atan2( m13, m33 );
22872                 this.z = Math.atan2( m21, m22 );
22873
22874             } else {
22875
22876                 this.y = Math.atan2( - m31, m11 );
22877                 this.z = 0;
22878
22879             }
22880
22881         } else if ( order === 'ZXY' ) {
22882
22883             this.x = Math.asin( clamp( m32 ) );
22884
22885             if ( Math.abs( m32 ) < 0.99999 ) {
22886
22887                 this.y = Math.atan2( - m31, m33 );
22888                 this.z = Math.atan2( - m12, m22 );
22889
22890             } else {
22891
22892                 this.y = 0;
22893                 this.z = Math.atan2( m21, m11 );
22894
22895             }
22896
22897         } else if ( order === 'ZYX' ) {
22898
22899             this.y = Math.asin( - clamp( m31 ) );
22900
22901             if ( Math.abs( m31 ) < 0.99999 ) {
22902
22903                 this.x = Math.atan2( m32, m33 );
22904                 this.z = Math.atan2( m21, m11 );
22905
22906             } else {
22907
22908                 this.x = 0;
22909                 this.z = Math.atan2( - m12, m22 );
22910
22911             }
22912
22913         } else if ( order === 'YZX' ) {
22914
22915             this.z = Math.asin( clamp( m21 ) );
22916
22917             if ( Math.abs( m21 ) < 0.99999 ) {
22918
22919                 this.x = Math.atan2( - m23, m22 );
22920                 this.y = Math.atan2( - m31, m11 );
22921
22922             } else {
22923
22924                 this.x = 0;
22925                 this.y = Math.atan2( m13, m33 );
22926
22927             }
22928
22929         } else if ( order === 'XZY' ) {
22930
22931             this.z = Math.asin( - clamp( m12 ) );
22932
22933             if ( Math.abs( m12 ) < 0.99999 ) {
22934
22935                 this.x = Math.atan2( m32, m22 );
22936                 this.y = Math.atan2( m13, m11 );
22937
22938             } else {
22939
22940                 this.x = Math.atan2( - m23, m33 );
22941                 this.y = 0;
22942
22943             }
22944
22945         }
22946
22947         return this;
22948
22949     },
22950
22951     setEulerFromQuaternion: function ( q, order ) {
22952
22953         // q is assumed to be normalized
22954
22955         // clamp, to handle numerical problems
22956
22957         function clamp( x ) {
22958
22959             return Math.min( Math.max( x, -1 ), 1 );
22960
22961         }
22962
22963         // http://www.mathworks.com/matlabcentral/fileexchange/20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/content/SpinCalc.m
22964
22965         var sqx = q.x * q.x;
22966         var sqy = q.y * q.y;
22967         var sqz = q.z * q.z;
22968         var sqw = q.w * q.w;
22969
22970         if ( order === undefined || order === 'XYZ' ) {
22971
22972             this.x = Math.atan2( 2 * ( q.x * q.w - q.y * q.z ), ( sqw - sqx - sqy + sqz ) );
22973             this.y = Math.asin(  clamp( 2 * ( q.x * q.z + q.y * q.w ) ) );
22974             this.z = Math.atan2( 2 * ( q.z * q.w - q.x * q.y ), ( sqw + sqx - sqy - sqz ) );
22975
22976         } else if ( order ===  'YXZ' ) {
22977
22978             this.x = Math.asin(  clamp( 2 * ( q.x * q.w - q.y * q.z ) ) );
22979             this.y = Math.atan2( 2 * ( q.x * q.z + q.y * q.w ), ( sqw - sqx - sqy + sqz ) );
22980             this.z = Math.atan2( 2 * ( q.x * q.y + q.z * q.w ), ( sqw - sqx + sqy - sqz ) );
22981
22982         } else if ( order === 'ZXY' ) {
22983
22984             this.x = Math.asin(  clamp( 2 * ( q.x * q.w + q.y * q.z ) ) );
22985             this.y = Math.atan2( 2 * ( q.y * q.w - q.z * q.x ), ( sqw - sqx - sqy + sqz ) );
22986             this.z = Math.atan2( 2 * ( q.z * q.w - q.x * q.y ), ( sqw - sqx + sqy - sqz ) );
22987
22988         } else if ( order === 'ZYX' ) {
22989
22990             this.x = Math.atan2( 2 * ( q.x * q.w + q.z * q.y ), ( sqw - sqx - sqy + sqz ) );
22991             this.y = Math.asin(  clamp( 2 * ( q.y * q.w - q.x * q.z ) ) );
22992             this.z = Math.atan2( 2 * ( q.x * q.y + q.z * q.w ), ( sqw + sqx - sqy - sqz ) );
22993
22994         } else if ( order === 'YZX' ) {
22995
22996             this.x = Math.atan2( 2 * ( q.x * q.w - q.z * q.y ), ( sqw - sqx + sqy - sqz ) );
22997             this.y = Math.atan2( 2 * ( q.y * q.w - q.x * q.z ), ( sqw + sqx - sqy - sqz ) );
22998             this.z = Math.asin(  clamp( 2 * ( q.x * q.y + q.z * q.w ) ) );
22999
23000         } else if ( order === 'XZY' ) {
23001
23002             this.x = Math.atan2( 2 * ( q.x * q.w + q.y * q.z ), ( sqw - sqx + sqy - sqz ) );
23003             this.y = Math.atan2( 2 * ( q.x * q.z + q.y * q.w ), ( sqw + sqx - sqy - sqz ) );
23004             this.z = Math.asin(  clamp( 2 * ( q.z * q.w - q.x * q.y ) ) );
23005
23006         }
23007
23008         return this;
23009
23010     },
23011
23012     getScaleFromMatrix: function ( m ) {
23013
23014         var sx = this.set( m.elements[0], m.elements[1], m.elements[2] ).length();
23015         var sy = this.set( m.elements[4], m.elements[5], m.elements[6] ).length();
23016         var sz = this.set( m.elements[8], m.elements[9], m.elements[10] ).length();
23017
23018         this.x = sx;
23019         this.y = sy;
23020         this.z = sz;
23021
23022         return this;
23023     },
23024
23025     equals: function ( v ) {
23026
23027         return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );
23028
23029     },
23030
23031     isZero: function () {
23032
23033         return ( this.lengthSq() < 0.0001 /* almostZero */ );
23034
23035     },
23036
23037     clone: function () {
23038
23039         return new THREE.Vector3( this.x, this.y, this.z );
23040
23041     }
23042
23043 };
23044
23045 /**
23046  * @author supereggbert / http://www.paulbrunt.co.uk/
23047  * @author philogb / http://blog.thejit.org/
23048  * @author mikael emtinger / http://gomo.se/
23049  * @author egraether / http://egraether.com/
23050  * @author WestLangley / http://github.com/WestLangley
23051  */
23052
23053 THREE.Vector4 = function ( x, y, z, w ) {
23054
23055     this.x = x || 0;
23056     this.y = y || 0;
23057     this.z = z || 0;
23058     this.w = ( w !== undefined ) ? w : 1;
23059
23060 };
23061
23062 THREE.Vector4.prototype = {
23063
23064     constructor: THREE.Vector4,
23065
23066     set: function ( x, y, z, w ) {
23067
23068         this.x = x;
23069         this.y = y;
23070         this.z = z;
23071         this.w = w;
23072
23073         return this;
23074
23075     },
23076
23077     copy: function ( v ) {
23078
23079         this.x = v.x;
23080         this.y = v.y;
23081         this.z = v.z;
23082         this.w = ( v.w !== undefined ) ? v.w : 1;
23083
23084         return this;
23085
23086     },
23087
23088     add: function ( a, b ) {
23089
23090         this.x = a.x + b.x;
23091         this.y = a.y + b.y;
23092         this.z = a.z + b.z;
23093         this.w = a.w + b.w;
23094
23095         return this;
23096
23097     },
23098
23099     addSelf: function ( v ) {
23100
23101         this.x += v.x;
23102         this.y += v.y;
23103         this.z += v.z;
23104         this.w += v.w;
23105
23106         return this;
23107
23108     },
23109
23110     sub: function ( a, b ) {
23111
23112         this.x = a.x - b.x;
23113         this.y = a.y - b.y;
23114         this.z = a.z - b.z;
23115         this.w = a.w - b.w;
23116
23117         return this;
23118
23119     },
23120
23121     subSelf: function ( v ) {
23122
23123         this.x -= v.x;
23124         this.y -= v.y;
23125         this.z -= v.z;
23126         this.w -= v.w;
23127
23128         return this;
23129
23130     },
23131
23132     multiplyScalar: function ( s ) {
23133
23134         this.x *= s;
23135         this.y *= s;
23136         this.z *= s;
23137         this.w *= s;
23138
23139         return this;
23140
23141     },
23142
23143     divideScalar: function ( s ) {
23144
23145         if ( s ) {
23146
23147             this.x /= s;
23148             this.y /= s;
23149             this.z /= s;
23150             this.w /= s;
23151
23152         } else {
23153
23154             this.x = 0;
23155             this.y = 0;
23156             this.z = 0;
23157             this.w = 1;
23158
23159         }
23160
23161         return this;
23162
23163     },
23164
23165
23166     negate: function() {
23167
23168         return this.multiplyScalar( -1 );
23169
23170     },
23171
23172     dot: function ( v ) {
23173
23174         return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;
23175
23176     },
23177
23178     lengthSq: function () {
23179
23180         return this.dot( this );
23181
23182     },
23183
23184     length: function () {
23185
23186         return Math.sqrt( this.lengthSq() );
23187
23188     },
23189
23190     lengthManhattan: function () {
23191
23192         return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );
23193
23194     },
23195
23196     normalize: function () {
23197
23198         return this.divideScalar( this.length() );
23199
23200     },
23201
23202     setLength: function ( l ) {
23203
23204         return this.normalize().multiplyScalar( l );
23205
23206     },
23207
23208     lerpSelf: function ( v, alpha ) {
23209
23210         this.x += ( v.x - this.x ) * alpha;
23211         this.y += ( v.y - this.y ) * alpha;
23212         this.z += ( v.z - this.z ) * alpha;
23213         this.w += ( v.w - this.w ) * alpha;
23214
23215         return this;
23216
23217     },
23218
23219     clone: function () {
23220
23221         return new THREE.Vector4( this.x, this.y, this.z, this.w );
23222
23223     },
23224
23225     setAxisAngleFromQuaternion: function ( q ) {
23226
23227         // http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm
23228
23229         // q is assumed to be normalized
23230
23231         this.w = 2 * Math.acos( q.w );
23232
23233         var s = Math.sqrt( 1 - q.w * q.w );
23234
23235         if ( s < 0.0001 ) {
23236
23237              this.x = 1;
23238              this.y = 0;
23239              this.z = 0;
23240
23241         } else {
23242
23243              this.x = q.x / s;
23244              this.y = q.y / s;
23245              this.z = q.z / s;
23246
23247         }
23248
23249         return this;
23250
23251     },
23252
23253     setAxisAngleFromRotationMatrix: function ( m ) {
23254
23255         // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm
23256
23257         // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
23258
23259         var angle, x, y, z,        // variables for result
23260             epsilon = 0.01,        // margin to allow for rounding errors
23261             epsilon2 = 0.1,        // margin to distinguish between 0 and 180 degrees
23262
23263             te = m.elements,
23264
23265             m11 = te[0], m12 = te[4], m13 = te[8],
23266             m21 = te[1], m22 = te[5], m23 = te[9],
23267             m31 = te[2], m32 = te[6], m33 = te[10];
23268
23269         if ( ( Math.abs( m12 - m21 ) < epsilon )
23270           && ( Math.abs( m13 - m31 ) < epsilon )
23271           && ( Math.abs( m23 - m32 ) < epsilon ) ) {
23272
23273             // singularity found
23274             // first check for identity matrix which must have +1 for all terms
23275             // in leading diagonal and zero in other terms
23276
23277             if ( ( Math.abs( m12 + m21 ) < epsilon2 )
23278               && ( Math.abs( m13 + m31 ) < epsilon2 )
23279               && ( Math.abs( m23 + m32 ) < epsilon2 )
23280               && ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {
23281
23282                 // this singularity is identity matrix so angle = 0
23283
23284                 this.set( 1, 0, 0, 0 );
23285
23286                 return this; // zero angle, arbitrary axis
23287
23288             }
23289
23290             // otherwise this singularity is angle = 180
23291
23292             angle = Math.PI;
23293
23294             var xx = ( m11 + 1 ) / 2;
23295             var yy = ( m22 + 1 ) / 2;
23296             var zz = ( m33 + 1 ) / 2;
23297             var xy = ( m12 + m21 ) / 4;
23298             var xz = ( m13 + m31 ) / 4;
23299             var yz = ( m23 + m32 ) / 4;
23300
23301             if ( ( xx > yy ) && ( xx > zz ) ) { // m11 is the largest diagonal term
23302
23303                 if ( xx < epsilon ) {
23304
23305                     x = 0;
23306                     y = 0.707106781;
23307                     z = 0.707106781;
23308
23309                 } else {
23310
23311                     x = Math.sqrt( xx );
23312                     y = xy / x;
23313                     z = xz / x;
23314
23315                 }
23316
23317             } else if ( yy > zz ) { // m22 is the largest diagonal term
23318
23319                 if ( yy < epsilon ) {
23320
23321                     x = 0.707106781;
23322                     y = 0;
23323                     z = 0.707106781;
23324
23325                 } else {
23326
23327                     y = Math.sqrt( yy );
23328                     x = xy / y;
23329                     z = yz / y;
23330
23331                 }
23332
23333             } else { // m33 is the largest diagonal term so base result on this
23334
23335                 if ( zz < epsilon ) {
23336
23337                     x = 0.707106781;
23338                     y = 0.707106781;
23339                     z = 0;
23340
23341                 } else {
23342
23343                     z = Math.sqrt( zz );
23344                     x = xz / z;
23345                     y = yz / z;
23346
23347                 }
23348
23349             }
23350
23351             this.set( x, y, z, angle );
23352
23353             return this; // return 180 deg rotation
23354
23355         }
23356
23357         // as we have reached here there are no singularities so we can handle normally
23358
23359         var s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 )
23360                          + ( m13 - m31 ) * ( m13 - m31 )
23361                          + ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize
23362
23363         if ( Math.abs( s ) < 0.001 ) s = 1;
23364
23365         // prevent divide by zero, should not happen if matrix is orthogonal and should be
23366         // caught by singularity test above, but I've left it in just in case
23367
23368         this.x = ( m32 - m23 ) / s;
23369         this.y = ( m13 - m31 ) / s;
23370         this.z = ( m21 - m12 ) / s;
23371         this.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );
23372
23373         return this;
23374
23375     }
23376
23377 };
23378 /**
23379  * @author alteredq / http://alteredqualia.com/
23380  */
23381
23382 THREE.Matrix3 = function () {
23383
23384     this.elements = new Float32Array(9);
23385
23386 };
23387
23388 THREE.Matrix3.prototype = {
23389
23390     constructor: THREE.Matrix3,
23391
23392     getInverse: function ( matrix ) {
23393
23394         // input: THREE.Matrix4
23395         // ( based on http://code.google.com/p/webgl-mjs/ )
23396
23397         var me = matrix.elements;
23398
23399         var a11 =   me[10] * me[5] - me[6] * me[9];
23400         var a21 = - me[10] * me[1] + me[2] * me[9];
23401         var a31 =   me[6] * me[1] - me[2] * me[5];
23402         var a12 = - me[10] * me[4] + me[6] * me[8];
23403         var a22 =   me[10] * me[0] - me[2] * me[8];
23404         var a32 = - me[6] * me[0] + me[2] * me[4];
23405         var a13 =   me[9] * me[4] - me[5] * me[8];
23406         var a23 = - me[9] * me[0] + me[1] * me[8];
23407         var a33 =   me[5] * me[0] - me[1] * me[4];
23408
23409         var det = me[0] * a11 + me[1] * a12 + me[2] * a13;
23410
23411         // no inverse
23412
23413         if ( det === 0 ) {
23414
23415             console.warn( "Matrix3.getInverse(): determinant == 0" );
23416
23417         }
23418
23419         var idet = 1.0 / det;
23420
23421         var m = this.elements;
23422
23423         m[ 0 ] = idet * a11; m[ 1 ] = idet * a21; m[ 2 ] = idet * a31;
23424         m[ 3 ] = idet * a12; m[ 4 ] = idet * a22; m[ 5 ] = idet * a32;
23425         m[ 6 ] = idet * a13; m[ 7 ] = idet * a23; m[ 8 ] = idet * a33;
23426
23427         return this;
23428
23429     },
23430
23431
23432     transpose: function () {
23433
23434         var tmp, m = this.elements;
23435
23436         tmp = m[1]; m[1] = m[3]; m[3] = tmp;
23437         tmp = m[2]; m[2] = m[6]; m[6] = tmp;
23438         tmp = m[5]; m[5] = m[7]; m[7] = tmp;
23439
23440         return this;
23441
23442     },
23443
23444
23445     transposeIntoArray: function ( r ) {
23446
23447         var m = this.m;
23448
23449         r[ 0 ] = m[ 0 ];
23450         r[ 1 ] = m[ 3 ];
23451         r[ 2 ] = m[ 6 ];
23452         r[ 3 ] = m[ 1 ];
23453         r[ 4 ] = m[ 4 ];
23454         r[ 5 ] = m[ 7 ];
23455         r[ 6 ] = m[ 2 ];
23456         r[ 7 ] = m[ 5 ];
23457         r[ 8 ] = m[ 8 ];
23458
23459         return this;
23460
23461     }
23462
23463 };
23464 /**
23465  * @author mrdoob / http://mrdoob.com/
23466  * @author supereggbert / http://www.paulbrunt.co.uk/
23467  * @author philogb / http://blog.thejit.org/
23468  * @author jordi_ros / http://plattsoft.com
23469  * @author D1plo1d / http://github.com/D1plo1d
23470  * @author alteredq / http://alteredqualia.com/
23471  * @author mikael emtinger / http://gomo.se/
23472  * @author timknip / http://www.floorplanner.com/
23473  */
23474
23475
23476 THREE.Matrix4 = function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {
23477
23478     this.elements = new Float32Array( 16 );
23479
23480     this.set(
23481
23482         ( n11 !== undefined ) ? n11 : 1, n12 || 0, n13 || 0, n14 || 0,
23483         n21 || 0, ( n22 !== undefined ) ? n22 : 1, n23 || 0, n24 || 0,
23484         n31 || 0, n32 || 0, ( n33 !== undefined ) ? n33 : 1, n34 || 0,
23485         n41 || 0, n42 || 0, n43 || 0, ( n44 !== undefined ) ? n44 : 1
23486
23487     );
23488
23489 };
23490
23491 THREE.Matrix4.prototype = {
23492
23493     constructor: THREE.Matrix4,
23494
23495     set: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {
23496
23497         var te = this.elements;
23498
23499         te[0] = n11; te[4] = n12; te[8] = n13; te[12] = n14;
23500         te[1] = n21; te[5] = n22; te[9] = n23; te[13] = n24;
23501         te[2] = n31; te[6] = n32; te[10] = n33; te[14] = n34;
23502         te[3] = n41; te[7] = n42; te[11] = n43; te[15] = n44;
23503
23504         return this;
23505
23506     },
23507
23508     identity: function () {
23509
23510         this.set(
23511
23512             1, 0, 0, 0,
23513             0, 1, 0, 0,
23514             0, 0, 1, 0,
23515             0, 0, 0, 1
23516
23517         );
23518
23519         return this;
23520
23521     },
23522
23523     copy: function ( m ) {
23524
23525         var me = m.elements;
23526
23527         this.set(
23528
23529             me[0], me[4], me[8], me[12],
23530             me[1], me[5], me[9], me[13],
23531             me[2], me[6], me[10], me[14],
23532             me[3], me[7], me[11], me[15]
23533
23534         );
23535
23536         return this;
23537
23538     },
23539
23540     lookAt: function ( eye, target, up ) {
23541
23542         var te = this.elements;
23543
23544         var x = THREE.Matrix4.__v1;
23545         var y = THREE.Matrix4.__v2;
23546         var z = THREE.Matrix4.__v3;
23547
23548         z.sub( eye, target ).normalize();
23549
23550         if ( z.length() === 0 ) {
23551
23552             z.z = 1;
23553
23554         }
23555
23556         x.cross( up, z ).normalize();
23557
23558         if ( x.length() === 0 ) {
23559
23560             z.x += 0.0001;
23561             x.cross( up, z ).normalize();
23562
23563         }
23564
23565         y.cross( z, x );
23566
23567
23568         te[0] = x.x; te[4] = y.x; te[8] = z.x;
23569         te[1] = x.y; te[5] = y.y; te[9] = z.y;
23570         te[2] = x.z; te[6] = y.z; te[10] = z.z;
23571
23572         return this;
23573
23574     },
23575
23576     multiply: function ( a, b ) {
23577
23578         var ae = a.elements;
23579         var be = b.elements;
23580         var te = this.elements;
23581
23582         var a11 = ae[0], a12 = ae[4], a13 = ae[8], a14 = ae[12];
23583         var a21 = ae[1], a22 = ae[5], a23 = ae[9], a24 = ae[13];
23584         var a31 = ae[2], a32 = ae[6], a33 = ae[10], a34 = ae[14];
23585         var a41 = ae[3], a42 = ae[7], a43 = ae[11], a44 = ae[15];
23586
23587         var b11 = be[0], b12 = be[4], b13 = be[8], b14 = be[12];
23588         var b21 = be[1], b22 = be[5], b23 = be[9], b24 = be[13];
23589         var b31 = be[2], b32 = be[6], b33 = be[10], b34 = be[14];
23590         var b41 = be[3], b42 = be[7], b43 = be[11], b44 = be[15];
23591
23592         te[0] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;
23593         te[4] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;
23594         te[8] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;
23595         te[12] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;
23596
23597         te[1] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;
23598         te[5] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;
23599         te[9] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;
23600         te[13] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;
23601
23602         te[2] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;
23603         te[6] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;
23604         te[10] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;
23605         te[14] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;
23606
23607         te[3] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;
23608         te[7] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;
23609         te[11] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;
23610         te[15] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;
23611
23612         return this;
23613
23614     },
23615
23616     multiplySelf: function ( m ) {
23617
23618         return this.multiply( this, m );
23619
23620     },
23621
23622     multiplyToArray: function ( a, b, r ) {
23623
23624         var te = this.elements;
23625
23626         this.multiply( a, b );
23627
23628         r[ 0 ] = te[0]; r[ 1 ] = te[1]; r[ 2 ] = te[2]; r[ 3 ] = te[3];
23629         r[ 4 ] = te[4]; r[ 5 ] = te[5]; r[ 6 ] = te[6]; r[ 7 ] = te[7];
23630         r[ 8 ]  = te[8]; r[ 9 ]  = te[9]; r[ 10 ] = te[10]; r[ 11 ] = te[11];
23631         r[ 12 ] = te[12]; r[ 13 ] = te[13]; r[ 14 ] = te[14]; r[ 15 ] = te[15];
23632
23633         return this;
23634
23635     },
23636
23637     multiplyScalar: function ( s ) {
23638
23639         var te = this.elements;
23640
23641         te[0] *= s; te[4] *= s; te[8] *= s; te[12] *= s;
23642         te[1] *= s; te[5] *= s; te[9] *= s; te[13] *= s;
23643         te[2] *= s; te[6] *= s; te[10] *= s; te[14] *= s;
23644         te[3] *= s; te[7] *= s; te[11] *= s; te[15] *= s;
23645
23646         return this;
23647
23648     },
23649
23650     multiplyVector3: function ( v ) {
23651
23652         var te = this.elements;
23653
23654         var vx = v.x, vy = v.y, vz = v.z;
23655         var d = 1 / ( te[3] * vx + te[7] * vy + te[11] * vz + te[15] );
23656
23657         v.x = ( te[0] * vx + te[4] * vy + te[8] * vz + te[12] ) * d;
23658         v.y = ( te[1] * vx + te[5] * vy + te[9] * vz + te[13] ) * d;
23659         v.z = ( te[2] * vx + te[6] * vy + te[10] * vz + te[14] ) * d;
23660
23661         return v;
23662
23663     },
23664
23665     multiplyVector4: function ( v ) {
23666
23667         var te = this.elements;
23668         var vx = v.x, vy = v.y, vz = v.z, vw = v.w;
23669
23670         v.x = te[0] * vx + te[4] * vy + te[8] * vz + te[12] * vw;
23671         v.y = te[1] * vx + te[5] * vy + te[9] * vz + te[13] * vw;
23672         v.z = te[2] * vx + te[6] * vy + te[10] * vz + te[14] * vw;
23673         v.w = te[3] * vx + te[7] * vy + te[11] * vz + te[15] * vw;
23674
23675         return v;
23676
23677     },
23678
23679     multiplyVector3Array: function ( a ) {
23680
23681         var tmp = THREE.Matrix4.__v1;
23682
23683         for ( var i = 0, il = a.length; i < il; i += 3 ) {
23684
23685             tmp.x = a[ i ];
23686             tmp.y = a[ i + 1 ];
23687             tmp.z = a[ i + 2 ];
23688
23689             this.multiplyVector3( tmp );
23690
23691             a[ i ]     = tmp.x;
23692             a[ i + 1 ] = tmp.y;
23693             a[ i + 2 ] = tmp.z;
23694
23695         }
23696
23697         return a;
23698
23699     },
23700
23701     rotateAxis: function ( v ) {
23702
23703         var te = this.elements;
23704         var vx = v.x, vy = v.y, vz = v.z;
23705
23706         v.x = vx * te[0] + vy * te[4] + vz * te[8];
23707         v.y = vx * te[1] + vy * te[5] + vz * te[9];
23708         v.z = vx * te[2] + vy * te[6] + vz * te[10];
23709
23710         v.normalize();
23711
23712         return v;
23713
23714     },
23715
23716     crossVector: function ( a ) {
23717
23718         var te = this.elements;
23719         var v = new THREE.Vector4();
23720
23721         v.x = te[0] * a.x + te[4] * a.y + te[8] * a.z + te[12] * a.w;
23722         v.y = te[1] * a.x + te[5] * a.y + te[9] * a.z + te[13] * a.w;
23723         v.z = te[2] * a.x + te[6] * a.y + te[10] * a.z + te[14] * a.w;
23724
23725         v.w = ( a.w ) ? te[3] * a.x + te[7] * a.y + te[11] * a.z + te[15] * a.w : 1;
23726
23727         return v;
23728
23729     },
23730
23731     determinant: function () {
23732
23733         var te = this.elements;
23734
23735         var n11 = te[0], n12 = te[4], n13 = te[8], n14 = te[12];
23736         var n21 = te[1], n22 = te[5], n23 = te[9], n24 = te[13];
23737         var n31 = te[2], n32 = te[6], n33 = te[10], n34 = te[14];
23738         var n41 = te[3], n42 = te[7], n43 = te[11], n44 = te[15];
23739
23740         //TODO: make this more efficient
23741         //( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )
23742
23743         return (
23744             n14 * n23 * n32 * n41-
23745             n13 * n24 * n32 * n41-
23746             n14 * n22 * n33 * n41+
23747             n12 * n24 * n33 * n41+
23748
23749             n13 * n22 * n34 * n41-
23750             n12 * n23 * n34 * n41-
23751             n14 * n23 * n31 * n42+
23752             n13 * n24 * n31 * n42+
23753
23754             n14 * n21 * n33 * n42-
23755             n11 * n24 * n33 * n42-
23756             n13 * n21 * n34 * n42+
23757             n11 * n23 * n34 * n42+
23758
23759             n14 * n22 * n31 * n43-
23760             n12 * n24 * n31 * n43-
23761             n14 * n21 * n32 * n43+
23762             n11 * n24 * n32 * n43+
23763
23764             n12 * n21 * n34 * n43-
23765             n11 * n22 * n34 * n43-
23766             n13 * n22 * n31 * n44+
23767             n12 * n23 * n31 * n44+
23768
23769             n13 * n21 * n32 * n44-
23770             n11 * n23 * n32 * n44-
23771             n12 * n21 * n33 * n44+
23772             n11 * n22 * n33 * n44
23773         );
23774
23775     },
23776
23777     transpose: function () {
23778
23779         var te = this.elements;
23780         var tmp;
23781
23782         tmp = te[1]; te[1] = te[4]; te[4] = tmp;
23783         tmp = te[2]; te[2] = te[8]; te[8] = tmp;
23784         tmp = te[6]; te[6] = te[9]; te[9] = tmp;
23785
23786         tmp = te[3]; te[3] = te[12]; te[12] = tmp;
23787         tmp = te[7]; te[7] = te[13]; te[13] = tmp;
23788         tmp = te[11]; te[11] = te[14]; te[14] = tmp;
23789
23790         return this;
23791
23792     },
23793
23794     flattenToArray: function ( flat ) {
23795
23796         var te = this.elements;
23797         flat[ 0 ] = te[0]; flat[ 1 ] = te[1]; flat[ 2 ] = te[2]; flat[ 3 ] = te[3];
23798         flat[ 4 ] = te[4]; flat[ 5 ] = te[5]; flat[ 6 ] = te[6]; flat[ 7 ] = te[7];
23799         flat[ 8 ]  = te[8]; flat[ 9 ]  = te[9]; flat[ 10 ] = te[10]; flat[ 11 ] = te[11];
23800         flat[ 12 ] = te[12]; flat[ 13 ] = te[13]; flat[ 14 ] = te[14]; flat[ 15 ] = te[15];
23801
23802         return flat;
23803
23804     },
23805
23806     flattenToArrayOffset: function( flat, offset ) {
23807
23808         var te = this.elements;
23809         flat[ offset ] = te[0];
23810         flat[ offset + 1 ] = te[1];
23811         flat[ offset + 2 ] = te[2];
23812         flat[ offset + 3 ] = te[3];
23813
23814         flat[ offset + 4 ] = te[4];
23815         flat[ offset + 5 ] = te[5];
23816         flat[ offset + 6 ] = te[6];
23817         flat[ offset + 7 ] = te[7];
23818
23819         flat[ offset + 8 ]  = te[8];
23820         flat[ offset + 9 ]  = te[9];
23821         flat[ offset + 10 ] = te[10];
23822         flat[ offset + 11 ] = te[11];
23823
23824         flat[ offset + 12 ] = te[12];
23825         flat[ offset + 13 ] = te[13];
23826         flat[ offset + 14 ] = te[14];
23827         flat[ offset + 15 ] = te[15];
23828
23829         return flat;
23830
23831     },
23832
23833     getPosition: function () {
23834
23835         var te = this.elements;
23836         return THREE.Matrix4.__v1.set( te[12], te[13], te[14] );
23837
23838     },
23839
23840     setPosition: function ( v ) {
23841
23842         var te = this.elements;
23843
23844         te[12] = v.x;
23845         te[13] = v.y;
23846         te[14] = v.z;
23847
23848         return this;
23849
23850     },
23851
23852     getColumnX: function () {
23853
23854         var te = this.elements;
23855         return THREE.Matrix4.__v1.set( te[0], te[1], te[2] );
23856
23857     },
23858
23859     getColumnY: function () {
23860
23861         var te = this.elements;
23862         return THREE.Matrix4.__v1.set( te[4], te[5], te[6] );
23863
23864     },
23865
23866     getColumnZ: function() {
23867
23868         var te = this.elements;
23869         return THREE.Matrix4.__v1.set( te[8], te[9], te[10] );
23870
23871     },
23872
23873     getInverse: function ( m ) {
23874
23875         // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm
23876         var te = this.elements;
23877         var me = m.elements;
23878
23879         var n11 = me[0], n12 = me[4], n13 = me[8], n14 = me[12];
23880         var n21 = me[1], n22 = me[5], n23 = me[9], n24 = me[13];
23881         var n31 = me[2], n32 = me[6], n33 = me[10], n34 = me[14];
23882         var n41 = me[3], n42 = me[7], n43 = me[11], n44 = me[15];
23883
23884         te[0] = n23*n34*n42 - n24*n33*n42 + n24*n32*n43 - n22*n34*n43 - n23*n32*n44 + n22*n33*n44;
23885         te[4] = n14*n33*n42 - n13*n34*n42 - n14*n32*n43 + n12*n34*n43 + n13*n32*n44 - n12*n33*n44;
23886         te[8] = n13*n24*n42 - n14*n23*n42 + n14*n22*n43 - n12*n24*n43 - n13*n22*n44 + n12*n23*n44;
23887         te[12] = n14*n23*n32 - n13*n24*n32 - n14*n22*n33 + n12*n24*n33 + n13*n22*n34 - n12*n23*n34;
23888         te[1] = n24*n33*n41 - n23*n34*n41 - n24*n31*n43 + n21*n34*n43 + n23*n31*n44 - n21*n33*n44;
23889         te[5] = n13*n34*n41 - n14*n33*n41 + n14*n31*n43 - n11*n34*n43 - n13*n31*n44 + n11*n33*n44;
23890         te[9] = n14*n23*n41 - n13*n24*n41 - n14*n21*n43 + n11*n24*n43 + n13*n21*n44 - n11*n23*n44;
23891         te[13] = n13*n24*n31 - n14*n23*n31 + n14*n21*n33 - n11*n24*n33 - n13*n21*n34 + n11*n23*n34;
23892         te[2] = n22*n34*n41 - n24*n32*n41 + n24*n31*n42 - n21*n34*n42 - n22*n31*n44 + n21*n32*n44;
23893         te[6] = n14*n32*n41 - n12*n34*n41 - n14*n31*n42 + n11*n34*n42 + n12*n31*n44 - n11*n32*n44;
23894         te[10] = n12*n24*n41 - n14*n22*n41 + n14*n21*n42 - n11*n24*n42 - n12*n21*n44 + n11*n22*n44;
23895         te[14] = n14*n22*n31 - n12*n24*n31 - n14*n21*n32 + n11*n24*n32 + n12*n21*n34 - n11*n22*n34;
23896         te[3] = n23*n32*n41 - n22*n33*n41 - n23*n31*n42 + n21*n33*n42 + n22*n31*n43 - n21*n32*n43;
23897         te[7] = n12*n33*n41 - n13*n32*n41 + n13*n31*n42 - n11*n33*n42 - n12*n31*n43 + n11*n32*n43;
23898         te[11] = n13*n22*n41 - n12*n23*n41 - n13*n21*n42 + n11*n23*n42 + n12*n21*n43 - n11*n22*n43;
23899         te[15] = n12*n23*n31 - n13*n22*n31 + n13*n21*n32 - n11*n23*n32 - n12*n21*n33 + n11*n22*n33;
23900         this.multiplyScalar( 1 / m.determinant() );
23901
23902         return this;
23903
23904     },
23905
23906     setRotationFromEuler: function ( v, order ) {
23907
23908         var te = this.elements;
23909
23910         var x = v.x, y = v.y, z = v.z;
23911         var a = Math.cos( x ), b = Math.sin( x );
23912         var c = Math.cos( y ), d = Math.sin( y );
23913         var e = Math.cos( z ), f = Math.sin( z );
23914
23915         if ( order === undefined || order === 'XYZ' ) {
23916
23917             var ae = a * e, af = a * f, be = b * e, bf = b * f;
23918
23919             te[0] = c * e;
23920             te[4] = - c * f;
23921             te[8] = d;
23922
23923             te[1] = af + be * d;
23924             te[5] = ae - bf * d;
23925             te[9] = - b * c;
23926
23927             te[2] = bf - ae * d;
23928             te[6] = be + af * d;
23929             te[10] = a * c;
23930
23931         } else if ( order === 'YXZ' ) {
23932
23933             var ce = c * e, cf = c * f, de = d * e, df = d * f;
23934
23935             te[0] = ce + df * b;
23936             te[4] = de * b - cf;
23937             te[8] = a * d;
23938
23939             te[1] = a * f;
23940             te[5] = a * e;
23941             te[9] = - b;
23942
23943             te[2] = cf * b - de;
23944             te[6] = df + ce * b;
23945             te[10] = a * c;
23946
23947         } else if ( order === 'ZXY' ) {
23948
23949             var ce = c * e, cf = c * f, de = d * e, df = d * f;
23950
23951             te[0] = ce - df * b;
23952             te[4] = - a * f;
23953             te[8] = de + cf * b;
23954
23955             te[1] = cf + de * b;
23956             te[5] = a * e;
23957             te[9] = df - ce * b;
23958
23959             te[2] = - a * d;
23960             te[6] = b;
23961             te[10] = a * c;
23962
23963         } else if ( order === 'ZYX' ) {
23964
23965             var ae = a * e, af = a * f, be = b * e, bf = b * f;
23966
23967             te[0] = c * e;
23968             te[4] = be * d - af;
23969             te[8] = ae * d + bf;
23970
23971             te[1] = c * f;
23972             te[5] = bf * d + ae;
23973             te[9] = af * d - be;
23974
23975             te[2] = - d;
23976             te[6] = b * c;
23977             te[10] = a * c;
23978
23979         } else if ( order === 'YZX' ) {
23980
23981             var ac = a * c, ad = a * d, bc = b * c, bd = b * d;
23982
23983             te[0] = c * e;
23984             te[4] = bd - ac * f;
23985             te[8] = bc * f + ad;
23986
23987             te[1] = f;
23988             te[5] = a * e;
23989             te[9] = - b * e;
23990
23991             te[2] = - d * e;
23992             te[6] = ad * f + bc;
23993             te[10] = ac - bd * f;
23994
23995         } else if ( order === 'XZY' ) {
23996
23997             var ac = a * c, ad = a * d, bc = b * c, bd = b * d;
23998
23999             te[0] = c * e;
24000             te[4] = - f;
24001             te[8] = d * e;
24002
24003             te[1] = ac * f + bd;
24004             te[5] = a * e;
24005             te[9] = ad * f - bc;
24006
24007             te[2] = bc * f - ad;
24008             te[6] = b * e;
24009             te[10] = bd * f + ac;
24010
24011         }
24012
24013         return this;
24014
24015     },
24016
24017
24018     setRotationFromQuaternion: function ( q ) {
24019
24020         var te = this.elements;
24021
24022         var x = q.x, y = q.y, z = q.z, w = q.w;
24023         var x2 = x + x, y2 = y + y, z2 = z + z;
24024         var xx = x * x2, xy = x * y2, xz = x * z2;
24025         var yy = y * y2, yz = y * z2, zz = z * z2;
24026         var wx = w * x2, wy = w * y2, wz = w * z2;
24027
24028         te[0] = 1 - ( yy + zz );
24029         te[4] = xy - wz;
24030         te[8] = xz + wy;
24031
24032         te[1] = xy + wz;
24033         te[5] = 1 - ( xx + zz );
24034         te[9] = yz - wx;
24035
24036         te[2] = xz - wy;
24037         te[6] = yz + wx;
24038         te[10] = 1 - ( xx + yy );
24039
24040         return this;
24041
24042     },
24043
24044     compose: function ( translation, rotation, scale ) {
24045
24046         var te = this.elements;
24047         var mRotation = THREE.Matrix4.__m1;
24048         var mScale = THREE.Matrix4.__m2;
24049
24050         mRotation.identity();
24051         mRotation.setRotationFromQuaternion( rotation );
24052
24053         mScale.makeScale( scale.x, scale.y, scale.z );
24054
24055         this.multiply( mRotation, mScale );
24056
24057         te[12] = translation.x;
24058         te[13] = translation.y;
24059         te[14] = translation.z;
24060
24061         return this;
24062
24063     },
24064
24065     decompose: function ( translation, rotation, scale ) {
24066
24067         var te = this.elements;
24068
24069         // grab the axis vectors
24070         var x = THREE.Matrix4.__v1;
24071         var y = THREE.Matrix4.__v2;
24072         var z = THREE.Matrix4.__v3;
24073
24074         x.set( te[0], te[1], te[2] );
24075         y.set( te[4], te[5], te[6] );
24076         z.set( te[8], te[9], te[10] );
24077
24078         translation = ( translation instanceof THREE.Vector3 ) ? translation : new THREE.Vector3();
24079         rotation = ( rotation instanceof THREE.Quaternion ) ? rotation : new THREE.Quaternion();
24080         scale = ( scale instanceof THREE.Vector3 ) ? scale : new THREE.Vector3();
24081
24082         scale.x = x.length();
24083         scale.y = y.length();
24084         scale.z = z.length();
24085
24086         translation.x = te[12];
24087         translation.y = te[13];
24088         translation.z = te[14];
24089
24090         // scale the rotation part
24091
24092         var matrix = THREE.Matrix4.__m1;
24093
24094         matrix.copy( this );
24095
24096         matrix.elements[0] /= scale.x;
24097         matrix.elements[1] /= scale.x;
24098         matrix.elements[2] /= scale.x;
24099
24100         matrix.elements[4] /= scale.y;
24101         matrix.elements[5] /= scale.y;
24102         matrix.elements[6] /= scale.y;
24103
24104         matrix.elements[8] /= scale.z;
24105         matrix.elements[9] /= scale.z;
24106         matrix.elements[10] /= scale.z;
24107
24108         rotation.setFromRotationMatrix( matrix );
24109
24110         return [ translation, rotation, scale ];
24111
24112     },
24113
24114     extractPosition: function ( m ) {
24115
24116         var te = this.elements;
24117         var me = m.elements;
24118
24119         te[12] = me[12];
24120         te[13] = me[13];
24121         te[14] = me[14];
24122
24123         return this;
24124
24125     },
24126
24127     extractRotation: function ( m ) {
24128
24129         var te = this.elements;
24130         var me = m.elements;
24131
24132         var vector = THREE.Matrix4.__v1;
24133
24134         var scaleX = 1 / vector.set( me[0], me[1], me[2] ).length();
24135         var scaleY = 1 / vector.set( me[4], me[5], me[6] ).length();
24136         var scaleZ = 1 / vector.set( me[8], me[9], me[10] ).length();
24137
24138         te[0] = me[0] * scaleX;
24139         te[1] = me[1] * scaleX;
24140         te[2] = me[2] * scaleX;
24141
24142         te[4] = me[4] * scaleY;
24143         te[5] = me[5] * scaleY;
24144         te[6] = me[6] * scaleY;
24145
24146         te[8] = me[8] * scaleZ;
24147         te[9] = me[9] * scaleZ;
24148         te[10] = me[10] * scaleZ;
24149
24150         return this;
24151
24152     },
24153
24154     //
24155
24156     translate: function ( v ) {
24157
24158         var te = this.elements;
24159         var x = v.x, y = v.y, z = v.z;
24160
24161         te[12] = te[0] * x + te[4] * y + te[8] * z + te[12];
24162         te[13] = te[1] * x + te[5] * y + te[9] * z + te[13];
24163         te[14] = te[2] * x + te[6] * y + te[10] * z + te[14];
24164         te[15] = te[3] * x + te[7] * y + te[11] * z + te[15];
24165
24166         return this;
24167
24168     },
24169
24170     rotateX: function ( angle ) {
24171
24172         var te = this.elements;
24173         var m12 = te[4];
24174         var m22 = te[5];
24175         var m32 = te[6];
24176         var m42 = te[7];
24177         var m13 = te[8];
24178         var m23 = te[9];
24179         var m33 = te[10];
24180         var m43 = te[11];
24181         var c = Math.cos( angle );
24182         var s = Math.sin( angle );
24183
24184         te[4] = c * m12 + s * m13;
24185         te[5] = c * m22 + s * m23;
24186         te[6] = c * m32 + s * m33;
24187         te[7] = c * m42 + s * m43;
24188
24189         te[8] = c * m13 - s * m12;
24190         te[9] = c * m23 - s * m22;
24191         te[10] = c * m33 - s * m32;
24192         te[11] = c * m43 - s * m42;
24193
24194         return this;
24195
24196     },
24197
24198     rotateY: function ( angle ) {
24199
24200         var te = this.elements;
24201         var m11 = te[0];
24202         var m21 = te[1];
24203         var m31 = te[2];
24204         var m41 = te[3];
24205         var m13 = te[8];
24206         var m23 = te[9];
24207         var m33 = te[10];
24208         var m43 = te[11];
24209         var c = Math.cos( angle );
24210         var s = Math.sin( angle );
24211
24212         te[0] = c * m11 - s * m13;
24213         te[1] = c * m21 - s * m23;
24214         te[2] = c * m31 - s * m33;
24215         te[3] = c * m41 - s * m43;
24216
24217         te[8] = c * m13 + s * m11;
24218         te[9] = c * m23 + s * m21;
24219         te[10] = c * m33 + s * m31;
24220         te[11] = c * m43 + s * m41;
24221
24222         return this;
24223
24224     },
24225
24226     rotateZ: function ( angle ) {
24227
24228         var te = this.elements;
24229         var m11 = te[0];
24230         var m21 = te[1];
24231         var m31 = te[2];
24232         var m41 = te[3];
24233         var m12 = te[4];
24234         var m22 = te[5];
24235         var m32 = te[6];
24236         var m42 = te[7];
24237         var c = Math.cos( angle );
24238         var s = Math.sin( angle );
24239
24240         te[0] = c * m11 + s * m12;
24241         te[1] = c * m21 + s * m22;
24242         te[2] = c * m31 + s * m32;
24243         te[3] = c * m41 + s * m42;
24244
24245         te[4] = c * m12 - s * m11;
24246         te[5] = c * m22 - s * m21;
24247         te[6] = c * m32 - s * m31;
24248         te[7] = c * m42 - s * m41;
24249
24250         return this;
24251
24252     },
24253
24254     rotateByAxis: function ( axis, angle ) {
24255
24256         var te = this.elements;
24257
24258         // optimize by checking axis
24259
24260         if ( axis.x === 1 && axis.y === 0 && axis.z === 0 ) {
24261
24262             return this.rotateX( angle );
24263
24264         } else if ( axis.x === 0 && axis.y === 1 && axis.z === 0 ) {
24265
24266             return this.rotateY( angle );
24267
24268         } else if ( axis.x === 0 && axis.y === 0 && axis.z === 1 ) {
24269
24270             return this.rotateZ( angle );
24271
24272         }
24273
24274         var x = axis.x, y = axis.y, z = axis.z;
24275         var n = Math.sqrt(x * x + y * y + z * z);
24276
24277         x /= n;
24278         y /= n;
24279         z /= n;
24280
24281         var xx = x * x, yy = y * y, zz = z * z;
24282         var c = Math.cos( angle );
24283         var s = Math.sin( angle );
24284         var oneMinusCosine = 1 - c;
24285         var xy = x * y * oneMinusCosine;
24286         var xz = x * z * oneMinusCosine;
24287         var yz = y * z * oneMinusCosine;
24288         var xs = x * s;
24289         var ys = y * s;
24290         var zs = z * s;
24291
24292         var r11 = xx + (1 - xx) * c;
24293         var r21 = xy + zs;
24294         var r31 = xz - ys;
24295         var r12 = xy - zs;
24296         var r22 = yy + (1 - yy) * c;
24297         var r32 = yz + xs;
24298         var r13 = xz + ys;
24299         var r23 = yz - xs;
24300         var r33 = zz + (1 - zz) * c;
24301
24302         var m11 = te[0], m21 = te[1], m31 = te[2], m41 = te[3];
24303         var m12 = te[4], m22 = te[5], m32 = te[6], m42 = te[7];
24304         var m13 = te[8], m23 = te[9], m33 = te[10], m43 = te[11];
24305         var m14 = te[12], m24 = te[13], m34 = te[14], m44 = te[15];
24306
24307         te[0] = r11 * m11 + r21 * m12 + r31 * m13;
24308         te[1] = r11 * m21 + r21 * m22 + r31 * m23;
24309         te[2] = r11 * m31 + r21 * m32 + r31 * m33;
24310         te[3] = r11 * m41 + r21 * m42 + r31 * m43;
24311
24312         te[4] = r12 * m11 + r22 * m12 + r32 * m13;
24313         te[5] = r12 * m21 + r22 * m22 + r32 * m23;
24314         te[6] = r12 * m31 + r22 * m32 + r32 * m33;
24315         te[7] = r12 * m41 + r22 * m42 + r32 * m43;
24316
24317         te[8] = r13 * m11 + r23 * m12 + r33 * m13;
24318         te[9] = r13 * m21 + r23 * m22 + r33 * m23;
24319         te[10] = r13 * m31 + r23 * m32 + r33 * m33;
24320         te[11] = r13 * m41 + r23 * m42 + r33 * m43;
24321
24322         return this;
24323
24324     },
24325
24326     scale: function ( v ) {
24327
24328         var te = this.elements;
24329         var x = v.x, y = v.y, z = v.z;
24330
24331         te[0] *= x; te[4] *= y; te[8] *= z;
24332         te[1] *= x; te[5] *= y; te[9] *= z;
24333         te[2] *= x; te[6] *= y; te[10] *= z;
24334         te[3] *= x; te[7] *= y; te[11] *= z;
24335
24336         return this;
24337
24338     },
24339
24340     getMaxScaleOnAxis: function () {
24341
24342         var te = this.elements;
24343
24344         var scaleXSq =  te[0] * te[0] + te[1] * te[1] + te[2] * te[2];
24345         var scaleYSq =  te[4] * te[4] + te[5] * te[5] + te[6] * te[6];
24346         var scaleZSq =  te[8] * te[8] + te[9] * te[9] + te[10] * te[10];
24347
24348         return Math.sqrt( Math.max( scaleXSq, Math.max( scaleYSq, scaleZSq ) ) );
24349
24350     },
24351
24352     //
24353
24354     makeTranslation: function ( x, y, z ) {
24355
24356         this.set(
24357
24358             1, 0, 0, x,
24359             0, 1, 0, y,
24360             0, 0, 1, z,
24361             0, 0, 0, 1
24362
24363         );
24364
24365         return this;
24366
24367     },
24368
24369     makeRotationX: function ( theta ) {
24370
24371         var c = Math.cos( theta ), s = Math.sin( theta );
24372
24373         this.set(
24374
24375             1, 0,  0, 0,
24376             0, c, -s, 0,
24377             0, s,  c, 0,
24378             0, 0,  0, 1
24379
24380         );
24381
24382         return this;
24383
24384     },
24385
24386     makeRotationY: function ( theta ) {
24387
24388         var c = Math.cos( theta ), s = Math.sin( theta );
24389
24390         this.set(
24391
24392              c, 0, s, 0,
24393              0, 1, 0, 0,
24394             -s, 0, c, 0,
24395              0, 0, 0, 1
24396
24397         );
24398
24399         return this;
24400
24401     },
24402
24403     makeRotationZ: function ( theta ) {
24404
24405         var c = Math.cos( theta ), s = Math.sin( theta );
24406
24407         this.set(
24408
24409             c, -s, 0, 0,
24410             s,  c, 0, 0,
24411             0,  0, 1, 0,
24412             0,  0, 0, 1
24413
24414         );
24415
24416         return this;
24417
24418     },
24419
24420     makeRotationAxis: function ( axis, angle ) {
24421
24422         // Based on http://www.gamedev.net/reference/articles/article1199.asp
24423
24424         var c = Math.cos( angle );
24425         var s = Math.sin( angle );
24426         var t = 1 - c;
24427         var x = axis.x, y = axis.y, z = axis.z;
24428         var tx = t * x, ty = t * y;
24429
24430         this.set(
24431
24432             tx * x + c, tx * y - s * z, tx * z + s * y, 0,
24433             tx * y + s * z, ty * y + c, ty * z - s * x, 0,
24434             tx * z - s * y, ty * z + s * x, t * z * z + c, 0,
24435             0, 0, 0, 1
24436
24437         );
24438
24439          return this;
24440
24441     },
24442
24443     makeScale: function ( x, y, z ) {
24444
24445         this.set(
24446
24447             x, 0, 0, 0,
24448             0, y, 0, 0,
24449             0, 0, z, 0,
24450             0, 0, 0, 1
24451
24452         );
24453
24454         return this;
24455
24456     },
24457
24458     makeFrustum: function ( left, right, bottom, top, near, far ) {
24459
24460         var te = this.elements;
24461         var x = 2 * near / ( right - left );
24462         var y = 2 * near / ( top - bottom );
24463
24464         var a = ( right + left ) / ( right - left );
24465         var b = ( top + bottom ) / ( top - bottom );
24466         var c = - ( far + near ) / ( far - near );
24467         var d = - 2 * far * near / ( far - near );
24468
24469         te[0] = x;  te[4] = 0;  te[8] = a;   te[12] = 0;
24470         te[1] = 0;  te[5] = y;  te[9] = b;   te[13] = 0;
24471         te[2] = 0;  te[6] = 0;  te[10] = c;   te[14] = d;
24472         te[3] = 0;  te[7] = 0;  te[11] = - 1; te[15] = 0;
24473
24474         return this;
24475
24476     },
24477
24478     makePerspective: function ( fov, aspect, near, far ) {
24479
24480         var ymax = near * Math.tan( fov * Math.PI / 360 );
24481         var ymin = - ymax;
24482         var xmin = ymin * aspect;
24483         var xmax = ymax * aspect;
24484
24485         return this.makeFrustum( xmin, xmax, ymin, ymax, near, far );
24486
24487     },
24488
24489     makeOrthographic: function ( left, right, top, bottom, near, far ) {
24490
24491         var te = this.elements;
24492         var w = right - left;
24493         var h = top - bottom;
24494         var p = far - near;
24495
24496         var x = ( right + left ) / w;
24497         var y = ( top + bottom ) / h;
24498         var z = ( far + near ) / p;
24499
24500         te[0] = 2 / w; te[4] = 0;     te[8] = 0;      te[12] = -x;
24501         te[1] = 0;     te[5] = 2 / h; te[9] = 0;      te[13] = -y;
24502         te[2] = 0;     te[6] = 0;     te[10] = -2 / p; te[14] = -z;
24503         te[3] = 0;     te[7] = 0;     te[11] = 0;      te[15] = 1;
24504
24505         return this;
24506
24507     },
24508
24509
24510     clone: function () {
24511
24512         var te = this.elements;
24513
24514         return new THREE.Matrix4(
24515
24516             te[0], te[4], te[8], te[12],
24517             te[1], te[5], te[9], te[13],
24518             te[2], te[6], te[10], te[14],
24519             te[3], te[7], te[11], te[15]
24520
24521         );
24522
24523     }
24524
24525 };
24526
24527 THREE.Matrix4.__v1 = new THREE.Vector3();
24528 THREE.Matrix4.__v2 = new THREE.Vector3();
24529 THREE.Matrix4.__v3 = new THREE.Vector3();
24530
24531 THREE.Matrix4.__m1 = new THREE.Matrix4();
24532 THREE.Matrix4.__m2 = new THREE.Matrix4();
24533 /**
24534  * https://github.com/mrdoob/eventtarget.js/
24535  */
24536
24537 THREE.EventTarget = function () {
24538
24539     var listeners = {};
24540
24541     this.addEventListener = function ( type, listener ) {
24542
24543         if ( listeners[ type ] === undefined ) {
24544
24545             listeners[ type ] = [];
24546
24547         }
24548
24549         if ( listeners[ type ].indexOf( listener ) === - 1 ) {
24550
24551             listeners[ type ].push( listener );
24552
24553         }
24554
24555     };
24556
24557     this.dispatchEvent = function ( event ) {
24558
24559         for ( var listener in listeners[ event.type ] ) {
24560
24561             listeners[ event.type ][ listener ]( event );
24562
24563         }
24564
24565     };
24566
24567     this.removeEventListener = function ( type, listener ) {
24568
24569         var index = listeners[ type ].indexOf( listener );
24570
24571         if ( index !== - 1 ) {
24572
24573             listeners[ type ].splice( index, 1 );
24574
24575         }
24576
24577     };
24578
24579 };
24580 /**
24581  * @author mrdoob / http://mrdoob.com/
24582  * @author alteredq / http://alteredqualia.com/
24583  */
24584
24585 THREE.Frustum = function ( ) {
24586
24587     this.planes = [
24588
24589         new THREE.Vector4(),
24590         new THREE.Vector4(),
24591         new THREE.Vector4(),
24592         new THREE.Vector4(),
24593         new THREE.Vector4(),
24594         new THREE.Vector4()
24595
24596     ];
24597
24598 };
24599
24600 THREE.Frustum.prototype.setFromMatrix = function ( m ) {
24601
24602     var plane;
24603     var planes = this.planes;
24604
24605     var me = m.elements;
24606     var me0 = me[0], me1 = me[1], me2 = me[2], me3 = me[3];
24607     var me4 = me[4], me5 = me[5], me6 = me[6], me7 = me[7];
24608     var me8 = me[8], me9 = me[9], me10 = me[10], me11 = me[11];
24609     var me12 = me[12], me13 = me[13], me14 = me[14], me15 = me[15];
24610
24611     planes[ 0 ].set( me3 - me0, me7 - me4, me11 - me8, me15 - me12 );
24612     planes[ 1 ].set( me3 + me0, me7 + me4, me11 + me8, me15 + me12 );
24613     planes[ 2 ].set( me3 + me1, me7 + me5, me11 + me9, me15 + me13 );
24614     planes[ 3 ].set( me3 - me1, me7 - me5, me11 - me9, me15 - me13 );
24615     planes[ 4 ].set( me3 - me2, me7 - me6, me11 - me10, me15 - me14 );
24616     planes[ 5 ].set( me3 + me2, me7 + me6, me11 + me10, me15 + me14 );
24617
24618     for ( var i = 0; i < 6; i ++ ) {
24619
24620         plane = planes[ i ];
24621         plane.divideScalar( Math.sqrt( plane.x * plane.x + plane.y * plane.y + plane.z * plane.z ) );
24622
24623     }
24624
24625 };
24626
24627 THREE.Frustum.prototype.contains = function ( object ) {
24628
24629     var distance = 0.0;
24630     var planes = this.planes;
24631     var matrix = object.matrixWorld;
24632     var me = matrix.elements;
24633     var radius = - object.geometry.boundingSphere.radius * matrix.getMaxScaleOnAxis();
24634
24635     for ( var i = 0; i < 6; i ++ ) {
24636
24637         distance = planes[ i ].x * me[12] + planes[ i ].y * me[13] + planes[ i ].z * me[14] + planes[ i ].w;
24638         if ( distance <= radius ) return false;
24639
24640     }
24641
24642     return true;
24643
24644 };
24645
24646 THREE.Frustum.__v1 = new THREE.Vector3();
24647 /**
24648  * @author mrdoob / http://mrdoob.com/
24649  */
24650
24651 ( function ( THREE ) {
24652
24653     THREE.Ray = function ( origin, direction, near, far ) {
24654
24655         this.origin = origin || new THREE.Vector3();
24656         this.direction = direction || new THREE.Vector3();
24657         this.near = near || 0;
24658         this.far = far || Infinity;
24659
24660     };
24661
24662     var originCopy = new THREE.Vector3();
24663
24664     var localOriginCopy = new THREE.Vector3();
24665     var localDirectionCopy = new THREE.Vector3();
24666
24667     var vector = new THREE.Vector3();
24668     var normal = new THREE.Vector3();
24669     var intersectPoint = new THREE.Vector3();
24670
24671     var inverseMatrix = new THREE.Matrix4();
24672
24673     var descSort = function ( a, b ) {
24674
24675         return a.distance - b.distance;
24676
24677     };
24678
24679     var v0 = new THREE.Vector3(), v1 = new THREE.Vector3(), v2 = new THREE.Vector3();
24680
24681     var distanceFromIntersection = function ( origin, direction, position ) {
24682
24683         v0.sub( position, origin );
24684
24685         var dot = v0.dot( direction );
24686
24687         var intersect = v1.add( origin, v2.copy( direction ).multiplyScalar( dot ) );
24688         var distance = position.distanceTo( intersect );
24689
24690         return distance;
24691
24692     };
24693
24694     // http://www.blackpawn.com/texts/pointinpoly/default.html
24695
24696     var pointInFace3 = function ( p, a, b, c ) {
24697
24698         v0.sub( c, a );
24699         v1.sub( b, a );
24700         v2.sub( p, a );
24701
24702         var dot00 = v0.dot( v0 );
24703         var dot01 = v0.dot( v1 );
24704         var dot02 = v0.dot( v2 );
24705         var dot11 = v1.dot( v1 );
24706         var dot12 = v1.dot( v2 );
24707
24708         var invDenom = 1 / ( dot00 * dot11 - dot01 * dot01 );
24709         var u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;
24710         var v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;
24711
24712         return ( u >= 0 ) && ( v >= 0 ) && ( u + v < 1 );
24713
24714     };
24715
24716     var intersectObject = function ( object, ray, intersects ) {
24717
24718         var distance,intersect;
24719
24720         if ( object instanceof THREE.Particle ) {
24721
24722             distance = distanceFromIntersection( ray.origin, ray.direction, object.matrixWorld.getPosition() );
24723
24724             if ( distance > object.scale.x ) {
24725
24726                 return intersects;
24727
24728             }
24729
24730             intersect = {
24731
24732                 distance: distance,
24733                 point: object.position,
24734                 face: null,
24735                 object: object
24736
24737             };
24738
24739             intersects.push( intersect );
24740
24741         } else if ( object instanceof THREE.Mesh ) {
24742
24743             // Checking boundingSphere
24744
24745             var scaledRadius = object.geometry.boundingSphere.radius * object.matrixWorld.getMaxScaleOnAxis();
24746
24747             // Checking distance to ray
24748
24749             distance = distanceFromIntersection( ray.origin, ray.direction, object.matrixWorld.getPosition() );
24750
24751             if ( distance > scaledRadius) {
24752
24753                 return intersects;
24754
24755             }
24756
24757             // Checking faces
24758
24759             var f, fl, face, dot, scalar,
24760             geometry = object.geometry,
24761             vertices = geometry.vertices,
24762             objMatrix, geometryMaterials,
24763             isFaceMaterial, material, side, point;
24764
24765             geometryMaterials = object.geometry.materials;
24766             isFaceMaterial = object.material instanceof THREE.MeshFaceMaterial;
24767             side = object.material.side;
24768
24769             var a, b, c, d;
24770             var precision = ray.precision;
24771
24772             object.matrixRotationWorld.extractRotation( object.matrixWorld );
24773
24774             originCopy.copy( ray.origin );
24775
24776             objMatrix = object.matrixWorld;
24777             inverseMatrix.getInverse( objMatrix );
24778
24779             localOriginCopy.copy( originCopy );
24780             inverseMatrix.multiplyVector3( localOriginCopy );
24781
24782             localDirectionCopy.copy( ray.direction );
24783             inverseMatrix.rotateAxis( localDirectionCopy ).normalize();
24784
24785             for ( f = 0, fl = geometry.faces.length; f < fl; f ++ ) {
24786
24787                 face = geometry.faces[ f ];
24788
24789                 material = isFaceMaterial === true ? geometryMaterials[ face.materialIndex ] : object.material;
24790                 if ( material === undefined ) continue;
24791                 side = material.side;
24792
24793                 vector.sub( face.centroid, localOriginCopy );
24794                 normal = face.normal;
24795                 dot = localDirectionCopy.dot( normal );
24796
24797                 // bail if ray and plane are parallel
24798
24799                 if ( Math.abs( dot ) < precision ) continue;
24800
24801                 // calc distance to plane
24802
24803                 scalar = normal.dot( vector ) / dot;
24804
24805                 // if negative distance, then plane is behind ray
24806
24807                 if ( scalar < 0 ) continue;
24808
24809                 if ( side === THREE.DoubleSide || ( side === THREE.FrontSide ? dot < 0 : dot > 0 ) ) {
24810
24811                     intersectPoint.add( localOriginCopy, localDirectionCopy.multiplyScalar( scalar ) );
24812
24813                     if ( face instanceof THREE.Face3 ) {
24814
24815                         a = vertices[ face.a ];
24816                         b = vertices[ face.b ];
24817                         c = vertices[ face.c ];
24818
24819                         if ( pointInFace3( intersectPoint, a, b, c ) ) {
24820
24821                             point = object.matrixWorld.multiplyVector3( intersectPoint.clone() );
24822                             distance = originCopy.distanceTo( point );
24823
24824                             if ( distance < ray.near || distance > ray.far ) continue;
24825
24826                             intersect = {
24827
24828                                 distance: distance,
24829                                 point: point,
24830                                 face: face,
24831                                 faceIndex: f,
24832                                 object: object
24833
24834                             };
24835
24836                             intersects.push( intersect );
24837
24838                         }
24839
24840                     } else if ( face instanceof THREE.Face4 ) {
24841
24842                         a = vertices[ face.a ];
24843                         b = vertices[ face.b ];
24844                         c = vertices[ face.c ];
24845                         d = vertices[ face.d ];
24846
24847                         if ( pointInFace3( intersectPoint, a, b, d ) || pointInFace3( intersectPoint, b, c, d ) ) {
24848
24849                             point = object.matrixWorld.multiplyVector3( intersectPoint.clone() );
24850                             distance = originCopy.distanceTo( point );
24851
24852                             if ( distance < ray.near || distance > ray.far ) continue;
24853
24854                             intersect = {
24855
24856                                 distance: distance,
24857                                 point: point,
24858                                 face: face,
24859                                 faceIndex: f,
24860                                 object: object
24861
24862                             };
24863
24864                             intersects.push( intersect );
24865
24866                         }
24867
24868                     }
24869
24870                 }
24871
24872             }
24873
24874         }
24875
24876     };
24877
24878     var intersectDescendants = function ( object, ray, intersects ) {
24879
24880         var descendants = object.getDescendants();
24881
24882         for ( var i = 0, l = descendants.length; i < l; i ++ ) {
24883
24884             intersectObject( descendants[ i ], ray, intersects );
24885
24886         }
24887     };
24888
24889     //
24890
24891     THREE.Ray.prototype.precision = 0.0001;
24892
24893     THREE.Ray.prototype.set = function ( origin, direction ) {
24894
24895         this.origin = origin;
24896         this.direction = direction;
24897
24898     };
24899
24900     THREE.Ray.prototype.intersectObject = function ( object, recursive ) {
24901
24902         var intersects = [];
24903
24904         if ( recursive === true ) {
24905
24906             intersectDescendants( object, this, intersects );
24907
24908         }
24909
24910         intersectObject( object, this, intersects );
24911
24912         intersects.sort( descSort );
24913
24914         return intersects;
24915
24916     };
24917
24918     THREE.Ray.prototype.intersectObjects = function ( objects, recursive ) {
24919
24920         var intersects = [];
24921
24922         for ( var i = 0, l = objects.length; i < l; i ++ ) {
24923
24924             intersectObject( objects[ i ], this, intersects );
24925
24926             if ( recursive === true ) {
24927
24928                 intersectDescendants( objects[ i ], this, intersects );
24929
24930             }
24931         }
24932
24933         intersects.sort( descSort );
24934
24935         return intersects;
24936
24937     };
24938
24939 }( THREE ) );
24940 /**
24941  * @author mrdoob / http://mrdoob.com/
24942  */
24943
24944 THREE.Rectangle = function () {
24945
24946     var _left = 0;
24947     var _top = 0;
24948     var _right = 0;
24949     var _bottom = 0;
24950     var _width = 0;
24951     var _height = 0;
24952     var _isEmpty = true;
24953
24954     function resize() {
24955
24956         _width = _right - _left;
24957         _height = _bottom - _top;
24958
24959     }
24960
24961     this.getX = function () {
24962
24963         return _left;
24964
24965     };
24966
24967     this.getY = function () {
24968
24969         return _top;
24970
24971     };
24972
24973     this.getWidth = function () {
24974
24975         return _width;
24976
24977     };
24978
24979     this.getHeight = function () {
24980
24981         return _height;
24982
24983     };
24984
24985     this.getLeft = function() {
24986
24987         return _left;
24988
24989     };
24990
24991     this.getTop = function() {
24992
24993         return _top;
24994
24995     };
24996
24997     this.getRight = function() {
24998
24999         return _right;
25000
25001     };
25002
25003     this.getBottom = function() {
25004
25005         return _bottom;
25006
25007     };
25008
25009     this.set = function ( left, top, right, bottom ) {
25010
25011         _isEmpty = false;
25012
25013         _left = left; _top = top;
25014         _right = right; _bottom = bottom;
25015
25016         resize();
25017
25018     };
25019
25020     this.addPoint = function ( x, y ) {
25021
25022         if ( _isEmpty === true ) {
25023
25024             _isEmpty = false;
25025             _left = x; _top = y;
25026             _right = x; _bottom = y;
25027
25028             resize();
25029
25030         } else {
25031
25032             _left = _left < x ? _left : x; // Math.min( _left, x );
25033             _top = _top < y ? _top : y; // Math.min( _top, y );
25034             _right = _right > x ? _right : x; // Math.max( _right, x );
25035             _bottom = _bottom > y ? _bottom : y; // Math.max( _bottom, y );
25036
25037             resize();
25038         }
25039
25040     };
25041
25042     this.add3Points = function ( x1, y1, x2, y2, x3, y3 ) {
25043
25044         if ( _isEmpty === true ) {
25045
25046             _isEmpty = false;
25047             _left = x1 < x2 ? ( x1 < x3 ? x1 : x3 ) : ( x2 < x3 ? x2 : x3 );
25048             _top = y1 < y2 ? ( y1 < y3 ? y1 : y3 ) : ( y2 < y3 ? y2 : y3 );
25049             _right = x1 > x2 ? ( x1 > x3 ? x1 : x3 ) : ( x2 > x3 ? x2 : x3 );
25050             _bottom = y1 > y2 ? ( y1 > y3 ? y1 : y3 ) : ( y2 > y3 ? y2 : y3 );
25051
25052             resize();
25053
25054         } else {
25055
25056             _left = x1 < x2 ? ( x1 < x3 ? ( x1 < _left ? x1 : _left ) : ( x3 < _left ? x3 : _left ) ) : ( x2 < x3 ? ( x2 < _left ? x2 : _left ) : ( x3 < _left ? x3 : _left ) );
25057             _top = y1 < y2 ? ( y1 < y3 ? ( y1 < _top ? y1 : _top ) : ( y3 < _top ? y3 : _top ) ) : ( y2 < y3 ? ( y2 < _top ? y2 : _top ) : ( y3 < _top ? y3 : _top ) );
25058             _right = x1 > x2 ? ( x1 > x3 ? ( x1 > _right ? x1 : _right ) : ( x3 > _right ? x3 : _right ) ) : ( x2 > x3 ? ( x2 > _right ? x2 : _right ) : ( x3 > _right ? x3 : _right ) );
25059             _bottom = y1 > y2 ? ( y1 > y3 ? ( y1 > _bottom ? y1 : _bottom ) : ( y3 > _bottom ? y3 : _bottom ) ) : ( y2 > y3 ? ( y2 > _bottom ? y2 : _bottom ) : ( y3 > _bottom ? y3 : _bottom ) );
25060
25061             resize();
25062
25063         };
25064
25065     };
25066
25067     this.addRectangle = function ( r ) {
25068
25069         if ( _isEmpty === true ) {
25070
25071             _isEmpty = false;
25072             _left = r.getLeft(); _top = r.getTop();
25073             _right = r.getRight(); _bottom = r.getBottom();
25074
25075             resize();
25076
25077         } else {
25078
25079             _left = _left < r.getLeft() ? _left : r.getLeft(); // Math.min(_left, r.getLeft() );
25080             _top = _top < r.getTop() ? _top : r.getTop(); // Math.min(_top, r.getTop() );
25081             _right = _right > r.getRight() ? _right : r.getRight(); // Math.max(_right, r.getRight() );
25082             _bottom = _bottom > r.getBottom() ? _bottom : r.getBottom(); // Math.max(_bottom, r.getBottom() );
25083
25084             resize();
25085
25086         }
25087
25088     };
25089
25090     this.inflate = function ( v ) {
25091
25092         _left -= v; _top -= v;
25093         _right += v; _bottom += v;
25094
25095         resize();
25096
25097     };
25098
25099     this.minSelf = function ( r ) {
25100
25101         _left = _left > r.getLeft() ? _left : r.getLeft(); // Math.max( _left, r.getLeft() );
25102         _top = _top > r.getTop() ? _top : r.getTop(); // Math.max( _top, r.getTop() );
25103         _right = _right < r.getRight() ? _right : r.getRight(); // Math.min( _right, r.getRight() );
25104         _bottom = _bottom < r.getBottom() ? _bottom : r.getBottom(); // Math.min( _bottom, r.getBottom() );
25105
25106         resize();
25107
25108     };
25109
25110     this.intersects = function ( r ) {
25111
25112         // http://gamemath.com/2011/09/detecting-whether-two-boxes-overlap/
25113
25114         if ( _right < r.getLeft() ) return false;
25115         if ( _left > r.getRight() ) return false;
25116         if ( _bottom < r.getTop() ) return false;
25117         if ( _top > r.getBottom() ) return false;
25118
25119         return true;
25120
25121     };
25122
25123     this.empty = function () {
25124
25125         _isEmpty = true;
25126
25127         _left = 0; _top = 0;
25128         _right = 0; _bottom = 0;
25129
25130         resize();
25131
25132     };
25133
25134     this.isEmpty = function () {
25135
25136         return _isEmpty;
25137
25138     };
25139
25140 };
25141 /**
25142  * @author alteredq / http://alteredqualia.com/
25143  */
25144
25145 THREE.Math = {
25146
25147     // Clamp value to range <a, b>
25148
25149     clamp: function ( x, a, b ) {
25150
25151         return ( x < a ) ? a : ( ( x > b ) ? b : x );
25152
25153     },
25154
25155     // Clamp value to range <a, inf)
25156
25157     clampBottom: function ( x, a ) {
25158
25159         return x < a ? a : x;
25160
25161     },
25162
25163     // Linear mapping from range <a1, a2> to range <b1, b2>
25164
25165     mapLinear: function ( x, a1, a2, b1, b2 ) {
25166
25167         return b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );
25168
25169     },
25170
25171     // Random float from <0, 1> with 16 bits of randomness
25172     // (standard Math.random() creates repetitive patterns when applied over larger space)
25173
25174     random16: function () {
25175
25176         return ( 65280 * Math.random() + 255 * Math.random() ) / 65535;
25177
25178     },
25179
25180     // Random integer from <low, high> interval
25181
25182     randInt: function ( low, high ) {
25183
25184         return low + Math.floor( Math.random() * ( high - low + 1 ) );
25185
25186     },
25187
25188     // Random float from <low, high> interval
25189
25190     randFloat: function ( low, high ) {
25191
25192         return low + Math.random() * ( high - low );
25193
25194     },
25195
25196     // Random float from <-range/2, range/2> interval
25197
25198     randFloatSpread: function ( range ) {
25199
25200         return range * ( 0.5 - Math.random() );
25201
25202     },
25203
25204     sign: function ( x ) {
25205
25206         return ( x < 0 ) ? -1 : ( ( x > 0 ) ? 1 : 0 );
25207
25208     }
25209
25210 };
25211 /**
25212  * @author mrdoob / http://mrdoob.com/
25213  * @author mikael emtinger / http://gomo.se/
25214  * @author alteredq / http://alteredqualia.com/
25215  */
25216
25217 THREE.Object3D = function () {
25218
25219     this.id = THREE.Object3DCount ++;
25220
25221     this.name = '';
25222     this.properties = {};
25223
25224     this.parent = undefined;
25225     this.children = [];
25226
25227     this.up = new THREE.Vector3( 0, 1, 0 );
25228
25229     this.position = new THREE.Vector3();
25230     this.rotation = new THREE.Vector3();
25231     this.eulerOrder = 'XYZ';
25232     this.scale = new THREE.Vector3( 1, 1, 1 );
25233
25234     this.renderDepth = null;
25235
25236     this.rotationAutoUpdate = true;
25237
25238     this.matrix = new THREE.Matrix4();
25239     this.matrixWorld = new THREE.Matrix4();
25240     this.matrixRotationWorld = new THREE.Matrix4();
25241
25242     this.matrixAutoUpdate = true;
25243     this.matrixWorldNeedsUpdate = true;
25244
25245     this.quaternion = new THREE.Quaternion();
25246     this.useQuaternion = false;
25247
25248     this.boundRadius = 0.0;
25249     this.boundRadiusScale = 1.0;
25250
25251     this.visible = true;
25252
25253     this.castShadow = false;
25254     this.receiveShadow = false;
25255
25256     this.frustumCulled = true;
25257
25258     this._vector = new THREE.Vector3();
25259
25260 };
25261
25262
25263 THREE.Object3D.prototype = {
25264
25265     constructor: THREE.Object3D,
25266
25267     applyMatrix: function ( matrix ) {
25268
25269         this.matrix.multiply( matrix, this.matrix );
25270
25271         this.scale.getScaleFromMatrix( this.matrix );
25272
25273         var mat = new THREE.Matrix4().extractRotation( this.matrix );
25274         this.rotation.setEulerFromRotationMatrix( mat, this.eulerOrder );
25275
25276         this.position.getPositionFromMatrix( this.matrix );
25277
25278     },
25279
25280     translate: function ( distance, axis ) {
25281
25282         this.matrix.rotateAxis( axis );
25283         this.position.addSelf( axis.multiplyScalar( distance ) );
25284
25285     },
25286
25287     translateX: function ( distance ) {
25288
25289         this.translate( distance, this._vector.set( 1, 0, 0 ) );
25290
25291     },
25292
25293     translateY: function ( distance ) {
25294
25295         this.translate( distance, this._vector.set( 0, 1, 0 ) );
25296
25297     },
25298
25299     translateZ: function ( distance ) {
25300
25301         this.translate( distance, this._vector.set( 0, 0, 1 ) );
25302
25303     },
25304
25305     localToWorld: function ( vector ) {
25306
25307         return this.matrixWorld.multiplyVector3( vector );
25308
25309     },
25310
25311     worldToLocal: function ( vector ) {
25312
25313         return THREE.Object3D.__m1.getInverse( this.matrixWorld ).multiplyVector3( vector );
25314
25315     },
25316
25317     lookAt: function ( vector ) {
25318
25319         // TODO: Add hierarchy support.
25320
25321         this.matrix.lookAt( vector, this.position, this.up );
25322
25323         if ( this.rotationAutoUpdate ) {
25324
25325             this.rotation.setEulerFromRotationMatrix( this.matrix, this.eulerOrder );
25326
25327         }
25328
25329     },
25330
25331     add: function ( object ) {
25332
25333         if ( object === this ) {
25334
25335             console.warn( 'THREE.Object3D.add: An object can\'t be added as a child of itself.' );
25336             return;
25337
25338         }
25339
25340         if ( object instanceof THREE.Object3D ) {
25341
25342             if ( object.parent !== undefined ) {
25343
25344                 object.parent.remove( object );
25345
25346             }
25347
25348             object.parent = this;
25349             this.children.push( object );
25350
25351             // add to scene
25352
25353             var scene = this;
25354
25355             while ( scene.parent !== undefined ) {
25356
25357                 scene = scene.parent;
25358
25359             }
25360
25361             if ( scene !== undefined && scene instanceof THREE.Scene )  {
25362
25363                 scene.__addObject( object );
25364
25365             }
25366
25367         }
25368
25369     },
25370
25371     remove: function ( object ) {
25372
25373         var index = this.children.indexOf( object );
25374
25375         if ( index !== - 1 ) {
25376
25377             object.parent = undefined;
25378             this.children.splice( index, 1 );
25379
25380             // remove from scene
25381
25382             var scene = this;
25383
25384             while ( scene.parent !== undefined ) {
25385
25386                 scene = scene.parent;
25387
25388             }
25389
25390             if ( scene !== undefined && scene instanceof THREE.Scene ) {
25391
25392                 scene.__removeObject( object );
25393
25394             }
25395
25396         }
25397
25398     },
25399
25400     getChildByName: function ( name, recursive ) {
25401
25402         var c, cl, child;
25403
25404         for ( c = 0, cl = this.children.length; c < cl; c ++ ) {
25405
25406             child = this.children[ c ];
25407
25408             if ( child.name === name ) {
25409
25410                 return child;
25411
25412             }
25413
25414             if ( recursive ) {
25415
25416                 child = child.getChildByName( name, recursive );
25417
25418                 if ( child !== undefined ) {
25419
25420                     return child;
25421
25422                 }
25423
25424             }
25425
25426         }
25427
25428         return undefined;
25429
25430     },
25431
25432     getDescendants: function ( array ) {
25433
25434         if ( array === undefined ) array = [];
25435
25436         Array.prototype.push.apply( array, this.children );
25437
25438         for ( var i = 0, l = this.children.length; i < l; i ++ ) {
25439
25440             this.children[ i ].getDescendants( array );
25441
25442         };
25443
25444         return array;
25445
25446     },
25447
25448     updateMatrix: function () {
25449
25450         this.matrix.setPosition( this.position );
25451
25452         if ( this.useQuaternion === false )  {
25453
25454             this.matrix.setRotationFromEuler( this.rotation, this.eulerOrder );
25455
25456         } else {
25457
25458             this.matrix.setRotationFromQuaternion( this.quaternion );
25459
25460         }
25461
25462         if ( this.scale.x !== 1 || this.scale.y !== 1 || this.scale.z !== 1 ) {
25463
25464             this.matrix.scale( this.scale );
25465             this.boundRadiusScale = Math.max( this.scale.x, Math.max( this.scale.y, this.scale.z ) );
25466
25467         }
25468
25469         this.matrixWorldNeedsUpdate = true;
25470
25471     },
25472
25473     updateMatrixWorld: function ( force ) {
25474
25475         if ( this.matrixAutoUpdate === true ) this.updateMatrix();
25476
25477         if ( this.matrixWorldNeedsUpdate === true || force === true ) {
25478
25479             if ( this.parent === undefined ) {
25480
25481                 this.matrixWorld.copy( this.matrix );
25482
25483             } else {
25484
25485                 this.matrixWorld.multiply( this.parent.matrixWorld, this.matrix );
25486
25487             }
25488
25489             this.matrixWorldNeedsUpdate = false;
25490
25491             force = true;
25492
25493         }
25494
25495         // update children
25496
25497         for ( var i = 0, l = this.children.length; i < l; i ++ ) {
25498
25499             this.children[ i ].updateMatrixWorld( force );
25500
25501         }
25502
25503     },
25504
25505     clone: function () {
25506
25507         // TODO
25508
25509     }
25510
25511 };
25512
25513 THREE.Object3D.__m1 = new THREE.Matrix4();
25514
25515 THREE.Object3DCount = 0;
25516 /**
25517  * @author mrdoob / http://mrdoob.com/
25518  * @author supereggbert / http://www.paulbrunt.co.uk/
25519  * @author julianwa / https://github.com/julianwa
25520  */
25521
25522 THREE.Projector = function() {
25523
25524     var _object, _objectCount, _objectPool = [], _objectPoolLength = 0,
25525     _vertex, _vertexCount, _vertexPool = [], _vertexPoolLength = 0,
25526     _face, _face3Count, _face3Pool = [], _face3PoolLength = 0,
25527     _face4Count, _face4Pool = [], _face4PoolLength = 0,
25528     _line, _lineCount, _linePool = [], _linePoolLength = 0,
25529     _particle, _particleCount, _particlePool = [], _particlePoolLength = 0,
25530
25531     _renderData = { objects: [], sprites: [], lights: [], elements: [] },
25532
25533     _vector3 = new THREE.Vector3(),
25534     _vector4 = new THREE.Vector4(),
25535
25536     _viewProjectionMatrix = new THREE.Matrix4(),
25537     _modelViewProjectionMatrix = new THREE.Matrix4(),
25538
25539     _frustum = new THREE.Frustum(),
25540
25541     _clippedVertex1PositionScreen = new THREE.Vector4(),
25542     _clippedVertex2PositionScreen = new THREE.Vector4(),
25543
25544     _face3VertexNormals;
25545
25546     this.projectVector = function ( vector, camera ) {
25547
25548         camera.matrixWorldInverse.getInverse( camera.matrixWorld );
25549
25550         _viewProjectionMatrix.multiply( camera.projectionMatrix, camera.matrixWorldInverse );
25551         _viewProjectionMatrix.multiplyVector3( vector );
25552
25553         return vector;
25554
25555     };
25556
25557     this.unprojectVector = function ( vector, camera ) {
25558
25559         camera.projectionMatrixInverse.getInverse( camera.projectionMatrix );
25560
25561         _viewProjectionMatrix.multiply( camera.matrixWorld, camera.projectionMatrixInverse );
25562         _viewProjectionMatrix.multiplyVector3( vector );
25563
25564         return vector;
25565
25566     };
25567
25568     this.pickingRay = function ( vector, camera ) {
25569
25570         var end, ray, t;
25571
25572         // set two vectors with opposing z values
25573         vector.z = -1.0;
25574         end = new THREE.Vector3( vector.x, vector.y, 1.0 );
25575
25576         this.unprojectVector( vector, camera );
25577         this.unprojectVector( end, camera );
25578
25579         // find direction from vector to end
25580         end.subSelf( vector ).normalize();
25581
25582         return new THREE.Ray( vector, end );
25583
25584     };
25585
25586     var projectGraph = function ( root, sortObjects ) {
25587
25588         _objectCount = 0;
25589
25590         _renderData.objects.length = 0;
25591         _renderData.sprites.length = 0;
25592         _renderData.lights.length = 0;
25593
25594         var projectObject = function ( parent ) {
25595
25596             for ( var c = 0, cl = parent.children.length; c < cl; c ++ ) {
25597
25598                 var object = parent.children[ c ];
25599
25600                 if ( object.visible === false ) continue;
25601
25602                 if ( object instanceof THREE.Light ) {
25603
25604                     _renderData.lights.push( object );
25605
25606                 } else if ( object instanceof THREE.Mesh || object instanceof THREE.Line ) {
25607
25608                     if ( object.frustumCulled === false || _frustum.contains( object ) === true ) {
25609
25610                         _object = getNextObjectInPool();
25611                         _object.object = object;
25612
25613                         if ( object.renderDepth !== null ) {
25614
25615                             _object.z = object.renderDepth;
25616
25617                         } else {
25618
25619                             _vector3.copy( object.matrixWorld.getPosition() );
25620                             _viewProjectionMatrix.multiplyVector3( _vector3 );
25621                             _object.z = _vector3.z;
25622
25623                         }
25624
25625                         _renderData.objects.push( _object );
25626
25627                     }
25628
25629                 } else if ( object instanceof THREE.Sprite || object instanceof THREE.Particle ) {
25630
25631                     _object = getNextObjectInPool();
25632                     _object.object = object;
25633
25634                     // TODO: Find an elegant and performant solution and remove this dupe code.
25635
25636                     if ( object.renderDepth !== null ) {
25637
25638                         _object.z = object.renderDepth;
25639
25640                     } else {
25641
25642                         _vector3.copy( object.matrixWorld.getPosition() );
25643                         _viewProjectionMatrix.multiplyVector3( _vector3 );
25644                         _object.z = _vector3.z;
25645
25646                     }
25647
25648                     _renderData.sprites.push( _object );
25649
25650                 } else {
25651
25652                     _object = getNextObjectInPool();
25653                     _object.object = object;
25654
25655                     if ( object.renderDepth !== null ) {
25656
25657                         _object.z = object.renderDepth;
25658
25659                     } else {
25660
25661                         _vector3.copy( object.matrixWorld.getPosition() );
25662                         _viewProjectionMatrix.multiplyVector3( _vector3 );
25663                         _object.z = _vector3.z;
25664
25665                     }
25666
25667                     _renderData.objects.push( _object );
25668
25669                 }
25670
25671                 projectObject( object );
25672
25673             }
25674
25675         };
25676
25677         projectObject( root );
25678
25679         if ( sortObjects === true ) _renderData.objects.sort( painterSort );
25680
25681         return _renderData;
25682
25683     };
25684
25685     this.projectScene = function ( scene, camera, sortObjects, sortElements ) {
25686
25687         var near = camera.near, far = camera.far, visible = false,
25688         o, ol, v, vl, f, fl, n, nl, c, cl, u, ul, object,
25689         modelMatrix, rotationMatrix,
25690         geometry, geometryMaterials, vertices, vertex, vertexPositionScreen,
25691         faces, face, faceVertexNormals, normal, faceVertexUvs, uvs,
25692         v1, v2, v3, v4, isFaceMaterial, material, side;
25693
25694         _face3Count = 0;
25695         _face4Count = 0;
25696         _lineCount = 0;
25697         _particleCount = 0;
25698
25699         _renderData.elements.length = 0;
25700
25701         scene.updateMatrixWorld();
25702
25703         if ( camera.parent === undefined ) camera.updateMatrixWorld();
25704
25705         camera.matrixWorldInverse.getInverse( camera.matrixWorld );
25706
25707         _viewProjectionMatrix.multiply( camera.projectionMatrix, camera.matrixWorldInverse );
25708
25709         _frustum.setFromMatrix( _viewProjectionMatrix );
25710
25711         _renderData = projectGraph( scene, sortObjects );
25712
25713         for ( o = 0, ol = _renderData.objects.length; o < ol; o++ ) {
25714
25715             object = _renderData.objects[ o ].object;
25716
25717             modelMatrix = object.matrixWorld;
25718
25719             _vertexCount = 0;
25720
25721             if ( object instanceof THREE.Mesh ) {
25722
25723                 geometry = object.geometry;
25724                 geometryMaterials = object.geometry.materials;
25725                 vertices = geometry.vertices;
25726                 faces = geometry.faces;
25727                 faceVertexUvs = geometry.faceVertexUvs;
25728
25729                 rotationMatrix = object.matrixRotationWorld.extractRotation( modelMatrix );
25730
25731                 isFaceMaterial = object.material instanceof THREE.MeshFaceMaterial;
25732                 side = object.material.side;
25733
25734                 for ( v = 0, vl = vertices.length; v < vl; v ++ ) {
25735
25736                     _vertex = getNextVertexInPool();
25737                     _vertex.positionWorld.copy( vertices[ v ] );
25738
25739                     modelMatrix.multiplyVector3( _vertex.positionWorld );
25740
25741                     _vertex.positionScreen.copy( _vertex.positionWorld );
25742                     _viewProjectionMatrix.multiplyVector4( _vertex.positionScreen );
25743
25744                     _vertex.positionScreen.x /= _vertex.positionScreen.w;
25745                     _vertex.positionScreen.y /= _vertex.positionScreen.w;
25746
25747                     _vertex.visible = _vertex.positionScreen.z > near && _vertex.positionScreen.z < far;
25748
25749                 }
25750
25751                 for ( f = 0, fl = faces.length; f < fl; f ++ ) {
25752
25753                     face = faces[ f ];
25754
25755                     material = isFaceMaterial === true ? geometryMaterials[ face.materialIndex ] : object.material;
25756
25757                     if ( material === undefined ) continue;
25758
25759                     side = material.side;
25760
25761                     if ( face instanceof THREE.Face3 ) {
25762
25763                         v1 = _vertexPool[ face.a ];
25764                         v2 = _vertexPool[ face.b ];
25765                         v3 = _vertexPool[ face.c ];
25766
25767                         if ( v1.visible === true && v2.visible === true && v3.visible === true ) {
25768
25769                             visible = ( ( v3.positionScreen.x - v1.positionScreen.x ) * ( v2.positionScreen.y - v1.positionScreen.y ) -
25770                                 ( v3.positionScreen.y - v1.positionScreen.y ) * ( v2.positionScreen.x - v1.positionScreen.x ) ) < 0;
25771
25772                             if ( side === THREE.DoubleSide || visible === ( side === THREE.FrontSide ) ) {
25773
25774                                 _face = getNextFace3InPool();
25775
25776                                 _face.v1.copy( v1 );
25777                                 _face.v2.copy( v2 );
25778                                 _face.v3.copy( v3 );
25779
25780                             } else {
25781
25782                                 continue;
25783
25784                             }
25785
25786                         } else {
25787
25788                             continue;
25789
25790                         }
25791
25792                     } else if ( face instanceof THREE.Face4 ) {
25793
25794                         v1 = _vertexPool[ face.a ];
25795                         v2 = _vertexPool[ face.b ];
25796                         v3 = _vertexPool[ face.c ];
25797                         v4 = _vertexPool[ face.d ];
25798
25799                         if ( v1.visible === true && v2.visible === true && v3.visible === true && v4.visible === true ) {
25800
25801                             visible = ( v4.positionScreen.x - v1.positionScreen.x ) * ( v2.positionScreen.y - v1.positionScreen.y ) -
25802                                 ( v4.positionScreen.y - v1.positionScreen.y ) * ( v2.positionScreen.x - v1.positionScreen.x ) < 0 ||
25803                                 ( v2.positionScreen.x - v3.positionScreen.x ) * ( v4.positionScreen.y - v3.positionScreen.y ) -
25804                                 ( v2.positionScreen.y - v3.positionScreen.y ) * ( v4.positionScreen.x - v3.positionScreen.x ) < 0;
25805
25806
25807                             if ( side === THREE.DoubleSide || visible === ( side === THREE.FrontSide ) ) {
25808
25809                                 _face = getNextFace4InPool();
25810
25811                                 _face.v1.copy( v1 );
25812                                 _face.v2.copy( v2 );
25813                                 _face.v3.copy( v3 );
25814                                 _face.v4.copy( v4 );
25815
25816                             } else {
25817
25818                                 continue;
25819
25820                             }
25821
25822                         } else {
25823
25824                             continue;
25825
25826                         }
25827
25828                     }
25829
25830                     _face.normalWorld.copy( face.normal );
25831
25832                     if ( visible === false && ( side === THREE.BackSide || side === THREE.DoubleSide ) ) _face.normalWorld.negate();
25833                     rotationMatrix.multiplyVector3( _face.normalWorld );
25834
25835                     _face.centroidWorld.copy( face.centroid );
25836                     modelMatrix.multiplyVector3( _face.centroidWorld );
25837
25838                     _face.centroidScreen.copy( _face.centroidWorld );
25839                     _viewProjectionMatrix.multiplyVector3( _face.centroidScreen );
25840
25841                     faceVertexNormals = face.vertexNormals;
25842
25843                     for ( n = 0, nl = faceVertexNormals.length; n < nl; n ++ ) {
25844
25845                         normal = _face.vertexNormalsWorld[ n ];
25846                         normal.copy( faceVertexNormals[ n ] );
25847
25848                         if ( visible === false && ( side === THREE.BackSide || side === THREE.DoubleSide ) ) normal.negate();
25849
25850                         rotationMatrix.multiplyVector3( normal );
25851
25852                     }
25853
25854                     _face.vertexNormalsLength = faceVertexNormals.length;
25855
25856                     for ( c = 0, cl = faceVertexUvs.length; c < cl; c ++ ) {
25857
25858                         uvs = faceVertexUvs[ c ][ f ];
25859
25860                         if ( uvs === undefined ) continue;
25861
25862                         for ( u = 0, ul = uvs.length; u < ul; u ++ ) {
25863
25864                             _face.uvs[ c ][ u ] = uvs[ u ];
25865
25866                         }
25867
25868                     }
25869
25870                     _face.material = material;
25871
25872                     _face.z = _face.centroidScreen.z;
25873
25874                     _renderData.elements.push( _face );
25875
25876                 }
25877
25878             } else if ( object instanceof THREE.Line ) {
25879
25880                 _modelViewProjectionMatrix.multiply( _viewProjectionMatrix, modelMatrix );
25881
25882                 vertices = object.geometry.vertices;
25883
25884                 v1 = getNextVertexInPool();
25885                 v1.positionScreen.copy( vertices[ 0 ] );
25886                 _modelViewProjectionMatrix.multiplyVector4( v1.positionScreen );
25887
25888                 // Handle LineStrip and LinePieces
25889                 var step = object.type === THREE.LinePieces ? 2 : 1;
25890
25891                 for ( v = 1, vl = vertices.length; v < vl; v ++ ) {
25892
25893                     v1 = getNextVertexInPool();
25894                     v1.positionScreen.copy( vertices[ v ] );
25895                     _modelViewProjectionMatrix.multiplyVector4( v1.positionScreen );
25896
25897                     if ( ( v + 1 ) % step > 0 ) continue;
25898
25899                     v2 = _vertexPool[ _vertexCount - 2 ];
25900
25901                     _clippedVertex1PositionScreen.copy( v1.positionScreen );
25902                     _clippedVertex2PositionScreen.copy( v2.positionScreen );
25903
25904                     if ( clipLine( _clippedVertex1PositionScreen, _clippedVertex2PositionScreen ) === true ) {
25905
25906                         // Perform the perspective divide
25907                         _clippedVertex1PositionScreen.multiplyScalar( 1 / _clippedVertex1PositionScreen.w );
25908                         _clippedVertex2PositionScreen.multiplyScalar( 1 / _clippedVertex2PositionScreen.w );
25909
25910                         _line = getNextLineInPool();
25911                         _line.v1.positionScreen.copy( _clippedVertex1PositionScreen );
25912                         _line.v2.positionScreen.copy( _clippedVertex2PositionScreen );
25913
25914                         _line.z = Math.max( _clippedVertex1PositionScreen.z, _clippedVertex2PositionScreen.z );
25915
25916                         _line.material = object.material;
25917
25918                         _renderData.elements.push( _line );
25919
25920                     }
25921
25922                 }
25923
25924             }
25925
25926         }
25927
25928         for ( o = 0, ol = _renderData.sprites.length; o < ol; o++ ) {
25929
25930             object = _renderData.sprites[ o ].object;
25931
25932             modelMatrix = object.matrixWorld;
25933
25934             if ( object instanceof THREE.Particle ) {
25935
25936                 _vector4.set( modelMatrix.elements[12], modelMatrix.elements[13], modelMatrix.elements[14], 1 );
25937                 _viewProjectionMatrix.multiplyVector4( _vector4 );
25938
25939                 _vector4.z /= _vector4.w;
25940
25941                 if ( _vector4.z > 0 && _vector4.z < 1 ) {
25942
25943                     _particle = getNextParticleInPool();
25944                     _particle.object = object;
25945                     _particle.x = _vector4.x / _vector4.w;
25946                     _particle.y = _vector4.y / _vector4.w;
25947                     _particle.z = _vector4.z;
25948
25949                     _particle.rotation = object.rotation.z;
25950
25951                     _particle.scale.x = object.scale.x * Math.abs( _particle.x - ( _vector4.x + camera.projectionMatrix.elements[0] ) / ( _vector4.w + camera.projectionMatrix.elements[12] ) );
25952                     _particle.scale.y = object.scale.y * Math.abs( _particle.y - ( _vector4.y + camera.projectionMatrix.elements[5] ) / ( _vector4.w + camera.projectionMatrix.elements[13] ) );
25953
25954                     _particle.material = object.material;
25955
25956                     _renderData.elements.push( _particle );
25957
25958                 }
25959
25960             }
25961
25962         }
25963
25964         if ( sortElements === true ) _renderData.elements.sort( painterSort );
25965
25966         return _renderData;
25967
25968     };
25969
25970     // Pools
25971
25972     function getNextObjectInPool() {
25973
25974         if ( _objectCount === _objectPoolLength ) {
25975
25976             var object = new THREE.RenderableObject();
25977             _objectPool.push( object );
25978             _objectPoolLength ++;
25979             _objectCount ++;
25980             return object;
25981
25982         }
25983
25984         return _objectPool[ _objectCount ++ ];
25985
25986     }
25987
25988     function getNextVertexInPool() {
25989
25990         if ( _vertexCount === _vertexPoolLength ) {
25991
25992             var vertex = new THREE.RenderableVertex();
25993             _vertexPool.push( vertex );
25994             _vertexPoolLength ++;
25995             _vertexCount ++;
25996             return vertex;
25997
25998         }
25999
26000         return _vertexPool[ _vertexCount ++ ];
26001
26002     }
26003
26004     function getNextFace3InPool() {
26005
26006         if ( _face3Count === _face3PoolLength ) {
26007
26008             var face = new THREE.RenderableFace3();
26009             _face3Pool.push( face );
26010             _face3PoolLength ++;
26011             _face3Count ++;
26012             return face;
26013
26014         }
26015
26016         return _face3Pool[ _face3Count ++ ];
26017
26018
26019     }
26020
26021     function getNextFace4InPool() {
26022
26023         if ( _face4Count === _face4PoolLength ) {
26024
26025             var face = new THREE.RenderableFace4();
26026             _face4Pool.push( face );
26027             _face4PoolLength ++;
26028             _face4Count ++;
26029             return face;
26030
26031         }
26032
26033         return _face4Pool[ _face4Count ++ ];
26034
26035     }
26036
26037     function getNextLineInPool() {
26038
26039         if ( _lineCount === _linePoolLength ) {
26040
26041             var line = new THREE.RenderableLine();
26042             _linePool.push( line );
26043             _linePoolLength ++;
26044             _lineCount ++
26045             return line;
26046
26047         }
26048
26049         return _linePool[ _lineCount ++ ];
26050
26051     }
26052
26053     function getNextParticleInPool() {
26054
26055         if ( _particleCount === _particlePoolLength ) {
26056
26057             var particle = new THREE.RenderableParticle();
26058             _particlePool.push( particle );
26059             _particlePoolLength ++;
26060             _particleCount ++
26061             return particle;
26062
26063         }
26064
26065         return _particlePool[ _particleCount ++ ];
26066
26067     }
26068
26069     //
26070
26071     function painterSort( a, b ) {
26072
26073         return b.z - a.z;
26074
26075     }
26076
26077     function clipLine( s1, s2 ) {
26078
26079         var alpha1 = 0, alpha2 = 1,
26080
26081         // Calculate the boundary coordinate of each vertex for the near and far clip planes,
26082         // Z = -1 and Z = +1, respectively.
26083         bc1near =  s1.z + s1.w,
26084         bc2near =  s2.z + s2.w,
26085         bc1far =  - s1.z + s1.w,
26086         bc2far =  - s2.z + s2.w;
26087
26088         if ( bc1near >= 0 && bc2near >= 0 && bc1far >= 0 && bc2far >= 0 ) {
26089
26090             // Both vertices lie entirely within all clip planes.
26091             return true;
26092
26093         } else if ( ( bc1near < 0 && bc2near < 0) || (bc1far < 0 && bc2far < 0 ) ) {
26094
26095             // Both vertices lie entirely outside one of the clip planes.
26096             return false;
26097
26098         } else {
26099
26100             // The line segment spans at least one clip plane.
26101
26102             if ( bc1near < 0 ) {
26103
26104                 // v1 lies outside the near plane, v2 inside
26105                 alpha1 = Math.max( alpha1, bc1near / ( bc1near - bc2near ) );
26106
26107             } else if ( bc2near < 0 ) {
26108
26109                 // v2 lies outside the near plane, v1 inside
26110                 alpha2 = Math.min( alpha2, bc1near / ( bc1near - bc2near ) );
26111
26112             }
26113
26114             if ( bc1far < 0 ) {
26115
26116                 // v1 lies outside the far plane, v2 inside
26117                 alpha1 = Math.max( alpha1, bc1far / ( bc1far - bc2far ) );
26118
26119             } else if ( bc2far < 0 ) {
26120
26121                 // v2 lies outside the far plane, v2 inside
26122                 alpha2 = Math.min( alpha2, bc1far / ( bc1far - bc2far ) );
26123
26124             }
26125
26126             if ( alpha2 < alpha1 ) {
26127
26128                 // The line segment spans two boundaries, but is outside both of them.
26129                 // (This can't happen when we're only clipping against just near/far but good
26130                 //  to leave the check here for future usage if other clip planes are added.)
26131                 return false;
26132
26133             } else {
26134
26135                 // Update the s1 and s2 vertices to match the clipped line segment.
26136                 s1.lerpSelf( s2, alpha1 );
26137                 s2.lerpSelf( s1, 1 - alpha2 );
26138
26139                 return true;
26140
26141             }
26142
26143         }
26144
26145     }
26146
26147 };
26148 /**
26149  * @author mikael emtinger / http://gomo.se/
26150  * @author alteredq / http://alteredqualia.com/
26151  * @author WestLangley / http://github.com/WestLangley
26152  */
26153
26154 THREE.Quaternion = function( x, y, z, w ) {
26155
26156     this.x = x || 0;
26157     this.y = y || 0;
26158     this.z = z || 0;
26159     this.w = ( w !== undefined ) ? w : 1;
26160
26161 };
26162
26163 THREE.Quaternion.prototype = {
26164
26165     constructor: THREE.Quaternion,
26166
26167     set: function ( x, y, z, w ) {
26168
26169         this.x = x;
26170         this.y = y;
26171         this.z = z;
26172         this.w = w;
26173
26174         return this;
26175
26176     },
26177
26178     copy: function ( q ) {
26179
26180         this.x = q.x;
26181         this.y = q.y;
26182         this.z = q.z;
26183         this.w = q.w;
26184
26185         return this;
26186
26187     },
26188
26189     setFromEuler: function ( v, order ) {
26190
26191         // http://www.mathworks.com/matlabcentral/fileexchange/
26192         //     20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/
26193         //    content/SpinCalc.m
26194
26195         var c1 = Math.cos( v.x / 2 );
26196         var c2 = Math.cos( v.y / 2 );
26197         var c3 = Math.cos( v.z / 2 );
26198         var s1 = Math.sin( v.x / 2 );
26199         var s2 = Math.sin( v.y / 2 );
26200         var s3 = Math.sin( v.z / 2 );
26201
26202         if ( order === undefined || order === 'XYZ' ) {
26203
26204             this.x = s1 * c2 * c3 + c1 * s2 * s3;
26205             this.y = c1 * s2 * c3 - s1 * c2 * s3;
26206             this.z = c1 * c2 * s3 + s1 * s2 * c3;
26207             this.w = c1 * c2 * c3 - s1 * s2 * s3;
26208
26209         } else if ( order === 'YXZ' ) {
26210
26211             this.x = s1 * c2 * c3 + c1 * s2 * s3;
26212             this.y = c1 * s2 * c3 - s1 * c2 * s3;
26213             this.z = c1 * c2 * s3 - s1 * s2 * c3;
26214             this.w = c1 * c2 * c3 + s1 * s2 * s3;
26215
26216         } else if ( order === 'ZXY' ) {
26217
26218             this.x = s1 * c2 * c3 - c1 * s2 * s3;
26219             this.y = c1 * s2 * c3 + s1 * c2 * s3;
26220             this.z = c1 * c2 * s3 + s1 * s2 * c3;
26221             this.w = c1 * c2 * c3 - s1 * s2 * s3;
26222
26223         } else if ( order === 'ZYX' ) {
26224
26225             this.x = s1 * c2 * c3 - c1 * s2 * s3;
26226             this.y = c1 * s2 * c3 + s1 * c2 * s3;
26227             this.z = c1 * c2 * s3 - s1 * s2 * c3;
26228             this.w = c1 * c2 * c3 + s1 * s2 * s3;
26229
26230         } else if ( order === 'YZX' ) {
26231
26232             this.x = s1 * c2 * c3 + c1 * s2 * s3;
26233             this.y = c1 * s2 * c3 + s1 * c2 * s3;
26234             this.z = c1 * c2 * s3 - s1 * s2 * c3;
26235             this.w = c1 * c2 * c3 - s1 * s2 * s3;
26236
26237         } else if ( order === 'XZY' ) {
26238
26239             this.x = s1 * c2 * c3 - c1 * s2 * s3;
26240             this.y = c1 * s2 * c3 - s1 * c2 * s3;
26241             this.z = c1 * c2 * s3 + s1 * s2 * c3;
26242             this.w = c1 * c2 * c3 + s1 * s2 * s3;
26243
26244         }
26245
26246         return this;
26247
26248     },
26249
26250     setFromAxisAngle: function ( axis, angle ) {
26251
26252         // from http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm
26253         // axis have to be normalized
26254
26255         var halfAngle = angle / 2,
26256             s = Math.sin( halfAngle );
26257
26258         this.x = axis.x * s;
26259         this.y = axis.y * s;
26260         this.z = axis.z * s;
26261         this.w = Math.cos( halfAngle );
26262
26263         return this;
26264
26265     },
26266
26267     setFromRotationMatrix: function ( m ) {
26268
26269         // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm
26270
26271         // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
26272
26273         var te = m.elements,
26274
26275             m11 = te[0], m12 = te[4], m13 = te[8],
26276             m21 = te[1], m22 = te[5], m23 = te[9],
26277             m31 = te[2], m32 = te[6], m33 = te[10],
26278
26279             trace = m11 + m22 + m33,
26280             s;
26281
26282         if( trace > 0 ) {
26283
26284             s = 0.5 / Math.sqrt( trace + 1.0 );
26285
26286             this.w = 0.25 / s;
26287             this.x = ( m32 - m23 ) * s;
26288             this.y = ( m13 - m31 ) * s;
26289             this.z = ( m21 - m12 ) * s;
26290
26291         } else if ( m11 > m22 && m11 > m33 ) {
26292
26293             s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );
26294
26295             this.w = (m32 - m23 ) / s;
26296             this.x = 0.25 * s;
26297             this.y = (m12 + m21 ) / s;
26298             this.z = (m13 + m31 ) / s;
26299
26300         } else if (m22 > m33) {
26301
26302             s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );
26303
26304             this.w = (m13 - m31 ) / s;
26305             this.x = (m12 + m21 ) / s;
26306             this.y = 0.25 * s;
26307             this.z = (m23 + m32 ) / s;
26308
26309         } else {
26310
26311             s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );
26312
26313             this.w = ( m21 - m12 ) / s;
26314             this.x = ( m13 + m31 ) / s;
26315             this.y = ( m23 + m32 ) / s;
26316             this.z = 0.25 * s;
26317
26318         }
26319
26320         return this;
26321
26322     },
26323
26324     calculateW : function () {
26325
26326         this.w = - Math.sqrt( Math.abs( 1.0 - this.x * this.x - this.y * this.y - this.z * this.z ) );
26327
26328         return this;
26329
26330     },
26331
26332     inverse: function () {
26333
26334         this.x *= -1;
26335         this.y *= -1;
26336         this.z *= -1;
26337
26338         return this;
26339
26340     },
26341
26342     length: function () {
26343
26344         return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );
26345
26346     },
26347
26348     normalize: function () {
26349
26350         var l = Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );
26351
26352         if ( l === 0 ) {
26353
26354             this.x = 0;
26355             this.y = 0;
26356             this.z = 0;
26357             this.w = 0;
26358
26359         } else {
26360
26361             l = 1 / l;
26362
26363             this.x = this.x * l;
26364             this.y = this.y * l;
26365             this.z = this.z * l;
26366             this.w = this.w * l;
26367
26368         }
26369
26370         return this;
26371
26372     },
26373
26374     multiply: function ( a, b ) {
26375
26376         // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm
26377         var qax = a.x, qay = a.y, qaz = a.z, qaw = a.w,
26378         qbx = b.x, qby = b.y, qbz = b.z, qbw = b.w;
26379
26380         this.x =  qax * qbw + qay * qbz - qaz * qby + qaw * qbx;
26381         this.y = -qax * qbz + qay * qbw + qaz * qbx + qaw * qby;
26382         this.z =  qax * qby - qay * qbx + qaz * qbw + qaw * qbz;
26383         this.w = -qax * qbx - qay * qby - qaz * qbz + qaw * qbw;
26384
26385         return this;
26386
26387     },
26388
26389     multiplySelf: function ( b ) {
26390
26391         var qax = this.x, qay = this.y, qaz = this.z, qaw = this.w,
26392         qbx = b.x, qby = b.y, qbz = b.z, qbw = b.w;
26393
26394         this.x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;
26395         this.y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;
26396         this.z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;
26397         this.w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;
26398
26399         return this;
26400
26401     },
26402
26403     multiplyVector3: function ( vector, dest ) {
26404
26405         if ( !dest ) { dest = vector; }
26406
26407         var x    = vector.x,  y  = vector.y,  z  = vector.z,
26408             qx   = this.x, qy = this.y, qz = this.z, qw = this.w;
26409
26410         // calculate quat * vector
26411
26412         var ix =  qw * x + qy * z - qz * y,
26413             iy =  qw * y + qz * x - qx * z,
26414             iz =  qw * z + qx * y - qy * x,
26415             iw = -qx * x - qy * y - qz * z;
26416
26417         // calculate result * inverse quat
26418
26419         dest.x = ix * qw + iw * -qx + iy * -qz - iz * -qy;
26420         dest.y = iy * qw + iw * -qy + iz * -qx - ix * -qz;
26421         dest.z = iz * qw + iw * -qz + ix * -qy - iy * -qx;
26422
26423         return dest;
26424
26425     },
26426
26427     slerpSelf: function ( qb, t ) {
26428
26429         var x = this.x, y = this.y, z = this.z, w = this.w;
26430
26431         // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/
26432
26433         var cosHalfTheta = w * qb.w + x * qb.x + y * qb.y + z * qb.z;
26434
26435         if ( cosHalfTheta < 0 ) {
26436
26437             this.w = -qb.w;
26438             this.x = -qb.x;
26439             this.y = -qb.y;
26440             this.z = -qb.z;
26441
26442             cosHalfTheta = -cosHalfTheta;
26443
26444         } else {
26445
26446             this.copy( qb );
26447
26448         }
26449
26450         if ( cosHalfTheta >= 1.0 ) {
26451
26452             this.w = w;
26453             this.x = x;
26454             this.y = y;
26455             this.z = z;
26456
26457             return this;
26458
26459         }
26460
26461         var halfTheta = Math.acos( cosHalfTheta );
26462         var sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );
26463
26464         if ( Math.abs( sinHalfTheta ) < 0.001 ) {
26465
26466             this.w = 0.5 * ( w + this.w );
26467             this.x = 0.5 * ( x + this.x );
26468             this.y = 0.5 * ( y + this.y );
26469             this.z = 0.5 * ( z + this.z );
26470
26471             return this;
26472
26473         }
26474
26475         var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,
26476         ratioB = Math.sin( t * halfTheta ) / sinHalfTheta;
26477
26478         this.w = ( w * ratioA + this.w * ratioB );
26479         this.x = ( x * ratioA + this.x * ratioB );
26480         this.y = ( y * ratioA + this.y * ratioB );
26481         this.z = ( z * ratioA + this.z * ratioB );
26482
26483         return this;
26484
26485     },
26486
26487     clone: function () {
26488
26489         return new THREE.Quaternion( this.x, this.y, this.z, this.w );
26490
26491     }
26492
26493 }
26494
26495 THREE.Quaternion.slerp = function ( qa, qb, qm, t ) {
26496
26497     // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/
26498
26499     var cosHalfTheta = qa.w * qb.w + qa.x * qb.x + qa.y * qb.y + qa.z * qb.z;
26500
26501     if ( cosHalfTheta < 0 ) {
26502
26503         qm.w = -qb.w;
26504         qm.x = -qb.x;
26505         qm.y = -qb.y;
26506         qm.z = -qb.z;
26507
26508         cosHalfTheta = -cosHalfTheta;
26509
26510     } else {
26511
26512         qm.copy( qb );
26513
26514     }
26515
26516     if ( Math.abs( cosHalfTheta ) >= 1.0 ) {
26517
26518         qm.w = qa.w;
26519         qm.x = qa.x;
26520         qm.y = qa.y;
26521         qm.z = qa.z;
26522
26523         return qm;
26524
26525     }
26526
26527     var halfTheta = Math.acos( cosHalfTheta );
26528     var sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );
26529
26530     if ( Math.abs( sinHalfTheta ) < 0.001 ) {
26531
26532         qm.w = 0.5 * ( qa.w + qm.w );
26533         qm.x = 0.5 * ( qa.x + qm.x );
26534         qm.y = 0.5 * ( qa.y + qm.y );
26535         qm.z = 0.5 * ( qa.z + qm.z );
26536
26537         return qm;
26538
26539     }
26540
26541     var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta;
26542     var ratioB = Math.sin( t * halfTheta ) / sinHalfTheta;
26543
26544     qm.w = ( qa.w * ratioA + qm.w * ratioB );
26545     qm.x = ( qa.x * ratioA + qm.x * ratioB );
26546     qm.y = ( qa.y * ratioA + qm.y * ratioB );
26547     qm.z = ( qa.z * ratioA + qm.z * ratioB );
26548
26549     return qm;
26550
26551 }
26552 /**
26553  * @author mrdoob / http://mrdoob.com/
26554  */
26555
26556 THREE.Vertex = function ( v ) {
26557
26558     console.warn( 'THREE.Vertex has been DEPRECATED. Use THREE.Vector3 instead.')
26559     return v;
26560
26561 };
26562 /**
26563  * @author mrdoob / http://mrdoob.com/
26564  * @author alteredq / http://alteredqualia.com/
26565  */
26566
26567 THREE.Face3 = function ( a, b, c, normal, color, materialIndex ) {
26568
26569     this.a = a;
26570     this.b = b;
26571     this.c = c;
26572
26573     this.normal = normal instanceof THREE.Vector3 ? normal : new THREE.Vector3();
26574     this.vertexNormals = normal instanceof Array ? normal : [ ];
26575
26576     this.color = color instanceof THREE.Color ? color : new THREE.Color();
26577     this.vertexColors = color instanceof Array ? color : [];
26578
26579     this.vertexTangents = [];
26580
26581     this.materialIndex = materialIndex;
26582
26583     this.centroid = new THREE.Vector3();
26584
26585 };
26586
26587 THREE.Face3.prototype = {
26588
26589     constructor: THREE.Face3,
26590
26591     clone: function () {
26592
26593         var face = new THREE.Face3( this.a, this.b, this.c );
26594
26595         face.normal.copy( this.normal );
26596         face.color.copy( this.color );
26597         face.centroid.copy( this.centroid );
26598
26599         face.materialIndex = this.materialIndex;
26600
26601         var i, il;
26602         for ( i = 0, il = this.vertexNormals.length; i < il; i ++ ) face.vertexNormals[ i ] = this.vertexNormals[ i ].clone();
26603         for ( i = 0, il = this.vertexColors.length; i < il; i ++ ) face.vertexColors[ i ] = this.vertexColors[ i ].clone();
26604         for ( i = 0, il = this.vertexTangents.length; i < il; i ++ ) face.vertexTangents[ i ] = this.vertexTangents[ i ].clone();
26605
26606         return face;
26607
26608     }
26609
26610 };
26611 /**
26612  * @author mrdoob / http://mrdoob.com/
26613  * @author alteredq / http://alteredqualia.com/
26614  */
26615
26616 THREE.Face4 = function ( a, b, c, d, normal, color, materialIndex ) {
26617
26618     this.a = a;
26619     this.b = b;
26620     this.c = c;
26621     this.d = d;
26622
26623     this.normal = normal instanceof THREE.Vector3 ? normal : new THREE.Vector3();
26624     this.vertexNormals = normal instanceof Array ? normal : [ ];
26625
26626     this.color = color instanceof THREE.Color ? color : new THREE.Color();
26627     this.vertexColors = color instanceof Array ? color : [];
26628
26629     this.vertexTangents = [];
26630
26631     this.materialIndex = materialIndex;
26632
26633     this.centroid = new THREE.Vector3();
26634
26635 };
26636
26637 THREE.Face4.prototype = {
26638
26639     constructor: THREE.Face4,
26640
26641     clone: function () {
26642
26643         var face = new THREE.Face4( this.a, this.b, this.c, this.d );
26644
26645         face.normal.copy( this.normal );
26646         face.color.copy( this.color );
26647         face.centroid.copy( this.centroid );
26648
26649         face.materialIndex = this.materialIndex;
26650
26651         var i, il;
26652         for ( i = 0, il = this.vertexNormals.length; i < il; i ++ ) face.vertexNormals[ i ] = this.vertexNormals[ i ].clone();
26653         for ( i = 0, il = this.vertexColors.length; i < il; i ++ ) face.vertexColors[ i ] = this.vertexColors[ i ].clone();
26654         for ( i = 0, il = this.vertexTangents.length; i < il; i ++ ) face.vertexTangents[ i ] = this.vertexTangents[ i ].clone();
26655
26656         return face;
26657
26658     }
26659
26660 };
26661 /**
26662  * @author mrdoob / http://mrdoob.com/
26663  */
26664
26665 THREE.UV = function ( u, v ) {
26666
26667     this.u = u || 0;
26668     this.v = v || 0;
26669
26670 };
26671
26672 THREE.UV.prototype = {
26673
26674     constructor: THREE.UV,
26675
26676     set: function ( u, v ) {
26677
26678         this.u = u;
26679         this.v = v;
26680
26681         return this;
26682
26683     },
26684
26685     copy: function ( uv ) {
26686
26687         this.u = uv.u;
26688         this.v = uv.v;
26689
26690         return this;
26691
26692     },
26693
26694     lerpSelf: function ( uv, alpha ) {
26695
26696         this.u += ( uv.u - this.u ) * alpha;
26697         this.v += ( uv.v - this.v ) * alpha;
26698
26699         return this;
26700
26701     },
26702
26703     clone: function () {
26704
26705         return new THREE.UV( this.u, this.v );
26706
26707     }
26708
26709 };
26710 /**
26711  * @author mrdoob / http://mrdoob.com/
26712  * @author kile / http://kile.stravaganza.org/
26713  * @author alteredq / http://alteredqualia.com/
26714  * @author mikael emtinger / http://gomo.se/
26715  * @author zz85 / http://www.lab4games.net/zz85/blog
26716  */
26717
26718 THREE.Geometry = function () {
26719
26720     this.id = THREE.GeometryCount ++;
26721
26722     this.name = '';
26723
26724     this.vertices = [];
26725     this.colors = []; // one-to-one vertex colors, used in ParticleSystem, Line and Ribbon
26726
26727     this.materials = [];
26728
26729     this.faces = [];
26730
26731     this.faceUvs = [[]];
26732     this.faceVertexUvs = [[]];
26733
26734     this.morphTargets = [];
26735     this.morphColors = [];
26736     this.morphNormals = [];
26737
26738     this.skinWeights = [];
26739     this.skinIndices = [];
26740
26741     this.boundingBox = null;
26742     this.boundingSphere = null;
26743
26744     this.hasTangents = false;
26745
26746     this.dynamic = true; // the intermediate typearrays will be deleted when set to false
26747
26748 };
26749
26750 THREE.Geometry.prototype = {
26751
26752     constructor : THREE.Geometry,
26753
26754     applyMatrix: function ( matrix ) {
26755
26756         var matrixRotation = new THREE.Matrix4();
26757         matrixRotation.extractRotation( matrix );
26758
26759         for ( var i = 0, il = this.vertices.length; i < il; i ++ ) {
26760
26761             var vertex = this.vertices[ i ];
26762
26763             matrix.multiplyVector3( vertex );
26764
26765         }
26766
26767         for ( var i = 0, il = this.faces.length; i < il; i ++ ) {
26768
26769             var face = this.faces[ i ];
26770
26771             matrixRotation.multiplyVector3( face.normal );
26772
26773             for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {
26774
26775                 matrixRotation.multiplyVector3( face.vertexNormals[ j ] );
26776
26777             }
26778
26779             matrix.multiplyVector3( face.centroid );
26780
26781         }
26782
26783     },
26784
26785     computeCentroids: function () {
26786
26787         var f, fl, face;
26788
26789         for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
26790
26791             face = this.faces[ f ];
26792             face.centroid.set( 0, 0, 0 );
26793
26794             if ( face instanceof THREE.Face3 ) {
26795
26796                 face.centroid.addSelf( this.vertices[ face.a ] );
26797                 face.centroid.addSelf( this.vertices[ face.b ] );
26798                 face.centroid.addSelf( this.vertices[ face.c ] );
26799                 face.centroid.divideScalar( 3 );
26800
26801             } else if ( face instanceof THREE.Face4 ) {
26802
26803                 face.centroid.addSelf( this.vertices[ face.a ] );
26804                 face.centroid.addSelf( this.vertices[ face.b ] );
26805                 face.centroid.addSelf( this.vertices[ face.c ] );
26806                 face.centroid.addSelf( this.vertices[ face.d ] );
26807                 face.centroid.divideScalar( 4 );
26808
26809             }
26810
26811         }
26812
26813     },
26814
26815     computeFaceNormals: function () {
26816
26817         var n, nl, v, vl, vertex, f, fl, face, vA, vB, vC,
26818         cb = new THREE.Vector3(), ab = new THREE.Vector3();
26819
26820         for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
26821
26822             face = this.faces[ f ];
26823
26824             vA = this.vertices[ face.a ];
26825             vB = this.vertices[ face.b ];
26826             vC = this.vertices[ face.c ];
26827
26828             cb.sub( vC, vB );
26829             ab.sub( vA, vB );
26830             cb.crossSelf( ab );
26831
26832             if ( !cb.isZero() ) {
26833
26834                 cb.normalize();
26835
26836             }
26837
26838             face.normal.copy( cb );
26839
26840         }
26841
26842     },
26843
26844     computeVertexNormals: function () {
26845
26846         var v, vl, f, fl, face, vertices;
26847
26848         // create internal buffers for reuse when calling this method repeatedly
26849         // (otherwise memory allocation / deallocation every frame is big resource hog)
26850
26851         if ( this.__tmpVertices === undefined ) {
26852
26853             this.__tmpVertices = new Array( this.vertices.length );
26854             vertices = this.__tmpVertices;
26855
26856             for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {
26857
26858                 vertices[ v ] = new THREE.Vector3();
26859
26860             }
26861
26862             for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
26863
26864                 face = this.faces[ f ];
26865
26866                 if ( face instanceof THREE.Face3 ) {
26867
26868                     face.vertexNormals = [ new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3() ];
26869
26870                 } else if ( face instanceof THREE.Face4 ) {
26871
26872                     face.vertexNormals = [ new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3() ];
26873
26874                 }
26875
26876             }
26877
26878         } else {
26879
26880             vertices = this.__tmpVertices;
26881
26882             for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {
26883
26884                 vertices[ v ].set( 0, 0, 0 );
26885
26886             }
26887
26888         }
26889
26890         for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
26891
26892             face = this.faces[ f ];
26893
26894             if ( face instanceof THREE.Face3 ) {
26895
26896                 vertices[ face.a ].addSelf( face.normal );
26897                 vertices[ face.b ].addSelf( face.normal );
26898                 vertices[ face.c ].addSelf( face.normal );
26899
26900             } else if ( face instanceof THREE.Face4 ) {
26901
26902                 vertices[ face.a ].addSelf( face.normal );
26903                 vertices[ face.b ].addSelf( face.normal );
26904                 vertices[ face.c ].addSelf( face.normal );
26905                 vertices[ face.d ].addSelf( face.normal );
26906
26907             }
26908
26909         }
26910
26911         for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {
26912
26913             vertices[ v ].normalize();
26914
26915         }
26916
26917         for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
26918
26919             face = this.faces[ f ];
26920
26921             if ( face instanceof THREE.Face3 ) {
26922
26923                 face.vertexNormals[ 0 ].copy( vertices[ face.a ] );
26924                 face.vertexNormals[ 1 ].copy( vertices[ face.b ] );
26925                 face.vertexNormals[ 2 ].copy( vertices[ face.c ] );
26926
26927             } else if ( face instanceof THREE.Face4 ) {
26928
26929                 face.vertexNormals[ 0 ].copy( vertices[ face.a ] );
26930                 face.vertexNormals[ 1 ].copy( vertices[ face.b ] );
26931                 face.vertexNormals[ 2 ].copy( vertices[ face.c ] );
26932                 face.vertexNormals[ 3 ].copy( vertices[ face.d ] );
26933
26934             }
26935
26936         }
26937
26938     },
26939
26940     computeMorphNormals: function () {
26941
26942         var i, il, f, fl, face;
26943
26944         // save original normals
26945         // - create temp variables on first access
26946         //   otherwise just copy (for faster repeated calls)
26947
26948         for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
26949
26950             face = this.faces[ f ];
26951
26952             if ( ! face.__originalFaceNormal ) {
26953
26954                 face.__originalFaceNormal = face.normal.clone();
26955
26956             } else {
26957
26958                 face.__originalFaceNormal.copy( face.normal );
26959
26960             }
26961
26962             if ( ! face.__originalVertexNormals ) face.__originalVertexNormals = [];
26963
26964             for ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) {
26965
26966                 if ( ! face.__originalVertexNormals[ i ] ) {
26967
26968                     face.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone();
26969
26970                 } else {
26971
26972                     face.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] );
26973
26974                 }
26975
26976             }
26977
26978         }
26979
26980         // use temp geometry to compute face and vertex normals for each morph
26981
26982         var tmpGeo = new THREE.Geometry();
26983         tmpGeo.faces = this.faces;
26984
26985         for ( i = 0, il = this.morphTargets.length; i < il; i ++ ) {
26986
26987             // create on first access
26988
26989             if ( ! this.morphNormals[ i ] ) {
26990
26991                 this.morphNormals[ i ] = {};
26992                 this.morphNormals[ i ].faceNormals = [];
26993                 this.morphNormals[ i ].vertexNormals = [];
26994
26995                 var dstNormalsFace = this.morphNormals[ i ].faceNormals;
26996                 var dstNormalsVertex = this.morphNormals[ i ].vertexNormals;
26997
26998                 var faceNormal, vertexNormals;
26999
27000                 for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
27001
27002                     face = this.faces[ f ];
27003
27004                     faceNormal = new THREE.Vector3();
27005
27006                     if ( face instanceof THREE.Face3 ) {
27007
27008                         vertexNormals = { a: new THREE.Vector3(), b: new THREE.Vector3(), c: new THREE.Vector3() };
27009
27010                     } else {
27011
27012                         vertexNormals = { a: new THREE.Vector3(), b: new THREE.Vector3(), c: new THREE.Vector3(), d: new THREE.Vector3() };
27013
27014                     }
27015
27016                     dstNormalsFace.push( faceNormal );
27017                     dstNormalsVertex.push( vertexNormals );
27018
27019                 }
27020
27021             }
27022
27023             var morphNormals = this.morphNormals[ i ];
27024
27025             // set vertices to morph target
27026
27027             tmpGeo.vertices = this.morphTargets[ i ].vertices;
27028
27029             // compute morph normals
27030
27031             tmpGeo.computeFaceNormals();
27032             tmpGeo.computeVertexNormals();
27033
27034             // store morph normals
27035
27036             var faceNormal, vertexNormals;
27037
27038             for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
27039
27040                 face = this.faces[ f ];
27041
27042                 faceNormal = morphNormals.faceNormals[ f ];
27043                 vertexNormals = morphNormals.vertexNormals[ f ];
27044
27045                 faceNormal.copy( face.normal );
27046
27047                 if ( face instanceof THREE.Face3 ) {
27048
27049                     vertexNormals.a.copy( face.vertexNormals[ 0 ] );
27050                     vertexNormals.b.copy( face.vertexNormals[ 1 ] );
27051                     vertexNormals.c.copy( face.vertexNormals[ 2 ] );
27052
27053                 } else {
27054
27055                     vertexNormals.a.copy( face.vertexNormals[ 0 ] );
27056                     vertexNormals.b.copy( face.vertexNormals[ 1 ] );
27057                     vertexNormals.c.copy( face.vertexNormals[ 2 ] );
27058                     vertexNormals.d.copy( face.vertexNormals[ 3 ] );
27059
27060                 }
27061
27062             }
27063
27064         }
27065
27066         // restore original normals
27067
27068         for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
27069
27070             face = this.faces[ f ];
27071
27072             face.normal = face.__originalFaceNormal;
27073             face.vertexNormals = face.__originalVertexNormals;
27074
27075         }
27076
27077     },
27078
27079     computeTangents: function () {
27080
27081         // based on http://www.terathon.com/code/tangent.html
27082         // tangents go to vertices
27083
27084         var f, fl, v, vl, i, il, vertexIndex,
27085             face, uv, vA, vB, vC, uvA, uvB, uvC,
27086             x1, x2, y1, y2, z1, z2,
27087             s1, s2, t1, t2, r, t, test,
27088             tan1 = [], tan2 = [],
27089             sdir = new THREE.Vector3(), tdir = new THREE.Vector3(),
27090             tmp = new THREE.Vector3(), tmp2 = new THREE.Vector3(),
27091             n = new THREE.Vector3(), w;
27092
27093         for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {
27094
27095             tan1[ v ] = new THREE.Vector3();
27096             tan2[ v ] = new THREE.Vector3();
27097
27098         }
27099
27100         function handleTriangle( context, a, b, c, ua, ub, uc ) {
27101
27102             vA = context.vertices[ a ];
27103             vB = context.vertices[ b ];
27104             vC = context.vertices[ c ];
27105
27106             uvA = uv[ ua ];
27107             uvB = uv[ ub ];
27108             uvC = uv[ uc ];
27109
27110             x1 = vB.x - vA.x;
27111             x2 = vC.x - vA.x;
27112             y1 = vB.y - vA.y;
27113             y2 = vC.y - vA.y;
27114             z1 = vB.z - vA.z;
27115             z2 = vC.z - vA.z;
27116
27117             s1 = uvB.u - uvA.u;
27118             s2 = uvC.u - uvA.u;
27119             t1 = uvB.v - uvA.v;
27120             t2 = uvC.v - uvA.v;
27121
27122             r = 1.0 / ( s1 * t2 - s2 * t1 );
27123             sdir.set( ( t2 * x1 - t1 * x2 ) * r,
27124                       ( t2 * y1 - t1 * y2 ) * r,
27125                       ( t2 * z1 - t1 * z2 ) * r );
27126             tdir.set( ( s1 * x2 - s2 * x1 ) * r,
27127                       ( s1 * y2 - s2 * y1 ) * r,
27128                       ( s1 * z2 - s2 * z1 ) * r );
27129
27130             tan1[ a ].addSelf( sdir );
27131             tan1[ b ].addSelf( sdir );
27132             tan1[ c ].addSelf( sdir );
27133
27134             tan2[ a ].addSelf( tdir );
27135             tan2[ b ].addSelf( tdir );
27136             tan2[ c ].addSelf( tdir );
27137
27138         }
27139
27140         for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
27141
27142             face = this.faces[ f ];
27143             uv = this.faceVertexUvs[ 0 ][ f ]; // use UV layer 0 for tangents
27144
27145             if ( face instanceof THREE.Face3 ) {
27146
27147                 handleTriangle( this, face.a, face.b, face.c, 0, 1, 2 );
27148
27149             } else if ( face instanceof THREE.Face4 ) {
27150
27151                 handleTriangle( this, face.a, face.b, face.d, 0, 1, 3 );
27152                 handleTriangle( this, face.b, face.c, face.d, 1, 2, 3 );
27153
27154             }
27155
27156         }
27157
27158         var faceIndex = [ 'a', 'b', 'c', 'd' ];
27159
27160         for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
27161
27162             face = this.faces[ f ];
27163
27164             for ( i = 0; i < face.vertexNormals.length; i++ ) {
27165
27166                 n.copy( face.vertexNormals[ i ] );
27167
27168                 vertexIndex = face[ faceIndex[ i ] ];
27169
27170                 t = tan1[ vertexIndex ];
27171
27172                 // Gram-Schmidt orthogonalize
27173
27174                 tmp.copy( t );
27175                 tmp.subSelf( n.multiplyScalar( n.dot( t ) ) ).normalize();
27176
27177                 // Calculate handedness
27178
27179                 tmp2.cross( face.vertexNormals[ i ], t );
27180                 test = tmp2.dot( tan2[ vertexIndex ] );
27181                 w = (test < 0.0) ? -1.0 : 1.0;
27182
27183                 face.vertexTangents[ i ] = new THREE.Vector4( tmp.x, tmp.y, tmp.z, w );
27184
27185             }
27186
27187         }
27188
27189         this.hasTangents = true;
27190
27191     },
27192
27193     computeBoundingBox: function () {
27194
27195         if ( ! this.boundingBox ) {
27196
27197             this.boundingBox = { min: new THREE.Vector3(), max: new THREE.Vector3() };
27198
27199         }
27200
27201         if ( this.vertices.length > 0 ) {
27202
27203             var position, firstPosition = this.vertices[ 0 ];
27204
27205             this.boundingBox.min.copy( firstPosition );
27206             this.boundingBox.max.copy( firstPosition );
27207
27208             var min = this.boundingBox.min,
27209                 max = this.boundingBox.max;
27210
27211             for ( var v = 1, vl = this.vertices.length; v < vl; v ++ ) {
27212
27213                 position = this.vertices[ v ];
27214
27215                 if ( position.x < min.x ) {
27216
27217                     min.x = position.x;
27218
27219                 } else if ( position.x > max.x ) {
27220
27221                     max.x = position.x;
27222
27223                 }
27224
27225                 if ( position.y < min.y ) {
27226
27227                     min.y = position.y;
27228
27229                 } else if ( position.y > max.y ) {
27230
27231                     max.y = position.y;
27232
27233                 }
27234
27235                 if ( position.z < min.z ) {
27236
27237                     min.z = position.z;
27238
27239                 } else if ( position.z > max.z ) {
27240
27241                     max.z = position.z;
27242
27243                 }
27244
27245             }
27246
27247         } else {
27248
27249             this.boundingBox.min.set( 0, 0, 0 );
27250             this.boundingBox.max.set( 0, 0, 0 );
27251
27252         }
27253
27254     },
27255
27256     computeBoundingSphere: function () {
27257
27258         var maxRadiusSq = 0;
27259
27260         if ( this.boundingSphere === null ) this.boundingSphere = { radius: 0 };
27261
27262         for ( var i = 0, l = this.vertices.length; i < l; i ++ ) {
27263
27264             var radiusSq = this.vertices[ i ].lengthSq();
27265             if ( radiusSq > maxRadiusSq ) maxRadiusSq = radiusSq;
27266
27267         }
27268
27269         this.boundingSphere.radius = Math.sqrt( maxRadiusSq );
27270
27271     },
27272
27273     /*
27274      * Checks for duplicate vertices with hashmap.
27275      * Duplicated vertices are removed
27276      * and faces' vertices are updated.
27277      */
27278
27279     mergeVertices: function () {
27280
27281         var verticesMap = {}; // Hashmap for looking up vertice by position coordinates (and making sure they are unique)
27282         var unique = [], changes = [];
27283
27284         var v, key;
27285         var precisionPoints = 4; // number of decimal points, eg. 4 for epsilon of 0.0001
27286         var precision = Math.pow( 10, precisionPoints );
27287         var i,il, face;
27288         var abcd = 'abcd', o, k, j, jl, u;
27289
27290         for ( i = 0, il = this.vertices.length; i < il; i ++ ) {
27291
27292             v = this.vertices[ i ];
27293             key = [ Math.round( v.x * precision ), Math.round( v.y * precision ), Math.round( v.z * precision ) ].join( '_' );
27294
27295             if ( verticesMap[ key ] === undefined ) {
27296
27297                 verticesMap[ key ] = i;
27298                 unique.push( this.vertices[ i ] );
27299                 changes[ i ] = unique.length - 1;
27300
27301             } else {
27302
27303                 //console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]);
27304                 changes[ i ] = changes[ verticesMap[ key ] ];
27305
27306             }
27307
27308         };
27309
27310
27311         // Start to patch face indices
27312
27313         for( i = 0, il = this.faces.length; i < il; i ++ ) {
27314
27315             face = this.faces[ i ];
27316
27317             if ( face instanceof THREE.Face3 ) {
27318
27319                 face.a = changes[ face.a ];
27320                 face.b = changes[ face.b ];
27321                 face.c = changes[ face.c ];
27322
27323             } else if ( face instanceof THREE.Face4 ) {
27324
27325                 face.a = changes[ face.a ];
27326                 face.b = changes[ face.b ];
27327                 face.c = changes[ face.c ];
27328                 face.d = changes[ face.d ];
27329
27330                 // check dups in (a, b, c, d) and convert to -> face3
27331
27332                 o = [ face.a, face.b, face.c, face.d ];
27333
27334                 for ( k = 3; k > 0; k -- ) {
27335
27336                     if ( o.indexOf( face[ abcd[ k ] ] ) !== k ) {
27337
27338                         // console.log('faces', face.a, face.b, face.c, face.d, 'dup at', k);
27339
27340                         o.splice( k, 1 );
27341
27342                         this.faces[ i ] = new THREE.Face3( o[0], o[1], o[2], face.normal, face.color, face.materialIndex );
27343
27344                         for ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) {
27345
27346                             u = this.faceVertexUvs[ j ][ i ];
27347                             if ( u ) u.splice( k, 1 );
27348
27349                         }
27350
27351                         this.faces[ i ].vertexColors = face.vertexColors;
27352
27353                         break;
27354                     }
27355
27356                 }
27357
27358             }
27359
27360         }
27361
27362         // Use unique set of vertices
27363
27364         var diff = this.vertices.length - unique.length;
27365         this.vertices = unique;
27366         return diff;
27367
27368     },
27369
27370     clone: function () {
27371
27372         // TODO
27373
27374     }
27375
27376 };
27377
27378 THREE.GeometryCount = 0;
27379 /**
27380  * @author alteredq / http://alteredqualia.com/
27381  */
27382
27383 THREE.BufferGeometry = function () {
27384
27385     this.id = THREE.GeometryCount ++;
27386
27387     // attributes
27388
27389     this.attributes = {};
27390
27391     // attributes typed arrays are kept only if dynamic flag is set
27392
27393     this.dynamic = false;
27394
27395     // boundings
27396
27397     this.boundingBox = null;
27398     this.boundingSphere = null;
27399
27400     this.hasTangents = false;
27401
27402     // for compatibility
27403
27404     this.morphTargets = [];
27405
27406 };
27407
27408 THREE.BufferGeometry.prototype = {
27409
27410     constructor : THREE.BufferGeometry,
27411
27412     applyMatrix: function ( matrix ) {
27413
27414         var positionArray;
27415         var normalArray;
27416
27417         if ( this.attributes[ "position" ] ) positionArray = this.attributes[ "position" ].array;
27418         if ( this.attributes[ "normal" ] ) normalArray = this.attributes[ "normal" ].array;
27419
27420         if ( positionArray !== undefined ) {
27421
27422             matrix.multiplyVector3Array( positionArray );
27423             this.verticesNeedUpdate = true;
27424
27425         }
27426
27427         if ( normalArray !== undefined ) {
27428
27429             var matrixRotation = new THREE.Matrix4();
27430             matrixRotation.extractRotation( matrix );
27431
27432             matrixRotation.multiplyVector3Array( normalArray );
27433             this.normalsNeedUpdate = true;
27434
27435         }
27436
27437     },
27438
27439     computeBoundingBox: function () {
27440
27441         if ( ! this.boundingBox ) {
27442
27443             this.boundingBox = {
27444
27445                 min: new THREE.Vector3( Infinity, Infinity, Infinity ),
27446                 max: new THREE.Vector3( -Infinity, -Infinity, -Infinity )
27447
27448             };
27449
27450         }
27451
27452         var positions = this.attributes[ "position" ].array;
27453
27454         if ( positions ) {
27455
27456             var bb = this.boundingBox;
27457             var x, y, z;
27458
27459             for ( var i = 0, il = positions.length; i < il; i += 3 ) {
27460
27461                 x = positions[ i ];
27462                 y = positions[ i + 1 ];
27463                 z = positions[ i + 2 ];
27464
27465                 // bounding box
27466
27467                 if ( x < bb.min.x ) {
27468
27469                     bb.min.x = x;
27470
27471                 } else if ( x > bb.max.x ) {
27472
27473                     bb.max.x = x;
27474
27475                 }
27476
27477                 if ( y < bb.min.y ) {
27478
27479                     bb.min.y = y;
27480
27481                 } else if ( y > bb.max.y ) {
27482
27483                     bb.max.y = y;
27484
27485                 }
27486
27487                 if ( z < bb.min.z ) {
27488
27489                     bb.min.z = z;
27490
27491                 } else if ( z > bb.max.z ) {
27492
27493                     bb.max.z = z;
27494
27495                 }
27496
27497             }
27498
27499         }
27500
27501         if ( positions === undefined || positions.length === 0 ) {
27502
27503             this.boundingBox.min.set( 0, 0, 0 );
27504             this.boundingBox.max.set( 0, 0, 0 );
27505
27506         }
27507
27508     },
27509
27510     computeBoundingSphere: function () {
27511
27512         if ( ! this.boundingSphere ) this.boundingSphere = { radius: 0 };
27513
27514         var positions = this.attributes[ "position" ].array;
27515
27516         if ( positions ) {
27517
27518             var radiusSq, maxRadiusSq = 0;
27519             var x, y, z;
27520
27521             for ( var i = 0, il = positions.length; i < il; i += 3 ) {
27522
27523                 x = positions[ i ];
27524                 y = positions[ i + 1 ];
27525                 z = positions[ i + 2 ];
27526
27527                 radiusSq =  x * x + y * y + z * z;
27528                 if ( radiusSq > maxRadiusSq ) maxRadiusSq = radiusSq;
27529
27530             }
27531
27532             this.boundingSphere.radius = Math.sqrt( maxRadiusSq );
27533
27534         }
27535
27536     },
27537
27538     computeVertexNormals: function () {
27539
27540         if ( this.attributes[ "position" ] && this.attributes[ "index" ] ) {
27541
27542             var i, il;
27543             var j, jl;
27544
27545             var nVertexElements = this.attributes[ "position" ].array.length;
27546
27547             if ( this.attributes[ "normal" ] === undefined ) {
27548
27549                 this.attributes[ "normal" ] = {
27550
27551                     itemSize: 3,
27552                     array: new Float32Array( nVertexElements ),
27553                     numItems: nVertexElements
27554
27555                 };
27556
27557             } else {
27558
27559                 // reset existing normals to zero
27560
27561                 for ( i = 0, il = this.attributes[ "normal" ].array.length; i < il; i ++ ) {
27562
27563                     this.attributes[ "normal" ].array[ i ] = 0;
27564
27565                 }
27566
27567             }
27568
27569             var offsets = this.offsets;
27570
27571             var indices = this.attributes[ "index" ].array;
27572             var positions = this.attributes[ "position" ].array;
27573             var normals = this.attributes[ "normal" ].array;
27574
27575             var vA, vB, vC, x, y, z,
27576
27577             pA = new THREE.Vector3(),
27578             pB = new THREE.Vector3(),
27579             pC = new THREE.Vector3(),
27580
27581             cb = new THREE.Vector3(),
27582             ab = new THREE.Vector3();
27583
27584             for ( j = 0, jl = offsets.length; j < jl; ++ j ) {
27585
27586                 var start = offsets[ j ].start;
27587                 var count = offsets[ j ].count;
27588                 var index = offsets[ j ].index;
27589
27590                 for ( i = start, il = start + count; i < il; i += 3 ) {
27591
27592                     vA = index + indices[ i ];
27593                     vB = index + indices[ i + 1 ];
27594                     vC = index + indices[ i + 2 ];
27595
27596                     x = positions[ vA * 3 ];
27597                     y = positions[ vA * 3 + 1 ];
27598                     z = positions[ vA * 3 + 2 ];
27599                     pA.set( x, y, z );
27600
27601                     x = positions[ vB * 3 ];
27602                     y = positions[ vB * 3 + 1 ];
27603                     z = positions[ vB * 3 + 2 ];
27604                     pB.set( x, y, z );
27605
27606                     x = positions[ vC * 3 ];
27607                     y = positions[ vC * 3 + 1 ];
27608                     z = positions[ vC * 3 + 2 ];
27609                     pC.set( x, y, z );
27610
27611                     cb.sub( pC, pB );
27612                     ab.sub( pA, pB );
27613                     cb.crossSelf( ab );
27614
27615                     normals[ vA * 3 ] += cb.x;
27616                     normals[ vA * 3 + 1 ] += cb.y;
27617                     normals[ vA * 3 + 2 ] += cb.z;
27618
27619                     normals[ vB * 3 ] += cb.x;
27620                     normals[ vB * 3 + 1 ] += cb.y;
27621                     normals[ vB * 3 + 2 ] += cb.z;
27622
27623                     normals[ vC * 3 ] += cb.x;
27624                     normals[ vC * 3 + 1 ] += cb.y;
27625                     normals[ vC * 3 + 2 ] += cb.z;
27626
27627                 }
27628
27629             }
27630
27631             // normalize normals
27632
27633             for ( i = 0, il = normals.length; i < il; i += 3 ) {
27634
27635                 x = normals[ i ];
27636                 y = normals[ i + 1 ];
27637                 z = normals[ i + 2 ];
27638
27639                 var n = 1.0 / Math.sqrt( x * x + y * y + z * z );
27640
27641                 normals[ i ] *= n;
27642                 normals[ i + 1 ] *= n;
27643                 normals[ i + 2 ] *= n;
27644
27645             }
27646
27647             this.normalsNeedUpdate = true;
27648
27649         }
27650
27651     },
27652
27653     computeTangents: function () {
27654
27655         // based on http://www.terathon.com/code/tangent.html
27656         // (per vertex tangents)
27657
27658         if ( this.attributes[ "index" ] === undefined ||
27659              this.attributes[ "position" ] === undefined ||
27660              this.attributes[ "normal" ] === undefined ||
27661              this.attributes[ "uv" ] === undefined ) {
27662
27663             console.warn( "Missing required attributes (index, position, normal or uv) in BufferGeometry.computeTangents()" );
27664             return;
27665
27666         }
27667
27668         var indices = this.attributes[ "index" ].array;
27669         var positions = this.attributes[ "position" ].array;
27670         var normals = this.attributes[ "normal" ].array;
27671         var uvs = this.attributes[ "uv" ].array;
27672
27673         var nVertices = positions.length / 3;
27674
27675         if ( this.attributes[ "tangent" ] === undefined ) {
27676
27677             var nTangentElements = 4 * nVertices;
27678
27679             this.attributes[ "tangent" ] = {
27680
27681                 itemSize: 4,
27682                 array: new Float32Array( nTangentElements ),
27683                 numItems: nTangentElements
27684
27685             };
27686
27687         }
27688
27689         var tangents = this.attributes[ "tangent" ].array;
27690
27691         var tan1 = [], tan2 = [];
27692
27693         for ( var k = 0; k < nVertices; k ++ ) {
27694
27695             tan1[ k ] = new THREE.Vector3();
27696             tan2[ k ] = new THREE.Vector3();
27697
27698         }
27699
27700         var xA, yA, zA,
27701             xB, yB, zB,
27702             xC, yC, zC,
27703
27704             uA, vA,
27705             uB, vB,
27706             uC, vC,
27707
27708             x1, x2, y1, y2, z1, z2,
27709             s1, s2, t1, t2, r;
27710
27711         var sdir = new THREE.Vector3(), tdir = new THREE.Vector3();
27712
27713         function handleTriangle( a, b, c ) {
27714
27715             xA = positions[ a * 3 ];
27716             yA = positions[ a * 3 + 1 ];
27717             zA = positions[ a * 3 + 2 ];
27718
27719             xB = positions[ b * 3 ];
27720             yB = positions[ b * 3 + 1 ];
27721             zB = positions[ b * 3 + 2 ];
27722
27723             xC = positions[ c * 3 ];
27724             yC = positions[ c * 3 + 1 ];
27725             zC = positions[ c * 3 + 2 ];
27726
27727             uA = uvs[ a * 2 ];
27728             vA = uvs[ a * 2 + 1 ];
27729
27730             uB = uvs[ b * 2 ];
27731             vB = uvs[ b * 2 + 1 ];
27732
27733             uC = uvs[ c * 2 ];
27734             vC = uvs[ c * 2 + 1 ];
27735
27736             x1 = xB - xA;
27737             x2 = xC - xA;
27738
27739             y1 = yB - yA;
27740             y2 = yC - yA;
27741
27742             z1 = zB - zA;
27743             z2 = zC - zA;
27744
27745             s1 = uB - uA;
27746             s2 = uC - uA;
27747
27748             t1 = vB - vA;
27749             t2 = vC - vA;
27750
27751             r = 1.0 / ( s1 * t2 - s2 * t1 );
27752
27753             sdir.set(
27754                 ( t2 * x1 - t1 * x2 ) * r,
27755                 ( t2 * y1 - t1 * y2 ) * r,
27756                 ( t2 * z1 - t1 * z2 ) * r
27757             );
27758
27759             tdir.set(
27760                 ( s1 * x2 - s2 * x1 ) * r,
27761                 ( s1 * y2 - s2 * y1 ) * r,
27762                 ( s1 * z2 - s2 * z1 ) * r
27763             );
27764
27765             tan1[ a ].addSelf( sdir );
27766             tan1[ b ].addSelf( sdir );
27767             tan1[ c ].addSelf( sdir );
27768
27769             tan2[ a ].addSelf( tdir );
27770             tan2[ b ].addSelf( tdir );
27771             tan2[ c ].addSelf( tdir );
27772
27773         }
27774
27775         var i, il;
27776         var j, jl;
27777         var iA, iB, iC;
27778
27779         var offsets = this.offsets;
27780
27781         for ( j = 0, jl = offsets.length; j < jl; ++ j ) {
27782
27783             var start = offsets[ j ].start;
27784             var count = offsets[ j ].count;
27785             var index = offsets[ j ].index;
27786
27787             for ( i = start, il = start + count; i < il; i += 3 ) {
27788
27789                 iA = index + indices[ i ];
27790                 iB = index + indices[ i + 1 ];
27791                 iC = index + indices[ i + 2 ];
27792
27793                 handleTriangle( iA, iB, iC );
27794
27795             }
27796
27797         }
27798
27799         var tmp = new THREE.Vector3(), tmp2 = new THREE.Vector3();
27800         var n = new THREE.Vector3(), n2 = new THREE.Vector3();
27801         var w, t, test;
27802         var nx, ny, nz;
27803
27804         function handleVertex( v ) {
27805
27806             n.x = normals[ v * 3 ];
27807             n.y = normals[ v * 3 + 1 ];
27808             n.z = normals[ v * 3 + 2 ];
27809
27810             n2.copy( n );
27811
27812             t = tan1[ v ];
27813
27814             // Gram-Schmidt orthogonalize
27815
27816             tmp.copy( t );
27817             tmp.subSelf( n.multiplyScalar( n.dot( t ) ) ).normalize();
27818
27819             // Calculate handedness
27820
27821             tmp2.cross( n2, t );
27822             test = tmp2.dot( tan2[ v ] );
27823             w = ( test < 0.0 ) ? -1.0 : 1.0;
27824
27825             tangents[ v * 4 ]       = tmp.x;
27826             tangents[ v * 4 + 1 ] = tmp.y;
27827             tangents[ v * 4 + 2 ] = tmp.z;
27828             tangents[ v * 4 + 3 ] = w;
27829
27830         }
27831
27832         for ( j = 0, jl = offsets.length; j < jl; ++ j ) {
27833
27834             var start = offsets[ j ].start;
27835             var count = offsets[ j ].count;
27836             var index = offsets[ j ].index;
27837
27838             for ( i = start, il = start + count; i < il; i += 3 ) {
27839
27840                 iA = index + indices[ i ];
27841                 iB = index + indices[ i + 1 ];
27842                 iC = index + indices[ i + 2 ];
27843
27844                 handleVertex( iA );
27845                 handleVertex( iB );
27846                 handleVertex( iC );
27847
27848             }
27849
27850         }
27851
27852         this.hasTangents = true;
27853         this.tangentsNeedUpdate = true;
27854
27855     }
27856
27857 };
27858
27859 /**
27860  * Spline from Tween.js, slightly optimized (and trashed)
27861  * http://sole.github.com/tween.js/examples/05_spline.html
27862  *
27863  * @author mrdoob / http://mrdoob.com/
27864  * @author alteredq / http://alteredqualia.com/
27865  */
27866
27867 THREE.Spline = function ( points ) {
27868
27869     this.points = points;
27870
27871     var c = [], v3 = { x: 0, y: 0, z: 0 },
27872     point, intPoint, weight, w2, w3,
27873     pa, pb, pc, pd;
27874
27875     this.initFromArray = function( a ) {
27876
27877         this.points = [];
27878
27879         for ( var i = 0; i < a.length; i++ ) {
27880
27881             this.points[ i ] = { x: a[ i ][ 0 ], y: a[ i ][ 1 ], z: a[ i ][ 2 ] };
27882
27883         }
27884
27885     };
27886
27887     this.getPoint = function ( k ) {
27888
27889         point = ( this.points.length - 1 ) * k;
27890         intPoint = Math.floor( point );
27891         weight = point - intPoint;
27892
27893         c[ 0 ] = intPoint === 0 ? intPoint : intPoint - 1;
27894         c[ 1 ] = intPoint;
27895         c[ 2 ] = intPoint  > this.points.length - 2 ? this.points.length - 1 : intPoint + 1;
27896         c[ 3 ] = intPoint  > this.points.length - 3 ? this.points.length - 1 : intPoint + 2;
27897
27898         pa = this.points[ c[ 0 ] ];
27899         pb = this.points[ c[ 1 ] ];
27900         pc = this.points[ c[ 2 ] ];
27901         pd = this.points[ c[ 3 ] ];
27902
27903         w2 = weight * weight;
27904         w3 = weight * w2;
27905
27906         v3.x = interpolate( pa.x, pb.x, pc.x, pd.x, weight, w2, w3 );
27907         v3.y = interpolate( pa.y, pb.y, pc.y, pd.y, weight, w2, w3 );
27908         v3.z = interpolate( pa.z, pb.z, pc.z, pd.z, weight, w2, w3 );
27909
27910         return v3;
27911
27912     };
27913
27914     this.getControlPointsArray = function () {
27915
27916         var i, p, l = this.points.length,
27917             coords = [];
27918
27919         for ( i = 0; i < l; i ++ ) {
27920
27921             p = this.points[ i ];
27922             coords[ i ] = [ p.x, p.y, p.z ];
27923
27924         }
27925
27926         return coords;
27927
27928     };
27929
27930     // approximate length by summing linear segments
27931
27932     this.getLength = function ( nSubDivisions ) {
27933
27934         var i, index, nSamples, position,
27935             point = 0, intPoint = 0, oldIntPoint = 0,
27936             oldPosition = new THREE.Vector3(),
27937             tmpVec = new THREE.Vector3(),
27938             chunkLengths = [],
27939             totalLength = 0;
27940
27941         // first point has 0 length
27942
27943         chunkLengths[ 0 ] = 0;
27944
27945         if ( !nSubDivisions ) nSubDivisions = 100;
27946
27947         nSamples = this.points.length * nSubDivisions;
27948
27949         oldPosition.copy( this.points[ 0 ] );
27950
27951         for ( i = 1; i < nSamples; i ++ ) {
27952
27953             index = i / nSamples;
27954
27955             position = this.getPoint( index );
27956             tmpVec.copy( position );
27957
27958             totalLength += tmpVec.distanceTo( oldPosition );
27959
27960             oldPosition.copy( position );
27961
27962             point = ( this.points.length - 1 ) * index;
27963             intPoint = Math.floor( point );
27964
27965             if ( intPoint != oldIntPoint ) {
27966
27967                 chunkLengths[ intPoint ] = totalLength;
27968                 oldIntPoint = intPoint;
27969
27970             }
27971
27972         }
27973
27974         // last point ends with total length
27975
27976         chunkLengths[ chunkLengths.length ] = totalLength;
27977
27978         return { chunks: chunkLengths, total: totalLength };
27979
27980     };
27981
27982     this.reparametrizeByArcLength = function ( samplingCoef ) {
27983
27984         var i, j,
27985             index, indexCurrent, indexNext,
27986             linearDistance, realDistance,
27987             sampling, position,
27988             newpoints = [],
27989             tmpVec = new THREE.Vector3(),
27990             sl = this.getLength();
27991
27992         newpoints.push( tmpVec.copy( this.points[ 0 ] ).clone() );
27993
27994         for ( i = 1; i < this.points.length; i++ ) {
27995
27996             //tmpVec.copy( this.points[ i - 1 ] );
27997             //linearDistance = tmpVec.distanceTo( this.points[ i ] );
27998
27999             realDistance = sl.chunks[ i ] - sl.chunks[ i - 1 ];
28000
28001             sampling = Math.ceil( samplingCoef * realDistance / sl.total );
28002
28003             indexCurrent = ( i - 1 ) / ( this.points.length - 1 );
28004             indexNext = i / ( this.points.length - 1 );
28005
28006             for ( j = 1; j < sampling - 1; j++ ) {
28007
28008                 index = indexCurrent + j * ( 1 / sampling ) * ( indexNext - indexCurrent );
28009
28010                 position = this.getPoint( index );
28011                 newpoints.push( tmpVec.copy( position ).clone() );
28012
28013             }
28014
28015             newpoints.push( tmpVec.copy( this.points[ i ] ).clone() );
28016
28017         }
28018
28019         this.points = newpoints;
28020
28021     };
28022
28023     // Catmull-Rom
28024
28025     function interpolate( p0, p1, p2, p3, t, t2, t3 ) {
28026
28027         var v0 = ( p2 - p0 ) * 0.5,
28028             v1 = ( p3 - p1 ) * 0.5;
28029
28030         return ( 2 * ( p1 - p2 ) + v0 + v1 ) * t3 + ( - 3 * ( p1 - p2 ) - 2 * v0 - v1 ) * t2 + v0 * t + p1;
28031
28032     };
28033
28034 };
28035 /**
28036  * @author mrdoob / http://mrdoob.com/
28037  * @author mikael emtinger / http://gomo.se/
28038  */
28039
28040 THREE.Camera = function () {
28041
28042     THREE.Object3D.call( this );
28043
28044     this.matrixWorldInverse = new THREE.Matrix4();
28045
28046     this.projectionMatrix = new THREE.Matrix4();
28047     this.projectionMatrixInverse = new THREE.Matrix4();
28048
28049 };
28050
28051 THREE.Camera.prototype = Object.create( THREE.Object3D.prototype );
28052
28053 THREE.Camera.prototype.lookAt = function ( vector ) {
28054
28055     // TODO: Add hierarchy support.
28056
28057     this.matrix.lookAt( this.position, vector, this.up );
28058
28059     if ( this.rotationAutoUpdate === true ) {
28060
28061         this.rotation.setEulerFromRotationMatrix( this.matrix, this.eulerOrder );
28062
28063     }
28064
28065 };
28066 /**
28067  * @author alteredq / http://alteredqualia.com/
28068  */
28069
28070 THREE.OrthographicCamera = function ( left, right, top, bottom, near, far ) {
28071
28072     THREE.Camera.call( this );
28073
28074     this.left = left;
28075     this.right = right;
28076     this.top = top;
28077     this.bottom = bottom;
28078
28079     this.near = ( near !== undefined ) ? near : 0.1;
28080     this.far = ( far !== undefined ) ? far : 2000;
28081
28082     this.updateProjectionMatrix();
28083
28084 };
28085
28086 THREE.OrthographicCamera.prototype = Object.create( THREE.Camera.prototype );
28087
28088 THREE.OrthographicCamera.prototype.updateProjectionMatrix = function () {
28089
28090     this.projectionMatrix.makeOrthographic( this.left, this.right, this.top, this.bottom, this.near, this.far );
28091
28092 };
28093 /**
28094  * @author mrdoob / http://mrdoob.com/
28095  * @author greggman / http://games.greggman.com/
28096  * @author zz85 / http://www.lab4games.net/zz85/blog
28097  */
28098
28099 THREE.PerspectiveCamera = function ( fov, aspect, near, far ) {
28100
28101     THREE.Camera.call( this );
28102
28103     this.fov = fov !== undefined ? fov : 50;
28104     this.aspect = aspect !== undefined ? aspect : 1;
28105     this.near = near !== undefined ? near : 0.1;
28106     this.far = far !== undefined ? far : 2000;
28107
28108     this.updateProjectionMatrix();
28109
28110 };
28111
28112 THREE.PerspectiveCamera.prototype = Object.create( THREE.Camera.prototype );
28113
28114
28115 /**
28116  * Uses Focal Length (in mm) to estimate and set FOV
28117  * 35mm (fullframe) camera is used if frame size is not specified;
28118  * Formula based on http://www.bobatkins.com/photography/technical/field_of_view.html
28119  */
28120
28121 THREE.PerspectiveCamera.prototype.setLens = function ( focalLength, frameHeight ) {
28122
28123     if ( frameHeight === undefined ) frameHeight = 24;
28124
28125     this.fov = 2 * Math.atan( frameHeight / ( focalLength * 2 ) ) * ( 180 / Math.PI );
28126     this.updateProjectionMatrix();
28127
28128 }
28129
28130
28131 /**
28132  * Sets an offset in a larger frustum. This is useful for multi-window or
28133  * multi-monitor/multi-machine setups.
28134  *
28135  * For example, if you have 3x2 monitors and each monitor is 1920x1080 and
28136  * the monitors are in grid like this
28137  *
28138  *   +---+---+---+
28139  *   | A | B | C |
28140  *   +---+---+---+
28141  *   | D | E | F |
28142  *   +---+---+---+
28143  *
28144  * then for each monitor you would call it like this
28145  *
28146  *   var w = 1920;
28147  *   var h = 1080;
28148  *   var fullWidth = w * 3;
28149  *   var fullHeight = h * 2;
28150  *
28151  *   --A--
28152  *   camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );
28153  *   --B--
28154  *   camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );
28155  *   --C--
28156  *   camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );
28157  *   --D--
28158  *   camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );
28159  *   --E--
28160  *   camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );
28161  *   --F--
28162  *   camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );
28163  *
28164  *   Note there is no reason monitors have to be the same size or in a grid.
28165  */
28166
28167 THREE.PerspectiveCamera.prototype.setViewOffset = function ( fullWidth, fullHeight, x, y, width, height ) {
28168
28169     this.fullWidth = fullWidth;
28170     this.fullHeight = fullHeight;
28171     this.x = x;
28172     this.y = y;
28173     this.width = width;
28174     this.height = height;
28175
28176     this.updateProjectionMatrix();
28177
28178 };
28179
28180
28181 THREE.PerspectiveCamera.prototype.updateProjectionMatrix = function () {
28182
28183     if ( this.fullWidth ) {
28184
28185         var aspect = this.fullWidth / this.fullHeight;
28186         var top = Math.tan( this.fov * Math.PI / 360 ) * this.near;
28187         var bottom = -top;
28188         var left = aspect * bottom;
28189         var right = aspect * top;
28190         var width = Math.abs( right - left );
28191         var height = Math.abs( top - bottom );
28192
28193         this.projectionMatrix.makeFrustum(
28194             left + this.x * width / this.fullWidth,
28195             left + ( this.x + this.width ) * width / this.fullWidth,
28196             top - ( this.y + this.height ) * height / this.fullHeight,
28197             top - this.y * height / this.fullHeight,
28198             this.near,
28199             this.far
28200         );
28201
28202     } else {
28203
28204         this.projectionMatrix.makePerspective( this.fov, this.aspect, this.near, this.far );
28205
28206     }
28207
28208 };
28209 /**
28210  * @author mrdoob / http://mrdoob.com/
28211  * @author alteredq / http://alteredqualia.com/
28212  */
28213
28214 THREE.Light = function ( hex ) {
28215
28216     THREE.Object3D.call( this );
28217
28218     this.color = new THREE.Color( hex );
28219
28220 };
28221
28222 THREE.Light.prototype = Object.create( THREE.Object3D.prototype );
28223 /**
28224  * @author mrdoob / http://mrdoob.com/
28225  */
28226
28227 THREE.AmbientLight = function ( hex ) {
28228
28229     THREE.Light.call( this, hex );
28230
28231 };
28232
28233 THREE.AmbientLight.prototype = Object.create( THREE.Light.prototype );
28234 /**
28235  * @author mrdoob / http://mrdoob.com/
28236  * @author alteredq / http://alteredqualia.com/
28237  */
28238
28239 THREE.DirectionalLight = function ( hex, intensity, distance ) {
28240
28241     THREE.Light.call( this, hex );
28242
28243     this.position = new THREE.Vector3( 0, 1, 0 );
28244     this.target = new THREE.Object3D();
28245
28246     this.intensity = ( intensity !== undefined ) ? intensity : 1;
28247     this.distance = ( distance !== undefined ) ? distance : 0;
28248
28249     this.castShadow = false;
28250     this.onlyShadow = false;
28251
28252     //
28253
28254     this.shadowCameraNear = 50;
28255     this.shadowCameraFar = 5000;
28256
28257     this.shadowCameraLeft = -500;
28258     this.shadowCameraRight = 500;
28259     this.shadowCameraTop = 500;
28260     this.shadowCameraBottom = -500;
28261
28262     this.shadowCameraVisible = false;
28263
28264     this.shadowBias = 0;
28265     this.shadowDarkness = 0.5;
28266
28267     this.shadowMapWidth = 512;
28268     this.shadowMapHeight = 512;
28269
28270     //
28271
28272     this.shadowCascade = false;
28273
28274     this.shadowCascadeOffset = new THREE.Vector3( 0, 0, -1000 );
28275     this.shadowCascadeCount = 2;
28276
28277     this.shadowCascadeBias = [ 0, 0, 0 ];
28278     this.shadowCascadeWidth = [ 512, 512, 512 ];
28279     this.shadowCascadeHeight = [ 512, 512, 512 ];
28280
28281     this.shadowCascadeNearZ = [ -1.000, 0.990, 0.998 ];
28282     this.shadowCascadeFarZ  = [  0.990, 0.998, 1.000 ];
28283
28284     this.shadowCascadeArray = [];
28285
28286     //
28287
28288     this.shadowMap = null;
28289     this.shadowMapSize = null;
28290     this.shadowCamera = null;
28291     this.shadowMatrix = null;
28292
28293 };
28294
28295 THREE.DirectionalLight.prototype = Object.create( THREE.Light.prototype );
28296 /**
28297  * @author alteredq / http://alteredqualia.com/
28298  */
28299
28300 THREE.HemisphereLight = function ( skyColorHex, groundColorHex, intensity ) {
28301
28302     THREE.Light.call( this, skyColorHex );
28303
28304     this.groundColor = new THREE.Color( groundColorHex );
28305
28306     this.position = new THREE.Vector3( 0, 100, 0 );
28307
28308     this.intensity = ( intensity !== undefined ) ? intensity : 1;
28309
28310 };
28311
28312 THREE.HemisphereLight.prototype = Object.create( THREE.Light.prototype );
28313 /**
28314  * @author mrdoob / http://mrdoob.com/
28315  */
28316
28317 THREE.PointLight = function ( hex, intensity, distance ) {
28318
28319     THREE.Light.call( this, hex );
28320
28321     this.position = new THREE.Vector3( 0, 0, 0 );
28322     this.intensity = ( intensity !== undefined ) ? intensity : 1;
28323     this.distance = ( distance !== undefined ) ? distance : 0;
28324
28325 };
28326
28327 THREE.PointLight.prototype = Object.create( THREE.Light.prototype );
28328 /**
28329  * @author alteredq / http://alteredqualia.com/
28330  */
28331
28332 THREE.SpotLight = function ( hex, intensity, distance, angle, exponent ) {
28333
28334     THREE.Light.call( this, hex );
28335
28336     this.position = new THREE.Vector3( 0, 1, 0 );
28337     this.target = new THREE.Object3D();
28338
28339     this.intensity = ( intensity !== undefined ) ? intensity : 1;
28340     this.distance = ( distance !== undefined ) ? distance : 0;
28341     this.angle = ( angle !== undefined ) ? angle : Math.PI / 2;
28342     this.exponent = ( exponent !== undefined ) ? exponent : 10;
28343
28344     this.castShadow = false;
28345     this.onlyShadow = false;
28346
28347     //
28348
28349     this.shadowCameraNear = 50;
28350     this.shadowCameraFar = 5000;
28351     this.shadowCameraFov = 50;
28352
28353     this.shadowCameraVisible = false;
28354
28355     this.shadowBias = 0;
28356     this.shadowDarkness = 0.5;
28357
28358     this.shadowMapWidth = 512;
28359     this.shadowMapHeight = 512;
28360
28361     //
28362
28363     this.shadowMap = null;
28364     this.shadowMapSize = null;
28365     this.shadowCamera = null;
28366     this.shadowMatrix = null;
28367
28368 };
28369
28370 THREE.SpotLight.prototype = Object.create( THREE.Light.prototype );
28371 /**
28372  * @author alteredq / http://alteredqualia.com/
28373  */
28374
28375 THREE.Loader = function ( showStatus ) {
28376
28377     this.showStatus = showStatus;
28378     this.statusDomElement = showStatus ? THREE.Loader.prototype.addStatusElement() : null;
28379
28380     this.onLoadStart = function () {};
28381     this.onLoadProgress = function () {};
28382     this.onLoadComplete = function () {};
28383
28384 };
28385
28386 THREE.Loader.prototype = {
28387
28388     constructor: THREE.Loader,
28389
28390     crossOrigin: 'anonymous',
28391
28392     addStatusElement: function () {
28393
28394         var e = document.createElement( "div" );
28395
28396         e.style.position = "absolute";
28397         e.style.right = "0px";
28398         e.style.top = "0px";
28399         e.style.fontSize = "0.8em";
28400         e.style.textAlign = "left";
28401         e.style.background = "rgba(0,0,0,0.25)";
28402         e.style.color = "#fff";
28403         e.style.width = "120px";
28404         e.style.padding = "0.5em 0.5em 0.5em 0.5em";
28405         e.style.zIndex = 1000;
28406
28407         e.innerHTML = "Loading ...";
28408
28409         return e;
28410
28411     },
28412
28413     updateProgress: function ( progress ) {
28414
28415         var message = "Loaded ";
28416
28417         if ( progress.total ) {
28418
28419             message += ( 100 * progress.loaded / progress.total ).toFixed(0) + "%";
28420
28421
28422         } else {
28423
28424             message += ( progress.loaded / 1000 ).toFixed(2) + " KB";
28425
28426         }
28427
28428         this.statusDomElement.innerHTML = message;
28429
28430     },
28431
28432     extractUrlBase: function ( url ) {
28433
28434         var parts = url.split( '/' );
28435         parts.pop();
28436         return ( parts.length < 1 ? '.' : parts.join( '/' ) ) + '/';
28437
28438     },
28439
28440     initMaterials: function ( scope, materials, texturePath ) {
28441
28442         scope.materials = [];
28443
28444         for ( var i = 0; i < materials.length; ++ i ) {
28445
28446             scope.materials[ i ] = THREE.Loader.prototype.createMaterial( materials[ i ], texturePath );
28447
28448         }
28449
28450     },
28451
28452     hasNormals: function ( scope ) {
28453
28454         var m, i, il = scope.materials.length;
28455
28456         for( i = 0; i < il; i ++ ) {
28457
28458             m = scope.materials[ i ];
28459
28460             if ( m instanceof THREE.ShaderMaterial ) return true;
28461
28462         }
28463
28464         return false;
28465
28466     },
28467
28468     createMaterial: function ( m, texturePath ) {
28469
28470         var _this = this;
28471
28472         function is_pow2( n ) {
28473
28474             var l = Math.log( n ) / Math.LN2;
28475             return Math.floor( l ) == l;
28476
28477         }
28478
28479         function nearest_pow2( n ) {
28480
28481             var l = Math.log( n ) / Math.LN2;
28482             return Math.pow( 2, Math.round(  l ) );
28483
28484         }
28485
28486         function load_image( where, url ) {
28487
28488             var image = new Image();
28489
28490             image.onload = function () {
28491
28492                 if ( !is_pow2( this.width ) || !is_pow2( this.height ) ) {
28493
28494                     var width = nearest_pow2( this.width );
28495                     var height = nearest_pow2( this.height );
28496
28497                     where.image.width = width;
28498                     where.image.height = height;
28499                     where.image.getContext( '2d' ).drawImage( this, 0, 0, width, height );
28500
28501                 } else {
28502
28503                     where.image = this;
28504
28505                 }
28506
28507                 where.needsUpdate = true;
28508
28509             };
28510
28511             image.crossOrigin = _this.crossOrigin;
28512             image.src = url;
28513
28514         }
28515
28516         function create_texture( where, name, sourceFile, repeat, offset, wrap, anisotropy ) {
28517
28518             var isCompressed = sourceFile.toLowerCase().endsWith( ".dds" );
28519             var fullPath = texturePath + "/" + sourceFile;
28520
28521             if ( isCompressed ) {
28522
28523                 var texture = THREE.ImageUtils.loadCompressedTexture( fullPath );
28524
28525                 where[ name ] = texture;
28526
28527             } else {
28528
28529                 var texture = document.createElement( 'canvas' );
28530
28531                 where[ name ] = new THREE.Texture( texture );
28532
28533             }
28534
28535             where[ name ].sourceFile = sourceFile;
28536
28537             if( repeat ) {
28538
28539                 where[ name ].repeat.set( repeat[ 0 ], repeat[ 1 ] );
28540
28541                 if ( repeat[ 0 ] !== 1 ) where[ name ].wrapS = THREE.RepeatWrapping;
28542                 if ( repeat[ 1 ] !== 1 ) where[ name ].wrapT = THREE.RepeatWrapping;
28543
28544             }
28545
28546             if ( offset ) {
28547
28548                 where[ name ].offset.set( offset[ 0 ], offset[ 1 ] );
28549
28550             }
28551
28552             if ( wrap ) {
28553
28554                 var wrapMap = {
28555                     "repeat": THREE.RepeatWrapping,
28556                     "mirror": THREE.MirroredRepeatWrapping
28557                 }
28558
28559                 if ( wrapMap[ wrap[ 0 ] ] !== undefined ) where[ name ].wrapS = wrapMap[ wrap[ 0 ] ];
28560                 if ( wrapMap[ wrap[ 1 ] ] !== undefined ) where[ name ].wrapT = wrapMap[ wrap[ 1 ] ];
28561
28562             }
28563
28564             if ( anisotropy ) {
28565
28566                 where[ name ].anisotropy = anisotropy;
28567
28568             }
28569
28570             if ( ! isCompressed ) {
28571
28572                 load_image( where[ name ], fullPath );
28573
28574             }
28575
28576         }
28577
28578         function rgb2hex( rgb ) {
28579
28580             return ( rgb[ 0 ] * 255 << 16 ) + ( rgb[ 1 ] * 255 << 8 ) + rgb[ 2 ] * 255;
28581
28582         }
28583
28584         // defaults
28585
28586         var mtype = "MeshLambertMaterial";
28587         var mpars = { color: 0xeeeeee, opacity: 1.0, map: null, lightMap: null, normalMap: null, bumpMap: null, wireframe: false };
28588
28589         // parameters from model file
28590
28591         if ( m.shading ) {
28592
28593             var shading = m.shading.toLowerCase();
28594
28595             if ( shading === "phong" ) mtype = "MeshPhongMaterial";
28596             else if ( shading === "basic" ) mtype = "MeshBasicMaterial";
28597
28598         }
28599
28600         if ( m.blending !== undefined && THREE[ m.blending ] !== undefined ) {
28601
28602             mpars.blending = THREE[ m.blending ];
28603
28604         }
28605
28606         if ( m.transparent !== undefined || m.opacity < 1.0 ) {
28607
28608             mpars.transparent = m.transparent;
28609
28610         }
28611
28612         if ( m.depthTest !== undefined ) {
28613
28614             mpars.depthTest = m.depthTest;
28615
28616         }
28617
28618         if ( m.depthWrite !== undefined ) {
28619
28620             mpars.depthWrite = m.depthWrite;
28621
28622         }
28623
28624         if ( m.visible !== undefined ) {
28625
28626             mpars.visible = m.visible;
28627
28628         }
28629
28630         if ( m.flipSided !== undefined ) {
28631
28632             mpars.side = THREE.BackSide;
28633
28634         }
28635
28636         if ( m.doubleSided !== undefined ) {
28637
28638             mpars.side = THREE.DoubleSide;
28639
28640         }
28641
28642         if ( m.wireframe !== undefined ) {
28643
28644             mpars.wireframe = m.wireframe;
28645
28646         }
28647
28648         if ( m.vertexColors !== undefined ) {
28649
28650             if ( m.vertexColors === "face" ) {
28651
28652                 mpars.vertexColors = THREE.FaceColors;
28653
28654             } else if ( m.vertexColors ) {
28655
28656                 mpars.vertexColors = THREE.VertexColors;
28657
28658             }
28659
28660         }
28661
28662         // colors
28663
28664         if ( m.colorDiffuse ) {
28665
28666             mpars.color = rgb2hex( m.colorDiffuse );
28667
28668         } else if ( m.DbgColor ) {
28669
28670             mpars.color = m.DbgColor;
28671
28672         }
28673
28674         if ( m.colorSpecular ) {
28675
28676             mpars.specular = rgb2hex( m.colorSpecular );
28677
28678         }
28679
28680         if ( m.colorAmbient ) {
28681
28682             mpars.ambient = rgb2hex( m.colorAmbient );
28683
28684         }
28685
28686         // modifiers
28687
28688         if ( m.transparency ) {
28689
28690             mpars.opacity = m.transparency;
28691
28692         }
28693
28694         if ( m.specularCoef ) {
28695
28696             mpars.shininess = m.specularCoef;
28697
28698         }
28699
28700         // textures
28701
28702         if ( m.mapDiffuse && texturePath ) {
28703
28704             create_texture( mpars, "map", m.mapDiffuse, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy );
28705
28706         }
28707
28708         if ( m.mapLight && texturePath ) {
28709
28710             create_texture( mpars, "lightMap", m.mapLight, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy );
28711
28712         }
28713
28714         if ( m.mapBump && texturePath ) {
28715
28716             create_texture( mpars, "bumpMap", m.mapBump, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy );
28717
28718         }
28719
28720         if ( m.mapNormal && texturePath ) {
28721
28722             create_texture( mpars, "normalMap", m.mapNormal, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy );
28723
28724         }
28725
28726         if ( m.mapSpecular && texturePath ) {
28727
28728             create_texture( mpars, "specularMap", m.mapSpecular, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy );
28729
28730         }
28731
28732         //
28733
28734         if ( m.mapBumpScale ) {
28735
28736             mpars.bumpScale = m.mapBumpScale;
28737
28738         }
28739
28740         // special case for normal mapped material
28741
28742         if ( m.mapNormal ) {
28743
28744             var shader = THREE.ShaderUtils.lib[ "normal" ];
28745             var uniforms = THREE.UniformsUtils.clone( shader.uniforms );
28746
28747             uniforms[ "tNormal" ].value = mpars.normalMap;
28748
28749             if ( m.mapNormalFactor ) {
28750
28751                 uniforms[ "uNormalScale" ].value.set( m.mapNormalFactor, m.mapNormalFactor );
28752
28753             }
28754
28755             if ( mpars.map ) {
28756
28757                 uniforms[ "tDiffuse" ].value = mpars.map;
28758                 uniforms[ "enableDiffuse" ].value = true;
28759
28760             }
28761
28762             if ( mpars.specularMap ) {
28763
28764                 uniforms[ "tSpecular" ].value = mpars.specularMap;
28765                 uniforms[ "enableSpecular" ].value = true;
28766
28767             }
28768
28769             if ( mpars.lightMap ) {
28770
28771                 uniforms[ "tAO" ].value = mpars.lightMap;
28772                 uniforms[ "enableAO" ].value = true;
28773
28774             }
28775
28776             // for the moment don't handle displacement texture
28777
28778             uniforms[ "uDiffuseColor" ].value.setHex( mpars.color );
28779             uniforms[ "uSpecularColor" ].value.setHex( mpars.specular );
28780             uniforms[ "uAmbientColor" ].value.setHex( mpars.ambient );
28781
28782             uniforms[ "uShininess" ].value = mpars.shininess;
28783
28784             if ( mpars.opacity !== undefined ) {
28785
28786                 uniforms[ "uOpacity" ].value = mpars.opacity;
28787
28788             }
28789
28790             var parameters = { fragmentShader: shader.fragmentShader, vertexShader: shader.vertexShader, uniforms: uniforms, lights: true, fog: true };
28791             var material = new THREE.ShaderMaterial( parameters );
28792
28793         } else {
28794
28795             var material = new THREE[ mtype ]( mpars );
28796
28797         }
28798
28799         if ( m.DbgName !== undefined ) material.name = m.DbgName;
28800
28801         return material;
28802
28803     }
28804
28805 };
28806 /**
28807  * @author alteredq / http://alteredqualia.com/
28808  */
28809
28810 THREE.BinaryLoader = function ( showStatus ) {
28811
28812     THREE.Loader.call( this, showStatus );
28813
28814 };
28815
28816 THREE.BinaryLoader.prototype = Object.create( THREE.Loader.prototype );
28817
28818 // Load models generated by slim OBJ converter with BINARY option (converter_obj_three_slim.py -t binary)
28819 //  - binary models consist of two files: JS and BIN
28820 //  - parameters
28821 //        - url (required)
28822 //        - callback (required)
28823 //        - texturePath (optional: if not specified, textures will be assumed to be in the same folder as JS model file)
28824 //        - binaryPath (optional: if not specified, binary file will be assumed to be in the same folder as JS model file)
28825
28826 THREE.BinaryLoader.prototype.load = function( url, callback, texturePath, binaryPath ) {
28827
28828     texturePath = texturePath ? texturePath : this.extractUrlBase( url );
28829     binaryPath = binaryPath ? binaryPath : this.extractUrlBase( url );
28830
28831     var callbackProgress = this.showProgress ? THREE.Loader.prototype.updateProgress : null;
28832
28833     this.onLoadStart();
28834
28835     // #1 load JS part via web worker
28836
28837     this.loadAjaxJSON( this, url, callback, texturePath, binaryPath, callbackProgress );
28838
28839 };
28840
28841 THREE.BinaryLoader.prototype.loadAjaxJSON = function ( context, url, callback, texturePath, binaryPath, callbackProgress ) {
28842
28843     var xhr = new XMLHttpRequest();
28844
28845     xhr.onreadystatechange = function () {
28846
28847         if ( xhr.readyState == 4 ) {
28848
28849             if ( xhr.status == 200 || xhr.status == 0 ) {
28850
28851                 var json = JSON.parse( xhr.responseText );
28852                 context.loadAjaxBuffers( json, callback, binaryPath, texturePath, callbackProgress );
28853
28854             } else {
28855
28856                 console.error( "THREE.BinaryLoader: Couldn't load [" + url + "] [" + xhr.status + "]" );
28857
28858             }
28859
28860         }
28861
28862     };
28863
28864     xhr.open( "GET", url, true );
28865     xhr.send( null );
28866
28867 };
28868
28869 THREE.BinaryLoader.prototype.loadAjaxBuffers = function ( json, callback, binaryPath, texturePath, callbackProgress ) {
28870
28871     var xhr = new XMLHttpRequest(),
28872         url = binaryPath + "/" + json.buffers;
28873
28874     var length = 0;
28875
28876     xhr.onreadystatechange = function () {
28877
28878         if ( xhr.readyState == 4 ) {
28879
28880             if ( xhr.status == 200 || xhr.status == 0 ) {
28881
28882                 var buffer = xhr.response;
28883                 if ( buffer === undefined ) buffer = ( new Uint8Array( xhr.responseBody ) ).buffer; // IEWEBGL needs this
28884                 THREE.BinaryLoader.prototype.createBinModel( buffer, callback, texturePath, json.materials );
28885
28886             } else {
28887
28888                 console.error( "THREE.BinaryLoader: Couldn't load [" + url + "] [" + xhr.status + "]" );
28889
28890             }
28891
28892         } else if ( xhr.readyState == 3 ) {
28893
28894             if ( callbackProgress ) {
28895
28896                 if ( length == 0 ) {
28897
28898                     length = xhr.getResponseHeader( "Content-Length" );
28899
28900                 }
28901
28902                 callbackProgress( { total: length, loaded: xhr.responseText.length } );
28903
28904             }
28905
28906         } else if ( xhr.readyState == 2 ) {
28907
28908             length = xhr.getResponseHeader( "Content-Length" );
28909
28910         }
28911
28912     };
28913
28914     xhr.open( "GET", url, true );
28915     xhr.responseType = "arraybuffer";
28916     xhr.send( null );
28917
28918 };
28919
28920 // Binary AJAX parser
28921
28922 THREE.BinaryLoader.prototype.createBinModel = function ( data, callback, texturePath, materials ) {
28923
28924     var Model = function ( texturePath ) {
28925
28926         var scope = this,
28927             currentOffset = 0,
28928             md,
28929             normals = [],
28930             uvs = [],
28931             start_tri_flat, start_tri_smooth, start_tri_flat_uv, start_tri_smooth_uv,
28932             start_quad_flat, start_quad_smooth, start_quad_flat_uv, start_quad_smooth_uv,
28933             tri_size, quad_size,
28934             len_tri_flat, len_tri_smooth, len_tri_flat_uv, len_tri_smooth_uv,
28935             len_quad_flat, len_quad_smooth, len_quad_flat_uv, len_quad_smooth_uv;
28936
28937
28938         THREE.Geometry.call( this );
28939
28940         THREE.Loader.prototype.initMaterials( scope, materials, texturePath );
28941
28942         md = parseMetaData( data, currentOffset );
28943
28944         currentOffset += md.header_bytes;
28945 /*
28946         md.vertex_index_bytes = Uint32Array.BYTES_PER_ELEMENT;
28947         md.material_index_bytes = Uint16Array.BYTES_PER_ELEMENT;
28948         md.normal_index_bytes = Uint32Array.BYTES_PER_ELEMENT;
28949         md.uv_index_bytes = Uint32Array.BYTES_PER_ELEMENT;
28950 */
28951         // buffers sizes
28952
28953         tri_size =  md.vertex_index_bytes * 3 + md.material_index_bytes;
28954         quad_size = md.vertex_index_bytes * 4 + md.material_index_bytes;
28955
28956         len_tri_flat      = md.ntri_flat      * ( tri_size );
28957         len_tri_smooth    = md.ntri_smooth    * ( tri_size + md.normal_index_bytes * 3 );
28958         len_tri_flat_uv   = md.ntri_flat_uv   * ( tri_size + md.uv_index_bytes * 3 );
28959         len_tri_smooth_uv = md.ntri_smooth_uv * ( tri_size + md.normal_index_bytes * 3 + md.uv_index_bytes * 3 );
28960
28961         len_quad_flat      = md.nquad_flat      * ( quad_size );
28962         len_quad_smooth    = md.nquad_smooth    * ( quad_size + md.normal_index_bytes * 4 );
28963         len_quad_flat_uv   = md.nquad_flat_uv   * ( quad_size + md.uv_index_bytes * 4 );
28964         len_quad_smooth_uv = md.nquad_smooth_uv * ( quad_size + md.normal_index_bytes * 4 + md.uv_index_bytes * 4 );
28965
28966         // read buffers
28967
28968         currentOffset += init_vertices( currentOffset );
28969
28970         currentOffset += init_normals( currentOffset );
28971         currentOffset += handlePadding( md.nnormals * 3 );
28972
28973         currentOffset += init_uvs( currentOffset );
28974
28975         start_tri_flat         = currentOffset;
28976         start_tri_smooth    = start_tri_flat    + len_tri_flat    + handlePadding( md.ntri_flat * 2 );
28977         start_tri_flat_uv   = start_tri_smooth  + len_tri_smooth  + handlePadding( md.ntri_smooth * 2 );
28978         start_tri_smooth_uv = start_tri_flat_uv + len_tri_flat_uv + handlePadding( md.ntri_flat_uv * 2 );
28979
28980         start_quad_flat     = start_tri_smooth_uv + len_tri_smooth_uv  + handlePadding( md.ntri_smooth_uv * 2 );
28981         start_quad_smooth   = start_quad_flat     + len_quad_flat       + handlePadding( md.nquad_flat * 2 );
28982         start_quad_flat_uv  = start_quad_smooth   + len_quad_smooth    + handlePadding( md.nquad_smooth * 2 );
28983         start_quad_smooth_uv= start_quad_flat_uv  + len_quad_flat_uv   + handlePadding( md.nquad_flat_uv * 2 );
28984
28985         // have to first process faces with uvs
28986         // so that face and uv indices match
28987
28988         init_triangles_flat_uv( start_tri_flat_uv );
28989         init_triangles_smooth_uv( start_tri_smooth_uv );
28990
28991         init_quads_flat_uv( start_quad_flat_uv );
28992         init_quads_smooth_uv( start_quad_smooth_uv );
28993
28994         // now we can process untextured faces
28995
28996         init_triangles_flat( start_tri_flat );
28997         init_triangles_smooth( start_tri_smooth );
28998
28999         init_quads_flat( start_quad_flat );
29000         init_quads_smooth( start_quad_smooth );
29001
29002         this.computeCentroids();
29003         this.computeFaceNormals();
29004
29005         if ( THREE.Loader.prototype.hasNormals( this ) ) this.computeTangents();
29006
29007         function handlePadding( n ) {
29008
29009             return ( n % 4 ) ? ( 4 - n % 4 ) : 0;
29010
29011         };
29012
29013         function parseMetaData( data, offset ) {
29014
29015             var metaData = {
29016
29017                 'signature'               :parseString( data, offset,  12 ),
29018                 'header_bytes'            :parseUChar8( data, offset + 12 ),
29019
29020                 'vertex_coordinate_bytes' :parseUChar8( data, offset + 13 ),
29021                 'normal_coordinate_bytes' :parseUChar8( data, offset + 14 ),
29022                 'uv_coordinate_bytes'     :parseUChar8( data, offset + 15 ),
29023
29024                 'vertex_index_bytes'      :parseUChar8( data, offset + 16 ),
29025                 'normal_index_bytes'      :parseUChar8( data, offset + 17 ),
29026                 'uv_index_bytes'          :parseUChar8( data, offset + 18 ),
29027                 'material_index_bytes'    :parseUChar8( data, offset + 19 ),
29028
29029                 'nvertices'    :parseUInt32( data, offset + 20 ),
29030                 'nnormals'     :parseUInt32( data, offset + 20 + 4*1 ),
29031                 'nuvs'         :parseUInt32( data, offset + 20 + 4*2 ),
29032
29033                 'ntri_flat'      :parseUInt32( data, offset + 20 + 4*3 ),
29034                 'ntri_smooth'    :parseUInt32( data, offset + 20 + 4*4 ),
29035                 'ntri_flat_uv'   :parseUInt32( data, offset + 20 + 4*5 ),
29036                 'ntri_smooth_uv' :parseUInt32( data, offset + 20 + 4*6 ),
29037
29038                 'nquad_flat'      :parseUInt32( data, offset + 20 + 4*7 ),
29039                 'nquad_smooth'    :parseUInt32( data, offset + 20 + 4*8 ),
29040                 'nquad_flat_uv'   :parseUInt32( data, offset + 20 + 4*9 ),
29041                 'nquad_smooth_uv' :parseUInt32( data, offset + 20 + 4*10 )
29042
29043             };
29044 /*
29045             console.log( "signature: " + metaData.signature );
29046
29047             console.log( "header_bytes: " + metaData.header_bytes );
29048             console.log( "vertex_coordinate_bytes: " + metaData.vertex_coordinate_bytes );
29049             console.log( "normal_coordinate_bytes: " + metaData.normal_coordinate_bytes );
29050             console.log( "uv_coordinate_bytes: " + metaData.uv_coordinate_bytes );
29051
29052             console.log( "vertex_index_bytes: " + metaData.vertex_index_bytes );
29053             console.log( "normal_index_bytes: " + metaData.normal_index_bytes );
29054             console.log( "uv_index_bytes: " + metaData.uv_index_bytes );
29055             console.log( "material_index_bytes: " + metaData.material_index_bytes );
29056
29057             console.log( "nvertices: " + metaData.nvertices );
29058             console.log( "nnormals: " + metaData.nnormals );
29059             console.log( "nuvs: " + metaData.nuvs );
29060
29061             console.log( "ntri_flat: " + metaData.ntri_flat );
29062             console.log( "ntri_smooth: " + metaData.ntri_smooth );
29063             console.log( "ntri_flat_uv: " + metaData.ntri_flat_uv );
29064             console.log( "ntri_smooth_uv: " + metaData.ntri_smooth_uv );
29065
29066             console.log( "nquad_flat: " + metaData.nquad_flat );
29067             console.log( "nquad_smooth: " + metaData.nquad_smooth );
29068             console.log( "nquad_flat_uv: " + metaData.nquad_flat_uv );
29069             console.log( "nquad_smooth_uv: " + metaData.nquad_smooth_uv );
29070
29071             var total = metaData.header_bytes
29072                       + metaData.nvertices * metaData.vertex_coordinate_bytes * 3
29073                       + metaData.nnormals * metaData.normal_coordinate_bytes * 3
29074                       + metaData.nuvs * metaData.uv_coordinate_bytes * 2
29075                       + metaData.ntri_flat * ( metaData.vertex_index_bytes*3 + metaData.material_index_bytes )
29076                       + metaData.ntri_smooth * ( metaData.vertex_index_bytes*3 + metaData.material_index_bytes + metaData.normal_index_bytes*3 )
29077                       + metaData.ntri_flat_uv * ( metaData.vertex_index_bytes*3 + metaData.material_index_bytes + metaData.uv_index_bytes*3 )
29078                       + metaData.ntri_smooth_uv * ( metaData.vertex_index_bytes*3 + metaData.material_index_bytes + metaData.normal_index_bytes*3 + metaData.uv_index_bytes*3 )
29079                       + metaData.nquad_flat * ( metaData.vertex_index_bytes*4 + metaData.material_index_bytes )
29080                       + metaData.nquad_smooth * ( metaData.vertex_index_bytes*4 + metaData.material_index_bytes + metaData.normal_index_bytes*4 )
29081                       + metaData.nquad_flat_uv * ( metaData.vertex_index_bytes*4 + metaData.material_index_bytes + metaData.uv_index_bytes*4 )
29082                       + metaData.nquad_smooth_uv * ( metaData.vertex_index_bytes*4 + metaData.material_index_bytes + metaData.normal_index_bytes*4 + metaData.uv_index_bytes*4 );
29083             console.log( "total bytes: " + total );
29084 */
29085
29086             return metaData;
29087
29088         };
29089
29090         function parseString( data, offset, length ) {
29091
29092             var charArray = new Uint8Array( data, offset, length );
29093
29094             var text = "";
29095
29096             for ( var i = 0; i < length; i ++ ) {
29097
29098                 text += String.fromCharCode( charArray[ offset + i ] );
29099
29100             }
29101
29102             return text;
29103
29104         };
29105
29106         function parseUChar8( data, offset ) {
29107
29108             var charArray = new Uint8Array( data, offset, 1 );
29109
29110             return charArray[ 0 ];
29111
29112         };
29113
29114         function parseUInt32( data, offset ) {
29115
29116             var intArray = new Uint32Array( data, offset, 1 );
29117
29118             return intArray[ 0 ];
29119
29120         };
29121
29122         function init_vertices( start ) {
29123
29124             var nElements = md.nvertices;
29125
29126             var coordArray = new Float32Array( data, start, nElements * 3 );
29127
29128             var i, x, y, z;
29129
29130             for( i = 0; i < nElements; i ++ ) {
29131
29132                 x = coordArray[ i * 3 ];
29133                 y = coordArray[ i * 3 + 1 ];
29134                 z = coordArray[ i * 3 + 2 ];
29135
29136                 vertex( scope, x, y, z );
29137
29138             }
29139
29140             return nElements * 3 * Float32Array.BYTES_PER_ELEMENT;
29141
29142         };
29143
29144         function init_normals( start ) {
29145
29146             var nElements = md.nnormals;
29147
29148             if ( nElements ) {
29149
29150                 var normalArray = new Int8Array( data, start, nElements * 3 );
29151
29152                 var i, x, y, z;
29153
29154                 for( i = 0; i < nElements; i ++ ) {
29155
29156                     x = normalArray[ i * 3 ];
29157                     y = normalArray[ i * 3 + 1 ];
29158                     z = normalArray[ i * 3 + 2 ];
29159
29160                     normals.push( x/127, y/127, z/127 );
29161
29162                 }
29163
29164             }
29165
29166             return nElements * 3 * Int8Array.BYTES_PER_ELEMENT;
29167
29168         };
29169
29170         function init_uvs( start ) {
29171
29172             var nElements = md.nuvs;
29173
29174             if ( nElements ) {
29175
29176                 var uvArray = new Float32Array( data, start, nElements * 2 );
29177
29178                 var i, u, v;
29179
29180                 for( i = 0; i < nElements; i ++ ) {
29181
29182                     u = uvArray[ i * 2 ];
29183                     v = uvArray[ i * 2 + 1 ];
29184
29185                     uvs.push( u, v );
29186
29187                 }
29188
29189             }
29190
29191             return nElements * 2 * Float32Array.BYTES_PER_ELEMENT;
29192
29193         };
29194
29195         function init_uvs3( nElements, offset ) {
29196
29197             var i, uva, uvb, uvc, u1, u2, u3, v1, v2, v3;
29198
29199             var uvIndexBuffer = new Uint32Array( data, offset, 3 * nElements );
29200
29201             for( i = 0; i < nElements; i ++ ) {
29202
29203                 uva = uvIndexBuffer[ i * 3 ];
29204                 uvb = uvIndexBuffer[ i * 3 + 1 ];
29205                 uvc = uvIndexBuffer[ i * 3 + 2 ];
29206
29207                 u1 = uvs[ uva*2 ];
29208                 v1 = uvs[ uva*2 + 1 ];
29209
29210                 u2 = uvs[ uvb*2 ];
29211                 v2 = uvs[ uvb*2 + 1 ];
29212
29213                 u3 = uvs[ uvc*2 ];
29214                 v3 = uvs[ uvc*2 + 1 ];
29215
29216                 uv3( scope.faceVertexUvs[ 0 ], u1, v1, u2, v2, u3, v3 );
29217
29218             }
29219
29220         };
29221
29222         function init_uvs4( nElements, offset ) {
29223
29224             var i, uva, uvb, uvc, uvd, u1, u2, u3, u4, v1, v2, v3, v4;
29225
29226             var uvIndexBuffer = new Uint32Array( data, offset, 4 * nElements );
29227
29228             for( i = 0; i < nElements; i ++ ) {
29229
29230                 uva = uvIndexBuffer[ i * 4 ];
29231                 uvb = uvIndexBuffer[ i * 4 + 1 ];
29232                 uvc = uvIndexBuffer[ i * 4 + 2 ];
29233                 uvd = uvIndexBuffer[ i * 4 + 3 ];
29234
29235                 u1 = uvs[ uva*2 ];
29236                 v1 = uvs[ uva*2 + 1 ];
29237
29238                 u2 = uvs[ uvb*2 ];
29239                 v2 = uvs[ uvb*2 + 1 ];
29240
29241                 u3 = uvs[ uvc*2 ];
29242                 v3 = uvs[ uvc*2 + 1 ];
29243
29244                 u4 = uvs[ uvd*2 ];
29245                 v4 = uvs[ uvd*2 + 1 ];
29246
29247                 uv4( scope.faceVertexUvs[ 0 ], u1, v1, u2, v2, u3, v3, u4, v4 );
29248
29249             }
29250
29251         };
29252
29253         function init_faces3_flat( nElements, offsetVertices, offsetMaterials ) {
29254
29255             var i, a, b, c, m;
29256
29257             var vertexIndexBuffer = new Uint32Array( data, offsetVertices, 3 * nElements );
29258             var materialIndexBuffer = new Uint16Array( data, offsetMaterials, nElements );
29259
29260             for( i = 0; i < nElements; i ++ ) {
29261
29262                 a = vertexIndexBuffer[ i * 3 ];
29263                 b = vertexIndexBuffer[ i * 3 + 1 ];
29264                 c = vertexIndexBuffer[ i * 3 + 2 ];
29265
29266                 m = materialIndexBuffer[ i ];
29267
29268                 f3( scope, a, b, c, m );
29269
29270             }
29271
29272         };
29273
29274         function init_faces4_flat( nElements, offsetVertices, offsetMaterials ) {
29275
29276             var i, a, b, c, d, m;
29277
29278             var vertexIndexBuffer = new Uint32Array( data, offsetVertices, 4 * nElements );
29279             var materialIndexBuffer = new Uint16Array( data, offsetMaterials, nElements );
29280
29281             for( i = 0; i < nElements; i ++ ) {
29282
29283                 a = vertexIndexBuffer[ i * 4 ];
29284                 b = vertexIndexBuffer[ i * 4 + 1 ];
29285                 c = vertexIndexBuffer[ i * 4 + 2 ];
29286                 d = vertexIndexBuffer[ i * 4 + 3 ];
29287
29288                 m = materialIndexBuffer[ i ];
29289
29290                 f4( scope, a, b, c, d, m );
29291
29292             }
29293
29294         };
29295
29296         function init_faces3_smooth( nElements, offsetVertices, offsetNormals, offsetMaterials ) {
29297
29298             var i, a, b, c, m;
29299             var na, nb, nc;
29300
29301             var vertexIndexBuffer = new Uint32Array( data, offsetVertices, 3 * nElements );
29302             var normalIndexBuffer = new Uint32Array( data, offsetNormals, 3 * nElements );
29303             var materialIndexBuffer = new Uint16Array( data, offsetMaterials, nElements );
29304
29305             for( i = 0; i < nElements; i ++ ) {
29306
29307                 a = vertexIndexBuffer[ i * 3 ];
29308                 b = vertexIndexBuffer[ i * 3 + 1 ];
29309                 c = vertexIndexBuffer[ i * 3 + 2 ];
29310
29311                 na = normalIndexBuffer[ i * 3 ];
29312                 nb = normalIndexBuffer[ i * 3 + 1 ];
29313                 nc = normalIndexBuffer[ i * 3 + 2 ];
29314
29315                 m = materialIndexBuffer[ i ];
29316
29317                 f3n( scope, normals, a, b, c, m, na, nb, nc );
29318
29319             }
29320
29321         };
29322
29323         function init_faces4_smooth( nElements, offsetVertices, offsetNormals, offsetMaterials ) {
29324
29325             var i, a, b, c, d, m;
29326             var na, nb, nc, nd;
29327
29328             var vertexIndexBuffer = new Uint32Array( data, offsetVertices, 4 * nElements );
29329             var normalIndexBuffer = new Uint32Array( data, offsetNormals, 4 * nElements );
29330             var materialIndexBuffer = new Uint16Array( data, offsetMaterials, nElements );
29331
29332             for( i = 0; i < nElements; i ++ ) {
29333
29334                 a = vertexIndexBuffer[ i * 4 ];
29335                 b = vertexIndexBuffer[ i * 4 + 1 ];
29336                 c = vertexIndexBuffer[ i * 4 + 2 ];
29337                 d = vertexIndexBuffer[ i * 4 + 3 ];
29338
29339                 na = normalIndexBuffer[ i * 4 ];
29340                 nb = normalIndexBuffer[ i * 4 + 1 ];
29341                 nc = normalIndexBuffer[ i * 4 + 2 ];
29342                 nd = normalIndexBuffer[ i * 4 + 3 ];
29343
29344                 m = materialIndexBuffer[ i ];
29345
29346                 f4n( scope, normals, a, b, c, d, m, na, nb, nc, nd );
29347
29348             }
29349
29350         };
29351
29352         function init_triangles_flat( start ) {
29353
29354             var nElements = md.ntri_flat;
29355
29356             if ( nElements ) {
29357
29358                 var offsetMaterials = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 3;
29359                 init_faces3_flat( nElements, start, offsetMaterials );
29360
29361             }
29362
29363         };
29364
29365         function init_triangles_flat_uv( start ) {
29366
29367             var nElements = md.ntri_flat_uv;
29368
29369             if ( nElements ) {
29370
29371                 var offsetUvs = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 3;
29372                 var offsetMaterials = offsetUvs + nElements * Uint32Array.BYTES_PER_ELEMENT * 3;
29373
29374                 init_faces3_flat( nElements, start, offsetMaterials );
29375                 init_uvs3( nElements, offsetUvs );
29376
29377             }
29378
29379         };
29380
29381         function init_triangles_smooth( start ) {
29382
29383             var nElements = md.ntri_smooth;
29384
29385             if ( nElements ) {
29386
29387                 var offsetNormals = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 3;
29388                 var offsetMaterials = offsetNormals + nElements * Uint32Array.BYTES_PER_ELEMENT * 3;
29389
29390                 init_faces3_smooth( nElements, start, offsetNormals, offsetMaterials );
29391
29392             }
29393
29394         };
29395
29396         function init_triangles_smooth_uv( start ) {
29397
29398             var nElements = md.ntri_smooth_uv;
29399
29400             if ( nElements ) {
29401
29402                 var offsetNormals = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 3;
29403                 var offsetUvs = offsetNormals + nElements * Uint32Array.BYTES_PER_ELEMENT * 3;
29404                 var offsetMaterials = offsetUvs + nElements * Uint32Array.BYTES_PER_ELEMENT * 3;
29405
29406                 init_faces3_smooth( nElements, start, offsetNormals, offsetMaterials );
29407                 init_uvs3( nElements, offsetUvs );
29408
29409             }
29410
29411         };
29412
29413         function init_quads_flat( start ) {
29414
29415             var nElements = md.nquad_flat;
29416
29417             if ( nElements ) {
29418
29419                 var offsetMaterials = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 4;
29420                 init_faces4_flat( nElements, start, offsetMaterials );
29421
29422             }
29423
29424         };
29425
29426         function init_quads_flat_uv( start ) {
29427
29428             var nElements = md.nquad_flat_uv;
29429
29430             if ( nElements ) {
29431
29432                 var offsetUvs = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 4;
29433                 var offsetMaterials = offsetUvs + nElements * Uint32Array.BYTES_PER_ELEMENT * 4;
29434
29435                 init_faces4_flat( nElements, start, offsetMaterials );
29436                 init_uvs4( nElements, offsetUvs );
29437
29438             }
29439
29440         };
29441
29442         function init_quads_smooth( start ) {
29443
29444             var nElements = md.nquad_smooth;
29445
29446             if ( nElements ) {
29447
29448                 var offsetNormals = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 4;
29449                 var offsetMaterials = offsetNormals + nElements * Uint32Array.BYTES_PER_ELEMENT * 4;
29450
29451                 init_faces4_smooth( nElements, start, offsetNormals, offsetMaterials );
29452
29453             }
29454
29455         };
29456
29457         function init_quads_smooth_uv( start ) {
29458
29459             var nElements = md.nquad_smooth_uv;
29460
29461             if ( nElements ) {
29462
29463                 var offsetNormals = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 4;
29464                 var offsetUvs = offsetNormals + nElements * Uint32Array.BYTES_PER_ELEMENT * 4;
29465                 var offsetMaterials = offsetUvs + nElements * Uint32Array.BYTES_PER_ELEMENT * 4;
29466
29467                 init_faces4_smooth( nElements, start, offsetNormals, offsetMaterials );
29468                 init_uvs4( nElements, offsetUvs );
29469
29470             }
29471
29472         };
29473
29474     };
29475
29476     function vertex ( scope, x, y, z ) {
29477
29478         scope.vertices.push( new THREE.Vector3( x, y, z ) );
29479
29480     };
29481
29482     function f3 ( scope, a, b, c, mi ) {
29483
29484         scope.faces.push( new THREE.Face3( a, b, c, null, null, mi ) );
29485
29486     };
29487
29488     function f4 ( scope, a, b, c, d, mi ) {
29489
29490         scope.faces.push( new THREE.Face4( a, b, c, d, null, null, mi ) );
29491
29492     };
29493
29494     function f3n ( scope, normals, a, b, c, mi, na, nb, nc ) {
29495
29496         var nax = normals[ na*3     ],
29497             nay = normals[ na*3 + 1 ],
29498             naz = normals[ na*3 + 2 ],
29499
29500             nbx = normals[ nb*3     ],
29501             nby = normals[ nb*3 + 1 ],
29502             nbz = normals[ nb*3 + 2 ],
29503
29504             ncx = normals[ nc*3     ],
29505             ncy = normals[ nc*3 + 1 ],
29506             ncz = normals[ nc*3 + 2 ];
29507
29508         scope.faces.push( new THREE.Face3( a, b, c,
29509                           [new THREE.Vector3( nax, nay, naz ),
29510                            new THREE.Vector3( nbx, nby, nbz ),
29511                            new THREE.Vector3( ncx, ncy, ncz )],
29512                           null,
29513                           mi ) );
29514
29515     };
29516
29517     function f4n ( scope, normals, a, b, c, d, mi, na, nb, nc, nd ) {
29518
29519         var nax = normals[ na*3     ],
29520             nay = normals[ na*3 + 1 ],
29521             naz = normals[ na*3 + 2 ],
29522
29523             nbx = normals[ nb*3     ],
29524             nby = normals[ nb*3 + 1 ],
29525             nbz = normals[ nb*3 + 2 ],
29526
29527             ncx = normals[ nc*3     ],
29528             ncy = normals[ nc*3 + 1 ],
29529             ncz = normals[ nc*3 + 2 ],
29530
29531             ndx = normals[ nd*3     ],
29532             ndy = normals[ nd*3 + 1 ],
29533             ndz = normals[ nd*3 + 2 ];
29534
29535         scope.faces.push( new THREE.Face4( a, b, c, d,
29536                           [new THREE.Vector3( nax, nay, naz ),
29537                            new THREE.Vector3( nbx, nby, nbz ),
29538                            new THREE.Vector3( ncx, ncy, ncz ),
29539                            new THREE.Vector3( ndx, ndy, ndz )],
29540                           null,
29541                           mi ) );
29542
29543     };
29544
29545     function uv3 ( where, u1, v1, u2, v2, u3, v3 ) {
29546
29547         var uv = [];
29548         uv.push( new THREE.UV( u1, v1 ) );
29549         uv.push( new THREE.UV( u2, v2 ) );
29550         uv.push( new THREE.UV( u3, v3 ) );
29551         where.push( uv );
29552
29553     };
29554
29555     function uv4 ( where, u1, v1, u2, v2, u3, v3, u4, v4 ) {
29556
29557         var uv = [];
29558         uv.push( new THREE.UV( u1, v1 ) );
29559         uv.push( new THREE.UV( u2, v2 ) );
29560         uv.push( new THREE.UV( u3, v3 ) );
29561         uv.push( new THREE.UV( u4, v4 ) );
29562         where.push( uv );
29563
29564     };
29565
29566     Model.prototype = Object.create( THREE.Geometry.prototype );
29567
29568     callback( new Model( texturePath ) );
29569
29570 };
29571 /**
29572  * @author mrdoob / http://mrdoob.com/
29573  */
29574
29575 THREE.ImageLoader = function () {
29576
29577     THREE.EventTarget.call( this );
29578
29579     this.crossOrigin = null;
29580
29581 };
29582
29583 THREE.ImageLoader.prototype = {
29584
29585     constructor: THREE.ImageLoader,
29586
29587     load: function ( url, image ) {
29588
29589         var scope = this;
29590
29591         if ( image === undefined ) image = new Image();
29592
29593         image.addEventListener( 'load', function () {
29594
29595             scope.dispatchEvent( { type: 'load', content: image } );
29596
29597         }, false );
29598
29599         image.addEventListener( 'error', function () {
29600
29601             scope.dispatchEvent( { type: 'error', message: 'Couldn\'t load URL [' + url + ']' } );
29602
29603         }, false );
29604
29605         if ( scope.crossOrigin ) image.crossOrigin = scope.crossOrigin;
29606
29607         image.src = url;
29608
29609     }
29610
29611 }
29612 /**
29613  * @author mrdoob / http://mrdoob.com/
29614  * @author alteredq / http://alteredqualia.com/
29615  */
29616
29617 THREE.JSONLoader = function ( showStatus ) {
29618
29619     THREE.Loader.call( this, showStatus );
29620
29621 };
29622
29623 THREE.JSONLoader.prototype = Object.create( THREE.Loader.prototype );
29624
29625 THREE.JSONLoader.prototype.load = function ( url, callback, texturePath ) {
29626
29627     var scope = this;
29628
29629     texturePath = texturePath ? texturePath : this.extractUrlBase( url );
29630
29631     this.onLoadStart();
29632     this.loadAjaxJSON( this, url, callback, texturePath );
29633
29634 };
29635
29636 THREE.JSONLoader.prototype.loadAjaxJSON = function ( context, url, callback, texturePath, callbackProgress ) {
29637
29638     var xhr = new XMLHttpRequest();
29639
29640     var length = 0;
29641
29642     xhr.onreadystatechange = function () {
29643
29644         if ( xhr.readyState === xhr.DONE ) {
29645
29646             if ( xhr.status === 200 || xhr.status === 0 ) {
29647
29648                 if ( xhr.responseText ) {
29649
29650                     var json = JSON.parse( xhr.responseText );
29651                     context.createModel( json, callback, texturePath );
29652
29653                 } else {
29654
29655                     console.warn( "THREE.JSONLoader: [" + url + "] seems to be unreachable or file there is empty" );
29656
29657                 }
29658
29659                 // in context of more complex asset initialization
29660                 // do not block on single failed file
29661                 // maybe should go even one more level up
29662
29663                 context.onLoadComplete();
29664
29665             } else {
29666
29667                 console.error( "THREE.JSONLoader: Couldn't load [" + url + "] [" + xhr.status + "]" );
29668
29669             }
29670
29671         } else if ( xhr.readyState === xhr.LOADING ) {
29672
29673             if ( callbackProgress ) {
29674
29675                 if ( length === 0 ) {
29676
29677                     length = xhr.getResponseHeader( "Content-Length" );
29678
29679                 }
29680
29681                 callbackProgress( { total: length, loaded: xhr.responseText.length } );
29682
29683             }
29684
29685         } else if ( xhr.readyState === xhr.HEADERS_RECEIVED ) {
29686
29687             length = xhr.getResponseHeader( "Content-Length" );
29688
29689         }
29690
29691     };
29692
29693     xhr.open( "GET", url, true );
29694     xhr.send( null );
29695
29696 };
29697
29698 THREE.JSONLoader.prototype.createModel = function ( json, callback, texturePath ) {
29699
29700     var scope = this,
29701     geometry = new THREE.Geometry(),
29702     scale = ( json.scale !== undefined ) ? 1.0 / json.scale : 1.0;
29703
29704     this.initMaterials( geometry, json.materials, texturePath );
29705
29706     parseModel( scale );
29707
29708     parseSkin();
29709     parseMorphing( scale );
29710
29711     geometry.computeCentroids();
29712     geometry.computeFaceNormals();
29713
29714     if ( this.hasNormals( geometry ) ) geometry.computeTangents();
29715
29716
29717     function parseModel( scale ) {
29718
29719         function isBitSet( value, position ) {
29720
29721             return value & ( 1 << position );
29722
29723         }
29724
29725         var i, j, fi,
29726
29727         offset, zLength, nVertices,
29728
29729         colorIndex, normalIndex, uvIndex, materialIndex,
29730
29731         type,
29732         isQuad,
29733         hasMaterial,
29734         hasFaceUv, hasFaceVertexUv,
29735         hasFaceNormal, hasFaceVertexNormal,
29736         hasFaceColor, hasFaceVertexColor,
29737
29738         vertex, face, color, normal,
29739
29740         uvLayer, uvs, u, v,
29741
29742         faces = json.faces,
29743         vertices = json.vertices,
29744         normals = json.normals,
29745         colors = json.colors,
29746
29747         nUvLayers = 0;
29748
29749         // disregard empty arrays
29750
29751         for ( i = 0; i < json.uvs.length; i++ ) {
29752
29753             if ( json.uvs[ i ].length ) nUvLayers ++;
29754
29755         }
29756
29757         for ( i = 0; i < nUvLayers; i++ ) {
29758
29759             geometry.faceUvs[ i ] = [];
29760             geometry.faceVertexUvs[ i ] = [];
29761
29762         }
29763
29764         offset = 0;
29765         zLength = vertices.length;
29766
29767         while ( offset < zLength ) {
29768
29769             vertex = new THREE.Vector3();
29770
29771             vertex.x = vertices[ offset ++ ] * scale;
29772             vertex.y = vertices[ offset ++ ] * scale;
29773             vertex.z = vertices[ offset ++ ] * scale;
29774
29775             geometry.vertices.push( vertex );
29776
29777         }
29778
29779         offset = 0;
29780         zLength = faces.length;
29781
29782         while ( offset < zLength ) {
29783
29784             type = faces[ offset ++ ];
29785
29786
29787             isQuad              = isBitSet( type, 0 );
29788             hasMaterial         = isBitSet( type, 1 );
29789             hasFaceUv           = isBitSet( type, 2 );
29790             hasFaceVertexUv     = isBitSet( type, 3 );
29791             hasFaceNormal       = isBitSet( type, 4 );
29792             hasFaceVertexNormal = isBitSet( type, 5 );
29793             hasFaceColor        = isBitSet( type, 6 );
29794             hasFaceVertexColor  = isBitSet( type, 7 );
29795
29796             //console.log("type", type, "bits", isQuad, hasMaterial, hasFaceUv, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor);
29797
29798             if ( isQuad ) {
29799
29800                 face = new THREE.Face4();
29801
29802                 face.a = faces[ offset ++ ];
29803                 face.b = faces[ offset ++ ];
29804                 face.c = faces[ offset ++ ];
29805                 face.d = faces[ offset ++ ];
29806
29807                 nVertices = 4;
29808
29809             } else {
29810
29811                 face = new THREE.Face3();
29812
29813                 face.a = faces[ offset ++ ];
29814                 face.b = faces[ offset ++ ];
29815                 face.c = faces[ offset ++ ];
29816
29817                 nVertices = 3;
29818
29819             }
29820
29821             if ( hasMaterial ) {
29822
29823                 materialIndex = faces[ offset ++ ];
29824                 face.materialIndex = materialIndex;
29825
29826             }
29827
29828             // to get face <=> uv index correspondence
29829
29830             fi = geometry.faces.length;
29831
29832             if ( hasFaceUv ) {
29833
29834                 for ( i = 0; i < nUvLayers; i++ ) {
29835
29836                     uvLayer = json.uvs[ i ];
29837
29838                     uvIndex = faces[ offset ++ ];
29839
29840                     u = uvLayer[ uvIndex * 2 ];
29841                     v = uvLayer[ uvIndex * 2 + 1 ];
29842
29843                     geometry.faceUvs[ i ][ fi ] = new THREE.UV( u, v );
29844
29845                 }
29846
29847             }
29848
29849             if ( hasFaceVertexUv ) {
29850
29851                 for ( i = 0; i < nUvLayers; i++ ) {
29852
29853                     uvLayer = json.uvs[ i ];
29854
29855                     uvs = [];
29856
29857                     for ( j = 0; j < nVertices; j ++ ) {
29858
29859                         uvIndex = faces[ offset ++ ];
29860
29861                         u = uvLayer[ uvIndex * 2 ];
29862                         v = uvLayer[ uvIndex * 2 + 1 ];
29863
29864                         uvs[ j ] = new THREE.UV( u, v );
29865
29866                     }
29867
29868                     geometry.faceVertexUvs[ i ][ fi ] = uvs;
29869
29870                 }
29871
29872             }
29873
29874             if ( hasFaceNormal ) {
29875
29876                 normalIndex = faces[ offset ++ ] * 3;
29877
29878                 normal = new THREE.Vector3();
29879
29880                 normal.x = normals[ normalIndex ++ ];
29881                 normal.y = normals[ normalIndex ++ ];
29882                 normal.z = normals[ normalIndex ];
29883
29884                 face.normal = normal;
29885
29886             }
29887
29888             if ( hasFaceVertexNormal ) {
29889
29890                 for ( i = 0; i < nVertices; i++ ) {
29891
29892                     normalIndex = faces[ offset ++ ] * 3;
29893
29894                     normal = new THREE.Vector3();
29895
29896                     normal.x = normals[ normalIndex ++ ];
29897                     normal.y = normals[ normalIndex ++ ];
29898                     normal.z = normals[ normalIndex ];
29899
29900                     face.vertexNormals.push( normal );
29901
29902                 }
29903
29904             }
29905
29906
29907             if ( hasFaceColor ) {
29908
29909                 colorIndex = faces[ offset ++ ];
29910
29911                 color = new THREE.Color( colors[ colorIndex ] );
29912                 face.color = color;
29913
29914             }
29915
29916
29917             if ( hasFaceVertexColor ) {
29918
29919                 for ( i = 0; i < nVertices; i++ ) {
29920
29921                     colorIndex = faces[ offset ++ ];
29922
29923                     color = new THREE.Color( colors[ colorIndex ] );
29924                     face.vertexColors.push( color );
29925
29926                 }
29927
29928             }
29929
29930             geometry.faces.push( face );
29931
29932         }
29933
29934     };
29935
29936     function parseSkin() {
29937
29938         var i, l, x, y, z, w, a, b, c, d;
29939
29940         if ( json.skinWeights ) {
29941
29942             for ( i = 0, l = json.skinWeights.length; i < l; i += 2 ) {
29943
29944                 x = json.skinWeights[ i     ];
29945                 y = json.skinWeights[ i + 1 ];
29946                 z = 0;
29947                 w = 0;
29948
29949                 geometry.skinWeights.push( new THREE.Vector4( x, y, z, w ) );
29950
29951             }
29952
29953         }
29954
29955         if ( json.skinIndices ) {
29956
29957             for ( i = 0, l = json.skinIndices.length; i < l; i += 2 ) {
29958
29959                 a = json.skinIndices[ i     ];
29960                 b = json.skinIndices[ i + 1 ];
29961                 c = 0;
29962                 d = 0;
29963
29964                 geometry.skinIndices.push( new THREE.Vector4( a, b, c, d ) );
29965
29966             }
29967
29968         }
29969
29970         geometry.bones = json.bones;
29971         geometry.animation = json.animation;
29972
29973     };
29974
29975     function parseMorphing( scale ) {
29976
29977         if ( json.morphTargets !== undefined ) {
29978
29979             var i, l, v, vl, dstVertices, srcVertices;
29980
29981             for ( i = 0, l = json.morphTargets.length; i < l; i ++ ) {
29982
29983                 geometry.morphTargets[ i ] = {};
29984                 geometry.morphTargets[ i ].name = json.morphTargets[ i ].name;
29985                 geometry.morphTargets[ i ].vertices = [];
29986
29987                 dstVertices = geometry.morphTargets[ i ].vertices;
29988                 srcVertices = json.morphTargets [ i ].vertices;
29989
29990                 for( v = 0, vl = srcVertices.length; v < vl; v += 3 ) {
29991
29992                     var vertex = new THREE.Vector3();
29993                     vertex.x = srcVertices[ v ] * scale;
29994                     vertex.y = srcVertices[ v + 1 ] * scale;
29995                     vertex.z = srcVertices[ v + 2 ] * scale;
29996
29997                     dstVertices.push( vertex );
29998
29999                 }
30000
30001             }
30002
30003         }
30004
30005         if ( json.morphColors !== undefined ) {
30006
30007             var i, l, c, cl, dstColors, srcColors, color;
30008
30009             for ( i = 0, l = json.morphColors.length; i < l; i++ ) {
30010
30011                 geometry.morphColors[ i ] = {};
30012                 geometry.morphColors[ i ].name = json.morphColors[ i ].name;
30013                 geometry.morphColors[ i ].colors = [];
30014
30015                 dstColors = geometry.morphColors[ i ].colors;
30016                 srcColors = json.morphColors [ i ].colors;
30017
30018                 for ( c = 0, cl = srcColors.length; c < cl; c += 3 ) {
30019
30020                     color = new THREE.Color( 0xffaa00 );
30021                     color.setRGB( srcColors[ c ], srcColors[ c + 1 ], srcColors[ c + 2 ] );
30022                     dstColors.push( color );
30023
30024                 }
30025
30026             }
30027
30028         }
30029
30030     };
30031
30032     callback( geometry );
30033
30034 };
30035 /**
30036  * @author mrdoob / http://mrdoob.com/
30037  */
30038
30039 THREE.LoadingMonitor = function () {
30040
30041     THREE.EventTarget.call( this );
30042
30043     var scope = this;
30044
30045     var loaded = 0;
30046     var total = 0;
30047
30048     var onLoad = function ( event ) {
30049
30050         loaded ++;
30051
30052         scope.dispatchEvent( { type: 'progress', loaded: loaded, total: total } );
30053
30054         if ( loaded === total ) {
30055
30056             scope.dispatchEvent( { type: 'load' } );
30057
30058         }
30059
30060     };
30061
30062     this.add = function ( loader ) {
30063
30064         total ++;
30065
30066         loader.addEventListener( 'load', onLoad, false );
30067
30068     };
30069
30070 };
30071 /**
30072  * @author mrdoob / http://mrdoob.com/
30073  * @author alteredq / http://alteredqualia.com/
30074  */
30075
30076 THREE.GeometryLoader = function () {
30077
30078     THREE.EventTarget.call( this );
30079
30080     this.crossOrigin = null;
30081     this.path = null;
30082
30083
30084 };
30085
30086 THREE.GeometryLoader.prototype = {
30087
30088     constructor: THREE.GeometryLoader,
30089
30090     load: function ( url ) {
30091
30092         var scope = this;
30093         var geometry = null;
30094
30095         if ( scope.path === null ) {
30096
30097             var parts = url.split( '/' ); parts.pop();
30098             scope.path = ( parts.length < 1 ? '.' : parts.join( '/' ) );
30099
30100         }
30101
30102         //
30103
30104         var xhr = new XMLHttpRequest();
30105
30106         xhr.addEventListener( 'load', function ( event ) {
30107
30108             if ( event.target.responseText ) {
30109
30110                 geometry = scope.parse( JSON.parse( event.target.responseText ), monitor );
30111
30112             } else {
30113
30114                 scope.dispatchEvent( { type: 'error', message: 'Invalid file [' + url + ']' } );
30115
30116             }
30117
30118         }, false );
30119
30120         xhr.addEventListener( 'error', function () {
30121
30122             scope.dispatchEvent( { type: 'error', message: 'Couldn\'t load URL [' + url + ']' } );
30123
30124         }, false );
30125
30126         xhr.open( 'GET', url, true );
30127         xhr.send( null );
30128
30129         //
30130
30131         var monitor = new THREE.LoadingMonitor();
30132
30133         monitor.addEventListener( 'load', function ( event ) {
30134
30135             scope.dispatchEvent( { type: 'load', content: geometry } );
30136
30137         } );
30138
30139         monitor.add( xhr );
30140
30141     },
30142
30143     parse: function ( data, monitor ) {
30144
30145         var scope = this;
30146         var geometry = new THREE.Geometry();
30147
30148         var scale = ( data.scale !== undefined ) ? 1 / data.scale : 1;
30149
30150         // materials
30151
30152         if ( data.materials ) {
30153
30154             geometry.materials = [];
30155
30156             for ( var i = 0; i < data.materials.length; ++ i ) {
30157
30158                 var m = data.materials[ i ];
30159
30160                 function isPow2( n ) {
30161
30162                     var l = Math.log( n ) / Math.LN2;
30163                     return Math.floor( l ) == l;
30164
30165                 }
30166
30167                 function nearestPow2( n ) {
30168
30169                     var l = Math.log( n ) / Math.LN2;
30170                     return Math.pow( 2, Math.round(  l ) );
30171
30172                 }
30173
30174                 function createTexture( where, name, sourceFile, repeat, offset, wrap ) {
30175
30176                     where[ name ] = new THREE.Texture();
30177                     where[ name ].sourceFile = sourceFile;
30178
30179                     if ( repeat ) {
30180
30181                         where[ name ].repeat.set( repeat[ 0 ], repeat[ 1 ] );
30182
30183                         if ( repeat[ 0 ] !== 1 ) where[ name ].wrapS = THREE.RepeatWrapping;
30184                         if ( repeat[ 1 ] !== 1 ) where[ name ].wrapT = THREE.RepeatWrapping;
30185
30186                     }
30187
30188                     if ( offset ) {
30189
30190                         where[ name ].offset.set( offset[ 0 ], offset[ 1 ] );
30191
30192                     }
30193
30194                     if ( wrap ) {
30195
30196                         var wrapMap = {
30197
30198                             "repeat": THREE.RepeatWrapping,
30199                             "mirror": THREE.MirroredRepeatWrapping
30200
30201                         }
30202
30203                         if ( wrapMap[ wrap[ 0 ] ] !== undefined ) where[ name ].wrapS = wrapMap[ wrap[ 0 ] ];
30204                         if ( wrapMap[ wrap[ 1 ] ] !== undefined ) where[ name ].wrapT = wrapMap[ wrap[ 1 ] ];
30205
30206                     }
30207
30208                     // load image
30209
30210                     var texture = where[ name ];
30211
30212                     var loader = new THREE.ImageLoader();
30213                     loader.addEventListener( 'load', function ( event ) {
30214
30215                         var image = event.content;
30216
30217                         if ( !isPow2( image.width ) || !isPow2( image.height ) ) {
30218
30219                             var width = nearestPow2( image.width );
30220                             var height = nearestPow2( image.height );
30221
30222                             texture.image = document.createElement( 'canvas' );
30223                             texture.image.width = width;
30224                             texture.image.height = height;
30225                             texture.image.getContext( '2d' ).drawImage( image, 0, 0, width, height );
30226
30227                         } else {
30228
30229                             texture.image = image;
30230
30231                         }
30232
30233                         texture.needsUpdate = true;
30234
30235                     } );
30236                     loader.crossOrigin = scope.crossOrigin;
30237                     loader.load( scope.path + '/' + sourceFile );
30238
30239                     if ( monitor ) monitor.add( loader );
30240
30241                 }
30242
30243                 function rgb2hex( rgb ) {
30244
30245                     return ( rgb[ 0 ] * 255 << 16 ) + ( rgb[ 1 ] * 255 << 8 ) + rgb[ 2 ] * 255;
30246
30247                 }
30248
30249                 // defaults
30250
30251                 var mtype = "MeshLambertMaterial";
30252                 var mpars = { color: 0xeeeeee, opacity: 1.0, map: null, lightMap: null, normalMap: null, bumpMap: null, wireframe: false };
30253
30254                 // parameters from model file
30255
30256                 if ( m.shading ) {
30257
30258                     var shading = m.shading.toLowerCase();
30259
30260                     if ( shading === "phong" ) mtype = "MeshPhongMaterial";
30261                     else if ( shading === "basic" ) mtype = "MeshBasicMaterial";
30262
30263                 }
30264
30265                 if ( m.blending !== undefined && THREE[ m.blending ] !== undefined ) {
30266
30267                     mpars.blending = THREE[ m.blending ];
30268
30269                 }
30270
30271                 if ( m.transparent !== undefined || m.opacity < 1.0 ) {
30272
30273                     mpars.transparent = m.transparent;
30274
30275                 }
30276
30277                 if ( m.depthTest !== undefined ) {
30278
30279                     mpars.depthTest = m.depthTest;
30280
30281                 }
30282
30283                 if ( m.depthWrite !== undefined ) {
30284
30285                     mpars.depthWrite = m.depthWrite;
30286
30287                 }
30288
30289                 if ( m.vertexColors !== undefined ) {
30290
30291                     if ( m.vertexColors == "face" ) {
30292
30293                         mpars.vertexColors = THREE.FaceColors;
30294
30295                     } else if ( m.vertexColors ) {
30296
30297                         mpars.vertexColors = THREE.VertexColors;
30298
30299                     }
30300
30301                 }
30302
30303                 // colors
30304
30305                 if ( m.colorDiffuse ) {
30306
30307                     mpars.color = rgb2hex( m.colorDiffuse );
30308
30309                 } else if ( m.DbgColor ) {
30310
30311                     mpars.color = m.DbgColor;
30312
30313                 }
30314
30315                 if ( m.colorSpecular ) {
30316
30317                     mpars.specular = rgb2hex( m.colorSpecular );
30318
30319                 }
30320
30321                 if ( m.colorAmbient ) {
30322
30323                     mpars.ambient = rgb2hex( m.colorAmbient );
30324
30325                 }
30326
30327                 // modifiers
30328
30329                 if ( m.transparency ) {
30330
30331                     mpars.opacity = m.transparency;
30332
30333                 }
30334
30335                 if ( m.specularCoef ) {
30336
30337                     mpars.shininess = m.specularCoef;
30338
30339                 }
30340
30341                 if ( m.visible !== undefined ) {
30342
30343                     mpars.visible = m.visible;
30344
30345                 }
30346
30347                 if ( m.flipSided !== undefined ) {
30348
30349                     mpars.side = THREE.BackSide;
30350
30351                 }
30352
30353                 if ( m.doubleSided !== undefined ) {
30354
30355                     mpars.side = THREE.DoubleSide;
30356
30357                 }
30358
30359                 if ( m.wireframe !== undefined ) {
30360
30361                     mpars.wireframe = m.wireframe;
30362
30363                 }
30364
30365                 // textures
30366
30367                 if ( m.mapDiffuse ) {
30368
30369                     createTexture( mpars, "map", m.mapDiffuse, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap );
30370
30371                 }
30372
30373                 if ( m.mapLight ) {
30374
30375                     createTexture( mpars, "lightMap", m.mapLight, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap );
30376
30377                 }
30378
30379                 if ( m.mapBump ) {
30380
30381                     createTexture( mpars, "bumpMap", m.mapBump, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap );
30382
30383                 }
30384
30385                 if ( m.mapNormal ) {
30386
30387                     createTexture( mpars, "normalMap", m.mapNormal, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap );
30388
30389                 }
30390
30391                 if ( m.mapSpecular ) {
30392
30393                     createTexture( mpars, "specularMap", m.mapSpecular, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap );
30394
30395                 }
30396
30397                 // special case for normal mapped material
30398
30399                 if ( m.mapNormal ) {
30400
30401                     var shader = THREE.ShaderUtils.lib[ "normal" ];
30402                     var uniforms = THREE.UniformsUtils.clone( shader.uniforms );
30403
30404                     uniforms[ "tNormal" ].value = mpars.normalMap;
30405
30406                     if ( m.mapNormalFactor ) {
30407
30408                         uniforms[ "uNormalScale" ].value.set( m.mapNormalFactor, m.mapNormalFactor );
30409
30410                     }
30411
30412                     if ( mpars.map ) {
30413
30414                         uniforms[ "tDiffuse" ].value = mpars.map;
30415                         uniforms[ "enableDiffuse" ].value = true;
30416
30417                     }
30418
30419                     if ( mpars.specularMap ) {
30420
30421                         uniforms[ "tSpecular" ].value = mpars.specularMap;
30422                         uniforms[ "enableSpecular" ].value = true;
30423
30424                     }
30425
30426                     if ( mpars.lightMap ) {
30427
30428                         uniforms[ "tAO" ].value = mpars.lightMap;
30429                         uniforms[ "enableAO" ].value = true;
30430
30431                     }
30432
30433                     // for the moment don't handle displacement texture
30434
30435                     uniforms[ "uDiffuseColor" ].value.setHex( mpars.color );
30436                     uniforms[ "uSpecularColor" ].value.setHex( mpars.specular );
30437                     uniforms[ "uAmbientColor" ].value.setHex( mpars.ambient );
30438
30439                     uniforms[ "uShininess" ].value = mpars.shininess;
30440
30441                     if ( mpars.opacity !== undefined ) {
30442
30443                         uniforms[ "uOpacity" ].value = mpars.opacity;
30444
30445                     }
30446
30447                     var parameters = { fragmentShader: shader.fragmentShader, vertexShader: shader.vertexShader, uniforms: uniforms, lights: true, fog: true };
30448                     var material = new THREE.ShaderMaterial( parameters );
30449
30450                 } else {
30451
30452                     var material = new THREE[ mtype ]( mpars );
30453
30454                 }
30455
30456                 if ( m.DbgName !== undefined ) material.name = m.DbgName;
30457
30458                 geometry.materials[ i ] = material;
30459
30460             }
30461
30462         }
30463
30464         // geometry
30465
30466         function isBitSet( value, position ) {
30467
30468             return value & ( 1 << position );
30469
30470         }
30471
30472         var faces = data.faces;
30473         var vertices = data.vertices;
30474         var normals = data.normals;
30475         var colors = data.colors;
30476         var nUvLayers = 0;
30477
30478         // disregard empty arrays
30479
30480         if ( data.uvs ) {
30481
30482             for ( var i = 0; i < data.uvs.length; i ++ ) {
30483
30484                 if ( data.uvs[ i ].length ) nUvLayers ++;
30485
30486             }
30487
30488         }
30489
30490         for ( var i = 0; i < nUvLayers; i ++ ) {
30491
30492             geometry.faceUvs[ i ] = [];
30493             geometry.faceVertexUvs[ i ] = [];
30494
30495         }
30496
30497         var offset = 0;
30498         var zLength = vertices.length;
30499
30500         while ( offset < zLength ) {
30501
30502             var vertex = new THREE.Vector3();
30503
30504             vertex.x = vertices[ offset ++ ] * scale;
30505             vertex.y = vertices[ offset ++ ] * scale;
30506             vertex.z = vertices[ offset ++ ] * scale;
30507
30508             geometry.vertices.push( vertex );
30509
30510         }
30511
30512         offset = 0;
30513         zLength = faces.length;
30514
30515         while ( offset < zLength ) {
30516
30517             var type = faces[ offset ++ ];
30518
30519             var isQuad = isBitSet( type, 0 );
30520
30521             var hasMaterial = isBitSet( type, 1 );
30522             var hasFaceUv = isBitSet( type, 2 );
30523             var hasFaceVertexUv = isBitSet( type, 3 );
30524             var hasFaceNormal = isBitSet( type, 4 );
30525             var hasFaceVertexNormal = isBitSet( type, 5 );
30526             var hasFaceColor = isBitSet( type, 6 );
30527             var hasFaceVertexColor = isBitSet( type, 7 );
30528
30529             // console.log("type", type, "bits", isQuad, hasMaterial, hasFaceUv, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor);
30530
30531             if ( isQuad ) {
30532
30533                 var face = new THREE.Face4();
30534
30535                 face.a = faces[ offset ++ ];
30536                 face.b = faces[ offset ++ ];
30537                 face.c = faces[ offset ++ ];
30538                 face.d = faces[ offset ++ ];
30539
30540                 var nVertices = 4;
30541
30542             } else {
30543
30544                 var face = new THREE.Face3();
30545
30546                 face.a = faces[ offset ++ ];
30547                 face.b = faces[ offset ++ ];
30548                 face.c = faces[ offset ++ ];
30549
30550                 var nVertices = 3;
30551
30552             }
30553
30554             if ( hasMaterial ) {
30555
30556                 var materialIndex = faces[ offset ++ ];
30557                 face.materialIndex = materialIndex;
30558
30559             }
30560
30561             // to get face <=> uv index correspondence
30562
30563             var fi = geometry.faces.length;
30564
30565             if ( hasFaceUv ) {
30566
30567                 for ( var i = 0; i < nUvLayers; i ++ ) {
30568
30569                     var uvLayer = data.uvs[ i ];
30570
30571                     var uvIndex = faces[ offset ++ ];
30572
30573                     var u = uvLayer[ uvIndex * 2 ];
30574                     var v = uvLayer[ uvIndex * 2 + 1 ];
30575
30576                     geometry.faceUvs[ i ][ fi ] = new THREE.UV( u, v );
30577
30578                 }
30579
30580             }
30581
30582             if ( hasFaceVertexUv ) {
30583
30584                 for ( var i = 0; i < nUvLayers; i ++ ) {
30585
30586                     var uvLayer = data.uvs[ i ];
30587
30588                     var uvs = [];
30589
30590                     for ( var j = 0; j < nVertices; j ++ ) {
30591
30592                         var uvIndex = faces[ offset ++ ];
30593
30594                         var u = uvLayer[ uvIndex * 2 ];
30595                         var v = uvLayer[ uvIndex * 2 + 1 ];
30596
30597                         uvs[ j ] = new THREE.UV( u, v );
30598
30599                     }
30600
30601                     geometry.faceVertexUvs[ i ][ fi ] = uvs;
30602
30603                 }
30604
30605             }
30606
30607             if ( hasFaceNormal ) {
30608
30609                 var normalIndex = faces[ offset ++ ] * 3;
30610
30611                 var normal = new THREE.Vector3();
30612
30613                 normal.x = normals[ normalIndex ++ ];
30614                 normal.y = normals[ normalIndex ++ ];
30615                 normal.z = normals[ normalIndex ];
30616
30617                 face.normal = normal;
30618
30619             }
30620
30621             if ( hasFaceVertexNormal ) {
30622
30623                 for ( i = 0; i < nVertices; i ++ ) {
30624
30625                     var normalIndex = faces[ offset ++ ] * 3;
30626
30627                     var normal = new THREE.Vector3();
30628
30629                     normal.x = normals[ normalIndex ++ ];
30630                     normal.y = normals[ normalIndex ++ ];
30631                     normal.z = normals[ normalIndex ];
30632
30633                     face.vertexNormals.push( normal );
30634
30635                 }
30636
30637             }
30638
30639
30640             if ( hasFaceColor ) {
30641
30642                 var colorIndex = faces[ offset ++ ];
30643
30644                 face.color = new THREE.Color( colors[ colorIndex ] );
30645
30646             }
30647
30648
30649             if ( hasFaceVertexColor ) {
30650
30651                 for ( var i = 0; i < nVertices; i ++ ) {
30652
30653                     var colorIndex = faces[ offset ++ ];
30654
30655                     face.vertexColors.push( new THREE.Color( colors[ colorIndex ] ) );
30656
30657                 }
30658
30659             }
30660
30661             geometry.faces.push( face );
30662
30663         }
30664
30665
30666         // skin
30667
30668         if ( data.skinWeights ) {
30669
30670             for ( var i = 0, l = data.skinWeights.length; i < l; i += 2 ) {
30671
30672                 var x = data.skinWeights[ i ];
30673                 var y = data.skinWeights[ i + 1 ];
30674                 var z = 0;
30675                 var w = 0;
30676
30677                 geometry.skinWeights.push( new THREE.Vector4( x, y, z, w ) );
30678
30679             }
30680
30681         }
30682
30683         if ( data.skinIndices ) {
30684
30685             for ( var i = 0, l = data.skinIndices.length; i < l; i += 2 ) {
30686
30687                 var a = data.skinIndices[ i ];
30688                 var b = data.skinIndices[ i + 1 ];
30689                 var c = 0;
30690                 var d = 0;
30691
30692                 geometry.skinIndices.push( new THREE.Vector4( a, b, c, d ) );
30693
30694             }
30695
30696         }
30697
30698         geometry.bones = data.bones;
30699         geometry.animation = data.animation;
30700
30701
30702         // morphing
30703
30704         if ( data.morphTargets ) {
30705
30706             for ( var i = 0, l = data.morphTargets.length; i < l; i ++ ) {
30707
30708                 geometry.morphTargets[ i ] = {};
30709                 geometry.morphTargets[ i ].name = data.morphTargets[ i ].name;
30710                 geometry.morphTargets[ i ].vertices = [];
30711
30712                 var dstVertices = geometry.morphTargets[ i ].vertices;
30713                 var srcVertices = data.morphTargets [ i ].vertices;
30714
30715                 for( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) {
30716
30717                     var vertex = new THREE.Vector3();
30718                     vertex.x = srcVertices[ v ] * scale;
30719                     vertex.y = srcVertices[ v + 1 ] * scale;
30720                     vertex.z = srcVertices[ v + 2 ] * scale;
30721
30722                     dstVertices.push( vertex );
30723
30724                 }
30725
30726             }
30727
30728         }
30729
30730         if ( data.morphColors ) {
30731
30732             for ( var i = 0, l = data.morphColors.length; i < l; i++ ) {
30733
30734                 geometry.morphColors[ i ] = {};
30735                 geometry.morphColors[ i ].name = data.morphColors[ i ].name;
30736                 geometry.morphColors[ i ].colors = [];
30737
30738                 var dstColors = geometry.morphColors[ i ].colors;
30739                 var srcColors = data.morphColors [ i ].colors;
30740
30741                 for ( var c = 0, cl = srcColors.length; c < cl; c += 3 ) {
30742
30743                     var color = new THREE.Color( 0xffaa00 );
30744                     color.setRGB( srcColors[ c ], srcColors[ c + 1 ], srcColors[ c + 2 ] );
30745
30746                     dstColors.push( color );
30747
30748                 }
30749
30750             }
30751
30752         }
30753
30754         geometry.computeCentroids();
30755         geometry.computeFaceNormals();
30756
30757         return geometry;
30758
30759     }
30760
30761 };
30762 /**
30763  * @author alteredq / http://alteredqualia.com/
30764  */
30765
30766 THREE.SceneLoader = function () {
30767
30768     this.onLoadStart = function () {};
30769     this.onLoadProgress = function() {};
30770     this.onLoadComplete = function () {};
30771
30772     this.callbackSync = function () {};
30773     this.callbackProgress = function () {};
30774
30775     this.geometryHandlerMap = {};
30776
30777     this.addGeometryHandler( "ascii", THREE.JSONLoader );
30778     this.addGeometryHandler( "binary", THREE.BinaryLoader );
30779
30780 };
30781
30782 THREE.SceneLoader.prototype.constructor = THREE.SceneLoader;
30783
30784 THREE.SceneLoader.prototype.load = function ( url, callbackFinished ) {
30785
30786     var scope = this;
30787
30788     var xhr = new XMLHttpRequest();
30789
30790     xhr.onreadystatechange = function () {
30791
30792         if ( xhr.readyState === 4 ) {
30793
30794             if ( xhr.status === 200 || xhr.status === 0 ) {
30795
30796                 var json = JSON.parse( xhr.responseText );
30797                 scope.parse( json, callbackFinished, url );
30798
30799             } else {
30800
30801                 console.error( "THREE.SceneLoader: Couldn't load [" + url + "] [" + xhr.status + "]" );
30802
30803             }
30804
30805         }
30806
30807     };
30808
30809     xhr.open( "GET", url, true );
30810     xhr.send( null );
30811
30812 };
30813
30814 THREE.SceneLoader.prototype.addGeometryHandler = function ( typeID, loaderClass ) {
30815
30816     this.geometryHandlerMap[ typeID ] = { "loaderClass": loaderClass };
30817
30818 };
30819
30820 THREE.SceneLoader.prototype.parse = function ( json, callbackFinished, url ) {
30821
30822     var scope = this;
30823
30824     var urlBase = THREE.Loader.prototype.extractUrlBase( url );
30825
30826     var dg, dm, dl, dc, df, dt,
30827         g, m, l, d, p, r, q, s, c, t, f, tt, pp, u,
30828         geometry, material, camera, fog,
30829         texture, images,
30830         light,
30831         counter_models, counter_textures,
30832         total_models, total_textures,
30833         result;
30834
30835     var data = json;
30836
30837     // async geometry loaders
30838
30839     for ( var typeID in this.geometryHandlerMap ) {
30840
30841         var loaderClass = this.geometryHandlerMap[ typeID ][ "loaderClass" ];
30842         this.geometryHandlerMap[ typeID ][ "loaderObject" ] = new loaderClass();
30843
30844     }
30845
30846     counter_models = 0;
30847     counter_textures = 0;
30848
30849     result = {
30850
30851         scene: new THREE.Scene(),
30852         geometries: {},
30853         materials: {},
30854         textures: {},
30855         objects: {},
30856         cameras: {},
30857         lights: {},
30858         fogs: {},
30859         empties: {}
30860
30861     };
30862
30863     if ( data.transform ) {
30864
30865         var position = data.transform.position,
30866             rotation = data.transform.rotation,
30867             scale = data.transform.scale;
30868
30869         if ( position )
30870             result.scene.position.set( position[ 0 ], position[ 1 ], position [ 2 ] );
30871
30872         if ( rotation )
30873             result.scene.rotation.set( rotation[ 0 ], rotation[ 1 ], rotation [ 2 ] );
30874
30875         if ( scale )
30876             result.scene.scale.set( scale[ 0 ], scale[ 1 ], scale [ 2 ] );
30877
30878         if ( position || rotation || scale ) {
30879
30880             result.scene.updateMatrix();
30881             result.scene.updateMatrixWorld();
30882
30883         }
30884
30885     }
30886
30887     function get_url( source_url, url_type ) {
30888
30889         if ( url_type == "relativeToHTML" ) {
30890
30891             return source_url;
30892
30893         } else {
30894
30895             return urlBase + "/" + source_url;
30896
30897         }
30898
30899     };
30900
30901     // toplevel loader function, delegates to handle_children
30902
30903     function handle_objects() {
30904
30905         handle_children( result.scene, data.objects );
30906
30907     }
30908
30909     // handle all the children from the loaded json and attach them to given parent
30910
30911     function handle_children( parent, children ) {
30912
30913         for ( var dd in children ) {
30914
30915             // check by id if child has already been handled,
30916             // if not, create new object
30917
30918             if ( result.objects[ dd ] === undefined ) {
30919
30920                 var o = children[ dd ];
30921
30922                 var object = null;
30923
30924                 if ( o.geometry !== undefined ) {
30925
30926                     geometry = result.geometries[ o.geometry ];
30927
30928                     // geometry already loaded
30929
30930                     if ( geometry ) {
30931
30932                         var hasNormals = false;
30933
30934                         // not anymore support for multiple materials
30935                         // shouldn't really be array
30936
30937                         material = result.materials[ o.materials[ 0 ] ];
30938                         hasNormals = material instanceof THREE.ShaderMaterial;
30939
30940                         if ( hasNormals ) {
30941
30942                             geometry.computeTangents();
30943
30944                         }
30945
30946                         p = o.position;
30947                         r = o.rotation;
30948                         q = o.quaternion;
30949                         s = o.scale;
30950                         m = o.matrix;
30951
30952                         // turn off quaternions, for the moment
30953
30954                         q = 0;
30955
30956                         if ( o.materials.length === 0 ) {
30957
30958                             material = new THREE.MeshFaceMaterial();
30959
30960                         }
30961
30962                         // dirty hack to handle meshes with multiple materials
30963                         // just use face materials defined in model
30964
30965                         if ( o.materials.length > 1 ) {
30966
30967                             material = new THREE.MeshFaceMaterial();
30968
30969                         }
30970
30971                         if ( o.morph ) {
30972
30973                             object = new THREE.MorphAnimMesh( geometry, material );
30974
30975                             if ( o.duration !== undefined ) {
30976
30977                                 object.duration = o.duration;
30978
30979                             }
30980
30981                             if ( o.time !== undefined ) {
30982
30983                                 object.time = o.time;
30984
30985                             }
30986
30987                             if ( o.mirroredLoop !== undefined ) {
30988
30989                                 object.mirroredLoop = o.mirroredLoop;
30990
30991                             }
30992
30993                             if ( material.morphNormals ) {
30994
30995                                 geometry.computeMorphNormals();
30996
30997                             }
30998
30999                         } else {
31000
31001                             object = new THREE.Mesh( geometry, material );
31002
31003                         }
31004
31005                         object.name = dd;
31006
31007                         if ( m ) {
31008
31009                             object.matrixAutoUpdate = false;
31010                             object.matrix.set(
31011                                 m[0], m[1], m[2], m[3],
31012                                 m[4], m[5], m[6], m[7],
31013                                 m[8], m[9], m[10], m[11],
31014                                 m[12], m[13], m[14], m[15]
31015                             );
31016
31017                         } else {
31018
31019                             object.position.set( p[0], p[1], p[2] );
31020
31021                             if ( q ) {
31022
31023                                 object.quaternion.set( q[0], q[1], q[2], q[3] );
31024                                 object.useQuaternion = true;
31025
31026                             } else {
31027
31028                                 object.rotation.set( r[0], r[1], r[2] );
31029
31030                             }
31031
31032                             object.scale.set( s[0], s[1], s[2] );
31033
31034                         }
31035
31036                         object.visible = o.visible;
31037                         object.castShadow = o.castShadow;
31038                         object.receiveShadow = o.receiveShadow;
31039
31040                         parent.add( object );
31041
31042                         result.objects[ dd ] = object;
31043
31044                     }
31045
31046                 // pure Object3D
31047
31048                 } else {
31049
31050                     p = o.position;
31051                     r = o.rotation;
31052                     q = o.quaternion;
31053                     s = o.scale;
31054
31055                     // turn off quaternions, for the moment
31056
31057                     q = 0;
31058
31059                     object = new THREE.Object3D();
31060                     object.name = dd;
31061                     object.position.set( p[0], p[1], p[2] );
31062
31063                     if ( q ) {
31064
31065                         object.quaternion.set( q[0], q[1], q[2], q[3] );
31066                         object.useQuaternion = true;
31067
31068                     } else {
31069
31070                         object.rotation.set( r[0], r[1], r[2] );
31071
31072                     }
31073
31074                     object.scale.set( s[0], s[1], s[2] );
31075                     object.visible = ( o.visible !== undefined ) ? o.visible : false;
31076
31077                     parent.add( object );
31078
31079                     result.objects[ dd ] = object;
31080                     result.empties[ dd ] = object;
31081
31082                 }
31083
31084                 if ( object ) {
31085
31086                     if ( o.properties !== undefined )  {
31087
31088                         for ( var key in o.properties ) {
31089
31090                             var value = o.properties[ key ];
31091                             object.properties[ key ] = value;
31092
31093                         }
31094
31095                     }
31096
31097                     if ( o.children !== undefined ) {
31098
31099                         handle_children( object, o.children );
31100
31101                     }
31102
31103                 }
31104
31105             }
31106
31107         }
31108
31109     };
31110
31111     function handle_mesh( geo, id ) {
31112
31113         result.geometries[ id ] = geo;
31114         handle_objects();
31115
31116     };
31117
31118     function create_callback( id ) {
31119
31120         return function( geo ) {
31121
31122             handle_mesh( geo, id );
31123
31124             counter_models -= 1;
31125
31126             scope.onLoadComplete();
31127
31128             async_callback_gate();
31129
31130         }
31131
31132     };
31133
31134     function create_callback_embed( id ) {
31135
31136         return function( geo ) {
31137
31138             result.geometries[ id ] = geo;
31139
31140         }
31141
31142     };
31143
31144     function async_callback_gate() {
31145
31146         var progress = {
31147
31148             totalModels : total_models,
31149             totalTextures : total_textures,
31150             loadedModels : total_models - counter_models,
31151             loadedTextures : total_textures - counter_textures
31152
31153         };
31154
31155         scope.callbackProgress( progress, result );
31156
31157         scope.onLoadProgress();
31158
31159         if ( counter_models === 0 && counter_textures === 0 ) {
31160
31161             callbackFinished( result );
31162
31163         }
31164
31165     };
31166
31167     var callbackTexture = function ( count ) {
31168
31169         counter_textures -= count;
31170         async_callback_gate();
31171
31172         scope.onLoadComplete();
31173
31174     };
31175
31176     // must use this instead of just directly calling callbackTexture
31177     // because of closure in the calling context loop
31178
31179     var generateTextureCallback = function ( count ) {
31180
31181         return function() {
31182
31183             callbackTexture( count );
31184
31185         };
31186
31187     };
31188
31189     // first go synchronous elements
31190
31191     // cameras
31192
31193     for( dc in data.cameras ) {
31194
31195         c = data.cameras[ dc ];
31196
31197         if ( c.type === "perspective" ) {
31198
31199             camera = new THREE.PerspectiveCamera( c.fov, c.aspect, c.near, c.far );
31200
31201         } else if ( c.type === "ortho" ) {
31202
31203             camera = new THREE.OrthographicCamera( c.left, c.right, c.top, c.bottom, c.near, c.far );
31204
31205         }
31206
31207         p = c.position;
31208         t = c.target;
31209         u = c.up;
31210
31211         camera.position.set( p[0], p[1], p[2] );
31212         camera.target = new THREE.Vector3( t[0], t[1], t[2] );
31213         if ( u ) camera.up.set( u[0], u[1], u[2] );
31214
31215         result.cameras[ dc ] = camera;
31216
31217     }
31218
31219     // lights
31220
31221     var hex, intensity;
31222
31223     for ( dl in data.lights ) {
31224
31225         l = data.lights[ dl ];
31226
31227         hex = ( l.color !== undefined ) ? l.color : 0xffffff;
31228         intensity = ( l.intensity !== undefined ) ? l.intensity : 1;
31229
31230         if ( l.type === "directional" ) {
31231
31232             p = l.direction;
31233
31234             light = new THREE.DirectionalLight( hex, intensity );
31235             light.position.set( p[0], p[1], p[2] );
31236             light.position.normalize();
31237
31238         } else if ( l.type === "point" ) {
31239
31240             p = l.position;
31241             d = l.distance;
31242
31243             light = new THREE.PointLight( hex, intensity, d );
31244             light.position.set( p[0], p[1], p[2] );
31245
31246         } else if ( l.type === "ambient" ) {
31247
31248             light = new THREE.AmbientLight( hex );
31249
31250         }
31251
31252         result.scene.add( light );
31253
31254         result.lights[ dl ] = light;
31255
31256     }
31257
31258     // fogs
31259
31260     for( df in data.fogs ) {
31261
31262         f = data.fogs[ df ];
31263
31264         if ( f.type === "linear" ) {
31265
31266             fog = new THREE.Fog( 0x000000, f.near, f.far );
31267
31268         } else if ( f.type === "exp2" ) {
31269
31270             fog = new THREE.FogExp2( 0x000000, f.density );
31271
31272         }
31273
31274         c = f.color;
31275         fog.color.setRGB( c[0], c[1], c[2] );
31276
31277         result.fogs[ df ] = fog;
31278
31279     }
31280
31281     // defaults
31282
31283     if ( result.cameras && data.defaults && data.defaults.camera ) {
31284
31285         result.currentCamera = result.cameras[ data.defaults.camera ];
31286
31287     }
31288
31289     if ( result.fogs && data.defaults && data.defaults.fog ) {
31290
31291         result.scene.fog = result.fogs[ data.defaults.fog ];
31292
31293     }
31294
31295     c = data.defaults.bgcolor;
31296     result.bgColor = new THREE.Color();
31297     result.bgColor.setRGB( c[0], c[1], c[2] );
31298
31299     result.bgColorAlpha = data.defaults.bgalpha;
31300
31301     // now come potentially asynchronous elements
31302
31303     // geometries
31304
31305     // count how many models will be loaded asynchronously
31306
31307     for( dg in data.geometries ) {
31308
31309         g = data.geometries[ dg ];
31310
31311         if ( g.type in this.geometryHandlerMap ) {
31312
31313             counter_models += 1;
31314
31315             scope.onLoadStart();
31316
31317         }
31318
31319     }
31320
31321     total_models = counter_models;
31322
31323     for ( dg in data.geometries ) {
31324
31325         g = data.geometries[ dg ];
31326
31327         if ( g.type === "cube" ) {
31328
31329             geometry = new THREE.CubeGeometry( g.width, g.height, g.depth, g.segmentsWidth, g.segmentsHeight, g.segmentsDepth, null, g.flipped, g.sides );
31330             result.geometries[ dg ] = geometry;
31331
31332         } else if ( g.type === "plane" ) {
31333
31334             geometry = new THREE.PlaneGeometry( g.width, g.height, g.segmentsWidth, g.segmentsHeight );
31335             result.geometries[ dg ] = geometry;
31336
31337         } else if ( g.type === "sphere" ) {
31338
31339             geometry = new THREE.SphereGeometry( g.radius, g.segmentsWidth, g.segmentsHeight );
31340             result.geometries[ dg ] = geometry;
31341
31342         } else if ( g.type === "cylinder" ) {
31343
31344             geometry = new THREE.CylinderGeometry( g.topRad, g.botRad, g.height, g.radSegs, g.heightSegs );
31345             result.geometries[ dg ] = geometry;
31346
31347         } else if ( g.type === "torus" ) {
31348
31349             geometry = new THREE.TorusGeometry( g.radius, g.tube, g.segmentsR, g.segmentsT );
31350             result.geometries[ dg ] = geometry;
31351
31352         } else if ( g.type === "icosahedron" ) {
31353
31354             geometry = new THREE.IcosahedronGeometry( g.radius, g.subdivisions );
31355             result.geometries[ dg ] = geometry;
31356
31357         } else if ( g.type in this.geometryHandlerMap ) {
31358
31359             var loaderParameters = {};
31360             for ( var parType in g ) {
31361
31362                 if ( parType !== "type" && parType !== "url" ) {
31363
31364                     loaderParameters[ parType ] = g[ parType ];
31365
31366                 }
31367
31368             }
31369
31370             var loader = this.geometryHandlerMap[ g.type ][ "loaderObject" ];
31371             loader.load( get_url( g.url, data.urlBaseType ), create_callback( dg ), loaderParameters );
31372
31373         } else if ( g.type === "embedded" ) {
31374
31375             var modelJson = data.embeds[ g.id ],
31376                 texture_path = "";
31377
31378             // pass metadata along to jsonLoader so it knows the format version
31379
31380             modelJson.metadata = data.metadata;
31381
31382             if ( modelJson ) {
31383
31384                 var jsonLoader = this.geometryHandlerMap[ "ascii" ][ "loaderObject" ];
31385                 jsonLoader.createModel( modelJson, create_callback_embed( dg ), texture_path );
31386
31387             }
31388
31389         }
31390
31391     }
31392
31393     // textures
31394
31395     // count how many textures will be loaded asynchronously
31396
31397     for( dt in data.textures ) {
31398
31399         tt = data.textures[ dt ];
31400
31401         if( tt.url instanceof Array ) {
31402
31403             counter_textures += tt.url.length;
31404
31405             for( var n = 0; n < tt.url.length; n ++ ) {
31406
31407                 scope.onLoadStart();
31408
31409             }
31410
31411         } else {
31412
31413             counter_textures += 1;
31414
31415             scope.onLoadStart();
31416
31417         }
31418
31419     }
31420
31421     total_textures = counter_textures;
31422
31423     for ( dt in data.textures ) {
31424
31425         tt = data.textures[ dt ];
31426
31427         if ( tt.mapping !== undefined && THREE[ tt.mapping ] !== undefined  ) {
31428
31429             tt.mapping = new THREE[ tt.mapping ]();
31430
31431         }
31432
31433         if ( tt.url instanceof Array ) {
31434
31435             var count = tt.url.length;
31436             var url_array = [];
31437
31438             for( var i = 0; i < count; i ++ ) {
31439
31440                 url_array[ i ] = get_url( tt.url[ i ], data.urlBaseType );
31441
31442             }
31443
31444             var isCompressed = url_array[ 0 ].endsWith( ".dds" );
31445
31446             if ( isCompressed ) {
31447
31448                 texture = THREE.ImageUtils.loadCompressedTextureCube( url_array, tt.mapping, generateTextureCallback( count ) );
31449
31450             } else {
31451
31452                 texture = THREE.ImageUtils.loadTextureCube( url_array, tt.mapping, generateTextureCallback( count ) );
31453
31454             }
31455
31456         } else {
31457
31458             var isCompressed = tt.url.toLowerCase().endsWith( ".dds" );
31459             var fullUrl = get_url( tt.url, data.urlBaseType );
31460             var textureCallback = generateTextureCallback( 1 );
31461
31462             if ( isCompressed ) {
31463
31464                 texture = THREE.ImageUtils.loadCompressedTexture( fullUrl, tt.mapping, textureCallback );
31465
31466             } else {
31467
31468                 texture = THREE.ImageUtils.loadTexture( fullUrl, tt.mapping, textureCallback );
31469
31470             }
31471
31472             if ( THREE[ tt.minFilter ] !== undefined )
31473                 texture.minFilter = THREE[ tt.minFilter ];
31474
31475             if ( THREE[ tt.magFilter ] !== undefined )
31476                 texture.magFilter = THREE[ tt.magFilter ];
31477
31478             if ( tt.anisotropy ) texture.anisotropy = tt.anisotropy;
31479
31480             if ( tt.repeat ) {
31481
31482                 texture.repeat.set( tt.repeat[ 0 ], tt.repeat[ 1 ] );
31483
31484                 if ( tt.repeat[ 0 ] !== 1 ) texture.wrapS = THREE.RepeatWrapping;
31485                 if ( tt.repeat[ 1 ] !== 1 ) texture.wrapT = THREE.RepeatWrapping;
31486
31487             }
31488
31489             if ( tt.offset ) {
31490
31491                 texture.offset.set( tt.offset[ 0 ], tt.offset[ 1 ] );
31492
31493             }
31494
31495             // handle wrap after repeat so that default repeat can be overriden
31496
31497             if ( tt.wrap ) {
31498
31499                 var wrapMap = {
31500                 "repeat"     : THREE.RepeatWrapping,
31501                 "mirror"    : THREE.MirroredRepeatWrapping
31502                 }
31503
31504                 if ( wrapMap[ tt.wrap[ 0 ] ] !== undefined ) texture.wrapS = wrapMap[ tt.wrap[ 0 ] ];
31505                 if ( wrapMap[ tt.wrap[ 1 ] ] !== undefined ) texture.wrapT = wrapMap[ tt.wrap[ 1 ] ];
31506
31507             }
31508
31509         }
31510
31511         result.textures[ dt ] = texture;
31512
31513     }
31514
31515     // materials
31516
31517     for ( dm in data.materials ) {
31518
31519         m = data.materials[ dm ];
31520
31521         for ( pp in m.parameters ) {
31522
31523             if ( pp === "envMap" || pp === "map" || pp === "lightMap" || pp === "bumpMap" ) {
31524
31525                 m.parameters[ pp ] = result.textures[ m.parameters[ pp ] ];
31526
31527             } else if ( pp === "shading" ) {
31528
31529                 m.parameters[ pp ] = ( m.parameters[ pp ] === "flat" ) ? THREE.FlatShading : THREE.SmoothShading;
31530
31531             } else if ( pp === "side" ) {
31532
31533                 if (  m.parameters[ pp ] == "double" ) {
31534
31535                     m.parameters[ pp ] = THREE.DoubleSide;
31536
31537                 } else if ( m.parameters[ pp ] == "back" ) {
31538
31539                     m.parameters[ pp ] = THREE.BackSide;
31540
31541                 } else {
31542
31543                     m.parameters[ pp ] = THREE.FrontSide;
31544
31545                 }
31546
31547             } else if ( pp === "blending" ) {
31548
31549                 m.parameters[ pp ] = m.parameters[ pp ] in THREE ? THREE[ m.parameters[ pp ] ] : THREE.NormalBlending;
31550
31551             } else if ( pp === "combine" ) {
31552
31553                 m.parameters[ pp ] = ( m.parameters[ pp ] == "MixOperation" ) ? THREE.MixOperation : THREE.MultiplyOperation;
31554
31555             } else if ( pp === "vertexColors" ) {
31556
31557                 if ( m.parameters[ pp ] == "face" ) {
31558
31559                     m.parameters[ pp ] = THREE.FaceColors;
31560
31561                 // default to vertex colors if "vertexColors" is anything else face colors or 0 / null / false
31562
31563                 } else if ( m.parameters[ pp ] )   {
31564
31565                     m.parameters[ pp ] = THREE.VertexColors;
31566
31567                 }
31568
31569             } else if ( pp === "wrapRGB" ) {
31570
31571                 var v3 = m.parameters[ pp ];
31572                 m.parameters[ pp ] = new THREE.Vector3( v3[ 0 ], v3[ 1 ], v3[ 2 ] );
31573
31574             }
31575
31576         }
31577
31578         if ( m.parameters.opacity !== undefined && m.parameters.opacity < 1.0 ) {
31579
31580             m.parameters.transparent = true;
31581
31582         }
31583
31584         if ( m.parameters.normalMap ) {
31585
31586             var shader = THREE.ShaderUtils.lib[ "normal" ];
31587             var uniforms = THREE.UniformsUtils.clone( shader.uniforms );
31588
31589             var diffuse = m.parameters.color;
31590             var specular = m.parameters.specular;
31591             var ambient = m.parameters.ambient;
31592             var shininess = m.parameters.shininess;
31593
31594             uniforms[ "tNormal" ].value = result.textures[ m.parameters.normalMap ];
31595
31596             if ( m.parameters.normalScale ) {
31597
31598                 uniforms[ "uNormalScale" ].value.set( m.parameters.normalScale[ 0 ], m.parameters.normalScale[ 1 ] );
31599
31600             }
31601
31602             if ( m.parameters.map ) {
31603
31604                 uniforms[ "tDiffuse" ].value = m.parameters.map;
31605                 uniforms[ "enableDiffuse" ].value = true;
31606
31607             }
31608
31609             if ( m.parameters.envMap ) {
31610
31611                 uniforms[ "tCube" ].value = m.parameters.envMap;
31612                 uniforms[ "enableReflection" ].value = true;
31613                 uniforms[ "uReflectivity" ].value = m.parameters.reflectivity;
31614
31615             }
31616
31617             if ( m.parameters.lightMap ) {
31618
31619                 uniforms[ "tAO" ].value = m.parameters.lightMap;
31620                 uniforms[ "enableAO" ].value = true;
31621
31622             }
31623
31624             if ( m.parameters.specularMap ) {
31625
31626                 uniforms[ "tSpecular" ].value = result.textures[ m.parameters.specularMap ];
31627                 uniforms[ "enableSpecular" ].value = true;
31628
31629             }
31630
31631             if ( m.parameters.displacementMap ) {
31632
31633                 uniforms[ "tDisplacement" ].value = result.textures[ m.parameters.displacementMap ];
31634                 uniforms[ "enableDisplacement" ].value = true;
31635
31636                 uniforms[ "uDisplacementBias" ].value = m.parameters.displacementBias;
31637                 uniforms[ "uDisplacementScale" ].value = m.parameters.displacementScale;
31638
31639             }
31640
31641             uniforms[ "uDiffuseColor" ].value.setHex( diffuse );
31642             uniforms[ "uSpecularColor" ].value.setHex( specular );
31643             uniforms[ "uAmbientColor" ].value.setHex( ambient );
31644
31645             uniforms[ "uShininess" ].value = shininess;
31646
31647             if ( m.parameters.opacity ) {
31648
31649                 uniforms[ "uOpacity" ].value = m.parameters.opacity;
31650
31651             }
31652
31653             var parameters = { fragmentShader: shader.fragmentShader, vertexShader: shader.vertexShader, uniforms: uniforms, lights: true, fog: true };
31654
31655             material = new THREE.ShaderMaterial( parameters );
31656
31657         } else {
31658
31659             material = new THREE[ m.type ]( m.parameters );
31660
31661         }
31662
31663         result.materials[ dm ] = material;
31664
31665     }
31666
31667     // objects ( synchronous init of procedural primitives )
31668
31669     handle_objects();
31670
31671     // synchronous callback
31672
31673     scope.callbackSync( result );
31674
31675     // just in case there are no async elements
31676
31677     async_callback_gate();
31678
31679 };
31680 /**
31681  * @author mrdoob / http://mrdoob.com/
31682  */
31683
31684 THREE.TextureLoader = function () {
31685
31686     THREE.EventTarget.call( this );
31687
31688     this.crossOrigin = null;
31689
31690 };
31691
31692 THREE.TextureLoader.prototype = {
31693
31694     constructor: THREE.TextureLoader,
31695
31696     load: function ( url ) {
31697
31698         var scope = this;
31699
31700         var image = new Image();
31701
31702         image.addEventListener( 'load', function () {
31703
31704             var texture = new THREE.Texture( image );
31705             texture.needsUpdate = true;
31706
31707             scope.dispatchEvent( { type: 'load', content: texture } );
31708
31709         }, false );
31710
31711         image.addEventListener( 'error', function () {
31712
31713             scope.dispatchEvent( { type: 'error', message: 'Couldn\'t load URL [' + url + ']' } );
31714
31715         }, false );
31716
31717         if ( scope.crossOrigin ) image.crossOrigin = scope.crossOrigin;
31718
31719         image.src = url;
31720
31721     }
31722
31723 }
31724 /**
31725  * @author mrdoob / http://mrdoob.com/
31726  * @author alteredq / http://alteredqualia.com/
31727  */
31728
31729 THREE.Material = function () {
31730
31731     this.id = THREE.MaterialCount ++;
31732
31733     this.name = '';
31734
31735     this.side = THREE.FrontSide;
31736
31737     this.opacity = 1;
31738     this.transparent = false;
31739
31740     this.blending = THREE.NormalBlending;
31741
31742     this.blendSrc = THREE.SrcAlphaFactor;
31743     this.blendDst = THREE.OneMinusSrcAlphaFactor;
31744     this.blendEquation = THREE.AddEquation;
31745
31746     this.depthTest = true;
31747     this.depthWrite = true;
31748
31749     this.polygonOffset = false;
31750     this.polygonOffsetFactor = 0;
31751     this.polygonOffsetUnits = 0;
31752
31753     this.alphaTest = 0;
31754
31755     this.overdraw = false; // Boolean for fixing antialiasing gaps in CanvasRenderer
31756
31757     this.visible = true;
31758
31759     this.needsUpdate = true;
31760
31761 };
31762
31763 THREE.Material.prototype.setValues = function ( values ) {
31764
31765     if ( values === undefined ) return;
31766
31767     for ( var key in values ) {
31768
31769         var newValue = values[ key ];
31770
31771         if ( newValue === undefined ) {
31772
31773             console.warn( 'THREE.Material: \'' + key + '\' parameter is undefined.' );
31774             continue;
31775
31776         }
31777
31778         if ( key in this ) {
31779
31780             var currentValue = this[ key ];
31781
31782             if ( currentValue instanceof THREE.Color && newValue instanceof THREE.Color ) {
31783
31784                 currentValue.copy( newValue );
31785
31786             } else if ( currentValue instanceof THREE.Color && typeof( newValue ) === "number" ) {
31787
31788                 currentValue.setHex( newValue );
31789
31790             } else if ( currentValue instanceof THREE.Vector3 && newValue instanceof THREE.Vector3 ) {
31791
31792                 currentValue.copy( newValue );
31793
31794             } else {
31795
31796                 this[ key ] = newValue;
31797
31798             }
31799
31800         }
31801
31802     }
31803
31804 };
31805
31806 THREE.Material.prototype.clone = function ( material ) {
31807
31808     if ( material === undefined ) material = new THREE.Material();
31809
31810     material.name = this.name;
31811
31812     material.side = this.side;
31813
31814     material.opacity = this.opacity;
31815     material.transparent = this.transparent;
31816
31817     material.blending = this.blending;
31818
31819     material.blendSrc = this.blendSrc;
31820     material.blendDst = this.blendDst;
31821     material.blendEquation = this.blendEquation;
31822
31823     material.depthTest = this.depthTest;
31824     material.depthWrite = this.depthWrite;
31825
31826     material.polygonOffset = this.polygonOffset;
31827     material.polygonOffsetFactor = this.polygonOffsetFactor;
31828     material.polygonOffsetUnits = this.polygonOffsetUnits;
31829
31830     material.alphaTest = this.alphaTest;
31831
31832     material.overdraw = this.overdraw;
31833
31834     material.visible = this.visible;
31835
31836     return material;
31837
31838 };
31839
31840 THREE.MaterialCount = 0;
31841 /**
31842  * @author mrdoob / http://mrdoob.com/
31843  * @author alteredq / http://alteredqualia.com/
31844  *
31845  * parameters = {
31846  *  color: <hex>,
31847  *  opacity: <float>,
31848  *
31849  *  blending: THREE.NormalBlending,
31850  *  depthTest: <bool>,
31851  *
31852  *  linewidth: <float>,
31853  *  linecap: "round",
31854  *  linejoin: "round",
31855  *
31856  *  vertexColors: <bool>
31857  *
31858  *  fog: <bool>
31859  * }
31860  */
31861
31862 THREE.LineBasicMaterial = function ( parameters ) {
31863
31864     THREE.Material.call( this );
31865
31866     this.color = new THREE.Color( 0xffffff );
31867
31868     this.linewidth = 1;
31869     this.linecap = 'round';
31870     this.linejoin = 'round';
31871
31872     this.vertexColors = false;
31873
31874     this.fog = true;
31875
31876     this.setValues( parameters );
31877
31878 };
31879
31880 THREE.LineBasicMaterial.prototype = Object.create( THREE.Material.prototype );
31881
31882 THREE.LineBasicMaterial.prototype.clone = function () {
31883
31884     var material = new THREE.LineBasicMaterial();
31885
31886     THREE.Material.prototype.clone.call( this, material );
31887
31888     material.color.copy( this.color );
31889
31890     material.linewidth = this.linewidth;
31891     material.linecap = this.linecap;
31892     material.linejoin = this.linejoin;
31893
31894     material.vertexColors = this.vertexColors;
31895
31896     material.fog = this.fog;
31897
31898     return material;
31899
31900 };
31901 /**
31902  * @author mrdoob / http://mrdoob.com/
31903  * @author alteredq / http://alteredqualia.com/
31904  *
31905  * parameters = {
31906  *  color: <hex>,
31907  *  opacity: <float>,
31908  *  map: new THREE.Texture( <Image> ),
31909  *
31910  *  lightMap: new THREE.Texture( <Image> ),
31911  *
31912  *  specularMap: new THREE.Texture( <Image> ),
31913  *
31914  *  envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),
31915  *  combine: THREE.Multiply,
31916  *  reflectivity: <float>,
31917  *  refractionRatio: <float>,
31918  *
31919  *  shading: THREE.SmoothShading,
31920  *  blending: THREE.NormalBlending,
31921  *  depthTest: <bool>,
31922  *
31923  *  wireframe: <boolean>,
31924  *  wireframeLinewidth: <float>,
31925  *
31926  *  vertexColors: THREE.NoColors / THREE.VertexColors / THREE.FaceColors,
31927  *
31928  *  skinning: <bool>,
31929  *  morphTargets: <bool>,
31930  *
31931  *  fog: <bool>
31932  * }
31933  */
31934
31935 THREE.MeshBasicMaterial = function ( parameters ) {
31936
31937     THREE.Material.call( this );
31938
31939     this.color = new THREE.Color( 0xffffff ); // emissive
31940
31941     this.map = null;
31942
31943     this.lightMap = null;
31944
31945     this.specularMap = null;
31946
31947     this.envMap = null;
31948     this.combine = THREE.MultiplyOperation;
31949     this.reflectivity = 1;
31950     this.refractionRatio = 0.98;
31951
31952     this.fog = true;
31953
31954     this.shading = THREE.SmoothShading;
31955
31956     this.wireframe = false;
31957     this.wireframeLinewidth = 1;
31958     this.wireframeLinecap = 'round';
31959     this.wireframeLinejoin = 'round';
31960
31961     this.vertexColors = THREE.NoColors;
31962
31963     this.skinning = false;
31964     this.morphTargets = false;
31965
31966     this.setValues( parameters );
31967
31968 };
31969
31970 THREE.MeshBasicMaterial.prototype = Object.create( THREE.Material.prototype );
31971
31972 THREE.MeshBasicMaterial.prototype.clone = function () {
31973
31974     var material = new THREE.MeshBasicMaterial();
31975
31976     THREE.Material.prototype.clone.call( this, material );
31977
31978     material.color.copy( this.color );
31979
31980     material.map = this.map;
31981
31982     material.lightMap = this.lightMap;
31983
31984     material.specularMap = this.specularMap;
31985
31986     material.envMap = this.envMap;
31987     material.combine = this.combine;
31988     material.reflectivity = this.reflectivity;
31989     material.refractionRatio = this.refractionRatio;
31990
31991     material.fog = this.fog;
31992
31993     material.shading = this.shading;
31994
31995     material.wireframe = this.wireframe;
31996     material.wireframeLinewidth = this.wireframeLinewidth;
31997     material.wireframeLinecap = this.wireframeLinecap;
31998     material.wireframeLinejoin = this.wireframeLinejoin;
31999
32000     material.vertexColors = this.vertexColors;
32001
32002     material.skinning = this.skinning;
32003     material.morphTargets = this.morphTargets;
32004
32005     return material;
32006
32007 };
32008 /**
32009  * @author mrdoob / http://mrdoob.com/
32010  * @author alteredq / http://alteredqualia.com/
32011  *
32012  * parameters = {
32013  *  color: <hex>,
32014  *  ambient: <hex>,
32015  *  emissive: <hex>,
32016  *  opacity: <float>,
32017  *
32018  *  map: new THREE.Texture( <Image> ),
32019  *
32020  *  lightMap: new THREE.Texture( <Image> ),
32021  *
32022  *  specularMap: new THREE.Texture( <Image> ),
32023  *
32024  *  envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),
32025  *  combine: THREE.Multiply,
32026  *  reflectivity: <float>,
32027  *  refractionRatio: <float>,
32028  *
32029  *  shading: THREE.SmoothShading,
32030  *  blending: THREE.NormalBlending,
32031  *  depthTest: <bool>,
32032  *
32033  *  wireframe: <boolean>,
32034  *  wireframeLinewidth: <float>,
32035  *
32036  *  vertexColors: THREE.NoColors / THREE.VertexColors / THREE.FaceColors,
32037  *
32038  *  skinning: <bool>,
32039  *  morphTargets: <bool>,
32040  *  morphNormals: <bool>,
32041  *
32042  *    fog: <bool>
32043  * }
32044  */
32045
32046 THREE.MeshLambertMaterial = function ( parameters ) {
32047
32048     THREE.Material.call( this );
32049
32050     this.color = new THREE.Color( 0xffffff ); // diffuse
32051     this.ambient = new THREE.Color( 0xffffff );
32052     this.emissive = new THREE.Color( 0x000000 );
32053
32054     this.wrapAround = false;
32055     this.wrapRGB = new THREE.Vector3( 1, 1, 1 );
32056
32057     this.map = null;
32058
32059     this.lightMap = null;
32060
32061     this.specularMap = null;
32062
32063     this.envMap = null;
32064     this.combine = THREE.MultiplyOperation;
32065     this.reflectivity = 1;
32066     this.refractionRatio = 0.98;
32067
32068     this.fog = true;
32069
32070     this.shading = THREE.SmoothShading;
32071
32072     this.wireframe = false;
32073     this.wireframeLinewidth = 1;
32074     this.wireframeLinecap = 'round';
32075     this.wireframeLinejoin = 'round';
32076
32077     this.vertexColors = THREE.NoColors;
32078
32079     this.skinning = false;
32080     this.morphTargets = false;
32081     this.morphNormals = false;
32082
32083     this.setValues( parameters );
32084
32085 };
32086
32087 THREE.MeshLambertMaterial.prototype = Object.create( THREE.Material.prototype );
32088
32089 THREE.MeshLambertMaterial.prototype.clone = function () {
32090
32091     var material = new THREE.MeshLambertMaterial();
32092
32093     THREE.Material.prototype.clone.call( this, material );
32094
32095     material.color.copy( this.color );
32096     material.ambient.copy( this.ambient );
32097     material.emissive.copy( this.emissive );
32098
32099     material.wrapAround = this.wrapAround;
32100     material.wrapRGB.copy( this.wrapRGB );
32101
32102     material.map = this.map;
32103
32104     material.lightMap = this.lightMap;
32105
32106     material.specularMap = this.specularMap;
32107
32108     material.envMap = this.envMap;
32109     material.combine = this.combine;
32110     material.reflectivity = this.reflectivity;
32111     material.refractionRatio = this.refractionRatio;
32112
32113     material.fog = this.fog;
32114
32115     material.shading = this.shading;
32116
32117     material.wireframe = this.wireframe;
32118     material.wireframeLinewidth = this.wireframeLinewidth;
32119     material.wireframeLinecap = this.wireframeLinecap;
32120     material.wireframeLinejoin = this.wireframeLinejoin;
32121
32122     material.vertexColors = this.vertexColors;
32123
32124     material.skinning = this.skinning;
32125     material.morphTargets = this.morphTargets;
32126     material.morphNormals = this.morphNormals;
32127
32128     return material;
32129
32130 };
32131 /**
32132  * @author mrdoob / http://mrdoob.com/
32133  * @author alteredq / http://alteredqualia.com/
32134  *
32135  * parameters = {
32136  *  color: <hex>,
32137  *  ambient: <hex>,
32138  *  emissive: <hex>,
32139  *  specular: <hex>,
32140  *  shininess: <float>,
32141  *  opacity: <float>,
32142  *
32143  *  map: new THREE.Texture( <Image> ),
32144  *
32145  *  lightMap: new THREE.Texture( <Image> ),
32146  *
32147  *  bumpMap: new THREE.Texture( <Image> ),
32148  *  bumpScale: <float>,
32149  *
32150  *  normalMap: new THREE.Texture( <Image> ),
32151  *  normalScale: <Vector2>,
32152  *
32153  *  specularMap: new THREE.Texture( <Image> ),
32154  *
32155  *  envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),
32156  *  combine: THREE.Multiply,
32157  *  reflectivity: <float>,
32158  *  refractionRatio: <float>,
32159  *
32160  *  shading: THREE.SmoothShading,
32161  *  blending: THREE.NormalBlending,
32162  *  depthTest: <bool>,
32163  *
32164  *  wireframe: <boolean>,
32165  *  wireframeLinewidth: <float>,
32166  *
32167  *  vertexColors: THREE.NoColors / THREE.VertexColors / THREE.FaceColors,
32168  *
32169  *  skinning: <bool>,
32170  *  morphTargets: <bool>,
32171  *  morphNormals: <bool>,
32172  *
32173  *    fog: <bool>
32174  * }
32175  */
32176
32177 THREE.MeshPhongMaterial = function ( parameters ) {
32178
32179     THREE.Material.call( this );
32180
32181     this.color = new THREE.Color( 0xffffff ); // diffuse
32182     this.ambient = new THREE.Color( 0xffffff );
32183     this.emissive = new THREE.Color( 0x000000 );
32184     this.specular = new THREE.Color( 0x111111 );
32185     this.shininess = 30;
32186
32187     this.metal = false;
32188     this.perPixel = false;
32189
32190     this.wrapAround = false;
32191     this.wrapRGB = new THREE.Vector3( 1, 1, 1 );
32192
32193     this.map = null;
32194
32195     this.lightMap = null;
32196
32197     this.bumpMap = null;
32198     this.bumpScale = 1;
32199
32200     this.normalMap = null;
32201     this.normalScale = new THREE.Vector2( 1, 1 );
32202
32203     this.specularMap = null;
32204
32205     this.envMap = null;
32206     this.combine = THREE.MultiplyOperation;
32207     this.reflectivity = 1;
32208     this.refractionRatio = 0.98;
32209
32210     this.fog = true;
32211
32212     this.shading = THREE.SmoothShading;
32213
32214     this.wireframe = false;
32215     this.wireframeLinewidth = 1;
32216     this.wireframeLinecap = 'round';
32217     this.wireframeLinejoin = 'round';
32218
32219     this.vertexColors = THREE.NoColors;
32220
32221     this.skinning = false;
32222     this.morphTargets = false;
32223     this.morphNormals = false;
32224
32225     this.setValues( parameters );
32226
32227 };
32228
32229 THREE.MeshPhongMaterial.prototype = Object.create( THREE.Material.prototype );
32230
32231 THREE.MeshPhongMaterial.prototype.clone = function () {
32232
32233     var material = new THREE.MeshPhongMaterial();
32234
32235     THREE.Material.prototype.clone.call( this, material );
32236
32237     material.color.copy( this.color );
32238     material.ambient.copy( this.ambient );
32239     material.emissive.copy( this.emissive );
32240     material.specular.copy( this.specular );
32241     material.shininess = this.shininess;
32242
32243     material.metal = this.metal;
32244     material.perPixel = this.perPixel;
32245
32246     material.wrapAround = this.wrapAround;
32247     material.wrapRGB.copy( this.wrapRGB );
32248
32249     material.map = this.map;
32250
32251     material.lightMap = this.lightMap;
32252
32253     material.bumpMap = this.bumpMap;
32254     material.bumpScale = this.bumpScale;
32255
32256     material.normalMap = this.normalMap;
32257     material.normalScale.copy( this.normalScale );
32258
32259     material.specularMap = this.specularMap;
32260
32261     material.envMap = this.envMap;
32262     material.combine = this.combine;
32263     material.reflectivity = this.reflectivity;
32264     material.refractionRatio = this.refractionRatio;
32265
32266     material.fog = this.fog;
32267
32268     material.shading = this.shading;
32269
32270     material.wireframe = this.wireframe;
32271     material.wireframeLinewidth = this.wireframeLinewidth;
32272     material.wireframeLinecap = this.wireframeLinecap;
32273     material.wireframeLinejoin = this.wireframeLinejoin;
32274
32275     material.vertexColors = this.vertexColors;
32276
32277     material.skinning = this.skinning;
32278     material.morphTargets = this.morphTargets;
32279     material.morphNormals = this.morphNormals;
32280
32281     return material;
32282
32283 };
32284 /**
32285  * @author mrdoob / http://mrdoob.com/
32286  * @author alteredq / http://alteredqualia.com/
32287  *
32288  * parameters = {
32289  *  opacity: <float>,
32290
32291  *  blending: THREE.NormalBlending,
32292  *  depthTest: <bool>,
32293
32294  *  wireframe: <boolean>,
32295  *  wireframeLinewidth: <float>
32296  * }
32297  */
32298
32299 THREE.MeshDepthMaterial = function ( parameters ) {
32300
32301     THREE.Material.call( this );
32302
32303     this.wireframe = false;
32304     this.wireframeLinewidth = 1;
32305
32306     this.setValues( parameters );
32307
32308 };
32309
32310 THREE.MeshDepthMaterial.prototype = Object.create( THREE.Material.prototype );
32311
32312 THREE.MeshDepthMaterial.prototype.clone = function () {
32313
32314     var material = new THREE.LineBasicMaterial();
32315
32316     THREE.Material.prototype.clone.call( this, material );
32317
32318     material.wireframe = this.wireframe;
32319     material.wireframeLinewidth = this.wireframeLinewidth;
32320
32321     return material;
32322
32323 };
32324 /**
32325  * @author mrdoob / http://mrdoob.com/
32326  *
32327  * parameters = {
32328  *  opacity: <float>,
32329
32330  *  shading: THREE.FlatShading,
32331  *  blending: THREE.NormalBlending,
32332  *  depthTest: <bool>,
32333
32334  *  wireframe: <boolean>,
32335  *  wireframeLinewidth: <float>
32336  * }
32337  */
32338
32339 THREE.MeshNormalMaterial = function ( parameters ) {
32340
32341     THREE.Material.call( this, parameters );
32342
32343     this.shading = THREE.FlatShading;
32344
32345     this.wireframe = false;
32346     this.wireframeLinewidth = 1;
32347
32348     this.setValues( parameters );
32349
32350 };
32351
32352 THREE.MeshNormalMaterial.prototype = Object.create( THREE.Material.prototype );
32353
32354 THREE.MeshNormalMaterial.prototype.clone = function () {
32355
32356     var material = new THREE.MeshNormalMaterial();
32357
32358     THREE.Material.prototype.clone.call( this, material );
32359
32360     material.shading = this.shading;
32361
32362     material.wireframe = this.wireframe;
32363     material.wireframeLinewidth = this.wireframeLinewidth;
32364
32365     return material;
32366
32367 };
32368 /**
32369  * @author mrdoob / http://mrdoob.com/
32370  */
32371
32372 THREE.MeshFaceMaterial = function () {};
32373
32374 THREE.MeshFaceMaterial.prototype.clone = function () {
32375
32376     return new THREE.MeshFaceMaterial();
32377
32378 };
32379 /**
32380  * @author mrdoob / http://mrdoob.com/
32381  * @author alteredq / http://alteredqualia.com/
32382  *
32383  * parameters = {
32384  *  color: <hex>,
32385  *  opacity: <float>,
32386  *  map: new THREE.Texture( <Image> ),
32387  *
32388  *  size: <float>,
32389  *
32390  *  blending: THREE.NormalBlending,
32391  *  depthTest: <bool>,
32392  *
32393  *  vertexColors: <bool>,
32394  *
32395  *  fog: <bool>
32396  * }
32397  */
32398
32399 THREE.ParticleBasicMaterial = function ( parameters ) {
32400
32401     THREE.Material.call( this );
32402
32403     this.color = new THREE.Color( 0xffffff );
32404
32405     this.map = null;
32406
32407     this.size = 1;
32408     this.sizeAttenuation = true;
32409
32410     this.vertexColors = false;
32411
32412     this.fog = true;
32413
32414     this.setValues( parameters );
32415
32416 };
32417
32418 THREE.ParticleBasicMaterial.prototype = Object.create( THREE.Material.prototype );
32419
32420 THREE.ParticleBasicMaterial.prototype.clone = function () {
32421
32422     var material = new THREE.ParticleBasicMaterial();
32423
32424     THREE.Material.prototype.clone.call( this, material );
32425
32426     material.color.copy( this.color );
32427
32428     material.map = this.map;
32429
32430     material.size = this.size;
32431     material.sizeAttenuation = this.sizeAttenuation;
32432
32433     material.vertexColors = this.vertexColors;
32434
32435     material.fog = this.fog;
32436
32437     return material;
32438
32439 };
32440 /**
32441  * @author mrdoob / http://mrdoob.com/
32442  *
32443  * parameters = {
32444  *  color: <hex>,
32445  *  program: <function>,
32446  *  opacity: <float>,
32447  *  blending: THREE.NormalBlending
32448  * }
32449  */
32450
32451 THREE.ParticleCanvasMaterial = function ( parameters ) {
32452
32453     THREE.Material.call( this );
32454
32455     this.color = new THREE.Color( 0xffffff );
32456     this.program = function ( context, color ) {};
32457
32458     this.setValues( parameters );
32459
32460 };
32461
32462 THREE.ParticleCanvasMaterial.prototype = Object.create( THREE.Material.prototype );
32463
32464 THREE.ParticleCanvasMaterial.prototype.clone = function () {
32465
32466     var material = new THREE.ParticleCanvasMaterial();
32467
32468     THREE.Material.prototype.clone.call( this, material );
32469
32470     material.color.copy( this.color );
32471     material.program = this.program;
32472
32473     return material;
32474
32475 };
32476 /**
32477  * @author mrdoob / http://mrdoob.com/
32478  */
32479
32480 THREE.ParticleDOMMaterial = function ( element ) {
32481
32482     this.element = element;
32483
32484 };
32485
32486 THREE.ParticleDOMMaterial.prototype.clone = function(){
32487
32488     return new THREE.ParticleDOMMaterial( this.element );
32489
32490 };
32491 /**
32492  * @author alteredq / http://alteredqualia.com/
32493  *
32494  * parameters = {
32495  *  fragmentShader: <string>,
32496  *  vertexShader: <string>,
32497  *
32498  *  uniforms: { "parameter1": { type: "f", value: 1.0 }, "parameter2": { type: "i" value2: 2 } },
32499  *
32500  *  shading: THREE.SmoothShading,
32501  *  blending: THREE.NormalBlending,
32502  *  depthTest: <bool>,
32503  *
32504  *  wireframe: <boolean>,
32505  *  wireframeLinewidth: <float>,
32506  *
32507  *  lights: <bool>,
32508  *
32509  *  vertexColors: THREE.NoColors / THREE.VertexColors / THREE.FaceColors,
32510  *
32511  *  skinning: <bool>,
32512  *  morphTargets: <bool>,
32513  *  morphNormals: <bool>,
32514  *
32515  *    fog: <bool>
32516  * }
32517  */
32518
32519 THREE.ShaderMaterial = function ( parameters ) {
32520
32521     THREE.Material.call( this );
32522
32523     this.fragmentShader = "void main() {}";
32524     this.vertexShader = "void main() {}";
32525     this.uniforms = {};
32526     this.attributes = null;
32527
32528     this.shading = THREE.SmoothShading;
32529
32530     this.wireframe = false;
32531     this.wireframeLinewidth = 1;
32532
32533     this.fog = false; // set to use scene fog
32534
32535     this.lights = false; // set to use scene lights
32536
32537     this.vertexColors = THREE.NoColors; // set to use "color" attribute stream
32538
32539     this.skinning = false; // set to use skinning attribute streams
32540
32541     this.morphTargets = false; // set to use morph targets
32542     this.morphNormals = false; // set to use morph normals
32543
32544     this.setValues( parameters );
32545
32546 };
32547
32548 THREE.ShaderMaterial.prototype = Object.create( THREE.Material.prototype );
32549
32550 THREE.ShaderMaterial.prototype.clone = function () {
32551
32552     var material = new THREE.ShaderMaterial();
32553
32554     THREE.Material.prototype.clone.call( this, material );
32555
32556     material.fragmentShader = this.fragmentShader;
32557     material.vertexShader = this.vertexShader;
32558     material.uniforms = this.uniforms;
32559     material.attributes = this.attributes;
32560
32561     material.shading = this.shading;
32562
32563     material.wireframe = this.wireframe;
32564     material.wireframeLinewidth = this.wireframeLinewidth;
32565
32566     material.fog = this.fog;
32567
32568     material.lights = this.lights;
32569
32570     material.vertexColors = this.vertexColors;
32571
32572     material.skinning = this.skinning;
32573
32574     material.morphTargets = this.morphTargets;
32575     material.morphNormals = this.morphNormals;
32576
32577     return material;
32578
32579 };
32580 /**
32581  * @author mrdoob / http://mrdoob.com/
32582  * @author alteredq / http://alteredqualia.com/
32583  * @author szimek / https://github.com/szimek/
32584  */
32585
32586 THREE.Texture = function ( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {
32587
32588     this.id = THREE.TextureCount ++;
32589
32590     this.image = image;
32591
32592     this.mapping = mapping !== undefined ? mapping : new THREE.UVMapping();
32593
32594     this.wrapS = wrapS !== undefined ? wrapS : THREE.ClampToEdgeWrapping;
32595     this.wrapT = wrapT !== undefined ? wrapT : THREE.ClampToEdgeWrapping;
32596
32597     this.magFilter = magFilter !== undefined ? magFilter : THREE.LinearFilter;
32598     this.minFilter = minFilter !== undefined ? minFilter : THREE.LinearMipMapLinearFilter;
32599
32600     this.anisotropy = anisotropy !== undefined ? anisotropy : 1;
32601
32602     this.format = format !== undefined ? format : THREE.RGBAFormat;
32603     this.type = type !== undefined ? type : THREE.UnsignedByteType;
32604
32605     this.offset = new THREE.Vector2( 0, 0 );
32606     this.repeat = new THREE.Vector2( 1, 1 );
32607
32608     this.generateMipmaps = true;
32609     this.premultiplyAlpha = false;
32610     this.flipY = true;
32611
32612     this.needsUpdate = false;
32613     this.onUpdate = null;
32614
32615 };
32616
32617 THREE.Texture.prototype = {
32618
32619     constructor: THREE.Texture,
32620
32621     clone: function () {
32622
32623         var texture = new THREE.Texture();
32624
32625         texture.image = this.image;
32626
32627         texture.mapping = this.mapping;
32628
32629         texture.wrapS = this.wrapS;
32630         texture.wrapT = this.wrapT;
32631
32632         texture.magFilter = this.magFilter;
32633         texture.minFilter = this.minFilter;
32634
32635         texture.anisotropy = this.anisotropy;
32636
32637         texture.format = this.format;
32638         texture.type = this.type;
32639
32640         texture.offset.copy( this.offset );
32641         texture.repeat.copy( this.repeat );
32642
32643         texture.generateMipmaps = this.generateMipmaps;
32644         texture.premultiplyAlpha = this.premultiplyAlpha;
32645         texture.flipY = this.flipY;
32646
32647         return texture;
32648
32649     }
32650
32651 };
32652
32653 THREE.TextureCount = 0;
32654 /**
32655  * @author alteredq / http://alteredqualia.com/
32656  */
32657
32658 THREE.CompressedTexture = function ( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter ) {
32659
32660     THREE.Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type );
32661
32662     this.image = { width: width, height: height };
32663     this.mipmaps = mipmaps;
32664
32665 };
32666
32667 THREE.CompressedTexture.prototype = Object.create( THREE.Texture.prototype );
32668
32669 THREE.CompressedTexture.prototype.clone = function () {
32670
32671     var texture = new THREE.CompressedTexture();
32672
32673     texture.image = this.image;
32674     texture.mipmaps = this.mipmaps;
32675
32676     texture.format = this.format;
32677     texture.type = this.type;
32678
32679     texture.mapping = this.mapping;
32680
32681     texture.wrapS = this.wrapS;
32682     texture.wrapT = this.wrapT;
32683
32684     texture.magFilter = this.magFilter;
32685     texture.minFilter = this.minFilter;
32686
32687     texture.anisotropy = this.anisotropy;
32688
32689     texture.offset.copy( this.offset );
32690     texture.repeat.copy( this.repeat );
32691
32692     return texture;
32693
32694 };
32695 /**
32696  * @author alteredq / http://alteredqualia.com/
32697  */
32698
32699 THREE.DataTexture = function ( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter ) {
32700
32701     THREE.Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type );
32702
32703     this.image = { data: data, width: width, height: height };
32704
32705 };
32706
32707 THREE.DataTexture.prototype = Object.create( THREE.Texture.prototype );
32708
32709 THREE.DataTexture.prototype.clone = function () {
32710
32711     var clonedTexture = new THREE.DataTexture( this.image.data,  this.image.width, this.image.height, this.format, this.type, this.mapping, this.wrapS, this.wrapT, this.magFilter, this.minFilter );
32712
32713     clonedTexture.offset.copy( this.offset );
32714     clonedTexture.repeat.copy( this.repeat );
32715
32716     return clonedTexture;
32717
32718 };
32719 /**
32720  * @author mrdoob / http://mrdoob.com/
32721  */
32722
32723 THREE.Particle = function ( material ) {
32724
32725     THREE.Object3D.call( this );
32726
32727     this.material = material;
32728
32729 };
32730
32731 THREE.Particle.prototype = Object.create( THREE.Object3D.prototype );
32732 /**
32733  * @author alteredq / http://alteredqualia.com/
32734  */
32735
32736 THREE.ParticleSystem = function ( geometry, material ) {
32737
32738     THREE.Object3D.call( this );
32739
32740     this.geometry = geometry;
32741     this.material = ( material !== undefined ) ? material : new THREE.ParticleBasicMaterial( { color: Math.random() * 0xffffff } );
32742
32743     this.sortParticles = false;
32744
32745     if ( this.geometry ) {
32746
32747         // calc bound radius
32748
32749         if( !this.geometry.boundingSphere ) {
32750
32751             this.geometry.computeBoundingSphere();
32752
32753         }
32754
32755         this.boundRadius = geometry.boundingSphere.radius;
32756
32757     }
32758
32759     this.frustumCulled = false;
32760
32761 };
32762
32763 THREE.ParticleSystem.prototype = Object.create( THREE.Object3D.prototype );
32764 /**
32765  * @author mrdoob / http://mrdoob.com/
32766  */
32767
32768 THREE.Line = function ( geometry, material, type ) {
32769
32770     THREE.Object3D.call( this );
32771
32772     this.geometry = geometry;
32773     this.material = ( material !== undefined ) ? material : new THREE.LineBasicMaterial( { color: Math.random() * 0xffffff } );
32774     this.type = ( type !== undefined ) ? type : THREE.LineStrip;
32775
32776     if ( this.geometry ) {
32777
32778         if ( ! this.geometry.boundingSphere ) {
32779
32780             this.geometry.computeBoundingSphere();
32781
32782         }
32783
32784     }
32785
32786 };
32787
32788 THREE.LineStrip = 0;
32789 THREE.LinePieces = 1;
32790
32791 THREE.Line.prototype = Object.create( THREE.Object3D.prototype );
32792 /**
32793  * @author mrdoob / http://mrdoob.com/
32794  * @author alteredq / http://alteredqualia.com/
32795  * @author mikael emtinger / http://gomo.se/
32796  */
32797
32798 THREE.Mesh = function ( geometry, material ) {
32799
32800     THREE.Object3D.call( this );
32801
32802     this.geometry = geometry;
32803     this.material = ( material !== undefined ) ? material : new THREE.MeshBasicMaterial( { color: Math.random() * 0xffffff, wireframe: true } );
32804
32805     if ( this.geometry ) {
32806
32807         // calc bound radius
32808
32809         if ( ! this.geometry.boundingSphere ) {
32810
32811             this.geometry.computeBoundingSphere();
32812
32813         }
32814
32815         this.boundRadius = geometry.boundingSphere.radius;
32816
32817
32818         // setup morph targets
32819
32820         if( this.geometry.morphTargets.length ) {
32821
32822             this.morphTargetBase = -1;
32823             this.morphTargetForcedOrder = [];
32824             this.morphTargetInfluences = [];
32825             this.morphTargetDictionary = {};
32826
32827             for( var m = 0; m < this.geometry.morphTargets.length; m ++ ) {
32828
32829                 this.morphTargetInfluences.push( 0 );
32830                 this.morphTargetDictionary[ this.geometry.morphTargets[ m ].name ] = m;
32831
32832             }
32833
32834         }
32835
32836     }
32837
32838 }
32839
32840 THREE.Mesh.prototype = Object.create( THREE.Object3D.prototype );
32841
32842
32843 /*
32844  * Get Morph Target Index by Name
32845  */
32846
32847 THREE.Mesh.prototype.getMorphTargetIndexByName = function( name ) {
32848
32849     if ( this.morphTargetDictionary[ name ] !== undefined ) {
32850
32851         return this.morphTargetDictionary[ name ];
32852     }
32853
32854     console.log( "THREE.Mesh.getMorphTargetIndexByName: morph target " + name + " does not exist. Returning 0." );
32855     return 0;
32856
32857 }
32858 /**
32859  * @author mikael emtinger / http://gomo.se/
32860  * @author alteredq / http://alteredqualia.com/
32861  */
32862
32863 THREE.Bone = function( belongsToSkin ) {
32864
32865     THREE.Object3D.call( this );
32866
32867     this.skin = belongsToSkin;
32868     this.skinMatrix = new THREE.Matrix4();
32869
32870 };
32871
32872 THREE.Bone.prototype = Object.create( THREE.Object3D.prototype );
32873
32874 THREE.Bone.prototype.update = function( parentSkinMatrix, forceUpdate ) {
32875
32876     // update local
32877
32878     if ( this.matrixAutoUpdate ) {
32879
32880         forceUpdate |= this.updateMatrix();
32881
32882     }
32883
32884     // update skin matrix
32885
32886     if ( forceUpdate || this.matrixWorldNeedsUpdate ) {
32887
32888         if( parentSkinMatrix ) {
32889
32890             this.skinMatrix.multiply( parentSkinMatrix, this.matrix );
32891
32892         } else {
32893
32894             this.skinMatrix.copy( this.matrix );
32895
32896         }
32897
32898         this.matrixWorldNeedsUpdate = false;
32899         forceUpdate = true;
32900
32901     }
32902
32903     // update children
32904
32905     var child, i, l = this.children.length;
32906
32907     for ( i = 0; i < l; i ++ ) {
32908
32909         this.children[ i ].update( this.skinMatrix, forceUpdate );
32910
32911     }
32912
32913 };
32914
32915 /**
32916  * @author mikael emtinger / http://gomo.se/
32917  * @author alteredq / http://alteredqualia.com/
32918  */
32919
32920 THREE.SkinnedMesh = function ( geometry, material, useVertexTexture ) {
32921
32922     THREE.Mesh.call( this, geometry, material );
32923
32924     //
32925
32926     this.useVertexTexture = useVertexTexture !== undefined ? useVertexTexture : true;
32927
32928     // init bones
32929
32930     this.identityMatrix = new THREE.Matrix4();
32931
32932     this.bones = [];
32933     this.boneMatrices = [];
32934
32935     var b, bone, gbone, p, q, s;
32936
32937     if ( this.geometry.bones !== undefined ) {
32938
32939         for ( b = 0; b < this.geometry.bones.length; b ++ ) {
32940
32941             gbone = this.geometry.bones[ b ];
32942
32943             p = gbone.pos;
32944             q = gbone.rotq;
32945             s = gbone.scl;
32946
32947             bone = this.addBone();
32948
32949             bone.name = gbone.name;
32950             bone.position.set( p[0], p[1], p[2] );
32951             bone.quaternion.set( q[0], q[1], q[2], q[3] );
32952             bone.useQuaternion = true;
32953
32954             if ( s !== undefined ) {
32955
32956                 bone.scale.set( s[0], s[1], s[2] );
32957
32958             } else {
32959
32960                 bone.scale.set( 1, 1, 1 );
32961
32962             }
32963
32964         }
32965
32966         for ( b = 0; b < this.bones.length; b ++ ) {
32967
32968             gbone = this.geometry.bones[ b ];
32969             bone = this.bones[ b ];
32970
32971             if ( gbone.parent === -1 ) {
32972
32973                 this.add( bone );
32974
32975             } else {
32976
32977                 this.bones[ gbone.parent ].add( bone );
32978
32979             }
32980
32981         }
32982
32983         //
32984
32985         var nBones = this.bones.length;
32986
32987         if ( this.useVertexTexture ) {
32988
32989             // layout (1 matrix = 4 pixels)
32990             //    RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)
32991             //  with  8x8  pixel texture max   16 bones  (8 * 8  / 4)
32992             //       16x16 pixel texture max   64 bones (16 * 16 / 4)
32993             //       32x32 pixel texture max  256 bones (32 * 32 / 4)
32994             //       64x64 pixel texture max 1024 bones (64 * 64 / 4)
32995
32996             var size;
32997
32998             if ( nBones > 256 )
32999                 size = 64;
33000             else if ( nBones > 64 )
33001                 size = 32;
33002             else if ( nBones > 16 )
33003                 size = 16;
33004             else
33005                 size = 8;
33006
33007             this.boneTextureWidth = size;
33008             this.boneTextureHeight = size;
33009
33010             this.boneMatrices = new Float32Array( this.boneTextureWidth * this.boneTextureHeight * 4 ); // 4 floats per RGBA pixel
33011             this.boneTexture = new THREE.DataTexture( this.boneMatrices, this.boneTextureWidth, this.boneTextureHeight, THREE.RGBAFormat, THREE.FloatType );
33012             this.boneTexture.minFilter = THREE.NearestFilter;
33013             this.boneTexture.magFilter = THREE.NearestFilter;
33014             this.boneTexture.generateMipmaps = false;
33015             this.boneTexture.flipY = false;
33016
33017         } else {
33018
33019             this.boneMatrices = new Float32Array( 16 * nBones );
33020
33021         }
33022
33023         this.pose();
33024
33025     }
33026
33027 };
33028
33029 THREE.SkinnedMesh.prototype = Object.create( THREE.Mesh.prototype );
33030
33031 THREE.SkinnedMesh.prototype.addBone = function( bone ) {
33032
33033     if ( bone === undefined ) {
33034
33035         bone = new THREE.Bone( this );
33036
33037     }
33038
33039     this.bones.push( bone );
33040
33041     return bone;
33042
33043 };
33044
33045 THREE.SkinnedMesh.prototype.updateMatrixWorld = function ( force ) {
33046
33047     this.matrixAutoUpdate && this.updateMatrix();
33048
33049     // update matrixWorld
33050
33051     if ( this.matrixWorldNeedsUpdate || force ) {
33052
33053         if ( this.parent ) {
33054
33055             this.matrixWorld.multiply( this.parent.matrixWorld, this.matrix );
33056
33057         } else {
33058
33059             this.matrixWorld.copy( this.matrix );
33060
33061         }
33062
33063         this.matrixWorldNeedsUpdate = false;
33064
33065         force = true;
33066
33067     }
33068
33069     // update children
33070
33071     for ( var i = 0, l = this.children.length; i < l; i ++ ) {
33072
33073         var child = this.children[ i ];
33074
33075         if ( child instanceof THREE.Bone ) {
33076
33077             child.update( this.identityMatrix, false );
33078
33079         } else {
33080
33081             child.updateMatrixWorld( true );
33082
33083         }
33084
33085     }
33086
33087     // make a snapshot of the bones' rest position
33088
33089     if ( this.boneInverses == undefined ) {
33090
33091         this.boneInverses = [];
33092
33093         for ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {
33094
33095             var inverse = new THREE.Matrix4();
33096
33097             inverse.getInverse( this.bones[ b ].skinMatrix );
33098
33099             this.boneInverses.push( inverse );
33100
33101         }
33102
33103     }
33104
33105     // flatten bone matrices to array
33106
33107     for ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {
33108
33109         // compute the offset between the current and the original transform;
33110
33111         //TODO: we could get rid of this multiplication step if the skinMatrix
33112         // was already representing the offset; however, this requires some
33113         // major changes to the animation system
33114
33115         THREE.SkinnedMesh.offsetMatrix.multiply( this.bones[ b ].skinMatrix, this.boneInverses[ b ] );
33116
33117         THREE.SkinnedMesh.offsetMatrix.flattenToArrayOffset( this.boneMatrices, b * 16 );
33118
33119     }
33120
33121     if ( this.useVertexTexture ) {
33122
33123         this.boneTexture.needsUpdate = true;
33124
33125     }
33126
33127 };
33128
33129 /*
33130  * Pose
33131  */
33132
33133 THREE.SkinnedMesh.prototype.pose = function() {
33134
33135     this.updateMatrixWorld( true );
33136
33137     for ( var i = 0; i < this.geometry.skinIndices.length; i ++ ) {
33138
33139         // normalize weights
33140
33141         var sw = this.geometry.skinWeights[ i ];
33142
33143         var scale = 1.0 / sw.lengthManhattan();
33144
33145         if ( scale !== Infinity ) {
33146
33147             sw.multiplyScalar( scale );
33148
33149         } else {
33150
33151             sw.set( 1 ); // this will be normalized by the shader anyway
33152
33153         }
33154
33155     }
33156
33157 };
33158
33159 THREE.SkinnedMesh.offsetMatrix = new THREE.Matrix4();
33160
33161 /**
33162  * @author alteredq / http://alteredqualia.com/
33163  */
33164
33165 THREE.MorphAnimMesh = function ( geometry, material ) {
33166
33167     THREE.Mesh.call( this, geometry, material );
33168
33169     // API
33170
33171     this.duration = 1000; // milliseconds
33172     this.mirroredLoop = false;
33173     this.time = 0;
33174
33175     // internals
33176
33177     this.lastKeyframe = 0;
33178     this.currentKeyframe = 0;
33179
33180     this.direction = 1;
33181     this.directionBackwards = false;
33182
33183     this.setFrameRange( 0, this.geometry.morphTargets.length - 1 );
33184
33185 };
33186
33187 THREE.MorphAnimMesh.prototype = Object.create( THREE.Mesh.prototype );
33188
33189 THREE.MorphAnimMesh.prototype.setFrameRange = function ( start, end ) {
33190
33191     this.startKeyframe = start;
33192     this.endKeyframe = end;
33193
33194     this.length = this.endKeyframe - this.startKeyframe + 1;
33195
33196 };
33197
33198 THREE.MorphAnimMesh.prototype.setDirectionForward = function () {
33199
33200     this.direction = 1;
33201     this.directionBackwards = false;
33202
33203 };
33204
33205 THREE.MorphAnimMesh.prototype.setDirectionBackward = function () {
33206
33207     this.direction = -1;
33208     this.directionBackwards = true;
33209
33210 };
33211
33212 THREE.MorphAnimMesh.prototype.parseAnimations = function () {
33213
33214     var geometry = this.geometry;
33215
33216     if ( ! geometry.animations ) geometry.animations = {};
33217
33218     var firstAnimation, animations = geometry.animations;
33219
33220     var pattern = /([a-z]+)(\d+)/;
33221
33222     for ( var i = 0, il = geometry.morphTargets.length; i < il; i ++ ) {
33223
33224         var morph = geometry.morphTargets[ i ];
33225         var parts = morph.name.match( pattern );
33226
33227         if ( parts && parts.length > 1 ) {
33228
33229             var label = parts[ 1 ];
33230             var num = parts[ 2 ];
33231
33232             if ( ! animations[ label ] ) animations[ label ] = { start: Infinity, end: -Infinity };
33233
33234             var animation = animations[ label ];
33235
33236             if ( i < animation.start ) animation.start = i;
33237             if ( i > animation.end ) animation.end = i;
33238
33239             if ( ! firstAnimation ) firstAnimation = label;
33240
33241         }
33242
33243     }
33244
33245     geometry.firstAnimation = firstAnimation;
33246
33247 };
33248
33249 THREE.MorphAnimMesh.prototype.setAnimationLabel = function ( label, start, end ) {
33250
33251     if ( ! this.geometry.animations ) this.geometry.animations = {};
33252
33253     this.geometry.animations[ label ] = { start: start, end: end };
33254
33255 };
33256
33257 THREE.MorphAnimMesh.prototype.playAnimation = function ( label, fps ) {
33258
33259     var animation = this.geometry.animations[ label ];
33260
33261     if ( animation ) {
33262
33263         this.setFrameRange( animation.start, animation.end );
33264         this.duration = 1000 * ( ( animation.end - animation.start ) / fps );
33265         this.time = 0;
33266
33267     } else {
33268
33269         console.warn( "animation[" + label + "] undefined" );
33270
33271     }
33272
33273 };
33274
33275 THREE.MorphAnimMesh.prototype.updateAnimation = function ( delta ) {
33276
33277     var frameTime = this.duration / this.length;
33278
33279     this.time += this.direction * delta;
33280
33281     if ( this.mirroredLoop ) {
33282
33283         if ( this.time > this.duration || this.time < 0 ) {
33284
33285             this.direction *= -1;
33286
33287             if ( this.time > this.duration ) {
33288
33289                 this.time = this.duration;
33290                 this.directionBackwards = true;
33291
33292             }
33293
33294             if ( this.time < 0 ) {
33295
33296                 this.time = 0;
33297                 this.directionBackwards = false;
33298
33299             }
33300
33301         }
33302
33303     } else {
33304
33305         this.time = this.time % this.duration;
33306
33307         if ( this.time < 0 ) this.time += this.duration;
33308
33309     }
33310
33311     var keyframe = this.startKeyframe + THREE.Math.clamp( Math.floor( this.time / frameTime ), 0, this.length - 1 );
33312
33313     if ( keyframe !== this.currentKeyframe ) {
33314
33315         this.morphTargetInfluences[ this.lastKeyframe ] = 0;
33316         this.morphTargetInfluences[ this.currentKeyframe ] = 1;
33317
33318         this.morphTargetInfluences[ keyframe ] = 0;
33319
33320         this.lastKeyframe = this.currentKeyframe;
33321         this.currentKeyframe = keyframe;
33322
33323     }
33324
33325     var mix = ( this.time % frameTime ) / frameTime;
33326
33327     if ( this.directionBackwards ) {
33328
33329         mix = 1 - mix;
33330
33331     }
33332
33333     this.morphTargetInfluences[ this.currentKeyframe ] = mix;
33334     this.morphTargetInfluences[ this.lastKeyframe ] = 1 - mix;
33335
33336 };
33337 /**
33338  * @author alteredq / http://alteredqualia.com/
33339  */
33340
33341 THREE.Ribbon = function ( geometry, material ) {
33342
33343     THREE.Object3D.call( this );
33344
33345     this.geometry = geometry;
33346     this.material = material;
33347
33348 };
33349
33350 THREE.Ribbon.prototype = Object.create( THREE.Object3D.prototype );
33351 /**
33352  * @author mikael emtinger / http://gomo.se/
33353  * @author alteredq / http://alteredqualia.com/
33354  * @author mrdoob / http://mrdoob.com/
33355  */
33356
33357 THREE.LOD = function () {
33358
33359     THREE.Object3D.call( this );
33360
33361     this.LODs = [];
33362
33363 };
33364
33365
33366 THREE.LOD.prototype = Object.create( THREE.Object3D.prototype );
33367
33368 THREE.LOD.prototype.addLevel = function ( object3D, visibleAtDistance ) {
33369
33370     if ( visibleAtDistance === undefined ) {
33371
33372         visibleAtDistance = 0;
33373
33374     }
33375
33376     visibleAtDistance = Math.abs( visibleAtDistance );
33377
33378     for ( var l = 0; l < this.LODs.length; l ++ ) {
33379
33380         if ( visibleAtDistance < this.LODs[ l ].visibleAtDistance ) {
33381
33382             break;
33383
33384         }
33385
33386     }
33387
33388     this.LODs.splice( l, 0, { visibleAtDistance: visibleAtDistance, object3D: object3D } );
33389     this.add( object3D );
33390
33391 };
33392
33393 THREE.LOD.prototype.update = function ( camera ) {
33394
33395     if ( this.LODs.length > 1 ) {
33396
33397         camera.matrixWorldInverse.getInverse( camera.matrixWorld );
33398
33399         var inverse  = camera.matrixWorldInverse;
33400         var distance = -( inverse.elements[2] * this.matrixWorld.elements[12] + inverse.elements[6] * this.matrixWorld.elements[13] + inverse.elements[10] * this.matrixWorld.elements[14] + inverse.elements[14] );
33401
33402         this.LODs[ 0 ].object3D.visible = true;
33403
33404         for ( var l = 1; l < this.LODs.length; l ++ ) {
33405
33406             if( distance >= this.LODs[ l ].visibleAtDistance ) {
33407
33408                 this.LODs[ l - 1 ].object3D.visible = false;
33409                 this.LODs[ l     ].object3D.visible = true;
33410
33411             } else {
33412
33413                 break;
33414
33415             }
33416
33417         }
33418
33419         for( ; l < this.LODs.length; l ++ ) {
33420
33421             this.LODs[ l ].object3D.visible = false;
33422
33423         }
33424
33425     }
33426
33427 };
33428 /**
33429  * @author mikael emtinger / http://gomo.se/
33430  */
33431
33432 THREE.Sprite = function ( parameters ) {
33433
33434     THREE.Object3D.call( this );
33435
33436     this.color = ( parameters.color !== undefined ) ? new THREE.Color( parameters.color ) : new THREE.Color( 0xffffff );
33437     this.map = ( parameters.map !== undefined ) ? parameters.map : new THREE.Texture();
33438
33439     this.blending = ( parameters.blending !== undefined ) ? parameters.blending : THREE.NormalBlending;
33440
33441     this.blendSrc = parameters.blendSrc !== undefined ? parameters.blendSrc : THREE.SrcAlphaFactor;
33442     this.blendDst = parameters.blendDst !== undefined ? parameters.blendDst : THREE.OneMinusSrcAlphaFactor;
33443     this.blendEquation = parameters.blendEquation !== undefined ? parameters.blendEquation : THREE.AddEquation;
33444
33445     this.useScreenCoordinates = ( parameters.useScreenCoordinates !== undefined ) ? parameters.useScreenCoordinates : true;
33446     this.mergeWith3D = ( parameters.mergeWith3D !== undefined ) ? parameters.mergeWith3D : !this.useScreenCoordinates;
33447     this.affectedByDistance = ( parameters.affectedByDistance !== undefined ) ? parameters.affectedByDistance : !this.useScreenCoordinates;
33448     this.scaleByViewport = ( parameters.scaleByViewport !== undefined ) ? parameters.scaleByViewport : !this.affectedByDistance;
33449     this.alignment = ( parameters.alignment instanceof THREE.Vector2 ) ? parameters.alignment : THREE.SpriteAlignment.center;
33450
33451     this.rotation3d = this.rotation;
33452     this.rotation = 0;
33453     this.opacity = 1;
33454
33455     this.uvOffset = new THREE.Vector2( 0, 0 );
33456     this.uvScale  = new THREE.Vector2( 1, 1 );
33457
33458 };
33459
33460 THREE.Sprite.prototype = Object.create( THREE.Object3D.prototype );
33461
33462 /*
33463  * Custom update matrix
33464  */
33465
33466 THREE.Sprite.prototype.updateMatrix = function () {
33467
33468     this.matrix.setPosition( this.position );
33469
33470     this.rotation3d.set( 0, 0, this.rotation );
33471     this.matrix.setRotationFromEuler( this.rotation3d );
33472
33473     if ( this.scale.x !== 1 || this.scale.y !== 1 ) {
33474
33475         this.matrix.scale( this.scale );
33476         this.boundRadiusScale = Math.max( this.scale.x, this.scale.y );
33477
33478     }
33479
33480     this.matrixWorldNeedsUpdate = true;
33481
33482 };
33483
33484 /*
33485  * Alignment
33486  */
33487
33488 THREE.SpriteAlignment = {};
33489 THREE.SpriteAlignment.topLeft = new THREE.Vector2( 1, -1 );
33490 THREE.SpriteAlignment.topCenter = new THREE.Vector2( 0, -1 );
33491 THREE.SpriteAlignment.topRight = new THREE.Vector2( -1, -1 );
33492 THREE.SpriteAlignment.centerLeft = new THREE.Vector2( 1, 0 );
33493 THREE.SpriteAlignment.center = new THREE.Vector2( 0, 0 );
33494 THREE.SpriteAlignment.centerRight = new THREE.Vector2( -1, 0 );
33495 THREE.SpriteAlignment.bottomLeft = new THREE.Vector2( 1, 1 );
33496 THREE.SpriteAlignment.bottomCenter = new THREE.Vector2( 0, 1 );
33497 THREE.SpriteAlignment.bottomRight = new THREE.Vector2( -1, 1 );
33498 /**
33499  * @author mrdoob / http://mrdoob.com/
33500  */
33501
33502 THREE.Scene = function () {
33503
33504     THREE.Object3D.call( this );
33505
33506     this.fog = null;
33507     this.overrideMaterial = null;
33508
33509     this.matrixAutoUpdate = false;
33510
33511     this.__objects = [];
33512     this.__lights = [];
33513
33514     this.__objectsAdded = [];
33515     this.__objectsRemoved = [];
33516
33517 };
33518
33519 THREE.Scene.prototype = Object.create( THREE.Object3D.prototype );
33520
33521 THREE.Scene.prototype.__addObject = function ( object ) {
33522
33523     if ( object instanceof THREE.Light ) {
33524
33525         if ( this.__lights.indexOf( object ) === - 1 ) {
33526
33527             this.__lights.push( object );
33528
33529         }
33530
33531         if ( object.target && object.target.parent === undefined ) {
33532
33533             this.add( object.target );
33534
33535         }
33536
33537     } else if ( !( object instanceof THREE.Camera || object instanceof THREE.Bone ) ) {
33538
33539         if ( this.__objects.indexOf( object ) === - 1 ) {
33540
33541             this.__objects.push( object );
33542             this.__objectsAdded.push( object );
33543
33544             // check if previously removed
33545
33546             var i = this.__objectsRemoved.indexOf( object );
33547
33548             if ( i !== -1 ) {
33549
33550                 this.__objectsRemoved.splice( i, 1 );
33551
33552             }
33553
33554         }
33555
33556     }
33557
33558     for ( var c = 0; c < object.children.length; c ++ ) {
33559
33560         this.__addObject( object.children[ c ] );
33561
33562     }
33563
33564 };
33565
33566 THREE.Scene.prototype.__removeObject = function ( object ) {
33567
33568     if ( object instanceof THREE.Light ) {
33569
33570         var i = this.__lights.indexOf( object );
33571
33572         if ( i !== -1 ) {
33573
33574             this.__lights.splice( i, 1 );
33575
33576         }
33577
33578     } else if ( !( object instanceof THREE.Camera ) ) {
33579
33580         var i = this.__objects.indexOf( object );
33581
33582         if( i !== -1 ) {
33583
33584             this.__objects.splice( i, 1 );
33585             this.__objectsRemoved.push( object );
33586
33587             // check if previously added
33588
33589             var ai = this.__objectsAdded.indexOf( object );
33590
33591             if ( ai !== -1 ) {
33592
33593                 this.__objectsAdded.splice( ai, 1 );
33594
33595             }
33596
33597         }
33598
33599     }
33600
33601     for ( var c = 0; c < object.children.length; c ++ ) {
33602
33603         this.__removeObject( object.children[ c ] );
33604
33605     }
33606
33607 };
33608 /**
33609  * @author mrdoob / http://mrdoob.com/
33610  * @author alteredq / http://alteredqualia.com/
33611  */
33612
33613 THREE.Fog = function ( hex, near, far ) {
33614
33615     this.color = new THREE.Color( hex );
33616
33617     this.near = ( near !== undefined ) ? near : 1;
33618     this.far = ( far !== undefined ) ? far : 1000;
33619
33620 };
33621 /**
33622  * @author mrdoob / http://mrdoob.com/
33623  * @author alteredq / http://alteredqualia.com/
33624  */
33625
33626 THREE.FogExp2 = function ( hex, density ) {
33627
33628     this.color = new THREE.Color( hex );
33629     this.density = ( density !== undefined ) ? density : 0.00025;
33630
33631 };
33632 /**
33633  * @author mrdoob / http://mrdoob.com/
33634  */
33635
33636 THREE.CanvasRenderer = function ( parameters ) {
33637
33638     console.log( 'THREE.CanvasRenderer', THREE.REVISION );
33639
33640     parameters = parameters || {};
33641
33642     var _this = this,
33643     _renderData, _elements, _lights,
33644     _projector = new THREE.Projector(),
33645
33646     _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElement( 'canvas' ),
33647
33648     _canvasWidth, _canvasHeight, _canvasWidthHalf, _canvasHeightHalf,
33649     _context = _canvas.getContext( '2d' ),
33650
33651     _clearColor = new THREE.Color( 0x000000 ),
33652     _clearOpacity = 0,
33653
33654     _contextGlobalAlpha = 1,
33655     _contextGlobalCompositeOperation = 0,
33656     _contextStrokeStyle = null,
33657     _contextFillStyle = null,
33658     _contextLineWidth = null,
33659     _contextLineCap = null,
33660     _contextLineJoin = null,
33661
33662     _v1, _v2, _v3, _v4,
33663     _v5 = new THREE.RenderableVertex(),
33664     _v6 = new THREE.RenderableVertex(),
33665
33666     _v1x, _v1y, _v2x, _v2y, _v3x, _v3y,
33667     _v4x, _v4y, _v5x, _v5y, _v6x, _v6y,
33668
33669     _color = new THREE.Color(),
33670     _color1 = new THREE.Color(),
33671     _color2 = new THREE.Color(),
33672     _color3 = new THREE.Color(),
33673     _color4 = new THREE.Color(),
33674
33675     _patterns = {}, _imagedatas = {},
33676
33677     _near, _far,
33678
33679     _image, _uvs,
33680     _uv1x, _uv1y, _uv2x, _uv2y, _uv3x, _uv3y,
33681
33682     _clipRect = new THREE.Rectangle(),
33683     _clearRect = new THREE.Rectangle(),
33684     _bboxRect = new THREE.Rectangle(),
33685
33686     _enableLighting = false,
33687     _ambientLight = new THREE.Color(),
33688     _directionalLights = new THREE.Color(),
33689     _pointLights = new THREE.Color(),
33690
33691     _pi2 = Math.PI * 2,
33692     _vector3 = new THREE.Vector3(), // Needed for PointLight
33693
33694     _pixelMap, _pixelMapContext, _pixelMapImage, _pixelMapData,
33695     _gradientMap, _gradientMapContext, _gradientMapQuality = 16;
33696
33697     _pixelMap = document.createElement( 'canvas' );
33698     _pixelMap.width = _pixelMap.height = 2;
33699
33700     _pixelMapContext = _pixelMap.getContext( '2d' );
33701     _pixelMapContext.fillStyle = 'rgba(0,0,0,1)';
33702     _pixelMapContext.fillRect( 0, 0, 2, 2 );
33703
33704     _pixelMapImage = _pixelMapContext.getImageData( 0, 0, 2, 2 );
33705     _pixelMapData = _pixelMapImage.data;
33706
33707     _gradientMap = document.createElement( 'canvas' );
33708     _gradientMap.width = _gradientMap.height = _gradientMapQuality;
33709
33710     _gradientMapContext = _gradientMap.getContext( '2d' );
33711     _gradientMapContext.translate( - _gradientMapQuality / 2, - _gradientMapQuality / 2 );
33712     _gradientMapContext.scale( _gradientMapQuality, _gradientMapQuality );
33713
33714     _gradientMapQuality --; // Fix UVs
33715
33716     this.domElement = _canvas;
33717
33718     this.autoClear = true;
33719     this.sortObjects = true;
33720     this.sortElements = true;
33721
33722     this.info = {
33723
33724         render: {
33725
33726             vertices: 0,
33727             faces: 0
33728
33729         }
33730
33731     }
33732
33733     this.setSize = function ( width, height ) {
33734
33735         _canvasWidth = width;
33736         _canvasHeight = height;
33737         _canvasWidthHalf = Math.floor( _canvasWidth / 2 );
33738         _canvasHeightHalf = Math.floor( _canvasHeight / 2 );
33739
33740         _canvas.width = _canvasWidth;
33741         _canvas.height = _canvasHeight;
33742
33743         _clipRect.set( - _canvasWidthHalf, - _canvasHeightHalf, _canvasWidthHalf, _canvasHeightHalf );
33744         _clearRect.set( - _canvasWidthHalf, - _canvasHeightHalf, _canvasWidthHalf, _canvasHeightHalf );
33745
33746         _contextGlobalAlpha = 1;
33747         _contextGlobalCompositeOperation = 0;
33748         _contextStrokeStyle = null;
33749         _contextFillStyle = null;
33750         _contextLineWidth = null;
33751         _contextLineCap = null;
33752         _contextLineJoin = null;
33753
33754     };
33755
33756     this.setClearColor = function ( color, opacity ) {
33757
33758         _clearColor.copy( color );
33759         _clearOpacity = opacity !== undefined ? opacity : 1;
33760
33761         _clearRect.set( - _canvasWidthHalf, - _canvasHeightHalf, _canvasWidthHalf, _canvasHeightHalf );
33762
33763     };
33764
33765     this.setClearColorHex = function ( hex, opacity ) {
33766
33767         _clearColor.setHex( hex );
33768         _clearOpacity = opacity !== undefined ? opacity : 1;
33769
33770         _clearRect.set( - _canvasWidthHalf, - _canvasHeightHalf, _canvasWidthHalf, _canvasHeightHalf );
33771
33772     };
33773
33774     this.getMaxAnisotropy  = function () {
33775
33776         return 0;
33777
33778     };
33779
33780     this.clear = function () {
33781
33782         _context.setTransform( 1, 0, 0, - 1, _canvasWidthHalf, _canvasHeightHalf );
33783
33784         if ( _clearRect.isEmpty() === false ) {
33785
33786             _clearRect.minSelf( _clipRect );
33787             _clearRect.inflate( 2 );
33788
33789             if ( _clearOpacity < 1 ) {
33790
33791                 _context.clearRect( Math.floor( _clearRect.getX() ), Math.floor( _clearRect.getY() ), Math.floor( _clearRect.getWidth() ), Math.floor( _clearRect.getHeight() ) );
33792
33793             }
33794
33795             if ( _clearOpacity > 0 ) {
33796
33797                 setBlending( THREE.NormalBlending );
33798                 setOpacity( 1 );
33799
33800                 setFillStyle( 'rgba(' + Math.floor( _clearColor.r * 255 ) + ',' + Math.floor( _clearColor.g * 255 ) + ',' + Math.floor( _clearColor.b * 255 ) + ',' + _clearOpacity + ')' );
33801
33802                 _context.fillRect( Math.floor( _clearRect.getX() ), Math.floor( _clearRect.getY() ), Math.floor( _clearRect.getWidth() ), Math.floor( _clearRect.getHeight() ) );
33803
33804             }
33805
33806             _clearRect.empty();
33807
33808         }
33809
33810
33811     };
33812
33813     this.render = function ( scene, camera ) {
33814
33815         if ( camera instanceof THREE.Camera === false ) {
33816
33817             console.error( 'THREE.CanvasRenderer.render: camera is not an instance of THREE.Camera.' );
33818             return;
33819
33820         }
33821
33822         var e, el, element, material;
33823
33824         this.autoClear === true ? this.clear() : _context.setTransform( 1, 0, 0, - 1, _canvasWidthHalf, _canvasHeightHalf );
33825
33826         _this.info.render.vertices = 0;
33827         _this.info.render.faces = 0;
33828
33829         _renderData = _projector.projectScene( scene, camera, this.sortObjects, this.sortElements );
33830         _elements = _renderData.elements;
33831         _lights = _renderData.lights;
33832
33833         /* DEBUG
33834         _context.fillStyle = 'rgba( 0, 255, 255, 0.5 )';
33835         _context.fillRect( _clipRect.getX(), _clipRect.getY(), _clipRect.getWidth(), _clipRect.getHeight() );
33836         */
33837
33838         _enableLighting = _lights.length > 0;
33839
33840         if ( _enableLighting === true ) {
33841
33842              calculateLights();
33843
33844         }
33845
33846         for ( e = 0, el = _elements.length; e < el; e++ ) {
33847
33848             element = _elements[ e ];
33849
33850             material = element.material;
33851
33852             if ( material === undefined || material.visible === false ) continue;
33853
33854             _bboxRect.empty();
33855
33856             if ( element instanceof THREE.RenderableParticle ) {
33857
33858                 _v1 = element;
33859                 _v1.x *= _canvasWidthHalf; _v1.y *= _canvasHeightHalf;
33860
33861                 renderParticle( _v1, element, material, scene );
33862
33863             } else if ( element instanceof THREE.RenderableLine ) {
33864
33865                 _v1 = element.v1; _v2 = element.v2;
33866
33867                 _v1.positionScreen.x *= _canvasWidthHalf; _v1.positionScreen.y *= _canvasHeightHalf;
33868                 _v2.positionScreen.x *= _canvasWidthHalf; _v2.positionScreen.y *= _canvasHeightHalf;
33869
33870                 _bboxRect.addPoint( _v1.positionScreen.x, _v1.positionScreen.y );
33871                 _bboxRect.addPoint( _v2.positionScreen.x, _v2.positionScreen.y );
33872
33873                 if ( _clipRect.intersects( _bboxRect ) === true ) {
33874
33875                     renderLine( _v1, _v2, element, material, scene );
33876
33877                 }
33878
33879
33880             } else if ( element instanceof THREE.RenderableFace3 ) {
33881
33882                 _v1 = element.v1; _v2 = element.v2; _v3 = element.v3;
33883
33884                 _v1.positionScreen.x *= _canvasWidthHalf; _v1.positionScreen.y *= _canvasHeightHalf;
33885                 _v2.positionScreen.x *= _canvasWidthHalf; _v2.positionScreen.y *= _canvasHeightHalf;
33886                 _v3.positionScreen.x *= _canvasWidthHalf; _v3.positionScreen.y *= _canvasHeightHalf;
33887
33888                 if ( material.overdraw === true ) {
33889
33890                     expand( _v1.positionScreen, _v2.positionScreen );
33891                     expand( _v2.positionScreen, _v3.positionScreen );
33892                     expand( _v3.positionScreen, _v1.positionScreen );
33893
33894                 }
33895
33896                 _bboxRect.add3Points( _v1.positionScreen.x, _v1.positionScreen.y,
33897                               _v2.positionScreen.x, _v2.positionScreen.y,
33898                               _v3.positionScreen.x, _v3.positionScreen.y );
33899
33900                 if ( _clipRect.intersects( _bboxRect ) === true ) {
33901
33902                     renderFace3( _v1, _v2, _v3, 0, 1, 2, element, material, scene );
33903
33904                 }
33905
33906             } else if ( element instanceof THREE.RenderableFace4 ) {
33907
33908                 _v1 = element.v1; _v2 = element.v2; _v3 = element.v3; _v4 = element.v4;
33909
33910                 _v1.positionScreen.x *= _canvasWidthHalf; _v1.positionScreen.y *= _canvasHeightHalf;
33911                 _v2.positionScreen.x *= _canvasWidthHalf; _v2.positionScreen.y *= _canvasHeightHalf;
33912                 _v3.positionScreen.x *= _canvasWidthHalf; _v3.positionScreen.y *= _canvasHeightHalf;
33913                 _v4.positionScreen.x *= _canvasWidthHalf; _v4.positionScreen.y *= _canvasHeightHalf;
33914
33915                 _v5.positionScreen.copy( _v2.positionScreen );
33916                 _v6.positionScreen.copy( _v4.positionScreen );
33917
33918                 if ( material.overdraw === true ) {
33919
33920                     expand( _v1.positionScreen, _v2.positionScreen );
33921                     expand( _v2.positionScreen, _v4.positionScreen );
33922                     expand( _v4.positionScreen, _v1.positionScreen );
33923
33924                     expand( _v3.positionScreen, _v5.positionScreen );
33925                     expand( _v3.positionScreen, _v6.positionScreen );
33926
33927                 }
33928
33929                 _bboxRect.addPoint( _v1.positionScreen.x, _v1.positionScreen.y );
33930                 _bboxRect.addPoint( _v2.positionScreen.x, _v2.positionScreen.y );
33931                 _bboxRect.addPoint( _v3.positionScreen.x, _v3.positionScreen.y );
33932                 _bboxRect.addPoint( _v4.positionScreen.x, _v4.positionScreen.y );
33933
33934                 if ( _clipRect.intersects( _bboxRect ) === true ) {
33935
33936                     renderFace4( _v1, _v2, _v3, _v4, _v5, _v6, element, material, scene );
33937
33938                 }
33939
33940             }
33941
33942             /* DEBUG
33943             _context.lineWidth = 1;
33944             _context.strokeStyle = 'rgba( 0, 255, 0, 0.5 )';
33945             _context.strokeRect( _bboxRect.getX(), _bboxRect.getY(), _bboxRect.getWidth(), _bboxRect.getHeight() );
33946             */
33947
33948             _clearRect.addRectangle( _bboxRect );
33949
33950
33951         }
33952
33953         /* DEBUG
33954         _context.lineWidth = 1;
33955         _context.strokeStyle = 'rgba( 255, 0, 0, 0.5 )';
33956         _context.strokeRect( _clearRect.getX(), _clearRect.getY(), _clearRect.getWidth(), _clearRect.getHeight() );
33957         */
33958
33959         _context.setTransform( 1, 0, 0, 1, 0, 0 );
33960
33961         //
33962
33963         function calculateLights() {
33964
33965             _ambientLight.setRGB( 0, 0, 0 );
33966             _directionalLights.setRGB( 0, 0, 0 );
33967             _pointLights.setRGB( 0, 0, 0 );
33968
33969             for ( var l = 0, ll = _lights.length; l < ll; l ++ ) {
33970
33971                 var light = _lights[ l ];
33972                 var lightColor = light.color;
33973
33974                 if ( light instanceof THREE.AmbientLight ) {
33975
33976                     _ambientLight.r += lightColor.r;
33977                     _ambientLight.g += lightColor.g;
33978                     _ambientLight.b += lightColor.b;
33979
33980                 } else if ( light instanceof THREE.DirectionalLight ) {
33981
33982                     // for particles
33983
33984                     _directionalLights.r += lightColor.r;
33985                     _directionalLights.g += lightColor.g;
33986                     _directionalLights.b += lightColor.b;
33987
33988                 } else if ( light instanceof THREE.PointLight ) {
33989
33990                     // for particles
33991
33992                     _pointLights.r += lightColor.r;
33993                     _pointLights.g += lightColor.g;
33994                     _pointLights.b += lightColor.b;
33995
33996                 }
33997
33998             }
33999
34000         }
34001
34002         function calculateLight( position, normal, color ) {
34003
34004             for ( var l = 0, ll = _lights.length; l < ll; l ++ ) {
34005
34006                 var light = _lights[ l ];
34007                 var lightColor = light.color;
34008
34009                 if ( light instanceof THREE.DirectionalLight ) {
34010
34011                     var lightPosition = light.matrixWorld.getPosition().normalize();
34012
34013                     var amount = normal.dot( lightPosition );
34014
34015                     if ( amount <= 0 ) continue;
34016
34017                     amount *= light.intensity;
34018
34019                     color.r += lightColor.r * amount;
34020                     color.g += lightColor.g * amount;
34021                     color.b += lightColor.b * amount;
34022
34023                 } else if ( light instanceof THREE.PointLight ) {
34024
34025                     var lightPosition = light.matrixWorld.getPosition();
34026
34027                     var amount = normal.dot( _vector3.sub( lightPosition, position ).normalize() );
34028
34029                     if ( amount <= 0 ) continue;
34030
34031                     amount *= light.distance == 0 ? 1 : 1 - Math.min( position.distanceTo( lightPosition ) / light.distance, 1 );
34032
34033                     if ( amount == 0 ) continue;
34034
34035                     amount *= light.intensity;
34036
34037                     color.r += lightColor.r * amount;
34038                     color.g += lightColor.g * amount;
34039                     color.b += lightColor.b * amount;
34040
34041                 }
34042
34043             }
34044
34045         }
34046
34047         function renderParticle( v1, element, material, scene ) {
34048
34049             setOpacity( material.opacity );
34050             setBlending( material.blending );
34051
34052             var width, height, scaleX, scaleY,
34053             bitmap, bitmapWidth, bitmapHeight;
34054
34055             if ( material instanceof THREE.ParticleBasicMaterial ) {
34056
34057                 if ( material.map === null ) {
34058
34059                     scaleX = element.object.scale.x;
34060                     scaleY = element.object.scale.y;
34061
34062                     // TODO: Be able to disable this
34063
34064                     scaleX *= element.scale.x * _canvasWidthHalf;
34065                     scaleY *= element.scale.y * _canvasHeightHalf;
34066
34067                     _bboxRect.set( v1.x - scaleX, v1.y - scaleY, v1.x  + scaleX, v1.y + scaleY );
34068
34069                     if ( _clipRect.intersects( _bboxRect ) === false ) {
34070
34071                         return;
34072
34073                     }
34074
34075                     setFillStyle( material.color.getContextStyle() );
34076
34077                     _context.save();
34078                     _context.translate( v1.x, v1.y );
34079                     _context.rotate( - element.rotation );
34080                     _context.scale( scaleX, scaleY );
34081                     _context.fillRect( -1, -1, 2, 2 );
34082                     _context.restore();
34083
34084                 } else {
34085
34086                     bitmap = material.map.image;
34087                     bitmapWidth = bitmap.width >> 1;
34088                     bitmapHeight = bitmap.height >> 1;
34089
34090                     scaleX = element.scale.x * _canvasWidthHalf;
34091                     scaleY = element.scale.y * _canvasHeightHalf;
34092
34093                     width = scaleX * bitmapWidth;
34094                     height = scaleY * bitmapHeight;
34095
34096                     // TODO: Rotations break this...
34097
34098                     _bboxRect.set( v1.x - width, v1.y - height, v1.x  + width, v1.y + height );
34099
34100                     if ( _clipRect.intersects( _bboxRect ) === false ) {
34101
34102                         return;
34103
34104                     }
34105
34106                     _context.save();
34107                     _context.translate( v1.x, v1.y );
34108                     _context.rotate( - element.rotation );
34109                     _context.scale( scaleX, - scaleY );
34110
34111                     _context.translate( - bitmapWidth, - bitmapHeight );
34112                     _context.drawImage( bitmap, 0, 0 );
34113                     _context.restore();
34114
34115                 }
34116
34117                 /* DEBUG
34118                 setStrokeStyle( 'rgb(255,255,0)' );
34119                 _context.beginPath();
34120                 _context.moveTo( v1.x - 10, v1.y );
34121                 _context.lineTo( v1.x + 10, v1.y );
34122                 _context.moveTo( v1.x, v1.y - 10 );
34123                 _context.lineTo( v1.x, v1.y + 10 );
34124                 _context.stroke();
34125                 */
34126
34127             } else if ( material instanceof THREE.ParticleCanvasMaterial ) {
34128
34129                 width = element.scale.x * _canvasWidthHalf;
34130                 height = element.scale.y * _canvasHeightHalf;
34131
34132                 _bboxRect.set( v1.x - width, v1.y - height, v1.x + width, v1.y + height );
34133
34134                 if ( _clipRect.intersects( _bboxRect ) === false ) {
34135
34136                     return;
34137
34138                 }
34139
34140                 setStrokeStyle( material.color.getContextStyle() );
34141                 setFillStyle( material.color.getContextStyle() );
34142
34143                 _context.save();
34144                 _context.translate( v1.x, v1.y );
34145                 _context.rotate( - element.rotation );
34146                 _context.scale( width, height );
34147
34148                 material.program( _context );
34149
34150                 _context.restore();
34151
34152             }
34153
34154         }
34155
34156         function renderLine( v1, v2, element, material, scene ) {
34157
34158             setOpacity( material.opacity );
34159             setBlending( material.blending );
34160
34161             _context.beginPath();
34162             _context.moveTo( v1.positionScreen.x, v1.positionScreen.y );
34163             _context.lineTo( v2.positionScreen.x, v2.positionScreen.y );
34164
34165             if ( material instanceof THREE.LineBasicMaterial ) {
34166
34167                 setLineWidth( material.linewidth );
34168                 setLineCap( material.linecap );
34169                 setLineJoin( material.linejoin );
34170                 setStrokeStyle( material.color.getContextStyle() );
34171
34172                 _context.stroke();
34173                 _bboxRect.inflate( material.linewidth * 2 );
34174
34175             }
34176
34177         }
34178
34179         function renderFace3( v1, v2, v3, uv1, uv2, uv3, element, material, scene ) {
34180
34181             _this.info.render.vertices += 3;
34182             _this.info.render.faces ++;
34183
34184             setOpacity( material.opacity );
34185             setBlending( material.blending );
34186
34187             _v1x = v1.positionScreen.x; _v1y = v1.positionScreen.y;
34188             _v2x = v2.positionScreen.x; _v2y = v2.positionScreen.y;
34189             _v3x = v3.positionScreen.x; _v3y = v3.positionScreen.y;
34190
34191             drawTriangle( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y );
34192
34193             if ( ( material instanceof THREE.MeshLambertMaterial || material instanceof THREE.MeshPhongMaterial ) && material.map === null && material.map === null ) {
34194
34195                 if ( _enableLighting === true ) {
34196
34197                     var diffuse = material.color;
34198                     var emissive = material.emissive;
34199
34200                     if ( material.wireframe === false && material.shading == THREE.SmoothShading && element.vertexNormalsLength == 3 ) {
34201
34202                         _color1.r = _color2.r = _color3.r = _ambientLight.r;
34203                         _color1.g = _color2.g = _color3.g = _ambientLight.g;
34204                         _color1.b = _color2.b = _color3.b = _ambientLight.b;
34205
34206                         calculateLight( element.v1.positionWorld, element.vertexNormalsWorld[ 0 ], _color1 );
34207                         calculateLight( element.v2.positionWorld, element.vertexNormalsWorld[ 1 ], _color2 );
34208                         calculateLight( element.v3.positionWorld, element.vertexNormalsWorld[ 2 ], _color3 );
34209
34210                         _color1.r = diffuse.r * _color1.r + emissive.r;
34211                         _color1.g = diffuse.g * _color1.g + emissive.g;
34212                         _color1.b = diffuse.b * _color1.b + emissive.b;
34213
34214                         _color2.r = diffuse.r * _color2.r + emissive.r;
34215                         _color2.g = diffuse.g * _color2.g + emissive.g;
34216                         _color2.b = diffuse.b * _color2.b + emissive.b;
34217
34218                         _color3.r = diffuse.r * _color3.r + emissive.r;
34219                         _color3.g = diffuse.g * _color3.g + emissive.g;
34220                         _color3.b = diffuse.b * _color3.b + emissive.b;
34221
34222                         _color4.r = ( _color2.r + _color3.r ) * 0.5;
34223                         _color4.g = ( _color2.g + _color3.g ) * 0.5;
34224                         _color4.b = ( _color2.b + _color3.b ) * 0.5;
34225
34226                         _image = getGradientTexture( _color1, _color2, _color3, _color4 );
34227
34228                         clipImage( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, 0, 0, 1, 0, 0, 1, _image );
34229
34230                     } else {
34231
34232                         _color.r = _ambientLight.r;
34233                         _color.g = _ambientLight.g;
34234                         _color.b = _ambientLight.b;
34235
34236                         calculateLight( element.centroidWorld, element.normalWorld, _color );
34237
34238                         _color.r = diffuse.r * _color.r + emissive.r;
34239                         _color.g = diffuse.g * _color.g + emissive.g;
34240                         _color.b = diffuse.b * _color.b + emissive.b;
34241
34242                         material.wireframe === true ? strokePath( _color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin ) : fillPath( _color );
34243
34244                     }
34245
34246                 } else {
34247
34248                     material.wireframe === true ? strokePath( material.color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin ) : fillPath( material.color );
34249
34250                 }
34251
34252             } else if ( material instanceof THREE.MeshBasicMaterial || material instanceof THREE.MeshLambertMaterial || material instanceof THREE.MeshPhongMaterial ) {
34253
34254                 if ( material.map !== null ) {
34255
34256                     if ( material.map.mapping instanceof THREE.UVMapping ) {
34257
34258                         _uvs = element.uvs[ 0 ];
34259                         patternPath( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, _uvs[ uv1 ].u, _uvs[ uv1 ].v, _uvs[ uv2 ].u, _uvs[ uv2 ].v, _uvs[ uv3 ].u, _uvs[ uv3 ].v, material.map );
34260
34261                     }
34262
34263
34264                 } else if ( material.envMap !== null ) {
34265
34266                     if ( material.envMap.mapping instanceof THREE.SphericalReflectionMapping ) {
34267
34268                         var cameraMatrix = camera.matrixWorldInverse;
34269
34270                         _vector3.copy( element.vertexNormalsWorld[ uv1 ] );
34271                         _uv1x = ( _vector3.x * cameraMatrix.elements[0] + _vector3.y * cameraMatrix.elements[4] + _vector3.z * cameraMatrix.elements[8] ) * 0.5 + 0.5;
34272                         _uv1y = ( _vector3.x * cameraMatrix.elements[1] + _vector3.y * cameraMatrix.elements[5] + _vector3.z * cameraMatrix.elements[9] ) * 0.5 + 0.5;
34273
34274                         _vector3.copy( element.vertexNormalsWorld[ uv2 ] );
34275                         _uv2x = ( _vector3.x * cameraMatrix.elements[0] + _vector3.y * cameraMatrix.elements[4] + _vector3.z * cameraMatrix.elements[8] ) * 0.5 + 0.5;
34276                         _uv2y = ( _vector3.x * cameraMatrix.elements[1] + _vector3.y * cameraMatrix.elements[5] + _vector3.z * cameraMatrix.elements[9] ) * 0.5 + 0.5;
34277
34278                         _vector3.copy( element.vertexNormalsWorld[ uv3 ] );
34279                         _uv3x = ( _vector3.x * cameraMatrix.elements[0] + _vector3.y * cameraMatrix.elements[4] + _vector3.z * cameraMatrix.elements[8] ) * 0.5 + 0.5;
34280                         _uv3y = ( _vector3.x * cameraMatrix.elements[1] + _vector3.y * cameraMatrix.elements[5] + _vector3.z * cameraMatrix.elements[9] ) * 0.5 + 0.5;
34281
34282                         patternPath( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, _uv1x, _uv1y, _uv2x, _uv2y, _uv3x, _uv3y, material.envMap );
34283
34284                     }/* else if ( material.envMap.mapping == THREE.SphericalRefractionMapping ) {
34285
34286
34287
34288                     }*/
34289
34290
34291                 } else {
34292
34293                     material.wireframe === true ? strokePath( material.color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin ) : fillPath( material.color );
34294
34295                 }
34296
34297             } else if ( material instanceof THREE.MeshDepthMaterial ) {
34298
34299                 _near = camera.near;
34300                 _far = camera.far;
34301
34302                 _color1.r = _color1.g = _color1.b = 1 - smoothstep( v1.positionScreen.z, _near, _far );
34303                 _color2.r = _color2.g = _color2.b = 1 - smoothstep( v2.positionScreen.z, _near, _far );
34304                 _color3.r = _color3.g = _color3.b = 1 - smoothstep( v3.positionScreen.z, _near, _far );
34305
34306                 _color4.r = ( _color2.r + _color3.r ) * 0.5;
34307                 _color4.g = ( _color2.g + _color3.g ) * 0.5;
34308                 _color4.b = ( _color2.b + _color3.b ) * 0.5;
34309
34310                 _image = getGradientTexture( _color1, _color2, _color3, _color4 );
34311
34312                 clipImage( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, 0, 0, 1, 0, 0, 1, _image );
34313
34314             } else if ( material instanceof THREE.MeshNormalMaterial ) {
34315
34316                 _color.r = normalToComponent( element.normalWorld.x );
34317                 _color.g = normalToComponent( element.normalWorld.y );
34318                 _color.b = normalToComponent( element.normalWorld.z );
34319
34320                 material.wireframe === true ? strokePath( _color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin ) : fillPath( _color );
34321
34322             }
34323
34324         }
34325
34326         function renderFace4( v1, v2, v3, v4, v5, v6, element, material, scene ) {
34327
34328             _this.info.render.vertices += 4;
34329             _this.info.render.faces ++;
34330
34331             setOpacity( material.opacity );
34332             setBlending( material.blending );
34333
34334             if ( ( material.map !== undefined && material.map !== null ) || ( material.envMap !== undefined && material.envMap !== null ) ) {
34335
34336                 // Let renderFace3() handle this
34337
34338                 renderFace3( v1, v2, v4, 0, 1, 3, element, material, scene );
34339                 renderFace3( v5, v3, v6, 1, 2, 3, element, material, scene );
34340
34341                 return;
34342
34343             }
34344
34345             _v1x = v1.positionScreen.x; _v1y = v1.positionScreen.y;
34346             _v2x = v2.positionScreen.x; _v2y = v2.positionScreen.y;
34347             _v3x = v3.positionScreen.x; _v3y = v3.positionScreen.y;
34348             _v4x = v4.positionScreen.x; _v4y = v4.positionScreen.y;
34349             _v5x = v5.positionScreen.x; _v5y = v5.positionScreen.y;
34350             _v6x = v6.positionScreen.x; _v6y = v6.positionScreen.y;
34351
34352             if ( material instanceof THREE.MeshLambertMaterial || material instanceof THREE.MeshPhongMaterial ) {
34353
34354                 if ( _enableLighting === true ) {
34355
34356                     var diffuse = material.color;
34357                     var emissive = material.emissive;
34358
34359                     if ( material.wireframe === false && material.shading == THREE.SmoothShading && element.vertexNormalsLength == 4 ) {
34360
34361                         _color1.r = _color2.r = _color3.r = _color4.r = _ambientLight.r;
34362                         _color1.g = _color2.g = _color3.g = _color4.g = _ambientLight.g;
34363                         _color1.b = _color2.b = _color3.b = _color4.b = _ambientLight.b;
34364
34365                         calculateLight( element.v1.positionWorld, element.vertexNormalsWorld[ 0 ], _color1 );
34366                         calculateLight( element.v2.positionWorld, element.vertexNormalsWorld[ 1 ], _color2 );
34367                         calculateLight( element.v4.positionWorld, element.vertexNormalsWorld[ 3 ], _color3 );
34368                         calculateLight( element.v3.positionWorld, element.vertexNormalsWorld[ 2 ], _color4 );
34369
34370                         _color1.r = diffuse.r * _color1.r + emissive.r;
34371                         _color1.g = diffuse.g * _color1.g + emissive.g;
34372                         _color1.b = diffuse.b * _color1.b + emissive.b;
34373
34374                         _color2.r = diffuse.r * _color2.r + emissive.r;
34375                         _color2.g = diffuse.g * _color2.g + emissive.g;
34376                         _color2.b = diffuse.b * _color2.b + emissive.b;
34377
34378                         _color3.r = diffuse.r * _color3.r + emissive.r;
34379                         _color3.g = diffuse.g * _color3.g + emissive.g;
34380                         _color3.b = diffuse.b * _color3.b + emissive.b;
34381
34382                         _color4.r = diffuse.r * _color4.r + emissive.r;
34383                         _color4.g = diffuse.g * _color4.g + emissive.g;
34384                         _color4.b = diffuse.b * _color4.b + emissive.b;
34385
34386                         _image = getGradientTexture( _color1, _color2, _color3, _color4 );
34387
34388                         // TODO: UVs are incorrect, v4->v3?
34389
34390                         drawTriangle( _v1x, _v1y, _v2x, _v2y, _v4x, _v4y );
34391                         clipImage( _v1x, _v1y, _v2x, _v2y, _v4x, _v4y, 0, 0, 1, 0, 0, 1, _image );
34392
34393                         drawTriangle( _v5x, _v5y, _v3x, _v3y, _v6x, _v6y );
34394                         clipImage( _v5x, _v5y, _v3x, _v3y, _v6x, _v6y, 1, 0, 1, 1, 0, 1, _image );
34395
34396                     } else {
34397
34398                         _color.r = _ambientLight.r;
34399                         _color.g = _ambientLight.g;
34400                         _color.b = _ambientLight.b;
34401
34402                         calculateLight( element.centroidWorld, element.normalWorld, _color );
34403
34404                         _color.r = diffuse.r * _color.r + emissive.r;
34405                         _color.g = diffuse.g * _color.g + emissive.g;
34406                         _color.b = diffuse.b * _color.b + emissive.b;
34407
34408                         drawQuad( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, _v4x, _v4y );
34409
34410                         material.wireframe === true ? strokePath( _color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin ) : fillPath( _color );
34411
34412                     }
34413
34414                 } else {
34415
34416                     drawQuad( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, _v4x, _v4y );
34417
34418                     material.wireframe === true ? strokePath( material.color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin ) : fillPath( material.color );
34419
34420                 }
34421
34422             } else if ( material instanceof THREE.MeshBasicMaterial ) {
34423
34424                 drawQuad( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, _v4x, _v4y );
34425
34426                 material.wireframe === true ? strokePath( material.color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin ) : fillPath( material.color );
34427
34428             } else if ( material instanceof THREE.MeshNormalMaterial ) {
34429
34430                 _color.r = normalToComponent( element.normalWorld.x );
34431                 _color.g = normalToComponent( element.normalWorld.y );
34432                 _color.b = normalToComponent( element.normalWorld.z );
34433
34434                 drawQuad( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, _v4x, _v4y );
34435
34436                 material.wireframe === true ? strokePath( _color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin ) : fillPath( _color );
34437
34438             } else if ( material instanceof THREE.MeshDepthMaterial ) {
34439
34440                 _near = camera.near;
34441                 _far = camera.far;
34442
34443                 _color1.r = _color1.g = _color1.b = 1 - smoothstep( v1.positionScreen.z, _near, _far );
34444                 _color2.r = _color2.g = _color2.b = 1 - smoothstep( v2.positionScreen.z, _near, _far );
34445                 _color3.r = _color3.g = _color3.b = 1 - smoothstep( v4.positionScreen.z, _near, _far );
34446                 _color4.r = _color4.g = _color4.b = 1 - smoothstep( v3.positionScreen.z, _near, _far );
34447
34448                 _image = getGradientTexture( _color1, _color2, _color3, _color4 );
34449
34450                 // TODO: UVs are incorrect, v4->v3?
34451
34452                 drawTriangle( _v1x, _v1y, _v2x, _v2y, _v4x, _v4y );
34453                 clipImage( _v1x, _v1y, _v2x, _v2y, _v4x, _v4y, 0, 0, 1, 0, 0, 1, _image );
34454
34455                 drawTriangle( _v5x, _v5y, _v3x, _v3y, _v6x, _v6y );
34456                 clipImage( _v5x, _v5y, _v3x, _v3y, _v6x, _v6y, 1, 0, 1, 1, 0, 1, _image );
34457
34458             }
34459
34460         }
34461
34462         //
34463
34464         function drawTriangle( x0, y0, x1, y1, x2, y2 ) {
34465
34466             _context.beginPath();
34467             _context.moveTo( x0, y0 );
34468             _context.lineTo( x1, y1 );
34469             _context.lineTo( x2, y2 );
34470             _context.closePath();
34471
34472         }
34473
34474         function drawQuad( x0, y0, x1, y1, x2, y2, x3, y3 ) {
34475
34476             _context.beginPath();
34477             _context.moveTo( x0, y0 );
34478             _context.lineTo( x1, y1 );
34479             _context.lineTo( x2, y2 );
34480             _context.lineTo( x3, y3 );
34481             _context.closePath();
34482
34483         }
34484
34485         function strokePath( color, linewidth, linecap, linejoin ) {
34486
34487             setLineWidth( linewidth );
34488             setLineCap( linecap );
34489             setLineJoin( linejoin );
34490             setStrokeStyle( color.getContextStyle() );
34491
34492             _context.stroke();
34493
34494             _bboxRect.inflate( linewidth * 2 );
34495
34496         }
34497
34498         function fillPath( color ) {
34499
34500             setFillStyle( color.getContextStyle() );
34501             _context.fill();
34502
34503         }
34504
34505         function patternPath( x0, y0, x1, y1, x2, y2, u0, v0, u1, v1, u2, v2, texture ) {
34506
34507             if ( texture instanceof THREE.DataTexture || texture.image === undefined || texture.image.width == 0 ) return;
34508
34509             if ( texture.needsUpdate === true ) {
34510
34511                 var repeatX = texture.wrapS == THREE.RepeatWrapping;
34512                 var repeatY = texture.wrapT == THREE.RepeatWrapping;
34513
34514                 _patterns[ texture.id ] = _context.createPattern(
34515                     texture.image, repeatX === true && repeatY === true
34516                         ? 'repeat'
34517                         : repeatX === true && repeatY === false
34518                             ? 'repeat-x'
34519                             : repeatX === false && repeatY === true
34520                                 ? 'repeat-y'
34521                                 : 'no-repeat'
34522                 );
34523
34524                 texture.needsUpdate = false;
34525
34526             }
34527
34528             _patterns[ texture.id ] === undefined
34529                 ? setFillStyle( 'rgba(0,0,0,1)' )
34530                 : setFillStyle( _patterns[ texture.id ] );
34531
34532             // http://extremelysatisfactorytotalitarianism.com/blog/?p=2120
34533
34534             var a, b, c, d, e, f, det, idet,
34535             offsetX = texture.offset.x / texture.repeat.x,
34536             offsetY = texture.offset.y / texture.repeat.y,
34537             width = texture.image.width * texture.repeat.x,
34538             height = texture.image.height * texture.repeat.y;
34539
34540             u0 = ( u0 + offsetX ) * width;
34541             v0 = ( 1.0 - v0 + offsetY ) * height;
34542
34543             u1 = ( u1 + offsetX ) * width;
34544             v1 = ( 1.0 - v1 + offsetY ) * height;
34545
34546             u2 = ( u2 + offsetX ) * width;
34547             v2 = ( 1.0 - v2 + offsetY ) * height;
34548
34549             x1 -= x0; y1 -= y0;
34550             x2 -= x0; y2 -= y0;
34551
34552             u1 -= u0; v1 -= v0;
34553             u2 -= u0; v2 -= v0;
34554
34555             det = u1 * v2 - u2 * v1;
34556
34557             if ( det === 0 ) {
34558
34559                 if ( _imagedatas[ texture.id ] === undefined ) {
34560
34561                     var canvas = document.createElement( 'canvas' )
34562                     canvas.width = texture.image.width;
34563                     canvas.height = texture.image.height;
34564
34565                     var context = canvas.getContext( '2d' );
34566                     context.drawImage( texture.image, 0, 0 );
34567
34568                     _imagedatas[ texture.id ] = context.getImageData( 0, 0, texture.image.width, texture.image.height ).data;
34569
34570                 }
34571
34572                 var data = _imagedatas[ texture.id ];
34573                 var index = ( Math.floor( u0 ) + Math.floor( v0 ) * texture.image.width ) * 4;
34574
34575                 _color.setRGB( data[ index ] / 255, data[ index + 1 ] / 255, data[ index + 2 ] / 255 );
34576                 fillPath( _color );
34577
34578                 return;
34579
34580             }
34581
34582             idet = 1 / det;
34583
34584             a = ( v2 * x1 - v1 * x2 ) * idet;
34585             b = ( v2 * y1 - v1 * y2 ) * idet;
34586             c = ( u1 * x2 - u2 * x1 ) * idet;
34587             d = ( u1 * y2 - u2 * y1 ) * idet;
34588
34589             e = x0 - a * u0 - c * v0;
34590             f = y0 - b * u0 - d * v0;
34591
34592             _context.save();
34593             _context.transform( a, b, c, d, e, f );
34594             _context.fill();
34595             _context.restore();
34596
34597         }
34598
34599         function clipImage( x0, y0, x1, y1, x2, y2, u0, v0, u1, v1, u2, v2, image ) {
34600
34601             // http://extremelysatisfactorytotalitarianism.com/blog/?p=2120
34602
34603             var a, b, c, d, e, f, det, idet,
34604             width = image.width - 1,
34605             height = image.height - 1;
34606
34607             u0 *= width; v0 *= height;
34608             u1 *= width; v1 *= height;
34609             u2 *= width; v2 *= height;
34610
34611             x1 -= x0; y1 -= y0;
34612             x2 -= x0; y2 -= y0;
34613
34614             u1 -= u0; v1 -= v0;
34615             u2 -= u0; v2 -= v0;
34616
34617             det = u1 * v2 - u2 * v1;
34618
34619             idet = 1 / det;
34620
34621             a = ( v2 * x1 - v1 * x2 ) * idet;
34622             b = ( v2 * y1 - v1 * y2 ) * idet;
34623             c = ( u1 * x2 - u2 * x1 ) * idet;
34624             d = ( u1 * y2 - u2 * y1 ) * idet;
34625
34626             e = x0 - a * u0 - c * v0;
34627             f = y0 - b * u0 - d * v0;
34628
34629             _context.save();
34630             _context.transform( a, b, c, d, e, f );
34631             _context.clip();
34632             _context.drawImage( image, 0, 0 );
34633             _context.restore();
34634
34635         }
34636
34637         function getGradientTexture( color1, color2, color3, color4 ) {
34638
34639             // http://mrdoob.com/blog/post/710
34640
34641             _pixelMapData[ 0 ] = ( color1.r * 255 ) | 0;
34642             _pixelMapData[ 1 ] = ( color1.g * 255 ) | 0;
34643             _pixelMapData[ 2 ] = ( color1.b * 255 ) | 0;
34644
34645             _pixelMapData[ 4 ] = ( color2.r * 255 ) | 0;
34646             _pixelMapData[ 5 ] = ( color2.g * 255 ) | 0;
34647             _pixelMapData[ 6 ] = ( color2.b * 255 ) | 0;
34648
34649             _pixelMapData[ 8 ] = ( color3.r * 255 ) | 0;
34650             _pixelMapData[ 9 ] = ( color3.g * 255 ) | 0;
34651             _pixelMapData[ 10 ] = ( color3.b * 255 ) | 0;
34652
34653             _pixelMapData[ 12 ] = ( color4.r * 255 ) | 0;
34654             _pixelMapData[ 13 ] = ( color4.g * 255 ) | 0;
34655             _pixelMapData[ 14 ] = ( color4.b * 255 ) | 0;
34656
34657             _pixelMapContext.putImageData( _pixelMapImage, 0, 0 );
34658             _gradientMapContext.drawImage( _pixelMap, 0, 0 );
34659
34660             return _gradientMap;
34661
34662         }
34663
34664         function smoothstep( value, min, max ) {
34665
34666             var x = ( value - min ) / ( max - min );
34667             return x * x * ( 3 - 2 * x );
34668
34669         }
34670
34671         function normalToComponent( normal ) {
34672
34673             var component = ( normal + 1 ) * 0.5;
34674             return component < 0 ? 0 : ( component > 1 ? 1 : component );
34675
34676         }
34677
34678         // Hide anti-alias gaps
34679
34680         function expand( v1, v2 ) {
34681
34682             var x = v2.x - v1.x, y =  v2.y - v1.y,
34683             det = x * x + y * y, idet;
34684
34685             if ( det === 0 ) return;
34686
34687             idet = 1 / Math.sqrt( det );
34688
34689             x *= idet; y *= idet;
34690
34691             v2.x += x; v2.y += y;
34692             v1.x -= x; v1.y -= y;
34693
34694         }
34695     };
34696
34697     // Context cached methods.
34698
34699     function setOpacity( value ) {
34700
34701         if ( _contextGlobalAlpha !== value ) {
34702
34703             _context.globalAlpha = value;
34704             _contextGlobalAlpha = value;
34705
34706         }
34707
34708     }
34709
34710     function setBlending( value ) {
34711
34712         if ( _contextGlobalCompositeOperation !== value ) {
34713
34714             if ( value === THREE.NormalBlending ) {
34715
34716                 _context.globalCompositeOperation = 'source-over';
34717
34718             } else if ( value === THREE.AdditiveBlending ) {
34719
34720                 _context.globalCompositeOperation = 'lighter';
34721
34722             } else if ( value === THREE.SubtractiveBlending ) {
34723
34724                 _context.globalCompositeOperation = 'darker';
34725
34726             }
34727
34728             _contextGlobalCompositeOperation = value;
34729
34730         }
34731
34732     }
34733
34734     function setLineWidth( value ) {
34735
34736         if ( _contextLineWidth !== value ) {
34737
34738             _context.lineWidth = value;
34739             _contextLineWidth = value;
34740
34741         }
34742
34743     }
34744
34745     function setLineCap( value ) {
34746
34747         // "butt", "round", "square"
34748
34749         if ( _contextLineCap !== value ) {
34750
34751             _context.lineCap = value;
34752             _contextLineCap = value;
34753
34754         }
34755
34756     }
34757
34758     function setLineJoin( value ) {
34759
34760         // "round", "bevel", "miter"
34761
34762         if ( _contextLineJoin !== value ) {
34763
34764             _context.lineJoin = value;
34765             _contextLineJoin = value;
34766
34767         }
34768
34769     }
34770
34771     function setStrokeStyle( value ) {
34772
34773         if ( _contextStrokeStyle !== value ) {
34774
34775             _context.strokeStyle = value;
34776             _contextStrokeStyle = value;
34777
34778         }
34779
34780     }
34781
34782     function setFillStyle( value ) {
34783
34784         if ( _contextFillStyle !== value ) {
34785
34786             _context.fillStyle = value;
34787             _contextFillStyle = value;
34788
34789         }
34790
34791     }
34792
34793 };
34794 /**
34795  * @author alteredq / http://alteredqualia.com/
34796  * @author mrdoob / http://mrdoob.com/
34797  * @author mikael emtinger / http://gomo.se/
34798  */
34799
34800 THREE.ShaderChunk = {
34801
34802     // FOG
34803
34804     fog_pars_fragment: [
34805
34806         "#ifdef USE_FOG",
34807
34808             "uniform vec3 fogColor;",
34809
34810             "#ifdef FOG_EXP2",
34811
34812                 "uniform float fogDensity;",
34813
34814             "#else",
34815
34816                 "uniform float fogNear;",
34817                 "uniform float fogFar;",
34818
34819             "#endif",
34820
34821         "#endif"
34822
34823     ].join("\n"),
34824
34825     fog_fragment: [
34826
34827         "#ifdef USE_FOG",
34828
34829             "float depth = gl_FragCoord.z / gl_FragCoord.w;",
34830
34831             "#ifdef FOG_EXP2",
34832
34833                 "const float LOG2 = 1.442695;",
34834                 "float fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );",
34835                 "fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );",
34836
34837             "#else",
34838
34839                 "float fogFactor = smoothstep( fogNear, fogFar, depth );",
34840
34841             "#endif",
34842
34843             "gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );",
34844
34845         "#endif"
34846
34847     ].join("\n"),
34848
34849     // ENVIRONMENT MAP
34850
34851     envmap_pars_fragment: [
34852
34853         "#ifdef USE_ENVMAP",
34854
34855             "uniform float reflectivity;",
34856             "uniform samplerCube envMap;",
34857             "uniform float flipEnvMap;",
34858             "uniform int combine;",
34859
34860             "#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )",
34861
34862                 "uniform bool useRefract;",
34863                 "uniform float refractionRatio;",
34864
34865             "#else",
34866
34867                 "varying vec3 vReflect;",
34868
34869             "#endif",
34870
34871         "#endif"
34872
34873     ].join("\n"),
34874
34875     envmap_fragment: [
34876
34877         "#ifdef USE_ENVMAP",
34878
34879             "vec3 reflectVec;",
34880
34881             "#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )",
34882
34883                 "vec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );",
34884
34885                 "if ( useRefract ) {",
34886
34887                     "reflectVec = refract( cameraToVertex, normal, refractionRatio );",
34888
34889                 "} else { ",
34890
34891                     "reflectVec = reflect( cameraToVertex, normal );",
34892
34893                 "}",
34894
34895             "#else",
34896
34897                 "reflectVec = vReflect;",
34898
34899             "#endif",
34900
34901             "#ifdef DOUBLE_SIDED",
34902
34903                 "float flipNormal = ( -1.0 + 2.0 * float( gl_FrontFacing ) );",
34904                 "vec4 cubeColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );",
34905
34906             "#else",
34907
34908                 "vec4 cubeColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );",
34909
34910             "#endif",
34911
34912             "#ifdef GAMMA_INPUT",
34913
34914                 "cubeColor.xyz *= cubeColor.xyz;",
34915
34916             "#endif",
34917
34918             "if ( combine == 1 ) {",
34919
34920                 "gl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularStrength * reflectivity );",
34921
34922             "} else {",
34923
34924                 "gl_FragColor.xyz = mix( gl_FragColor.xyz, gl_FragColor.xyz * cubeColor.xyz, specularStrength * reflectivity );",
34925
34926             "}",
34927
34928         "#endif"
34929
34930     ].join("\n"),
34931
34932     envmap_pars_vertex: [
34933
34934         "#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP )",
34935
34936             "varying vec3 vReflect;",
34937
34938             "uniform float refractionRatio;",
34939             "uniform bool useRefract;",
34940
34941         "#endif"
34942
34943     ].join("\n"),
34944
34945     worldpos_vertex : [
34946
34947         "#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )",
34948
34949             "#ifdef USE_SKINNING",
34950
34951                 "vec4 mPosition = modelMatrix * skinned;",
34952
34953             "#endif",
34954
34955             "#if defined( USE_MORPHTARGETS ) && ! defined( USE_SKINNING )",
34956
34957                 "vec4 mPosition = modelMatrix * vec4( morphed, 1.0 );",
34958
34959             "#endif",
34960
34961             "#if ! defined( USE_MORPHTARGETS ) && ! defined( USE_SKINNING )",
34962
34963                 "vec4 mPosition = modelMatrix * vec4( position, 1.0 );",
34964
34965             "#endif",
34966
34967         "#endif"
34968
34969     ].join("\n"),
34970
34971     envmap_vertex : [
34972
34973         "#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP )",
34974
34975             "vec3 nWorld = mat3( modelMatrix[ 0 ].xyz, modelMatrix[ 1 ].xyz, modelMatrix[ 2 ].xyz ) * objectNormal;",
34976
34977             "if ( useRefract ) {",
34978
34979                 "vReflect = refract( normalize( mPosition.xyz - cameraPosition ), normalize( nWorld.xyz ), refractionRatio );",
34980
34981             "} else {",
34982
34983                 "vReflect = reflect( normalize( mPosition.xyz - cameraPosition ), normalize( nWorld.xyz ) );",
34984
34985             "}",
34986
34987         "#endif"
34988
34989     ].join("\n"),
34990
34991     // COLOR MAP (particles)
34992
34993     map_particle_pars_fragment: [
34994
34995         "#ifdef USE_MAP",
34996
34997             "uniform sampler2D map;",
34998
34999         "#endif"
35000
35001     ].join("\n"),
35002
35003
35004     map_particle_fragment: [
35005
35006         "#ifdef USE_MAP",
35007
35008             "gl_FragColor = gl_FragColor * texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) );",
35009
35010         "#endif"
35011
35012     ].join("\n"),
35013
35014     // COLOR MAP (triangles)
35015
35016     map_pars_vertex: [
35017
35018         "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP )",
35019
35020             "varying vec2 vUv;",
35021             "uniform vec4 offsetRepeat;",
35022
35023         "#endif"
35024
35025     ].join("\n"),
35026
35027     map_pars_fragment: [
35028
35029         "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP )",
35030
35031             "varying vec2 vUv;",
35032
35033         "#endif",
35034
35035         "#ifdef USE_MAP",
35036
35037             "uniform sampler2D map;",
35038
35039         "#endif",
35040
35041     ].join("\n"),
35042
35043     map_vertex: [
35044
35045         "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP )",
35046
35047             "vUv = uv * offsetRepeat.zw + offsetRepeat.xy;",
35048
35049         "#endif"
35050
35051     ].join("\n"),
35052
35053     map_fragment: [
35054
35055         "#ifdef USE_MAP",
35056
35057             "#ifdef GAMMA_INPUT",
35058
35059                 "vec4 texelColor = texture2D( map, vUv );",
35060                 "texelColor.xyz *= texelColor.xyz;",
35061
35062                 "gl_FragColor = gl_FragColor * texelColor;",
35063
35064             "#else",
35065
35066                 "gl_FragColor = gl_FragColor * texture2D( map, vUv );",
35067
35068             "#endif",
35069
35070         "#endif"
35071
35072     ].join("\n"),
35073
35074     // LIGHT MAP
35075
35076     lightmap_pars_fragment: [
35077
35078         "#ifdef USE_LIGHTMAP",
35079
35080             "varying vec2 vUv2;",
35081             "uniform sampler2D lightMap;",
35082
35083         "#endif"
35084
35085     ].join("\n"),
35086
35087     lightmap_pars_vertex: [
35088
35089         "#ifdef USE_LIGHTMAP",
35090
35091             "varying vec2 vUv2;",
35092
35093         "#endif"
35094
35095     ].join("\n"),
35096
35097     lightmap_fragment: [
35098
35099         "#ifdef USE_LIGHTMAP",
35100
35101             "gl_FragColor = gl_FragColor * texture2D( lightMap, vUv2 );",
35102
35103         "#endif"
35104
35105     ].join("\n"),
35106
35107     lightmap_vertex: [
35108
35109         "#ifdef USE_LIGHTMAP",
35110
35111             "vUv2 = uv2;",
35112
35113         "#endif"
35114
35115     ].join("\n"),
35116
35117     // BUMP MAP
35118
35119     bumpmap_pars_fragment: [
35120
35121         "#ifdef USE_BUMPMAP",
35122
35123             "uniform sampler2D bumpMap;",
35124             "uniform float bumpScale;",
35125
35126             // Derivative maps - bump mapping unparametrized surfaces by Morten Mikkelsen
35127             //    http://mmikkelsen3d.blogspot.sk/2011/07/derivative-maps.html
35128
35129             // Evaluate the derivative of the height w.r.t. screen-space using forward differencing (listing 2)
35130
35131             "vec2 dHdxy_fwd() {",
35132
35133                 "vec2 dSTdx = dFdx( vUv );",
35134                 "vec2 dSTdy = dFdy( vUv );",
35135
35136                 "float Hll = bumpScale * texture2D( bumpMap, vUv ).x;",
35137                 "float dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;",
35138                 "float dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;",
35139
35140                 "return vec2( dBx, dBy );",
35141
35142             "}",
35143
35144             "vec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {",
35145
35146                 "vec3 vSigmaX = dFdx( surf_pos );",
35147                 "vec3 vSigmaY = dFdy( surf_pos );",
35148                 "vec3 vN = surf_norm;",        // normalized
35149
35150                 "vec3 R1 = cross( vSigmaY, vN );",
35151                 "vec3 R2 = cross( vN, vSigmaX );",
35152
35153                 "float fDet = dot( vSigmaX, R1 );",
35154
35155                 "vec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );",
35156                 "return normalize( abs( fDet ) * surf_norm - vGrad );",
35157
35158             "}",
35159
35160         "#endif"
35161
35162     ].join("\n"),
35163
35164     // NORMAL MAP
35165
35166     normalmap_pars_fragment: [
35167
35168         "#ifdef USE_NORMALMAP",
35169
35170             "uniform sampler2D normalMap;",
35171             "uniform vec2 normalScale;",
35172
35173             // Per-Pixel Tangent Space Normal Mapping
35174             // http://hacksoflife.blogspot.ch/2009/11/per-pixel-tangent-space-normal-mapping.html
35175
35176             "vec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {",
35177
35178                 "vec3 q0 = dFdx( eye_pos.xyz );",
35179                 "vec3 q1 = dFdy( eye_pos.xyz );",
35180                 "vec2 st0 = dFdx( vUv.st );",
35181                 "vec2 st1 = dFdy( vUv.st );",
35182
35183                 "vec3 S = normalize(  q0 * st1.t - q1 * st0.t );",
35184                 "vec3 T = normalize( -q0 * st1.s + q1 * st0.s );",
35185                 "vec3 N = normalize( surf_norm );",
35186
35187                 "vec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;",
35188                 "mapN.xy = normalScale * mapN.xy;",
35189                 "mat3 tsn = mat3( S, T, N );",
35190                 "return normalize( tsn * mapN );",
35191
35192             "}",
35193
35194         "#endif"
35195
35196     ].join("\n"),
35197
35198     // SPECULAR MAP
35199
35200     specularmap_pars_fragment: [
35201
35202         "#ifdef USE_SPECULARMAP",
35203
35204             "uniform sampler2D specularMap;",
35205
35206         "#endif"
35207
35208     ].join("\n"),
35209
35210     specularmap_fragment: [
35211
35212         "float specularStrength;",
35213
35214         "#ifdef USE_SPECULARMAP",
35215
35216             "vec4 texelSpecular = texture2D( specularMap, vUv );",
35217             "specularStrength = texelSpecular.r;",
35218
35219         "#else",
35220
35221             "specularStrength = 1.0;",
35222
35223         "#endif"
35224
35225     ].join("\n"),
35226
35227     // LIGHTS LAMBERT
35228
35229     lights_lambert_pars_vertex: [
35230
35231         "uniform vec3 ambient;",
35232         "uniform vec3 diffuse;",
35233         "uniform vec3 emissive;",
35234
35235         "uniform vec3 ambientLightColor;",
35236
35237         "#if MAX_DIR_LIGHTS > 0",
35238
35239             "uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];",
35240             "uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];",
35241
35242         "#endif",
35243
35244         "#if MAX_HEMI_LIGHTS > 0",
35245
35246             "uniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];",
35247             "uniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];",
35248             "uniform vec3 hemisphereLightPosition[ MAX_HEMI_LIGHTS ];",
35249
35250         "#endif",
35251
35252         "#if MAX_POINT_LIGHTS > 0",
35253
35254             "uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];",
35255             "uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];",
35256             "uniform float pointLightDistance[ MAX_POINT_LIGHTS ];",
35257
35258         "#endif",
35259
35260         "#if MAX_SPOT_LIGHTS > 0",
35261
35262             "uniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];",
35263             "uniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];",
35264             "uniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];",
35265             "uniform float spotLightDistance[ MAX_SPOT_LIGHTS ];",
35266             "uniform float spotLightAngle[ MAX_SPOT_LIGHTS ];",
35267             "uniform float spotLightExponent[ MAX_SPOT_LIGHTS ];",
35268
35269         "#endif",
35270
35271         "#ifdef WRAP_AROUND",
35272
35273             "uniform vec3 wrapRGB;",
35274
35275         "#endif"
35276
35277     ].join("\n"),
35278
35279     lights_lambert_vertex: [
35280
35281         "vLightFront = vec3( 0.0 );",
35282
35283         "#ifdef DOUBLE_SIDED",
35284
35285             "vLightBack = vec3( 0.0 );",
35286
35287         "#endif",
35288
35289         "transformedNormal = normalize( transformedNormal );",
35290
35291         "#if MAX_DIR_LIGHTS > 0",
35292
35293         "for( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {",
35294
35295             "vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );",
35296             "vec3 dirVector = normalize( lDirection.xyz );",
35297
35298             "float dotProduct = dot( transformedNormal, dirVector );",
35299             "vec3 directionalLightWeighting = vec3( max( dotProduct, 0.0 ) );",
35300
35301             "#ifdef DOUBLE_SIDED",
35302
35303                 "vec3 directionalLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );",
35304
35305                 "#ifdef WRAP_AROUND",
35306
35307                     "vec3 directionalLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );",
35308
35309                 "#endif",
35310
35311             "#endif",
35312
35313             "#ifdef WRAP_AROUND",
35314
35315                 "vec3 directionalLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );",
35316                 "directionalLightWeighting = mix( directionalLightWeighting, directionalLightWeightingHalf, wrapRGB );",
35317
35318                 "#ifdef DOUBLE_SIDED",
35319
35320                     "directionalLightWeightingBack = mix( directionalLightWeightingBack, directionalLightWeightingHalfBack, wrapRGB );",
35321
35322                 "#endif",
35323
35324             "#endif",
35325
35326             "vLightFront += directionalLightColor[ i ] * directionalLightWeighting;",
35327
35328             "#ifdef DOUBLE_SIDED",
35329
35330                 "vLightBack += directionalLightColor[ i ] * directionalLightWeightingBack;",
35331
35332             "#endif",
35333
35334         "}",
35335
35336         "#endif",
35337
35338         "#if MAX_POINT_LIGHTS > 0",
35339
35340             "for( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {",
35341
35342                 "vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );",
35343                 "vec3 lVector = lPosition.xyz - mvPosition.xyz;",
35344
35345                 "float lDistance = 1.0;",
35346                 "if ( pointLightDistance[ i ] > 0.0 )",
35347                     "lDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );",
35348
35349                 "lVector = normalize( lVector );",
35350                 "float dotProduct = dot( transformedNormal, lVector );",
35351
35352                 "vec3 pointLightWeighting = vec3( max( dotProduct, 0.0 ) );",
35353
35354                 "#ifdef DOUBLE_SIDED",
35355
35356                     "vec3 pointLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );",
35357
35358                     "#ifdef WRAP_AROUND",
35359
35360                         "vec3 pointLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );",
35361
35362                     "#endif",
35363
35364                 "#endif",
35365
35366                 "#ifdef WRAP_AROUND",
35367
35368                     "vec3 pointLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );",
35369                     "pointLightWeighting = mix( pointLightWeighting, pointLightWeightingHalf, wrapRGB );",
35370
35371                     "#ifdef DOUBLE_SIDED",
35372
35373                         "pointLightWeightingBack = mix( pointLightWeightingBack, pointLightWeightingHalfBack, wrapRGB );",
35374
35375                     "#endif",
35376
35377                 "#endif",
35378
35379                 "vLightFront += pointLightColor[ i ] * pointLightWeighting * lDistance;",
35380
35381                 "#ifdef DOUBLE_SIDED",
35382
35383                     "vLightBack += pointLightColor[ i ] * pointLightWeightingBack * lDistance;",
35384
35385                 "#endif",
35386
35387             "}",
35388
35389         "#endif",
35390
35391         "#if MAX_SPOT_LIGHTS > 0",
35392
35393             "for( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {",
35394
35395                 "vec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );",
35396                 "vec3 lVector = lPosition.xyz - mvPosition.xyz;",
35397
35398                 "lVector = normalize( lVector );",
35399
35400                 "float spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - mPosition.xyz ) );",
35401
35402                 "if ( spotEffect > spotLightAngle[ i ] ) {",
35403
35404                     "spotEffect = pow( spotEffect, spotLightExponent[ i ] );",
35405
35406                     "float lDistance = 1.0;",
35407                     "if ( spotLightDistance[ i ] > 0.0 )",
35408                         "lDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );",
35409
35410                     "float dotProduct = dot( transformedNormal, lVector );",
35411                     "vec3 spotLightWeighting = vec3( max( dotProduct, 0.0 ) );",
35412
35413                     "#ifdef DOUBLE_SIDED",
35414
35415                         "vec3 spotLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );",
35416
35417                         "#ifdef WRAP_AROUND",
35418
35419                             "vec3 spotLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );",
35420
35421                         "#endif",
35422
35423                     "#endif",
35424
35425                     "#ifdef WRAP_AROUND",
35426
35427                         "vec3 spotLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );",
35428                         "spotLightWeighting = mix( spotLightWeighting, spotLightWeightingHalf, wrapRGB );",
35429
35430                         "#ifdef DOUBLE_SIDED",
35431
35432                             "spotLightWeightingBack = mix( spotLightWeightingBack, spotLightWeightingHalfBack, wrapRGB );",
35433
35434                         "#endif",
35435
35436                     "#endif",
35437
35438                     "vLightFront += spotLightColor[ i ] * spotLightWeighting * lDistance * spotEffect;",
35439
35440                     "#ifdef DOUBLE_SIDED",
35441
35442                         "vLightBack += spotLightColor[ i ] * spotLightWeightingBack * lDistance * spotEffect;",
35443
35444                     "#endif",
35445
35446                 "}",
35447
35448             "}",
35449
35450         "#endif",
35451
35452         "#if MAX_HEMI_LIGHTS > 0",
35453
35454             "for( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {",
35455
35456                 "vec4 lPosition = viewMatrix * vec4( hemisphereLightPosition[ i ], 1.0 );",
35457                 "vec3 lVector = lPosition.xyz - mvPosition.xyz;",
35458
35459                 "lVector = normalize( lVector );",
35460
35461                 "float dotProduct = dot( transformedNormal, lVector );",
35462
35463                 "float hemiDiffuseWeight = 0.5 * dotProduct + 0.5;",
35464                 "float hemiDiffuseWeightBack = -0.5 * dotProduct + 0.5;",
35465
35466                 "vLightFront += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );",
35467
35468                 "#ifdef DOUBLE_SIDED",
35469
35470                     "vLightBack += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeightBack );",
35471
35472                 "#endif",
35473
35474             "}",
35475
35476         "#endif",
35477
35478         "vLightFront = vLightFront * diffuse + ambient * ambientLightColor + emissive;",
35479
35480         "#ifdef DOUBLE_SIDED",
35481
35482             "vLightBack = vLightBack * diffuse + ambient * ambientLightColor + emissive;",
35483
35484         "#endif"
35485
35486     ].join("\n"),
35487
35488     // LIGHTS PHONG
35489
35490     lights_phong_pars_vertex: [
35491
35492         "#ifndef PHONG_PER_PIXEL",
35493
35494         "#if MAX_POINT_LIGHTS > 0",
35495
35496             "uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];",
35497             "uniform float pointLightDistance[ MAX_POINT_LIGHTS ];",
35498
35499             "varying vec4 vPointLight[ MAX_POINT_LIGHTS ];",
35500
35501         "#endif",
35502
35503         "#if MAX_SPOT_LIGHTS > 0",
35504
35505             "uniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];",
35506             "uniform float spotLightDistance[ MAX_SPOT_LIGHTS ];",
35507
35508             "varying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];",
35509
35510         "#endif",
35511
35512         "#endif",
35513
35514         "#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP )",
35515
35516             "varying vec3 vWorldPosition;",
35517
35518         "#endif"
35519
35520     ].join("\n"),
35521
35522
35523     lights_phong_vertex: [
35524
35525         "#ifndef PHONG_PER_PIXEL",
35526
35527         "#if MAX_POINT_LIGHTS > 0",
35528
35529             "for( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {",
35530
35531                 "vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );",
35532                 "vec3 lVector = lPosition.xyz - mvPosition.xyz;",
35533
35534                 "float lDistance = 1.0;",
35535                 "if ( pointLightDistance[ i ] > 0.0 )",
35536                     "lDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );",
35537
35538                 "vPointLight[ i ] = vec4( lVector, lDistance );",
35539
35540             "}",
35541
35542         "#endif",
35543
35544         "#if MAX_SPOT_LIGHTS > 0",
35545
35546             "for( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {",
35547
35548                 "vec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );",
35549                 "vec3 lVector = lPosition.xyz - mvPosition.xyz;",
35550
35551                 "float lDistance = 1.0;",
35552                 "if ( spotLightDistance[ i ] > 0.0 )",
35553                     "lDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );",
35554
35555                 "vSpotLight[ i ] = vec4( lVector, lDistance );",
35556
35557             "}",
35558
35559         "#endif",
35560
35561         "#endif",
35562
35563         "#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP )",
35564
35565             "vWorldPosition = mPosition.xyz;",
35566
35567         "#endif"
35568
35569     ].join("\n"),
35570
35571     lights_phong_pars_fragment: [
35572
35573         "uniform vec3 ambientLightColor;",
35574
35575         "#if MAX_DIR_LIGHTS > 0",
35576
35577             "uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];",
35578             "uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];",
35579
35580         "#endif",
35581
35582         "#if MAX_HEMI_LIGHTS > 0",
35583
35584             "uniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];",
35585             "uniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];",
35586             "uniform vec3 hemisphereLightPosition[ MAX_HEMI_LIGHTS ];",
35587
35588         "#endif",
35589
35590         "#if MAX_POINT_LIGHTS > 0",
35591
35592             "uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];",
35593
35594             "#ifdef PHONG_PER_PIXEL",
35595
35596                 "uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];",
35597                 "uniform float pointLightDistance[ MAX_POINT_LIGHTS ];",
35598
35599             "#else",
35600
35601                 "varying vec4 vPointLight[ MAX_POINT_LIGHTS ];",
35602
35603             "#endif",
35604
35605         "#endif",
35606
35607         "#if MAX_SPOT_LIGHTS > 0",
35608
35609             "uniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];",
35610             "uniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];",
35611             "uniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];",
35612             "uniform float spotLightAngle[ MAX_SPOT_LIGHTS ];",
35613             "uniform float spotLightExponent[ MAX_SPOT_LIGHTS ];",
35614
35615             "#ifdef PHONG_PER_PIXEL",
35616
35617                 "uniform float spotLightDistance[ MAX_SPOT_LIGHTS ];",
35618
35619             "#else",
35620
35621                 "varying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];",
35622
35623             "#endif",
35624
35625         "#endif",
35626
35627         "#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP )",
35628
35629             "varying vec3 vWorldPosition;",
35630
35631         "#endif",
35632
35633         "#ifdef WRAP_AROUND",
35634
35635             "uniform vec3 wrapRGB;",
35636
35637         "#endif",
35638
35639         "varying vec3 vViewPosition;",
35640         "varying vec3 vNormal;"
35641
35642     ].join("\n"),
35643
35644     lights_phong_fragment: [
35645
35646         "vec3 normal = normalize( vNormal );",
35647         "vec3 viewPosition = normalize( vViewPosition );",
35648
35649         "#ifdef DOUBLE_SIDED",
35650
35651             "normal = normal * ( -1.0 + 2.0 * float( gl_FrontFacing ) );",
35652
35653         "#endif",
35654
35655         "#ifdef USE_NORMALMAP",
35656
35657             "normal = perturbNormal2Arb( -viewPosition, normal );",
35658
35659         "#elif defined( USE_BUMPMAP )",
35660
35661             "normal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );",
35662
35663         "#endif",
35664
35665         "#if MAX_POINT_LIGHTS > 0",
35666
35667             "vec3 pointDiffuse  = vec3( 0.0 );",
35668             "vec3 pointSpecular = vec3( 0.0 );",
35669
35670             "for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {",
35671
35672                 "#ifdef PHONG_PER_PIXEL",
35673
35674                     "vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );",
35675                     "vec3 lVector = lPosition.xyz + vViewPosition.xyz;",
35676
35677                     "float lDistance = 1.0;",
35678                     "if ( pointLightDistance[ i ] > 0.0 )",
35679                         "lDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );",
35680
35681                     "lVector = normalize( lVector );",
35682
35683                 "#else",
35684
35685                     "vec3 lVector = normalize( vPointLight[ i ].xyz );",
35686                     "float lDistance = vPointLight[ i ].w;",
35687
35688                 "#endif",
35689
35690                 // diffuse
35691
35692                 "float dotProduct = dot( normal, lVector );",
35693
35694                 "#ifdef WRAP_AROUND",
35695
35696                     "float pointDiffuseWeightFull = max( dotProduct, 0.0 );",
35697                     "float pointDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );",
35698
35699                     "vec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );",
35700
35701                 "#else",
35702
35703                     "float pointDiffuseWeight = max( dotProduct, 0.0 );",
35704
35705                 "#endif",
35706
35707                 "pointDiffuse  += diffuse * pointLightColor[ i ] * pointDiffuseWeight * lDistance;",
35708
35709                 // specular
35710
35711                 "vec3 pointHalfVector = normalize( lVector + viewPosition );",
35712                 "float pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );",
35713                 "float pointSpecularWeight = specularStrength * max( pow( pointDotNormalHalf, shininess ), 0.0 );",
35714
35715                 "#ifdef PHYSICALLY_BASED_SHADING",
35716
35717                     // 2.0 => 2.0001 is hack to work around ANGLE bug
35718
35719                     "float specularNormalization = ( shininess + 2.0001 ) / 8.0;",
35720
35721                     "vec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, pointHalfVector ), 5.0 );",
35722                     "pointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance * specularNormalization;",
35723
35724                 "#else",
35725
35726                     "pointSpecular += specular * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance;",
35727
35728                 "#endif",
35729
35730             "}",
35731
35732         "#endif",
35733
35734         "#if MAX_SPOT_LIGHTS > 0",
35735
35736             "vec3 spotDiffuse  = vec3( 0.0 );",
35737             "vec3 spotSpecular = vec3( 0.0 );",
35738
35739             "for ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {",
35740
35741                 "#ifdef PHONG_PER_PIXEL",
35742
35743                     "vec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );",
35744                     "vec3 lVector = lPosition.xyz + vViewPosition.xyz;",
35745
35746                     "float lDistance = 1.0;",
35747                     "if ( spotLightDistance[ i ] > 0.0 )",
35748                         "lDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );",
35749
35750                     "lVector = normalize( lVector );",
35751
35752                 "#else",
35753
35754                     "vec3 lVector = normalize( vSpotLight[ i ].xyz );",
35755                     "float lDistance = vSpotLight[ i ].w;",
35756
35757                 "#endif",
35758
35759                 "float spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - vWorldPosition ) );",
35760
35761                 "if ( spotEffect > spotLightAngle[ i ] ) {",
35762
35763                     "spotEffect = pow( spotEffect, spotLightExponent[ i ] );",
35764
35765                     // diffuse
35766
35767                     "float dotProduct = dot( normal, lVector );",
35768
35769                     "#ifdef WRAP_AROUND",
35770
35771                         "float spotDiffuseWeightFull = max( dotProduct, 0.0 );",
35772                         "float spotDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );",
35773
35774                         "vec3 spotDiffuseWeight = mix( vec3 ( spotDiffuseWeightFull ), vec3( spotDiffuseWeightHalf ), wrapRGB );",
35775
35776                     "#else",
35777
35778                         "float spotDiffuseWeight = max( dotProduct, 0.0 );",
35779
35780                     "#endif",
35781
35782                     "spotDiffuse += diffuse * spotLightColor[ i ] * spotDiffuseWeight * lDistance * spotEffect;",
35783
35784                     // specular
35785
35786                     "vec3 spotHalfVector = normalize( lVector + viewPosition );",
35787                     "float spotDotNormalHalf = max( dot( normal, spotHalfVector ), 0.0 );",
35788                     "float spotSpecularWeight = specularStrength * max( pow( spotDotNormalHalf, shininess ), 0.0 );",
35789
35790                     "#ifdef PHYSICALLY_BASED_SHADING",
35791
35792                         // 2.0 => 2.0001 is hack to work around ANGLE bug
35793
35794                         "float specularNormalization = ( shininess + 2.0001 ) / 8.0;",
35795
35796                         "vec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, spotHalfVector ), 5.0 );",
35797                         "spotSpecular += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * specularNormalization * spotEffect;",
35798
35799                     "#else",
35800
35801                         "spotSpecular += specular * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * spotEffect;",
35802
35803                     "#endif",
35804
35805                 "}",
35806
35807             "}",
35808
35809         "#endif",
35810
35811         "#if MAX_DIR_LIGHTS > 0",
35812
35813             "vec3 dirDiffuse  = vec3( 0.0 );",
35814             "vec3 dirSpecular = vec3( 0.0 );" ,
35815
35816             "for( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {",
35817
35818                 "vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );",
35819                 "vec3 dirVector = normalize( lDirection.xyz );",
35820
35821                 // diffuse
35822
35823                 "float dotProduct = dot( normal, dirVector );",
35824
35825                 "#ifdef WRAP_AROUND",
35826
35827                     "float dirDiffuseWeightFull = max( dotProduct, 0.0 );",
35828                     "float dirDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );",
35829
35830                     "vec3 dirDiffuseWeight = mix( vec3( dirDiffuseWeightFull ), vec3( dirDiffuseWeightHalf ), wrapRGB );",
35831
35832                 "#else",
35833
35834                     "float dirDiffuseWeight = max( dotProduct, 0.0 );",
35835
35836                 "#endif",
35837
35838                 "dirDiffuse  += diffuse * directionalLightColor[ i ] * dirDiffuseWeight;",
35839
35840                 // specular
35841
35842                 "vec3 dirHalfVector = normalize( dirVector + viewPosition );",
35843                 "float dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );",
35844                 "float dirSpecularWeight = specularStrength * max( pow( dirDotNormalHalf, shininess ), 0.0 );",
35845
35846                 "#ifdef PHYSICALLY_BASED_SHADING",
35847
35848                     /*
35849                     // fresnel term from skin shader
35850                     "const float F0 = 0.128;",
35851
35852                     "float base = 1.0 - dot( viewPosition, dirHalfVector );",
35853                     "float exponential = pow( base, 5.0 );",
35854
35855                     "float fresnel = exponential + F0 * ( 1.0 - exponential );",
35856                     */
35857
35858                     /*
35859                     // fresnel term from fresnel shader
35860                     "const float mFresnelBias = 0.08;",
35861                     "const float mFresnelScale = 0.3;",
35862                     "const float mFresnelPower = 5.0;",
35863
35864                     "float fresnel = mFresnelBias + mFresnelScale * pow( 1.0 + dot( normalize( -viewPosition ), normal ), mFresnelPower );",
35865                     */
35866
35867                     // 2.0 => 2.0001 is hack to work around ANGLE bug
35868
35869                     "float specularNormalization = ( shininess + 2.0001 ) / 8.0;",
35870
35871                     //"dirSpecular += specular * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization * fresnel;",
35872
35873                     "vec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );",
35874                     "dirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;",
35875
35876                 "#else",
35877
35878                     "dirSpecular += specular * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight;",
35879
35880                 "#endif",
35881
35882             "}",
35883
35884         "#endif",
35885
35886         "#if MAX_HEMI_LIGHTS > 0",
35887
35888             "vec3 hemiDiffuse  = vec3( 0.0 );",
35889             "vec3 hemiSpecular = vec3( 0.0 );" ,
35890
35891             "for( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {",
35892
35893                 "vec4 lPosition = viewMatrix * vec4( hemisphereLightPosition[ i ], 1.0 );",
35894                 "vec3 lVector = normalize( lPosition.xyz + vViewPosition.xyz );",
35895
35896                 // diffuse
35897
35898                 "float dotProduct = dot( normal, lVector );",
35899                 "float hemiDiffuseWeight = 0.5 * dotProduct + 0.5;",
35900
35901                 "vec3 hemiColor = mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );",
35902
35903                 "hemiDiffuse += diffuse * hemiColor;",
35904
35905                 // specular (sky light)
35906
35907                 "vec3 hemiHalfVectorSky = normalize( lVector + viewPosition );",
35908                 "float hemiDotNormalHalfSky = 0.5 * dot( normal, hemiHalfVectorSky ) + 0.5;",
35909                 "float hemiSpecularWeightSky = specularStrength * max( pow( hemiDotNormalHalfSky, shininess ), 0.0 );",
35910
35911                 // specular (ground light)
35912
35913                 "vec3 lVectorGround = normalize( -lPosition.xyz + vViewPosition.xyz );",
35914
35915                 "vec3 hemiHalfVectorGround = normalize( lVectorGround + viewPosition );",
35916                 "float hemiDotNormalHalfGround = 0.5 * dot( normal, hemiHalfVectorGround ) + 0.5;",
35917                 "float hemiSpecularWeightGround = specularStrength * max( pow( hemiDotNormalHalfGround, shininess ), 0.0 );",
35918
35919                 "#ifdef PHYSICALLY_BASED_SHADING",
35920
35921                     "float dotProductGround = dot( normal, lVectorGround );",
35922
35923                     // 2.0 => 2.0001 is hack to work around ANGLE bug
35924
35925                     "float specularNormalization = ( shininess + 2.0001 ) / 8.0;",
35926
35927                     "vec3 schlickSky = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, hemiHalfVectorSky ), 5.0 );",
35928                     "vec3 schlickGround = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVectorGround, hemiHalfVectorGround ), 5.0 );",
35929                     "hemiSpecular += hemiColor * specularNormalization * ( schlickSky * hemiSpecularWeightSky * max( dotProduct, 0.0 ) + schlickGround * hemiSpecularWeightGround * max( dotProductGround, 0.0 ) );",
35930
35931                 "#else",
35932
35933                     "hemiSpecular += specular * hemiColor * ( hemiSpecularWeightSky + hemiSpecularWeightGround ) * hemiDiffuseWeight;",
35934
35935                 "#endif",
35936
35937             "}",
35938
35939         "#endif",
35940
35941         "vec3 totalDiffuse = vec3( 0.0 );",
35942         "vec3 totalSpecular = vec3( 0.0 );",
35943
35944         "#if MAX_DIR_LIGHTS > 0",
35945
35946             "totalDiffuse += dirDiffuse;",
35947             "totalSpecular += dirSpecular;",
35948
35949         "#endif",
35950
35951         "#if MAX_HEMI_LIGHTS > 0",
35952
35953             "totalDiffuse += hemiDiffuse;",
35954             "totalSpecular += hemiSpecular;",
35955
35956         "#endif",
35957
35958         "#if MAX_POINT_LIGHTS > 0",
35959
35960             "totalDiffuse += pointDiffuse;",
35961             "totalSpecular += pointSpecular;",
35962
35963         "#endif",
35964
35965         "#if MAX_SPOT_LIGHTS > 0",
35966
35967             "totalDiffuse += spotDiffuse;",
35968             "totalSpecular += spotSpecular;",
35969
35970         "#endif",
35971
35972         "#ifdef METAL",
35973
35974             "gl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient + totalSpecular );",
35975
35976         "#else",
35977
35978             "gl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient ) + totalSpecular;",
35979
35980         "#endif"
35981
35982     ].join("\n"),
35983
35984     // VERTEX COLORS
35985
35986     color_pars_fragment: [
35987
35988         "#ifdef USE_COLOR",
35989
35990             "varying vec3 vColor;",
35991
35992         "#endif"
35993
35994     ].join("\n"),
35995
35996
35997     color_fragment: [
35998
35999         "#ifdef USE_COLOR",
36000
36001             "gl_FragColor = gl_FragColor * vec4( vColor, opacity );",
36002
36003         "#endif"
36004
36005     ].join("\n"),
36006
36007     color_pars_vertex: [
36008
36009         "#ifdef USE_COLOR",
36010
36011             "varying vec3 vColor;",
36012
36013         "#endif"
36014
36015     ].join("\n"),
36016
36017
36018     color_vertex: [
36019
36020         "#ifdef USE_COLOR",
36021
36022             "#ifdef GAMMA_INPUT",
36023
36024                 "vColor = color * color;",
36025
36026             "#else",
36027
36028                 "vColor = color;",
36029
36030             "#endif",
36031
36032         "#endif"
36033
36034     ].join("\n"),
36035
36036     // SKINNING
36037
36038     skinning_pars_vertex: [
36039
36040         "#ifdef USE_SKINNING",
36041
36042             "#ifdef BONE_TEXTURE",
36043
36044                 "uniform sampler2D boneTexture;",
36045
36046                 "mat4 getBoneMatrix( const in float i ) {",
36047
36048                     "float j = i * 4.0;",
36049                     "float x = mod( j, N_BONE_PIXEL_X );",
36050                     "float y = floor( j / N_BONE_PIXEL_X );",
36051
36052                     "const float dx = 1.0 / N_BONE_PIXEL_X;",
36053                     "const float dy = 1.0 / N_BONE_PIXEL_Y;",
36054
36055                     "y = dy * ( y + 0.5 );",
36056
36057                     "vec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );",
36058                     "vec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );",
36059                     "vec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );",
36060                     "vec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );",
36061
36062                     "mat4 bone = mat4( v1, v2, v3, v4 );",
36063
36064                     "return bone;",
36065
36066                 "}",
36067
36068             "#else",
36069
36070                 "uniform mat4 boneGlobalMatrices[ MAX_BONES ];",
36071
36072                 "mat4 getBoneMatrix( const in float i ) {",
36073
36074                     "mat4 bone = boneGlobalMatrices[ int(i) ];",
36075                     "return bone;",
36076
36077                 "}",
36078
36079             "#endif",
36080
36081         "#endif"
36082
36083     ].join("\n"),
36084
36085     skinbase_vertex: [
36086
36087         "#ifdef USE_SKINNING",
36088
36089             "mat4 boneMatX = getBoneMatrix( skinIndex.x );",
36090             "mat4 boneMatY = getBoneMatrix( skinIndex.y );",
36091
36092         "#endif"
36093
36094     ].join("\n"),
36095
36096     skinning_vertex: [
36097
36098         "#ifdef USE_SKINNING",
36099
36100             "#ifdef USE_MORPHTARGETS",
36101
36102             "vec4 skinVertex = vec4( morphed, 1.0 );",
36103
36104             "#else",
36105
36106             "vec4 skinVertex = vec4( position, 1.0 );",
36107
36108             "#endif",
36109
36110             "vec4 skinned  = boneMatX * skinVertex * skinWeight.x;",
36111             "skinned       += boneMatY * skinVertex * skinWeight.y;",
36112
36113         "#endif"
36114
36115     ].join("\n"),
36116
36117     // MORPHING
36118
36119     morphtarget_pars_vertex: [
36120
36121         "#ifdef USE_MORPHTARGETS",
36122
36123             "#ifndef USE_MORPHNORMALS",
36124
36125             "uniform float morphTargetInfluences[ 8 ];",
36126
36127             "#else",
36128
36129             "uniform float morphTargetInfluences[ 4 ];",
36130
36131             "#endif",
36132
36133         "#endif"
36134
36135     ].join("\n"),
36136
36137     morphtarget_vertex: [
36138
36139         "#ifdef USE_MORPHTARGETS",
36140
36141             "vec3 morphed = vec3( 0.0 );",
36142             "morphed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];",
36143             "morphed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];",
36144             "morphed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];",
36145             "morphed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];",
36146
36147             "#ifndef USE_MORPHNORMALS",
36148
36149             "morphed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];",
36150             "morphed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];",
36151             "morphed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];",
36152             "morphed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];",
36153
36154             "#endif",
36155
36156             "morphed += position;",
36157
36158         "#endif"
36159
36160     ].join("\n"),
36161
36162     default_vertex : [
36163
36164         "vec4 mvPosition;",
36165
36166         "#ifdef USE_SKINNING",
36167
36168             "mvPosition = modelViewMatrix * skinned;",
36169
36170         "#endif",
36171
36172         "#if !defined( USE_SKINNING ) && defined( USE_MORPHTARGETS )",
36173
36174             "mvPosition = modelViewMatrix * vec4( morphed, 1.0 );",
36175
36176         "#endif",
36177
36178         "#if !defined( USE_SKINNING ) && ! defined( USE_MORPHTARGETS )",
36179
36180             "mvPosition = modelViewMatrix * vec4( position, 1.0 );",
36181
36182         "#endif",
36183
36184         "gl_Position = projectionMatrix * mvPosition;",
36185
36186     ].join("\n"),
36187
36188     morphnormal_vertex: [
36189
36190         "#ifdef USE_MORPHNORMALS",
36191
36192             "vec3 morphedNormal = vec3( 0.0 );",
36193
36194             "morphedNormal +=  ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];",
36195             "morphedNormal +=  ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];",
36196             "morphedNormal +=  ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];",
36197             "morphedNormal +=  ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];",
36198
36199             "morphedNormal += normal;",
36200
36201         "#endif"
36202
36203     ].join("\n"),
36204
36205     skinnormal_vertex: [
36206
36207         "#ifdef USE_SKINNING",
36208
36209             "mat4 skinMatrix = skinWeight.x * boneMatX;",
36210             "skinMatrix     += skinWeight.y * boneMatY;",
36211
36212             "#ifdef USE_MORPHNORMALS",
36213
36214             "vec4 skinnedNormal = skinMatrix * vec4( morphedNormal, 0.0 );",
36215
36216             "#else",
36217
36218             "vec4 skinnedNormal = skinMatrix * vec4( normal, 0.0 );",
36219
36220             "#endif",
36221
36222         "#endif"
36223
36224     ].join("\n"),
36225
36226     defaultnormal_vertex: [
36227
36228         "vec3 objectNormal;",
36229
36230         "#ifdef USE_SKINNING",
36231
36232             "objectNormal = skinnedNormal.xyz;",
36233
36234         "#endif",
36235
36236         "#if !defined( USE_SKINNING ) && defined( USE_MORPHNORMALS )",
36237
36238             "objectNormal = morphedNormal;",
36239
36240         "#endif",
36241
36242         "#if !defined( USE_SKINNING ) && ! defined( USE_MORPHNORMALS )",
36243
36244             "objectNormal = normal;",
36245
36246         "#endif",
36247
36248         "#ifdef FLIP_SIDED",
36249
36250             "objectNormal = -objectNormal;",
36251
36252         "#endif",
36253
36254         "vec3 transformedNormal = normalMatrix * objectNormal;",
36255
36256     ].join("\n"),
36257
36258     // SHADOW MAP
36259
36260     // based on SpiderGL shadow map and Fabien Sanglard's GLSL shadow mapping examples
36261     //  http://spidergl.org/example.php?id=6
36262     //     http://fabiensanglard.net/shadowmapping
36263
36264     shadowmap_pars_fragment: [
36265
36266         "#ifdef USE_SHADOWMAP",
36267
36268             "uniform sampler2D shadowMap[ MAX_SHADOWS ];",
36269             "uniform vec2 shadowMapSize[ MAX_SHADOWS ];",
36270
36271             "uniform float shadowDarkness[ MAX_SHADOWS ];",
36272             "uniform float shadowBias[ MAX_SHADOWS ];",
36273
36274             "varying vec4 vShadowCoord[ MAX_SHADOWS ];",
36275
36276             "float unpackDepth( const in vec4 rgba_depth ) {",
36277
36278                 "const vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );",
36279                 "float depth = dot( rgba_depth, bit_shift );",
36280                 "return depth;",
36281
36282             "}",
36283
36284         "#endif"
36285
36286     ].join("\n"),
36287
36288     shadowmap_fragment: [
36289
36290         "#ifdef USE_SHADOWMAP",
36291
36292             "#ifdef SHADOWMAP_DEBUG",
36293
36294                 "vec3 frustumColors[3];",
36295                 "frustumColors[0] = vec3( 1.0, 0.5, 0.0 );",
36296                 "frustumColors[1] = vec3( 0.0, 1.0, 0.8 );",
36297                 "frustumColors[2] = vec3( 0.0, 0.5, 1.0 );",
36298
36299             "#endif",
36300
36301             "#ifdef SHADOWMAP_CASCADE",
36302
36303                 "int inFrustumCount = 0;",
36304
36305             "#endif",
36306
36307             "float fDepth;",
36308             "vec3 shadowColor = vec3( 1.0 );",
36309
36310             "for( int i = 0; i < MAX_SHADOWS; i ++ ) {",
36311
36312                 "vec3 shadowCoord = vShadowCoord[ i ].xyz / vShadowCoord[ i ].w;",
36313
36314                 // "if ( something && something )"          breaks ATI OpenGL shader compiler
36315                 // "if ( all( something, something ) )"  using this instead
36316
36317                 "bvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );",
36318                 "bool inFrustum = all( inFrustumVec );",
36319
36320                 // don't shadow pixels outside of light frustum
36321                 // use just first frustum (for cascades)
36322                 // don't shadow pixels behind far plane of light frustum
36323
36324                 "#ifdef SHADOWMAP_CASCADE",
36325
36326                     "inFrustumCount += int( inFrustum );",
36327                     "bvec3 frustumTestVec = bvec3( inFrustum, inFrustumCount == 1, shadowCoord.z <= 1.0 );",
36328
36329                 "#else",
36330
36331                     "bvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );",
36332
36333                 "#endif",
36334
36335                 "bool frustumTest = all( frustumTestVec );",
36336
36337                 "if ( frustumTest ) {",
36338
36339                     "shadowCoord.z += shadowBias[ i ];",
36340
36341                     "#ifdef SHADOWMAP_SOFT",
36342
36343                         // Percentage-close filtering
36344                         // (9 pixel kernel)
36345                         // http://fabiensanglard.net/shadowmappingPCF/
36346
36347                         "float shadow = 0.0;",
36348
36349                         /*
36350                         // nested loops breaks shader compiler / validator on some ATI cards when using OpenGL
36351                         // must enroll loop manually
36352
36353                         "for ( float y = -1.25; y <= 1.25; y += 1.25 )",
36354                             "for ( float x = -1.25; x <= 1.25; x += 1.25 ) {",
36355
36356                                 "vec4 rgbaDepth = texture2D( shadowMap[ i ], vec2( x * xPixelOffset, y * yPixelOffset ) + shadowCoord.xy );",
36357
36358                                 // doesn't seem to produce any noticeable visual difference compared to simple "texture2D" lookup
36359                                 //"vec4 rgbaDepth = texture2DProj( shadowMap[ i ], vec4( vShadowCoord[ i ].w * ( vec2( x * xPixelOffset, y * yPixelOffset ) + shadowCoord.xy ), 0.05, vShadowCoord[ i ].w ) );",
36360
36361                                 "float fDepth = unpackDepth( rgbaDepth );",
36362
36363                                 "if ( fDepth < shadowCoord.z )",
36364                                     "shadow += 1.0;",
36365
36366                         "}",
36367
36368                         "shadow /= 9.0;",
36369
36370                         */
36371
36372                         "const float shadowDelta = 1.0 / 9.0;",
36373
36374                         "float xPixelOffset = 1.0 / shadowMapSize[ i ].x;",
36375                         "float yPixelOffset = 1.0 / shadowMapSize[ i ].y;",
36376
36377                         "float dx0 = -1.25 * xPixelOffset;",
36378                         "float dy0 = -1.25 * yPixelOffset;",
36379                         "float dx1 = 1.25 * xPixelOffset;",
36380                         "float dy1 = 1.25 * yPixelOffset;",
36381
36382                         "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );",
36383                         "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;",
36384
36385                         "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );",
36386                         "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;",
36387
36388                         "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );",
36389                         "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;",
36390
36391                         "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );",
36392                         "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;",
36393
36394                         "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );",
36395                         "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;",
36396
36397                         "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );",
36398                         "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;",
36399
36400                         "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );",
36401                         "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;",
36402
36403                         "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );",
36404                         "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;",
36405
36406                         "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );",
36407                         "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;",
36408
36409                         "shadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );",
36410
36411                     "#else",
36412
36413                         "vec4 rgbaDepth = texture2D( shadowMap[ i ], shadowCoord.xy );",
36414                         "float fDepth = unpackDepth( rgbaDepth );",
36415
36416                         "if ( fDepth < shadowCoord.z )",
36417
36418                             // spot with multiple shadows is darker
36419
36420                             "shadowColor = shadowColor * vec3( 1.0 - shadowDarkness[ i ] );",
36421
36422                             // spot with multiple shadows has the same color as single shadow spot
36423
36424                             //"shadowColor = min( shadowColor, vec3( shadowDarkness[ i ] ) );",
36425
36426                     "#endif",
36427
36428                 "}",
36429
36430
36431                 "#ifdef SHADOWMAP_DEBUG",
36432
36433                     "#ifdef SHADOWMAP_CASCADE",
36434
36435                         "if ( inFrustum && inFrustumCount == 1 ) gl_FragColor.xyz *= frustumColors[ i ];",
36436
36437                     "#else",
36438
36439                         "if ( inFrustum ) gl_FragColor.xyz *= frustumColors[ i ];",
36440
36441                     "#endif",
36442
36443                 "#endif",
36444
36445             "}",
36446
36447             "#ifdef GAMMA_OUTPUT",
36448
36449                 "shadowColor *= shadowColor;",
36450
36451             "#endif",
36452
36453             "gl_FragColor.xyz = gl_FragColor.xyz * shadowColor;",
36454
36455         "#endif"
36456
36457     ].join("\n"),
36458
36459     shadowmap_pars_vertex: [
36460
36461         "#ifdef USE_SHADOWMAP",
36462
36463             "varying vec4 vShadowCoord[ MAX_SHADOWS ];",
36464             "uniform mat4 shadowMatrix[ MAX_SHADOWS ];",
36465
36466         "#endif"
36467
36468     ].join("\n"),
36469
36470     shadowmap_vertex: [
36471
36472         "#ifdef USE_SHADOWMAP",
36473
36474             "for( int i = 0; i < MAX_SHADOWS; i ++ ) {",
36475
36476                 "vShadowCoord[ i ] = shadowMatrix[ i ] * mPosition;",
36477
36478             "}",
36479
36480         "#endif"
36481
36482     ].join("\n"),
36483
36484     // ALPHATEST
36485
36486     alphatest_fragment: [
36487
36488         "#ifdef ALPHATEST",
36489
36490             "if ( gl_FragColor.a < ALPHATEST ) discard;",
36491
36492         "#endif"
36493
36494     ].join("\n"),
36495
36496     // LINEAR SPACE
36497
36498     linear_to_gamma_fragment: [
36499
36500         "#ifdef GAMMA_OUTPUT",
36501
36502             "gl_FragColor.xyz = sqrt( gl_FragColor.xyz );",
36503
36504         "#endif"
36505
36506     ].join("\n"),
36507
36508
36509 };
36510
36511 THREE.UniformsUtils = {
36512
36513     merge: function ( uniforms ) {
36514
36515         var u, p, tmp, merged = {};
36516
36517         for ( u = 0; u < uniforms.length; u ++ ) {
36518
36519             tmp = this.clone( uniforms[ u ] );
36520
36521             for ( p in tmp ) {
36522
36523                 merged[ p ] = tmp[ p ];
36524
36525             }
36526
36527         }
36528
36529         return merged;
36530
36531     },
36532
36533     clone: function ( uniforms_src ) {
36534
36535         var u, p, parameter, parameter_src, uniforms_dst = {};
36536
36537         for ( u in uniforms_src ) {
36538
36539             uniforms_dst[ u ] = {};
36540
36541             for ( p in uniforms_src[ u ] ) {
36542
36543                 parameter_src = uniforms_src[ u ][ p ];
36544
36545                 if ( parameter_src instanceof THREE.Color ||
36546                      parameter_src instanceof THREE.Vector2 ||
36547                      parameter_src instanceof THREE.Vector3 ||
36548                      parameter_src instanceof THREE.Vector4 ||
36549                      parameter_src instanceof THREE.Matrix4 ||
36550                      parameter_src instanceof THREE.Texture ) {
36551
36552                     uniforms_dst[ u ][ p ] = parameter_src.clone();
36553
36554                 } else if ( parameter_src instanceof Array ) {
36555
36556                     uniforms_dst[ u ][ p ] = parameter_src.slice();
36557
36558                 } else {
36559
36560                     uniforms_dst[ u ][ p ] = parameter_src;
36561
36562                 }
36563
36564             }
36565
36566         }
36567
36568         return uniforms_dst;
36569
36570     }
36571
36572 };
36573
36574 THREE.UniformsLib = {
36575
36576     common: {
36577
36578         "diffuse" : { type: "c", value: new THREE.Color( 0xeeeeee ) },
36579         "opacity" : { type: "f", value: 1.0 },
36580
36581         "map" : { type: "t", value: null },
36582         "offsetRepeat" : { type: "v4", value: new THREE.Vector4( 0, 0, 1, 1 ) },
36583
36584         "lightMap" : { type: "t", value: null },
36585         "specularMap" : { type: "t", value: null },
36586
36587         "envMap" : { type: "t", value: null },
36588         "flipEnvMap" : { type: "f", value: -1 },
36589         "useRefract" : { type: "i", value: 0 },
36590         "reflectivity" : { type: "f", value: 1.0 },
36591         "refractionRatio" : { type: "f", value: 0.98 },
36592         "combine" : { type: "i", value: 0 },
36593
36594         "morphTargetInfluences" : { type: "f", value: 0 }
36595
36596     },
36597
36598     bump: {
36599
36600         "bumpMap" : { type: "t", value: null },
36601         "bumpScale" : { type: "f", value: 1 }
36602
36603     },
36604
36605     normalmap: {
36606
36607         "normalMap" : { type: "t", value: null },
36608         "normalScale" : { type: "v2", value: new THREE.Vector2( 1, 1 ) }
36609     },
36610
36611     fog : {
36612
36613         "fogDensity" : { type: "f", value: 0.00025 },
36614         "fogNear" : { type: "f", value: 1 },
36615         "fogFar" : { type: "f", value: 2000 },
36616         "fogColor" : { type: "c", value: new THREE.Color( 0xffffff ) }
36617
36618     },
36619
36620     lights: {
36621
36622         "ambientLightColor" : { type: "fv", value: [] },
36623
36624         "directionalLightDirection" : { type: "fv", value: [] },
36625         "directionalLightColor" : { type: "fv", value: [] },
36626
36627         "hemisphereLightPosition" : { type: "fv", value: [] },
36628         "hemisphereLightSkyColor" : { type: "fv", value: [] },
36629         "hemisphereLightGroundColor" : { type: "fv", value: [] },
36630
36631         "pointLightColor" : { type: "fv", value: [] },
36632         "pointLightPosition" : { type: "fv", value: [] },
36633         "pointLightDistance" : { type: "fv1", value: [] },
36634
36635         "spotLightColor" : { type: "fv", value: [] },
36636         "spotLightPosition" : { type: "fv", value: [] },
36637         "spotLightDirection" : { type: "fv", value: [] },
36638         "spotLightDistance" : { type: "fv1", value: [] },
36639         "spotLightAngle" : { type: "fv1", value: [] },
36640         "spotLightExponent" : { type: "fv1", value: [] }
36641
36642     },
36643
36644     particle: {
36645
36646         "psColor" : { type: "c", value: new THREE.Color( 0xeeeeee ) },
36647         "opacity" : { type: "f", value: 1.0 },
36648         "size" : { type: "f", value: 1.0 },
36649         "scale" : { type: "f", value: 1.0 },
36650         "map" : { type: "t", value: null },
36651
36652         "fogDensity" : { type: "f", value: 0.00025 },
36653         "fogNear" : { type: "f", value: 1 },
36654         "fogFar" : { type: "f", value: 2000 },
36655         "fogColor" : { type: "c", value: new THREE.Color( 0xffffff ) }
36656
36657     },
36658
36659     shadowmap: {
36660
36661         "shadowMap": { type: "tv", value: [] },
36662         "shadowMapSize": { type: "v2v", value: [] },
36663
36664         "shadowBias" : { type: "fv1", value: [] },
36665         "shadowDarkness": { type: "fv1", value: [] },
36666
36667         "shadowMatrix" : { type: "m4v", value: [] },
36668
36669     }
36670
36671 };
36672
36673 THREE.ShaderLib = {
36674
36675     'depth': {
36676
36677         uniforms: {
36678
36679             "mNear": { type: "f", value: 1.0 },
36680             "mFar" : { type: "f", value: 2000.0 },
36681             "opacity" : { type: "f", value: 1.0 }
36682
36683         },
36684
36685         vertexShader: [
36686
36687             "void main() {",
36688
36689                 "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
36690
36691             "}"
36692
36693         ].join("\n"),
36694
36695         fragmentShader: [
36696
36697             "uniform float mNear;",
36698             "uniform float mFar;",
36699             "uniform float opacity;",
36700
36701             "void main() {",
36702
36703                 "float depth = gl_FragCoord.z / gl_FragCoord.w;",
36704                 "float color = 1.0 - smoothstep( mNear, mFar, depth );",
36705                 "gl_FragColor = vec4( vec3( color ), opacity );",
36706
36707             "}"
36708
36709         ].join("\n")
36710
36711     },
36712
36713     'normal': {
36714
36715         uniforms: {
36716
36717             "opacity" : { type: "f", value: 1.0 }
36718
36719         },
36720
36721         vertexShader: [
36722
36723             "varying vec3 vNormal;",
36724
36725             "void main() {",
36726
36727                 "vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
36728                 "vNormal = normalMatrix * normal;",
36729
36730                 "gl_Position = projectionMatrix * mvPosition;",
36731
36732             "}"
36733
36734         ].join("\n"),
36735
36736         fragmentShader: [
36737
36738             "uniform float opacity;",
36739             "varying vec3 vNormal;",
36740
36741             "void main() {",
36742
36743                 "gl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, opacity );",
36744
36745             "}"
36746
36747         ].join("\n")
36748
36749     },
36750
36751     'basic': {
36752
36753         uniforms: THREE.UniformsUtils.merge( [
36754
36755             THREE.UniformsLib[ "common" ],
36756             THREE.UniformsLib[ "fog" ],
36757             THREE.UniformsLib[ "shadowmap" ]
36758
36759         ] ),
36760
36761         vertexShader: [
36762
36763             THREE.ShaderChunk[ "map_pars_vertex" ],
36764             THREE.ShaderChunk[ "lightmap_pars_vertex" ],
36765             THREE.ShaderChunk[ "envmap_pars_vertex" ],
36766             THREE.ShaderChunk[ "color_pars_vertex" ],
36767             THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
36768             THREE.ShaderChunk[ "skinning_pars_vertex" ],
36769             THREE.ShaderChunk[ "shadowmap_pars_vertex" ],
36770
36771             "void main() {",
36772
36773                 THREE.ShaderChunk[ "map_vertex" ],
36774                 THREE.ShaderChunk[ "lightmap_vertex" ],
36775                 THREE.ShaderChunk[ "color_vertex" ],
36776
36777                 "#ifdef USE_ENVMAP",
36778
36779                 THREE.ShaderChunk[ "morphnormal_vertex" ],
36780                 THREE.ShaderChunk[ "skinbase_vertex" ],
36781                 THREE.ShaderChunk[ "skinnormal_vertex" ],
36782                 THREE.ShaderChunk[ "defaultnormal_vertex" ],
36783
36784                 "#endif",
36785
36786                 THREE.ShaderChunk[ "morphtarget_vertex" ],
36787                 THREE.ShaderChunk[ "skinning_vertex" ],
36788                 THREE.ShaderChunk[ "default_vertex" ],
36789
36790                 THREE.ShaderChunk[ "worldpos_vertex" ],
36791                 THREE.ShaderChunk[ "envmap_vertex" ],
36792                 THREE.ShaderChunk[ "shadowmap_vertex" ],
36793
36794             "}"
36795
36796         ].join("\n"),
36797
36798         fragmentShader: [
36799
36800             "uniform vec3 diffuse;",
36801             "uniform float opacity;",
36802
36803             THREE.ShaderChunk[ "color_pars_fragment" ],
36804             THREE.ShaderChunk[ "map_pars_fragment" ],
36805             THREE.ShaderChunk[ "lightmap_pars_fragment" ],
36806             THREE.ShaderChunk[ "envmap_pars_fragment" ],
36807             THREE.ShaderChunk[ "fog_pars_fragment" ],
36808             THREE.ShaderChunk[ "shadowmap_pars_fragment" ],
36809             THREE.ShaderChunk[ "specularmap_pars_fragment" ],
36810
36811             "void main() {",
36812
36813                 "gl_FragColor = vec4( diffuse, opacity );",
36814
36815                 THREE.ShaderChunk[ "map_fragment" ],
36816                 THREE.ShaderChunk[ "alphatest_fragment" ],
36817                 THREE.ShaderChunk[ "specularmap_fragment" ],
36818                 THREE.ShaderChunk[ "lightmap_fragment" ],
36819                 THREE.ShaderChunk[ "color_fragment" ],
36820                 THREE.ShaderChunk[ "envmap_fragment" ],
36821                 THREE.ShaderChunk[ "shadowmap_fragment" ],
36822
36823                 THREE.ShaderChunk[ "linear_to_gamma_fragment" ],
36824
36825                 THREE.ShaderChunk[ "fog_fragment" ],
36826
36827             "}"
36828
36829         ].join("\n")
36830
36831     },
36832
36833     'lambert': {
36834
36835         uniforms: THREE.UniformsUtils.merge( [
36836
36837             THREE.UniformsLib[ "common" ],
36838             THREE.UniformsLib[ "fog" ],
36839             THREE.UniformsLib[ "lights" ],
36840             THREE.UniformsLib[ "shadowmap" ],
36841
36842             {
36843                 "ambient"  : { type: "c", value: new THREE.Color( 0xffffff ) },
36844                 "emissive" : { type: "c", value: new THREE.Color( 0x000000 ) },
36845                 "wrapRGB"  : { type: "v3", value: new THREE.Vector3( 1, 1, 1 ) }
36846             }
36847
36848         ] ),
36849
36850         vertexShader: [
36851
36852             "#define LAMBERT",
36853
36854             "varying vec3 vLightFront;",
36855
36856             "#ifdef DOUBLE_SIDED",
36857
36858                 "varying vec3 vLightBack;",
36859
36860             "#endif",
36861
36862             THREE.ShaderChunk[ "map_pars_vertex" ],
36863             THREE.ShaderChunk[ "lightmap_pars_vertex" ],
36864             THREE.ShaderChunk[ "envmap_pars_vertex" ],
36865             THREE.ShaderChunk[ "lights_lambert_pars_vertex" ],
36866             THREE.ShaderChunk[ "color_pars_vertex" ],
36867             THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
36868             THREE.ShaderChunk[ "skinning_pars_vertex" ],
36869             THREE.ShaderChunk[ "shadowmap_pars_vertex" ],
36870
36871             "void main() {",
36872
36873                 THREE.ShaderChunk[ "map_vertex" ],
36874                 THREE.ShaderChunk[ "lightmap_vertex" ],
36875                 THREE.ShaderChunk[ "color_vertex" ],
36876
36877                 THREE.ShaderChunk[ "morphnormal_vertex" ],
36878                 THREE.ShaderChunk[ "skinbase_vertex" ],
36879                 THREE.ShaderChunk[ "skinnormal_vertex" ],
36880                 THREE.ShaderChunk[ "defaultnormal_vertex" ],
36881
36882                 THREE.ShaderChunk[ "morphtarget_vertex" ],
36883                 THREE.ShaderChunk[ "skinning_vertex" ],
36884                 THREE.ShaderChunk[ "default_vertex" ],
36885
36886                 THREE.ShaderChunk[ "worldpos_vertex" ],
36887                 THREE.ShaderChunk[ "envmap_vertex" ],
36888                 THREE.ShaderChunk[ "lights_lambert_vertex" ],
36889                 THREE.ShaderChunk[ "shadowmap_vertex" ],
36890
36891             "}"
36892
36893         ].join("\n"),
36894
36895         fragmentShader: [
36896
36897             "uniform float opacity;",
36898
36899             "varying vec3 vLightFront;",
36900
36901             "#ifdef DOUBLE_SIDED",
36902
36903                 "varying vec3 vLightBack;",
36904
36905             "#endif",
36906
36907             THREE.ShaderChunk[ "color_pars_fragment" ],
36908             THREE.ShaderChunk[ "map_pars_fragment" ],
36909             THREE.ShaderChunk[ "lightmap_pars_fragment" ],
36910             THREE.ShaderChunk[ "envmap_pars_fragment" ],
36911             THREE.ShaderChunk[ "fog_pars_fragment" ],
36912             THREE.ShaderChunk[ "shadowmap_pars_fragment" ],
36913             THREE.ShaderChunk[ "specularmap_pars_fragment" ],
36914
36915             "void main() {",
36916
36917                 "gl_FragColor = vec4( vec3 ( 1.0 ), opacity );",
36918
36919                 THREE.ShaderChunk[ "map_fragment" ],
36920                 THREE.ShaderChunk[ "alphatest_fragment" ],
36921                 THREE.ShaderChunk[ "specularmap_fragment" ],
36922
36923                 "#ifdef DOUBLE_SIDED",
36924
36925                     //"float isFront = float( gl_FrontFacing );",
36926                     //"gl_FragColor.xyz *= isFront * vLightFront + ( 1.0 - isFront ) * vLightBack;",
36927
36928                     "if ( gl_FrontFacing )",
36929                         "gl_FragColor.xyz *= vLightFront;",
36930                     "else",
36931                         "gl_FragColor.xyz *= vLightBack;",
36932
36933                 "#else",
36934
36935                     "gl_FragColor.xyz *= vLightFront;",
36936
36937                 "#endif",
36938
36939                 THREE.ShaderChunk[ "lightmap_fragment" ],
36940                 THREE.ShaderChunk[ "color_fragment" ],
36941                 THREE.ShaderChunk[ "envmap_fragment" ],
36942                 THREE.ShaderChunk[ "shadowmap_fragment" ],
36943
36944                 THREE.ShaderChunk[ "linear_to_gamma_fragment" ],
36945
36946                 THREE.ShaderChunk[ "fog_fragment" ],
36947
36948             "}"
36949
36950         ].join("\n")
36951
36952     },
36953
36954     'phong': {
36955
36956         uniforms: THREE.UniformsUtils.merge( [
36957
36958             THREE.UniformsLib[ "common" ],
36959             THREE.UniformsLib[ "bump" ],
36960             THREE.UniformsLib[ "normalmap" ],
36961             THREE.UniformsLib[ "fog" ],
36962             THREE.UniformsLib[ "lights" ],
36963             THREE.UniformsLib[ "shadowmap" ],
36964
36965             {
36966                 "ambient"  : { type: "c", value: new THREE.Color( 0xffffff ) },
36967                 "emissive" : { type: "c", value: new THREE.Color( 0x000000 ) },
36968                 "specular" : { type: "c", value: new THREE.Color( 0x111111 ) },
36969                 "shininess": { type: "f", value: 30 },
36970                 "wrapRGB"  : { type: "v3", value: new THREE.Vector3( 1, 1, 1 ) }
36971             }
36972
36973         ] ),
36974
36975         vertexShader: [
36976
36977             "#define PHONG",
36978
36979             "varying vec3 vViewPosition;",
36980             "varying vec3 vNormal;",
36981
36982             THREE.ShaderChunk[ "map_pars_vertex" ],
36983             THREE.ShaderChunk[ "lightmap_pars_vertex" ],
36984             THREE.ShaderChunk[ "envmap_pars_vertex" ],
36985             THREE.ShaderChunk[ "lights_phong_pars_vertex" ],
36986             THREE.ShaderChunk[ "color_pars_vertex" ],
36987             THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
36988             THREE.ShaderChunk[ "skinning_pars_vertex" ],
36989             THREE.ShaderChunk[ "shadowmap_pars_vertex" ],
36990
36991             "void main() {",
36992
36993                 THREE.ShaderChunk[ "map_vertex" ],
36994                 THREE.ShaderChunk[ "lightmap_vertex" ],
36995                 THREE.ShaderChunk[ "color_vertex" ],
36996
36997                 THREE.ShaderChunk[ "morphnormal_vertex" ],
36998                 THREE.ShaderChunk[ "skinbase_vertex" ],
36999                 THREE.ShaderChunk[ "skinnormal_vertex" ],
37000                 THREE.ShaderChunk[ "defaultnormal_vertex" ],
37001
37002                 "vNormal = transformedNormal;",
37003
37004                 THREE.ShaderChunk[ "morphtarget_vertex" ],
37005                 THREE.ShaderChunk[ "skinning_vertex" ],
37006                 THREE.ShaderChunk[ "default_vertex" ],
37007
37008                 "vViewPosition = -mvPosition.xyz;",
37009
37010                 THREE.ShaderChunk[ "worldpos_vertex" ],
37011                 THREE.ShaderChunk[ "envmap_vertex" ],
37012                 THREE.ShaderChunk[ "lights_phong_vertex" ],
37013                 THREE.ShaderChunk[ "shadowmap_vertex" ],
37014
37015             "}"
37016
37017         ].join("\n"),
37018
37019         fragmentShader: [
37020
37021             "uniform vec3 diffuse;",
37022             "uniform float opacity;",
37023
37024             "uniform vec3 ambient;",
37025             "uniform vec3 emissive;",
37026             "uniform vec3 specular;",
37027             "uniform float shininess;",
37028
37029             THREE.ShaderChunk[ "color_pars_fragment" ],
37030             THREE.ShaderChunk[ "map_pars_fragment" ],
37031             THREE.ShaderChunk[ "lightmap_pars_fragment" ],
37032             THREE.ShaderChunk[ "envmap_pars_fragment" ],
37033             THREE.ShaderChunk[ "fog_pars_fragment" ],
37034             THREE.ShaderChunk[ "lights_phong_pars_fragment" ],
37035             THREE.ShaderChunk[ "shadowmap_pars_fragment" ],
37036             THREE.ShaderChunk[ "bumpmap_pars_fragment" ],
37037             THREE.ShaderChunk[ "normalmap_pars_fragment" ],
37038             THREE.ShaderChunk[ "specularmap_pars_fragment" ],
37039
37040             "void main() {",
37041
37042                 "gl_FragColor = vec4( vec3 ( 1.0 ), opacity );",
37043
37044                 THREE.ShaderChunk[ "map_fragment" ],
37045                 THREE.ShaderChunk[ "alphatest_fragment" ],
37046                 THREE.ShaderChunk[ "specularmap_fragment" ],
37047
37048                 THREE.ShaderChunk[ "lights_phong_fragment" ],
37049
37050                 THREE.ShaderChunk[ "lightmap_fragment" ],
37051                 THREE.ShaderChunk[ "color_fragment" ],
37052                 THREE.ShaderChunk[ "envmap_fragment" ],
37053                 THREE.ShaderChunk[ "shadowmap_fragment" ],
37054
37055                 THREE.ShaderChunk[ "linear_to_gamma_fragment" ],
37056
37057                 THREE.ShaderChunk[ "fog_fragment" ],
37058
37059             "}"
37060
37061         ].join("\n")
37062
37063     },
37064
37065     'particle_basic': {
37066
37067         uniforms:  THREE.UniformsUtils.merge( [
37068
37069             THREE.UniformsLib[ "particle" ],
37070             THREE.UniformsLib[ "shadowmap" ]
37071
37072         ] ),
37073
37074         vertexShader: [
37075
37076             "uniform float size;",
37077             "uniform float scale;",
37078
37079             THREE.ShaderChunk[ "color_pars_vertex" ],
37080             THREE.ShaderChunk[ "shadowmap_pars_vertex" ],
37081
37082             "void main() {",
37083
37084                 THREE.ShaderChunk[ "color_vertex" ],
37085
37086                 "vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
37087
37088                 "#ifdef USE_SIZEATTENUATION",
37089                     "gl_PointSize = size * ( scale / length( mvPosition.xyz ) );",
37090                 "#else",
37091                     "gl_PointSize = size;",
37092                 "#endif",
37093
37094                 "gl_Position = projectionMatrix * mvPosition;",
37095
37096                 THREE.ShaderChunk[ "worldpos_vertex" ],
37097                 THREE.ShaderChunk[ "shadowmap_vertex" ],
37098
37099             "}"
37100
37101         ].join("\n"),
37102
37103         fragmentShader: [
37104
37105             "uniform vec3 psColor;",
37106             "uniform float opacity;",
37107
37108             THREE.ShaderChunk[ "color_pars_fragment" ],
37109             THREE.ShaderChunk[ "map_particle_pars_fragment" ],
37110             THREE.ShaderChunk[ "fog_pars_fragment" ],
37111             THREE.ShaderChunk[ "shadowmap_pars_fragment" ],
37112
37113             "void main() {",
37114
37115                 "gl_FragColor = vec4( psColor, opacity );",
37116
37117                 THREE.ShaderChunk[ "map_particle_fragment" ],
37118                 THREE.ShaderChunk[ "alphatest_fragment" ],
37119                 THREE.ShaderChunk[ "color_fragment" ],
37120                 THREE.ShaderChunk[ "shadowmap_fragment" ],
37121                 THREE.ShaderChunk[ "fog_fragment" ],
37122
37123             "}"
37124
37125         ].join("\n")
37126
37127     },
37128
37129     // Depth encoding into RGBA texture
37130     //     based on SpiderGL shadow map example
37131     //         http://spidergl.org/example.php?id=6
37132     //     originally from
37133     //        http://www.gamedev.net/topic/442138-packing-a-float-into-a-a8r8g8b8-texture-shader/page__whichpage__1%25EF%25BF%25BD
37134     //     see also here:
37135     //        http://aras-p.info/blog/2009/07/30/encoding-floats-to-rgba-the-final/
37136
37137     'depthRGBA': {
37138
37139         uniforms: {},
37140
37141         vertexShader: [
37142
37143             THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
37144             THREE.ShaderChunk[ "skinning_pars_vertex" ],
37145
37146             "void main() {",
37147
37148                 THREE.ShaderChunk[ "skinbase_vertex" ],
37149                 THREE.ShaderChunk[ "morphtarget_vertex" ],
37150                 THREE.ShaderChunk[ "skinning_vertex" ],
37151                 THREE.ShaderChunk[ "default_vertex" ],
37152
37153             "}"
37154
37155         ].join("\n"),
37156
37157         fragmentShader: [
37158
37159             "vec4 pack_depth( const in float depth ) {",
37160
37161                 "const vec4 bit_shift = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );",
37162                 "const vec4 bit_mask  = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );",
37163                 "vec4 res = fract( depth * bit_shift );",
37164                 "res -= res.xxyz * bit_mask;",
37165                 "return res;",
37166
37167             "}",
37168
37169             "void main() {",
37170
37171                 "gl_FragData[ 0 ] = pack_depth( gl_FragCoord.z );",
37172
37173                 //"gl_FragData[ 0 ] = pack_depth( gl_FragCoord.z / gl_FragCoord.w );",
37174                 //"float z = ( ( gl_FragCoord.z / gl_FragCoord.w ) - 3.0 ) / ( 4000.0 - 3.0 );",
37175                 //"gl_FragData[ 0 ] = pack_depth( z );",
37176                 //"gl_FragData[ 0 ] = vec4( z, z, z, 1.0 );",
37177
37178             "}"
37179
37180         ].join("\n")
37181
37182     }
37183
37184 };
37185 /**
37186  * @author supereggbert / http://www.paulbrunt.co.uk/
37187  * @author mrdoob / http://mrdoob.com/
37188  * @author alteredq / http://alteredqualia.com/
37189  * @author szimek / https://github.com/szimek/
37190  */
37191
37192 THREE.WebGLRenderer = function ( parameters ) {
37193
37194     console.log( 'THREE.WebGLRenderer', THREE.REVISION );
37195
37196     parameters = parameters || {};
37197
37198     var _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElement( 'canvas' ),
37199
37200     _precision = parameters.precision !== undefined ? parameters.precision : 'highp',
37201
37202     _alpha = parameters.alpha !== undefined ? parameters.alpha : true,
37203     _premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,
37204     _antialias = parameters.antialias !== undefined ? parameters.antialias : false,
37205     _stencil = parameters.stencil !== undefined ? parameters.stencil : true,
37206     _preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false,
37207
37208     _clearColor = parameters.clearColor !== undefined ? new THREE.Color( parameters.clearColor ) : new THREE.Color( 0x000000 ),
37209     _clearAlpha = parameters.clearAlpha !== undefined ? parameters.clearAlpha : 0,
37210
37211     _maxLights = parameters.maxLights !== undefined ? parameters.maxLights : 4;
37212
37213     // public properties
37214
37215     this.domElement = _canvas;
37216     this.context = null;
37217
37218     // clearing
37219
37220     this.autoClear = true;
37221     this.autoClearColor = true;
37222     this.autoClearDepth = true;
37223     this.autoClearStencil = true;
37224
37225     // scene graph
37226
37227     this.sortObjects = true;
37228
37229     this.autoUpdateObjects = true;
37230     this.autoUpdateScene = true;
37231
37232     // physically based shading
37233
37234     this.gammaInput = false;
37235     this.gammaOutput = false;
37236     this.physicallyBasedShading = false;
37237
37238     // shadow map
37239
37240     this.shadowMapEnabled = false;
37241     this.shadowMapAutoUpdate = true;
37242     this.shadowMapSoft = true;
37243     this.shadowMapCullFrontFaces = true;
37244     this.shadowMapDebug = false;
37245     this.shadowMapCascade = false;
37246
37247     // morphs
37248
37249     this.maxMorphTargets = 8;
37250     this.maxMorphNormals = 4;
37251
37252     // flags
37253
37254     this.autoScaleCubemaps = true;
37255
37256     // custom render plugins
37257
37258     this.renderPluginsPre = [];
37259     this.renderPluginsPost = [];
37260
37261     // info
37262
37263     this.info = {
37264
37265         memory: {
37266
37267             programs: 0,
37268             geometries: 0,
37269             textures: 0
37270
37271         },
37272
37273         render: {
37274
37275             calls: 0,
37276             vertices: 0,
37277             faces: 0,
37278             points: 0
37279
37280         }
37281
37282     };
37283
37284     // internal properties
37285
37286     var _this = this,
37287
37288     _programs = [],
37289     _programs_counter = 0,
37290
37291     // internal state cache
37292
37293     _currentProgram = null,
37294     _currentFramebuffer = null,
37295     _currentMaterialId = -1,
37296     _currentGeometryGroupHash = null,
37297     _currentCamera = null,
37298     _geometryGroupCounter = 0,
37299
37300     _usedTextureUnits = 0,
37301
37302     // GL state cache
37303
37304     _oldDoubleSided = -1,
37305     _oldFlipSided = -1,
37306
37307     _oldBlending = -1,
37308
37309     _oldBlendEquation = -1,
37310     _oldBlendSrc = -1,
37311     _oldBlendDst = -1,
37312
37313     _oldDepthTest = -1,
37314     _oldDepthWrite = -1,
37315
37316     _oldPolygonOffset = null,
37317     _oldPolygonOffsetFactor = null,
37318     _oldPolygonOffsetUnits = null,
37319
37320     _oldLineWidth = null,
37321
37322     _viewportX = 0,
37323     _viewportY = 0,
37324     _viewportWidth = 0,
37325     _viewportHeight = 0,
37326     _currentWidth = 0,
37327     _currentHeight = 0,
37328
37329     // frustum
37330
37331     _frustum = new THREE.Frustum(),
37332
37333      // camera matrices cache
37334
37335     _projScreenMatrix = new THREE.Matrix4(),
37336     _projScreenMatrixPS = new THREE.Matrix4(),
37337
37338     _vector3 = new THREE.Vector4(),
37339
37340     // light arrays cache
37341
37342     _direction = new THREE.Vector3(),
37343
37344     _lightsNeedUpdate = true,
37345
37346     _lights = {
37347
37348         ambient: [ 0, 0, 0 ],
37349         directional: { length: 0, colors: new Array(), positions: new Array() },
37350         point: { length: 0, colors: new Array(), positions: new Array(), distances: new Array() },
37351         spot: { length: 0, colors: new Array(), positions: new Array(), distances: new Array(), directions: new Array(), angles: new Array(), exponents: new Array() },
37352         hemi: { length: 0, skyColors: new Array(), groundColors: new Array(), positions: new Array() }
37353
37354     };
37355
37356     // initialize
37357
37358     var _gl;
37359
37360     var _glExtensionTextureFloat;
37361     var _glExtensionStandardDerivatives;
37362     var _glExtensionTextureFilterAnisotropic;
37363     var _glExtensionCompressedTextureS3TC;
37364
37365     initGL();
37366
37367     setDefaultGLState();
37368
37369     this.context = _gl;
37370
37371     // GPU capabilities
37372
37373     var _maxTextures = _gl.getParameter( _gl.MAX_TEXTURE_IMAGE_UNITS );
37374     var _maxVertexTextures = _gl.getParameter( _gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );
37375     var _maxTextureSize = _gl.getParameter( _gl.MAX_TEXTURE_SIZE );
37376     var _maxCubemapSize = _gl.getParameter( _gl.MAX_CUBE_MAP_TEXTURE_SIZE );
37377
37378     var _maxAnisotropy = _glExtensionTextureFilterAnisotropic ? _gl.getParameter( _glExtensionTextureFilterAnisotropic.MAX_TEXTURE_MAX_ANISOTROPY_EXT ) : 0;
37379
37380     var _supportsVertexTextures = ( _maxVertexTextures > 0 );
37381     var _supportsBoneTextures = _supportsVertexTextures && _glExtensionTextureFloat;
37382
37383     var _compressedTextureFormats = _glExtensionCompressedTextureS3TC ? _gl.getParameter( _gl.COMPRESSED_TEXTURE_FORMATS ) : [];
37384
37385     // API
37386
37387     this.getContext = function () {
37388
37389         return _gl;
37390
37391     };
37392
37393     this.supportsVertexTextures = function () {
37394
37395         return _supportsVertexTextures;
37396
37397     };
37398
37399     this.getMaxAnisotropy  = function () {
37400
37401         return _maxAnisotropy;
37402
37403     };
37404
37405     this.setSize = function ( width, height ) {
37406
37407         _canvas.width = width;
37408         _canvas.height = height;
37409
37410         this.setViewport( 0, 0, _canvas.width, _canvas.height );
37411
37412     };
37413
37414     this.setViewport = function ( x, y, width, height ) {
37415
37416         _viewportX = x !== undefined ? x : 0;
37417         _viewportY = y !== undefined ? y : 0;
37418
37419         _viewportWidth = width !== undefined ? width : _canvas.width;
37420         _viewportHeight = height !== undefined ? height : _canvas.height;
37421
37422         _gl.viewport( _viewportX, _viewportY, _viewportWidth, _viewportHeight );
37423
37424     };
37425
37426     this.setScissor = function ( x, y, width, height ) {
37427
37428         _gl.scissor( x, y, width, height );
37429
37430     };
37431
37432     this.enableScissorTest = function ( enable ) {
37433
37434         enable ? _gl.enable( _gl.SCISSOR_TEST ) : _gl.disable( _gl.SCISSOR_TEST );
37435
37436     };
37437
37438     // Clearing
37439
37440     this.setClearColorHex = function ( hex, alpha ) {
37441
37442         _clearColor.setHex( hex );
37443         _clearAlpha = alpha;
37444
37445         _gl.clearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );
37446
37447     };
37448
37449     this.setClearColor = function ( color, alpha ) {
37450
37451         _clearColor.copy( color );
37452         _clearAlpha = alpha;
37453
37454         _gl.clearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );
37455
37456     };
37457
37458     this.getClearColor = function () {
37459
37460         return _clearColor;
37461
37462     };
37463
37464     this.getClearAlpha = function () {
37465
37466         return _clearAlpha;
37467
37468     };
37469
37470     this.clear = function ( color, depth, stencil ) {
37471
37472         var bits = 0;
37473
37474         if ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT;
37475         if ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT;
37476         if ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT;
37477
37478         _gl.clear( bits );
37479
37480     };
37481
37482     this.clearTarget = function ( renderTarget, color, depth, stencil ) {
37483
37484         this.setRenderTarget( renderTarget );
37485         this.clear( color, depth, stencil );
37486
37487     };
37488
37489     // Plugins
37490
37491     this.addPostPlugin = function ( plugin ) {
37492
37493         plugin.init( this );
37494         this.renderPluginsPost.push( plugin );
37495
37496     };
37497
37498     this.addPrePlugin = function ( plugin ) {
37499
37500         plugin.init( this );
37501         this.renderPluginsPre.push( plugin );
37502
37503     };
37504
37505     // Deallocation
37506
37507     this.deallocateObject = function ( object ) {
37508
37509         if ( ! object.__webglInit ) return;
37510
37511         object.__webglInit = false;
37512
37513         delete object._modelViewMatrix;
37514         delete object._normalMatrix;
37515
37516         delete object._normalMatrixArray;
37517         delete object._modelViewMatrixArray;
37518         delete object._modelMatrixArray;
37519
37520         if ( object instanceof THREE.Mesh ) {
37521
37522             for ( var g in object.geometry.geometryGroups ) {
37523
37524                 deleteMeshBuffers( object.geometry.geometryGroups[ g ] );
37525
37526             }
37527
37528         } else if ( object instanceof THREE.Ribbon ) {
37529
37530             deleteRibbonBuffers( object.geometry );
37531
37532         } else if ( object instanceof THREE.Line ) {
37533
37534             deleteLineBuffers( object.geometry );
37535
37536         } else if ( object instanceof THREE.ParticleSystem ) {
37537
37538             deleteParticleBuffers( object.geometry );
37539
37540         }
37541
37542     };
37543
37544     this.deallocateTexture = function ( texture ) {
37545
37546         if ( ! texture.__webglInit ) return;
37547
37548         texture.__webglInit = false;
37549         _gl.deleteTexture( texture.__webglTexture );
37550
37551         _this.info.memory.textures --;
37552
37553     };
37554
37555     this.deallocateRenderTarget = function ( renderTarget ) {
37556
37557         if ( !renderTarget || ! renderTarget.__webglTexture ) return;
37558
37559         _gl.deleteTexture( renderTarget.__webglTexture );
37560
37561         if ( renderTarget instanceof THREE.WebGLRenderTargetCube ) {
37562
37563             for ( var i = 0; i < 6; i ++ ) {
37564
37565                 _gl.deleteFramebuffer( renderTarget.__webglFramebuffer[ i ] );
37566                 _gl.deleteRenderbuffer( renderTarget.__webglRenderbuffer[ i ] );
37567
37568             }
37569
37570         } else {
37571
37572             _gl.deleteFramebuffer( renderTarget.__webglFramebuffer );
37573             _gl.deleteRenderbuffer( renderTarget.__webglRenderbuffer );
37574
37575         }
37576
37577     };
37578
37579     this.deallocateMaterial = function ( material ) {
37580
37581         var program = material.program;
37582
37583         if ( ! program ) return;
37584
37585         material.program = undefined;
37586
37587         // only deallocate GL program if this was the last use of shared program
37588         // assumed there is only single copy of any program in the _programs list
37589         // (that's how it's constructed)
37590
37591         var i, il, programInfo;
37592         var deleteProgram = false;
37593
37594         for ( i = 0, il = _programs.length; i < il; i ++ ) {
37595
37596             programInfo = _programs[ i ];
37597
37598             if ( programInfo.program === program ) {
37599
37600                 programInfo.usedTimes --;
37601
37602                 if ( programInfo.usedTimes === 0 ) {
37603
37604                     deleteProgram = true;
37605
37606                 }
37607
37608                 break;
37609
37610             }
37611
37612         }
37613
37614         if ( deleteProgram ) {
37615
37616             // avoid using array.splice, this is costlier than creating new array from scratch
37617
37618             var newPrograms = [];
37619
37620             for ( i = 0, il = _programs.length; i < il; i ++ ) {
37621
37622                 programInfo = _programs[ i ];
37623
37624                 if ( programInfo.program !== program ) {
37625
37626                     newPrograms.push( programInfo );
37627
37628                 }
37629
37630             }
37631
37632             _programs = newPrograms;
37633
37634             _gl.deleteProgram( program );
37635
37636             _this.info.memory.programs --;
37637
37638         }
37639
37640     };
37641
37642     // Rendering
37643
37644     this.updateShadowMap = function ( scene, camera ) {
37645
37646         _currentProgram = null;
37647         _oldBlending = -1;
37648         _oldDepthTest = -1;
37649         _oldDepthWrite = -1;
37650         _currentGeometryGroupHash = -1;
37651         _currentMaterialId = -1;
37652         _lightsNeedUpdate = true;
37653         _oldDoubleSided = -1;
37654         _oldFlipSided = -1;
37655
37656         this.shadowMapPlugin.update( scene, camera );
37657
37658     };
37659
37660     // Internal functions
37661
37662     // Buffer allocation
37663
37664     function createParticleBuffers ( geometry ) {
37665
37666         geometry.__webglVertexBuffer = _gl.createBuffer();
37667         geometry.__webglColorBuffer = _gl.createBuffer();
37668
37669         _this.info.memory.geometries ++;
37670
37671     };
37672
37673     function createLineBuffers ( geometry ) {
37674
37675         geometry.__webglVertexBuffer = _gl.createBuffer();
37676         geometry.__webglColorBuffer = _gl.createBuffer();
37677
37678         _this.info.memory.geometries ++;
37679
37680     };
37681
37682     function createRibbonBuffers ( geometry ) {
37683
37684         geometry.__webglVertexBuffer = _gl.createBuffer();
37685         geometry.__webglColorBuffer = _gl.createBuffer();
37686
37687         _this.info.memory.geometries ++;
37688
37689     };
37690
37691     function createMeshBuffers ( geometryGroup ) {
37692
37693         geometryGroup.__webglVertexBuffer = _gl.createBuffer();
37694         geometryGroup.__webglNormalBuffer = _gl.createBuffer();
37695         geometryGroup.__webglTangentBuffer = _gl.createBuffer();
37696         geometryGroup.__webglColorBuffer = _gl.createBuffer();
37697         geometryGroup.__webglUVBuffer = _gl.createBuffer();
37698         geometryGroup.__webglUV2Buffer = _gl.createBuffer();
37699
37700         geometryGroup.__webglSkinIndicesBuffer = _gl.createBuffer();
37701         geometryGroup.__webglSkinWeightsBuffer = _gl.createBuffer();
37702
37703         geometryGroup.__webglFaceBuffer = _gl.createBuffer();
37704         geometryGroup.__webglLineBuffer = _gl.createBuffer();
37705
37706         var m, ml;
37707
37708         if ( geometryGroup.numMorphTargets ) {
37709
37710             geometryGroup.__webglMorphTargetsBuffers = [];
37711
37712             for ( m = 0, ml = geometryGroup.numMorphTargets; m < ml; m ++ ) {
37713
37714                 geometryGroup.__webglMorphTargetsBuffers.push( _gl.createBuffer() );
37715
37716             }
37717
37718         }
37719
37720         if ( geometryGroup.numMorphNormals ) {
37721
37722             geometryGroup.__webglMorphNormalsBuffers = [];
37723
37724             for ( m = 0, ml = geometryGroup.numMorphNormals; m < ml; m ++ ) {
37725
37726                 geometryGroup.__webglMorphNormalsBuffers.push( _gl.createBuffer() );
37727
37728             }
37729
37730         }
37731
37732         _this.info.memory.geometries ++;
37733
37734     };
37735
37736     // Buffer deallocation
37737
37738     function deleteParticleBuffers ( geometry ) {
37739
37740         _gl.deleteBuffer( geometry.__webglVertexBuffer );
37741         _gl.deleteBuffer( geometry.__webglColorBuffer );
37742
37743         _this.info.memory.geometries --;
37744
37745     };
37746
37747     function deleteLineBuffers ( geometry ) {
37748
37749         _gl.deleteBuffer( geometry.__webglVertexBuffer );
37750         _gl.deleteBuffer( geometry.__webglColorBuffer );
37751
37752         _this.info.memory.geometries --;
37753
37754     };
37755
37756     function deleteRibbonBuffers ( geometry ) {
37757
37758         _gl.deleteBuffer( geometry.__webglVertexBuffer );
37759         _gl.deleteBuffer( geometry.__webglColorBuffer );
37760
37761         _this.info.memory.geometries --;
37762
37763     };
37764
37765     function deleteMeshBuffers ( geometryGroup ) {
37766
37767         _gl.deleteBuffer( geometryGroup.__webglVertexBuffer );
37768         _gl.deleteBuffer( geometryGroup.__webglNormalBuffer );
37769         _gl.deleteBuffer( geometryGroup.__webglTangentBuffer );
37770         _gl.deleteBuffer( geometryGroup.__webglColorBuffer );
37771         _gl.deleteBuffer( geometryGroup.__webglUVBuffer );
37772         _gl.deleteBuffer( geometryGroup.__webglUV2Buffer );
37773
37774         _gl.deleteBuffer( geometryGroup.__webglSkinIndicesBuffer );
37775         _gl.deleteBuffer( geometryGroup.__webglSkinWeightsBuffer );
37776
37777         _gl.deleteBuffer( geometryGroup.__webglFaceBuffer );
37778         _gl.deleteBuffer( geometryGroup.__webglLineBuffer );
37779
37780         var m, ml;
37781
37782         if ( geometryGroup.numMorphTargets ) {
37783
37784             for ( m = 0, ml = geometryGroup.numMorphTargets; m < ml; m ++ ) {
37785
37786                 _gl.deleteBuffer( geometryGroup.__webglMorphTargetsBuffers[ m ] );
37787
37788             }
37789
37790         }
37791
37792         if ( geometryGroup.numMorphNormals ) {
37793
37794             for ( m = 0, ml = geometryGroup.numMorphNormals; m < ml; m ++ ) {
37795
37796                 _gl.deleteBuffer( geometryGroup.__webglMorphNormalsBuffers[ m ] );
37797
37798             }
37799
37800         }
37801
37802
37803         if ( geometryGroup.__webglCustomAttributesList ) {
37804
37805             for ( var id in geometryGroup.__webglCustomAttributesList ) {
37806
37807                 _gl.deleteBuffer( geometryGroup.__webglCustomAttributesList[ id ].buffer );
37808
37809             }
37810
37811         }
37812
37813         _this.info.memory.geometries --;
37814
37815     };
37816
37817     // Buffer initialization
37818
37819     function initCustomAttributes ( geometry, object ) {
37820
37821         var nvertices = geometry.vertices.length;
37822
37823         var material = object.material;
37824
37825         if ( material.attributes ) {
37826
37827             if ( geometry.__webglCustomAttributesList === undefined ) {
37828
37829                 geometry.__webglCustomAttributesList = [];
37830
37831             }
37832
37833             for ( var a in material.attributes ) {
37834
37835                 var attribute = material.attributes[ a ];
37836
37837                 if( !attribute.__webglInitialized || attribute.createUniqueBuffers ) {
37838
37839                     attribute.__webglInitialized = true;
37840
37841                     var size = 1;        // "f" and "i"
37842
37843                     if ( attribute.type === "v2" ) size = 2;
37844                     else if ( attribute.type === "v3" ) size = 3;
37845                     else if ( attribute.type === "v4" ) size = 4;
37846                     else if ( attribute.type === "c"  ) size = 3;
37847
37848                     attribute.size = size;
37849
37850                     attribute.array = new Float32Array( nvertices * size );
37851
37852                     attribute.buffer = _gl.createBuffer();
37853                     attribute.buffer.belongsToAttribute = a;
37854
37855                     attribute.needsUpdate = true;
37856
37857                 }
37858
37859                 geometry.__webglCustomAttributesList.push( attribute );
37860
37861             }
37862
37863         }
37864
37865     };
37866
37867     function initParticleBuffers ( geometry, object ) {
37868
37869         var nvertices = geometry.vertices.length;
37870
37871         geometry.__vertexArray = new Float32Array( nvertices * 3 );
37872         geometry.__colorArray = new Float32Array( nvertices * 3 );
37873
37874         geometry.__sortArray = [];
37875
37876         geometry.__webglParticleCount = nvertices;
37877
37878         initCustomAttributes ( geometry, object );
37879
37880     };
37881
37882     function initLineBuffers ( geometry, object ) {
37883
37884         var nvertices = geometry.vertices.length;
37885
37886         geometry.__vertexArray = new Float32Array( nvertices * 3 );
37887         geometry.__colorArray = new Float32Array( nvertices * 3 );
37888
37889         geometry.__webglLineCount = nvertices;
37890
37891         initCustomAttributes ( geometry, object );
37892
37893     };
37894
37895     function initRibbonBuffers ( geometry ) {
37896
37897         var nvertices = geometry.vertices.length;
37898
37899         geometry.__vertexArray = new Float32Array( nvertices * 3 );
37900         geometry.__colorArray = new Float32Array( nvertices * 3 );
37901
37902         geometry.__webglVertexCount = nvertices;
37903
37904     };
37905
37906     function initMeshBuffers ( geometryGroup, object ) {
37907
37908         var geometry = object.geometry,
37909             faces3 = geometryGroup.faces3,
37910             faces4 = geometryGroup.faces4,
37911
37912             nvertices = faces3.length * 3 + faces4.length * 4,
37913             ntris     = faces3.length * 1 + faces4.length * 2,
37914             nlines    = faces3.length * 3 + faces4.length * 4,
37915
37916             material = getBufferMaterial( object, geometryGroup ),
37917
37918             uvType = bufferGuessUVType( material ),
37919             normalType = bufferGuessNormalType( material ),
37920             vertexColorType = bufferGuessVertexColorType( material );
37921
37922         //console.log( "uvType", uvType, "normalType", normalType, "vertexColorType", vertexColorType, object, geometryGroup, material );
37923
37924         geometryGroup.__vertexArray = new Float32Array( nvertices * 3 );
37925
37926         if ( normalType ) {
37927
37928             geometryGroup.__normalArray = new Float32Array( nvertices * 3 );
37929
37930         }
37931
37932         if ( geometry.hasTangents ) {
37933
37934             geometryGroup.__tangentArray = new Float32Array( nvertices * 4 );
37935
37936         }
37937
37938         if ( vertexColorType ) {
37939
37940             geometryGroup.__colorArray = new Float32Array( nvertices * 3 );
37941
37942         }
37943
37944         if ( uvType ) {
37945
37946             if ( geometry.faceUvs.length > 0 || geometry.faceVertexUvs.length > 0 ) {
37947
37948                 geometryGroup.__uvArray = new Float32Array( nvertices * 2 );
37949
37950             }
37951
37952             if ( geometry.faceUvs.length > 1 || geometry.faceVertexUvs.length > 1 ) {
37953
37954                 geometryGroup.__uv2Array = new Float32Array( nvertices * 2 );
37955
37956             }
37957
37958         }
37959
37960         if ( object.geometry.skinWeights.length && object.geometry.skinIndices.length ) {
37961
37962             geometryGroup.__skinIndexArray = new Float32Array( nvertices * 4 );
37963             geometryGroup.__skinWeightArray = new Float32Array( nvertices * 4 );
37964
37965         }
37966
37967         geometryGroup.__faceArray = new Uint16Array( ntris * 3 );
37968         geometryGroup.__lineArray = new Uint16Array( nlines * 2 );
37969
37970         var m, ml;
37971
37972         if ( geometryGroup.numMorphTargets ) {
37973
37974             geometryGroup.__morphTargetsArrays = [];
37975
37976             for ( m = 0, ml = geometryGroup.numMorphTargets; m < ml; m ++ ) {
37977
37978                 geometryGroup.__morphTargetsArrays.push( new Float32Array( nvertices * 3 ) );
37979
37980             }
37981
37982         }
37983
37984         if ( geometryGroup.numMorphNormals ) {
37985
37986             geometryGroup.__morphNormalsArrays = [];
37987
37988             for ( m = 0, ml = geometryGroup.numMorphNormals; m < ml; m ++ ) {
37989
37990                 geometryGroup.__morphNormalsArrays.push( new Float32Array( nvertices * 3 ) );
37991
37992             }
37993
37994         }
37995
37996         geometryGroup.__webglFaceCount = ntris * 3;
37997         geometryGroup.__webglLineCount = nlines * 2;
37998
37999
38000         // custom attributes
38001
38002         if ( material.attributes ) {
38003
38004             if ( geometryGroup.__webglCustomAttributesList === undefined ) {
38005
38006                 geometryGroup.__webglCustomAttributesList = [];
38007
38008             }
38009
38010             for ( var a in material.attributes ) {
38011
38012                 // Do a shallow copy of the attribute object so different geometryGroup chunks use different
38013                 // attribute buffers which are correctly indexed in the setMeshBuffers function
38014
38015                 var originalAttribute = material.attributes[ a ];
38016
38017                 var attribute = {};
38018
38019                 for ( var property in originalAttribute ) {
38020
38021                     attribute[ property ] = originalAttribute[ property ];
38022
38023                 }
38024
38025                 if( !attribute.__webglInitialized || attribute.createUniqueBuffers ) {
38026
38027                     attribute.__webglInitialized = true;
38028
38029                     var size = 1;        // "f" and "i"
38030
38031                     if( attribute.type === "v2" ) size = 2;
38032                     else if( attribute.type === "v3" ) size = 3;
38033                     else if( attribute.type === "v4" ) size = 4;
38034                     else if( attribute.type === "c"  ) size = 3;
38035
38036                     attribute.size = size;
38037
38038                     attribute.array = new Float32Array( nvertices * size );
38039
38040                     attribute.buffer = _gl.createBuffer();
38041                     attribute.buffer.belongsToAttribute = a;
38042
38043                     originalAttribute.needsUpdate = true;
38044                     attribute.__original = originalAttribute;
38045
38046                 }
38047
38048                 geometryGroup.__webglCustomAttributesList.push( attribute );
38049
38050             }
38051
38052         }
38053
38054         geometryGroup.__inittedArrays = true;
38055
38056     };
38057
38058     function getBufferMaterial( object, geometryGroup ) {
38059
38060         if ( object.material && ! ( object.material instanceof THREE.MeshFaceMaterial ) ) {
38061
38062             return object.material;
38063
38064         } else if ( geometryGroup.materialIndex >= 0 ) {
38065
38066             return object.geometry.materials[ geometryGroup.materialIndex ];
38067
38068         }
38069
38070     };
38071
38072     function materialNeedsSmoothNormals ( material ) {
38073
38074         return material && material.shading !== undefined && material.shading === THREE.SmoothShading;
38075
38076     };
38077
38078     function bufferGuessNormalType ( material ) {
38079
38080         // only MeshBasicMaterial and MeshDepthMaterial don't need normals
38081
38082         if ( ( material instanceof THREE.MeshBasicMaterial && !material.envMap ) || material instanceof THREE.MeshDepthMaterial ) {
38083
38084             return false;
38085
38086         }
38087
38088         if ( materialNeedsSmoothNormals( material ) ) {
38089
38090             return THREE.SmoothShading;
38091
38092         } else {
38093
38094             return THREE.FlatShading;
38095
38096         }
38097
38098     };
38099
38100     function bufferGuessVertexColorType ( material ) {
38101
38102         if ( material.vertexColors ) {
38103
38104             return material.vertexColors;
38105
38106         }
38107
38108         return false;
38109
38110     };
38111
38112     function bufferGuessUVType ( material ) {
38113
38114         // material must use some texture to require uvs
38115
38116         if ( material.map || material.lightMap || material.bumpMap || material.normalMap || material.specularMap || material instanceof THREE.ShaderMaterial ) {
38117
38118             return true;
38119
38120         }
38121
38122         return false;
38123
38124     };
38125
38126     //
38127
38128     function initDirectBuffers( geometry ) {
38129
38130         var a, attribute, type;
38131
38132         for ( a in geometry.attributes ) {
38133
38134             if ( a === "index" ) {
38135
38136                 type = _gl.ELEMENT_ARRAY_BUFFER;
38137
38138             } else {
38139
38140                 type = _gl.ARRAY_BUFFER;
38141
38142             }
38143
38144             attribute = geometry.attributes[ a ];
38145
38146             attribute.buffer = _gl.createBuffer();
38147
38148             _gl.bindBuffer( type, attribute.buffer );
38149             _gl.bufferData( type, attribute.array, _gl.STATIC_DRAW );
38150
38151         }
38152
38153     };
38154
38155     // Buffer setting
38156
38157     function setParticleBuffers ( geometry, hint, object ) {
38158
38159         var v, c, vertex, offset, index, color,
38160
38161         vertices = geometry.vertices,
38162         vl = vertices.length,
38163
38164         colors = geometry.colors,
38165         cl = colors.length,
38166
38167         vertexArray = geometry.__vertexArray,
38168         colorArray = geometry.__colorArray,
38169
38170         sortArray = geometry.__sortArray,
38171
38172         dirtyVertices = geometry.verticesNeedUpdate,
38173         dirtyElements = geometry.elementsNeedUpdate,
38174         dirtyColors = geometry.colorsNeedUpdate,
38175
38176         customAttributes = geometry.__webglCustomAttributesList,
38177         i, il,
38178         a, ca, cal, value,
38179         customAttribute;
38180
38181         if ( object.sortParticles ) {
38182
38183             _projScreenMatrixPS.copy( _projScreenMatrix );
38184             _projScreenMatrixPS.multiplySelf( object.matrixWorld );
38185
38186             for ( v = 0; v < vl; v ++ ) {
38187
38188                 vertex = vertices[ v ];
38189
38190                 _vector3.copy( vertex );
38191                 _projScreenMatrixPS.multiplyVector3( _vector3 );
38192
38193                 sortArray[ v ] = [ _vector3.z, v ];
38194
38195             }
38196
38197             sortArray.sort( function( a, b ) { return b[ 0 ] - a[ 0 ]; } );
38198
38199             for ( v = 0; v < vl; v ++ ) {
38200
38201                 vertex = vertices[ sortArray[v][1] ];
38202
38203                 offset = v * 3;
38204
38205                 vertexArray[ offset ]     = vertex.x;
38206                 vertexArray[ offset + 1 ] = vertex.y;
38207                 vertexArray[ offset + 2 ] = vertex.z;
38208
38209             }
38210
38211             for ( c = 0; c < cl; c ++ ) {
38212
38213                 offset = c * 3;
38214
38215                 color = colors[ sortArray[c][1] ];
38216
38217                 colorArray[ offset ]     = color.r;
38218                 colorArray[ offset + 1 ] = color.g;
38219                 colorArray[ offset + 2 ] = color.b;
38220
38221             }
38222
38223             if ( customAttributes ) {
38224
38225                 for ( i = 0, il = customAttributes.length; i < il; i ++ ) {
38226
38227                     customAttribute = customAttributes[ i ];
38228
38229                     if ( ! ( customAttribute.boundTo === undefined || customAttribute.boundTo === "vertices" ) ) continue;
38230
38231                     offset = 0;
38232
38233                     cal = customAttribute.value.length;
38234
38235                     if ( customAttribute.size === 1 ) {
38236
38237                         for ( ca = 0; ca < cal; ca ++ ) {
38238
38239                             index = sortArray[ ca ][ 1 ];
38240
38241                             customAttribute.array[ ca ] = customAttribute.value[ index ];
38242
38243                         }
38244
38245                     } else if ( customAttribute.size === 2 ) {
38246
38247                         for ( ca = 0; ca < cal; ca ++ ) {
38248
38249                             index = sortArray[ ca ][ 1 ];
38250
38251                             value = customAttribute.value[ index ];
38252
38253                             customAttribute.array[ offset ]     = value.x;
38254                             customAttribute.array[ offset + 1 ] = value.y;
38255
38256                             offset += 2;
38257
38258                         }
38259
38260                     } else if ( customAttribute.size === 3 ) {
38261
38262                         if ( customAttribute.type === "c" ) {
38263
38264                             for ( ca = 0; ca < cal; ca ++ ) {
38265
38266                                 index = sortArray[ ca ][ 1 ];
38267
38268                                 value = customAttribute.value[ index ];
38269
38270                                 customAttribute.array[ offset ]     = value.r;
38271                                 customAttribute.array[ offset + 1 ] = value.g;
38272                                 customAttribute.array[ offset + 2 ] = value.b;
38273
38274                                 offset += 3;
38275
38276                             }
38277
38278                         } else {
38279
38280                             for ( ca = 0; ca < cal; ca ++ ) {
38281
38282                                 index = sortArray[ ca ][ 1 ];
38283
38284                                 value = customAttribute.value[ index ];
38285
38286                                 customAttribute.array[ offset ]     = value.x;
38287                                 customAttribute.array[ offset + 1 ] = value.y;
38288                                 customAttribute.array[ offset + 2 ] = value.z;
38289
38290                                 offset += 3;
38291
38292                             }
38293
38294                         }
38295
38296                     } else if ( customAttribute.size === 4 ) {
38297
38298                         for ( ca = 0; ca < cal; ca ++ ) {
38299
38300                             index = sortArray[ ca ][ 1 ];
38301
38302                             value = customAttribute.value[ index ];
38303
38304                             customAttribute.array[ offset ]      = value.x;
38305                             customAttribute.array[ offset + 1  ] = value.y;
38306                             customAttribute.array[ offset + 2  ] = value.z;
38307                             customAttribute.array[ offset + 3  ] = value.w;
38308
38309                             offset += 4;
38310
38311                         }
38312
38313                     }
38314
38315                 }
38316
38317             }
38318
38319         } else {
38320
38321             if ( dirtyVertices ) {
38322
38323                 for ( v = 0; v < vl; v ++ ) {
38324
38325                     vertex = vertices[ v ];
38326
38327                     offset = v * 3;
38328
38329                     vertexArray[ offset ]     = vertex.x;
38330                     vertexArray[ offset + 1 ] = vertex.y;
38331                     vertexArray[ offset + 2 ] = vertex.z;
38332
38333                 }
38334
38335             }
38336
38337             if ( dirtyColors ) {
38338
38339                 for ( c = 0; c < cl; c ++ ) {
38340
38341                     color = colors[ c ];
38342
38343                     offset = c * 3;
38344
38345                     colorArray[ offset ]     = color.r;
38346                     colorArray[ offset + 1 ] = color.g;
38347                     colorArray[ offset + 2 ] = color.b;
38348
38349                 }
38350
38351             }
38352
38353             if ( customAttributes ) {
38354
38355                 for ( i = 0, il = customAttributes.length; i < il; i ++ ) {
38356
38357                     customAttribute = customAttributes[ i ];
38358
38359                     if ( customAttribute.needsUpdate &&
38360                          ( customAttribute.boundTo === undefined ||
38361                            customAttribute.boundTo === "vertices") ) {
38362
38363                         cal = customAttribute.value.length;
38364
38365                         offset = 0;
38366
38367                         if ( customAttribute.size === 1 ) {
38368
38369                             for ( ca = 0; ca < cal; ca ++ ) {
38370
38371                                 customAttribute.array[ ca ] = customAttribute.value[ ca ];
38372
38373                             }
38374
38375                         } else if ( customAttribute.size === 2 ) {
38376
38377                             for ( ca = 0; ca < cal; ca ++ ) {
38378
38379                                 value = customAttribute.value[ ca ];
38380
38381                                 customAttribute.array[ offset ]     = value.x;
38382                                 customAttribute.array[ offset + 1 ] = value.y;
38383
38384                                 offset += 2;
38385
38386                             }
38387
38388                         } else if ( customAttribute.size === 3 ) {
38389
38390                             if ( customAttribute.type === "c" ) {
38391
38392                                 for ( ca = 0; ca < cal; ca ++ ) {
38393
38394                                     value = customAttribute.value[ ca ];
38395
38396                                     customAttribute.array[ offset ]     = value.r;
38397                                     customAttribute.array[ offset + 1 ] = value.g;
38398                                     customAttribute.array[ offset + 2 ] = value.b;
38399
38400                                     offset += 3;
38401
38402                                 }
38403
38404                             } else {
38405
38406                                 for ( ca = 0; ca < cal; ca ++ ) {
38407
38408                                     value = customAttribute.value[ ca ];
38409
38410                                     customAttribute.array[ offset ]     = value.x;
38411                                     customAttribute.array[ offset + 1 ] = value.y;
38412                                     customAttribute.array[ offset + 2 ] = value.z;
38413
38414                                     offset += 3;
38415
38416                                 }
38417
38418                             }
38419
38420                         } else if ( customAttribute.size === 4 ) {
38421
38422                             for ( ca = 0; ca < cal; ca ++ ) {
38423
38424                                 value = customAttribute.value[ ca ];
38425
38426                                 customAttribute.array[ offset ]      = value.x;
38427                                 customAttribute.array[ offset + 1  ] = value.y;
38428                                 customAttribute.array[ offset + 2  ] = value.z;
38429                                 customAttribute.array[ offset + 3  ] = value.w;
38430
38431                                 offset += 4;
38432
38433                             }
38434
38435                         }
38436
38437                     }
38438
38439                 }
38440
38441             }
38442
38443         }
38444
38445         if ( dirtyVertices || object.sortParticles ) {
38446
38447             _gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webglVertexBuffer );
38448             _gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint );
38449
38450         }
38451
38452         if ( dirtyColors || object.sortParticles ) {
38453
38454             _gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webglColorBuffer );
38455             _gl.bufferData( _gl.ARRAY_BUFFER, colorArray, hint );
38456
38457         }
38458
38459         if ( customAttributes ) {
38460
38461             for ( i = 0, il = customAttributes.length; i < il; i ++ ) {
38462
38463                 customAttribute = customAttributes[ i ];
38464
38465                 if ( customAttribute.needsUpdate || object.sortParticles ) {
38466
38467                     _gl.bindBuffer( _gl.ARRAY_BUFFER, customAttribute.buffer );
38468                     _gl.bufferData( _gl.ARRAY_BUFFER, customAttribute.array, hint );
38469
38470                 }
38471
38472             }
38473
38474         }
38475
38476
38477     };
38478
38479     function setLineBuffers ( geometry, hint ) {
38480
38481         var v, c, vertex, offset, color,
38482
38483         vertices = geometry.vertices,
38484         colors = geometry.colors,
38485         vl = vertices.length,
38486         cl = colors.length,
38487
38488         vertexArray = geometry.__vertexArray,
38489         colorArray = geometry.__colorArray,
38490
38491         dirtyVertices = geometry.verticesNeedUpdate,
38492         dirtyColors = geometry.colorsNeedUpdate,
38493
38494         customAttributes = geometry.__webglCustomAttributesList,
38495
38496         i, il,
38497         a, ca, cal, value,
38498         customAttribute;
38499
38500         if ( dirtyVertices ) {
38501
38502             for ( v = 0; v < vl; v ++ ) {
38503
38504                 vertex = vertices[ v ];
38505
38506                 offset = v * 3;
38507
38508                 vertexArray[ offset ]     = vertex.x;
38509                 vertexArray[ offset + 1 ] = vertex.y;
38510                 vertexArray[ offset + 2 ] = vertex.z;
38511
38512             }
38513
38514             _gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webglVertexBuffer );
38515             _gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint );
38516
38517         }
38518
38519         if ( dirtyColors ) {
38520
38521             for ( c = 0; c < cl; c ++ ) {
38522
38523                 color = colors[ c ];
38524
38525                 offset = c * 3;
38526
38527                 colorArray[ offset ]     = color.r;
38528                 colorArray[ offset + 1 ] = color.g;
38529                 colorArray[ offset + 2 ] = color.b;
38530
38531             }
38532
38533             _gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webglColorBuffer );
38534             _gl.bufferData( _gl.ARRAY_BUFFER, colorArray, hint );
38535
38536         }
38537
38538         if ( customAttributes ) {
38539
38540             for ( i = 0, il = customAttributes.length; i < il; i ++ ) {
38541
38542                 customAttribute = customAttributes[ i ];
38543
38544                 if ( customAttribute.needsUpdate &&
38545                      ( customAttribute.boundTo === undefined ||
38546                        customAttribute.boundTo === "vertices" ) ) {
38547
38548                     offset = 0;
38549
38550                     cal = customAttribute.value.length;
38551
38552                     if ( customAttribute.size === 1 ) {
38553
38554                         for ( ca = 0; ca < cal; ca ++ ) {
38555
38556                             customAttribute.array[ ca ] = customAttribute.value[ ca ];
38557
38558                         }
38559
38560                     } else if ( customAttribute.size === 2 ) {
38561
38562                         for ( ca = 0; ca < cal; ca ++ ) {
38563
38564                             value = customAttribute.value[ ca ];
38565
38566                             customAttribute.array[ offset ]     = value.x;
38567                             customAttribute.array[ offset + 1 ] = value.y;
38568
38569                             offset += 2;
38570
38571                         }
38572
38573                     } else if ( customAttribute.size === 3 ) {
38574
38575                         if ( customAttribute.type === "c" ) {
38576
38577                             for ( ca = 0; ca < cal; ca ++ ) {
38578
38579                                 value = customAttribute.value[ ca ];
38580
38581                                 customAttribute.array[ offset ]     = value.r;
38582                                 customAttribute.array[ offset + 1 ] = value.g;
38583                                 customAttribute.array[ offset + 2 ] = value.b;
38584
38585                                 offset += 3;
38586
38587                             }
38588
38589                         } else {
38590
38591                             for ( ca = 0; ca < cal; ca ++ ) {
38592
38593                                 value = customAttribute.value[ ca ];
38594
38595                                 customAttribute.array[ offset ]     = value.x;
38596                                 customAttribute.array[ offset + 1 ] = value.y;
38597                                 customAttribute.array[ offset + 2 ] = value.z;
38598
38599                                 offset += 3;
38600
38601                             }
38602
38603                         }
38604
38605                     } else if ( customAttribute.size === 4 ) {
38606
38607                         for ( ca = 0; ca < cal; ca ++ ) {
38608
38609                             value = customAttribute.value[ ca ];
38610
38611                             customAttribute.array[ offset ]      = value.x;
38612                             customAttribute.array[ offset + 1  ] = value.y;
38613                             customAttribute.array[ offset + 2  ] = value.z;
38614                             customAttribute.array[ offset + 3  ] = value.w;
38615
38616                             offset += 4;
38617
38618                         }
38619
38620                     }
38621
38622                     _gl.bindBuffer( _gl.ARRAY_BUFFER, customAttribute.buffer );
38623                     _gl.bufferData( _gl.ARRAY_BUFFER, customAttribute.array, hint );
38624
38625                 }
38626
38627             }
38628
38629         }
38630
38631     };
38632
38633     function setRibbonBuffers ( geometry, hint ) {
38634
38635         var v, c, vertex, offset, color,
38636
38637         vertices = geometry.vertices,
38638         colors = geometry.colors,
38639         vl = vertices.length,
38640         cl = colors.length,
38641
38642         vertexArray = geometry.__vertexArray,
38643         colorArray = geometry.__colorArray,
38644
38645         dirtyVertices = geometry.verticesNeedUpdate,
38646         dirtyColors = geometry.colorsNeedUpdate;
38647
38648         if ( dirtyVertices ) {
38649
38650             for ( v = 0; v < vl; v ++ ) {
38651
38652                 vertex = vertices[ v ];
38653
38654                 offset = v * 3;
38655
38656                 vertexArray[ offset ]     = vertex.x;
38657                 vertexArray[ offset + 1 ] = vertex.y;
38658                 vertexArray[ offset + 2 ] = vertex.z;
38659
38660             }
38661
38662             _gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webglVertexBuffer );
38663             _gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint );
38664
38665         }
38666
38667         if ( dirtyColors ) {
38668
38669             for ( c = 0; c < cl; c ++ ) {
38670
38671                 color = colors[ c ];
38672
38673                 offset = c * 3;
38674
38675                 colorArray[ offset ]     = color.r;
38676                 colorArray[ offset + 1 ] = color.g;
38677                 colorArray[ offset + 2 ] = color.b;
38678
38679             }
38680
38681             _gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webglColorBuffer );
38682             _gl.bufferData( _gl.ARRAY_BUFFER, colorArray, hint );
38683
38684         }
38685
38686     };
38687
38688     function setMeshBuffers( geometryGroup, object, hint, dispose, material ) {
38689
38690         if ( ! geometryGroup.__inittedArrays ) {
38691
38692             // console.log( object );
38693             return;
38694
38695         }
38696
38697         var normalType = bufferGuessNormalType( material ),
38698         vertexColorType = bufferGuessVertexColorType( material ),
38699         uvType = bufferGuessUVType( material ),
38700
38701         needsSmoothNormals = ( normalType === THREE.SmoothShading );
38702
38703         var f, fl, fi, face,
38704         vertexNormals, faceNormal, normal,
38705         vertexColors, faceColor,
38706         vertexTangents,
38707         uv, uv2, v1, v2, v3, v4, t1, t2, t3, t4, n1, n2, n3, n4,
38708         c1, c2, c3, c4,
38709         sw1, sw2, sw3, sw4,
38710         si1, si2, si3, si4,
38711         sa1, sa2, sa3, sa4,
38712         sb1, sb2, sb3, sb4,
38713         m, ml, i, il,
38714         vn, uvi, uv2i,
38715         vk, vkl, vka,
38716         nka, chf, faceVertexNormals,
38717         a,
38718
38719         vertexIndex = 0,
38720
38721         offset = 0,
38722         offset_uv = 0,
38723         offset_uv2 = 0,
38724         offset_face = 0,
38725         offset_normal = 0,
38726         offset_tangent = 0,
38727         offset_line = 0,
38728         offset_color = 0,
38729         offset_skin = 0,
38730         offset_morphTarget = 0,
38731         offset_custom = 0,
38732         offset_customSrc = 0,
38733
38734         value,
38735
38736         vertexArray = geometryGroup.__vertexArray,
38737         uvArray = geometryGroup.__uvArray,
38738         uv2Array = geometryGroup.__uv2Array,
38739         normalArray = geometryGroup.__normalArray,
38740         tangentArray = geometryGroup.__tangentArray,
38741         colorArray = geometryGroup.__colorArray,
38742
38743         skinIndexArray = geometryGroup.__skinIndexArray,
38744         skinWeightArray = geometryGroup.__skinWeightArray,
38745
38746         morphTargetsArrays = geometryGroup.__morphTargetsArrays,
38747         morphNormalsArrays = geometryGroup.__morphNormalsArrays,
38748
38749         customAttributes = geometryGroup.__webglCustomAttributesList,
38750         customAttribute,
38751
38752         faceArray = geometryGroup.__faceArray,
38753         lineArray = geometryGroup.__lineArray,
38754
38755         geometry = object.geometry, // this is shared for all chunks
38756
38757         dirtyVertices = geometry.verticesNeedUpdate,
38758         dirtyElements = geometry.elementsNeedUpdate,
38759         dirtyUvs = geometry.uvsNeedUpdate,
38760         dirtyNormals = geometry.normalsNeedUpdate,
38761         dirtyTangents = geometry.tangentsNeedUpdate,
38762         dirtyColors = geometry.colorsNeedUpdate,
38763         dirtyMorphTargets = geometry.morphTargetsNeedUpdate,
38764
38765         vertices = geometry.vertices,
38766         chunk_faces3 = geometryGroup.faces3,
38767         chunk_faces4 = geometryGroup.faces4,
38768         obj_faces = geometry.faces,
38769
38770         obj_uvs  = geometry.faceVertexUvs[ 0 ],
38771         obj_uvs2 = geometry.faceVertexUvs[ 1 ],
38772
38773         obj_colors = geometry.colors,
38774
38775         obj_skinIndices = geometry.skinIndices,
38776         obj_skinWeights = geometry.skinWeights,
38777
38778         morphTargets = geometry.morphTargets,
38779         morphNormals = geometry.morphNormals;
38780
38781         if ( dirtyVertices ) {
38782
38783             for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {
38784
38785                 face = obj_faces[ chunk_faces3[ f ] ];
38786
38787                 v1 = vertices[ face.a ];
38788                 v2 = vertices[ face.b ];
38789                 v3 = vertices[ face.c ];
38790
38791                 vertexArray[ offset ]     = v1.x;
38792                 vertexArray[ offset + 1 ] = v1.y;
38793                 vertexArray[ offset + 2 ] = v1.z;
38794
38795                 vertexArray[ offset + 3 ] = v2.x;
38796                 vertexArray[ offset + 4 ] = v2.y;
38797                 vertexArray[ offset + 5 ] = v2.z;
38798
38799                 vertexArray[ offset + 6 ] = v3.x;
38800                 vertexArray[ offset + 7 ] = v3.y;
38801                 vertexArray[ offset + 8 ] = v3.z;
38802
38803                 offset += 9;
38804
38805             }
38806
38807             for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {
38808
38809                 face = obj_faces[ chunk_faces4[ f ] ];
38810
38811                 v1 = vertices[ face.a ];
38812                 v2 = vertices[ face.b ];
38813                 v3 = vertices[ face.c ];
38814                 v4 = vertices[ face.d ];
38815
38816                 vertexArray[ offset ]     = v1.x;
38817                 vertexArray[ offset + 1 ] = v1.y;
38818                 vertexArray[ offset + 2 ] = v1.z;
38819
38820                 vertexArray[ offset + 3 ] = v2.x;
38821                 vertexArray[ offset + 4 ] = v2.y;
38822                 vertexArray[ offset + 5 ] = v2.z;
38823
38824                 vertexArray[ offset + 6 ] = v3.x;
38825                 vertexArray[ offset + 7 ] = v3.y;
38826                 vertexArray[ offset + 8 ] = v3.z;
38827
38828                 vertexArray[ offset + 9 ]  = v4.x;
38829                 vertexArray[ offset + 10 ] = v4.y;
38830                 vertexArray[ offset + 11 ] = v4.z;
38831
38832                 offset += 12;
38833
38834             }
38835
38836             _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglVertexBuffer );
38837             _gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint );
38838
38839         }
38840
38841         if ( dirtyMorphTargets ) {
38842
38843             for ( vk = 0, vkl = morphTargets.length; vk < vkl; vk ++ ) {
38844
38845                 offset_morphTarget = 0;
38846
38847                 for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {
38848
38849                     chf = chunk_faces3[ f ];
38850                     face = obj_faces[ chf ];
38851
38852                     // morph positions
38853
38854                     v1 = morphTargets[ vk ].vertices[ face.a ];
38855                     v2 = morphTargets[ vk ].vertices[ face.b ];
38856                     v3 = morphTargets[ vk ].vertices[ face.c ];
38857
38858                     vka = morphTargetsArrays[ vk ];
38859
38860                     vka[ offset_morphTarget ]       = v1.x;
38861                     vka[ offset_morphTarget + 1 ] = v1.y;
38862                     vka[ offset_morphTarget + 2 ] = v1.z;
38863
38864                     vka[ offset_morphTarget + 3 ] = v2.x;
38865                     vka[ offset_morphTarget + 4 ] = v2.y;
38866                     vka[ offset_morphTarget + 5 ] = v2.z;
38867
38868                     vka[ offset_morphTarget + 6 ] = v3.x;
38869                     vka[ offset_morphTarget + 7 ] = v3.y;
38870                     vka[ offset_morphTarget + 8 ] = v3.z;
38871
38872                     // morph normals
38873
38874                     if ( material.morphNormals ) {
38875
38876                         if ( needsSmoothNormals ) {
38877
38878                             faceVertexNormals = morphNormals[ vk ].vertexNormals[ chf ];
38879
38880                             n1 = faceVertexNormals.a;
38881                             n2 = faceVertexNormals.b;
38882                             n3 = faceVertexNormals.c;
38883
38884                         } else {
38885
38886                             n1 = morphNormals[ vk ].faceNormals[ chf ];
38887                             n2 = n1;
38888                             n3 = n1;
38889
38890                         }
38891
38892                         nka = morphNormalsArrays[ vk ];
38893
38894                         nka[ offset_morphTarget ]       = n1.x;
38895                         nka[ offset_morphTarget + 1 ] = n1.y;
38896                         nka[ offset_morphTarget + 2 ] = n1.z;
38897
38898                         nka[ offset_morphTarget + 3 ] = n2.x;
38899                         nka[ offset_morphTarget + 4 ] = n2.y;
38900                         nka[ offset_morphTarget + 5 ] = n2.z;
38901
38902                         nka[ offset_morphTarget + 6 ] = n3.x;
38903                         nka[ offset_morphTarget + 7 ] = n3.y;
38904                         nka[ offset_morphTarget + 8 ] = n3.z;
38905
38906                     }
38907
38908                     //
38909
38910                     offset_morphTarget += 9;
38911
38912                 }
38913
38914                 for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {
38915
38916                     chf = chunk_faces4[ f ];
38917                     face = obj_faces[ chf ];
38918
38919                     // morph positions
38920
38921                     v1 = morphTargets[ vk ].vertices[ face.a ];
38922                     v2 = morphTargets[ vk ].vertices[ face.b ];
38923                     v3 = morphTargets[ vk ].vertices[ face.c ];
38924                     v4 = morphTargets[ vk ].vertices[ face.d ];
38925
38926                     vka = morphTargetsArrays[ vk ];
38927
38928                     vka[ offset_morphTarget ]       = v1.x;
38929                     vka[ offset_morphTarget + 1 ] = v1.y;
38930                     vka[ offset_morphTarget + 2 ] = v1.z;
38931
38932                     vka[ offset_morphTarget + 3 ] = v2.x;
38933                     vka[ offset_morphTarget + 4 ] = v2.y;
38934                     vka[ offset_morphTarget + 5 ] = v2.z;
38935
38936                     vka[ offset_morphTarget + 6 ] = v3.x;
38937                     vka[ offset_morphTarget + 7 ] = v3.y;
38938                     vka[ offset_morphTarget + 8 ] = v3.z;
38939
38940                     vka[ offset_morphTarget + 9 ]  = v4.x;
38941                     vka[ offset_morphTarget + 10 ] = v4.y;
38942                     vka[ offset_morphTarget + 11 ] = v4.z;
38943
38944                     // morph normals
38945
38946                     if ( material.morphNormals ) {
38947
38948                         if ( needsSmoothNormals ) {
38949
38950                             faceVertexNormals = morphNormals[ vk ].vertexNormals[ chf ];
38951
38952                             n1 = faceVertexNormals.a;
38953                             n2 = faceVertexNormals.b;
38954                             n3 = faceVertexNormals.c;
38955                             n4 = faceVertexNormals.d;
38956
38957                         } else {
38958
38959                             n1 = morphNormals[ vk ].faceNormals[ chf ];
38960                             n2 = n1;
38961                             n3 = n1;
38962                             n4 = n1;
38963
38964                         }
38965
38966                         nka = morphNormalsArrays[ vk ];
38967
38968                         nka[ offset_morphTarget ]       = n1.x;
38969                         nka[ offset_morphTarget + 1 ] = n1.y;
38970                         nka[ offset_morphTarget + 2 ] = n1.z;
38971
38972                         nka[ offset_morphTarget + 3 ] = n2.x;
38973                         nka[ offset_morphTarget + 4 ] = n2.y;
38974                         nka[ offset_morphTarget + 5 ] = n2.z;
38975
38976                         nka[ offset_morphTarget + 6 ] = n3.x;
38977                         nka[ offset_morphTarget + 7 ] = n3.y;
38978                         nka[ offset_morphTarget + 8 ] = n3.z;
38979
38980                         nka[ offset_morphTarget + 9 ]  = n4.x;
38981                         nka[ offset_morphTarget + 10 ] = n4.y;
38982                         nka[ offset_morphTarget + 11 ] = n4.z;
38983
38984                     }
38985
38986                     //
38987
38988                     offset_morphTarget += 12;
38989
38990                 }
38991
38992                 _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglMorphTargetsBuffers[ vk ] );
38993                 _gl.bufferData( _gl.ARRAY_BUFFER, morphTargetsArrays[ vk ], hint );
38994
38995                 if ( material.morphNormals ) {
38996
38997                     _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglMorphNormalsBuffers[ vk ] );
38998                     _gl.bufferData( _gl.ARRAY_BUFFER, morphNormalsArrays[ vk ], hint );
38999
39000                 }
39001
39002             }
39003
39004         }
39005
39006         if ( obj_skinWeights.length ) {
39007
39008             for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {
39009
39010                 face = obj_faces[ chunk_faces3[ f ]    ];
39011
39012                 // weights
39013
39014                 sw1 = obj_skinWeights[ face.a ];
39015                 sw2 = obj_skinWeights[ face.b ];
39016                 sw3 = obj_skinWeights[ face.c ];
39017
39018                 skinWeightArray[ offset_skin ]     = sw1.x;
39019                 skinWeightArray[ offset_skin + 1 ] = sw1.y;
39020                 skinWeightArray[ offset_skin + 2 ] = sw1.z;
39021                 skinWeightArray[ offset_skin + 3 ] = sw1.w;
39022
39023                 skinWeightArray[ offset_skin + 4 ] = sw2.x;
39024                 skinWeightArray[ offset_skin + 5 ] = sw2.y;
39025                 skinWeightArray[ offset_skin + 6 ] = sw2.z;
39026                 skinWeightArray[ offset_skin + 7 ] = sw2.w;
39027
39028                 skinWeightArray[ offset_skin + 8 ]  = sw3.x;
39029                 skinWeightArray[ offset_skin + 9 ]  = sw3.y;
39030                 skinWeightArray[ offset_skin + 10 ] = sw3.z;
39031                 skinWeightArray[ offset_skin + 11 ] = sw3.w;
39032
39033                 // indices
39034
39035                 si1 = obj_skinIndices[ face.a ];
39036                 si2 = obj_skinIndices[ face.b ];
39037                 si3 = obj_skinIndices[ face.c ];
39038
39039                 skinIndexArray[ offset_skin ]     = si1.x;
39040                 skinIndexArray[ offset_skin + 1 ] = si1.y;
39041                 skinIndexArray[ offset_skin + 2 ] = si1.z;
39042                 skinIndexArray[ offset_skin + 3 ] = si1.w;
39043
39044                 skinIndexArray[ offset_skin + 4 ] = si2.x;
39045                 skinIndexArray[ offset_skin + 5 ] = si2.y;
39046                 skinIndexArray[ offset_skin + 6 ] = si2.z;
39047                 skinIndexArray[ offset_skin + 7 ] = si2.w;
39048
39049                 skinIndexArray[ offset_skin + 8 ]  = si3.x;
39050                 skinIndexArray[ offset_skin + 9 ]  = si3.y;
39051                 skinIndexArray[ offset_skin + 10 ] = si3.z;
39052                 skinIndexArray[ offset_skin + 11 ] = si3.w;
39053
39054                 offset_skin += 12;
39055
39056             }
39057
39058             for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {
39059
39060                 face = obj_faces[ chunk_faces4[ f ] ];
39061
39062                 // weights
39063
39064                 sw1 = obj_skinWeights[ face.a ];
39065                 sw2 = obj_skinWeights[ face.b ];
39066                 sw3 = obj_skinWeights[ face.c ];
39067                 sw4 = obj_skinWeights[ face.d ];
39068
39069                 skinWeightArray[ offset_skin ]     = sw1.x;
39070                 skinWeightArray[ offset_skin + 1 ] = sw1.y;
39071                 skinWeightArray[ offset_skin + 2 ] = sw1.z;
39072                 skinWeightArray[ offset_skin + 3 ] = sw1.w;
39073
39074                 skinWeightArray[ offset_skin + 4 ] = sw2.x;
39075                 skinWeightArray[ offset_skin + 5 ] = sw2.y;
39076                 skinWeightArray[ offset_skin + 6 ] = sw2.z;
39077                 skinWeightArray[ offset_skin + 7 ] = sw2.w;
39078
39079                 skinWeightArray[ offset_skin + 8 ]  = sw3.x;
39080                 skinWeightArray[ offset_skin + 9 ]  = sw3.y;
39081                 skinWeightArray[ offset_skin + 10 ] = sw3.z;
39082                 skinWeightArray[ offset_skin + 11 ] = sw3.w;
39083
39084                 skinWeightArray[ offset_skin + 12 ] = sw4.x;
39085                 skinWeightArray[ offset_skin + 13 ] = sw4.y;
39086                 skinWeightArray[ offset_skin + 14 ] = sw4.z;
39087                 skinWeightArray[ offset_skin + 15 ] = sw4.w;
39088
39089                 // indices
39090
39091                 si1 = obj_skinIndices[ face.a ];
39092                 si2 = obj_skinIndices[ face.b ];
39093                 si3 = obj_skinIndices[ face.c ];
39094                 si4 = obj_skinIndices[ face.d ];
39095
39096                 skinIndexArray[ offset_skin ]     = si1.x;
39097                 skinIndexArray[ offset_skin + 1 ] = si1.y;
39098                 skinIndexArray[ offset_skin + 2 ] = si1.z;
39099                 skinIndexArray[ offset_skin + 3 ] = si1.w;
39100
39101                 skinIndexArray[ offset_skin + 4 ] = si2.x;
39102                 skinIndexArray[ offset_skin + 5 ] = si2.y;
39103                 skinIndexArray[ offset_skin + 6 ] = si2.z;
39104                 skinIndexArray[ offset_skin + 7 ] = si2.w;
39105
39106                 skinIndexArray[ offset_skin + 8 ]  = si3.x;
39107                 skinIndexArray[ offset_skin + 9 ]  = si3.y;
39108                 skinIndexArray[ offset_skin + 10 ] = si3.z;
39109                 skinIndexArray[ offset_skin + 11 ] = si3.w;
39110
39111                 skinIndexArray[ offset_skin + 12 ] = si4.x;
39112                 skinIndexArray[ offset_skin + 13 ] = si4.y;
39113                 skinIndexArray[ offset_skin + 14 ] = si4.z;
39114                 skinIndexArray[ offset_skin + 15 ] = si4.w;
39115
39116                 offset_skin += 16;
39117
39118             }
39119
39120             if ( offset_skin > 0 ) {
39121
39122                 _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglSkinIndicesBuffer );
39123                 _gl.bufferData( _gl.ARRAY_BUFFER, skinIndexArray, hint );
39124
39125                 _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglSkinWeightsBuffer );
39126                 _gl.bufferData( _gl.ARRAY_BUFFER, skinWeightArray, hint );
39127
39128             }
39129
39130         }
39131
39132         if ( dirtyColors && vertexColorType ) {
39133
39134             for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {
39135
39136                 face = obj_faces[ chunk_faces3[ f ]    ];
39137
39138                 vertexColors = face.vertexColors;
39139                 faceColor = face.color;
39140
39141                 if ( vertexColors.length === 3 && vertexColorType === THREE.VertexColors ) {
39142
39143                     c1 = vertexColors[ 0 ];
39144                     c2 = vertexColors[ 1 ];
39145                     c3 = vertexColors[ 2 ];
39146
39147                 } else {
39148
39149                     c1 = faceColor;
39150                     c2 = faceColor;
39151                     c3 = faceColor;
39152
39153                 }
39154
39155                 colorArray[ offset_color ]     = c1.r;
39156                 colorArray[ offset_color + 1 ] = c1.g;
39157                 colorArray[ offset_color + 2 ] = c1.b;
39158
39159                 colorArray[ offset_color + 3 ] = c2.r;
39160                 colorArray[ offset_color + 4 ] = c2.g;
39161                 colorArray[ offset_color + 5 ] = c2.b;
39162
39163                 colorArray[ offset_color + 6 ] = c3.r;
39164                 colorArray[ offset_color + 7 ] = c3.g;
39165                 colorArray[ offset_color + 8 ] = c3.b;
39166
39167                 offset_color += 9;
39168
39169             }
39170
39171             for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {
39172
39173                 face = obj_faces[ chunk_faces4[ f ] ];
39174
39175                 vertexColors = face.vertexColors;
39176                 faceColor = face.color;
39177
39178                 if ( vertexColors.length === 4 && vertexColorType === THREE.VertexColors ) {
39179
39180                     c1 = vertexColors[ 0 ];
39181                     c2 = vertexColors[ 1 ];
39182                     c3 = vertexColors[ 2 ];
39183                     c4 = vertexColors[ 3 ];
39184
39185                 } else {
39186
39187                     c1 = faceColor;
39188                     c2 = faceColor;
39189                     c3 = faceColor;
39190                     c4 = faceColor;
39191
39192                 }
39193
39194                 colorArray[ offset_color ]     = c1.r;
39195                 colorArray[ offset_color + 1 ] = c1.g;
39196                 colorArray[ offset_color + 2 ] = c1.b;
39197
39198                 colorArray[ offset_color + 3 ] = c2.r;
39199                 colorArray[ offset_color + 4 ] = c2.g;
39200                 colorArray[ offset_color + 5 ] = c2.b;
39201
39202                 colorArray[ offset_color + 6 ] = c3.r;
39203                 colorArray[ offset_color + 7 ] = c3.g;
39204                 colorArray[ offset_color + 8 ] = c3.b;
39205
39206                 colorArray[ offset_color + 9 ]  = c4.r;
39207                 colorArray[ offset_color + 10 ] = c4.g;
39208                 colorArray[ offset_color + 11 ] = c4.b;
39209
39210                 offset_color += 12;
39211
39212             }
39213
39214             if ( offset_color > 0 ) {
39215
39216                 _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglColorBuffer );
39217                 _gl.bufferData( _gl.ARRAY_BUFFER, colorArray, hint );
39218
39219             }
39220
39221         }
39222
39223         if ( dirtyTangents && geometry.hasTangents ) {
39224
39225             for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {
39226
39227                 face = obj_faces[ chunk_faces3[ f ]    ];
39228
39229                 vertexTangents = face.vertexTangents;
39230
39231                 t1 = vertexTangents[ 0 ];
39232                 t2 = vertexTangents[ 1 ];
39233                 t3 = vertexTangents[ 2 ];
39234
39235                 tangentArray[ offset_tangent ]     = t1.x;
39236                 tangentArray[ offset_tangent + 1 ] = t1.y;
39237                 tangentArray[ offset_tangent + 2 ] = t1.z;
39238                 tangentArray[ offset_tangent + 3 ] = t1.w;
39239
39240                 tangentArray[ offset_tangent + 4 ] = t2.x;
39241                 tangentArray[ offset_tangent + 5 ] = t2.y;
39242                 tangentArray[ offset_tangent + 6 ] = t2.z;
39243                 tangentArray[ offset_tangent + 7 ] = t2.w;
39244
39245                 tangentArray[ offset_tangent + 8 ]  = t3.x;
39246                 tangentArray[ offset_tangent + 9 ]  = t3.y;
39247                 tangentArray[ offset_tangent + 10 ] = t3.z;
39248                 tangentArray[ offset_tangent + 11 ] = t3.w;
39249
39250                 offset_tangent += 12;
39251
39252             }
39253
39254             for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {
39255
39256                 face = obj_faces[ chunk_faces4[ f ] ];
39257
39258                 vertexTangents = face.vertexTangents;
39259
39260                 t1 = vertexTangents[ 0 ];
39261                 t2 = vertexTangents[ 1 ];
39262                 t3 = vertexTangents[ 2 ];
39263                 t4 = vertexTangents[ 3 ];
39264
39265                 tangentArray[ offset_tangent ]     = t1.x;
39266                 tangentArray[ offset_tangent + 1 ] = t1.y;
39267                 tangentArray[ offset_tangent + 2 ] = t1.z;
39268                 tangentArray[ offset_tangent + 3 ] = t1.w;
39269
39270                 tangentArray[ offset_tangent + 4 ] = t2.x;
39271                 tangentArray[ offset_tangent + 5 ] = t2.y;
39272                 tangentArray[ offset_tangent + 6 ] = t2.z;
39273                 tangentArray[ offset_tangent + 7 ] = t2.w;
39274
39275                 tangentArray[ offset_tangent + 8 ]  = t3.x;
39276                 tangentArray[ offset_tangent + 9 ]  = t3.y;
39277                 tangentArray[ offset_tangent + 10 ] = t3.z;
39278                 tangentArray[ offset_tangent + 11 ] = t3.w;
39279
39280                 tangentArray[ offset_tangent + 12 ] = t4.x;
39281                 tangentArray[ offset_tangent + 13 ] = t4.y;
39282                 tangentArray[ offset_tangent + 14 ] = t4.z;
39283                 tangentArray[ offset_tangent + 15 ] = t4.w;
39284
39285                 offset_tangent += 16;
39286
39287             }
39288
39289             _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglTangentBuffer );
39290             _gl.bufferData( _gl.ARRAY_BUFFER, tangentArray, hint );
39291
39292         }
39293
39294         if ( dirtyNormals && normalType ) {
39295
39296             for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {
39297
39298                 face = obj_faces[ chunk_faces3[ f ]    ];
39299
39300                 vertexNormals = face.vertexNormals;
39301                 faceNormal = face.normal;
39302
39303                 if ( vertexNormals.length === 3 && needsSmoothNormals ) {
39304
39305                     for ( i = 0; i < 3; i ++ ) {
39306
39307                         vn = vertexNormals[ i ];
39308
39309                         normalArray[ offset_normal ]     = vn.x;
39310                         normalArray[ offset_normal + 1 ] = vn.y;
39311                         normalArray[ offset_normal + 2 ] = vn.z;
39312
39313                         offset_normal += 3;
39314
39315                     }
39316
39317                 } else {
39318
39319                     for ( i = 0; i < 3; i ++ ) {
39320
39321                         normalArray[ offset_normal ]     = faceNormal.x;
39322                         normalArray[ offset_normal + 1 ] = faceNormal.y;
39323                         normalArray[ offset_normal + 2 ] = faceNormal.z;
39324
39325                         offset_normal += 3;
39326
39327                     }
39328
39329                 }
39330
39331             }
39332
39333             for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {
39334
39335                 face = obj_faces[ chunk_faces4[ f ] ];
39336
39337                 vertexNormals = face.vertexNormals;
39338                 faceNormal = face.normal;
39339
39340                 if ( vertexNormals.length === 4 && needsSmoothNormals ) {
39341
39342                     for ( i = 0; i < 4; i ++ ) {
39343
39344                         vn = vertexNormals[ i ];
39345
39346                         normalArray[ offset_normal ]     = vn.x;
39347                         normalArray[ offset_normal + 1 ] = vn.y;
39348                         normalArray[ offset_normal + 2 ] = vn.z;
39349
39350                         offset_normal += 3;
39351
39352                     }
39353
39354                 } else {
39355
39356                     for ( i = 0; i < 4; i ++ ) {
39357
39358                         normalArray[ offset_normal ]     = faceNormal.x;
39359                         normalArray[ offset_normal + 1 ] = faceNormal.y;
39360                         normalArray[ offset_normal + 2 ] = faceNormal.z;
39361
39362                         offset_normal += 3;
39363
39364                     }
39365
39366                 }
39367
39368             }
39369
39370             _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglNormalBuffer );
39371             _gl.bufferData( _gl.ARRAY_BUFFER, normalArray, hint );
39372
39373         }
39374
39375         if ( dirtyUvs && obj_uvs && uvType ) {
39376
39377             for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {
39378
39379                 fi = chunk_faces3[ f ];
39380
39381                 face = obj_faces[ fi ];
39382                 uv = obj_uvs[ fi ];
39383
39384                 if ( uv === undefined ) continue;
39385
39386                 for ( i = 0; i < 3; i ++ ) {
39387
39388                     uvi = uv[ i ];
39389
39390                     uvArray[ offset_uv ]     = uvi.u;
39391                     uvArray[ offset_uv + 1 ] = uvi.v;
39392
39393                     offset_uv += 2;
39394
39395                 }
39396
39397             }
39398
39399             for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {
39400
39401                 fi = chunk_faces4[ f ];
39402
39403                 face = obj_faces[ fi ];
39404                 uv = obj_uvs[ fi ];
39405
39406                 if ( uv === undefined ) continue;
39407
39408                 for ( i = 0; i < 4; i ++ ) {
39409
39410                     uvi = uv[ i ];
39411
39412                     uvArray[ offset_uv ]     = uvi.u;
39413                     uvArray[ offset_uv + 1 ] = uvi.v;
39414
39415                     offset_uv += 2;
39416
39417                 }
39418
39419             }
39420
39421             if ( offset_uv > 0 ) {
39422
39423                 _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglUVBuffer );
39424                 _gl.bufferData( _gl.ARRAY_BUFFER, uvArray, hint );
39425
39426             }
39427
39428         }
39429
39430         if ( dirtyUvs && obj_uvs2 && uvType ) {
39431
39432             for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {
39433
39434                 fi = chunk_faces3[ f ];
39435
39436                 face = obj_faces[ fi ];
39437                 uv2 = obj_uvs2[ fi ];
39438
39439                 if ( uv2 === undefined ) continue;
39440
39441                 for ( i = 0; i < 3; i ++ ) {
39442
39443                     uv2i = uv2[ i ];
39444
39445                     uv2Array[ offset_uv2 ]     = uv2i.u;
39446                     uv2Array[ offset_uv2 + 1 ] = uv2i.v;
39447
39448                     offset_uv2 += 2;
39449
39450                 }
39451
39452             }
39453
39454             for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {
39455
39456                 fi = chunk_faces4[ f ];
39457
39458                 face = obj_faces[ fi ];
39459                 uv2 = obj_uvs2[ fi ];
39460
39461                 if ( uv2 === undefined ) continue;
39462
39463                 for ( i = 0; i < 4; i ++ ) {
39464
39465                     uv2i = uv2[ i ];
39466
39467                     uv2Array[ offset_uv2 ]     = uv2i.u;
39468                     uv2Array[ offset_uv2 + 1 ] = uv2i.v;
39469
39470                     offset_uv2 += 2;
39471
39472                 }
39473
39474             }
39475
39476             if ( offset_uv2 > 0 ) {
39477
39478                 _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglUV2Buffer );
39479                 _gl.bufferData( _gl.ARRAY_BUFFER, uv2Array, hint );
39480
39481             }
39482
39483         }
39484
39485         if ( dirtyElements ) {
39486
39487             for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {
39488
39489                 face = obj_faces[ chunk_faces3[ f ]    ];
39490
39491                 faceArray[ offset_face ]      = vertexIndex;
39492                 faceArray[ offset_face + 1 ] = vertexIndex + 1;
39493                 faceArray[ offset_face + 2 ] = vertexIndex + 2;
39494
39495                 offset_face += 3;
39496
39497                 lineArray[ offset_line ]     = vertexIndex;
39498                 lineArray[ offset_line + 1 ] = vertexIndex + 1;
39499
39500                 lineArray[ offset_line + 2 ] = vertexIndex;
39501                 lineArray[ offset_line + 3 ] = vertexIndex + 2;
39502
39503                 lineArray[ offset_line + 4 ] = vertexIndex + 1;
39504                 lineArray[ offset_line + 5 ] = vertexIndex + 2;
39505
39506                 offset_line += 6;
39507
39508                 vertexIndex += 3;
39509
39510             }
39511
39512             for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {
39513
39514                 face = obj_faces[ chunk_faces4[ f ] ];
39515
39516                 faceArray[ offset_face ]     = vertexIndex;
39517                 faceArray[ offset_face + 1 ] = vertexIndex + 1;
39518                 faceArray[ offset_face + 2 ] = vertexIndex + 3;
39519
39520                 faceArray[ offset_face + 3 ] = vertexIndex + 1;
39521                 faceArray[ offset_face + 4 ] = vertexIndex + 2;
39522                 faceArray[ offset_face + 5 ] = vertexIndex + 3;
39523
39524                 offset_face += 6;
39525
39526                 lineArray[ offset_line ]     = vertexIndex;
39527                 lineArray[ offset_line + 1 ] = vertexIndex + 1;
39528
39529                 lineArray[ offset_line + 2 ] = vertexIndex;
39530                 lineArray[ offset_line + 3 ] = vertexIndex + 3;
39531
39532                 lineArray[ offset_line + 4 ] = vertexIndex + 1;
39533                 lineArray[ offset_line + 5 ] = vertexIndex + 2;
39534
39535                 lineArray[ offset_line + 6 ] = vertexIndex + 2;
39536                 lineArray[ offset_line + 7 ] = vertexIndex + 3;
39537
39538                 offset_line += 8;
39539
39540                 vertexIndex += 4;
39541
39542             }
39543
39544             _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryGroup.__webglFaceBuffer );
39545             _gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, faceArray, hint );
39546
39547             _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryGroup.__webglLineBuffer );
39548             _gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, lineArray, hint );
39549
39550         }
39551
39552         if ( customAttributes ) {
39553
39554             for ( i = 0, il = customAttributes.length; i < il; i ++ ) {
39555
39556                 customAttribute = customAttributes[ i ];
39557
39558                 if ( ! customAttribute.__original.needsUpdate ) continue;
39559
39560                 offset_custom = 0;
39561                 offset_customSrc = 0;
39562
39563                 if ( customAttribute.size === 1 ) {
39564
39565                     if ( customAttribute.boundTo === undefined || customAttribute.boundTo === "vertices" ) {
39566
39567                         for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {
39568
39569                             face = obj_faces[ chunk_faces3[ f ]    ];
39570
39571                             customAttribute.array[ offset_custom ]        = customAttribute.value[ face.a ];
39572                             customAttribute.array[ offset_custom + 1 ] = customAttribute.value[ face.b ];
39573                             customAttribute.array[ offset_custom + 2 ] = customAttribute.value[ face.c ];
39574
39575                             offset_custom += 3;
39576
39577                         }
39578
39579                         for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {
39580
39581                             face = obj_faces[ chunk_faces4[ f ] ];
39582
39583                             customAttribute.array[ offset_custom ]        = customAttribute.value[ face.a ];
39584                             customAttribute.array[ offset_custom + 1 ] = customAttribute.value[ face.b ];
39585                             customAttribute.array[ offset_custom + 2 ] = customAttribute.value[ face.c ];
39586                             customAttribute.array[ offset_custom + 3 ] = customAttribute.value[ face.d ];
39587
39588                             offset_custom += 4;
39589
39590                         }
39591
39592                     } else if ( customAttribute.boundTo === "faces" ) {
39593
39594                         for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {
39595
39596                             value = customAttribute.value[ chunk_faces3[ f ] ];
39597
39598                             customAttribute.array[ offset_custom ]        = value;
39599                             customAttribute.array[ offset_custom + 1 ] = value;
39600                             customAttribute.array[ offset_custom + 2 ] = value;
39601
39602                             offset_custom += 3;
39603
39604                         }
39605
39606                         for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {
39607
39608                             value = customAttribute.value[ chunk_faces4[ f ] ];
39609
39610                             customAttribute.array[ offset_custom ]        = value;
39611                             customAttribute.array[ offset_custom + 1 ] = value;
39612                             customAttribute.array[ offset_custom + 2 ] = value;
39613                             customAttribute.array[ offset_custom + 3 ] = value;
39614
39615                             offset_custom += 4;
39616
39617                         }
39618
39619                     }
39620
39621                 } else if ( customAttribute.size === 2 ) {
39622
39623                     if ( customAttribute.boundTo === undefined || customAttribute.boundTo === "vertices" ) {
39624
39625                         for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {
39626
39627                             face = obj_faces[ chunk_faces3[ f ]    ];
39628
39629                             v1 = customAttribute.value[ face.a ];
39630                             v2 = customAttribute.value[ face.b ];
39631                             v3 = customAttribute.value[ face.c ];
39632
39633                             customAttribute.array[ offset_custom ]        = v1.x;
39634                             customAttribute.array[ offset_custom + 1 ] = v1.y;
39635
39636                             customAttribute.array[ offset_custom + 2 ] = v2.x;
39637                             customAttribute.array[ offset_custom + 3 ] = v2.y;
39638
39639                             customAttribute.array[ offset_custom + 4 ] = v3.x;
39640                             customAttribute.array[ offset_custom + 5 ] = v3.y;
39641
39642                             offset_custom += 6;
39643
39644                         }
39645
39646                         for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {
39647
39648                             face = obj_faces[ chunk_faces4[ f ] ];
39649
39650                             v1 = customAttribute.value[ face.a ];
39651                             v2 = customAttribute.value[ face.b ];
39652                             v3 = customAttribute.value[ face.c ];
39653                             v4 = customAttribute.value[ face.d ];
39654
39655                             customAttribute.array[ offset_custom ]        = v1.x;
39656                             customAttribute.array[ offset_custom + 1 ] = v1.y;
39657
39658                             customAttribute.array[ offset_custom + 2 ] = v2.x;
39659                             customAttribute.array[ offset_custom + 3 ] = v2.y;
39660
39661                             customAttribute.array[ offset_custom + 4 ] = v3.x;
39662                             customAttribute.array[ offset_custom + 5 ] = v3.y;
39663
39664                             customAttribute.array[ offset_custom + 6 ] = v4.x;
39665                             customAttribute.array[ offset_custom + 7 ] = v4.y;
39666
39667                             offset_custom += 8;
39668
39669                         }
39670
39671                     } else if ( customAttribute.boundTo === "faces" ) {
39672
39673                         for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {
39674
39675                             value = customAttribute.value[ chunk_faces3[ f ] ];
39676
39677                             v1 = value;
39678                             v2 = value;
39679                             v3 = value;
39680
39681                             customAttribute.array[ offset_custom ]        = v1.x;
39682                             customAttribute.array[ offset_custom + 1 ] = v1.y;
39683
39684                             customAttribute.array[ offset_custom + 2 ] = v2.x;
39685                             customAttribute.array[ offset_custom + 3 ] = v2.y;
39686
39687                             customAttribute.array[ offset_custom + 4 ] = v3.x;
39688                             customAttribute.array[ offset_custom + 5 ] = v3.y;
39689
39690                             offset_custom += 6;
39691
39692                         }
39693
39694                         for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {
39695
39696                             value = customAttribute.value[ chunk_faces4[ f ] ];
39697
39698                             v1 = value;
39699                             v2 = value;
39700                             v3 = value;
39701                             v4 = value;
39702
39703                             customAttribute.array[ offset_custom ]        = v1.x;
39704                             customAttribute.array[ offset_custom + 1 ] = v1.y;
39705
39706                             customAttribute.array[ offset_custom + 2 ] = v2.x;
39707                             customAttribute.array[ offset_custom + 3 ] = v2.y;
39708
39709                             customAttribute.array[ offset_custom + 4 ] = v3.x;
39710                             customAttribute.array[ offset_custom + 5 ] = v3.y;
39711
39712                             customAttribute.array[ offset_custom + 6 ] = v4.x;
39713                             customAttribute.array[ offset_custom + 7 ] = v4.y;
39714
39715                             offset_custom += 8;
39716
39717                         }
39718
39719                     }
39720
39721                 } else if ( customAttribute.size === 3 ) {
39722
39723                     var pp;
39724
39725                     if ( customAttribute.type === "c" ) {
39726
39727                         pp = [ "r", "g", "b" ];
39728
39729                     } else {
39730
39731                         pp = [ "x", "y", "z" ];
39732
39733                     }
39734
39735                     if ( customAttribute.boundTo === undefined || customAttribute.boundTo === "vertices" ) {
39736
39737                         for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {
39738
39739                             face = obj_faces[ chunk_faces3[ f ]    ];
39740
39741                             v1 = customAttribute.value[ face.a ];
39742                             v2 = customAttribute.value[ face.b ];
39743                             v3 = customAttribute.value[ face.c ];
39744
39745                             customAttribute.array[ offset_custom ]        = v1[ pp[ 0 ] ];
39746                             customAttribute.array[ offset_custom + 1 ] = v1[ pp[ 1 ] ];
39747                             customAttribute.array[ offset_custom + 2 ] = v1[ pp[ 2 ] ];
39748
39749                             customAttribute.array[ offset_custom + 3 ] = v2[ pp[ 0 ] ];
39750                             customAttribute.array[ offset_custom + 4 ] = v2[ pp[ 1 ] ];
39751                             customAttribute.array[ offset_custom + 5 ] = v2[ pp[ 2 ] ];
39752
39753                             customAttribute.array[ offset_custom + 6 ] = v3[ pp[ 0 ] ];
39754                             customAttribute.array[ offset_custom + 7 ] = v3[ pp[ 1 ] ];
39755                             customAttribute.array[ offset_custom + 8 ] = v3[ pp[ 2 ] ];
39756
39757                             offset_custom += 9;
39758
39759                         }
39760
39761                         for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {
39762
39763                             face = obj_faces[ chunk_faces4[ f ] ];
39764
39765                             v1 = customAttribute.value[ face.a ];
39766                             v2 = customAttribute.value[ face.b ];
39767                             v3 = customAttribute.value[ face.c ];
39768                             v4 = customAttribute.value[ face.d ];
39769
39770                             customAttribute.array[ offset_custom  ]     = v1[ pp[ 0 ] ];
39771                             customAttribute.array[ offset_custom + 1  ] = v1[ pp[ 1 ] ];
39772                             customAttribute.array[ offset_custom + 2  ] = v1[ pp[ 2 ] ];
39773
39774                             customAttribute.array[ offset_custom + 3  ] = v2[ pp[ 0 ] ];
39775                             customAttribute.array[ offset_custom + 4  ] = v2[ pp[ 1 ] ];
39776                             customAttribute.array[ offset_custom + 5  ] = v2[ pp[ 2 ] ];
39777
39778                             customAttribute.array[ offset_custom + 6  ] = v3[ pp[ 0 ] ];
39779                             customAttribute.array[ offset_custom + 7  ] = v3[ pp[ 1 ] ];
39780                             customAttribute.array[ offset_custom + 8  ] = v3[ pp[ 2 ] ];
39781
39782                             customAttribute.array[ offset_custom + 9  ] = v4[ pp[ 0 ] ];
39783                             customAttribute.array[ offset_custom + 10 ] = v4[ pp[ 1 ] ];
39784                             customAttribute.array[ offset_custom + 11 ] = v4[ pp[ 2 ] ];
39785
39786                             offset_custom += 12;
39787
39788                         }
39789
39790                     } else if ( customAttribute.boundTo === "faces" ) {
39791
39792                         for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {
39793
39794                             value = customAttribute.value[ chunk_faces3[ f ] ];
39795
39796                             v1 = value;
39797                             v2 = value;
39798                             v3 = value;
39799
39800                             customAttribute.array[ offset_custom ]        = v1[ pp[ 0 ] ];
39801                             customAttribute.array[ offset_custom + 1 ] = v1[ pp[ 1 ] ];
39802                             customAttribute.array[ offset_custom + 2 ] = v1[ pp[ 2 ] ];
39803
39804                             customAttribute.array[ offset_custom + 3 ] = v2[ pp[ 0 ] ];
39805                             customAttribute.array[ offset_custom + 4 ] = v2[ pp[ 1 ] ];
39806                             customAttribute.array[ offset_custom + 5 ] = v2[ pp[ 2 ] ];
39807
39808                             customAttribute.array[ offset_custom + 6 ] = v3[ pp[ 0 ] ];
39809                             customAttribute.array[ offset_custom + 7 ] = v3[ pp[ 1 ] ];
39810                             customAttribute.array[ offset_custom + 8 ] = v3[ pp[ 2 ] ];
39811
39812                             offset_custom += 9;
39813
39814                         }
39815
39816                         for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {
39817
39818                             value = customAttribute.value[ chunk_faces4[ f ] ];
39819
39820                             v1 = value;
39821                             v2 = value;
39822                             v3 = value;
39823                             v4 = value;
39824
39825                             customAttribute.array[ offset_custom  ]     = v1[ pp[ 0 ] ];
39826                             customAttribute.array[ offset_custom + 1  ] = v1[ pp[ 1 ] ];
39827                             customAttribute.array[ offset_custom + 2  ] = v1[ pp[ 2 ] ];
39828
39829                             customAttribute.array[ offset_custom + 3  ] = v2[ pp[ 0 ] ];
39830                             customAttribute.array[ offset_custom + 4  ] = v2[ pp[ 1 ] ];
39831                             customAttribute.array[ offset_custom + 5  ] = v2[ pp[ 2 ] ];
39832
39833                             customAttribute.array[ offset_custom + 6  ] = v3[ pp[ 0 ] ];
39834                             customAttribute.array[ offset_custom + 7  ] = v3[ pp[ 1 ] ];
39835                             customAttribute.array[ offset_custom + 8  ] = v3[ pp[ 2 ] ];
39836
39837                             customAttribute.array[ offset_custom + 9  ] = v4[ pp[ 0 ] ];
39838                             customAttribute.array[ offset_custom + 10 ] = v4[ pp[ 1 ] ];
39839                             customAttribute.array[ offset_custom + 11 ] = v4[ pp[ 2 ] ];
39840
39841                             offset_custom += 12;
39842
39843                         }
39844
39845                     } else if ( customAttribute.boundTo === "faceVertices" ) {
39846
39847                         for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {
39848
39849                             value = customAttribute.value[ chunk_faces3[ f ] ];
39850
39851                             v1 = value[ 0 ];
39852                             v2 = value[ 1 ];
39853                             v3 = value[ 2 ];
39854
39855                             customAttribute.array[ offset_custom ]        = v1[ pp[ 0 ] ];
39856                             customAttribute.array[ offset_custom + 1 ] = v1[ pp[ 1 ] ];
39857                             customAttribute.array[ offset_custom + 2 ] = v1[ pp[ 2 ] ];
39858
39859                             customAttribute.array[ offset_custom + 3 ] = v2[ pp[ 0 ] ];
39860                             customAttribute.array[ offset_custom + 4 ] = v2[ pp[ 1 ] ];
39861                             customAttribute.array[ offset_custom + 5 ] = v2[ pp[ 2 ] ];
39862
39863                             customAttribute.array[ offset_custom + 6 ] = v3[ pp[ 0 ] ];
39864                             customAttribute.array[ offset_custom + 7 ] = v3[ pp[ 1 ] ];
39865                             customAttribute.array[ offset_custom + 8 ] = v3[ pp[ 2 ] ];
39866
39867                             offset_custom += 9;
39868
39869                         }
39870
39871                         for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {
39872
39873                             value = customAttribute.value[ chunk_faces4[ f ] ];
39874
39875                             v1 = value[ 0 ];
39876                             v2 = value[ 1 ];
39877                             v3 = value[ 2 ];
39878                             v4 = value[ 3 ];
39879
39880                             customAttribute.array[ offset_custom  ]     = v1[ pp[ 0 ] ];
39881                             customAttribute.array[ offset_custom + 1  ] = v1[ pp[ 1 ] ];
39882                             customAttribute.array[ offset_custom + 2  ] = v1[ pp[ 2 ] ];
39883
39884                             customAttribute.array[ offset_custom + 3  ] = v2[ pp[ 0 ] ];
39885                             customAttribute.array[ offset_custom + 4  ] = v2[ pp[ 1 ] ];
39886                             customAttribute.array[ offset_custom + 5  ] = v2[ pp[ 2 ] ];
39887
39888                             customAttribute.array[ offset_custom + 6  ] = v3[ pp[ 0 ] ];
39889                             customAttribute.array[ offset_custom + 7  ] = v3[ pp[ 1 ] ];
39890                             customAttribute.array[ offset_custom + 8  ] = v3[ pp[ 2 ] ];
39891
39892                             customAttribute.array[ offset_custom + 9  ] = v4[ pp[ 0 ] ];
39893                             customAttribute.array[ offset_custom + 10 ] = v4[ pp[ 1 ] ];
39894                             customAttribute.array[ offset_custom + 11 ] = v4[ pp[ 2 ] ];
39895
39896                             offset_custom += 12;
39897
39898                         }
39899
39900                     }
39901
39902                 } else if ( customAttribute.size === 4 ) {
39903
39904                     if ( customAttribute.boundTo === undefined || customAttribute.boundTo === "vertices" ) {
39905
39906                         for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {
39907
39908                             face = obj_faces[ chunk_faces3[ f ]    ];
39909
39910                             v1 = customAttribute.value[ face.a ];
39911                             v2 = customAttribute.value[ face.b ];
39912                             v3 = customAttribute.value[ face.c ];
39913
39914                             customAttribute.array[ offset_custom  ]     = v1.x;
39915                             customAttribute.array[ offset_custom + 1  ] = v1.y;
39916                             customAttribute.array[ offset_custom + 2  ] = v1.z;
39917                             customAttribute.array[ offset_custom + 3  ] = v1.w;
39918
39919                             customAttribute.array[ offset_custom + 4  ] = v2.x;
39920                             customAttribute.array[ offset_custom + 5  ] = v2.y;
39921                             customAttribute.array[ offset_custom + 6  ] = v2.z;
39922                             customAttribute.array[ offset_custom + 7  ] = v2.w;
39923
39924                             customAttribute.array[ offset_custom + 8  ] = v3.x;
39925                             customAttribute.array[ offset_custom + 9  ] = v3.y;
39926                             customAttribute.array[ offset_custom + 10 ] = v3.z;
39927                             customAttribute.array[ offset_custom + 11 ] = v3.w;
39928
39929                             offset_custom += 12;
39930
39931                         }
39932
39933                         for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {
39934
39935                             face = obj_faces[ chunk_faces4[ f ] ];
39936
39937                             v1 = customAttribute.value[ face.a ];
39938                             v2 = customAttribute.value[ face.b ];
39939                             v3 = customAttribute.value[ face.c ];
39940                             v4 = customAttribute.value[ face.d ];
39941
39942                             customAttribute.array[ offset_custom  ]     = v1.x;
39943                             customAttribute.array[ offset_custom + 1  ] = v1.y;
39944                             customAttribute.array[ offset_custom + 2  ] = v1.z;
39945                             customAttribute.array[ offset_custom + 3  ] = v1.w;
39946
39947                             customAttribute.array[ offset_custom + 4  ] = v2.x;
39948                             customAttribute.array[ offset_custom + 5  ] = v2.y;
39949                             customAttribute.array[ offset_custom + 6  ] = v2.z;
39950                             customAttribute.array[ offset_custom + 7  ] = v2.w;
39951
39952                             customAttribute.array[ offset_custom + 8  ] = v3.x;
39953                             customAttribute.array[ offset_custom + 9  ] = v3.y;
39954                             customAttribute.array[ offset_custom + 10 ] = v3.z;
39955                             customAttribute.array[ offset_custom + 11 ] = v3.w;
39956
39957                             customAttribute.array[ offset_custom + 12 ] = v4.x;
39958                             customAttribute.array[ offset_custom + 13 ] = v4.y;
39959                             customAttribute.array[ offset_custom + 14 ] = v4.z;
39960                             customAttribute.array[ offset_custom + 15 ] = v4.w;
39961
39962                             offset_custom += 16;
39963
39964                         }
39965
39966                     } else if ( customAttribute.boundTo === "faces" ) {
39967
39968                         for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {
39969
39970                             value = customAttribute.value[ chunk_faces3[ f ] ];
39971
39972                             v1 = value;
39973                             v2 = value;
39974                             v3 = value;
39975
39976                             customAttribute.array[ offset_custom  ]     = v1.x;
39977                             customAttribute.array[ offset_custom + 1  ] = v1.y;
39978                             customAttribute.array[ offset_custom + 2  ] = v1.z;
39979                             customAttribute.array[ offset_custom + 3  ] = v1.w;
39980
39981                             customAttribute.array[ offset_custom + 4  ] = v2.x;
39982                             customAttribute.array[ offset_custom + 5  ] = v2.y;
39983                             customAttribute.array[ offset_custom + 6  ] = v2.z;
39984                             customAttribute.array[ offset_custom + 7  ] = v2.w;
39985
39986                             customAttribute.array[ offset_custom + 8  ] = v3.x;
39987                             customAttribute.array[ offset_custom + 9  ] = v3.y;
39988                             customAttribute.array[ offset_custom + 10 ] = v3.z;
39989                             customAttribute.array[ offset_custom + 11 ] = v3.w;
39990
39991                             offset_custom += 12;
39992
39993                         }
39994
39995                         for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {
39996
39997                             value = customAttribute.value[ chunk_faces4[ f ] ];
39998
39999                             v1 = value;
40000                             v2 = value;
40001                             v3 = value;
40002                             v4 = value;
40003
40004                             customAttribute.array[ offset_custom  ]     = v1.x;
40005                             customAttribute.array[ offset_custom + 1  ] = v1.y;
40006                             customAttribute.array[ offset_custom + 2  ] = v1.z;
40007                             customAttribute.array[ offset_custom + 3  ] = v1.w;
40008
40009                             customAttribute.array[ offset_custom + 4  ] = v2.x;
40010                             customAttribute.array[ offset_custom + 5  ] = v2.y;
40011                             customAttribute.array[ offset_custom + 6  ] = v2.z;
40012                             customAttribute.array[ offset_custom + 7  ] = v2.w;
40013
40014                             customAttribute.array[ offset_custom + 8  ] = v3.x;
40015                             customAttribute.array[ offset_custom + 9  ] = v3.y;
40016                             customAttribute.array[ offset_custom + 10 ] = v3.z;
40017                             customAttribute.array[ offset_custom + 11 ] = v3.w;
40018
40019                             customAttribute.array[ offset_custom + 12 ] = v4.x;
40020                             customAttribute.array[ offset_custom + 13 ] = v4.y;
40021                             customAttribute.array[ offset_custom + 14 ] = v4.z;
40022                             customAttribute.array[ offset_custom + 15 ] = v4.w;
40023
40024                             offset_custom += 16;
40025
40026                         }
40027
40028                     } else if ( customAttribute.boundTo === "faceVertices" ) {
40029
40030                         for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {
40031
40032                             value = customAttribute.value[ chunk_faces3[ f ] ];
40033
40034                             v1 = value[ 0 ];
40035                             v2 = value[ 1 ];
40036                             v3 = value[ 2 ];
40037
40038                             customAttribute.array[ offset_custom  ]     = v1.x;
40039                             customAttribute.array[ offset_custom + 1  ] = v1.y;
40040                             customAttribute.array[ offset_custom + 2  ] = v1.z;
40041                             customAttribute.array[ offset_custom + 3  ] = v1.w;
40042
40043                             customAttribute.array[ offset_custom + 4  ] = v2.x;
40044                             customAttribute.array[ offset_custom + 5  ] = v2.y;
40045                             customAttribute.array[ offset_custom + 6  ] = v2.z;
40046                             customAttribute.array[ offset_custom + 7  ] = v2.w;
40047
40048                             customAttribute.array[ offset_custom + 8  ] = v3.x;
40049                             customAttribute.array[ offset_custom + 9  ] = v3.y;
40050                             customAttribute.array[ offset_custom + 10 ] = v3.z;
40051                             customAttribute.array[ offset_custom + 11 ] = v3.w;
40052
40053                             offset_custom += 12;
40054
40055                         }
40056
40057                         for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {
40058
40059                             value = customAttribute.value[ chunk_faces4[ f ] ];
40060
40061                             v1 = value[ 0 ];
40062                             v2 = value[ 1 ];
40063                             v3 = value[ 2 ];
40064                             v4 = value[ 3 ];
40065
40066                             customAttribute.array[ offset_custom  ]     = v1.x;
40067                             customAttribute.array[ offset_custom + 1  ] = v1.y;
40068                             customAttribute.array[ offset_custom + 2  ] = v1.z;
40069                             customAttribute.array[ offset_custom + 3  ] = v1.w;
40070
40071                             customAttribute.array[ offset_custom + 4  ] = v2.x;
40072                             customAttribute.array[ offset_custom + 5  ] = v2.y;
40073                             customAttribute.array[ offset_custom + 6  ] = v2.z;
40074                             customAttribute.array[ offset_custom + 7  ] = v2.w;
40075
40076                             customAttribute.array[ offset_custom + 8  ] = v3.x;
40077                             customAttribute.array[ offset_custom + 9  ] = v3.y;
40078                             customAttribute.array[ offset_custom + 10 ] = v3.z;
40079                             customAttribute.array[ offset_custom + 11 ] = v3.w;
40080
40081                             customAttribute.array[ offset_custom + 12 ] = v4.x;
40082                             customAttribute.array[ offset_custom + 13 ] = v4.y;
40083                             customAttribute.array[ offset_custom + 14 ] = v4.z;
40084                             customAttribute.array[ offset_custom + 15 ] = v4.w;
40085
40086                             offset_custom += 16;
40087
40088                         }
40089
40090                     }
40091
40092                 }
40093
40094                 _gl.bindBuffer( _gl.ARRAY_BUFFER, customAttribute.buffer );
40095                 _gl.bufferData( _gl.ARRAY_BUFFER, customAttribute.array, hint );
40096
40097             }
40098
40099         }
40100
40101         if ( dispose ) {
40102
40103             delete geometryGroup.__inittedArrays;
40104             delete geometryGroup.__colorArray;
40105             delete geometryGroup.__normalArray;
40106             delete geometryGroup.__tangentArray;
40107             delete geometryGroup.__uvArray;
40108             delete geometryGroup.__uv2Array;
40109             delete geometryGroup.__faceArray;
40110             delete geometryGroup.__vertexArray;
40111             delete geometryGroup.__lineArray;
40112             delete geometryGroup.__skinIndexArray;
40113             delete geometryGroup.__skinWeightArray;
40114
40115         }
40116
40117     };
40118
40119     function setDirectBuffers ( geometry, hint, dispose ) {
40120
40121         var attributes = geometry.attributes;
40122
40123         var index = attributes[ "index" ];
40124         var position = attributes[ "position" ];
40125         var normal = attributes[ "normal" ];
40126         var uv = attributes[ "uv" ];
40127         var color = attributes[ "color" ];
40128         var tangent = attributes[ "tangent" ];
40129
40130         if ( geometry.elementsNeedUpdate && index !== undefined ) {
40131
40132             _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, index.buffer );
40133             _gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, index.array, hint );
40134
40135         }
40136
40137         if ( geometry.verticesNeedUpdate && position !== undefined ) {
40138
40139             _gl.bindBuffer( _gl.ARRAY_BUFFER, position.buffer );
40140             _gl.bufferData( _gl.ARRAY_BUFFER, position.array, hint );
40141
40142         }
40143
40144         if ( geometry.normalsNeedUpdate && normal !== undefined ) {
40145
40146             _gl.bindBuffer( _gl.ARRAY_BUFFER, normal.buffer );
40147             _gl.bufferData( _gl.ARRAY_BUFFER, normal.array, hint );
40148
40149         }
40150
40151         if ( geometry.uvsNeedUpdate && uv !== undefined ) {
40152
40153             _gl.bindBuffer( _gl.ARRAY_BUFFER, uv.buffer );
40154             _gl.bufferData( _gl.ARRAY_BUFFER, uv.array, hint );
40155
40156         }
40157
40158         if ( geometry.colorsNeedUpdate && color !== undefined ) {
40159
40160             _gl.bindBuffer( _gl.ARRAY_BUFFER, color.buffer );
40161             _gl.bufferData( _gl.ARRAY_BUFFER, color.array, hint );
40162
40163         }
40164
40165         if ( geometry.tangentsNeedUpdate && tangent !== undefined ) {
40166
40167             _gl.bindBuffer( _gl.ARRAY_BUFFER, tangent.buffer );
40168             _gl.bufferData( _gl.ARRAY_BUFFER, tangent.array, hint );
40169
40170         }
40171
40172         if ( dispose ) {
40173
40174             for ( var i in geometry.attributes ) {
40175
40176                 delete geometry.attributes[ i ].array;
40177
40178             }
40179
40180         }
40181
40182     };
40183
40184     // Buffer rendering
40185
40186     this.renderBufferImmediate = function ( object, program, material ) {
40187
40188         if ( object.hasPositions && ! object.__webglVertexBuffer ) object.__webglVertexBuffer = _gl.createBuffer();
40189         if ( object.hasNormals && ! object.__webglNormalBuffer ) object.__webglNormalBuffer = _gl.createBuffer();
40190         if ( object.hasUvs && ! object.__webglUvBuffer ) object.__webglUvBuffer = _gl.createBuffer();
40191         if ( object.hasColors && ! object.__webglColorBuffer ) object.__webglColorBuffer = _gl.createBuffer();
40192
40193         if ( object.hasPositions ) {
40194
40195             _gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webglVertexBuffer );
40196             _gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW );
40197             _gl.enableVertexAttribArray( program.attributes.position );
40198             _gl.vertexAttribPointer( program.attributes.position, 3, _gl.FLOAT, false, 0, 0 );
40199
40200         }
40201
40202         if ( object.hasNormals ) {
40203
40204             _gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webglNormalBuffer );
40205
40206             if ( material.shading === THREE.FlatShading ) {
40207
40208                 var nx, ny, nz,
40209                     nax, nbx, ncx, nay, nby, ncy, naz, nbz, ncz,
40210                     normalArray,
40211                     i, il = object.count * 3;
40212
40213                 for( i = 0; i < il; i += 9 ) {
40214
40215                     normalArray = object.normalArray;
40216
40217                     nax  = normalArray[ i ];
40218                     nay  = normalArray[ i + 1 ];
40219                     naz  = normalArray[ i + 2 ];
40220
40221                     nbx  = normalArray[ i + 3 ];
40222                     nby  = normalArray[ i + 4 ];
40223                     nbz  = normalArray[ i + 5 ];
40224
40225                     ncx  = normalArray[ i + 6 ];
40226                     ncy  = normalArray[ i + 7 ];
40227                     ncz  = normalArray[ i + 8 ];
40228
40229                     nx = ( nax + nbx + ncx ) / 3;
40230                     ny = ( nay + nby + ncy ) / 3;
40231                     nz = ( naz + nbz + ncz ) / 3;
40232
40233                     normalArray[ i ]      = nx;
40234                     normalArray[ i + 1 ] = ny;
40235                     normalArray[ i + 2 ] = nz;
40236
40237                     normalArray[ i + 3 ] = nx;
40238                     normalArray[ i + 4 ] = ny;
40239                     normalArray[ i + 5 ] = nz;
40240
40241                     normalArray[ i + 6 ] = nx;
40242                     normalArray[ i + 7 ] = ny;
40243                     normalArray[ i + 8 ] = nz;
40244
40245                 }
40246
40247             }
40248
40249             _gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW );
40250             _gl.enableVertexAttribArray( program.attributes.normal );
40251             _gl.vertexAttribPointer( program.attributes.normal, 3, _gl.FLOAT, false, 0, 0 );
40252
40253         }
40254
40255         if ( object.hasUvs && material.map ) {
40256
40257             _gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webglUvBuffer );
40258             _gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW );
40259             _gl.enableVertexAttribArray( program.attributes.uv );
40260             _gl.vertexAttribPointer( program.attributes.uv, 2, _gl.FLOAT, false, 0, 0 );
40261
40262         }
40263
40264         if ( object.hasColors && material.vertexColors !== THREE.NoColors ) {
40265
40266             _gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webglColorBuffer );
40267             _gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW );
40268             _gl.enableVertexAttribArray( program.attributes.color );
40269             _gl.vertexAttribPointer( program.attributes.color, 3, _gl.FLOAT, false, 0, 0 );
40270
40271         }
40272
40273         _gl.drawArrays( _gl.TRIANGLES, 0, object.count );
40274
40275         object.count = 0;
40276
40277     };
40278
40279     this.renderBufferDirect = function ( camera, lights, fog, material, geometry, object ) {
40280
40281         if ( material.visible === false ) return;
40282
40283         var program, attributes, linewidth, primitives, a, attribute;
40284
40285         program = setProgram( camera, lights, fog, material, object );
40286
40287         attributes = program.attributes;
40288
40289         var updateBuffers = false,
40290             wireframeBit = material.wireframe ? 1 : 0,
40291             geometryHash = ( geometry.id * 0xffffff ) + ( program.id * 2 ) + wireframeBit;
40292
40293         if ( geometryHash !== _currentGeometryGroupHash ) {
40294
40295             _currentGeometryGroupHash = geometryHash;
40296             updateBuffers = true;
40297
40298         }
40299
40300         // render mesh
40301
40302         if ( object instanceof THREE.Mesh ) {
40303
40304             var offsets = geometry.offsets;
40305
40306             // if there is more than 1 chunk
40307             // must set attribute pointers to use new offsets for each chunk
40308             // even if geometry and materials didn't change
40309
40310             if ( offsets.length > 1 ) updateBuffers = true;
40311
40312             for ( var i = 0, il = offsets.length; i < il; ++ i ) {
40313
40314                 var startIndex = offsets[ i ].index;
40315
40316                 if ( updateBuffers ) {
40317
40318                     // vertices
40319
40320                     var position = geometry.attributes[ "position" ];
40321                     var positionSize = position.itemSize;
40322
40323                     _gl.bindBuffer( _gl.ARRAY_BUFFER, position.buffer );
40324                     _gl.vertexAttribPointer( attributes.position, positionSize, _gl.FLOAT, false, 0, startIndex * positionSize * 4 ); // 4 bytes per Float32
40325
40326                     // normals
40327
40328                     var normal = geometry.attributes[ "normal" ];
40329
40330                     if ( attributes.normal >= 0 && normal ) {
40331
40332                         var normalSize = normal.itemSize;
40333
40334                         _gl.bindBuffer( _gl.ARRAY_BUFFER, normal.buffer );
40335                         _gl.vertexAttribPointer( attributes.normal, normalSize, _gl.FLOAT, false, 0, startIndex * normalSize * 4 );
40336
40337                     }
40338
40339                     // uvs
40340
40341                     var uv = geometry.attributes[ "uv" ];
40342
40343                     if ( attributes.uv >= 0 && uv ) {
40344
40345                         if ( uv.buffer ) {
40346
40347                             var uvSize = uv.itemSize;
40348
40349                             _gl.bindBuffer( _gl.ARRAY_BUFFER, uv.buffer );
40350                             _gl.vertexAttribPointer( attributes.uv, uvSize, _gl.FLOAT, false, 0, startIndex * uvSize * 4 );
40351
40352                             _gl.enableVertexAttribArray( attributes.uv );
40353
40354                         } else {
40355
40356                             _gl.disableVertexAttribArray( attributes.uv );
40357
40358                         }
40359
40360                     }
40361
40362                     // colors
40363
40364                     var color = geometry.attributes[ "color" ];
40365
40366                     if ( attributes.color >= 0 && color ) {
40367
40368                         var colorSize = color.itemSize;
40369
40370                         _gl.bindBuffer( _gl.ARRAY_BUFFER, color.buffer );
40371                         _gl.vertexAttribPointer( attributes.color, colorSize, _gl.FLOAT, false, 0, startIndex * colorSize * 4 );
40372
40373                     }
40374
40375                     // tangents
40376
40377                     var tangent = geometry.attributes[ "tangent" ];
40378
40379                     if ( attributes.tangent >= 0 && tangent ) {
40380
40381                         var tangentSize = tangent.itemSize;
40382
40383                         _gl.bindBuffer( _gl.ARRAY_BUFFER, tangent.buffer );
40384                         _gl.vertexAttribPointer( attributes.tangent, tangentSize, _gl.FLOAT, false, 0, startIndex * tangentSize * 4 );
40385
40386                     }
40387
40388                     // indices
40389
40390                     var index = geometry.attributes[ "index" ];
40391
40392                     _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, index.buffer );
40393
40394                 }
40395
40396                 // render indexed triangles
40397
40398                 _gl.drawElements( _gl.TRIANGLES, offsets[ i ].count, _gl.UNSIGNED_SHORT, offsets[ i ].start * 2 ); // 2 bytes per Uint16
40399
40400                 _this.info.render.calls ++;
40401                 _this.info.render.vertices += offsets[ i ].count; // not really true, here vertices can be shared
40402                 _this.info.render.faces += offsets[ i ].count / 3;
40403
40404             }
40405
40406         // render particles
40407
40408         } else if ( object instanceof THREE.ParticleSystem ) {
40409
40410             if ( updateBuffers ) {
40411
40412                 // vertices
40413
40414                 var position = geometry.attributes[ "position" ];
40415                 var positionSize = position.itemSize;
40416
40417                 _gl.bindBuffer( _gl.ARRAY_BUFFER, position.buffer );
40418                 _gl.vertexAttribPointer( attributes.position, positionSize, _gl.FLOAT, false, 0, 0 );
40419
40420                 // colors
40421
40422                 var color = geometry.attributes[ "color" ];
40423
40424                 if ( attributes.color >= 0 && color ) {
40425
40426                     var colorSize = color.itemSize;
40427
40428                     _gl.bindBuffer( _gl.ARRAY_BUFFER, color.buffer );
40429                     _gl.vertexAttribPointer( attributes.color, colorSize, _gl.FLOAT, false, 0, 0 );
40430
40431                 }
40432
40433                 // render particles
40434
40435                 _gl.drawArrays( _gl.POINTS, 0, position.numItems / 3 );
40436
40437                 _this.info.render.calls ++;
40438                 _this.info.render.points += position.numItems / 3;
40439
40440             }
40441
40442         }
40443
40444     };
40445
40446     this.renderBuffer = function ( camera, lights, fog, material, geometryGroup, object ) {
40447
40448         if ( material.visible === false ) return;
40449
40450         var program, attributes, linewidth, primitives, a, attribute, i, il;
40451
40452         program = setProgram( camera, lights, fog, material, object );
40453
40454         attributes = program.attributes;
40455
40456         var updateBuffers = false,
40457             wireframeBit = material.wireframe ? 1 : 0,
40458             geometryGroupHash = ( geometryGroup.id * 0xffffff ) + ( program.id * 2 ) + wireframeBit;
40459
40460         if ( geometryGroupHash !== _currentGeometryGroupHash ) {
40461
40462             _currentGeometryGroupHash = geometryGroupHash;
40463             updateBuffers = true;
40464
40465         }
40466
40467         // vertices
40468
40469         if ( !material.morphTargets && attributes.position >= 0 ) {
40470
40471             if ( updateBuffers ) {
40472
40473                 _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglVertexBuffer );
40474                 _gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 );
40475
40476             }
40477
40478         } else {
40479
40480             if ( object.morphTargetBase ) {
40481
40482                 setupMorphTargets( material, geometryGroup, object );
40483
40484             }
40485
40486         }
40487
40488
40489         if ( updateBuffers ) {
40490
40491             // custom attributes
40492
40493             // Use the per-geometryGroup custom attribute arrays which are setup in initMeshBuffers
40494
40495             if ( geometryGroup.__webglCustomAttributesList ) {
40496
40497                 for ( i = 0, il = geometryGroup.__webglCustomAttributesList.length; i < il; i ++ ) {
40498
40499                     attribute = geometryGroup.__webglCustomAttributesList[ i ];
40500
40501                     if( attributes[ attribute.buffer.belongsToAttribute ] >= 0 ) {
40502
40503                         _gl.bindBuffer( _gl.ARRAY_BUFFER, attribute.buffer );
40504                         _gl.vertexAttribPointer( attributes[ attribute.buffer.belongsToAttribute ], attribute.size, _gl.FLOAT, false, 0, 0 );
40505
40506                     }
40507
40508                 }
40509
40510             }
40511
40512
40513             // colors
40514
40515             if ( attributes.color >= 0 ) {
40516
40517                 _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglColorBuffer );
40518                 _gl.vertexAttribPointer( attributes.color, 3, _gl.FLOAT, false, 0, 0 );
40519
40520             }
40521
40522             // normals
40523
40524             if ( attributes.normal >= 0 ) {
40525
40526                 _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglNormalBuffer );
40527                 _gl.vertexAttribPointer( attributes.normal, 3, _gl.FLOAT, false, 0, 0 );
40528
40529             }
40530
40531             // tangents
40532
40533             if ( attributes.tangent >= 0 ) {
40534
40535                 _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglTangentBuffer );
40536                 _gl.vertexAttribPointer( attributes.tangent, 4, _gl.FLOAT, false, 0, 0 );
40537
40538             }
40539
40540             // uvs
40541
40542             if ( attributes.uv >= 0 ) {
40543
40544                 if ( geometryGroup.__webglUVBuffer ) {
40545
40546                     _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglUVBuffer );
40547                     _gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 );
40548
40549                     _gl.enableVertexAttribArray( attributes.uv );
40550
40551                 } else {
40552
40553                     _gl.disableVertexAttribArray( attributes.uv );
40554
40555                 }
40556
40557             }
40558
40559             if ( attributes.uv2 >= 0 ) {
40560
40561                 if ( geometryGroup.__webglUV2Buffer ) {
40562
40563                     _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglUV2Buffer );
40564                     _gl.vertexAttribPointer( attributes.uv2, 2, _gl.FLOAT, false, 0, 0 );
40565
40566                     _gl.enableVertexAttribArray( attributes.uv2 );
40567
40568                 } else {
40569
40570                     _gl.disableVertexAttribArray( attributes.uv2 );
40571
40572                 }
40573
40574             }
40575
40576             if ( material.skinning &&
40577                  attributes.skinIndex >= 0 && attributes.skinWeight >= 0 ) {
40578
40579                 _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglSkinIndicesBuffer );
40580                 _gl.vertexAttribPointer( attributes.skinIndex, 4, _gl.FLOAT, false, 0, 0 );
40581
40582                 _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglSkinWeightsBuffer );
40583                 _gl.vertexAttribPointer( attributes.skinWeight, 4, _gl.FLOAT, false, 0, 0 );
40584
40585             }
40586
40587         }
40588
40589         // render mesh
40590
40591         if ( object instanceof THREE.Mesh ) {
40592
40593             // wireframe
40594
40595             if ( material.wireframe ) {
40596
40597                 setLineWidth( material.wireframeLinewidth );
40598
40599                 if ( updateBuffers ) _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryGroup.__webglLineBuffer );
40600                 _gl.drawElements( _gl.LINES, geometryGroup.__webglLineCount, _gl.UNSIGNED_SHORT, 0 );
40601
40602             // triangles
40603
40604             } else {
40605
40606                 if ( updateBuffers ) _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryGroup.__webglFaceBuffer );
40607                 _gl.drawElements( _gl.TRIANGLES, geometryGroup.__webglFaceCount, _gl.UNSIGNED_SHORT, 0 );
40608
40609             }
40610
40611             _this.info.render.calls ++;
40612             _this.info.render.vertices += geometryGroup.__webglFaceCount;
40613             _this.info.render.faces += geometryGroup.__webglFaceCount / 3;
40614
40615         // render lines
40616
40617         } else if ( object instanceof THREE.Line ) {
40618
40619             primitives = ( object.type === THREE.LineStrip ) ? _gl.LINE_STRIP : _gl.LINES;
40620
40621             setLineWidth( material.linewidth );
40622
40623             _gl.drawArrays( primitives, 0, geometryGroup.__webglLineCount );
40624
40625             _this.info.render.calls ++;
40626
40627         // render particles
40628
40629         } else if ( object instanceof THREE.ParticleSystem ) {
40630
40631             _gl.drawArrays( _gl.POINTS, 0, geometryGroup.__webglParticleCount );
40632
40633             _this.info.render.calls ++;
40634             _this.info.render.points += geometryGroup.__webglParticleCount;
40635
40636         // render ribbon
40637
40638         } else if ( object instanceof THREE.Ribbon ) {
40639
40640             _gl.drawArrays( _gl.TRIANGLE_STRIP, 0, geometryGroup.__webglVertexCount );
40641
40642             _this.info.render.calls ++;
40643
40644         }
40645
40646     };
40647
40648     function setupMorphTargets ( material, geometryGroup, object ) {
40649
40650         // set base
40651
40652         var attributes = material.program.attributes;
40653
40654         if ( object.morphTargetBase !== -1 ) {
40655
40656             _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglMorphTargetsBuffers[ object.morphTargetBase ] );
40657             _gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 );
40658
40659         } else if ( attributes.position >= 0 ) {
40660
40661             _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglVertexBuffer );
40662             _gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 );
40663
40664         }
40665
40666         if ( object.morphTargetForcedOrder.length ) {
40667
40668             // set forced order
40669
40670             var m = 0;
40671             var order = object.morphTargetForcedOrder;
40672             var influences = object.morphTargetInfluences;
40673
40674             while ( m < material.numSupportedMorphTargets && m < order.length ) {
40675
40676                 _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglMorphTargetsBuffers[ order[ m ] ] );
40677                 _gl.vertexAttribPointer( attributes[ "morphTarget" + m ], 3, _gl.FLOAT, false, 0, 0 );
40678
40679                 if ( material.morphNormals ) {
40680
40681                     _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglMorphNormalsBuffers[ order[ m ] ] );
40682                     _gl.vertexAttribPointer( attributes[ "morphNormal" + m ], 3, _gl.FLOAT, false, 0, 0 );
40683
40684                 }
40685
40686                 object.__webglMorphTargetInfluences[ m ] = influences[ order[ m ] ];
40687
40688                 m ++;
40689             }
40690
40691         } else {
40692
40693             // find the most influencing
40694
40695             var influence, activeInfluenceIndices = [];
40696             var influences = object.morphTargetInfluences;
40697             var i, il = influences.length;
40698
40699             for ( i = 0; i < il; i ++ ) {
40700
40701                 influence = influences[ i ];
40702
40703                 if ( influence > 0 ) {
40704
40705                     activeInfluenceIndices.push( [ i, influence ] );
40706
40707                 }
40708
40709             }
40710
40711             if ( activeInfluenceIndices.length > material.numSupportedMorphTargets ) {
40712
40713                 activeInfluenceIndices.sort( numericalSort );
40714                 activeInfluenceIndices.length = material.numSupportedMorphTargets;
40715
40716             } else if ( activeInfluenceIndices.length > material.numSupportedMorphNormals ) {
40717
40718                 activeInfluenceIndices.sort( numericalSort );
40719
40720             } else if ( activeInfluenceIndices.length === 0 ) {
40721
40722                 activeInfluenceIndices.push( [ 0, 0 ] );
40723
40724             };
40725
40726             var influenceIndex, m = 0;
40727
40728             while ( m < material.numSupportedMorphTargets ) {
40729
40730                 if ( activeInfluenceIndices[ m ] ) {
40731
40732                     influenceIndex = activeInfluenceIndices[ m ][ 0 ];
40733
40734                     _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglMorphTargetsBuffers[ influenceIndex ] );
40735
40736                     _gl.vertexAttribPointer( attributes[ "morphTarget" + m ], 3, _gl.FLOAT, false, 0, 0 );
40737
40738                     if ( material.morphNormals ) {
40739
40740                         _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglMorphNormalsBuffers[ influenceIndex ] );
40741                         _gl.vertexAttribPointer( attributes[ "morphNormal" + m ], 3, _gl.FLOAT, false, 0, 0 );
40742
40743                     }
40744
40745                     object.__webglMorphTargetInfluences[ m ] = influences[ influenceIndex ];
40746
40747                 } else {
40748
40749                     _gl.vertexAttribPointer( attributes[ "morphTarget" + m ], 3, _gl.FLOAT, false, 0, 0 );
40750
40751                     if ( material.morphNormals ) {
40752
40753                         _gl.vertexAttribPointer( attributes[ "morphNormal" + m ], 3, _gl.FLOAT, false, 0, 0 );
40754
40755                     }
40756
40757                     object.__webglMorphTargetInfluences[ m ] = 0;
40758
40759                 }
40760
40761                 m ++;
40762
40763             }
40764
40765         }
40766
40767         // load updated influences uniform
40768
40769         if ( material.program.uniforms.morphTargetInfluences !== null ) {
40770
40771             _gl.uniform1fv( material.program.uniforms.morphTargetInfluences, object.__webglMorphTargetInfluences );
40772
40773         }
40774
40775     };
40776
40777     // Sorting
40778
40779     function painterSort ( a, b ) {
40780
40781         return b.z - a.z;
40782
40783     };
40784
40785     function numericalSort ( a, b ) {
40786
40787         return b[ 1 ] - a[ 1 ];
40788
40789     };
40790
40791
40792     // Rendering
40793
40794     this.render = function ( scene, camera, renderTarget, forceClear ) {
40795
40796         if ( camera instanceof THREE.Camera === false ) {
40797
40798             console.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );
40799             return;
40800
40801         }
40802
40803         var i, il,
40804
40805         webglObject, object,
40806         renderList,
40807
40808         lights = scene.__lights,
40809         fog = scene.fog;
40810
40811         // reset caching for this frame
40812
40813         _currentMaterialId = -1;
40814         _lightsNeedUpdate = true;
40815
40816         // update scene graph
40817
40818         if ( this.autoUpdateScene ) scene.updateMatrixWorld();
40819
40820         // update camera matrices and frustum
40821
40822         if ( camera.parent === undefined ) camera.updateMatrixWorld();
40823
40824         if ( ! camera._viewMatrixArray ) camera._viewMatrixArray = new Float32Array( 16 );
40825         if ( ! camera._projectionMatrixArray ) camera._projectionMatrixArray = new Float32Array( 16 );
40826
40827         camera.matrixWorldInverse.getInverse( camera.matrixWorld );
40828
40829         camera.matrixWorldInverse.flattenToArray( camera._viewMatrixArray );
40830         camera.projectionMatrix.flattenToArray( camera._projectionMatrixArray );
40831
40832         _projScreenMatrix.multiply( camera.projectionMatrix, camera.matrixWorldInverse );
40833         _frustum.setFromMatrix( _projScreenMatrix );
40834
40835         // update WebGL objects
40836
40837         if ( this.autoUpdateObjects ) this.initWebGLObjects( scene );
40838
40839         // custom render plugins (pre pass)
40840
40841         renderPlugins( this.renderPluginsPre, scene, camera );
40842
40843         //
40844
40845         _this.info.render.calls = 0;
40846         _this.info.render.vertices = 0;
40847         _this.info.render.faces = 0;
40848         _this.info.render.points = 0;
40849
40850         this.setRenderTarget( renderTarget );
40851
40852         if ( this.autoClear || forceClear ) {
40853
40854             this.clear( this.autoClearColor, this.autoClearDepth, this.autoClearStencil );
40855
40856         }
40857
40858         // set matrices for regular objects (frustum culled)
40859
40860         renderList = scene.__webglObjects;
40861
40862         for ( i = 0, il = renderList.length; i < il; i ++ ) {
40863
40864             webglObject = renderList[ i ];
40865             object = webglObject.object;
40866
40867             webglObject.render = false;
40868
40869             if ( object.visible ) {
40870
40871                 if ( ! ( object instanceof THREE.Mesh || object instanceof THREE.ParticleSystem ) || ! ( object.frustumCulled ) || _frustum.contains( object ) ) {
40872
40873                     //object.matrixWorld.flattenToArray( object._modelMatrixArray );
40874
40875                     setupMatrices( object, camera );
40876
40877                     unrollBufferMaterial( webglObject );
40878
40879                     webglObject.render = true;
40880
40881                     if ( this.sortObjects === true ) {
40882
40883                         if ( object.renderDepth !== null ) {
40884
40885                             webglObject.z = object.renderDepth;
40886
40887                         } else {
40888
40889                             _vector3.copy( object.matrixWorld.getPosition() );
40890                             _projScreenMatrix.multiplyVector3( _vector3 );
40891
40892                             webglObject.z = _vector3.z;
40893
40894                         }
40895
40896                     }
40897
40898                 }
40899
40900             }
40901
40902         }
40903
40904         if ( this.sortObjects ) {
40905
40906             renderList.sort( painterSort );
40907
40908         }
40909
40910         // set matrices for immediate objects
40911
40912         renderList = scene.__webglObjectsImmediate;
40913
40914         for ( i = 0, il = renderList.length; i < il; i ++ ) {
40915
40916             webglObject = renderList[ i ];
40917             object = webglObject.object;
40918
40919             if ( object.visible ) {
40920
40921                 /*
40922                 if ( object.matrixAutoUpdate ) {
40923
40924                     object.matrixWorld.flattenToArray( object._modelMatrixArray );
40925
40926                 }
40927                 */
40928
40929                 setupMatrices( object, camera );
40930
40931                 unrollImmediateBufferMaterial( webglObject );
40932
40933             }
40934
40935         }
40936
40937         if ( scene.overrideMaterial ) {
40938
40939             var material = scene.overrideMaterial;
40940
40941             this.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst );
40942             this.setDepthTest( material.depthTest );
40943             this.setDepthWrite( material.depthWrite );
40944             setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );
40945
40946             renderObjects( scene.__webglObjects, false, "", camera, lights, fog, true, material );
40947             renderObjectsImmediate( scene.__webglObjectsImmediate, "", camera, lights, fog, false, material );
40948
40949         } else {
40950
40951             // opaque pass (front-to-back order)
40952
40953             this.setBlending( THREE.NormalBlending );
40954
40955             renderObjects( scene.__webglObjects, true, "opaque", camera, lights, fog, false );
40956             renderObjectsImmediate( scene.__webglObjectsImmediate, "opaque", camera, lights, fog, false );
40957
40958             // transparent pass (back-to-front order)
40959
40960             renderObjects( scene.__webglObjects, false, "transparent", camera, lights, fog, true );
40961             renderObjectsImmediate( scene.__webglObjectsImmediate, "transparent", camera, lights, fog, true );
40962
40963         }
40964
40965         // custom render plugins (post pass)
40966
40967         renderPlugins( this.renderPluginsPost, scene, camera );
40968
40969
40970         // Generate mipmap if we're using any kind of mipmap filtering
40971
40972         if ( renderTarget && renderTarget.generateMipmaps && renderTarget.minFilter !== THREE.NearestFilter && renderTarget.minFilter !== THREE.LinearFilter ) {
40973
40974             updateRenderTargetMipmap( renderTarget );
40975
40976         }
40977
40978         // Ensure depth buffer writing is enabled so it can be cleared on next render
40979
40980         this.setDepthTest( true );
40981         this.setDepthWrite( true );
40982
40983         // _gl.finish();
40984
40985     };
40986
40987     function renderPlugins( plugins, scene, camera ) {
40988
40989         if ( ! plugins.length ) return;
40990
40991         for ( var i = 0, il = plugins.length; i < il; i ++ ) {
40992
40993             // reset state for plugin (to start from clean slate)
40994
40995             _currentProgram = null;
40996             _currentCamera = null;
40997
40998             _oldBlending = -1;
40999             _oldDepthTest = -1;
41000             _oldDepthWrite = -1;
41001             _oldDoubleSided = -1;
41002             _oldFlipSided = -1;
41003             _currentGeometryGroupHash = -1;
41004             _currentMaterialId = -1;
41005
41006             _lightsNeedUpdate = true;
41007
41008             plugins[ i ].render( scene, camera, _currentWidth, _currentHeight );
41009
41010             // reset state after plugin (anything could have changed)
41011
41012             _currentProgram = null;
41013             _currentCamera = null;
41014
41015             _oldBlending = -1;
41016             _oldDepthTest = -1;
41017             _oldDepthWrite = -1;
41018             _oldDoubleSided = -1;
41019             _oldFlipSided = -1;
41020             _currentGeometryGroupHash = -1;
41021             _currentMaterialId = -1;
41022
41023             _lightsNeedUpdate = true;
41024
41025         }
41026
41027     };
41028
41029     function renderObjects ( renderList, reverse, materialType, camera, lights, fog, useBlending, overrideMaterial ) {
41030
41031         var webglObject, object, buffer, material, start, end, delta;
41032
41033         if ( reverse ) {
41034
41035             start = renderList.length - 1;
41036             end = -1;
41037             delta = -1;
41038
41039         } else {
41040
41041             start = 0;
41042             end = renderList.length;
41043             delta = 1;
41044         }
41045
41046         for ( var i = start; i !== end; i += delta ) {
41047
41048             webglObject = renderList[ i ];
41049
41050             if ( webglObject.render ) {
41051
41052                 object = webglObject.object;
41053                 buffer = webglObject.buffer;
41054
41055                 if ( overrideMaterial ) {
41056
41057                     material = overrideMaterial;
41058
41059                 } else {
41060
41061                     material = webglObject[ materialType ];
41062
41063                     if ( ! material ) continue;
41064
41065                     if ( useBlending ) _this.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst );
41066
41067                     _this.setDepthTest( material.depthTest );
41068                     _this.setDepthWrite( material.depthWrite );
41069                     setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );
41070
41071                 }
41072
41073                 _this.setMaterialFaces( material );
41074
41075                 if ( buffer instanceof THREE.BufferGeometry ) {
41076
41077                     _this.renderBufferDirect( camera, lights, fog, material, buffer, object );
41078
41079                 } else {
41080
41081                     _this.renderBuffer( camera, lights, fog, material, buffer, object );
41082
41083                 }
41084
41085             }
41086
41087         }
41088
41089     };
41090
41091     function renderObjectsImmediate ( renderList, materialType, camera, lights, fog, useBlending, overrideMaterial ) {
41092
41093         var webglObject, object, material, program;
41094
41095         for ( var i = 0, il = renderList.length; i < il; i ++ ) {
41096
41097             webglObject = renderList[ i ];
41098             object = webglObject.object;
41099
41100             if ( object.visible ) {
41101
41102                 if ( overrideMaterial ) {
41103
41104                     material = overrideMaterial;
41105
41106                 } else {
41107
41108                     material = webglObject[ materialType ];
41109
41110                     if ( ! material ) continue;
41111
41112                     if ( useBlending ) _this.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst );
41113
41114                     _this.setDepthTest( material.depthTest );
41115                     _this.setDepthWrite( material.depthWrite );
41116                     setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );
41117
41118                 }
41119
41120                 _this.renderImmediateObject( camera, lights, fog, material, object );
41121
41122             }
41123
41124         }
41125
41126     };
41127
41128     this.renderImmediateObject = function ( camera, lights, fog, material, object ) {
41129
41130         var program = setProgram( camera, lights, fog, material, object );
41131
41132         _currentGeometryGroupHash = -1;
41133
41134         _this.setMaterialFaces( material );
41135
41136         if ( object.immediateRenderCallback ) {
41137
41138             object.immediateRenderCallback( program, _gl, _frustum );
41139
41140         } else {
41141
41142             object.render( function( object ) { _this.renderBufferImmediate( object, program, material ); } );
41143
41144         }
41145
41146     };
41147
41148     function unrollImmediateBufferMaterial ( globject ) {
41149
41150         var object = globject.object,
41151             material = object.material;
41152
41153         if ( material.transparent ) {
41154
41155             globject.transparent = material;
41156             globject.opaque = null;
41157
41158         } else {
41159
41160             globject.opaque = material;
41161             globject.transparent = null;
41162
41163         }
41164
41165     };
41166
41167     function unrollBufferMaterial ( globject ) {
41168
41169         var object = globject.object,
41170             buffer = globject.buffer,
41171             material, materialIndex, meshMaterial;
41172
41173         meshMaterial = object.material;
41174
41175         if ( meshMaterial instanceof THREE.MeshFaceMaterial ) {
41176
41177             materialIndex = buffer.materialIndex;
41178
41179             if ( materialIndex >= 0 ) {
41180
41181                 material = object.geometry.materials[ materialIndex ];
41182
41183                 if ( material.transparent ) {
41184
41185                     globject.transparent = material;
41186                     globject.opaque = null;
41187
41188                 } else {
41189
41190                     globject.opaque = material;
41191                     globject.transparent = null;
41192
41193                 }
41194
41195             }
41196
41197         } else {
41198
41199             material = meshMaterial;
41200
41201             if ( material ) {
41202
41203                 if ( material.transparent ) {
41204
41205                     globject.transparent = material;
41206                     globject.opaque = null;
41207
41208                 } else {
41209
41210                     globject.opaque = material;
41211                     globject.transparent = null;
41212
41213                 }
41214
41215             }
41216
41217         }
41218
41219     };
41220
41221     // Geometry splitting
41222
41223     function sortFacesByMaterial ( geometry ) {
41224
41225         var f, fl, face, materialIndex, vertices,
41226             materialHash, groupHash,
41227             hash_map = {};
41228
41229         var numMorphTargets = geometry.morphTargets.length;
41230         var numMorphNormals = geometry.morphNormals.length;
41231
41232         geometry.geometryGroups = {};
41233
41234         for ( f = 0, fl = geometry.faces.length; f < fl; f ++ ) {
41235
41236             face = geometry.faces[ f ];
41237             materialIndex = face.materialIndex;
41238
41239             materialHash = ( materialIndex !== undefined ) ? materialIndex : -1;
41240
41241             if ( hash_map[ materialHash ] === undefined ) {
41242
41243                 hash_map[ materialHash ] = { 'hash': materialHash, 'counter': 0 };
41244
41245             }
41246
41247             groupHash = hash_map[ materialHash ].hash + '_' + hash_map[ materialHash ].counter;
41248
41249             if ( geometry.geometryGroups[ groupHash ] === undefined ) {
41250
41251                 geometry.geometryGroups[ groupHash ] = { 'faces3': [], 'faces4': [], 'materialIndex': materialIndex, 'vertices': 0, 'numMorphTargets': numMorphTargets, 'numMorphNormals': numMorphNormals };
41252
41253             }
41254
41255             vertices = face instanceof THREE.Face3 ? 3 : 4;
41256
41257             if ( geometry.geometryGroups[ groupHash ].vertices + vertices > 65535 ) {
41258
41259                 hash_map[ materialHash ].counter += 1;
41260                 groupHash = hash_map[ materialHash ].hash + '_' + hash_map[ materialHash ].counter;
41261
41262                 if ( geometry.geometryGroups[ groupHash ] === undefined ) {
41263
41264                     geometry.geometryGroups[ groupHash ] = { 'faces3': [], 'faces4': [], 'materialIndex': materialIndex, 'vertices': 0, 'numMorphTargets': numMorphTargets, 'numMorphNormals': numMorphNormals };
41265
41266                 }
41267
41268             }
41269
41270             if ( face instanceof THREE.Face3 ) {
41271
41272                 geometry.geometryGroups[ groupHash ].faces3.push( f );
41273
41274             } else {
41275
41276                 geometry.geometryGroups[ groupHash ].faces4.push( f );
41277
41278             }
41279
41280             geometry.geometryGroups[ groupHash ].vertices += vertices;
41281
41282         }
41283
41284         geometry.geometryGroupsList = [];
41285
41286         for ( var g in geometry.geometryGroups ) {
41287
41288             geometry.geometryGroups[ g ].id = _geometryGroupCounter ++;
41289
41290             geometry.geometryGroupsList.push( geometry.geometryGroups[ g ] );
41291
41292         }
41293
41294     };
41295
41296     // Objects refresh
41297
41298     this.initWebGLObjects = function ( scene ) {
41299
41300         if ( !scene.__webglObjects ) {
41301
41302             scene.__webglObjects = [];
41303             scene.__webglObjectsImmediate = [];
41304             scene.__webglSprites = [];
41305             scene.__webglFlares = [];
41306
41307         }
41308
41309         while ( scene.__objectsAdded.length ) {
41310
41311             addObject( scene.__objectsAdded[ 0 ], scene );
41312             scene.__objectsAdded.splice( 0, 1 );
41313
41314         }
41315
41316         while ( scene.__objectsRemoved.length ) {
41317
41318             removeObject( scene.__objectsRemoved[ 0 ], scene );
41319             scene.__objectsRemoved.splice( 0, 1 );
41320
41321         }
41322
41323         // update must be called after objects adding / removal
41324
41325         for ( var o = 0, ol = scene.__webglObjects.length; o < ol; o ++ ) {
41326
41327             updateObject( scene.__webglObjects[ o ].object );
41328
41329         }
41330
41331     };
41332
41333     // Objects adding
41334
41335     function addObject ( object, scene ) {
41336
41337         var g, geometry, geometryGroup;
41338
41339         if ( ! object.__webglInit ) {
41340
41341             object.__webglInit = true;
41342
41343             object._modelViewMatrix = new THREE.Matrix4();
41344             object._normalMatrix = new THREE.Matrix3();
41345
41346             if ( object instanceof THREE.Mesh ) {
41347
41348                 geometry = object.geometry;
41349
41350                 if ( geometry instanceof THREE.Geometry ) {
41351
41352                     if ( geometry.geometryGroups === undefined ) {
41353
41354                         sortFacesByMaterial( geometry );
41355
41356                     }
41357
41358                     // create separate VBOs per geometry chunk
41359
41360                     for ( g in geometry.geometryGroups ) {
41361
41362                         geometryGroup = geometry.geometryGroups[ g ];
41363
41364                         // initialise VBO on the first access
41365
41366                         if ( ! geometryGroup.__webglVertexBuffer ) {
41367
41368                             createMeshBuffers( geometryGroup );
41369                             initMeshBuffers( geometryGroup, object );
41370
41371                             geometry.verticesNeedUpdate = true;
41372                             geometry.morphTargetsNeedUpdate = true;
41373                             geometry.elementsNeedUpdate = true;
41374                             geometry.uvsNeedUpdate = true;
41375                             geometry.normalsNeedUpdate = true;
41376                             geometry.tangentsNeedUpdate = true;
41377                             geometry.colorsNeedUpdate = true;
41378
41379                         }
41380
41381                     }
41382
41383                 } else if ( geometry instanceof THREE.BufferGeometry ) {
41384
41385                     initDirectBuffers( geometry );
41386
41387                 }
41388
41389             } else if ( object instanceof THREE.Ribbon ) {
41390
41391                 geometry = object.geometry;
41392
41393                 if( ! geometry.__webglVertexBuffer ) {
41394
41395                     createRibbonBuffers( geometry );
41396                     initRibbonBuffers( geometry );
41397
41398                     geometry.verticesNeedUpdate = true;
41399                     geometry.colorsNeedUpdate = true;
41400
41401                 }
41402
41403             } else if ( object instanceof THREE.Line ) {
41404
41405                 geometry = object.geometry;
41406
41407                 if( ! geometry.__webglVertexBuffer ) {
41408
41409                     createLineBuffers( geometry );
41410                     initLineBuffers( geometry, object );
41411
41412                     geometry.verticesNeedUpdate = true;
41413                     geometry.colorsNeedUpdate = true;
41414
41415                 }
41416
41417             } else if ( object instanceof THREE.ParticleSystem ) {
41418
41419                 geometry = object.geometry;
41420
41421                 if ( ! geometry.__webglVertexBuffer ) {
41422
41423                     if ( geometry instanceof THREE.Geometry ) {
41424
41425                         createParticleBuffers( geometry );
41426                         initParticleBuffers( geometry, object );
41427
41428                         geometry.verticesNeedUpdate = true;
41429                         geometry.colorsNeedUpdate = true;
41430
41431                     } else if ( geometry instanceof THREE.BufferGeometry ) {
41432
41433                         initDirectBuffers( geometry );
41434
41435                     }
41436
41437
41438                 }
41439
41440             }
41441
41442         }
41443
41444         if ( ! object.__webglActive ) {
41445
41446             if ( object instanceof THREE.Mesh ) {
41447
41448                 geometry = object.geometry;
41449
41450                 if ( geometry instanceof THREE.BufferGeometry ) {
41451
41452                     addBuffer( scene.__webglObjects, geometry, object );
41453
41454                 } else {
41455
41456                     for ( g in geometry.geometryGroups ) {
41457
41458                         geometryGroup = geometry.geometryGroups[ g ];
41459
41460                         addBuffer( scene.__webglObjects, geometryGroup, object );
41461
41462                     }
41463
41464                 }
41465
41466             } else if ( object instanceof THREE.Ribbon ||
41467                         object instanceof THREE.Line ||
41468                         object instanceof THREE.ParticleSystem ) {
41469
41470                 geometry = object.geometry;
41471                 addBuffer( scene.__webglObjects, geometry, object );
41472
41473             } else if ( object instanceof THREE.ImmediateRenderObject || object.immediateRenderCallback ) {
41474
41475                 addBufferImmediate( scene.__webglObjectsImmediate, object );
41476
41477             } else if ( object instanceof THREE.Sprite ) {
41478
41479                 scene.__webglSprites.push( object );
41480
41481             } else if ( object instanceof THREE.LensFlare ) {
41482
41483                 scene.__webglFlares.push( object );
41484
41485             }
41486
41487             object.__webglActive = true;
41488
41489         }
41490
41491     };
41492
41493     function addBuffer ( objlist, buffer, object ) {
41494
41495         objlist.push(
41496             {
41497                 buffer: buffer,
41498                 object: object,
41499                 opaque: null,
41500                 transparent: null
41501             }
41502         );
41503
41504     };
41505
41506     function addBufferImmediate ( objlist, object ) {
41507
41508         objlist.push(
41509             {
41510                 object: object,
41511                 opaque: null,
41512                 transparent: null
41513             }
41514         );
41515
41516     };
41517
41518     // Objects updates
41519
41520     function updateObject ( object ) {
41521
41522         var geometry = object.geometry,
41523             geometryGroup, customAttributesDirty, material;
41524
41525         if ( object instanceof THREE.Mesh ) {
41526
41527             if ( geometry instanceof THREE.BufferGeometry ) {
41528
41529                 if ( geometry.verticesNeedUpdate || geometry.elementsNeedUpdate ||
41530                      geometry.uvsNeedUpdate || geometry.normalsNeedUpdate ||
41531                      geometry.colorsNeedUpdate || geometry.tangentsNeedUpdate ) {
41532
41533                     setDirectBuffers( geometry, _gl.DYNAMIC_DRAW, !geometry.dynamic );
41534
41535                 }
41536
41537                 geometry.verticesNeedUpdate = false;
41538                 geometry.elementsNeedUpdate = false;
41539                 geometry.uvsNeedUpdate = false;
41540                 geometry.normalsNeedUpdate = false;
41541                 geometry.colorsNeedUpdate = false;
41542                 geometry.tangentsNeedUpdate = false;
41543
41544             } else {
41545
41546                 // check all geometry groups
41547
41548                 for( var i = 0, il = geometry.geometryGroupsList.length; i < il; i ++ ) {
41549
41550                     geometryGroup = geometry.geometryGroupsList[ i ];
41551
41552                     material = getBufferMaterial( object, geometryGroup );
41553
41554                     customAttributesDirty = material.attributes && areCustomAttributesDirty( material );
41555
41556                     if ( geometry.verticesNeedUpdate || geometry.morphTargetsNeedUpdate || geometry.elementsNeedUpdate ||
41557                          geometry.uvsNeedUpdate || geometry.normalsNeedUpdate ||
41558                          geometry.colorsNeedUpdate || geometry.tangentsNeedUpdate || customAttributesDirty ) {
41559
41560                         setMeshBuffers( geometryGroup, object, _gl.DYNAMIC_DRAW, !geometry.dynamic, material );
41561
41562                     }
41563
41564                 }
41565
41566                 geometry.verticesNeedUpdate = false;
41567                 geometry.morphTargetsNeedUpdate = false;
41568                 geometry.elementsNeedUpdate = false;
41569                 geometry.uvsNeedUpdate = false;
41570                 geometry.normalsNeedUpdate = false;
41571                 geometry.colorsNeedUpdate = false;
41572                 geometry.tangentsNeedUpdate = false;
41573
41574                 material.attributes && clearCustomAttributes( material );
41575
41576             }
41577
41578         } else if ( object instanceof THREE.Ribbon ) {
41579
41580             if ( geometry.verticesNeedUpdate || geometry.colorsNeedUpdate ) {
41581
41582                 setRibbonBuffers( geometry, _gl.DYNAMIC_DRAW );
41583
41584             }
41585
41586             geometry.verticesNeedUpdate = false;
41587             geometry.colorsNeedUpdate = false;
41588
41589         } else if ( object instanceof THREE.Line ) {
41590
41591             material = getBufferMaterial( object, geometryGroup );
41592
41593             customAttributesDirty = material.attributes && areCustomAttributesDirty( material );
41594
41595             if ( geometry.verticesNeedUpdate ||  geometry.colorsNeedUpdate || customAttributesDirty ) {
41596
41597                 setLineBuffers( geometry, _gl.DYNAMIC_DRAW );
41598
41599             }
41600
41601             geometry.verticesNeedUpdate = false;
41602             geometry.colorsNeedUpdate = false;
41603
41604             material.attributes && clearCustomAttributes( material );
41605
41606         } else if ( object instanceof THREE.ParticleSystem ) {
41607
41608             if ( geometry instanceof THREE.BufferGeometry ) {
41609
41610                 if ( geometry.verticesNeedUpdate || geometry.colorsNeedUpdate ) {
41611
41612                     setDirectBuffers( geometry, _gl.DYNAMIC_DRAW, !geometry.dynamic );
41613
41614                 }
41615
41616                 geometry.verticesNeedUpdate = false;
41617                 geometry.colorsNeedUpdate = false;
41618
41619             } else {
41620
41621                 material = getBufferMaterial( object, geometryGroup );
41622
41623                 customAttributesDirty = material.attributes && areCustomAttributesDirty( material );
41624
41625                 if ( geometry.verticesNeedUpdate || geometry.colorsNeedUpdate || object.sortParticles || customAttributesDirty ) {
41626
41627                     setParticleBuffers( geometry, _gl.DYNAMIC_DRAW, object );
41628
41629                 }
41630
41631                 geometry.verticesNeedUpdate = false;
41632                 geometry.colorsNeedUpdate = false;
41633
41634                 material.attributes && clearCustomAttributes( material );
41635
41636             }
41637
41638         }
41639
41640     };
41641
41642     // Objects updates - custom attributes check
41643
41644     function areCustomAttributesDirty ( material ) {
41645
41646         for ( var a in material.attributes ) {
41647
41648             if ( material.attributes[ a ].needsUpdate ) return true;
41649
41650         }
41651
41652         return false;
41653
41654     };
41655
41656     function clearCustomAttributes ( material ) {
41657
41658         for ( var a in material.attributes ) {
41659
41660             material.attributes[ a ].needsUpdate = false;
41661
41662         }
41663
41664     };
41665
41666     // Objects removal
41667
41668     function removeObject ( object, scene ) {
41669
41670         if ( object instanceof THREE.Mesh  ||
41671              object instanceof THREE.ParticleSystem ||
41672              object instanceof THREE.Ribbon ||
41673              object instanceof THREE.Line ) {
41674
41675             removeInstances( scene.__webglObjects, object );
41676
41677         } else if ( object instanceof THREE.Sprite ) {
41678
41679             removeInstancesDirect( scene.__webglSprites, object );
41680
41681         } else if ( object instanceof THREE.LensFlare ) {
41682
41683             removeInstancesDirect( scene.__webglFlares, object );
41684
41685         } else if ( object instanceof THREE.ImmediateRenderObject || object.immediateRenderCallback ) {
41686
41687             removeInstances( scene.__webglObjectsImmediate, object );
41688
41689         }
41690
41691         object.__webglActive = false;
41692
41693     };
41694
41695     function removeInstances ( objlist, object ) {
41696
41697         for ( var o = objlist.length - 1; o >= 0; o -- ) {
41698
41699             if ( objlist[ o ].object === object ) {
41700
41701                 objlist.splice( o, 1 );
41702
41703             }
41704
41705         }
41706
41707     };
41708
41709     function removeInstancesDirect ( objlist, object ) {
41710
41711         for ( var o = objlist.length - 1; o >= 0; o -- ) {
41712
41713             if ( objlist[ o ] === object ) {
41714
41715                 objlist.splice( o, 1 );
41716
41717             }
41718
41719         }
41720
41721     };
41722
41723     // Materials
41724
41725     this.initMaterial = function ( material, lights, fog, object ) {
41726
41727         var u, a, identifiers, i, parameters, maxLightCount, maxBones, maxShadows, shaderID;
41728
41729         if ( material instanceof THREE.MeshDepthMaterial ) {
41730
41731             shaderID = 'depth';
41732
41733         } else if ( material instanceof THREE.MeshNormalMaterial ) {
41734
41735             shaderID = 'normal';
41736
41737         } else if ( material instanceof THREE.MeshBasicMaterial ) {
41738
41739             shaderID = 'basic';
41740
41741         } else if ( material instanceof THREE.MeshLambertMaterial ) {
41742
41743             shaderID = 'lambert';
41744
41745         } else if ( material instanceof THREE.MeshPhongMaterial ) {
41746
41747             shaderID = 'phong';
41748
41749         } else if ( material instanceof THREE.LineBasicMaterial ) {
41750
41751             shaderID = 'basic';
41752
41753         } else if ( material instanceof THREE.ParticleBasicMaterial ) {
41754
41755             shaderID = 'particle_basic';
41756
41757         }
41758
41759         if ( shaderID ) {
41760
41761             setMaterialShaders( material, THREE.ShaderLib[ shaderID ] );
41762
41763         }
41764
41765         // heuristics to create shader parameters according to lights in the scene
41766         // (not to blow over maxLights budget)
41767
41768         maxLightCount = allocateLights( lights );
41769
41770         maxShadows = allocateShadows( lights );
41771
41772         maxBones = allocateBones( object );
41773
41774         parameters = {
41775
41776             map: !!material.map,
41777             envMap: !!material.envMap,
41778             lightMap: !!material.lightMap,
41779             bumpMap: !!material.bumpMap,
41780             normalMap: !!material.normalMap,
41781             specularMap: !!material.specularMap,
41782
41783             vertexColors: material.vertexColors,
41784
41785             fog: fog,
41786             useFog: material.fog,
41787
41788             sizeAttenuation: material.sizeAttenuation,
41789
41790             skinning: material.skinning,
41791             maxBones: maxBones,
41792             useVertexTexture: _supportsBoneTextures && object && object.useVertexTexture,
41793             boneTextureWidth: object && object.boneTextureWidth,
41794             boneTextureHeight: object && object.boneTextureHeight,
41795
41796             morphTargets: material.morphTargets,
41797             morphNormals: material.morphNormals,
41798             maxMorphTargets: this.maxMorphTargets,
41799             maxMorphNormals: this.maxMorphNormals,
41800
41801             maxDirLights: maxLightCount.directional,
41802             maxPointLights: maxLightCount.point,
41803             maxSpotLights: maxLightCount.spot,
41804             maxHemiLights: maxLightCount.hemi,
41805
41806             maxShadows: maxShadows,
41807             shadowMapEnabled: this.shadowMapEnabled && object.receiveShadow,
41808             shadowMapSoft: this.shadowMapSoft,
41809             shadowMapDebug: this.shadowMapDebug,
41810             shadowMapCascade: this.shadowMapCascade,
41811
41812             alphaTest: material.alphaTest,
41813             metal: material.metal,
41814             perPixel: material.perPixel,
41815             wrapAround: material.wrapAround,
41816             doubleSided: material.side === THREE.DoubleSide,
41817             flipSided: material.side === THREE.BackSide
41818
41819         };
41820
41821         material.program = buildProgram( shaderID, material.fragmentShader, material.vertexShader, material.uniforms, material.attributes, parameters );
41822
41823         var attributes = material.program.attributes;
41824
41825         if ( attributes.position >= 0 ) _gl.enableVertexAttribArray( attributes.position );
41826         if ( attributes.color >= 0 ) _gl.enableVertexAttribArray( attributes.color );
41827         if ( attributes.normal >= 0 ) _gl.enableVertexAttribArray( attributes.normal );
41828         if ( attributes.tangent >= 0 ) _gl.enableVertexAttribArray( attributes.tangent );
41829
41830         if ( material.skinning &&
41831              attributes.skinIndex >= 0 && attributes.skinWeight >= 0 ) {
41832
41833             _gl.enableVertexAttribArray( attributes.skinIndex );
41834             _gl.enableVertexAttribArray( attributes.skinWeight );
41835
41836         }
41837
41838         if ( material.attributes ) {
41839
41840             for ( a in material.attributes ) {
41841
41842                 if( attributes[ a ] !== undefined && attributes[ a ] >= 0 ) _gl.enableVertexAttribArray( attributes[ a ] );
41843
41844             }
41845
41846         }
41847
41848         if ( material.morphTargets ) {
41849
41850             material.numSupportedMorphTargets = 0;
41851
41852             var id, base = "morphTarget";
41853
41854             for ( i = 0; i < this.maxMorphTargets; i ++ ) {
41855
41856                 id = base + i;
41857
41858                 if ( attributes[ id ] >= 0 ) {
41859
41860                     _gl.enableVertexAttribArray( attributes[ id ] );
41861                     material.numSupportedMorphTargets ++;
41862
41863                 }
41864
41865             }
41866
41867         }
41868
41869         if ( material.morphNormals ) {
41870
41871             material.numSupportedMorphNormals = 0;
41872
41873             var id, base = "morphNormal";
41874
41875             for ( i = 0; i < this.maxMorphNormals; i ++ ) {
41876
41877                 id = base + i;
41878
41879                 if ( attributes[ id ] >= 0 ) {
41880
41881                     _gl.enableVertexAttribArray( attributes[ id ] );
41882                     material.numSupportedMorphNormals ++;
41883
41884                 }
41885
41886             }
41887
41888         }
41889
41890         material.uniformsList = [];
41891
41892         for ( u in material.uniforms ) {
41893
41894             material.uniformsList.push( [ material.uniforms[ u ], u ] );
41895
41896         }
41897
41898     };
41899
41900     function setMaterialShaders( material, shaders ) {
41901
41902         material.uniforms = THREE.UniformsUtils.clone( shaders.uniforms );
41903         material.vertexShader = shaders.vertexShader;
41904         material.fragmentShader = shaders.fragmentShader;
41905
41906     };
41907
41908     function setProgram( camera, lights, fog, material, object ) {
41909
41910         _usedTextureUnits = 0;
41911
41912         if ( material.needsUpdate ) {
41913
41914             if ( material.program ) _this.deallocateMaterial( material );
41915
41916             _this.initMaterial( material, lights, fog, object );
41917             material.needsUpdate = false;
41918
41919         }
41920
41921         if ( material.morphTargets ) {
41922
41923             if ( ! object.__webglMorphTargetInfluences ) {
41924
41925                 object.__webglMorphTargetInfluences = new Float32Array( _this.maxMorphTargets );
41926
41927             }
41928
41929         }
41930
41931         var refreshMaterial = false;
41932
41933         var program = material.program,
41934             p_uniforms = program.uniforms,
41935             m_uniforms = material.uniforms;
41936
41937         if ( program !== _currentProgram ) {
41938
41939             _gl.useProgram( program );
41940             _currentProgram = program;
41941
41942             refreshMaterial = true;
41943
41944         }
41945
41946         if ( material.id !== _currentMaterialId ) {
41947
41948             _currentMaterialId = material.id;
41949             refreshMaterial = true;
41950
41951         }
41952
41953         if ( refreshMaterial || camera !== _currentCamera ) {
41954
41955             _gl.uniformMatrix4fv( p_uniforms.projectionMatrix, false, camera._projectionMatrixArray );
41956
41957             if ( camera !== _currentCamera ) _currentCamera = camera;
41958
41959         }
41960
41961         // skinning uniforms must be set even if material didn't change
41962         // auto-setting of texture unit for bone texture must go before other textures
41963         // not sure why, but otherwise weird things happen
41964
41965         if ( material.skinning ) {
41966
41967             if ( _supportsBoneTextures && object.useVertexTexture ) {
41968
41969                 if ( p_uniforms.boneTexture !== null ) {
41970
41971                     var textureUnit = getTextureUnit();
41972
41973                     _gl.uniform1i( p_uniforms.boneTexture, textureUnit );
41974                     _this.setTexture( object.boneTexture, textureUnit );
41975
41976                 }
41977
41978             } else {
41979
41980                 if ( p_uniforms.boneGlobalMatrices !== null ) {
41981
41982                     _gl.uniformMatrix4fv( p_uniforms.boneGlobalMatrices, false, object.boneMatrices );
41983
41984                 }
41985
41986             }
41987
41988         }
41989
41990         if ( refreshMaterial ) {
41991
41992             // refresh uniforms common to several materials
41993
41994             if ( fog && material.fog ) {
41995
41996                 refreshUniformsFog( m_uniforms, fog );
41997
41998             }
41999
42000             if ( material instanceof THREE.MeshPhongMaterial ||
42001                  material instanceof THREE.MeshLambertMaterial ||
42002                  material.lights ) {
42003
42004                 if ( _lightsNeedUpdate ) {
42005
42006                     setupLights( program, lights );
42007                     _lightsNeedUpdate = false;
42008
42009                 }
42010
42011                 refreshUniformsLights( m_uniforms, _lights );
42012
42013             }
42014
42015             if ( material instanceof THREE.MeshBasicMaterial ||
42016                  material instanceof THREE.MeshLambertMaterial ||
42017                  material instanceof THREE.MeshPhongMaterial ) {
42018
42019                 refreshUniformsCommon( m_uniforms, material );
42020
42021             }
42022
42023             // refresh single material specific uniforms
42024
42025             if ( material instanceof THREE.LineBasicMaterial ) {
42026
42027                 refreshUniformsLine( m_uniforms, material );
42028
42029             } else if ( material instanceof THREE.ParticleBasicMaterial ) {
42030
42031                 refreshUniformsParticle( m_uniforms, material );
42032
42033             } else if ( material instanceof THREE.MeshPhongMaterial ) {
42034
42035                 refreshUniformsPhong( m_uniforms, material );
42036
42037             } else if ( material instanceof THREE.MeshLambertMaterial ) {
42038
42039                 refreshUniformsLambert( m_uniforms, material );
42040
42041             } else if ( material instanceof THREE.MeshDepthMaterial ) {
42042
42043                 m_uniforms.mNear.value = camera.near;
42044                 m_uniforms.mFar.value = camera.far;
42045                 m_uniforms.opacity.value = material.opacity;
42046
42047             } else if ( material instanceof THREE.MeshNormalMaterial ) {
42048
42049                 m_uniforms.opacity.value = material.opacity;
42050
42051             }
42052
42053             if ( object.receiveShadow && ! material._shadowPass ) {
42054
42055                 refreshUniformsShadow( m_uniforms, lights );
42056
42057             }
42058
42059             // load common uniforms
42060
42061             loadUniformsGeneric( program, material.uniformsList );
42062
42063             // load material specific uniforms
42064             // (shader material also gets them for the sake of genericity)
42065
42066             if ( material instanceof THREE.ShaderMaterial ||
42067                  material instanceof THREE.MeshPhongMaterial ||
42068                  material.envMap ) {
42069
42070                 if ( p_uniforms.cameraPosition !== null ) {
42071
42072                     var position = camera.matrixWorld.getPosition();
42073                     _gl.uniform3f( p_uniforms.cameraPosition, position.x, position.y, position.z );
42074
42075                 }
42076
42077             }
42078
42079             if ( material instanceof THREE.MeshPhongMaterial ||
42080                  material instanceof THREE.MeshLambertMaterial ||
42081                  material instanceof THREE.ShaderMaterial ||
42082                  material.skinning ) {
42083
42084                 if ( p_uniforms.viewMatrix !== null ) {
42085
42086                     _gl.uniformMatrix4fv( p_uniforms.viewMatrix, false, camera._viewMatrixArray );
42087
42088                 }
42089
42090             }
42091
42092         }
42093
42094         loadUniformsMatrices( p_uniforms, object );
42095
42096         if ( p_uniforms.modelMatrix !== null ) {
42097
42098             _gl.uniformMatrix4fv( p_uniforms.modelMatrix, false, object.matrixWorld.elements );
42099
42100         }
42101
42102         return program;
42103
42104     };
42105
42106     // Uniforms (refresh uniforms objects)
42107
42108     function refreshUniformsCommon ( uniforms, material ) {
42109
42110         uniforms.opacity.value = material.opacity;
42111
42112         if ( _this.gammaInput ) {
42113
42114             uniforms.diffuse.value.copyGammaToLinear( material.color );
42115
42116         } else {
42117
42118             uniforms.diffuse.value = material.color;
42119
42120         }
42121
42122         uniforms.map.value = material.map;
42123         uniforms.lightMap.value = material.lightMap;
42124         uniforms.specularMap.value = material.specularMap;
42125
42126         if ( material.bumpMap ) {
42127
42128             uniforms.bumpMap.value = material.bumpMap;
42129             uniforms.bumpScale.value = material.bumpScale;
42130
42131         }
42132
42133         if ( material.normalMap ) {
42134
42135             uniforms.normalMap.value = material.normalMap;
42136             uniforms.normalScale.value.copy( material.normalScale );
42137
42138         }
42139
42140         // uv repeat and offset setting priorities
42141         //    1. color map
42142         //    2. specular map
42143         //    3. normal map
42144         //    4. bump map
42145
42146         var uvScaleMap;
42147
42148         if ( material.map ) {
42149
42150             uvScaleMap = material.map;
42151
42152         } else if ( material.specularMap ) {
42153
42154             uvScaleMap = material.specularMap;
42155
42156         } else if ( material.normalMap ) {
42157
42158             uvScaleMap = material.normalMap;
42159
42160         } else if ( material.bumpMap ) {
42161
42162             uvScaleMap = material.bumpMap;
42163
42164         }
42165
42166         if ( uvScaleMap !== undefined ) {
42167
42168             var offset = uvScaleMap.offset;
42169             var repeat = uvScaleMap.repeat;
42170
42171             uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );
42172
42173         }
42174
42175         uniforms.envMap.value = material.envMap;
42176         uniforms.flipEnvMap.value = ( material.envMap instanceof THREE.WebGLRenderTargetCube ) ? 1 : -1;
42177
42178         if ( _this.gammaInput ) {
42179
42180             //uniforms.reflectivity.value = material.reflectivity * material.reflectivity;
42181             uniforms.reflectivity.value = material.reflectivity;
42182
42183         } else {
42184
42185             uniforms.reflectivity.value = material.reflectivity;
42186
42187         }
42188
42189         uniforms.refractionRatio.value = material.refractionRatio;
42190         uniforms.combine.value = material.combine;
42191         uniforms.useRefract.value = material.envMap && material.envMap.mapping instanceof THREE.CubeRefractionMapping;
42192
42193     };
42194
42195     function refreshUniformsLine ( uniforms, material ) {
42196
42197         uniforms.diffuse.value = material.color;
42198         uniforms.opacity.value = material.opacity;
42199
42200     };
42201
42202     function refreshUniformsParticle ( uniforms, material ) {
42203
42204         uniforms.psColor.value = material.color;
42205         uniforms.opacity.value = material.opacity;
42206         uniforms.size.value = material.size;
42207         uniforms.scale.value = _canvas.height / 2.0; // TODO: Cache this.
42208
42209         uniforms.map.value = material.map;
42210
42211     };
42212
42213     function refreshUniformsFog ( uniforms, fog ) {
42214
42215         uniforms.fogColor.value = fog.color;
42216
42217         if ( fog instanceof THREE.Fog ) {
42218
42219             uniforms.fogNear.value = fog.near;
42220             uniforms.fogFar.value = fog.far;
42221
42222         } else if ( fog instanceof THREE.FogExp2 ) {
42223
42224             uniforms.fogDensity.value = fog.density;
42225
42226         }
42227
42228     };
42229
42230     function refreshUniformsPhong ( uniforms, material ) {
42231
42232         uniforms.shininess.value = material.shininess;
42233
42234         if ( _this.gammaInput ) {
42235
42236             uniforms.ambient.value.copyGammaToLinear( material.ambient );
42237             uniforms.emissive.value.copyGammaToLinear( material.emissive );
42238             uniforms.specular.value.copyGammaToLinear( material.specular );
42239
42240         } else {
42241
42242             uniforms.ambient.value = material.ambient;
42243             uniforms.emissive.value = material.emissive;
42244             uniforms.specular.value = material.specular;
42245
42246         }
42247
42248         if ( material.wrapAround ) {
42249
42250             uniforms.wrapRGB.value.copy( material.wrapRGB );
42251
42252         }
42253
42254     };
42255
42256     function refreshUniformsLambert ( uniforms, material ) {
42257
42258         if ( _this.gammaInput ) {
42259
42260             uniforms.ambient.value.copyGammaToLinear( material.ambient );
42261             uniforms.emissive.value.copyGammaToLinear( material.emissive );
42262
42263         } else {
42264
42265             uniforms.ambient.value = material.ambient;
42266             uniforms.emissive.value = material.emissive;
42267
42268         }
42269
42270         if ( material.wrapAround ) {
42271
42272             uniforms.wrapRGB.value.copy( material.wrapRGB );
42273
42274         }
42275
42276     };
42277
42278     function refreshUniformsLights ( uniforms, lights ) {
42279
42280         uniforms.ambientLightColor.value = lights.ambient;
42281
42282         uniforms.directionalLightColor.value = lights.directional.colors;
42283         uniforms.directionalLightDirection.value = lights.directional.positions;
42284
42285         uniforms.pointLightColor.value = lights.point.colors;
42286         uniforms.pointLightPosition.value = lights.point.positions;
42287         uniforms.pointLightDistance.value = lights.point.distances;
42288
42289         uniforms.spotLightColor.value = lights.spot.colors;
42290         uniforms.spotLightPosition.value = lights.spot.positions;
42291         uniforms.spotLightDistance.value = lights.spot.distances;
42292         uniforms.spotLightDirection.value = lights.spot.directions;
42293         uniforms.spotLightAngle.value = lights.spot.angles;
42294         uniforms.spotLightExponent.value = lights.spot.exponents;
42295
42296         uniforms.hemisphereLightSkyColor.value = lights.hemi.skyColors;
42297         uniforms.hemisphereLightGroundColor.value = lights.hemi.groundColors;
42298         uniforms.hemisphereLightPosition.value = lights.hemi.positions;
42299
42300     };
42301
42302     function refreshUniformsShadow ( uniforms, lights ) {
42303
42304         if ( uniforms.shadowMatrix ) {
42305
42306             var j = 0;
42307
42308             for ( var i = 0, il = lights.length; i < il; i ++ ) {
42309
42310                 var light = lights[ i ];
42311
42312                 if ( ! light.castShadow ) continue;
42313
42314                 if ( light instanceof THREE.SpotLight || ( light instanceof THREE.DirectionalLight && ! light.shadowCascade ) ) {
42315
42316                     uniforms.shadowMap.value[ j ] = light.shadowMap;
42317                     uniforms.shadowMapSize.value[ j ] = light.shadowMapSize;
42318
42319                     uniforms.shadowMatrix.value[ j ] = light.shadowMatrix;
42320
42321                     uniforms.shadowDarkness.value[ j ] = light.shadowDarkness;
42322                     uniforms.shadowBias.value[ j ] = light.shadowBias;
42323
42324                     j ++;
42325
42326                 }
42327
42328             }
42329
42330         }
42331
42332     };
42333
42334     // Uniforms (load to GPU)
42335
42336     function loadUniformsMatrices ( uniforms, object ) {
42337
42338         _gl.uniformMatrix4fv( uniforms.modelViewMatrix, false, object._modelViewMatrix.elements );
42339
42340         if ( uniforms.normalMatrix ) {
42341
42342             _gl.uniformMatrix3fv( uniforms.normalMatrix, false, object._normalMatrix.elements );
42343
42344         }
42345
42346     };
42347
42348     function getTextureUnit() {
42349
42350         var textureUnit = _usedTextureUnits;
42351
42352         if ( textureUnit >= _maxTextures ) {
42353
42354             console.warn( "Trying to use " + textureUnit + " texture units while this GPU supports only " + _maxTextures );
42355
42356         }
42357
42358         _usedTextureUnits += 1;
42359
42360         return textureUnit;
42361
42362     };
42363
42364     function loadUniformsGeneric ( program, uniforms ) {
42365
42366         var uniform, value, type, location, texture, textureUnit, i, il, j, jl, offset;
42367
42368         for ( j = 0, jl = uniforms.length; j < jl; j ++ ) {
42369
42370             location = program.uniforms[ uniforms[ j ][ 1 ] ];
42371             if ( !location ) continue;
42372
42373             uniform = uniforms[ j ][ 0 ];
42374
42375             type = uniform.type;
42376             value = uniform.value;
42377
42378             if ( type === "i" ) { // single integer
42379
42380                 _gl.uniform1i( location, value );
42381
42382             } else if ( type === "f" ) { // single float
42383
42384                 _gl.uniform1f( location, value );
42385
42386             } else if ( type === "v2" ) { // single THREE.Vector2
42387
42388                 _gl.uniform2f( location, value.x, value.y );
42389
42390             } else if ( type === "v3" ) { // single THREE.Vector3
42391
42392                 _gl.uniform3f( location, value.x, value.y, value.z );
42393
42394             } else if ( type === "v4" ) { // single THREE.Vector4
42395
42396                 _gl.uniform4f( location, value.x, value.y, value.z, value.w );
42397
42398             } else if ( type === "c" ) { // single THREE.Color
42399
42400                 _gl.uniform3f( location, value.r, value.g, value.b );
42401
42402             } else if ( type === "iv1" ) { // flat array of integers (JS or typed array)
42403
42404                 _gl.uniform1iv( location, value );
42405
42406             } else if ( type === "iv" ) { // flat array of integers with 3 x N size (JS or typed array)
42407
42408                 _gl.uniform3iv( location, value );
42409
42410             } else if ( type === "fv1" ) { // flat array of floats (JS or typed array)
42411
42412                 _gl.uniform1fv( location, value );
42413
42414             } else if ( type === "fv" ) { // flat array of floats with 3 x N size (JS or typed array)
42415
42416                 _gl.uniform3fv( location, value );
42417
42418             } else if ( type === "v2v" ) { // array of THREE.Vector2
42419
42420                 if ( uniform._array === undefined ) {
42421
42422                     uniform._array = new Float32Array( 2 * value.length );
42423
42424                 }
42425
42426                 for ( i = 0, il = value.length; i < il; i ++ ) {
42427
42428                     offset = i * 2;
42429
42430                     uniform._array[ offset ]      = value[ i ].x;
42431                     uniform._array[ offset + 1 ] = value[ i ].y;
42432
42433                 }
42434
42435                 _gl.uniform2fv( location, uniform._array );
42436
42437             } else if ( type === "v3v" ) { // array of THREE.Vector3
42438
42439                 if ( uniform._array === undefined ) {
42440
42441                     uniform._array = new Float32Array( 3 * value.length );
42442
42443                 }
42444
42445                 for ( i = 0, il = value.length; i < il; i ++ ) {
42446
42447                     offset = i * 3;
42448
42449                     uniform._array[ offset ]      = value[ i ].x;
42450                     uniform._array[ offset + 1 ] = value[ i ].y;
42451                     uniform._array[ offset + 2 ] = value[ i ].z;
42452
42453                 }
42454
42455                 _gl.uniform3fv( location, uniform._array );
42456
42457             } else if ( type === "v4v" ) { // array of THREE.Vector4
42458
42459                 if ( uniform._array === undefined ) {
42460
42461                     uniform._array = new Float32Array( 4 * value.length );
42462
42463                 }
42464
42465                 for ( i = 0, il = value.length; i < il; i ++ ) {
42466
42467                     offset = i * 4;
42468
42469                     uniform._array[ offset ]      = value[ i ].x;
42470                     uniform._array[ offset + 1 ] = value[ i ].y;
42471                     uniform._array[ offset + 2 ] = value[ i ].z;
42472                     uniform._array[ offset + 3 ] = value[ i ].w;
42473
42474                 }
42475
42476                 _gl.uniform4fv( location, uniform._array );
42477
42478             } else if ( type === "m4") { // single THREE.Matrix4
42479
42480                 if ( uniform._array === undefined ) {
42481
42482                     uniform._array = new Float32Array( 16 );
42483
42484                 }
42485
42486                 value.flattenToArray( uniform._array );
42487                 _gl.uniformMatrix4fv( location, false, uniform._array );
42488
42489             } else if ( type === "m4v" ) { // array of THREE.Matrix4
42490
42491                 if ( uniform._array === undefined ) {
42492
42493                     uniform._array = new Float32Array( 16 * value.length );
42494
42495                 }
42496
42497                 for ( i = 0, il = value.length; i < il; i ++ ) {
42498
42499                     value[ i ].flattenToArrayOffset( uniform._array, i * 16 );
42500
42501                 }
42502
42503                 _gl.uniformMatrix4fv( location, false, uniform._array );
42504
42505             } else if ( type === "t" ) { // single THREE.Texture (2d or cube)
42506
42507                 texture = value;
42508                 textureUnit = getTextureUnit();
42509
42510                 _gl.uniform1i( location, textureUnit );
42511
42512                 if ( !texture ) continue;
42513
42514                 if ( texture.image instanceof Array && texture.image.length === 6 ) {
42515
42516                     setCubeTexture( texture, textureUnit );
42517
42518                 } else if ( texture instanceof THREE.WebGLRenderTargetCube ) {
42519
42520                     setCubeTextureDynamic( texture, textureUnit );
42521
42522                 } else {
42523
42524                     _this.setTexture( texture, textureUnit );
42525
42526                 }
42527
42528             } else if ( type === "tv" ) { // array of THREE.Texture (2d)
42529
42530                 if ( uniform._array === undefined ) {
42531
42532                     uniform._array = [];
42533
42534                 }
42535
42536                 for( i = 0, il = uniform.value.length; i < il; i ++ ) {
42537
42538                     uniform._array[ i ] = getTextureUnit();
42539
42540                 }
42541
42542                 _gl.uniform1iv( location, uniform._array );
42543
42544                 for( i = 0, il = uniform.value.length; i < il; i ++ ) {
42545
42546                     texture = uniform.value[ i ];
42547                     textureUnit = uniform._array[ i ];
42548
42549                     if ( !texture ) continue;
42550
42551                     _this.setTexture( texture, textureUnit );
42552
42553                 }
42554
42555             }
42556
42557         }
42558
42559     };
42560
42561     function setupMatrices ( object, camera ) {
42562
42563         object._modelViewMatrix.multiply( camera.matrixWorldInverse, object.matrixWorld );
42564
42565         object._normalMatrix.getInverse( object._modelViewMatrix );
42566         object._normalMatrix.transpose();
42567
42568     };
42569
42570     //
42571
42572     function setColorGamma( array, offset, color, intensitySq ) {
42573
42574         array[ offset ]     = color.r * color.r * intensitySq;
42575         array[ offset + 1 ] = color.g * color.g * intensitySq;
42576         array[ offset + 2 ] = color.b * color.b * intensitySq;
42577
42578     };
42579
42580     function setColorLinear( array, offset, color, intensity ) {
42581
42582         array[ offset ]     = color.r * intensity;
42583         array[ offset + 1 ] = color.g * intensity;
42584         array[ offset + 2 ] = color.b * intensity;
42585
42586     };
42587
42588     function setupLights ( program, lights ) {
42589
42590         var l, ll, light, n,
42591         r = 0, g = 0, b = 0,
42592         color, skyColor, groundColor,
42593         intensity,  intensitySq,
42594         position,
42595         distance,
42596
42597         zlights = _lights,
42598
42599         dirColors = zlights.directional.colors,
42600         dirPositions = zlights.directional.positions,
42601
42602         pointColors = zlights.point.colors,
42603         pointPositions = zlights.point.positions,
42604         pointDistances = zlights.point.distances,
42605
42606         spotColors = zlights.spot.colors,
42607         spotPositions = zlights.spot.positions,
42608         spotDistances = zlights.spot.distances,
42609         spotDirections = zlights.spot.directions,
42610         spotAngles = zlights.spot.angles,
42611         spotExponents = zlights.spot.exponents,
42612
42613         hemiSkyColors = zlights.hemi.skyColors,
42614         hemiGroundColors = zlights.hemi.groundColors,
42615         hemiPositions = zlights.hemi.positions,
42616
42617         dirLength = 0,
42618         pointLength = 0,
42619         spotLength = 0,
42620         hemiLength = 0,
42621
42622         dirOffset = 0,
42623         pointOffset = 0,
42624         spotOffset = 0,
42625         hemiOffset = 0;
42626
42627         for ( l = 0, ll = lights.length; l < ll; l ++ ) {
42628
42629             light = lights[ l ];
42630
42631             if ( light.onlyShadow || ! light.visible ) continue;
42632
42633             color = light.color;
42634             intensity = light.intensity;
42635             distance = light.distance;
42636
42637             if ( light instanceof THREE.AmbientLight ) {
42638
42639                 if ( _this.gammaInput ) {
42640
42641                     r += color.r * color.r;
42642                     g += color.g * color.g;
42643                     b += color.b * color.b;
42644
42645                 } else {
42646
42647                     r += color.r;
42648                     g += color.g;
42649                     b += color.b;
42650
42651                 }
42652
42653             } else if ( light instanceof THREE.DirectionalLight ) {
42654
42655                 dirOffset = dirLength * 3;
42656
42657                 if ( _this.gammaInput ) {
42658
42659                     setColorGamma( dirColors, dirOffset, color, intensity * intensity );
42660
42661                 } else {
42662
42663                     setColorLinear( dirColors, dirOffset, color, intensity );
42664
42665                 }
42666
42667                 _direction.copy( light.matrixWorld.getPosition() );
42668                 _direction.subSelf( light.target.matrixWorld.getPosition() );
42669                 _direction.normalize();
42670
42671                 dirPositions[ dirOffset ]     = _direction.x;
42672                 dirPositions[ dirOffset + 1 ] = _direction.y;
42673                 dirPositions[ dirOffset + 2 ] = _direction.z;
42674
42675                 dirLength += 1;
42676
42677             } else if( light instanceof THREE.PointLight ) {
42678
42679                 pointOffset = pointLength * 3;
42680
42681                 if ( _this.gammaInput ) {
42682
42683                     setColorGamma( pointColors, pointOffset, color, intensity * intensity );
42684
42685                 } else {
42686
42687                     setColorLinear( pointColors, pointOffset, color, intensity );
42688
42689                 }
42690
42691                 position = light.matrixWorld.getPosition();
42692
42693                 pointPositions[ pointOffset ]     = position.x;
42694                 pointPositions[ pointOffset + 1 ] = position.y;
42695                 pointPositions[ pointOffset + 2 ] = position.z;
42696
42697                 pointDistances[ pointLength ] = distance;
42698
42699                 pointLength += 1;
42700
42701             } else if( light instanceof THREE.SpotLight ) {
42702
42703                 spotOffset = spotLength * 3;
42704
42705                 if ( _this.gammaInput ) {
42706
42707                     setColorGamma( spotColors, spotOffset, color, intensity * intensity );
42708
42709                 } else {
42710
42711                     setColorLinear( spotColors, spotOffset, color, intensity );
42712
42713                 }
42714
42715                 position = light.matrixWorld.getPosition();
42716
42717                 spotPositions[ spotOffset ]     = position.x;
42718                 spotPositions[ spotOffset + 1 ] = position.y;
42719                 spotPositions[ spotOffset + 2 ] = position.z;
42720
42721                 spotDistances[ spotLength ] = distance;
42722
42723                 _direction.copy( position );
42724                 _direction.subSelf( light.target.matrixWorld.getPosition() );
42725                 _direction.normalize();
42726
42727                 spotDirections[ spotOffset ]     = _direction.x;
42728                 spotDirections[ spotOffset + 1 ] = _direction.y;
42729                 spotDirections[ spotOffset + 2 ] = _direction.z;
42730
42731                 spotAngles[ spotLength ] = Math.cos( light.angle );
42732                 spotExponents[ spotLength ] = light.exponent;
42733
42734                 spotLength += 1;
42735
42736             } else if ( light instanceof THREE.HemisphereLight ) {
42737
42738                 skyColor = light.color;
42739                 groundColor = light.groundColor;
42740
42741                 hemiOffset = hemiLength * 3;
42742
42743                 if ( _this.gammaInput ) {
42744
42745                     intensitySq = intensity * intensity;
42746
42747                     setColorGamma( hemiSkyColors, hemiOffset, skyColor, intensitySq );
42748                     setColorGamma( hemiGroundColors, hemiOffset, groundColor, intensitySq );
42749
42750                 } else {
42751
42752                     setColorLinear( hemiSkyColors, hemiOffset, skyColor, intensity );
42753                     setColorLinear( hemiGroundColors, hemiOffset, groundColor, intensity );
42754
42755                 }
42756
42757                 position = light.matrixWorld.getPosition();
42758
42759                 hemiPositions[ hemiOffset ]     = position.x;
42760                 hemiPositions[ hemiOffset + 1 ] = position.y;
42761                 hemiPositions[ hemiOffset + 2 ] = position.z;
42762
42763                 hemiLength += 1;
42764
42765             }
42766
42767         }
42768
42769         // null eventual remains from removed lights
42770         // (this is to avoid if in shader)
42771
42772         for ( l = dirLength * 3, ll = dirColors.length; l < ll; l ++ ) dirColors[ l ] = 0.0;
42773         for ( l = pointLength * 3, ll = pointColors.length; l < ll; l ++ ) pointColors[ l ] = 0.0;
42774         for ( l = spotLength * 3, ll = spotColors.length; l < ll; l ++ ) spotColors[ l ] = 0.0;
42775         for ( l = hemiLength * 3, ll = hemiSkyColors.length; l < ll; l ++ ) hemiSkyColors[ l ] = 0.0;
42776         for ( l = hemiLength * 3, ll = hemiGroundColors.length; l < ll; l ++ ) hemiGroundColors[ l ] = 0.0;
42777
42778         zlights.directional.length = dirLength;
42779         zlights.point.length = pointLength;
42780         zlights.spot.length = spotLength;
42781         zlights.hemi.length = hemiLength;
42782
42783         zlights.ambient[ 0 ] = r;
42784         zlights.ambient[ 1 ] = g;
42785         zlights.ambient[ 2 ] = b;
42786
42787     };
42788
42789     // GL state setting
42790
42791     this.setFaceCulling = function ( cullFace, frontFace ) {
42792
42793         if ( cullFace ) {
42794
42795             if ( !frontFace || frontFace === "ccw" ) {
42796
42797                 _gl.frontFace( _gl.CCW );
42798
42799             } else {
42800
42801                 _gl.frontFace( _gl.CW );
42802
42803             }
42804
42805             if( cullFace === "back" ) {
42806
42807                 _gl.cullFace( _gl.BACK );
42808
42809             } else if( cullFace === "front" ) {
42810
42811                 _gl.cullFace( _gl.FRONT );
42812
42813             } else {
42814
42815                 _gl.cullFace( _gl.FRONT_AND_BACK );
42816
42817             }
42818
42819             _gl.enable( _gl.CULL_FACE );
42820
42821         } else {
42822
42823             _gl.disable( _gl.CULL_FACE );
42824
42825         }
42826
42827     };
42828
42829     this.setMaterialFaces = function ( material ) {
42830
42831         var doubleSided = material.side === THREE.DoubleSide;
42832         var flipSided = material.side === THREE.BackSide;
42833
42834         if ( _oldDoubleSided !== doubleSided ) {
42835
42836             if ( doubleSided ) {
42837
42838                 _gl.disable( _gl.CULL_FACE );
42839
42840             } else {
42841
42842                 _gl.enable( _gl.CULL_FACE );
42843
42844             }
42845
42846             _oldDoubleSided = doubleSided;
42847
42848         }
42849
42850         if ( _oldFlipSided !== flipSided ) {
42851
42852             if ( flipSided ) {
42853
42854                 _gl.frontFace( _gl.CW );
42855
42856             } else {
42857
42858                 _gl.frontFace( _gl.CCW );
42859
42860             }
42861
42862             _oldFlipSided = flipSided;
42863
42864         }
42865
42866     };
42867
42868     this.setDepthTest = function ( depthTest ) {
42869
42870         if ( _oldDepthTest !== depthTest ) {
42871
42872             if ( depthTest ) {
42873
42874                 _gl.enable( _gl.DEPTH_TEST );
42875
42876             } else {
42877
42878                 _gl.disable( _gl.DEPTH_TEST );
42879
42880             }
42881
42882             _oldDepthTest = depthTest;
42883
42884         }
42885
42886     };
42887
42888     this.setDepthWrite = function ( depthWrite ) {
42889
42890         if ( _oldDepthWrite !== depthWrite ) {
42891
42892             _gl.depthMask( depthWrite );
42893             _oldDepthWrite = depthWrite;
42894
42895         }
42896
42897     };
42898
42899     function setLineWidth ( width ) {
42900
42901         if ( width !== _oldLineWidth ) {
42902
42903             _gl.lineWidth( width );
42904
42905             _oldLineWidth = width;
42906
42907         }
42908
42909     };
42910
42911     function setPolygonOffset ( polygonoffset, factor, units ) {
42912
42913         if ( _oldPolygonOffset !== polygonoffset ) {
42914
42915             if ( polygonoffset ) {
42916
42917                 _gl.enable( _gl.POLYGON_OFFSET_FILL );
42918
42919             } else {
42920
42921                 _gl.disable( _gl.POLYGON_OFFSET_FILL );
42922
42923             }
42924
42925             _oldPolygonOffset = polygonoffset;
42926
42927         }
42928
42929         if ( polygonoffset && ( _oldPolygonOffsetFactor !== factor || _oldPolygonOffsetUnits !== units ) ) {
42930
42931             _gl.polygonOffset( factor, units );
42932
42933             _oldPolygonOffsetFactor = factor;
42934             _oldPolygonOffsetUnits = units;
42935
42936         }
42937
42938     };
42939
42940     this.setBlending = function ( blending, blendEquation, blendSrc, blendDst ) {
42941
42942         if ( blending !== _oldBlending ) {
42943
42944             if ( blending === THREE.NoBlending ) {
42945
42946                 _gl.disable( _gl.BLEND );
42947
42948             } else if ( blending === THREE.AdditiveBlending ) {
42949
42950                 _gl.enable( _gl.BLEND );
42951                 _gl.blendEquation( _gl.FUNC_ADD );
42952                 _gl.blendFunc( _gl.SRC_ALPHA, _gl.ONE );
42953
42954             } else if ( blending === THREE.SubtractiveBlending ) {
42955
42956                 // TODO: Find blendFuncSeparate() combination
42957                 _gl.enable( _gl.BLEND );
42958                 _gl.blendEquation( _gl.FUNC_ADD );
42959                 _gl.blendFunc( _gl.ZERO, _gl.ONE_MINUS_SRC_COLOR );
42960
42961             } else if ( blending === THREE.MultiplyBlending ) {
42962
42963                 // TODO: Find blendFuncSeparate() combination
42964                 _gl.enable( _gl.BLEND );
42965                 _gl.blendEquation( _gl.FUNC_ADD );
42966                 _gl.blendFunc( _gl.ZERO, _gl.SRC_COLOR );
42967
42968             } else if ( blending === THREE.CustomBlending ) {
42969
42970                 _gl.enable( _gl.BLEND );
42971
42972             } else {
42973
42974                 _gl.enable( _gl.BLEND );
42975                 _gl.blendEquationSeparate( _gl.FUNC_ADD, _gl.FUNC_ADD );
42976                 _gl.blendFuncSeparate( _gl.SRC_ALPHA, _gl.ONE_MINUS_SRC_ALPHA, _gl.ONE, _gl.ONE_MINUS_SRC_ALPHA );
42977
42978             }
42979
42980             _oldBlending = blending;
42981
42982         }
42983
42984         if ( blending === THREE.CustomBlending ) {
42985
42986             if ( blendEquation !== _oldBlendEquation ) {
42987
42988                 _gl.blendEquation( paramThreeToGL( blendEquation ) );
42989
42990                 _oldBlendEquation = blendEquation;
42991
42992             }
42993
42994             if ( blendSrc !== _oldBlendSrc || blendDst !== _oldBlendDst ) {
42995
42996                 _gl.blendFunc( paramThreeToGL( blendSrc ), paramThreeToGL( blendDst ) );
42997
42998                 _oldBlendSrc = blendSrc;
42999                 _oldBlendDst = blendDst;
43000
43001             }
43002
43003         } else {
43004
43005             _oldBlendEquation = null;
43006             _oldBlendSrc = null;
43007             _oldBlendDst = null;
43008
43009         }
43010
43011     };
43012
43013     // Shaders
43014
43015     function buildProgram ( shaderID, fragmentShader, vertexShader, uniforms, attributes, parameters ) {
43016
43017         var p, pl, program, code;
43018         var chunks = [];
43019
43020         // Generate code
43021
43022         if ( shaderID ) {
43023
43024             chunks.push( shaderID );
43025
43026         } else {
43027
43028             chunks.push( fragmentShader );
43029             chunks.push( vertexShader );
43030
43031         }
43032
43033         for ( p in parameters ) {
43034
43035             chunks.push( p );
43036             chunks.push( parameters[ p ] );
43037
43038         }
43039
43040         code = chunks.join();
43041
43042         // Check if code has been already compiled
43043
43044         for ( p = 0, pl = _programs.length; p < pl; p ++ ) {
43045
43046             var programInfo = _programs[ p ];
43047
43048             if ( programInfo.code === code ) {
43049
43050                 // console.log( "Code already compiled." /*: \n\n" + code*/ );
43051
43052                 programInfo.usedTimes ++;
43053
43054                 return programInfo.program;
43055
43056             }
43057
43058         }
43059
43060         //console.log( "building new program " );
43061
43062         //
43063
43064         program = _gl.createProgram();
43065
43066         var prefix_vertex = [
43067
43068             "precision " + _precision + " float;",
43069
43070             _supportsVertexTextures ? "#define VERTEX_TEXTURES" : "",
43071
43072             _this.gammaInput ? "#define GAMMA_INPUT" : "",
43073             _this.gammaOutput ? "#define GAMMA_OUTPUT" : "",
43074             _this.physicallyBasedShading ? "#define PHYSICALLY_BASED_SHADING" : "",
43075
43076             "#define MAX_DIR_LIGHTS " + parameters.maxDirLights,
43077             "#define MAX_POINT_LIGHTS " + parameters.maxPointLights,
43078             "#define MAX_SPOT_LIGHTS " + parameters.maxSpotLights,
43079             "#define MAX_HEMI_LIGHTS " + parameters.maxHemiLights,
43080
43081             "#define MAX_SHADOWS " + parameters.maxShadows,
43082
43083             "#define MAX_BONES " + parameters.maxBones,
43084
43085             parameters.map ? "#define USE_MAP" : "",
43086             parameters.envMap ? "#define USE_ENVMAP" : "",
43087             parameters.lightMap ? "#define USE_LIGHTMAP" : "",
43088             parameters.bumpMap ? "#define USE_BUMPMAP" : "",
43089             parameters.normalMap ? "#define USE_NORMALMAP" : "",
43090             parameters.specularMap ? "#define USE_SPECULARMAP" : "",
43091             parameters.vertexColors ? "#define USE_COLOR" : "",
43092
43093             parameters.skinning ? "#define USE_SKINNING" : "",
43094             parameters.useVertexTexture ? "#define BONE_TEXTURE" : "",
43095             parameters.boneTextureWidth ? "#define N_BONE_PIXEL_X " + parameters.boneTextureWidth.toFixed( 1 ) : "",
43096             parameters.boneTextureHeight ? "#define N_BONE_PIXEL_Y " + parameters.boneTextureHeight.toFixed( 1 ) : "",
43097
43098             parameters.morphTargets ? "#define USE_MORPHTARGETS" : "",
43099             parameters.morphNormals ? "#define USE_MORPHNORMALS" : "",
43100             parameters.perPixel ? "#define PHONG_PER_PIXEL" : "",
43101             parameters.wrapAround ? "#define WRAP_AROUND" : "",
43102             parameters.doubleSided ? "#define DOUBLE_SIDED" : "",
43103             parameters.flipSided ? "#define FLIP_SIDED" : "",
43104
43105             parameters.shadowMapEnabled ? "#define USE_SHADOWMAP" : "",
43106             parameters.shadowMapSoft ? "#define SHADOWMAP_SOFT" : "",
43107             parameters.shadowMapDebug ? "#define SHADOWMAP_DEBUG" : "",
43108             parameters.shadowMapCascade ? "#define SHADOWMAP_CASCADE" : "",
43109
43110             parameters.sizeAttenuation ? "#define USE_SIZEATTENUATION" : "",
43111
43112             "uniform mat4 modelMatrix;",
43113             "uniform mat4 modelViewMatrix;",
43114             "uniform mat4 projectionMatrix;",
43115             "uniform mat4 viewMatrix;",
43116             "uniform mat3 normalMatrix;",
43117             "uniform vec3 cameraPosition;",
43118
43119             "attribute vec3 position;",
43120             "attribute vec3 normal;",
43121             "attribute vec2 uv;",
43122             "attribute vec2 uv2;",
43123
43124             "#ifdef USE_COLOR",
43125
43126                 "attribute vec3 color;",
43127
43128             "#endif",
43129
43130             "#ifdef USE_MORPHTARGETS",
43131
43132                 "attribute vec3 morphTarget0;",
43133                 "attribute vec3 morphTarget1;",
43134                 "attribute vec3 morphTarget2;",
43135                 "attribute vec3 morphTarget3;",
43136
43137                 "#ifdef USE_MORPHNORMALS",
43138
43139                     "attribute vec3 morphNormal0;",
43140                     "attribute vec3 morphNormal1;",
43141                     "attribute vec3 morphNormal2;",
43142                     "attribute vec3 morphNormal3;",
43143
43144                 "#else",
43145
43146                     "attribute vec3 morphTarget4;",
43147                     "attribute vec3 morphTarget5;",
43148                     "attribute vec3 morphTarget6;",
43149                     "attribute vec3 morphTarget7;",
43150
43151                 "#endif",
43152
43153             "#endif",
43154
43155             "#ifdef USE_SKINNING",
43156
43157                 "attribute vec4 skinIndex;",
43158                 "attribute vec4 skinWeight;",
43159
43160             "#endif",
43161
43162             ""
43163
43164         ].join("\n");
43165
43166         var prefix_fragment = [
43167
43168             "precision " + _precision + " float;",
43169
43170             ( parameters.bumpMap || parameters.normalMap ) ? "#extension GL_OES_standard_derivatives : enable" : "",
43171
43172             "#define MAX_DIR_LIGHTS " + parameters.maxDirLights,
43173             "#define MAX_POINT_LIGHTS " + parameters.maxPointLights,
43174             "#define MAX_SPOT_LIGHTS " + parameters.maxSpotLights,
43175             "#define MAX_HEMI_LIGHTS " + parameters.maxHemiLights,
43176
43177             "#define MAX_SHADOWS " + parameters.maxShadows,
43178
43179             parameters.alphaTest ? "#define ALPHATEST " + parameters.alphaTest: "",
43180
43181             _this.gammaInput ? "#define GAMMA_INPUT" : "",
43182             _this.gammaOutput ? "#define GAMMA_OUTPUT" : "",
43183             _this.physicallyBasedShading ? "#define PHYSICALLY_BASED_SHADING" : "",
43184
43185             ( parameters.useFog && parameters.fog ) ? "#define USE_FOG" : "",
43186             ( parameters.useFog && parameters.fog instanceof THREE.FogExp2 ) ? "#define FOG_EXP2" : "",
43187
43188             parameters.map ? "#define USE_MAP" : "",
43189             parameters.envMap ? "#define USE_ENVMAP" : "",
43190             parameters.lightMap ? "#define USE_LIGHTMAP" : "",
43191             parameters.bumpMap ? "#define USE_BUMPMAP" : "",
43192             parameters.normalMap ? "#define USE_NORMALMAP" : "",
43193             parameters.specularMap ? "#define USE_SPECULARMAP" : "",
43194             parameters.vertexColors ? "#define USE_COLOR" : "",
43195
43196             parameters.metal ? "#define METAL" : "",
43197             parameters.perPixel ? "#define PHONG_PER_PIXEL" : "",
43198             parameters.wrapAround ? "#define WRAP_AROUND" : "",
43199             parameters.doubleSided ? "#define DOUBLE_SIDED" : "",
43200             parameters.flipSided ? "#define FLIP_SIDED" : "",
43201
43202             parameters.shadowMapEnabled ? "#define USE_SHADOWMAP" : "",
43203             parameters.shadowMapSoft ? "#define SHADOWMAP_SOFT" : "",
43204             parameters.shadowMapDebug ? "#define SHADOWMAP_DEBUG" : "",
43205             parameters.shadowMapCascade ? "#define SHADOWMAP_CASCADE" : "",
43206
43207             "uniform mat4 viewMatrix;",
43208             "uniform vec3 cameraPosition;",
43209             ""
43210
43211         ].join("\n");
43212
43213         var glFragmentShader = getShader( "fragment", prefix_fragment + fragmentShader );
43214         var glVertexShader = getShader( "vertex", prefix_vertex + vertexShader );
43215
43216         _gl.attachShader( program, glVertexShader );
43217         _gl.attachShader( program, glFragmentShader );
43218
43219         _gl.linkProgram( program );
43220
43221         if ( !_gl.getProgramParameter( program, _gl.LINK_STATUS ) ) {
43222
43223             console.error( "Could not initialise shader\n" + "VALIDATE_STATUS: " + _gl.getProgramParameter( program, _gl.VALIDATE_STATUS ) + ", gl error [" + _gl.getError() + "]" );
43224
43225         }
43226
43227         // clean up
43228
43229         _gl.deleteShader( glFragmentShader );
43230         _gl.deleteShader( glVertexShader );
43231
43232         //console.log( prefix_fragment + fragmentShader );
43233         //console.log( prefix_vertex + vertexShader );
43234
43235         program.uniforms = {};
43236         program.attributes = {};
43237
43238         var identifiers, u, a, i;
43239
43240         // cache uniform locations
43241
43242         identifiers = [
43243
43244             'viewMatrix', 'modelViewMatrix', 'projectionMatrix', 'normalMatrix', 'modelMatrix', 'cameraPosition',
43245             'morphTargetInfluences'
43246
43247         ];
43248
43249         if ( parameters.useVertexTexture ) {
43250
43251             identifiers.push( 'boneTexture' );
43252
43253         } else {
43254
43255             identifiers.push( 'boneGlobalMatrices' );
43256
43257         }
43258
43259         for ( u in uniforms ) {
43260
43261             identifiers.push( u );
43262
43263         }
43264
43265         cacheUniformLocations( program, identifiers );
43266
43267         // cache attributes locations
43268
43269         identifiers = [
43270
43271             "position", "normal", "uv", "uv2", "tangent", "color",
43272             "skinIndex", "skinWeight"
43273
43274         ];
43275
43276         for ( i = 0; i < parameters.maxMorphTargets; i ++ ) {
43277
43278             identifiers.push( "morphTarget" + i );
43279
43280         }
43281
43282         for ( i = 0; i < parameters.maxMorphNormals; i ++ ) {
43283
43284             identifiers.push( "morphNormal" + i );
43285
43286         }
43287
43288         for ( a in attributes ) {
43289
43290             identifiers.push( a );
43291
43292         }
43293
43294         cacheAttributeLocations( program, identifiers );
43295
43296         program.id = _programs_counter ++;
43297
43298         _programs.push( { program: program, code: code, usedTimes: 1 } );
43299
43300         _this.info.memory.programs = _programs.length;
43301
43302         return program;
43303
43304     };
43305
43306     // Shader parameters cache
43307
43308     function cacheUniformLocations ( program, identifiers ) {
43309
43310         var i, l, id;
43311
43312         for( i = 0, l = identifiers.length; i < l; i ++ ) {
43313
43314             id = identifiers[ i ];
43315             program.uniforms[ id ] = _gl.getUniformLocation( program, id );
43316
43317         }
43318
43319     };
43320
43321     function cacheAttributeLocations ( program, identifiers ) {
43322
43323         var i, l, id;
43324
43325         for( i = 0, l = identifiers.length; i < l; i ++ ) {
43326
43327             id = identifiers[ i ];
43328             program.attributes[ id ] = _gl.getAttribLocation( program, id );
43329
43330         }
43331
43332     };
43333
43334     function addLineNumbers ( string ) {
43335
43336         var chunks = string.split( "\n" );
43337
43338         for ( var i = 0, il = chunks.length; i < il; i ++ ) {
43339
43340             // Chrome reports shader errors on lines
43341             // starting counting from 1
43342
43343             chunks[ i ] = ( i + 1 ) + ": " + chunks[ i ];
43344
43345         }
43346
43347         return chunks.join( "\n" );
43348
43349     };
43350
43351     function getShader ( type, string ) {
43352
43353         var shader;
43354
43355         if ( type === "fragment" ) {
43356
43357             shader = _gl.createShader( _gl.FRAGMENT_SHADER );
43358
43359         } else if ( type === "vertex" ) {
43360
43361             shader = _gl.createShader( _gl.VERTEX_SHADER );
43362
43363         }
43364
43365         _gl.shaderSource( shader, string );
43366         _gl.compileShader( shader );
43367
43368         if ( !_gl.getShaderParameter( shader, _gl.COMPILE_STATUS ) ) {
43369
43370             console.error( _gl.getShaderInfoLog( shader ) );
43371             console.error( addLineNumbers( string ) );
43372             return null;
43373
43374         }
43375
43376         return shader;
43377
43378     };
43379
43380     // Textures
43381
43382
43383     function isPowerOfTwo ( value ) {
43384
43385         return ( value & ( value - 1 ) ) === 0;
43386
43387     };
43388
43389     function setTextureParameters ( textureType, texture, isImagePowerOfTwo ) {
43390
43391         if ( isImagePowerOfTwo ) {
43392
43393             _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, paramThreeToGL( texture.wrapS ) );
43394             _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrapT ) );
43395
43396             _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.magFilter ) );
43397             _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.minFilter ) );
43398
43399         } else {
43400
43401             _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );
43402             _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );
43403
43404             _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) );
43405             _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) );
43406
43407         }
43408
43409         if ( _glExtensionTextureFilterAnisotropic && texture.type !== THREE.FloatType ) {
43410
43411             if ( texture.anisotropy > 1 || texture.__oldAnisotropy ) {
43412
43413                 _gl.texParameterf( textureType, _glExtensionTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, _maxAnisotropy ) );
43414                 texture.__oldAnisotropy = texture.anisotropy;
43415
43416             }
43417
43418         }
43419
43420     };
43421
43422     this.setTexture = function ( texture, slot ) {
43423
43424         if ( texture.needsUpdate ) {
43425
43426             if ( ! texture.__webglInit ) {
43427
43428                 texture.__webglInit = true;
43429                 texture.__webglTexture = _gl.createTexture();
43430
43431                 _this.info.memory.textures ++;
43432
43433             }
43434
43435             _gl.activeTexture( _gl.TEXTURE0 + slot );
43436             _gl.bindTexture( _gl.TEXTURE_2D, texture.__webglTexture );
43437
43438             _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );
43439             _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );
43440
43441             var image = texture.image,
43442             isImagePowerOfTwo = isPowerOfTwo( image.width ) && isPowerOfTwo( image.height ),
43443             glFormat = paramThreeToGL( texture.format ),
43444             glType = paramThreeToGL( texture.type );
43445
43446             setTextureParameters( _gl.TEXTURE_2D, texture, isImagePowerOfTwo );
43447
43448             if ( texture instanceof THREE.CompressedTexture ) {
43449
43450                 var mipmap, mipmaps = texture.mipmaps;
43451
43452                 for( var i = 0, il = mipmaps.length; i < il; i ++ ) {
43453
43454                     mipmap = mipmaps[ i ];
43455                     _gl.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );
43456
43457                 }
43458
43459             } else if ( texture instanceof THREE.DataTexture ) {
43460
43461                 _gl.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data );
43462
43463             } else {
43464
43465                 _gl.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, texture.image );
43466
43467             }
43468
43469             if ( texture.generateMipmaps && isImagePowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D );
43470
43471             texture.needsUpdate = false;
43472
43473             if ( texture.onUpdate ) texture.onUpdate();
43474
43475         } else {
43476
43477             _gl.activeTexture( _gl.TEXTURE0 + slot );
43478             _gl.bindTexture( _gl.TEXTURE_2D, texture.__webglTexture );
43479
43480         }
43481
43482     };
43483
43484     function clampToMaxSize ( image, maxSize ) {
43485
43486         if ( image.width <= maxSize && image.height <= maxSize ) {
43487
43488             return image;
43489
43490         }
43491
43492         // Warning: Scaling through the canvas will only work with images that use
43493         // premultiplied alpha.
43494
43495         var maxDimension = Math.max( image.width, image.height );
43496         var newWidth = Math.floor( image.width * maxSize / maxDimension );
43497         var newHeight = Math.floor( image.height * maxSize / maxDimension );
43498
43499         var canvas = document.createElement( 'canvas' );
43500         canvas.width = newWidth;
43501         canvas.height = newHeight;
43502
43503         var ctx = canvas.getContext( "2d" );
43504         ctx.drawImage( image, 0, 0, image.width, image.height, 0, 0, newWidth, newHeight );
43505
43506         return canvas;
43507
43508     }
43509
43510     function setCubeTexture ( texture, slot ) {
43511
43512         if ( texture.image.length === 6 ) {
43513
43514             if ( texture.needsUpdate ) {
43515
43516                 if ( ! texture.image.__webglTextureCube ) {
43517
43518                     texture.image.__webglTextureCube = _gl.createTexture();
43519
43520                 }
43521
43522                 _gl.activeTexture( _gl.TEXTURE0 + slot );
43523                 _gl.bindTexture( _gl.TEXTURE_CUBE_MAP, texture.image.__webglTextureCube );
43524
43525                 _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );
43526
43527                 var isCompressed = texture instanceof THREE.CompressedTexture;
43528
43529                 var cubeImage = [];
43530
43531                 for ( var i = 0; i < 6; i ++ ) {
43532
43533                     if ( _this.autoScaleCubemaps && ! isCompressed ) {
43534
43535                         cubeImage[ i ] = clampToMaxSize( texture.image[ i ], _maxCubemapSize );
43536
43537                     } else {
43538
43539                         cubeImage[ i ] = texture.image[ i ];
43540
43541                     }
43542
43543                 }
43544
43545                 var image = cubeImage[ 0 ],
43546                 isImagePowerOfTwo = isPowerOfTwo( image.width ) && isPowerOfTwo( image.height ),
43547                 glFormat = paramThreeToGL( texture.format ),
43548                 glType = paramThreeToGL( texture.type );
43549
43550                 setTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isImagePowerOfTwo );
43551
43552                 for ( var i = 0; i < 6; i ++ ) {
43553
43554                     if ( isCompressed ) {
43555
43556                         var mipmap, mipmaps = cubeImage[ i ].mipmaps;
43557
43558                         for( var j = 0, jl = mipmaps.length; j < jl; j ++ ) {
43559
43560                             mipmap = mipmaps[ j ];
43561                             _gl.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );
43562
43563                         }
43564
43565                     } else {
43566
43567                         _gl.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ] );
43568
43569                     }
43570
43571                 }
43572
43573                 if ( texture.generateMipmaps && isImagePowerOfTwo ) {
43574
43575                     _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );
43576
43577                 }
43578
43579                 texture.needsUpdate = false;
43580
43581                 if ( texture.onUpdate ) texture.onUpdate();
43582
43583             } else {
43584
43585                 _gl.activeTexture( _gl.TEXTURE0 + slot );
43586                 _gl.bindTexture( _gl.TEXTURE_CUBE_MAP, texture.image.__webglTextureCube );
43587
43588             }
43589
43590         }
43591
43592     };
43593
43594     function setCubeTextureDynamic ( texture, slot ) {
43595
43596         _gl.activeTexture( _gl.TEXTURE0 + slot );
43597         _gl.bindTexture( _gl.TEXTURE_CUBE_MAP, texture.__webglTexture );
43598
43599     };
43600
43601     // Render targets
43602
43603     function setupFrameBuffer ( framebuffer, renderTarget, textureTarget ) {
43604
43605         _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
43606         _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, textureTarget, renderTarget.__webglTexture, 0 );
43607
43608     };
43609
43610     function setupRenderBuffer ( renderbuffer, renderTarget  ) {
43611
43612         _gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );
43613
43614         if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {
43615
43616             _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height );
43617             _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );
43618
43619         /* For some reason this is not working. Defaulting to RGBA4.
43620         } else if( ! renderTarget.depthBuffer && renderTarget.stencilBuffer ) {
43621
43622             _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.STENCIL_INDEX8, renderTarget.width, renderTarget.height );
43623             _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );
43624         */
43625         } else if( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {
43626
43627             _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );
43628             _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );
43629
43630         } else {
43631
43632             _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height );
43633
43634         }
43635
43636     };
43637
43638     this.setRenderTarget = function ( renderTarget ) {
43639
43640         var isCube = ( renderTarget instanceof THREE.WebGLRenderTargetCube );
43641
43642         if ( renderTarget && ! renderTarget.__webglFramebuffer ) {
43643
43644             if ( renderTarget.depthBuffer === undefined ) renderTarget.depthBuffer = true;
43645             if ( renderTarget.stencilBuffer === undefined ) renderTarget.stencilBuffer = true;
43646
43647             renderTarget.__webglTexture = _gl.createTexture();
43648
43649             // Setup texture, create render and frame buffers
43650
43651             var isTargetPowerOfTwo = isPowerOfTwo( renderTarget.width ) && isPowerOfTwo( renderTarget.height ),
43652                 glFormat = paramThreeToGL( renderTarget.format ),
43653                 glType = paramThreeToGL( renderTarget.type );
43654
43655             if ( isCube ) {
43656
43657                 renderTarget.__webglFramebuffer = [];
43658                 renderTarget.__webglRenderbuffer = [];
43659
43660                 _gl.bindTexture( _gl.TEXTURE_CUBE_MAP, renderTarget.__webglTexture );
43661                 setTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget, isTargetPowerOfTwo );
43662
43663                 for ( var i = 0; i < 6; i ++ ) {
43664
43665                     renderTarget.__webglFramebuffer[ i ] = _gl.createFramebuffer();
43666                     renderTarget.__webglRenderbuffer[ i ] = _gl.createRenderbuffer();
43667
43668                     _gl.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );
43669
43670                     setupFrameBuffer( renderTarget.__webglFramebuffer[ i ], renderTarget, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i );
43671                     setupRenderBuffer( renderTarget.__webglRenderbuffer[ i ], renderTarget );
43672
43673                 }
43674
43675                 if ( isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );
43676
43677             } else {
43678
43679                 renderTarget.__webglFramebuffer = _gl.createFramebuffer();
43680                 renderTarget.__webglRenderbuffer = _gl.createRenderbuffer();
43681
43682                 _gl.bindTexture( _gl.TEXTURE_2D, renderTarget.__webglTexture );
43683                 setTextureParameters( _gl.TEXTURE_2D, renderTarget, isTargetPowerOfTwo );
43684
43685                 _gl.texImage2D( _gl.TEXTURE_2D, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );
43686
43687                 setupFrameBuffer( renderTarget.__webglFramebuffer, renderTarget, _gl.TEXTURE_2D );
43688                 setupRenderBuffer( renderTarget.__webglRenderbuffer, renderTarget );
43689
43690                 if ( isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D );
43691
43692             }
43693
43694             // Release everything
43695
43696             if ( isCube ) {
43697
43698                 _gl.bindTexture( _gl.TEXTURE_CUBE_MAP, null );
43699
43700             } else {
43701
43702                 _gl.bindTexture( _gl.TEXTURE_2D, null );
43703
43704             }
43705
43706             _gl.bindRenderbuffer( _gl.RENDERBUFFER, null );
43707             _gl.bindFramebuffer( _gl.FRAMEBUFFER, null);
43708
43709         }
43710
43711         var framebuffer, width, height, vx, vy;
43712
43713         if ( renderTarget ) {
43714
43715             if ( isCube ) {
43716
43717                 framebuffer = renderTarget.__webglFramebuffer[ renderTarget.activeCubeFace ];
43718
43719             } else {
43720
43721                 framebuffer = renderTarget.__webglFramebuffer;
43722
43723             }
43724
43725             width = renderTarget.width;
43726             height = renderTarget.height;
43727
43728             vx = 0;
43729             vy = 0;
43730
43731         } else {
43732
43733             framebuffer = null;
43734
43735             width = _viewportWidth;
43736             height = _viewportHeight;
43737
43738             vx = _viewportX;
43739             vy = _viewportY;
43740
43741         }
43742
43743         if ( framebuffer !== _currentFramebuffer ) {
43744
43745             _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
43746             _gl.viewport( vx, vy, width, height );
43747
43748             _currentFramebuffer = framebuffer;
43749
43750         }
43751
43752         _currentWidth = width;
43753         _currentHeight = height;
43754
43755     };
43756
43757     function updateRenderTargetMipmap ( renderTarget ) {
43758
43759         if ( renderTarget instanceof THREE.WebGLRenderTargetCube ) {
43760
43761             _gl.bindTexture( _gl.TEXTURE_CUBE_MAP, renderTarget.__webglTexture );
43762             _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );
43763             _gl.bindTexture( _gl.TEXTURE_CUBE_MAP, null );
43764
43765         } else {
43766
43767             _gl.bindTexture( _gl.TEXTURE_2D, renderTarget.__webglTexture );
43768             _gl.generateMipmap( _gl.TEXTURE_2D );
43769             _gl.bindTexture( _gl.TEXTURE_2D, null );
43770
43771         }
43772
43773     };
43774
43775     // Fallback filters for non-power-of-2 textures
43776
43777     function filterFallback ( f ) {
43778
43779         if ( f === THREE.NearestFilter || f === THREE.NearestMipMapNearestFilter || f === THREE.NearestMipMapLinearFilter ) {
43780
43781             return _gl.NEAREST;
43782
43783         }
43784
43785         return _gl.LINEAR;
43786
43787     };
43788
43789     // Map three.js constants to WebGL constants
43790
43791     function paramThreeToGL ( p ) {
43792
43793         if ( p === THREE.RepeatWrapping ) return _gl.REPEAT;
43794         if ( p === THREE.ClampToEdgeWrapping ) return _gl.CLAMP_TO_EDGE;
43795         if ( p === THREE.MirroredRepeatWrapping ) return _gl.MIRRORED_REPEAT;
43796
43797         if ( p === THREE.NearestFilter ) return _gl.NEAREST;
43798         if ( p === THREE.NearestMipMapNearestFilter ) return _gl.NEAREST_MIPMAP_NEAREST;
43799         if ( p === THREE.NearestMipMapLinearFilter ) return _gl.NEAREST_MIPMAP_LINEAR;
43800
43801         if ( p === THREE.LinearFilter ) return _gl.LINEAR;
43802         if ( p === THREE.LinearMipMapNearestFilter ) return _gl.LINEAR_MIPMAP_NEAREST;
43803         if ( p === THREE.LinearMipMapLinearFilter ) return _gl.LINEAR_MIPMAP_LINEAR;
43804
43805         if ( p === THREE.UnsignedByteType ) return _gl.UNSIGNED_BYTE;
43806         if ( p === THREE.UnsignedShort4444Type ) return _gl.UNSIGNED_SHORT_4_4_4_4;
43807         if ( p === THREE.UnsignedShort5551Type ) return _gl.UNSIGNED_SHORT_5_5_5_1;
43808         if ( p === THREE.UnsignedShort565Type ) return _gl.UNSIGNED_SHORT_5_6_5;
43809
43810         if ( p === THREE.ByteType ) return _gl.BYTE;
43811         if ( p === THREE.ShortType ) return _gl.SHORT;
43812         if ( p === THREE.UnsignedShortType ) return _gl.UNSIGNED_SHORT;
43813         if ( p === THREE.IntType ) return _gl.INT;
43814         if ( p === THREE.UnsignedIntType ) return _gl.UNSIGNED_INT;
43815         if ( p === THREE.FloatType ) return _gl.FLOAT;
43816
43817         if ( p === THREE.AlphaFormat ) return _gl.ALPHA;
43818         if ( p === THREE.RGBFormat ) return _gl.RGB;
43819         if ( p === THREE.RGBAFormat ) return _gl.RGBA;
43820         if ( p === THREE.LuminanceFormat ) return _gl.LUMINANCE;
43821         if ( p === THREE.LuminanceAlphaFormat ) return _gl.LUMINANCE_ALPHA;
43822
43823         if ( p === THREE.AddEquation ) return _gl.FUNC_ADD;
43824         if ( p === THREE.SubtractEquation ) return _gl.FUNC_SUBTRACT;
43825         if ( p === THREE.ReverseSubtractEquation ) return _gl.FUNC_REVERSE_SUBTRACT;
43826
43827         if ( p === THREE.ZeroFactor ) return _gl.ZERO;
43828         if ( p === THREE.OneFactor ) return _gl.ONE;
43829         if ( p === THREE.SrcColorFactor ) return _gl.SRC_COLOR;
43830         if ( p === THREE.OneMinusSrcColorFactor ) return _gl.ONE_MINUS_SRC_COLOR;
43831         if ( p === THREE.SrcAlphaFactor ) return _gl.SRC_ALPHA;
43832         if ( p === THREE.OneMinusSrcAlphaFactor ) return _gl.ONE_MINUS_SRC_ALPHA;
43833         if ( p === THREE.DstAlphaFactor ) return _gl.DST_ALPHA;
43834         if ( p === THREE.OneMinusDstAlphaFactor ) return _gl.ONE_MINUS_DST_ALPHA;
43835
43836         if ( p === THREE.DstColorFactor ) return _gl.DST_COLOR;
43837         if ( p === THREE.OneMinusDstColorFactor ) return _gl.ONE_MINUS_DST_COLOR;
43838         if ( p === THREE.SrcAlphaSaturateFactor ) return _gl.SRC_ALPHA_SATURATE;
43839
43840         if ( _glExtensionCompressedTextureS3TC !== undefined ) {
43841
43842             if ( p === THREE.RGB_S3TC_DXT1_Format ) return _glExtensionCompressedTextureS3TC.COMPRESSED_RGB_S3TC_DXT1_EXT;
43843             if ( p === THREE.RGBA_S3TC_DXT1_Format ) return _glExtensionCompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT1_EXT;
43844             if ( p === THREE.RGBA_S3TC_DXT3_Format ) return _glExtensionCompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT3_EXT;
43845             if ( p === THREE.RGBA_S3TC_DXT5_Format ) return _glExtensionCompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT5_EXT;
43846
43847         }
43848
43849         return 0;
43850
43851     };
43852
43853     // Allocations
43854
43855     function allocateBones ( object ) {
43856
43857         if ( _supportsBoneTextures && object && object.useVertexTexture ) {
43858
43859             return 1024;
43860
43861         } else {
43862
43863             // default for when object is not specified
43864             // ( for example when prebuilding shader
43865             //   to be used with multiple objects )
43866             //
43867             //     - leave some extra space for other uniforms
43868             //  - limit here is ANGLE's 254 max uniform vectors
43869             //    (up to 54 should be safe)
43870
43871             var nVertexUniforms = _gl.getParameter( _gl.MAX_VERTEX_UNIFORM_VECTORS );
43872             var nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 );
43873
43874             var maxBones = nVertexMatrices;
43875
43876             if ( object !== undefined && object instanceof THREE.SkinnedMesh ) {
43877
43878                 maxBones = Math.min( object.bones.length, maxBones );
43879
43880                 if ( maxBones < object.bones.length ) {
43881
43882                     console.warn( "WebGLRenderer: too many bones - " + object.bones.length + ", this GPU supports just " + maxBones + " (try OpenGL instead of ANGLE)" );
43883
43884                 }
43885
43886             }
43887
43888             return maxBones;
43889
43890         }
43891
43892     };
43893
43894     function allocateLights ( lights ) {
43895
43896         var l, ll, light, dirLights, pointLights, spotLights, hemiLights, maxDirLights, maxPointLights, maxSpotLights, maxHemiLights;
43897
43898         dirLights = pointLights = spotLights = hemiLights = maxDirLights = maxPointLights = maxSpotLights = maxHemiLights = 0;
43899
43900         for ( l = 0, ll = lights.length; l < ll; l ++ ) {
43901
43902             light = lights[ l ];
43903
43904             if ( light.onlyShadow ) continue;
43905
43906             if ( light instanceof THREE.DirectionalLight ) dirLights ++;
43907             if ( light instanceof THREE.PointLight ) pointLights ++;
43908             if ( light instanceof THREE.SpotLight ) spotLights ++;
43909             if ( light instanceof THREE.HemisphereLight ) hemiLights ++;
43910
43911         }
43912
43913         if ( ( pointLights + spotLights + dirLights + hemiLights) <= _maxLights ) {
43914
43915             maxDirLights = dirLights;
43916             maxPointLights = pointLights;
43917             maxSpotLights = spotLights;
43918             maxHemiLights = hemiLights;
43919
43920         } else {
43921
43922             maxDirLights = Math.ceil( _maxLights * dirLights / ( pointLights + dirLights ) );
43923             maxPointLights = _maxLights - maxDirLights;
43924
43925             // these are not really correct
43926
43927             maxSpotLights = maxPointLights;
43928             maxHemiLights = maxDirLights;
43929
43930         }
43931
43932         return { 'directional' : maxDirLights, 'point' : maxPointLights, 'spot': maxSpotLights, 'hemi': maxHemiLights };
43933
43934     };
43935
43936     function allocateShadows ( lights ) {
43937
43938         var l, ll, light, maxShadows = 0;
43939
43940         for ( l = 0, ll = lights.length; l < ll; l++ ) {
43941
43942             light = lights[ l ];
43943
43944             if ( ! light.castShadow ) continue;
43945
43946             if ( light instanceof THREE.SpotLight ) maxShadows ++;
43947             if ( light instanceof THREE.DirectionalLight && ! light.shadowCascade ) maxShadows ++;
43948
43949         }
43950
43951         return maxShadows;
43952
43953     };
43954
43955     // Initialization
43956
43957     function initGL () {
43958
43959         try {
43960
43961             if ( ! ( _gl = _canvas.getContext( 'experimental-webgl', { alpha: _alpha, premultipliedAlpha: _premultipliedAlpha, antialias: _antialias, stencil: _stencil, preserveDrawingBuffer: _preserveDrawingBuffer } ) ) ) {
43962
43963                 throw 'Error creating WebGL context.';
43964
43965             }
43966
43967         } catch ( error ) {
43968
43969             console.error( error );
43970
43971         }
43972
43973         _glExtensionTextureFloat = _gl.getExtension( 'OES_texture_float' );
43974         _glExtensionStandardDerivatives = _gl.getExtension( 'OES_standard_derivatives' );
43975
43976         _glExtensionTextureFilterAnisotropic = _gl.getExtension( 'EXT_texture_filter_anisotropic' ) ||
43977                                                _gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) ||
43978                                                _gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );
43979
43980
43981         _glExtensionCompressedTextureS3TC = _gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) ||
43982                                             _gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) ||
43983                                             _gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );
43984
43985         if ( ! _glExtensionTextureFloat ) {
43986
43987             console.log( 'THREE.WebGLRenderer: Float textures not supported.' );
43988
43989         }
43990
43991         if ( ! _glExtensionStandardDerivatives ) {
43992
43993             console.log( 'THREE.WebGLRenderer: Standard derivatives not supported.' );
43994
43995         }
43996
43997         if ( ! _glExtensionTextureFilterAnisotropic ) {
43998
43999             console.log( 'THREE.WebGLRenderer: Anisotropic texture filtering not supported.' );
44000
44001         }
44002
44003         if ( ! _glExtensionCompressedTextureS3TC ) {
44004
44005             console.log( 'THREE.WebGLRenderer: S3TC compressed textures not supported.' );
44006
44007         }
44008
44009     };
44010
44011     function setDefaultGLState () {
44012
44013         _gl.clearColor( 0, 0, 0, 1 );
44014         _gl.clearDepth( 1 );
44015         _gl.clearStencil( 0 );
44016
44017         _gl.enable( _gl.DEPTH_TEST );
44018         _gl.depthFunc( _gl.LEQUAL );
44019
44020         _gl.frontFace( _gl.CCW );
44021         _gl.cullFace( _gl.BACK );
44022         _gl.enable( _gl.CULL_FACE );
44023
44024         _gl.enable( _gl.BLEND );
44025         _gl.blendEquation( _gl.FUNC_ADD );
44026         _gl.blendFunc( _gl.SRC_ALPHA, _gl.ONE_MINUS_SRC_ALPHA );
44027
44028         _gl.clearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );
44029
44030     };
44031
44032     // default plugins (order is important)
44033
44034     this.shadowMapPlugin = new THREE.ShadowMapPlugin();
44035     this.addPrePlugin( this.shadowMapPlugin );
44036
44037     this.addPostPlugin( new THREE.SpritePlugin() );
44038     this.addPostPlugin( new THREE.LensFlarePlugin() );
44039
44040 };
44041 /**
44042  * @author szimek / https://github.com/szimek/
44043  * @author alteredq / http://alteredqualia.com/
44044  */
44045
44046 THREE.WebGLRenderTarget = function ( width, height, options ) {
44047
44048     this.width = width;
44049     this.height = height;
44050
44051     options = options || {};
44052
44053     this.wrapS = options.wrapS !== undefined ? options.wrapS : THREE.ClampToEdgeWrapping;
44054     this.wrapT = options.wrapT !== undefined ? options.wrapT : THREE.ClampToEdgeWrapping;
44055
44056     this.magFilter = options.magFilter !== undefined ? options.magFilter : THREE.LinearFilter;
44057     this.minFilter = options.minFilter !== undefined ? options.minFilter : THREE.LinearMipMapLinearFilter;
44058
44059     this.anisotropy = options.anisotropy !== undefined ? options.anisotropy : 1;
44060
44061     this.offset = new THREE.Vector2( 0, 0 );
44062     this.repeat = new THREE.Vector2( 1, 1 );
44063
44064     this.format = options.format !== undefined ? options.format : THREE.RGBAFormat;
44065     this.type = options.type !== undefined ? options.type : THREE.UnsignedByteType;
44066
44067     this.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;
44068     this.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true;
44069
44070     this.generateMipmaps = true;
44071
44072 };
44073
44074 THREE.WebGLRenderTarget.prototype.clone = function() {
44075
44076     var tmp = new THREE.WebGLRenderTarget( this.width, this.height );
44077
44078     tmp.wrapS = this.wrapS;
44079     tmp.wrapT = this.wrapT;
44080
44081     tmp.magFilter = this.magFilter;
44082     tmp.anisotropy = this.anisotropy;
44083
44084     tmp.minFilter = this.minFilter;
44085
44086     tmp.offset.copy( this.offset );
44087     tmp.repeat.copy( this.repeat );
44088
44089     tmp.format = this.format;
44090     tmp.type = this.type;
44091
44092     tmp.depthBuffer = this.depthBuffer;
44093     tmp.stencilBuffer = this.stencilBuffer;
44094
44095     tmp.generateMipmaps = this.generateMipmaps;
44096
44097     return tmp;
44098
44099 };
44100 /**
44101  * @author alteredq / http://alteredqualia.com
44102  */
44103
44104 THREE.WebGLRenderTargetCube = function ( width, height, options ) {
44105
44106     THREE.WebGLRenderTarget.call( this, width, height, options );
44107
44108     this.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5
44109
44110 };
44111
44112 THREE.WebGLRenderTargetCube.prototype = Object.create( THREE.WebGLRenderTarget.prototype );
44113 /**
44114  * @author mrdoob / http://mrdoob.com/
44115  */
44116
44117 THREE.RenderableVertex = function () {
44118
44119     this.positionWorld = new THREE.Vector3();
44120     this.positionScreen = new THREE.Vector4();
44121
44122     this.visible = true;
44123
44124 };
44125
44126 THREE.RenderableVertex.prototype.copy = function ( vertex ) {
44127
44128     this.positionWorld.copy( vertex.positionWorld );
44129     this.positionScreen.copy( vertex.positionScreen );
44130
44131 }
44132 /**
44133  * @author mrdoob / http://mrdoob.com/
44134  */
44135
44136 THREE.RenderableFace3 = function () {
44137
44138     this.v1 = new THREE.RenderableVertex();
44139     this.v2 = new THREE.RenderableVertex();
44140     this.v3 = new THREE.RenderableVertex();
44141
44142     this.centroidWorld = new THREE.Vector3();
44143     this.centroidScreen = new THREE.Vector3();
44144
44145     this.normalWorld = new THREE.Vector3();
44146     this.vertexNormalsWorld = [ new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3() ];
44147     this.vertexNormalsLength = 0;
44148
44149     this.material = null;
44150     this.uvs = [[]];
44151
44152     this.z = null;
44153
44154 };
44155 /**
44156  * @author mrdoob / http://mrdoob.com/
44157  */
44158
44159 THREE.RenderableFace4 = function () {
44160
44161     this.v1 = new THREE.RenderableVertex();
44162     this.v2 = new THREE.RenderableVertex();
44163     this.v3 = new THREE.RenderableVertex();
44164     this.v4 = new THREE.RenderableVertex();
44165
44166     this.centroidWorld = new THREE.Vector3();
44167     this.centroidScreen = new THREE.Vector3();
44168
44169     this.normalWorld = new THREE.Vector3();
44170     this.vertexNormalsWorld = [ new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3() ];
44171     this.vertexNormalsLength = 0;
44172
44173     this.material = null;
44174     this.uvs = [[]];
44175
44176     this.z = null;
44177
44178 };
44179 /**
44180  * @author mrdoob / http://mrdoob.com/
44181  */
44182
44183 THREE.RenderableObject = function () {
44184
44185     this.object = null;
44186     this.z = null;
44187
44188 };
44189 /**
44190  * @author mrdoob / http://mrdoob.com/
44191  */
44192
44193 THREE.RenderableParticle = function () {
44194
44195     this.object = null;
44196
44197     this.x = null;
44198     this.y = null;
44199     this.z = null;
44200
44201     this.rotation = null;
44202     this.scale = new THREE.Vector2();
44203
44204     this.material = null;
44205
44206 };
44207 /**
44208  * @author mrdoob / http://mrdoob.com/
44209  */
44210
44211 THREE.RenderableLine = function () {
44212
44213     this.z = null;
44214
44215     this.v1 = new THREE.RenderableVertex();
44216     this.v2 = new THREE.RenderableVertex();
44217
44218     this.material = null;
44219
44220 };
44221 /**
44222  * @author alteredq / http://alteredqualia.com/
44223  */
44224
44225 THREE.ColorUtils = {
44226
44227     adjustHSV : function ( color, h, s, v ) {
44228
44229         var hsv = THREE.ColorUtils.__hsv;
44230
44231         THREE.ColorUtils.rgbToHsv( color, hsv );
44232
44233         hsv.h = THREE.Math.clamp( hsv.h + h, 0, 1 );
44234         hsv.s = THREE.Math.clamp( hsv.s + s, 0, 1 );
44235         hsv.v = THREE.Math.clamp( hsv.v + v, 0, 1 );
44236
44237         color.setHSV( hsv.h, hsv.s, hsv.v );
44238
44239     },
44240
44241     // based on MochiKit implementation by Bob Ippolito
44242
44243     rgbToHsv : function ( color, hsv ) {
44244
44245         var r = color.r;
44246         var g = color.g;
44247         var b = color.b;
44248
44249         var max = Math.max( Math.max( r, g ), b );
44250         var min = Math.min( Math.min( r, g ), b );
44251
44252         var hue;
44253         var saturation;
44254         var value = max;
44255
44256         if ( min === max )    {
44257
44258             hue = 0;
44259             saturation = 0;
44260
44261         } else {
44262
44263             var delta = ( max - min );
44264             saturation = delta / max;
44265
44266             if ( r === max ) {
44267
44268                 hue = ( g - b ) / delta;
44269
44270             } else if ( g === max ) {
44271
44272                 hue = 2 + ( ( b - r ) / delta );
44273
44274             } else    {
44275
44276                 hue = 4 + ( ( r - g ) / delta );
44277             }
44278
44279             hue /= 6;
44280
44281             if ( hue < 0 ) {
44282
44283                 hue += 1;
44284
44285             }
44286
44287             if ( hue > 1 ) {
44288
44289                 hue -= 1;
44290
44291             }
44292
44293         }
44294
44295         if ( hsv === undefined ) {
44296
44297             hsv = { h: 0, s: 0, v: 0 };
44298
44299         }
44300
44301         hsv.h = hue;
44302         hsv.s = saturation;
44303         hsv.v = value;
44304
44305         return hsv;
44306
44307     }
44308
44309 };
44310
44311 THREE.ColorUtils.__hsv = { h: 0, s: 0, v: 0 };/**
44312  * @author mrdoob / http://mrdoob.com/
44313  * @author alteredq / http://alteredqualia.com/
44314  */
44315
44316 THREE.GeometryUtils = {
44317
44318     // Merge two geometries or geometry and geometry from object (using object's transform)
44319
44320     merge: function ( geometry1, object2 /* mesh | geometry */ ) {
44321
44322         var matrix, matrixRotation,
44323         vertexOffset = geometry1.vertices.length,
44324         uvPosition = geometry1.faceVertexUvs[ 0 ].length,
44325         geometry2 = object2 instanceof THREE.Mesh ? object2.geometry : object2,
44326         vertices1 = geometry1.vertices,
44327         vertices2 = geometry2.vertices,
44328         faces1 = geometry1.faces,
44329         faces2 = geometry2.faces,
44330         uvs1 = geometry1.faceVertexUvs[ 0 ],
44331         uvs2 = geometry2.faceVertexUvs[ 0 ];
44332
44333         var geo1MaterialsMap = {};
44334
44335         for ( var i = 0; i < geometry1.materials.length; i ++ ) {
44336
44337             var id = geometry1.materials[ i ].id;
44338
44339             geo1MaterialsMap[ id ] = i;
44340
44341         }
44342
44343         if ( object2 instanceof THREE.Mesh ) {
44344
44345             object2.matrixAutoUpdate && object2.updateMatrix();
44346
44347             matrix = object2.matrix;
44348             matrixRotation = new THREE.Matrix4();
44349             matrixRotation.extractRotation( matrix, object2.scale );
44350
44351         }
44352
44353         // vertices
44354
44355         for ( var i = 0, il = vertices2.length; i < il; i ++ ) {
44356
44357             var vertex = vertices2[ i ];
44358
44359             var vertexCopy = vertex.clone();
44360
44361             if ( matrix ) matrix.multiplyVector3( vertexCopy );
44362
44363             vertices1.push( vertexCopy );
44364
44365         }
44366
44367         // faces
44368
44369         for ( i = 0, il = faces2.length; i < il; i ++ ) {
44370
44371             var face = faces2[ i ], faceCopy, normal, color,
44372             faceVertexNormals = face.vertexNormals,
44373             faceVertexColors = face.vertexColors;
44374
44375             if ( face instanceof THREE.Face3 ) {
44376
44377                 faceCopy = new THREE.Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset );
44378
44379             } else if ( face instanceof THREE.Face4 ) {
44380
44381                 faceCopy = new THREE.Face4( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset, face.d + vertexOffset );
44382
44383             }
44384
44385             faceCopy.normal.copy( face.normal );
44386
44387             if ( matrixRotation ) matrixRotation.multiplyVector3( faceCopy.normal );
44388
44389             for ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) {
44390
44391                 normal = faceVertexNormals[ j ].clone();
44392
44393                 if ( matrixRotation ) matrixRotation.multiplyVector3( normal );
44394
44395                 faceCopy.vertexNormals.push( normal );
44396
44397             }
44398
44399             faceCopy.color.copy( face.color );
44400
44401             for ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) {
44402
44403                 color = faceVertexColors[ j ];
44404                 faceCopy.vertexColors.push( color.clone() );
44405
44406             }
44407
44408             if ( face.materialIndex !== undefined ) {
44409
44410                 var material2 = geometry2.materials[ face.materialIndex ];
44411                 var materialId2 = material2.id;
44412
44413                 var materialIndex = geo1MaterialsMap[ materialId2 ];
44414
44415                 if ( materialIndex === undefined ) {
44416
44417                     materialIndex = geometry1.materials.length;
44418                     geo1MaterialsMap[ materialId2 ] = materialIndex;
44419
44420                     geometry1.materials.push( material2 );
44421
44422                 }
44423
44424                 faceCopy.materialIndex = materialIndex;
44425
44426             }
44427
44428             faceCopy.centroid.copy( face.centroid );
44429             if ( matrix ) matrix.multiplyVector3( faceCopy.centroid );
44430
44431             faces1.push( faceCopy );
44432
44433         }
44434
44435         // uvs
44436
44437         for ( i = 0, il = uvs2.length; i < il; i ++ ) {
44438
44439             var uv = uvs2[ i ], uvCopy = [];
44440
44441             for ( var j = 0, jl = uv.length; j < jl; j ++ ) {
44442
44443                 uvCopy.push( new THREE.UV( uv[ j ].u, uv[ j ].v ) );
44444
44445             }
44446
44447             uvs1.push( uvCopy );
44448
44449         }
44450
44451     },
44452
44453     clone: function ( geometry ) {
44454
44455         var cloneGeo = new THREE.Geometry();
44456
44457         var i, il;
44458
44459         var vertices = geometry.vertices,
44460             faces = geometry.faces,
44461             uvs = geometry.faceVertexUvs[ 0 ];
44462
44463         // materials
44464
44465         if ( geometry.materials ) {
44466
44467             cloneGeo.materials = geometry.materials.slice();
44468
44469         }
44470
44471         // vertices
44472
44473         for ( i = 0, il = vertices.length; i < il; i ++ ) {
44474
44475             var vertex = vertices[ i ];
44476
44477             cloneGeo.vertices.push( vertex.clone() );
44478
44479         }
44480
44481         // faces
44482
44483         for ( i = 0, il = faces.length; i < il; i ++ ) {
44484
44485             var face = faces[ i ];
44486
44487             cloneGeo.faces.push( face.clone() );
44488
44489         }
44490
44491         // uvs
44492
44493         for ( i = 0, il = uvs.length; i < il; i ++ ) {
44494
44495             var uv = uvs[ i ], uvCopy = [];
44496
44497             for ( var j = 0, jl = uv.length; j < jl; j ++ ) {
44498
44499                 uvCopy.push( new THREE.UV( uv[ j ].u, uv[ j ].v ) );
44500
44501             }
44502
44503             cloneGeo.faceVertexUvs[ 0 ].push( uvCopy );
44504
44505         }
44506
44507         return cloneGeo;
44508
44509     },
44510
44511     // Get random point in triangle (via barycentric coordinates)
44512     //     (uniform distribution)
44513     //     http://www.cgafaq.info/wiki/Random_Point_In_Triangle
44514
44515     randomPointInTriangle: function ( vectorA, vectorB, vectorC ) {
44516
44517         var a, b, c,
44518             point = new THREE.Vector3(),
44519             tmp = THREE.GeometryUtils.__v1;
44520
44521         a = THREE.GeometryUtils.random();
44522         b = THREE.GeometryUtils.random();
44523
44524         if ( ( a + b ) > 1 ) {
44525
44526             a = 1 - a;
44527             b = 1 - b;
44528
44529         }
44530
44531         c = 1 - a - b;
44532
44533         point.copy( vectorA );
44534         point.multiplyScalar( a );
44535
44536         tmp.copy( vectorB );
44537         tmp.multiplyScalar( b );
44538
44539         point.addSelf( tmp );
44540
44541         tmp.copy( vectorC );
44542         tmp.multiplyScalar( c );
44543
44544         point.addSelf( tmp );
44545
44546         return point;
44547
44548     },
44549
44550     // Get random point in face (triangle / quad)
44551     // (uniform distribution)
44552
44553     randomPointInFace: function ( face, geometry, useCachedAreas ) {
44554
44555         var vA, vB, vC, vD;
44556
44557         if ( face instanceof THREE.Face3 ) {
44558
44559             vA = geometry.vertices[ face.a ];
44560             vB = geometry.vertices[ face.b ];
44561             vC = geometry.vertices[ face.c ];
44562
44563             return THREE.GeometryUtils.randomPointInTriangle( vA, vB, vC );
44564
44565         } else if ( face instanceof THREE.Face4 ) {
44566
44567             vA = geometry.vertices[ face.a ];
44568             vB = geometry.vertices[ face.b ];
44569             vC = geometry.vertices[ face.c ];
44570             vD = geometry.vertices[ face.d ];
44571
44572             var area1, area2;
44573
44574             if ( useCachedAreas ) {
44575
44576                 if ( face._area1 && face._area2 ) {
44577
44578                     area1 = face._area1;
44579                     area2 = face._area2;
44580
44581                 } else {
44582
44583                     area1 = THREE.GeometryUtils.triangleArea( vA, vB, vD );
44584                     area2 = THREE.GeometryUtils.triangleArea( vB, vC, vD );
44585
44586                     face._area1 = area1;
44587                     face._area2 = area2;
44588
44589                 }
44590
44591             } else {
44592
44593                 area1 = THREE.GeometryUtils.triangleArea( vA, vB, vD ),
44594                 area2 = THREE.GeometryUtils.triangleArea( vB, vC, vD );
44595
44596             }
44597
44598             var r = THREE.GeometryUtils.random() * ( area1 + area2 );
44599
44600             if ( r < area1 ) {
44601
44602                 return THREE.GeometryUtils.randomPointInTriangle( vA, vB, vD );
44603
44604             } else {
44605
44606                 return THREE.GeometryUtils.randomPointInTriangle( vB, vC, vD );
44607
44608             }
44609
44610         }
44611
44612     },
44613
44614     // Get uniformly distributed random points in mesh
44615     //     - create array with cumulative sums of face areas
44616     //  - pick random number from 0 to total area
44617     //  - find corresponding place in area array by binary search
44618     //    - get random point in face
44619
44620     randomPointsInGeometry: function ( geometry, n ) {
44621
44622         var face, i,
44623             faces = geometry.faces,
44624             vertices = geometry.vertices,
44625             il = faces.length,
44626             totalArea = 0,
44627             cumulativeAreas = [],
44628             vA, vB, vC, vD;
44629
44630         // precompute face areas
44631
44632         for ( i = 0; i < il; i ++ ) {
44633
44634             face = faces[ i ];
44635
44636             if ( face instanceof THREE.Face3 ) {
44637
44638                 vA = vertices[ face.a ];
44639                 vB = vertices[ face.b ];
44640                 vC = vertices[ face.c ];
44641
44642                 face._area = THREE.GeometryUtils.triangleArea( vA, vB, vC );
44643
44644             } else if ( face instanceof THREE.Face4 ) {
44645
44646                 vA = vertices[ face.a ];
44647                 vB = vertices[ face.b ];
44648                 vC = vertices[ face.c ];
44649                 vD = vertices[ face.d ];
44650
44651                 face._area1 = THREE.GeometryUtils.triangleArea( vA, vB, vD );
44652                 face._area2 = THREE.GeometryUtils.triangleArea( vB, vC, vD );
44653
44654                 face._area = face._area1 + face._area2;
44655
44656             }
44657
44658             totalArea += face._area;
44659
44660             cumulativeAreas[ i ] = totalArea;
44661
44662         }
44663
44664         // binary search cumulative areas array
44665
44666         function binarySearchIndices( value ) {
44667
44668             function binarySearch( start, end ) {
44669
44670                 // return closest larger index
44671                 // if exact number is not found
44672
44673                 if ( end < start )
44674                     return start;
44675
44676                 var mid = start + Math.floor( ( end - start ) / 2 );
44677
44678                 if ( cumulativeAreas[ mid ] > value ) {
44679
44680                     return binarySearch( start, mid - 1 );
44681
44682                 } else if ( cumulativeAreas[ mid ] < value ) {
44683
44684                     return binarySearch( mid + 1, end );
44685
44686                 } else {
44687
44688                     return mid;
44689
44690                 }
44691
44692             }
44693
44694             var result = binarySearch( 0, cumulativeAreas.length - 1 )
44695             return result;
44696
44697         }
44698
44699         // pick random face weighted by face area
44700
44701         var r, index,
44702             result = [];
44703
44704         var stats = {};
44705
44706         for ( i = 0; i < n; i ++ ) {
44707
44708             r = THREE.GeometryUtils.random() * totalArea;
44709
44710             index = binarySearchIndices( r );
44711
44712             result[ i ] = THREE.GeometryUtils.randomPointInFace( faces[ index ], geometry, true );
44713
44714             if ( ! stats[ index ] ) {
44715
44716                 stats[ index ] = 1;
44717
44718             } else {
44719
44720                 stats[ index ] += 1;
44721
44722             }
44723
44724         }
44725
44726         return result;
44727
44728     },
44729
44730     // Get triangle area (by Heron's formula)
44731     //     http://en.wikipedia.org/wiki/Heron%27s_formula
44732
44733     triangleArea: function ( vectorA, vectorB, vectorC ) {
44734
44735         var s, a, b, c,
44736             tmp = THREE.GeometryUtils.__v1;
44737
44738         tmp.sub( vectorA, vectorB );
44739         a = tmp.length();
44740
44741         tmp.sub( vectorA, vectorC );
44742         b = tmp.length();
44743
44744         tmp.sub( vectorB, vectorC );
44745         c = tmp.length();
44746
44747         s = 0.5 * ( a + b + c );
44748
44749         return Math.sqrt( s * ( s - a ) * ( s - b ) * ( s - c ) );
44750
44751     },
44752
44753     // Center geometry so that 0,0,0 is in center of bounding box
44754
44755     center: function ( geometry ) {
44756
44757         geometry.computeBoundingBox();
44758
44759         var bb = geometry.boundingBox;
44760
44761         var offset = new THREE.Vector3();
44762
44763         offset.add( bb.min, bb.max );
44764         offset.multiplyScalar( -0.5 );
44765
44766         geometry.applyMatrix( new THREE.Matrix4().makeTranslation( offset.x, offset.y, offset.z ) );
44767         geometry.computeBoundingBox();
44768
44769         return offset;
44770
44771     },
44772
44773     // Normalize UVs to be from <0,1>
44774     // (for now just the first set of UVs)
44775
44776     normalizeUVs: function ( geometry ) {
44777
44778         var uvSet = geometry.faceVertexUvs[ 0 ];
44779
44780         for ( var i = 0, il = uvSet.length; i < il; i ++ ) {
44781
44782             var uvs = uvSet[ i ];
44783
44784             for ( var j = 0, jl = uvs.length; j < jl; j ++ ) {
44785
44786                 // texture repeat
44787
44788                 if( uvs[ j ].u !== 1.0 ) uvs[ j ].u = uvs[ j ].u - Math.floor( uvs[ j ].u );
44789                 if( uvs[ j ].v !== 1.0 ) uvs[ j ].v = uvs[ j ].v - Math.floor( uvs[ j ].v );
44790
44791             }
44792
44793         }
44794
44795     },
44796
44797     triangulateQuads: function ( geometry ) {
44798
44799         var i, il, j, jl;
44800
44801         var faces = [];
44802         var faceUvs = [];
44803         var faceVertexUvs = [];
44804
44805         for ( i = 0, il = geometry.faceUvs.length; i < il; i ++ ) {
44806
44807             faceUvs[ i ] = [];
44808
44809         }
44810
44811         for ( i = 0, il = geometry.faceVertexUvs.length; i < il; i ++ ) {
44812
44813             faceVertexUvs[ i ] = [];
44814
44815         }
44816
44817         for ( i = 0, il = geometry.faces.length; i < il; i ++ ) {
44818
44819             var face = geometry.faces[ i ];
44820
44821             if ( face instanceof THREE.Face4 ) {
44822
44823                 var a = face.a;
44824                 var b = face.b;
44825                 var c = face.c;
44826                 var d = face.d;
44827
44828                 var triA = new THREE.Face3();
44829                 var triB = new THREE.Face3();
44830
44831                 triA.color.copy( face.color );
44832                 triB.color.copy( face.color );
44833
44834                 triA.materialIndex = face.materialIndex;
44835                 triB.materialIndex = face.materialIndex;
44836
44837                 triA.a = a;
44838                 triA.b = b;
44839                 triA.c = d;
44840
44841                 triB.a = b;
44842                 triB.b = c;
44843                 triB.c = d;
44844
44845                 if ( face.vertexColors.length === 4 ) {
44846
44847                     triA.vertexColors[ 0 ] = face.vertexColors[ 0 ].clone();
44848                     triA.vertexColors[ 1 ] = face.vertexColors[ 1 ].clone();
44849                     triA.vertexColors[ 2 ] = face.vertexColors[ 3 ].clone();
44850
44851                     triB.vertexColors[ 0 ] = face.vertexColors[ 1 ].clone();
44852                     triB.vertexColors[ 1 ] = face.vertexColors[ 2 ].clone();
44853                     triB.vertexColors[ 2 ] = face.vertexColors[ 3 ].clone();
44854
44855                 }
44856
44857                 faces.push( triA, triB );
44858
44859                 for ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {
44860
44861                     if ( geometry.faceVertexUvs[ j ].length ) {
44862
44863                         var uvs = geometry.faceVertexUvs[ j ][ i ];
44864
44865                         var uvA = uvs[ 0 ];
44866                         var uvB = uvs[ 1 ];
44867                         var uvC = uvs[ 2 ];
44868                         var uvD = uvs[ 3 ];
44869
44870                         var uvsTriA = [ uvA.clone(), uvB.clone(), uvD.clone() ];
44871                         var uvsTriB = [ uvB.clone(), uvC.clone(), uvD.clone() ];
44872
44873                         faceVertexUvs[ j ].push( uvsTriA, uvsTriB );
44874
44875                     }
44876
44877                 }
44878
44879                 for ( j = 0, jl = geometry.faceUvs.length; j < jl; j ++ ) {
44880
44881                     if ( geometry.faceUvs[ j ].length ) {
44882
44883                         var faceUv = geometry.faceUvs[ j ][ i ];
44884
44885                         faceUvs[ j ].push( faceUv, faceUv );
44886
44887                     }
44888
44889                 }
44890
44891             } else {
44892
44893                 faces.push( face );
44894
44895                 for ( j = 0, jl = geometry.faceUvs.length; j < jl; j ++ ) {
44896
44897                     faceUvs[ j ].push( geometry.faceUvs[ j ][ i ] );
44898
44899                 }
44900
44901                 for ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {
44902
44903                     faceVertexUvs[ j ].push( geometry.faceVertexUvs[ j ][ i ] );
44904
44905                 }
44906
44907             }
44908
44909         }
44910
44911         geometry.faces = faces;
44912         geometry.faceUvs = faceUvs;
44913         geometry.faceVertexUvs = faceVertexUvs;
44914
44915         geometry.computeCentroids();
44916         geometry.computeFaceNormals();
44917         geometry.computeVertexNormals();
44918
44919         if ( geometry.hasTangents ) geometry.computeTangents();
44920
44921     },
44922
44923     // Make all faces use unique vertices
44924     // so that each face can be separated from others
44925
44926     explode: function( geometry ) {
44927
44928         var vertices = [];
44929
44930         for ( var i = 0, il = geometry.faces.length; i < il; i ++ ) {
44931
44932             var n = vertices.length;
44933
44934             var face = geometry.faces[ i ];
44935
44936             if ( face instanceof THREE.Face4 ) {
44937
44938                 var a = face.a;
44939                 var b = face.b;
44940                 var c = face.c;
44941                 var d = face.d;
44942
44943                 var va = geometry.vertices[ a ];
44944                 var vb = geometry.vertices[ b ];
44945                 var vc = geometry.vertices[ c ];
44946                 var vd = geometry.vertices[ d ];
44947
44948                 vertices.push( va.clone() );
44949                 vertices.push( vb.clone() );
44950                 vertices.push( vc.clone() );
44951                 vertices.push( vd.clone() );
44952
44953                 face.a = n;
44954                 face.b = n + 1;
44955                 face.c = n + 2;
44956                 face.d = n + 3;
44957
44958             } else {
44959
44960                 var a = face.a;
44961                 var b = face.b;
44962                 var c = face.c;
44963
44964                 var va = geometry.vertices[ a ];
44965                 var vb = geometry.vertices[ b ];
44966                 var vc = geometry.vertices[ c ];
44967
44968                 vertices.push( va.clone() );
44969                 vertices.push( vb.clone() );
44970                 vertices.push( vc.clone() );
44971
44972                 face.a = n;
44973                 face.b = n + 1;
44974                 face.c = n + 2;
44975
44976             }
44977
44978         }
44979
44980         geometry.vertices = vertices;
44981         delete geometry.__tmpVertices;
44982
44983     },
44984
44985     // Break faces with edges longer than maxEdgeLength
44986     // - not recursive
44987
44988     tessellate: function ( geometry, maxEdgeLength ) {
44989
44990         var i, il, face,
44991         a, b, c, d,
44992         va, vb, vc, vd,
44993         dab, dbc, dac, dcd, dad,
44994         m, m1, m2,
44995         vm, vm1, vm2,
44996         vnm, vnm1, vnm2,
44997         vcm, vcm1, vcm2,
44998         triA, triB,
44999         quadA, quadB,
45000         edge;
45001
45002         var faces = [];
45003         var faceVertexUvs = [];
45004
45005         for ( i = 0, il = geometry.faceVertexUvs.length; i < il; i ++ ) {
45006
45007             faceVertexUvs[ i ] = [];
45008
45009         }
45010
45011         for ( i = 0, il = geometry.faces.length; i < il; i ++ ) {
45012
45013             face = geometry.faces[ i ];
45014
45015             if ( face instanceof THREE.Face3 ) {
45016
45017                 a = face.a;
45018                 b = face.b;
45019                 c = face.c;
45020
45021                 va = geometry.vertices[ a ];
45022                 vb = geometry.vertices[ b ];
45023                 vc = geometry.vertices[ c ];
45024
45025                 dab = va.distanceTo( vb );
45026                 dbc = vb.distanceTo( vc );
45027                 dac = va.distanceTo( vc );
45028
45029                 if ( dab > maxEdgeLength || dbc > maxEdgeLength || dac > maxEdgeLength ) {
45030
45031                     m = geometry.vertices.length;
45032
45033                     triA = face.clone();
45034                     triB = face.clone();
45035
45036                     if ( dab >= dbc && dab >= dac ) {
45037
45038                         vm = va.clone();
45039                         vm.lerpSelf( vb, 0.5 );
45040
45041                         triA.a = a;
45042                         triA.b = m;
45043                         triA.c = c;
45044
45045                         triB.a = m;
45046                         triB.b = b;
45047                         triB.c = c;
45048
45049                         if ( face.vertexNormals.length === 3 ) {
45050
45051                             vnm = face.vertexNormals[ 0 ].clone();
45052                             vnm.lerpSelf( face.vertexNormals[ 1 ], 0.5 );
45053
45054                             triA.vertexNormals[ 1 ].copy( vnm );
45055                             triB.vertexNormals[ 0 ].copy( vnm );
45056
45057                         }
45058
45059                         if ( face.vertexColors.length === 3 ) {
45060
45061                             vcm = face.vertexColors[ 0 ].clone();
45062                             vcm.lerpSelf( face.vertexColors[ 1 ], 0.5 );
45063
45064                             triA.vertexColors[ 1 ].copy( vcm );
45065                             triB.vertexColors[ 0 ].copy( vcm );
45066
45067                         }
45068
45069                         edge = 0;
45070
45071                     } else if ( dbc >= dab && dbc >= dac ) {
45072
45073                         vm = vb.clone();
45074                         vm.lerpSelf( vc, 0.5 );
45075
45076                         triA.a = a;
45077                         triA.b = b;
45078                         triA.c = m;
45079
45080                         triB.a = m;
45081                         triB.b = c;
45082                         triB.c = a;
45083
45084                         if ( face.vertexNormals.length === 3 ) {
45085
45086                             vnm = face.vertexNormals[ 1 ].clone();
45087                             vnm.lerpSelf( face.vertexNormals[ 2 ], 0.5 );
45088
45089                             triA.vertexNormals[ 2 ].copy( vnm );
45090
45091                             triB.vertexNormals[ 0 ].copy( vnm );
45092                             triB.vertexNormals[ 1 ].copy( face.vertexNormals[ 2 ] );
45093                             triB.vertexNormals[ 2 ].copy( face.vertexNormals[ 0 ] );
45094
45095                         }
45096
45097                         if ( face.vertexColors.length === 3 ) {
45098
45099                             vcm = face.vertexColors[ 1 ].clone();
45100                             vcm.lerpSelf( face.vertexColors[ 2 ], 0.5 );
45101
45102                             triA.vertexColors[ 2 ].copy( vcm );
45103
45104                             triB.vertexColors[ 0 ].copy( vcm );
45105                             triB.vertexColors[ 1 ].copy( face.vertexColors[ 2 ] );
45106                             triB.vertexColors[ 2 ].copy( face.vertexColors[ 0 ] );
45107
45108                         }
45109
45110                         edge = 1;
45111
45112                     } else {
45113
45114                         vm = va.clone();
45115                         vm.lerpSelf( vc, 0.5 );
45116
45117                         triA.a = a;
45118                         triA.b = b;
45119                         triA.c = m;
45120
45121                         triB.a = m;
45122                         triB.b = b;
45123                         triB.c = c;
45124
45125                         if ( face.vertexNormals.length === 3 ) {
45126
45127                             vnm = face.vertexNormals[ 0 ].clone();
45128                             vnm.lerpSelf( face.vertexNormals[ 2 ], 0.5 );
45129
45130                             triA.vertexNormals[ 2 ].copy( vnm );
45131                             triB.vertexNormals[ 0 ].copy( vnm );
45132
45133                         }
45134
45135                         if ( face.vertexColors.length === 3 ) {
45136
45137                             vcm = face.vertexColors[ 0 ].clone();
45138                             vcm.lerpSelf( face.vertexColors[ 2 ], 0.5 );
45139
45140                             triA.vertexColors[ 2 ].copy( vcm );
45141                             triB.vertexColors[ 0 ].copy( vcm );
45142
45143                         }
45144
45145                         edge = 2;
45146
45147                     }
45148
45149                     faces.push( triA, triB );
45150                     geometry.vertices.push( vm );
45151
45152                     var j, jl, uvs, uvA, uvB, uvC, uvM, uvsTriA, uvsTriB;
45153
45154                     for ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {
45155
45156                         if ( geometry.faceVertexUvs[ j ].length ) {
45157
45158                             uvs = geometry.faceVertexUvs[ j ][ i ];
45159
45160                             uvA = uvs[ 0 ];
45161                             uvB = uvs[ 1 ];
45162                             uvC = uvs[ 2 ];
45163
45164                             // AB
45165
45166                             if ( edge === 0 ) {
45167
45168                                 uvM = uvA.clone();
45169                                 uvM.lerpSelf( uvB, 0.5 );
45170
45171                                 uvsTriA = [ uvA.clone(), uvM.clone(), uvC.clone() ];
45172                                 uvsTriB = [ uvM.clone(), uvB.clone(), uvC.clone() ];
45173
45174                             // BC
45175
45176                             } else if ( edge === 1 ) {
45177
45178                                 uvM = uvB.clone();
45179                                 uvM.lerpSelf( uvC, 0.5 );
45180
45181                                 uvsTriA = [ uvA.clone(), uvB.clone(), uvM.clone() ];
45182                                 uvsTriB = [ uvM.clone(), uvC.clone(), uvA.clone() ];
45183
45184                             // AC
45185
45186                             } else {
45187
45188                                 uvM = uvA.clone();
45189                                 uvM.lerpSelf( uvC, 0.5 );
45190
45191                                 uvsTriA = [ uvA.clone(), uvB.clone(), uvM.clone() ];
45192                                 uvsTriB = [ uvM.clone(), uvB.clone(), uvC.clone() ];
45193
45194                             }
45195
45196                             faceVertexUvs[ j ].push( uvsTriA, uvsTriB );
45197
45198                         }
45199
45200                     }
45201
45202                 } else {
45203
45204                     faces.push( face );
45205
45206                     for ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {
45207
45208                         faceVertexUvs[ j ].push( geometry.faceVertexUvs[ j ][ i ] );
45209
45210                     }
45211
45212                 }
45213
45214             } else {
45215
45216                 a = face.a;
45217                 b = face.b;
45218                 c = face.c;
45219                 d = face.d;
45220
45221                 va = geometry.vertices[ a ];
45222                 vb = geometry.vertices[ b ];
45223                 vc = geometry.vertices[ c ];
45224                 vd = geometry.vertices[ d ];
45225
45226                 dab = va.distanceTo( vb );
45227                 dbc = vb.distanceTo( vc );
45228                 dcd = vc.distanceTo( vd );
45229                 dad = va.distanceTo( vd );
45230
45231                 if ( dab > maxEdgeLength || dbc > maxEdgeLength || dcd > maxEdgeLength || dad > maxEdgeLength ) {
45232
45233                     m1 = geometry.vertices.length;
45234                     m2 = geometry.vertices.length + 1;
45235
45236                     quadA = face.clone();
45237                     quadB = face.clone();
45238
45239                     if ( ( dab >= dbc && dab >= dcd && dab >= dad ) || ( dcd >= dbc && dcd >= dab && dcd >= dad ) ) {
45240
45241                         vm1 = va.clone();
45242                         vm1.lerpSelf( vb, 0.5 );
45243
45244                         vm2 = vc.clone();
45245                         vm2.lerpSelf( vd, 0.5 );
45246
45247                         quadA.a = a;
45248                         quadA.b = m1;
45249                         quadA.c = m2;
45250                         quadA.d = d;
45251
45252                         quadB.a = m1;
45253                         quadB.b = b;
45254                         quadB.c = c;
45255                         quadB.d = m2;
45256
45257                         if ( face.vertexNormals.length === 4 ) {
45258
45259                             vnm1 = face.vertexNormals[ 0 ].clone();
45260                             vnm1.lerpSelf( face.vertexNormals[ 1 ], 0.5 );
45261
45262                             vnm2 = face.vertexNormals[ 2 ].clone();
45263                             vnm2.lerpSelf( face.vertexNormals[ 3 ], 0.5 );
45264
45265                             quadA.vertexNormals[ 1 ].copy( vnm1 );
45266                             quadA.vertexNormals[ 2 ].copy( vnm2 );
45267
45268                             quadB.vertexNormals[ 0 ].copy( vnm1 );
45269                             quadB.vertexNormals[ 3 ].copy( vnm2 );
45270
45271                         }
45272
45273                         if ( face.vertexColors.length === 4 ) {
45274
45275                             vcm1 = face.vertexColors[ 0 ].clone();
45276                             vcm1.lerpSelf( face.vertexColors[ 1 ], 0.5 );
45277
45278                             vcm2 = face.vertexColors[ 2 ].clone();
45279                             vcm2.lerpSelf( face.vertexColors[ 3 ], 0.5 );
45280
45281                             quadA.vertexColors[ 1 ].copy( vcm1 );
45282                             quadA.vertexColors[ 2 ].copy( vcm2 );
45283
45284                             quadB.vertexColors[ 0 ].copy( vcm1 );
45285                             quadB.vertexColors[ 3 ].copy( vcm2 );
45286
45287                         }
45288
45289                         edge = 0;
45290
45291                     } else {
45292
45293                         vm1 = vb.clone();
45294                         vm1.lerpSelf( vc, 0.5 );
45295
45296                         vm2 = vd.clone();
45297                         vm2.lerpSelf( va, 0.5 );
45298
45299                         quadA.a = a;
45300                         quadA.b = b;
45301                         quadA.c = m1;
45302                         quadA.d = m2;
45303
45304                         quadB.a = m2;
45305                         quadB.b = m1;
45306                         quadB.c = c;
45307                         quadB.d = d;
45308
45309                         if ( face.vertexNormals.length === 4 ) {
45310
45311                             vnm1 = face.vertexNormals[ 1 ].clone();
45312                             vnm1.lerpSelf( face.vertexNormals[ 2 ], 0.5 );
45313
45314                             vnm2 = face.vertexNormals[ 3 ].clone();
45315                             vnm2.lerpSelf( face.vertexNormals[ 0 ], 0.5 );
45316
45317                             quadA.vertexNormals[ 2 ].copy( vnm1 );
45318                             quadA.vertexNormals[ 3 ].copy( vnm2 );
45319
45320                             quadB.vertexNormals[ 0 ].copy( vnm2 );
45321                             quadB.vertexNormals[ 1 ].copy( vnm1 );
45322
45323                         }
45324
45325                         if ( face.vertexColors.length === 4 ) {
45326
45327                             vcm1 = face.vertexColors[ 1 ].clone();
45328                             vcm1.lerpSelf( face.vertexColors[ 2 ], 0.5 );
45329
45330                             vcm2 = face.vertexColors[ 3 ].clone();
45331                             vcm2.lerpSelf( face.vertexColors[ 0 ], 0.5 );
45332
45333                             quadA.vertexColors[ 2 ].copy( vcm1 );
45334                             quadA.vertexColors[ 3 ].copy( vcm2 );
45335
45336                             quadB.vertexColors[ 0 ].copy( vcm2 );
45337                             quadB.vertexColors[ 1 ].copy( vcm1 );
45338
45339                         }
45340
45341                         edge = 1;
45342
45343                     }
45344
45345                     faces.push( quadA, quadB );
45346                     geometry.vertices.push( vm1, vm2 );
45347
45348                     var j, jl, uvs, uvA, uvB, uvC, uvD, uvM1, uvM2, uvsQuadA, uvsQuadB;
45349
45350                     for ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {
45351
45352                         if ( geometry.faceVertexUvs[ j ].length ) {
45353
45354                             uvs = geometry.faceVertexUvs[ j ][ i ];
45355
45356                             uvA = uvs[ 0 ];
45357                             uvB = uvs[ 1 ];
45358                             uvC = uvs[ 2 ];
45359                             uvD = uvs[ 3 ];
45360
45361                             // AB + CD
45362
45363                             if ( edge === 0 ) {
45364
45365                                 uvM1 = uvA.clone();
45366                                 uvM1.lerpSelf( uvB, 0.5 );
45367
45368                                 uvM2 = uvC.clone();
45369                                 uvM2.lerpSelf( uvD, 0.5 );
45370
45371                                 uvsQuadA = [ uvA.clone(), uvM1.clone(), uvM2.clone(), uvD.clone() ];
45372                                 uvsQuadB = [ uvM1.clone(), uvB.clone(), uvC.clone(), uvM2.clone() ];
45373
45374                             // BC + AD
45375
45376                             } else {
45377
45378                                 uvM1 = uvB.clone();
45379                                 uvM1.lerpSelf( uvC, 0.5 );
45380
45381                                 uvM2 = uvD.clone();
45382                                 uvM2.lerpSelf( uvA, 0.5 );
45383
45384                                 uvsQuadA = [ uvA.clone(), uvB.clone(), uvM1.clone(), uvM2.clone() ];
45385                                 uvsQuadB = [ uvM2.clone(), uvM1.clone(), uvC.clone(), uvD.clone() ];
45386
45387                             }
45388
45389                             faceVertexUvs[ j ].push( uvsQuadA, uvsQuadB );
45390
45391                         }
45392
45393                     }
45394
45395                 } else {
45396
45397                     faces.push( face );
45398
45399                     for ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {
45400
45401                         faceVertexUvs[ j ].push( geometry.faceVertexUvs[ j ][ i ] );
45402
45403                     }
45404
45405                 }
45406
45407             }
45408
45409         }
45410
45411         geometry.faces = faces;
45412         geometry.faceVertexUvs = faceVertexUvs;
45413
45414     }
45415
45416 };
45417
45418 THREE.GeometryUtils.random = THREE.Math.random16;
45419
45420 THREE.GeometryUtils.__v1 = new THREE.Vector3();
45421 /**
45422  * @author alteredq / http://alteredqualia.com/
45423  * @author mrdoob / http://mrdoob.com/
45424  */
45425
45426 THREE.ImageUtils = {
45427
45428     crossOrigin: 'anonymous',
45429
45430     loadTexture: function ( url, mapping, onLoad, onError ) {
45431
45432         var image = new Image();
45433         var texture = new THREE.Texture( image, mapping );
45434
45435         var loader = new THREE.ImageLoader();
45436
45437         loader.addEventListener( 'load', function ( event ) {
45438
45439             texture.image = event.content;
45440             texture.needsUpdate = true;
45441
45442             if ( onLoad ) onLoad( texture );
45443
45444         } );
45445
45446         loader.addEventListener( 'error', function ( event ) {
45447
45448             if ( onError ) onError( event.message );
45449
45450         } );
45451
45452         loader.crossOrigin = this.crossOrigin;
45453         loader.load( url, image );
45454
45455         return texture;
45456
45457     },
45458
45459     loadCompressedTexture: function ( url, mapping, onLoad, onError ) {
45460
45461         var texture = new THREE.CompressedTexture();
45462         texture.mapping = mapping;
45463
45464         var request = new XMLHttpRequest();
45465
45466         request.onload = function () {
45467
45468             var buffer = request.response;
45469             var dds = THREE.ImageUtils.parseDDS( buffer, true );
45470
45471             texture.format = dds.format;
45472
45473             texture.mipmaps = dds.mipmaps;
45474             texture.image.width = dds.width;
45475             texture.image.height = dds.height;
45476
45477             // gl.generateMipmap fails for compressed textures
45478             // mipmaps must be embedded in the DDS file
45479             // or texture filters must not use mipmapping
45480
45481             texture.generateMipmaps = false;
45482
45483             texture.needsUpdate = true;
45484
45485             if ( onLoad ) onLoad( texture );
45486
45487         }
45488
45489         request.onerror = onError;
45490
45491         request.open( 'GET', url, true );
45492         request.responseType = "arraybuffer";
45493         request.send( null );
45494
45495         return texture;
45496
45497     },
45498
45499     loadTextureCube: function ( array, mapping, onLoad, onError ) {
45500
45501         var images = [];
45502         images.loadCount = 0;
45503
45504         var texture = new THREE.Texture();
45505         texture.image = images;
45506         if ( mapping !== undefined ) texture.mapping = mapping;
45507
45508         // no flipping needed for cube textures
45509
45510         texture.flipY = false;
45511
45512         for ( var i = 0, il = array.length; i < il; ++ i ) {
45513
45514             var cubeImage = new Image();
45515             images[ i ] = cubeImage;
45516
45517             cubeImage.onload = function () {
45518
45519                 images.loadCount += 1;
45520
45521                 if ( images.loadCount === 6 ) {
45522
45523                     texture.needsUpdate = true;
45524                     if ( onLoad ) onLoad();
45525
45526                 }
45527
45528             };
45529
45530             cubeImage.onerror = onError;
45531
45532             cubeImage.crossOrigin = this.crossOrigin;
45533             cubeImage.src = array[ i ];
45534
45535         }
45536
45537         return texture;
45538
45539     },
45540
45541     loadCompressedTextureCube: function ( array, mapping, onLoad, onError ) {
45542
45543         var images = [];
45544         images.loadCount = 0;
45545
45546         var texture = new THREE.CompressedTexture();
45547         texture.image = images;
45548         if ( mapping !== undefined ) texture.mapping = mapping;
45549
45550         // no flipping for cube textures
45551         // (also flipping doesn't work for compressed textures )
45552
45553         texture.flipY = false;
45554
45555         // can't generate mipmaps for compressed textures
45556         // mips must be embedded in DDS files
45557
45558         texture.generateMipmaps = false;
45559
45560         var generateCubeFaceCallback = function ( rq, img ) {
45561
45562             return function () {
45563
45564                 var buffer = rq.response;
45565                 var dds = THREE.ImageUtils.parseDDS( buffer, true );
45566
45567                 img.format = dds.format;
45568
45569                 img.mipmaps = dds.mipmaps;
45570                 img.width = dds.width;
45571                 img.height = dds.height;
45572
45573                 images.loadCount += 1;
45574
45575                 if ( images.loadCount === 6 ) {
45576
45577                     texture.format = dds.format;
45578                     texture.needsUpdate = true;
45579                     if ( onLoad ) onLoad();
45580
45581                 }
45582
45583             }
45584
45585         }
45586
45587         for ( var i = 0, il = array.length; i < il; ++ i ) {
45588
45589             var cubeImage = {};
45590             images[ i ] = cubeImage;
45591
45592             var request = new XMLHttpRequest();
45593
45594             request.onload = generateCubeFaceCallback( request, cubeImage );
45595             request.onerror = onError;
45596
45597             var url = array[ i ];
45598
45599             request.open( 'GET', url, true );
45600             request.responseType = "arraybuffer";
45601             request.send( null );
45602
45603         }
45604
45605         return texture;
45606
45607     },
45608
45609     parseDDS: function ( buffer, loadMipmaps ) {
45610
45611         var dds = { mipmaps: [], width: 0, height: 0, format: null, mipmapCount: 1 };
45612
45613         // Adapted from @toji's DDS utils
45614         //    https://github.com/toji/webgl-texture-utils/blob/master/texture-util/dds.js
45615
45616         // All values and structures referenced from:
45617         // http://msdn.microsoft.com/en-us/library/bb943991.aspx/
45618
45619         var DDS_MAGIC = 0x20534444;
45620
45621         var DDSD_CAPS = 0x1,
45622             DDSD_HEIGHT = 0x2,
45623             DDSD_WIDTH = 0x4,
45624             DDSD_PITCH = 0x8,
45625             DDSD_PIXELFORMAT = 0x1000,
45626             DDSD_MIPMAPCOUNT = 0x20000,
45627             DDSD_LINEARSIZE = 0x80000,
45628             DDSD_DEPTH = 0x800000;
45629
45630         var DDSCAPS_COMPLEX = 0x8,
45631             DDSCAPS_MIPMAP = 0x400000,
45632             DDSCAPS_TEXTURE = 0x1000;
45633
45634         var DDSCAPS2_CUBEMAP = 0x200,
45635             DDSCAPS2_CUBEMAP_POSITIVEX = 0x400,
45636             DDSCAPS2_CUBEMAP_NEGATIVEX = 0x800,
45637             DDSCAPS2_CUBEMAP_POSITIVEY = 0x1000,
45638             DDSCAPS2_CUBEMAP_NEGATIVEY = 0x2000,
45639             DDSCAPS2_CUBEMAP_POSITIVEZ = 0x4000,
45640             DDSCAPS2_CUBEMAP_NEGATIVEZ = 0x8000,
45641             DDSCAPS2_VOLUME = 0x200000;
45642
45643         var DDPF_ALPHAPIXELS = 0x1,
45644             DDPF_ALPHA = 0x2,
45645             DDPF_FOURCC = 0x4,
45646             DDPF_RGB = 0x40,
45647             DDPF_YUV = 0x200,
45648             DDPF_LUMINANCE = 0x20000;
45649
45650         function fourCCToInt32( value ) {
45651
45652             return value.charCodeAt(0) +
45653                 (value.charCodeAt(1) << 8) +
45654                 (value.charCodeAt(2) << 16) +
45655                 (value.charCodeAt(3) << 24);
45656
45657         }
45658
45659         function int32ToFourCC( value ) {
45660
45661             return String.fromCharCode(
45662                 value & 0xff,
45663                 (value >> 8) & 0xff,
45664                 (value >> 16) & 0xff,
45665                 (value >> 24) & 0xff
45666             );
45667         }
45668
45669         var FOURCC_DXT1 = fourCCToInt32("DXT1");
45670         var FOURCC_DXT3 = fourCCToInt32("DXT3");
45671         var FOURCC_DXT5 = fourCCToInt32("DXT5");
45672
45673         var headerLengthInt = 31; // The header length in 32 bit ints
45674
45675         // Offsets into the header array
45676
45677         var off_magic = 0;
45678
45679         var off_size = 1;
45680         var off_flags = 2;
45681         var off_height = 3;
45682         var off_width = 4;
45683
45684         var off_mipmapCount = 7;
45685
45686         var off_pfFlags = 20;
45687         var off_pfFourCC = 21;
45688
45689         // Parse header
45690
45691         var header = new Int32Array( buffer, 0, headerLengthInt );
45692
45693         if ( header[ off_magic ] !== DDS_MAGIC ) {
45694
45695             console.error( "ImageUtils.parseDDS(): Invalid magic number in DDS header" );
45696             return dds;
45697
45698         }
45699
45700         if ( ! header[ off_pfFlags ] & DDPF_FOURCC ) {
45701
45702             console.error( "ImageUtils.parseDDS(): Unsupported format, must contain a FourCC code" );
45703             return dds;
45704
45705         }
45706
45707         var blockBytes;
45708
45709         var fourCC = header[ off_pfFourCC ];
45710
45711         switch ( fourCC ) {
45712
45713             case FOURCC_DXT1:
45714
45715                 blockBytes = 8;
45716                 dds.format = THREE.RGB_S3TC_DXT1_Format;
45717                 break;
45718
45719             case FOURCC_DXT3:
45720
45721                 blockBytes = 16;
45722                 dds.format = THREE.RGBA_S3TC_DXT3_Format;
45723                 break;
45724
45725             case FOURCC_DXT5:
45726
45727                 blockBytes = 16;
45728                 dds.format = THREE.RGBA_S3TC_DXT5_Format;
45729                 break;
45730
45731             default:
45732
45733                 console.error( "ImageUtils.parseDDS(): Unsupported FourCC code: ", int32ToFourCC( fourCC ) );
45734                 return dds;
45735
45736         }
45737
45738         dds.mipmapCount = 1;
45739
45740         if ( header[ off_flags ] & DDSD_MIPMAPCOUNT && loadMipmaps !== false ) {
45741
45742             dds.mipmapCount = Math.max( 1, header[ off_mipmapCount ] );
45743
45744         }
45745
45746         dds.width = header[ off_width ];
45747         dds.height = header[ off_height ];
45748
45749         var dataOffset = header[ off_size ] + 4;
45750
45751         // Extract mipmaps buffers
45752
45753         var width = dds.width;
45754         var height = dds.height;
45755
45756         for ( var i = 0; i < dds.mipmapCount; i ++ ) {
45757
45758             var dataLength = Math.max( 4, width ) / 4 * Math.max( 4, height ) / 4 * blockBytes;
45759             var byteArray = new Uint8Array( buffer, dataOffset, dataLength );
45760
45761             var mipmap = { "data": byteArray, "width": width, "height": height };
45762             dds.mipmaps.push( mipmap );
45763
45764             dataOffset += dataLength;
45765
45766             width = Math.max( width * 0.5, 1 );
45767             height = Math.max( height * 0.5, 1 );
45768
45769         }
45770
45771         return dds;
45772
45773     },
45774
45775     getNormalMap: function ( image, depth ) {
45776
45777         // Adapted from http://www.paulbrunt.co.uk/lab/heightnormal/
45778
45779         var cross = function ( a, b ) {
45780
45781             return [ a[ 1 ] * b[ 2 ] - a[ 2 ] * b[ 1 ], a[ 2 ] * b[ 0 ] - a[ 0 ] * b[ 2 ], a[ 0 ] * b[ 1 ] - a[ 1 ] * b[ 0 ] ];
45782
45783         }
45784
45785         var subtract = function ( a, b ) {
45786
45787             return [ a[ 0 ] - b[ 0 ], a[ 1 ] - b[ 1 ], a[ 2 ] - b[ 2 ] ];
45788
45789         }
45790
45791         var normalize = function ( a ) {
45792
45793             var l = Math.sqrt( a[ 0 ] * a[ 0 ] + a[ 1 ] * a[ 1 ] + a[ 2 ] * a[ 2 ] );
45794             return [ a[ 0 ] / l, a[ 1 ] / l, a[ 2 ] / l ];
45795
45796         }
45797
45798         depth = depth | 1;
45799
45800         var width = image.width;
45801         var height = image.height;
45802
45803         var canvas = document.createElement( 'canvas' );
45804         canvas.width = width;
45805         canvas.height = height;
45806
45807         var context = canvas.getContext( '2d' );
45808         context.drawImage( image, 0, 0 );
45809
45810         var data = context.getImageData( 0, 0, width, height ).data;
45811         var imageData = context.createImageData( width, height );
45812         var output = imageData.data;
45813
45814         for ( var x = 0; x < width; x ++ ) {
45815
45816             for ( var y = 0; y < height; y ++ ) {
45817
45818                 var ly = y - 1 < 0 ? 0 : y - 1;
45819                 var uy = y + 1 > height - 1 ? height - 1 : y + 1;
45820                 var lx = x - 1 < 0 ? 0 : x - 1;
45821                 var ux = x + 1 > width - 1 ? width - 1 : x + 1;
45822
45823                 var points = [];
45824                 var origin = [ 0, 0, data[ ( y * width + x ) * 4 ] / 255 * depth ];
45825                 points.push( [ - 1, 0, data[ ( y * width + lx ) * 4 ] / 255 * depth ] );
45826                 points.push( [ - 1, - 1, data[ ( ly * width + lx ) * 4 ] / 255 * depth ] );
45827                 points.push( [ 0, - 1, data[ ( ly * width + x ) * 4 ] / 255 * depth ] );
45828                 points.push( [  1, - 1, data[ ( ly * width + ux ) * 4 ] / 255 * depth ] );
45829                 points.push( [ 1, 0, data[ ( y * width + ux ) * 4 ] / 255 * depth ] );
45830                 points.push( [ 1, 1, data[ ( uy * width + ux ) * 4 ] / 255 * depth ] );
45831                 points.push( [ 0, 1, data[ ( uy * width + x ) * 4 ] / 255 * depth ] );
45832                 points.push( [ - 1, 1, data[ ( uy * width + lx ) * 4 ] / 255 * depth ] );
45833
45834                 var normals = [];
45835                 var num_points = points.length;
45836
45837                 for ( var i = 0; i < num_points; i ++ ) {
45838
45839                     var v1 = points[ i ];
45840                     var v2 = points[ ( i + 1 ) % num_points ];
45841                     v1 = subtract( v1, origin );
45842                     v2 = subtract( v2, origin );
45843                     normals.push( normalize( cross( v1, v2 ) ) );
45844
45845                 }
45846
45847                 var normal = [ 0, 0, 0 ];
45848
45849                 for ( var i = 0; i < normals.length; i ++ ) {
45850
45851                     normal[ 0 ] += normals[ i ][ 0 ];
45852                     normal[ 1 ] += normals[ i ][ 1 ];
45853                     normal[ 2 ] += normals[ i ][ 2 ];
45854
45855                 }
45856
45857                 normal[ 0 ] /= normals.length;
45858                 normal[ 1 ] /= normals.length;
45859                 normal[ 2 ] /= normals.length;
45860
45861                 var idx = ( y * width + x ) * 4;
45862
45863                 output[ idx ] = ( ( normal[ 0 ] + 1.0 ) / 2.0 * 255 ) | 0;
45864                 output[ idx + 1 ] = ( ( normal[ 1 ] + 1.0 ) / 2.0 * 255 ) | 0;
45865                 output[ idx + 2 ] = ( normal[ 2 ] * 255 ) | 0;
45866                 output[ idx + 3 ] = 255;
45867
45868             }
45869
45870         }
45871
45872         context.putImageData( imageData, 0, 0 );
45873
45874         return canvas;
45875
45876     },
45877
45878     generateDataTexture: function ( width, height, color ) {
45879
45880         var size = width * height;
45881         var data = new Uint8Array( 3 * size );
45882
45883         var r = Math.floor( color.r * 255 );
45884         var g = Math.floor( color.g * 255 );
45885         var b = Math.floor( color.b * 255 );
45886
45887         for ( var i = 0; i < size; i ++ ) {
45888
45889             data[ i * 3 ]       = r;
45890             data[ i * 3 + 1 ] = g;
45891             data[ i * 3 + 2 ] = b;
45892
45893         }
45894
45895         var texture = new THREE.DataTexture( data, width, height, THREE.RGBFormat );
45896         texture.needsUpdate = true;
45897
45898         return texture;
45899
45900     }
45901
45902 };
45903 /**
45904  * @author alteredq / http://alteredqualia.com/
45905  */
45906
45907 THREE.SceneUtils = {
45908
45909     showHierarchy : function ( root, visible ) {
45910
45911         THREE.SceneUtils.traverseHierarchy( root, function( node ) { node.visible = visible; } );
45912
45913     },
45914
45915     traverseHierarchy : function ( root, callback ) {
45916
45917         var n, i, l = root.children.length;
45918
45919         for ( i = 0; i < l; i ++ ) {
45920
45921             n = root.children[ i ];
45922
45923             callback( n );
45924
45925             THREE.SceneUtils.traverseHierarchy( n, callback );
45926
45927         }
45928
45929     },
45930
45931     createMultiMaterialObject : function ( geometry, materials ) {
45932
45933         var i, il = materials.length,
45934             group = new THREE.Object3D();
45935
45936         for ( i = 0; i < il; i ++ ) {
45937
45938             var object = new THREE.Mesh( geometry, materials[ i ] );
45939             group.add( object );
45940
45941         }
45942
45943         return group;
45944
45945     },
45946
45947     cloneObject: function ( source ) {
45948
45949         var object;
45950
45951         // subclass specific properties
45952         // (must process in order from more specific subclasses to more abstract classes)
45953
45954         if ( source instanceof THREE.MorphAnimMesh ) {
45955
45956             object = new THREE.MorphAnimMesh( source.geometry, source.material );
45957
45958             object.duration = source.duration;
45959             object.mirroredLoop = source.mirroredLoop;
45960             object.time = source.time;
45961
45962             object.lastKeyframe = source.lastKeyframe;
45963             object.currentKeyframe = source.currentKeyframe;
45964
45965             object.direction = source.direction;
45966             object.directionBackwards = source.directionBackwards;
45967
45968         } else if ( source instanceof THREE.SkinnedMesh ) {
45969
45970             object = new THREE.SkinnedMesh( source.geometry, source.material, source.useVertexTexture );
45971
45972         } else if ( source instanceof THREE.Mesh ) {
45973
45974             object = new THREE.Mesh( source.geometry, source.material );
45975
45976         } else if ( source instanceof THREE.Line ) {
45977
45978             object = new THREE.Line( source.geometry, source.material, source.type );
45979
45980         } else if ( source instanceof THREE.Ribbon ) {
45981
45982             object = new THREE.Ribbon( source.geometry, source.material );
45983
45984         } else if ( source instanceof THREE.ParticleSystem ) {
45985
45986             object = new THREE.ParticleSystem( source.geometry, source.material );
45987             object.sortParticles = source.sortParticles;
45988
45989         } else if ( source instanceof THREE.Particle ) {
45990
45991             object = new THREE.Particle( source.material );
45992
45993         } else if ( source instanceof THREE.Sprite ) {
45994
45995             object = new THREE.Sprite( {} );
45996
45997             object.color.copy( source.color );
45998             object.map = source.map;
45999             object.blending = source.blending;
46000
46001             object.useScreenCoordinates = source.useScreenCoordinates;
46002             object.mergeWith3D = source.mergeWith3D;
46003             object.affectedByDistance = source.affectedByDistance;
46004             object.scaleByViewport = source.scaleByViewport;
46005             object.alignment = source.alignment;
46006
46007             object.rotation3d.copy( source.rotation3d );
46008             object.rotation = source.rotation;
46009             object.opacity = source.opacity;
46010
46011             object.uvOffset.copy( source.uvOffset );
46012             object.uvScale.copy( source.uvScale);
46013
46014         } else if ( source instanceof THREE.LOD ) {
46015
46016             object = new THREE.LOD();
46017
46018         /*
46019         } else if ( source instanceof THREE.MarchingCubes ) {
46020
46021             object = new THREE.MarchingCubes( source.resolution, source.material );
46022             object.field.set( source.field );
46023             object.isolation = source.isolation;
46024         */
46025
46026         } else if ( source instanceof THREE.Object3D ) {
46027
46028             object = new THREE.Object3D();
46029
46030         }
46031
46032         // base class properties
46033
46034         object.name = source.name;
46035
46036         object.parent = source.parent;
46037
46038         object.up.copy( source.up );
46039
46040         object.position.copy( source.position );
46041
46042         // because of Sprite madness
46043
46044         if ( object.rotation instanceof THREE.Vector3 )
46045             object.rotation.copy( source.rotation );
46046
46047         object.eulerOrder = source.eulerOrder;
46048
46049         object.scale.copy( source.scale );
46050
46051         object.dynamic = source.dynamic;
46052
46053         object.renderDepth = source.renderDepth;
46054
46055         object.rotationAutoUpdate = source.rotationAutoUpdate;
46056
46057         object.matrix.copy( source.matrix );
46058         object.matrixWorld.copy( source.matrixWorld );
46059         object.matrixRotationWorld.copy( source.matrixRotationWorld );
46060
46061         object.matrixAutoUpdate = source.matrixAutoUpdate;
46062         object.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;
46063
46064         object.quaternion.copy( source.quaternion );
46065         object.useQuaternion = source.useQuaternion;
46066
46067         object.boundRadius = source.boundRadius;
46068         object.boundRadiusScale = source.boundRadiusScale;
46069
46070         object.visible = source.visible;
46071
46072         object.castShadow = source.castShadow;
46073         object.receiveShadow = source.receiveShadow;
46074
46075         object.frustumCulled = source.frustumCulled;
46076
46077         // children
46078
46079         for ( var i = 0; i < source.children.length; i ++ ) {
46080
46081             var child = THREE.SceneUtils.cloneObject( source.children[ i ] );
46082             object.children[ i ] = child;
46083
46084             child.parent = object;
46085
46086         }
46087
46088         // LODs need to be patched separately to use cloned children
46089
46090         if ( source instanceof THREE.LOD ) {
46091
46092             for ( var i = 0; i < source.LODs.length; i ++ ) {
46093
46094                 var lod = source.LODs[ i ];
46095                 object.LODs[ i ] = { visibleAtDistance: lod.visibleAtDistance, object3D: object.children[ i ] };
46096
46097             }
46098
46099         }
46100
46101         return object;
46102
46103     },
46104
46105     detach : function ( child, parent, scene ) {
46106
46107         child.applyMatrix( parent.matrixWorld );
46108         parent.remove( child );
46109         scene.add( child );
46110
46111     },
46112
46113     attach: function ( child, scene, parent ) {
46114
46115         var matrixWorldInverse = new THREE.Matrix4();
46116         matrixWorldInverse.getInverse( parent.matrixWorld );
46117         child.applyMatrix( matrixWorldInverse );
46118
46119         scene.remove( child );
46120         parent.add( child );
46121
46122     }
46123
46124 };
46125 /**
46126  * @author alteredq / http://alteredqualia.com/
46127  * @author mrdoob / http://mrdoob.com/
46128  *
46129  * ShaderUtils currently contains:
46130  *
46131  *    fresnel
46132  *    normal
46133  *     cube
46134  *
46135  */
46136
46137 if ( THREE.WebGLRenderer ) {
46138
46139 THREE.ShaderUtils = {
46140
46141     lib: {
46142
46143         /* -------------------------------------------------------------------------
46144         //    Fresnel shader
46145         //    - based on Nvidia Cg tutorial
46146          ------------------------------------------------------------------------- */
46147
46148         'fresnel': {
46149
46150             uniforms: {
46151
46152                 "mRefractionRatio": { type: "f", value: 1.02 },
46153                 "mFresnelBias": { type: "f", value: 0.1 },
46154                 "mFresnelPower": { type: "f", value: 2.0 },
46155                 "mFresnelScale": { type: "f", value: 1.0 },
46156                 "tCube": { type: "t", value: null }
46157
46158             },
46159
46160             fragmentShader: [
46161
46162                 "uniform samplerCube tCube;",
46163
46164                 "varying vec3 vReflect;",
46165                 "varying vec3 vRefract[3];",
46166                 "varying float vReflectionFactor;",
46167
46168                 "void main() {",
46169
46170                     "vec4 reflectedColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );",
46171                     "vec4 refractedColor = vec4( 1.0, 1.0, 1.0, 1.0 );",
46172
46173                     "refractedColor.r = textureCube( tCube, vec3( -vRefract[0].x, vRefract[0].yz ) ).r;",
46174                     "refractedColor.g = textureCube( tCube, vec3( -vRefract[1].x, vRefract[1].yz ) ).g;",
46175                     "refractedColor.b = textureCube( tCube, vec3( -vRefract[2].x, vRefract[2].yz ) ).b;",
46176                     "refractedColor.a = 1.0;",
46177
46178                     "gl_FragColor = mix( refractedColor, reflectedColor, clamp( vReflectionFactor, 0.0, 1.0 ) );",
46179
46180                 "}"
46181
46182             ].join("\n"),
46183
46184             vertexShader: [
46185
46186                 "uniform float mRefractionRatio;",
46187                 "uniform float mFresnelBias;",
46188                 "uniform float mFresnelScale;",
46189                 "uniform float mFresnelPower;",
46190
46191                 "varying vec3 vReflect;",
46192                 "varying vec3 vRefract[3];",
46193                 "varying float vReflectionFactor;",
46194
46195                 "void main() {",
46196
46197                     "vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
46198                     "vec4 mPosition = modelMatrix * vec4( position, 1.0 );",
46199
46200                     "vec3 nWorld = normalize( mat3( modelMatrix[0].xyz, modelMatrix[1].xyz, modelMatrix[2].xyz ) * normal );",
46201
46202                     "vec3 I = mPosition.xyz - cameraPosition;",
46203
46204                     "vReflect = reflect( I, nWorld );",
46205                     "vRefract[0] = refract( normalize( I ), nWorld, mRefractionRatio );",
46206                     "vRefract[1] = refract( normalize( I ), nWorld, mRefractionRatio * 0.99 );",
46207                     "vRefract[2] = refract( normalize( I ), nWorld, mRefractionRatio * 0.98 );",
46208                     "vReflectionFactor = mFresnelBias + mFresnelScale * pow( 1.0 + dot( normalize( I ), nWorld ), mFresnelPower );",
46209
46210                     "gl_Position = projectionMatrix * mvPosition;",
46211
46212                 "}"
46213
46214             ].join("\n")
46215
46216         },
46217
46218         /* -------------------------------------------------------------------------
46219         //    Normal map shader
46220         //        - Blinn-Phong
46221         //        - normal + diffuse + specular + AO + displacement + reflection + shadow maps
46222         //        - point and directional lights (use with "lights: true" material option)
46223          ------------------------------------------------------------------------- */
46224
46225         'normal' : {
46226
46227             uniforms: THREE.UniformsUtils.merge( [
46228
46229                 THREE.UniformsLib[ "fog" ],
46230                 THREE.UniformsLib[ "lights" ],
46231                 THREE.UniformsLib[ "shadowmap" ],
46232
46233                 {
46234
46235                 "enableAO"          : { type: "i", value: 0 },
46236                 "enableDiffuse"      : { type: "i", value: 0 },
46237                 "enableSpecular"  : { type: "i", value: 0 },
46238                 "enableReflection": { type: "i", value: 0 },
46239                 "enableDisplacement": { type: "i", value: 0 },
46240
46241                 "tDisplacement": { type: "t", value: null }, // must go first as this is vertex texture
46242                 "tDiffuse"       : { type: "t", value: null },
46243                 "tCube"           : { type: "t", value: null },
46244                 "tNormal"       : { type: "t", value: null },
46245                 "tSpecular"       : { type: "t", value: null },
46246                 "tAO"           : { type: "t", value: null },
46247
46248                 "uNormalScale": { type: "v2", value: new THREE.Vector2( 1, 1 ) },
46249
46250                 "uDisplacementBias": { type: "f", value: 0.0 },
46251                 "uDisplacementScale": { type: "f", value: 1.0 },
46252
46253                 "uDiffuseColor": { type: "c", value: new THREE.Color( 0xffffff ) },
46254                 "uSpecularColor": { type: "c", value: new THREE.Color( 0x111111 ) },
46255                 "uAmbientColor": { type: "c", value: new THREE.Color( 0xffffff ) },
46256                 "uShininess": { type: "f", value: 30 },
46257                 "uOpacity": { type: "f", value: 1 },
46258
46259                 "useRefract": { type: "i", value: 0 },
46260                 "uRefractionRatio": { type: "f", value: 0.98 },
46261                 "uReflectivity": { type: "f", value: 0.5 },
46262
46263                 "uOffset" : { type: "v2", value: new THREE.Vector2( 0, 0 ) },
46264                 "uRepeat" : { type: "v2", value: new THREE.Vector2( 1, 1 ) },
46265
46266                 "wrapRGB"  : { type: "v3", value: new THREE.Vector3( 1, 1, 1 ) }
46267
46268                 }
46269
46270             ] ),
46271
46272             fragmentShader: [
46273
46274                 "uniform vec3 uAmbientColor;",
46275                 "uniform vec3 uDiffuseColor;",
46276                 "uniform vec3 uSpecularColor;",
46277                 "uniform float uShininess;",
46278                 "uniform float uOpacity;",
46279
46280                 "uniform bool enableDiffuse;",
46281                 "uniform bool enableSpecular;",
46282                 "uniform bool enableAO;",
46283                 "uniform bool enableReflection;",
46284
46285                 "uniform sampler2D tDiffuse;",
46286                 "uniform sampler2D tNormal;",
46287                 "uniform sampler2D tSpecular;",
46288                 "uniform sampler2D tAO;",
46289
46290                 "uniform samplerCube tCube;",
46291
46292                 "uniform vec2 uNormalScale;",
46293
46294                 "uniform bool useRefract;",
46295                 "uniform float uRefractionRatio;",
46296                 "uniform float uReflectivity;",
46297
46298                 "varying vec3 vTangent;",
46299                 "varying vec3 vBinormal;",
46300                 "varying vec3 vNormal;",
46301                 "varying vec2 vUv;",
46302
46303                 "uniform vec3 ambientLightColor;",
46304
46305                 "#if MAX_DIR_LIGHTS > 0",
46306
46307                     "uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];",
46308                     "uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];",
46309
46310                 "#endif",
46311
46312                 "#if MAX_HEMI_LIGHTS > 0",
46313
46314                     "uniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];",
46315                     "uniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];",
46316                     "uniform vec3 hemisphereLightPosition[ MAX_HEMI_LIGHTS ];",
46317
46318                 "#endif",
46319
46320                 "#if MAX_POINT_LIGHTS > 0",
46321
46322                     "uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];",
46323                     "uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];",
46324                     "uniform float pointLightDistance[ MAX_POINT_LIGHTS ];",
46325
46326                 "#endif",
46327
46328                 "#if MAX_SPOT_LIGHTS > 0",
46329
46330                     "uniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];",
46331                     "uniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];",
46332                     "uniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];",
46333                     "uniform float spotLightAngle[ MAX_SPOT_LIGHTS ];",
46334                     "uniform float spotLightExponent[ MAX_SPOT_LIGHTS ];",
46335                     "uniform float spotLightDistance[ MAX_SPOT_LIGHTS ];",
46336
46337                 "#endif",
46338
46339                 "#ifdef WRAP_AROUND",
46340
46341                     "uniform vec3 wrapRGB;",
46342
46343                 "#endif",
46344
46345                 "varying vec3 vWorldPosition;",
46346                 "varying vec3 vViewPosition;",
46347
46348                 THREE.ShaderChunk[ "shadowmap_pars_fragment" ],
46349                 THREE.ShaderChunk[ "fog_pars_fragment" ],
46350
46351                 "void main() {",
46352
46353                     "gl_FragColor = vec4( vec3( 1.0 ), uOpacity );",
46354
46355                     "vec3 specularTex = vec3( 1.0 );",
46356
46357                     "vec3 normalTex = texture2D( tNormal, vUv ).xyz * 2.0 - 1.0;",
46358                     "normalTex.xy *= uNormalScale;",
46359                     "normalTex = normalize( normalTex );",
46360
46361                     "if( enableDiffuse ) {",
46362
46363                         "#ifdef GAMMA_INPUT",
46364
46365                             "vec4 texelColor = texture2D( tDiffuse, vUv );",
46366                             "texelColor.xyz *= texelColor.xyz;",
46367
46368                             "gl_FragColor = gl_FragColor * texelColor;",
46369
46370                         "#else",
46371
46372                             "gl_FragColor = gl_FragColor * texture2D( tDiffuse, vUv );",
46373
46374                         "#endif",
46375
46376                     "}",
46377
46378                     "if( enableAO ) {",
46379
46380                         "#ifdef GAMMA_INPUT",
46381
46382                             "vec4 aoColor = texture2D( tAO, vUv );",
46383                             "aoColor.xyz *= aoColor.xyz;",
46384
46385                             "gl_FragColor.xyz = gl_FragColor.xyz * aoColor.xyz;",
46386
46387                         "#else",
46388
46389                             "gl_FragColor.xyz = gl_FragColor.xyz * texture2D( tAO, vUv ).xyz;",
46390
46391                         "#endif",
46392
46393                     "}",
46394
46395                     "if( enableSpecular )",
46396                         "specularTex = texture2D( tSpecular, vUv ).xyz;",
46397
46398                     "mat3 tsb = mat3( normalize( vTangent ), normalize( vBinormal ), normalize( vNormal ) );",
46399                     "vec3 finalNormal = tsb * normalTex;",
46400
46401                     "#ifdef FLIP_SIDED",
46402
46403                         "finalNormal = -finalNormal;",
46404
46405                     "#endif",
46406
46407                     "vec3 normal = normalize( finalNormal );",
46408                     "vec3 viewPosition = normalize( vViewPosition );",
46409
46410                     // point lights
46411
46412                     "#if MAX_POINT_LIGHTS > 0",
46413
46414                         "vec3 pointDiffuse = vec3( 0.0 );",
46415                         "vec3 pointSpecular = vec3( 0.0 );",
46416
46417                         "for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {",
46418
46419                             "vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );",
46420                             "vec3 pointVector = lPosition.xyz + vViewPosition.xyz;",
46421
46422                             "float pointDistance = 1.0;",
46423                             "if ( pointLightDistance[ i ] > 0.0 )",
46424                                 "pointDistance = 1.0 - min( ( length( pointVector ) / pointLightDistance[ i ] ), 1.0 );",
46425
46426                             "pointVector = normalize( pointVector );",
46427
46428                             // diffuse
46429
46430                             "#ifdef WRAP_AROUND",
46431
46432                                 "float pointDiffuseWeightFull = max( dot( normal, pointVector ), 0.0 );",
46433                                 "float pointDiffuseWeightHalf = max( 0.5 * dot( normal, pointVector ) + 0.5, 0.0 );",
46434
46435                                 "vec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );",
46436
46437                             "#else",
46438
46439                                 "float pointDiffuseWeight = max( dot( normal, pointVector ), 0.0 );",
46440
46441                             "#endif",
46442
46443                             "pointDiffuse += pointDistance * pointLightColor[ i ] * uDiffuseColor * pointDiffuseWeight;",
46444
46445                             // specular
46446
46447                             "vec3 pointHalfVector = normalize( pointVector + viewPosition );",
46448                             "float pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );",
46449                             "float pointSpecularWeight = specularTex.r * max( pow( pointDotNormalHalf, uShininess ), 0.0 );",
46450
46451                             "#ifdef PHYSICALLY_BASED_SHADING",
46452
46453                                 // 2.0 => 2.0001 is hack to work around ANGLE bug
46454
46455                                 "float specularNormalization = ( uShininess + 2.0001 ) / 8.0;",
46456
46457                                 "vec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( pointVector, pointHalfVector ), 5.0 );",
46458                                 "pointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * pointDistance * specularNormalization;",
46459
46460                             "#else",
46461
46462                                 "pointSpecular += pointDistance * pointLightColor[ i ] * uSpecularColor * pointSpecularWeight * pointDiffuseWeight;",
46463
46464                             "#endif",
46465
46466                         "}",
46467
46468                     "#endif",
46469
46470                     // spot lights
46471
46472                     "#if MAX_SPOT_LIGHTS > 0",
46473
46474                         "vec3 spotDiffuse = vec3( 0.0 );",
46475                         "vec3 spotSpecular = vec3( 0.0 );",
46476
46477                         "for ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {",
46478
46479                             "vec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );",
46480                             "vec3 spotVector = lPosition.xyz + vViewPosition.xyz;",
46481
46482                             "float spotDistance = 1.0;",
46483                             "if ( spotLightDistance[ i ] > 0.0 )",
46484                                 "spotDistance = 1.0 - min( ( length( spotVector ) / spotLightDistance[ i ] ), 1.0 );",
46485
46486                             "spotVector = normalize( spotVector );",
46487
46488                             "float spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - vWorldPosition ) );",
46489
46490                             "if ( spotEffect > spotLightAngle[ i ] ) {",
46491
46492                                 "spotEffect = pow( spotEffect, spotLightExponent[ i ] );",
46493
46494                                 // diffuse
46495
46496                                 "#ifdef WRAP_AROUND",
46497
46498                                     "float spotDiffuseWeightFull = max( dot( normal, spotVector ), 0.0 );",
46499                                     "float spotDiffuseWeightHalf = max( 0.5 * dot( normal, spotVector ) + 0.5, 0.0 );",
46500
46501                                     "vec3 spotDiffuseWeight = mix( vec3 ( spotDiffuseWeightFull ), vec3( spotDiffuseWeightHalf ), wrapRGB );",
46502
46503                                 "#else",
46504
46505                                     "float spotDiffuseWeight = max( dot( normal, spotVector ), 0.0 );",
46506
46507                                 "#endif",
46508
46509                                 "spotDiffuse += spotDistance * spotLightColor[ i ] * uDiffuseColor * spotDiffuseWeight * spotEffect;",
46510
46511                                 // specular
46512
46513                                 "vec3 spotHalfVector = normalize( spotVector + viewPosition );",
46514                                 "float spotDotNormalHalf = max( dot( normal, spotHalfVector ), 0.0 );",
46515                                 "float spotSpecularWeight = specularTex.r * max( pow( spotDotNormalHalf, uShininess ), 0.0 );",
46516
46517                                 "#ifdef PHYSICALLY_BASED_SHADING",
46518
46519                                     // 2.0 => 2.0001 is hack to work around ANGLE bug
46520
46521                                     "float specularNormalization = ( uShininess + 2.0001 ) / 8.0;",
46522
46523                                     "vec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( spotVector, spotHalfVector ), 5.0 );",
46524                                     "spotSpecular += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * spotDistance * specularNormalization * spotEffect;",
46525
46526                                 "#else",
46527
46528                                     "spotSpecular += spotDistance * spotLightColor[ i ] * uSpecularColor * spotSpecularWeight * spotDiffuseWeight * spotEffect;",
46529
46530                                 "#endif",
46531
46532                             "}",
46533
46534                         "}",
46535
46536                     "#endif",
46537
46538                     // directional lights
46539
46540                     "#if MAX_DIR_LIGHTS > 0",
46541
46542                         "vec3 dirDiffuse = vec3( 0.0 );",
46543                         "vec3 dirSpecular = vec3( 0.0 );",
46544
46545                         "for( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {",
46546
46547                             "vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );",
46548                             "vec3 dirVector = normalize( lDirection.xyz );",
46549
46550                             // diffuse
46551
46552                             "#ifdef WRAP_AROUND",
46553
46554                                 "float directionalLightWeightingFull = max( dot( normal, dirVector ), 0.0 );",
46555                                 "float directionalLightWeightingHalf = max( 0.5 * dot( normal, dirVector ) + 0.5, 0.0 );",
46556
46557                                 "vec3 dirDiffuseWeight = mix( vec3( directionalLightWeightingFull ), vec3( directionalLightWeightingHalf ), wrapRGB );",
46558
46559                             "#else",
46560
46561                                 "float dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );",
46562
46563                             "#endif",
46564
46565                             "dirDiffuse += directionalLightColor[ i ] * uDiffuseColor * dirDiffuseWeight;",
46566
46567                             // specular
46568
46569                             "vec3 dirHalfVector = normalize( dirVector + viewPosition );",
46570                             "float dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );",
46571                             "float dirSpecularWeight = specularTex.r * max( pow( dirDotNormalHalf, uShininess ), 0.0 );",
46572
46573                             "#ifdef PHYSICALLY_BASED_SHADING",
46574
46575                                 // 2.0 => 2.0001 is hack to work around ANGLE bug
46576
46577                                 "float specularNormalization = ( uShininess + 2.0001 ) / 8.0;",
46578
46579                                 "vec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );",
46580                                 "dirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;",
46581
46582                             "#else",
46583
46584                                 "dirSpecular += directionalLightColor[ i ] * uSpecularColor * dirSpecularWeight * dirDiffuseWeight;",
46585
46586                             "#endif",
46587
46588                         "}",
46589
46590                     "#endif",
46591
46592                     // hemisphere lights
46593
46594                     "#if MAX_HEMI_LIGHTS > 0",
46595
46596                         "vec3 hemiDiffuse  = vec3( 0.0 );",
46597                         "vec3 hemiSpecular = vec3( 0.0 );" ,
46598
46599                         "for( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {",
46600
46601                             "vec4 lPosition = viewMatrix * vec4( hemisphereLightPosition[ i ], 1.0 );",
46602                             "vec3 lVector = normalize( lPosition.xyz + vViewPosition.xyz );",
46603
46604                             // diffuse
46605
46606                             "float dotProduct = dot( normal, lVector );",
46607                             "float hemiDiffuseWeight = 0.5 * dotProduct + 0.5;",
46608
46609                             "vec3 hemiColor = mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );",
46610
46611                             "hemiDiffuse += uDiffuseColor * hemiColor;",
46612
46613                             // specular (sky light)
46614
46615
46616                             "vec3 hemiHalfVectorSky = normalize( lVector + viewPosition );",
46617                             "float hemiDotNormalHalfSky = 0.5 * dot( normal, hemiHalfVectorSky ) + 0.5;",
46618                             "float hemiSpecularWeightSky = specularTex.r * max( pow( hemiDotNormalHalfSky, uShininess ), 0.0 );",
46619
46620                             // specular (ground light)
46621
46622                             "vec3 lVectorGround = normalize( -lPosition.xyz + vViewPosition.xyz );",
46623
46624                             "vec3 hemiHalfVectorGround = normalize( lVectorGround + viewPosition );",
46625                             "float hemiDotNormalHalfGround = 0.5 * dot( normal, hemiHalfVectorGround ) + 0.5;",
46626                             "float hemiSpecularWeightGround = specularTex.r * max( pow( hemiDotNormalHalfGround, uShininess ), 0.0 );",
46627
46628                             "#ifdef PHYSICALLY_BASED_SHADING",
46629
46630                                 "float dotProductGround = dot( normal, lVectorGround );",
46631
46632                                 // 2.0 => 2.0001 is hack to work around ANGLE bug
46633
46634                                 "float specularNormalization = ( uShininess + 2.0001 ) / 8.0;",
46635
46636                                 "vec3 schlickSky = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( lVector, hemiHalfVectorSky ), 5.0 );",
46637                                 "vec3 schlickGround = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( lVectorGround, hemiHalfVectorGround ), 5.0 );",
46638                                 "hemiSpecular += hemiColor * specularNormalization * ( schlickSky * hemiSpecularWeightSky * max( dotProduct, 0.0 ) + schlickGround * hemiSpecularWeightGround * max( dotProductGround, 0.0 ) );",
46639
46640                             "#else",
46641
46642                                 "hemiSpecular += uSpecularColor * hemiColor * ( hemiSpecularWeightSky + hemiSpecularWeightGround ) * hemiDiffuseWeight;",
46643
46644                             "#endif",
46645
46646                         "}",
46647
46648                     "#endif",
46649
46650                     // all lights contribution summation
46651
46652                     "vec3 totalDiffuse = vec3( 0.0 );",
46653                     "vec3 totalSpecular = vec3( 0.0 );",
46654
46655                     "#if MAX_DIR_LIGHTS > 0",
46656
46657                         "totalDiffuse += dirDiffuse;",
46658                         "totalSpecular += dirSpecular;",
46659
46660                     "#endif",
46661
46662                     "#if MAX_HEMI_LIGHTS > 0",
46663
46664                         "totalDiffuse += hemiDiffuse;",
46665                         "totalSpecular += hemiSpecular;",
46666
46667                     "#endif",
46668
46669                     "#if MAX_POINT_LIGHTS > 0",
46670
46671                         "totalDiffuse += pointDiffuse;",
46672                         "totalSpecular += pointSpecular;",
46673
46674                     "#endif",
46675
46676                     "#if MAX_SPOT_LIGHTS > 0",
46677
46678                         "totalDiffuse += spotDiffuse;",
46679                         "totalSpecular += spotSpecular;",
46680
46681                     "#endif",
46682
46683                     "#ifdef METAL",
46684
46685                         "gl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * uAmbientColor + totalSpecular );",
46686
46687                     "#else",
46688
46689                         "gl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * uAmbientColor ) + totalSpecular;",
46690
46691                     "#endif",
46692
46693                     "if ( enableReflection ) {",
46694
46695                         "vec3 vReflect;",
46696                         "vec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );",
46697
46698                         "if ( useRefract ) {",
46699
46700                             "vReflect = refract( cameraToVertex, normal, uRefractionRatio );",
46701
46702                         "} else {",
46703
46704                             "vReflect = reflect( cameraToVertex, normal );",
46705
46706                         "}",
46707
46708                         "vec4 cubeColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );",
46709
46710                         "#ifdef GAMMA_INPUT",
46711
46712                             "cubeColor.xyz *= cubeColor.xyz;",
46713
46714                         "#endif",
46715
46716                         "gl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularTex.r * uReflectivity );",
46717
46718                     "}",
46719
46720                     THREE.ShaderChunk[ "shadowmap_fragment" ],
46721                     THREE.ShaderChunk[ "linear_to_gamma_fragment" ],
46722                     THREE.ShaderChunk[ "fog_fragment" ],
46723
46724                 "}"
46725
46726             ].join("\n"),
46727
46728             vertexShader: [
46729
46730                 "attribute vec4 tangent;",
46731
46732                 "uniform vec2 uOffset;",
46733                 "uniform vec2 uRepeat;",
46734
46735                 "uniform bool enableDisplacement;",
46736
46737                 "#ifdef VERTEX_TEXTURES",
46738
46739                     "uniform sampler2D tDisplacement;",
46740                     "uniform float uDisplacementScale;",
46741                     "uniform float uDisplacementBias;",
46742
46743                 "#endif",
46744
46745                 "varying vec3 vTangent;",
46746                 "varying vec3 vBinormal;",
46747                 "varying vec3 vNormal;",
46748                 "varying vec2 vUv;",
46749
46750                 "varying vec3 vWorldPosition;",
46751                 "varying vec3 vViewPosition;",
46752
46753                 THREE.ShaderChunk[ "skinning_pars_vertex" ],
46754                 THREE.ShaderChunk[ "shadowmap_pars_vertex" ],
46755
46756                 "void main() {",
46757
46758                     THREE.ShaderChunk[ "skinbase_vertex" ],
46759                     THREE.ShaderChunk[ "skinnormal_vertex" ],
46760
46761                     // normal, tangent and binormal vectors
46762
46763                     "#ifdef USE_SKINNING",
46764
46765                         "vNormal = normalMatrix * skinnedNormal.xyz;",
46766
46767                         "vec4 skinnedTangent = skinMatrix * vec4( tangent.xyz, 0.0 );",
46768                         "vTangent = normalMatrix * skinnedTangent.xyz;",
46769
46770                     "#else",
46771
46772                         "vNormal = normalMatrix * normal;",
46773                         "vTangent = normalMatrix * tangent.xyz;",
46774
46775                     "#endif",
46776
46777                     "vBinormal = cross( vNormal, vTangent ) * tangent.w;",
46778
46779                     "vUv = uv * uRepeat + uOffset;",
46780
46781                     // displacement mapping
46782
46783                     "vec3 displacedPosition;",
46784
46785                     "#ifdef VERTEX_TEXTURES",
46786
46787                         "if ( enableDisplacement ) {",
46788
46789                             "vec3 dv = texture2D( tDisplacement, uv ).xyz;",
46790                             "float df = uDisplacementScale * dv.x + uDisplacementBias;",
46791                             "displacedPosition = position + normalize( normal ) * df;",
46792
46793                         "} else {",
46794
46795                             "#ifdef USE_SKINNING",
46796
46797                                 "vec4 skinVertex = vec4( position, 1.0 );",
46798
46799                                 "vec4 skinned  = boneMatX * skinVertex * skinWeight.x;",
46800                                 "skinned       += boneMatY * skinVertex * skinWeight.y;",
46801
46802                                 "displacedPosition  = skinned.xyz;",
46803
46804                             "#else",
46805
46806                                 "displacedPosition = position;",
46807
46808                             "#endif",
46809
46810                         "}",
46811
46812                     "#else",
46813
46814                         "#ifdef USE_SKINNING",
46815
46816                             "vec4 skinVertex = vec4( position, 1.0 );",
46817
46818                             "vec4 skinned  = boneMatX * skinVertex * skinWeight.x;",
46819                             "skinned       += boneMatY * skinVertex * skinWeight.y;",
46820
46821                             "displacedPosition  = skinned.xyz;",
46822
46823                         "#else",
46824
46825                             "displacedPosition = position;",
46826
46827                         "#endif",
46828
46829                     "#endif",
46830
46831                     //
46832
46833                     "vec4 mvPosition = modelViewMatrix * vec4( displacedPosition, 1.0 );",
46834                     "vec4 mPosition = modelMatrix * vec4( displacedPosition, 1.0 );",
46835
46836                     "gl_Position = projectionMatrix * mvPosition;",
46837
46838                     //
46839
46840                     "vWorldPosition = mPosition.xyz;",
46841                     "vViewPosition = -mvPosition.xyz;",
46842
46843                     // shadows
46844
46845                     "#ifdef USE_SHADOWMAP",
46846
46847                         "for( int i = 0; i < MAX_SHADOWS; i ++ ) {",
46848
46849                             "vShadowCoord[ i ] = shadowMatrix[ i ] * mPosition;",
46850
46851                         "}",
46852
46853                     "#endif",
46854
46855                 "}"
46856
46857             ].join("\n")
46858
46859         },
46860
46861         /* -------------------------------------------------------------------------
46862         //    Cube map shader
46863          ------------------------------------------------------------------------- */
46864
46865         'cube': {
46866
46867             uniforms: { "tCube": { type: "t", value: null },
46868                         "tFlip": { type: "f", value: -1 } },
46869
46870             vertexShader: [
46871
46872                 "varying vec3 vViewPosition;",
46873
46874                 "void main() {",
46875
46876                     "vec4 mPosition = modelMatrix * vec4( position, 1.0 );",
46877                     "vViewPosition = cameraPosition - mPosition.xyz;",
46878
46879                     "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
46880
46881                 "}"
46882
46883             ].join("\n"),
46884
46885             fragmentShader: [
46886
46887                 "uniform samplerCube tCube;",
46888                 "uniform float tFlip;",
46889
46890                 "varying vec3 vViewPosition;",
46891
46892                 "void main() {",
46893
46894                     "vec3 wPos = cameraPosition - vViewPosition;",
46895                     "gl_FragColor = textureCube( tCube, vec3( tFlip * wPos.x, wPos.yz ) );",
46896
46897                 "}"
46898
46899             ].join("\n")
46900
46901         }
46902
46903     }
46904
46905 };
46906
46907 };
46908 /**
46909  * @author zz85 / http://www.lab4games.net/zz85/blog
46910  * @author alteredq / http://alteredqualia.com/
46911  *
46912  * For Text operations in three.js (See TextGeometry)
46913  *
46914  * It uses techniques used in:
46915  *
46916  *     typeface.js and canvastext
46917  *         For converting fonts and rendering with javascript
46918  *        http://typeface.neocracy.org
46919  *
46920  *    Triangulation ported from AS3
46921  *        Simple Polygon Triangulation
46922  *        http://actionsnippet.com/?p=1462
46923  *
46924  *     A Method to triangulate shapes with holes
46925  *        http://www.sakri.net/blog/2009/06/12/an-approach-to-triangulating-polygons-with-holes/
46926  *
46927  */
46928
46929 THREE.FontUtils = {
46930
46931     faces : {},
46932
46933     // Just for now. face[weight][style]
46934
46935     face : "helvetiker",
46936     weight: "normal",
46937     style : "normal",
46938     size : 150,
46939     divisions : 10,
46940
46941     getFace : function() {
46942
46943         return this.faces[ this.face ][ this.weight ][ this.style ];
46944
46945     },
46946
46947     loadFace : function( data ) {
46948
46949         var family = data.familyName.toLowerCase();
46950
46951         var ThreeFont = this;
46952
46953         ThreeFont.faces[ family ] = ThreeFont.faces[ family ] || {};
46954
46955         ThreeFont.faces[ family ][ data.cssFontWeight ] = ThreeFont.faces[ family ][ data.cssFontWeight ] || {};
46956         ThreeFont.faces[ family ][ data.cssFontWeight ][ data.cssFontStyle ] = data;
46957
46958         var face = ThreeFont.faces[ family ][ data.cssFontWeight ][ data.cssFontStyle ] = data;
46959
46960         return data;
46961
46962     },
46963
46964     drawText : function( text ) {
46965
46966         var characterPts = [], allPts = [];
46967
46968         // RenderText
46969
46970         var i, p,
46971             face = this.getFace(),
46972             scale = this.size / face.resolution,
46973             offset = 0,
46974             chars = String( text ).split( '' ),
46975             length = chars.length;
46976
46977         var fontPaths = [];
46978
46979         for ( i = 0; i < length; i ++ ) {
46980
46981             var path = new THREE.Path();
46982
46983             var ret = this.extractGlyphPoints( chars[ i ], face, scale, offset, path );
46984             offset += ret.offset;
46985
46986             fontPaths.push( ret.path );
46987
46988         }
46989
46990         // get the width
46991
46992         var width = offset / 2;
46993         //
46994         // for ( p = 0; p < allPts.length; p++ ) {
46995         //
46996         //     allPts[ p ].x -= width;
46997         //
46998         // }
46999
47000         //var extract = this.extractPoints( allPts, characterPts );
47001         //extract.contour = allPts;
47002
47003         //extract.paths = fontPaths;
47004         //extract.offset = width;
47005
47006         return { paths : fontPaths, offset : width };
47007
47008     },
47009
47010
47011
47012
47013     extractGlyphPoints : function( c, face, scale, offset, path ) {
47014
47015         var pts = [];
47016
47017         var i, i2, divisions,
47018             outline, action, length,
47019             scaleX, scaleY,
47020             x, y, cpx, cpy, cpx0, cpy0, cpx1, cpy1, cpx2, cpy2,
47021             laste,
47022             glyph = face.glyphs[ c ] || face.glyphs[ '?' ];
47023
47024         if ( !glyph ) return;
47025
47026         if ( glyph.o ) {
47027
47028             outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) );
47029             length = outline.length;
47030
47031             scaleX = scale;
47032             scaleY = scale;
47033
47034             for ( i = 0; i < length; ) {
47035
47036                 action = outline[ i ++ ];
47037
47038                 //console.log( action );
47039
47040                 switch( action ) {
47041
47042                 case 'm':
47043
47044                     // Move To
47045
47046                     x = outline[ i++ ] * scaleX + offset;
47047                     y = outline[ i++ ] * scaleY;
47048
47049                     path.moveTo( x, y );
47050                     break;
47051
47052                 case 'l':
47053
47054                     // Line To
47055
47056                     x = outline[ i++ ] * scaleX + offset;
47057                     y = outline[ i++ ] * scaleY;
47058                     path.lineTo(x,y);
47059                     break;
47060
47061                 case 'q':
47062
47063                     // QuadraticCurveTo
47064
47065                     cpx  = outline[ i++ ] * scaleX + offset;
47066                     cpy  = outline[ i++ ] * scaleY;
47067                     cpx1 = outline[ i++ ] * scaleX + offset;
47068                     cpy1 = outline[ i++ ] * scaleY;
47069
47070                     path.quadraticCurveTo(cpx1, cpy1, cpx, cpy);
47071
47072                     laste = pts[ pts.length - 1 ];
47073
47074                     if ( laste ) {
47075
47076                         cpx0 = laste.x;
47077                         cpy0 = laste.y;
47078
47079                         for ( i2 = 1, divisions = this.divisions; i2 <= divisions; i2 ++ ) {
47080
47081                             var t = i2 / divisions;
47082                             var tx = THREE.Shape.Utils.b2( t, cpx0, cpx1, cpx );
47083                             var ty = THREE.Shape.Utils.b2( t, cpy0, cpy1, cpy );
47084                       }
47085
47086                   }
47087
47088                   break;
47089
47090                 case 'b':
47091
47092                     // Cubic Bezier Curve
47093
47094                     cpx  = outline[ i++ ] *  scaleX + offset;
47095                     cpy  = outline[ i++ ] *  scaleY;
47096                     cpx1 = outline[ i++ ] *  scaleX + offset;
47097                     cpy1 = outline[ i++ ] * -scaleY;
47098                     cpx2 = outline[ i++ ] *  scaleX + offset;
47099                     cpy2 = outline[ i++ ] * -scaleY;
47100
47101                     path.bezierCurveTo( cpx, cpy, cpx1, cpy1, cpx2, cpy2 );
47102
47103                     laste = pts[ pts.length - 1 ];
47104
47105                     if ( laste ) {
47106
47107                         cpx0 = laste.x;
47108                         cpy0 = laste.y;
47109
47110                         for ( i2 = 1, divisions = this.divisions; i2 <= divisions; i2 ++ ) {
47111
47112                             var t = i2 / divisions;
47113                             var tx = THREE.Shape.Utils.b3( t, cpx0, cpx1, cpx2, cpx );
47114                             var ty = THREE.Shape.Utils.b3( t, cpy0, cpy1, cpy2, cpy );
47115
47116                         }
47117
47118                     }
47119
47120                     break;
47121
47122                 }
47123
47124             }
47125         }
47126
47127
47128
47129         return { offset: glyph.ha*scale, path:path};
47130     }
47131
47132 };
47133
47134
47135 THREE.FontUtils.generateShapes = function( text, parameters ) {
47136
47137     // Parameters
47138
47139     parameters = parameters || {};
47140
47141     var size = parameters.size !== undefined ? parameters.size : 100;
47142     var curveSegments = parameters.curveSegments !== undefined ? parameters.curveSegments: 4;
47143
47144     var font = parameters.font !== undefined ? parameters.font : "helvetiker";
47145     var weight = parameters.weight !== undefined ? parameters.weight : "normal";
47146     var style = parameters.style !== undefined ? parameters.style : "normal";
47147
47148     THREE.FontUtils.size = size;
47149     THREE.FontUtils.divisions = curveSegments;
47150
47151     THREE.FontUtils.face = font;
47152     THREE.FontUtils.weight = weight;
47153     THREE.FontUtils.style = style;
47154
47155     // Get a Font data json object
47156
47157     var data = THREE.FontUtils.drawText( text );
47158
47159     var paths = data.paths;
47160     var shapes = [];
47161
47162     for ( var p = 0, pl = paths.length; p < pl; p ++ ) {
47163
47164         Array.prototype.push.apply( shapes, paths[ p ].toShapes() );
47165
47166     }
47167
47168     return shapes;
47169
47170 };
47171
47172
47173 /**
47174  * This code is a quick port of code written in C++ which was submitted to
47175  * flipcode.com by John W. Ratcliff  // July 22, 2000
47176  * See original code and more information here:
47177  * http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml
47178  *
47179  * ported to actionscript by Zevan Rosser
47180  * www.actionsnippet.com
47181  *
47182  * ported to javascript by Joshua Koo
47183  * http://www.lab4games.net/zz85/blog
47184  *
47185  */
47186
47187
47188 ( function( namespace ) {
47189
47190     var EPSILON = 0.0000000001;
47191
47192     // takes in an contour array and returns
47193
47194     var process = function( contour, indices ) {
47195
47196         var n = contour.length;
47197
47198         if ( n < 3 ) return null;
47199
47200         var result = [],
47201             verts = [],
47202             vertIndices = [];
47203
47204         /* we want a counter-clockwise polygon in verts */
47205
47206         var u, v, w;
47207
47208         if ( area( contour ) > 0.0 ) {
47209
47210             for ( v = 0; v < n; v++ ) verts[ v ] = v;
47211
47212         } else {
47213
47214             for ( v = 0; v < n; v++ ) verts[ v ] = ( n - 1 ) - v;
47215
47216         }
47217
47218         var nv = n;
47219
47220         /*  remove nv - 2 vertices, creating 1 triangle every time */
47221
47222         var count = 2 * nv;   /* error detection */
47223
47224         for( v = nv - 1; nv > 2; ) {
47225
47226             /* if we loop, it is probably a non-simple polygon */
47227
47228             if ( ( count-- ) <= 0 ) {
47229
47230                 //** Triangulate: ERROR - probable bad polygon!
47231
47232                 //throw ( "Warning, unable to triangulate polygon!" );
47233                 //return null;
47234                 // Sometimes warning is fine, especially polygons are triangulated in reverse.
47235                 console.log( "Warning, unable to triangulate polygon!" );
47236
47237                 if ( indices ) return vertIndices;
47238                 return result;
47239
47240             }
47241
47242             /* three consecutive vertices in current polygon, <u,v,w> */
47243
47244             u = v;          if ( nv <= u ) u = 0;     /* previous */
47245             v = u + 1;  if ( nv <= v ) v = 0;     /* new v    */
47246             w = v + 1;  if ( nv <= w ) w = 0;     /* next     */
47247
47248             if ( snip( contour, u, v, w, nv, verts ) ) {
47249
47250                 var a, b, c, s, t;
47251
47252                 /* true names of the vertices */
47253
47254                 a = verts[ u ];
47255                 b = verts[ v ];
47256                 c = verts[ w ];
47257
47258                 /* output Triangle */
47259
47260                 /*
47261                 result.push( contour[ a ] );
47262                 result.push( contour[ b ] );
47263                 result.push( contour[ c ] );
47264                 */
47265                 result.push( [ contour[ a ],
47266                     contour[ b ],
47267                     contour[ c ] ] );
47268
47269
47270                 vertIndices.push( [ verts[ u ], verts[ v ], verts[ w ] ] );
47271
47272                 /* remove v from the remaining polygon */
47273
47274                 for( s = v, t = v + 1; t < nv; s++, t++ ) {
47275
47276                     verts[ s ] = verts[ t ];
47277
47278                 }
47279
47280                 nv--;
47281
47282                 /* reset error detection counter */
47283
47284                 count = 2 * nv;
47285
47286             }
47287
47288         }
47289
47290         if ( indices ) return vertIndices;
47291         return result;
47292
47293     };
47294
47295     // calculate area of the contour polygon
47296
47297     var area = function ( contour ) {
47298
47299         var n = contour.length;
47300         var a = 0.0;
47301
47302         for( var p = n - 1, q = 0; q < n; p = q++ ) {
47303
47304             a += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;
47305
47306         }
47307
47308         return a * 0.5;
47309
47310     };
47311
47312     // see if p is inside triangle abc
47313
47314     var insideTriangle = function( ax, ay,
47315                                    bx, by,
47316                                    cx, cy,
47317                                    px, py ) {
47318
47319           var aX, aY, bX, bY;
47320           var cX, cY, apx, apy;
47321           var bpx, bpy, cpx, cpy;
47322           var cCROSSap, bCROSScp, aCROSSbp;
47323
47324           aX = cx - bx;  aY = cy - by;
47325           bX = ax - cx;  bY = ay - cy;
47326           cX = bx - ax;  cY = by - ay;
47327           apx= px  -ax;  apy= py - ay;
47328           bpx= px - bx;  bpy= py - by;
47329           cpx= px - cx;  cpy= py - cy;
47330
47331           aCROSSbp = aX*bpy - aY*bpx;
47332           cCROSSap = cX*apy - cY*apx;
47333           bCROSScp = bX*cpy - bY*cpx;
47334
47335           return ( (aCROSSbp >= 0.0) && (bCROSScp >= 0.0) && (cCROSSap >= 0.0) );
47336
47337     };
47338
47339
47340     var snip = function ( contour, u, v, w, n, verts ) {
47341
47342         var p;
47343         var ax, ay, bx, by;
47344         var cx, cy, px, py;
47345
47346         ax = contour[ verts[ u ] ].x;
47347         ay = contour[ verts[ u ] ].y;
47348
47349         bx = contour[ verts[ v ] ].x;
47350         by = contour[ verts[ v ] ].y;
47351
47352         cx = contour[ verts[ w ] ].x;
47353         cy = contour[ verts[ w ] ].y;
47354
47355         if ( EPSILON > (((bx-ax)*(cy-ay)) - ((by-ay)*(cx-ax))) ) return false;
47356
47357             for ( p = 0; p < n; p++ ) {
47358
47359                 if( (p == u) || (p == v) || (p == w) ) continue;
47360
47361                 px = contour[ verts[ p ] ].x
47362                 py = contour[ verts[ p ] ].y
47363
47364                 if ( insideTriangle( ax, ay, bx, by, cx, cy, px, py ) ) return false;
47365
47366           }
47367
47368           return true;
47369
47370     };
47371
47372
47373     namespace.Triangulate = process;
47374     namespace.Triangulate.area = area;
47375
47376     return namespace;
47377
47378 })(THREE.FontUtils);
47379
47380 // To use the typeface.js face files, hook up the API
47381 self._typeface_js = { faces: THREE.FontUtils.faces, loadFace: THREE.FontUtils.loadFace };/**
47382  * @author zz85 / http://www.lab4games.net/zz85/blog
47383  * Extensible curve object
47384  *
47385  * Some common of Curve methods
47386  * .getPoint(t), getTangent(t)
47387  * .getPointAt(u), getTagentAt(u)
47388  * .getPoints(), .getSpacedPoints()
47389  * .getLength()
47390  * .updateArcLengths()
47391  *
47392  * This file contains following classes:
47393  *
47394  * -- 2d classes --
47395  * THREE.Curve
47396  * THREE.LineCurve
47397  * THREE.QuadraticBezierCurve
47398  * THREE.CubicBezierCurve
47399  * THREE.SplineCurve
47400  * THREE.ArcCurve
47401  * THREE.EllipseCurve
47402  *
47403  * -- 3d classes --
47404  * THREE.LineCurve3
47405  * THREE.QuadraticBezierCurve3
47406  * THREE.CubicBezierCurve3
47407  * THREE.SplineCurve3
47408  * THREE.ClosedSplineCurve3
47409  *
47410  * A series of curves can be represented as a THREE.CurvePath
47411  *
47412  **/
47413
47414 /**************************************************************
47415  *    Abstract Curve base class
47416  **************************************************************/
47417
47418 THREE.Curve = function () {
47419
47420 };
47421
47422 // Virtual base class method to overwrite and implement in subclasses
47423 //    - t [0 .. 1]
47424
47425 THREE.Curve.prototype.getPoint = function ( t ) {
47426
47427     console.log( "Warning, getPoint() not implemented!" );
47428     return null;
47429
47430 };
47431
47432 // Get point at relative position in curve according to arc length
47433 // - u [0 .. 1]
47434
47435 THREE.Curve.prototype.getPointAt = function ( u ) {
47436
47437     var t = this.getUtoTmapping( u );
47438     return this.getPoint( t );
47439
47440 };
47441
47442 // Get sequence of points using getPoint( t )
47443
47444 THREE.Curve.prototype.getPoints = function ( divisions ) {
47445
47446     if ( !divisions ) divisions = 5;
47447
47448     var d, pts = [];
47449
47450     for ( d = 0; d <= divisions; d ++ ) {
47451
47452         pts.push( this.getPoint( d / divisions ) );
47453
47454     }
47455
47456     return pts;
47457
47458 };
47459
47460 // Get sequence of points using getPointAt( u )
47461
47462 THREE.Curve.prototype.getSpacedPoints = function ( divisions ) {
47463
47464     if ( !divisions ) divisions = 5;
47465
47466     var d, pts = [];
47467
47468     for ( d = 0; d <= divisions; d ++ ) {
47469
47470         pts.push( this.getPointAt( d / divisions ) );
47471
47472     }
47473
47474     return pts;
47475
47476 };
47477
47478 // Get total curve arc length
47479
47480 THREE.Curve.prototype.getLength = function () {
47481
47482     var lengths = this.getLengths();
47483     return lengths[ lengths.length - 1 ];
47484
47485 };
47486
47487 // Get list of cumulative segment lengths
47488
47489 THREE.Curve.prototype.getLengths = function ( divisions ) {
47490
47491     if ( !divisions ) divisions = (this.__arcLengthDivisions) ? (this.__arcLengthDivisions): 200;
47492
47493     if ( this.cacheArcLengths
47494         && ( this.cacheArcLengths.length == divisions + 1 )
47495         && !this.needsUpdate) {
47496
47497         //console.log( "cached", this.cacheArcLengths );
47498         return this.cacheArcLengths;
47499
47500     }
47501
47502     this.needsUpdate = false;
47503
47504     var cache = [];
47505     var current, last = this.getPoint( 0 );
47506     var p, sum = 0;
47507
47508     cache.push( 0 );
47509
47510     for ( p = 1; p <= divisions; p ++ ) {
47511
47512         current = this.getPoint ( p / divisions );
47513         sum += current.distanceTo( last );
47514         cache.push( sum );
47515         last = current;
47516
47517     }
47518
47519     this.cacheArcLengths = cache;
47520
47521     return cache; // { sums: cache, sum:sum }; Sum is in the last element.
47522
47523 };
47524
47525
47526 THREE.Curve.prototype.updateArcLengths = function() {
47527     this.needsUpdate = true;
47528     this.getLengths();
47529 };
47530
47531 // Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equi distance
47532
47533 THREE.Curve.prototype.getUtoTmapping = function ( u, distance ) {
47534
47535     var arcLengths = this.getLengths();
47536
47537     var i = 0, il = arcLengths.length;
47538
47539     var targetArcLength; // The targeted u distance value to get
47540
47541     if ( distance ) {
47542
47543         targetArcLength = distance;
47544
47545     } else {
47546
47547         targetArcLength = u * arcLengths[ il - 1 ];
47548
47549     }
47550
47551     //var time = Date.now();
47552
47553     // binary search for the index with largest value smaller than target u distance
47554
47555     var low = 0, high = il - 1, comparison;
47556
47557     while ( low <= high ) {
47558
47559         i = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats
47560
47561         comparison = arcLengths[ i ] - targetArcLength;
47562
47563         if ( comparison < 0 ) {
47564
47565             low = i + 1;
47566             continue;
47567
47568         } else if ( comparison > 0 ) {
47569
47570             high = i - 1;
47571             continue;
47572
47573         } else {
47574
47575             high = i;
47576             break;
47577
47578             // DONE
47579
47580         }
47581
47582     }
47583
47584     i = high;
47585
47586     //console.log('b' , i, low, high, Date.now()- time);
47587
47588     if ( arcLengths[ i ] == targetArcLength ) {
47589
47590         var t = i / ( il - 1 );
47591         return t;
47592
47593     }
47594
47595     // we could get finer grain at lengths, or use simple interpolatation between two points
47596
47597     var lengthBefore = arcLengths[ i ];
47598     var lengthAfter = arcLengths[ i + 1 ];
47599
47600     var segmentLength = lengthAfter - lengthBefore;
47601
47602     // determine where we are between the 'before' and 'after' points
47603
47604     var segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;
47605
47606     // add that fractional amount to t
47607
47608     var t = ( i + segmentFraction ) / ( il -1 );
47609
47610     return t;
47611
47612 };
47613
47614
47615 // In 2D space, there are actually 2 normal vectors,
47616 // and in 3D space, infinte
47617 // TODO this should be depreciated.
47618 THREE.Curve.prototype.getNormalVector = function( t ) {
47619
47620     var vec = this.getTangent( t );
47621
47622     return new THREE.Vector2( -vec.y , vec.x );
47623
47624 };
47625
47626 // Returns a unit vector tangent at t
47627 // In case any sub curve does not implement its tangent / normal finding,
47628 // we get 2 points with a small delta and find a gradient of the 2 points
47629 // which seems to make a reasonable approximation
47630
47631 THREE.Curve.prototype.getTangent = function( t ) {
47632
47633     var delta = 0.0001;
47634     var t1 = t - delta;
47635     var t2 = t + delta;
47636
47637     // Capping in case of danger
47638
47639     if ( t1 < 0 ) t1 = 0;
47640     if ( t2 > 1 ) t2 = 1;
47641
47642     var pt1 = this.getPoint( t1 );
47643     var pt2 = this.getPoint( t2 );
47644
47645     var vec = pt2.clone().subSelf(pt1);
47646     return vec.normalize();
47647
47648 };
47649
47650
47651 THREE.Curve.prototype.getTangentAt = function ( u ) {
47652
47653     var t = this.getUtoTmapping( u );
47654     return this.getTangent( t );
47655
47656 };
47657
47658 /**************************************************************
47659  *    Line
47660  **************************************************************/
47661
47662 THREE.LineCurve = function ( v1, v2 ) {
47663
47664     this.v1 = v1;
47665     this.v2 = v2;
47666
47667 };
47668
47669 THREE.LineCurve.prototype = Object.create( THREE.Curve.prototype );
47670
47671 THREE.LineCurve.prototype.getPoint = function ( t ) {
47672
47673     var point = this.v2.clone().subSelf(this.v1);
47674     point.multiplyScalar( t ).addSelf( this.v1 );
47675
47676     return point;
47677
47678 };
47679
47680 // Line curve is linear, so we can overwrite default getPointAt
47681
47682 THREE.LineCurve.prototype.getPointAt = function ( u ) {
47683
47684     return this.getPoint( u );
47685
47686 };
47687
47688 THREE.LineCurve.prototype.getTangent = function( t ) {
47689
47690     var tangent = this.v2.clone().subSelf(this.v1);
47691
47692     return tangent.normalize();
47693
47694 };
47695
47696 /**************************************************************
47697  *    Quadratic Bezier curve
47698  **************************************************************/
47699
47700
47701 THREE.QuadraticBezierCurve = function ( v0, v1, v2 ) {
47702
47703     this.v0 = v0;
47704     this.v1 = v1;
47705     this.v2 = v2;
47706
47707 };
47708
47709 THREE.QuadraticBezierCurve.prototype = Object.create( THREE.Curve.prototype );
47710
47711
47712 THREE.QuadraticBezierCurve.prototype.getPoint = function ( t ) {
47713
47714     var tx, ty;
47715
47716     tx = THREE.Shape.Utils.b2( t, this.v0.x, this.v1.x, this.v2.x );
47717     ty = THREE.Shape.Utils.b2( t, this.v0.y, this.v1.y, this.v2.y );
47718
47719     return new THREE.Vector2( tx, ty );
47720
47721 };
47722
47723
47724 THREE.QuadraticBezierCurve.prototype.getTangent = function( t ) {
47725
47726     var tx, ty;
47727
47728     tx = THREE.Curve.Utils.tangentQuadraticBezier( t, this.v0.x, this.v1.x, this.v2.x );
47729     ty = THREE.Curve.Utils.tangentQuadraticBezier( t, this.v0.y, this.v1.y, this.v2.y );
47730
47731     // returns unit vector
47732
47733     var tangent = new THREE.Vector2( tx, ty );
47734     tangent.normalize();
47735
47736     return tangent;
47737
47738 };
47739
47740
47741 /**************************************************************
47742  *    Cubic Bezier curve
47743  **************************************************************/
47744
47745 THREE.CubicBezierCurve = function ( v0, v1, v2, v3 ) {
47746
47747     this.v0 = v0;
47748     this.v1 = v1;
47749     this.v2 = v2;
47750     this.v3 = v3;
47751
47752 };
47753
47754 THREE.CubicBezierCurve.prototype = Object.create( THREE.Curve.prototype );
47755
47756 THREE.CubicBezierCurve.prototype.getPoint = function ( t ) {
47757
47758     var tx, ty;
47759
47760     tx = THREE.Shape.Utils.b3( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x );
47761     ty = THREE.Shape.Utils.b3( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y );
47762
47763     return new THREE.Vector2( tx, ty );
47764
47765 };
47766
47767 THREE.CubicBezierCurve.prototype.getTangent = function( t ) {
47768
47769     var tx, ty;
47770
47771     tx = THREE.Curve.Utils.tangentCubicBezier( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x );
47772     ty = THREE.Curve.Utils.tangentCubicBezier( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y );
47773
47774     var tangent = new THREE.Vector2( tx, ty );
47775     tangent.normalize();
47776
47777     return tangent;
47778
47779 };
47780
47781
47782 /**************************************************************
47783  *    Spline curve
47784  **************************************************************/
47785
47786 THREE.SplineCurve = function ( points /* array of Vector2 */ ) {
47787
47788     this.points = (points == undefined) ? [] : points;
47789
47790 };
47791
47792 THREE.SplineCurve.prototype = Object.create( THREE.Curve.prototype );
47793
47794 THREE.SplineCurve.prototype.getPoint = function ( t ) {
47795
47796     var v = new THREE.Vector2();
47797     var c = [];
47798     var points = this.points, point, intPoint, weight;
47799     point = ( points.length - 1 ) * t;
47800
47801     intPoint = Math.floor( point );
47802     weight = point - intPoint;
47803
47804     c[ 0 ] = intPoint == 0 ? intPoint : intPoint - 1;
47805     c[ 1 ] = intPoint;
47806     c[ 2 ] = intPoint  > points.length - 2 ? points.length -1 : intPoint + 1;
47807     c[ 3 ] = intPoint  > points.length - 3 ? points.length -1 : intPoint + 2;
47808
47809     v.x = THREE.Curve.Utils.interpolate( points[ c[ 0 ] ].x, points[ c[ 1 ] ].x, points[ c[ 2 ] ].x, points[ c[ 3 ] ].x, weight );
47810     v.y = THREE.Curve.Utils.interpolate( points[ c[ 0 ] ].y, points[ c[ 1 ] ].y, points[ c[ 2 ] ].y, points[ c[ 3 ] ].y, weight );
47811
47812     return v;
47813
47814 };
47815
47816 /**************************************************************
47817  *    Ellipse curve
47818  **************************************************************/
47819
47820 THREE.EllipseCurve = function ( aX, aY, xRadius, yRadius,
47821                             aStartAngle, aEndAngle,
47822                             aClockwise ) {
47823
47824     this.aX = aX;
47825     this.aY = aY;
47826
47827     this.xRadius = xRadius;
47828     this.yRadius = yRadius;
47829
47830     this.aStartAngle = aStartAngle;
47831     this.aEndAngle = aEndAngle;
47832
47833     this.aClockwise = aClockwise;
47834
47835 };
47836
47837 THREE.EllipseCurve.prototype = Object.create( THREE.Curve.prototype );
47838
47839 THREE.EllipseCurve.prototype.getPoint = function ( t ) {
47840
47841     var deltaAngle = this.aEndAngle - this.aStartAngle;
47842
47843     if ( !this.aClockwise ) {
47844
47845         t = 1 - t;
47846
47847     }
47848
47849     var angle = this.aStartAngle + t * deltaAngle;
47850
47851     var tx = this.aX + this.xRadius * Math.cos( angle );
47852     var ty = this.aY + this.yRadius * Math.sin( angle );
47853
47854     return new THREE.Vector2( tx, ty );
47855
47856 };
47857
47858 /**************************************************************
47859  *    Arc curve
47860  **************************************************************/
47861
47862 THREE.ArcCurve = function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {
47863
47864     THREE.EllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );
47865 };
47866
47867 THREE.ArcCurve.prototype = Object.create( THREE.EllipseCurve.prototype );
47868
47869
47870 /**************************************************************
47871  *    Utils
47872  **************************************************************/
47873
47874 THREE.Curve.Utils = {
47875
47876     tangentQuadraticBezier: function ( t, p0, p1, p2 ) {
47877
47878         return 2 * ( 1 - t ) * ( p1 - p0 ) + 2 * t * ( p2 - p1 );
47879
47880     },
47881
47882     // Puay Bing, thanks for helping with this derivative!
47883
47884     tangentCubicBezier: function (t, p0, p1, p2, p3 ) {
47885
47886         return -3 * p0 * (1 - t) * (1 - t)  +
47887             3 * p1 * (1 - t) * (1-t) - 6 *t *p1 * (1-t) +
47888             6 * t *  p2 * (1-t) - 3 * t * t * p2 +
47889             3 * t * t * p3;
47890     },
47891
47892
47893     tangentSpline: function ( t, p0, p1, p2, p3 ) {
47894
47895         // To check if my formulas are correct
47896
47897         var h00 = 6 * t * t - 6 * t;     // derived from 2t^3 − 3t^2 + 1
47898         var h10 = 3 * t * t - 4 * t + 1; // t^3 − 2t^2 + t
47899         var h01 = -6 * t * t + 6 * t;     // − 2t3 + 3t2
47900         var h11 = 3 * t * t - 2 * t;    // t3 − t2
47901
47902         return h00 + h10 + h01 + h11;
47903
47904     },
47905
47906     // Catmull-Rom
47907
47908     interpolate: function( p0, p1, p2, p3, t ) {
47909
47910         var v0 = ( p2 - p0 ) * 0.5;
47911         var v1 = ( p3 - p1 ) * 0.5;
47912         var t2 = t * t;
47913         var t3 = t * t2;
47914         return ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;
47915
47916     }
47917
47918 };
47919
47920
47921 // TODO: Transformation for Curves?
47922
47923 /**************************************************************
47924  *    3D Curves
47925  **************************************************************/
47926
47927 // A Factory method for creating new curve subclasses
47928
47929 THREE.Curve.create = function ( constructor, getPointFunc ) {
47930
47931     constructor.prototype = Object.create( THREE.Curve.prototype );
47932     constructor.prototype.getPoint = getPointFunc;
47933
47934     return constructor;
47935
47936 };
47937
47938
47939 /**************************************************************
47940  *    Line3D
47941  **************************************************************/
47942
47943 THREE.LineCurve3 = THREE.Curve.create(
47944
47945     function ( v1, v2 ) {
47946
47947         this.v1 = v1;
47948         this.v2 = v2;
47949
47950     },
47951
47952     function ( t ) {
47953
47954         var r = new THREE.Vector3();
47955
47956
47957         r.sub( this.v2, this.v1 ); // diff
47958         r.multiplyScalar( t );
47959         r.addSelf( this.v1 );
47960
47961         return r;
47962
47963     }
47964
47965 );
47966
47967
47968 /**************************************************************
47969  *    Quadratic Bezier 3D curve
47970  **************************************************************/
47971
47972 THREE.QuadraticBezierCurve3 = THREE.Curve.create(
47973
47974     function ( v0, v1, v2 ) {
47975
47976         this.v0 = v0;
47977         this.v1 = v1;
47978         this.v2 = v2;
47979
47980     },
47981
47982     function ( t ) {
47983
47984         var tx, ty, tz;
47985
47986         tx = THREE.Shape.Utils.b2( t, this.v0.x, this.v1.x, this.v2.x );
47987         ty = THREE.Shape.Utils.b2( t, this.v0.y, this.v1.y, this.v2.y );
47988         tz = THREE.Shape.Utils.b2( t, this.v0.z, this.v1.z, this.v2.z );
47989
47990         return new THREE.Vector3( tx, ty, tz );
47991
47992     }
47993
47994 );
47995
47996
47997
47998 /**************************************************************
47999  *    Cubic Bezier 3D curve
48000  **************************************************************/
48001
48002 THREE.CubicBezierCurve3 = THREE.Curve.create(
48003
48004     function ( v0, v1, v2, v3 ) {
48005
48006         this.v0 = v0;
48007         this.v1 = v1;
48008         this.v2 = v2;
48009         this.v3 = v3;
48010
48011     },
48012
48013     function ( t ) {
48014
48015         var tx, ty, tz;
48016
48017         tx = THREE.Shape.Utils.b3( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x );
48018         ty = THREE.Shape.Utils.b3( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y );
48019         tz = THREE.Shape.Utils.b3( t, this.v0.z, this.v1.z, this.v2.z, this.v3.z );
48020
48021         return new THREE.Vector3( tx, ty, tz );
48022
48023     }
48024
48025 );
48026
48027
48028
48029 /**************************************************************
48030  *    Spline 3D curve
48031  **************************************************************/
48032
48033
48034 THREE.SplineCurve3 = THREE.Curve.create(
48035
48036     function ( points /* array of Vector3 */) {
48037
48038         this.points = (points == undefined) ? [] : points;
48039
48040     },
48041
48042     function ( t ) {
48043
48044         var v = new THREE.Vector3();
48045         var c = [];
48046         var points = this.points, point, intPoint, weight;
48047         point = ( points.length - 1 ) * t;
48048
48049         intPoint = Math.floor( point );
48050         weight = point - intPoint;
48051
48052         c[ 0 ] = intPoint == 0 ? intPoint : intPoint - 1;
48053         c[ 1 ] = intPoint;
48054         c[ 2 ] = intPoint  > points.length - 2 ? points.length - 1 : intPoint + 1;
48055         c[ 3 ] = intPoint  > points.length - 3 ? points.length - 1 : intPoint + 2;
48056
48057         var pt0 = points[ c[0] ],
48058             pt1 = points[ c[1] ],
48059             pt2 = points[ c[2] ],
48060             pt3 = points[ c[3] ];
48061
48062         v.x = THREE.Curve.Utils.interpolate(pt0.x, pt1.x, pt2.x, pt3.x, weight);
48063         v.y = THREE.Curve.Utils.interpolate(pt0.y, pt1.y, pt2.y, pt3.y, weight);
48064         v.z = THREE.Curve.Utils.interpolate(pt0.z, pt1.z, pt2.z, pt3.z, weight);
48065
48066         return v;
48067
48068     }
48069
48070 );
48071
48072
48073 // THREE.SplineCurve3.prototype.getTangent = function(t) {
48074 //         var v = new THREE.Vector3();
48075 //         var c = [];
48076 //         var points = this.points, point, intPoint, weight;
48077 //         point = ( points.length - 1 ) * t;
48078
48079 //         intPoint = Math.floor( point );
48080 //         weight = point - intPoint;
48081
48082 //         c[ 0 ] = intPoint == 0 ? intPoint : intPoint - 1;
48083 //         c[ 1 ] = intPoint;
48084 //         c[ 2 ] = intPoint  > points.length - 2 ? points.length - 1 : intPoint + 1;
48085 //         c[ 3 ] = intPoint  > points.length - 3 ? points.length - 1 : intPoint + 2;
48086
48087 //         var pt0 = points[ c[0] ],
48088 //             pt1 = points[ c[1] ],
48089 //             pt2 = points[ c[2] ],
48090 //             pt3 = points[ c[3] ];
48091
48092 //     // t = weight;
48093 //     v.x = THREE.Curve.Utils.tangentSpline( t, pt0.x, pt1.x, pt2.x, pt3.x );
48094 //     v.y = THREE.Curve.Utils.tangentSpline( t, pt0.y, pt1.y, pt2.y, pt3.y );
48095 //     v.z = THREE.Curve.Utils.tangentSpline( t, pt0.z, pt1.z, pt2.z, pt3.z );
48096
48097 //     return v;
48098
48099 // }
48100
48101 /**************************************************************
48102  *    Closed Spline 3D curve
48103  **************************************************************/
48104
48105
48106 THREE.ClosedSplineCurve3 = THREE.Curve.create(
48107
48108     function ( points /* array of Vector3 */) {
48109
48110         this.points = (points == undefined) ? [] : points;
48111
48112     },
48113
48114     function ( t ) {
48115
48116         var v = new THREE.Vector3();
48117         var c = [];
48118         var points = this.points, point, intPoint, weight;
48119         point = ( points.length - 0 ) * t;
48120             // This needs to be from 0-length +1
48121
48122         intPoint = Math.floor( point );
48123         weight = point - intPoint;
48124
48125         intPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / points.length ) + 1 ) * points.length;
48126         c[ 0 ] = ( intPoint - 1 ) % points.length;
48127         c[ 1 ] = ( intPoint ) % points.length;
48128         c[ 2 ] = ( intPoint + 1 ) % points.length;
48129         c[ 3 ] = ( intPoint + 2 ) % points.length;
48130
48131         v.x = THREE.Curve.Utils.interpolate( points[ c[ 0 ] ].x, points[ c[ 1 ] ].x, points[ c[ 2 ] ].x, points[ c[ 3 ] ].x, weight );
48132         v.y = THREE.Curve.Utils.interpolate( points[ c[ 0 ] ].y, points[ c[ 1 ] ].y, points[ c[ 2 ] ].y, points[ c[ 3 ] ].y, weight );
48133         v.z = THREE.Curve.Utils.interpolate( points[ c[ 0 ] ].z, points[ c[ 1 ] ].z, points[ c[ 2 ] ].z, points[ c[ 3 ] ].z, weight );
48134
48135         return v;
48136
48137     }
48138
48139 );
48140 /**
48141  * @author zz85 / http://www.lab4games.net/zz85/blog
48142  *
48143  **/
48144
48145 /**************************************************************
48146  *    Curved Path - a curve path is simply a array of connected
48147  *  curves, but retains the api of a curve
48148  **************************************************************/
48149
48150 THREE.CurvePath = function () {
48151
48152     this.curves = [];
48153     this.bends = [];
48154
48155     this.autoClose = false; // Automatically closes the path
48156 };
48157
48158 THREE.CurvePath.prototype = Object.create( THREE.Curve.prototype );
48159
48160 THREE.CurvePath.prototype.add = function ( curve ) {
48161
48162     this.curves.push( curve );
48163
48164 };
48165
48166 THREE.CurvePath.prototype.checkConnection = function() {
48167     // TODO
48168     // If the ending of curve is not connected to the starting
48169     // or the next curve, then, this is not a real path
48170 };
48171
48172 THREE.CurvePath.prototype.closePath = function() {
48173     // TODO Test
48174     // and verify for vector3 (needs to implement equals)
48175     // Add a line curve if start and end of lines are not connected
48176     var startPoint = this.curves[0].getPoint(0);
48177     var endPoint = this.curves[this.curves.length-1].getPoint(1);
48178
48179     if (!startPoint.equals(endPoint)) {
48180         this.curves.push( new THREE.LineCurve(endPoint, startPoint) );
48181     }
48182
48183 };
48184
48185 // To get accurate point with reference to
48186 // entire path distance at time t,
48187 // following has to be done:
48188
48189 // 1. Length of each sub path have to be known
48190 // 2. Locate and identify type of curve
48191 // 3. Get t for the curve
48192 // 4. Return curve.getPointAt(t')
48193
48194 THREE.CurvePath.prototype.getPoint = function( t ) {
48195
48196     var d = t * this.getLength();
48197     var curveLengths = this.getCurveLengths();
48198     var i = 0, diff, curve;
48199
48200     // To think about boundaries points.
48201
48202     while ( i < curveLengths.length ) {
48203
48204         if ( curveLengths[ i ] >= d ) {
48205
48206             diff = curveLengths[ i ] - d;
48207             curve = this.curves[ i ];
48208
48209             var u = 1 - diff / curve.getLength();
48210
48211             return curve.getPointAt( u );
48212
48213             break;
48214         }
48215
48216         i ++;
48217
48218     }
48219
48220     return null;
48221
48222     // loop where sum != 0, sum > d , sum+1 <d
48223
48224 };
48225
48226 /*
48227 THREE.CurvePath.prototype.getTangent = function( t ) {
48228 };*/
48229
48230
48231 // We cannot use the default THREE.Curve getPoint() with getLength() because in
48232 // THREE.Curve, getLength() depends on getPoint() but in THREE.CurvePath
48233 // getPoint() depends on getLength
48234
48235 THREE.CurvePath.prototype.getLength = function() {
48236
48237     var lens = this.getCurveLengths();
48238     return lens[ lens.length - 1 ];
48239
48240 };
48241
48242 // Compute lengths and cache them
48243 // We cannot overwrite getLengths() because UtoT mapping uses it.
48244
48245 THREE.CurvePath.prototype.getCurveLengths = function() {
48246
48247     // We use cache values if curves and cache array are same length
48248
48249     if ( this.cacheLengths && this.cacheLengths.length == this.curves.length ) {
48250
48251         return this.cacheLengths;
48252
48253     };
48254
48255     // Get length of subsurve
48256     // Push sums into cached array
48257
48258     var lengths = [], sums = 0;
48259     var i, il = this.curves.length;
48260
48261     for ( i = 0; i < il; i ++ ) {
48262
48263         sums += this.curves[ i ].getLength();
48264         lengths.push( sums );
48265
48266     }
48267
48268     this.cacheLengths = lengths;
48269
48270     return lengths;
48271
48272 };
48273
48274
48275
48276 // Returns min and max coordinates, as well as centroid
48277
48278 THREE.CurvePath.prototype.getBoundingBox = function () {
48279
48280     var points = this.getPoints();
48281
48282     var maxX, maxY, maxZ;
48283     var minX, minY, minZ;
48284
48285     maxX = maxY = Number.NEGATIVE_INFINITY;
48286     minX = minY = Number.POSITIVE_INFINITY;
48287
48288     var p, i, il, sum;
48289
48290     var v3 = points[0] instanceof THREE.Vector3;
48291
48292     sum = v3 ? new THREE.Vector3() : new THREE.Vector2();
48293
48294     for ( i = 0, il = points.length; i < il; i ++ ) {
48295
48296         p = points[ i ];
48297
48298         if ( p.x > maxX ) maxX = p.x;
48299         else if ( p.x < minX ) minX = p.x;
48300
48301         if ( p.y > maxY ) maxY = p.y;
48302         else if ( p.y < minY ) minY = p.y;
48303
48304         if (v3) {
48305
48306             if ( p.z > maxZ ) maxZ = p.z;
48307             else if ( p.z < minZ ) minZ = p.z;
48308
48309         }
48310
48311         sum.addSelf( p );
48312
48313     }
48314
48315     var ret = {
48316
48317         minX: minX,
48318         minY: minY,
48319         maxX: maxX,
48320         maxY: maxY,
48321         centroid: sum.divideScalar( il )
48322
48323     };
48324
48325     if (v3) {
48326
48327         ret.maxZ = maxZ;
48328         ret.minZ = minZ;
48329
48330     }
48331
48332     return ret;
48333
48334 };
48335
48336 /**************************************************************
48337  *    Create Geometries Helpers
48338  **************************************************************/
48339
48340 /// Generate geometry from path points (for Line or ParticleSystem objects)
48341
48342 THREE.CurvePath.prototype.createPointsGeometry = function( divisions ) {
48343
48344     var pts = this.getPoints( divisions, true );
48345     return this.createGeometry( pts );
48346
48347 };
48348
48349 // Generate geometry from equidistance sampling along the path
48350
48351 THREE.CurvePath.prototype.createSpacedPointsGeometry = function( divisions ) {
48352
48353     var pts = this.getSpacedPoints( divisions, true );
48354     return this.createGeometry( pts );
48355
48356 };
48357
48358 THREE.CurvePath.prototype.createGeometry = function( points ) {
48359
48360     var geometry = new THREE.Geometry();
48361
48362     for ( var i = 0; i < points.length; i ++ ) {
48363
48364         geometry.vertices.push( new THREE.Vector3( points[ i ].x, points[ i ].y, points[ i ].z || 0) );
48365
48366     }
48367
48368     return geometry;
48369
48370 };
48371
48372
48373 /**************************************************************
48374  *    Bend / Wrap Helper Methods
48375  **************************************************************/
48376
48377 // Wrap path / Bend modifiers?
48378
48379 THREE.CurvePath.prototype.addWrapPath = function ( bendpath ) {
48380
48381     this.bends.push( bendpath );
48382
48383 };
48384
48385 THREE.CurvePath.prototype.getTransformedPoints = function( segments, bends ) {
48386
48387     var oldPts = this.getPoints( segments ); // getPoints getSpacedPoints
48388     var i, il;
48389
48390     if ( !bends ) {
48391
48392         bends = this.bends;
48393
48394     }
48395
48396     for ( i = 0, il = bends.length; i < il; i ++ ) {
48397
48398         oldPts = this.getWrapPoints( oldPts, bends[ i ] );
48399
48400     }
48401
48402     return oldPts;
48403
48404 };
48405
48406 THREE.CurvePath.prototype.getTransformedSpacedPoints = function( segments, bends ) {
48407
48408     var oldPts = this.getSpacedPoints( segments );
48409
48410     var i, il;
48411
48412     if ( !bends ) {
48413
48414         bends = this.bends;
48415
48416     }
48417
48418     for ( i = 0, il = bends.length; i < il; i ++ ) {
48419
48420         oldPts = this.getWrapPoints( oldPts, bends[ i ] );
48421
48422     }
48423
48424     return oldPts;
48425
48426 };
48427
48428 // This returns getPoints() bend/wrapped around the contour of a path.
48429 // Read http://www.planetclegg.com/projects/WarpingTextToSplines.html
48430
48431 THREE.CurvePath.prototype.getWrapPoints = function ( oldPts, path ) {
48432
48433     var bounds = this.getBoundingBox();
48434
48435     var i, il, p, oldX, oldY, xNorm;
48436
48437     for ( i = 0, il = oldPts.length; i < il; i ++ ) {
48438
48439         p = oldPts[ i ];
48440
48441         oldX = p.x;
48442         oldY = p.y;
48443
48444         xNorm = oldX / bounds.maxX;
48445
48446         // If using actual distance, for length > path, requires line extrusions
48447         //xNorm = path.getUtoTmapping(xNorm, oldX); // 3 styles. 1) wrap stretched. 2) wrap stretch by arc length 3) warp by actual distance
48448
48449         xNorm = path.getUtoTmapping( xNorm, oldX );
48450
48451         // check for out of bounds?
48452
48453         var pathPt = path.getPoint( xNorm );
48454         var normal = path.getNormalVector( xNorm ).multiplyScalar( oldY );
48455
48456         p.x = pathPt.x + normal.x;
48457         p.y = pathPt.y + normal.y;
48458
48459     }
48460
48461     return oldPts;
48462
48463 };
48464
48465 /**
48466  * @author alteredq / http://alteredqualia.com/
48467  */
48468
48469 THREE.Gyroscope = function () {
48470
48471     THREE.Object3D.call( this );
48472
48473 };
48474
48475 THREE.Gyroscope.prototype = Object.create( THREE.Object3D.prototype );
48476
48477 THREE.Gyroscope.prototype.updateMatrixWorld = function ( force ) {
48478
48479     this.matrixAutoUpdate && this.updateMatrix();
48480
48481     // update matrixWorld
48482
48483     if ( this.matrixWorldNeedsUpdate || force ) {
48484
48485         if ( this.parent ) {
48486
48487             this.matrixWorld.multiply( this.parent.matrixWorld, this.matrix );
48488
48489             this.matrixWorld.decompose( this.translationWorld, this.rotationWorld, this.scaleWorld );
48490             this.matrix.decompose( this.translationObject, this.rotationObject, this.scaleObject );
48491
48492             this.matrixWorld.compose( this.translationWorld, this.rotationObject, this.scaleWorld );
48493
48494
48495         } else {
48496
48497             this.matrixWorld.copy( this.matrix );
48498
48499         }
48500
48501
48502         this.matrixWorldNeedsUpdate = false;
48503
48504         force = true;
48505
48506     }
48507
48508     // update children
48509
48510     for ( var i = 0, l = this.children.length; i < l; i ++ ) {
48511
48512         this.children[ i ].updateMatrixWorld( force );
48513
48514     }
48515
48516 };
48517
48518 THREE.Gyroscope.prototype.translationWorld = new THREE.Vector3();
48519 THREE.Gyroscope.prototype.translationObject = new THREE.Vector3();
48520 THREE.Gyroscope.prototype.rotationWorld = new THREE.Quaternion();
48521 THREE.Gyroscope.prototype.rotationObject = new THREE.Quaternion();
48522 THREE.Gyroscope.prototype.scaleWorld = new THREE.Vector3();
48523 THREE.Gyroscope.prototype.scaleObject = new THREE.Vector3();
48524
48525 /**
48526  * @author zz85 / http://www.lab4games.net/zz85/blog
48527  * Creates free form 2d path using series of points, lines or curves.
48528  *
48529  **/
48530
48531 THREE.Path = function ( points ) {
48532
48533     THREE.CurvePath.call(this);
48534
48535     this.actions = [];
48536
48537     if ( points ) {
48538
48539         this.fromPoints( points );
48540
48541     }
48542
48543 };
48544
48545 THREE.Path.prototype = Object.create( THREE.CurvePath.prototype );
48546
48547 THREE.PathActions = {
48548
48549     MOVE_TO: 'moveTo',
48550     LINE_TO: 'lineTo',
48551     QUADRATIC_CURVE_TO: 'quadraticCurveTo', // Bezier quadratic curve
48552     BEZIER_CURVE_TO: 'bezierCurveTo',         // Bezier cubic curve
48553     CSPLINE_THRU: 'splineThru',                // Catmull-rom spline
48554     ARC: 'arc',                                // Circle
48555     ELLIPSE: 'ellipse'
48556 };
48557
48558 // TODO Clean up PATH API
48559
48560 // Create path using straight lines to connect all points
48561 // - vectors: array of Vector2
48562
48563 THREE.Path.prototype.fromPoints = function ( vectors ) {
48564
48565     this.moveTo( vectors[ 0 ].x, vectors[ 0 ].y );
48566
48567     for ( var v = 1, vlen = vectors.length; v < vlen; v ++ ) {
48568
48569         this.lineTo( vectors[ v ].x, vectors[ v ].y );
48570
48571     };
48572
48573 };
48574
48575 // startPath() endPath()?
48576
48577 THREE.Path.prototype.moveTo = function ( x, y ) {
48578
48579     var args = Array.prototype.slice.call( arguments );
48580     this.actions.push( { action: THREE.PathActions.MOVE_TO, args: args } );
48581
48582 };
48583
48584 THREE.Path.prototype.lineTo = function ( x, y ) {
48585
48586     var args = Array.prototype.slice.call( arguments );
48587
48588     var lastargs = this.actions[ this.actions.length - 1 ].args;
48589
48590     var x0 = lastargs[ lastargs.length - 2 ];
48591     var y0 = lastargs[ lastargs.length - 1 ];
48592
48593     var curve = new THREE.LineCurve( new THREE.Vector2( x0, y0 ), new THREE.Vector2( x, y ) );
48594     this.curves.push( curve );
48595
48596     this.actions.push( { action: THREE.PathActions.LINE_TO, args: args } );
48597
48598 };
48599
48600 THREE.Path.prototype.quadraticCurveTo = function( aCPx, aCPy, aX, aY ) {
48601
48602     var args = Array.prototype.slice.call( arguments );
48603
48604     var lastargs = this.actions[ this.actions.length - 1 ].args;
48605
48606     var x0 = lastargs[ lastargs.length - 2 ];
48607     var y0 = lastargs[ lastargs.length - 1 ];
48608
48609     var curve = new THREE.QuadraticBezierCurve( new THREE.Vector2( x0, y0 ),
48610                                                 new THREE.Vector2( aCPx, aCPy ),
48611                                                 new THREE.Vector2( aX, aY ) );
48612     this.curves.push( curve );
48613
48614     this.actions.push( { action: THREE.PathActions.QUADRATIC_CURVE_TO, args: args } );
48615
48616 };
48617
48618 THREE.Path.prototype.bezierCurveTo = function( aCP1x, aCP1y,
48619                                                aCP2x, aCP2y,
48620                                                aX, aY ) {
48621
48622     var args = Array.prototype.slice.call( arguments );
48623
48624     var lastargs = this.actions[ this.actions.length - 1 ].args;
48625
48626     var x0 = lastargs[ lastargs.length - 2 ];
48627     var y0 = lastargs[ lastargs.length - 1 ];
48628
48629     var curve = new THREE.CubicBezierCurve( new THREE.Vector2( x0, y0 ),
48630                                             new THREE.Vector2( aCP1x, aCP1y ),
48631                                             new THREE.Vector2( aCP2x, aCP2y ),
48632                                             new THREE.Vector2( aX, aY ) );
48633     this.curves.push( curve );
48634
48635     this.actions.push( { action: THREE.PathActions.BEZIER_CURVE_TO, args: args } );
48636
48637 };
48638
48639 THREE.Path.prototype.splineThru = function( pts /*Array of Vector*/ ) {
48640
48641     var args = Array.prototype.slice.call( arguments );
48642     var lastargs = this.actions[ this.actions.length - 1 ].args;
48643
48644     var x0 = lastargs[ lastargs.length - 2 ];
48645     var y0 = lastargs[ lastargs.length - 1 ];
48646 //---
48647     var npts = [ new THREE.Vector2( x0, y0 ) ];
48648     Array.prototype.push.apply( npts, pts );
48649
48650     var curve = new THREE.SplineCurve( npts );
48651     this.curves.push( curve );
48652
48653     this.actions.push( { action: THREE.PathActions.CSPLINE_THRU, args: args } );
48654
48655 };
48656
48657 // FUTURE: Change the API or follow canvas API?
48658
48659 THREE.Path.prototype.arc = function ( aX, aY, aRadius,
48660                                       aStartAngle, aEndAngle, aClockwise ) {
48661
48662     var lastargs = this.actions[ this.actions.length - 1].args;
48663     var x0 = lastargs[ lastargs.length - 2 ];
48664     var y0 = lastargs[ lastargs.length - 1 ];
48665
48666     this.absarc(aX + x0, aY + y0, aRadius,
48667         aStartAngle, aEndAngle, aClockwise );
48668
48669  };
48670
48671  THREE.Path.prototype.absarc = function ( aX, aY, aRadius,
48672                                       aStartAngle, aEndAngle, aClockwise ) {
48673     this.absellipse(aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise);
48674  };
48675
48676 THREE.Path.prototype.ellipse = function ( aX, aY, xRadius, yRadius,
48677                                       aStartAngle, aEndAngle, aClockwise ) {
48678
48679     var lastargs = this.actions[ this.actions.length - 1].args;
48680     var x0 = lastargs[ lastargs.length - 2 ];
48681     var y0 = lastargs[ lastargs.length - 1 ];
48682
48683     this.absellipse(aX + x0, aY + y0, xRadius, yRadius,
48684         aStartAngle, aEndAngle, aClockwise );
48685
48686  };
48687
48688
48689 THREE.Path.prototype.absellipse = function ( aX, aY, xRadius, yRadius,
48690                                       aStartAngle, aEndAngle, aClockwise ) {
48691
48692     var args = Array.prototype.slice.call( arguments );
48693     var curve = new THREE.EllipseCurve( aX, aY, xRadius, yRadius,
48694                                     aStartAngle, aEndAngle, aClockwise );
48695     this.curves.push( curve );
48696
48697     var lastPoint = curve.getPoint(aClockwise ? 1 : 0);
48698     args.push(lastPoint.x);
48699     args.push(lastPoint.y);
48700
48701     this.actions.push( { action: THREE.PathActions.ELLIPSE, args: args } );
48702
48703  };
48704
48705 THREE.Path.prototype.getSpacedPoints = function ( divisions, closedPath ) {
48706
48707     if ( ! divisions ) divisions = 40;
48708
48709     var points = [];
48710
48711     for ( var i = 0; i < divisions; i ++ ) {
48712
48713         points.push( this.getPoint( i / divisions ) );
48714
48715         //if( !this.getPoint( i / divisions ) ) throw "DIE";
48716
48717     }
48718
48719     // if ( closedPath ) {
48720     //
48721     //     points.push( points[ 0 ] );
48722     //
48723     // }
48724
48725     return points;
48726
48727 };
48728
48729 /* Return an array of vectors based on contour of the path */
48730
48731 THREE.Path.prototype.getPoints = function( divisions, closedPath ) {
48732
48733     if (this.useSpacedPoints) {
48734         console.log('tata');
48735         return this.getSpacedPoints( divisions, closedPath );
48736     }
48737
48738     divisions = divisions || 12;
48739
48740     var points = [];
48741
48742     var i, il, item, action, args;
48743     var cpx, cpy, cpx2, cpy2, cpx1, cpy1, cpx0, cpy0,
48744         laste, j,
48745         t, tx, ty;
48746
48747     for ( i = 0, il = this.actions.length; i < il; i ++ ) {
48748
48749         item = this.actions[ i ];
48750
48751         action = item.action;
48752         args = item.args;
48753
48754         switch( action ) {
48755
48756         case THREE.PathActions.MOVE_TO:
48757
48758             points.push( new THREE.Vector2( args[ 0 ], args[ 1 ] ) );
48759
48760             break;
48761
48762         case THREE.PathActions.LINE_TO:
48763
48764             points.push( new THREE.Vector2( args[ 0 ], args[ 1 ] ) );
48765
48766             break;
48767
48768         case THREE.PathActions.QUADRATIC_CURVE_TO:
48769
48770             cpx  = args[ 2 ];
48771             cpy  = args[ 3 ];
48772
48773             cpx1 = args[ 0 ];
48774             cpy1 = args[ 1 ];
48775
48776             if ( points.length > 0 ) {
48777
48778                 laste = points[ points.length - 1 ];
48779
48780                 cpx0 = laste.x;
48781                 cpy0 = laste.y;
48782
48783             } else {
48784
48785                 laste = this.actions[ i - 1 ].args;
48786
48787                 cpx0 = laste[ laste.length - 2 ];
48788                 cpy0 = laste[ laste.length - 1 ];
48789
48790             }
48791
48792             for ( j = 1; j <= divisions; j ++ ) {
48793
48794                 t = j / divisions;
48795
48796                 tx = THREE.Shape.Utils.b2( t, cpx0, cpx1, cpx );
48797                 ty = THREE.Shape.Utils.b2( t, cpy0, cpy1, cpy );
48798
48799                 points.push( new THREE.Vector2( tx, ty ) );
48800
48801               }
48802
48803             break;
48804
48805         case THREE.PathActions.BEZIER_CURVE_TO:
48806
48807             cpx  = args[ 4 ];
48808             cpy  = args[ 5 ];
48809
48810             cpx1 = args[ 0 ];
48811             cpy1 = args[ 1 ];
48812
48813             cpx2 = args[ 2 ];
48814             cpy2 = args[ 3 ];
48815
48816             if ( points.length > 0 ) {
48817
48818                 laste = points[ points.length - 1 ];
48819
48820                 cpx0 = laste.x;
48821                 cpy0 = laste.y;
48822
48823             } else {
48824
48825                 laste = this.actions[ i - 1 ].args;
48826
48827                 cpx0 = laste[ laste.length - 2 ];
48828                 cpy0 = laste[ laste.length - 1 ];
48829
48830             }
48831
48832
48833             for ( j = 1; j <= divisions; j ++ ) {
48834
48835                 t = j / divisions;
48836
48837                 tx = THREE.Shape.Utils.b3( t, cpx0, cpx1, cpx2, cpx );
48838                 ty = THREE.Shape.Utils.b3( t, cpy0, cpy1, cpy2, cpy );
48839
48840                 points.push( new THREE.Vector2( tx, ty ) );
48841
48842             }
48843
48844             break;
48845
48846         case THREE.PathActions.CSPLINE_THRU:
48847
48848             laste = this.actions[ i - 1 ].args;
48849
48850             var last = new THREE.Vector2( laste[ laste.length - 2 ], laste[ laste.length - 1 ] );
48851             var spts = [ last ];
48852
48853             var n = divisions * args[ 0 ].length;
48854
48855             spts = spts.concat( args[ 0 ] );
48856
48857             var spline = new THREE.SplineCurve( spts );
48858
48859             for ( j = 1; j <= n; j ++ ) {
48860
48861                 points.push( spline.getPointAt( j / n ) ) ;
48862
48863             }
48864
48865             break;
48866
48867         case THREE.PathActions.ARC:
48868
48869             var aX = args[ 0 ], aY = args[ 1 ],
48870                 aRadius = args[ 2 ],
48871                 aStartAngle = args[ 3 ], aEndAngle = args[ 4 ],
48872                 aClockwise = !!args[ 5 ];
48873
48874             var deltaAngle = aEndAngle - aStartAngle;
48875             var angle;
48876             var tdivisions = divisions * 2;
48877
48878             for ( j = 1; j <= tdivisions; j ++ ) {
48879
48880                 t = j / tdivisions;
48881
48882                 if ( ! aClockwise ) {
48883
48884                     t = 1 - t;
48885
48886                 }
48887
48888                 angle = aStartAngle + t * deltaAngle;
48889
48890                 tx = aX + aRadius * Math.cos( angle );
48891                 ty = aY + aRadius * Math.sin( angle );
48892
48893                 //console.log('t', t, 'angle', angle, 'tx', tx, 'ty', ty);
48894
48895                 points.push( new THREE.Vector2( tx, ty ) );
48896
48897             }
48898
48899             //console.log(points);
48900
48901           break;
48902
48903         case THREE.PathActions.ELLIPSE:
48904
48905             var aX = args[ 0 ], aY = args[ 1 ],
48906                 xRadius = args[ 2 ],
48907                 yRadius = args[ 3 ],
48908                 aStartAngle = args[ 4 ], aEndAngle = args[ 5 ],
48909                 aClockwise = !!args[ 6 ];
48910
48911
48912             var deltaAngle = aEndAngle - aStartAngle;
48913             var angle;
48914             var tdivisions = divisions * 2;
48915
48916             for ( j = 1; j <= tdivisions; j ++ ) {
48917
48918                 t = j / tdivisions;
48919
48920                 if ( ! aClockwise ) {
48921
48922                     t = 1 - t;
48923
48924                 }
48925
48926                 angle = aStartAngle + t * deltaAngle;
48927
48928                 tx = aX + xRadius * Math.cos( angle );
48929                 ty = aY + yRadius * Math.sin( angle );
48930
48931                 //console.log('t', t, 'angle', angle, 'tx', tx, 'ty', ty);
48932
48933                 points.push( new THREE.Vector2( tx, ty ) );
48934
48935             }
48936
48937             //console.log(points);
48938
48939           break;
48940
48941         } // end switch
48942
48943     }
48944
48945
48946
48947     // Normalize to remove the closing point by default.
48948     var lastPoint = points[ points.length - 1];
48949     var EPSILON = 0.0000000001;
48950     if ( Math.abs(lastPoint.x - points[ 0 ].x) < EPSILON &&
48951              Math.abs(lastPoint.y - points[ 0 ].y) < EPSILON)
48952         points.splice( points.length - 1, 1);
48953     if ( closedPath ) {
48954
48955         points.push( points[ 0 ] );
48956
48957     }
48958
48959     return points;
48960
48961 };
48962
48963 // Breaks path into shapes
48964
48965 THREE.Path.prototype.toShapes = function() {
48966
48967     var i, il, item, action, args;
48968
48969     var subPaths = [], lastPath = new THREE.Path();
48970
48971     for ( i = 0, il = this.actions.length; i < il; i ++ ) {
48972
48973         item = this.actions[ i ];
48974
48975         args = item.args;
48976         action = item.action;
48977
48978         if ( action == THREE.PathActions.MOVE_TO ) {
48979
48980             if ( lastPath.actions.length != 0 ) {
48981
48982                 subPaths.push( lastPath );
48983                 lastPath = new THREE.Path();
48984
48985             }
48986
48987         }
48988
48989         lastPath[ action ].apply( lastPath, args );
48990
48991     }
48992
48993     if ( lastPath.actions.length != 0 ) {
48994
48995         subPaths.push( lastPath );
48996
48997     }
48998
48999     // console.log(subPaths);
49000
49001     if ( subPaths.length == 0 ) return [];
49002
49003     var tmpPath, tmpShape, shapes = [];
49004
49005     var holesFirst = !THREE.Shape.Utils.isClockWise( subPaths[ 0 ].getPoints() );
49006     // console.log("Holes first", holesFirst);
49007
49008     if ( subPaths.length == 1) {
49009         tmpPath = subPaths[0];
49010         tmpShape = new THREE.Shape();
49011         tmpShape.actions = tmpPath.actions;
49012         tmpShape.curves = tmpPath.curves;
49013         shapes.push( tmpShape );
49014         return shapes;
49015     };
49016
49017     if ( holesFirst ) {
49018
49019         tmpShape = new THREE.Shape();
49020
49021         for ( i = 0, il = subPaths.length; i < il; i ++ ) {
49022
49023             tmpPath = subPaths[ i ];
49024
49025             if ( THREE.Shape.Utils.isClockWise( tmpPath.getPoints() ) ) {
49026
49027                 tmpShape.actions = tmpPath.actions;
49028                 tmpShape.curves = tmpPath.curves;
49029
49030                 shapes.push( tmpShape );
49031                 tmpShape = new THREE.Shape();
49032
49033                 //console.log('cw', i);
49034
49035             } else {
49036
49037                 tmpShape.holes.push( tmpPath );
49038
49039                 //console.log('ccw', i);
49040
49041             }
49042
49043         }
49044
49045     } else {
49046
49047         // Shapes first
49048
49049         for ( i = 0, il = subPaths.length; i < il; i ++ ) {
49050
49051             tmpPath = subPaths[ i ];
49052
49053             if ( THREE.Shape.Utils.isClockWise( tmpPath.getPoints() ) ) {
49054
49055
49056                 if ( tmpShape ) shapes.push( tmpShape );
49057
49058                 tmpShape = new THREE.Shape();
49059                 tmpShape.actions = tmpPath.actions;
49060                 tmpShape.curves = tmpPath.curves;
49061
49062             } else {
49063
49064                 tmpShape.holes.push( tmpPath );
49065
49066             }
49067
49068         }
49069
49070         shapes.push( tmpShape );
49071
49072     }
49073
49074     //console.log("shape", shapes);
49075
49076     return shapes;
49077
49078 };
49079 /**
49080  * @author zz85 / http://www.lab4games.net/zz85/blog
49081  * Defines a 2d shape plane using paths.
49082  **/
49083
49084 // STEP 1 Create a path.
49085 // STEP 2 Turn path into shape.
49086 // STEP 3 ExtrudeGeometry takes in Shape/Shapes
49087 // STEP 3a - Extract points from each shape, turn to vertices
49088 // STEP 3b - Triangulate each shape, add faces.
49089
49090 THREE.Shape = function ( ) {
49091
49092     THREE.Path.apply( this, arguments );
49093     this.holes = [];
49094
49095 };
49096
49097 THREE.Shape.prototype = Object.create( THREE.Path.prototype );
49098
49099 // Convenience method to return ExtrudeGeometry
49100
49101 THREE.Shape.prototype.extrude = function ( options ) {
49102
49103     var extruded = new THREE.ExtrudeGeometry( this, options );
49104     return extruded;
49105
49106 };
49107
49108 // Convenience method to return ShapeGeometry
49109
49110 THREE.Shape.prototype.makeGeometry = function ( options ) {
49111
49112     var geometry = new THREE.ShapeGeometry( this, options );
49113     return geometry;
49114
49115 };
49116
49117 // Get points of holes
49118
49119 THREE.Shape.prototype.getPointsHoles = function ( divisions ) {
49120
49121     var i, il = this.holes.length, holesPts = [];
49122
49123     for ( i = 0; i < il; i ++ ) {
49124
49125         holesPts[ i ] = this.holes[ i ].getTransformedPoints( divisions, this.bends );
49126
49127     }
49128
49129     return holesPts;
49130
49131 };
49132
49133 // Get points of holes (spaced by regular distance)
49134
49135 THREE.Shape.prototype.getSpacedPointsHoles = function ( divisions ) {
49136
49137     var i, il = this.holes.length, holesPts = [];
49138
49139     for ( i = 0; i < il; i ++ ) {
49140
49141         holesPts[ i ] = this.holes[ i ].getTransformedSpacedPoints( divisions, this.bends );
49142
49143     }
49144
49145     return holesPts;
49146
49147 };
49148
49149
49150 // Get points of shape and holes (keypoints based on segments parameter)
49151
49152 THREE.Shape.prototype.extractAllPoints = function ( divisions ) {
49153
49154     return {
49155
49156         shape: this.getTransformedPoints( divisions ),
49157         holes: this.getPointsHoles( divisions )
49158
49159     };
49160
49161 };
49162
49163 THREE.Shape.prototype.extractPoints = function ( divisions ) {
49164
49165     if (this.useSpacedPoints) {
49166         return this.extractAllSpacedPoints(divisions);
49167     }
49168
49169     return this.extractAllPoints(divisions);
49170
49171 };
49172
49173 //
49174 // THREE.Shape.prototype.extractAllPointsWithBend = function ( divisions, bend ) {
49175 //
49176 //     return {
49177 //
49178 //         shape: this.transform( bend, divisions ),
49179 //         holes: this.getPointsHoles( divisions, bend )
49180 //
49181 //     };
49182 //
49183 // };
49184
49185 // Get points of shape and holes (spaced by regular distance)
49186
49187 THREE.Shape.prototype.extractAllSpacedPoints = function ( divisions ) {
49188
49189     return {
49190
49191         shape: this.getTransformedSpacedPoints( divisions ),
49192         holes: this.getSpacedPointsHoles( divisions )
49193
49194     };
49195
49196 };
49197
49198 /**************************************************************
49199  *    Utils
49200  **************************************************************/
49201
49202 THREE.Shape.Utils = {
49203
49204     /*
49205         contour - array of vector2 for contour
49206         holes   - array of array of vector2
49207     */
49208
49209     removeHoles: function ( contour, holes ) {
49210
49211         var shape = contour.concat(); // work on this shape
49212         var allpoints = shape.concat();
49213
49214         /* For each isolated shape, find the closest points and break to the hole to allow triangulation */
49215
49216
49217         var prevShapeVert, nextShapeVert,
49218             prevHoleVert, nextHoleVert,
49219             holeIndex, shapeIndex,
49220             shapeId, shapeGroup,
49221             h, h2,
49222             hole, shortest, d,
49223             p, pts1, pts2,
49224             tmpShape1, tmpShape2,
49225             tmpHole1, tmpHole2,
49226             verts = [];
49227
49228         for ( h = 0; h < holes.length; h ++ ) {
49229
49230             hole = holes[ h ];
49231
49232             /*
49233             shapeholes[ h ].concat(); // preserves original
49234             holes.push( hole );
49235             */
49236
49237             Array.prototype.push.apply( allpoints, hole );
49238
49239             shortest = Number.POSITIVE_INFINITY;
49240
49241
49242             // Find the shortest pair of pts between shape and hole
49243
49244             // Note: Actually, I'm not sure now if we could optimize this to be faster than O(m*n)
49245             // Using distanceToSquared() intead of distanceTo() should speed a little
49246             // since running square roots operations are reduced.
49247
49248             for ( h2 = 0; h2 < hole.length; h2 ++ ) {
49249
49250                 pts1 = hole[ h2 ];
49251                 var dist = [];
49252
49253                 for ( p = 0; p < shape.length; p++ ) {
49254
49255                     pts2 = shape[ p ];
49256                     d = pts1.distanceToSquared( pts2 );
49257                     dist.push( d );
49258
49259                     if ( d < shortest ) {
49260
49261                         shortest = d;
49262                         holeIndex = h2;
49263                         shapeIndex = p;
49264
49265                     }
49266
49267                 }
49268
49269             }
49270
49271             //console.log("shortest", shortest, dist);
49272
49273             prevShapeVert = ( shapeIndex - 1 ) >= 0 ? shapeIndex - 1 : shape.length - 1;
49274             prevHoleVert = ( holeIndex - 1 ) >= 0 ? holeIndex - 1 : hole.length - 1;
49275
49276             var areaapts = [
49277
49278                 hole[ holeIndex ],
49279                 shape[ shapeIndex ],
49280                 shape[ prevShapeVert ]
49281
49282             ];
49283
49284             var areaa = THREE.FontUtils.Triangulate.area( areaapts );
49285
49286             var areabpts = [
49287
49288                 hole[ holeIndex ],
49289                 hole[ prevHoleVert ],
49290                 shape[ shapeIndex ]
49291
49292             ];
49293
49294             var areab = THREE.FontUtils.Triangulate.area( areabpts );
49295
49296             var shapeOffset = 1;
49297             var holeOffset = -1;
49298
49299             var oldShapeIndex = shapeIndex, oldHoleIndex = holeIndex;
49300             shapeIndex += shapeOffset;
49301             holeIndex += holeOffset;
49302
49303             if ( shapeIndex < 0 ) { shapeIndex += shape.length;  }
49304             shapeIndex %= shape.length;
49305
49306             if ( holeIndex < 0 ) { holeIndex += hole.length;  }
49307             holeIndex %= hole.length;
49308
49309             prevShapeVert = ( shapeIndex - 1 ) >= 0 ? shapeIndex - 1 : shape.length - 1;
49310             prevHoleVert = ( holeIndex - 1 ) >= 0 ? holeIndex - 1 : hole.length - 1;
49311
49312             areaapts = [
49313
49314                 hole[ holeIndex ],
49315                 shape[ shapeIndex ],
49316                 shape[ prevShapeVert ]
49317
49318             ];
49319
49320             var areaa2 = THREE.FontUtils.Triangulate.area( areaapts );
49321
49322             areabpts = [
49323
49324                 hole[ holeIndex ],
49325                 hole[ prevHoleVert ],
49326                 shape[ shapeIndex ]
49327
49328             ];
49329
49330             var areab2 = THREE.FontUtils.Triangulate.area( areabpts );
49331             //console.log(areaa,areab ,areaa2,areab2, ( areaa + areab ),  ( areaa2 + areab2 ));
49332
49333             if ( ( areaa + areab ) > ( areaa2 + areab2 ) ) {
49334
49335                 // In case areas are not correct.
49336                 //console.log("USE THIS");
49337
49338                 shapeIndex = oldShapeIndex;
49339                 holeIndex = oldHoleIndex ;
49340
49341                 if ( shapeIndex < 0 ) { shapeIndex += shape.length;  }
49342                 shapeIndex %= shape.length;
49343
49344                 if ( holeIndex < 0 ) { holeIndex += hole.length;  }
49345                 holeIndex %= hole.length;
49346
49347                 prevShapeVert = ( shapeIndex - 1 ) >= 0 ? shapeIndex - 1 : shape.length - 1;
49348                 prevHoleVert = ( holeIndex - 1 ) >= 0 ? holeIndex - 1 : hole.length - 1;
49349
49350             } else {
49351
49352                 //console.log("USE THAT ")
49353
49354             }
49355
49356             tmpShape1 = shape.slice( 0, shapeIndex );
49357             tmpShape2 = shape.slice( shapeIndex );
49358             tmpHole1 = hole.slice( holeIndex );
49359             tmpHole2 = hole.slice( 0, holeIndex );
49360
49361             // Should check orders here again?
49362
49363             var trianglea = [
49364
49365                 hole[ holeIndex ],
49366                 shape[ shapeIndex ],
49367                 shape[ prevShapeVert ]
49368
49369             ];
49370
49371             var triangleb = [
49372
49373                 hole[ holeIndex ] ,
49374                 hole[ prevHoleVert ],
49375                 shape[ shapeIndex ]
49376
49377             ];
49378
49379             verts.push( trianglea );
49380             verts.push( triangleb );
49381
49382             shape = tmpShape1.concat( tmpHole1 ).concat( tmpHole2 ).concat( tmpShape2 );
49383
49384         }
49385
49386         return {
49387
49388             shape:shape,         /* shape with no holes */
49389             isolatedPts: verts, /* isolated faces */
49390             allpoints: allpoints
49391
49392         }
49393
49394
49395     },
49396
49397     triangulateShape: function ( contour, holes ) {
49398
49399         var shapeWithoutHoles = THREE.Shape.Utils.removeHoles( contour, holes );
49400
49401         var shape = shapeWithoutHoles.shape,
49402             allpoints = shapeWithoutHoles.allpoints,
49403             isolatedPts = shapeWithoutHoles.isolatedPts;
49404
49405         var triangles = THREE.FontUtils.Triangulate( shape, false ); // True returns indices for points of spooled shape
49406
49407         // To maintain reference to old shape, one must match coordinates, or offset the indices from original arrays. It's probably easier to do the first.
49408
49409         //console.log( "triangles",triangles, triangles.length );
49410         //console.log( "allpoints",allpoints, allpoints.length );
49411
49412         var i, il, f, face,
49413             key, index,
49414             allPointsMap = {},
49415             isolatedPointsMap = {};
49416
49417         // prepare all points map
49418
49419         for ( i = 0, il = allpoints.length; i < il; i ++ ) {
49420
49421             key = allpoints[ i ].x + ":" + allpoints[ i ].y;
49422
49423             if ( allPointsMap[ key ] !== undefined ) {
49424
49425                 console.log( "Duplicate point", key );
49426
49427             }
49428
49429             allPointsMap[ key ] = i;
49430
49431         }
49432
49433         // check all face vertices against all points map
49434
49435         for ( i = 0, il = triangles.length; i < il; i ++ ) {
49436
49437             face = triangles[ i ];
49438
49439             for ( f = 0; f < 3; f ++ ) {
49440
49441                 key = face[ f ].x + ":" + face[ f ].y;
49442
49443                 index = allPointsMap[ key ];
49444
49445                 if ( index !== undefined ) {
49446
49447                     face[ f ] = index;
49448
49449                 }
49450
49451             }
49452
49453         }
49454
49455         // check isolated points vertices against all points map
49456
49457         for ( i = 0, il = isolatedPts.length; i < il; i ++ ) {
49458
49459             face = isolatedPts[ i ];
49460
49461             for ( f = 0; f < 3; f ++ ) {
49462
49463                 key = face[ f ].x + ":" + face[ f ].y;
49464
49465                 index = allPointsMap[ key ];
49466
49467                 if ( index !== undefined ) {
49468
49469                     face[ f ] = index;
49470
49471                 }
49472
49473             }
49474
49475         }
49476
49477         return triangles.concat( isolatedPts );
49478
49479     }, // end triangulate shapes
49480
49481     /*
49482     triangulate2 : function( pts, holes ) {
49483
49484         // For use with Poly2Tri.js
49485
49486         var allpts = pts.concat();
49487         var shape = [];
49488         for (var p in pts) {
49489             shape.push(new js.poly2tri.Point(pts[p].x, pts[p].y));
49490         }
49491
49492         var swctx = new js.poly2tri.SweepContext(shape);
49493
49494         for (var h in holes) {
49495             var aHole = holes[h];
49496             var newHole = []
49497             for (i in aHole) {
49498                 newHole.push(new js.poly2tri.Point(aHole[i].x, aHole[i].y));
49499                 allpts.push(aHole[i]);
49500             }
49501             swctx.AddHole(newHole);
49502         }
49503
49504         var find;
49505         var findIndexForPt = function (pt) {
49506             find = new THREE.Vector2(pt.x, pt.y);
49507             var p;
49508             for (p=0, pl = allpts.length; p<pl; p++) {
49509                 if (allpts[p].equals(find)) return p;
49510             }
49511             return -1;
49512         };
49513
49514         // triangulate
49515         js.poly2tri.sweep.Triangulate(swctx);
49516
49517         var triangles =  swctx.GetTriangles();
49518         var tr ;
49519         var facesPts = [];
49520         for (var t in triangles) {
49521             tr =  triangles[t];
49522             facesPts.push([
49523                 findIndexForPt(tr.GetPoint(0)),
49524                 findIndexForPt(tr.GetPoint(1)),
49525                 findIndexForPt(tr.GetPoint(2))
49526                     ]);
49527         }
49528
49529
49530     //    console.log(facesPts);
49531     //    console.log("triangles", triangles.length, triangles);
49532
49533         // Returns array of faces with 3 element each
49534     return facesPts;
49535     },
49536 */
49537
49538     isClockWise: function ( pts ) {
49539
49540         return THREE.FontUtils.Triangulate.area( pts ) < 0;
49541
49542     },
49543
49544     // Bezier Curves formulas obtained from
49545     // http://en.wikipedia.org/wiki/B%C3%A9zier_curve
49546
49547     // Quad Bezier Functions
49548
49549     b2p0: function ( t, p ) {
49550
49551         var k = 1 - t;
49552         return k * k * p;
49553
49554     },
49555
49556     b2p1: function ( t, p ) {
49557
49558         return 2 * ( 1 - t ) * t * p;
49559
49560     },
49561
49562     b2p2: function ( t, p ) {
49563
49564         return t * t * p;
49565
49566     },
49567
49568     b2: function ( t, p0, p1, p2 ) {
49569
49570         return this.b2p0( t, p0 ) + this.b2p1( t, p1 ) + this.b2p2( t, p2 );
49571
49572     },
49573
49574     // Cubic Bezier Functions
49575
49576     b3p0: function ( t, p ) {
49577
49578         var k = 1 - t;
49579         return k * k * k * p;
49580
49581     },
49582
49583     b3p1: function ( t, p ) {
49584
49585         var k = 1 - t;
49586         return 3 * k * k * t * p;
49587
49588     },
49589
49590     b3p2: function ( t, p ) {
49591
49592         var k = 1 - t;
49593         return 3 * k * t * t * p;
49594
49595     },
49596
49597     b3p3: function ( t, p ) {
49598
49599         return t * t * t * p;
49600
49601     },
49602
49603     b3: function ( t, p0, p1, p2, p3 ) {
49604
49605         return this.b3p0( t, p0 ) + this.b3p1( t, p1 ) + this.b3p2( t, p2 ) +  this.b3p3( t, p3 );
49606
49607     }
49608
49609 };
49610
49611 /**
49612  * @author mikael emtinger / http://gomo.se/
49613  */
49614
49615 THREE.AnimationHandler = (function() {
49616
49617     var playing = [];
49618     var library = {};
49619     var that    = {};
49620
49621
49622     //--- update ---
49623
49624     that.update = function( deltaTimeMS ) {
49625
49626         for( var i = 0; i < playing.length; i ++ )
49627             playing[ i ].update( deltaTimeMS );
49628
49629     };
49630
49631
49632     //--- add ---
49633
49634     that.addToUpdate = function( animation ) {
49635
49636         if ( playing.indexOf( animation ) === -1 )
49637             playing.push( animation );
49638
49639     };
49640
49641
49642     //--- remove ---
49643
49644     that.removeFromUpdate = function( animation ) {
49645
49646         var index = playing.indexOf( animation );
49647
49648         if( index !== -1 )
49649             playing.splice( index, 1 );
49650
49651     };
49652
49653
49654     //--- add ---
49655
49656     that.add = function( data ) {
49657
49658         if ( library[ data.name ] !== undefined )
49659             console.log( "THREE.AnimationHandler.add: Warning! " + data.name + " already exists in library. Overwriting." );
49660
49661         library[ data.name ] = data;
49662         initData( data );
49663
49664     };
49665
49666
49667     //--- get ---
49668
49669     that.get = function( name ) {
49670
49671         if ( typeof name === "string" ) {
49672
49673             if ( library[ name ] ) {
49674
49675                 return library[ name ];
49676
49677             } else {
49678
49679                 console.log( "THREE.AnimationHandler.get: Couldn't find animation " + name );
49680                 return null;
49681
49682             }
49683
49684         } else {
49685
49686             // todo: add simple tween library
49687
49688         }
49689
49690     };
49691
49692     //--- parse ---
49693
49694     that.parse = function( root ) {
49695
49696         // setup hierarchy
49697
49698         var hierarchy = [];
49699
49700         if ( root instanceof THREE.SkinnedMesh ) {
49701
49702             for( var b = 0; b < root.bones.length; b++ ) {
49703
49704                 hierarchy.push( root.bones[ b ] );
49705
49706             }
49707
49708         } else {
49709
49710             parseRecurseHierarchy( root, hierarchy );
49711
49712         }
49713
49714         return hierarchy;
49715
49716     };
49717
49718     var parseRecurseHierarchy = function( root, hierarchy ) {
49719
49720         hierarchy.push( root );
49721
49722         for( var c = 0; c < root.children.length; c++ )
49723             parseRecurseHierarchy( root.children[ c ], hierarchy );
49724
49725     }
49726
49727
49728     //--- init data ---
49729
49730     var initData = function( data ) {
49731
49732         if( data.initialized === true )
49733             return;
49734
49735
49736         // loop through all keys
49737
49738         for( var h = 0; h < data.hierarchy.length; h ++ ) {
49739
49740             for( var k = 0; k < data.hierarchy[ h ].keys.length; k ++ ) {
49741
49742                 // remove minus times
49743
49744                 if( data.hierarchy[ h ].keys[ k ].time < 0 )
49745                     data.hierarchy[ h ].keys[ k ].time = 0;
49746
49747
49748                 // create quaternions
49749
49750                 if( data.hierarchy[ h ].keys[ k ].rot !== undefined &&
49751                  !( data.hierarchy[ h ].keys[ k ].rot instanceof THREE.Quaternion ) ) {
49752
49753                     var quat = data.hierarchy[ h ].keys[ k ].rot;
49754                     data.hierarchy[ h ].keys[ k ].rot = new THREE.Quaternion( quat[0], quat[1], quat[2], quat[3] );
49755
49756                 }
49757
49758             }
49759
49760
49761             // prepare morph target keys
49762
49763             if( data.hierarchy[ h ].keys.length && data.hierarchy[ h ].keys[ 0 ].morphTargets !== undefined ) {
49764
49765                 // get all used
49766
49767                 var usedMorphTargets = {};
49768
49769                 for ( var k = 0; k < data.hierarchy[ h ].keys.length; k ++ ) {
49770
49771                     for ( var m = 0; m < data.hierarchy[ h ].keys[ k ].morphTargets.length; m ++ ) {
49772
49773                         var morphTargetName = data.hierarchy[ h ].keys[ k ].morphTargets[ m ];
49774                         usedMorphTargets[ morphTargetName ] = -1;
49775
49776                     }
49777
49778                 }
49779
49780                 data.hierarchy[ h ].usedMorphTargets = usedMorphTargets;
49781
49782
49783                 // set all used on all frames
49784
49785                 for ( var k = 0; k < data.hierarchy[ h ].keys.length; k ++ ) {
49786
49787                     var influences = {};
49788
49789                     for ( var morphTargetName in usedMorphTargets ) {
49790
49791                         for ( var m = 0; m < data.hierarchy[ h ].keys[ k ].morphTargets.length; m ++ ) {
49792
49793                             if ( data.hierarchy[ h ].keys[ k ].morphTargets[ m ] === morphTargetName ) {
49794
49795                                 influences[ morphTargetName ] = data.hierarchy[ h ].keys[ k ].morphTargetsInfluences[ m ];
49796                                 break;
49797
49798                             }
49799
49800                         }
49801
49802                         if ( m === data.hierarchy[ h ].keys[ k ].morphTargets.length ) {
49803
49804                             influences[ morphTargetName ] = 0;
49805
49806                         }
49807
49808                     }
49809
49810                     data.hierarchy[ h ].keys[ k ].morphTargetsInfluences = influences;
49811
49812                 }
49813
49814             }
49815
49816
49817             // remove all keys that are on the same time
49818
49819             for ( var k = 1; k < data.hierarchy[ h ].keys.length; k ++ ) {
49820
49821                 if ( data.hierarchy[ h ].keys[ k ].time === data.hierarchy[ h ].keys[ k - 1 ].time ) {
49822
49823                     data.hierarchy[ h ].keys.splice( k, 1 );
49824                     k --;
49825
49826                 }
49827
49828             }
49829
49830
49831             // set index
49832
49833             for ( var k = 0; k < data.hierarchy[ h ].keys.length; k ++ ) {
49834
49835                 data.hierarchy[ h ].keys[ k ].index = k;
49836
49837             }
49838
49839         }
49840
49841
49842         // JIT
49843
49844         var lengthInFrames = parseInt( data.length * data.fps, 10 );
49845
49846         data.JIT = {};
49847         data.JIT.hierarchy = [];
49848
49849         for( var h = 0; h < data.hierarchy.length; h ++ )
49850             data.JIT.hierarchy.push( new Array( lengthInFrames ) );
49851
49852
49853         // done
49854
49855         data.initialized = true;
49856
49857     };
49858
49859
49860     // interpolation types
49861
49862     that.LINEAR = 0;
49863     that.CATMULLROM = 1;
49864     that.CATMULLROM_FORWARD = 2;
49865
49866     return that;
49867
49868 }());
49869 /**
49870  * @author mikael emtinger / http://gomo.se/
49871  * @author mrdoob / http://mrdoob.com/
49872  * @author alteredq / http://alteredqualia.com/
49873  */
49874
49875 THREE.Animation = function ( root, name, interpolationType ) {
49876
49877     this.root = root;
49878     this.data = THREE.AnimationHandler.get( name );
49879     this.hierarchy = THREE.AnimationHandler.parse( root );
49880
49881     this.currentTime = 0;
49882     this.timeScale = 1;
49883
49884     this.isPlaying = false;
49885     this.isPaused = true;
49886     this.loop = true;
49887
49888     this.interpolationType = interpolationType !== undefined ? interpolationType : THREE.AnimationHandler.LINEAR;
49889
49890     this.points = [];
49891     this.target = new THREE.Vector3();
49892
49893 };
49894
49895 THREE.Animation.prototype.play = function ( loop, startTimeMS ) {
49896
49897     if ( this.isPlaying === false ) {
49898
49899         this.isPlaying = true;
49900         this.loop = loop !== undefined ? loop : true;
49901         this.currentTime = startTimeMS !== undefined ? startTimeMS : 0;
49902
49903         // reset key cache
49904
49905         var h, hl = this.hierarchy.length,
49906             object;
49907
49908         for ( h = 0; h < hl; h ++ ) {
49909
49910             object = this.hierarchy[ h ];
49911
49912             if ( this.interpolationType !== THREE.AnimationHandler.CATMULLROM_FORWARD ) {
49913
49914                 object.useQuaternion = true;
49915
49916             }
49917
49918             object.matrixAutoUpdate = true;
49919
49920             if ( object.animationCache === undefined ) {
49921
49922                 object.animationCache = {};
49923                 object.animationCache.prevKey = { pos: 0, rot: 0, scl: 0 };
49924                 object.animationCache.nextKey = { pos: 0, rot: 0, scl: 0 };
49925                 object.animationCache.originalMatrix = object instanceof THREE.Bone ? object.skinMatrix : object.matrix;
49926
49927             }
49928
49929             var prevKey = object.animationCache.prevKey;
49930             var nextKey = object.animationCache.nextKey;
49931
49932             prevKey.pos = this.data.hierarchy[ h ].keys[ 0 ];
49933             prevKey.rot = this.data.hierarchy[ h ].keys[ 0 ];
49934             prevKey.scl = this.data.hierarchy[ h ].keys[ 0 ];
49935
49936             nextKey.pos = this.getNextKeyWith( "pos", h, 1 );
49937             nextKey.rot = this.getNextKeyWith( "rot", h, 1 );
49938             nextKey.scl = this.getNextKeyWith( "scl", h, 1 );
49939
49940         }
49941
49942         this.update( 0 );
49943
49944     }
49945
49946     this.isPaused = false;
49947
49948     THREE.AnimationHandler.addToUpdate( this );
49949
49950 };
49951
49952
49953 THREE.Animation.prototype.pause = function() {
49954
49955     if ( this.isPaused === true ) {
49956
49957         THREE.AnimationHandler.addToUpdate( this );
49958
49959     } else {
49960
49961         THREE.AnimationHandler.removeFromUpdate( this );
49962
49963     }
49964
49965     this.isPaused = !this.isPaused;
49966
49967 };
49968
49969
49970 THREE.Animation.prototype.stop = function() {
49971
49972     this.isPlaying = false;
49973     this.isPaused  = false;
49974     THREE.AnimationHandler.removeFromUpdate( this );
49975
49976 };
49977
49978
49979 THREE.Animation.prototype.update = function ( deltaTimeMS ) {
49980
49981     // early out
49982
49983     if ( this.isPlaying === false ) return;
49984
49985
49986     // vars
49987
49988     var types = [ "pos", "rot", "scl" ];
49989     var type;
49990     var scale;
49991     var vector;
49992     var prevXYZ, nextXYZ;
49993     var prevKey, nextKey;
49994     var object;
49995     var animationCache;
49996     var frame;
49997     var JIThierarchy = this.data.JIT.hierarchy;
49998     var currentTime, unloopedCurrentTime;
49999     var currentPoint, forwardPoint, angle;
50000
50001
50002     this.currentTime += deltaTimeMS * this.timeScale;
50003
50004     unloopedCurrentTime = this.currentTime;
50005     currentTime = this.currentTime = this.currentTime % this.data.length;
50006     frame = parseInt( Math.min( currentTime * this.data.fps, this.data.length * this.data.fps ), 10 );
50007
50008
50009     for ( var h = 0, hl = this.hierarchy.length; h < hl; h ++ ) {
50010
50011         object = this.hierarchy[ h ];
50012         animationCache = object.animationCache;
50013
50014         // loop through pos/rot/scl
50015
50016         for ( var t = 0; t < 3; t ++ ) {
50017
50018             // get keys
50019
50020             type    = types[ t ];
50021             prevKey = animationCache.prevKey[ type ];
50022             nextKey = animationCache.nextKey[ type ];
50023
50024             // switch keys?
50025
50026             if ( nextKey.time <= unloopedCurrentTime ) {
50027
50028                 // did we loop?
50029
50030                 if ( currentTime < unloopedCurrentTime ) {
50031
50032                     if ( this.loop ) {
50033
50034                         prevKey = this.data.hierarchy[ h ].keys[ 0 ];
50035                         nextKey = this.getNextKeyWith( type, h, 1 );
50036
50037                         while( nextKey.time < currentTime ) {
50038
50039                             prevKey = nextKey;
50040                             nextKey = this.getNextKeyWith( type, h, nextKey.index + 1 );
50041
50042                         }
50043
50044                     } else {
50045
50046                         this.stop();
50047                         return;
50048
50049                     }
50050
50051                 } else {
50052
50053                     do {
50054
50055                         prevKey = nextKey;
50056                         nextKey = this.getNextKeyWith( type, h, nextKey.index + 1 );
50057
50058                     } while( nextKey.time < currentTime )
50059
50060                 }
50061
50062                 animationCache.prevKey[ type ] = prevKey;
50063                 animationCache.nextKey[ type ] = nextKey;
50064
50065             }
50066
50067
50068             object.matrixAutoUpdate = true;
50069             object.matrixWorldNeedsUpdate = true;
50070
50071             scale = ( currentTime - prevKey.time ) / ( nextKey.time - prevKey.time );
50072             prevXYZ = prevKey[ type ];
50073             nextXYZ = nextKey[ type ];
50074
50075
50076             // check scale error
50077
50078             if ( scale < 0 || scale > 1 ) {
50079
50080                 console.log( "THREE.Animation.update: Warning! Scale out of bounds:" + scale + " on bone " + h );
50081                 scale = scale < 0 ? 0 : 1;
50082
50083             }
50084
50085             // interpolate
50086
50087             if ( type === "pos" ) {
50088
50089                 vector = object.position;
50090
50091                 if ( this.interpolationType === THREE.AnimationHandler.LINEAR ) {
50092
50093                     vector.x = prevXYZ[ 0 ] + ( nextXYZ[ 0 ] - prevXYZ[ 0 ] ) * scale;
50094                     vector.y = prevXYZ[ 1 ] + ( nextXYZ[ 1 ] - prevXYZ[ 1 ] ) * scale;
50095                     vector.z = prevXYZ[ 2 ] + ( nextXYZ[ 2 ] - prevXYZ[ 2 ] ) * scale;
50096
50097                 } else if ( this.interpolationType === THREE.AnimationHandler.CATMULLROM ||
50098                             this.interpolationType === THREE.AnimationHandler.CATMULLROM_FORWARD ) {
50099
50100                     this.points[ 0 ] = this.getPrevKeyWith( "pos", h, prevKey.index - 1 )[ "pos" ];
50101                     this.points[ 1 ] = prevXYZ;
50102                     this.points[ 2 ] = nextXYZ;
50103                     this.points[ 3 ] = this.getNextKeyWith( "pos", h, nextKey.index + 1 )[ "pos" ];
50104
50105                     scale = scale * 0.33 + 0.33;
50106
50107                     currentPoint = this.interpolateCatmullRom( this.points, scale );
50108
50109                     vector.x = currentPoint[ 0 ];
50110                     vector.y = currentPoint[ 1 ];
50111                     vector.z = currentPoint[ 2 ];
50112
50113                     if ( this.interpolationType === THREE.AnimationHandler.CATMULLROM_FORWARD ) {
50114
50115                         forwardPoint = this.interpolateCatmullRom( this.points, scale * 1.01 );
50116
50117                         this.target.set( forwardPoint[ 0 ], forwardPoint[ 1 ], forwardPoint[ 2 ] );
50118                         this.target.subSelf( vector );
50119                         this.target.y = 0;
50120                         this.target.normalize();
50121
50122                         angle = Math.atan2( this.target.x, this.target.z );
50123                         object.rotation.set( 0, angle, 0 );
50124
50125                     }
50126
50127                 }
50128
50129             } else if ( type === "rot" ) {
50130
50131                 THREE.Quaternion.slerp( prevXYZ, nextXYZ, object.quaternion, scale );
50132
50133             } else if ( type === "scl" ) {
50134
50135                 vector = object.scale;
50136
50137                 vector.x = prevXYZ[ 0 ] + ( nextXYZ[ 0 ] - prevXYZ[ 0 ] ) * scale;
50138                 vector.y = prevXYZ[ 1 ] + ( nextXYZ[ 1 ] - prevXYZ[ 1 ] ) * scale;
50139                 vector.z = prevXYZ[ 2 ] + ( nextXYZ[ 2 ] - prevXYZ[ 2 ] ) * scale;
50140
50141             }
50142
50143         }
50144
50145     }
50146
50147 };
50148
50149 // Catmull-Rom spline
50150
50151 THREE.Animation.prototype.interpolateCatmullRom = function ( points, scale ) {
50152
50153     var c = [], v3 = [],
50154     point, intPoint, weight, w2, w3,
50155     pa, pb, pc, pd;
50156
50157     point = ( points.length - 1 ) * scale;
50158     intPoint = Math.floor( point );
50159     weight = point - intPoint;
50160
50161     c[ 0 ] = intPoint === 0 ? intPoint : intPoint - 1;
50162     c[ 1 ] = intPoint;
50163     c[ 2 ] = intPoint > points.length - 2 ? intPoint : intPoint + 1;
50164     c[ 3 ] = intPoint > points.length - 3 ? intPoint : intPoint + 2;
50165
50166     pa = points[ c[ 0 ] ];
50167     pb = points[ c[ 1 ] ];
50168     pc = points[ c[ 2 ] ];
50169     pd = points[ c[ 3 ] ];
50170
50171     w2 = weight * weight;
50172     w3 = weight * w2;
50173
50174     v3[ 0 ] = this.interpolate( pa[ 0 ], pb[ 0 ], pc[ 0 ], pd[ 0 ], weight, w2, w3 );
50175     v3[ 1 ] = this.interpolate( pa[ 1 ], pb[ 1 ], pc[ 1 ], pd[ 1 ], weight, w2, w3 );
50176     v3[ 2 ] = this.interpolate( pa[ 2 ], pb[ 2 ], pc[ 2 ], pd[ 2 ], weight, w2, w3 );
50177
50178     return v3;
50179
50180 };
50181
50182 THREE.Animation.prototype.interpolate = function ( p0, p1, p2, p3, t, t2, t3 ) {
50183
50184     var v0 = ( p2 - p0 ) * 0.5,
50185         v1 = ( p3 - p1 ) * 0.5;
50186
50187     return ( 2 * ( p1 - p2 ) + v0 + v1 ) * t3 + ( - 3 * ( p1 - p2 ) - 2 * v0 - v1 ) * t2 + v0 * t + p1;
50188
50189 };
50190
50191
50192
50193 // Get next key with
50194
50195 THREE.Animation.prototype.getNextKeyWith = function ( type, h, key ) {
50196
50197     var keys = this.data.hierarchy[ h ].keys;
50198
50199     if ( this.interpolationType === THREE.AnimationHandler.CATMULLROM ||
50200          this.interpolationType === THREE.AnimationHandler.CATMULLROM_FORWARD ) {
50201
50202         key = key < keys.length - 1 ? key : keys.length - 1;
50203
50204     } else {
50205
50206         key = key % keys.length;
50207
50208     }
50209
50210     for ( ; key < keys.length; key++ ) {
50211
50212         if ( keys[ key ][ type ] !== undefined ) {
50213
50214             return keys[ key ];
50215
50216         }
50217
50218     }
50219
50220     return this.data.hierarchy[ h ].keys[ 0 ];
50221
50222 };
50223
50224 // Get previous key with
50225
50226 THREE.Animation.prototype.getPrevKeyWith = function ( type, h, key ) {
50227
50228     var keys = this.data.hierarchy[ h ].keys;
50229
50230     if ( this.interpolationType === THREE.AnimationHandler.CATMULLROM ||
50231          this.interpolationType === THREE.AnimationHandler.CATMULLROM_FORWARD ) {
50232
50233         key = key > 0 ? key : 0;
50234
50235     } else {
50236
50237         key = key >= 0 ? key : key + keys.length;
50238
50239     }
50240
50241
50242     for ( ; key >= 0; key -- ) {
50243
50244         if ( keys[ key ][ type ] !== undefined ) {
50245
50246             return keys[ key ];
50247
50248         }
50249
50250     }
50251
50252     return this.data.hierarchy[ h ].keys[ keys.length - 1 ];
50253
50254 };
50255 /**
50256  * @author mikael emtinger / http://gomo.se/
50257  * @author mrdoob / http://mrdoob.com/
50258  * @author alteredq / http://alteredqualia.com/
50259  * @author khang duong
50260  * @author erik kitson
50261  */
50262
50263 THREE.KeyFrameAnimation = function( root, data, JITCompile ) {
50264
50265     this.root = root;
50266     this.data = THREE.AnimationHandler.get( data );
50267     this.hierarchy = THREE.AnimationHandler.parse( root );
50268     this.currentTime = 0;
50269     this.timeScale = 0.001;
50270     this.isPlaying = false;
50271     this.isPaused = true;
50272     this.loop = true;
50273     this.JITCompile = JITCompile !== undefined ? JITCompile : true;
50274
50275     // initialize to first keyframes
50276
50277     for ( var h = 0, hl = this.hierarchy.length; h < hl; h++ ) {
50278
50279         var keys = this.data.hierarchy[h].keys,
50280             sids = this.data.hierarchy[h].sids,
50281             obj = this.hierarchy[h];
50282
50283         if ( keys.length && sids ) {
50284
50285             for ( var s = 0; s < sids.length; s++ ) {
50286
50287                 var sid = sids[ s ],
50288                     next = this.getNextKeyWith( sid, h, 0 );
50289
50290                 if ( next ) {
50291
50292                     next.apply( sid );
50293
50294                 }
50295
50296             }
50297
50298             obj.matrixAutoUpdate = false;
50299             this.data.hierarchy[h].node.updateMatrix();
50300             obj.matrixWorldNeedsUpdate = true;
50301
50302         }
50303
50304     }
50305
50306 };
50307
50308 // Play
50309
50310 THREE.KeyFrameAnimation.prototype.play = function( loop, startTimeMS ) {
50311
50312     if( !this.isPlaying ) {
50313
50314         this.isPlaying = true;
50315         this.loop = loop !== undefined ? loop : true;
50316         this.currentTime = startTimeMS !== undefined ? startTimeMS : 0;
50317         this.startTimeMs = startTimeMS;
50318         this.startTime = 10000000;
50319         this.endTime = -this.startTime;
50320
50321
50322         // reset key cache
50323
50324         var h, hl = this.hierarchy.length,
50325             object,
50326             node;
50327
50328         for ( h = 0; h < hl; h++ ) {
50329
50330             object = this.hierarchy[ h ];
50331             node = this.data.hierarchy[ h ];
50332             object.useQuaternion = true;
50333
50334             if ( node.animationCache === undefined ) {
50335
50336                 node.animationCache = {};
50337                 node.animationCache.prevKey = null;
50338                 node.animationCache.nextKey = null;
50339                 node.animationCache.originalMatrix = object instanceof THREE.Bone ? object.skinMatrix : object.matrix;
50340
50341             }
50342
50343             var keys = this.data.hierarchy[h].keys;
50344
50345             if (keys.length) {
50346
50347                 node.animationCache.prevKey = keys[ 0 ];
50348                 node.animationCache.nextKey = keys[ 1 ];
50349
50350                 this.startTime = Math.min( keys[0].time, this.startTime );
50351                 this.endTime = Math.max( keys[keys.length - 1].time, this.endTime );
50352
50353             }
50354
50355         }
50356
50357         this.update( 0 );
50358
50359     }
50360
50361     this.isPaused = false;
50362
50363     THREE.AnimationHandler.addToUpdate( this );
50364
50365 };
50366
50367
50368
50369 // Pause
50370
50371 THREE.KeyFrameAnimation.prototype.pause = function() {
50372
50373     if( this.isPaused ) {
50374
50375         THREE.AnimationHandler.addToUpdate( this );
50376
50377     } else {
50378
50379         THREE.AnimationHandler.removeFromUpdate( this );
50380
50381     }
50382
50383     this.isPaused = !this.isPaused;
50384
50385 };
50386
50387
50388 // Stop
50389
50390 THREE.KeyFrameAnimation.prototype.stop = function() {
50391
50392     this.isPlaying = false;
50393     this.isPaused  = false;
50394     THREE.AnimationHandler.removeFromUpdate( this );
50395
50396
50397     // reset JIT matrix and remove cache
50398
50399     for ( var h = 0; h < this.data.hierarchy.length; h++ ) {
50400
50401         var obj = this.hierarchy[ h ];
50402         var node = this.data.hierarchy[ h ];
50403
50404         if ( node.animationCache !== undefined ) {
50405
50406             var original = node.animationCache.originalMatrix;
50407
50408             if( obj instanceof THREE.Bone ) {
50409
50410                 original.copy( obj.skinMatrix );
50411                 obj.skinMatrix = original;
50412
50413             } else {
50414
50415                 original.copy( obj.matrix );
50416                 obj.matrix = original;
50417
50418             }
50419
50420             delete node.animationCache;
50421
50422         }
50423
50424     }
50425
50426 };
50427
50428
50429 // Update
50430
50431 THREE.KeyFrameAnimation.prototype.update = function( deltaTimeMS ) {
50432
50433     // early out
50434
50435     if( !this.isPlaying ) return;
50436
50437
50438     // vars
50439
50440     var prevKey, nextKey;
50441     var object;
50442     var node;
50443     var frame;
50444     var JIThierarchy = this.data.JIT.hierarchy;
50445     var currentTime, unloopedCurrentTime;
50446     var looped;
50447
50448
50449     // update
50450
50451     this.currentTime += deltaTimeMS * this.timeScale;
50452
50453     unloopedCurrentTime = this.currentTime;
50454     currentTime         = this.currentTime = this.currentTime % this.data.length;
50455
50456     // if looped around, the current time should be based on the startTime
50457     if ( currentTime < this.startTimeMs ) {
50458
50459         currentTime = this.currentTime = this.startTimeMs + currentTime;
50460
50461     }
50462
50463     frame               = parseInt( Math.min( currentTime * this.data.fps, this.data.length * this.data.fps ), 10 );
50464     looped                 = currentTime < unloopedCurrentTime;
50465
50466     if ( looped && !this.loop ) {
50467
50468         // Set the animation to the last keyframes and stop
50469         for ( var h = 0, hl = this.hierarchy.length; h < hl; h++ ) {
50470
50471             var keys = this.data.hierarchy[h].keys,
50472                 sids = this.data.hierarchy[h].sids,
50473                 end = keys.length-1,
50474                 obj = this.hierarchy[h];
50475
50476             if ( keys.length ) {
50477
50478                 for ( var s = 0; s < sids.length; s++ ) {
50479
50480                     var sid = sids[ s ],
50481                         prev = this.getPrevKeyWith( sid, h, end );
50482
50483                     if ( prev ) {
50484                         prev.apply( sid );
50485
50486                     }
50487
50488                 }
50489
50490                 this.data.hierarchy[h].node.updateMatrix();
50491                 obj.matrixWorldNeedsUpdate = true;
50492
50493             }
50494
50495         }
50496
50497         this.stop();
50498         return;
50499
50500     }
50501
50502     // check pre-infinity
50503     if ( currentTime < this.startTime ) {
50504
50505         return;
50506
50507     }
50508
50509     // update
50510
50511     for ( var h = 0, hl = this.hierarchy.length; h < hl; h++ ) {
50512
50513         object = this.hierarchy[ h ];
50514         node = this.data.hierarchy[ h ];
50515
50516         var keys = node.keys,
50517             animationCache = node.animationCache;
50518
50519         // use JIT?
50520
50521         if ( this.JITCompile && JIThierarchy[ h ][ frame ] !== undefined ) {
50522
50523             if( object instanceof THREE.Bone ) {
50524
50525                 object.skinMatrix = JIThierarchy[ h ][ frame ];
50526                 object.matrixWorldNeedsUpdate = false;
50527
50528             } else {
50529
50530                 object.matrix = JIThierarchy[ h ][ frame ];
50531                 object.matrixWorldNeedsUpdate = true;
50532
50533             }
50534
50535         // use interpolation
50536
50537         } else if ( keys.length ) {
50538
50539             // make sure so original matrix and not JIT matrix is set
50540
50541             if ( this.JITCompile && animationCache ) {
50542
50543                 if( object instanceof THREE.Bone ) {
50544
50545                     object.skinMatrix = animationCache.originalMatrix;
50546
50547                 } else {
50548
50549                     object.matrix = animationCache.originalMatrix;
50550
50551                 }
50552
50553             }
50554
50555             prevKey = animationCache.prevKey;
50556             nextKey = animationCache.nextKey;
50557
50558             if ( prevKey && nextKey ) {
50559
50560                 // switch keys?
50561
50562                 if ( nextKey.time <= unloopedCurrentTime ) {
50563
50564                     // did we loop?
50565
50566                     if ( looped && this.loop ) {
50567
50568                         prevKey = keys[ 0 ];
50569                         nextKey = keys[ 1 ];
50570
50571                         while ( nextKey.time < currentTime ) {
50572
50573                             prevKey = nextKey;
50574                             nextKey = keys[ prevKey.index + 1 ];
50575
50576                         }
50577
50578                     } else if ( !looped ) {
50579
50580                         var lastIndex = keys.length - 1;
50581
50582                         while ( nextKey.time < currentTime && nextKey.index !== lastIndex ) {
50583
50584                             prevKey = nextKey;
50585                             nextKey = keys[ prevKey.index + 1 ];
50586
50587                         }
50588
50589                     }
50590
50591                     animationCache.prevKey = prevKey;
50592                     animationCache.nextKey = nextKey;
50593
50594                 }
50595                 if(nextKey.time >= currentTime)
50596                     prevKey.interpolate( nextKey, currentTime );
50597                 else
50598                     prevKey.interpolate( nextKey, nextKey.time);
50599
50600             }
50601
50602             this.data.hierarchy[h].node.updateMatrix();
50603             object.matrixWorldNeedsUpdate = true;
50604
50605         }
50606
50607     }
50608
50609     // update JIT?
50610
50611     if ( this.JITCompile ) {
50612
50613         if ( JIThierarchy[ 0 ][ frame ] === undefined ) {
50614
50615             this.hierarchy[ 0 ].updateMatrixWorld( true );
50616
50617             for ( var h = 0; h < this.hierarchy.length; h++ ) {
50618
50619                 if( this.hierarchy[ h ] instanceof THREE.Bone ) {
50620
50621                     JIThierarchy[ h ][ frame ] = this.hierarchy[ h ].skinMatrix.clone();
50622
50623                 } else {
50624
50625                     JIThierarchy[ h ][ frame ] = this.hierarchy[ h ].matrix.clone();
50626
50627                 }
50628
50629             }
50630
50631         }
50632
50633     }
50634
50635 };
50636
50637 // Get next key with
50638
50639 THREE.KeyFrameAnimation.prototype.getNextKeyWith = function( sid, h, key ) {
50640
50641     var keys = this.data.hierarchy[ h ].keys;
50642     key = key % keys.length;
50643
50644     for ( ; key < keys.length; key++ ) {
50645
50646         if ( keys[ key ].hasTarget( sid ) ) {
50647
50648             return keys[ key ];
50649
50650         }
50651
50652     }
50653
50654     return keys[ 0 ];
50655
50656 };
50657
50658 // Get previous key with
50659
50660 THREE.KeyFrameAnimation.prototype.getPrevKeyWith = function( sid, h, key ) {
50661
50662     var keys = this.data.hierarchy[ h ].keys;
50663     key = key >= 0 ? key : key + keys.length;
50664
50665     for ( ; key >= 0; key-- ) {
50666
50667         if ( keys[ key ].hasTarget( sid ) ) {
50668
50669             return keys[ key ];
50670
50671         }
50672
50673     }
50674
50675     return keys[ keys.length - 1 ];
50676
50677 };
50678 /**
50679  * Camera for rendering cube maps
50680  *    - renders scene into axis-aligned cube
50681  *
50682  * @author alteredq / http://alteredqualia.com/
50683  */
50684
50685 THREE.CubeCamera = function ( near, far, cubeResolution ) {
50686
50687     THREE.Object3D.call( this );
50688
50689     var fov = 90, aspect = 1;
50690
50691     var cameraPX = new THREE.PerspectiveCamera( fov, aspect, near, far );
50692     cameraPX.up.set( 0, -1, 0 );
50693     cameraPX.lookAt( new THREE.Vector3( 1, 0, 0 ) );
50694     this.add( cameraPX );
50695
50696     var cameraNX = new THREE.PerspectiveCamera( fov, aspect, near, far );
50697     cameraNX.up.set( 0, -1, 0 );
50698     cameraNX.lookAt( new THREE.Vector3( -1, 0, 0 ) );
50699     this.add( cameraNX );
50700
50701     var cameraPY = new THREE.PerspectiveCamera( fov, aspect, near, far );
50702     cameraPY.up.set( 0, 0, 1 );
50703     cameraPY.lookAt( new THREE.Vector3( 0, 1, 0 ) );
50704     this.add( cameraPY );
50705
50706     var cameraNY = new THREE.PerspectiveCamera( fov, aspect, near, far );
50707     cameraNY.up.set( 0, 0, -1 );
50708     cameraNY.lookAt( new THREE.Vector3( 0, -1, 0 ) );
50709     this.add( cameraNY );
50710
50711     var cameraPZ = new THREE.PerspectiveCamera( fov, aspect, near, far );
50712     cameraPZ.up.set( 0, -1, 0 );
50713     cameraPZ.lookAt( new THREE.Vector3( 0, 0, 1 ) );
50714     this.add( cameraPZ );
50715
50716     var cameraNZ = new THREE.PerspectiveCamera( fov, aspect, near, far );
50717     cameraNZ.up.set( 0, -1, 0 );
50718     cameraNZ.lookAt( new THREE.Vector3( 0, 0, -1 ) );
50719     this.add( cameraNZ );
50720
50721     this.renderTarget = new THREE.WebGLRenderTargetCube( cubeResolution, cubeResolution, { format: THREE.RGBFormat, magFilter: THREE.LinearFilter, minFilter: THREE.LinearFilter } );
50722
50723     this.updateCubeMap = function ( renderer, scene ) {
50724
50725         var renderTarget = this.renderTarget;
50726         var generateMipmaps = renderTarget.generateMipmaps;
50727
50728         renderTarget.generateMipmaps = false;
50729
50730         renderTarget.activeCubeFace = 0;
50731         renderer.render( scene, cameraPX, renderTarget );
50732
50733         renderTarget.activeCubeFace = 1;
50734         renderer.render( scene, cameraNX, renderTarget );
50735
50736         renderTarget.activeCubeFace = 2;
50737         renderer.render( scene, cameraPY, renderTarget );
50738
50739         renderTarget.activeCubeFace = 3;
50740         renderer.render( scene, cameraNY, renderTarget );
50741
50742         renderTarget.activeCubeFace = 4;
50743         renderer.render( scene, cameraPZ, renderTarget );
50744
50745         renderTarget.generateMipmaps = generateMipmaps;
50746
50747         renderTarget.activeCubeFace = 5;
50748         renderer.render( scene, cameraNZ, renderTarget );
50749
50750     };
50751
50752 };
50753
50754 THREE.CubeCamera.prototype = Object.create( THREE.Object3D.prototype );
50755 /*
50756  *    @author zz85 / http://twitter.com/blurspline / http://www.lab4games.net/zz85/blog
50757  *
50758  *    A general perpose camera, for setting FOV, Lens Focal Length,
50759  *        and switching between perspective and orthographic views easily.
50760  *        Use this only if you do not wish to manage
50761  *        both a Orthographic and Perspective Camera
50762  *
50763  */
50764
50765
50766 THREE.CombinedCamera = function ( width, height, fov, near, far, orthoNear, orthoFar ) {
50767
50768     THREE.Camera.call( this );
50769
50770     this.fov = fov;
50771
50772     this.left = -width / 2;
50773     this.right = width / 2
50774     this.top = height / 2;
50775     this.bottom = -height / 2;
50776
50777     // We could also handle the projectionMatrix internally, but just wanted to test nested camera objects
50778
50779     this.cameraO = new THREE.OrthographicCamera( width / - 2, width / 2, height / 2, height / - 2,     orthoNear, orthoFar );
50780     this.cameraP = new THREE.PerspectiveCamera( fov, width / height, near, far );
50781
50782     this.zoom = 1;
50783
50784     this.toPerspective();
50785
50786     var aspect = width/height;
50787
50788 };
50789
50790 THREE.CombinedCamera.prototype = Object.create( THREE.Camera.prototype );
50791
50792 THREE.CombinedCamera.prototype.toPerspective = function () {
50793
50794     // Switches to the Perspective Camera
50795
50796     this.near = this.cameraP.near;
50797     this.far = this.cameraP.far;
50798
50799     this.cameraP.fov =  this.fov / this.zoom ;
50800
50801     this.cameraP.updateProjectionMatrix();
50802
50803     this.projectionMatrix = this.cameraP.projectionMatrix;
50804
50805     this.inPerspectiveMode = true;
50806     this.inOrthographicMode = false;
50807
50808 };
50809
50810 THREE.CombinedCamera.prototype.toOrthographic = function () {
50811
50812     // Switches to the Orthographic camera estimating viewport from Perspective
50813
50814     var fov = this.fov;
50815     var aspect = this.cameraP.aspect;
50816     var near = this.cameraP.near;
50817     var far = this.cameraP.far;
50818
50819     // The size that we set is the mid plane of the viewing frustum
50820
50821     var hyperfocus = ( near + far ) / 2;
50822
50823     var halfHeight = Math.tan( fov / 2 ) * hyperfocus;
50824     var planeHeight = 2 * halfHeight;
50825     var planeWidth = planeHeight * aspect;
50826     var halfWidth = planeWidth / 2;
50827
50828     halfHeight /= this.zoom;
50829     halfWidth /= this.zoom;
50830
50831     this.cameraO.left = -halfWidth;
50832     this.cameraO.right = halfWidth;
50833     this.cameraO.top = halfHeight;
50834     this.cameraO.bottom = -halfHeight;
50835
50836     // this.cameraO.left = -farHalfWidth;
50837     // this.cameraO.right = farHalfWidth;
50838     // this.cameraO.top = farHalfHeight;
50839     // this.cameraO.bottom = -farHalfHeight;
50840
50841     // this.cameraO.left = this.left / this.zoom;
50842     // this.cameraO.right = this.right / this.zoom;
50843     // this.cameraO.top = this.top / this.zoom;
50844     // this.cameraO.bottom = this.bottom / this.zoom;
50845
50846     this.cameraO.updateProjectionMatrix();
50847
50848     this.near = this.cameraO.near;
50849     this.far = this.cameraO.far;
50850     this.projectionMatrix = this.cameraO.projectionMatrix;
50851
50852     this.inPerspectiveMode = false;
50853     this.inOrthographicMode = true;
50854
50855 };
50856
50857
50858 THREE.CombinedCamera.prototype.setSize = function( width, height ) {
50859
50860     this.cameraP.aspect = width / height;
50861     this.left = -width / 2;
50862     this.right = width / 2
50863     this.top = height / 2;
50864     this.bottom = -height / 2;
50865
50866 };
50867
50868
50869 THREE.CombinedCamera.prototype.setFov = function( fov ) {
50870
50871     this.fov = fov;
50872
50873     if ( this.inPerspectiveMode ) {
50874
50875         this.toPerspective();
50876
50877     } else {
50878
50879         this.toOrthographic();
50880
50881     }
50882
50883 };
50884
50885 // For mantaining similar API with PerspectiveCamera
50886
50887 THREE.CombinedCamera.prototype.updateProjectionMatrix = function() {
50888
50889     if ( this.inPerspectiveMode ) {
50890
50891         this.toPerspective();
50892
50893     } else {
50894
50895         this.toPerspective();
50896         this.toOrthographic();
50897
50898     }
50899
50900 };
50901
50902 /*
50903 * Uses Focal Length (in mm) to estimate and set FOV
50904 * 35mm (fullframe) camera is used if frame size is not specified;
50905 * Formula based on http://www.bobatkins.com/photography/technical/field_of_view.html
50906 */
50907 THREE.CombinedCamera.prototype.setLens = function ( focalLength, frameHeight ) {
50908
50909     if ( frameHeight === undefined ) frameHeight = 24;
50910
50911     var fov = 2 * Math.atan( frameHeight / ( focalLength * 2 ) ) * ( 180 / Math.PI );
50912
50913     this.setFov( fov );
50914
50915     return fov;
50916 };
50917
50918
50919 THREE.CombinedCamera.prototype.setZoom = function( zoom ) {
50920
50921     this.zoom = zoom;
50922
50923     if ( this.inPerspectiveMode ) {
50924
50925         this.toPerspective();
50926
50927     } else {
50928
50929         this.toOrthographic();
50930
50931     }
50932
50933 };
50934
50935 THREE.CombinedCamera.prototype.toFrontView = function() {
50936
50937     this.rotation.x = 0;
50938     this.rotation.y = 0;
50939     this.rotation.z = 0;
50940
50941     // should we be modifing the matrix instead?
50942
50943     this.rotationAutoUpdate = false;
50944
50945 };
50946
50947 THREE.CombinedCamera.prototype.toBackView = function() {
50948
50949     this.rotation.x = 0;
50950     this.rotation.y = Math.PI;
50951     this.rotation.z = 0;
50952     this.rotationAutoUpdate = false;
50953
50954 };
50955
50956 THREE.CombinedCamera.prototype.toLeftView = function() {
50957
50958     this.rotation.x = 0;
50959     this.rotation.y = - Math.PI / 2;
50960     this.rotation.z = 0;
50961     this.rotationAutoUpdate = false;
50962
50963 };
50964
50965 THREE.CombinedCamera.prototype.toRightView = function() {
50966
50967     this.rotation.x = 0;
50968     this.rotation.y = Math.PI / 2;
50969     this.rotation.z = 0;
50970     this.rotationAutoUpdate = false;
50971
50972 };
50973
50974 THREE.CombinedCamera.prototype.toTopView = function() {
50975
50976     this.rotation.x = - Math.PI / 2;
50977     this.rotation.y = 0;
50978     this.rotation.z = 0;
50979     this.rotationAutoUpdate = false;
50980
50981 };
50982
50983 THREE.CombinedCamera.prototype.toBottomView = function() {
50984
50985     this.rotation.x = Math.PI / 2;
50986     this.rotation.y = 0;
50987     this.rotation.z = 0;
50988     this.rotationAutoUpdate = false;
50989
50990 };
50991
50992 /**
50993  * @author mrdoob / http://mrdoob.com/
50994  * @author alteredq / http://alteredqualia.com/
50995  * @author paulirish / http://paulirish.com/
50996  */
50997
50998 THREE.FirstPersonControls = function ( object, domElement ) {
50999
51000     this.object = object;
51001     this.target = new THREE.Vector3( 0, 0, 0 );
51002
51003     this.domElement = ( domElement !== undefined ) ? domElement : document;
51004
51005     this.movementSpeed = 1.0;
51006     this.lookSpeed = 0.005;
51007
51008     this.lookVertical = true;
51009     this.autoForward = false;
51010     // this.invertVertical = false;
51011
51012     this.activeLook = true;
51013
51014     this.heightSpeed = false;
51015     this.heightCoef = 1.0;
51016     this.heightMin = 0.0;
51017     this.heightMax = 1.0;
51018
51019     this.constrainVertical = false;
51020     this.verticalMin = 0;
51021     this.verticalMax = Math.PI;
51022
51023     this.autoSpeedFactor = 0.0;
51024
51025     this.mouseX = 0;
51026     this.mouseY = 0;
51027
51028     this.lat = 0;
51029     this.lon = 0;
51030     this.phi = 0;
51031     this.theta = 0;
51032
51033     this.moveForward = false;
51034     this.moveBackward = false;
51035     this.moveLeft = false;
51036     this.moveRight = false;
51037     this.freeze = false;
51038
51039     this.mouseDragOn = false;
51040
51041     this.viewHalfX = 0;
51042     this.viewHalfY = 0;
51043
51044     if ( this.domElement !== document ) {
51045
51046         this.domElement.setAttribute( 'tabindex', -1 );
51047
51048     }
51049
51050     //
51051
51052     this.handleResize = function () {
51053
51054         if ( this.domElement === document ) {
51055
51056             this.viewHalfX = window.innerWidth / 2;
51057             this.viewHalfY = window.innerHeight / 2;
51058
51059         } else {
51060
51061             this.viewHalfX = this.domElement.offsetWidth / 2;
51062             this.viewHalfY = this.domElement.offsetHeight / 2;
51063
51064         }
51065
51066     };
51067
51068     this.onMouseDown = function ( event ) {
51069
51070         if ( this.domElement !== document ) {
51071
51072             this.domElement.focus();
51073
51074         }
51075
51076         event.preventDefault();
51077         event.stopPropagation();
51078
51079         if ( this.activeLook ) {
51080
51081             switch ( event.button ) {
51082
51083                 case 0: this.moveForward = true; break;
51084                 case 2: this.moveBackward = true; break;
51085
51086             }
51087
51088         }
51089
51090         this.mouseDragOn = true;
51091
51092     };
51093
51094     this.onMouseUp = function ( event ) {
51095
51096         event.preventDefault();
51097         event.stopPropagation();
51098
51099         if ( this.activeLook ) {
51100
51101             switch ( event.button ) {
51102
51103                 case 0: this.moveForward = false; break;
51104                 case 2: this.moveBackward = false; break;
51105
51106             }
51107
51108         }
51109
51110         this.mouseDragOn = false;
51111
51112     };
51113
51114     this.onMouseMove = function ( event ) {
51115
51116         if ( this.domElement === document ) {
51117
51118             this.mouseX = event.pageX - this.viewHalfX;
51119             this.mouseY = event.pageY - this.viewHalfY;
51120
51121         } else {
51122
51123             this.mouseX = event.pageX - this.domElement.offsetLeft - this.viewHalfX;
51124             this.mouseY = event.pageY - this.domElement.offsetTop - this.viewHalfY;
51125
51126         }
51127
51128     };
51129
51130     this.onKeyDown = function ( event ) {
51131
51132         //event.preventDefault();
51133
51134         switch ( event.keyCode ) {
51135
51136             case 38: /*up*/
51137             case 87: /*W*/ this.moveForward = true; break;
51138
51139             case 37: /*left*/
51140             case 65: /*A*/ this.moveLeft = true; break;
51141
51142             case 40: /*down*/
51143             case 83: /*S*/ this.moveBackward = true; break;
51144
51145             case 39: /*right*/
51146             case 68: /*D*/ this.moveRight = true; break;
51147
51148             case 82: /*R*/ this.moveUp = true; break;
51149             case 70: /*F*/ this.moveDown = true; break;
51150
51151             case 81: /*Q*/ this.freeze = !this.freeze; break;
51152
51153         }
51154
51155     };
51156
51157     this.onKeyUp = function ( event ) {
51158
51159         switch( event.keyCode ) {
51160
51161             case 38: /*up*/
51162             case 87: /*W*/ this.moveForward = false; break;
51163
51164             case 37: /*left*/
51165             case 65: /*A*/ this.moveLeft = false; break;
51166
51167             case 40: /*down*/
51168             case 83: /*S*/ this.moveBackward = false; break;
51169
51170             case 39: /*right*/
51171             case 68: /*D*/ this.moveRight = false; break;
51172
51173             case 82: /*R*/ this.moveUp = false; break;
51174             case 70: /*F*/ this.moveDown = false; break;
51175
51176         }
51177
51178     };
51179
51180     this.update = function( delta ) {
51181         var actualMoveSpeed = 0;
51182
51183         if ( this.freeze ) {
51184
51185             return;
51186
51187         } else {
51188
51189             if ( this.heightSpeed ) {
51190
51191                 var y = THREE.Math.clamp( this.object.position.y, this.heightMin, this.heightMax );
51192                 var heightDelta = y - this.heightMin;
51193
51194                 this.autoSpeedFactor = delta * ( heightDelta * this.heightCoef );
51195
51196             } else {
51197
51198                 this.autoSpeedFactor = 0.0;
51199
51200             }
51201
51202             actualMoveSpeed = delta * this.movementSpeed;
51203
51204             if ( this.moveForward || ( this.autoForward && !this.moveBackward ) ) this.object.translateZ( - ( actualMoveSpeed + this.autoSpeedFactor ) );
51205             if ( this.moveBackward ) this.object.translateZ( actualMoveSpeed );
51206
51207             if ( this.moveLeft ) this.object.translateX( - actualMoveSpeed );
51208             if ( this.moveRight ) this.object.translateX( actualMoveSpeed );
51209
51210             if ( this.moveUp ) this.object.translateY( actualMoveSpeed );
51211             if ( this.moveDown ) this.object.translateY( - actualMoveSpeed );
51212
51213             var actualLookSpeed = delta * this.lookSpeed;
51214
51215             if ( !this.activeLook ) {
51216
51217                 actualLookSpeed = 0;
51218
51219             }
51220
51221             this.lon += this.mouseX * actualLookSpeed;
51222             if( this.lookVertical ) this.lat -= this.mouseY * actualLookSpeed; // * this.invertVertical?-1:1;
51223
51224             this.lat = Math.max( - 85, Math.min( 85, this.lat ) );
51225             this.phi = ( 90 - this.lat ) * Math.PI / 180;
51226             this.theta = this.lon * Math.PI / 180;
51227
51228             var targetPosition = this.target,
51229                 position = this.object.position;
51230
51231             targetPosition.x = position.x + 100 * Math.sin( this.phi ) * Math.cos( this.theta );
51232             targetPosition.y = position.y + 100 * Math.cos( this.phi );
51233             targetPosition.z = position.z + 100 * Math.sin( this.phi ) * Math.sin( this.theta );
51234
51235         }
51236
51237         var verticalLookRatio = 1;
51238
51239         if ( this.constrainVertical ) {
51240
51241             verticalLookRatio = Math.PI / ( this.verticalMax - this.verticalMin );
51242
51243         }
51244
51245         this.lon += this.mouseX * actualLookSpeed;
51246         if( this.lookVertical ) this.lat -= this.mouseY * actualLookSpeed * verticalLookRatio;
51247
51248         this.lat = Math.max( - 85, Math.min( 85, this.lat ) );
51249         this.phi = ( 90 - this.lat ) * Math.PI / 180;
51250
51251         this.theta = this.lon * Math.PI / 180;
51252
51253         if ( this.constrainVertical ) {
51254
51255             this.phi = THREE.Math.mapLinear( this.phi, 0, Math.PI, this.verticalMin, this.verticalMax );
51256
51257         }
51258
51259         var targetPosition = this.target,
51260             position = this.object.position;
51261
51262         targetPosition.x = position.x + 100 * Math.sin( this.phi ) * Math.cos( this.theta );
51263         targetPosition.y = position.y + 100 * Math.cos( this.phi );
51264         targetPosition.z = position.z + 100 * Math.sin( this.phi ) * Math.sin( this.theta );
51265
51266         this.object.lookAt( targetPosition );
51267
51268     };
51269
51270
51271     this.domElement.addEventListener( 'contextmenu', function ( event ) { event.preventDefault(); }, false );
51272
51273     this.domElement.addEventListener( 'mousemove', bind( this, this.onMouseMove ), false );
51274     this.domElement.addEventListener( 'mousedown', bind( this, this.onMouseDown ), false );
51275     this.domElement.addEventListener( 'mouseup', bind( this, this.onMouseUp ), false );
51276     this.domElement.addEventListener( 'keydown', bind( this, this.onKeyDown ), false );
51277     this.domElement.addEventListener( 'keyup', bind( this, this.onKeyUp ), false );
51278
51279     function bind( scope, fn ) {
51280
51281         return function () {
51282
51283             fn.apply( scope, arguments );
51284
51285         };
51286
51287     };
51288
51289     this.handleResize();
51290
51291 };
51292 /**
51293  * @author alteredq / http://alteredqualia.com/
51294  */
51295
51296 THREE.PathControls = function ( object, domElement ) {
51297
51298     this.object = object;
51299     this.domElement = ( domElement !== undefined ) ? domElement : document;
51300
51301     this.id = "PathControls" + THREE.PathControlsIdCounter ++;
51302
51303     // API
51304
51305     this.duration = 10 * 1000; // milliseconds
51306     this.waypoints = [];
51307
51308     this.useConstantSpeed = true;
51309     this.resamplingCoef = 50;
51310
51311     this.debugPath = new THREE.Object3D();
51312     this.debugDummy = new THREE.Object3D();
51313
51314     this.animationParent = new THREE.Object3D();
51315
51316     this.lookSpeed = 0.005;
51317     this.lookVertical = true;
51318     this.lookHorizontal = true;
51319     this.verticalAngleMap   = { srcRange: [ 0, 2 * Math.PI ], dstRange: [ 0, 2 * Math.PI ] };
51320     this.horizontalAngleMap = { srcRange: [ 0, 2 * Math.PI ], dstRange: [ 0, 2 * Math.PI ] };
51321
51322     // internals
51323
51324     this.target = new THREE.Object3D();
51325
51326     this.mouseX = 0;
51327     this.mouseY = 0;
51328
51329     this.lat = 0;
51330     this.lon = 0;
51331
51332     this.phi = 0;
51333     this.theta = 0;
51334
51335     var PI2 = Math.PI * 2,
51336         PI180 = Math.PI / 180;
51337
51338     this.viewHalfX = 0;
51339     this.viewHalfY = 0;
51340
51341     if ( this.domElement !== document ) {
51342
51343         this.domElement.setAttribute( 'tabindex', -1 );
51344
51345     }
51346
51347     // methods
51348
51349     this.handleResize = function () {
51350
51351         if ( this.domElement === document ) {
51352
51353             this.viewHalfX = window.innerWidth / 2;
51354             this.viewHalfY = window.innerHeight / 2;
51355
51356         } else {
51357
51358             this.viewHalfX = this.domElement.offsetWidth / 2;
51359             this.viewHalfY = this.domElement.offsetHeight / 2;
51360
51361         }
51362
51363     };
51364
51365     this.update = function ( delta ) {
51366
51367         var srcRange, dstRange;
51368
51369         if( this.lookHorizontal ) this.lon += this.mouseX * this.lookSpeed * delta;
51370         if( this.lookVertical )   this.lat -= this.mouseY * this.lookSpeed * delta;
51371
51372         this.lon = Math.max( 0, Math.min( 360, this.lon ) );
51373         this.lat = Math.max( - 85, Math.min( 85, this.lat ) );
51374
51375         this.phi = ( 90 - this.lat ) * PI180;
51376         this.theta = this.lon * PI180;
51377
51378         this.phi = normalize_angle_rad( this.phi );
51379
51380         // constrain vertical look angle
51381
51382         srcRange = this.verticalAngleMap.srcRange;
51383         dstRange = this.verticalAngleMap.dstRange;
51384
51385         var tmpPhi = THREE.Math.mapLinear( this.phi, srcRange[ 0 ], srcRange[ 1 ], dstRange[ 0 ], dstRange[ 1 ] );
51386         var tmpPhiFullRange = dstRange[ 1 ] - dstRange[ 0 ];
51387         var tmpPhiNormalized = ( tmpPhi - dstRange[ 0 ] ) / tmpPhiFullRange;
51388
51389         this.phi = QuadraticEaseInOut( tmpPhiNormalized ) * tmpPhiFullRange + dstRange[ 0 ];
51390
51391         // constrain horizontal look angle
51392
51393         srcRange = this.horizontalAngleMap.srcRange;
51394         dstRange = this.horizontalAngleMap.dstRange;
51395
51396         var tmpTheta = THREE.Math.mapLinear( this.theta, srcRange[ 0 ], srcRange[ 1 ], dstRange[ 0 ], dstRange[ 1 ] );
51397         var tmpThetaFullRange = dstRange[ 1 ] - dstRange[ 0 ];
51398         var tmpThetaNormalized = ( tmpTheta - dstRange[ 0 ] ) / tmpThetaFullRange;
51399
51400         this.theta = QuadraticEaseInOut( tmpThetaNormalized ) * tmpThetaFullRange + dstRange[ 0 ];
51401
51402         var targetPosition = this.target.position,
51403             position = this.object.position;
51404
51405         targetPosition.x = 100 * Math.sin( this.phi ) * Math.cos( this.theta );
51406         targetPosition.y = 100 * Math.cos( this.phi );
51407         targetPosition.z = 100 * Math.sin( this.phi ) * Math.sin( this.theta );
51408
51409         this.object.lookAt( this.target.position );
51410
51411     };
51412
51413     this.onMouseMove = function ( event ) {
51414
51415         if ( this.domElement === document ) {
51416
51417             this.mouseX = event.pageX - this.viewHalfX;
51418             this.mouseY = event.pageY - this.viewHalfY;
51419
51420         } else {
51421
51422             this.mouseX = event.pageX - this.domElement.offsetLeft - this.viewHalfX;
51423             this.mouseY = event.pageY - this.domElement.offsetTop - this.viewHalfY;
51424
51425         }
51426
51427     };
51428
51429     // utils
51430
51431     function normalize_angle_rad( a ) {
51432
51433         var b = a % PI2;
51434         return b >= 0 ? b : b + PI2;
51435
51436     };
51437
51438     function distance( a, b ) {
51439
51440         var dx = a[ 0 ] - b[ 0 ],
51441             dy = a[ 1 ] - b[ 1 ],
51442             dz = a[ 2 ] - b[ 2 ];
51443
51444         return Math.sqrt( dx * dx + dy * dy + dz * dz );
51445
51446     };
51447
51448     function QuadraticEaseInOut ( k ) {
51449
51450         if ( ( k *= 2 ) < 1 ) return 0.5 * k * k;
51451         return - 0.5 * ( --k * ( k - 2 ) - 1 );
51452
51453     };
51454
51455     function bind( scope, fn ) {
51456
51457         return function () {
51458
51459             fn.apply( scope, arguments );
51460
51461         };
51462
51463     };
51464
51465     function initAnimationPath( parent, spline, name, duration ) {
51466
51467         var animationData = {
51468
51469            name: name,
51470            fps: 0.6,
51471            length: duration,
51472
51473            hierarchy: []
51474
51475         };
51476
51477         var i,
51478             parentAnimation, childAnimation,
51479             path = spline.getControlPointsArray(),
51480             sl = spline.getLength(),
51481             pl = path.length,
51482             t = 0,
51483             first = 0,
51484             last  = pl - 1;
51485
51486         parentAnimation = { parent: -1, keys: [] };
51487         parentAnimation.keys[ first ] = { time: 0,        pos: path[ first ], rot: [ 0, 0, 0, 1 ], scl: [ 1, 1, 1 ] };
51488         parentAnimation.keys[ last  ] = { time: duration, pos: path[ last ],  rot: [ 0, 0, 0, 1 ], scl: [ 1, 1, 1 ] };
51489
51490         for ( i = 1; i < pl - 1; i++ ) {
51491
51492             // real distance (approximation via linear segments)
51493
51494             t = duration * sl.chunks[ i ] / sl.total;
51495
51496             // equal distance
51497
51498             //t = duration * ( i / pl );
51499
51500             // linear distance
51501
51502             //t += duration * distance( path[ i ], path[ i - 1 ] ) / sl.total;
51503
51504             parentAnimation.keys[ i ] = { time: t, pos: path[ i ] };
51505
51506         }
51507
51508         animationData.hierarchy[ 0 ] = parentAnimation;
51509
51510         THREE.AnimationHandler.add( animationData );
51511
51512         return new THREE.Animation( parent, name, THREE.AnimationHandler.CATMULLROM_FORWARD, false );
51513
51514     };
51515
51516
51517     function createSplineGeometry( spline, n_sub ) {
51518
51519         var i, index, position,
51520             geometry = new THREE.Geometry();
51521
51522         for ( i = 0; i < spline.points.length * n_sub; i ++ ) {
51523
51524             index = i / ( spline.points.length * n_sub );
51525             position = spline.getPoint( index );
51526
51527             geometry.vertices[ i ] = new THREE.Vector3( position.x, position.y, position.z );
51528
51529         }
51530
51531         return geometry;
51532
51533     };
51534
51535     function createPath( parent, spline ) {
51536
51537         var lineGeo = createSplineGeometry( spline, 10 ),
51538             particleGeo = createSplineGeometry( spline, 10 ),
51539             lineMat = new THREE.LineBasicMaterial( { color: 0xff0000, linewidth: 3 } ),
51540             lineObj = new THREE.Line( lineGeo, lineMat ),
51541             particleObj = new THREE.ParticleSystem( particleGeo, new THREE.ParticleBasicMaterial( { color: 0xffaa00, size: 3 } ) );
51542
51543         lineObj.scale.set( 1, 1, 1 );
51544         parent.add( lineObj );
51545
51546         particleObj.scale.set( 1, 1, 1 );
51547         parent.add( particleObj );
51548
51549         var waypoint,
51550             geo = new THREE.SphereGeometry( 1, 16, 8 ),
51551             mat = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
51552
51553         for ( var i = 0; i < spline.points.length; i ++ ) {
51554
51555             waypoint = new THREE.Mesh( geo, mat );
51556             waypoint.position.copy( spline.points[ i ] );
51557             parent.add( waypoint );
51558
51559         }
51560
51561     };
51562
51563     this.init = function ( ) {
51564
51565         // constructor
51566
51567         this.spline = new THREE.Spline();
51568         this.spline.initFromArray( this.waypoints );
51569
51570         if ( this.useConstantSpeed ) {
51571
51572             this.spline.reparametrizeByArcLength( this.resamplingCoef );
51573
51574         }
51575
51576         if ( this.createDebugDummy ) {
51577
51578             var dummyParentMaterial = new THREE.MeshLambertMaterial( { color: 0x0077ff } ),
51579             dummyChildMaterial  = new THREE.MeshLambertMaterial( { color: 0x00ff00 } ),
51580             dummyParentGeo = new THREE.CubeGeometry( 10, 10, 20 ),
51581             dummyChildGeo  = new THREE.CubeGeometry( 2, 2, 10 );
51582
51583             this.animationParent = new THREE.Mesh( dummyParentGeo, dummyParentMaterial );
51584
51585             var dummyChild = new THREE.Mesh( dummyChildGeo, dummyChildMaterial );
51586             dummyChild.position.set( 0, 10, 0 );
51587
51588             this.animation = initAnimationPath( this.animationParent, this.spline, this.id, this.duration );
51589
51590             this.animationParent.add( this.object );
51591             this.animationParent.add( this.target );
51592             this.animationParent.add( dummyChild );
51593
51594         } else {
51595
51596             this.animation = initAnimationPath( this.animationParent, this.spline, this.id, this.duration );
51597             this.animationParent.add( this.target );
51598             this.animationParent.add( this.object );
51599
51600         }
51601
51602         if ( this.createDebugPath ) {
51603
51604             createPath( this.debugPath, this.spline );
51605
51606         }
51607
51608         this.domElement.addEventListener( 'mousemove', bind( this, this.onMouseMove ), false );
51609
51610     };
51611
51612     this.handleResize();
51613
51614 };
51615
51616 THREE.PathControlsIdCounter = 0;
51617 /**
51618  * @author James Baicoianu / http://www.baicoianu.com/
51619  */
51620
51621 THREE.FlyControls = function ( object, domElement ) {
51622
51623     this.object = object;
51624
51625     this.domElement = ( domElement !== undefined ) ? domElement : document;
51626     if ( domElement ) this.domElement.setAttribute( 'tabindex', -1 );
51627
51628     // API
51629
51630     this.movementSpeed = 1.0;
51631     this.rollSpeed = 0.005;
51632
51633     this.dragToLook = false;
51634     this.autoForward = false;
51635
51636     // disable default target object behavior
51637
51638     this.object.useQuaternion = true;
51639
51640     // internals
51641
51642     this.tmpQuaternion = new THREE.Quaternion();
51643
51644     this.mouseStatus = 0;
51645
51646     this.moveState = { up: 0, down: 0, left: 0, right: 0, forward: 0, back: 0, pitchUp: 0, pitchDown: 0, yawLeft: 0, yawRight: 0, rollLeft: 0, rollRight: 0 };
51647     this.moveVector = new THREE.Vector3( 0, 0, 0 );
51648     this.rotationVector = new THREE.Vector3( 0, 0, 0 );
51649
51650     this.handleEvent = function ( event ) {
51651
51652         if ( typeof this[ event.type ] == 'function' ) {
51653
51654             this[ event.type ]( event );
51655
51656         }
51657
51658     };
51659
51660     this.keydown = function( event ) {
51661
51662         if ( event.altKey ) {
51663
51664             return;
51665
51666         }
51667
51668         //event.preventDefault();
51669
51670         switch ( event.keyCode ) {
51671
51672             case 16: /* shift */ this.movementSpeedMultiplier = .1; break;
51673
51674             case 87: /*W*/ this.moveState.forward = 1; break;
51675             case 83: /*S*/ this.moveState.back = 1; break;
51676
51677             case 65: /*A*/ this.moveState.left = 1; break;
51678             case 68: /*D*/ this.moveState.right = 1; break;
51679
51680             case 82: /*R*/ this.moveState.up = 1; break;
51681             case 70: /*F*/ this.moveState.down = 1; break;
51682
51683             case 38: /*up*/ this.moveState.pitchUp = 1; break;
51684             case 40: /*down*/ this.moveState.pitchDown = 1; break;
51685
51686             case 37: /*left*/ this.moveState.yawLeft = 1; break;
51687             case 39: /*right*/ this.moveState.yawRight = 1; break;
51688
51689             case 81: /*Q*/ this.moveState.rollLeft = 1; break;
51690             case 69: /*E*/ this.moveState.rollRight = 1; break;
51691
51692         }
51693
51694         this.updateMovementVector();
51695         this.updateRotationVector();
51696
51697     };
51698
51699     this.keyup = function( event ) {
51700
51701         switch( event.keyCode ) {
51702
51703             case 16: /* shift */ this.movementSpeedMultiplier = 1; break;
51704
51705             case 87: /*W*/ this.moveState.forward = 0; break;
51706             case 83: /*S*/ this.moveState.back = 0; break;
51707
51708             case 65: /*A*/ this.moveState.left = 0; break;
51709             case 68: /*D*/ this.moveState.right = 0; break;
51710
51711             case 82: /*R*/ this.moveState.up = 0; break;
51712             case 70: /*F*/ this.moveState.down = 0; break;
51713
51714             case 38: /*up*/ this.moveState.pitchUp = 0; break;
51715             case 40: /*down*/ this.moveState.pitchDown = 0; break;
51716
51717             case 37: /*left*/ this.moveState.yawLeft = 0; break;
51718             case 39: /*right*/ this.moveState.yawRight = 0; break;
51719
51720             case 81: /*Q*/ this.moveState.rollLeft = 0; break;
51721             case 69: /*E*/ this.moveState.rollRight = 0; break;
51722
51723         }
51724
51725         this.updateMovementVector();
51726         this.updateRotationVector();
51727
51728     };
51729
51730     this.mousedown = function( event ) {
51731
51732         if ( this.domElement !== document ) {
51733
51734             this.domElement.focus();
51735
51736         }
51737
51738         event.preventDefault();
51739         event.stopPropagation();
51740
51741         if ( this.dragToLook ) {
51742
51743             this.mouseStatus ++;
51744
51745         } else {
51746
51747             switch ( event.button ) {
51748
51749                 case 0: this.object.moveForward = true; break;
51750                 case 2: this.object.moveBackward = true; break;
51751
51752             }
51753
51754         }
51755
51756     };
51757
51758     this.mousemove = function( event ) {
51759
51760         if ( !this.dragToLook || this.mouseStatus > 0 ) {
51761
51762             var container = this.getContainerDimensions();
51763             var halfWidth  = container.size[ 0 ] / 2;
51764             var halfHeight = container.size[ 1 ] / 2;
51765
51766             this.moveState.yawLeft   = - ( ( event.pageX - container.offset[ 0 ] ) - halfWidth  ) / halfWidth;
51767             this.moveState.pitchDown =   ( ( event.pageY - container.offset[ 1 ] ) - halfHeight ) / halfHeight;
51768
51769             this.updateRotationVector();
51770
51771         }
51772
51773     };
51774
51775     this.mouseup = function( event ) {
51776
51777         event.preventDefault();
51778         event.stopPropagation();
51779
51780         if ( this.dragToLook ) {
51781
51782             this.mouseStatus --;
51783
51784             this.moveState.yawLeft = this.moveState.pitchDown = 0;
51785
51786         } else {
51787
51788             switch ( event.button ) {
51789
51790                 case 0: this.moveForward = false; break;
51791                 case 2: this.moveBackward = false; break;
51792
51793             }
51794
51795         }
51796
51797         this.updateRotationVector();
51798
51799     };
51800
51801     this.update = function( delta ) {
51802
51803         var moveMult = delta * this.movementSpeed;
51804         var rotMult = delta * this.rollSpeed;
51805
51806         this.object.translateX( this.moveVector.x * moveMult );
51807         this.object.translateY( this.moveVector.y * moveMult );
51808         this.object.translateZ( this.moveVector.z * moveMult );
51809
51810         this.tmpQuaternion.set( this.rotationVector.x * rotMult, this.rotationVector.y * rotMult, this.rotationVector.z * rotMult, 1 ).normalize();
51811         this.object.quaternion.multiplySelf( this.tmpQuaternion );
51812
51813         this.object.matrix.setPosition( this.object.position );
51814         this.object.matrix.setRotationFromQuaternion( this.object.quaternion );
51815         this.object.matrixWorldNeedsUpdate = true;
51816
51817
51818     };
51819
51820     this.updateMovementVector = function() {
51821
51822         var forward = ( this.moveState.forward || ( this.autoForward && !this.moveState.back ) ) ? 1 : 0;
51823
51824         this.moveVector.x = ( -this.moveState.left    + this.moveState.right );
51825         this.moveVector.y = ( -this.moveState.down    + this.moveState.up );
51826         this.moveVector.z = ( -forward + this.moveState.back );
51827
51828         //console.log( 'move:', [ this.moveVector.x, this.moveVector.y, this.moveVector.z ] );
51829
51830     };
51831
51832     this.updateRotationVector = function() {
51833
51834         this.rotationVector.x = ( -this.moveState.pitchDown + this.moveState.pitchUp );
51835         this.rotationVector.y = ( -this.moveState.yawRight  + this.moveState.yawLeft );
51836         this.rotationVector.z = ( -this.moveState.rollRight + this.moveState.rollLeft );
51837
51838         //console.log( 'rotate:', [ this.rotationVector.x, this.rotationVector.y, this.rotationVector.z ] );
51839
51840     };
51841
51842     this.getContainerDimensions = function() {
51843
51844         if ( this.domElement != document ) {
51845
51846             return {
51847                 size    : [ this.domElement.offsetWidth, this.domElement.offsetHeight ],
51848                 offset    : [ this.domElement.offsetLeft,  this.domElement.offsetTop ]
51849             };
51850
51851         } else {
51852
51853             return {
51854                 size    : [ window.innerWidth, window.innerHeight ],
51855                 offset    : [ 0, 0 ]
51856             };
51857
51858         }
51859
51860     };
51861
51862     function bind( scope, fn ) {
51863
51864         return function () {
51865
51866             fn.apply( scope, arguments );
51867
51868         };
51869
51870     };
51871
51872     this.domElement.addEventListener( 'mousemove', bind( this, this.mousemove ), false );
51873     this.domElement.addEventListener( 'mousedown', bind( this, this.mousedown ), false );
51874     this.domElement.addEventListener( 'mouseup',   bind( this, this.mouseup ), false );
51875
51876     this.domElement.addEventListener( 'keydown', bind( this, this.keydown ), false );
51877     this.domElement.addEventListener( 'keyup',   bind( this, this.keyup ), false );
51878
51879     this.updateMovementVector();
51880     this.updateRotationVector();
51881
51882 };
51883 /**
51884  * @author mikael emtinger / http://gomo.se/
51885  * @author alteredq / http://alteredqualia.com/
51886  */
51887
51888 THREE.RollControls = function ( object, domElement ) {
51889
51890     this.object = object;
51891     this.domElement = ( domElement !== undefined ) ? domElement : document;
51892
51893     // API
51894
51895     this.mouseLook = true;
51896     this.autoForward = false;
51897
51898     this.lookSpeed = 1;
51899     this.movementSpeed = 1;
51900     this.rollSpeed = 1;
51901
51902     this.constrainVertical = [ -0.9, 0.9 ];
51903
51904     // disable default target object behavior
51905
51906     this.object.matrixAutoUpdate = false;
51907
51908     // internals
51909
51910     this.forward = new THREE.Vector3( 0, 0, 1 );
51911     this.roll = 0;
51912
51913     var xTemp = new THREE.Vector3();
51914     var yTemp = new THREE.Vector3();
51915     var zTemp = new THREE.Vector3();
51916     var rollMatrix = new THREE.Matrix4();
51917
51918     var doRoll = false, rollDirection = 1, forwardSpeed = 0, sideSpeed = 0, upSpeed = 0;
51919
51920     var mouseX = 0, mouseY = 0;
51921
51922     var windowHalfX = 0;
51923     var windowHalfY = 0;
51924
51925     //
51926
51927     this.handleResize = function () {
51928
51929         windowHalfX = window.innerWidth / 2;
51930         windowHalfY = window.innerHeight / 2;
51931
51932     };
51933
51934     // custom update
51935
51936     this.update = function ( delta ) {
51937
51938         if ( this.mouseLook ) {
51939
51940             var actualLookSpeed = delta * this.lookSpeed;
51941
51942             this.rotateHorizontally( actualLookSpeed * mouseX );
51943             this.rotateVertically( actualLookSpeed * mouseY );
51944
51945         }
51946
51947         var actualSpeed = delta * this.movementSpeed;
51948         var forwardOrAuto = ( forwardSpeed > 0 || ( this.autoForward && ! ( forwardSpeed < 0 ) ) ) ? 1 : forwardSpeed;
51949
51950         this.object.translateZ( -actualSpeed * forwardOrAuto );
51951         this.object.translateX( actualSpeed * sideSpeed );
51952         this.object.translateY( actualSpeed * upSpeed );
51953
51954         if( doRoll ) {
51955
51956             this.roll += this.rollSpeed * delta * rollDirection;
51957
51958         }
51959
51960         // cap forward up / down
51961
51962         if( this.forward.y > this.constrainVertical[ 1 ] ) {
51963
51964             this.forward.y = this.constrainVertical[ 1 ];
51965             this.forward.normalize();
51966
51967         } else if( this.forward.y < this.constrainVertical[ 0 ] ) {
51968
51969             this.forward.y = this.constrainVertical[ 0 ];
51970             this.forward.normalize();
51971
51972         }
51973
51974
51975         // construct unrolled camera matrix
51976
51977         zTemp.copy( this.forward );
51978         yTemp.set( 0, 1, 0 );
51979
51980         xTemp.cross( yTemp, zTemp ).normalize();
51981         yTemp.cross( zTemp, xTemp ).normalize();
51982
51983         this.object.matrix.elements[0] = xTemp.x; this.object.matrix.elements[4] = yTemp.x; this.object.matrix.elements[8] = zTemp.x;
51984         this.object.matrix.elements[1] = xTemp.y; this.object.matrix.elements[5] = yTemp.y; this.object.matrix.elements[9] = zTemp.y;
51985         this.object.matrix.elements[2] = xTemp.z; this.object.matrix.elements[6] = yTemp.z; this.object.matrix.elements[10] = zTemp.z;
51986
51987         // calculate roll matrix
51988
51989         rollMatrix.identity();
51990         rollMatrix.elements[0] = Math.cos( this.roll ); rollMatrix.elements[4] = -Math.sin( this.roll );
51991         rollMatrix.elements[1] = Math.sin( this.roll ); rollMatrix.elements[5] =  Math.cos( this.roll );
51992
51993         // multiply camera with roll
51994
51995         this.object.matrix.multiplySelf( rollMatrix );
51996         this.object.matrixWorldNeedsUpdate = true;
51997
51998         // set position
51999
52000         this.object.matrix.elements[12] = this.object.position.x;
52001         this.object.matrix.elements[13] = this.object.position.y;
52002         this.object.matrix.elements[14] = this.object.position.z;
52003
52004
52005     };
52006
52007     this.translateX = function ( distance ) {
52008
52009         this.object.position.x += this.object.matrix.elements[0] * distance;
52010         this.object.position.y += this.object.matrix.elements[1] * distance;
52011         this.object.position.z += this.object.matrix.elements[2] * distance;
52012
52013     };
52014
52015     this.translateY = function ( distance ) {
52016
52017         this.object.position.x += this.object.matrix.elements[4] * distance;
52018         this.object.position.y += this.object.matrix.elements[5] * distance;
52019         this.object.position.z += this.object.matrix.elements[6] * distance;
52020
52021     };
52022
52023     this.translateZ = function ( distance ) {
52024
52025         this.object.position.x -= this.object.matrix.elements[8] * distance;
52026         this.object.position.y -= this.object.matrix.elements[9] * distance;
52027         this.object.position.z -= this.object.matrix.elements[10] * distance;
52028
52029     };
52030
52031
52032     this.rotateHorizontally = function ( amount ) {
52033
52034         // please note that the amount is NOT degrees, but a scale value
52035
52036         xTemp.set( this.object.matrix.elements[0], this.object.matrix.elements[1], this.object.matrix.elements[2] );
52037         xTemp.multiplyScalar( amount );
52038
52039         this.forward.subSelf( xTemp );
52040         this.forward.normalize();
52041
52042     };
52043
52044     this.rotateVertically = function ( amount ) {
52045
52046         // please note that the amount is NOT degrees, but a scale value
52047
52048         yTemp.set( this.object.matrix.elements[4], this.object.matrix.elements[5], this.object.matrix.elements[6] );
52049         yTemp.multiplyScalar( amount );
52050
52051         this.forward.addSelf( yTemp );
52052         this.forward.normalize();
52053
52054     };
52055
52056     function onKeyDown( event ) {
52057
52058         //event.preventDefault();
52059
52060         switch ( event.keyCode ) {
52061
52062             case 38: /*up*/
52063             case 87: /*W*/ forwardSpeed = 1; break;
52064
52065             case 37: /*left*/
52066             case 65: /*A*/ sideSpeed = -1; break;
52067
52068             case 40: /*down*/
52069             case 83: /*S*/ forwardSpeed = -1; break;
52070
52071             case 39: /*right*/
52072             case 68: /*D*/ sideSpeed = 1; break;
52073
52074             case 81: /*Q*/ doRoll = true; rollDirection = 1; break;
52075             case 69: /*E*/ doRoll = true; rollDirection = -1; break;
52076
52077             case 82: /*R*/ upSpeed = 1; break;
52078             case 70: /*F*/ upSpeed = -1; break;
52079
52080         }
52081
52082     };
52083
52084     function onKeyUp( event ) {
52085
52086         switch( event.keyCode ) {
52087
52088             case 38: /*up*/
52089             case 87: /*W*/ forwardSpeed = 0; break;
52090
52091             case 37: /*left*/
52092             case 65: /*A*/ sideSpeed = 0; break;
52093
52094             case 40: /*down*/
52095             case 83: /*S*/ forwardSpeed = 0; break;
52096
52097             case 39: /*right*/
52098             case 68: /*D*/ sideSpeed = 0; break;
52099
52100             case 81: /*Q*/ doRoll = false; break;
52101             case 69: /*E*/ doRoll = false; break;
52102
52103             case 82: /*R*/ upSpeed = 0; break;
52104             case 70: /*F*/ upSpeed = 0; break;
52105
52106         }
52107
52108     };
52109
52110     function onMouseMove( event ) {
52111
52112         mouseX = ( event.clientX - windowHalfX ) / window.innerWidth;
52113         mouseY = ( event.clientY - windowHalfY ) / window.innerHeight;
52114
52115     };
52116
52117     function onMouseDown ( event ) {
52118
52119         event.preventDefault();
52120         event.stopPropagation();
52121
52122         switch ( event.button ) {
52123
52124             case 0: forwardSpeed = 1; break;
52125             case 2: forwardSpeed = -1; break;
52126
52127         }
52128
52129     };
52130
52131     function onMouseUp ( event ) {
52132
52133         event.preventDefault();
52134         event.stopPropagation();
52135
52136         switch ( event.button ) {
52137
52138             case 0: forwardSpeed = 0; break;
52139             case 2: forwardSpeed = 0; break;
52140
52141         }
52142
52143     };
52144
52145     this.domElement.addEventListener( 'contextmenu', function ( event ) { event.preventDefault(); }, false );
52146
52147     this.domElement.addEventListener( 'mousemove', onMouseMove, false );
52148     this.domElement.addEventListener( 'mousedown', onMouseDown, false );
52149     this.domElement.addEventListener( 'mouseup', onMouseUp, false );
52150     this.domElement.addEventListener( 'keydown', onKeyDown, false );
52151     this.domElement.addEventListener( 'keyup', onKeyUp, false );
52152
52153     this.handleResize();
52154
52155 };
52156 /**
52157  * @author Eberhard Graether / http://egraether.com/
52158  */
52159
52160 THREE.TrackballControls = function ( object, domElement ) {
52161
52162     THREE.EventTarget.call( this );
52163
52164     var _this = this,
52165     STATE = { NONE : -1, ROTATE : 0, ZOOM : 1, PAN : 2 };
52166
52167     this.object = object;
52168     this.domElement = ( domElement !== undefined ) ? domElement : document;
52169
52170     // API
52171
52172     this.enabled = true;
52173
52174     this.screen = { width: 0, height: 0, offsetLeft: 0, offsetTop: 0 };
52175     this.radius = ( this.screen.width + this.screen.height ) / 4;
52176
52177     this.rotateSpeed = 1.0;
52178     this.zoomSpeed = 1.2;
52179     this.panSpeed = 0.3;
52180
52181     this.noRotate = false;
52182     this.noZoom = false;
52183     this.noPan = false;
52184
52185     this.staticMoving = false;
52186     this.dynamicDampingFactor = 0.2;
52187
52188     this.minDistance = 0;
52189     this.maxDistance = Infinity;
52190
52191     this.keys = [ 65 /*A*/, 83 /*S*/, 68 /*D*/ ];
52192
52193     // internals
52194
52195     this.target = new THREE.Vector3();
52196
52197     var lastPosition = new THREE.Vector3();
52198
52199     var _keyPressed = false,
52200     _state = STATE.NONE,
52201
52202     _eye = new THREE.Vector3(),
52203
52204     _rotateStart = new THREE.Vector3(),
52205     _rotateEnd = new THREE.Vector3(),
52206
52207     _zoomStart = new THREE.Vector2(),
52208     _zoomEnd = new THREE.Vector2(),
52209
52210     _panStart = new THREE.Vector2(),
52211     _panEnd = new THREE.Vector2();
52212
52213     // events
52214
52215     var changeEvent = { type: 'change' };
52216
52217
52218     // methods
52219
52220     this.handleResize = function () {
52221
52222         this.screen.width = window.innerWidth;
52223         this.screen.height = window.innerHeight;
52224
52225         this.screen.offsetLeft = 0;
52226         this.screen.offsetTop = 0;
52227
52228         this.radius = ( this.screen.width + this.screen.height ) / 4;
52229     };
52230
52231     this.handleEvent = function ( event ) {
52232
52233         if ( typeof this[ event.type ] == 'function' ) {
52234
52235             this[ event.type ]( event );
52236
52237         }
52238
52239     };
52240
52241     this.getMouseOnScreen = function ( clientX, clientY ) {
52242
52243         return new THREE.Vector2(
52244             ( clientX - _this.screen.offsetLeft ) / _this.radius * 0.5,
52245             ( clientY - _this.screen.offsetTop ) / _this.radius * 0.5
52246         );
52247
52248     };
52249
52250     this.getMouseProjectionOnBall = function ( clientX, clientY ) {
52251
52252         var mouseOnBall = new THREE.Vector3(
52253             ( clientX - _this.screen.width * 0.5 - _this.screen.offsetLeft ) / _this.radius,
52254             ( _this.screen.height * 0.5 + _this.screen.offsetTop - clientY ) / _this.radius,
52255             0.0
52256         );
52257
52258         var length = mouseOnBall.length();
52259
52260         if ( length > 1.0 ) {
52261
52262             mouseOnBall.normalize();
52263
52264         } else {
52265
52266             mouseOnBall.z = Math.sqrt( 1.0 - length * length );
52267
52268         }
52269
52270         _eye.copy( _this.object.position ).subSelf( _this.target );
52271
52272         var projection = _this.object.up.clone().setLength( mouseOnBall.y );
52273         projection.addSelf( _this.object.up.clone().crossSelf( _eye ).setLength( mouseOnBall.x ) );
52274         projection.addSelf( _eye.setLength( mouseOnBall.z ) );
52275
52276         return projection;
52277
52278     };
52279
52280     this.rotateCamera = function () {
52281
52282         var angle = Math.acos( _rotateStart.dot( _rotateEnd ) / _rotateStart.length() / _rotateEnd.length() );
52283
52284         if ( angle ) {
52285
52286             var axis = ( new THREE.Vector3() ).cross( _rotateStart, _rotateEnd ).normalize(),
52287                 quaternion = new THREE.Quaternion();
52288
52289             angle *= _this.rotateSpeed;
52290
52291             quaternion.setFromAxisAngle( axis, -angle );
52292
52293             quaternion.multiplyVector3( _eye );
52294             quaternion.multiplyVector3( _this.object.up );
52295
52296             quaternion.multiplyVector3( _rotateEnd );
52297
52298             if ( _this.staticMoving ) {
52299
52300                 _rotateStart.copy( _rotateEnd );
52301
52302             } else {
52303
52304                 quaternion.setFromAxisAngle( axis, angle * ( _this.dynamicDampingFactor - 1.0 ) );
52305                 quaternion.multiplyVector3( _rotateStart );
52306
52307             }
52308
52309         }
52310
52311     };
52312
52313     this.zoomCamera = function () {
52314
52315         var factor = 1.0 + ( _zoomEnd.y - _zoomStart.y ) * _this.zoomSpeed;
52316
52317         if ( factor !== 1.0 && factor > 0.0 ) {
52318
52319             _eye.multiplyScalar( factor );
52320
52321             if ( _this.staticMoving ) {
52322
52323                 _zoomStart.copy( _zoomEnd );
52324
52325             } else {
52326
52327                 _zoomStart.y += ( _zoomEnd.y - _zoomStart.y ) * this.dynamicDampingFactor;
52328
52329             }
52330
52331         }
52332
52333     };
52334
52335     this.panCamera = function () {
52336
52337         var mouseChange = _panEnd.clone().subSelf( _panStart );
52338
52339         if ( mouseChange.lengthSq() ) {
52340
52341             mouseChange.multiplyScalar( _eye.length() * _this.panSpeed );
52342
52343             var pan = _eye.clone().crossSelf( _this.object.up ).setLength( mouseChange.x );
52344             pan.addSelf( _this.object.up.clone().setLength( mouseChange.y ) );
52345
52346             _this.object.position.addSelf( pan );
52347             _this.target.addSelf( pan );
52348
52349             if ( _this.staticMoving ) {
52350
52351                 _panStart = _panEnd;
52352
52353             } else {
52354
52355                 _panStart.addSelf( mouseChange.sub( _panEnd, _panStart ).multiplyScalar( _this.dynamicDampingFactor ) );
52356
52357             }
52358
52359         }
52360
52361     };
52362
52363     this.checkDistances = function () {
52364
52365         if ( !_this.noZoom || !_this.noPan ) {
52366
52367             if ( _this.object.position.lengthSq() > _this.maxDistance * _this.maxDistance ) {
52368
52369                 _this.object.position.setLength( _this.maxDistance );
52370
52371             }
52372
52373             if ( _eye.lengthSq() < _this.minDistance * _this.minDistance ) {
52374
52375                 _this.object.position.add( _this.target, _eye.setLength( _this.minDistance ) );
52376
52377             }
52378
52379         }
52380
52381     };
52382
52383     this.update = function () {
52384
52385         _eye.copy( _this.object.position ).subSelf( _this.target );
52386
52387         if ( !_this.noRotate ) {
52388
52389             _this.rotateCamera();
52390
52391         }
52392
52393         if ( !_this.noZoom ) {
52394
52395             _this.zoomCamera();
52396
52397         }
52398
52399         if ( !_this.noPan ) {
52400
52401             _this.panCamera();
52402
52403         }
52404
52405         _this.object.position.add( _this.target, _eye );
52406
52407         _this.checkDistances();
52408
52409         _this.object.lookAt( _this.target );
52410
52411         if ( lastPosition.distanceToSquared( _this.object.position ) > 0 ) {
52412
52413             _this.dispatchEvent( changeEvent );
52414
52415             lastPosition.copy( _this.object.position );
52416
52417         }
52418
52419     };
52420
52421     // listeners
52422
52423     function keydown( event ) {
52424
52425         if ( ! _this.enabled ) return;
52426
52427         //event.preventDefault();
52428
52429         if ( _state !== STATE.NONE ) {
52430
52431             return;
52432
52433         } else if ( event.keyCode === _this.keys[ STATE.ROTATE ] && !_this.noRotate ) {
52434
52435             _state = STATE.ROTATE;
52436
52437         } else if ( event.keyCode === _this.keys[ STATE.ZOOM ] && !_this.noZoom ) {
52438
52439             _state = STATE.ZOOM;
52440
52441         } else if ( event.keyCode === _this.keys[ STATE.PAN ] && !_this.noPan ) {
52442
52443             _state = STATE.PAN;
52444
52445         }
52446
52447         if ( _state !== STATE.NONE ) {
52448
52449             _keyPressed = true;
52450
52451         }
52452
52453     }
52454
52455     function keyup( event ) {
52456
52457         if ( ! _this.enabled ) return;
52458
52459         if ( _state !== STATE.NONE ) {
52460
52461             _state = STATE.NONE;
52462
52463         }
52464
52465     }
52466
52467     function mousedown( event ) {
52468
52469         if ( ! _this.enabled ) return;
52470
52471         event.preventDefault();
52472         event.stopPropagation();
52473
52474         if ( _state === STATE.NONE ) {
52475
52476             _state = event.button;
52477
52478             if ( _state === STATE.ROTATE && !_this.noRotate ) {
52479
52480                 _rotateStart = _rotateEnd = _this.getMouseProjectionOnBall( event.clientX, event.clientY );
52481
52482             } else if ( _state === STATE.ZOOM && !_this.noZoom ) {
52483
52484                 _zoomStart = _zoomEnd = _this.getMouseOnScreen( event.clientX, event.clientY );
52485
52486             } else if ( !this.noPan ) {
52487
52488                 _panStart = _panEnd = _this.getMouseOnScreen( event.clientX, event.clientY );
52489
52490             }
52491
52492         }
52493
52494     }
52495
52496     function mousemove( event ) {
52497
52498         if ( ! _this.enabled ) return;
52499
52500         if ( _keyPressed ) {
52501
52502             _rotateStart = _rotateEnd = _this.getMouseProjectionOnBall( event.clientX, event.clientY );
52503             _zoomStart = _zoomEnd = _this.getMouseOnScreen( event.clientX, event.clientY );
52504             _panStart = _panEnd = _this.getMouseOnScreen( event.clientX, event.clientY );
52505
52506             _keyPressed = false;
52507
52508         }
52509
52510         if ( _state === STATE.NONE ) {
52511
52512             return;
52513
52514         } else if ( _state === STATE.ROTATE && !_this.noRotate ) {
52515
52516             _rotateEnd = _this.getMouseProjectionOnBall( event.clientX, event.clientY );
52517
52518         } else if ( _state === STATE.ZOOM && !_this.noZoom ) {
52519
52520             _zoomEnd = _this.getMouseOnScreen( event.clientX, event.clientY );
52521
52522         } else if ( _state === STATE.PAN && !_this.noPan ) {
52523
52524             _panEnd = _this.getMouseOnScreen( event.clientX, event.clientY );
52525
52526         }
52527
52528     }
52529
52530     function mouseup( event ) {
52531
52532         if ( ! _this.enabled ) return;
52533
52534         event.preventDefault();
52535         event.stopPropagation();
52536
52537         _state = STATE.NONE;
52538
52539     }
52540
52541     function mousewheel( event ) {
52542
52543         if ( ! _this.enabled ) return;
52544
52545         event.preventDefault();
52546         event.stopPropagation();
52547
52548         var delta = 0;
52549
52550         if ( event.wheelDelta ) { // WebKit / Opera / Explorer 9
52551
52552             delta = event.wheelDelta / 40;
52553
52554         } else if ( event.detail ) { // Firefox
52555
52556             delta = - event.detail / 3;
52557
52558         }
52559
52560         _zoomStart.y += ( 1 / delta ) * 0.05;
52561
52562     }
52563
52564     this.domElement.addEventListener( 'contextmenu', function ( event ) { event.preventDefault(); }, false );
52565
52566     this.domElement.addEventListener( 'mousemove', mousemove, false );
52567     this.domElement.addEventListener( 'mousedown', mousedown, false );
52568     this.domElement.addEventListener( 'mouseup', mouseup, false );
52569     this.domElement.addEventListener( 'DOMMouseScroll', mousewheel, false );
52570     this.domElement.addEventListener( 'mousewheel', mousewheel, false );
52571
52572     window.addEventListener( 'keydown', keydown, false );
52573     window.addEventListener( 'keyup', keyup, false );
52574
52575     this.handleResize();
52576
52577 };
52578 /**
52579  * @author qiao / https://github.com/qiao
52580  * @author mrdoob / http://mrdoob.com
52581  * @author alteredq / http://alteredqualia.com/
52582  */
52583
52584 THREE.OrbitControls = function ( object, domElement ) {
52585
52586     THREE.EventTarget.call( this );
52587
52588     this.object = object;
52589     this.domElement = ( domElement !== undefined ) ? domElement : document;
52590
52591     // API
52592
52593     this.center = new THREE.Vector3();
52594
52595     this.userZoom = true;
52596     this.userZoomSpeed = 1.0;
52597
52598     this.userRotate = true;
52599     this.userRotateSpeed = 1.0;
52600
52601     this.autoRotate = false;
52602     this.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60
52603
52604     // internals
52605
52606     var scope = this;
52607
52608     var EPS = 0.000001;
52609     var PIXELS_PER_ROUND = 1800;
52610
52611     var rotateStart = new THREE.Vector2();
52612     var rotateEnd = new THREE.Vector2();
52613     var rotateDelta = new THREE.Vector2();
52614
52615     var zoomStart = new THREE.Vector2();
52616     var zoomEnd = new THREE.Vector2();
52617     var zoomDelta = new THREE.Vector2();
52618
52619     var phiDelta = 0;
52620     var thetaDelta = 0;
52621     var scale = 1;
52622
52623     var lastPosition = new THREE.Vector3();
52624
52625     var STATE = { NONE : -1, ROTATE : 0, ZOOM : 1 };
52626     var state = STATE.NONE;
52627
52628     // events
52629
52630     var changeEvent = { type: 'change' };
52631
52632
52633     this.rotateLeft = function ( angle ) {
52634
52635         if ( angle === undefined ) {
52636
52637             angle = getAutoRotationAngle();
52638
52639         }
52640
52641         thetaDelta -= angle;
52642
52643     };
52644
52645     this.rotateRight = function ( angle ) {
52646
52647         if ( angle === undefined ) {
52648
52649             angle = getAutoRotationAngle();
52650
52651         }
52652
52653         thetaDelta += angle;
52654
52655     };
52656
52657     this.rotateUp = function ( angle ) {
52658
52659         if ( angle === undefined ) {
52660
52661             angle = getAutoRotationAngle();
52662
52663         }
52664
52665         phiDelta -= angle;
52666
52667     };
52668
52669     this.rotateDown = function ( angle ) {
52670
52671         if ( angle === undefined ) {
52672
52673             angle = getAutoRotationAngle();
52674
52675         }
52676
52677         phiDelta += angle;
52678
52679     };
52680
52681     this.zoomIn = function ( zoomScale ) {
52682
52683         if ( zoomScale === undefined ) {
52684
52685             zoomScale = getZoomScale();
52686
52687         }
52688
52689         scale /= zoomScale;
52690
52691     };
52692
52693     this.zoomOut = function ( zoomScale ) {
52694
52695         if ( zoomScale === undefined ) {
52696
52697             zoomScale = getZoomScale();
52698
52699         }
52700
52701         scale *= zoomScale;
52702
52703     };
52704
52705     this.update = function () {
52706
52707         var position = this.object.position;
52708         var offset = position.clone().subSelf( this.center )
52709
52710         // angle from z-axis around y-axis
52711
52712         var theta = Math.atan2( offset.x, offset.z );
52713
52714         // angle from y-axis
52715
52716         var phi = Math.atan2( Math.sqrt( offset.x * offset.x + offset.z * offset.z ), offset.y );
52717
52718         if ( this.autoRotate ) {
52719
52720             this.rotateLeft( getAutoRotationAngle() );
52721
52722         }
52723
52724         theta += thetaDelta;
52725         phi += phiDelta;
52726
52727         // restrict phi to be betwee EPS and PI-EPS
52728
52729         phi = Math.max( EPS, Math.min( Math.PI - EPS, phi ) );
52730
52731         var radius = offset.length();
52732         offset.x = radius * Math.sin( phi ) * Math.sin( theta );
52733         offset.y = radius * Math.cos( phi );
52734         offset.z = radius * Math.sin( phi ) * Math.cos( theta );
52735         offset.multiplyScalar( scale );
52736
52737         position.copy( this.center ).addSelf( offset );
52738
52739         this.object.lookAt( this.center );
52740
52741         thetaDelta = 0;
52742         phiDelta = 0;
52743         scale = 1;
52744
52745         if ( lastPosition.distanceTo( this.object.position ) > 0 ) {
52746
52747             this.dispatchEvent( changeEvent );
52748
52749             lastPosition.copy( this.object.position );
52750
52751         }
52752
52753     };
52754
52755
52756     function getAutoRotationAngle() {
52757
52758         return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;
52759
52760     }
52761
52762     function getZoomScale() {
52763
52764         return Math.pow( 0.95, scope.userZoomSpeed );
52765
52766     }
52767
52768     function onMouseDown( event ) {
52769
52770         if ( !scope.userRotate ) return;
52771
52772         event.preventDefault();
52773
52774         if ( event.button === 0 || event.button === 2 ) {
52775
52776             state = STATE.ROTATE;
52777
52778             rotateStart.set( event.clientX, event.clientY );
52779
52780         } else if ( event.button === 1 ) {
52781
52782             state = STATE.ZOOM;
52783
52784             zoomStart.set( event.clientX, event.clientY );
52785
52786         }
52787
52788         document.addEventListener( 'mousemove', onMouseMove, false );
52789         document.addEventListener( 'mouseup', onMouseUp, false );
52790
52791     }
52792
52793     function onMouseMove( event ) {
52794
52795         event.preventDefault();
52796
52797         if ( state === STATE.ROTATE ) {
52798
52799             rotateEnd.set( event.clientX, event.clientY );
52800             rotateDelta.sub( rotateEnd, rotateStart );
52801
52802             scope.rotateLeft( 2 * Math.PI * rotateDelta.x / PIXELS_PER_ROUND * scope.userRotateSpeed );
52803             scope.rotateUp( 2 * Math.PI * rotateDelta.y / PIXELS_PER_ROUND * scope.userRotateSpeed );
52804
52805             rotateStart.copy( rotateEnd );
52806
52807         } else if ( state === STATE.ZOOM ) {
52808
52809             zoomEnd.set( event.clientX, event.clientY );
52810             zoomDelta.sub( zoomEnd, zoomStart );
52811
52812             if ( zoomDelta.y > 0 ) {
52813
52814                 scope.zoomIn();
52815
52816             } else {
52817
52818                 scope.zoomOut();
52819
52820             }
52821
52822             zoomStart.copy( zoomEnd );
52823
52824         }
52825
52826     }
52827
52828     function onMouseUp( event ) {
52829
52830         if ( ! scope.userRotate ) return;
52831
52832         document.removeEventListener( 'mousemove', onMouseMove, false );
52833         document.removeEventListener( 'mouseup', onMouseUp, false );
52834
52835         state = STATE.NONE;
52836
52837     }
52838
52839     function onMouseWheel( event ) {
52840
52841         if ( ! scope.userZoom ) return;
52842
52843         if ( event.wheelDelta > 0 ) {
52844
52845             scope.zoomOut();
52846
52847         } else {
52848
52849             scope.zoomIn();
52850
52851         }
52852
52853     }
52854
52855     this.domElement.addEventListener( 'contextmenu', function ( event ) { event.preventDefault(); }, false );
52856     this.domElement.addEventListener( 'mousedown', onMouseDown, false );
52857     this.domElement.addEventListener( 'mousewheel', onMouseWheel, false );
52858
52859 };
52860 /**
52861  * @author hughes
52862  */
52863
52864 THREE.CircleGeometry = function ( radius, segments, thetaStart, thetaLength ) {
52865
52866     THREE.Geometry.call( this );
52867
52868     radius = radius || 50;
52869
52870     thetaStart = thetaStart !== undefined ? thetaStart : 0;
52871     thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;
52872     segments = segments !== undefined ? Math.max( 3, segments ) : 8;
52873
52874     var i, uvs = [],
52875     center = new THREE.Vector3(), centerUV = new THREE.UV( 0.5, 0.5 );
52876
52877     this.vertices.push(center);
52878     uvs.push( centerUV );
52879
52880     for ( i = 0; i <= segments; i ++ ) {
52881
52882         var vertex = new THREE.Vector3();
52883
52884         vertex.x = radius * Math.cos( thetaStart + i / segments * thetaLength );
52885         vertex.y = radius * Math.sin( thetaStart + i / segments * thetaLength );
52886
52887         this.vertices.push( vertex );
52888         uvs.push( new THREE.UV( ( vertex.x / radius + 1 ) / 2, - ( vertex.y / radius + 1 ) / 2 + 1 ) );
52889
52890     }
52891
52892     var n = new THREE.Vector3( 0, 0, -1 );
52893
52894     for ( i = 1; i <= segments; i ++ ) {
52895
52896         var v1 = i;
52897         var v2 = i + 1 ;
52898         var v3 = 0;
52899
52900         this.faces.push( new THREE.Face3( v1, v2, v3, [ n, n, n ] ) );
52901         this.faceVertexUvs[ 0 ].push( [ uvs[ i ], uvs[ i + 1 ], centerUV ] );
52902
52903     }
52904
52905     this.computeCentroids();
52906     this.computeFaceNormals();
52907
52908     this.boundingSphere = { radius: radius };
52909
52910 };
52911
52912 THREE.CircleGeometry.prototype = Object.create( THREE.Geometry.prototype );
52913 /**
52914  * @author mrdoob / http://mrdoob.com/
52915  * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Cube.as
52916  */
52917
52918 THREE.CubeGeometry = function ( width, height, depth, segmentsWidth, segmentsHeight, segmentsDepth, materials, sides ) {
52919
52920     THREE.Geometry.call( this );
52921
52922     var scope = this,
52923     width_half = width / 2,
52924     height_half = height / 2,
52925     depth_half = depth / 2;
52926
52927     var mpx, mpy, mpz, mnx, mny, mnz;
52928
52929     if ( materials !== undefined ) {
52930
52931         if ( materials instanceof Array ) {
52932
52933             this.materials = materials;
52934
52935         } else {
52936
52937             this.materials = [];
52938
52939             for ( var i = 0; i < 6; i ++ ) {
52940
52941                 this.materials.push( materials );
52942
52943             }
52944
52945         }
52946
52947         mpx = 0; mnx = 1; mpy = 2; mny = 3; mpz = 4; mnz = 5;
52948
52949     } else {
52950
52951         this.materials = [];
52952
52953     }
52954
52955     this.sides = { px: true, nx: true, py: true, ny: true, pz: true, nz: true };
52956
52957     if ( sides != undefined ) {
52958
52959         for ( var s in sides ) {
52960
52961             if ( this.sides[ s ] !== undefined ) {
52962
52963                 this.sides[ s ] = sides[ s ];
52964
52965             }
52966
52967         }
52968
52969     }
52970
52971     this.sides.px && buildPlane( 'z', 'y', - 1, - 1, depth, height, width_half, mpx ); // px
52972     this.sides.nx && buildPlane( 'z', 'y',   1, - 1, depth, height, - width_half, mnx ); // nx
52973     this.sides.py && buildPlane( 'x', 'z',   1,   1, width, depth, height_half, mpy ); // py
52974     this.sides.ny && buildPlane( 'x', 'z',   1, - 1, width, depth, - height_half, mny ); // ny
52975     this.sides.pz && buildPlane( 'x', 'y',   1, - 1, width, height, depth_half, mpz ); // pz
52976     this.sides.nz && buildPlane( 'x', 'y', - 1, - 1, width, height, - depth_half, mnz ); // nz
52977
52978     function buildPlane( u, v, udir, vdir, width, height, depth, material ) {
52979
52980         var w, ix, iy,
52981         gridX = segmentsWidth || 1,
52982         gridY = segmentsHeight || 1,
52983         width_half = width / 2,
52984         height_half = height / 2,
52985         offset = scope.vertices.length;
52986
52987         if ( ( u === 'x' && v === 'y' ) || ( u === 'y' && v === 'x' ) ) {
52988
52989             w = 'z';
52990
52991         } else if ( ( u === 'x' && v === 'z' ) || ( u === 'z' && v === 'x' ) ) {
52992
52993             w = 'y';
52994             gridY = segmentsDepth || 1;
52995
52996         } else if ( ( u === 'z' && v === 'y' ) || ( u === 'y' && v === 'z' ) ) {
52997
52998             w = 'x';
52999             gridX = segmentsDepth || 1;
53000
53001         }
53002
53003         var gridX1 = gridX + 1,
53004         gridY1 = gridY + 1,
53005         segment_width = width / gridX,
53006         segment_height = height / gridY,
53007         normal = new THREE.Vector3();
53008
53009         normal[ w ] = depth > 0 ? 1 : - 1;
53010
53011         for ( iy = 0; iy < gridY1; iy ++ ) {
53012
53013             for ( ix = 0; ix < gridX1; ix ++ ) {
53014
53015                 var vector = new THREE.Vector3();
53016                 vector[ u ] = ( ix * segment_width - width_half ) * udir;
53017                 vector[ v ] = ( iy * segment_height - height_half ) * vdir;
53018                 vector[ w ] = depth;
53019
53020                 scope.vertices.push( vector );
53021
53022             }
53023
53024         }
53025
53026         for ( iy = 0; iy < gridY; iy++ ) {
53027
53028             for ( ix = 0; ix < gridX; ix++ ) {
53029
53030                 var a = ix + gridX1 * iy;
53031                 var b = ix + gridX1 * ( iy + 1 );
53032                 var c = ( ix + 1 ) + gridX1 * ( iy + 1 );
53033                 var d = ( ix + 1 ) + gridX1 * iy;
53034
53035                 var face = new THREE.Face4( a + offset, b + offset, c + offset, d + offset );
53036                 face.normal.copy( normal );
53037                 face.vertexNormals.push( normal.clone(), normal.clone(), normal.clone(), normal.clone() );
53038                 face.materialIndex = material;
53039
53040                 scope.faces.push( face );
53041                 scope.faceVertexUvs[ 0 ].push( [
53042                             new THREE.UV( ix / gridX, 1 - iy / gridY ),
53043                             new THREE.UV( ix / gridX, 1 - ( iy + 1 ) / gridY ),
53044                             new THREE.UV( ( ix + 1 ) / gridX, 1- ( iy + 1 ) / gridY ),
53045                             new THREE.UV( ( ix + 1 ) / gridX, 1 - iy / gridY )
53046                         ] );
53047
53048             }
53049
53050         }
53051
53052     }
53053
53054     this.computeCentroids();
53055     this.mergeVertices();
53056
53057 };
53058
53059 THREE.CubeGeometry.prototype = Object.create( THREE.Geometry.prototype );
53060 /**
53061  * @author mrdoob / http://mrdoob.com/
53062  */
53063
53064 THREE.CylinderGeometry = function ( radiusTop, radiusBottom, height, segmentsRadius, segmentsHeight, openEnded ) {
53065
53066     THREE.Geometry.call( this );
53067
53068     radiusTop = radiusTop !== undefined ? radiusTop : 20;
53069     radiusBottom = radiusBottom !== undefined ? radiusBottom : 20;
53070     height = height !== undefined ? height : 100;
53071
53072     var heightHalf = height / 2;
53073     var segmentsX = segmentsRadius || 8;
53074     var segmentsY = segmentsHeight || 1;
53075
53076     var x, y, vertices = [], uvs = [];
53077
53078     for ( y = 0; y <= segmentsY; y ++ ) {
53079
53080         var verticesRow = [];
53081         var uvsRow = [];
53082
53083         var v = y / segmentsY;
53084         var radius = v * ( radiusBottom - radiusTop ) + radiusTop;
53085
53086         for ( x = 0; x <= segmentsX; x ++ ) {
53087
53088             var u = x / segmentsX;
53089
53090             var vertex = new THREE.Vector3();
53091             vertex.x = radius * Math.sin( u * Math.PI * 2 );
53092             vertex.y = - v * height + heightHalf;
53093             vertex.z = radius * Math.cos( u * Math.PI * 2 );
53094
53095             this.vertices.push( vertex );
53096
53097             verticesRow.push( this.vertices.length - 1 );
53098             uvsRow.push( new THREE.UV( u, 1 - v ) );
53099
53100         }
53101
53102         vertices.push( verticesRow );
53103         uvs.push( uvsRow );
53104
53105     }
53106
53107     var tanTheta = ( radiusBottom - radiusTop ) / height;
53108     var na, nb;
53109
53110     for ( x = 0; x < segmentsX; x ++ ) {
53111
53112         if ( radiusTop !== 0 ) {
53113
53114             na = this.vertices[ vertices[ 0 ][ x ] ].clone();
53115             nb = this.vertices[ vertices[ 0 ][ x + 1 ] ].clone();
53116
53117         } else {
53118
53119             na = this.vertices[ vertices[ 1 ][ x ] ].clone();
53120             nb = this.vertices[ vertices[ 1 ][ x + 1 ] ].clone();
53121
53122         }
53123
53124         na.setY( Math.sqrt( na.x * na.x + na.z * na.z ) * tanTheta ).normalize();
53125         nb.setY( Math.sqrt( nb.x * nb.x + nb.z * nb.z ) * tanTheta ).normalize();
53126
53127         for ( y = 0; y < segmentsY; y ++ ) {
53128
53129             var v1 = vertices[ y ][ x ];
53130             var v2 = vertices[ y + 1 ][ x ];
53131             var v3 = vertices[ y + 1 ][ x + 1 ];
53132             var v4 = vertices[ y ][ x + 1 ];
53133
53134             var n1 = na.clone();
53135             var n2 = na.clone();
53136             var n3 = nb.clone();
53137             var n4 = nb.clone();
53138
53139             var uv1 = uvs[ y ][ x ].clone();
53140             var uv2 = uvs[ y + 1 ][ x ].clone();
53141             var uv3 = uvs[ y + 1 ][ x + 1 ].clone();
53142             var uv4 = uvs[ y ][ x + 1 ].clone();
53143
53144             this.faces.push( new THREE.Face4( v1, v2, v3, v4, [ n1, n2, n3, n4 ] ) );
53145             this.faceVertexUvs[ 0 ].push( [ uv1, uv2, uv3, uv4 ] );
53146
53147         }
53148
53149     }
53150
53151     // top cap
53152
53153     if ( !openEnded && radiusTop > 0 ) {
53154
53155         this.vertices.push( new THREE.Vector3( 0, heightHalf, 0 ) );
53156
53157         for ( x = 0; x < segmentsX; x ++ ) {
53158
53159             var v1 = vertices[ 0 ][ x ];
53160             var v2 = vertices[ 0 ][ x + 1 ];
53161             var v3 = this.vertices.length - 1;
53162
53163             var n1 = new THREE.Vector3( 0, 1, 0 );
53164             var n2 = new THREE.Vector3( 0, 1, 0 );
53165             var n3 = new THREE.Vector3( 0, 1, 0 );
53166
53167             var uv1 = uvs[ 0 ][ x ].clone();
53168             var uv2 = uvs[ 0 ][ x + 1 ].clone();
53169             var uv3 = new THREE.UV( uv2.u, 0 );
53170
53171             this.faces.push( new THREE.Face3( v1, v2, v3, [ n1, n2, n3 ] ) );
53172             this.faceVertexUvs[ 0 ].push( [ uv1, uv2, uv3 ] );
53173
53174         }
53175
53176     }
53177
53178     // bottom cap
53179
53180     if ( !openEnded && radiusBottom > 0 ) {
53181
53182         this.vertices.push( new THREE.Vector3( 0, - heightHalf, 0 ) );
53183
53184         for ( x = 0; x < segmentsX; x ++ ) {
53185
53186             var v1 = vertices[ y ][ x + 1 ];
53187             var v2 = vertices[ y ][ x ];
53188             var v3 = this.vertices.length - 1;
53189
53190             var n1 = new THREE.Vector3( 0, - 1, 0 );
53191             var n2 = new THREE.Vector3( 0, - 1, 0 );
53192             var n3 = new THREE.Vector3( 0, - 1, 0 );
53193
53194             var uv1 = uvs[ y ][ x + 1 ].clone();
53195             var uv2 = uvs[ y ][ x ].clone();
53196             var uv3 = new THREE.UV( uv2.u, 1 );
53197
53198             this.faces.push( new THREE.Face3( v1, v2, v3, [ n1, n2, n3 ] ) );
53199             this.faceVertexUvs[ 0 ].push( [ uv1, uv2, uv3 ] );
53200
53201         }
53202
53203     }
53204
53205     this.computeCentroids();
53206     this.computeFaceNormals();
53207
53208 }
53209
53210 THREE.CylinderGeometry.prototype = Object.create( THREE.Geometry.prototype );
53211 /**
53212  * @author zz85 / http://www.lab4games.net/zz85/blog
53213  *
53214  * Creates extruded geometry from a path shape.
53215  *
53216  * parameters = {
53217  *
53218  *  size: <float>, // size of the text
53219  *  height: <float>, // thickness to extrude text
53220  *  curveSegments: <int>, // number of points on the curves
53221  *  steps: <int>, // number of points for z-side extrusions / used for subdividing segements of extrude spline too
53222  *  amount: <int>, // Amount
53223  *
53224  *  bevelEnabled: <bool>, // turn on bevel
53225  *  bevelThickness: <float>, // how deep into text bevel goes
53226  *  bevelSize: <float>, // how far from text outline is bevel
53227  *  bevelSegments: <int>, // number of bevel layers
53228  *
53229  *  extrudePath: <THREE.CurvePath> // 3d spline path to extrude shape along. (creates Frames if .frames aren't defined)
53230  *  frames: <THREE.TubeGeometry.FrenetFrames> // containing arrays of tangents, normals, binormals
53231  *
53232  *  material: <int> // material index for front and back faces
53233  *  extrudeMaterial: <int> // material index for extrusion and beveled faces
53234  *  uvGenerator: <Object> // object that provides UV generator functions
53235  *
53236  * }
53237  **/
53238
53239 THREE.ExtrudeGeometry = function ( shapes, options ) {
53240
53241     if ( typeof( shapes ) === "undefined" ) {
53242         shapes = [];
53243         return;
53244     }
53245
53246     THREE.Geometry.call( this );
53247
53248     shapes = shapes instanceof Array ? shapes : [ shapes ];
53249
53250     this.shapebb = shapes[ shapes.length - 1 ].getBoundingBox();
53251
53252     this.addShapeList( shapes, options );
53253
53254     this.computeCentroids();
53255     this.computeFaceNormals();
53256
53257     // can't really use automatic vertex normals
53258     // as then front and back sides get smoothed too
53259     // should do separate smoothing just for sides
53260
53261     //this.computeVertexNormals();
53262
53263     //console.log( "took", ( Date.now() - startTime ) );
53264
53265 };
53266
53267 THREE.ExtrudeGeometry.prototype = Object.create( THREE.Geometry.prototype );
53268
53269 THREE.ExtrudeGeometry.prototype.addShapeList = function ( shapes, options ) {
53270     var sl = shapes.length;
53271
53272     for ( var s = 0; s < sl; s ++ ) {
53273         var shape = shapes[ s ];
53274         this.addShape( shape, options );
53275     }
53276 };
53277
53278 THREE.ExtrudeGeometry.prototype.addShape = function ( shape, options ) {
53279
53280     var amount = options.amount !== undefined ? options.amount : 100;
53281
53282     var bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; // 10
53283     var bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; // 8
53284     var bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;
53285
53286     var bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; // false
53287
53288     var curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;
53289
53290     var steps = options.steps !== undefined ? options.steps : 1;
53291
53292     var extrudePath = options.extrudePath;
53293     var extrudePts, extrudeByPath = false;
53294
53295     var material = options.material;
53296     var extrudeMaterial = options.extrudeMaterial;
53297
53298     // Use default WorldUVGenerator if no UV generators are specified.
53299     var uvgen = options.UVGenerator !== undefined ? options.UVGenerator : THREE.ExtrudeGeometry.WorldUVGenerator;
53300
53301     var shapebb = this.shapebb;
53302     //shapebb = shape.getBoundingBox();
53303
53304
53305
53306     var splineTube, binormal, normal, position2;
53307     if ( extrudePath ) {
53308
53309         extrudePts = extrudePath.getSpacedPoints( steps );
53310
53311         extrudeByPath = true;
53312         bevelEnabled = false; // bevels not supported for path extrusion
53313
53314         // SETUP TNB variables
53315
53316         // Reuse TNB from TubeGeomtry for now.
53317         // TODO1 - have a .isClosed in spline?
53318
53319         splineTube = options.frames !== undefined ? options.frames : new THREE.TubeGeometry.FrenetFrames(extrudePath, steps, false);
53320
53321         // console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);
53322
53323         binormal = new THREE.Vector3();
53324         normal = new THREE.Vector3();
53325         position2 = new THREE.Vector3();
53326
53327     }
53328
53329     // Safeguards if bevels are not enabled
53330
53331     if ( ! bevelEnabled ) {
53332
53333         bevelSegments = 0;
53334         bevelThickness = 0;
53335         bevelSize = 0;
53336
53337     }
53338
53339     // Variables initalization
53340
53341     var ahole, h, hl; // looping of holes
53342     var scope = this;
53343     var bevelPoints = [];
53344
53345     var shapesOffset = this.vertices.length;
53346
53347     var shapePoints = shape.extractPoints();
53348
53349     var vertices = shapePoints.shape;
53350     var holes = shapePoints.holes;
53351
53352     var reverse = !THREE.Shape.Utils.isClockWise( vertices ) ;
53353
53354     if ( reverse ) {
53355
53356         vertices = vertices.reverse();
53357
53358         // Maybe we should also check if holes are in the opposite direction, just to be safe ...
53359
53360         for ( h = 0, hl = holes.length; h < hl; h ++ ) {
53361
53362             ahole = holes[ h ];
53363
53364             if ( THREE.Shape.Utils.isClockWise( ahole ) ) {
53365
53366                 holes[ h ] = ahole.reverse();
53367
53368             }
53369
53370         }
53371
53372         reverse = false; // If vertices are in order now, we shouldn't need to worry about them again (hopefully)!
53373
53374     }
53375
53376
53377     var faces = THREE.Shape.Utils.triangulateShape ( vertices, holes );
53378
53379     /* Vertices */
53380
53381     var contour = vertices; // vertices has all points but contour has only points of circumference
53382
53383     for ( h = 0, hl = holes.length;  h < hl; h ++ ) {
53384
53385         ahole = holes[ h ];
53386
53387         vertices = vertices.concat( ahole );
53388
53389     }
53390
53391
53392     function scalePt2 ( pt, vec, size ) {
53393
53394         if ( !vec ) console.log( "die" );
53395
53396         return vec.clone().multiplyScalar( size ).addSelf( pt );
53397
53398     }
53399
53400     var b, bs, t, z,
53401         vert, vlen = vertices.length,
53402         face, flen = faces.length,
53403         cont, clen = contour.length;
53404
53405
53406     // Find directions for point movement
53407
53408     var RAD_TO_DEGREES = 180 / Math.PI;
53409
53410
53411     function getBevelVec( pt_i, pt_j, pt_k ) {
53412
53413         // Algorithm 2
53414
53415         return getBevelVec2( pt_i, pt_j, pt_k );
53416
53417     }
53418
53419     function getBevelVec1( pt_i, pt_j, pt_k ) {
53420
53421         var anglea = Math.atan2( pt_j.y - pt_i.y, pt_j.x - pt_i.x );
53422         var angleb = Math.atan2( pt_k.y - pt_i.y, pt_k.x - pt_i.x );
53423
53424         if ( anglea > angleb ) {
53425
53426             angleb += Math.PI * 2;
53427
53428         }
53429
53430         var anglec = ( anglea + angleb ) / 2;
53431
53432
53433         //console.log('angle1', anglea * RAD_TO_DEGREES,'angle2', angleb * RAD_TO_DEGREES, 'anglec', anglec *RAD_TO_DEGREES);
53434
53435         var x = - Math.cos( anglec );
53436         var y = - Math.sin( anglec );
53437
53438         var vec = new THREE.Vector2( x, y ); //.normalize();
53439
53440         return vec;
53441
53442     }
53443
53444     function getBevelVec2( pt_i, pt_j, pt_k ) {
53445
53446         var a = THREE.ExtrudeGeometry.__v1,
53447             b = THREE.ExtrudeGeometry.__v2,
53448             v_hat = THREE.ExtrudeGeometry.__v3,
53449             w_hat = THREE.ExtrudeGeometry.__v4,
53450             p = THREE.ExtrudeGeometry.__v5,
53451             q = THREE.ExtrudeGeometry.__v6,
53452             v, w,
53453             v_dot_w_hat, q_sub_p_dot_w_hat,
53454             s, intersection;
53455
53456         // good reading for line-line intersection
53457         // http://sputsoft.com/blog/2010/03/line-line-intersection.html
53458
53459         // define a as vector j->i
53460         // define b as vectot k->i
53461
53462         a.set( pt_i.x - pt_j.x, pt_i.y - pt_j.y );
53463         b.set( pt_i.x - pt_k.x, pt_i.y - pt_k.y );
53464
53465         // get unit vectors
53466
53467         v = a.normalize();
53468         w = b.normalize();
53469
53470         // normals from pt i
53471
53472         v_hat.set( -v.y, v.x );
53473         w_hat.set( w.y, -w.x );
53474
53475         // pts from i
53476
53477         p.copy( pt_i ).addSelf( v_hat );
53478         q.copy( pt_i ).addSelf( w_hat );
53479
53480         if ( p.equals( q ) ) {
53481
53482             //console.log("Warning: lines are straight");
53483             return w_hat.clone();
53484
53485         }
53486
53487         // Points from j, k. helps prevents points cross overover most of the time
53488
53489         p.copy( pt_j ).addSelf( v_hat );
53490         q.copy( pt_k ).addSelf( w_hat );
53491
53492         v_dot_w_hat = v.dot( w_hat );
53493         q_sub_p_dot_w_hat = q.subSelf( p ).dot( w_hat );
53494
53495         // We should not reach these conditions
53496
53497         if ( v_dot_w_hat === 0 ) {
53498
53499             console.log( "Either infinite or no solutions!" );
53500
53501             if ( q_sub_p_dot_w_hat === 0 ) {
53502
53503                 console.log( "Its finite solutions." );
53504
53505             } else {
53506
53507                 console.log( "Too bad, no solutions." );
53508
53509             }
53510
53511         }
53512
53513         s = q_sub_p_dot_w_hat / v_dot_w_hat;
53514
53515         if ( s < 0 ) {
53516
53517             // in case of emergecy, revert to algorithm 1.
53518
53519             return getBevelVec1( pt_i, pt_j, pt_k );
53520
53521         }
53522
53523         intersection = v.multiplyScalar( s ).addSelf( p );
53524
53525         return intersection.subSelf( pt_i ).clone(); // Don't normalize!, otherwise sharp corners become ugly
53526
53527     }
53528
53529     var contourMovements = [];
53530
53531     for ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {
53532
53533         if ( j === il ) j = 0;
53534         if ( k === il ) k = 0;
53535
53536         //  (j)---(i)---(k)
53537         // console.log('i,j,k', i, j , k)
53538
53539         var pt_i = contour[ i ];
53540         var pt_j = contour[ j ];
53541         var pt_k = contour[ k ];
53542
53543         contourMovements[ i ]= getBevelVec( contour[ i ], contour[ j ], contour[ k ] );
53544
53545     }
53546
53547     var holesMovements = [], oneHoleMovements, verticesMovements = contourMovements.concat();
53548
53549     for ( h = 0, hl = holes.length; h < hl; h ++ ) {
53550
53551         ahole = holes[ h ];
53552
53553         oneHoleMovements = [];
53554
53555         for ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {
53556
53557             if ( j === il ) j = 0;
53558             if ( k === il ) k = 0;
53559
53560             //  (j)---(i)---(k)
53561             oneHoleMovements[ i ]= getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );
53562
53563         }
53564
53565         holesMovements.push( oneHoleMovements );
53566         verticesMovements = verticesMovements.concat( oneHoleMovements );
53567
53568     }
53569
53570
53571     // Loop bevelSegments, 1 for the front, 1 for the back
53572
53573     for ( b = 0; b < bevelSegments; b ++ ) {
53574     //for ( b = bevelSegments; b > 0; b -- ) {
53575
53576         t = b / bevelSegments;
53577         z = bevelThickness * ( 1 - t );
53578
53579         //z = bevelThickness * t;
53580         bs = bevelSize * ( Math.sin ( t * Math.PI/2 ) ) ; // curved
53581         //bs = bevelSize * t ; // linear
53582
53583         // contract shape
53584
53585         for ( i = 0, il = contour.length; i < il; i ++ ) {
53586
53587             vert = scalePt2( contour[ i ], contourMovements[ i ], bs );
53588             //vert = scalePt( contour[ i ], contourCentroid, bs, false );
53589             v( vert.x, vert.y,  - z );
53590
53591         }
53592
53593         // expand holes
53594
53595         for ( h = 0, hl = holes.length; h < hl; h++ ) {
53596
53597             ahole = holes[ h ];
53598             oneHoleMovements = holesMovements[ h ];
53599
53600             for ( i = 0, il = ahole.length; i < il; i++ ) {
53601
53602                 vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );
53603                 //vert = scalePt( ahole[ i ], holesCentroids[ h ], bs, true );
53604
53605                 v( vert.x, vert.y,  -z );
53606
53607             }
53608
53609         }
53610
53611     }
53612
53613     bs = bevelSize;
53614
53615     // Back facing vertices
53616
53617     for ( i = 0; i < vlen; i ++ ) {
53618
53619         vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];
53620
53621         if ( !extrudeByPath ) {
53622
53623             v( vert.x, vert.y, 0 );
53624
53625         } else {
53626
53627             // v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );
53628
53629             normal.copy( splineTube.normals[0] ).multiplyScalar(vert.x);
53630             binormal.copy( splineTube.binormals[0] ).multiplyScalar(vert.y);
53631
53632             position2.copy( extrudePts[0] ).addSelf(normal).addSelf(binormal);
53633
53634             v( position2.x, position2.y, position2.z );
53635
53636         }
53637
53638     }
53639
53640     // Add stepped vertices...
53641     // Including front facing vertices
53642
53643     var s;
53644
53645     for ( s = 1; s <= steps; s ++ ) {
53646
53647         for ( i = 0; i < vlen; i ++ ) {
53648
53649             vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];
53650
53651             if ( !extrudeByPath ) {
53652
53653                 v( vert.x, vert.y, amount / steps * s );
53654
53655             } else {
53656
53657                 // v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );
53658
53659                 normal.copy( splineTube.normals[s] ).multiplyScalar( vert.x );
53660                 binormal.copy( splineTube.binormals[s] ).multiplyScalar( vert.y );
53661
53662                 position2.copy( extrudePts[s] ).addSelf( normal ).addSelf( binormal );
53663
53664                 v( position2.x, position2.y, position2.z );
53665
53666             }
53667
53668         }
53669
53670     }
53671
53672
53673     // Add bevel segments planes
53674
53675     //for ( b = 1; b <= bevelSegments; b ++ ) {
53676     for ( b = bevelSegments - 1; b >= 0; b -- ) {
53677
53678         t = b / bevelSegments;
53679         z = bevelThickness * ( 1 - t );
53680         //bs = bevelSize * ( 1-Math.sin ( ( 1 - t ) * Math.PI/2 ) );
53681         bs = bevelSize * Math.sin ( t * Math.PI/2 ) ;
53682
53683         // contract shape
53684
53685         for ( i = 0, il = contour.length; i < il; i ++ ) {
53686
53687             vert = scalePt2( contour[ i ], contourMovements[ i ], bs );
53688             v( vert.x, vert.y,  amount + z );
53689
53690         }
53691
53692         // expand holes
53693
53694         for ( h = 0, hl = holes.length; h < hl; h ++ ) {
53695
53696             ahole = holes[ h ];
53697             oneHoleMovements = holesMovements[ h ];
53698
53699             for ( i = 0, il = ahole.length; i < il; i ++ ) {
53700
53701                 vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );
53702
53703                 if ( !extrudeByPath ) {
53704
53705                     v( vert.x, vert.y,  amount + z );
53706
53707                 } else {
53708
53709                     v( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );
53710
53711                 }
53712
53713             }
53714
53715         }
53716
53717     }
53718
53719     /* Faces */
53720
53721     // Top and bottom faces
53722
53723     buildLidFaces();
53724
53725     // Sides faces
53726
53727     buildSideFaces();
53728
53729
53730     /////  Internal functions
53731
53732     function buildLidFaces() {
53733
53734         if ( bevelEnabled ) {
53735
53736             var layer = 0 ; // steps + 1
53737             var offset = vlen * layer;
53738
53739             // Bottom faces
53740
53741             for ( i = 0; i < flen; i ++ ) {
53742
53743                 face = faces[ i ];
53744                 f3( face[ 2 ]+ offset, face[ 1 ]+ offset, face[ 0 ] + offset, true );
53745
53746             }
53747
53748             layer = steps + bevelSegments * 2;
53749             offset = vlen * layer;
53750
53751             // Top faces
53752
53753             for ( i = 0; i < flen; i ++ ) {
53754
53755                 face = faces[ i ];
53756                 f3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset, false );
53757
53758             }
53759
53760         } else {
53761
53762             // Bottom faces
53763
53764             for ( i = 0; i < flen; i++ ) {
53765
53766                 face = faces[ i ];
53767                 f3( face[ 2 ], face[ 1 ], face[ 0 ], true );
53768
53769             }
53770
53771             // Top faces
53772
53773             for ( i = 0; i < flen; i ++ ) {
53774
53775                 face = faces[ i ];
53776                 f3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps, false );
53777
53778             }
53779         }
53780
53781     }
53782
53783     // Create faces for the z-sides of the shape
53784
53785     function buildSideFaces() {
53786
53787         var layeroffset = 0;
53788         sidewalls( contour, layeroffset );
53789         layeroffset += contour.length;
53790
53791         for ( h = 0, hl = holes.length;  h < hl; h ++ ) {
53792
53793             ahole = holes[ h ];
53794             sidewalls( ahole, layeroffset );
53795
53796             //, true
53797             layeroffset += ahole.length;
53798
53799         }
53800
53801     }
53802
53803     function sidewalls( contour, layeroffset ) {
53804
53805         var j, k;
53806         i = contour.length;
53807
53808         while ( --i >= 0 ) {
53809
53810             j = i;
53811             k = i - 1;
53812             if ( k < 0 ) k = contour.length - 1;
53813
53814             //console.log('b', i,j, i-1, k,vertices.length);
53815
53816             var s = 0, sl = steps  + bevelSegments * 2;
53817
53818             for ( s = 0; s < sl; s ++ ) {
53819
53820                 var slen1 = vlen * s;
53821                 var slen2 = vlen * ( s + 1 );
53822
53823                 var a = layeroffset + j + slen1,
53824                     b = layeroffset + k + slen1,
53825                     c = layeroffset + k + slen2,
53826                     d = layeroffset + j + slen2;
53827
53828                 f4( a, b, c, d, contour, s, sl, j, k );
53829
53830             }
53831         }
53832
53833     }
53834
53835
53836     function v( x, y, z ) {
53837
53838         scope.vertices.push( new THREE.Vector3( x, y, z ) );
53839
53840     }
53841
53842     function f3( a, b, c, isBottom ) {
53843
53844         a += shapesOffset;
53845         b += shapesOffset;
53846         c += shapesOffset;
53847
53848         // normal, color, material
53849         scope.faces.push( new THREE.Face3( a, b, c, null, null, material ) );
53850
53851         var uvs = isBottom ? uvgen.generateBottomUV( scope, shape, options, a, b, c ) : uvgen.generateTopUV( scope, shape, options, a, b, c );
53852
53853          scope.faceVertexUvs[ 0 ].push( uvs );
53854
53855     }
53856
53857     function f4( a, b, c, d, wallContour, stepIndex, stepsLength, contourIndex1, contourIndex2 ) {
53858
53859         a += shapesOffset;
53860         b += shapesOffset;
53861         c += shapesOffset;
53862         d += shapesOffset;
53863
53864          scope.faces.push( new THREE.Face4( a, b, c, d, null, null, extrudeMaterial ) );
53865
53866          var uvs = uvgen.generateSideWallUV( scope, shape, wallContour, options, a, b, c, d,
53867                                              stepIndex, stepsLength, contourIndex1, contourIndex2 );
53868          scope.faceVertexUvs[ 0 ].push( uvs );
53869
53870     }
53871
53872 };
53873
53874 THREE.ExtrudeGeometry.WorldUVGenerator = {
53875
53876     generateTopUV: function( geometry, extrudedShape, extrudeOptions, indexA, indexB, indexC ) {
53877         var ax = geometry.vertices[ indexA ].x,
53878             ay = geometry.vertices[ indexA ].y,
53879
53880             bx = geometry.vertices[ indexB ].x,
53881             by = geometry.vertices[ indexB ].y,
53882
53883             cx = geometry.vertices[ indexC ].x,
53884             cy = geometry.vertices[ indexC ].y;
53885
53886         return [
53887             new THREE.UV( ax, ay ),
53888             new THREE.UV( bx, by ),
53889             new THREE.UV( cx, cy )
53890         ];
53891
53892     },
53893
53894     generateBottomUV: function( geometry, extrudedShape, extrudeOptions, indexA, indexB, indexC ) {
53895
53896         return this.generateTopUV( geometry, extrudedShape, extrudeOptions, indexA, indexB, indexC );
53897
53898     },
53899
53900     generateSideWallUV: function( geometry, extrudedShape, wallContour, extrudeOptions,
53901                                   indexA, indexB, indexC, indexD, stepIndex, stepsLength,
53902                                   contourIndex1, contourIndex2 ) {
53903
53904         var ax = geometry.vertices[ indexA ].x,
53905             ay = geometry.vertices[ indexA ].y,
53906             az = geometry.vertices[ indexA ].z,
53907
53908             bx = geometry.vertices[ indexB ].x,
53909             by = geometry.vertices[ indexB ].y,
53910             bz = geometry.vertices[ indexB ].z,
53911
53912             cx = geometry.vertices[ indexC ].x,
53913             cy = geometry.vertices[ indexC ].y,
53914             cz = geometry.vertices[ indexC ].z,
53915
53916             dx = geometry.vertices[ indexD ].x,
53917             dy = geometry.vertices[ indexD ].y,
53918             dz = geometry.vertices[ indexD ].z;
53919
53920         if ( Math.abs( ay - by ) < 0.01 ) {
53921             return [
53922                 new THREE.UV( ax, 1 - az ),
53923                 new THREE.UV( bx, 1 - bz ),
53924                 new THREE.UV( cx, 1 - cz ),
53925                 new THREE.UV( dx, 1 - dz )
53926             ];
53927         } else {
53928             return [
53929                 new THREE.UV( ay, 1 - az ),
53930                 new THREE.UV( by, 1 - bz ),
53931                 new THREE.UV( cy, 1 - cz ),
53932                 new THREE.UV( dy, 1 - dz )
53933             ];
53934         }
53935     }
53936 };
53937
53938 THREE.ExtrudeGeometry.__v1 = new THREE.Vector2();
53939 THREE.ExtrudeGeometry.__v2 = new THREE.Vector2();
53940 THREE.ExtrudeGeometry.__v3 = new THREE.Vector2();
53941 THREE.ExtrudeGeometry.__v4 = new THREE.Vector2();
53942 THREE.ExtrudeGeometry.__v5 = new THREE.Vector2();
53943 THREE.ExtrudeGeometry.__v6 = new THREE.Vector2();
53944 /**
53945  * @author jonobr1 / http://jonobr1.com
53946  *
53947  * Creates a one-sided polygonal geometry from a path shape. Similar to
53948  * ExtrudeGeometry.
53949  *
53950  * parameters = {
53951  *
53952  *    curveSegments: <int>, // number of points on the curves. NOT USED AT THE MOMENT.
53953  *
53954  *    material: <int> // material index for front and back faces
53955  *    uvGenerator: <Object> // object that provides UV generator functions
53956  *
53957  * }
53958  **/
53959
53960 THREE.ShapeGeometry = function ( shapes, options ) {
53961
53962     THREE.Geometry.call( this );
53963
53964     if ( shapes instanceof Array === false ) shapes = [ shapes ];
53965
53966     this.shapebb = shapes[ shapes.length - 1 ].getBoundingBox();
53967
53968     this.addShapeList( shapes, options );
53969
53970     this.computeCentroids();
53971     this.computeFaceNormals();
53972
53973 };
53974
53975 THREE.ShapeGeometry.prototype = Object.create( THREE.Geometry.prototype );
53976
53977 /**
53978  * Add an array of shapes to THREE.ShapeGeometry.
53979  */
53980 THREE.ShapeGeometry.prototype.addShapeList = function ( shapes, options ) {
53981
53982     for ( var i = 0, l = shapes.length; i < l; i++ ) {
53983
53984         this.addShape( shapes[ i ], options );
53985
53986     }
53987
53988     return this;
53989
53990 };
53991
53992 /**
53993  * Adds a shape to THREE.ShapeGeometry, based on THREE.ExtrudeGeometry.
53994  */
53995 THREE.ShapeGeometry.prototype.addShape = function ( shape, options ) {
53996
53997     if ( options === undefined ) options = {};
53998
53999     var material = options.material;
54000     var uvgen = options.UVGenerator === undefined ? THREE.ExtrudeGeometry.WorldUVGenerator : options.UVGenerator;
54001
54002     var shapebb = this.shapebb;
54003
54004     //
54005
54006     var i, l, hole, s;
54007
54008     var shapesOffset = this.vertices.length;
54009     var shapePoints = shape.extractPoints();
54010
54011     var vertices = shapePoints.shape;
54012     var holes = shapePoints.holes;
54013
54014     var reverse = !THREE.Shape.Utils.isClockWise( vertices );
54015
54016     if ( reverse ) {
54017
54018         vertices = vertices.reverse();
54019
54020         // Maybe we should also check if holes are in the opposite direction, just to be safe...
54021
54022         for ( i = 0, l = holes.length; i < l; i++ ) {
54023
54024             hole = holes[ i ];
54025
54026             if ( THREE.Shape.Utils.isClockWise( hole ) ) {
54027
54028                 holes[ i ] = hole.reverse();
54029
54030             }
54031
54032         }
54033
54034         reverse = false;
54035
54036     }
54037
54038     var faces = THREE.Shape.Utils.triangulateShape( vertices, holes );
54039
54040     // Vertices
54041
54042     var contour = vertices;
54043
54044     for ( i = 0, l = holes.length; i < l; i++ ) {
54045
54046         hole = holes[ i ];
54047         vertices = vertices.concat( hole );
54048
54049     }
54050
54051     //
54052
54053     var vert, vlen = vertices.length;
54054     var face, flen = faces.length;
54055     var cont, clen = contour.length;
54056
54057     for ( i = 0; i < vlen; i++ ) {
54058
54059         vert = vertices[ i ];
54060
54061         this.vertices.push( new THREE.Vector3( vert.x, vert.y, 0 ) );
54062
54063     }
54064
54065     for ( i = 0; i < flen; i++ ) {
54066
54067         face = faces[ i ];
54068
54069         var a = face[ 2 ] + shapesOffset;
54070         var b = face[ 1 ] + shapesOffset;
54071         var c = face[ 0 ] + shapesOffset;
54072
54073         this.faces.push( new THREE.Face3( a, b, c, null, null, material ) );
54074         this.faceVertexUvs[ 0 ].push( uvgen.generateBottomUV( this, shape, options, a, b, c ) );
54075
54076     }
54077
54078 };
54079 /**
54080  * @author astrodud / http://astrodud.isgreat.org/
54081  * @author zz85 / https://github.com/zz85
54082  */
54083
54084 THREE.LatheGeometry = function ( points, steps, angle ) {
54085
54086     THREE.Geometry.call( this );
54087
54088     var _steps = steps || 12;
54089     var _angle = angle || 2 * Math.PI;
54090
54091     var _newV = [];
54092     var _matrix = new THREE.Matrix4().makeRotationZ( _angle / _steps );
54093
54094     for ( var j = 0; j < points.length; j ++ ) {
54095
54096         _newV[ j ] = points[ j ].clone();
54097         this.vertices.push( _newV[ j ] );
54098
54099     }
54100
54101     var i, il = _steps + 1;
54102
54103     for ( i = 0; i < il; i ++ ) {
54104
54105         for ( var j = 0; j < _newV.length; j ++ ) {
54106
54107             _newV[ j ] = _matrix.multiplyVector3( _newV[ j ].clone() );
54108             this.vertices.push( _newV[ j ] );
54109
54110         }
54111
54112     }
54113
54114     for ( i = 0; i < _steps; i ++ ) {
54115
54116         for ( var k = 0, kl = points.length; k < kl - 1; k ++ ) {
54117
54118             var a = i * kl + k;
54119             var b = ( ( i + 1 ) % il ) * kl + k;
54120             var c = ( ( i + 1 ) % il ) * kl + ( k + 1 ) % kl;
54121             var d = i * kl + ( k + 1 ) % kl;
54122
54123             this.faces.push( new THREE.Face4( a, b, c, d ) );
54124
54125             this.faceVertexUvs[ 0 ].push( [
54126
54127                 new THREE.UV( 1 - i / _steps, k / kl ),
54128                 new THREE.UV( 1 - ( i + 1 ) / _steps, k / kl ),
54129                 new THREE.UV( 1 - ( i + 1 ) / _steps, ( k + 1 ) / kl ),
54130                 new THREE.UV( 1 - i / _steps, ( k + 1 ) / kl )
54131
54132             ] );
54133
54134         }
54135
54136     }
54137
54138     this.computeCentroids();
54139     this.computeFaceNormals();
54140     this.computeVertexNormals();
54141
54142 };
54143
54144 THREE.LatheGeometry.prototype = Object.create( THREE.Geometry.prototype );
54145 /**
54146  * @author mrdoob / http://mrdoob.com/
54147  * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as
54148  */
54149
54150 THREE.PlaneGeometry = function ( width, height, segmentsWidth, segmentsheight ) {
54151
54152     THREE.Geometry.call( this );
54153
54154     var ix, iz,
54155     width_half = width / 2,
54156     height_half = height / 2,
54157     gridX = segmentsWidth || 1,
54158     gridZ = segmentsheight || 1,
54159     gridX1 = gridX + 1,
54160     gridZ1 = gridZ + 1,
54161     segment_width = width / gridX,
54162     segment_height = height / gridZ,
54163     normal = new THREE.Vector3( 0, 0, 1 );
54164
54165     for ( iz = 0; iz < gridZ1; iz ++ ) {
54166
54167         for ( ix = 0; ix < gridX1; ix ++ ) {
54168
54169             var x = ix * segment_width - width_half;
54170             var y = iz * segment_height - height_half;
54171
54172             this.vertices.push( new THREE.Vector3( x, - y, 0 ) );
54173
54174         }
54175
54176     }
54177
54178     for ( iz = 0; iz < gridZ; iz ++ ) {
54179
54180         for ( ix = 0; ix < gridX; ix ++ ) {
54181
54182             var a = ix + gridX1 * iz;
54183             var b = ix + gridX1 * ( iz + 1 );
54184             var c = ( ix + 1 ) + gridX1 * ( iz + 1 );
54185             var d = ( ix + 1 ) + gridX1 * iz;
54186
54187             var face = new THREE.Face4( a, b, c, d );
54188             face.normal.copy( normal );
54189             face.vertexNormals.push( normal.clone(), normal.clone(), normal.clone(), normal.clone() );
54190
54191             this.faces.push( face );
54192             this.faceVertexUvs[ 0 ].push( [
54193                 new THREE.UV( ix / gridX, 1 - iz / gridZ ),
54194                 new THREE.UV( ix / gridX, 1 - ( iz + 1 ) / gridZ ),
54195                 new THREE.UV( ( ix + 1 ) / gridX, 1 - ( iz + 1 ) / gridZ ),
54196                 new THREE.UV( ( ix + 1 ) / gridX, 1 - iz / gridZ )
54197             ] );
54198
54199         }
54200
54201     }
54202
54203     this.computeCentroids();
54204
54205 };
54206
54207 THREE.PlaneGeometry.prototype = Object.create( THREE.Geometry.prototype );
54208 /**
54209  * @author mrdoob / http://mrdoob.com/
54210  */
54211
54212 THREE.SphereGeometry = function ( radius, segmentsWidth, segmentsHeight, phiStart, phiLength, thetaStart, thetaLength ) {
54213
54214     THREE.Geometry.call( this );
54215
54216     radius = radius || 50;
54217
54218     phiStart = phiStart !== undefined ? phiStart : 0;
54219     phiLength = phiLength !== undefined ? phiLength : Math.PI * 2;
54220
54221     thetaStart = thetaStart !== undefined ? thetaStart : 0;
54222     thetaLength = thetaLength !== undefined ? thetaLength : Math.PI;
54223
54224     var segmentsX = Math.max( 3, Math.floor( segmentsWidth ) || 8 );
54225     var segmentsY = Math.max( 2, Math.floor( segmentsHeight ) || 6 );
54226
54227     var x, y, vertices = [], uvs = [];
54228
54229     for ( y = 0; y <= segmentsY; y ++ ) {
54230
54231         var verticesRow = [];
54232         var uvsRow = [];
54233
54234         for ( x = 0; x <= segmentsX; x ++ ) {
54235
54236             var u = x / segmentsX;
54237             var v = y / segmentsY;
54238
54239             var vertex = new THREE.Vector3();
54240             vertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );
54241             vertex.y = radius * Math.cos( thetaStart + v * thetaLength );
54242             vertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );
54243
54244             this.vertices.push( vertex );
54245
54246             verticesRow.push( this.vertices.length - 1 );
54247             uvsRow.push( new THREE.UV( u, 1 - v ) );
54248
54249         }
54250
54251         vertices.push( verticesRow );
54252         uvs.push( uvsRow );
54253
54254     }
54255
54256     for ( y = 0; y < segmentsY; y ++ ) {
54257
54258         for ( x = 0; x < segmentsX; x ++ ) {
54259
54260             var v1 = vertices[ y ][ x + 1 ];
54261             var v2 = vertices[ y ][ x ];
54262             var v3 = vertices[ y + 1 ][ x ];
54263             var v4 = vertices[ y + 1 ][ x + 1 ];
54264
54265             var n1 = this.vertices[ v1 ].clone().normalize();
54266             var n2 = this.vertices[ v2 ].clone().normalize();
54267             var n3 = this.vertices[ v3 ].clone().normalize();
54268             var n4 = this.vertices[ v4 ].clone().normalize();
54269
54270             var uv1 = uvs[ y ][ x + 1 ].clone();
54271             var uv2 = uvs[ y ][ x ].clone();
54272             var uv3 = uvs[ y + 1 ][ x ].clone();
54273             var uv4 = uvs[ y + 1 ][ x + 1 ].clone();
54274
54275             if ( Math.abs( this.vertices[ v1 ].y ) == radius ) {
54276
54277                 this.faces.push( new THREE.Face3( v1, v3, v4, [ n1, n3, n4 ] ) );
54278                 this.faceVertexUvs[ 0 ].push( [ uv1, uv3, uv4 ] );
54279
54280             } else if ( Math.abs( this.vertices[ v3 ].y ) ==  radius ) {
54281
54282                 this.faces.push( new THREE.Face3( v1, v2, v3, [ n1, n2, n3 ] ) );
54283                 this.faceVertexUvs[ 0 ].push( [ uv1, uv2, uv3 ] );
54284
54285             } else {
54286
54287                 this.faces.push( new THREE.Face4( v1, v2, v3, v4, [ n1, n2, n3, n4 ] ) );
54288                 this.faceVertexUvs[ 0 ].push( [ uv1, uv2, uv3, uv4 ] );
54289
54290             }
54291
54292         }
54293
54294     }
54295
54296     this.computeCentroids();
54297     this.computeFaceNormals();
54298
54299     this.boundingSphere = { radius: radius };
54300
54301 };
54302
54303 THREE.SphereGeometry.prototype = Object.create( THREE.Geometry.prototype );
54304 /**
54305  * @author zz85 / http://www.lab4games.net/zz85/blog
54306  * @author alteredq / http://alteredqualia.com/
54307  *
54308  * For creating 3D text geometry in three.js
54309  *
54310  * Text = 3D Text
54311  *
54312  * parameters = {
54313  *  size:             <float>,     // size of the text
54314  *  height:         <float>,     // thickness to extrude text
54315  *  curveSegments:     <int>,        // number of points on the curves
54316  *
54317  *  font:             <string>,        // font name
54318  *  weight:         <string>,        // font weight (normal, bold)
54319  *  style:             <string>,        // font style  (normal, italics)
54320  *
54321  *  bevelEnabled:    <bool>,            // turn on bevel
54322  *  bevelThickness: <float>,         // how deep into text bevel goes
54323  *  bevelSize:        <float>,         // how far from text outline is bevel
54324  *  }
54325  *
54326  */
54327
54328 /*    Usage Examples
54329
54330     // TextGeometry wrapper
54331
54332     var text3d = new TextGeometry( text, options );
54333
54334     // Complete manner
54335
54336     var textShapes = THREE.FontUtils.generateShapes( text, options );
54337     var text3d = new ExtrudeGeometry( textShapes, options );
54338
54339 */
54340
54341
54342 THREE.TextGeometry = function ( text, parameters ) {
54343
54344     var textShapes = THREE.FontUtils.generateShapes( text, parameters );
54345
54346     // translate parameters to ExtrudeGeometry API
54347
54348     parameters.amount = parameters.height !== undefined ? parameters.height : 50;
54349
54350     // defaults
54351
54352     if ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10;
54353     if ( parameters.bevelSize === undefined ) parameters.bevelSize = 8;
54354     if ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false;
54355
54356     THREE.ExtrudeGeometry.call( this, textShapes, parameters );
54357
54358 };
54359
54360 THREE.TextGeometry.prototype = Object.create( THREE.ExtrudeGeometry.prototype );
54361 /**
54362  * @author oosmoxiecode
54363  * @author mrdoob / http://mrdoob.com/
54364  * based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3DLite/src/away3dlite/primitives/Torus.as?r=2888
54365  */
54366
54367 THREE.TorusGeometry = function ( radius, tube, segmentsR, segmentsT, arc ) {
54368
54369     THREE.Geometry.call( this );
54370
54371     var scope = this;
54372
54373     this.radius = radius || 100;
54374     this.tube = tube || 40;
54375     this.segmentsR = segmentsR || 8;
54376     this.segmentsT = segmentsT || 6;
54377     this.arc = arc || Math.PI * 2;
54378
54379     var center = new THREE.Vector3(), uvs = [], normals = [];
54380
54381     for ( var j = 0; j <= this.segmentsR; j ++ ) {
54382
54383         for ( var i = 0; i <= this.segmentsT; i ++ ) {
54384
54385             var u = i / this.segmentsT * this.arc;
54386             var v = j / this.segmentsR * Math.PI * 2;
54387
54388             center.x = this.radius * Math.cos( u );
54389             center.y = this.radius * Math.sin( u );
54390
54391             var vertex = new THREE.Vector3();
54392             vertex.x = ( this.radius + this.tube * Math.cos( v ) ) * Math.cos( u );
54393             vertex.y = ( this.radius + this.tube * Math.cos( v ) ) * Math.sin( u );
54394             vertex.z = this.tube * Math.sin( v );
54395
54396             this.vertices.push( vertex );
54397
54398             uvs.push( new THREE.UV( i / this.segmentsT, j / this.segmentsR ) );
54399             normals.push( vertex.clone().subSelf( center ).normalize() );
54400
54401         }
54402     }
54403
54404
54405     for ( var j = 1; j <= this.segmentsR; j ++ ) {
54406
54407         for ( var i = 1; i <= this.segmentsT; i ++ ) {
54408
54409             var a = ( this.segmentsT + 1 ) * j + i - 1;
54410             var b = ( this.segmentsT + 1 ) * ( j - 1 ) + i - 1;
54411             var c = ( this.segmentsT + 1 ) * ( j - 1 ) + i;
54412             var d = ( this.segmentsT + 1 ) * j + i;
54413
54414             var face = new THREE.Face4( a, b, c, d, [ normals[ a ], normals[ b ], normals[ c ], normals[ d ] ] );
54415             face.normal.addSelf( normals[ a ] );
54416             face.normal.addSelf( normals[ b ] );
54417             face.normal.addSelf( normals[ c ] );
54418             face.normal.addSelf( normals[ d ] );
54419             face.normal.normalize();
54420
54421             this.faces.push( face );
54422
54423             this.faceVertexUvs[ 0 ].push( [ uvs[ a ].clone(), uvs[ b ].clone(), uvs[ c ].clone(), uvs[ d ].clone() ] );
54424         }
54425
54426     }
54427
54428     this.computeCentroids();
54429
54430 };
54431
54432 THREE.TorusGeometry.prototype = Object.create( THREE.Geometry.prototype );
54433 /**
54434  * @author oosmoxiecode
54435  * based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3D/src/away3d/primitives/TorusKnot.as?spec=svn2473&r=2473
54436  */
54437
54438 THREE.TorusKnotGeometry = function ( radius, tube, segmentsR, segmentsT, p, q, heightScale ) {
54439
54440     THREE.Geometry.call( this );
54441
54442     var scope = this;
54443
54444     this.radius = radius || 200;
54445     this.tube = tube || 40;
54446     this.segmentsR = segmentsR || 64;
54447     this.segmentsT = segmentsT || 8;
54448     this.p = p || 2;
54449     this.q = q || 3;
54450     this.heightScale = heightScale || 1;
54451     this.grid = new Array(this.segmentsR);
54452
54453     var tang = new THREE.Vector3();
54454     var n = new THREE.Vector3();
54455     var bitan = new THREE.Vector3();
54456
54457     for ( var i = 0; i < this.segmentsR; ++ i ) {
54458
54459         this.grid[ i ] = new Array( this.segmentsT );
54460
54461         for ( var j = 0; j < this.segmentsT; ++ j ) {
54462
54463             var u = i / this.segmentsR * 2 * this.p * Math.PI;
54464             var v = j / this.segmentsT * 2 * Math.PI;
54465             var p1 = getPos( u, v, this.q, this.p, this.radius, this.heightScale );
54466             var p2 = getPos( u + 0.01, v, this.q, this.p, this.radius, this.heightScale );
54467             var cx, cy;
54468
54469             tang.sub( p2, p1 );
54470             n.add( p2, p1 );
54471
54472             bitan.cross( tang, n );
54473             n.cross( bitan, tang );
54474             bitan.normalize();
54475             n.normalize();
54476
54477             cx = - this.tube * Math.cos( v ); // TODO: Hack: Negating it so it faces outside.
54478             cy = this.tube * Math.sin( v );
54479
54480             p1.x += cx * n.x + cy * bitan.x;
54481             p1.y += cx * n.y + cy * bitan.y;
54482             p1.z += cx * n.z + cy * bitan.z;
54483
54484             this.grid[ i ][ j ] = vert( p1.x, p1.y, p1.z );
54485
54486         }
54487
54488     }
54489
54490     for ( var i = 0; i < this.segmentsR; ++ i ) {
54491
54492         for ( var j = 0; j < this.segmentsT; ++ j ) {
54493
54494             var ip = ( i + 1 ) % this.segmentsR;
54495             var jp = ( j + 1 ) % this.segmentsT;
54496
54497             var a = this.grid[ i ][ j ];
54498             var b = this.grid[ ip ][ j ];
54499             var c = this.grid[ ip ][ jp ];
54500             var d = this.grid[ i ][ jp ];
54501
54502             var uva = new THREE.UV( i / this.segmentsR, j / this.segmentsT );
54503             var uvb = new THREE.UV( ( i + 1 ) / this.segmentsR, j / this.segmentsT );
54504             var uvc = new THREE.UV( ( i + 1 ) / this.segmentsR, ( j + 1 ) / this.segmentsT );
54505             var uvd = new THREE.UV( i / this.segmentsR, ( j + 1 ) / this.segmentsT );
54506
54507             this.faces.push( new THREE.Face4( a, b, c, d ) );
54508             this.faceVertexUvs[ 0 ].push( [ uva,uvb,uvc, uvd ] );
54509
54510         }
54511     }
54512
54513     this.computeCentroids();
54514     this.computeFaceNormals();
54515     this.computeVertexNormals();
54516
54517     function vert( x, y, z ) {
54518
54519         return scope.vertices.push( new THREE.Vector3( x, y, z ) ) - 1;
54520
54521     }
54522
54523     function getPos( u, v, in_q, in_p, radius, heightScale ) {
54524
54525         var cu = Math.cos( u );
54526         var cv = Math.cos( v );
54527         var su = Math.sin( u );
54528         var quOverP = in_q / in_p * u;
54529         var cs = Math.cos( quOverP );
54530
54531         var tx = radius * ( 2 + cs ) * 0.5 * cu;
54532         var ty = radius * ( 2 + cs ) * su * 0.5;
54533         var tz = heightScale * radius * Math.sin( quOverP ) * 0.5;
54534
54535         return new THREE.Vector3( tx, ty, tz );
54536
54537     }
54538
54539 };
54540
54541 THREE.TorusKnotGeometry.prototype = Object.create( THREE.Geometry.prototype );
54542 /**
54543  * @author WestLangley / https://github.com/WestLangley
54544  * @author zz85 / https://github.com/zz85
54545  * @author miningold / https://github.com/miningold
54546  *
54547  * Modified from the TorusKnotGeometry by @oosmoxiecode
54548  *
54549  * Creates a tube which extrudes along a 3d spline
54550  *
54551  * Uses parallel transport frames as described in
54552  * http://www.cs.indiana.edu/pub/techreports/TR425.pdf
54553  */
54554
54555 THREE.TubeGeometry = function( path, segments, radius, segmentsRadius, closed, debug ) {
54556
54557     THREE.Geometry.call( this );
54558
54559     this.path = path;
54560     this.segments = segments || 64;
54561     this.radius = radius || 1;
54562     this.segmentsRadius = segmentsRadius || 8;
54563     this.closed = closed || false;
54564     if ( debug ) this.debug = new THREE.Object3D();
54565
54566     this.grid = [];
54567
54568     var scope = this,
54569
54570         tangent,
54571         normal,
54572         binormal,
54573
54574         numpoints = this.segments + 1,
54575
54576         x, y, z,
54577         tx, ty, tz,
54578         u, v,
54579
54580         cx, cy,
54581         pos, pos2 = new THREE.Vector3(),
54582         i, j,
54583         ip, jp,
54584         a, b, c, d,
54585         uva, uvb, uvc, uvd;
54586
54587     var frames = new THREE.TubeGeometry.FrenetFrames(path, segments, closed),
54588         tangents = frames.tangents,
54589         normals = frames.normals,
54590         binormals = frames.binormals;
54591
54592     // proxy internals
54593     this.tangents = tangents;
54594     this.normals = normals;
54595     this.binormals = binormals;
54596
54597
54598     function vert( x, y, z ) {
54599
54600         return scope.vertices.push( new THREE.Vector3( x, y, z ) ) - 1;
54601
54602     }
54603
54604
54605
54606
54607     // consruct the grid
54608
54609     for ( i = 0; i < numpoints; i++ ) {
54610
54611         this.grid[ i ] = [];
54612
54613         u = i / ( numpoints - 1 );
54614
54615         pos = path.getPointAt( u );
54616
54617         tangent = tangents[ i ];
54618         normal = normals[ i ];
54619         binormal = binormals[ i ];
54620
54621         if ( this.debug ) {
54622
54623             this.debug.add(new THREE.ArrowHelper(tangent, pos, radius, 0x0000ff));
54624             this.debug.add(new THREE.ArrowHelper(normal, pos, radius, 0xff0000));
54625             this.debug.add(new THREE.ArrowHelper(binormal, pos, radius, 0x00ff00));
54626
54627         }
54628
54629         for ( j = 0; j < this.segmentsRadius; j++ ) {
54630
54631             v = j / this.segmentsRadius * 2 * Math.PI;
54632
54633             cx = -this.radius * Math.cos( v ); // TODO: Hack: Negating it so it faces outside.
54634             cy = this.radius * Math.sin( v );
54635
54636             pos2.copy( pos );
54637             pos2.x += cx * normal.x + cy * binormal.x;
54638             pos2.y += cx * normal.y + cy * binormal.y;
54639             pos2.z += cx * normal.z + cy * binormal.z;
54640
54641             this.grid[ i ][ j ] = vert( pos2.x, pos2.y, pos2.z );
54642
54643         }
54644     }
54645
54646
54647     // construct the mesh
54648
54649     for ( i = 0; i < this.segments; i++ ) {
54650
54651         for ( j = 0; j < this.segmentsRadius; j++ ) {
54652
54653             ip = ( closed ) ? (i + 1) % this.segments : i + 1;
54654             jp = (j + 1) % this.segmentsRadius;
54655
54656             a = this.grid[ i ][ j ];        // *** NOT NECESSARILY PLANAR ! ***
54657             b = this.grid[ ip ][ j ];
54658             c = this.grid[ ip ][ jp ];
54659             d = this.grid[ i ][ jp ];
54660
54661             uva = new THREE.UV( i / this.segments, j / this.segmentsRadius );
54662             uvb = new THREE.UV( ( i + 1 ) / this.segments, j / this.segmentsRadius );
54663             uvc = new THREE.UV( ( i + 1 ) / this.segments, ( j + 1 ) / this.segmentsRadius );
54664             uvd = new THREE.UV( i / this.segments, ( j + 1 ) / this.segmentsRadius );
54665
54666             this.faces.push( new THREE.Face4( a, b, c, d ) );
54667             this.faceVertexUvs[ 0 ].push( [ uva, uvb, uvc, uvd ] );
54668
54669         }
54670     }
54671
54672     this.computeCentroids();
54673     this.computeFaceNormals();
54674     this.computeVertexNormals();
54675
54676 };
54677
54678 THREE.TubeGeometry.prototype = Object.create( THREE.Geometry.prototype );
54679
54680
54681 // For computing of Frenet frames, exposing the tangents, normals and binormals the spline
54682 THREE.TubeGeometry.FrenetFrames = function(path, segments, closed) {
54683
54684     var
54685         tangent = new THREE.Vector3(),
54686         normal = new THREE.Vector3(),
54687         binormal = new THREE.Vector3(),
54688
54689         tangents = [],
54690         normals = [],
54691         binormals = [],
54692
54693         vec = new THREE.Vector3(),
54694         mat = new THREE.Matrix4(),
54695
54696         numpoints = segments + 1,
54697         theta,
54698         epsilon = 0.0001,
54699         smallest,
54700
54701         tx, ty, tz,
54702         i, u, v;
54703
54704
54705     // expose internals
54706     this.tangents = tangents;
54707     this.normals = normals;
54708     this.binormals = binormals;
54709
54710     // compute the tangent vectors for each segment on the path
54711
54712     for ( i = 0; i < numpoints; i++ ) {
54713
54714         u = i / ( numpoints - 1 );
54715
54716         tangents[ i ] = path.getTangentAt( u );
54717         tangents[ i ].normalize();
54718
54719     }
54720
54721     initialNormal3();
54722
54723     function initialNormal1(lastBinormal) {
54724         // fixed start binormal. Has dangers of 0 vectors
54725         normals[ 0 ] = new THREE.Vector3();
54726         binormals[ 0 ] = new THREE.Vector3();
54727         if (lastBinormal===undefined) lastBinormal = new THREE.Vector3( 0, 0, 1 );
54728         normals[ 0 ].cross( lastBinormal, tangents[ 0 ] ).normalize();
54729         binormals[ 0 ].cross( tangents[ 0 ], normals[ 0 ] ).normalize();
54730     }
54731
54732     function initialNormal2() {
54733
54734         // This uses the Frenet-Serret formula for deriving binormal
54735         var t2 = path.getTangentAt( epsilon );
54736
54737         normals[ 0 ] = new THREE.Vector3().sub( t2, tangents[ 0 ] ).normalize();
54738         binormals[ 0 ] = new THREE.Vector3().cross( tangents[ 0 ], normals[ 0 ] );
54739
54740         normals[ 0 ].cross( binormals[ 0 ], tangents[ 0 ] ).normalize(); // last binormal x tangent
54741         binormals[ 0 ].cross( tangents[ 0 ], normals[ 0 ] ).normalize();
54742
54743     }
54744
54745     function initialNormal3() {
54746         // select an initial normal vector perpenicular to the first tangent vector,
54747         // and in the direction of the smallest tangent xyz component
54748
54749         normals[ 0 ] = new THREE.Vector3();
54750         binormals[ 0 ] = new THREE.Vector3();
54751         smallest = Number.MAX_VALUE;
54752         tx = Math.abs( tangents[ 0 ].x );
54753         ty = Math.abs( tangents[ 0 ].y );
54754         tz = Math.abs( tangents[ 0 ].z );
54755
54756         if ( tx <= smallest ) {
54757             smallest = tx;
54758             normal.set( 1, 0, 0 );
54759         }
54760
54761         if ( ty <= smallest ) {
54762             smallest = ty;
54763             normal.set( 0, 1, 0 );
54764         }
54765
54766         if ( tz <= smallest ) {
54767             normal.set( 0, 0, 1 );
54768         }
54769
54770         vec.cross( tangents[ 0 ], normal ).normalize();
54771
54772         normals[ 0 ].cross( tangents[ 0 ], vec );
54773         binormals[ 0 ].cross( tangents[ 0 ], normals[ 0 ] );
54774     }
54775
54776
54777     // compute the slowly-varying normal and binormal vectors for each segment on the path
54778
54779     for ( i = 1; i < numpoints; i++ ) {
54780
54781         normals[ i ] = normals[ i-1 ].clone();
54782
54783         binormals[ i ] = binormals[ i-1 ].clone();
54784
54785         vec.cross( tangents[ i-1 ], tangents[ i ] );
54786
54787         if ( vec.length() > epsilon ) {
54788
54789             vec.normalize();
54790
54791             theta = Math.acos( tangents[ i-1 ].dot( tangents[ i ] ) );
54792
54793             mat.makeRotationAxis( vec, theta ).multiplyVector3( normals[ i ] );
54794
54795         }
54796
54797         binormals[ i ].cross( tangents[ i ], normals[ i ] );
54798
54799     }
54800
54801
54802     // if the curve is closed, postprocess the vectors so the first and last normal vectors are the same
54803
54804     if ( closed ) {
54805
54806         theta = Math.acos( normals[ 0 ].dot( normals[ numpoints-1 ] ) );
54807         theta /= ( numpoints - 1 );
54808
54809         if ( tangents[ 0 ].dot( vec.cross( normals[ 0 ], normals[ numpoints-1 ] ) ) > 0 ) {
54810
54811             theta = -theta;
54812
54813         }
54814
54815         for ( i = 1; i < numpoints; i++ ) {
54816
54817             // twist a little...
54818             mat.makeRotationAxis( tangents[ i ], theta * i ).multiplyVector3( normals[ i ] );
54819             binormals[ i ].cross( tangents[ i ], normals[ i ] );
54820
54821         }
54822
54823     }
54824 };
54825 /**
54826  * @author clockworkgeek / https://github.com/clockworkgeek
54827  * @author timothypratley / https://github.com/timothypratley
54828  */
54829
54830 THREE.PolyhedronGeometry = function ( vertices, faces, radius, detail ) {
54831
54832     THREE.Geometry.call( this );
54833
54834     radius = radius || 1;
54835     detail = detail || 0;
54836
54837     var that = this;
54838
54839     for ( var i = 0, l = vertices.length; i < l; i ++ ) {
54840
54841         prepare( new THREE.Vector3( vertices[ i ][ 0 ], vertices[ i ][ 1 ], vertices[ i ][ 2 ] ) );
54842
54843     }
54844
54845     var midpoints = [], p = this.vertices;
54846
54847     for ( var i = 0, l = faces.length; i < l; i ++ ) {
54848
54849         make( p[ faces[ i ][ 0 ] ], p[ faces[ i ][ 1 ] ], p[ faces[ i ][ 2 ] ], detail );
54850
54851     }
54852
54853     this.mergeVertices();
54854
54855     // Apply radius
54856
54857     for ( var i = 0, l = this.vertices.length; i < l; i ++ ) {
54858
54859         this.vertices[ i ].multiplyScalar( radius );
54860
54861     }
54862
54863
54864     // Project vector onto sphere's surface
54865
54866     function prepare( vector ) {
54867
54868         var vertex = vector.normalize().clone();
54869         vertex.index = that.vertices.push( vertex ) - 1;
54870
54871         // Texture coords are equivalent to map coords, calculate angle and convert to fraction of a circle.
54872
54873         var u = azimuth( vector ) / 2 / Math.PI + 0.5;
54874         var v = inclination( vector ) / Math.PI + 0.5;
54875         vertex.uv = new THREE.UV( u, 1 - v );
54876
54877         return vertex;
54878
54879     }
54880
54881
54882     // Approximate a curved face with recursively sub-divided triangles.
54883
54884     function make( v1, v2, v3, detail ) {
54885
54886         if ( detail < 1 ) {
54887
54888             var face = new THREE.Face3( v1.index, v2.index, v3.index, [ v1.clone(), v2.clone(), v3.clone() ] );
54889             face.centroid.addSelf( v1 ).addSelf( v2 ).addSelf( v3 ).divideScalar( 3 );
54890             face.normal = face.centroid.clone().normalize();
54891             that.faces.push( face );
54892
54893             var azi = azimuth( face.centroid );
54894             that.faceVertexUvs[ 0 ].push( [
54895                 correctUV( v1.uv, v1, azi ),
54896                 correctUV( v2.uv, v2, azi ),
54897                 correctUV( v3.uv, v3, azi )
54898             ] );
54899
54900         } else {
54901
54902             detail -= 1;
54903
54904             // split triangle into 4 smaller triangles
54905
54906             make( v1, midpoint( v1, v2 ), midpoint( v1, v3 ), detail ); // top quadrant
54907             make( midpoint( v1, v2 ), v2, midpoint( v2, v3 ), detail ); // left quadrant
54908             make( midpoint( v1, v3 ), midpoint( v2, v3 ), v3, detail ); // right quadrant
54909             make( midpoint( v1, v2 ), midpoint( v2, v3 ), midpoint( v1, v3 ), detail ); // center quadrant
54910
54911         }
54912
54913     }
54914
54915     function midpoint( v1, v2 ) {
54916
54917         if ( !midpoints[ v1.index ] ) midpoints[ v1.index ] = [];
54918         if ( !midpoints[ v2.index ] ) midpoints[ v2.index ] = [];
54919
54920         var mid = midpoints[ v1.index ][ v2.index ];
54921
54922         if ( mid === undefined ) {
54923
54924             // generate mean point and project to surface with prepare()
54925
54926             midpoints[ v1.index ][ v2.index ] = midpoints[ v2.index ][ v1.index ] = mid = prepare(
54927                 new THREE.Vector3().add( v1, v2 ).divideScalar( 2 )
54928             );
54929         }
54930
54931         return mid;
54932
54933     }
54934
54935
54936     // Angle around the Y axis, counter-clockwise when looking from above.
54937
54938     function azimuth( vector ) {
54939
54940         return Math.atan2( vector.z, -vector.x );
54941
54942     }
54943
54944
54945     // Angle above the XZ plane.
54946
54947     function inclination( vector ) {
54948
54949         return Math.atan2( -vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );
54950
54951     }
54952
54953
54954     // Texture fixing helper. Spheres have some odd behaviours.
54955
54956     function correctUV( uv, vector, azimuth ) {
54957
54958         if ( ( azimuth < 0 ) && ( uv.u === 1 ) ) uv = new THREE.UV( uv.u - 1, uv.v );
54959         if ( ( vector.x === 0 ) && ( vector.z === 0 ) ) uv = new THREE.UV( azimuth / 2 / Math.PI + 0.5, uv.v );
54960         return uv;
54961
54962     }
54963
54964     this.computeCentroids();
54965
54966     this.boundingSphere = { radius: radius };
54967
54968 };
54969
54970 THREE.PolyhedronGeometry.prototype = Object.create( THREE.Geometry.prototype );
54971 /**
54972  * @author timothypratley / https://github.com/timothypratley
54973  */
54974
54975 THREE.IcosahedronGeometry = function ( radius, detail ) {
54976
54977     var t = ( 1 + Math.sqrt( 5 ) ) / 2;
54978
54979     var vertices = [
54980         [ -1,  t,  0 ], [  1, t, 0 ], [ -1, -t,  0 ], [  1, -t,  0 ],
54981         [  0, -1,  t ], [  0, 1, t ], [  0, -1, -t ], [  0,  1, -t ],
54982         [  t,  0, -1 ], [  t, 0, 1 ], [ -t,  0, -1 ], [ -t,  0,  1 ]
54983     ];
54984
54985     var faces = [
54986         [ 0, 11,  5 ], [ 0,  5,  1 ], [  0,  1,  7 ], [  0,  7, 10 ], [  0, 10, 11 ],
54987         [ 1,  5,  9 ], [ 5, 11,  4 ], [ 11, 10,  2 ], [ 10,  7,  6 ], [  7,  1,  8 ],
54988         [ 3,  9,  4 ], [ 3,  4,  2 ], [  3,  2,  6 ], [  3,  6,  8 ], [  3,  8,  9 ],
54989         [ 4,  9,  5 ], [ 2,  4, 11 ], [  6,  2, 10 ], [  8,  6,  7 ], [  9,  8,  1 ]
54990     ];
54991
54992     THREE.PolyhedronGeometry.call( this, vertices, faces, radius, detail );
54993
54994 };
54995
54996 THREE.IcosahedronGeometry.prototype = Object.create( THREE.Geometry.prototype );
54997 /**
54998  * @author timothypratley / https://github.com/timothypratley
54999  */
55000
55001 THREE.OctahedronGeometry = function ( radius, detail ) {
55002
55003     var vertices = [
55004         [ 1, 0, 0 ], [ -1, 0, 0 ], [ 0, 1, 0 ], [ 0, -1, 0 ], [ 0, 0, 1 ], [ 0, 0, -1 ]
55005     ];
55006
55007     var faces = [
55008         [ 0, 2, 4 ], [ 0, 4, 3 ], [ 0, 3, 5 ], [ 0, 5, 2 ], [ 1, 2, 5 ], [ 1, 5, 3 ], [ 1, 3, 4 ], [ 1, 4, 2 ]
55009     ];
55010
55011     THREE.PolyhedronGeometry.call( this, vertices, faces, radius, detail );
55012 };
55013
55014 THREE.OctahedronGeometry.prototype = Object.create( THREE.Geometry.prototype );
55015 /**
55016  * @author timothypratley / https://github.com/timothypratley
55017  */
55018
55019 THREE.TetrahedronGeometry = function ( radius, detail ) {
55020
55021     var vertices = [
55022         [ 1,  1,  1 ], [ -1, -1, 1 ], [ -1, 1, -1 ], [ 1, -1, -1 ]
55023     ];
55024
55025     var faces = [
55026         [ 2, 1, 0 ], [ 0, 3, 2 ], [ 1, 3, 0 ], [ 2, 3, 1 ]
55027     ];
55028
55029     THREE.PolyhedronGeometry.call( this, vertices, faces, radius, detail );
55030
55031 };
55032
55033 THREE.TetrahedronGeometry.prototype = Object.create( THREE.Geometry.prototype );
55034 /**
55035  * @author zz85 / https://github.com/zz85
55036  * Parametric Surfaces Geometry
55037  * based on the brilliant article by @prideout http://prideout.net/blog/?p=44
55038  *
55039  * new THREE.ParametricGeometry( parametricFunction, uSegments, ySegements, useTris );
55040  *
55041  */
55042
55043 THREE.ParametricGeometry = function ( func, slices, stacks, useTris ) {
55044
55045     THREE.Geometry.call( this );
55046
55047     var verts = this.vertices;
55048     var faces = this.faces;
55049     var uvs = this.faceVertexUvs[ 0 ];
55050
55051     useTris = (useTris === undefined) ? false : useTris;
55052
55053     var i, il, j, p;
55054     var u, v;
55055
55056     var stackCount = stacks + 1;
55057     var sliceCount = slices + 1;
55058
55059     for ( i = 0; i <= stacks; i ++ ) {
55060
55061         v = i / stacks;
55062
55063         for ( j = 0; j <= slices; j ++ ) {
55064
55065             u = j / slices;
55066
55067             p = func( u, v );
55068             verts.push( p );
55069
55070         }
55071     }
55072
55073     var a, b, c, d;
55074     var uva, uvb, uvc, uvd;
55075
55076     for ( i = 0; i < stacks; i ++ ) {
55077
55078         for ( j = 0; j < slices; j ++ ) {
55079
55080             a = i * sliceCount + j;
55081             b = i * sliceCount + j + 1;
55082             c = (i + 1) * sliceCount + j;
55083             d = (i + 1) * sliceCount + j + 1;
55084
55085             uva = new THREE.UV( j / slices, i / stacks );
55086             uvb = new THREE.UV( ( j + 1 ) / slices, i / stacks );
55087             uvc = new THREE.UV( j / slices, ( i + 1 ) / stacks );
55088             uvd = new THREE.UV( ( j + 1 ) / slices, ( i + 1 ) / stacks );
55089
55090             if ( useTris ) {
55091
55092                 faces.push( new THREE.Face3( a, b, c ) );
55093                 faces.push( new THREE.Face3( b, d, c ) );
55094
55095                 uvs.push( [ uva, uvb, uvc ] );
55096                 uvs.push( [ uvb, uvd, uvc ] );
55097
55098             } else {
55099
55100                 faces.push( new THREE.Face4( a, b, d, c ) );
55101                 uvs.push( [ uva, uvb, uvd, uvc ] );
55102
55103             }
55104
55105         }
55106
55107     }
55108
55109     // console.log(this);
55110
55111     // magic bullet
55112     // var diff = this.mergeVertices();
55113     // console.log('removed ', diff, ' vertices by merging');
55114
55115     this.computeCentroids();
55116     this.computeFaceNormals();
55117     this.computeVertexNormals();
55118
55119 };
55120
55121 THREE.ParametricGeometry.prototype = Object.create( THREE.Geometry.prototype );
55122 /**
55123  * @author qiao / https://github.com/qiao
55124  * @fileoverview This is a convex hull generator using the incremental method.
55125  * The complexity is O(n^2) where n is the number of vertices.
55126  * O(nlogn) algorithms do exist, but they are much more complicated.
55127  *
55128  * Benchmark:
55129  *
55130  *  Platform: CPU: P7350 @2.00GHz Engine: V8
55131  *
55132  *  Num Vertices    Time(ms)
55133  *
55134  *     10           1
55135  *     20           3
55136  *     30           19
55137  *     40           48
55138  *     50           107
55139  */
55140
55141 THREE.ConvexGeometry = function( vertices ) {
55142
55143     THREE.Geometry.call( this );
55144
55145     var faces = [ [ 0, 1, 2 ], [ 0, 2, 1 ] ];
55146
55147     for ( var i = 3; i < vertices.length; i++ ) {
55148
55149         addPoint( i );
55150
55151     }
55152
55153
55154     function addPoint( vertexId ) {
55155
55156         var vertex = vertices[ vertexId ].clone();
55157
55158         var mag = vertex.length();
55159         vertex.x += mag * randomOffset();
55160         vertex.y += mag * randomOffset();
55161         vertex.z += mag * randomOffset();
55162
55163         var hole = [];
55164
55165         for ( var f = 0; f < faces.length; ) {
55166
55167             var face = faces[ f ];
55168
55169             // for each face, if the vertex can see it,
55170             // then we try to add the face's edges into the hole.
55171             if ( visible( face, vertex ) ) {
55172
55173                 for ( var e = 0; e < 3; e++ ) {
55174
55175                     var edge = [ face[ e ], face[ ( e + 1 ) % 3 ] ];
55176                     var boundary = true;
55177
55178                     // remove duplicated edges.
55179                     for ( var h = 0; h < hole.length; h++ ) {
55180
55181                         if ( equalEdge( hole[ h ], edge ) ) {
55182
55183                             hole[ h ] = hole[ hole.length - 1 ];
55184                             hole.pop();
55185                             boundary = false;
55186                             break;
55187
55188                         }
55189
55190                     }
55191
55192                     if ( boundary ) {
55193
55194                         hole.push( edge );
55195
55196                     }
55197
55198                 }
55199
55200                 // remove faces[ f ]
55201                 faces[ f ] = faces[ faces.length - 1 ];
55202                 faces.pop();
55203
55204             } else { // not visible
55205
55206                 f++;
55207
55208             }
55209         }
55210
55211         // construct the new faces formed by the edges of the hole and the vertex
55212         for ( var h = 0; h < hole.length; h++ ) {
55213
55214             faces.push( [
55215                 hole[ h ][ 0 ],
55216                 hole[ h ][ 1 ],
55217                 vertexId
55218             ] );
55219
55220         }
55221     }
55222
55223     /**
55224      * Whether the face is visible from the vertex
55225      */
55226     function visible( face, vertex ) {
55227
55228         var va = vertices[ face[ 0 ] ];
55229         var vb = vertices[ face[ 1 ] ];
55230         var vc = vertices[ face[ 2 ] ];
55231
55232         var n = normal( va, vb, vc );
55233
55234         // distance from face to origin
55235         var dist = n.dot( va );
55236
55237         return n.dot( vertex ) >= dist;
55238
55239     }
55240
55241     /**
55242      * Face normal
55243      */
55244     function normal( va, vb, vc ) {
55245
55246         var cb = new THREE.Vector3();
55247         var ab = new THREE.Vector3();
55248
55249         cb.sub( vc, vb );
55250         ab.sub( va, vb );
55251         cb.crossSelf( ab );
55252
55253         if ( !cb.isZero() ) {
55254
55255             cb.normalize();
55256
55257         }
55258
55259         return cb;
55260
55261     }
55262
55263     /**
55264      * Detect whether two edges are equal.
55265      * Note that when constructing the convex hull, two same edges can only
55266      * be of the negative direction.
55267      */
55268     function equalEdge( ea, eb ) {
55269
55270         return ea[ 0 ] === eb[ 1 ] && ea[ 1 ] === eb[ 0 ];
55271
55272     }
55273
55274     /**
55275      * Create a random offset between -1e-6 and 1e-6.
55276      */
55277     function randomOffset() {
55278
55279         return ( Math.random() - 0.5 ) * 2 * 1e-6;
55280
55281     }
55282
55283
55284     /**
55285      * XXX: Not sure if this is the correct approach. Need someone to review.
55286      */
55287     function vertexUv( vertex ) {
55288
55289         var mag = vertex.length();
55290         return new THREE.UV( vertex.x / mag, vertex.y / mag );
55291
55292     }
55293
55294     // Push vertices into `this.vertices`, skipping those inside the hull
55295     var id = 0;
55296     var newId = new Array( vertices.length ); // map from old vertex id to new id
55297
55298     for ( var i = 0; i < faces.length; i++ ) {
55299
55300          var face = faces[ i ];
55301
55302          for ( var j = 0; j < 3; j++ ) {
55303
55304                 if ( newId[ face[ j ] ] === undefined ) {
55305
55306                         newId[ face[ j ] ] = id++;
55307                         this.vertices.push( vertices[ face[ j ] ] );
55308
55309                 }
55310
55311                 face[ j ] = newId[ face[ j ] ];
55312
55313          }
55314
55315     }
55316
55317     // Convert faces into instances of THREE.Face3
55318     for ( var i = 0; i < faces.length; i++ ) {
55319
55320         this.faces.push( new THREE.Face3(
55321                 faces[ i ][ 0 ],
55322                 faces[ i ][ 1 ],
55323                 faces[ i ][ 2 ]
55324         ) );
55325
55326     }
55327
55328     // Compute UVs
55329     for ( var i = 0; i < this.faces.length; i++ ) {
55330
55331         var face = this.faces[ i ];
55332
55333         this.faceVertexUvs[ 0 ].push( [
55334             vertexUv( this.vertices[ face.a ] ),
55335             vertexUv( this.vertices[ face.b ] ),
55336             vertexUv( this.vertices[ face.c ])
55337         ] );
55338
55339     }
55340
55341
55342     this.computeCentroids();
55343     this.computeFaceNormals();
55344     this.computeVertexNormals();
55345
55346 };
55347
55348 THREE.ConvexGeometry.prototype = Object.create( THREE.Geometry.prototype );
55349 /**
55350  * @author sroucheray / http://sroucheray.org/
55351  * @author mrdoob / http://mrdoob.com/
55352  */
55353
55354 THREE.AxisHelper = function () {
55355
55356     THREE.Object3D.call( this );
55357
55358     var lineGeometry = new THREE.Geometry();
55359     lineGeometry.vertices.push( new THREE.Vector3() );
55360     lineGeometry.vertices.push( new THREE.Vector3( 0, 100, 0 ) );
55361
55362     var coneGeometry = new THREE.CylinderGeometry( 0, 5, 25, 5, 1 );
55363
55364     var line, cone;
55365
55366     // x
55367
55368     line = new THREE.Line( lineGeometry, new THREE.LineBasicMaterial( { color : 0xff0000 } ) );
55369     line.rotation.z = - Math.PI / 2;
55370     this.add( line );
55371
55372     cone = new THREE.Mesh( coneGeometry, new THREE.MeshBasicMaterial( { color : 0xff0000 } ) );
55373     cone.position.x = 100;
55374     cone.rotation.z = - Math.PI / 2;
55375     this.add( cone );
55376
55377     // y
55378
55379     line = new THREE.Line( lineGeometry, new THREE.LineBasicMaterial( { color : 0x00ff00 } ) );
55380     this.add( line );
55381
55382     cone = new THREE.Mesh( coneGeometry, new THREE.MeshBasicMaterial( { color : 0x00ff00 } ) );
55383     cone.position.y = 100;
55384     this.add( cone );
55385
55386     // z
55387
55388     line = new THREE.Line( lineGeometry, new THREE.LineBasicMaterial( { color : 0x0000ff } ) );
55389     line.rotation.x = Math.PI / 2;
55390     this.add( line );
55391
55392     cone = new THREE.Mesh( coneGeometry, new THREE.MeshBasicMaterial( { color : 0x0000ff } ) );
55393     cone.position.z = 100;
55394     cone.rotation.x = Math.PI / 2;
55395     this.add( cone );
55396
55397 };
55398
55399 THREE.AxisHelper.prototype = Object.create( THREE.Object3D.prototype );
55400 /**
55401  * @author WestLangley / http://github.com/WestLangley
55402  * @author zz85 / https://github.com/zz85
55403  *
55404  * Creates an arrow for visualizing directions
55405  *
55406  * Parameters:
55407  *  dir - Vector3
55408  *  origin - Vector3
55409  *  length - Number
55410  *  hex - color in hex value
55411  */
55412
55413 THREE.ArrowHelper = function ( dir, origin, length, hex ) {
55414
55415     THREE.Object3D.call( this );
55416
55417     if ( hex === undefined ) hex = 0xffff00;
55418     if ( length === undefined ) length = 20;
55419
55420     var lineGeometry = new THREE.Geometry();
55421     lineGeometry.vertices.push( new THREE.Vector3( 0, 0, 0 ) );
55422     lineGeometry.vertices.push( new THREE.Vector3( 0, 1, 0 ) );
55423
55424     this.line = new THREE.Line( lineGeometry, new THREE.LineBasicMaterial( { color: hex } ) );
55425     this.add( this.line );
55426
55427     var coneGeometry = new THREE.CylinderGeometry( 0, 0.05, 0.25, 5, 1 );
55428
55429     this.cone = new THREE.Mesh( coneGeometry, new THREE.MeshBasicMaterial( { color: hex } ) );
55430     this.cone.position.set( 0, 1, 0 );
55431     this.add( this.cone );
55432
55433     if ( origin instanceof THREE.Vector3 ) this.position = origin;
55434
55435     this.setDirection( dir );
55436     this.setLength( length );
55437
55438 };
55439
55440 THREE.ArrowHelper.prototype = Object.create( THREE.Object3D.prototype );
55441
55442 THREE.ArrowHelper.prototype.setDirection = function ( dir ) {
55443
55444     var axis = new THREE.Vector3( 0, 1, 0 ).crossSelf( dir );
55445
55446     var radians = Math.acos( new THREE.Vector3( 0, 1, 0 ).dot( dir.clone().normalize() ) );
55447
55448     this.matrix = new THREE.Matrix4().makeRotationAxis( axis.normalize(), radians );
55449
55450     this.rotation.setEulerFromRotationMatrix( this.matrix, this.eulerOrder );
55451
55452 };
55453
55454 THREE.ArrowHelper.prototype.setLength = function ( length ) {
55455
55456     this.scale.set( length, length, length );
55457
55458 };
55459
55460 THREE.ArrowHelper.prototype.setColor = function ( hex ) {
55461
55462     this.line.material.color.setHex( hex );
55463     this.cone.material.color.setHex( hex );
55464
55465 };
55466 /**
55467  * @author alteredq / http://alteredqualia.com/
55468  *
55469  *    - shows frustum, line of sight and up of the camera
55470  *    - suitable for fast updates
55471  *     - based on frustum visualization in lightgl.js shadowmap example
55472  *        http://evanw.github.com/lightgl.js/tests/shadowmap.html
55473  */
55474
55475 THREE.CameraHelper = function ( camera ) {
55476
55477     THREE.Line.call( this );
55478
55479     var scope = this;
55480
55481     this.geometry = new THREE.Geometry();
55482     this.material = new THREE.LineBasicMaterial( { color: 0xffffff, vertexColors: THREE.FaceColors } );
55483     this.type = THREE.LinePieces;
55484
55485     this.matrixWorld = camera.matrixWorld;
55486     this.matrixAutoUpdate = false;
55487
55488     this.pointMap = {};
55489
55490     // colors
55491
55492     var hexFrustum = 0xffaa00;
55493     var hexCone = 0xff0000;
55494     var hexUp = 0x00aaff;
55495     var hexTarget = 0xffffff;
55496     var hexCross = 0x333333;
55497
55498     // near
55499
55500     addLine( "n1", "n2", hexFrustum );
55501     addLine( "n2", "n4", hexFrustum );
55502     addLine( "n4", "n3", hexFrustum );
55503     addLine( "n3", "n1", hexFrustum );
55504
55505     // far
55506
55507     addLine( "f1", "f2", hexFrustum );
55508     addLine( "f2", "f4", hexFrustum );
55509     addLine( "f4", "f3", hexFrustum );
55510     addLine( "f3", "f1", hexFrustum );
55511
55512     // sides
55513
55514     addLine( "n1", "f1", hexFrustum );
55515     addLine( "n2", "f2", hexFrustum );
55516     addLine( "n3", "f3", hexFrustum );
55517     addLine( "n4", "f4", hexFrustum );
55518
55519     // cone
55520
55521     addLine( "p", "n1", hexCone );
55522     addLine( "p", "n2", hexCone );
55523     addLine( "p", "n3", hexCone );
55524     addLine( "p", "n4", hexCone );
55525
55526     // up
55527
55528     addLine( "u1", "u2", hexUp );
55529     addLine( "u2", "u3", hexUp );
55530     addLine( "u3", "u1", hexUp );
55531
55532     // target
55533
55534     addLine( "c", "t", hexTarget );
55535     addLine( "p", "c", hexCross );
55536
55537     // cross
55538
55539     addLine( "cn1", "cn2", hexCross );
55540     addLine( "cn3", "cn4", hexCross );
55541
55542     addLine( "cf1", "cf2", hexCross );
55543     addLine( "cf3", "cf4", hexCross );
55544
55545     this.camera = camera;
55546
55547     function addLine( a, b, hex ) {
55548
55549         addPoint( a, hex );
55550         addPoint( b, hex );
55551
55552     }
55553
55554     function addPoint( id, hex ) {
55555
55556         scope.geometry.vertices.push( new THREE.Vector3() );
55557         scope.geometry.colors.push( new THREE.Color( hex ) );
55558
55559         if ( scope.pointMap[ id ] === undefined ) scope.pointMap[ id ] = [];
55560
55561         scope.pointMap[ id ].push( scope.geometry.vertices.length - 1 );
55562
55563     }
55564
55565     this.update( camera );
55566
55567 };
55568
55569 THREE.CameraHelper.prototype = Object.create( THREE.Line.prototype );
55570
55571 THREE.CameraHelper.prototype.update = function () {
55572
55573     var scope = this;
55574
55575     var w = 1, h = 1;
55576
55577     // we need just camera projection matrix
55578     // world matrix must be identity
55579
55580     THREE.CameraHelper.__c.projectionMatrix.copy( this.camera.projectionMatrix );
55581
55582     // center / target
55583
55584     setPoint( "c", 0, 0, -1 );
55585     setPoint( "t", 0, 0,  1 );
55586
55587     // near
55588
55589     setPoint( "n1", -w, -h, -1 );
55590     setPoint( "n2",  w, -h, -1 );
55591     setPoint( "n3", -w,  h, -1 );
55592     setPoint( "n4",  w,  h, -1 );
55593
55594     // far
55595
55596     setPoint( "f1", -w, -h, 1 );
55597     setPoint( "f2",  w, -h, 1 );
55598     setPoint( "f3", -w,  h, 1 );
55599     setPoint( "f4",  w,  h, 1 );
55600
55601     // up
55602
55603     setPoint( "u1",  w * 0.7, h * 1.1, -1 );
55604     setPoint( "u2", -w * 0.7, h * 1.1, -1 );
55605     setPoint( "u3",        0, h * 2,   -1 );
55606
55607     // cross
55608
55609     setPoint( "cf1", -w,  0, 1 );
55610     setPoint( "cf2",  w,  0, 1 );
55611     setPoint( "cf3",  0, -h, 1 );
55612     setPoint( "cf4",  0,  h, 1 );
55613
55614     setPoint( "cn1", -w,  0, -1 );
55615     setPoint( "cn2",  w,  0, -1 );
55616     setPoint( "cn3",  0, -h, -1 );
55617     setPoint( "cn4",  0,  h, -1 );
55618
55619     function setPoint( point, x, y, z ) {
55620
55621         THREE.CameraHelper.__v.set( x, y, z );
55622         THREE.CameraHelper.__projector.unprojectVector( THREE.CameraHelper.__v, THREE.CameraHelper.__c );
55623
55624         var points = scope.pointMap[ point ];
55625
55626         if ( points !== undefined ) {
55627
55628             for ( var i = 0, il = points.length; i < il; i ++ ) {
55629
55630                 scope.geometry.vertices[ points[ i ] ].copy( THREE.CameraHelper.__v );
55631
55632             }
55633
55634         }
55635
55636     }
55637
55638     this.geometry.verticesNeedUpdate = true;
55639
55640 };
55641
55642 THREE.CameraHelper.__projector = new THREE.Projector();
55643 THREE.CameraHelper.__v = new THREE.Vector3();
55644 THREE.CameraHelper.__c = new THREE.Camera();
55645
55646 /*
55647  *    @author zz85 / http://twitter.com/blurspline / http://www.lab4games.net/zz85/blog
55648  *
55649  *    Subdivision Geometry Modifier
55650  *        using Catmull-Clark Subdivision Surfaces
55651  *        for creating smooth geometry meshes
55652  *
55653  *    Note: a modifier modifies vertices and faces of geometry,
55654  *        so use THREE.GeometryUtils.clone() if orignal geoemtry needs to be retained
55655  *
55656  *    Readings:
55657  *        http://en.wikipedia.org/wiki/Catmull%E2%80%93Clark_subdivision_surface
55658  *        http://www.rorydriscoll.com/2008/08/01/catmull-clark-subdivision-the-basics/
55659  *        http://xrt.wikidot.com/blog:31
55660  *        "Subdivision Surfaces in Character Animation"
55661  *
55662  *    Supports:
55663  *        Closed and Open geometries.
55664  *
55665  *    TODO:
55666  *        crease vertex and "semi-sharp" features
55667  *        selective subdivision
55668  */
55669
55670 THREE.SubdivisionModifier = function( subdivisions ) {
55671
55672     this.subdivisions = (subdivisions === undefined ) ? 1 : subdivisions;
55673
55674     // Settings
55675     this.useOldVertexColors = false;
55676     this.supportUVs = true;
55677     this.debug = false;
55678
55679 };
55680
55681 // Applies the "modify" pattern
55682 THREE.SubdivisionModifier.prototype.modify = function ( geometry ) {
55683
55684     var repeats = this.subdivisions;
55685
55686     while ( repeats-- > 0 ) {
55687         this.smooth( geometry );
55688     }
55689
55690 };
55691
55692 // Performs an iteration of Catmull-Clark Subdivision
55693 THREE.SubdivisionModifier.prototype.smooth = function ( oldGeometry ) {
55694
55695     //debug( 'running smooth' );
55696
55697     // New set of vertices, faces and uvs
55698     var newVertices = [], newFaces = [], newUVs = [];
55699
55700     function v( x, y, z ) {
55701         newVertices.push( new THREE.Vector3( x, y, z ) );
55702     }
55703
55704     var scope = this;
55705
55706     function debug() {
55707         if (scope.debug) console.log.apply(console, arguments);
55708     }
55709
55710     function warn() {
55711         if (console)
55712         console.log.apply(console, arguments);
55713     }
55714
55715     function f4( a, b, c, d, oldFace, orders, facei ) {
55716
55717         // TODO move vertex selection over here!
55718
55719         var newFace = new THREE.Face4( a, b, c, d, null, oldFace.color, oldFace.materialIndex );
55720
55721         if (scope.useOldVertexColors) {
55722
55723             newFace.vertexColors = [];
55724
55725             var color, tmpColor, order;
55726             for (var i=0;i<4;i++) {
55727                 order = orders[i];
55728
55729                 color = new THREE.Color(),
55730                 color.setRGB(0,0,0);
55731
55732                 for (var j=0, jl=0; j<order.length;j++) {
55733                     tmpColor = oldFace.vertexColors[order[j]-1];
55734                     color.r += tmpColor.r;
55735                     color.g += tmpColor.g;
55736                     color.b += tmpColor.b;
55737                 }
55738
55739                 color.r /= order.length;
55740                 color.g /= order.length;
55741                 color.b /= order.length;
55742
55743                 newFace.vertexColors[i] = color;
55744
55745             }
55746
55747         }
55748
55749         newFaces.push( newFace );
55750
55751         if (scope.supportUVs) {
55752
55753             var aUv = [
55754                 getUV(a, ''),
55755                 getUV(b, facei),
55756                 getUV(c, facei),
55757                 getUV(d, facei)
55758             ];
55759
55760             if (!aUv[0]) debug('a :( ', a+':'+facei);
55761             else if (!aUv[1]) debug('b :( ', b+':'+facei);
55762             else if (!aUv[2]) debug('c :( ', c+':'+facei);
55763             else if (!aUv[3]) debug('d :( ', d+':'+facei);
55764             else
55765                 newUVs.push( aUv );
55766
55767         }
55768     }
55769
55770     function edge_hash( a, b ) {
55771
55772         return Math.min( a, b ) + "_" + Math.max( a, b );
55773
55774     }
55775
55776     function computeEdgeFaces( geometry ) {
55777
55778         var i, il, v1, v2, j, k,
55779             face, faceIndices, faceIndex,
55780             edge,
55781             hash,
55782             edgeFaceMap = {};
55783
55784         function mapEdgeHash( hash, i ) {
55785
55786             if ( edgeFaceMap[ hash ] === undefined ) {
55787
55788                 edgeFaceMap[ hash ] = [];
55789
55790             }
55791
55792             edgeFaceMap[ hash ].push( i );
55793         }
55794
55795
55796         // construct vertex -> face map
55797
55798         for( i = 0, il = geometry.faces.length; i < il; i ++ ) {
55799
55800             face = geometry.faces[ i ];
55801
55802             if ( face instanceof THREE.Face3 ) {
55803
55804                 hash = edge_hash( face.a, face.b );
55805                 mapEdgeHash( hash, i );
55806
55807                 hash = edge_hash( face.b, face.c );
55808                 mapEdgeHash( hash, i );
55809
55810                 hash = edge_hash( face.c, face.a );
55811                 mapEdgeHash( hash, i );
55812
55813             } else if ( face instanceof THREE.Face4 ) {
55814
55815                 hash = edge_hash( face.a, face.b );
55816                 mapEdgeHash( hash, i );
55817
55818                 hash = edge_hash( face.b, face.c );
55819                 mapEdgeHash( hash, i );
55820
55821                 hash = edge_hash( face.c, face.d );
55822                 mapEdgeHash( hash, i );
55823
55824                 hash = edge_hash( face.d, face.a );
55825                 mapEdgeHash( hash, i );
55826
55827             }
55828
55829         }
55830
55831         // extract faces
55832
55833         // var edges = [];
55834         //
55835         // var numOfEdges = 0;
55836         // for (i in edgeFaceMap) {
55837         //     numOfEdges++;
55838         //
55839         //     edge = edgeFaceMap[i];
55840         //     edges.push(edge);
55841         //
55842         // }
55843
55844         //debug('edgeFaceMap', edgeFaceMap, 'geometry.edges',geometry.edges, 'numOfEdges', numOfEdges);
55845
55846         return edgeFaceMap;
55847
55848     }
55849
55850     var originalPoints = oldGeometry.vertices;
55851     var originalFaces = oldGeometry.faces;
55852
55853     var newPoints = originalPoints.concat(); // Vertices
55854
55855     var facePoints = [], edgePoints = {};
55856
55857     var sharpEdges = {}, sharpVertices = [], sharpFaces = [];
55858
55859     var uvForVertices = {}; // Stored in {vertex}:{old face} format
55860
55861     var originalVerticesLength = originalPoints.length;
55862
55863     function getUV(vertexNo, oldFaceNo) {
55864         var j,jl;
55865
55866         var key = vertexNo+':'+oldFaceNo;
55867         var theUV = uvForVertices[key];
55868
55869         if (!theUV) {
55870             if (vertexNo>=originalVerticesLength && vertexNo < (originalVerticesLength + originalFaces.length)) {
55871                 debug('face pt');
55872             } else {
55873                 debug('edge pt');
55874             }
55875
55876             warn('warning, UV not found for', key);
55877
55878             return null;
55879         }
55880
55881         return theUV;
55882
55883         // Original faces -> Vertex Nos.
55884         // new Facepoint -> Vertex Nos.
55885         // edge Points
55886
55887     }
55888
55889     function addUV(vertexNo, oldFaceNo, value) {
55890
55891         var key = vertexNo+':'+oldFaceNo;
55892         if (!(key in uvForVertices)) {
55893             uvForVertices[key] = value;
55894         } else {
55895             warn('dup vertexNo', vertexNo, 'oldFaceNo', oldFaceNo, 'value', value, 'key', key, uvForVertices[key]);
55896         }
55897     }
55898
55899     // Step 1
55900     //    For each face, add a face point
55901     //    Set each face point to be the centroid of all original points for the respective face.
55902     // debug(oldGeometry);
55903     var i, il, j, jl, face;
55904
55905     // For Uvs
55906     var uvs = oldGeometry.faceVertexUvs[0];
55907     var abcd = 'abcd', vertice;
55908
55909     debug('originalFaces, uvs, originalVerticesLength', originalFaces.length, uvs.length, originalVerticesLength);
55910     if (scope.supportUVs)
55911     for (i=0, il = uvs.length; i<il; i++ ) {
55912         for (j=0,jl=uvs[i].length;j<jl;j++) {
55913             vertice = originalFaces[i][abcd.charAt(j)];
55914
55915             addUV(vertice, i, uvs[i][j]);
55916
55917         }
55918     }
55919
55920     if (uvs.length == 0) scope.supportUVs = false;
55921
55922     // Additional UVs check, if we index original
55923     var uvCount = 0;
55924     for (var u in uvForVertices) {
55925         uvCount++;
55926     }
55927     if (!uvCount) {
55928         scope.supportUVs = false;
55929         debug('no uvs');
55930     }
55931
55932     debug('-- Original Faces + Vertices UVs completed', uvForVertices, 'vs', uvs.length);
55933
55934     var avgUv ;
55935     for (i=0, il = originalFaces.length; i<il ;i++) {
55936         face = originalFaces[ i ];
55937         facePoints.push( face.centroid );
55938         newPoints.push( face.centroid );
55939
55940
55941         if (!scope.supportUVs) continue;
55942
55943         // Prepare subdivided uv
55944
55945         avgUv = new THREE.UV();
55946
55947         if ( face instanceof THREE.Face3 ) {
55948             avgUv.u = getUV( face.a, i ).u + getUV( face.b, i ).u + getUV( face.c, i ).u;
55949             avgUv.v = getUV( face.a, i ).v + getUV( face.b, i ).v + getUV( face.c, i ).v;
55950             avgUv.u /= 3;
55951             avgUv.v /= 3;
55952
55953         } else if ( face instanceof THREE.Face4 ) {
55954             avgUv.u = getUV( face.a, i ).u + getUV( face.b, i ).u + getUV( face.c, i ).u + getUV( face.d, i ).u;
55955             avgUv.v = getUV( face.a, i ).v + getUV( face.b, i ).v + getUV( face.c, i ).v + getUV( face.d, i ).v;
55956             avgUv.u /= 4;
55957             avgUv.v /= 4;
55958         }
55959
55960         addUV(originalVerticesLength + i, '', avgUv);
55961
55962     }
55963
55964     debug('-- added UVs for new Faces', uvForVertices);
55965
55966     // Step 2
55967     //    For each edge, add an edge point.
55968     //    Set each edge point to be the average of the two neighbouring face points and its two original endpoints.
55969
55970     var edgeFaceMap = computeEdgeFaces ( oldGeometry ); // Edge Hash -> Faces Index
55971     var edge, faceIndexA, faceIndexB, avg;
55972
55973     // debug('edgeFaceMap', edgeFaceMap);
55974
55975     var edgeCount = 0;
55976
55977     var edgeVertex, edgeVertexA, edgeVertexB;
55978
55979     ////
55980
55981     var vertexEdgeMap = {}; // Gives edges connecting from each vertex
55982     var vertexFaceMap = {}; // Gives faces connecting from each vertex
55983
55984     function addVertexEdgeMap(vertex, edge) {
55985         if (vertexEdgeMap[vertex]===undefined) {
55986             vertexEdgeMap[vertex] = [];
55987         }
55988
55989         vertexEdgeMap[vertex].push(edge);
55990     }
55991
55992     function addVertexFaceMap(vertex, face, edge) {
55993         if (vertexFaceMap[vertex]===undefined) {
55994             vertexFaceMap[vertex] = {};
55995         }
55996
55997         vertexFaceMap[vertex][face] = edge;
55998         // vertexFaceMap[vertex][face] = null;
55999     }
56000
56001     // Prepares vertexEdgeMap and vertexFaceMap
56002     for (i in edgeFaceMap) { // This is for every edge
56003         edge = edgeFaceMap[i];
56004
56005         edgeVertex = i.split('_');
56006         edgeVertexA = edgeVertex[0];
56007         edgeVertexB = edgeVertex[1];
56008
56009         // Maps an edgeVertex to connecting edges
56010         addVertexEdgeMap(edgeVertexA, [edgeVertexA, edgeVertexB] );
56011         addVertexEdgeMap(edgeVertexB, [edgeVertexA, edgeVertexB] );
56012
56013
56014         for (j=0,jl=edge.length;j<jl;j++) {
56015             face = edge[j];
56016
56017             addVertexFaceMap(edgeVertexA, face, i);
56018             addVertexFaceMap(edgeVertexB, face, i);
56019         }
56020
56021         if (edge.length < 2) {
56022             // edge is "sharp";
56023             sharpEdges[i] = true;
56024             sharpVertices[edgeVertexA] = true;
56025             sharpVertices[edgeVertexB] = true;
56026
56027         }
56028
56029     }
56030
56031     debug('vertexEdgeMap',vertexEdgeMap, 'vertexFaceMap', vertexFaceMap);
56032
56033
56034     for (i in edgeFaceMap) {
56035         edge = edgeFaceMap[i];
56036
56037         faceIndexA = edge[0]; // face index a
56038         faceIndexB = edge[1]; // face index b
56039
56040         edgeVertex = i.split('_');
56041         edgeVertexA = edgeVertex[0];
56042         edgeVertexB = edgeVertex[1];
56043
56044
56045         avg = new THREE.Vector3();
56046
56047         //debug(i, faceIndexB,facePoints[faceIndexB]);
56048
56049         if (sharpEdges[i]) {
56050             //debug('warning, ', i, 'edge has only 1 connecting face', edge);
56051
56052             // For a sharp edge, average the edge end points.
56053             avg.addSelf(originalPoints[edgeVertexA]);
56054             avg.addSelf(originalPoints[edgeVertexB]);
56055
56056             avg.multiplyScalar(0.5);
56057
56058             sharpVertices[newPoints.length] = true;
56059
56060         } else {
56061
56062             avg.addSelf(facePoints[faceIndexA]);
56063             avg.addSelf(facePoints[faceIndexB]);
56064
56065             avg.addSelf(originalPoints[edgeVertexA]);
56066             avg.addSelf(originalPoints[edgeVertexB]);
56067
56068             avg.multiplyScalar(0.25);
56069
56070         }
56071
56072         edgePoints[i] = originalVerticesLength + originalFaces.length + edgeCount;
56073
56074         newPoints.push( avg );
56075
56076         edgeCount ++;
56077
56078         if (!scope.supportUVs) {
56079             continue;
56080         }
56081
56082         // debug('faceIndexAB', faceIndexA, faceIndexB, sharpEdges[i]);
56083
56084         // Prepare subdivided uv
56085
56086         avgUv = new THREE.UV();
56087
56088         avgUv.u = getUV(edgeVertexA, faceIndexA).u + getUV(edgeVertexB, faceIndexA).u;
56089         avgUv.v = getUV(edgeVertexA, faceIndexA).v + getUV(edgeVertexB, faceIndexA).v;
56090         avgUv.u /= 2;
56091         avgUv.v /= 2;
56092
56093         addUV(edgePoints[i], faceIndexA, avgUv);
56094
56095         if (!sharpEdges[i]) {
56096         avgUv = new THREE.UV();
56097
56098         avgUv.u = getUV(edgeVertexA, faceIndexB).u + getUV(edgeVertexB, faceIndexB).u;
56099         avgUv.v = getUV(edgeVertexA, faceIndexB).v + getUV(edgeVertexB, faceIndexB).v;
56100         avgUv.u /= 2;
56101         avgUv.v /= 2;
56102
56103         addUV(edgePoints[i], faceIndexB, avgUv);
56104         }
56105
56106     }
56107
56108     debug('-- Step 2 done');
56109
56110     // Step 3
56111     //    For each face point, add an edge for every edge of the face,
56112     //    connecting the face point to each edge point for the face.
56113
56114
56115     var facePt, currentVerticeIndex;
56116
56117     var hashAB, hashBC, hashCD, hashDA, hashCA;
56118
56119     var abc123 = ['123', '12', '2', '23'];
56120     var bca123 = ['123', '23', '3', '31'];
56121     var cab123 = ['123', '31', '1', '12'];
56122     var abc1234 = ['1234', '12', '2', '23'];
56123     var bcd1234 = ['1234', '23', '3', '34'];
56124     var cda1234 = ['1234', '34', '4', '41'];
56125     var dab1234 = ['1234', '41', '1', '12'];
56126
56127
56128     for (i=0, il = facePoints.length; i<il ;i++) { // for every face
56129         facePt = facePoints[i];
56130         face = originalFaces[i];
56131         currentVerticeIndex = originalVerticesLength+ i;
56132
56133         if ( face instanceof THREE.Face3 ) {
56134
56135             // create 3 face4s
56136
56137             hashAB = edge_hash( face.a, face.b );
56138             hashBC = edge_hash( face.b, face.c );
56139             hashCA = edge_hash( face.c, face.a );
56140
56141             f4( currentVerticeIndex, edgePoints[hashAB], face.b, edgePoints[hashBC], face, abc123, i );
56142             f4( currentVerticeIndex, edgePoints[hashBC], face.c, edgePoints[hashCA], face, bca123, i );
56143             f4( currentVerticeIndex, edgePoints[hashCA], face.a, edgePoints[hashAB], face, cab123, i );
56144
56145         } else if ( face instanceof THREE.Face4 ) {
56146             // create 4 face4s
56147
56148             hashAB = edge_hash( face.a, face.b );
56149             hashBC = edge_hash( face.b, face.c );
56150             hashCD = edge_hash( face.c, face.d );
56151             hashDA = edge_hash( face.d, face.a );
56152
56153             f4( currentVerticeIndex, edgePoints[hashAB], face.b, edgePoints[hashBC], face, abc1234, i );
56154             f4( currentVerticeIndex, edgePoints[hashBC], face.c, edgePoints[hashCD], face, bcd1234, i );
56155             f4( currentVerticeIndex, edgePoints[hashCD], face.d, edgePoints[hashDA], face, cda1234, i );
56156             f4( currentVerticeIndex, edgePoints[hashDA], face.a, edgePoints[hashAB], face, dab1234, i );
56157
56158
56159         } else {
56160             debug('face should be a face!', face);
56161         }
56162     }
56163
56164     newVertices = newPoints;
56165
56166     // debug('original ', oldGeometry.vertices.length, oldGeometry.faces.length );
56167     // debug('new points', newPoints.length, 'faces', newFaces.length );
56168
56169     // Step 4
56170
56171     //    For each original point P,
56172     //        take the average F of all n face points for faces touching P,
56173     //        and take the average R of all n edge midpoints for edges touching P,
56174     //        where each edge midpoint is the average of its two endpoint vertices.
56175     //    Move each original point to the point
56176
56177
56178     var F = new THREE.Vector3();
56179     var R = new THREE.Vector3();
56180
56181     var n;
56182     for (i=0, il = originalPoints.length; i<il; i++) {
56183         // (F + 2R + (n-3)P) / n
56184
56185         if (vertexEdgeMap[i]===undefined) continue;
56186
56187         F.set(0,0,0);
56188         R.set(0,0,0);
56189         var newPos =  new THREE.Vector3(0,0,0);
56190
56191         var f =0;
56192         for (j in vertexFaceMap[i]) {
56193             F.addSelf(facePoints[j]);
56194             f++;
56195         }
56196
56197         var sharpEdgeCount = 0;
56198
56199         n = vertexEdgeMap[i].length;
56200
56201         for (j=0;j<n;j++) {
56202             if (
56203                 sharpEdges[
56204                     edge_hash(vertexEdgeMap[i][j][0],vertexEdgeMap[i][j][1])
56205                 ]) {
56206                     sharpEdgeCount++;
56207                 }
56208         }
56209
56210         if ( sharpEdgeCount==2 ) {
56211             continue;
56212             // Do not move vertex if there's 2 connecting sharp edges.
56213         }
56214
56215         /*
56216         if (sharpEdgeCount>2) {
56217             // TODO
56218         }
56219         */
56220
56221         F.divideScalar(f);
56222
56223
56224
56225         for (j=0; j<n;j++) {
56226             edge = vertexEdgeMap[i][j];
56227             var midPt = originalPoints[edge[0]].clone().addSelf(originalPoints[edge[1]]).divideScalar(2);
56228             R.addSelf(midPt);
56229             // R.addSelf(originalPoints[edge[0]]);
56230             // R.addSelf(originalPoints[edge[1]]);
56231         }
56232
56233         R.divideScalar(n);
56234
56235         newPos.addSelf(originalPoints[i]);
56236         newPos.multiplyScalar(n - 3);
56237
56238         newPos.addSelf(F);
56239         newPos.addSelf(R.multiplyScalar(2));
56240         newPos.divideScalar(n);
56241
56242         newVertices[i] = newPos;
56243
56244
56245     }
56246
56247     var newGeometry = oldGeometry; // Let's pretend the old geometry is now new :P
56248
56249     newGeometry.vertices = newVertices;
56250     newGeometry.faces = newFaces;
56251     newGeometry.faceVertexUvs[ 0 ] = newUVs;
56252
56253     delete newGeometry.__tmpVertices; // makes __tmpVertices undefined :P
56254
56255     newGeometry.computeCentroids();
56256     newGeometry.computeFaceNormals();
56257     newGeometry.computeVertexNormals();
56258
56259 };
56260 /**
56261  * @author alteredq / http://alteredqualia.com/
56262  */
56263
56264 THREE.ImmediateRenderObject = function ( ) {
56265
56266     THREE.Object3D.call( this );
56267
56268     this.render = function ( renderCallback ) { };
56269
56270 };
56271
56272 THREE.ImmediateRenderObject.prototype = Object.create( THREE.Object3D.prototype );
56273 /**
56274  * @author mikael emtinger / http://gomo.se/
56275  * @author alteredq / http://alteredqualia.com/
56276  */
56277
56278 THREE.LensFlare = function ( texture, size, distance, blending, color ) {
56279
56280     THREE.Object3D.call( this );
56281
56282     this.lensFlares = [];
56283
56284     this.positionScreen = new THREE.Vector3();
56285     this.customUpdateCallback = undefined;
56286
56287     if( texture !== undefined ) {
56288
56289         this.add( texture, size, distance, blending, color );
56290
56291     }
56292
56293 };
56294
56295 THREE.LensFlare.prototype = Object.create( THREE.Object3D.prototype );
56296
56297
56298 /*
56299  * Add: adds another flare
56300  */
56301
56302 THREE.LensFlare.prototype.add = function ( texture, size, distance, blending, color, opacity ) {
56303
56304     if( size === undefined ) size = -1;
56305     if( distance === undefined ) distance = 0;
56306     if( opacity === undefined ) opacity = 1;
56307     if( color === undefined ) color = new THREE.Color( 0xffffff );
56308     if( blending === undefined ) blending = THREE.NormalBlending;
56309
56310     distance = Math.min( distance, Math.max( 0, distance ) );
56311
56312     this.lensFlares.push( { texture: texture,             // THREE.Texture
56313                             size: size,                 // size in pixels (-1 = use texture.width)
56314                             distance: distance,         // distance (0-1) from light source (0=at light source)
56315                             x: 0, y: 0, z: 0,            // screen position (-1 => 1) z = 0 is ontop z = 1 is back
56316                             scale: 1,                     // scale
56317                             rotation: 1,                 // rotation
56318                             opacity: opacity,            // opacity
56319                             color: color,                // color
56320                             blending: blending } );        // blending
56321
56322 };
56323
56324
56325 /*
56326  * Update lens flares update positions on all flares based on the screen position
56327  * Set myLensFlare.customUpdateCallback to alter the flares in your project specific way.
56328  */
56329
56330 THREE.LensFlare.prototype.updateLensFlares = function () {
56331
56332     var f, fl = this.lensFlares.length;
56333     var flare;
56334     var vecX = -this.positionScreen.x * 2;
56335     var vecY = -this.positionScreen.y * 2;
56336
56337     for( f = 0; f < fl; f ++ ) {
56338
56339         flare = this.lensFlares[ f ];
56340
56341         flare.x = this.positionScreen.x + vecX * flare.distance;
56342         flare.y = this.positionScreen.y + vecY * flare.distance;
56343
56344         flare.wantedRotation = flare.x * Math.PI * 0.25;
56345         flare.rotation += ( flare.wantedRotation - flare.rotation ) * 0.25;
56346
56347     }
56348
56349 };
56350
56351
56352
56353
56354
56355
56356
56357
56358
56359
56360
56361
56362 /**
56363  * @author alteredq / http://alteredqualia.com/
56364  */
56365
56366 THREE.MorphBlendMesh = function( geometry, material ) {
56367
56368     THREE.Mesh.call( this, geometry, material );
56369
56370     this.animationsMap = {};
56371     this.animationsList = [];
56372
56373     // prepare default animation
56374     // (all frames played together in 1 second)
56375
56376     var numFrames = this.geometry.morphTargets.length;
56377
56378     var name = "__default";
56379
56380     var startFrame = 0;
56381     var endFrame = numFrames - 1;
56382
56383     var fps = numFrames / 1;
56384
56385     this.createAnimation( name, startFrame, endFrame, fps );
56386     this.setAnimationWeight( name, 1 );
56387
56388 };
56389
56390 THREE.MorphBlendMesh.prototype = Object.create( THREE.Mesh.prototype );
56391
56392 THREE.MorphBlendMesh.prototype.createAnimation = function ( name, start, end, fps ) {
56393
56394     var animation = {
56395
56396         startFrame: start,
56397         endFrame: end,
56398
56399         length: end - start + 1,
56400
56401         fps: fps,
56402         duration: ( end - start ) / fps,
56403
56404         lastFrame: 0,
56405         currentFrame: 0,
56406
56407         active: false,
56408
56409         time: 0,
56410         direction: 1,
56411         weight: 1,
56412
56413         directionBackwards: false,
56414         mirroredLoop: false
56415
56416     };
56417
56418     this.animationsMap[ name ] = animation;
56419     this.animationsList.push( animation );
56420
56421 };
56422
56423 THREE.MorphBlendMesh.prototype.autoCreateAnimations = function ( fps ) {
56424
56425     var pattern = /([a-z]+)(\d+)/;
56426
56427     var firstAnimation, frameRanges = {};
56428
56429     var geometry = this.geometry;
56430
56431     for ( var i = 0, il = geometry.morphTargets.length; i < il; i ++ ) {
56432
56433         var morph = geometry.morphTargets[ i ];
56434         var chunks = morph.name.match( pattern );
56435
56436         if ( chunks && chunks.length > 1 ) {
56437
56438             var name = chunks[ 1 ];
56439             var num = chunks[ 2 ];
56440
56441             if ( ! frameRanges[ name ] ) frameRanges[ name ] = { start: Infinity, end: -Infinity };
56442
56443             var range = frameRanges[ name ];
56444
56445             if ( i < range.start ) range.start = i;
56446             if ( i > range.end ) range.end = i;
56447
56448             if ( ! firstAnimation ) firstAnimation = name;
56449
56450         }
56451
56452     }
56453
56454     for ( var name in frameRanges ) {
56455
56456         var range = frameRanges[ name ];
56457         this.createAnimation( name, range.start, range.end, fps );
56458
56459     }
56460
56461     this.firstAnimation = firstAnimation;
56462
56463 };
56464
56465 THREE.MorphBlendMesh.prototype.setAnimationDirectionForward = function ( name ) {
56466
56467     var animation = this.animationsMap[ name ];
56468
56469     if ( animation ) {
56470
56471         animation.direction = 1;
56472         animation.directionBackwards = false;
56473
56474     }
56475
56476 };
56477
56478 THREE.MorphBlendMesh.prototype.setAnimationDirectionBackward = function ( name ) {
56479
56480     var animation = this.animationsMap[ name ];
56481
56482     if ( animation ) {
56483
56484         animation.direction = -1;
56485         animation.directionBackwards = true;
56486
56487     }
56488
56489 };
56490
56491 THREE.MorphBlendMesh.prototype.setAnimationFPS = function ( name, fps ) {
56492
56493     var animation = this.animationsMap[ name ];
56494
56495     if ( animation ) {
56496
56497         animation.fps = fps;
56498         animation.duration = ( animation.end - animation.start ) / animation.fps;
56499
56500     }
56501
56502 };
56503
56504 THREE.MorphBlendMesh.prototype.setAnimationDuration = function ( name, duration ) {
56505
56506     var animation = this.animationsMap[ name ];
56507
56508     if ( animation ) {
56509
56510         animation.duration = duration;
56511         animation.fps = ( animation.end - animation.start ) / animation.duration;
56512
56513     }
56514
56515 };
56516
56517 THREE.MorphBlendMesh.prototype.setAnimationWeight = function ( name, weight ) {
56518
56519     var animation = this.animationsMap[ name ];
56520
56521     if ( animation ) {
56522
56523         animation.weight = weight;
56524
56525     }
56526
56527 };
56528
56529 THREE.MorphBlendMesh.prototype.setAnimationTime = function ( name, time ) {
56530
56531     var animation = this.animationsMap[ name ];
56532
56533     if ( animation ) {
56534
56535         animation.time = time;
56536
56537     }
56538
56539 };
56540
56541 THREE.MorphBlendMesh.prototype.getAnimationTime = function ( name ) {
56542
56543     var time = 0;
56544
56545     var animation = this.animationsMap[ name ];
56546
56547     if ( animation ) {
56548
56549         time = animation.time;
56550
56551     }
56552
56553     return time;
56554
56555 };
56556
56557 THREE.MorphBlendMesh.prototype.getAnimationDuration = function ( name ) {
56558
56559     var duration = -1;
56560
56561     var animation = this.animationsMap[ name ];
56562
56563     if ( animation ) {
56564
56565         duration = animation.duration;
56566
56567     }
56568
56569     return duration;
56570
56571 };
56572
56573 THREE.MorphBlendMesh.prototype.playAnimation = function ( name ) {
56574
56575     var animation = this.animationsMap[ name ];
56576
56577     if ( animation ) {
56578
56579         animation.time = 0;
56580         animation.active = true;
56581
56582     } else {
56583
56584         console.warn( "animation[" + name + "] undefined" );
56585
56586     }
56587
56588 };
56589
56590 THREE.MorphBlendMesh.prototype.stopAnimation = function ( name ) {
56591
56592     var animation = this.animationsMap[ name ];
56593
56594     if ( animation ) {
56595
56596         animation.active = false;
56597
56598     }
56599
56600 };
56601
56602 THREE.MorphBlendMesh.prototype.update = function ( delta ) {
56603
56604     for ( var i = 0, il = this.animationsList.length; i < il; i ++ ) {
56605
56606         var animation = this.animationsList[ i ];
56607
56608         if ( ! animation.active ) continue;
56609
56610         var frameTime = animation.duration / animation.length;
56611
56612         animation.time += animation.direction * delta;
56613
56614         if ( animation.mirroredLoop ) {
56615
56616             if ( animation.time > animation.duration || animation.time < 0 ) {
56617
56618                 animation.direction *= -1;
56619
56620                 if ( animation.time > animation.duration ) {
56621
56622                     animation.time = animation.duration;
56623                     animation.directionBackwards = true;
56624
56625                 }
56626
56627                 if ( animation.time < 0 ) {
56628
56629                     animation.time = 0;
56630                     animation.directionBackwards = false;
56631
56632                 }
56633
56634             }
56635
56636         } else {
56637
56638             animation.time = animation.time % animation.duration;
56639
56640             if ( animation.time < 0 ) animation.time += animation.duration;
56641
56642         }
56643
56644         var keyframe = animation.startFrame + THREE.Math.clamp( Math.floor( animation.time / frameTime ), 0, animation.length - 1 );
56645         var weight = animation.weight;
56646
56647         if ( keyframe !== animation.currentFrame ) {
56648
56649             this.morphTargetInfluences[ animation.lastFrame ] = 0;
56650             this.morphTargetInfluences[ animation.currentFrame ] = 1 * weight;
56651
56652             this.morphTargetInfluences[ keyframe ] = 0;
56653
56654             animation.lastFrame = animation.currentFrame;
56655             animation.currentFrame = keyframe;
56656
56657         }
56658
56659         var mix = ( animation.time % frameTime ) / frameTime;
56660
56661         if ( animation.directionBackwards ) mix = 1 - mix;
56662
56663         this.morphTargetInfluences[ animation.currentFrame ] = mix * weight;
56664         this.morphTargetInfluences[ animation.lastFrame ] = ( 1 - mix ) * weight;
56665
56666     }
56667
56668 };
56669 /**
56670  * @author mikael emtinger / http://gomo.se/
56671  * @author alteredq / http://alteredqualia.com/
56672  */
56673
56674 THREE.LensFlarePlugin = function ( ) {
56675
56676     var _gl, _renderer, _lensFlare = {};
56677
56678     this.init = function ( renderer ) {
56679
56680         _gl = renderer.context;
56681         _renderer = renderer;
56682
56683         _lensFlare.vertices = new Float32Array( 8 + 8 );
56684         _lensFlare.faces = new Uint16Array( 6 );
56685
56686         var i = 0;
56687         _lensFlare.vertices[ i++ ] = -1; _lensFlare.vertices[ i++ ] = -1;    // vertex
56688         _lensFlare.vertices[ i++ ] = 0;  _lensFlare.vertices[ i++ ] = 0;    // uv... etc.
56689
56690         _lensFlare.vertices[ i++ ] = 1;  _lensFlare.vertices[ i++ ] = -1;
56691         _lensFlare.vertices[ i++ ] = 1;  _lensFlare.vertices[ i++ ] = 0;
56692
56693         _lensFlare.vertices[ i++ ] = 1;  _lensFlare.vertices[ i++ ] = 1;
56694         _lensFlare.vertices[ i++ ] = 1;  _lensFlare.vertices[ i++ ] = 1;
56695
56696         _lensFlare.vertices[ i++ ] = -1; _lensFlare.vertices[ i++ ] = 1;
56697         _lensFlare.vertices[ i++ ] = 0;  _lensFlare.vertices[ i++ ] = 1;
56698
56699         i = 0;
56700         _lensFlare.faces[ i++ ] = 0; _lensFlare.faces[ i++ ] = 1; _lensFlare.faces[ i++ ] = 2;
56701         _lensFlare.faces[ i++ ] = 0; _lensFlare.faces[ i++ ] = 2; _lensFlare.faces[ i++ ] = 3;
56702
56703         // buffers
56704
56705         _lensFlare.vertexBuffer     = _gl.createBuffer();
56706         _lensFlare.elementBuffer    = _gl.createBuffer();
56707
56708         _gl.bindBuffer( _gl.ARRAY_BUFFER, _lensFlare.vertexBuffer );
56709         _gl.bufferData( _gl.ARRAY_BUFFER, _lensFlare.vertices, _gl.STATIC_DRAW );
56710
56711         _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, _lensFlare.elementBuffer );
56712         _gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, _lensFlare.faces, _gl.STATIC_DRAW );
56713
56714         // textures
56715
56716         _lensFlare.tempTexture      = _gl.createTexture();
56717         _lensFlare.occlusionTexture = _gl.createTexture();
56718
56719         _gl.bindTexture( _gl.TEXTURE_2D, _lensFlare.tempTexture );
56720         _gl.texImage2D( _gl.TEXTURE_2D, 0, _gl.RGB, 16, 16, 0, _gl.RGB, _gl.UNSIGNED_BYTE, null );
56721         _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );
56722         _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );
56723         _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MAG_FILTER, _gl.NEAREST );
56724         _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MIN_FILTER, _gl.NEAREST );
56725
56726         _gl.bindTexture( _gl.TEXTURE_2D, _lensFlare.occlusionTexture );
56727         _gl.texImage2D( _gl.TEXTURE_2D, 0, _gl.RGBA, 16, 16, 0, _gl.RGBA, _gl.UNSIGNED_BYTE, null );
56728         _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );
56729         _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );
56730         _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MAG_FILTER, _gl.NEAREST );
56731         _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MIN_FILTER, _gl.NEAREST );
56732
56733         if ( _gl.getParameter( _gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS ) <= 0 ) {
56734
56735             _lensFlare.hasVertexTexture = false;
56736             _lensFlare.program = createProgram( THREE.ShaderFlares[ "lensFlare" ] );
56737
56738         } else {
56739
56740             _lensFlare.hasVertexTexture = true;
56741             _lensFlare.program = createProgram( THREE.ShaderFlares[ "lensFlareVertexTexture" ] );
56742
56743         }
56744
56745         _lensFlare.attributes = {};
56746         _lensFlare.uniforms = {};
56747
56748         _lensFlare.attributes.vertex       = _gl.getAttribLocation ( _lensFlare.program, "position" );
56749         _lensFlare.attributes.uv           = _gl.getAttribLocation ( _lensFlare.program, "uv" );
56750
56751         _lensFlare.uniforms.renderType     = _gl.getUniformLocation( _lensFlare.program, "renderType" );
56752         _lensFlare.uniforms.map            = _gl.getUniformLocation( _lensFlare.program, "map" );
56753         _lensFlare.uniforms.occlusionMap   = _gl.getUniformLocation( _lensFlare.program, "occlusionMap" );
56754         _lensFlare.uniforms.opacity        = _gl.getUniformLocation( _lensFlare.program, "opacity" );
56755         _lensFlare.uniforms.color          = _gl.getUniformLocation( _lensFlare.program, "color" );
56756         _lensFlare.uniforms.scale          = _gl.getUniformLocation( _lensFlare.program, "scale" );
56757         _lensFlare.uniforms.rotation       = _gl.getUniformLocation( _lensFlare.program, "rotation" );
56758         _lensFlare.uniforms.screenPosition = _gl.getUniformLocation( _lensFlare.program, "screenPosition" );
56759
56760         _lensFlare.attributesEnabled = false;
56761
56762     };
56763
56764
56765     /*
56766      * Render lens flares
56767      * Method: renders 16x16 0xff00ff-colored points scattered over the light source area,
56768      *         reads these back and calculates occlusion.
56769      *         Then _lensFlare.update_lensFlares() is called to re-position and
56770      *         update transparency of flares. Then they are rendered.
56771      *
56772      */
56773
56774     this.render = function ( scene, camera, viewportWidth, viewportHeight ) {
56775
56776         var flares = scene.__webglFlares,
56777             nFlares = flares.length;
56778
56779         if ( ! nFlares ) return;
56780
56781         var tempPosition = new THREE.Vector3();
56782
56783         var invAspect = viewportHeight / viewportWidth,
56784             halfViewportWidth = viewportWidth * 0.5,
56785             halfViewportHeight = viewportHeight * 0.5;
56786
56787         var size = 16 / viewportHeight,
56788             scale = new THREE.Vector2( size * invAspect, size );
56789
56790         var screenPosition = new THREE.Vector3( 1, 1, 0 ),
56791             screenPositionPixels = new THREE.Vector2( 1, 1 );
56792
56793         var uniforms = _lensFlare.uniforms,
56794             attributes = _lensFlare.attributes;
56795
56796         // set _lensFlare program and reset blending
56797
56798         _gl.useProgram( _lensFlare.program );
56799
56800         if ( ! _lensFlare.attributesEnabled ) {
56801
56802             _gl.enableVertexAttribArray( _lensFlare.attributes.vertex );
56803             _gl.enableVertexAttribArray( _lensFlare.attributes.uv );
56804
56805             _lensFlare.attributesEnabled = true;
56806
56807         }
56808
56809         // loop through all lens flares to update their occlusion and positions
56810         // setup gl and common used attribs/unforms
56811
56812         _gl.uniform1i( uniforms.occlusionMap, 0 );
56813         _gl.uniform1i( uniforms.map, 1 );
56814
56815         _gl.bindBuffer( _gl.ARRAY_BUFFER, _lensFlare.vertexBuffer );
56816         _gl.vertexAttribPointer( attributes.vertex, 2, _gl.FLOAT, false, 2 * 8, 0 );
56817         _gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 2 * 8, 8 );
56818
56819         _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, _lensFlare.elementBuffer );
56820
56821         _gl.disable( _gl.CULL_FACE );
56822         _gl.depthMask( false );
56823
56824         var i, j, jl, flare, sprite;
56825
56826         for ( i = 0; i < nFlares; i ++ ) {
56827
56828             size = 16 / viewportHeight;
56829             scale.set( size * invAspect, size );
56830
56831             // calc object screen position
56832
56833             flare = flares[ i ];
56834
56835             tempPosition.set( flare.matrixWorld.elements[12], flare.matrixWorld.elements[13], flare.matrixWorld.elements[14] );
56836
56837             camera.matrixWorldInverse.multiplyVector3( tempPosition );
56838             camera.projectionMatrix.multiplyVector3( tempPosition );
56839
56840             // setup arrays for gl programs
56841
56842             screenPosition.copy( tempPosition )
56843
56844             screenPositionPixels.x = screenPosition.x * halfViewportWidth + halfViewportWidth;
56845             screenPositionPixels.y = screenPosition.y * halfViewportHeight + halfViewportHeight;
56846
56847             // screen cull
56848
56849             if ( _lensFlare.hasVertexTexture || (
56850                 screenPositionPixels.x > 0 &&
56851                 screenPositionPixels.x < viewportWidth &&
56852                 screenPositionPixels.y > 0 &&
56853                 screenPositionPixels.y < viewportHeight ) ) {
56854
56855                 // save current RGB to temp texture
56856
56857                 _gl.activeTexture( _gl.TEXTURE1 );
56858                 _gl.bindTexture( _gl.TEXTURE_2D, _lensFlare.tempTexture );
56859                 _gl.copyTexImage2D( _gl.TEXTURE_2D, 0, _gl.RGB, screenPositionPixels.x - 8, screenPositionPixels.y - 8, 16, 16, 0 );
56860
56861
56862                 // render pink quad
56863
56864                 _gl.uniform1i( uniforms.renderType, 0 );
56865                 _gl.uniform2f( uniforms.scale, scale.x, scale.y );
56866                 _gl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );
56867
56868                 _gl.disable( _gl.BLEND );
56869                 _gl.enable( _gl.DEPTH_TEST );
56870
56871                 _gl.drawElements( _gl.TRIANGLES, 6, _gl.UNSIGNED_SHORT, 0 );
56872
56873
56874                 // copy result to occlusionMap
56875
56876                 _gl.activeTexture( _gl.TEXTURE0 );
56877                 _gl.bindTexture( _gl.TEXTURE_2D, _lensFlare.occlusionTexture );
56878                 _gl.copyTexImage2D( _gl.TEXTURE_2D, 0, _gl.RGBA, screenPositionPixels.x - 8, screenPositionPixels.y - 8, 16, 16, 0 );
56879
56880
56881                 // restore graphics
56882
56883                 _gl.uniform1i( uniforms.renderType, 1 );
56884                 _gl.disable( _gl.DEPTH_TEST );
56885
56886                 _gl.activeTexture( _gl.TEXTURE1 );
56887                 _gl.bindTexture( _gl.TEXTURE_2D, _lensFlare.tempTexture );
56888                 _gl.drawElements( _gl.TRIANGLES, 6, _gl.UNSIGNED_SHORT, 0 );
56889
56890
56891                 // update object positions
56892
56893                 flare.positionScreen.copy( screenPosition )
56894
56895                 if ( flare.customUpdateCallback ) {
56896
56897                     flare.customUpdateCallback( flare );
56898
56899                 } else {
56900
56901                     flare.updateLensFlares();
56902
56903                 }
56904
56905                 // render flares
56906
56907                 _gl.uniform1i( uniforms.renderType, 2 );
56908                 _gl.enable( _gl.BLEND );
56909
56910                 for ( j = 0, jl = flare.lensFlares.length; j < jl; j ++ ) {
56911
56912                     sprite = flare.lensFlares[ j ];
56913
56914                     if ( sprite.opacity > 0.001 && sprite.scale > 0.001 ) {
56915
56916                         screenPosition.x = sprite.x;
56917                         screenPosition.y = sprite.y;
56918                         screenPosition.z = sprite.z;
56919
56920                         size = sprite.size * sprite.scale / viewportHeight;
56921
56922                         scale.x = size * invAspect;
56923                         scale.y = size;
56924
56925                         _gl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );
56926                         _gl.uniform2f( uniforms.scale, scale.x, scale.y );
56927                         _gl.uniform1f( uniforms.rotation, sprite.rotation );
56928
56929                         _gl.uniform1f( uniforms.opacity, sprite.opacity );
56930                         _gl.uniform3f( uniforms.color, sprite.color.r, sprite.color.g, sprite.color.b );
56931
56932                         _renderer.setBlending( sprite.blending, sprite.blendEquation, sprite.blendSrc, sprite.blendDst );
56933                         _renderer.setTexture( sprite.texture, 1 );
56934
56935                         _gl.drawElements( _gl.TRIANGLES, 6, _gl.UNSIGNED_SHORT, 0 );
56936
56937                     }
56938
56939                 }
56940
56941             }
56942
56943         }
56944
56945         // restore gl
56946
56947         _gl.enable( _gl.CULL_FACE );
56948         _gl.enable( _gl.DEPTH_TEST );
56949         _gl.depthMask( true );
56950
56951     };
56952
56953     function createProgram ( shader ) {
56954
56955         var program = _gl.createProgram();
56956
56957         var fragmentShader = _gl.createShader( _gl.FRAGMENT_SHADER );
56958         var vertexShader = _gl.createShader( _gl.VERTEX_SHADER );
56959
56960         _gl.shaderSource( fragmentShader, shader.fragmentShader );
56961         _gl.shaderSource( vertexShader, shader.vertexShader );
56962
56963         _gl.compileShader( fragmentShader );
56964         _gl.compileShader( vertexShader );
56965
56966         _gl.attachShader( program, fragmentShader );
56967         _gl.attachShader( program, vertexShader );
56968
56969         _gl.linkProgram( program );
56970
56971         return program;
56972
56973     };
56974
56975 };/**
56976  * @author alteredq / http://alteredqualia.com/
56977  */
56978
56979 THREE.ShadowMapPlugin = function ( ) {
56980
56981     var _gl,
56982     _renderer,
56983     _depthMaterial, _depthMaterialMorph, _depthMaterialSkin, _depthMaterialMorphSkin,
56984
56985     _frustum = new THREE.Frustum(),
56986     _projScreenMatrix = new THREE.Matrix4(),
56987
56988     _min = new THREE.Vector3(),
56989     _max = new THREE.Vector3();
56990
56991     this.init = function ( renderer ) {
56992
56993         _gl = renderer.context;
56994         _renderer = renderer;
56995
56996         var depthShader = THREE.ShaderLib[ "depthRGBA" ];
56997         var depthUniforms = THREE.UniformsUtils.clone( depthShader.uniforms );
56998
56999         _depthMaterial = new THREE.ShaderMaterial( { fragmentShader: depthShader.fragmentShader, vertexShader: depthShader.vertexShader, uniforms: depthUniforms } );
57000         _depthMaterialMorph = new THREE.ShaderMaterial( { fragmentShader: depthShader.fragmentShader, vertexShader: depthShader.vertexShader, uniforms: depthUniforms, morphTargets: true } );
57001         _depthMaterialSkin = new THREE.ShaderMaterial( { fragmentShader: depthShader.fragmentShader, vertexShader: depthShader.vertexShader, uniforms: depthUniforms, skinning: true } );
57002         _depthMaterialMorphSkin = new THREE.ShaderMaterial( { fragmentShader: depthShader.fragmentShader, vertexShader: depthShader.vertexShader, uniforms: depthUniforms, morphTargets: true, skinning: true } );
57003
57004         _depthMaterial._shadowPass = true;
57005         _depthMaterialMorph._shadowPass = true;
57006         _depthMaterialSkin._shadowPass = true;
57007         _depthMaterialMorphSkin._shadowPass = true;
57008
57009     };
57010
57011     this.render = function ( scene, camera ) {
57012
57013         if ( ! ( _renderer.shadowMapEnabled && _renderer.shadowMapAutoUpdate ) ) return;
57014
57015         this.update( scene, camera );
57016
57017     };
57018
57019     this.update = function ( scene, camera ) {
57020
57021         var i, il, j, jl, n,
57022
57023         shadowMap, shadowMatrix, shadowCamera,
57024         program, buffer, material,
57025         webglObject, object, light,
57026         renderList,
57027
57028         lights = [],
57029         k = 0,
57030
57031         fog = null;
57032
57033         // set GL state for depth map
57034
57035         _gl.clearColor( 1, 1, 1, 1 );
57036         _gl.disable( _gl.BLEND );
57037
57038         _gl.enable( _gl.CULL_FACE );
57039         _gl.frontFace( _gl.CCW );
57040
57041         if ( _renderer.shadowMapCullFrontFaces ) {
57042
57043             _gl.cullFace( _gl.FRONT );
57044
57045         } else {
57046
57047             _gl.cullFace( _gl.BACK );
57048
57049         }
57050
57051         _renderer.setDepthTest( true );
57052
57053         // preprocess lights
57054         //     - skip lights that are not casting shadows
57055         //    - create virtual lights for cascaded shadow maps
57056
57057         for ( i = 0, il = scene.__lights.length; i < il; i ++ ) {
57058
57059             light = scene.__lights[ i ];
57060
57061             if ( ! light.castShadow ) continue;
57062
57063             if ( ( light instanceof THREE.DirectionalLight ) && light.shadowCascade ) {
57064
57065                 for ( n = 0; n < light.shadowCascadeCount; n ++ ) {
57066
57067                     var virtualLight;
57068
57069                     if ( ! light.shadowCascadeArray[ n ] ) {
57070
57071                         virtualLight = createVirtualLight( light, n );
57072                         virtualLight.originalCamera = camera;
57073
57074                         var gyro = new THREE.Gyroscope();
57075                         gyro.position = light.shadowCascadeOffset;
57076
57077                         gyro.add( virtualLight );
57078                         gyro.add( virtualLight.target );
57079
57080                         camera.add( gyro );
57081
57082                         light.shadowCascadeArray[ n ] = virtualLight;
57083
57084                         console.log( "Created virtualLight", virtualLight );
57085
57086                     } else {
57087
57088                         virtualLight = light.shadowCascadeArray[ n ];
57089
57090                     }
57091
57092                     updateVirtualLight( light, n );
57093
57094                     lights[ k ] = virtualLight;
57095                     k ++;
57096
57097                 }
57098
57099             } else {
57100
57101                 lights[ k ] = light;
57102                 k ++;
57103
57104             }
57105
57106         }
57107
57108         // render depth map
57109
57110         for ( i = 0, il = lights.length; i < il; i ++ ) {
57111
57112             light = lights[ i ];
57113
57114             if ( ! light.shadowMap ) {
57115
57116                 var pars = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBAFormat };
57117
57118                 light.shadowMap = new THREE.WebGLRenderTarget( light.shadowMapWidth, light.shadowMapHeight, pars );
57119                 light.shadowMapSize = new THREE.Vector2( light.shadowMapWidth, light.shadowMapHeight );
57120
57121                 light.shadowMatrix = new THREE.Matrix4();
57122
57123             }
57124
57125             if ( ! light.shadowCamera ) {
57126
57127                 if ( light instanceof THREE.SpotLight ) {
57128
57129                     light.shadowCamera = new THREE.PerspectiveCamera( light.shadowCameraFov, light.shadowMapWidth / light.shadowMapHeight, light.shadowCameraNear, light.shadowCameraFar );
57130
57131                 } else if ( light instanceof THREE.DirectionalLight ) {
57132
57133                     light.shadowCamera = new THREE.OrthographicCamera( light.shadowCameraLeft, light.shadowCameraRight, light.shadowCameraTop, light.shadowCameraBottom, light.shadowCameraNear, light.shadowCameraFar );
57134
57135                 } else {
57136
57137                     console.error( "Unsupported light type for shadow" );
57138                     continue;
57139
57140                 }
57141
57142                 scene.add( light.shadowCamera );
57143
57144                 if ( _renderer.autoUpdateScene ) scene.updateMatrixWorld();
57145
57146             }
57147
57148             if ( light.shadowCameraVisible && ! light.cameraHelper ) {
57149
57150                 light.cameraHelper = new THREE.CameraHelper( light.shadowCamera );
57151                 light.shadowCamera.add( light.cameraHelper );
57152
57153             }
57154
57155             if ( light.isVirtual && virtualLight.originalCamera == camera ) {
57156
57157                 updateShadowCamera( camera, light );
57158
57159             }
57160
57161             shadowMap = light.shadowMap;
57162             shadowMatrix = light.shadowMatrix;
57163             shadowCamera = light.shadowCamera;
57164
57165             shadowCamera.position.copy( light.matrixWorld.getPosition() );
57166             shadowCamera.lookAt( light.target.matrixWorld.getPosition() );
57167             shadowCamera.updateMatrixWorld();
57168
57169             shadowCamera.matrixWorldInverse.getInverse( shadowCamera.matrixWorld );
57170
57171             if ( light.cameraHelper ) light.cameraHelper.visible = light.shadowCameraVisible;
57172             if ( light.shadowCameraVisible ) light.cameraHelper.update();
57173
57174             // compute shadow matrix
57175
57176             shadowMatrix.set( 0.5, 0.0, 0.0, 0.5,
57177                               0.0, 0.5, 0.0, 0.5,
57178                               0.0, 0.0, 0.5, 0.5,
57179                               0.0, 0.0, 0.0, 1.0 );
57180
57181             shadowMatrix.multiplySelf( shadowCamera.projectionMatrix );
57182             shadowMatrix.multiplySelf( shadowCamera.matrixWorldInverse );
57183
57184             // update camera matrices and frustum
57185
57186             if ( ! shadowCamera._viewMatrixArray ) shadowCamera._viewMatrixArray = new Float32Array( 16 );
57187             if ( ! shadowCamera._projectionMatrixArray ) shadowCamera._projectionMatrixArray = new Float32Array( 16 );
57188
57189             shadowCamera.matrixWorldInverse.flattenToArray( shadowCamera._viewMatrixArray );
57190             shadowCamera.projectionMatrix.flattenToArray( shadowCamera._projectionMatrixArray );
57191
57192             _projScreenMatrix.multiply( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );
57193             _frustum.setFromMatrix( _projScreenMatrix );
57194
57195             // render shadow map
57196
57197             _renderer.setRenderTarget( shadowMap );
57198             _renderer.clear();
57199
57200             // set object matrices & frustum culling
57201
57202             renderList = scene.__webglObjects;
57203
57204             for ( j = 0, jl = renderList.length; j < jl; j ++ ) {
57205
57206                 webglObject = renderList[ j ];
57207                 object = webglObject.object;
57208
57209                 webglObject.render = false;
57210
57211                 if ( object.visible && object.castShadow ) {
57212
57213                     if ( ! ( object instanceof THREE.Mesh ) || ! ( object.frustumCulled ) || _frustum.contains( object ) ) {
57214
57215                         object._modelViewMatrix.multiply( shadowCamera.matrixWorldInverse, object.matrixWorld );
57216
57217                         webglObject.render = true;
57218
57219                     }
57220
57221                 }
57222
57223             }
57224
57225             // render regular objects
57226
57227             for ( j = 0, jl = renderList.length; j < jl; j ++ ) {
57228
57229                 webglObject = renderList[ j ];
57230
57231                 if ( webglObject.render ) {
57232
57233                     object = webglObject.object;
57234                     buffer = webglObject.buffer;
57235
57236                     // culling is overriden globally for all objects
57237                     // while rendering depth map
57238
57239                     if ( object.customDepthMaterial ) {
57240
57241                         material = object.customDepthMaterial;
57242
57243                     } else if ( object instanceof THREE.SkinnedMesh ) {
57244
57245                         material = object.geometry.morphTargets.length ? _depthMaterialMorphSkin : _depthMaterialSkin;
57246
57247                     } else if ( object.geometry.morphTargets.length ) {
57248
57249                         material = _depthMaterialMorph;
57250
57251                     } else {
57252
57253                         material = _depthMaterial;
57254
57255                     }
57256
57257                     if ( buffer instanceof THREE.BufferGeometry ) {
57258
57259                         _renderer.renderBufferDirect( shadowCamera, scene.__lights, fog, material, buffer, object );
57260
57261                     } else {
57262
57263                         _renderer.renderBuffer( shadowCamera, scene.__lights, fog, material, buffer, object );
57264
57265                     }
57266
57267                 }
57268
57269             }
57270
57271             // set matrices and render immediate objects
57272
57273             renderList = scene.__webglObjectsImmediate;
57274
57275             for ( j = 0, jl = renderList.length; j < jl; j ++ ) {
57276
57277                 webglObject = renderList[ j ];
57278                 object = webglObject.object;
57279
57280                 if ( object.visible && object.castShadow ) {
57281
57282                     object._modelViewMatrix.multiply( shadowCamera.matrixWorldInverse, object.matrixWorld );
57283
57284                     _renderer.renderImmediateObject( shadowCamera, scene.__lights, fog, _depthMaterial, object );
57285
57286                 }
57287
57288             }
57289
57290         }
57291
57292         // restore GL state
57293
57294         var clearColor = _renderer.getClearColor(),
57295         clearAlpha = _renderer.getClearAlpha();
57296
57297         _gl.clearColor( clearColor.r, clearColor.g, clearColor.b, clearAlpha );
57298         _gl.enable( _gl.BLEND );
57299
57300         if ( _renderer.shadowMapCullFrontFaces ) {
57301
57302             _gl.cullFace( _gl.BACK );
57303
57304         }
57305
57306     };
57307
57308     function createVirtualLight( light, cascade ) {
57309
57310         var virtualLight = new THREE.DirectionalLight();
57311
57312         virtualLight.isVirtual = true;
57313
57314         virtualLight.onlyShadow = true;
57315         virtualLight.castShadow = true;
57316
57317         virtualLight.shadowCameraNear = light.shadowCameraNear;
57318         virtualLight.shadowCameraFar = light.shadowCameraFar;
57319
57320         virtualLight.shadowCameraLeft = light.shadowCameraLeft;
57321         virtualLight.shadowCameraRight = light.shadowCameraRight;
57322         virtualLight.shadowCameraBottom = light.shadowCameraBottom;
57323         virtualLight.shadowCameraTop = light.shadowCameraTop;
57324
57325         virtualLight.shadowCameraVisible = light.shadowCameraVisible;
57326
57327         virtualLight.shadowDarkness = light.shadowDarkness;
57328
57329         virtualLight.shadowBias = light.shadowCascadeBias[ cascade ];
57330         virtualLight.shadowMapWidth = light.shadowCascadeWidth[ cascade ];
57331         virtualLight.shadowMapHeight = light.shadowCascadeHeight[ cascade ];
57332
57333         virtualLight.pointsWorld = [];
57334         virtualLight.pointsFrustum = [];
57335
57336         var pointsWorld = virtualLight.pointsWorld,
57337             pointsFrustum = virtualLight.pointsFrustum;
57338
57339         for ( var i = 0; i < 8; i ++ ) {
57340
57341             pointsWorld[ i ] = new THREE.Vector3();
57342             pointsFrustum[ i ] = new THREE.Vector3();
57343
57344         }
57345
57346         var nearZ = light.shadowCascadeNearZ[ cascade ];
57347         var farZ = light.shadowCascadeFarZ[ cascade ];
57348
57349         pointsFrustum[ 0 ].set( -1, -1, nearZ );
57350         pointsFrustum[ 1 ].set(  1, -1, nearZ );
57351         pointsFrustum[ 2 ].set( -1,  1, nearZ );
57352         pointsFrustum[ 3 ].set(  1,  1, nearZ );
57353
57354         pointsFrustum[ 4 ].set( -1, -1, farZ );
57355         pointsFrustum[ 5 ].set(  1, -1, farZ );
57356         pointsFrustum[ 6 ].set( -1,  1, farZ );
57357         pointsFrustum[ 7 ].set(  1,  1, farZ );
57358
57359         return virtualLight;
57360
57361     }
57362
57363     // Synchronize virtual light with the original light
57364
57365     function updateVirtualLight( light, cascade ) {
57366
57367         var virtualLight = light.shadowCascadeArray[ cascade ];
57368
57369         virtualLight.position.copy( light.position );
57370         virtualLight.target.position.copy( light.target.position );
57371         virtualLight.lookAt( virtualLight.target );
57372
57373         virtualLight.shadowCameraVisible = light.shadowCameraVisible;
57374         virtualLight.shadowDarkness = light.shadowDarkness;
57375
57376         virtualLight.shadowBias = light.shadowCascadeBias[ cascade ];
57377
57378         var nearZ = light.shadowCascadeNearZ[ cascade ];
57379         var farZ = light.shadowCascadeFarZ[ cascade ];
57380
57381         var pointsFrustum = virtualLight.pointsFrustum;
57382
57383         pointsFrustum[ 0 ].z = nearZ;
57384         pointsFrustum[ 1 ].z = nearZ;
57385         pointsFrustum[ 2 ].z = nearZ;
57386         pointsFrustum[ 3 ].z = nearZ;
57387
57388         pointsFrustum[ 4 ].z = farZ;
57389         pointsFrustum[ 5 ].z = farZ;
57390         pointsFrustum[ 6 ].z = farZ;
57391         pointsFrustum[ 7 ].z = farZ;
57392
57393     }
57394
57395     // Fit shadow camera's ortho frustum to camera frustum
57396
57397     function updateShadowCamera( camera, light ) {
57398
57399         var shadowCamera = light.shadowCamera,
57400             pointsFrustum = light.pointsFrustum,
57401             pointsWorld = light.pointsWorld;
57402
57403         _min.set( Infinity, Infinity, Infinity );
57404         _max.set( -Infinity, -Infinity, -Infinity );
57405
57406         for ( var i = 0; i < 8; i ++ ) {
57407
57408             var p = pointsWorld[ i ];
57409
57410             p.copy( pointsFrustum[ i ] );
57411             THREE.ShadowMapPlugin.__projector.unprojectVector( p, camera );
57412
57413             shadowCamera.matrixWorldInverse.multiplyVector3( p );
57414
57415             if ( p.x < _min.x ) _min.x = p.x;
57416             if ( p.x > _max.x ) _max.x = p.x;
57417
57418             if ( p.y < _min.y ) _min.y = p.y;
57419             if ( p.y > _max.y ) _max.y = p.y;
57420
57421             if ( p.z < _min.z ) _min.z = p.z;
57422             if ( p.z > _max.z ) _max.z = p.z;
57423
57424         }
57425
57426         shadowCamera.left = _min.x;
57427         shadowCamera.right = _max.x;
57428         shadowCamera.top = _max.y;
57429         shadowCamera.bottom = _min.y;
57430
57431         // can't really fit near/far
57432         //shadowCamera.near = _min.z;
57433         //shadowCamera.far = _max.z;
57434
57435         shadowCamera.updateProjectionMatrix();
57436
57437     }
57438
57439 };
57440
57441 THREE.ShadowMapPlugin.__projector = new THREE.Projector();
57442 /**
57443  * @author mikael emtinger / http://gomo.se/
57444  * @author alteredq / http://alteredqualia.com/
57445  */
57446
57447 THREE.SpritePlugin = function ( ) {
57448
57449     var _gl, _renderer, _sprite = {};
57450
57451     this.init = function ( renderer ) {
57452
57453         _gl = renderer.context;
57454         _renderer = renderer;
57455
57456         _sprite.vertices = new Float32Array( 8 + 8 );
57457         _sprite.faces    = new Uint16Array( 6 );
57458
57459         var i = 0;
57460
57461         _sprite.vertices[ i++ ] = -1; _sprite.vertices[ i++ ] = -1;    // vertex 0
57462         _sprite.vertices[ i++ ] = 0;  _sprite.vertices[ i++ ] = 0;    // uv 0
57463
57464         _sprite.vertices[ i++ ] = 1;  _sprite.vertices[ i++ ] = -1;    // vertex 1
57465         _sprite.vertices[ i++ ] = 1;  _sprite.vertices[ i++ ] = 0;    // uv 1
57466
57467         _sprite.vertices[ i++ ] = 1;  _sprite.vertices[ i++ ] = 1;    // vertex 2
57468         _sprite.vertices[ i++ ] = 1;  _sprite.vertices[ i++ ] = 1;    // uv 2
57469
57470         _sprite.vertices[ i++ ] = -1; _sprite.vertices[ i++ ] = 1;    // vertex 3
57471         _sprite.vertices[ i++ ] = 0;  _sprite.vertices[ i++ ] = 1;    // uv 3
57472
57473         i = 0;
57474
57475         _sprite.faces[ i++ ] = 0; _sprite.faces[ i++ ] = 1; _sprite.faces[ i++ ] = 2;
57476         _sprite.faces[ i++ ] = 0; _sprite.faces[ i++ ] = 2; _sprite.faces[ i++ ] = 3;
57477
57478         _sprite.vertexBuffer  = _gl.createBuffer();
57479         _sprite.elementBuffer = _gl.createBuffer();
57480
57481         _gl.bindBuffer( _gl.ARRAY_BUFFER, _sprite.vertexBuffer );
57482         _gl.bufferData( _gl.ARRAY_BUFFER, _sprite.vertices, _gl.STATIC_DRAW );
57483
57484         _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, _sprite.elementBuffer );
57485         _gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, _sprite.faces, _gl.STATIC_DRAW );
57486
57487         _sprite.program = createProgram( THREE.ShaderSprite[ "sprite" ] );
57488
57489         _sprite.attributes = {};
57490         _sprite.uniforms = {};
57491
57492         _sprite.attributes.position           = _gl.getAttribLocation ( _sprite.program, "position" );
57493         _sprite.attributes.uv                 = _gl.getAttribLocation ( _sprite.program, "uv" );
57494
57495         _sprite.uniforms.uvOffset             = _gl.getUniformLocation( _sprite.program, "uvOffset" );
57496         _sprite.uniforms.uvScale              = _gl.getUniformLocation( _sprite.program, "uvScale" );
57497
57498         _sprite.uniforms.rotation             = _gl.getUniformLocation( _sprite.program, "rotation" );
57499         _sprite.uniforms.scale                = _gl.getUniformLocation( _sprite.program, "scale" );
57500         _sprite.uniforms.alignment            = _gl.getUniformLocation( _sprite.program, "alignment" );
57501
57502         _sprite.uniforms.color                = _gl.getUniformLocation( _sprite.program, "color" );
57503         _sprite.uniforms.map                  = _gl.getUniformLocation( _sprite.program, "map" );
57504         _sprite.uniforms.opacity              = _gl.getUniformLocation( _sprite.program, "opacity" );
57505
57506         _sprite.uniforms.useScreenCoordinates = _gl.getUniformLocation( _sprite.program, "useScreenCoordinates" );
57507         _sprite.uniforms.affectedByDistance   = _gl.getUniformLocation( _sprite.program, "affectedByDistance" );
57508         _sprite.uniforms.screenPosition          = _gl.getUniformLocation( _sprite.program, "screenPosition" );
57509         _sprite.uniforms.modelViewMatrix      = _gl.getUniformLocation( _sprite.program, "modelViewMatrix" );
57510         _sprite.uniforms.projectionMatrix     = _gl.getUniformLocation( _sprite.program, "projectionMatrix" );
57511
57512         _sprite.attributesEnabled = false;
57513
57514     };
57515
57516     this.render = function ( scene, camera, viewportWidth, viewportHeight ) {
57517
57518         var sprites = scene.__webglSprites,
57519             nSprites = sprites.length;
57520
57521         if ( ! nSprites ) return;
57522
57523         var attributes = _sprite.attributes,
57524             uniforms = _sprite.uniforms;
57525
57526         var invAspect = viewportHeight / viewportWidth;
57527
57528         var halfViewportWidth = viewportWidth * 0.5,
57529             halfViewportHeight = viewportHeight * 0.5;
57530
57531         var mergeWith3D = true;
57532
57533         // setup gl
57534
57535         _gl.useProgram( _sprite.program );
57536
57537         if ( ! _sprite.attributesEnabled ) {
57538
57539             _gl.enableVertexAttribArray( attributes.position );
57540             _gl.enableVertexAttribArray( attributes.uv );
57541
57542             _sprite.attributesEnabled = true;
57543
57544         }
57545
57546         _gl.disable( _gl.CULL_FACE );
57547         _gl.enable( _gl.BLEND );
57548         _gl.depthMask( true );
57549
57550         _gl.bindBuffer( _gl.ARRAY_BUFFER, _sprite.vertexBuffer );
57551         _gl.vertexAttribPointer( attributes.position, 2, _gl.FLOAT, false, 2 * 8, 0 );
57552         _gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 2 * 8, 8 );
57553
57554         _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, _sprite.elementBuffer );
57555
57556         _gl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera._projectionMatrixArray );
57557
57558         _gl.activeTexture( _gl.TEXTURE0 );
57559         _gl.uniform1i( uniforms.map, 0 );
57560
57561         // update positions and sort
57562
57563         var i, sprite, screenPosition, size, scale = [];
57564
57565         for( i = 0; i < nSprites; i ++ ) {
57566
57567             sprite = sprites[ i ];
57568
57569             if ( ! sprite.visible || sprite.opacity === 0 ) continue;
57570
57571             if( ! sprite.useScreenCoordinates ) {
57572
57573                 sprite._modelViewMatrix.multiply( camera.matrixWorldInverse, sprite.matrixWorld );
57574                 sprite.z = - sprite._modelViewMatrix.elements[14];
57575
57576             } else {
57577
57578                 sprite.z = - sprite.position.z;
57579
57580             }
57581
57582         }
57583
57584         sprites.sort( painterSort );
57585
57586         // render all sprites
57587
57588         for( i = 0; i < nSprites; i ++ ) {
57589
57590             sprite = sprites[ i ];
57591
57592             if ( ! sprite.visible || sprite.opacity === 0 ) continue;
57593
57594             if ( sprite.map && sprite.map.image && sprite.map.image.width ) {
57595
57596                 if ( sprite.useScreenCoordinates ) {
57597
57598                     _gl.uniform1i( uniforms.useScreenCoordinates, 1 );
57599                     _gl.uniform3f( uniforms.screenPosition, ( sprite.position.x - halfViewportWidth  ) / halfViewportWidth,
57600                                                             ( halfViewportHeight - sprite.position.y ) / halfViewportHeight,
57601                                                               Math.max( 0, Math.min( 1, sprite.position.z ) ) );
57602
57603                 } else {
57604
57605                     _gl.uniform1i( uniforms.useScreenCoordinates, 0 );
57606                     _gl.uniform1i( uniforms.affectedByDistance, sprite.affectedByDistance ? 1 : 0 );
57607                     _gl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite._modelViewMatrix.elements );
57608
57609                 }
57610
57611                 size = sprite.map.image.width / ( sprite.scaleByViewport ? viewportHeight : 1 );
57612
57613                 scale[ 0 ] = size * invAspect * sprite.scale.x;
57614                 scale[ 1 ] = size * sprite.scale.y;
57615
57616                 _gl.uniform2f( uniforms.uvScale, sprite.uvScale.x, sprite.uvScale.y );
57617                 _gl.uniform2f( uniforms.uvOffset, sprite.uvOffset.x, sprite.uvOffset.y );
57618                 _gl.uniform2f( uniforms.alignment, sprite.alignment.x, sprite.alignment.y );
57619
57620                 _gl.uniform1f( uniforms.opacity, sprite.opacity );
57621                 _gl.uniform3f( uniforms.color, sprite.color.r, sprite.color.g, sprite.color.b );
57622
57623                 _gl.uniform1f( uniforms.rotation, sprite.rotation );
57624                 _gl.uniform2fv( uniforms.scale, scale );
57625
57626                 if ( sprite.mergeWith3D && !mergeWith3D ) {
57627
57628                     _gl.enable( _gl.DEPTH_TEST );
57629                     mergeWith3D = true;
57630
57631                 } else if ( ! sprite.mergeWith3D && mergeWith3D ) {
57632
57633                     _gl.disable( _gl.DEPTH_TEST );
57634                     mergeWith3D = false;
57635
57636                 }
57637
57638                 _renderer.setBlending( sprite.blending, sprite.blendEquation, sprite.blendSrc, sprite.blendDst );
57639                 _renderer.setTexture( sprite.map, 0 );
57640
57641                 _gl.drawElements( _gl.TRIANGLES, 6, _gl.UNSIGNED_SHORT, 0 );
57642
57643             }
57644
57645         }
57646
57647         // restore gl
57648
57649         _gl.enable( _gl.CULL_FACE );
57650         _gl.enable( _gl.DEPTH_TEST );
57651         _gl.depthMask( true );
57652
57653     };
57654
57655     function createProgram ( shader ) {
57656
57657         var program = _gl.createProgram();
57658
57659         var fragmentShader = _gl.createShader( _gl.FRAGMENT_SHADER );
57660         var vertexShader = _gl.createShader( _gl.VERTEX_SHADER );
57661
57662         _gl.shaderSource( fragmentShader, shader.fragmentShader );
57663         _gl.shaderSource( vertexShader, shader.vertexShader );
57664
57665         _gl.compileShader( fragmentShader );
57666         _gl.compileShader( vertexShader );
57667
57668         _gl.attachShader( program, fragmentShader );
57669         _gl.attachShader( program, vertexShader );
57670
57671         _gl.linkProgram( program );
57672
57673         return program;
57674
57675     };
57676
57677     function painterSort ( a, b ) {
57678
57679         return b.z - a.z;
57680
57681     };
57682
57683 };/**
57684  * @author alteredq / http://alteredqualia.com/
57685  */
57686
57687 THREE.DepthPassPlugin = function ( ) {
57688
57689     this.enabled = false;
57690     this.renderTarget = null;
57691
57692     var _gl,
57693     _renderer,
57694     _depthMaterial, _depthMaterialMorph,
57695
57696     _frustum = new THREE.Frustum(),
57697     _projScreenMatrix = new THREE.Matrix4();
57698
57699     this.init = function ( renderer ) {
57700
57701         _gl = renderer.context;
57702         _renderer = renderer;
57703
57704         var depthShader = THREE.ShaderLib[ "depthRGBA" ];
57705         var depthUniforms = THREE.UniformsUtils.clone( depthShader.uniforms );
57706
57707         _depthMaterial = new THREE.ShaderMaterial( { fragmentShader: depthShader.fragmentShader, vertexShader: depthShader.vertexShader, uniforms: depthUniforms } );
57708         _depthMaterialMorph = new THREE.ShaderMaterial( { fragmentShader: depthShader.fragmentShader, vertexShader: depthShader.vertexShader, uniforms: depthUniforms, morphTargets: true } );
57709
57710         _depthMaterial._shadowPass = true;
57711         _depthMaterialMorph._shadowPass = true;
57712
57713     };
57714
57715     this.render = function ( scene, camera ) {
57716
57717         if ( ! this.enabled ) return;
57718
57719         this.update( scene, camera );
57720
57721     };
57722
57723     this.update = function ( scene, camera ) {
57724
57725         var i, il, j, jl, n,
57726
57727         program, buffer, material,
57728         webglObject, object, light,
57729         renderList,
57730
57731         fog = null;
57732
57733         // set GL state for depth map
57734
57735         _gl.clearColor( 1, 1, 1, 1 );
57736         _gl.disable( _gl.BLEND );
57737
57738         _renderer.setDepthTest( true );
57739
57740         // update scene
57741
57742         if ( _renderer.autoUpdateScene ) scene.updateMatrixWorld();
57743
57744         // update camera matrices and frustum
57745
57746         if ( ! camera._viewMatrixArray ) camera._viewMatrixArray = new Float32Array( 16 );
57747         if ( ! camera._projectionMatrixArray ) camera._projectionMatrixArray = new Float32Array( 16 );
57748
57749         camera.matrixWorldInverse.getInverse( camera.matrixWorld );
57750
57751         camera.matrixWorldInverse.flattenToArray( camera._viewMatrixArray );
57752         camera.projectionMatrix.flattenToArray( camera._projectionMatrixArray );
57753
57754         _projScreenMatrix.multiply( camera.projectionMatrix, camera.matrixWorldInverse );
57755         _frustum.setFromMatrix( _projScreenMatrix );
57756
57757         // render depth map
57758
57759         _renderer.setRenderTarget( this.renderTarget );
57760         _renderer.clear();
57761
57762         // set object matrices & frustum culling
57763
57764         renderList = scene.__webglObjects;
57765
57766         for ( j = 0, jl = renderList.length; j < jl; j ++ ) {
57767
57768             webglObject = renderList[ j ];
57769             object = webglObject.object;
57770
57771             webglObject.render = false;
57772
57773             if ( object.visible ) {
57774
57775                 if ( ! ( object instanceof THREE.Mesh ) || ! ( object.frustumCulled ) || _frustum.contains( object ) ) {
57776
57777                     //object.matrixWorld.flattenToArray( object._modelMatrixArray );
57778                     object._modelViewMatrix.multiply( camera.matrixWorldInverse, object.matrixWorld);
57779
57780                     webglObject.render = true;
57781
57782                 }
57783
57784             }
57785
57786         }
57787
57788         // render regular objects
57789
57790         for ( j = 0, jl = renderList.length; j < jl; j ++ ) {
57791
57792             webglObject = renderList[ j ];
57793
57794             if ( webglObject.render ) {
57795
57796                 object = webglObject.object;
57797                 buffer = webglObject.buffer;
57798
57799                 if ( object.material ) _renderer.setMaterialFaces( object.material );
57800
57801                 if ( object.customDepthMaterial ) {
57802
57803                     material = object.customDepthMaterial;
57804
57805                 } else if ( object.geometry.morphTargets.length ) {
57806
57807                     material = _depthMaterialMorph;
57808
57809                 } else {
57810
57811                     material = _depthMaterial;
57812
57813                 }
57814
57815                 if ( buffer instanceof THREE.BufferGeometry ) {
57816
57817                     _renderer.renderBufferDirect( camera, scene.__lights, fog, material, buffer, object );
57818
57819                 } else {
57820
57821                     _renderer.renderBuffer( camera, scene.__lights, fog, material, buffer, object );
57822
57823                 }
57824
57825             }
57826
57827         }
57828
57829         // set matrices and render immediate objects
57830
57831         renderList = scene.__webglObjectsImmediate;
57832
57833         for ( j = 0, jl = renderList.length; j < jl; j ++ ) {
57834
57835             webglObject = renderList[ j ];
57836             object = webglObject.object;
57837
57838             if ( object.visible && object.castShadow ) {
57839
57840                 /*
57841                 if ( object.matrixAutoUpdate ) {
57842
57843                     object.matrixWorld.flattenToArray( object._modelMatrixArray );
57844
57845                 }
57846                 */
57847
57848                 object._modelViewMatrix.multiply( camera.matrixWorldInverse, object.matrixWorld);
57849
57850                 _renderer.renderImmediateObject( camera, scene.__lights, fog, _depthMaterial, object );
57851
57852             }
57853
57854         }
57855
57856         // restore GL state
57857
57858         var clearColor = _renderer.getClearColor(),
57859         clearAlpha = _renderer.getClearAlpha();
57860
57861         _gl.clearColor( clearColor.r, clearColor.g, clearColor.b, clearAlpha );
57862         _gl.enable( _gl.BLEND );
57863
57864     };
57865
57866 };
57867
57868 /**
57869  * @author mikael emtinger / http://gomo.se/
57870  *
57871  */
57872
57873 THREE.ShaderFlares = {
57874
57875     'lensFlareVertexTexture': {
57876
57877         vertexShader: [
57878
57879             "uniform vec3 screenPosition;",
57880             "uniform vec2 scale;",
57881             "uniform float rotation;",
57882             "uniform int renderType;",
57883
57884             "uniform sampler2D occlusionMap;",
57885
57886             "attribute vec2 position;",
57887             "attribute vec2 uv;",
57888
57889             "varying vec2 vUV;",
57890             "varying float vVisibility;",
57891
57892             "void main() {",
57893
57894                 "vUV = uv;",
57895
57896                 "vec2 pos = position;",
57897
57898                 "if( renderType == 2 ) {",
57899
57900                     "vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) ) +",
57901                                       "texture2D( occlusionMap, vec2( 0.5, 0.1 ) ) +",
57902                                       "texture2D( occlusionMap, vec2( 0.9, 0.1 ) ) +",
57903                                       "texture2D( occlusionMap, vec2( 0.9, 0.5 ) ) +",
57904                                       "texture2D( occlusionMap, vec2( 0.9, 0.9 ) ) +",
57905                                       "texture2D( occlusionMap, vec2( 0.5, 0.9 ) ) +",
57906                                       "texture2D( occlusionMap, vec2( 0.1, 0.9 ) ) +",
57907                                       "texture2D( occlusionMap, vec2( 0.1, 0.5 ) ) +",
57908                                       "texture2D( occlusionMap, vec2( 0.5, 0.5 ) );",
57909
57910                     "vVisibility = (       visibility.r / 9.0 ) *",
57911                                   "( 1.0 - visibility.g / 9.0 ) *",
57912                                   "(       visibility.b / 9.0 ) *",
57913                                   "( 1.0 - visibility.a / 9.0 );",
57914
57915                     "pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;",
57916                     "pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;",
57917
57918                 "}",
57919
57920                 "gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );",
57921
57922             "}"
57923
57924         ].join( "\n" ),
57925
57926         fragmentShader: [
57927
57928             "precision mediump float;",
57929
57930             "uniform sampler2D map;",
57931             "uniform float opacity;",
57932             "uniform int renderType;",
57933             "uniform vec3 color;",
57934
57935             "varying vec2 vUV;",
57936             "varying float vVisibility;",
57937
57938             "void main() {",
57939
57940                 // pink square
57941
57942                 "if( renderType == 0 ) {",
57943
57944                     "gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );",
57945
57946                 // restore
57947
57948                 "} else if( renderType == 1 ) {",
57949
57950                     "gl_FragColor = texture2D( map, vUV );",
57951
57952                 // flare
57953
57954                 "} else {",
57955
57956                     "vec4 texture = texture2D( map, vUV );",
57957                     "texture.a *= opacity * vVisibility;",
57958                     "gl_FragColor = texture;",
57959                     "gl_FragColor.rgb *= color;",
57960
57961                 "}",
57962
57963             "}"
57964         ].join( "\n" )
57965
57966     },
57967
57968
57969     'lensFlare': {
57970
57971         vertexShader: [
57972
57973             "uniform vec3 screenPosition;",
57974             "uniform vec2 scale;",
57975             "uniform float rotation;",
57976             "uniform int renderType;",
57977
57978             "attribute vec2 position;",
57979             "attribute vec2 uv;",
57980
57981             "varying vec2 vUV;",
57982
57983             "void main() {",
57984
57985                 "vUV = uv;",
57986
57987                 "vec2 pos = position;",
57988
57989                 "if( renderType == 2 ) {",
57990
57991                     "pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;",
57992                     "pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;",
57993
57994                 "}",
57995
57996                 "gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );",
57997
57998             "}"
57999
58000         ].join( "\n" ),
58001
58002         fragmentShader: [
58003
58004             "precision mediump float;",
58005
58006             "uniform sampler2D map;",
58007             "uniform sampler2D occlusionMap;",
58008             "uniform float opacity;",
58009             "uniform int renderType;",
58010             "uniform vec3 color;",
58011
58012             "varying vec2 vUV;",
58013
58014             "void main() {",
58015
58016                 // pink square
58017
58018                 "if( renderType == 0 ) {",
58019
58020                     "gl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );",
58021
58022                 // restore
58023
58024                 "} else if( renderType == 1 ) {",
58025
58026                     "gl_FragColor = texture2D( map, vUV );",
58027
58028                 // flare
58029
58030                 "} else {",
58031
58032                     "float visibility = texture2D( occlusionMap, vec2( 0.5, 0.1 ) ).a +",
58033                                        "texture2D( occlusionMap, vec2( 0.9, 0.5 ) ).a +",
58034                                        "texture2D( occlusionMap, vec2( 0.5, 0.9 ) ).a +",
58035                                        "texture2D( occlusionMap, vec2( 0.1, 0.5 ) ).a;",
58036
58037                     "visibility = ( 1.0 - visibility / 4.0 );",
58038
58039                     "vec4 texture = texture2D( map, vUV );",
58040                     "texture.a *= opacity * visibility;",
58041                     "gl_FragColor = texture;",
58042                     "gl_FragColor.rgb *= color;",
58043
58044                 "}",
58045
58046             "}"
58047
58048         ].join( "\n" )
58049
58050     }
58051
58052 };
58053 /**
58054  * @author mikael emtinger / http://gomo.se/
58055  *
58056  */
58057
58058 THREE.ShaderSprite = {
58059
58060     'sprite': {
58061
58062         vertexShader: [
58063
58064             "uniform int useScreenCoordinates;",
58065             "uniform int affectedByDistance;",
58066             "uniform vec3 screenPosition;",
58067             "uniform mat4 modelViewMatrix;",
58068             "uniform mat4 projectionMatrix;",
58069             "uniform float rotation;",
58070             "uniform vec2 scale;",
58071             "uniform vec2 alignment;",
58072             "uniform vec2 uvOffset;",
58073             "uniform vec2 uvScale;",
58074
58075             "attribute vec2 position;",
58076             "attribute vec2 uv;",
58077
58078             "varying vec2 vUV;",
58079
58080             "void main() {",
58081
58082                 "vUV = uvOffset + uv * uvScale;",
58083
58084                 "vec2 alignedPosition = position + alignment;",
58085
58086                 "vec2 rotatedPosition;",
58087                 "rotatedPosition.x = ( cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y ) * scale.x;",
58088                 "rotatedPosition.y = ( sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y ) * scale.y;",
58089
58090                 "vec4 finalPosition;",
58091
58092                 "if( useScreenCoordinates != 0 ) {",
58093
58094                     "finalPosition = vec4( screenPosition.xy + rotatedPosition, screenPosition.z, 1.0 );",
58095
58096                 "} else {",
58097
58098                     "finalPosition = projectionMatrix * modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );",
58099                     "finalPosition.xy += rotatedPosition * ( affectedByDistance == 1 ? 1.0 : finalPosition.z );",
58100
58101                 "}",
58102
58103                 "gl_Position = finalPosition;",
58104
58105             "}"
58106
58107         ].join( "\n" ),
58108
58109         fragmentShader: [
58110
58111             "precision mediump float;",
58112
58113             "uniform vec3 color;",
58114             "uniform sampler2D map;",
58115             "uniform float opacity;",
58116
58117             "varying vec2 vUV;",
58118
58119             "void main() {",
58120
58121                 "vec4 texture = texture2D( map, vUV );",
58122                 "gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );",
58123
58124             "}"
58125
58126         ].join( "\n" )
58127
58128     }
58129
58130 };
58131 /**
58132  * @author alteredq / http://alteredqualia.com/
58133  *
58134  */
58135
58136
58137 THREE.ShaderSkin = {
58138
58139     /* ------------------------------------------------------------------------------------------
58140     //    Simple skin shader
58141     //        - per-pixel Blinn-Phong diffuse term mixed with half-Lambert wrap-around term (per color component)
58142     //        - physically based specular term (Kelemen/Szirmay-Kalos specular reflectance)
58143     //
58144     //        - diffuse map
58145     //        - bump map
58146     //        - specular map
58147     //        - point, directional and hemisphere lights (use with "lights: true" material option)
58148     //        - fog (use with "fog: true" material option)
58149     //        - shadow maps
58150     //
58151     // ------------------------------------------------------------------------------------------ */
58152
58153     'skinSimple' : {
58154
58155         uniforms: THREE.UniformsUtils.merge( [
58156
58157             THREE.UniformsLib[ "fog" ],
58158             THREE.UniformsLib[ "lights" ],
58159             THREE.UniformsLib[ "shadowmap" ],
58160
58161             {
58162
58163             "enableBump"    : { type: "i", value: 0 },
58164             "enableSpecular": { type: "i", value: 0 },
58165
58166             "tDiffuse"    : { type: "t", value: null },
58167             "tBeckmann"    : { type: "t", value: null },
58168
58169             "uDiffuseColor":  { type: "c", value: new THREE.Color( 0xeeeeee ) },
58170             "uSpecularColor": { type: "c", value: new THREE.Color( 0x111111 ) },
58171             "uAmbientColor":  { type: "c", value: new THREE.Color( 0x050505 ) },
58172             "uOpacity":       { type: "f", value: 1 },
58173
58174             "uRoughness":               { type: "f", value: 0.15 },
58175             "uSpecularBrightness":     { type: "f", value: 0.75 },
58176
58177             "bumpMap"    : { type: "t", value: null },
58178             "bumpScale" : { type: "f", value: 1 },
58179
58180             "specularMap" : { type: "t", value: null },
58181
58182             "offsetRepeat" : { type: "v4", value: new THREE.Vector4( 0, 0, 1, 1 ) },
58183
58184             "uWrapRGB":    { type: "v3", value: new THREE.Vector3( 0.75, 0.375, 0.1875 ) }
58185
58186             }
58187
58188         ] ),
58189
58190         fragmentShader: [
58191
58192             "#define USE_BUMPMAP",
58193             "#extension GL_OES_standard_derivatives : enable",
58194
58195             "uniform bool enableBump;",
58196             "uniform bool enableSpecular;",
58197
58198             "uniform vec3 uAmbientColor;",
58199             "uniform vec3 uDiffuseColor;",
58200             "uniform vec3 uSpecularColor;",
58201             "uniform float uOpacity;",
58202
58203             "uniform float uRoughness;",
58204             "uniform float uSpecularBrightness;",
58205
58206             "uniform vec3 uWrapRGB;",
58207
58208             "uniform sampler2D tDiffuse;",
58209             "uniform sampler2D tBeckmann;",
58210
58211             "uniform sampler2D specularMap;",
58212
58213             "varying vec3 vNormal;",
58214             "varying vec2 vUv;",
58215
58216             "uniform vec3 ambientLightColor;",
58217
58218             "#if MAX_DIR_LIGHTS > 0",
58219
58220                 "uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];",
58221                 "uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];",
58222
58223             "#endif",
58224
58225             "#if MAX_HEMI_LIGHTS > 0",
58226
58227                 "uniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];",
58228                 "uniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];",
58229                 "uniform vec3 hemisphereLightPosition[ MAX_HEMI_LIGHTS ];",
58230
58231             "#endif",
58232
58233             "#if MAX_POINT_LIGHTS > 0",
58234
58235                 "uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];",
58236                 "uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];",
58237                 "uniform float pointLightDistance[ MAX_POINT_LIGHTS ];",
58238
58239             "#endif",
58240
58241             "varying vec3 vViewPosition;",
58242
58243             THREE.ShaderChunk[ "shadowmap_pars_fragment" ],
58244             THREE.ShaderChunk[ "fog_pars_fragment" ],
58245             THREE.ShaderChunk[ "bumpmap_pars_fragment" ],
58246
58247             // Fresnel term
58248
58249             "float fresnelReflectance( vec3 H, vec3 V, float F0 ) {",
58250
58251                 "float base = 1.0 - dot( V, H );",
58252                 "float exponential = pow( base, 5.0 );",
58253
58254                 "return exponential + F0 * ( 1.0 - exponential );",
58255
58256             "}",
58257
58258             // Kelemen/Szirmay-Kalos specular BRDF
58259
58260             "float KS_Skin_Specular( vec3 N,",         // Bumped surface normal
58261                                     "vec3 L,",         // Points to light
58262                                     "vec3 V,",         // Points to eye
58263                                     "float m,",      // Roughness
58264                                     "float rho_s",     // Specular brightness
58265                                     ") {",
58266
58267                 "float result = 0.0;",
58268                 "float ndotl = dot( N, L );",
58269
58270                 "if( ndotl > 0.0 ) {",
58271
58272                     "vec3 h = L + V;", // Unnormalized half-way vector
58273                     "vec3 H = normalize( h );",
58274
58275                     "float ndoth = dot( N, H );",
58276
58277                     "float PH = pow( 2.0 * texture2D( tBeckmann, vec2( ndoth, m ) ).x, 10.0 );",
58278
58279                     "float F = fresnelReflectance( H, V, 0.028 );",
58280                     "float frSpec = max( PH * F / dot( h, h ), 0.0 );",
58281
58282                     "result = ndotl * rho_s * frSpec;", // BRDF * dot(N,L) * rho_s
58283
58284                 "}",
58285
58286                 "return result;",
58287
58288             "}",
58289
58290             "void main() {",
58291
58292                 "gl_FragColor = vec4( vec3( 1.0 ), uOpacity );",
58293
58294                 "vec4 colDiffuse = texture2D( tDiffuse, vUv );",
58295                 "colDiffuse.rgb *= colDiffuse.rgb;",
58296
58297                 "gl_FragColor = gl_FragColor * colDiffuse;",
58298
58299                 "vec3 normal = normalize( vNormal );",
58300                 "vec3 viewPosition = normalize( vViewPosition );",
58301
58302                 "float specularStrength;",
58303
58304                 "if ( enableSpecular ) {",
58305
58306                     "vec4 texelSpecular = texture2D( specularMap, vUv );",
58307                     "specularStrength = texelSpecular.r;",
58308
58309                 "} else {",
58310
58311                     "specularStrength = 1.0;",
58312
58313                 "}",
58314
58315                 "#ifdef USE_BUMPMAP",
58316
58317                     "if ( enableBump ) normal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );",
58318
58319                 "#endif",
58320
58321                 // point lights
58322
58323                 "vec3 specularTotal = vec3( 0.0 );",
58324
58325                 "#if MAX_POINT_LIGHTS > 0",
58326
58327                     "vec3 pointTotal = vec3( 0.0 );",
58328
58329                     "for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {",
58330
58331                         "vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );",
58332
58333                         "vec3 lVector = lPosition.xyz + vViewPosition.xyz;",
58334
58335                         "float lDistance = 1.0;",
58336
58337                         "if ( pointLightDistance[ i ] > 0.0 )",
58338                             "lDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );",
58339
58340                         "lVector = normalize( lVector );",
58341
58342                         "float pointDiffuseWeightFull = max( dot( normal, lVector ), 0.0 );",
58343                         "float pointDiffuseWeightHalf = max( 0.5 * dot( normal, lVector ) + 0.5, 0.0 );",
58344                         "vec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), uWrapRGB );",
58345
58346                         "float pointSpecularWeight = KS_Skin_Specular( normal, lVector, viewPosition, uRoughness, uSpecularBrightness );",
58347
58348                         "pointTotal    += lDistance * uDiffuseColor * pointLightColor[ i ] * pointDiffuseWeight;",
58349                         "specularTotal += lDistance * uSpecularColor * pointLightColor[ i ] * pointSpecularWeight * specularStrength;",
58350
58351                     "}",
58352
58353                 "#endif",
58354
58355                 // directional lights
58356
58357                 "#if MAX_DIR_LIGHTS > 0",
58358
58359                     "vec3 dirTotal = vec3( 0.0 );",
58360
58361                     "for( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {",
58362
58363                         "vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );",
58364
58365                         "vec3 dirVector = normalize( lDirection.xyz );",
58366
58367                         "float dirDiffuseWeightFull = max( dot( normal, dirVector ), 0.0 );",
58368                         "float dirDiffuseWeightHalf = max( 0.5 * dot( normal, dirVector ) + 0.5, 0.0 );",
58369                         "vec3 dirDiffuseWeight = mix( vec3 ( dirDiffuseWeightFull ), vec3( dirDiffuseWeightHalf ), uWrapRGB );",
58370
58371                         "float dirSpecularWeight =  KS_Skin_Specular( normal, dirVector, viewPosition, uRoughness, uSpecularBrightness );",
58372
58373                         "dirTotal        += uDiffuseColor * directionalLightColor[ i ] * dirDiffuseWeight;",
58374                         "specularTotal += uSpecularColor * directionalLightColor[ i ] * dirSpecularWeight * specularStrength;",
58375
58376                     "}",
58377
58378                 "#endif",
58379
58380                 // hemisphere lights
58381
58382                 "#if MAX_HEMI_LIGHTS > 0",
58383
58384                     "vec3 hemiTotal = vec3( 0.0 );",
58385
58386                     "for ( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {",
58387
58388                         "vec4 lPosition = viewMatrix * vec4( hemisphereLightPosition[ i ], 1.0 );",
58389                         "vec3 lVector = normalize( lPosition.xyz + vViewPosition.xyz );",
58390
58391                         "float dotProduct = dot( normal, lVector );",
58392                         "float hemiDiffuseWeight = 0.5 * dotProduct + 0.5;",
58393
58394                         "hemiTotal += uDiffuseColor * mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );",
58395
58396                         // specular (sky light)
58397
58398                         "float hemiSpecularWeight = 0.0;",
58399                         "hemiSpecularWeight += KS_Skin_Specular( normal, lVector, viewPosition, uRoughness, uSpecularBrightness );",
58400
58401                         // specular (ground light)
58402
58403                         "vec3 lVectorGround = normalize( -lPosition.xyz + vViewPosition.xyz );",
58404                         "hemiSpecularWeight += KS_Skin_Specular( normal, lVectorGround, viewPosition, uRoughness, uSpecularBrightness );",
58405
58406                         "specularTotal += uSpecularColor * mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight ) * hemiSpecularWeight * specularStrength;",
58407
58408                     "}",
58409
58410                 "#endif",
58411
58412                 // all lights contribution summation
58413
58414                 "vec3 totalLight = vec3( 0.0 );",
58415
58416                 "#if MAX_DIR_LIGHTS > 0",
58417                     "totalLight += dirTotal;",
58418                 "#endif",
58419
58420                 "#if MAX_POINT_LIGHTS > 0",
58421                     "totalLight += pointTotal;",
58422                 "#endif",
58423
58424                 "#if MAX_HEMI_LIGHTS > 0",
58425                     "totalLight += hemiTotal;",
58426                 "#endif",
58427
58428                 "gl_FragColor.xyz = gl_FragColor.xyz * ( totalLight + ambientLightColor * uAmbientColor ) + specularTotal;",
58429
58430                 THREE.ShaderChunk[ "shadowmap_fragment" ],
58431                 THREE.ShaderChunk[ "linear_to_gamma_fragment" ],
58432                 THREE.ShaderChunk[ "fog_fragment" ],
58433
58434             "}"
58435
58436         ].join("\n"),
58437
58438         vertexShader: [
58439
58440             "uniform vec4 offsetRepeat;",
58441
58442             "varying vec3 vNormal;",
58443             "varying vec2 vUv;",
58444
58445             "varying vec3 vViewPosition;",
58446
58447             THREE.ShaderChunk[ "shadowmap_pars_vertex" ],
58448
58449             "void main() {",
58450
58451                 "vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
58452                 "vec4 mPosition = modelMatrix * vec4( position, 1.0 );",
58453
58454                 "vViewPosition = -mvPosition.xyz;",
58455
58456                 "vNormal = normalMatrix * normal;",
58457
58458                 "vUv = uv * offsetRepeat.zw + offsetRepeat.xy;",
58459
58460                 "gl_Position = projectionMatrix * mvPosition;",
58461
58462                 THREE.ShaderChunk[ "shadowmap_vertex" ],
58463
58464             "}"
58465
58466         ].join( "\n" )
58467
58468     },
58469
58470     /* ------------------------------------------------------------------------------------------
58471     //    Skin shader
58472     //        - Blinn-Phong diffuse term (using normal + diffuse maps)
58473     //        - subsurface scattering approximation by four blur layers
58474     //        - physically based specular term (Kelemen/Szirmay-Kalos specular reflectance)
58475     //
58476     //        - point and directional lights (use with "lights: true" material option)
58477     //
58478     //        - based on Nvidia Advanced Skin Rendering GDC 2007 presentation
58479     //          and GPU Gems 3 Chapter 14. Advanced Techniques for Realistic Real-Time Skin Rendering
58480     //
58481     //            http://developer.download.nvidia.com/presentations/2007/gdc/Advanced_Skin.pdf
58482     //            http://http.developer.nvidia.com/GPUGems3/gpugems3_ch14.html
58483     // ------------------------------------------------------------------------------------------ */
58484
58485     'skin' : {
58486
58487         uniforms: THREE.UniformsUtils.merge( [
58488
58489             THREE.UniformsLib[ "fog" ],
58490             THREE.UniformsLib[ "lights" ],
58491
58492             {
58493
58494             "passID": { type: "i", value: 0 },
58495
58496             "tDiffuse"    : { type: "t", value: null },
58497             "tNormal"    : { type: "t", value: null },
58498
58499             "tBlur1"    : { type: "t", value: null },
58500             "tBlur2"    : { type: "t", value: null },
58501             "tBlur3"    : { type: "t", value: null },
58502             "tBlur4"    : { type: "t", value: null },
58503
58504             "tBeckmann"    : { type: "t", value: null },
58505
58506             "uNormalScale": { type: "f", value: 1.0 },
58507
58508             "uDiffuseColor":  { type: "c", value: new THREE.Color( 0xeeeeee ) },
58509             "uSpecularColor": { type: "c", value: new THREE.Color( 0x111111 ) },
58510             "uAmbientColor":  { type: "c", value: new THREE.Color( 0x050505 ) },
58511             "uOpacity":       { type: "f", value: 1 },
58512
58513             "uRoughness":               { type: "f", value: 0.15 },
58514             "uSpecularBrightness":     { type: "f", value: 0.75 }
58515
58516             }
58517
58518         ] ),
58519
58520         fragmentShader: [
58521
58522             "uniform vec3 uAmbientColor;",
58523             "uniform vec3 uDiffuseColor;",
58524             "uniform vec3 uSpecularColor;",
58525             "uniform float uOpacity;",
58526
58527             "uniform float uRoughness;",
58528             "uniform float uSpecularBrightness;",
58529
58530             "uniform int passID;",
58531
58532             "uniform sampler2D tDiffuse;",
58533             "uniform sampler2D tNormal;",
58534
58535             "uniform sampler2D tBlur1;",
58536             "uniform sampler2D tBlur2;",
58537             "uniform sampler2D tBlur3;",
58538             "uniform sampler2D tBlur4;",
58539
58540             "uniform sampler2D tBeckmann;",
58541
58542             "uniform float uNormalScale;",
58543
58544             "varying vec3 vTangent;",
58545             "varying vec3 vBinormal;",
58546             "varying vec3 vNormal;",
58547             "varying vec2 vUv;",
58548
58549             "uniform vec3 ambientLightColor;",
58550
58551             "#if MAX_DIR_LIGHTS > 0",
58552                 "uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];",
58553                 "uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];",
58554             "#endif",
58555
58556             "#if MAX_POINT_LIGHTS > 0",
58557                 "uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];",
58558                 "varying vec4 vPointLight[ MAX_POINT_LIGHTS ];",
58559             "#endif",
58560
58561             "varying vec3 vViewPosition;",
58562
58563             THREE.ShaderChunk[ "fog_pars_fragment" ],
58564
58565             "float fresnelReflectance( vec3 H, vec3 V, float F0 ) {",
58566
58567                 "float base = 1.0 - dot( V, H );",
58568                 "float exponential = pow( base, 5.0 );",
58569
58570                 "return exponential + F0 * ( 1.0 - exponential );",
58571
58572             "}",
58573
58574             // Kelemen/Szirmay-Kalos specular BRDF
58575
58576             "float KS_Skin_Specular( vec3 N,",         // Bumped surface normal
58577                                     "vec3 L,",         // Points to light
58578                                     "vec3 V,",         // Points to eye
58579                                     "float m,",      // Roughness
58580                                     "float rho_s",     // Specular brightness
58581                                     ") {",
58582
58583                 "float result = 0.0;",
58584                 "float ndotl = dot( N, L );",
58585
58586                 "if( ndotl > 0.0 ) {",
58587
58588                     "vec3 h = L + V;", // Unnormalized half-way vector
58589                     "vec3 H = normalize( h );",
58590
58591                     "float ndoth = dot( N, H );",
58592
58593                     "float PH = pow( 2.0 * texture2D( tBeckmann, vec2( ndoth, m ) ).x, 10.0 );",
58594                     "float F = fresnelReflectance( H, V, 0.028 );",
58595                     "float frSpec = max( PH * F / dot( h, h ), 0.0 );",
58596
58597                     "result = ndotl * rho_s * frSpec;", // BRDF * dot(N,L) * rho_s
58598
58599                 "}",
58600
58601                 "return result;",
58602
58603             "}",
58604
58605             "void main() {",
58606
58607                 "gl_FragColor = vec4( 1.0 );",
58608
58609                 "vec4 mColor = vec4( uDiffuseColor, uOpacity );",
58610                 "vec4 mSpecular = vec4( uSpecularColor, uOpacity );",
58611
58612                 "vec3 normalTex = texture2D( tNormal, vUv ).xyz * 2.0 - 1.0;",
58613                 "normalTex.xy *= uNormalScale;",
58614                 "normalTex = normalize( normalTex );",
58615
58616                 "vec4 colDiffuse = texture2D( tDiffuse, vUv );",
58617                 "colDiffuse *= colDiffuse;",
58618
58619                 "gl_FragColor = gl_FragColor * colDiffuse;",
58620
58621                 "mat3 tsb = mat3( vTangent, vBinormal, vNormal );",
58622                 "vec3 finalNormal = tsb * normalTex;",
58623
58624                 "vec3 normal = normalize( finalNormal );",
58625                 "vec3 viewPosition = normalize( vViewPosition );",
58626
58627                 // point lights
58628
58629                 "vec3 specularTotal = vec3( 0.0 );",
58630
58631                 "#if MAX_POINT_LIGHTS > 0",
58632
58633                     "vec4 pointTotal = vec4( vec3( 0.0 ), 1.0 );",
58634
58635                     "for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {",
58636
58637                         "vec3 pointVector = normalize( vPointLight[ i ].xyz );",
58638                         "float pointDistance = vPointLight[ i ].w;",
58639
58640                         "float pointDiffuseWeight = max( dot( normal, pointVector ), 0.0 );",
58641
58642                         "pointTotal  += pointDistance * vec4( pointLightColor[ i ], 1.0 ) * ( mColor * pointDiffuseWeight );",
58643
58644                         "if ( passID == 1 )",
58645                             "specularTotal += pointDistance * mSpecular.xyz * pointLightColor[ i ] * KS_Skin_Specular( normal, pointVector, viewPosition, uRoughness, uSpecularBrightness );",
58646
58647                     "}",
58648
58649                 "#endif",
58650
58651                 // directional lights
58652
58653                 "#if MAX_DIR_LIGHTS > 0",
58654
58655                     "vec4 dirTotal = vec4( vec3( 0.0 ), 1.0 );",
58656
58657                     "for( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {",
58658
58659                         "vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );",
58660
58661                         "vec3 dirVector = normalize( lDirection.xyz );",
58662
58663                         "float dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );",
58664
58665                         "dirTotal  += vec4( directionalLightColor[ i ], 1.0 ) * ( mColor * dirDiffuseWeight );",
58666
58667                         "if ( passID == 1 )",
58668                             "specularTotal += mSpecular.xyz * directionalLightColor[ i ] * KS_Skin_Specular( normal, dirVector, viewPosition, uRoughness, uSpecularBrightness );",
58669
58670                     "}",
58671
58672                 "#endif",
58673
58674                 // all lights contribution summation
58675
58676                 "vec4 totalLight = vec4( vec3( 0.0 ), uOpacity );",
58677
58678                 "#if MAX_DIR_LIGHTS > 0",
58679                     "totalLight += dirTotal;",
58680                 "#endif",
58681
58682                 "#if MAX_POINT_LIGHTS > 0",
58683                     "totalLight += pointTotal;",
58684                 "#endif",
58685
58686                 "gl_FragColor = gl_FragColor * totalLight;",
58687
58688                 "if ( passID == 0 ) {",
58689
58690                     "gl_FragColor = vec4( sqrt( gl_FragColor.xyz ), gl_FragColor.w );",
58691
58692                 "} else if ( passID == 1 ) {",
58693
58694                     //"#define VERSION1",
58695
58696                     "#ifdef VERSION1",
58697
58698                         "vec3 nonblurColor = sqrt( gl_FragColor.xyz );",
58699
58700                     "#else",
58701
58702                         "vec3 nonblurColor = gl_FragColor.xyz;",
58703
58704                     "#endif",
58705
58706                     "vec3 blur1Color = texture2D( tBlur1, vUv ).xyz;",
58707                     "vec3 blur2Color = texture2D( tBlur2, vUv ).xyz;",
58708                     "vec3 blur3Color = texture2D( tBlur3, vUv ).xyz;",
58709                     "vec3 blur4Color = texture2D( tBlur4, vUv ).xyz;",
58710
58711
58712                     //"gl_FragColor = vec4( blur1Color, gl_FragColor.w );",
58713
58714                     //"gl_FragColor = vec4( vec3( 0.22, 0.5, 0.7 ) * nonblurColor + vec3( 0.2, 0.5, 0.3 ) * blur1Color + vec3( 0.58, 0.0, 0.0 ) * blur2Color, gl_FragColor.w );",
58715
58716                     //"gl_FragColor = vec4( vec3( 0.25, 0.6, 0.8 ) * nonblurColor + vec3( 0.15, 0.25, 0.2 ) * blur1Color + vec3( 0.15, 0.15, 0.0 ) * blur2Color + vec3( 0.45, 0.0, 0.0 ) * blur3Color, gl_FragColor.w );",
58717
58718
58719                     "gl_FragColor = vec4( vec3( 0.22,  0.437, 0.635 ) * nonblurColor + ",
58720                                          "vec3( 0.101, 0.355, 0.365 ) * blur1Color + ",
58721                                          "vec3( 0.119, 0.208, 0.0 )   * blur2Color + ",
58722                                          "vec3( 0.114, 0.0,   0.0 )   * blur3Color + ",
58723                                          "vec3( 0.444, 0.0,   0.0 )   * blur4Color",
58724                                          ", gl_FragColor.w );",
58725
58726                     "gl_FragColor.xyz *= pow( colDiffuse.xyz, vec3( 0.5 ) );",
58727
58728                     "gl_FragColor.xyz += ambientLightColor * uAmbientColor * colDiffuse.xyz + specularTotal;",
58729
58730                     "#ifndef VERSION1",
58731
58732                         "gl_FragColor.xyz = sqrt( gl_FragColor.xyz );",
58733
58734                     "#endif",
58735
58736                 "}",
58737
58738                 THREE.ShaderChunk[ "fog_fragment" ],
58739
58740             "}"
58741
58742         ].join("\n"),
58743
58744         vertexShader: [
58745
58746             "attribute vec4 tangent;",
58747
58748             "#ifdef VERTEX_TEXTURES",
58749
58750                 "uniform sampler2D tDisplacement;",
58751                 "uniform float uDisplacementScale;",
58752                 "uniform float uDisplacementBias;",
58753
58754             "#endif",
58755
58756             "varying vec3 vTangent;",
58757             "varying vec3 vBinormal;",
58758             "varying vec3 vNormal;",
58759             "varying vec2 vUv;",
58760
58761             "#if MAX_POINT_LIGHTS > 0",
58762
58763                 "uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];",
58764                 "uniform float pointLightDistance[ MAX_POINT_LIGHTS ];",
58765
58766                 "varying vec4 vPointLight[ MAX_POINT_LIGHTS ];",
58767
58768             "#endif",
58769
58770             "varying vec3 vViewPosition;",
58771
58772             "void main() {",
58773
58774                 "vec4 mPosition = modelMatrix * vec4( position, 1.0 );",
58775
58776                 "vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
58777
58778                 "vViewPosition = -mvPosition.xyz;",
58779
58780                 "vNormal = normalize( normalMatrix * normal );",
58781
58782                 // tangent and binormal vectors
58783
58784                 "vTangent = normalize( normalMatrix * tangent.xyz );",
58785
58786                 "vBinormal = cross( vNormal, vTangent ) * tangent.w;",
58787                 "vBinormal = normalize( vBinormal );",
58788
58789                 "vUv = uv;",
58790
58791                 // point lights
58792
58793                 "#if MAX_POINT_LIGHTS > 0",
58794
58795                     "for( int i = 0; i < MAX_POINT_LIGHTS; i++ ) {",
58796
58797                         "vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );",
58798
58799                         "vec3 lVector = lPosition.xyz - mvPosition.xyz;",
58800
58801                         "float lDistance = 1.0;",
58802
58803                         "if ( pointLightDistance[ i ] > 0.0 )",
58804                             "lDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );",
58805
58806                         "lVector = normalize( lVector );",
58807
58808                         "vPointLight[ i ] = vec4( lVector, lDistance );",
58809
58810                     "}",
58811
58812                 "#endif",
58813
58814                 // displacement mapping
58815
58816                 "#ifdef VERTEX_TEXTURES",
58817
58818                     "vec3 dv = texture2D( tDisplacement, uv ).xyz;",
58819                     "float df = uDisplacementScale * dv.x + uDisplacementBias;",
58820                     "vec4 displacedPosition = vec4( vNormal.xyz * df, 0.0 ) + mvPosition;",
58821                     "gl_Position = projectionMatrix * displacedPosition;",
58822
58823                 "#else",
58824
58825                     "gl_Position = projectionMatrix * mvPosition;",
58826
58827                 "#endif",
58828
58829             "}"
58830
58831         ].join("\n"),
58832
58833         vertexShaderUV: [
58834
58835             "attribute vec4 tangent;",
58836
58837             "#ifdef VERTEX_TEXTURES",
58838
58839                 "uniform sampler2D tDisplacement;",
58840                 "uniform float uDisplacementScale;",
58841                 "uniform float uDisplacementBias;",
58842
58843             "#endif",
58844
58845             "varying vec3 vTangent;",
58846             "varying vec3 vBinormal;",
58847             "varying vec3 vNormal;",
58848             "varying vec2 vUv;",
58849
58850             "#if MAX_POINT_LIGHTS > 0",
58851
58852                 "uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];",
58853                 "uniform float pointLightDistance[ MAX_POINT_LIGHTS ];",
58854
58855                 "varying vec4 vPointLight[ MAX_POINT_LIGHTS ];",
58856
58857             "#endif",
58858
58859             "varying vec3 vViewPosition;",
58860
58861             "void main() {",
58862
58863                 "vec4 mPosition = modelMatrix * vec4( position, 1.0 );",
58864
58865                 "vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
58866
58867                 "vViewPosition = -mvPosition.xyz;",
58868
58869                 "vNormal = normalize( normalMatrix * normal );",
58870
58871                 // tangent and binormal vectors
58872
58873                 "vTangent = normalize( normalMatrix * tangent.xyz );",
58874
58875                 "vBinormal = cross( vNormal, vTangent ) * tangent.w;",
58876                 "vBinormal = normalize( vBinormal );",
58877
58878                 "vUv = uv;",
58879
58880                 // point lights
58881
58882                 "#if MAX_POINT_LIGHTS > 0",
58883
58884                     "for( int i = 0; i < MAX_POINT_LIGHTS; i++ ) {",
58885
58886                         "vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );",
58887
58888                         "vec3 lVector = lPosition.xyz - mvPosition.xyz;",
58889
58890                         "float lDistance = 1.0;",
58891
58892                         "if ( pointLightDistance[ i ] > 0.0 )",
58893                             "lDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );",
58894
58895                         "lVector = normalize( lVector );",
58896
58897                         "vPointLight[ i ] = vec4( lVector, lDistance );",
58898
58899                     "}",
58900
58901                 "#endif",
58902
58903                 "gl_Position = vec4( uv.x * 2.0 - 1.0, uv.y * 2.0 - 1.0, 0.0, 1.0 );",
58904
58905             "}"
58906
58907         ].join("\n")
58908
58909     },
58910
58911     /* ------------------------------------------------------------------------------------------
58912     // Beckmann distribution function
58913     //    - to be used in specular term of skin shader
58914     //    - render a screen-aligned quad to precompute a 512 x 512 texture
58915     //
58916     //        - from http://developer.nvidia.com/node/171
58917      ------------------------------------------------------------------------------------------ */
58918
58919     "beckmann" : {
58920
58921         uniforms: {},
58922
58923         vertexShader: [
58924
58925             "varying vec2 vUv;",
58926
58927             "void main() {",
58928
58929                 "vUv = uv;",
58930                 "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
58931
58932             "}"
58933
58934         ].join("\n"),
58935
58936         fragmentShader: [
58937
58938             "varying vec2 vUv;",
58939
58940             "float PHBeckmann( float ndoth, float m ) {",
58941
58942                 "float alpha = acos( ndoth );",
58943                 "float ta = tan( alpha );",
58944
58945                 "float val = 1.0 / ( m * m * pow( ndoth, 4.0 ) ) * exp( -( ta * ta ) / ( m * m ) );",
58946                 "return val;",
58947
58948             "}",
58949
58950             "float KSTextureCompute( vec2 tex ) {",
58951
58952                 // Scale the value to fit within [0,1]  invert upon lookup.
58953
58954                 "return 0.5 * pow( PHBeckmann( tex.x, tex.y ), 0.1 );",
58955
58956             "}",
58957
58958             "void main() {",
58959
58960                 "float x = KSTextureCompute( vUv );",
58961
58962                 "gl_FragColor = vec4( x, x, x, 1.0 );",
58963
58964             "}"
58965
58966         ].join("\n")
58967
58968     }
58969
58970 };
58971 //////////////////////////////////////////////////////////////////////////////
58972 //                                                                          //
58973 // Wii Opera SDK - Drawing Class v2.6.16 2008-12-14                         //
58974 // (c) 2007-2008 Daniel Gump. All Rights Reserved.                          //
58975 // http://wiioperasdk.com, http://hullbreachonline.com                      //
58976 // hullbreach@hullbreachonline.com                                          //
58977 //                                                                          //
58978 //  Wii is a trademark of Nintendo Co., Ltd.                                //
58979 //  Opera is a trademark of Opera, ASA.                                     //
58980 //  This software package is not associated with either company             //
58981 //  but was created to support users of both.  Its alternative name         //
58982 //  when supporting other products is the HULLBREACH SDK.                   //
58983 //                                                                          //
58984 //  Redistribution and use in source and binary forms, with or without      //
58985 //  modification, are permitted provided that the following conditions      //
58986 //  are met:                                                                //
58987 //    * Redistributions of source code must retain the above copyright      //
58988 //      notice, this list of conditions and the following disclaimer.       //
58989 //    * Redistributions in binary form must reproduce the above copyright   //
58990 //      notice, this list of conditions and the following disclaimer in     //
58991 //      the documentation and/or other materials provided with the          //
58992 //      distribution.                                                       //
58993 //    * Neither the names HULLBREACH ONLINE nor WII OPERA SDK nor the names //
58994 //      of its contributors may be used to endorse or promote products      //
58995 //      derived from this software without specific prior written           //
58996 //      permission.                                                         //
58997 //    * If the explicit purpose of the software is not to support the       //
58998 //      Nintendo Wii or the Opera Web browser, then the names of such must  //
58999 //      not be used in any derived product. The name shall be the           //
59000 //      HULLBREACH SDK with a reference link to http://hullbreachonline.    //
59001 //                                                                          //
59002 //  THIS SOFTWARE IS PROVIDED BY Daniel Gump ''AS IS'' AND ANY EXPRESS OR   //
59003 //  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED          //
59004 //  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE  //
59005 //  DISCLAIMED. IN NO EVENT SHALL Daniel Gump BE LIABLE FOR ANY DIRECT,     //
59006 //  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES      //
59007 //  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR      //
59008 //  SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)      //
59009 //  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,     //
59010 //  STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING   //
59011 //  IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE      //
59012 //  POSSIBILITY OF SUCH DAMAGE.                                             //
59013 //////////////////////////////////////////////////////////////////////////////
59014
59015 function Drawing(){
59016         this.WIREFRAME = 1; this.FILL = 2;
59017         ZOOM = 1;
59018         CANVAS = null;
59019         TEXTURES = null;
59020 }
59021 Drawing.prototype.initialize = function(canvas){
59022         CANVAS = canvas.getContext("2d");
59023         CANVAS.lineJoin = "round";
59024         CANVAS.lineWidth = 1;
59025 }
59026 Drawing.prototype.loadTextures = function(textures){ TEXTURES = textures; }
59027 Drawing.prototype.setFillColor = function(r,g,b){ CANVAS.fillStyle = "rgb("+(r>255?255:(r<0?0:r|0))+", "+(g>255?255:(g<0?0:g|0))+", "+(b>255?255:(b<0?0:b|0))+")"; }
59028 Drawing.prototype.setFillColorA = function(r,g,b,a){ CANVAS.fillStyle = "rgba("+(r>255?255:(r<0?0:r|0))+", "+(g>255?255:(g<0?0:g|0))+", "+(b>255?255:(b<0?0:b|0))+", "+(a>255?1:(a<0?0:a/255))+")"; }
59029 Drawing.prototype.setLineColor = function(r,g,b){ CANVAS.strokeStyle = "rgb("+(r>255?255:(r<0?0:r|0))+", "+(g>255?255:(g<0?0:g|0))+", "+(b>255?255:(b<0?0:b|0))+")"; }
59030 Drawing.prototype.setLineColorA = function(r,g,b,a){ CANVAS.strokeStyle = "rgba("+(r>255?255:(r<0?0:r|0))+", "+(g>255?255:(g<0?0:g|0))+", "+(b>255?255:(b<0?0:b|0))+", "+(a>255?1:(a<0?0:a/255))+")"; }
59031 Drawing.prototype.clipCircle = function(centerx,centery,radius){ CANVAS.beginPath(); CANVAS.arc(centerx,centery,radius,0,6.28318531,false); CANVAS.clip(); }
59032 Drawing.prototype.clipRectangle = function(x1,y1,x2,y2){ CANVAS.beginPath(); CANVAS.strokeRect(x1,y1,x2-x1,y2-y1); CANVAS.clip(); }
59033 Drawing.prototype.drawCircle = function(centerx,centery,radius,style){
59034         CANVAS.beginPath();
59035         CANVAS.arc(centerx, centery, radius, 0, Math.PI*2, false);
59036         if(style & this.FILL) CANVAS.fill();
59037         if(style & this.WIREFRAME) CANVAS.stroke();
59038 }
59039 Drawing.prototype.drawImage = function(x1,y1,x2,y2,img,angle){
59040         if(img.complete){
59041                 x1|=0;
59042                 y1|=0;
59043                 x2|=0;
59044                 y2|=0;
59045                 if(x2<x1) x2=x1+1;
59046                 if(y2<y1) y2=y1+1;
59047                 var centerx = (x1+x2)>>1;
59048                 var centery = (y1+y2)>>1;
59049
59050                 CANVAS.save();
59051                 CANVAS.translate(centerx, centery);
59052                 if(angle) CANVAS.rotate(angle*0.01745329);
59053                 CANVAS.drawImage(img, x1-centerx, y1-centery, x2-x1, y2-y1);
59054                 CANVAS.restore();
59055         }
59056 }
59057 Drawing.prototype.drawLine = function(x1, y1, x2, y2){ CANVAS.beginPath(); CANVAS.moveTo(x1|0, y1|0); CANVAS.lineTo(x2|0, y2|0); CANVAS.stroke(); }
59058 Drawing.prototype.drawRectangle = function(x1, y1, x2, y2, style, angle){
59059         x1|=0;
59060         y1|=0;
59061         x2|=0;
59062         y2|=0;
59063         
59064         if(!angle){
59065                 if(style & this.FILL) CANVAS.fillRect(x1, y1, x2-x1, y2-y1);
59066                 if(style & this.WIREFRAME) CANVAS.strokeRect(x1, y1, x2-x1, y2-y1);
59067         }else{
59068                 var centerx = (x1+x2)>>1; var centery = (y1+y2)>>1;
59069
59070                 CANVAS.save();
59071                 CANVAS.translate(centerx, centery);
59072                 CANVAS.rotate(angle*DEGTORAD);
59073                 if(style & this.FILL) CANVAS.fillRect(x1-centerx, y1-centery, x2-x1, y2-y1);
59074                 if(style & this.WIREFRAME) CANVAS.strokeRect(x1-centerx, y1-centery, x2-x1, y2-y1);
59075                 CANVAS.restore();
59076         }
59077 }
59078 Drawing.prototype.drawScene = function(array,style){
59079         var piOver2 = 1.570796326794897;
59080         var piOver4 = 0.785398163397448;
59081         var sqrt2half = 1.414213562373095;
59082
59083         for(tri=array.length;--tri>=0;){
59084                 var x1 = array[tri][0];
59085                 var y1 = array[tri][1];
59086                 var x2 = array[tri][2];
59087                 var y2 = array[tri][3];
59088                 var x3 = array[tri][4];
59089                 var y3 = array[tri][5];
59090                 shade=array[tri][10];
59091
59092                 if(TEXTURES && array[tri][9]>=0){
59093                         CANVAS.save();
59094
59095                         var u = (x2-x3)*(x2-x3)+(y2-y3)*(y2-y3);
59096                         var v = (x1-x3)*(x1-x3)+(y1-y3)*(y1-y3);
59097                         var w = (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1);
59098
59099                         var canvasRot = 0.5*Math.acos((w+v-u)/(2*Math.sqrt(w*v)));
59100                         var scale = Math.cos(canvasRot)*sqrt2half;
59101
59102                         CANVAS.translate(x1,y1);
59103                         CANVAS.rotate(Math.atan2(y2-y1,x2-x1)-piOver2+canvasRot);
59104                         CANVAS.scale(Math.tan(canvasRot),1);
59105                         CANVAS.rotate(piOver4);
59106                         CANVAS.scale(Math.sqrt(w)*scale,Math.sqrt(v)*scale);
59107                         //CANVAS.transform(x2-x1,y2-y1,x3-x1,y3-y1, x1,y1);
59108                         CANVAS.drawImage((canvasimg = TEXTURES[array[tri][9]]), 0,0, canvasimg.width,canvasimg.height, 0,0, 1,1);
59109                         CANVAS.restore();
59110
59111                         if(shade!=0){
59112                                 CANVAS.beginPath();
59113                                 CANVAS.moveTo(x1,y1);
59114                                 CANVAS.lineTo(x2,y2);
59115                                 CANVAS.lineTo(x3,y3);
59116                                 CANVAS.lineTo(x1,y1);
59117                                 if(shade>0){
59118                                         if(shade>1) shade=1;
59119                                         CANVAS.fillStyle = "rgba(255,255,255,"+(shade)+")";
59120                                         CANVAS.strokeStyle = "rgba(255,255,255,"+(shade*.5)+")";
59121                                 }else if(shade<0){
59122                                         if(shade<-1) shade=-1;
59123                                         CANVAS.fillStyle = "rgba(0,0,0,"+(-shade)+")";
59124                                         CANVAS.strokeStyle = "rgba(0,0,0,"+(-shade*.5)+")";
59125                                 }
59126                                 if(style & this.FILL) CANVAS.fill();
59127                                 if(style & this.WIREFRAME) CANVAS.stroke();
59128                         }
59129                 }else{
59130                         var red = array[tri][6];
59131                         var green = array[tri][7];
59132                         var blue = array[tri][8];
59133                         if(shade!=0){
59134                                 red=(red*=++shade)>255?255:(red<0?0:red);
59135                                 green=(green*=shade)>255?255:(green<0?0:green);
59136                                 blue=(blue*=shade)>255?255:(blue<0?0:blue);
59137                         }
59138                         var color = "rgb("+(red|0)+","+(green|0)+","+(blue|0)+")";
59139                         CANVAS.beginPath();
59140                         CANVAS.moveTo(x1,y1);
59141                         CANVAS.lineTo(x2,y2);
59142                         CANVAS.lineTo(x3,y3);
59143                         CANVAS.lineTo(x1,y1);
59144                         if(style & this.FILL){ CANVAS.fillStyle = color; CANVAS.fill(); }
59145                         if(style & this.WIREFRAME){ CANVAS.strokeStyle = color; CANVAS.stroke(); }
59146                 }
59147         }
59148 }
59149
59150 Drawing.prototype.drawFloor = function(x1,x2,y1,x3,x4,y2,img){
59151         if((x2|=0)==(x1|=0)) x2++;
59152         if((y2|=0)==(y1|=0)) y2++;
59153         if((x4|=0)==(x3|=0)) x4++;
59154         var absdy=(dy = y2-y1)<0?-dy:dy;
59155
59156         var sourceD = img.width-1, sourceY = (img.height-1)*(dx2 = x4-x3)/dy;
59157         var destX = (x3-x1)/dy;
59158         var tempY = 0;
59159         var destW2 = (dx1 = x2-x1);
59160
59161         var absscale = (fullscale = 1.5*(dy>>31?-1:1)+dy/img.height)>>31?-(fullscale-1):(fullscale+1);
59162         var destwfullscale = fullscale*(dx2-dx1+1)/dy;
59163
59164         while(tempY<0?-tempY:tempY<=absdy){
59165                 CANVAS.drawImage(img, 0, sourceY*tempY/destW2, sourceD, 1, x1+destX*tempY, tempY+y1, destW2, absscale);
59166                 tempY+=fullscale;
59167                 destW2+=destwfullscale;
59168         }       
59169 }
59170 Drawing.prototype.drawWall = function(x1,y1,y2,x2,y3,y4,img){
59171         if(x2==x1) x2++;
59172         if(y2==y1) y2++;
59173         if(y4==y3) y4++;
59174         var dx = x2-x1, dy1 = y2-y1, dy2 = y4-y3;
59175         var absdx=dx<0?-dx:dx;
59176
59177         var sourceH = img.height-1, sourceX = (img.width-1)*dy2/dx;
59178         var destY = (y3-y1)/dx;
59179         var tempX = 0;
59180
59181         var fullscale = 1.5*(dx<0?-1:1)+dx/img.width;
59182         var absscale = fullscale<0?(-fullscale-1):(fullscale+1);
59183         var desthfullscale = fullscale*(dy2-dy1+1)/dx;
59184
59185         while(tempX<0?-tempX:tempX<=absdx){
59186                 CANVAS.drawImage(img, sourceX*tempX/dy1, 0, 1, sourceH, tempX+x1, y1+destY*tempX, absscale, dy1);
59187                 tempX+=fullscale;
59188                 dy1+=desthfullscale;
59189         }       
59190 }
59191 Drawing.prototype.zoom = function(zoom,width,height){
59192         ZOOM = zoom;
59193         CANVAS.translate(width>>1, height>>1);
59194         CANVAS.scale(ZOOM, ZOOM);
59195         CANVAS.translate(-width>>1, -height>>1);
59196 }
59197 Drawing.prototype.unZoom = function(width,height){
59198         CANVAS.translate(width>>1, height>>1);
59199         CANVAS.scale(1/ZOOM, 1/ZOOM);
59200         CANVAS.translate(-width>>1, -height>>1);
59201         ZOOM = 1;
59202 }
59203 Drawing.prototype.clear = function(x1, y1, x2, y2){ CANVAS.clearRect(x1, y1, x2-x1, y2-y1); }
59204
59205 Draw = new Drawing();var jWorkflow=function(){return{order:function(h,j){var i=[],f,d=null,g=function(){var a=false;return{take:function(){a=true},pass:function(b){var c;a=false;if(f.length){c=f.shift();b=c.func.apply(c.context,[b,g]);a||g.pass(b)}else d.func&&d.func.apply(d.context,[])}}}(),e={andThen:function(a,b){if(typeof a!=="function")throw"expected function but was "+typeof a;i.push({func:a,context:b});return e},chill:function(a){return e.andThen(function(b,c){c.take();setTimeout(function(){c.pass(b)},a)})},start:function(a,
59206 b){d={func:a,context:b};f=i.slice();g.pass()}};return h?e.andThen(h,j):e}}}();if(typeof module==="object"&&typeof require==="function")module.exports=jWorkflow;
59207 /*
59208   OpenLayers.js -- OpenLayers Map Viewer Library
59209
59210   Copyright 2005-2010 OpenLayers Contributors, released under the Clear BSD
59211   license. Full license text below taken from http://svn.openlayers.org/trunk/openlayers/license.txt
59212
59213         Copyright 2005-2011 OpenLayers Contributors. All rights reserved. See
59214         authors.txt for full list.
59215          
59216         Redistribution and use in source and binary forms, with or without modification,
59217         are permitted provided that the following conditions are met:
59218          
59219         1. Redistributions of source code must retain the above copyright notice, this
59220         list of conditions and the following disclaimer.
59221          
59222         2. Redistributions in binary form must reproduce the above copyright notice,
59223         this list of conditions and the following disclaimer in the documentation and/or
59224         other materials provided with the distribution.
59225          
59226         THIS SOFTWARE IS PROVIDED BY OPENLAYERS CONTRIBUTORS ``AS IS'' AND ANY EXPRESS
59227         OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
59228         MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
59229         SHALL COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
59230         INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
59231         LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
59232         PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
59233         LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
59234         OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
59235         ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
59236          
59237         The views and conclusions contained in the software and documentation are those
59238         of the authors and should not be interpreted as representing official policies,
59239         either expressed or implied, of OpenLayers Contributors.
59240
59241   Includes compressed code under the following licenses:
59242
59243   (For uncompressed versions of the code used please see the
59244   OpenLayers SVN repository: <http://openlayers.org/>)
59245
59246 */
59247
59248 /**  
59249 *  
59250 *  Contains portions of Rico <http://openrico.org/>
59251
59252 *  Copyright 2005 Sabre Airline Solutions  
59253 *  
59254 *  Licensed under the Apache License, Version 2.0 (the "License"); you
59255 *  may not use this file except in compliance with the License. You
59256 *  may obtain a copy of the License at
59257 *  
59258 *         http://www.apache.org/licenses/LICENSE-2.0  
59259 *  
59260 *  Unless required by applicable law or agreed to in writing, software
59261 *  distributed under the License is distributed on an "AS IS" BASIS,
59262 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
59263 *  implied. See the License for the specific language governing
59264 *  permissions and limitations under the License. 
59265 *
59266 **/
59267
59268 /**
59269  * Contains XMLHttpRequest.js <http://code.google.com/p/xmlhttprequest/>
59270  * Copyright 2007 Sergey Ilinsky (http://www.ilinsky.com)
59271  *
59272  * Licensed under the Apache License, Version 2.0 (the "License");
59273  * you may not use this file except in compliance with the License.
59274  * You may obtain a copy of the License at
59275  * http://www.apache.org/licenses/LICENSE-2.0
59276  */
59277
59278 /**
59279  * Contains portions of Gears <http://code.google.com/apis/gears/>
59280  *
59281  * Copyright 2007, Google Inc.
59282  *
59283  * Redistribution and use in source and binary forms, with or without
59284  * modification, are permitted provided that the following conditions are met:
59285  *
59286  *  1. Redistributions of source code must retain the above copyright notice,
59287  *     this list of conditions and the following disclaimer.
59288  *  2. Redistributions in binary form must reproduce the above copyright notice,
59289  *     this list of conditions and the following disclaimer in the documentation
59290  *     and/or other materials provided with the distribution.
59291  *  3. Neither the name of Google Inc. nor the names of its contributors may be
59292  *     used to endorse or promote products derived from this software without
59293  *     specific prior written permission.
59294  *
59295  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
59296  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
59297  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
59298  * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
59299  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
59300  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
59301  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
59302  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
59303  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
59304  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
59305  *
59306  * Sets up google.gears.*, which is *the only* supported way to access Gears.
59307  *
59308  * Circumvent this file at your own risk!
59309  *
59310  * In the future, Gears may automatically define google.gears.* without this
59311  * file. Gears may use these objects to transparently fix bugs and compatibility
59312  * issues. Applications that use the code below will continue to work seamlessly
59313  * when that happens.
59314  */
59315 var OpenLayers={singleFile:true};(function(){var singleFile=(typeof OpenLayers=="object"&&OpenLayers.singleFile);var scriptLocation;window.OpenLayers={_scriptName:(!singleFile)?"lib/OpenLayers.js":"OpenLayers.js",_getScriptLocation:function(){if(scriptLocation!=undefined){return scriptLocation;}
59316 scriptLocation="";var isOL=new RegExp("(^|(.*?\\/))("+OpenLayers._scriptName+")(\\?|$)");var scripts=document.getElementsByTagName('script');for(var i=0,len=scripts.length;i<len;i++){var src=scripts[i].getAttribute('src');if(src){var match=src.match(isOL);if(match){scriptLocation=match[1];break;}}}
59317 return scriptLocation;}};if(!singleFile){var jsfiles=new Array("OpenLayers/Util.js","OpenLayers/BaseTypes.js","OpenLayers/BaseTypes/Class.js","OpenLayers/BaseTypes/Bounds.js","OpenLayers/BaseTypes/Element.js","OpenLayers/BaseTypes/LonLat.js","OpenLayers/BaseTypes/Pixel.js","OpenLayers/BaseTypes/Size.js","OpenLayers/Console.js","OpenLayers/Tween.js","Rico/Corner.js","Rico/Color.js","OpenLayers/Ajax.js","OpenLayers/Events.js","OpenLayers/Request.js","OpenLayers/Request/XMLHttpRequest.js","OpenLayers/Projection.js","OpenLayers/Map.js","OpenLayers/Layer.js","OpenLayers/Icon.js","OpenLayers/Marker.js","OpenLayers/Marker/Box.js","OpenLayers/Popup.js","OpenLayers/Tile.js","OpenLayers/Tile/Image.js","OpenLayers/Tile/Image/IFrame.js","OpenLayers/Tile/WFS.js","OpenLayers/Layer/Image.js","OpenLayers/Layer/SphericalMercator.js","OpenLayers/Layer/EventPane.js","OpenLayers/Layer/FixedZoomLevels.js","OpenLayers/Layer/Google.js","OpenLayers/Layer/Google/v3.js","OpenLayers/Layer/VirtualEarth.js","OpenLayers/Layer/Yahoo.js","OpenLayers/Layer/HTTPRequest.js","OpenLayers/Layer/Grid.js","OpenLayers/Layer/MapGuide.js","OpenLayers/Layer/MapServer.js","OpenLayers/Layer/MapServer/Untiled.js","OpenLayers/Layer/KaMap.js","OpenLayers/Layer/KaMapCache.js","OpenLayers/Layer/MultiMap.js","OpenLayers/Layer/Markers.js","OpenLayers/Layer/Text.js","OpenLayers/Layer/WorldWind.js","OpenLayers/Layer/ArcGIS93Rest.js","OpenLayers/Layer/WMS.js","OpenLayers/Layer/WMS/Untiled.js","OpenLayers/Layer/WMS/Post.js","OpenLayers/Layer/WMTS.js","OpenLayers/Layer/ArcIMS.js","OpenLayers/Layer/GeoRSS.js","OpenLayers/Layer/Boxes.js","OpenLayers/Layer/XYZ.js","OpenLayers/Layer/TMS.js","OpenLayers/Layer/TileCache.js","OpenLayers/Layer/Zoomify.js","OpenLayers/Popup/Anchored.js","OpenLayers/Popup/AnchoredBubble.js","OpenLayers/Popup/Framed.js","OpenLayers/Popup/FramedCloud.js","OpenLayers/Feature.js","OpenLayers/Feature/Vector.js","OpenLayers/Feature/WFS.js","OpenLayers/Handler.js","OpenLayers/Handler/Click.js","OpenLayers/Handler/Hover.js","OpenLayers/Handler/Point.js","OpenLayers/Handler/Path.js","OpenLayers/Handler/Polygon.js","OpenLayers/Handler/Feature.js","OpenLayers/Handler/Drag.js","OpenLayers/Handler/RegularPolygon.js","OpenLayers/Handler/Box.js","OpenLayers/Handler/MouseWheel.js","OpenLayers/Handler/Keyboard.js","OpenLayers/Control.js","OpenLayers/Control/Attribution.js","OpenLayers/Control/Button.js","OpenLayers/Control/ZoomBox.js","OpenLayers/Control/ZoomToMaxExtent.js","OpenLayers/Control/DragPan.js","OpenLayers/Control/Navigation.js","OpenLayers/Control/MouseDefaults.js","OpenLayers/Control/MousePosition.js","OpenLayers/Control/OverviewMap.js","OpenLayers/Control/KeyboardDefaults.js","OpenLayers/Control/PanZoom.js","OpenLayers/Control/PanZoomBar.js","OpenLayers/Control/ArgParser.js","OpenLayers/Control/Permalink.js","OpenLayers/Control/Scale.js","OpenLayers/Control/ScaleLine.js","OpenLayers/Control/Snapping.js","OpenLayers/Control/Split.js","OpenLayers/Control/LayerSwitcher.js","OpenLayers/Control/DrawFeature.js","OpenLayers/Control/DragFeature.js","OpenLayers/Control/ModifyFeature.js","OpenLayers/Control/Panel.js","OpenLayers/Control/SelectFeature.js","OpenLayers/Control/NavigationHistory.js","OpenLayers/Control/Measure.js","OpenLayers/Control/WMSGetFeatureInfo.js","OpenLayers/Control/WMTSGetFeatureInfo.js","OpenLayers/Control/Graticule.js","OpenLayers/Control/TransformFeature.js","OpenLayers/Control/SLDSelect.js","OpenLayers/Geometry.js","OpenLayers/Geometry/Rectangle.js","OpenLayers/Geometry/Collection.js","OpenLayers/Geometry/Point.js","OpenLayers/Geometry/MultiPoint.js","OpenLayers/Geometry/Curve.js","OpenLayers/Geometry/LineString.js","OpenLayers/Geometry/LinearRing.js","OpenLayers/Geometry/Polygon.js","OpenLayers/Geometry/MultiLineString.js","OpenLayers/Geometry/MultiPolygon.js","OpenLayers/Geometry/Surface.js","OpenLayers/Renderer.js","OpenLayers/Renderer/Elements.js","OpenLayers/Renderer/SVG.js","OpenLayers/Renderer/Canvas.js","OpenLayers/Renderer/VML.js","OpenLayers/Layer/Vector.js","OpenLayers/Layer/Vector/RootContainer.js","OpenLayers/Strategy.js","OpenLayers/Strategy/Filter.js","OpenLayers/Strategy/Fixed.js","OpenLayers/Strategy/Cluster.js","OpenLayers/Strategy/Paging.js","OpenLayers/Strategy/BBOX.js","OpenLayers/Strategy/Save.js","OpenLayers/Strategy/Refresh.js","OpenLayers/Filter.js","OpenLayers/Filter/FeatureId.js","OpenLayers/Filter/Logical.js","OpenLayers/Filter/Comparison.js","OpenLayers/Filter/Spatial.js","OpenLayers/Protocol.js","OpenLayers/Protocol/HTTP.js","OpenLayers/Protocol/SQL.js","OpenLayers/Protocol/SQL/Gears.js","OpenLayers/Protocol/WFS.js","OpenLayers/Protocol/WFS/v1.js","OpenLayers/Protocol/WFS/v1_0_0.js","OpenLayers/Protocol/WFS/v1_1_0.js","OpenLayers/Protocol/SOS.js","OpenLayers/Protocol/SOS/v1_0_0.js","OpenLayers/Layer/PointTrack.js","OpenLayers/Layer/GML.js","OpenLayers/Style.js","OpenLayers/Style2.js","OpenLayers/StyleMap.js","OpenLayers/Rule.js","OpenLayers/Format.js","OpenLayers/Format/XML.js","OpenLayers/Format/Context.js","OpenLayers/Format/ArcXML.js","OpenLayers/Format/ArcXML/Features.js","OpenLayers/Format/GML.js","OpenLayers/Format/GML/Base.js","OpenLayers/Format/GML/v2.js","OpenLayers/Format/GML/v3.js","OpenLayers/Format/Atom.js","OpenLayers/Format/KML.js","OpenLayers/Format/GeoRSS.js","OpenLayers/Format/WFS.js","OpenLayers/Format/WFSCapabilities.js","OpenLayers/Format/WFSCapabilities/v1.js","OpenLayers/Format/WFSCapabilities/v1_0_0.js","OpenLayers/Format/WFSCapabilities/v1_1_0.js","OpenLayers/Format/WFSDescribeFeatureType.js","OpenLayers/Format/WMSDescribeLayer.js","OpenLayers/Format/WMSDescribeLayer/v1_1.js","OpenLayers/Format/WKT.js","OpenLayers/Format/OSM.js","OpenLayers/Format/GPX.js","OpenLayers/Format/Filter.js","OpenLayers/Format/Filter/v1.js","OpenLayers/Format/Filter/v1_0_0.js","OpenLayers/Format/Filter/v1_1_0.js","OpenLayers/Format/SLD.js","OpenLayers/Format/SLD/v1.js","OpenLayers/Format/SLD/v1_0_0.js","OpenLayers/Format/OWSCommon/v1.js","OpenLayers/Format/OWSCommon/v1_0_0.js","OpenLayers/Format/OWSCommon/v1_1_0.js","OpenLayers/Format/CSWGetDomain.js","OpenLayers/Format/CSWGetDomain/v2_0_2.js","OpenLayers/Format/CSWGetRecords.js","OpenLayers/Format/CSWGetRecords/v2_0_2.js","OpenLayers/Format/WFST.js","OpenLayers/Format/WFST/v1.js","OpenLayers/Format/WFST/v1_0_0.js","OpenLayers/Format/WFST/v1_1_0.js","OpenLayers/Format/Text.js","OpenLayers/Format/JSON.js","OpenLayers/Format/GeoJSON.js","OpenLayers/Format/WMC.js","OpenLayers/Format/WMC/v1.js","OpenLayers/Format/WMC/v1_0_0.js","OpenLayers/Format/WMC/v1_1_0.js","OpenLayers/Format/WMSCapabilities.js","OpenLayers/Format/WMSCapabilities/v1.js","OpenLayers/Format/WMSCapabilities/v1_1.js","OpenLayers/Format/WMSCapabilities/v1_1_0.js","OpenLayers/Format/WMSCapabilities/v1_1_1.js","OpenLayers/Format/WMSCapabilities/v1_3.js","OpenLayers/Format/WMSCapabilities/v1_3_0.js","OpenLayers/Format/WMSGetFeatureInfo.js","OpenLayers/Format/SOSCapabilities.js","OpenLayers/Format/SOSCapabilities/v1_0_0.js","OpenLayers/Format/SOSGetObservation.js","OpenLayers/Format/SOSGetFeatureOfInterest.js","OpenLayers/Format/OWSContext.js","OpenLayers/Format/OWSContext/v0_3_1.js","OpenLayers/Format/WMTSCapabilities.js","OpenLayers/Format/WMTSCapabilities/v1_0_0.js","OpenLayers/Layer/WFS.js","OpenLayers/Control/GetFeature.js","OpenLayers/Control/MouseToolbar.js","OpenLayers/Control/NavToolbar.js","OpenLayers/Control/PanPanel.js","OpenLayers/Control/Pan.js","OpenLayers/Control/ZoomIn.js","OpenLayers/Control/ZoomOut.js","OpenLayers/Control/ZoomPanel.js","OpenLayers/Control/EditingToolbar.js","OpenLayers/Symbolizer.js","OpenLayers/Symbolizer/Point.js","OpenLayers/Symbolizer/Line.js","OpenLayers/Symbolizer/Polygon.js","OpenLayers/Symbolizer/Text.js","OpenLayers/Symbolizer/Raster.js","OpenLayers/Lang.js","OpenLayers/Lang/en.js");var agent=navigator.userAgent;var docWrite=(agent.match("MSIE")||agent.match("Safari"));if(docWrite){var allScriptTags=new Array(jsfiles.length);}
59318 var host=OpenLayers._getScriptLocation()+"lib/";for(var i=0,len=jsfiles.length;i<len;i++){if(docWrite){allScriptTags[i]="<script src='"+host+jsfiles[i]+"'></script>";}else{var s=document.createElement("script");s.src=host+jsfiles[i];var h=document.getElementsByTagName("head").length?document.getElementsByTagName("head")[0]:document.body;h.appendChild(s);}}
59319 if(docWrite){document.write(allScriptTags.join(""));}}})();OpenLayers.VERSION_NUMBER="OpenLayers 2.10 -- $Revision: 10721 $";OpenLayers.String={startsWith:function(str,sub){return(str.indexOf(sub)==0);},contains:function(str,sub){return(str.indexOf(sub)!=-1);},trim:function(str){return str.replace(/^\s\s*/,'').replace(/\s\s*$/,'');},camelize:function(str){var oStringList=str.split('-');var camelizedString=oStringList[0];for(var i=1,len=oStringList.length;i<len;i++){var s=oStringList[i];camelizedString+=s.charAt(0).toUpperCase()+s.substring(1);}
59320 return camelizedString;},format:function(template,context,args){if(!context){context=window;}
59321 var replacer=function(str,match){var replacement;var subs=match.split(/\.+/);for(var i=0;i<subs.length;i++){if(i==0){replacement=context;}
59322 replacement=replacement[subs[i]];}
59323 if(typeof replacement=="function"){replacement=args?replacement.apply(null,args):replacement();}
59324 if(typeof replacement=='undefined'){return'undefined';}else{return replacement;}};return template.replace(OpenLayers.String.tokenRegEx,replacer);},tokenRegEx:/\$\{([\w.]+?)\}/g,numberRegEx:/^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/,isNumeric:function(value){return OpenLayers.String.numberRegEx.test(value);},numericIf:function(value){return OpenLayers.String.isNumeric(value)?parseFloat(value):value;}};if(!String.prototype.startsWith){String.prototype.startsWith=function(sStart){OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",{'newMethod':'OpenLayers.String.startsWith'}));return OpenLayers.String.startsWith(this,sStart);};}
59325 if(!String.prototype.contains){String.prototype.contains=function(str){OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",{'newMethod':'OpenLayers.String.contains'}));return OpenLayers.String.contains(this,str);};}
59326 if(!String.prototype.trim){String.prototype.trim=function(){OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",{'newMethod':'OpenLayers.String.trim'}));return OpenLayers.String.trim(this);};}
59327 if(!String.prototype.camelize){String.prototype.camelize=function(){OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",{'newMethod':'OpenLayers.String.camelize'}));return OpenLayers.String.camelize(this);};}
59328 OpenLayers.Number={decimalSeparator:".",thousandsSeparator:",",limitSigDigs:function(num,sig){var fig=0;if(sig>0){fig=parseFloat(num.toPrecision(sig));}
59329 return fig;},format:function(num,dec,tsep,dsep){dec=(typeof dec!="undefined")?dec:0;tsep=(typeof tsep!="undefined")?tsep:OpenLayers.Number.thousandsSeparator;dsep=(typeof dsep!="undefined")?dsep:OpenLayers.Number.decimalSeparator;if(dec!=null){num=parseFloat(num.toFixed(dec));}
59330 var parts=num.toString().split(".");if(parts.length==1&&dec==null){dec=0;}
59331 var integer=parts[0];if(tsep){var thousands=/(-?[0-9]+)([0-9]{3})/;while(thousands.test(integer)){integer=integer.replace(thousands,"$1"+tsep+"$2");}}
59332 var str;if(dec==0){str=integer;}else{var rem=parts.length>1?parts[1]:"0";if(dec!=null){rem=rem+new Array(dec-rem.length+1).join("0");}
59333 str=integer+dsep+rem;}
59334 return str;}};if(!Number.prototype.limitSigDigs){Number.prototype.limitSigDigs=function(sig){OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",{'newMethod':'OpenLayers.Number.limitSigDigs'}));return OpenLayers.Number.limitSigDigs(this,sig);};}
59335 OpenLayers.Function={bind:function(func,object){var args=Array.prototype.slice.apply(arguments,[2]);return function(){var newArgs=args.concat(Array.prototype.slice.apply(arguments,[0]));return func.apply(object,newArgs);};},bindAsEventListener:function(func,object){return function(event){return func.call(object,event||window.event);};},False:function(){return false;},True:function(){return true;}};if(!Function.prototype.bind){Function.prototype.bind=function(){OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",{'newMethod':'OpenLayers.Function.bind'}));Array.prototype.unshift.apply(arguments,[this]);return OpenLayers.Function.bind.apply(null,arguments);};}
59336 if(!Function.prototype.bindAsEventListener){Function.prototype.bindAsEventListener=function(object){OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",{'newMethod':'OpenLayers.Function.bindAsEventListener'}));return OpenLayers.Function.bindAsEventListener(this,object);};}
59337 OpenLayers.Array={filter:function(array,callback,caller){var selected=[];if(Array.prototype.filter){selected=array.filter(callback,caller);}else{var len=array.length;if(typeof callback!="function"){throw new TypeError();}
59338 for(var i=0;i<len;i++){if(i in array){var val=array[i];if(callback.call(caller,val,i,array)){selected.push(val);}}}}
59339 return selected;}};OpenLayers.Date={toISOString:(function(){if("toISOString"in Date.prototype){return function(date){return date.toISOString();}}else{function pad(num,len){var str=num+"";while(str.length<len){str="0"+str;}
59340 return str;}
59341 return function(date){var str;if(isNaN(date.getTime())){str="Invalid Date";}else{str=date.getUTCFullYear()+"-"+
59342 pad(date.getUTCMonth()+1,2)+"-"+
59343 pad(date.getUTCDate(),2)+"T"+
59344 pad(date.getUTCHours(),2)+":"+
59345 pad(date.getUTCMinutes(),2)+":"+
59346 pad(date.getUTCSeconds(),2)+"."+
59347 pad(date.getUTCMilliseconds(),3)+"Z";}
59348 return str;}}})(),parse:function(str){var date;var elapsed=Date.parse(str);if(!isNaN(elapsed)){date=new Date(elapsed);}else{var match=str.match(/^(?:(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?)?(?:T(\d{1,2}):(\d{2}):(\d{2}(?:\.\d+)?)(Z|(?:[+-]\d{1,2}(?::(\d{2}))?)))?$/);var date;if(match&&(match[1]||match[7])){var year=parseInt(match[1],10)||0;var month=(parseInt(match[2],10)-1)||0;var day=parseInt(match[3],10)||1;date=new Date(Date.UTC(year,month,day));var type=match[7];if(type){var hours=parseInt(match[4],10);var minutes=parseInt(match[5],10);var secFrac=parseFloat(match[6]);var seconds=secFrac|0;var milliseconds=Math.round(1000*(secFrac-seconds));date.setUTCHours(hours,minutes,seconds,milliseconds);if(type!=="Z"){var hoursOffset=parseInt(type,10);var minutesOffset=parseInt(match[8])||0;var offset=-1000*(60*(hoursOffset*60)+minutesOffset*60);date=new Date(date.getTime()+offset);}}}else{date=new Date("invalid");}}
59349 return date;}};OpenLayers.Class=function(){var Class=function(){if(arguments&&arguments[0]!=OpenLayers.Class.isPrototype){this.initialize.apply(this,arguments);}};var extended={};var parent,initialize,Type;for(var i=0,len=arguments.length;i<len;++i){Type=arguments[i];if(typeof Type=="function"){if(i==0&&len>1){initialize=Type.prototype.initialize;Type.prototype.initialize=function(){};extended=new Type();if(initialize===undefined){delete Type.prototype.initialize;}else{Type.prototype.initialize=initialize;}}
59350 parent=Type.prototype;}else{parent=Type;}
59351 OpenLayers.Util.extend(extended,parent);}
59352 Class.prototype=extended;return Class;};OpenLayers.Class.isPrototype=function(){};OpenLayers.Class.create=function(){return function(){if(arguments&&arguments[0]!=OpenLayers.Class.isPrototype){this.initialize.apply(this,arguments);}};};OpenLayers.Class.inherit=function(){var superClass=arguments[0];var proto=new superClass(OpenLayers.Class.isPrototype);for(var i=1,len=arguments.length;i<len;i++){if(typeof arguments[i]=="function"){var mixin=arguments[i];arguments[i]=new mixin(OpenLayers.Class.isPrototype);}
59353 OpenLayers.Util.extend(proto,arguments[i]);}
59354 return proto;};OpenLayers.Util={};OpenLayers.Util.getElement=function(){var elements=[];for(var i=0,len=arguments.length;i<len;i++){var element=arguments[i];if(typeof element=='string'){element=document.getElementById(element);}
59355 if(arguments.length==1){return element;}
59356 elements.push(element);}
59357 return elements;};OpenLayers.Util.isElement=function(o){return!!(o&&o.nodeType===1);};if(typeof window.$==="undefined"){window.$=OpenLayers.Util.getElement;}
59358 OpenLayers.Util.extend=function(destination,source){destination=destination||{};if(source){for(var property in source){var value=source[property];if(value!==undefined){destination[property]=value;}}
59359 var sourceIsEvt=typeof window.Event=="function"&&source instanceof window.Event;if(!sourceIsEvt&&source.hasOwnProperty&&source.hasOwnProperty('toString')){destination.toString=source.toString;}}
59360 return destination;};OpenLayers.Util.removeItem=function(array,item){for(var i=array.length-1;i>=0;i--){if(array[i]==item){array.splice(i,1);}}
59361 return array;};OpenLayers.Util.clearArray=function(array){OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",{'newMethod':'array = []'}));array.length=0;};OpenLayers.Util.indexOf=function(array,obj){if(typeof array.indexOf=="function"){return array.indexOf(obj);}else{for(var i=0,len=array.length;i<len;i++){if(array[i]==obj){return i;}}
59362 return-1;}};OpenLayers.Util.modifyDOMElement=function(element,id,px,sz,position,border,overflow,opacity){if(id){element.id=id;}
59363 if(px){element.style.left=px.x+"px";element.style.top=px.y+"px";}
59364 if(sz){element.style.width=sz.w+"px";element.style.height=sz.h+"px";}
59365 if(position){element.style.position=position;}
59366 if(border){element.style.border=border;}
59367 if(overflow){element.style.overflow=overflow;}
59368 if(parseFloat(opacity)>=0.0&&parseFloat(opacity)<1.0){element.style.filter='alpha(opacity='+(opacity*100)+')';element.style.opacity=opacity;}else if(parseFloat(opacity)==1.0){element.style.filter='';element.style.opacity='';}};OpenLayers.Util.createDiv=function(id,px,sz,imgURL,position,border,overflow,opacity){var dom=document.createElement('div');if(imgURL){dom.style.backgroundImage='url('+imgURL+')';}
59369 if(!id){id=OpenLayers.Util.createUniqueID("OpenLayersDiv");}
59370 if(!position){position="absolute";}
59371 OpenLayers.Util.modifyDOMElement(dom,id,px,sz,position,border,overflow,opacity);return dom;};OpenLayers.Util.createImage=function(id,px,sz,imgURL,position,border,opacity,delayDisplay){var image=document.createElement("img");if(!id){id=OpenLayers.Util.createUniqueID("OpenLayersDiv");}
59372 if(!position){position="relative";}
59373 OpenLayers.Util.modifyDOMElement(image,id,px,sz,position,border,null,opacity);if(delayDisplay){image.style.display="none";OpenLayers.Event.observe(image,"load",OpenLayers.Function.bind(OpenLayers.Util.onImageLoad,image));OpenLayers.Event.observe(image,"error",OpenLayers.Function.bind(OpenLayers.Util.onImageLoadError,image));}
59374 image.style.alt=id;image.galleryImg="no";if(imgURL){image.src=imgURL;}
59375 return image;};OpenLayers.Util.setOpacity=function(element,opacity){OpenLayers.Util.modifyDOMElement(element,null,null,null,null,null,null,opacity);};OpenLayers.Util.onImageLoad=function(){if(!this.viewRequestID||(this.map&&this.viewRequestID==this.map.viewRequestID)){this.style.display="";}
59376 OpenLayers.Element.removeClass(this,"olImageLoadError");};OpenLayers.IMAGE_RELOAD_ATTEMPTS=0;OpenLayers.Util.onImageLoadError=function(){this._attempts=(this._attempts)?(this._attempts+1):1;if(this._attempts<=OpenLayers.IMAGE_RELOAD_ATTEMPTS){var urls=this.urls;if(urls&&urls instanceof Array&&urls.length>1){var src=this.src.toString();var current_url,k;for(k=0;current_url=urls[k];k++){if(src.indexOf(current_url)!=-1){break;}}
59377 var guess=Math.floor(urls.length*Math.random());var new_url=urls[guess];k=0;while(new_url==current_url&&k++<4){guess=Math.floor(urls.length*Math.random());new_url=urls[guess];}
59378 this.src=src.replace(current_url,new_url);}else{this.src=this.src;}}else{OpenLayers.Element.addClass(this,"olImageLoadError");}
59379 this.style.display="";};OpenLayers.Util.alphaHackNeeded=null;OpenLayers.Util.alphaHack=function(){if(OpenLayers.Util.alphaHackNeeded==null){var arVersion=navigator.appVersion.split("MSIE");var version=parseFloat(arVersion[1]);var filter=false;try{filter=!!(document.body.filters);}catch(e){}
59380 OpenLayers.Util.alphaHackNeeded=(filter&&(version>=5.5)&&(version<7));}
59381 return OpenLayers.Util.alphaHackNeeded;};OpenLayers.Util.modifyAlphaImageDiv=function(div,id,px,sz,imgURL,position,border,sizing,opacity){OpenLayers.Util.modifyDOMElement(div,id,px,sz,position,null,null,opacity);var img=div.childNodes[0];if(imgURL){img.src=imgURL;}
59382 OpenLayers.Util.modifyDOMElement(img,div.id+"_innerImage",null,sz,"relative",border);if(OpenLayers.Util.alphaHack()){if(div.style.display!="none"){div.style.display="inline-block";}
59383 if(sizing==null){sizing="scale";}
59384 div.style.filter="progid:DXImageTransform.Microsoft"+".AlphaImageLoader(src='"+img.src+"', "+"sizingMethod='"+sizing+"')";if(parseFloat(div.style.opacity)>=0.0&&parseFloat(div.style.opacity)<1.0){div.style.filter+=" alpha(opacity="+div.style.opacity*100+")";}
59385 img.style.filter="alpha(opacity=0)";}};OpenLayers.Util.createAlphaImageDiv=function(id,px,sz,imgURL,position,border,sizing,opacity,delayDisplay){var div=OpenLayers.Util.createDiv();var img=OpenLayers.Util.createImage(null,null,null,null,null,null,null,false);div.appendChild(img);if(delayDisplay){img.style.display="none";OpenLayers.Event.observe(img,"load",OpenLayers.Function.bind(OpenLayers.Util.onImageLoad,div));OpenLayers.Event.observe(img,"error",OpenLayers.Function.bind(OpenLayers.Util.onImageLoadError,div));}
59386 OpenLayers.Util.modifyAlphaImageDiv(div,id,px,sz,imgURL,position,border,sizing,opacity);return div;};OpenLayers.Util.upperCaseObject=function(object){var uObject={};for(var key in object){uObject[key.toUpperCase()]=object[key];}
59387 return uObject;};OpenLayers.Util.applyDefaults=function(to,from){to=to||{};var fromIsEvt=typeof window.Event=="function"&&from instanceof window.Event;for(var key in from){if(to[key]===undefined||(!fromIsEvt&&from.hasOwnProperty&&from.hasOwnProperty(key)&&!to.hasOwnProperty(key))){to[key]=from[key];}}
59388 if(!fromIsEvt&&from&&from.hasOwnProperty&&from.hasOwnProperty('toString')&&!to.hasOwnProperty('toString')){to.toString=from.toString;}
59389 return to;};OpenLayers.Util.getParameterString=function(params){var paramsArray=[];for(var key in params){var value=params[key];if((value!=null)&&(typeof value!='function')){var encodedValue;if(typeof value=='object'&&value.constructor==Array){var encodedItemArray=[];var item;for(var itemIndex=0,len=value.length;itemIndex<len;itemIndex++){item=value[itemIndex];encodedItemArray.push(encodeURIComponent((item===null||item===undefined)?"":item));}
59390 encodedValue=encodedItemArray.join(",");}
59391 else{encodedValue=encodeURIComponent(value);}
59392 paramsArray.push(encodeURIComponent(key)+"="+encodedValue);}}
59393 return paramsArray.join("&");};OpenLayers.Util.urlAppend=function(url,paramStr){var newUrl=url;if(paramStr){var parts=(url+" ").split(/[?&]/);newUrl+=(parts.pop()===" "?paramStr:parts.length?"&"+paramStr:"?"+paramStr);}
59394 return newUrl;};OpenLayers.ImgPath='';OpenLayers.Util.getImagesLocation=function(){return OpenLayers.ImgPath||(OpenLayers._getScriptLocation()+"img/");};OpenLayers.Util.Try=function(){var returnValue=null;for(var i=0,len=arguments.length;i<len;i++){var lambda=arguments[i];try{returnValue=lambda();break;}catch(e){}}
59395 return returnValue;};OpenLayers.Util.getNodes=function(p,tagName){var nodes=OpenLayers.Util.Try(function(){return OpenLayers.Util._getNodes(p.documentElement.childNodes,tagName);},function(){return OpenLayers.Util._getNodes(p.childNodes,tagName);});return nodes;};OpenLayers.Util._getNodes=function(nodes,tagName){var retArray=[];for(var i=0,len=nodes.length;i<len;i++){if(nodes[i].nodeName==tagName){retArray.push(nodes[i]);}}
59396 return retArray;};OpenLayers.Util.getTagText=function(parent,item,index){var result=OpenLayers.Util.getNodes(parent,item);if(result&&(result.length>0))
59397 {if(!index){index=0;}
59398 if(result[index].childNodes.length>1){return result.childNodes[1].nodeValue;}
59399 else if(result[index].childNodes.length==1){return result[index].firstChild.nodeValue;}}else{return"";}};OpenLayers.Util.getXmlNodeValue=function(node){var val=null;OpenLayers.Util.Try(function(){val=node.text;if(!val){val=node.textContent;}
59400 if(!val){val=node.firstChild.nodeValue;}},function(){val=node.textContent;});return val;};OpenLayers.Util.mouseLeft=function(evt,div){var target=(evt.relatedTarget)?evt.relatedTarget:evt.toElement;while(target!=div&&target!=null){target=target.parentNode;}
59401 return(target!=div);};OpenLayers.Util.DEFAULT_PRECISION=14;OpenLayers.Util.toFloat=function(number,precision){if(precision==null){precision=OpenLayers.Util.DEFAULT_PRECISION;}
59402 var number;if(precision==0){number=parseFloat(number);}else{number=parseFloat(parseFloat(number).toPrecision(precision));}
59403 return number;};OpenLayers.Util.rad=function(x){return x*Math.PI/180;};OpenLayers.Util.deg=function(x){return x*180/Math.PI;};OpenLayers.Util.VincentyConstants={a:6378137,b:6356752.3142,f:1/298.257223563};OpenLayers.Util.distVincenty=function(p1,p2){var ct=OpenLayers.Util.VincentyConstants;var a=ct.a,b=ct.b,f=ct.f;var L=OpenLayers.Util.rad(p2.lon-p1.lon);var U1=Math.atan((1-f)*Math.tan(OpenLayers.Util.rad(p1.lat)));var U2=Math.atan((1-f)*Math.tan(OpenLayers.Util.rad(p2.lat)));var sinU1=Math.sin(U1),cosU1=Math.cos(U1);var sinU2=Math.sin(U2),cosU2=Math.cos(U2);var lambda=L,lambdaP=2*Math.PI;var iterLimit=20;while(Math.abs(lambda-lambdaP)>1e-12&&--iterLimit>0){var sinLambda=Math.sin(lambda),cosLambda=Math.cos(lambda);var sinSigma=Math.sqrt((cosU2*sinLambda)*(cosU2*sinLambda)+
59404 (cosU1*sinU2-sinU1*cosU2*cosLambda)*(cosU1*sinU2-sinU1*cosU2*cosLambda));if(sinSigma==0){return 0;}
59405 var cosSigma=sinU1*sinU2+cosU1*cosU2*cosLambda;var sigma=Math.atan2(sinSigma,cosSigma);var alpha=Math.asin(cosU1*cosU2*sinLambda/sinSigma);var cosSqAlpha=Math.cos(alpha)*Math.cos(alpha);var cos2SigmaM=cosSigma-2*sinU1*sinU2/cosSqAlpha;var C=f/16*cosSqAlpha*(4+f*(4-3*cosSqAlpha));lambdaP=lambda;lambda=L+(1-C)*f*Math.sin(alpha)*(sigma+C*sinSigma*(cos2SigmaM+C*cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)));}
59406 if(iterLimit==0){return NaN;}
59407 var uSq=cosSqAlpha*(a*a-b*b)/(b*b);var A=1+uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq)));var B=uSq/1024*(256+uSq*(-128+uSq*(74-47*uSq)));var deltaSigma=B*sinSigma*(cos2SigmaM+B/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)-
59408 B/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM)));var s=b*A*(sigma-deltaSigma);var d=s.toFixed(3)/1000;return d;};OpenLayers.Util.destinationVincenty=function(lonlat,brng,dist){var u=OpenLayers.Util;var ct=u.VincentyConstants;var a=ct.a,b=ct.b,f=ct.f;var lon1=lonlat.lon;var lat1=lonlat.lat;var s=dist;var alpha1=u.rad(brng);var sinAlpha1=Math.sin(alpha1);var cosAlpha1=Math.cos(alpha1);var tanU1=(1-f)*Math.tan(u.rad(lat1));var cosU1=1/Math.sqrt((1+tanU1*tanU1)),sinU1=tanU1*cosU1;var sigma1=Math.atan2(tanU1,cosAlpha1);var sinAlpha=cosU1*sinAlpha1;var cosSqAlpha=1-sinAlpha*sinAlpha;var uSq=cosSqAlpha*(a*a-b*b)/(b*b);var A=1+uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq)));var B=uSq/1024*(256+uSq*(-128+uSq*(74-47*uSq)));var sigma=s/(b*A),sigmaP=2*Math.PI;while(Math.abs(sigma-sigmaP)>1e-12){var cos2SigmaM=Math.cos(2*sigma1+sigma);var sinSigma=Math.sin(sigma);var cosSigma=Math.cos(sigma);var deltaSigma=B*sinSigma*(cos2SigmaM+B/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)-
59409 B/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM)));sigmaP=sigma;sigma=s/(b*A)+deltaSigma;}
59410 var tmp=sinU1*sinSigma-cosU1*cosSigma*cosAlpha1;var lat2=Math.atan2(sinU1*cosSigma+cosU1*sinSigma*cosAlpha1,(1-f)*Math.sqrt(sinAlpha*sinAlpha+tmp*tmp));var lambda=Math.atan2(sinSigma*sinAlpha1,cosU1*cosSigma-sinU1*sinSigma*cosAlpha1);var C=f/16*cosSqAlpha*(4+f*(4-3*cosSqAlpha));var L=lambda-(1-C)*f*sinAlpha*(sigma+C*sinSigma*(cos2SigmaM+C*cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)));var revAz=Math.atan2(sinAlpha,-tmp);return new OpenLayers.LonLat(lon1+u.deg(L),u.deg(lat2));};OpenLayers.Util.getParameters=function(url){url=url||window.location.href;var paramsString="";if(OpenLayers.String.contains(url,'?')){var start=url.indexOf('?')+1;var end=OpenLayers.String.contains(url,"#")?url.indexOf('#'):url.length;paramsString=url.substring(start,end);}
59411 var parameters={};var pairs=paramsString.split(/[&;]/);for(var i=0,len=pairs.length;i<len;++i){var keyValue=pairs[i].split('=');if(keyValue[0]){var key=decodeURIComponent(keyValue[0]);var value=keyValue[1]||'';value=decodeURIComponent(value.replace(/\+/g," ")).split(",");if(value.length==1){value=value[0];}
59412 parameters[key]=value;}}
59413 return parameters;};OpenLayers.Util.getArgs=function(url){OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",{'newMethod':'OpenLayers.Util.getParameters'}));return OpenLayers.Util.getParameters(url);};OpenLayers.Util.lastSeqID=0;OpenLayers.Util.createUniqueID=function(prefix){if(prefix==null){prefix="id_";}
59414 OpenLayers.Util.lastSeqID+=1;return prefix+OpenLayers.Util.lastSeqID;};OpenLayers.INCHES_PER_UNIT={'inches':1.0,'ft':12.0,'mi':63360.0,'m':39.3701,'km':39370.1,'dd':4374754,'yd':36};OpenLayers.INCHES_PER_UNIT["in"]=OpenLayers.INCHES_PER_UNIT.inches;OpenLayers.INCHES_PER_UNIT["degrees"]=OpenLayers.INCHES_PER_UNIT.dd;OpenLayers.INCHES_PER_UNIT["nmi"]=1852*OpenLayers.INCHES_PER_UNIT.m;OpenLayers.METERS_PER_INCH=0.02540005080010160020;OpenLayers.Util.extend(OpenLayers.INCHES_PER_UNIT,{"Inch":OpenLayers.INCHES_PER_UNIT.inches,"Meter":1.0/OpenLayers.METERS_PER_INCH,"Foot":0.30480060960121920243/OpenLayers.METERS_PER_INCH,"IFoot":0.30480000000000000000/OpenLayers.METERS_PER_INCH,"ClarkeFoot":0.3047972651151/OpenLayers.METERS_PER_INCH,"SearsFoot":0.30479947153867624624/OpenLayers.METERS_PER_INCH,"GoldCoastFoot":0.30479971018150881758/OpenLayers.METERS_PER_INCH,"IInch":0.02540000000000000000/OpenLayers.METERS_PER_INCH,"MicroInch":0.00002540000000000000/OpenLayers.METERS_PER_INCH,"Mil":0.00000002540000000000/OpenLayers.METERS_PER_INCH,"Centimeter":0.01000000000000000000/OpenLayers.METERS_PER_INCH,"Kilometer":1000.00000000000000000000/OpenLayers.METERS_PER_INCH,"Yard":0.91440182880365760731/OpenLayers.METERS_PER_INCH,"SearsYard":0.914398414616029/OpenLayers.METERS_PER_INCH,"IndianYard":0.91439853074444079983/OpenLayers.METERS_PER_INCH,"IndianYd37":0.91439523/OpenLayers.METERS_PER_INCH,"IndianYd62":0.9143988/OpenLayers.METERS_PER_INCH,"IndianYd75":0.9143985/OpenLayers.METERS_PER_INCH,"IndianFoot":0.30479951/OpenLayers.METERS_PER_INCH,"IndianFt37":0.30479841/OpenLayers.METERS_PER_INCH,"IndianFt62":0.3047996/OpenLayers.METERS_PER_INCH,"IndianFt75":0.3047995/OpenLayers.METERS_PER_INCH,"Mile":1609.34721869443738887477/OpenLayers.METERS_PER_INCH,"IYard":0.91440000000000000000/OpenLayers.METERS_PER_INCH,"IMile":1609.34400000000000000000/OpenLayers.METERS_PER_INCH,"NautM":1852.00000000000000000000/OpenLayers.METERS_PER_INCH,"Lat-66":110943.316488932731/OpenLayers.METERS_PER_INCH,"Lat-83":110946.25736872234125/OpenLayers.METERS_PER_INCH,"Decimeter":0.10000000000000000000/OpenLayers.METERS_PER_INCH,"Millimeter":0.00100000000000000000/OpenLayers.METERS_PER_INCH,"Dekameter":10.00000000000000000000/OpenLayers.METERS_PER_INCH,"Decameter":10.00000000000000000000/OpenLayers.METERS_PER_INCH,"Hectometer":100.00000000000000000000/OpenLayers.METERS_PER_INCH,"GermanMeter":1.0000135965/OpenLayers.METERS_PER_INCH,"CaGrid":0.999738/OpenLayers.METERS_PER_INCH,"ClarkeChain":20.1166194976/OpenLayers.METERS_PER_INCH,"GunterChain":20.11684023368047/OpenLayers.METERS_PER_INCH,"BenoitChain":20.116782494375872/OpenLayers.METERS_PER_INCH,"SearsChain":20.11676512155/OpenLayers.METERS_PER_INCH,"ClarkeLink":0.201166194976/OpenLayers.METERS_PER_INCH,"GunterLink":0.2011684023368047/OpenLayers.METERS_PER_INCH,"BenoitLink":0.20116782494375872/OpenLayers.METERS_PER_INCH,"SearsLink":0.2011676512155/OpenLayers.METERS_PER_INCH,"Rod":5.02921005842012/OpenLayers.METERS_PER_INCH,"IntnlChain":20.1168/OpenLayers.METERS_PER_INCH,"IntnlLink":0.201168/OpenLayers.METERS_PER_INCH,"Perch":5.02921005842012/OpenLayers.METERS_PER_INCH,"Pole":5.02921005842012/OpenLayers.METERS_PER_INCH,"Furlong":201.1684023368046/OpenLayers.METERS_PER_INCH,"Rood":3.778266898/OpenLayers.METERS_PER_INCH,"CapeFoot":0.3047972615/OpenLayers.METERS_PER_INCH,"Brealey":375.00000000000000000000/OpenLayers.METERS_PER_INCH,"ModAmFt":0.304812252984505969011938/OpenLayers.METERS_PER_INCH,"Fathom":1.8288/OpenLayers.METERS_PER_INCH,"NautM-UK":1853.184/OpenLayers.METERS_PER_INCH,"50kilometers":50000.0/OpenLayers.METERS_PER_INCH,"150kilometers":150000.0/OpenLayers.METERS_PER_INCH});OpenLayers.Util.extend(OpenLayers.INCHES_PER_UNIT,{"mm":OpenLayers.INCHES_PER_UNIT["Meter"]/1000.0,"cm":OpenLayers.INCHES_PER_UNIT["Meter"]/100.0,"dm":OpenLayers.INCHES_PER_UNIT["Meter"]*100.0,"km":OpenLayers.INCHES_PER_UNIT["Meter"]*1000.0,"kmi":OpenLayers.INCHES_PER_UNIT["nmi"],"fath":OpenLayers.INCHES_PER_UNIT["Fathom"],"ch":OpenLayers.INCHES_PER_UNIT["IntnlChain"],"link":OpenLayers.INCHES_PER_UNIT["IntnlLink"],"us-in":OpenLayers.INCHES_PER_UNIT["inches"],"us-ft":OpenLayers.INCHES_PER_UNIT["Foot"],"us-yd":OpenLayers.INCHES_PER_UNIT["Yard"],"us-ch":OpenLayers.INCHES_PER_UNIT["GunterChain"],"us-mi":OpenLayers.INCHES_PER_UNIT["Mile"],"ind-yd":OpenLayers.INCHES_PER_UNIT["IndianYd37"],"ind-ft":OpenLayers.INCHES_PER_UNIT["IndianFt37"],"ind-ch":20.11669506/OpenLayers.METERS_PER_INCH});OpenLayers.DOTS_PER_INCH=72;OpenLayers.Util.normalizeScale=function(scale){var normScale=(scale>1.0)?(1.0/scale):scale;return normScale;};OpenLayers.Util.getResolutionFromScale=function(scale,units){var resolution;if(scale){if(units==null){units="degrees";}
59415 var normScale=OpenLayers.Util.normalizeScale(scale);resolution=1/(normScale*OpenLayers.INCHES_PER_UNIT[units]*OpenLayers.DOTS_PER_INCH);}
59416 return resolution;};OpenLayers.Util.getScaleFromResolution=function(resolution,units){if(units==null){units="degrees";}
59417 var scale=resolution*OpenLayers.INCHES_PER_UNIT[units]*OpenLayers.DOTS_PER_INCH;return scale;};OpenLayers.Util.safeStopPropagation=function(evt){OpenLayers.Event.stop(evt,true);};OpenLayers.Util.pagePosition=function(forElement){var valueT=0,valueL=0;var element=forElement;var child=forElement;while(element){if(element==document.body){if(OpenLayers.Element.getStyle(child,'position')=='absolute'){break;}}
59418 valueT+=element.offsetTop||0;valueL+=element.offsetLeft||0;child=element;try{element=element.offsetParent;}catch(e){OpenLayers.Console.error(OpenLayers.i18n("pagePositionFailed",{'elemId':element.id}));break;}}
59419 element=forElement;while(element){valueT-=element.scrollTop||0;valueL-=element.scrollLeft||0;element=element.parentNode;}
59420 return[valueL,valueT];};OpenLayers.Util.isEquivalentUrl=function(url1,url2,options){options=options||{};OpenLayers.Util.applyDefaults(options,{ignoreCase:true,ignorePort80:true,ignoreHash:true});var urlObj1=OpenLayers.Util.createUrlObject(url1,options);var urlObj2=OpenLayers.Util.createUrlObject(url2,options);for(var key in urlObj1){if(key!=="args"){if(urlObj1[key]!=urlObj2[key]){return false;}}}
59421 for(var key in urlObj1.args){if(urlObj1.args[key]!=urlObj2.args[key]){return false;}
59422 delete urlObj2.args[key];}
59423 for(var key in urlObj2.args){return false;}
59424 return true;};OpenLayers.Util.createUrlObject=function(url,options){options=options||{};if(!(/^\w+:\/\//).test(url)){var loc=window.location;var port=loc.port?":"+loc.port:"";var fullUrl=loc.protocol+"//"+loc.host.split(":").shift()+port;if(url.indexOf("/")===0){url=fullUrl+url;}else{var parts=loc.pathname.split("/");parts.pop();url=fullUrl+parts.join("/")+"/"+url;}}
59425 if(options.ignoreCase){url=url.toLowerCase();}
59426 var a=document.createElement('a');a.href=url;var urlObject={};urlObject.host=a.host.split(":").shift();urlObject.protocol=a.protocol;if(options.ignorePort80){urlObject.port=(a.port=="80"||a.port=="0")?"":a.port;}else{urlObject.port=(a.port==""||a.port=="0")?"80":a.port;}
59427 urlObject.hash=(options.ignoreHash||a.hash==="#")?"":a.hash;var queryString=a.search;if(!queryString){var qMark=url.indexOf("?");queryString=(qMark!=-1)?url.substr(qMark):"";}
59428 urlObject.args=OpenLayers.Util.getParameters(queryString);urlObject.pathname=(a.pathname.charAt(0)=="/")?a.pathname:"/"+a.pathname;return urlObject;};OpenLayers.Util.removeTail=function(url){var head=null;var qMark=url.indexOf("?");var hashMark=url.indexOf("#");if(qMark==-1){head=(hashMark!=-1)?url.substr(0,hashMark):url;}else{head=(hashMark!=-1)?url.substr(0,Math.min(qMark,hashMark)):url.substr(0,qMark);}
59429 return head;};OpenLayers.Util.getBrowserName=function(){var browserName="";var ua=navigator.userAgent.toLowerCase();if(ua.indexOf("opera")!=-1){browserName="opera";}else if(ua.indexOf("msie")!=-1){browserName="msie";}else if(ua.indexOf("safari")!=-1){browserName="safari";}else if(ua.indexOf("mozilla")!=-1){if(ua.indexOf("firefox")!=-1){browserName="firefox";}else{browserName="mozilla";}}
59430 return browserName;};OpenLayers.Util.getRenderedDimensions=function(contentHTML,size,options){var w,h;var container=document.createElement("div");container.style.visibility="hidden";var containerElement=(options&&options.containerElement)?options.containerElement:document.body;if(size){if(size.w){w=size.w;container.style.width=w+"px";}else if(size.h){h=size.h;container.style.height=h+"px";}}
59431 if(options&&options.displayClass){container.className=options.displayClass;}
59432 var content=document.createElement("div");content.innerHTML=contentHTML;content.style.overflow="visible";if(content.childNodes){for(var i=0,l=content.childNodes.length;i<l;i++){if(!content.childNodes[i].style)continue;content.childNodes[i].style.overflow="visible";}}
59433 container.appendChild(content);containerElement.appendChild(container);var parentHasPositionAbsolute=false;var parent=container.parentNode;while(parent&&parent.tagName.toLowerCase()!="body"){var parentPosition=OpenLayers.Element.getStyle(parent,"position");if(parentPosition=="absolute"){parentHasPositionAbsolute=true;break;}else if(parentPosition&&parentPosition!="static"){break;}
59434 parent=parent.parentNode;}
59435 if(!parentHasPositionAbsolute){container.style.position="absolute";}
59436 if(!w){w=parseInt(content.scrollWidth);container.style.width=w+"px";}
59437 if(!h){h=parseInt(content.scrollHeight);}
59438 container.removeChild(content);containerElement.removeChild(container);return new OpenLayers.Size(w,h);};OpenLayers.Util.getScrollbarWidth=function(){var scrollbarWidth=OpenLayers.Util._scrollbarWidth;if(scrollbarWidth==null){var scr=null;var inn=null;var wNoScroll=0;var wScroll=0;scr=document.createElement('div');scr.style.position='absolute';scr.style.top='-1000px';scr.style.left='-1000px';scr.style.width='100px';scr.style.height='50px';scr.style.overflow='hidden';inn=document.createElement('div');inn.style.width='100%';inn.style.height='200px';scr.appendChild(inn);document.body.appendChild(scr);wNoScroll=inn.offsetWidth;scr.style.overflow='scroll';wScroll=inn.offsetWidth;document.body.removeChild(document.body.lastChild);OpenLayers.Util._scrollbarWidth=(wNoScroll-wScroll);scrollbarWidth=OpenLayers.Util._scrollbarWidth;}
59439 return scrollbarWidth;};OpenLayers.Util.getFormattedLonLat=function(coordinate,axis,dmsOption){if(!dmsOption){dmsOption='dms';}
59440 var abscoordinate=Math.abs(coordinate)
59441 var coordinatedegrees=Math.floor(abscoordinate);var coordinateminutes=(abscoordinate-coordinatedegrees)/(1/60);var tempcoordinateminutes=coordinateminutes;coordinateminutes=Math.floor(coordinateminutes);var coordinateseconds=(tempcoordinateminutes-coordinateminutes)/(1/60);coordinateseconds=Math.round(coordinateseconds*10);coordinateseconds/=10;if(coordinatedegrees<10){coordinatedegrees="0"+coordinatedegrees;}
59442 var str=coordinatedegrees+"\u00B0";if(dmsOption.indexOf('dm')>=0){if(coordinateminutes<10){coordinateminutes="0"+coordinateminutes;}
59443 str+=coordinateminutes+"'";if(dmsOption.indexOf('dms')>=0){if(coordinateseconds<10){coordinateseconds="0"+coordinateseconds;}
59444 str+=coordinateseconds+'"';}}
59445 if(axis=="lon"){str+=coordinate<0?OpenLayers.i18n("W"):OpenLayers.i18n("E");}else{str+=coordinate<0?OpenLayers.i18n("S"):OpenLayers.i18n("N");}
59446 return str;};OpenLayers.Rico=new Object();OpenLayers.Rico.Corner={round:function(e,options){e=OpenLayers.Util.getElement(e);this._setOptions(options);var color=this.options.color;if(this.options.color=="fromElement"){color=this._background(e);}
59447 var bgColor=this.options.bgColor;if(this.options.bgColor=="fromParent"){bgColor=this._background(e.offsetParent);}
59448 this._roundCornersImpl(e,color,bgColor);},changeColor:function(theDiv,newColor){theDiv.style.backgroundColor=newColor;var spanElements=theDiv.parentNode.getElementsByTagName("span");for(var currIdx=0;currIdx<spanElements.length;currIdx++){spanElements[currIdx].style.backgroundColor=newColor;}},changeOpacity:function(theDiv,newOpacity){var mozillaOpacity=newOpacity;var ieOpacity='alpha(opacity='+newOpacity*100+')';theDiv.style.opacity=mozillaOpacity;theDiv.style.filter=ieOpacity;var spanElements=theDiv.parentNode.getElementsByTagName("span");for(var currIdx=0;currIdx<spanElements.length;currIdx++){spanElements[currIdx].style.opacity=mozillaOpacity;spanElements[currIdx].style.filter=ieOpacity;}},reRound:function(theDiv,options){var topRico=theDiv.parentNode.childNodes[0];var bottomRico=theDiv.parentNode.childNodes[2];theDiv.parentNode.removeChild(topRico);theDiv.parentNode.removeChild(bottomRico);this.round(theDiv.parentNode,options);},_roundCornersImpl:function(e,color,bgColor){if(this.options.border){this._renderBorder(e,bgColor);}
59449 if(this._isTopRounded()){this._roundTopCorners(e,color,bgColor);}
59450 if(this._isBottomRounded()){this._roundBottomCorners(e,color,bgColor);}},_renderBorder:function(el,bgColor){var borderValue="1px solid "+this._borderColor(bgColor);var borderL="border-left: "+borderValue;var borderR="border-right: "+borderValue;var style="style='"+borderL+";"+borderR+"'";el.innerHTML="<div "+style+">"+el.innerHTML+"</div>";},_roundTopCorners:function(el,color,bgColor){var corner=this._createCorner(bgColor);for(var i=0;i<this.options.numSlices;i++){corner.appendChild(this._createCornerSlice(color,bgColor,i,"top"));}
59451 el.style.paddingTop=0;el.insertBefore(corner,el.firstChild);},_roundBottomCorners:function(el,color,bgColor){var corner=this._createCorner(bgColor);for(var i=(this.options.numSlices-1);i>=0;i--){corner.appendChild(this._createCornerSlice(color,bgColor,i,"bottom"));}
59452 el.style.paddingBottom=0;el.appendChild(corner);},_createCorner:function(bgColor){var corner=document.createElement("div");corner.style.backgroundColor=(this._isTransparent()?"transparent":bgColor);return corner;},_createCornerSlice:function(color,bgColor,n,position){var slice=document.createElement("span");var inStyle=slice.style;inStyle.backgroundColor=color;inStyle.display="block";inStyle.height="1px";inStyle.overflow="hidden";inStyle.fontSize="1px";var borderColor=this._borderColor(color,bgColor);if(this.options.border&&n==0){inStyle.borderTopStyle="solid";inStyle.borderTopWidth="1px";inStyle.borderLeftWidth="0px";inStyle.borderRightWidth="0px";inStyle.borderBottomWidth="0px";inStyle.height="0px";inStyle.borderColor=borderColor;}
59453 else if(borderColor){inStyle.borderColor=borderColor;inStyle.borderStyle="solid";inStyle.borderWidth="0px 1px";}
59454 if(!this.options.compact&&(n==(this.options.numSlices-1))){inStyle.height="2px";}
59455 this._setMargin(slice,n,position);this._setBorder(slice,n,position);return slice;},_setOptions:function(options){this.options={corners:"all",color:"fromElement",bgColor:"fromParent",blend:true,border:false,compact:false};OpenLayers.Util.extend(this.options,options||{});this.options.numSlices=this.options.compact?2:4;if(this._isTransparent()){this.options.blend=false;}},_whichSideTop:function(){if(this._hasString(this.options.corners,"all","top")){return"";}
59456 if(this.options.corners.indexOf("tl")>=0&&this.options.corners.indexOf("tr")>=0){return"";}
59457 if(this.options.corners.indexOf("tl")>=0){return"left";}else if(this.options.corners.indexOf("tr")>=0){return"right";}
59458 return"";},_whichSideBottom:function(){if(this._hasString(this.options.corners,"all","bottom")){return"";}
59459 if(this.options.corners.indexOf("bl")>=0&&this.options.corners.indexOf("br")>=0){return"";}
59460 if(this.options.corners.indexOf("bl")>=0){return"left";}else if(this.options.corners.indexOf("br")>=0){return"right";}
59461 return"";},_borderColor:function(color,bgColor){if(color=="transparent"){return bgColor;}else if(this.options.border){return this.options.border;}else if(this.options.blend){return this._blend(bgColor,color);}else{return"";}},_setMargin:function(el,n,corners){var marginSize=this._marginSize(n);var whichSide=corners=="top"?this._whichSideTop():this._whichSideBottom();if(whichSide=="left"){el.style.marginLeft=marginSize+"px";el.style.marginRight="0px";}
59462 else if(whichSide=="right"){el.style.marginRight=marginSize+"px";el.style.marginLeft="0px";}
59463 else{el.style.marginLeft=marginSize+"px";el.style.marginRight=marginSize+"px";}},_setBorder:function(el,n,corners){var borderSize=this._borderSize(n);var whichSide=corners=="top"?this._whichSideTop():this._whichSideBottom();if(whichSide=="left"){el.style.borderLeftWidth=borderSize+"px";el.style.borderRightWidth="0px";}
59464 else if(whichSide=="right"){el.style.borderRightWidth=borderSize+"px";el.style.borderLeftWidth="0px";}
59465 else{el.style.borderLeftWidth=borderSize+"px";el.style.borderRightWidth=borderSize+"px";}
59466 if(this.options.border!=false){el.style.borderLeftWidth=borderSize+"px";el.style.borderRightWidth=borderSize+"px";}},_marginSize:function(n){if(this._isTransparent()){return 0;}
59467 var marginSizes=[5,3,2,1];var blendedMarginSizes=[3,2,1,0];var compactMarginSizes=[2,1];var smBlendedMarginSizes=[1,0];if(this.options.compact&&this.options.blend){return smBlendedMarginSizes[n];}else if(this.options.compact){return compactMarginSizes[n];}else if(this.options.blend){return blendedMarginSizes[n];}else{return marginSizes[n];}},_borderSize:function(n){var transparentBorderSizes=[5,3,2,1];var blendedBorderSizes=[2,1,1,1];var compactBorderSizes=[1,0];var actualBorderSizes=[0,2,0,0];if(this.options.compact&&(this.options.blend||this._isTransparent())){return 1;}else if(this.options.compact){return compactBorderSizes[n];}else if(this.options.blend){return blendedBorderSizes[n];}else if(this.options.border){return actualBorderSizes[n];}else if(this._isTransparent()){return transparentBorderSizes[n];}
59468 return 0;},_hasString:function(str){for(var i=1;i<arguments.length;i++)if(str.indexOf(arguments[i])>=0){return true;}return false;},_blend:function(c1,c2){var cc1=OpenLayers.Rico.Color.createFromHex(c1);cc1.blend(OpenLayers.Rico.Color.createFromHex(c2));return cc1;},_background:function(el){try{return OpenLayers.Rico.Color.createColorFromBackground(el).asHex();}catch(err){return"#ffffff";}},_isTransparent:function(){return this.options.color=="transparent";},_isTopRounded:function(){return this._hasString(this.options.corners,"all","top","tl","tr");},_isBottomRounded:function(){return this._hasString(this.options.corners,"all","bottom","bl","br");},_hasSingleTextChild:function(el){return el.childNodes.length==1&&el.childNodes[0].nodeType==3;}};(function(){if(window.google&&google.gears){return;}
59469 var factory=null;if(typeof GearsFactory!='undefined'){factory=new GearsFactory();}else{try{factory=new ActiveXObject('Gears.Factory');if(factory.getBuildInfo().indexOf('ie_mobile')!=-1){factory.privateSetGlobalObject(this);}}catch(e){if((typeof navigator.mimeTypes!='undefined')&&navigator.mimeTypes["application/x-googlegears"]){factory=document.createElement("object");factory.style.display="none";factory.width=0;factory.height=0;factory.type="application/x-googlegears";document.documentElement.appendChild(factory);}}}
59470 if(!factory){return;}
59471 if(!window.google){google={};}
59472 if(!google.gears){google.gears={factory:factory};}})();OpenLayers.Element={visible:function(element){return OpenLayers.Util.getElement(element).style.display!='none';},toggle:function(){for(var i=0,len=arguments.length;i<len;i++){var element=OpenLayers.Util.getElement(arguments[i]);var display=OpenLayers.Element.visible(element)?'hide':'show';OpenLayers.Element[display](element);}},hide:function(){for(var i=0,len=arguments.length;i<len;i++){var element=OpenLayers.Util.getElement(arguments[i]);if(element){element.style.display='none';}}},show:function(){for(var i=0,len=arguments.length;i<len;i++){var element=OpenLayers.Util.getElement(arguments[i]);if(element){element.style.display='';}}},remove:function(element){element=OpenLayers.Util.getElement(element);element.parentNode.removeChild(element);},getHeight:function(element){element=OpenLayers.Util.getElement(element);return element.offsetHeight;},getDimensions:function(element){element=OpenLayers.Util.getElement(element);if(OpenLayers.Element.getStyle(element,'display')!='none'){return{width:element.offsetWidth,height:element.offsetHeight};}
59473 var els=element.style;var originalVisibility=els.visibility;var originalPosition=els.position;var originalDisplay=els.display;els.visibility='hidden';els.position='absolute';els.display='';var originalWidth=element.clientWidth;var originalHeight=element.clientHeight;els.display=originalDisplay;els.position=originalPosition;els.visibility=originalVisibility;return{width:originalWidth,height:originalHeight};},hasClass:function(element,name){var names=element.className;return(!!names&&new RegExp("(^|\\s)"+name+"(\\s|$)").test(names));},addClass:function(element,name){if(!OpenLayers.Element.hasClass(element,name)){element.className+=(element.className?" ":"")+name;}
59474 return element;},removeClass:function(element,name){var names=element.className;if(names){element.className=OpenLayers.String.trim(names.replace(new RegExp("(^|\\s+)"+name+"(\\s+|$)")," "));}
59475 return element;},toggleClass:function(element,name){if(OpenLayers.Element.hasClass(element,name)){OpenLayers.Element.removeClass(element,name);}else{OpenLayers.Element.addClass(element,name);}
59476 return element;},getStyle:function(element,style){element=OpenLayers.Util.getElement(element);var value=null;if(element&&element.style){value=element.style[OpenLayers.String.camelize(style)];if(!value){if(document.defaultView&&document.defaultView.getComputedStyle){var css=document.defaultView.getComputedStyle(element,null);value=css?css.getPropertyValue(style):null;}else if(element.currentStyle){value=element.currentStyle[OpenLayers.String.camelize(style)];}}
59477 var positions=['left','top','right','bottom'];if(window.opera&&(OpenLayers.Util.indexOf(positions,style)!=-1)&&(OpenLayers.Element.getStyle(element,'position')=='static')){value='auto';}}
59478 return value=='auto'?null:value;}};OpenLayers.Size=OpenLayers.Class({w:0.0,h:0.0,initialize:function(w,h){this.w=parseFloat(w);this.h=parseFloat(h);},toString:function(){return("w="+this.w+",h="+this.h);},clone:function(){return new OpenLayers.Size(this.w,this.h);},equals:function(sz){var equals=false;if(sz!=null){equals=((this.w==sz.w&&this.h==sz.h)||(isNaN(this.w)&&isNaN(this.h)&&isNaN(sz.w)&&isNaN(sz.h)));}
59479 return equals;},CLASS_NAME:"OpenLayers.Size"});OpenLayers.Console={log:function(){},debug:function(){},info:function(){},warn:function(){},error:function(){},userError:function(error){alert(error);},assert:function(){},dir:function(){},dirxml:function(){},trace:function(){},group:function(){},groupEnd:function(){},time:function(){},timeEnd:function(){},profile:function(){},profileEnd:function(){},count:function(){},CLASS_NAME:"OpenLayers.Console"};(function(){var scripts=document.getElementsByTagName("script");for(var i=0,len=scripts.length;i<len;++i){if(scripts[i].src.indexOf("firebug.js")!=-1){if(console){OpenLayers.Util.extend(OpenLayers.Console,console);break;}}}})();OpenLayers.Icon=OpenLayers.Class({url:null,size:null,offset:null,calculateOffset:null,imageDiv:null,px:null,initialize:function(url,size,offset,calculateOffset){this.url=url;this.size=(size)?size:new OpenLayers.Size(20,20);this.offset=offset?offset:new OpenLayers.Pixel(-(this.size.w/2),-(this.size.h/2));this.calculateOffset=calculateOffset;var id=OpenLayers.Util.createUniqueID("OL_Icon_");this.imageDiv=OpenLayers.Util.createAlphaImageDiv(id);},destroy:function(){this.erase();OpenLayers.Event.stopObservingElement(this.imageDiv.firstChild);this.imageDiv.innerHTML="";this.imageDiv=null;},clone:function(){return new OpenLayers.Icon(this.url,this.size,this.offset,this.calculateOffset);},setSize:function(size){if(size!=null){this.size=size;}
59480 this.draw();},setUrl:function(url){if(url!=null){this.url=url;}
59481 this.draw();},draw:function(px){OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv,null,null,this.size,this.url,"absolute");this.moveTo(px);return this.imageDiv;},erase:function(){if(this.imageDiv!=null&&this.imageDiv.parentNode!=null){OpenLayers.Element.remove(this.imageDiv);}},setOpacity:function(opacity){OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv,null,null,null,null,null,null,null,opacity);},moveTo:function(px){if(px!=null){this.px=px;}
59482 if(this.imageDiv!=null){if(this.px==null){this.display(false);}else{if(this.calculateOffset){this.offset=this.calculateOffset(this.size);}
59483 var offsetPx=this.px.offset(this.offset);OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv,null,offsetPx);}}},display:function(display){this.imageDiv.style.display=(display)?"":"none";},isDrawn:function(){var isDrawn=(this.imageDiv&&this.imageDiv.parentNode&&(this.imageDiv.parentNode.nodeType!=11));return isDrawn;},CLASS_NAME:"OpenLayers.Icon"});OpenLayers.Popup=OpenLayers.Class({events:null,id:"",lonlat:null,div:null,contentSize:null,size:null,contentHTML:null,backgroundColor:"",opacity:"",border:"",contentDiv:null,groupDiv:null,closeDiv:null,autoSize:false,minSize:null,maxSize:null,displayClass:"olPopup",contentDisplayClass:"olPopupContent",padding:0,disableFirefoxOverflowHack:false,fixPadding:function(){if(typeof this.padding=="number"){this.padding=new OpenLayers.Bounds(this.padding,this.padding,this.padding,this.padding);}},panMapIfOutOfView:false,keepInMap:false,closeOnMove:false,map:null,initialize:function(id,lonlat,contentSize,contentHTML,closeBox,closeBoxCallback){if(id==null){id=OpenLayers.Util.createUniqueID(this.CLASS_NAME+"_");}
59484 this.id=id;this.lonlat=lonlat;this.contentSize=(contentSize!=null)?contentSize:new OpenLayers.Size(OpenLayers.Popup.WIDTH,OpenLayers.Popup.HEIGHT);if(contentHTML!=null){this.contentHTML=contentHTML;}
59485 this.backgroundColor=OpenLayers.Popup.COLOR;this.opacity=OpenLayers.Popup.OPACITY;this.border=OpenLayers.Popup.BORDER;this.div=OpenLayers.Util.createDiv(this.id,null,null,null,null,null,"hidden");this.div.className=this.displayClass;var groupDivId=this.id+"_GroupDiv";this.groupDiv=OpenLayers.Util.createDiv(groupDivId,null,null,null,"relative",null,"hidden");var id=this.div.id+"_contentDiv";this.contentDiv=OpenLayers.Util.createDiv(id,null,this.contentSize.clone(),null,"relative");this.contentDiv.className=this.contentDisplayClass;this.groupDiv.appendChild(this.contentDiv);this.div.appendChild(this.groupDiv);if(closeBox){this.addCloseBox(closeBoxCallback);}
59486 this.registerEvents();},destroy:function(){this.id=null;this.lonlat=null;this.size=null;this.contentHTML=null;this.backgroundColor=null;this.opacity=null;this.border=null;if(this.closeOnMove&&this.map){this.map.events.unregister("movestart",this,this.hide);}
59487 this.events.destroy();this.events=null;if(this.closeDiv){OpenLayers.Event.stopObservingElement(this.closeDiv);this.groupDiv.removeChild(this.closeDiv);}
59488 this.closeDiv=null;this.div.removeChild(this.groupDiv);this.groupDiv=null;if(this.map!=null){this.map.removePopup(this);}
59489 this.map=null;this.div=null;this.autoSize=null;this.minSize=null;this.maxSize=null;this.padding=null;this.panMapIfOutOfView=null;},draw:function(px){if(px==null){if((this.lonlat!=null)&&(this.map!=null)){px=this.map.getLayerPxFromLonLat(this.lonlat);}}
59490 if(this.closeOnMove){this.map.events.register("movestart",this,this.hide);}
59491 if(!this.disableFirefoxOverflowHack&&OpenLayers.Util.getBrowserName()=='firefox'){this.map.events.register("movestart",this,function(){var style=document.defaultView.getComputedStyle(this.contentDiv,null);var currentOverflow=style.getPropertyValue("overflow");if(currentOverflow!="hidden"){this.contentDiv._oldOverflow=currentOverflow;this.contentDiv.style.overflow="hidden";}});this.map.events.register("moveend",this,function(){var oldOverflow=this.contentDiv._oldOverflow;if(oldOverflow){this.contentDiv.style.overflow=oldOverflow;this.contentDiv._oldOverflow=null;}});}
59492 this.moveTo(px);if(!this.autoSize&&!this.size){this.setSize(this.contentSize);}
59493 this.setBackgroundColor();this.setOpacity();this.setBorder();this.setContentHTML();if(this.panMapIfOutOfView){this.panIntoView();}
59494 return this.div;},updatePosition:function(){if((this.lonlat)&&(this.map)){var px=this.map.getLayerPxFromLonLat(this.lonlat);if(px){this.moveTo(px);}}},moveTo:function(px){if((px!=null)&&(this.div!=null)){this.div.style.left=px.x+"px";this.div.style.top=px.y+"px";}},visible:function(){return OpenLayers.Element.visible(this.div);},toggle:function(){if(this.visible()){this.hide();}else{this.show();}},show:function(){OpenLayers.Element.show(this.div);if(this.panMapIfOutOfView){this.panIntoView();}},hide:function(){OpenLayers.Element.hide(this.div);},setSize:function(contentSize){this.size=contentSize.clone();var contentDivPadding=this.getContentDivPadding();var wPadding=contentDivPadding.left+contentDivPadding.right;var hPadding=contentDivPadding.top+contentDivPadding.bottom;this.fixPadding();wPadding+=this.padding.left+this.padding.right;hPadding+=this.padding.top+this.padding.bottom;if(this.closeDiv){var closeDivWidth=parseInt(this.closeDiv.style.width);wPadding+=closeDivWidth+contentDivPadding.right;}
59495 this.size.w+=wPadding;this.size.h+=hPadding;if(OpenLayers.Util.getBrowserName()=="msie"){this.contentSize.w+=contentDivPadding.left+contentDivPadding.right;this.contentSize.h+=contentDivPadding.bottom+contentDivPadding.top;}
59496 if(this.div!=null){this.div.style.width=this.size.w+"px";this.div.style.height=this.size.h+"px";}
59497 if(this.contentDiv!=null){this.contentDiv.style.width=contentSize.w+"px";this.contentDiv.style.height=contentSize.h+"px";}},updateSize:function(){var preparedHTML="<div class='"+this.contentDisplayClass+"'>"+
59498 this.contentDiv.innerHTML+"</div>";var containerElement=(this.map)?this.map.layerContainerDiv:document.body;var realSize=OpenLayers.Util.getRenderedDimensions(preparedHTML,null,{displayClass:this.displayClass,containerElement:containerElement});var safeSize=this.getSafeContentSize(realSize);var newSize=null;if(safeSize.equals(realSize)){newSize=realSize;}else{var fixedSize=new OpenLayers.Size();fixedSize.w=(safeSize.w<realSize.w)?safeSize.w:null;fixedSize.h=(safeSize.h<realSize.h)?safeSize.h:null;if(fixedSize.w&&fixedSize.h){newSize=safeSize;}else{var clippedSize=OpenLayers.Util.getRenderedDimensions(preparedHTML,fixedSize,{displayClass:this.contentDisplayClass,containerElement:containerElement});var currentOverflow=OpenLayers.Element.getStyle(this.contentDiv,"overflow");if((currentOverflow!="hidden")&&(clippedSize.equals(safeSize))){var scrollBar=OpenLayers.Util.getScrollbarWidth();if(fixedSize.w){clippedSize.h+=scrollBar;}else{clippedSize.w+=scrollBar;}}
59499 newSize=this.getSafeContentSize(clippedSize);}}
59500 this.setSize(newSize);},setBackgroundColor:function(color){if(color!=undefined){this.backgroundColor=color;}
59501 if(this.div!=null){this.div.style.backgroundColor=this.backgroundColor;}},setOpacity:function(opacity){if(opacity!=undefined){this.opacity=opacity;}
59502 if(this.div!=null){this.div.style.opacity=this.opacity;this.div.style.filter='alpha(opacity='+this.opacity*100+')';}},setBorder:function(border){if(border!=undefined){this.border=border;}
59503 if(this.div!=null){this.div.style.border=this.border;}},setContentHTML:function(contentHTML){if(contentHTML!=null){this.contentHTML=contentHTML;}
59504 if((this.contentDiv!=null)&&(this.contentHTML!=null)&&(this.contentHTML!=this.contentDiv.innerHTML)){this.contentDiv.innerHTML=this.contentHTML;if(this.autoSize){this.registerImageListeners();this.updateSize();}}},registerImageListeners:function(){var onImgLoad=function(){this.popup.updateSize();if(this.popup.visible()&&this.popup.panMapIfOutOfView){this.popup.panIntoView();}
59505 OpenLayers.Event.stopObserving(this.img,"load",this.img._onImageLoad);};var images=this.contentDiv.getElementsByTagName("img");for(var i=0,len=images.length;i<len;i++){var img=images[i];if(img.width==0||img.height==0){var context={'popup':this,'img':img};img._onImgLoad=OpenLayers.Function.bind(onImgLoad,context);OpenLayers.Event.observe(img,'load',img._onImgLoad);}}},getSafeContentSize:function(size){var safeContentSize=size.clone();var contentDivPadding=this.getContentDivPadding();var wPadding=contentDivPadding.left+contentDivPadding.right;var hPadding=contentDivPadding.top+contentDivPadding.bottom;this.fixPadding();wPadding+=this.padding.left+this.padding.right;hPadding+=this.padding.top+this.padding.bottom;if(this.closeDiv){var closeDivWidth=parseInt(this.closeDiv.style.width);wPadding+=closeDivWidth+contentDivPadding.right;}
59506 if(this.minSize){safeContentSize.w=Math.max(safeContentSize.w,(this.minSize.w-wPadding));safeContentSize.h=Math.max(safeContentSize.h,(this.minSize.h-hPadding));}
59507 if(this.maxSize){safeContentSize.w=Math.min(safeContentSize.w,(this.maxSize.w-wPadding));safeContentSize.h=Math.min(safeContentSize.h,(this.maxSize.h-hPadding));}
59508 if(this.map&&this.map.size){var extraX=0,extraY=0;if(this.keepInMap&&!this.panMapIfOutOfView){var px=this.map.getPixelFromLonLat(this.lonlat);switch(this.relativePosition){case"tr":extraX=px.x;extraY=this.map.size.h-px.y;break;case"tl":extraX=this.map.size.w-px.x;extraY=this.map.size.h-px.y;break;case"bl":extraX=this.map.size.w-px.x;extraY=px.y;break;case"br":extraX=px.x;extraY=px.y;break;default:extraX=px.x;extraY=this.map.size.h-px.y;break;}}
59509 var maxY=this.map.size.h-
59510 this.map.paddingForPopups.top-
59511 this.map.paddingForPopups.bottom-
59512 hPadding-extraY;var maxX=this.map.size.w-
59513 this.map.paddingForPopups.left-
59514 this.map.paddingForPopups.right-
59515 wPadding-extraX;safeContentSize.w=Math.min(safeContentSize.w,maxX);safeContentSize.h=Math.min(safeContentSize.h,maxY);}
59516 return safeContentSize;},getContentDivPadding:function(){var contentDivPadding=this._contentDivPadding;if(!contentDivPadding){if(this.div.parentNode==null){this.div.style.display="none";document.body.appendChild(this.div);}
59517 contentDivPadding=new OpenLayers.Bounds(OpenLayers.Element.getStyle(this.contentDiv,"padding-left"),OpenLayers.Element.getStyle(this.contentDiv,"padding-bottom"),OpenLayers.Element.getStyle(this.contentDiv,"padding-right"),OpenLayers.Element.getStyle(this.contentDiv,"padding-top"));this._contentDivPadding=contentDivPadding;if(this.div.parentNode==document.body){document.body.removeChild(this.div);this.div.style.display="";}}
59518 return contentDivPadding;},addCloseBox:function(callback){this.closeDiv=OpenLayers.Util.createDiv(this.id+"_close",null,new OpenLayers.Size(17,17));this.closeDiv.className="olPopupCloseBox";var contentDivPadding=this.getContentDivPadding();this.closeDiv.style.right=contentDivPadding.right+"px";this.closeDiv.style.top=contentDivPadding.top+"px";this.groupDiv.appendChild(this.closeDiv);var closePopup=callback||function(e){this.hide();OpenLayers.Event.stop(e);};OpenLayers.Event.observe(this.closeDiv,"click",OpenLayers.Function.bindAsEventListener(closePopup,this));},panIntoView:function(){var mapSize=this.map.getSize();var origTL=this.map.getViewPortPxFromLayerPx(new OpenLayers.Pixel(parseInt(this.div.style.left),parseInt(this.div.style.top)));var newTL=origTL.clone();if(origTL.x<this.map.paddingForPopups.left){newTL.x=this.map.paddingForPopups.left;}else
59519 if((origTL.x+this.size.w)>(mapSize.w-this.map.paddingForPopups.right)){newTL.x=mapSize.w-this.map.paddingForPopups.right-this.size.w;}
59520 if(origTL.y<this.map.paddingForPopups.top){newTL.y=this.map.paddingForPopups.top;}else
59521 if((origTL.y+this.size.h)>(mapSize.h-this.map.paddingForPopups.bottom)){newTL.y=mapSize.h-this.map.paddingForPopups.bottom-this.size.h;}
59522 var dx=origTL.x-newTL.x;var dy=origTL.y-newTL.y;this.map.pan(dx,dy);},registerEvents:function(){this.events=new OpenLayers.Events(this,this.div,null,true);this.events.on({"mousedown":this.onmousedown,"mousemove":this.onmousemove,"mouseup":this.onmouseup,"click":this.onclick,"mouseout":this.onmouseout,"dblclick":this.ondblclick,scope:this});},onmousedown:function(evt){this.mousedown=true;OpenLayers.Event.stop(evt,true);},onmousemove:function(evt){if(this.mousedown){OpenLayers.Event.stop(evt,true);}},onmouseup:function(evt){if(this.mousedown){this.mousedown=false;OpenLayers.Event.stop(evt,true);}},onclick:function(evt){OpenLayers.Event.stop(evt,true);},onmouseout:function(evt){this.mousedown=false;},ondblclick:function(evt){OpenLayers.Event.stop(evt,true);},CLASS_NAME:"OpenLayers.Popup"});OpenLayers.Popup.WIDTH=200;OpenLayers.Popup.HEIGHT=200;OpenLayers.Popup.COLOR="white";OpenLayers.Popup.OPACITY=1;OpenLayers.Popup.BORDER="0px";OpenLayers.Protocol=OpenLayers.Class({format:null,options:null,autoDestroy:true,defaultFilter:null,initialize:function(options){options=options||{};OpenLayers.Util.extend(this,options);this.options=options;},mergeWithDefaultFilter:function(filter){var merged;if(filter&&this.defaultFilter){merged=new OpenLayers.Filter.Logical({type:OpenLayers.Filter.Logical.AND,filters:[this.defaultFilter,filter]});}else{merged=filter||this.defaultFilter||undefined;}
59523 return merged;},destroy:function(){this.options=null;this.format=null;},read:function(options){options=options||{};options.filter=this.mergeWithDefaultFilter(options.filter);},create:function(){},update:function(){},"delete":function(){},commit:function(){},abort:function(response){},createCallback:function(method,response,options){return OpenLayers.Function.bind(function(){method.apply(this,[response,options]);},this);},CLASS_NAME:"OpenLayers.Protocol"});OpenLayers.Protocol.Response=OpenLayers.Class({code:null,requestType:null,last:true,features:null,reqFeatures:null,priv:null,initialize:function(options){OpenLayers.Util.extend(this,options);},success:function(){return this.code>0;},CLASS_NAME:"OpenLayers.Protocol.Response"});OpenLayers.Protocol.Response.SUCCESS=1;OpenLayers.Protocol.Response.FAILURE=0;OpenLayers.Renderer=OpenLayers.Class({container:null,root:null,extent:null,locked:false,size:null,resolution:null,map:null,initialize:function(containerID,options){this.container=OpenLayers.Util.getElement(containerID);},destroy:function(){this.container=null;this.extent=null;this.size=null;this.resolution=null;this.map=null;},supported:function(){return false;},setExtent:function(extent,resolutionChanged){this.extent=extent.clone();if(resolutionChanged){this.resolution=null;}},setSize:function(size){this.size=size.clone();this.resolution=null;},getResolution:function(){this.resolution=this.resolution||this.map.getResolution();return this.resolution;},drawFeature:function(feature,style){if(style==null){style=feature.style;}
59524 if(feature.geometry){var bounds=feature.geometry.getBounds();if(bounds){if(!bounds.intersectsBounds(this.extent)){style={display:"none"};}
59525 var rendered=this.drawGeometry(feature.geometry,style,feature.id);if(style.display!="none"&&style.label&&rendered!==false){var location=feature.geometry.getCentroid();if(style.labelXOffset||style.labelYOffset){xOffset=isNaN(style.labelXOffset)?0:style.labelXOffset;yOffset=isNaN(style.labelYOffset)?0:style.labelYOffset;var res=this.getResolution();location.move(xOffset*res,yOffset*res);}
59526 this.drawText(feature.id,style,location);}else{this.removeText(feature.id);}
59527 return rendered;}}},drawGeometry:function(geometry,style,featureId){},drawText:function(featureId,style,location){},removeText:function(featureId){},clear:function(){},getFeatureIdFromEvent:function(evt){},eraseFeatures:function(features){if(!(features instanceof Array)){features=[features];}
59528 for(var i=0,len=features.length;i<len;++i){var feature=features[i];this.eraseGeometry(feature.geometry,feature.id);this.removeText(feature.id);}},eraseGeometry:function(geometry,featureId){},moveRoot:function(renderer){},getRenderLayerId:function(){return this.container.id;},applyDefaultSymbolizer:function(symbolizer){var result=OpenLayers.Util.extend({},OpenLayers.Renderer.defaultSymbolizer);if(symbolizer.stroke===false){delete result.strokeWidth;delete result.strokeColor;}
59529 if(symbolizer.fill===false){delete result.fillColor;}
59530 OpenLayers.Util.extend(result,symbolizer);return result;},CLASS_NAME:"OpenLayers.Renderer"});OpenLayers.Renderer.defaultSymbolizer={fillColor:"#000000",strokeColor:"#000000",strokeWidth:2,fillOpacity:1,strokeOpacity:1,pointRadius:0};OpenLayers.Strategy=OpenLayers.Class({layer:null,options:null,active:null,autoActivate:true,autoDestroy:true,initialize:function(options){OpenLayers.Util.extend(this,options);this.options=options;this.active=false;},destroy:function(){this.deactivate();this.layer=null;this.options=null;},setLayer:function(layer){this.layer=layer;},activate:function(){if(!this.active){this.active=true;return true;}
59531 return false;},deactivate:function(){if(this.active){this.active=false;return true;}
59532 return false;},CLASS_NAME:"OpenLayers.Strategy"});OpenLayers.Symbolizer=OpenLayers.Class({zIndex:0,initialize:function(config){OpenLayers.Util.extend(this,config);},clone:function(){var Type=eval(this.CLASS_NAME);return new Type(OpenLayers.Util.extend({},this));},CLASS_NAME:"OpenLayers.Symbolizer"});OpenLayers.Rico.Color=OpenLayers.Class({initialize:function(red,green,blue){this.rgb={r:red,g:green,b:blue};},setRed:function(r){this.rgb.r=r;},setGreen:function(g){this.rgb.g=g;},setBlue:function(b){this.rgb.b=b;},setHue:function(h){var hsb=this.asHSB();hsb.h=h;this.rgb=OpenLayers.Rico.Color.HSBtoRGB(hsb.h,hsb.s,hsb.b);},setSaturation:function(s){var hsb=this.asHSB();hsb.s=s;this.rgb=OpenLayers.Rico.Color.HSBtoRGB(hsb.h,hsb.s,hsb.b);},setBrightness:function(b){var hsb=this.asHSB();hsb.b=b;this.rgb=OpenLayers.Rico.Color.HSBtoRGB(hsb.h,hsb.s,hsb.b);},darken:function(percent){var hsb=this.asHSB();this.rgb=OpenLayers.Rico.Color.HSBtoRGB(hsb.h,hsb.s,Math.max(hsb.b-percent,0));},brighten:function(percent){var hsb=this.asHSB();this.rgb=OpenLayers.Rico.Color.HSBtoRGB(hsb.h,hsb.s,Math.min(hsb.b+percent,1));},blend:function(other){this.rgb.r=Math.floor((this.rgb.r+other.rgb.r)/2);this.rgb.g=Math.floor((this.rgb.g+other.rgb.g)/2);this.rgb.b=Math.floor((this.rgb.b+other.rgb.b)/2);},isBright:function(){var hsb=this.asHSB();return this.asHSB().b>0.5;},isDark:function(){return!this.isBright();},asRGB:function(){return"rgb("+this.rgb.r+","+this.rgb.g+","+this.rgb.b+")";},asHex:function(){return"#"+this.rgb.r.toColorPart()+this.rgb.g.toColorPart()+this.rgb.b.toColorPart();},asHSB:function(){return OpenLayers.Rico.Color.RGBtoHSB(this.rgb.r,this.rgb.g,this.rgb.b);},toString:function(){return this.asHex();}});OpenLayers.Rico.Color.createFromHex=function(hexCode){if(hexCode.length==4){var shortHexCode=hexCode;var hexCode='#';for(var i=1;i<4;i++){hexCode+=(shortHexCode.charAt(i)+
59533 shortHexCode.charAt(i));}}
59534 if(hexCode.indexOf('#')==0){hexCode=hexCode.substring(1);}
59535 var red=hexCode.substring(0,2);var green=hexCode.substring(2,4);var blue=hexCode.substring(4,6);return new OpenLayers.Rico.Color(parseInt(red,16),parseInt(green,16),parseInt(blue,16));};OpenLayers.Rico.Color.createColorFromBackground=function(elem){var actualColor=RicoUtil.getElementsComputedStyle(OpenLayers.Util.getElement(elem),"backgroundColor","background-color");if(actualColor=="transparent"&&elem.parentNode){return OpenLayers.Rico.Color.createColorFromBackground(elem.parentNode);}
59536 if(actualColor==null){return new OpenLayers.Rico.Color(255,255,255);}
59537 if(actualColor.indexOf("rgb(")==0){var colors=actualColor.substring(4,actualColor.length-1);var colorArray=colors.split(",");return new OpenLayers.Rico.Color(parseInt(colorArray[0]),parseInt(colorArray[1]),parseInt(colorArray[2]));}
59538 else if(actualColor.indexOf("#")==0){return OpenLayers.Rico.Color.createFromHex(actualColor);}
59539 else{return new OpenLayers.Rico.Color(255,255,255);}};OpenLayers.Rico.Color.HSBtoRGB=function(hue,saturation,brightness){var red=0;var green=0;var blue=0;if(saturation==0){red=parseInt(brightness*255.0+0.5);green=red;blue=red;}
59540 else{var h=(hue-Math.floor(hue))*6.0;var f=h-Math.floor(h);var p=brightness*(1.0-saturation);var q=brightness*(1.0-saturation*f);var t=brightness*(1.0-(saturation*(1.0-f)));switch(parseInt(h)){case 0:red=(brightness*255.0+0.5);green=(t*255.0+0.5);blue=(p*255.0+0.5);break;case 1:red=(q*255.0+0.5);green=(brightness*255.0+0.5);blue=(p*255.0+0.5);break;case 2:red=(p*255.0+0.5);green=(brightness*255.0+0.5);blue=(t*255.0+0.5);break;case 3:red=(p*255.0+0.5);green=(q*255.0+0.5);blue=(brightness*255.0+0.5);break;case 4:red=(t*255.0+0.5);green=(p*255.0+0.5);blue=(brightness*255.0+0.5);break;case 5:red=(brightness*255.0+0.5);green=(p*255.0+0.5);blue=(q*255.0+0.5);break;}}
59541 return{r:parseInt(red),g:parseInt(green),b:parseInt(blue)};};OpenLayers.Rico.Color.RGBtoHSB=function(r,g,b){var hue;var saturation;var brightness;var cmax=(r>g)?r:g;if(b>cmax){cmax=b;}
59542 var cmin=(r<g)?r:g;if(b<cmin){cmin=b;}
59543 brightness=cmax/255.0;if(cmax!=0){saturation=(cmax-cmin)/cmax;}else{saturation=0;}
59544 if(saturation==0){hue=0;}else{var redc=(cmax-r)/(cmax-cmin);var greenc=(cmax-g)/(cmax-cmin);var bluec=(cmax-b)/(cmax-cmin);if(r==cmax){hue=bluec-greenc;}else if(g==cmax){hue=2.0+redc-bluec;}else{hue=4.0+greenc-redc;}
59545 hue=hue/6.0;if(hue<0){hue=hue+1.0;}}
59546 return{h:hue,s:saturation,b:brightness};};OpenLayers.Bounds=OpenLayers.Class({left:null,bottom:null,right:null,top:null,centerLonLat:null,initialize:function(left,bottom,right,top){if(left!=null){this.left=OpenLayers.Util.toFloat(left);}
59547 if(bottom!=null){this.bottom=OpenLayers.Util.toFloat(bottom);}
59548 if(right!=null){this.right=OpenLayers.Util.toFloat(right);}
59549 if(top!=null){this.top=OpenLayers.Util.toFloat(top);}},clone:function(){return new OpenLayers.Bounds(this.left,this.bottom,this.right,this.top);},equals:function(bounds){var equals=false;if(bounds!=null){equals=((this.left==bounds.left)&&(this.right==bounds.right)&&(this.top==bounds.top)&&(this.bottom==bounds.bottom));}
59550 return equals;},toString:function(){return("left-bottom=("+this.left+","+this.bottom+")"
59551 +" right-top=("+this.right+","+this.top+")");},toArray:function(reverseAxisOrder){if(reverseAxisOrder===true){return[this.bottom,this.left,this.top,this.right];}else{return[this.left,this.bottom,this.right,this.top];}},toBBOX:function(decimal,reverseAxisOrder){if(decimal==null){decimal=6;}
59552 var mult=Math.pow(10,decimal);var xmin=Math.round(this.left*mult)/mult;var ymin=Math.round(this.bottom*mult)/mult;var xmax=Math.round(this.right*mult)/mult;var ymax=Math.round(this.top*mult)/mult;if(reverseAxisOrder===true){return ymin+","+xmin+","+ymax+","+xmax;}else{return xmin+","+ymin+","+xmax+","+ymax;}},toGeometry:function(){return new OpenLayers.Geometry.Polygon([new OpenLayers.Geometry.LinearRing([new OpenLayers.Geometry.Point(this.left,this.bottom),new OpenLayers.Geometry.Point(this.right,this.bottom),new OpenLayers.Geometry.Point(this.right,this.top),new OpenLayers.Geometry.Point(this.left,this.top)])]);},getWidth:function(){return(this.right-this.left);},getHeight:function(){return(this.top-this.bottom);},getSize:function(){return new OpenLayers.Size(this.getWidth(),this.getHeight());},getCenterPixel:function(){return new OpenLayers.Pixel((this.left+this.right)/2,(this.bottom+this.top)/2);},getCenterLonLat:function(){if(!this.centerLonLat){this.centerLonLat=new OpenLayers.LonLat((this.left+this.right)/2,(this.bottom+this.top)/2);}
59553 return this.centerLonLat;},scale:function(ratio,origin){if(origin==null){origin=this.getCenterLonLat();}
59554 var origx,origy;if(origin.CLASS_NAME=="OpenLayers.LonLat"){origx=origin.lon;origy=origin.lat;}else{origx=origin.x;origy=origin.y;}
59555 var left=(this.left-origx)*ratio+origx;var bottom=(this.bottom-origy)*ratio+origy;var right=(this.right-origx)*ratio+origx;var top=(this.top-origy)*ratio+origy;return new OpenLayers.Bounds(left,bottom,right,top);},add:function(x,y){if((x==null)||(y==null)){var msg=OpenLayers.i18n("boundsAddError");OpenLayers.Console.error(msg);return null;}
59556 return new OpenLayers.Bounds(this.left+x,this.bottom+y,this.right+x,this.top+y);},extend:function(object){var bounds=null;if(object){switch(object.CLASS_NAME){case"OpenLayers.LonLat":bounds=new OpenLayers.Bounds(object.lon,object.lat,object.lon,object.lat);break;case"OpenLayers.Geometry.Point":bounds=new OpenLayers.Bounds(object.x,object.y,object.x,object.y);break;case"OpenLayers.Bounds":bounds=object;break;}
59557 if(bounds){this.centerLonLat=null;if((this.left==null)||(bounds.left<this.left)){this.left=bounds.left;}
59558 if((this.bottom==null)||(bounds.bottom<this.bottom)){this.bottom=bounds.bottom;}
59559 if((this.right==null)||(bounds.right>this.right)){this.right=bounds.right;}
59560 if((this.top==null)||(bounds.top>this.top)){this.top=bounds.top;}}}},containsLonLat:function(ll,inclusive){return this.contains(ll.lon,ll.lat,inclusive);},containsPixel:function(px,inclusive){return this.contains(px.x,px.y,inclusive);},contains:function(x,y,inclusive){if(inclusive==null){inclusive=true;}
59561 if(x==null||y==null){return false;}
59562 x=OpenLayers.Util.toFloat(x);y=OpenLayers.Util.toFloat(y);var contains=false;if(inclusive){contains=((x>=this.left)&&(x<=this.right)&&(y>=this.bottom)&&(y<=this.top));}else{contains=((x>this.left)&&(x<this.right)&&(y>this.bottom)&&(y<this.top));}
59563 return contains;},intersectsBounds:function(bounds,inclusive){if(inclusive==null){inclusive=true;}
59564 var intersects=false;var mightTouch=(this.left==bounds.right||this.right==bounds.left||this.top==bounds.bottom||this.bottom==bounds.top);if(inclusive||!mightTouch){var inBottom=(((bounds.bottom>=this.bottom)&&(bounds.bottom<=this.top))||((this.bottom>=bounds.bottom)&&(this.bottom<=bounds.top)));var inTop=(((bounds.top>=this.bottom)&&(bounds.top<=this.top))||((this.top>bounds.bottom)&&(this.top<bounds.top)));var inLeft=(((bounds.left>=this.left)&&(bounds.left<=this.right))||((this.left>=bounds.left)&&(this.left<=bounds.right)));var inRight=(((bounds.right>=this.left)&&(bounds.right<=this.right))||((this.right>=bounds.left)&&(this.right<=bounds.right)));intersects=((inBottom||inTop)&&(inLeft||inRight));}
59565 return intersects;},containsBounds:function(bounds,partial,inclusive){if(partial==null){partial=false;}
59566 if(inclusive==null){inclusive=true;}
59567 var bottomLeft=this.contains(bounds.left,bounds.bottom,inclusive);var bottomRight=this.contains(bounds.right,bounds.bottom,inclusive);var topLeft=this.contains(bounds.left,bounds.top,inclusive);var topRight=this.contains(bounds.right,bounds.top,inclusive);return(partial)?(bottomLeft||bottomRight||topLeft||topRight):(bottomLeft&&bottomRight&&topLeft&&topRight);},determineQuadrant:function(lonlat){var quadrant="";var center=this.getCenterLonLat();quadrant+=(lonlat.lat<center.lat)?"b":"t";quadrant+=(lonlat.lon<center.lon)?"l":"r";return quadrant;},transform:function(source,dest){this.centerLonLat=null;var ll=OpenLayers.Projection.transform({'x':this.left,'y':this.bottom},source,dest);var lr=OpenLayers.Projection.transform({'x':this.right,'y':this.bottom},source,dest);var ul=OpenLayers.Projection.transform({'x':this.left,'y':this.top},source,dest);var ur=OpenLayers.Projection.transform({'x':this.right,'y':this.top},source,dest);this.left=Math.min(ll.x,ul.x);this.bottom=Math.min(ll.y,lr.y);this.right=Math.max(lr.x,ur.x);this.top=Math.max(ul.y,ur.y);return this;},wrapDateLine:function(maxExtent,options){options=options||{};var leftTolerance=options.leftTolerance||0;var rightTolerance=options.rightTolerance||0;var newBounds=this.clone();if(maxExtent){while(newBounds.left<maxExtent.left&&(newBounds.right-rightTolerance)<=maxExtent.left){newBounds=newBounds.add(maxExtent.getWidth(),0);}
59568 while((newBounds.left+leftTolerance)>=maxExtent.right&&newBounds.right>maxExtent.right){newBounds=newBounds.add(-maxExtent.getWidth(),0);}}
59569 return newBounds;},CLASS_NAME:"OpenLayers.Bounds"});OpenLayers.Bounds.fromString=function(str){var bounds=str.split(",");return OpenLayers.Bounds.fromArray(bounds);};OpenLayers.Bounds.fromArray=function(bbox){return new OpenLayers.Bounds(parseFloat(bbox[0]),parseFloat(bbox[1]),parseFloat(bbox[2]),parseFloat(bbox[3]));};OpenLayers.Bounds.fromSize=function(size){return new OpenLayers.Bounds(0,size.h,size.w,0);};OpenLayers.Bounds.oppositeQuadrant=function(quadrant){var opp="";opp+=(quadrant.charAt(0)=='t')?'b':'t';opp+=(quadrant.charAt(1)=='l')?'r':'l';return opp;};OpenLayers.LonLat=OpenLayers.Class({lon:0.0,lat:0.0,initialize:function(lon,lat){this.lon=OpenLayers.Util.toFloat(lon);this.lat=OpenLayers.Util.toFloat(lat);},toString:function(){return("lon="+this.lon+",lat="+this.lat);},toShortString:function(){return(this.lon+", "+this.lat);},clone:function(){return new OpenLayers.LonLat(this.lon,this.lat);},add:function(lon,lat){if((lon==null)||(lat==null)){var msg=OpenLayers.i18n("lonlatAddError");OpenLayers.Console.error(msg);return null;}
59570 return new OpenLayers.LonLat(this.lon+OpenLayers.Util.toFloat(lon),this.lat+OpenLayers.Util.toFloat(lat));},equals:function(ll){var equals=false;if(ll!=null){equals=((this.lon==ll.lon&&this.lat==ll.lat)||(isNaN(this.lon)&&isNaN(this.lat)&&isNaN(ll.lon)&&isNaN(ll.lat)));}
59571 return equals;},transform:function(source,dest){var point=OpenLayers.Projection.transform({'x':this.lon,'y':this.lat},source,dest);this.lon=point.x;this.lat=point.y;return this;},wrapDateLine:function(maxExtent){var newLonLat=this.clone();if(maxExtent){while(newLonLat.lon<maxExtent.left){newLonLat.lon+=maxExtent.getWidth();}
59572 while(newLonLat.lon>maxExtent.right){newLonLat.lon-=maxExtent.getWidth();}}
59573 return newLonLat;},CLASS_NAME:"OpenLayers.LonLat"});OpenLayers.LonLat.fromString=function(str){var pair=str.split(",");return new OpenLayers.LonLat(pair[0],pair[1]);};OpenLayers.Pixel=OpenLayers.Class({x:0.0,y:0.0,initialize:function(x,y){this.x=parseFloat(x);this.y=parseFloat(y);},toString:function(){return("x="+this.x+",y="+this.y);},clone:function(){return new OpenLayers.Pixel(this.x,this.y);},equals:function(px){var equals=false;if(px!=null){equals=((this.x==px.x&&this.y==px.y)||(isNaN(this.x)&&isNaN(this.y)&&isNaN(px.x)&&isNaN(px.y)));}
59574 return equals;},add:function(x,y){if((x==null)||(y==null)){var msg=OpenLayers.i18n("pixelAddError");OpenLayers.Console.error(msg);return null;}
59575 return new OpenLayers.Pixel(this.x+x,this.y+y);},offset:function(px){var newPx=this.clone();if(px){newPx=this.add(px.x,px.y);}
59576 return newPx;},CLASS_NAME:"OpenLayers.Pixel"});OpenLayers.Control=OpenLayers.Class({id:null,map:null,div:null,type:null,allowSelection:false,displayClass:"",title:"",autoActivate:false,active:null,handler:null,eventListeners:null,events:null,EVENT_TYPES:["activate","deactivate"],initialize:function(options){this.displayClass=this.CLASS_NAME.replace("OpenLayers.","ol").replace(/\./g,"");OpenLayers.Util.extend(this,options);this.events=new OpenLayers.Events(this,null,this.EVENT_TYPES);if(this.eventListeners instanceof Object){this.events.on(this.eventListeners);}
59577 if(this.id==null){this.id=OpenLayers.Util.createUniqueID(this.CLASS_NAME+"_");}},destroy:function(){if(this.events){if(this.eventListeners){this.events.un(this.eventListeners);}
59578 this.events.destroy();this.events=null;}
59579 this.eventListeners=null;if(this.handler){this.handler.destroy();this.handler=null;}
59580 if(this.handlers){for(var key in this.handlers){if(this.handlers.hasOwnProperty(key)&&typeof this.handlers[key].destroy=="function"){this.handlers[key].destroy();}}
59581 this.handlers=null;}
59582 if(this.map){this.map.removeControl(this);this.map=null;}},setMap:function(map){this.map=map;if(this.handler){this.handler.setMap(map);}},draw:function(px){if(this.div==null){this.div=OpenLayers.Util.createDiv(this.id);this.div.className=this.displayClass;if(!this.allowSelection){this.div.className+=" olControlNoSelect";this.div.setAttribute("unselectable","on",0);this.div.onselectstart=OpenLayers.Function.False;}
59583 if(this.title!=""){this.div.title=this.title;}}
59584 if(px!=null){this.position=px.clone();}
59585 this.moveTo(this.position);return this.div;},moveTo:function(px){if((px!=null)&&(this.div!=null)){this.div.style.left=px.x+"px";this.div.style.top=px.y+"px";}},activate:function(){if(this.active){return false;}
59586 if(this.handler){this.handler.activate();}
59587 this.active=true;if(this.map){OpenLayers.Element.addClass(this.map.viewPortDiv,this.displayClass.replace(/ /g,"")+"Active");}
59588 this.events.triggerEvent("activate");return true;},deactivate:function(){if(this.active){if(this.handler){this.handler.deactivate();}
59589 this.active=false;if(this.map){OpenLayers.Element.removeClass(this.map.viewPortDiv,this.displayClass.replace(/ /g,"")+"Active");}
59590 this.events.triggerEvent("deactivate");return true;}
59591 return false;},CLASS_NAME:"OpenLayers.Control"});OpenLayers.Control.TYPE_BUTTON=1;OpenLayers.Control.TYPE_TOGGLE=2;OpenLayers.Control.TYPE_TOOL=3;OpenLayers.Lang={code:null,defaultCode:"en",getCode:function(){if(!OpenLayers.Lang.code){OpenLayers.Lang.setCode();}
59592 return OpenLayers.Lang.code;},setCode:function(code){var lang;if(!code){code=(OpenLayers.Util.getBrowserName()=="msie")?navigator.userLanguage:navigator.language;}
59593 var parts=code.split('-');parts[0]=parts[0].toLowerCase();if(typeof OpenLayers.Lang[parts[0]]=="object"){lang=parts[0];}
59594 if(parts[1]){var testLang=parts[0]+'-'+parts[1].toUpperCase();if(typeof OpenLayers.Lang[testLang]=="object"){lang=testLang;}}
59595 if(!lang){OpenLayers.Console.warn('Failed to find OpenLayers.Lang.'+parts.join("-")+' dictionary, falling back to default language');lang=OpenLayers.Lang.defaultCode;}
59596 OpenLayers.Lang.code=lang;},translate:function(key,context){var dictionary=OpenLayers.Lang[OpenLayers.Lang.getCode()];var message=dictionary[key];if(!message){message=key;}
59597 if(context){message=OpenLayers.String.format(message,context);}
59598 return message;}};OpenLayers.i18n=OpenLayers.Lang.translate;OpenLayers.Popup.Anchored=OpenLayers.Class(OpenLayers.Popup,{relativePosition:null,keepInMap:true,anchor:null,initialize:function(id,lonlat,contentSize,contentHTML,anchor,closeBox,closeBoxCallback){var newArguments=[id,lonlat,contentSize,contentHTML,closeBox,closeBoxCallback];OpenLayers.Popup.prototype.initialize.apply(this,newArguments);this.anchor=(anchor!=null)?anchor:{size:new OpenLayers.Size(0,0),offset:new OpenLayers.Pixel(0,0)};},destroy:function(){this.anchor=null;this.relativePosition=null;OpenLayers.Popup.prototype.destroy.apply(this,arguments);},show:function(){this.updatePosition();OpenLayers.Popup.prototype.show.apply(this,arguments);},moveTo:function(px){var oldRelativePosition=this.relativePosition;this.relativePosition=this.calculateRelativePosition(px);var newPx=this.calculateNewPx(px);var newArguments=new Array(newPx);OpenLayers.Popup.prototype.moveTo.apply(this,newArguments);if(this.relativePosition!=oldRelativePosition){this.updateRelativePosition();}},setSize:function(contentSize){OpenLayers.Popup.prototype.setSize.apply(this,arguments);if((this.lonlat)&&(this.map)){var px=this.map.getLayerPxFromLonLat(this.lonlat);this.moveTo(px);}},calculateRelativePosition:function(px){var lonlat=this.map.getLonLatFromLayerPx(px);var extent=this.map.getExtent();var quadrant=extent.determineQuadrant(lonlat);return OpenLayers.Bounds.oppositeQuadrant(quadrant);},updateRelativePosition:function(){},calculateNewPx:function(px){var newPx=px.offset(this.anchor.offset);var size=this.size||this.contentSize;var top=(this.relativePosition.charAt(0)=='t');newPx.y+=(top)?-(size.h+this.anchor.size.h):this.anchor.size.h;var left=(this.relativePosition.charAt(1)=='l');newPx.x+=(left)?-(size.w+this.anchor.size.w):this.anchor.size.w;return newPx;},CLASS_NAME:"OpenLayers.Popup.Anchored"});OpenLayers.Protocol.SOS=function(options){options=OpenLayers.Util.applyDefaults(options,OpenLayers.Protocol.SOS.DEFAULTS);var cls=OpenLayers.Protocol.SOS["v"+options.version.replace(/\./g,"_")];if(!cls){throw"Unsupported SOS version: "+options.version;}
59599 return new cls(options);};OpenLayers.Protocol.SOS.DEFAULTS={"version":"1.0.0"};OpenLayers.Protocol.SQL=OpenLayers.Class(OpenLayers.Protocol,{databaseName:'ol',tableName:"ol_vector_features",postReadFiltering:true,initialize:function(options){OpenLayers.Protocol.prototype.initialize.apply(this,[options]);},destroy:function(){OpenLayers.Protocol.prototype.destroy.apply(this);},supported:function(){return false;},evaluateFilter:function(feature,filter){return filter&&this.postReadFiltering?filter.evaluate(feature):true;},CLASS_NAME:"OpenLayers.Protocol.SQL"});OpenLayers.Protocol.WFS=function(options){options=OpenLayers.Util.applyDefaults(options,OpenLayers.Protocol.WFS.DEFAULTS);var cls=OpenLayers.Protocol.WFS["v"+options.version.replace(/\./g,"_")];if(!cls){throw"Unsupported WFS version: "+options.version;}
59600 return new cls(options);};OpenLayers.Protocol.WFS.fromWMSLayer=function(layer,options){var typeName,featurePrefix;var param=layer.params["LAYERS"];var parts=(param instanceof Array?param[0]:param).split(":");if(parts.length>1){featurePrefix=parts[0];}
59601 typeName=parts.pop();var protocolOptions={url:layer.url,featureType:typeName,featurePrefix:featurePrefix,srsName:layer.projection&&layer.projection.getCode()||layer.map&&layer.map.getProjectionObject().getCode(),version:"1.1.0"};return new OpenLayers.Protocol.WFS(OpenLayers.Util.applyDefaults(options,protocolOptions));};OpenLayers.Protocol.WFS.DEFAULTS={"version":"1.0.0"};OpenLayers.Renderer.Canvas=OpenLayers.Class(OpenLayers.Renderer,{canvas:null,features:null,initialize:function(containerID){OpenLayers.Renderer.prototype.initialize.apply(this,arguments);this.root=document.createElement("canvas");this.container.appendChild(this.root);this.canvas=this.root.getContext("2d");this.features={};},eraseGeometry:function(geometry,featureId){this.eraseFeatures(this.features[featureId][0]);},supported:function(){var canvas=document.createElement("canvas");return!!canvas.getContext;},setExtent:function(extent){this.extent=extent.clone();this.resolution=null;this.redraw();},setSize:function(size){this.size=size.clone();this.root.style.width=size.w+"px";this.root.style.height=size.h+"px";this.root.width=size.w;this.root.height=size.h;this.resolution=null;},drawFeature:function(feature,style){style=style||feature.style;style=this.applyDefaultSymbolizer(style);this.features[feature.id]=[feature,style];this.redraw();},drawGeometry:function(geometry,style){var className=geometry.CLASS_NAME;if((className=="OpenLayers.Geometry.Collection")||(className=="OpenLayers.Geometry.MultiPoint")||(className=="OpenLayers.Geometry.MultiLineString")||(className=="OpenLayers.Geometry.MultiPolygon")){for(var i=0;i<geometry.components.length;i++){this.drawGeometry(geometry.components[i],style);}
59602 return;}
59603 switch(geometry.CLASS_NAME){case"OpenLayers.Geometry.Point":this.drawPoint(geometry,style);break;case"OpenLayers.Geometry.LineString":this.drawLineString(geometry,style);break;case"OpenLayers.Geometry.LinearRing":this.drawLinearRing(geometry,style);break;case"OpenLayers.Geometry.Polygon":this.drawPolygon(geometry,style);break;default:break;}},drawExternalGraphic:function(pt,style){var img=new Image();if(style.graphicTitle){img.title=style.graphicTitle;}
59604 var width=style.graphicWidth||style.graphicHeight;var height=style.graphicHeight||style.graphicWidth;width=width?width:style.pointRadius*2;height=height?height:style.pointRadius*2;var xOffset=(style.graphicXOffset!=undefined)?style.graphicXOffset:-(0.5*width);var yOffset=(style.graphicYOffset!=undefined)?style.graphicYOffset:-(0.5*height);var context={img:img,x:(pt[0]+xOffset),y:(pt[1]+yOffset),width:width,height:height,opacity:style.graphicOpacity||style.fillOpacity,canvas:this.canvas};img.onload=OpenLayers.Function.bind(function(){this.canvas.globalAlpha=this.opacity;this.canvas.drawImage(this.img,this.x,this.y,this.width,this.height);},context);img.src=style.externalGraphic;},setCanvasStyle:function(type,style){if(type=="fill"){this.canvas.globalAlpha=style['fillOpacity'];this.canvas.fillStyle=style['fillColor'];}else if(type=="stroke"){this.canvas.globalAlpha=style['strokeOpacity'];this.canvas.strokeStyle=style['strokeColor'];this.canvas.lineWidth=style['strokeWidth'];}else{this.canvas.globalAlpha=0;this.canvas.lineWidth=1;}},drawPoint:function(geometry,style){if(style.graphic!==false){var pt=this.getLocalXY(geometry);if(style.externalGraphic){this.drawExternalGraphic(pt,style);}else{if(style.fill!==false){this.setCanvasStyle("fill",style);this.canvas.beginPath();this.canvas.arc(pt[0],pt[1],style.pointRadius,0,Math.PI*2,true);this.canvas.fill();}
59605 if(style.stroke!==false){this.setCanvasStyle("stroke",style);this.canvas.beginPath();this.canvas.arc(pt[0],pt[1],style.pointRadius,0,Math.PI*2,true);this.canvas.stroke();this.setCanvasStyle("reset");}}}},drawLineString:function(geometry,style){if(style.stroke!==false){this.setCanvasStyle("stroke",style);this.canvas.beginPath();var start=this.getLocalXY(geometry.components[0]);this.canvas.moveTo(start[0],start[1]);for(var i=1;i<geometry.components.length;i++){var pt=this.getLocalXY(geometry.components[i]);this.canvas.lineTo(pt[0],pt[1]);}
59606 this.canvas.stroke();}
59607 this.setCanvasStyle("reset");},drawLinearRing:function(geometry,style){if(style.fill!==false){this.setCanvasStyle("fill",style);this.canvas.beginPath();var start=this.getLocalXY(geometry.components[0]);this.canvas.moveTo(start[0],start[1]);for(var i=1;i<geometry.components.length-1;i++){var pt=this.getLocalXY(geometry.components[i]);this.canvas.lineTo(pt[0],pt[1]);}
59608 this.canvas.fill();}
59609 if(style.stroke!==false){this.setCanvasStyle("stroke",style);this.canvas.beginPath();var start=this.getLocalXY(geometry.components[0]);this.canvas.moveTo(start[0],start[1]);for(var i=1;i<geometry.components.length;i++){var pt=this.getLocalXY(geometry.components[i]);this.canvas.lineTo(pt[0],pt[1]);}
59610 this.canvas.stroke();}
59611 this.setCanvasStyle("reset");},drawPolygon:function(geometry,style){this.drawLinearRing(geometry.components[0],style);for(var i=1;i<geometry.components.length;i++){this.drawLinearRing(geometry.components[i],{fillOpacity:0,strokeWidth:0,strokeOpacity:0,strokeColor:'#000000',fillColor:'#000000'});}},drawText:function(location,style){style=OpenLayers.Util.extend({fontColor:"#000000",labelAlign:"cm"},style);var pt=this.getLocalXY(location);this.setCanvasStyle("reset");this.canvas.fillStyle=style.fontColor;this.canvas.globalAlpha=style.fontOpacity||1.0;var fontStyle=style.fontWeight+" "+style.fontSize+" "+style.fontFamily;if(this.canvas.fillText){var labelAlign=OpenLayers.Renderer.Canvas.LABEL_ALIGN[style.labelAlign[0]]||"center";this.canvas.font=fontStyle;this.canvas.textAlign=labelAlign;this.canvas.fillText(style.label,pt[0],pt[1]);}else if(this.canvas.mozDrawText){this.canvas.mozTextStyle=fontStyle;var len=this.canvas.mozMeasureText(style.label);switch(style.labelAlign[0]){case"l":break;case"r":pt[0]-=len;break;case"c":default:pt[0]-=len/2;}
59612 this.canvas.translate(pt[0],pt[1]);this.canvas.mozDrawText(style.label);this.canvas.translate(-1*pt[0],-1*pt[1]);}
59613 this.setCanvasStyle("reset");},getLocalXY:function(point){var resolution=this.getResolution();var extent=this.extent;var x=(point.x/resolution+(-extent.left/resolution));var y=((extent.top/resolution)-point.y/resolution);return[x,y];},clear:function(){this.canvas.clearRect(0,0,this.root.width,this.root.height);this.features={};},getFeatureIdFromEvent:function(evt){var loc=this.map.getLonLatFromPixel(evt.xy);var resolution=this.getResolution();var bounds=new OpenLayers.Bounds(loc.lon-resolution*5,loc.lat-resolution*5,loc.lon+resolution*5,loc.lat+resolution*5);var geom=bounds.toGeometry();for(var feat in this.features){if(!this.features.hasOwnProperty(feat)){continue;}
59614 if(this.features[feat][0].geometry.intersects(geom)){return feat;}}
59615 return null;},eraseFeatures:function(features){if(!(features instanceof Array)){features=[features];}
59616 for(var i=0;i<features.length;++i){delete this.features[features[i].id];}
59617 this.redraw();},redraw:function(){if(!this.locked){this.canvas.clearRect(0,0,this.root.width,this.root.height);var labelMap=[];var feature,style;for(var id in this.features){if(!this.features.hasOwnProperty(id)){continue;}
59618 feature=this.features[id][0];style=this.features[id][1];if(!feature.geometry){continue;}
59619 this.drawGeometry(feature.geometry,style);if(style.label){labelMap.push([feature,style]);}}
59620 var item;for(var i=0,len=labelMap.length;i<len;++i){item=labelMap[i];this.drawText(item[0].geometry.getCentroid(),item[1]);}}},CLASS_NAME:"OpenLayers.Renderer.Canvas"});OpenLayers.Renderer.Canvas.LABEL_ALIGN={"l":"left","r":"right"};OpenLayers.ElementsIndexer=OpenLayers.Class({maxZIndex:null,order:null,indices:null,compare:null,initialize:function(yOrdering){this.compare=yOrdering?OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER_Y_ORDER:OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER_DRAWING_ORDER;this.order=[];this.indices={};this.maxZIndex=0;},insert:function(newNode){if(this.exists(newNode)){this.remove(newNode);}
59621 var nodeId=newNode.id;this.determineZIndex(newNode);var leftIndex=-1;var rightIndex=this.order.length;var middle;while(rightIndex-leftIndex>1){middle=parseInt((leftIndex+rightIndex)/2);var placement=this.compare(this,newNode,OpenLayers.Util.getElement(this.order[middle]));if(placement>0){leftIndex=middle;}else{rightIndex=middle;}}
59622 this.order.splice(rightIndex,0,nodeId);this.indices[nodeId]=this.getZIndex(newNode);return this.getNextElement(rightIndex);},remove:function(node){var nodeId=node.id;var arrayIndex=OpenLayers.Util.indexOf(this.order,nodeId);if(arrayIndex>=0){this.order.splice(arrayIndex,1);delete this.indices[nodeId];if(this.order.length>0){var lastId=this.order[this.order.length-1];this.maxZIndex=this.indices[lastId];}else{this.maxZIndex=0;}}},clear:function(){this.order=[];this.indices={};this.maxZIndex=0;},exists:function(node){return(this.indices[node.id]!=null);},getZIndex:function(node){return node._style.graphicZIndex;},determineZIndex:function(node){var zIndex=node._style.graphicZIndex;if(zIndex==null){zIndex=this.maxZIndex;node._style.graphicZIndex=zIndex;}else if(zIndex>this.maxZIndex){this.maxZIndex=zIndex;}},getNextElement:function(index){var nextIndex=index+1;if(nextIndex<this.order.length){var nextElement=OpenLayers.Util.getElement(this.order[nextIndex]);if(nextElement==undefined){nextElement=this.getNextElement(nextIndex);}
59623 return nextElement;}else{return null;}},CLASS_NAME:"OpenLayers.ElementsIndexer"});OpenLayers.ElementsIndexer.IndexingMethods={Z_ORDER:function(indexer,newNode,nextNode){var newZIndex=indexer.getZIndex(newNode);var returnVal=0;if(nextNode){var nextZIndex=indexer.getZIndex(nextNode);returnVal=newZIndex-nextZIndex;}
59624 return returnVal;},Z_ORDER_DRAWING_ORDER:function(indexer,newNode,nextNode){var returnVal=OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER(indexer,newNode,nextNode);if(nextNode&&returnVal==0){returnVal=1;}
59625 return returnVal;},Z_ORDER_Y_ORDER:function(indexer,newNode,nextNode){var returnVal=OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER(indexer,newNode,nextNode);if(nextNode&&returnVal===0){var result=nextNode._boundsBottom-newNode._boundsBottom;returnVal=(result===0)?1:result;}
59626 return returnVal;}};OpenLayers.Renderer.Elements=OpenLayers.Class(OpenLayers.Renderer,{rendererRoot:null,root:null,vectorRoot:null,textRoot:null,xmlns:null,indexer:null,BACKGROUND_ID_SUFFIX:"_background",LABEL_ID_SUFFIX:"_label",initialize:function(containerID,options){OpenLayers.Renderer.prototype.initialize.apply(this,arguments);this.rendererRoot=this.createRenderRoot();this.root=this.createRoot("_root");this.vectorRoot=this.createRoot("_vroot");this.textRoot=this.createRoot("_troot");this.root.appendChild(this.vectorRoot);this.root.appendChild(this.textRoot);this.rendererRoot.appendChild(this.root);this.container.appendChild(this.rendererRoot);if(options&&(options.zIndexing||options.yOrdering)){this.indexer=new OpenLayers.ElementsIndexer(options.yOrdering);}},destroy:function(){this.clear();this.rendererRoot=null;this.root=null;this.xmlns=null;OpenLayers.Renderer.prototype.destroy.apply(this,arguments);},clear:function(){var child;var root=this.vectorRoot;if(root){while(child=root.firstChild){root.removeChild(child);}}
59627 root=this.textRoot;if(root){while(child=root.firstChild){root.removeChild(child);}}
59628 if(this.indexer){this.indexer.clear();}},getNodeType:function(geometry,style){},drawGeometry:function(geometry,style,featureId){var className=geometry.CLASS_NAME;var rendered=true;if((className=="OpenLayers.Geometry.Collection")||(className=="OpenLayers.Geometry.MultiPoint")||(className=="OpenLayers.Geometry.MultiLineString")||(className=="OpenLayers.Geometry.MultiPolygon")){for(var i=0,len=geometry.components.length;i<len;i++){rendered=this.drawGeometry(geometry.components[i],style,featureId)&&rendered;}
59629 return rendered;};rendered=false;if(style.display!="none"){if(style.backgroundGraphic){this.redrawBackgroundNode(geometry.id,geometry,style,featureId);}
59630 rendered=this.redrawNode(geometry.id,geometry,style,featureId);}
59631 if(rendered==false){var node=document.getElementById(geometry.id);if(node){if(node._style.backgroundGraphic){node.parentNode.removeChild(document.getElementById(geometry.id+this.BACKGROUND_ID_SUFFIX));}
59632 node.parentNode.removeChild(node);}}
59633 return rendered;},redrawNode:function(id,geometry,style,featureId){style=this.applyDefaultSymbolizer(style);var node=this.nodeFactory(id,this.getNodeType(geometry,style));node._featureId=featureId;node._boundsBottom=geometry.getBounds().bottom;node._geometryClass=geometry.CLASS_NAME;node._style=style;var drawResult=this.drawGeometryNode(node,geometry,style);if(drawResult===false){return false;}
59634 node=drawResult.node;if(this.indexer){var insert=this.indexer.insert(node);if(insert){this.vectorRoot.insertBefore(node,insert);}else{this.vectorRoot.appendChild(node);}}else{if(node.parentNode!==this.vectorRoot){this.vectorRoot.appendChild(node);}}
59635 this.postDraw(node);return drawResult.complete;},redrawBackgroundNode:function(id,geometry,style,featureId){var backgroundStyle=OpenLayers.Util.extend({},style);backgroundStyle.externalGraphic=backgroundStyle.backgroundGraphic;backgroundStyle.graphicXOffset=backgroundStyle.backgroundXOffset;backgroundStyle.graphicYOffset=backgroundStyle.backgroundYOffset;backgroundStyle.graphicZIndex=backgroundStyle.backgroundGraphicZIndex;backgroundStyle.graphicWidth=backgroundStyle.backgroundWidth||backgroundStyle.graphicWidth;backgroundStyle.graphicHeight=backgroundStyle.backgroundHeight||backgroundStyle.graphicHeight;backgroundStyle.backgroundGraphic=null;backgroundStyle.backgroundXOffset=null;backgroundStyle.backgroundYOffset=null;backgroundStyle.backgroundGraphicZIndex=null;return this.redrawNode(id+this.BACKGROUND_ID_SUFFIX,geometry,backgroundStyle,null);},drawGeometryNode:function(node,geometry,style){style=style||node._style;var options={'isFilled':style.fill===undefined?true:style.fill,'isStroked':style.stroke===undefined?!!style.strokeWidth:style.stroke};var drawn;switch(geometry.CLASS_NAME){case"OpenLayers.Geometry.Point":if(style.graphic===false){options.isFilled=false;options.isStroked=false;}
59636 drawn=this.drawPoint(node,geometry);break;case"OpenLayers.Geometry.LineString":options.isFilled=false;drawn=this.drawLineString(node,geometry);break;case"OpenLayers.Geometry.LinearRing":drawn=this.drawLinearRing(node,geometry);break;case"OpenLayers.Geometry.Polygon":drawn=this.drawPolygon(node,geometry);break;case"OpenLayers.Geometry.Surface":drawn=this.drawSurface(node,geometry);break;case"OpenLayers.Geometry.Rectangle":drawn=this.drawRectangle(node,geometry);break;default:break;}
59637 node._options=options;if(drawn!=false){return{node:this.setStyle(node,style,options,geometry),complete:drawn};}else{return false;}},postDraw:function(node){},drawPoint:function(node,geometry){},drawLineString:function(node,geometry){},drawLinearRing:function(node,geometry){},drawPolygon:function(node,geometry){},drawRectangle:function(node,geometry){},drawCircle:function(node,geometry){},drawSurface:function(node,geometry){},removeText:function(featureId){var label=document.getElementById(featureId+this.LABEL_ID_SUFFIX);if(label){this.textRoot.removeChild(label);}},getFeatureIdFromEvent:function(evt){var target=evt.target;var useElement=target&&target.correspondingUseElement;var node=useElement?useElement:(target||evt.srcElement);var featureId=node._featureId;return featureId;},eraseGeometry:function(geometry,featureId){if((geometry.CLASS_NAME=="OpenLayers.Geometry.MultiPoint")||(geometry.CLASS_NAME=="OpenLayers.Geometry.MultiLineString")||(geometry.CLASS_NAME=="OpenLayers.Geometry.MultiPolygon")||(geometry.CLASS_NAME=="OpenLayers.Geometry.Collection")){for(var i=0,len=geometry.components.length;i<len;i++){this.eraseGeometry(geometry.components[i],featureId);}}else{var element=OpenLayers.Util.getElement(geometry.id);if(element&&element.parentNode){if(element.geometry){element.geometry.destroy();element.geometry=null;}
59638 element.parentNode.removeChild(element);if(this.indexer){this.indexer.remove(element);}
59639 if(element._style.backgroundGraphic){var backgroundId=geometry.id+this.BACKGROUND_ID_SUFFIX;var bElem=OpenLayers.Util.getElement(backgroundId);if(bElem&&bElem.parentNode){bElem.parentNode.removeChild(bElem);}}}}},nodeFactory:function(id,type){var node=OpenLayers.Util.getElement(id);if(node){if(!this.nodeTypeCompare(node,type)){node.parentNode.removeChild(node);node=this.nodeFactory(id,type);}}else{node=this.createNode(type,id);}
59640 return node;},nodeTypeCompare:function(node,type){},createNode:function(type,id){},moveRoot:function(renderer){var root=this.root;if(renderer.root.parentNode==this.rendererRoot){root=renderer.root;}
59641 root.parentNode.removeChild(root);renderer.rendererRoot.appendChild(root);},getRenderLayerId:function(){return this.root.parentNode.parentNode.id;},isComplexSymbol:function(graphicName){return(graphicName!="circle")&&!!graphicName;},CLASS_NAME:"OpenLayers.Renderer.Elements"});OpenLayers.Renderer.symbol={"star":[350,75,379,161,469,161,397,215,423,301,350,250,277,301,303,215,231,161,321,161,350,75],"cross":[4,0,6,0,6,4,10,4,10,6,6,6,6,10,4,10,4,6,0,6,0,4,4,4,4,0],"x":[0,0,25,0,50,35,75,0,100,0,65,50,100,100,75,100,50,65,25,100,0,100,35,50,0,0],"square":[0,0,0,1,1,1,1,0,0,0],"triangle":[0,10,10,10,5,0,0,10]};OpenLayers.Strategy.Cluster=OpenLayers.Class(OpenLayers.Strategy,{distance:20,threshold:null,features:null,clusters:null,clustering:false,resolution:null,initialize:function(options){OpenLayers.Strategy.prototype.initialize.apply(this,[options]);},activate:function(){var activated=OpenLayers.Strategy.prototype.activate.call(this);if(activated){this.layer.events.on({"beforefeaturesadded":this.cacheFeatures,"moveend":this.cluster,scope:this});}
59642 return activated;},deactivate:function(){var deactivated=OpenLayers.Strategy.prototype.deactivate.call(this);if(deactivated){this.clearCache();this.layer.events.un({"beforefeaturesadded":this.cacheFeatures,"moveend":this.cluster,scope:this});}
59643 return deactivated;},cacheFeatures:function(event){var propagate=true;if(!this.clustering){this.clearCache();this.features=event.features;this.cluster();propagate=false;}
59644 return propagate;},clearCache:function(){this.features=null;},cluster:function(event){if((!event||event.zoomChanged)&&this.features){var resolution=this.layer.map.getResolution();if(resolution!=this.resolution||!this.clustersExist()){this.resolution=resolution;var clusters=[];var feature,clustered,cluster;for(var i=0;i<this.features.length;++i){feature=this.features[i];if(feature.geometry){clustered=false;for(var j=clusters.length-1;j>=0;--j){cluster=clusters[j];if(this.shouldCluster(cluster,feature)){this.addToCluster(cluster,feature);clustered=true;break;}}
59645 if(!clustered){clusters.push(this.createCluster(this.features[i]));}}}
59646 this.layer.removeAllFeatures();if(clusters.length>0){if(this.threshold>1){var clone=clusters.slice();clusters=[];var candidate;for(var i=0,len=clone.length;i<len;++i){candidate=clone[i];if(candidate.attributes.count<this.threshold){Array.prototype.push.apply(clusters,candidate.cluster);}else{clusters.push(candidate);}}}
59647 this.clustering=true;this.layer.addFeatures(clusters);this.clustering=false;}
59648 this.clusters=clusters;}}},clustersExist:function(){var exist=false;if(this.clusters&&this.clusters.length>0&&this.clusters.length==this.layer.features.length){exist=true;for(var i=0;i<this.clusters.length;++i){if(this.clusters[i]!=this.layer.features[i]){exist=false;break;}}}
59649 return exist;},shouldCluster:function(cluster,feature){var cc=cluster.geometry.getBounds().getCenterLonLat();var fc=feature.geometry.getBounds().getCenterLonLat();var distance=(Math.sqrt(Math.pow((cc.lon-fc.lon),2)+Math.pow((cc.lat-fc.lat),2))/this.resolution);return(distance<=this.distance);},addToCluster:function(cluster,feature){cluster.cluster.push(feature);cluster.attributes.count+=1;},createCluster:function(feature){var center=feature.geometry.getBounds().getCenterLonLat();var cluster=new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(center.lon,center.lat),{count:1});cluster.cluster=[feature];return cluster;},CLASS_NAME:"OpenLayers.Strategy.Cluster"});OpenLayers.Strategy.Fixed=OpenLayers.Class(OpenLayers.Strategy,{preload:false,initialize:function(options){OpenLayers.Strategy.prototype.initialize.apply(this,[options]);},destroy:function(){OpenLayers.Strategy.prototype.destroy.apply(this,arguments);},activate:function(){if(OpenLayers.Strategy.prototype.activate.apply(this,arguments)){this.layer.events.on({"refresh":this.load,scope:this});if(this.layer.visibility==true||this.preload){this.load();}else{this.layer.events.on({"visibilitychanged":this.load,scope:this});}
59650 return true;}
59651 return false;},deactivate:function(){var deactivated=OpenLayers.Strategy.prototype.deactivate.call(this);if(deactivated){this.layer.events.un({"refresh":this.load,"visibilitychanged":this.load,scope:this});}
59652 return deactivated;},load:function(options){this.layer.events.triggerEvent("loadstart");this.layer.protocol.read(OpenLayers.Util.applyDefaults({callback:this.merge,filter:this.layer.filter,scope:this},options));this.layer.events.un({"visibilitychanged":this.load,scope:this});},merge:function(resp){this.layer.destroyFeatures();var features=resp.features;if(features&&features.length>0){var remote=this.layer.projection;var local=this.layer.map.getProjectionObject();if(!local.equals(remote)){var geom;for(var i=0,len=features.length;i<len;++i){geom=features[i].geometry;if(geom){geom.transform(remote,local);}}}
59653 this.layer.addFeatures(features);}
59654 this.layer.events.triggerEvent("loadend");},CLASS_NAME:"OpenLayers.Strategy.Fixed"});OpenLayers.Strategy.Paging=OpenLayers.Class(OpenLayers.Strategy,{features:null,length:10,num:null,paging:false,initialize:function(options){OpenLayers.Strategy.prototype.initialize.apply(this,[options]);},activate:function(){var activated=OpenLayers.Strategy.prototype.activate.call(this);if(activated){this.layer.events.on({"beforefeaturesadded":this.cacheFeatures,scope:this});}
59655 return activated;},deactivate:function(){var deactivated=OpenLayers.Strategy.prototype.deactivate.call(this);if(deactivated){this.clearCache();this.layer.events.un({"beforefeaturesadded":this.cacheFeatures,scope:this});}
59656 return deactivated;},cacheFeatures:function(event){if(!this.paging){this.clearCache();this.features=event.features;this.pageNext(event);}},clearCache:function(){if(this.features){for(var i=0;i<this.features.length;++i){this.features[i].destroy();}}
59657 this.features=null;this.num=null;},pageCount:function(){var numFeatures=this.features?this.features.length:0;return Math.ceil(numFeatures/this.length);},pageNum:function(){return this.num;},pageLength:function(newLength){if(newLength&&newLength>0){this.length=newLength;}
59658 return this.length;},pageNext:function(event){var changed=false;if(this.features){if(this.num===null){this.num=-1;}
59659 var start=(this.num+1)*this.length;changed=this.page(start,event);}
59660 return changed;},pagePrevious:function(){var changed=false;if(this.features){if(this.num===null){this.num=this.pageCount();}
59661 var start=(this.num-1)*this.length;changed=this.page(start);}
59662 return changed;},page:function(start,event){var changed=false;if(this.features){if(start>=0&&start<this.features.length){var num=Math.floor(start/this.length);if(num!=this.num){this.paging=true;var features=this.features.slice(start,start+this.length);this.layer.removeFeatures(this.layer.features);this.num=num;if(event&&event.features){event.features=features;}else{this.layer.addFeatures(features);}
59663 this.paging=false;changed=true;}}}
59664 return changed;},CLASS_NAME:"OpenLayers.Strategy.Paging"});OpenLayers.Strategy.Refresh=OpenLayers.Class(OpenLayers.Strategy,{force:false,interval:0,timer:null,initialize:function(options){OpenLayers.Strategy.prototype.initialize.apply(this,[options]);},activate:function(){var activated=OpenLayers.Strategy.prototype.activate.call(this);if(activated){if(this.layer.visibility===true){this.start();}
59665 this.layer.events.on({"visibilitychanged":this.reset,scope:this});}
59666 return activated;},deactivate:function(){var deactivated=OpenLayers.Strategy.prototype.deactivate.call(this);if(deactivated){this.stop();}
59667 return deactivated;},reset:function(){if(this.layer.visibility===true){this.start();}else{this.stop();}},start:function(){if(this.interval&&typeof this.interval==="number"&&this.interval>0){this.timer=window.setInterval(OpenLayers.Function.bind(this.refresh,this),this.interval);}},refresh:function(){if(this.layer&&this.layer.refresh&&typeof this.layer.refresh=="function"){this.layer.refresh({force:this.force});}},stop:function(){if(this.timer!==null){window.clearInterval(this.timer);this.timer=null;}},CLASS_NAME:"OpenLayers.Strategy.Refresh"});OpenLayers.Strategy.Save=OpenLayers.Class(OpenLayers.Strategy,{EVENT_TYPES:["start","success","fail"],events:null,auto:false,timer:null,initialize:function(options){OpenLayers.Strategy.prototype.initialize.apply(this,[options]);this.events=new OpenLayers.Events(this,null,this.EVENT_TYPES);},activate:function(){var activated=OpenLayers.Strategy.prototype.activate.call(this);if(activated){if(this.auto){if(typeof this.auto==="number"){this.timer=window.setInterval(OpenLayers.Function.bind(this.save,this),this.auto*1000);}else{this.layer.events.on({"featureadded":this.triggerSave,"afterfeaturemodified":this.triggerSave,scope:this});}}}
59668 return activated;},deactivate:function(){var deactivated=OpenLayers.Strategy.prototype.deactivate.call(this);if(deactivated){if(this.auto){if(typeof this.auto==="number"){window.clearInterval(this.timer);}else{this.layer.events.un({"featureadded":this.triggerSave,"afterfeaturemodified":this.triggerSave,scope:this});}}}
59669 return deactivated;},triggerSave:function(event){var feature=event.feature;if(feature.state===OpenLayers.State.INSERT||feature.state===OpenLayers.State.UPDATE||feature.state===OpenLayers.State.DELETE){this.save([event.feature]);}},save:function(features){if(!features){features=this.layer.features;}
59670 this.events.triggerEvent("start",{features:features});var remote=this.layer.projection;var local=this.layer.map.getProjectionObject();if(!local.equals(remote)){var len=features.length;var clones=new Array(len);var orig,clone;for(var i=0;i<len;++i){orig=features[i];clone=orig.clone();clone.fid=orig.fid;clone.state=orig.state;if(orig.url){clone.url=orig.url;}
59671 clone._original=orig;clone.geometry.transform(local,remote);clones[i]=clone;}
59672 features=clones;}
59673 this.layer.protocol.commit(features,{callback:this.onCommit,scope:this});},onCommit:function(response){var evt={"response":response};if(response.success()){var features=response.reqFeatures;var state,feature;var destroys=[];var insertIds=response.insertIds||[];var j=0;for(var i=0,len=features.length;i<len;++i){feature=features[i];feature=feature._original||feature;state=feature.state;if(state){if(state==OpenLayers.State.DELETE){destroys.push(feature);}else if(state==OpenLayers.State.INSERT){feature.fid=insertIds[j];++j;}
59674 feature.state=null;}}
59675 if(destroys.length>0){this.layer.destroyFeatures(destroys);}
59676 this.events.triggerEvent("success",evt);}else{this.events.triggerEvent("fail",evt);}},CLASS_NAME:"OpenLayers.Strategy.Save"});OpenLayers.Symbolizer.Line=OpenLayers.Class(OpenLayers.Symbolizer,{strokeColor:null,strokeOpacity:null,strokeWidth:null,strokeLinecap:null,strokeDashstyle:null,initialize:function(config){OpenLayers.Symbolizer.prototype.initialize.apply(this,arguments);},CLASS_NAME:"OpenLayers.Symbolizer.Line"});OpenLayers.Symbolizer.Point=OpenLayers.Class(OpenLayers.Symbolizer,{strokeColor:null,strokeOpacity:null,strokeWidth:null,strokeLinecap:null,strokeDashstyle:null,fillColor:null,fillOpacity:null,pointRadius:null,externalGraphic:null,graphicWidth:null,graphicHeight:null,graphicOpacity:null,graphicXOffset:null,graphicYOffset:null,rotation:null,graphicName:null,initialize:function(config){OpenLayers.Symbolizer.prototype.initialize.apply(this,arguments);},CLASS_NAME:"OpenLayers.Symbolizer.Point"});OpenLayers.Symbolizer.Polygon=OpenLayers.Class(OpenLayers.Symbolizer,{strokeColor:null,strokeOpacity:null,strokeWidth:null,strokeLinecap:null,strokeDashstyle:null,fillColor:null,fillOpacity:null,initialize:function(config){OpenLayers.Symbolizer.prototype.initialize.apply(this,arguments);},CLASS_NAME:"OpenLayers.Symbolizer.Polygon"});OpenLayers.Symbolizer.Raster=OpenLayers.Class(OpenLayers.Symbolizer,{initialize:function(config){OpenLayers.Symbolizer.prototype.initialize.apply(this,arguments);},CLASS_NAME:"OpenLayers.Symbolizer.Raster"});OpenLayers.Symbolizer.Text=OpenLayers.Class(OpenLayers.Symbolizer,{label:null,fontFamily:null,fontSize:null,fontWeight:null,fontStyle:null,initialize:function(config){OpenLayers.Symbolizer.prototype.initialize.apply(this,arguments);},CLASS_NAME:"OpenLayers.Symbolizer.Text"});OpenLayers.Tween=OpenLayers.Class({INTERVAL:10,easing:null,begin:null,finish:null,duration:null,callbacks:null,time:null,interval:null,playing:false,initialize:function(easing){this.easing=(easing)?easing:OpenLayers.Easing.Expo.easeOut;},start:function(begin,finish,duration,options){this.playing=true;this.begin=begin;this.finish=finish;this.duration=duration;this.callbacks=options.callbacks;this.time=0;if(this.interval){window.clearInterval(this.interval);this.interval=null;}
59677 if(this.callbacks&&this.callbacks.start){this.callbacks.start.call(this,this.begin);}
59678 this.interval=window.setInterval(OpenLayers.Function.bind(this.play,this),this.INTERVAL);},stop:function(){if(!this.playing){return;}
59679 if(this.callbacks&&this.callbacks.done){this.callbacks.done.call(this,this.finish);}
59680 window.clearInterval(this.interval);this.interval=null;this.playing=false;},play:function(){var value={};for(var i in this.begin){var b=this.begin[i];var f=this.finish[i];if(b==null||f==null||isNaN(b)||isNaN(f)){OpenLayers.Console.error('invalid value for Tween');}
59681 var c=f-b;value[i]=this.easing.apply(this,[this.time,b,c,this.duration]);}
59682 this.time++;if(this.callbacks&&this.callbacks.eachStep){this.callbacks.eachStep.call(this,value);}
59683 if(this.time>this.duration){this.stop();}},CLASS_NAME:"OpenLayers.Tween"});OpenLayers.Easing={CLASS_NAME:"OpenLayers.Easing"};OpenLayers.Easing.Linear={easeIn:function(t,b,c,d){return c*t/d+b;},easeOut:function(t,b,c,d){return c*t/d+b;},easeInOut:function(t,b,c,d){return c*t/d+b;},CLASS_NAME:"OpenLayers.Easing.Linear"};OpenLayers.Easing.Expo={easeIn:function(t,b,c,d){return(t==0)?b:c*Math.pow(2,10*(t/d-1))+b;},easeOut:function(t,b,c,d){return(t==d)?b+c:c*(-Math.pow(2,-10*t/d)+1)+b;},easeInOut:function(t,b,c,d){if(t==0)return b;if(t==d)return b+c;if((t/=d/2)<1)return c/2*Math.pow(2,10*(t-1))+b;return c/2*(-Math.pow(2,-10*--t)+2)+b;},CLASS_NAME:"OpenLayers.Easing.Expo"};OpenLayers.Easing.Quad={easeIn:function(t,b,c,d){return c*(t/=d)*t+b;},easeOut:function(t,b,c,d){return-c*(t/=d)*(t-2)+b;},easeInOut:function(t,b,c,d){if((t/=d/2)<1)return c/2*t*t+b;return-c/2*((--t)*(t-2)-1)+b;},CLASS_NAME:"OpenLayers.Easing.Quad"};OpenLayers.Control.ArgParser=OpenLayers.Class(OpenLayers.Control,{center:null,zoom:null,layers:null,displayProjection:null,initialize:function(options){OpenLayers.Control.prototype.initialize.apply(this,arguments);},setMap:function(map){OpenLayers.Control.prototype.setMap.apply(this,arguments);for(var i=0,len=this.map.controls.length;i<len;i++){var control=this.map.controls[i];if((control!=this)&&(control.CLASS_NAME=="OpenLayers.Control.ArgParser")){if(control.displayProjection!=this.displayProjection){this.displayProjection=control.displayProjection;}
59684 break;}}
59685 if(i==this.map.controls.length){var args=OpenLayers.Util.getParameters();if(args.layers){this.layers=args.layers;this.map.events.register('addlayer',this,this.configureLayers);this.configureLayers();}
59686 if(args.lat&&args.lon){this.center=new OpenLayers.LonLat(parseFloat(args.lon),parseFloat(args.lat));if(args.zoom){this.zoom=parseInt(args.zoom);}
59687 this.map.events.register('changebaselayer',this,this.setCenter);this.setCenter();}}},setCenter:function(){if(this.map.baseLayer){this.map.events.unregister('changebaselayer',this,this.setCenter);if(this.displayProjection){this.center.transform(this.displayProjection,this.map.getProjectionObject());}
59688 this.map.setCenter(this.center,this.zoom);}},configureLayers:function(){if(this.layers.length==this.map.layers.length){this.map.events.unregister('addlayer',this,this.configureLayers);for(var i=0,len=this.layers.length;i<len;i++){var layer=this.map.layers[i];var c=this.layers.charAt(i);if(c=="B"){this.map.setBaseLayer(layer);}else if((c=="T")||(c=="F")){layer.setVisibility(c=="T");}}}},CLASS_NAME:"OpenLayers.Control.ArgParser"});OpenLayers.Control.Attribution=OpenLayers.Class(OpenLayers.Control,{separator:", ",initialize:function(options){OpenLayers.Control.prototype.initialize.apply(this,arguments);},destroy:function(){this.map.events.un({"removelayer":this.updateAttribution,"addlayer":this.updateAttribution,"changelayer":this.updateAttribution,"changebaselayer":this.updateAttribution,scope:this});OpenLayers.Control.prototype.destroy.apply(this,arguments);},draw:function(){OpenLayers.Control.prototype.draw.apply(this,arguments);this.map.events.on({'changebaselayer':this.updateAttribution,'changelayer':this.updateAttribution,'addlayer':this.updateAttribution,'removelayer':this.updateAttribution,scope:this});this.updateAttribution();return this.div;},updateAttribution:function(){var attributions=[];if(this.map&&this.map.layers){for(var i=0,len=this.map.layers.length;i<len;i++){var layer=this.map.layers[i];if(layer.attribution&&layer.getVisibility()){if(OpenLayers.Util.indexOf(attributions,layer.attribution)===-1){attributions.push(layer.attribution);}}}
59689 this.div.innerHTML=attributions.join(this.separator);}},CLASS_NAME:"OpenLayers.Control.Attribution"});OpenLayers.Control.Button=OpenLayers.Class(OpenLayers.Control,{type:OpenLayers.Control.TYPE_BUTTON,trigger:function(){},CLASS_NAME:"OpenLayers.Control.Button"});OpenLayers.Control.Graticule=OpenLayers.Class(OpenLayers.Control,{autoActivate:true,intervals:[45,30,20,10,5,2,1,0.5,0.2,0.1,0.05,0.01,0.005,0.002,0.001],displayInLayerSwitcher:true,visible:true,numPoints:50,targetSize:200,layerName:null,labelled:true,labelFormat:'dm',lineSymbolizer:{strokeColor:"#333",strokeWidth:1,strokeOpacity:0.5},labelSymbolizer:{},gratLayer:null,initialize:function(options){options=options||{};options.layerName=options.layerName||OpenLayers.i18n("graticule");OpenLayers.Control.prototype.initialize.apply(this,[options]);this.labelSymbolizer.stroke=false;this.labelSymbolizer.fill=false;this.labelSymbolizer.label="${label}";this.labelSymbolizer.labelAlign="${labelAlign}";this.labelSymbolizer.labelXOffset="${xOffset}";this.labelSymbolizer.labelYOffset="${yOffset}";},destroy:function(){this.deactivate();OpenLayers.Control.prototype.destroy.apply(this,arguments);if(this.gratLayer){this.gratLayer.destroy();this.gratLayer=null;}},draw:function(){OpenLayers.Control.prototype.draw.apply(this,arguments);if(!this.gratLayer){var gratStyle=new OpenLayers.Style({},{rules:[new OpenLayers.Rule({'symbolizer':{"Point":this.labelSymbolizer,"Line":this.lineSymbolizer}})]});this.gratLayer=new OpenLayers.Layer.Vector(this.layerName,{styleMap:new OpenLayers.StyleMap({'default':gratStyle}),visibility:this.visible,displayInLayerSwitcher:this.displayInLayerSwitcher});}
59690 return this.div;},activate:function(){if(OpenLayers.Control.prototype.activate.apply(this,arguments)){this.map.addLayer(this.gratLayer);this.map.events.register('moveend',this,this.update);this.update();return true;}else{return false;}},deactivate:function(){if(OpenLayers.Control.prototype.deactivate.apply(this,arguments)){this.map.events.unregister('moveend',this,this.update);this.map.removeLayer(this.gratLayer);return true;}else{return false;}},update:function(){var mapBounds=this.map.getExtent();if(!mapBounds){return;}
59691 this.gratLayer.destroyFeatures();var llProj=new OpenLayers.Projection("EPSG:4326");var mapProj=this.map.getProjectionObject();var mapRes=this.map.getResolution();if(mapProj.proj&&mapProj.proj.projName=="longlat"){this.numPoints=1;}
59692 var mapCenter=this.map.getCenter();var mapCenterLL=new OpenLayers.Pixel(mapCenter.lon,mapCenter.lat);OpenLayers.Projection.transform(mapCenterLL,mapProj,llProj);var testSq=this.targetSize*mapRes;testSq*=testSq;var llInterval;for(var i=0;i<this.intervals.length;++i){llInterval=this.intervals[i];var delta=llInterval/2;var p1=mapCenterLL.offset(new OpenLayers.Pixel(-delta,-delta));var p2=mapCenterLL.offset(new OpenLayers.Pixel(delta,delta));OpenLayers.Projection.transform(p1,llProj,mapProj);OpenLayers.Projection.transform(p2,llProj,mapProj);var distSq=(p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y);if(distSq<=testSq){break;}}
59693 mapCenterLL.x=Math.floor(mapCenterLL.x/llInterval)*llInterval;mapCenterLL.y=Math.floor(mapCenterLL.y/llInterval)*llInterval;var iter=0;var centerLonPoints=[mapCenterLL.clone()];var newPoint=mapCenterLL.clone();var mapXY;do{newPoint=newPoint.offset(new OpenLayers.Pixel(0,llInterval));mapXY=OpenLayers.Projection.transform(newPoint.clone(),llProj,mapProj);centerLonPoints.unshift(newPoint);}while(mapBounds.containsPixel(mapXY)&&++iter<1000);newPoint=mapCenterLL.clone();do{newPoint=newPoint.offset(new OpenLayers.Pixel(0,-llInterval));mapXY=OpenLayers.Projection.transform(newPoint.clone(),llProj,mapProj);centerLonPoints.push(newPoint);}while(mapBounds.containsPixel(mapXY)&&++iter<1000);iter=0;var centerLatPoints=[mapCenterLL.clone()];newPoint=mapCenterLL.clone();do{newPoint=newPoint.offset(new OpenLayers.Pixel(-llInterval,0));mapXY=OpenLayers.Projection.transform(newPoint.clone(),llProj,mapProj);centerLatPoints.unshift(newPoint);}while(mapBounds.containsPixel(mapXY)&&++iter<1000);newPoint=mapCenterLL.clone();do{newPoint=newPoint.offset(new OpenLayers.Pixel(llInterval,0));mapXY=OpenLayers.Projection.transform(newPoint.clone(),llProj,mapProj);centerLatPoints.push(newPoint);}while(mapBounds.containsPixel(mapXY)&&++iter<1000);var lines=[];for(var i=0;i<centerLatPoints.length;++i){var lon=centerLatPoints[i].x;var pointList=[];var labelPoint=null;var latEnd=Math.min(centerLonPoints[0].y,90);var latStart=Math.max(centerLonPoints[centerLonPoints.length-1].y,-90);var latDelta=(latEnd-latStart)/this.numPoints;var lat=latStart;for(var j=0;j<=this.numPoints;++j){var gridPoint=new OpenLayers.Geometry.Point(lon,lat);gridPoint.transform(llProj,mapProj);pointList.push(gridPoint);lat+=latDelta;if(gridPoint.y>=mapBounds.bottom&&!labelPoint){labelPoint=gridPoint;}}
59694 if(this.labelled){var labelPos=new OpenLayers.Geometry.Point(labelPoint.x,mapBounds.bottom);var labelAttrs={value:lon,label:this.labelled?OpenLayers.Util.getFormattedLonLat(lon,"lon",this.labelFormat):"",labelAlign:"cb",xOffset:0,yOffset:2};this.gratLayer.addFeatures(new OpenLayers.Feature.Vector(labelPos,labelAttrs));}
59695 var geom=new OpenLayers.Geometry.LineString(pointList);lines.push(new OpenLayers.Feature.Vector(geom));}
59696 for(var j=0;j<centerLonPoints.length;++j){lat=centerLonPoints[j].y;if(lat<-90||lat>90){continue;}
59697 var pointList=[];var lonStart=centerLatPoints[0].x;var lonEnd=centerLatPoints[centerLatPoints.length-1].x;var lonDelta=(lonEnd-lonStart)/this.numPoints;var lon=lonStart;var labelPoint=null;for(var i=0;i<=this.numPoints;++i){var gridPoint=new OpenLayers.Geometry.Point(lon,lat);gridPoint.transform(llProj,mapProj);pointList.push(gridPoint);lon+=lonDelta;if(gridPoint.x<mapBounds.right){labelPoint=gridPoint;}}
59698 if(this.labelled){var labelPos=new OpenLayers.Geometry.Point(mapBounds.right,labelPoint.y);var labelAttrs={value:lat,label:this.labelled?OpenLayers.Util.getFormattedLonLat(lat,"lat",this.labelFormat):"",labelAlign:"rb",xOffset:-2,yOffset:2};this.gratLayer.addFeatures(new OpenLayers.Feature.Vector(labelPos,labelAttrs));}
59699 var geom=new OpenLayers.Geometry.LineString(pointList);lines.push(new OpenLayers.Feature.Vector(geom));}
59700 this.gratLayer.addFeatures(lines);},CLASS_NAME:"OpenLayers.Control.Graticule"});OpenLayers.Control.LayerSwitcher=OpenLayers.Class(OpenLayers.Control,{roundedCorner:true,roundedCornerColor:"darkblue",layerStates:null,layersDiv:null,baseLayersDiv:null,baseLayers:null,dataLbl:null,dataLayersDiv:null,dataLayers:null,minimizeDiv:null,maximizeDiv:null,ascending:true,initialize:function(options){OpenLayers.Control.prototype.initialize.apply(this,arguments);this.layerStates=[];},destroy:function(){OpenLayers.Event.stopObservingElement(this.div);OpenLayers.Event.stopObservingElement(this.minimizeDiv);OpenLayers.Event.stopObservingElement(this.maximizeDiv);this.clearLayersArray("base");this.clearLayersArray("data");this.map.events.un({"addlayer":this.redraw,"changelayer":this.redraw,"removelayer":this.redraw,"changebaselayer":this.redraw,scope:this});OpenLayers.Control.prototype.destroy.apply(this,arguments);},setMap:function(map){OpenLayers.Control.prototype.setMap.apply(this,arguments);this.map.events.on({"addlayer":this.redraw,"changelayer":this.redraw,"removelayer":this.redraw,"changebaselayer":this.redraw,scope:this});},draw:function(){OpenLayers.Control.prototype.draw.apply(this);this.loadContents();if(!this.outsideViewport){this.minimizeControl();}
59701 this.redraw();return this.div;},clearLayersArray:function(layersType){var layers=this[layersType+"Layers"];if(layers){for(var i=0,len=layers.length;i<len;i++){var layer=layers[i];OpenLayers.Event.stopObservingElement(layer.inputElem);OpenLayers.Event.stopObservingElement(layer.labelSpan);}}
59702 this[layersType+"LayersDiv"].innerHTML="";this[layersType+"Layers"]=[];},checkRedraw:function(){var redraw=false;if(!this.layerStates.length||(this.map.layers.length!=this.layerStates.length)){redraw=true;}else{for(var i=0,len=this.layerStates.length;i<len;i++){var layerState=this.layerStates[i];var layer=this.map.layers[i];if((layerState.name!=layer.name)||(layerState.inRange!=layer.inRange)||(layerState.id!=layer.id)||(layerState.visibility!=layer.visibility)){redraw=true;break;}}}
59703 return redraw;},redraw:function(){if(!this.checkRedraw()){return this.div;}
59704 this.clearLayersArray("base");this.clearLayersArray("data");var containsOverlays=false;var containsBaseLayers=false;var len=this.map.layers.length;this.layerStates=new Array(len);for(var i=0;i<len;i++){var layer=this.map.layers[i];this.layerStates[i]={'name':layer.name,'visibility':layer.visibility,'inRange':layer.inRange,'id':layer.id};}
59705 var layers=this.map.layers.slice();if(!this.ascending){layers.reverse();}
59706 for(var i=0,len=layers.length;i<len;i++){var layer=layers[i];var baseLayer=layer.isBaseLayer;if(layer.displayInLayerSwitcher){if(baseLayer){containsBaseLayers=true;}else{containsOverlays=true;}
59707 var checked=(baseLayer)?(layer==this.map.baseLayer):layer.getVisibility();var inputElem=document.createElement("input");inputElem.id=this.id+"_input_"+layer.name;inputElem.name=(baseLayer)?this.id+"_baseLayers":layer.name;inputElem.type=(baseLayer)?"radio":"checkbox";inputElem.value=layer.name;inputElem.checked=checked;inputElem.defaultChecked=checked;if(!baseLayer&&!layer.inRange){inputElem.disabled=true;}
59708 var context={'inputElem':inputElem,'layer':layer,'layerSwitcher':this};OpenLayers.Event.observe(inputElem,"mouseup",OpenLayers.Function.bindAsEventListener(this.onInputClick,context));var labelSpan=document.createElement("span");OpenLayers.Element.addClass(labelSpan,"labelSpan")
59709 if(!baseLayer&&!layer.inRange){labelSpan.style.color="gray";}
59710 labelSpan.innerHTML=layer.name;labelSpan.style.verticalAlign=(baseLayer)?"bottom":"baseline";OpenLayers.Event.observe(labelSpan,"click",OpenLayers.Function.bindAsEventListener(this.onInputClick,context));var br=document.createElement("br");var groupArray=(baseLayer)?this.baseLayers:this.dataLayers;groupArray.push({'layer':layer,'inputElem':inputElem,'labelSpan':labelSpan});var groupDiv=(baseLayer)?this.baseLayersDiv:this.dataLayersDiv;groupDiv.appendChild(inputElem);groupDiv.appendChild(labelSpan);groupDiv.appendChild(br);}}
59711 this.dataLbl.style.display=(containsOverlays)?"":"none";this.baseLbl.style.display=(containsBaseLayers)?"":"none";return this.div;},onInputClick:function(e){if(!this.inputElem.disabled){if(this.inputElem.type=="radio"){this.inputElem.checked=true;this.layer.map.setBaseLayer(this.layer);}else{this.inputElem.checked=!this.inputElem.checked;this.layerSwitcher.updateMap();}}
59712 OpenLayers.Event.stop(e);},onLayerClick:function(e){this.updateMap();},updateMap:function(){for(var i=0,len=this.baseLayers.length;i<len;i++){var layerEntry=this.baseLayers[i];if(layerEntry.inputElem.checked){this.map.setBaseLayer(layerEntry.layer,false);}}
59713 for(var i=0,len=this.dataLayers.length;i<len;i++){var layerEntry=this.dataLayers[i];layerEntry.layer.setVisibility(layerEntry.inputElem.checked);}},maximizeControl:function(e){this.div.style.width="";this.div.style.height="";this.showControls(false);if(e!=null){OpenLayers.Event.stop(e);}},minimizeControl:function(e){this.div.style.width="0px";this.div.style.height="0px";this.showControls(true);if(e!=null){OpenLayers.Event.stop(e);}},showControls:function(minimize){this.maximizeDiv.style.display=minimize?"":"none";this.minimizeDiv.style.display=minimize?"none":"";this.layersDiv.style.display=minimize?"none":"";},loadContents:function(){OpenLayers.Event.observe(this.div,"mouseup",OpenLayers.Function.bindAsEventListener(this.mouseUp,this));OpenLayers.Event.observe(this.div,"click",this.ignoreEvent);OpenLayers.Event.observe(this.div,"mousedown",OpenLayers.Function.bindAsEventListener(this.mouseDown,this));OpenLayers.Event.observe(this.div,"dblclick",this.ignoreEvent);this.layersDiv=document.createElement("div");this.layersDiv.id=this.id+"_layersDiv";OpenLayers.Element.addClass(this.layersDiv,"layersDiv");this.baseLbl=document.createElement("div");this.baseLbl.innerHTML=OpenLayers.i18n("baseLayer");OpenLayers.Element.addClass(this.baseLbl,"baseLbl");this.baseLayersDiv=document.createElement("div");OpenLayers.Element.addClass(this.baseLayersDiv,"baseLayersDiv");this.dataLbl=document.createElement("div");this.dataLbl.innerHTML=OpenLayers.i18n("overlays");OpenLayers.Element.addClass(this.dataLbl,"dataLbl");this.dataLayersDiv=document.createElement("div");OpenLayers.Element.addClass(this.dataLayersDiv,"dataLayersDiv");if(this.ascending){this.layersDiv.appendChild(this.baseLbl);this.layersDiv.appendChild(this.baseLayersDiv);this.layersDiv.appendChild(this.dataLbl);this.layersDiv.appendChild(this.dataLayersDiv);}else{this.layersDiv.appendChild(this.dataLbl);this.layersDiv.appendChild(this.dataLayersDiv);this.layersDiv.appendChild(this.baseLbl);this.layersDiv.appendChild(this.baseLayersDiv);}
59714 this.div.appendChild(this.layersDiv);if(this.roundedCorner){OpenLayers.Rico.Corner.round(this.div,{corners:"tl bl",bgColor:"transparent",color:this.roundedCornerColor,blend:false});OpenLayers.Rico.Corner.changeOpacity(this.layersDiv,0.75);}
59715 var imgLocation=OpenLayers.Util.getImagesLocation();var sz=new OpenLayers.Size(18,18);var img=imgLocation+'layer-switcher-maximize.png';this.maximizeDiv=OpenLayers.Util.createAlphaImageDiv("OpenLayers_Control_MaximizeDiv",null,sz,img,"absolute");OpenLayers.Element.addClass(this.maximizeDiv,"maximizeDiv");this.maximizeDiv.style.display="none";OpenLayers.Event.observe(this.maximizeDiv,"click",OpenLayers.Function.bindAsEventListener(this.maximizeControl,this));this.div.appendChild(this.maximizeDiv);var img=imgLocation+'layer-switcher-minimize.png';var sz=new OpenLayers.Size(18,18);this.minimizeDiv=OpenLayers.Util.createAlphaImageDiv("OpenLayers_Control_MinimizeDiv",null,sz,img,"absolute");OpenLayers.Element.addClass(this.minimizeDiv,"minimizeDiv");this.minimizeDiv.style.display="none";OpenLayers.Event.observe(this.minimizeDiv,"click",OpenLayers.Function.bindAsEventListener(this.minimizeControl,this));this.div.appendChild(this.minimizeDiv);},ignoreEvent:function(evt){OpenLayers.Event.stop(evt);},mouseDown:function(evt){this.isMouseDown=true;this.ignoreEvent(evt);},mouseUp:function(evt){if(this.isMouseDown){this.isMouseDown=false;this.ignoreEvent(evt);}},CLASS_NAME:"OpenLayers.Control.LayerSwitcher"});OpenLayers.Control.MouseDefaults=OpenLayers.Class(OpenLayers.Control,{performedDrag:false,wheelObserver:null,initialize:function(){OpenLayers.Control.prototype.initialize.apply(this,arguments);},destroy:function(){if(this.handler){this.handler.destroy();}
59716 this.handler=null;this.map.events.un({"click":this.defaultClick,"dblclick":this.defaultDblClick,"mousedown":this.defaultMouseDown,"mouseup":this.defaultMouseUp,"mousemove":this.defaultMouseMove,"mouseout":this.defaultMouseOut,scope:this});OpenLayers.Event.stopObserving(window,"DOMMouseScroll",this.wheelObserver);OpenLayers.Event.stopObserving(window,"mousewheel",this.wheelObserver);OpenLayers.Event.stopObserving(document,"mousewheel",this.wheelObserver);this.wheelObserver=null;OpenLayers.Control.prototype.destroy.apply(this,arguments);},draw:function(){this.map.events.on({"click":this.defaultClick,"dblclick":this.defaultDblClick,"mousedown":this.defaultMouseDown,"mouseup":this.defaultMouseUp,"mousemove":this.defaultMouseMove,"mouseout":this.defaultMouseOut,scope:this});this.registerWheelEvents();},registerWheelEvents:function(){this.wheelObserver=OpenLayers.Function.bindAsEventListener(this.onWheelEvent,this);OpenLayers.Event.observe(window,"DOMMouseScroll",this.wheelObserver);OpenLayers.Event.observe(window,"mousewheel",this.wheelObserver);OpenLayers.Event.observe(document,"mousewheel",this.wheelObserver);},defaultClick:function(evt){if(!OpenLayers.Event.isLeftClick(evt)){return;}
59717 var notAfterDrag=!this.performedDrag;this.performedDrag=false;return notAfterDrag;},defaultDblClick:function(evt){var newCenter=this.map.getLonLatFromViewPortPx(evt.xy);this.map.setCenter(newCenter,this.map.zoom+1);OpenLayers.Event.stop(evt);return false;},defaultMouseDown:function(evt){if(!OpenLayers.Event.isLeftClick(evt)){return;}
59718 this.mouseDragStart=evt.xy.clone();this.performedDrag=false;if(evt.shiftKey){this.map.div.style.cursor="crosshair";this.zoomBox=OpenLayers.Util.createDiv('zoomBox',this.mouseDragStart,null,null,"absolute","2px solid red");this.zoomBox.style.backgroundColor="white";this.zoomBox.style.filter="alpha(opacity=50)";this.zoomBox.style.opacity="0.50";this.zoomBox.style.fontSize="1px";this.zoomBox.style.zIndex=this.map.Z_INDEX_BASE["Popup"]-1;this.map.viewPortDiv.appendChild(this.zoomBox);}
59719 document.onselectstart=OpenLayers.Function.False;OpenLayers.Event.stop(evt);},defaultMouseMove:function(evt){this.mousePosition=evt.xy.clone();if(this.mouseDragStart!=null){if(this.zoomBox){var deltaX=Math.abs(this.mouseDragStart.x-evt.xy.x);var deltaY=Math.abs(this.mouseDragStart.y-evt.xy.y);this.zoomBox.style.width=Math.max(1,deltaX)+"px";this.zoomBox.style.height=Math.max(1,deltaY)+"px";if(evt.xy.x<this.mouseDragStart.x){this.zoomBox.style.left=evt.xy.x+"px";}
59720 if(evt.xy.y<this.mouseDragStart.y){this.zoomBox.style.top=evt.xy.y+"px";}}else{var deltaX=this.mouseDragStart.x-evt.xy.x;var deltaY=this.mouseDragStart.y-evt.xy.y;var size=this.map.getSize();var newXY=new OpenLayers.Pixel(size.w/2+deltaX,size.h/2+deltaY);var newCenter=this.map.getLonLatFromViewPortPx(newXY);this.map.setCenter(newCenter,null,true);this.mouseDragStart=evt.xy.clone();this.map.div.style.cursor="move";}
59721 this.performedDrag=true;}},defaultMouseUp:function(evt){if(!OpenLayers.Event.isLeftClick(evt)){return;}
59722 if(this.zoomBox){this.zoomBoxEnd(evt);}else{if(this.performedDrag){this.map.setCenter(this.map.center);}}
59723 document.onselectstart=null;this.mouseDragStart=null;this.map.div.style.cursor="";},defaultMouseOut:function(evt){if(this.mouseDragStart!=null&&OpenLayers.Util.mouseLeft(evt,this.map.div)){if(this.zoomBox){this.removeZoomBox();}
59724 this.mouseDragStart=null;}},defaultWheelUp:function(evt){if(this.map.getZoom()<=this.map.getNumZoomLevels()){this.map.setCenter(this.map.getLonLatFromPixel(evt.xy),this.map.getZoom()+1);}},defaultWheelDown:function(evt){if(this.map.getZoom()>0){this.map.setCenter(this.map.getLonLatFromPixel(evt.xy),this.map.getZoom()-1);}},zoomBoxEnd:function(evt){if(this.mouseDragStart!=null){if(Math.abs(this.mouseDragStart.x-evt.xy.x)>5||Math.abs(this.mouseDragStart.y-evt.xy.y)>5){var start=this.map.getLonLatFromViewPortPx(this.mouseDragStart);var end=this.map.getLonLatFromViewPortPx(evt.xy);var top=Math.max(start.lat,end.lat);var bottom=Math.min(start.lat,end.lat);var left=Math.min(start.lon,end.lon);var right=Math.max(start.lon,end.lon);var bounds=new OpenLayers.Bounds(left,bottom,right,top);this.map.zoomToExtent(bounds);}else{var end=this.map.getLonLatFromViewPortPx(evt.xy);this.map.setCenter(new OpenLayers.LonLat((end.lon),(end.lat)),this.map.getZoom()+1);}
59725 this.removeZoomBox();}},removeZoomBox:function(){this.map.viewPortDiv.removeChild(this.zoomBox);this.zoomBox=null;},onWheelEvent:function(e){var inMap=false;var elem=OpenLayers.Event.element(e);while(elem!=null){if(this.map&&elem==this.map.div){inMap=true;break;}
59726 elem=elem.parentNode;}
59727 if(inMap){var delta=0;if(!e){e=window.event;}
59728 if(e.wheelDelta){delta=e.wheelDelta/120;if(window.opera&&window.opera.version()<9.2){delta=-delta;}}else if(e.detail){delta=-e.detail/3;}
59729 if(delta){e.xy=this.mousePosition;if(delta<0){this.defaultWheelDown(e);}else{this.defaultWheelUp(e);}}
59730 OpenLayers.Event.stop(e);}},CLASS_NAME:"OpenLayers.Control.MouseDefaults"});OpenLayers.Control.MousePosition=OpenLayers.Class(OpenLayers.Control,{autoActivate:true,element:null,prefix:'',separator:', ',suffix:'',numDigits:5,granularity:10,emptyString:null,lastXy:null,displayProjection:null,initialize:function(options){OpenLayers.Control.prototype.initialize.apply(this,arguments);},destroy:function(){this.deactivate();OpenLayers.Control.prototype.destroy.apply(this,arguments);},activate:function(){if(OpenLayers.Control.prototype.activate.apply(this,arguments)){this.map.events.register('mousemove',this,this.redraw);this.map.events.register('mouseout',this,this.reset);this.redraw();return true;}else{return false;}},deactivate:function(){if(OpenLayers.Control.prototype.deactivate.apply(this,arguments)){this.map.events.unregister('mousemove',this,this.redraw);this.map.events.unregister('mouseout',this,this.reset);this.element.innerHTML="";return true;}else{return false;}},draw:function(){OpenLayers.Control.prototype.draw.apply(this,arguments);if(!this.element){this.div.left="";this.div.top="";this.element=this.div;}
59731 return this.div;},redraw:function(evt){var lonLat;if(evt==null){this.reset();return;}else{if(this.lastXy==null||Math.abs(evt.xy.x-this.lastXy.x)>this.granularity||Math.abs(evt.xy.y-this.lastXy.y)>this.granularity)
59732 {this.lastXy=evt.xy;return;}
59733 lonLat=this.map.getLonLatFromPixel(evt.xy);if(!lonLat){return;}
59734 if(this.displayProjection){lonLat.transform(this.map.getProjectionObject(),this.displayProjection);}
59735 this.lastXy=evt.xy;}
59736 var newHtml=this.formatOutput(lonLat);if(newHtml!=this.element.innerHTML){this.element.innerHTML=newHtml;}},reset:function(evt){if(this.emptyString!=null){this.element.innerHTML=this.emptyString;}},formatOutput:function(lonLat){var digits=parseInt(this.numDigits);var newHtml=this.prefix+
59737 lonLat.lon.toFixed(digits)+
59738 this.separator+
59739 lonLat.lat.toFixed(digits)+
59740 this.suffix;return newHtml;},CLASS_NAME:"OpenLayers.Control.MousePosition"});OpenLayers.Control.Pan=OpenLayers.Class(OpenLayers.Control,{slideFactor:50,direction:null,type:OpenLayers.Control.TYPE_BUTTON,initialize:function(direction,options){this.direction=direction;this.CLASS_NAME+=this.direction;OpenLayers.Control.prototype.initialize.apply(this,[options]);},trigger:function(){switch(this.direction){case OpenLayers.Control.Pan.NORTH:this.map.pan(0,-this.slideFactor);break;case OpenLayers.Control.Pan.SOUTH:this.map.pan(0,this.slideFactor);break;case OpenLayers.Control.Pan.WEST:this.map.pan(-this.slideFactor,0);break;case OpenLayers.Control.Pan.EAST:this.map.pan(this.slideFactor,0);break;}},CLASS_NAME:"OpenLayers.Control.Pan"});OpenLayers.Control.Pan.NORTH="North";OpenLayers.Control.Pan.SOUTH="South";OpenLayers.Control.Pan.EAST="East";OpenLayers.Control.Pan.WEST="West";OpenLayers.Control.PanZoom=OpenLayers.Class(OpenLayers.Control,{slideFactor:50,slideRatio:null,buttons:null,position:null,initialize:function(options){this.position=new OpenLayers.Pixel(OpenLayers.Control.PanZoom.X,OpenLayers.Control.PanZoom.Y);OpenLayers.Control.prototype.initialize.apply(this,arguments);},destroy:function(){OpenLayers.Control.prototype.destroy.apply(this,arguments);this.removeButtons();this.buttons=null;this.position=null;},draw:function(px){OpenLayers.Control.prototype.draw.apply(this,arguments);px=this.position;this.buttons=[];var sz=new OpenLayers.Size(18,18);var centered=new OpenLayers.Pixel(px.x+sz.w/2,px.y);this._addButton("panup","north-mini.png",centered,sz);px.y=centered.y+sz.h;this._addButton("panleft","west-mini.png",px,sz);this._addButton("panright","east-mini.png",px.add(sz.w,0),sz);this._addButton("pandown","south-mini.png",centered.add(0,sz.h*2),sz);this._addButton("zoomin","zoom-plus-mini.png",centered.add(0,sz.h*3+5),sz);this._addButton("zoomworld","zoom-world-mini.png",centered.add(0,sz.h*4+5),sz);this._addButton("zoomout","zoom-minus-mini.png",centered.add(0,sz.h*5+5),sz);return this.div;},_addButton:function(id,img,xy,sz){var imgLocation=OpenLayers.Util.getImagesLocation()+img;var btn=OpenLayers.Util.createAlphaImageDiv(this.id+"_"+id,xy,sz,imgLocation,"absolute");this.div.appendChild(btn);OpenLayers.Event.observe(btn,"mousedown",OpenLayers.Function.bindAsEventListener(this.buttonDown,btn));OpenLayers.Event.observe(btn,"dblclick",OpenLayers.Function.bindAsEventListener(this.doubleClick,btn));OpenLayers.Event.observe(btn,"click",OpenLayers.Function.bindAsEventListener(this.doubleClick,btn));btn.action=id;btn.map=this.map;if(!this.slideRatio){var slideFactorPixels=this.slideFactor;var getSlideFactor=function(){return slideFactorPixels;};}else{var slideRatio=this.slideRatio;var getSlideFactor=function(dim){return this.map.getSize()[dim]*slideRatio;};}
59741 btn.getSlideFactor=getSlideFactor;this.buttons.push(btn);return btn;},_removeButton:function(btn){OpenLayers.Event.stopObservingElement(btn);btn.map=null;btn.getSlideFactor=null;this.div.removeChild(btn);OpenLayers.Util.removeItem(this.buttons,btn);},removeButtons:function(){for(var i=this.buttons.length-1;i>=0;--i){this._removeButton(this.buttons[i]);}},doubleClick:function(evt){OpenLayers.Event.stop(evt);return false;},buttonDown:function(evt){if(!OpenLayers.Event.isLeftClick(evt)){return;}
59742 switch(this.action){case"panup":this.map.pan(0,-this.getSlideFactor("h"));break;case"pandown":this.map.pan(0,this.getSlideFactor("h"));break;case"panleft":this.map.pan(-this.getSlideFactor("w"),0);break;case"panright":this.map.pan(this.getSlideFactor("w"),0);break;case"zoomin":this.map.zoomIn();break;case"zoomout":this.map.zoomOut();break;case"zoomworld":this.map.zoomToMaxExtent();break;}
59743 OpenLayers.Event.stop(evt);},CLASS_NAME:"OpenLayers.Control.PanZoom"});OpenLayers.Control.PanZoom.X=4;OpenLayers.Control.PanZoom.Y=4;OpenLayers.Control.Panel=OpenLayers.Class(OpenLayers.Control,{controls:null,autoActivate:true,defaultControl:null,saveState:false,activeState:null,initialize:function(options){OpenLayers.Control.prototype.initialize.apply(this,[options]);this.controls=[];this.activeState={};},destroy:function(){OpenLayers.Control.prototype.destroy.apply(this,arguments);for(var i=this.controls.length-1;i>=0;i--){if(this.controls[i].events){this.controls[i].events.un({"activate":this.redraw,"deactivate":this.redraw,scope:this});}
59744 OpenLayers.Event.stopObservingElement(this.controls[i].panel_div);this.controls[i].panel_div=null;}
59745 this.activeState=null;},activate:function(){if(OpenLayers.Control.prototype.activate.apply(this,arguments)){var control;for(var i=0,len=this.controls.length;i<len;i++){control=this.controls[i];if(control===this.defaultControl||(this.saveState&&this.activeState[control.id])){control.activate();}}
59746 if(this.saveState===true){this.defaultControl=null;}
59747 this.redraw();return true;}else{return false;}},deactivate:function(){if(OpenLayers.Control.prototype.deactivate.apply(this,arguments)){var control;for(var i=0,len=this.controls.length;i<len;i++){control=this.controls[i];this.activeState[control.id]=control.deactivate();}
59748 return true;}else{return false;}},draw:function(){OpenLayers.Control.prototype.draw.apply(this,arguments);this.addControlsToMap(this.controls);return this.div;},redraw:function(){if(this.div.children.length>0){for(var l=this.div.children.length,i=l-1;i>=0;i--){this.div.removeChild(this.div.children[i]);}}
59749 this.div.innerHTML="";if(this.active){for(var i=0,len=this.controls.length;i<len;i++){var element=this.controls[i].panel_div;if(this.controls[i].active){element.className=this.controls[i].displayClass+"ItemActive";}else{element.className=this.controls[i].displayClass+"ItemInactive";}
59750 this.div.appendChild(element);}}},activateControl:function(control){if(!this.active){return false;}
59751 if(control.type==OpenLayers.Control.TYPE_BUTTON){control.trigger();this.redraw();return;}
59752 if(control.type==OpenLayers.Control.TYPE_TOGGLE){if(control.active){control.deactivate();}else{control.activate();}
59753 this.redraw();return;}
59754 var c;for(var i=0,len=this.controls.length;i<len;i++){c=this.controls[i];if(c!=control&&(c.type===OpenLayers.Control.TYPE_TOOL||c.type==null)){c.deactivate();}}
59755 control.activate();},addControls:function(controls){if(!(controls instanceof Array)){controls=[controls];}
59756 this.controls=this.controls.concat(controls);for(var i=0,len=controls.length;i<len;i++){var element=document.createElement("div");controls[i].panel_div=element;if(controls[i].title!=""){controls[i].panel_div.title=controls[i].title;}
59757 OpenLayers.Event.observe(controls[i].panel_div,"click",OpenLayers.Function.bind(this.onClick,this,controls[i]));OpenLayers.Event.observe(controls[i].panel_div,"dblclick",OpenLayers.Function.bind(this.onDoubleClick,this,controls[i]));OpenLayers.Event.observe(controls[i].panel_div,"mousedown",OpenLayers.Function.bindAsEventListener(OpenLayers.Event.stop));}
59758 if(this.map){this.addControlsToMap(controls);this.redraw();}},addControlsToMap:function(controls){var control;for(var i=0,len=controls.length;i<len;i++){control=controls[i];if(control.autoActivate===true){control.autoActivate=false;this.map.addControl(control);control.autoActivate=true;}else{this.map.addControl(control);control.deactivate();}
59759 control.events.on({"activate":this.redraw,"deactivate":this.redraw,scope:this});}},onClick:function(ctrl,evt){OpenLayers.Event.stop(evt?evt:window.event);this.activateControl(ctrl);},onDoubleClick:function(ctrl,evt){OpenLayers.Event.stop(evt?evt:window.event);},getControlsBy:function(property,match){var test=(typeof match.test=="function");var found=OpenLayers.Array.filter(this.controls,function(item){return item[property]==match||(test&&match.test(item[property]));});return found;},getControlsByName:function(match){return this.getControlsBy("name",match);},getControlsByClass:function(match){return this.getControlsBy("CLASS_NAME",match);},CLASS_NAME:"OpenLayers.Control.Panel"});OpenLayers.Control.Scale=OpenLayers.Class(OpenLayers.Control,{element:null,geodesic:false,initialize:function(element,options){OpenLayers.Control.prototype.initialize.apply(this,[options]);this.element=OpenLayers.Util.getElement(element);},draw:function(){OpenLayers.Control.prototype.draw.apply(this,arguments);if(!this.element){this.element=document.createElement("div");this.div.appendChild(this.element);}
59760 this.map.events.register('moveend',this,this.updateScale);this.updateScale();return this.div;},updateScale:function(){var scale;if(this.geodesic===true){var units=this.map.getUnits();if(!units){return;}
59761 var inches=OpenLayers.INCHES_PER_UNIT;scale=(this.map.getGeodesicPixelSize().w||0.000001)*inches["km"]*OpenLayers.DOTS_PER_INCH;}else{scale=this.map.getScale();}
59762 if(!scale){return;}
59763 if(scale>=9500&&scale<=950000){scale=Math.round(scale/1000)+"K";}else if(scale>=950000){scale=Math.round(scale/1000000)+"M";}else{scale=Math.round(scale);}
59764 this.element.innerHTML=OpenLayers.i18n("scale",{'scaleDenom':scale});},CLASS_NAME:"OpenLayers.Control.Scale"});OpenLayers.Control.ScaleLine=OpenLayers.Class(OpenLayers.Control,{maxWidth:100,topOutUnits:"km",topInUnits:"m",bottomOutUnits:"mi",bottomInUnits:"ft",eTop:null,eBottom:null,geodesic:false,initialize:function(options){OpenLayers.Control.prototype.initialize.apply(this,[options]);},draw:function(){OpenLayers.Control.prototype.draw.apply(this,arguments);if(!this.eTop){this.eTop=document.createElement("div");this.eTop.className=this.displayClass+"Top";var theLen=this.topInUnits.length;this.div.appendChild(this.eTop);if((this.topOutUnits=="")||(this.topInUnits=="")){this.eTop.style.visibility="hidden";}else{this.eTop.style.visibility="visible";}
59765 this.eBottom=document.createElement("div");this.eBottom.className=this.displayClass+"Bottom";this.div.appendChild(this.eBottom);if((this.bottomOutUnits=="")||(this.bottomInUnits=="")){this.eBottom.style.visibility="hidden";}else{this.eBottom.style.visibility="visible";}}
59766 this.map.events.register('moveend',this,this.update);this.update();return this.div;},getBarLen:function(maxLen){var digits=parseInt(Math.log(maxLen)/Math.log(10));var pow10=Math.pow(10,digits);var firstChar=parseInt(maxLen/pow10);var barLen;if(firstChar>5){barLen=5;}else if(firstChar>2){barLen=2;}else{barLen=1;}
59767 return barLen*pow10;},update:function(){var res=this.map.getResolution();if(!res){return;}
59768 var curMapUnits=this.map.getUnits();var inches=OpenLayers.INCHES_PER_UNIT;var maxSizeData=this.maxWidth*res*inches[curMapUnits];var geodesicRatio=1;if(this.geodesic===true){var maxSizeGeodesic=(this.map.getGeodesicPixelSize().w||0.000001)*this.maxWidth;var maxSizeKilometers=maxSizeData/inches["km"];geodesicRatio=maxSizeGeodesic/maxSizeKilometers;maxSizeData*=geodesicRatio;}
59769 var topUnits;var bottomUnits;if(maxSizeData>100000){topUnits=this.topOutUnits;bottomUnits=this.bottomOutUnits;}else{topUnits=this.topInUnits;bottomUnits=this.bottomInUnits;}
59770 var topMax=maxSizeData/inches[topUnits];var bottomMax=maxSizeData/inches[bottomUnits];var topRounded=this.getBarLen(topMax);var bottomRounded=this.getBarLen(bottomMax);topMax=topRounded/inches[curMapUnits]*inches[topUnits];bottomMax=bottomRounded/inches[curMapUnits]*inches[bottomUnits];var topPx=topMax/res/geodesicRatio;var bottomPx=bottomMax/res/geodesicRatio;if(this.eBottom.style.visibility=="visible"){this.eBottom.style.width=Math.round(bottomPx)+"px";this.eBottom.innerHTML=bottomRounded+" "+bottomUnits;}
59771 if(this.eTop.style.visibility=="visible"){this.eTop.style.width=Math.round(topPx)+"px";this.eTop.innerHTML=topRounded+" "+topUnits;}},CLASS_NAME:"OpenLayers.Control.ScaleLine"});OpenLayers.Control.ZoomIn=OpenLayers.Class(OpenLayers.Control,{type:OpenLayers.Control.TYPE_BUTTON,trigger:function(){this.map.zoomIn();},CLASS_NAME:"OpenLayers.Control.ZoomIn"});OpenLayers.Control.ZoomOut=OpenLayers.Class(OpenLayers.Control,{type:OpenLayers.Control.TYPE_BUTTON,trigger:function(){this.map.zoomOut();},CLASS_NAME:"OpenLayers.Control.ZoomOut"});OpenLayers.Control.ZoomToMaxExtent=OpenLayers.Class(OpenLayers.Control,{type:OpenLayers.Control.TYPE_BUTTON,trigger:function(){if(this.map){this.map.zoomToMaxExtent();}},CLASS_NAME:"OpenLayers.Control.ZoomToMaxExtent"});OpenLayers.Event={observers:false,KEY_BACKSPACE:8,KEY_TAB:9,KEY_RETURN:13,KEY_ESC:27,KEY_LEFT:37,KEY_UP:38,KEY_RIGHT:39,KEY_DOWN:40,KEY_DELETE:46,element:function(event){return event.target||event.srcElement;},isLeftClick:function(event){return(((event.which)&&(event.which==1))||((event.button)&&(event.button==1)));},isRightClick:function(event){return(((event.which)&&(event.which==3))||((event.button)&&(event.button==2)));},stop:function(event,allowDefault){if(!allowDefault){if(event.preventDefault){event.preventDefault();}else{event.returnValue=false;}}
59772 if(event.stopPropagation){event.stopPropagation();}else{event.cancelBubble=true;}},findElement:function(event,tagName){var element=OpenLayers.Event.element(event);while(element.parentNode&&(!element.tagName||(element.tagName.toUpperCase()!=tagName.toUpperCase()))){element=element.parentNode;}
59773 return element;},observe:function(elementParam,name,observer,useCapture){var element=OpenLayers.Util.getElement(elementParam);useCapture=useCapture||false;if(name=='keypress'&&(navigator.appVersion.match(/Konqueror|Safari|KHTML/)||element.attachEvent)){name='keydown';}
59774 if(!this.observers){this.observers={};}
59775 if(!element._eventCacheID){var idPrefix="eventCacheID_";if(element.id){idPrefix=element.id+"_"+idPrefix;}
59776 element._eventCacheID=OpenLayers.Util.createUniqueID(idPrefix);}
59777 var cacheID=element._eventCacheID;if(!this.observers[cacheID]){this.observers[cacheID]=[];}
59778 this.observers[cacheID].push({'element':element,'name':name,'observer':observer,'useCapture':useCapture});if(element.addEventListener){element.addEventListener(name,observer,useCapture);}else if(element.attachEvent){element.attachEvent('on'+name,observer);}},stopObservingElement:function(elementParam){var element=OpenLayers.Util.getElement(elementParam);var cacheID=element._eventCacheID;this._removeElementObservers(OpenLayers.Event.observers[cacheID]);},_removeElementObservers:function(elementObservers){if(elementObservers){for(var i=elementObservers.length-1;i>=0;i--){var entry=elementObservers[i];var args=new Array(entry.element,entry.name,entry.observer,entry.useCapture);var removed=OpenLayers.Event.stopObserving.apply(this,args);}}},stopObserving:function(elementParam,name,observer,useCapture){useCapture=useCapture||false;var element=OpenLayers.Util.getElement(elementParam);var cacheID=element._eventCacheID;if(name=='keypress'){if(navigator.appVersion.match(/Konqueror|Safari|KHTML/)||element.detachEvent){name='keydown';}}
59779 var foundEntry=false;var elementObservers=OpenLayers.Event.observers[cacheID];if(elementObservers){var i=0;while(!foundEntry&&i<elementObservers.length){var cacheEntry=elementObservers[i];if((cacheEntry.name==name)&&(cacheEntry.observer==observer)&&(cacheEntry.useCapture==useCapture)){elementObservers.splice(i,1);if(elementObservers.length==0){delete OpenLayers.Event.observers[cacheID];}
59780 foundEntry=true;break;}
59781 i++;}}
59782 if(foundEntry){if(element.removeEventListener){element.removeEventListener(name,observer,useCapture);}else if(element&&element.detachEvent){element.detachEvent('on'+name,observer);}}
59783 return foundEntry;},unloadCache:function(){if(OpenLayers.Event&&OpenLayers.Event.observers){for(var cacheID in OpenLayers.Event.observers){var elementObservers=OpenLayers.Event.observers[cacheID];OpenLayers.Event._removeElementObservers.apply(this,[elementObservers]);}
59784 OpenLayers.Event.observers=false;}},CLASS_NAME:"OpenLayers.Event"};OpenLayers.Event.observe(window,'unload',OpenLayers.Event.unloadCache,false);if(window.Event){OpenLayers.Util.applyDefaults(window.Event,OpenLayers.Event);}else{var Event=OpenLayers.Event;}
59785 OpenLayers.Events=OpenLayers.Class({BROWSER_EVENTS:["mouseover","mouseout","mousedown","mouseup","mousemove","click","dblclick","rightclick","dblrightclick","resize","focus","blur"],listeners:null,object:null,element:null,eventTypes:null,eventHandler:null,fallThrough:null,includeXY:false,clearMouseListener:null,initialize:function(object,element,eventTypes,fallThrough,options){OpenLayers.Util.extend(this,options);this.object=object;this.fallThrough=fallThrough;this.listeners={};this.eventHandler=OpenLayers.Function.bindAsEventListener(this.handleBrowserEvent,this);this.clearMouseListener=OpenLayers.Function.bind(this.clearMouseCache,this);this.eventTypes=[];if(eventTypes!=null){for(var i=0,len=eventTypes.length;i<len;i++){this.addEventType(eventTypes[i]);}}
59786 if(element!=null){this.attachToElement(element);}},destroy:function(){if(this.element){OpenLayers.Event.stopObservingElement(this.element);if(this.element.hasScrollEvent){OpenLayers.Event.stopObserving(window,"scroll",this.clearMouseListener);}}
59787 this.element=null;this.listeners=null;this.object=null;this.eventTypes=null;this.fallThrough=null;this.eventHandler=null;},addEventType:function(eventName){if(!this.listeners[eventName]){this.eventTypes.push(eventName);this.listeners[eventName]=[];}},attachToElement:function(element){if(this.element){OpenLayers.Event.stopObservingElement(this.element);}
59788 this.element=element;for(var i=0,len=this.BROWSER_EVENTS.length;i<len;i++){var eventType=this.BROWSER_EVENTS[i];this.addEventType(eventType);OpenLayers.Event.observe(element,eventType,this.eventHandler);}
59789 OpenLayers.Event.observe(element,"dragstart",OpenLayers.Event.stop);},on:function(object){for(var type in object){if(type!="scope"){this.register(type,object.scope,object[type]);}}},register:function(type,obj,func){if((func!=null)&&(OpenLayers.Util.indexOf(this.eventTypes,type)!=-1)){if(obj==null){obj=this.object;}
59790 var listeners=this.listeners[type];listeners.push({obj:obj,func:func});}},registerPriority:function(type,obj,func){if(func!=null){if(obj==null){obj=this.object;}
59791 var listeners=this.listeners[type];if(listeners!=null){listeners.unshift({obj:obj,func:func});}}},un:function(object){for(var type in object){if(type!="scope"){this.unregister(type,object.scope,object[type]);}}},unregister:function(type,obj,func){if(obj==null){obj=this.object;}
59792 var listeners=this.listeners[type];if(listeners!=null){for(var i=0,len=listeners.length;i<len;i++){if(listeners[i].obj==obj&&listeners[i].func==func){listeners.splice(i,1);break;}}}},remove:function(type){if(this.listeners[type]!=null){this.listeners[type]=[];}},triggerEvent:function(type,evt){var listeners=this.listeners[type];if(!listeners||listeners.length==0){return;}
59793 if(evt==null){evt={};}
59794 evt.object=this.object;evt.element=this.element;if(!evt.type){evt.type=type;}
59795 var listeners=listeners.slice(),continueChain;for(var i=0,len=listeners.length;i<len;i++){var callback=listeners[i];continueChain=callback.func.apply(callback.obj,[evt]);if((continueChain!=undefined)&&(continueChain==false)){break;}}
59796 if(!this.fallThrough){OpenLayers.Event.stop(evt,true);}
59797 return continueChain;},handleBrowserEvent:function(evt){if(this.includeXY){evt.xy=this.getMousePosition(evt);}
59798 this.triggerEvent(evt.type,evt);},clearMouseCache:function(){this.element.scrolls=null;this.element.lefttop=null;this.element.offsets=null;},getMousePosition:function(evt){if(!this.includeXY){this.clearMouseCache();}else if(!this.element.hasScrollEvent){OpenLayers.Event.observe(window,"scroll",this.clearMouseListener);this.element.hasScrollEvent=true;}
59799 if(!this.element.scrolls){this.element.scrolls=[(document.documentElement.scrollLeft||document.body.scrollLeft),(document.documentElement.scrollTop||document.body.scrollTop)];}
59800 if(!this.element.lefttop){this.element.lefttop=[(document.documentElement.clientLeft||0),(document.documentElement.clientTop||0)];}
59801 if(!this.element.offsets){this.element.offsets=OpenLayers.Util.pagePosition(this.element);this.element.offsets[0]+=this.element.scrolls[0];this.element.offsets[1]+=this.element.scrolls[1];}
59802 return new OpenLayers.Pixel((evt.clientX+this.element.scrolls[0])-this.element.offsets[0]
59803 -this.element.lefttop[0],(evt.clientY+this.element.scrolls[1])-this.element.offsets[1]
59804 -this.element.lefttop[1]);},CLASS_NAME:"OpenLayers.Events"});OpenLayers.Format=OpenLayers.Class({options:null,externalProjection:null,internalProjection:null,data:null,keepData:false,initialize:function(options){OpenLayers.Util.extend(this,options);this.options=options;},destroy:function(){},read:function(data){OpenLayers.Console.userError(OpenLayers.i18n("readNotImplemented"));},write:function(object){OpenLayers.Console.userError(OpenLayers.i18n("writeNotImplemented"));},CLASS_NAME:"OpenLayers.Format"});OpenLayers.Lang["ar"]=OpenLayers.Util.applyDefaults({'permalink':"وصلة دائمة",'baseLayer':"الطبقة الاساسية",'readNotImplemented':"القراءة غير محققة.",'writeNotImplemented':"الكتابة غير محققة",'errorLoadingGML':"خطأ عند تحميل الملف جي ام ال ${url}",'scale':"النسبة = 1 : ${scaleDenom}",'W':"غ",'E':"شر",'N':"شم",'S':"ج"});OpenLayers.Lang["be-tarask"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Неапрацаваны вынік запыту ${statusText}",'permalink':"Сталая спасылка",'overlays':"Слаі",'baseLayer':"Базавы слой",'sameProjection':"Аглядная мапа працуе толькі калі яна мае тую ж праекцыю, што і асноўная мапа",'readNotImplemented':"Функцыянальнасьць чытаньня ня створаная.",'writeNotImplemented':"Функцыянальнасьць запісу ня створаная.",'noFID':"Немагчыма абнавіць магчымасьць, для якога не існуе FID.",'errorLoadingGML':"Памылка загрузкі файла GML ${url}",'browserNotSupported':"Ваш браўзэр не падтрымлівае вэктарную графіку. У цяперашні момант падтрымліваюцца: ${renderers}",'componentShouldBe':"addFeatures : кампанэнт павінен быць ${geomType}",'getFeatureError':"getFeatureFromEvent выкліканы для слоя бяз рэндэру. Звычайна гэта азначае, што Вы зьнішчылі слой, але пакінулі зьвязаны зь ім апрацоўшчык.",'minZoomLevelError':"Уласьцівасьць minZoomLevel прызначана толькі для выкарыстаньня са слаямі вытворнымі ад FixedZoomLevels. Тое, што  гэты wfs-слой правяраецца на minZoomLevel — рэха прошлага. Але мы ня можам выдаліць гэтую магчымасьць, таму што ад яе залежаць некаторыя заснаваныя на OL дастасаваньні. Тым ня менш, праверка minZoomLevel будзе выдаленая ў вэрсіі 3.0. Калі ласка, выкарыстоўваеце замест яе ўстаноўкі мінімальнага/максымальнага памераў, як апісана тут: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"WFS-транзакцыя: ПОСЬПЕХ ${response}",'commitFailed':"WFS-транзакцыя: ПАМЫЛКА ${response}",'googleWarning':"Не атрымалася загрузіць слой Google. \x3cbr\x3e\x3cbr\x3eКаб пазбавіцца гэтага паведамленьня, выберыце новы базавы слой у сьпісе ў верхнім правым куце.\x3cbr\x3e\x3cbr\x3e Хутчэй за ўсё, прычына ў тым, што скрыпт бібліятэкі Google Maps ня быў уключаныя альбо не ўтрымлівае слушны API-ключ для Вашага сайта.\x3cbr\x3e\x3cbr\x3eРаспрацоўшчыкам: Для таго, каб даведацца як зрабіць так, каб усё працавала, \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eнацісьніце тут\x3c/a\x3e",'getLayerWarning':"Немагчыма загрузіць слой ${layerType}.\x3cbr\x3e\x3cbr\x3eКаб пазбавіцца гэтага паведамленьня, выберыце новы базавы слой у сьпісе ў верхнім правым куце.\x3cbr\x3e\x3cbr\x3eХутчэй за ўсё, прычына ў тым, што скрыпт бібліятэкі ${layerLib} ня быў слушна ўключаны.\x3cbr\x3e\x3cbr\x3eРаспрацоўшчыкам: Для таго, каб даведацца як зрабіць так, каб усё працавала, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eнацісьніце тут\x3c/a\x3e",'scale':"Маштаб = 1 : ${scaleDenom}",'W':"З",'E':"У",'N':"Пн",'S':"Пд",'layerAlreadyAdded':"Вы паспрабавалі дадаць слой ${layerName} на мапу, але ён ужо дададзены",'reprojectDeprecated':"Вы выкарыстоўваеце ўстаноўку \'reproject\' для слоя ${layerName}. Гэтая ўстаноўка зьяўляецца састарэлай: яна выкарыстоўвалася для падтрымкі паказу зьвестак на камэрцыйных базавых мапах, але гэта функцыя цяпер рэалізаваная ў убудаванай падтрымцы сфэрычнай праекцыі Мэркатара. Дадатковая інфармацыя ёсьць на http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Гэты мэтад састарэлы і будзе выдалены ў вэрсіі 3.0. Калі ласка, замест яго выкарыстоўвайце ${newMethod}.",'boundsAddError':"Вам неабходна падаць абодва значэньні x і y для функцыі складаньня.",'lonlatAddError':"Вам неабходна падаць абодва значэньні lon і lat для функцыі складаньня.",'pixelAddError':"Вам неабходна падаць абодва значэньні x і y для функцыі складаньня.",'unsupportedGeometryType':"Тып геамэтрыі не падтрымліваецца: ${geomType}",'pagePositionFailed':"OpenLayers.Util.pagePosition failed: верагодна элемэнт з ідэнтыфікатарам ${elemId} займае няслушнае месца.",'filterEvaluateNotImplemented':"evaluate не рэалізаваны для гэтага тыпу фільтру."});OpenLayers.Lang["bg"]=OpenLayers.Util.applyDefaults({'permalink':"Постоянна препратка",'baseLayer':"Основен слой",'errorLoadingGML':"Грешка при зареждане на GML файл ${url}",'scale':"Мащаб = 1 : ${scaleDenom}",'layerAlreadyAdded':"Опитахте да добавите слой ${layerName} в картата, но той вече е добавен",'methodDeprecated':"Този метод е остарял и ще бъде премахват в 3.0. Вместо него използвайте ${newMethod}."});OpenLayers.Lang["br"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Distro evel reked anveret ${statusText}",'permalink':"Peurliamm",'overlays':"Gwiskadoù",'baseLayer':"Gwiskad diazez",'sameProjection':"Ne\'z ar gartenn lec\'hiañ en-dro nemet pa vez heñvel ar banndres anezhi ha hini ar gartenn bennañ",'readNotImplemented':"N\'eo ket emplementet al lenn.",'writeNotImplemented':"N\'eo ket emplementet ar skrivañ.",'noFID':"N\'haller ket hizivaat un elfenn ma n\'eus ket a niverenn-anaout (FID) eviti.",'errorLoadingGML':"Fazi e-ser kargañ ar restr GML ${url}",'browserNotSupported':"N\'eo ket skoret an daskor vektorel gant ho merdeer. Setu aze an daskorerioù skoret evit ar poent :\n${renderers}",'componentShouldBe':"addFeatures : bez\' e tlefe ar parzh besañ eus ar seurt ${geomType}",'getFeatureError':"Galvet eo bet getFeatureFromEvent called war ur gwiskad hep daskorer. Kement-se a dalvez ez eus bet freuzet ur gwiskad hag hoc\'h eus miret un embreger bennak stag outañ.",'minZoomLevelError':"Ne zleer implijout ar perzh minZoomLevel nemet evit gwiskadoù FixedZoomLevels-descendent. Ar fed ma wiria ar gwiskad WHS-se hag-eñ ez eus eus minZoomLevel zo un aspadenn gozh. Koulskoude n\'omp ket evit e ziverkañ kuit da derriñ arloadoù diazezet war OL a c\'hallfe bezañ stag outañ. Setu perak eo dispredet -- Lamet kuit e vo ar gwiriañ minZoomLevel a-is er stumm 3.0. Ober gant an arventennoù bihanañ/brasañ evel deskrivet amañ e plas : http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Treuzgread WFS : MAT EO ${response}",'commitFailed':"Treuzgread WFS Transaction: C\'HWITET ${response}",'googleWarning':"N\'eus ket bet gallet kargañ ar gwiskad Google ent reizh.\x3cbr\x3e\x3cbr\x3eEvit en em zizober eus ar c\'hemenn-mañ, dibabit ur BaseLayer nevez en diuzer gwiskadoù er c\'horn dehoù el laez.\x3cbr\x3e\x3cbr\x3eSur a-walc\'h eo peogwir n\'eo ket bet ensoc\'het levraoueg Google Maps pe neuze ne glot ket an alc\'hwez API gant ho lec\'hienn.\x3cbr\x3e\x3cbr\x3eDiorroerien : Evit reizhañ an dra-se, \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eclick here\x3c/a\x3e",'getLayerWarning':"N\'haller ket kargañ ar gwiskad ${layerType} ent reizh.\x3cbr\x3e\x3cbr\x3eEvit en em zizober eus ar c\'hemenn-mañ, dibabit ur BaseLayer nevez en diuzer gwiskadoù er c\'horn dehoù el laez.\x3cbr\x3e\x3cbr\x3eSur a-walc\'h eo peogwir n\'eo ket bet ensoc\'het mat al levraoueg ${layerLib}.\x3cbr\x3e\x3cbr\x3eDiorroerien : Evit gouzout penaos reizhañ an dra-se, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eclick here\x3c/a\x3e",'scale':"Skeul = 1 : ${scaleDenom}",'W':"K",'E':"R",'N':"N",'S':"S",'layerAlreadyAdded':"Klasket hoc\'h eus ouzhpennañ ar gwiskad : ${layerName} d\'ar gartenn, met ouzhpennet e oa bet c\'hoazh",'reprojectDeprecated':"Emaoc\'h oc\'h implijout an dibarzh \'reproject\' war ar gwiskad ${layerName}. Dispredet eo an dibarzh-mañ : bet eo hag e talveze da ziskwel roadennoù war-c\'horre kartennoù diazez kenwerzhel, un dra hag a c\'haller ober bremañ gant an arc\'hwel dre skor banndres boullek Mercator. Muioc\'h a ditouroù a c\'haller da gaout war http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Dispredet eo an daore-se ha tennet e vo kuit eus ar stumm 3.0. Grit gant ${newMethod} e plas.",'boundsAddError':"Rekis eo tremen an div dalvoudenn x ha y d\'an arc\'hwel add.",'lonlatAddError':"Rekis eo tremen an div dalvoudenn hedred ha ledred d\'an arc\'hwel add.",'pixelAddError':"Rekis eo tremen an div dalvoudenn x ha y d\'an arc\'hwel add.",'unsupportedGeometryType':"Seurt mentoniezh anskoret : ${geomType}",'pagePositionFailed':"C\'hwitet eo OpenLayers.Util.pagePosition : marteze emañ lec\'hiet fall an elfenn id ${elemId}.",'filterEvaluateNotImplemented':"N\'eo ket bet emplementet ar priziañ evit seurt siloù c\'hoazh."});OpenLayers.Lang["el"]=OpenLayers.Util.applyDefaults({'scale':"Κλίμακα ~ 1 : ${scaleDenom}"});OpenLayers.Lang.en={'unhandledRequest':"Unhandled request return ${statusText}",'permalink':"Permalink",'overlays':"Overlays",'baseLayer':"Base Layer",'sameProjection':"The overview map only works when it is in the same projection as the main map",'readNotImplemented':"Read not implemented.",'writeNotImplemented':"Write not implemented.",'noFID':"Can't update a feature for which there is no FID.",'errorLoadingGML':"Error in loading GML file ${url}",'browserNotSupported':"Your browser does not support vector rendering. Currently supported renderers are:\n${renderers}",'componentShouldBe':"addFeatures : component should be an ${geomType}",'getFeatureError':"getFeatureFromEvent called on layer with no renderer. This usually means you "+"destroyed a layer, but not some handler which is associated with it.",'minZoomLevelError':"The minZoomLevel property is only intended for use "+"with the FixedZoomLevels-descendent layers. That this "+"wfs layer checks for minZoomLevel is a relic of the"+"past. We cannot, however, remove it without possibly "+"breaking OL based applications that may depend on it."+" Therefore we are deprecating it -- the minZoomLevel "+"check below will be removed at 3.0. Please instead "+"use min/max resolution setting as described here: "+"http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"WFS Transaction: SUCCESS ${response}",'commitFailed':"WFS Transaction: FAILED ${response}",'googleWarning':"The Google Layer was unable to load correctly.<br><br>"+"To get rid of this message, select a new BaseLayer "+"in the layer switcher in the upper-right corner.<br><br>"+"Most likely, this is because the Google Maps library "+"script was either not included, or does not contain the "+"correct API key for your site.<br><br>"+"Developers: For help getting this working correctly, "+"<a href='http://trac.openlayers.org/wiki/Google' "+"target='_blank'>click here</a>",'getLayerWarning':"The ${layerType} Layer was unable to load correctly.<br><br>"+"To get rid of this message, select a new BaseLayer "+"in the layer switcher in the upper-right corner.<br><br>"+"Most likely, this is because the ${layerLib} library "+"script was not correctly included.<br><br>"+"Developers: For help getting this working correctly, "+"<a href='http://trac.openlayers.org/wiki/${layerLib}' "+"target='_blank'>click here</a>",'scale':"Scale = 1 : ${scaleDenom}",'W':'W','E':'E','N':'N','S':'S','graticule':'Graticule','layerAlreadyAdded':"You tried to add the layer: ${layerName} to the map, but it has already been added",'reprojectDeprecated':"You are using the 'reproject' option "+"on the ${layerName} layer. This option is deprecated: "+"its use was designed to support displaying data over commercial "+"basemaps, but that functionality should now be achieved by using "+"Spherical Mercator support. More information is available from "+"http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"This method has been deprecated and will be removed in 3.0. "+"Please use ${newMethod} instead.",'boundsAddError':"You must pass both x and y values to the add function.",'lonlatAddError':"You must pass both lon and lat values to the add function.",'pixelAddError':"You must pass both x and y values to the add function.",'unsupportedGeometryType':"Unsupported geometry type: ${geomType}",'pagePositionFailed':"OpenLayers.Util.pagePosition failed: element with id ${elemId} may be misplaced.",'filterEvaluateNotImplemented':"evaluate is not implemented for this filter type.",'end':''};OpenLayers.Lang["fi"]=OpenLayers.Util.applyDefaults({'permalink':"Ikilinkki",'overlays':"Kerrokset",'baseLayer':"Peruskerros",'sameProjection':"Yleiskuvakarttaa voi käyttää vain, kun sillä on sama projektio kuin pääkartalla.",'W':"L",'E':"I",'N':"P",'S':"E"});OpenLayers.Lang["fur"]=OpenLayers.Util.applyDefaults({'permalink':"Leam Permanent",'overlays':"Livei parsore",'baseLayer':"Livel di base",'browserNotSupported':"Il to sgarfadôr nol supuarte la renderizazion vetoriâl. Al moment a son supuartâts:\n${renderers}",'scale':"Scjale = 1 : ${scaleDenom}",'W':"O",'E':"E",'N':"N",'S':"S"});OpenLayers.Lang["gl"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Solicitude non xerada; a resposta foi: ${statusText}",'permalink':"Ligazón permanente",'overlays':"Capas superpostas",'baseLayer':"Capa base",'sameProjection':"A vista xeral do mapa só funciona cando está na mesma proxección có mapa principal",'readNotImplemented':"Lectura non implementada.",'writeNotImplemented':"Escritura non implementada.",'noFID':"Non se pode actualizar a funcionalidade para a que non hai FID.",'errorLoadingGML':"Erro ao cargar o ficheiro GML ${url}",'browserNotSupported':"O seu navegador non soporta a renderización de vectores. Os renderizadores soportados actualmente son:\n${renderers}",'componentShouldBe':"addFeatures: o compoñente debera ser de tipo ${geomType}",'getFeatureError':"getFeatureFromEvent ten sido chamado a unha capa sen renderizador. Isto normalmente significa que destruíu unha capa, mais non o executador que está asociado con ela.",'minZoomLevelError':"A propiedade minZoomLevel é só para uso conxuntamente coas capas FixedZoomLevels-descendent. O feito de que esa capa wfs verifique o minZoomLevel é unha reliquia do pasado. Non podemos, con todo, eliminala sen a posibilidade de non romper as aplicacións baseadas en OL que poidan depender dela. Por iso a estamos deixando obsoleta (a comprobación minZoomLevel de embaixo será eliminada na versión 3.0). Por favor, no canto diso use o axuste de resolución mín/máx tal e como está descrito aquí: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Transacción WFS: ÉXITO ${response}",'commitFailed':"Transacción WFS: FALLIDA ${response}",'googleWarning':"A capa do Google non puido cargarse correctamente.\x3cbr\x3e\x3cbr\x3ePara evitar esta mensaxe, escolla unha nova capa base no seleccionador de capas na marxe superior dereita.\x3cbr\x3e\x3cbr\x3eProbablemente, isto acontece porque a escritura da libraría do Google Maps ou ben non foi incluída ou ben non contén a clave API correcta para o seu sitio.\x3cbr\x3e\x3cbr\x3eDesenvolvedores: para axudar a facer funcionar isto correctamente, \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3epremede aquí\x3c/a\x3e",'getLayerWarning':"A capa ${layerType} foi incapaz de cargarse correctamente.\x3cbr\x3e\x3cbr\x3ePara evitar esta mensaxe, escolla unha nova capa base no seleccionador de capas na marxe superior dereita.\x3cbr\x3e\x3cbr\x3eProbablemente, isto acontece porque a escritura da libraría ${layerLib} non foi ben incluída.\x3cbr\x3e\x3cbr\x3eDesenvolvedores: para axudar a facer funcionar isto correctamente, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3epremede aquí\x3c/a\x3e",'scale':"Escala = 1 : ${scaleDenom}",'W':"O",'E':"L",'N':"N",'S':"S",'layerAlreadyAdded':"Intentou engadir a capa: ${layerName} ao mapa, pero xa fora engadida",'reprojectDeprecated':"Está usando a opción \"reproject\" na capa ${layerName}. Esta opción está obsoleta: o seu uso foi deseñado para a visualización de datos sobre mapas base comerciais, pero esta funcionalidade debera agora ser obtida utilizando a proxección Spherical Mercator. Hai dispoñible máis información en http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Este método está obsoleto e será eliminado na versión 3.0. Por favor, no canto deste use ${newMethod}.",'boundsAddError':"Debe achegar os valores x e y á función add.",'lonlatAddError':"Debe achegar tanto o valor lon coma o lat á función add.",'pixelAddError':"Debe achegar os valores x e y á función add.",'unsupportedGeometryType':"Tipo xeométrico non soportado: ${geomType}",'pagePositionFailed':"OpenLayers.Util.pagePosition fallou: o elemento con id ${elemId} pode non estar na súa posición.",'filterEvaluateNotImplemented':"avaliar non está implementado para este tipo de filtro."});OpenLayers.Lang["gsw"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Nit behandleti Aafrogsruckmäldig ${statusText}",'permalink':"Permalink",'overlays':"Iberlagerige",'baseLayer':"Grundcharte",'sameProjection':"D Ibersichts-Charte funktioniert nume, wänn si di glych Projäktion brucht wie d Hauptcharte",'readNotImplemented':"Läse nit implementiert.",'writeNotImplemented':"Schrybe nit implementiert.",'noFID':"E Feature, wu s kei FID derfir git, cha nit aktualisiert wäre.",'errorLoadingGML':"Fähler bim Lade vu dr GML-Datei ${url}",'browserNotSupported':"Dyy Browser unterstitzt kei Vektordarstellig. Aktuäll unterstitzti Renderer:\n${renderers}",'componentShouldBe':"addFeatures : Komponänt sott dr Typ ${geomType} syy",'getFeatureError':"getFeatureFromEvent isch uf eme Layer ohni Renderer ufgruefe wore. Des heisst normalerwys, ass Du e Layer kaputt gmacht hesch, aber nit dr Handler, wu derzue ghert.",'minZoomLevelError':"D minZoomLevel-Eigeschaft isch nume dänk fir d Layer, wu vu dr FixedZoomLevels abstamme. Ass dää wfs-Layer minZoomLevel prieft, scih e Relikt us dr Vergangeheit. Mir chenne s aber nit ändere ohni OL_basierti Aawändige villicht kaputt gehn, wu dervu abhänge.  Us däm Grund het die Funktion d Eigeschaft \'deprecated\' iberchuu. D minZoomLevel-Priefig unte wird in dr Version 3.0 usegnuu. Bitte verwänd statt däm e min/max-Uflesig wie s do bschriben isch: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"WFS-Transaktion: ERFOLGRYCH ${response}",'commitFailed':"WFS-Transaktion: FÄHLGSCHLAA ${response}",'googleWarning':"Dr Google-Layer het nit korräkt chenne glade wäre.\x3cbr\x3e\x3cbr\x3eGo die Mäldig nimi z kriege, wehl e andere Hintergrundlayer us em LayerSwitcher im rächte obere Ecke.\x3cbr\x3e\x3cbr\x3eDää Fähler git s seli hyfig, wel s Skript vu dr Google-Maps-Bibliothek nit yybunde woren isch oder wel s kei giltige API-Schlissel fir Dyy URL din het.\x3cbr\x3e\x3cbr\x3eEntwickler: Fir Hilf zum korräkte Yybinde vum Google-Layer \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3edoo drucke\x3c/a\x3e",'getLayerWarning':"Dr ${layerType}-Layer het nit korräkt chenne glade wäre.\x3cbr\x3e\x3cbr\x3eGo die Mäldig nimi z kriege, wehl e andere Hintergrundlayer us em LayerSwitcher im rächte obere Ecke.\x3cbr\x3e\x3cbr\x3eDää Fähler git s seli hyfig, wel s Skript vu dr \'${layerLib}\'-Bibliothek nit yybunde woren isch oder wel s kei giltige API-Schlissel fir Dyy URL din het.\x3cbr\x3e\x3cbr\x3eEntwickler: Fir Hilf zum korräkte Yybinde vu Layer \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3edoo drucke\x3c/a\x3e",'scale':"Maßstab = 1 : ${scaleDenom}",'W':"W",'E':"O",'N':"N",'S':"S",'layerAlreadyAdded':"Du hesch versuecht dää Layer in d Charte yyzfiege: ${layerName}, aber är isch schoi yygfiegt",'reprojectDeprecated':"Du bruchsch d \'reproject\'-Option bim ${layerName}-Layer. Die Option isch nimi giltig: si isch aagleit wore go   Date iber kommerziälli Grundcharte lege, aber des sott mer jetz mache mit dr Unterstitzig vu Spherical Mercator. Meh Informatione git s uf http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Die Methode isch veraltet un wird us dr Version 3.0 usegnuu. Bitte verwäbnd statt däm ${newMethod}.",'boundsAddError':"Du muesch e x-Wärt un e y-Wärt yygee bi dr Zuefieg-Funktion",'lonlatAddError':"Du meusch e Lengi- un e Breiti-Grad yygee bi dr Zuefieg-Funktion.",'pixelAddError':"Du muesch x- un y-Wärt aagee bi dr Zuefieg-Funktion.",'unsupportedGeometryType':"Nit unterstitze Geometrii-Typ: ${geomType}",'pagePositionFailed':"OpenLayers.Util.pagePosition fählgschlaa: Elemänt mit ID ${elemId} isch villicht falsch gsetzt.",'filterEvaluateNotImplemented':"evaluiere isch nit implemäntiert in däm Filtertyp."});OpenLayers.Lang["hr"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Nepodržani zahtjev ${statusText}",'permalink':"Permalink",'overlays':"Overlays",'baseLayer':"Osnovna karta",'sameProjection':"Pregledna karta radi jedino kao je u istoj projekciji kao i glava karta",'readNotImplemented':"Čitanje nije implementirano.",'writeNotImplemented':"Pisanje nije implementirano.",'noFID':"Ne mogu ažurirati značajku za koju ne postoji FID.",'errorLoadingGML':"Greška u učitavanju GML datoteke ${url}",'browserNotSupported':"Vaš preglednik ne podržava vektorsko renderiranje. Trenutno podržani rendereri su: ${renderers}",'componentShouldBe':"addFeatures : komponenta bi trebala biti ${geomType}",'getFeatureError':"getFeatureFromEvent je pozvao Layer bez renderera. Ovo obično znači da ste uništiili Layer, a ne neki Handler koji je povezan s njim.",'commitSuccess':"WFS Transakcija: USPJEŠNA ${response}",'commitFailed':"WFS Transakcija: NEUSPJEŠNA ${response}",'scale':"Mjerilo = 1 : ${scaleDenom}",'layerAlreadyAdded':"Pokušali ste dodati layer:  ${layerName} na kartu, ali je već dodan",'methodDeprecated':"Ova metoda nije odobrena i biti će maknuta u 3.0. Koristite ${newMethod}.",'boundsAddError':"Morate dati obje vrijednosti ,  x i y  da bi dodali funkciju.",'lonlatAddError':"Morate dati obje vrijednosti , (lon i lat) da bi dodali funkciju.",'pixelAddError':"Morate dati obje vrijednosti ,  x i y  da bi dodali funkciju.",'unsupportedGeometryType':"Nepodržani tip geometrije: ${geomType}",'pagePositionFailed':"OpenLayers.Util.pagePosition nije uspjelo: element sa id ${elemId} može biti krivo smješten."});OpenLayers.Lang["hsb"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Wotmołwa njewobdźěłaneho naprašowanja ${statusText}",'permalink':"Trajny wotkaz",'overlays':"Naworštowanja",'baseLayer':"Zakładna runina",'sameProjection':"Přehladowa karta jenož funguje, hdyž je w samsnej projekciji kaž hłowna karta",'readNotImplemented':"Čitanje njeimplementowane.",'writeNotImplemented':"Pisanje njeimplementowane.",'noFID':"Funkcija, za kotruž FID njeje, njeda so aktualizować.",'errorLoadingGML':"Zmylk při začitowanju dataje ${url}",'browserNotSupported':"Twój wobhladowak wektorowe rysowanje njepodpěruje. Tuchwilu podpěrowane rysowaki su:\n${renderers}",'componentShouldBe':"addFeatures: komponenta měła ${geomType} być",'getFeatureError':"getFeatureFromEvent bu na woršće bjez rysowak zawołany. To zwjetša woznamjenja, zo sy worštu zničił, ale nic wobdźěłak, kotryž je z njej zwjazany.",'minZoomLevelError':"Kajkosć minZoomLevel je jenož za wužiwanje z worštami myslena, kotrež wot FixedZoomLevels pochadźeja. Zo tuta woršta wfs za minZoomLevel přepruwuje, je relikt zańdźenosće. Njemóžemy wšak ju wotstronić, bjeztoho zo aplikacije, kotrež na OpenLayers bazěruja a snano tutu kajkosć wužiwaja, hižo njefunguja. Tohodla smy ju jako zestarjenu woznamjenili -- přepruwowanje za minZoomLevel budu so we wersiji 3.0 wotstronjeć. Prošu wužij město toho nastajenje min/max, kaž je tu wopisane: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"WFS-Transakcija: WUSPĚŠNA ${response}",'commitFailed':"WFS-Transakcija: NJEPORADŹENA ${response}",'googleWarning':"Woršta Google njemóžeše so korektnje začitać.\x3cbr\x3e\x3cbr\x3eZo by tutu zdźělenku wotbył, wubjer nowy BaseLayer z wuběra worštow horjeka naprawo.\x3cbr\x3e\x3cbr\x3eNajskerje so to stawa, dokelž skript biblioteki Google Maps pak njebu zapřijaty pak njewobsahuje korektny kluč API za twoje sydło.\x3cbr\x3e\x3cbr\x3eWuwiwarjo: Za pomoc ke korektnemu fungowanju worštow\n\x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3etu kliknyć\x3c/a\x3e",'getLayerWarning':"Woršta ${layerType} njemóžeše so korektnje začitać.\x3cbr\x3e\x3cbr\x3eZo by tutu zdźělenku wotbył, wubjer nowy BaseLayer z wuběra worštow horjeka naprawo.\x3cbr\x3e\x3cbr\x3eNajskerje so to stawa, dokelž skript biblioteki ${layerLib} njebu korektnje zapřijaty.\x3cbr\x3e\x3cbr\x3eWuwiwarjo: Za pomoc ke korektnemu fungowanju worštow\n\x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3etu kliknyć\x3c/a\x3e",'scale':"Měritko = 1 : ${scaleDenom}",'W':"Z",'E':"W",'N':"S",'S':"J",'layerAlreadyAdded':"Sy spytał runinu ${layerName} karće dodać, ale je so hižo dodała",'reprojectDeprecated':"Wužiwaš opciju \"reproject\" wořšty ${layerName}. Tuta opcija je zestarjena: jeje wužiwanje bě myslene, zo by zwobraznjenje datow nad komercielnymi bazowymi kartami podpěrało, ale funkcionalnosć měła so nětko z pomocu Sperical Mercator docpěć. Dalše informacije steja na http://trac.openlayers.org/wiki/SphericalMercator k dispoziciji.",'methodDeprecated':"Tuta metoda je so njeschwaliła a budźe so w 3.0 wotstronjeć. Prošu wužij ${newMethod} město toho.",'boundsAddError':"Dyrbiš hódnotu x kaž tež y funkciji \"add\" přepodać.",'lonlatAddError':"Dyrbiš hódnotu lon kaž tež lat funkciji \"add\" přepodać.",'pixelAddError':"Dyrbiš hódnotu x kaž tež y funkciji \"add\" přepodać.",'unsupportedGeometryType':"Njepodpěrowany geometrijowy typ: ${geomType}",'pagePositionFailed':"OpenLayers.Util.pagePosition je so njeporadźił: element z id ${elemId} bu snano wopak zaměstnjeny.",'filterEvaluateNotImplemented':"wuhódnoćenje njeje za tutón filtrowy typ implementowany."});OpenLayers.Lang["hu"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Nem kezelt kérés visszatérése ${statusText}",'permalink':"Permalink",'overlays':"Rávetítések",'baseLayer':"Alapréteg",'sameProjection':"Az áttekintő térkép csak abban az esetben működik, ha ugyanazon a vetületen van, mint a fő térkép.",'readNotImplemented':"Olvasás nincs végrehajtva.",'writeNotImplemented':"Írás nincs végrehajtva.",'noFID':"Nem frissíthető olyan jellemző, amely nem rendelkezik FID-del.",'errorLoadingGML':"Hiba GML-fájl betöltésekor ${url}",'browserNotSupported':"A böngészője nem támogatja a vektoros renderelést. A jelenleg támogatott renderelők:\n${renderers}",'componentShouldBe':"addFeatures : az összetevőnek ilyen típusúnak kell lennie: ${geomType}",'getFeatureError':"getFeatureFromEvent réteget hívott meg renderelő nélkül. Ez rendszerint azt jelenti, hogy megsemmisített egy fóliát, de néhány ahhoz társított kezelőt nem.",'minZoomLevelError':"A minZoomLevel tulajdonságot csak a következővel való használatra szánták: FixedZoomLevels-leszármazott fóliák. Ez azt jelenti, hogy a minZoomLevel wfs fólia jelölőnégyzetei már a múlté. Mi azonban nem távolíthatjuk el annak a veszélye nélkül, hogy az esetlegesen ettől függő OL alapú alkalmazásokat tönkretennénk. Ezért ezt érvénytelenítjük -- a minZoomLevel az alul levő jelölőnégyzet a 3.0-s verzióból el lesz távolítva. Kérjük, helyette használja a  min/max felbontás beállítást, amelyről az alábbi helyen talál leírást: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"WFS tranzakció: SIKERES ${response}",'commitFailed':"WFS tranzakció: SIKERTELEN ${response}",'googleWarning':"A Google fólia betöltése sikertelen.\x3cbr\x3e\x3cbr\x3eAhhoz, hogy ez az üzenet eltűnjön, válasszon egy új BaseLayer fóliát a jobb felső sarokban található fóliakapcsoló segítségével.\x3cbr\x3e\x3cbr\x3eNagy valószínűséggel ez azért van, mert a Google Maps könyvtár parancsfájlja nem található, vagy nem tartalmazza az Ön oldalához tartozó megfelelő API-kulcsot.\x3cbr\x3e\x3cbr\x3eFejlesztőknek: A helyes működtetésre vonatkozó segítség az alábbi helyen érhető el, \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3ekattintson ide\x3c/a\x3e",'getLayerWarning':"A(z) ${layerType} fólia nem töltődött be helyesen.\x3cbr\x3e\x3cbr\x3eAhhoz, hogy ez az üzenet eltűnjön, válasszon egy új BaseLayer fóliát a jobb felső sarokban található fóliakapcsoló segítségével.\x3cbr\x3e\x3cbr\x3eNagy valószínűséggel ez azért van, mert a(z) ${layerLib} könyvtár parancsfájlja helytelen.\x3cbr\x3e\x3cbr\x3eFejlesztőknek: A helyes működtetésre vonatkozó segítség az alábbi helyen érhető el, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3ekattintson ide\x3c/a\x3e",'scale':"Lépték = 1 : ${scaleDenom}",'W':"Ny",'E':"K",'N':"É",'S':"D",'layerAlreadyAdded':"Megpróbálta hozzáadni a(z) ${layerName} fóliát a térképhez, de az már hozzá van adva",'reprojectDeprecated':"Ön a \'reproject\' beállítást használja a(z) ${layerName} fólián. Ez a beállítás érvénytelen: használata az üzleti alaptérképek fölötti adatok megjelenítésének támogatására szolgált, de ezt a funkció ezentúl a Gömbi Mercator használatával érhető el. További információ az alábbi helyen érhető el: http://trac.openlayers.org/wiki/SphericalMercator",'methodDeprecated':"Ez a módszer érvénytelenítve lett és a 3.0-s verzióból el lesz távolítva. Használja a(z) ${newMethod} módszert helyette.",'boundsAddError':"Az x és y értékeknek egyaránt meg kell felelnie, hogy a funkciót hozzáadhassa.",'lonlatAddError':"A hossz. és szél. értékeknek egyaránt meg kell felelnie, hogy a funkciót hozzáadhassa.",'pixelAddError':"Az x és y értékeknek egyaránt meg kell felelnie, hogy a funkciót hozzáadhassa.",'unsupportedGeometryType':"Nem támogatott geometriatípus: ${geomType}",'pagePositionFailed':"OpenLayers.Util.pagePosition sikertelen: lehetséges, hogy a(z) ${elemId} azonosítójú elem téves helyre került.",'filterEvaluateNotImplemented':"ennél a szűrőtípusnál kiértékelés nem hajtódik végre."});OpenLayers.Lang["ia"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Le responsa a un requesta non esseva maneate: ${statusText}",'permalink':"Permaligamine",'overlays':"Superpositiones",'baseLayer':"Strato de base",'sameProjection':"Le mini-carta functiona solmente si illo es in le mesme projection que le carta principal",'readNotImplemented':"Lectura non implementate.",'writeNotImplemented':"Scriptura non implementate.",'noFID':"Non pote actualisar un elemento sin FID.",'errorLoadingGML':"Error al cargamento del file GML ${url}",'browserNotSupported':"Tu navigator non supporta le rendition de vectores. Le renditores actualmente supportate es:\n${renderers}",'componentShouldBe':"addFeatures: le componente debe esser del typo ${geomType}",'getFeatureError':"getFeatureFromEvent ha essite appellate in un strato sin renditor. Isto significa generalmente que tu ha destruite un strato, ma lassava un gestor associate con illo.",'minZoomLevelError':"Le proprietate minZoomLevel es solmente pro uso con le stratos descendente de FixedZoomLevels. Le facto que iste strato WFS verifica minZoomLevel es un reliquia del passato. Nonobstante, si nos lo remove immediatemente, nos pote rumper applicationes a base de OL que depende de illo. Ergo nos lo declara obsolete; le verification de minZoomLevel in basso essera removite in version 3.0. Per favor usa in su loco le configuration de resolutiones min/max como describite a: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Transaction WFS: SUCCESSO ${response}",'commitFailed':"Transaction WFS: FALLEVA ${response}",'googleWarning':"Le strato Google non poteva esser cargate correctemente.\x3cbr\x3e\x3cbr\x3ePro disfacer te de iste message, selige un nove BaseLayer in le selector de strato in alto a dextra.\x3cbr\x3e\x3cbr\x3eMulto probabilemente, isto es proque le script del libreria de Google Maps non esseva includite o non contine le clave API correcte pro tu sito.\x3cbr\x3e\x3cbr\x3eDisveloppatores: Pro adjuta de corriger isto, \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eclicca hic\x3c/a",'getLayerWarning':"Le strato ${layerType} non poteva esser cargate correctemente.\x3cbr\x3e\x3cbr\x3ePro disfacer te de iste message, selige un nove BaseLayer in le selector de strato in alto a dextra.\x3cbr\x3e\x3cbr\x3eMulto probabilemente, isto es proque le script del libreria de ${layerLib} non esseva correctemente includite.\x3cbr\x3e\x3cbr\x3eDisveloppatores: Pro adjuta de corriger isto, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eclicca hic\x3c/a\x3e",'scale':"Scala = 1 : ${scaleDenom}",'W':"W",'E':"E",'N':"N",'S':"S",'layerAlreadyAdded':"Tu tentava adder le strato: ${layerName} al carta, ma illo es ja presente",'reprojectDeprecated':"Tu usa le option \'reproject\' in le strato ${layerName} layer. Iste option es obsolescente: illo esseva pro poter monstrar datos super cartas de base commercial, ma iste functionalitate pote ora esser attingite con le uso de Spherical Mercator. Ulterior information es disponibile a http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Iste methodo ha essite declarate obsolescente e essera removite in version 3.0. Per favor usa ${newMethod} in su loco.",'boundsAddError':"Tu debe passar le duo valores x e y al function add.",'lonlatAddError':"Tu debe passar le duo valores lon e lat al function add.",'pixelAddError':"Tu debe passar le duo valores x e y al function add.",'unsupportedGeometryType':"Typo de geometria non supportate: ${geomType}",'pagePositionFailed':"OpenLayers.Util.pagePosition falleva: le elemento con id ${elemId} pote esser mal placiate.",'filterEvaluateNotImplemented':"\"evaluate\" non es implementate pro iste typo de filtro."});OpenLayers.Lang["id"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Permintaan yang tak tertangani menghasilkan ${statusText}",'permalink':"Pranala permanen",'overlays':"Hamparan",'baseLayer':"Lapisan Dasar",'sameProjection':"Peta tinjauan hanya bekerja bila dalam proyeksi yang sama dengan peta utama",'readNotImplemented':"Membaca tidak diterapkan.",'writeNotImplemented':"Menyimpan tidak diterapkan.",'noFID':"Tidak dapat memperbarui fitur yang tidak memiliki FID.",'errorLoadingGML':"Kesalahan dalam memuat berkas GML ${url}",'browserNotSupported':"Peramban Anda tidak mendukung penggambaran vektor. Penggambar yang didukung saat ini adalah:\n${renderers}",'componentShouldBe':"addFeatures : komponen harus berupa ${geomType}",'getFeatureError':"getFeatureFromEvent diterapkan pada lapisan tanpa penggambar. Ini biasanya berarti Anda menghapus sebuah lapisan, tetapi tidak menghapus penangan yang terkait dengannya.",'minZoomLevelError':"Properti minZoomLevel hanya ditujukan bekerja dengan lapisan FixedZoomLevels-descendent. Pengecekan minZoomLevel oleh lapisan wfs adalah peninggalan masa lalu. Kami tidak dapat menghapusnya tanpa kemungkinan merusak aplikasi berbasis OL yang mungkin bergantung padanya. Karenanya, kami menganggapnya tidak berlaku -- Cek minZoomLevel di bawah ini akan dihapus pada 3.0. Silakan gunakan penyetelan resolusi min/maks seperti dijabarkan di sini: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"WFS Transaksi: BERHASIL ${respon}",'commitFailed':"WFS Transaksi: GAGAL ${respon}",'googleWarning':"Lapisan Google tidak dapat dimuat dengan benar.\x3cbr\x3e\x3cbr\x3eUntuk menghilangkan pesan ini, pilih suatu BaseLayer baru melalui penukar lapisan (layer switcher) di ujung kanan atas.\x3cbr\x3e\x3cbr\x3eKemungkinan besar ini karena pustaka skrip Google Maps tidak disertakan atau tidak mengandung kunci API yang tepat untuk situs Anda.\x3cbr\x3e\x3cbr\x3ePengembang: Untuk bantuan mengatasi masalah ini, \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eklik di sini\x3c/a\x3e",'getLayerWarning':"Lapisan ${layerType} tidak dapat dimuat dengan benar.\x3cbr\x3e\x3cbr\x3eUntuk menghilangkan pesan ini, pilih suatu BaseLayer baru melalui penukar lapisan (layer switcher) di ujung kanan atas.\x3cbr\x3e\x3cbr\x3eKemungkinan besar ini karena pustaka skrip Google Maps tidak disertakan dengan benar.\x3cbr\x3e\x3cbr\x3ePengembang: Untuk bantuan mengatasi masalah ini, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eklik di sini\x3c/a\x3e",'scale':"Sekala = 1 : ${scaleDenom}",'W':"B",'E':"T",'N':"U",'S':"S",'layerAlreadyAdded':"Anda mencoba menambahkan lapisan: ${layerName} ke dalam peta, tapi lapisan itu telah ditambahkan",'reprojectDeprecated':"Anda menggunakan opsi \'reproject\' pada lapisan ${layerName}. Opsi ini telah ditinggalkan: penggunaannya dirancang untuk mendukung tampilan data melalui peta dasar komersial, tapi fungsionalitas tersebut saat ini harus dilakukan dengan menggunakan dukungan Spherical Mercator. Informasi lebih lanjut tersedia di http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Metode ini telah usang dan akan dihapus di 3.0. Sebaliknya, harap gunakan ${newMethod}.",'boundsAddError':"Anda harus memberikan kedua nilai x dan y ke fungsi penambah.",'lonlatAddError':"Anda harus memberikan kedua nilai lon dan lat ke fungsi penambah.",'pixelAddError':"Anda harus memberikan kedua nilai x dan y ke fungsi penambah.",'unsupportedGeometryType':"Tipe geometri tak didukung: ${geomType}",'pagePositionFailed':"OpenLayers.Util.pagePosition gagal: elemen dengan id ${elemId} mungkin salah tempat.",'filterEvaluateNotImplemented':"evaluasi tidak tersedia untuk tipe filter ini."});OpenLayers.Lang["io"]=OpenLayers.Util.applyDefaults({'scale':"Skalo = 1 : ${scaleDenom}"});OpenLayers.Lang["is"]=OpenLayers.Util.applyDefaults({'permalink':"Varanlegur tengill",'overlays':"Þekjur",'baseLayer':"Grunnlag",'sameProjection':"Yfirlitskortið virkar aðeins ef það er í sömu vörpun og aðalkortið",'readNotImplemented':"Skrifun er óútfærð.",'writeNotImplemented':"Lestur er óútfærður.",'errorLoadingGML':"Villa kom upp við að hlaða inn GML skránni ${url}",'scale':"Skali = 1 : ${scaleDenom}",'layerAlreadyAdded':"Þú reyndir að bæta laginu ${layerName} á kortið en það er þegar búið að bæta því við",'methodDeprecated':"Þetta fall hefur verið úrelt og verður fjarlægt í 3.0. Notaðu ${newMethod} í staðin."});OpenLayers.Lang["ja"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"未処理の要求は ${statusText} を返します",'permalink':"パーマリンク",'overlays':"オーバーレイ",'baseLayer':"基底レイヤー",'sameProjection':"概観地図はメインの地図と同じ投影法をとる場合のみ機能します",'readNotImplemented':"読み込みは実装されていません。",'writeNotImplemented':"書き込みは実装されていません。",'noFID':"FID のない地物は更新できません。",'errorLoadingGML':"GML ファイル ${url} の読み込みエラー",'browserNotSupported':"あなたのブラウザはベクターグラフィックスの描写に対応していません。現時点で対応しているソフトウェアは以下のものです。\n${renderers}",'componentShouldBe':"addFeatures: 要素は ${geomType} であるべきです",'getFeatureError':"getFeatureFromEvent がレンダラーのないレイヤーから呼ばれました。通常、これはあなたがレイヤーを、それに関連づけられたいくつかのハンドラを除いて、破壊してしまったことを意味します。",'minZoomLevelError':"minZoomLevel プロパティは FixedZoomLevels を継承するレイヤーでの使用のみを想定しています。この minZoomLevel に対する WFS レイヤーの検査は歴史的なものです。しかしながら、この検査を除去するとそれに依存する OpenLayers ベースのアプリケーションを破壊してしまう可能性があります。よって廃止が予定されており、この minZoomLevel 検査はバージョン3.0で除去されます。代わりに、http://trac.openlayers.org/wiki/SettingZoomLevels で解説されている、最小および最大解像度設定を使用してください。",'commitSuccess':"WFS トランザクション: 成功 ${response}",'commitFailed':"WFS トランザクション: 失敗 ${response}",'googleWarning':"Google レイヤーが正しく読み込みを行えませんでした。\x3cbr\x3e\x3cbr\x3eこのメッセージを消すには、右上の隅にあるレイヤー切り替え部分で新しい基底レイヤーを選んでください。\x3cbr\x3e\x3cbr\x3eおそらく、これは Google マップ用ライブラリのスクリプトが組み込まれていないか、あなたのサイトに対応する正しい API キーが設定されていないためです。\x3cbr\x3e\x3cbr\x3e開発者の方へ: 正しい動作をさせるために\x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eこちらのウィキ\x3c/a\x3eを参照してください。",'getLayerWarning':"${layerType} レイヤーが正しく読み込みを行えませんでした。\x3cbr\x3e\x3cbr\x3eこのメッセージを消すには、右上の隅にあるレイヤー切り替え部分で新しい基底レイヤーを選んでください。\x3cbr\x3e\x3cbr\x3eおそらく、これは ${layerLib} ライブラリのスクリプトが正しく組み込まれていないためです。\x3cbr\x3e\x3cbr\x3e開発者の方へ: 正しい動作をさせるために\x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eこちらのウィキ\x3c/a\x3eを参照してください。",'scale':"縮尺 = 1 : ${scaleDenom}",'W':"西",'E':"東",'N':"北",'S':"南",'layerAlreadyAdded':"あなたは「${layerName}」を地図に追加しようと試みましたが、そのレイヤーは既に追加されています",'reprojectDeprecated':"あなたは「${layerName}」レイヤーで reproject オプションを使っています。このオプションは商用の基底地図上に情報を表示する目的で設計されましたが、現在ではその機能は Spherical Mercator サポートを利用して実現されており、このオプションの使用は非推奨です。追加の情報は http://trac.openlayers.org/wiki/SphericalMercator で入手できます。",'methodDeprecated':"このメソッドは廃止が予定されており、バージョン3.0で除去されます。代わりに ${newMethod} を使用してください。",'boundsAddError':"x と y 両方の値を add 関数に渡さなければなりません。",'lonlatAddError':"lon と lat 両方の値を add 関数に渡さなければなりません。",'pixelAddError':"x と y の値両方を add 関数に渡さなければなりません。",'unsupportedGeometryType':"未対応の形状型: ${geomType}",'pagePositionFailed':"OpenLayers.Util.pagePosition が失敗しました: id ${elemId} をもつ要素が誤った位置にある可能性があります。",'filterEvaluateNotImplemented':"このフィルター型について evaluate は実装されていません。"});OpenLayers.Lang["km"]=OpenLayers.Util.applyDefaults({'permalink':"តំណភ្ជាប់អចិន្ត្រៃយ៍",'baseLayer':"ស្រទាប់បាត​",'errorLoadingGML':"កំហុសកំឡុងពេលផ្ទុកឯកសារ GML ${url}",'scale':"មាត្រដ្ឋាន = ១ ៖ ${scaleDenom}"});OpenLayers.Lang["ksh"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Met dä Antwoot op en Aanfrooch ham_mer nix aanjefange: ${statusText}",'permalink':"Lengk op Duuer",'overlays':"Drövver jelaat",'baseLayer':"Jrund-Nivoh",'sameProjection':"De Övverseeschs_Kaat deiht et bloß, wann se de sälve Projäxjuhn bruche deiht, wi de Houp_Kaat",'readNotImplemented':"„\x3ccode lang=\"en\"\x3eread\x3c/code\x3e“ is em Projramm nit fürjesinn.",'writeNotImplemented':"„\x3ccode lang=\"en\"\x3ewrite\x3c/code\x3e“ is em Projramm nit fürjesinn.",'noFID':"En Saach, woh kein \x3ci lang=\"en\"\x3eFID\x3c/i\x3e för doh es, löht sesch nit ändere.",'errorLoadingGML':"Fähler beim \x3ci lang=\"en\"\x3eGML\x3c/i\x3e-Datei-Laade vun \x3ccode\x3e${url}\x3c/code\x3e",'browserNotSupported':"Dinge Brauser kann kein Väktore ußjävve. De Zoote Ußjaabe, di em Momang jon, sen:\n${renderers}",'componentShouldBe':"\x3ccode lang=\"en\"\x3eaddFeatures\x3c/code\x3e: dä Aandeil sullt vun dä Zoot „\x3ccode lang=\"en\"\x3e${geomType}\x3c/code\x3e“ sin.",'getFeatureError':"\x3ccode lang=\"en\"\x3egetFeatureFromEvent\x3c/code\x3e es vun enem Nivoh opjeroofe woode, woh et kei Projramm zom Ußjävve jit. Dat bedügg för jewöhnlesch, dat De e Nivoh kapott jemaat häs, ävver nit e Projramm för domet ömzejonn, wat domet verbonge es.",'minZoomLevelError':"De Eijeschaff „\x3ccode lang=\"en\"\x3eminZoomLevel\x3c/code\x3e“ es bloß doför jedaach, dat mer se met dä Nivvohß bruch, di vun \x3ccode lang=\"en\"\x3eFixedZoomLevels\x3c/code\x3e affhange don. Dat dat \x3ci lang=\"en\"\x3eWFS\x3c/i\x3e-Nivvoh övverhoup de Eijeschaff „\x3ccode lang=\"en\"\x3eminZoomLevel\x3c/code\x3e“ pröhfe deiht, es noch övveresch vun fröhjer. Mer künne dat ävver jez nit fott lohße, oohne dat mer Jevaa loufe, dat Aanwendunge vun OpenLayers nit mieh loufe, di sesch doh velleijsch noch drop am verlohße sin. Dröm sare mer, dat mer et nit mieh han welle, un de „\x3ccode lang=\"en\"\x3eminZoomLevel\x3c/code\x3e“-Eijeschaff weed hee vun de Version 3.0 af nit mieh jeprööf wäde. Nemm doför de Enstellung för de hühßte un de kleinßte Oplöhsung, esu wi et en http://trac.openlayers.org/wiki/SettingZoomLevels opjeschrevve es.",'commitSuccess':"Dä \x3ci lang=\"en\"\x3eWFS\x3c/i\x3e-Vörjang es joot jeloufe: ${response}",'commitFailed':"Dä \x3ci lang=\"en\"\x3eWFS\x3c/i\x3e-Vörjang es scheif jejange: ${response}",'googleWarning':"Dat Nivvoh \x3ccode lang=\"en\"\x3eGoogle\x3c/code\x3e kunnt nit reschtesch jelaade wääde.\x3cbr /\x3e\x3cbr /\x3eÖm hee di Nohreesch loß ze krijje, donn en ander Jrund-Nivvoh ußsöhke, rähß bovve en de Äk.\x3cbr /\x3e\x3cbr /\x3eWascheinlesch es dat wiel dat \x3ci lang=\"en\"\x3eGoogle-Maps\x3c/i\x3e-Skrepp entweeder nit reschtesch enjebonge wood, udder nit dä reschtejje \x3ci lang=\"en\"\x3eAPI\x3c/i\x3e-Schlößel för Ding Web-ßait scheke deiht.\x3cbr /\x3e\x3cbr /\x3eFör Projrammierer jidd_et Hölp do_drövver, \x3ca href=\"http://trac.openlayers.org/wiki/Google\" target=\"_blank\"\x3ewi mer dat aan et Loufe brengk\x3c/a\x3e.",'getLayerWarning':"Dat Nivvoh \x3ccode\x3e${layerType}\x3c/code\x3e kunnt nit reschtesch jelaade wääde.\x3cbr /\x3e\x3cbr /\x3eÖm hee di Nohreesch loß ze krijje, donn en ander Jrund-Nivvoh ußsöhkre, rähß bovve en de Äk.\x3cbr /\x3e\x3cbr /\x3eWascheinlesch es dat, wiel dat Skrepp \x3ccode\x3e${layerLib}\x3c/code\x3e nit reschtesch enjebonge wood.\x3cbr /\x3e\x3cbr /\x3eFör Projrammierer jidd_Et Hölp do_drövver, \x3ca href=\"http://trac.openlayers.org/wiki/${layerLib}\" target=\"_blank\"\x3ewi mer dat aan et Loufe brengk\x3c/a\x3e.",'scale':"Mohßshtaab = 1 : ${scaleDenom}",'W':"W",'E':"O",'N':"N",'S':"S",'layerAlreadyAdded':"Do häß versöhk, dat Nivvoh \x3ccode\x3e${layerName}\x3c/code\x3e en di Kaat eren ze bränge, et wohr ävver ald do dren.",'reprojectDeprecated':"Do bruchs de Ußwahl \x3ccode\x3ereproject\x3c/code\x3e op däm Nivvoh \x3ccode\x3e${layerName}\x3c/code\x3e. Di Ußwahl es nit mieh jähn jesinn. Se wohr doför jedaach, öm Date op jeschääfsmäßesch eruß jejovve Kaate bovve drop ze moole, wat ävver enzwesche besser met dä Öngershtözung för de ßfääresche Mäkaator Beldscher jeiht. Doh kanns De mieh drövver fenge op dä Sigg: http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Hee di Metood es nim_mih aktoäll un et weed se en dä Version 3.0 nit mieh jävve. Nemm \x3ccode\x3e${newMethod}\x3c/code\x3e doföör.",'boundsAddError':"Do moß beeds vun de \x3ccode\x3ex\x3c/code\x3e un \x3ccode\x3ey\x3c/code\x3e Wääte aan de Fungkßjohn \x3ccode\x3eadd\x3c/code\x3e jävve.",'lonlatAddError':"Do moß beeds \x3ccode\x3elon\x3c/code\x3e un \x3ccode\x3elat\x3c/code\x3e aan de Fungkßjohn \x3ccode\x3eadd\x3c/code\x3e jävve.",'pixelAddError':"Do moß beeds \x3ccode\x3ex\x3c/code\x3e un \x3ccode\x3ey\x3c/code\x3e aan de Fungkßjohn \x3ccode\x3eadd\x3c/code\x3e jävve.",'unsupportedGeometryType':"De Zoot Jommetrii dom_mer nit ongershtöze: \x3ccode\x3e${geomType}\x3c/code\x3e",'pagePositionFailed':"\x3ccode lang=\"en\"\x3eOpenLayers.Util.pagePosition\x3c/code\x3e es donevve jejange: dat Denge met dä Kännong \x3ccode\x3e${elemId}\x3c/code\x3e künnt am verkeehte Plaz sin.",'filterEvaluateNotImplemented':"„\x3ccode lang=\"en\"\x3eevaluate\x3c/code\x3e“ es för di Zoot Fellter nit enjereschdt."});OpenLayers.Lang["nds"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Unbehannelt Trüchmellels för de Anfraag ${statusText}",'permalink':"Permalink",'overlays':"Overlays",'baseLayer':"Achtergrundkoort",'sameProjection':"De Översichtskoort geiht blot, wenn de sülve Projekschoon as bi de Hööftkoort bruukt warrt",'readNotImplemented':"Lesen is nich inricht.",'writeNotImplemented':"Schrieven is nich inricht.",'noFID':"En Feature, dat keen FID hett, kann nich aktuell maakt warrn.",'errorLoadingGML':"Fehler bi’t Laden vun de GML-Datei ${url}",'browserNotSupported':"Dien Browser ünnerstütt keen Vektorbiller. Ünnerstütt Renderers:\n${renderers}",'componentShouldBe':"addFeatures : Kumponent schull man den Typ ${geomType} hebben",'getFeatureError':"getFeatureFromEvent is von en Laag ahn Render opropen worrn. Dat bedüüdt normalerwies, dat en Laag wegmaakt worrn is, aver nich de Handler, de dor op verwiest.",'commitSuccess':"WFS-Transakschoon: hett klappt ${response}",'commitFailed':"WFS-Transakschoon: hett nich klappt ${response}",'scale':"Skaal = 1 : ${scaleDenom}",'layerAlreadyAdded':"Du versöchst de Laag „${layerName}“ to de Koort totofögen, man de is al toföögt",'methodDeprecated':"Disse Methood is oold un schall dat in 3.0 nich mehr geven. Bruuk dor man beter ${newMethod} för.",'boundsAddError':"De Weert x un y, de mööt all beid an de add-Funkschoon övergeven warrn.",'lonlatAddError':"De Weert lon un lat, de mööt all beid an de add-Funkschoon övergeven warrn.",'pixelAddError':"De Weert x un y, de mööt all beid an de add-Funkschoon övergeven warrn.",'unsupportedGeometryType':"Nich ünnerstütt Geometrie-Typ: ${geomType}",'pagePositionFailed':"OpenLayers.Util.pagePosition güng nich: Element mit de Id ${elemId} is villicht an’n verkehrten Platz."});OpenLayers.Lang["nn"]=OpenLayers.Util.applyDefaults({'scale':"Skala = 1 : ${scaleDenom}",'layerAlreadyAdded':"Du freista å leggja til laget «${layerName}» på kartet, men det har alt vorte lagt til.",'boundsAddError':"Du er nøydd til å gje både ein x- og ein y-verdi til «add»-funksjonen.",'lonlatAddError':"Du er nøydd til å gje både lon- og lat-verdiar til «add»-funksjonen.",'pixelAddError':"Du er nøydd til å gje både ein x- og ein y-verdi til «add»-funksjonen."});OpenLayers.Lang["oc"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Requèsta pas gerida, retorna ${statusText}",'permalink':"Permaligam",'overlays':"Calques",'baseLayer':"Calc de basa",'sameProjection':"La carta de situacion fonciona pas que quora sa projeccion es la meteissa que la de la carta principala",'readNotImplemented':"Lectura pas implementada.",'writeNotImplemented':"Escritura pas implementada.",'noFID':"Impossible de metre a jorn un objècte sens identificant (fid).",'errorLoadingGML':"Error al cargament del fichièr GML ${url}",'browserNotSupported':"Vòstre navegidor supòrta pas lo rendut vectorial. Los renderers actualament suportats son : \n${renderers}",'componentShouldBe':"addFeatures : lo compausant deuriá èsser de tipe ${geomType}",'getFeatureError':"getFeatureFromEvent es estat apelat sus un calc sens renderer. Aquò significa generalament qu\'avètz destruch aqueste jaç, mas qu\'avètz conservat un handler que li èra associat.",'minZoomLevelError':"La proprietat minZoomLevel deu èsser utilizada solament per de jaces FixedZoomLevels-descendent. Lo fach qu\'aqueste jaç WFS verifique la preséncia de minZoomLevel es una relica del passat. Çaquelà, la podèm suprimir sens copar d\'aplicacions que ne poirián dependre. Es per aquò que la depreciam -- la verificacion del minZoomLevel serà suprimida en version 3.0. A la plaça, mercés d\'utilizar los paramètres de resolucions min/max tal coma descrich sus : http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Transaccion WFS : SUCCES ${response}",'commitFailed':"Transaccion WFS : FRACAS ${response}",'googleWarning':"Lo jaç Google es pas estat en mesura de se cargar corrèctament.\x3cbr\x3e\x3cbr\x3ePer suprimir aqueste messatge, causissètz una BaseLayer novèla dins lo selector de jaç en naut a drecha.\x3cbr\x3e\x3cbr\x3eAquò es possiblament causat par la non-inclusion de la librariá Google Maps, o alara perque que la clau de l\'API correspond pas a vòstre site.\x3cbr\x3e\x3cbr\x3eDesvolopaires : per saber cossí corregir aquò, \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eclicatz aicí\x3c/a\x3e",'getLayerWarning':"Lo jaç ${layerType} es pas en mesura de se cargar corrèctament.\x3cbr\x3e\x3cbr\x3ePer suprimir aqueste messatge, causissètz una  BaseLayer novèla dins lo selector de jaç en naut a drecha.\x3cbr\x3e\x3cbr\x3eAquò es possiblament causat per la non-inclusion de la librariá ${layerLib}.\x3cbr\x3e\x3cbr\x3eDesvolopaires : per saber cossí corregir aquí, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eclicatz aicí\x3c/a\x3e",'scale':"Escala ~ 1 : ${scaleDenom}",'W':"O",'E':"È",'N':"N",'S':"S",'layerAlreadyAdded':"Avètz ensajat d\'apondre a la carta lo calc : ${layerName}, mas ja es present",'reprojectDeprecated':"Utilizatz l\'opcion \'reproject\' sul jaç ${layerName}. Aquesta opcion es despreciada : Son usatge permetiá d\'afichar de donadas al dessús de jaces raster comercials. Aquesta foncionalitat ara es suportada en utilizant lo supòrt de la projeccion Mercator Esferica. Mai d\'informacion es disponibla sus http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Aqueste metòde es despreciada, e serà suprimida a la version 3.0. Mercés d\'utilizar ${newMethod} a la plaça.",'boundsAddError':"Vos cal passar las doas valors x e y a la foncion add.",'lonlatAddError':"Vos cal passar las doas valors lon e lat a la foncion add.",'pixelAddError':"Vos cal passar las doas valors x e y a la foncion add.",'unsupportedGeometryType':"Tipe de geometria pas suportat : ${geomType}",'pagePositionFailed':"OpenLayers.Util.pagePosition a fracassat : l\'element d\'id ${elemId} poiriá èsser mal posicionat.",'filterEvaluateNotImplemented':"evaluar es pas encara estat implementat per aqueste tipe de filtre."});OpenLayers.Lang["pt"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Servidor devolveu erro não contemplado ${statusText}",'permalink':"Ligação permanente",'overlays':"Sobreposições",'baseLayer':"Camada Base",'sameProjection':"O mapa panorâmico só funciona quando está na mesma projeção que o mapa principal",'readNotImplemented':"Leitura não implementada.",'writeNotImplemented':"Escrita não implementada.",'noFID':"Não é possível atualizar um elemento para a qual não há FID.",'errorLoadingGML':"Erro ao carregar ficheiro GML ${url}",'browserNotSupported':"O seu navegador não suporta renderização vetorial. Actualmente os renderizadores suportados são:\n${renderers}",'componentShouldBe':"addFeatures: componente deve ser um(a) ${geomType}",'getFeatureError':"getFeatureFromEvent foi chamado numa camada sem renderizador. Isto normalmente significa que destruiu uma camada, mas não um manipulador \'\'(handler)\'\' que lhe está associado.",'minZoomLevelError':"A propriedade minZoomLevel só deve ser usada com as camadas descendentes da FixedZoomLevels. A verificação da propriedade por esta camada wfs é uma relíquia do passado. No entanto, não podemos removê-la sem correr o risco de afectar aplicações OL que dependam dela. Portanto, estamos a torná-la obsoleta -- a verificação minZoomLevel será removida na versão 3.0. Em vez dela, por favor, use as opções de resolução min/max descritas aqui: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Transacção WFS: SUCESSO ${response}",'commitFailed':"Transacção WFS: FALHOU ${response}",'googleWarning':"A Camada Google não foi correctamente carregada.\x3cbr\x3e\x3cbr\x3ePara deixar de receber esta mensagem, seleccione uma nova Camada-Base no \'\'switcher\'\' de camadas no canto superior direito.\x3cbr\x3e\x3cbr\x3eProvavelmente, isto acontece porque o \'\'script\'\' da biblioteca do Google Maps não foi incluído ou não contém a chave API correcta para o seu sítio.\x3cbr\x3e\x3cbr\x3eProgramadores: Para ajuda sobre como solucionar o problema \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eclique aqui\x3c/a\x3e .",'getLayerWarning':"A camada ${layerType} não foi correctamente carregada.\x3cbr\x3e\x3cbr\x3ePara desactivar esta mensagem, seleccione uma nova Camada-Base no \'\'switcher\'\' de camadas no canto superior direito.\x3cbr\x3e\x3cbr\x3eProvavelmente, isto acontece porque o \'\'script\'\' da biblioteca ${layerLib} não foi incluído correctamente.\x3cbr\x3e\x3cbr\x3eProgramadores: Para ajuda sobre como solucionar o problema \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eclique aqui\x3c/a\x3e .",'scale':"Escala = 1 : ${scaleDenom}",'W':"O",'E':"E",'N':"N",'S':"S",'layerAlreadyAdded':"Você tentou adicionar a camada: ${layerName} ao mapa, mas ela já tinha sido adicionada antes",'reprojectDeprecated':"Está usando a opção \'reproject\' na camada ${layerName}. Esta opção é obsoleta: foi concebida para permitir a apresentação de dados sobre mapas-base comerciais, mas esta funcionalidade é agora suportada pelo Mercator Esférico. Mais informação está disponível em http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Este método foi declarado obsoleto e será removido na versão 3.0. Por favor, use ${newMethod} em vez disso.",'boundsAddError':"Você deve passar tanto o valor x como o y à função de adição.",'lonlatAddError':"Você deve passar tanto o valor lon como o lat à função de adição.",'pixelAddError':"Você deve passar tanto o valor x como o y à função de adição.",'unsupportedGeometryType':"Tipo de geometria não suportado: ${geomType}",'pagePositionFailed':"OpenLayers.Util.pagePosition falhou: o elemento com o id ${elemId} poderá estar mal-posicionado.",'filterEvaluateNotImplemented':"avaliar não está implementado para este tipo de filtro."});OpenLayers.Lang["ru"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Необработанный запрос вернул ${statusText}",'permalink':"Постоянная ссылка",'overlays':"Слои",'baseLayer':"Основной слой",'sameProjection':"Обзорная карта работает только тогда, когда имеет ту же проекцию, что и основная",'readNotImplemented':"Чтение не реализовано.",'writeNotImplemented':"Запись не реализована.",'noFID':"Невозможно обновить объект, для которого нет FID.",'errorLoadingGML':"Ошибка при загрузке файла GML ${url}",'browserNotSupported':"Ваш браузер не поддерживает векторную графику. На данный момент поддерживаются:\n${renderers}",'componentShouldBe':"addFeatures: компонент должен быть ${geomType}",'getFeatureError':"getFeatureFromEvent вызван для слоя без рендерера. Обычно это говорит о том, что вы уничтожили слой, но оставили связанный с ним обработчик.",'minZoomLevelError':"Свойство minZoomLevel предназначено только для использования со слоями, являющимися потомками FixedZoomLevels. То, что этот WFS-слой проверяется на minZoomLevel — реликт прошлого. Однако мы не можем удалить эту функцию, так как, возможно, от неё зависят некоторые основанные на OpenLayers приложения. Функция объявлена устаревшей — проверка minZoomLevel будет удалена в 3.0. Пожалуйста, используйте вместо неё настройку мин/макс разрешения, описанную здесь: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Транзакция WFS: УСПЕШНО ${response}",'commitFailed':"Транзакция WFS: ОШИБКА ${response}",'googleWarning':"Слой Google не удалось нормально загрузить.\x3cbr\x3e\x3cbr\x3eЧтобы избавиться от этого сообщения, выбите другой основной слой в переключателе в правом верхнем углу.\x3cbr\x3e\x3cbr\x3eСкорее всего, причина в том, что библиотека Google Maps не была включена или не содержит корректного API-ключа для вашего сайта.\x3cbr\x3e\x3cbr\x3eРазработчикам: чтобы узнать, как сделать, чтобы всё заработало, \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eщёлкните тут\x3c/a\x3e",'getLayerWarning':"Слой ${layerType} не удалось нормально загрузить. \x3cbr\x3e\x3cbr\x3eЧтобы избавиться от этого сообщения, выбите другой основной слой в переключателе в правом верхнем углу.\x3cbr\x3e\x3cbr\x3eСкорее всего, причина в том, что библиотека ${layerLib} не была включена или была включена некорректно.\x3cbr\x3e\x3cbr\x3eРазработчикам: чтобы узнать, как сделать, чтобы всё заработало, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eщёлкните тут\x3c/a\x3e",'scale':"Масштаб = 1 : ${scaleDenom}",'W':"З",'E':"В",'N':"С",'S':"Ю",'layerAlreadyAdded':"Вы попытались добавить слой «${layerName}» на карту, но он уже был добавлен",'reprojectDeprecated':"Вы используете опцию \'reproject\' для слоя ${layerName}. Эта опция является устаревшей: ее использование предполагалось для поддержки показа данных поверх коммерческих базовых карт, но теперь этот функционал несёт встроенная поддержка сферической проекции Меркатора. Больше сведений доступно на http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Этот метод считается устаревшим и будет удалён в версии 3.0. Пожалуйста, пользуйтесь ${newMethod}.",'boundsAddError':"Функции add надо передавать оба значения, x и y.",'lonlatAddError':"Функции add надо передавать оба значения, lon и lat.",'pixelAddError':"Функции add надо передавать оба значения, x и y.",'unsupportedGeometryType':"Неподдерживаемый тип геометрии: ${geomType}",'pagePositionFailed':"OpenLayers.Util.pagePosition failed: элемент с id ${elemId} может находиться не в нужном месте.",'filterEvaluateNotImplemented':"evaluate не реализовано для фильтра данного типа."});OpenLayers.Lang["sk"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Neobslúžené požiadavky vracajú ${statusText}",'permalink':"Trvalý odkaz",'overlays':"Prekrytia",'baseLayer':"Základná vrstva",'sameProjection':"Prehľadová mapka funguje iba vtedy, keď je v rovnakej projekcii ako hlavná mapa",'readNotImplemented':"Čítanie nie je implementované.",'writeNotImplemented':"Zápis nie je implementovaný.",'noFID':"Nie je možné aktualizovať vlastnosť, pre ktorú neexistuje FID.",'errorLoadingGML':"Chyba pri načítaní súboru GML ${url}",'browserNotSupported':"Váš prehliadač nepodporuje vykresľovanie vektorov. Momentálne podporované vykresľovače sú:\n${renderers}",'componentShouldBe':"addFeatures: komponent by mal byť ${geomType}",'getFeatureError':"getFeatureFromEvent bola zavolaná na vrstve bez vykresľovača. To zvyčajne znamená, že ste odstránili vrstvu, ale nie niektorú z obslúh, ktorá je s ňou asociovaná.",'minZoomLevelError':"Vlastnosť minZoomLevel je určený iba na použitie s vrstvami odvodenými od FixedZoomLevels. To, že táto wfs vrstva kontroluje minZoomLevel je pozostatok z minulosti. Nemôžeme ho však odstrániť, aby sme sa vyhli možnému porušeniu aplikácií založených na Open Layers, ktoré na tomto môže závisieť. Preto ho označujeme ako zavrhovaný - dolu uvedená kontrola minZoomLevel bude odstránená vo verzii 3.0. Použite prosím namiesto toho kontrolu min./max. rozlíšenia podľa tu uvedeného popisu: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Transakcia WFS: ÚSPEŠNÁ ${response}",'commitFailed':"Transakcia WFS: ZLYHALA ${response}",'googleWarning':"Vrstvu Google nebolo možné správne načítať.\x3cbr\x3e\x3cbr\x3eAby ste sa tejto správy zbavili vyberte novú BaseLayer v prepínači vrstiev v pravom hornom rohu.\x3cbr\x3e\x3cbr\x3eToto sa stalo pravdepodobne preto, že skript knižnice Google Maps buď nebol načítaný alebo neobsahuje správny kľúč API pre vašu lokalitu.\x3cbr\x3e\x3cbr\x3eVývojári: Tu môžete získať \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3epomoc so sfunkčnením\x3c/a\x3e",'getLayerWarning':"Vrstvu ${layerType} nebolo možné správne načítať.\x3cbr\x3e\x3cbr\x3eAby ste sa tejto správy zbavili vyberte novú BaseLayer v prepínači vrstiev v pravom hornom rohu.\x3cbr\x3e\x3cbr\x3eToto sa stalo pravdepodobne preto, že skript knižnice ${layerType} buď nebol načítaný alebo neobsahuje správny kľúč API pre vašu lokalitu.\x3cbr\x3e\x3cbr\x3eVývojári: Tu môžete získať \x3ca href=\'http://trac.openlayers.org/wiki/${layerType}\' target=\'_blank\'\x3epomoc so sfunkčnením\x3c/a\x3e",'scale':"Mierka = 1 : ${scaleDenom}",'layerAlreadyAdded':"Pokúsili ste sa do mapy pridať vrstvu ${layerName}, ale tá už bola pridaná",'reprojectDeprecated':"Používate voľby „reproject“ vrstvy ${layerType}. Táto voľba je zzavrhovaná: jej použitie bolo navrhnuté na podporu zobrazovania údajov nad komerčnými základovými mapami, ale túto funkcionalitu je teraz možné dosiahnuť pomocou Spherical Mercator. Ďalšie informácie získate na stránke http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Táto metóda je zavrhovaná a bude odstránená vo verzii 3.0. Použite prosím namiesto nej metódu ${newMethod}.",'boundsAddError':"Sčítacej funkcii musíte dať hodnoty x aj y.",'lonlatAddError':"Sčítacej funkcii musíte dať hodnoty lon (zem. dĺžka) aj lat (zem. šírka).",'pixelAddError':"Sčítacej funkcii musíte dať hodnoty x aj y.",'unsupportedGeometryType':"Nepodporovaný typ geometrie: ${geomType}",'pagePositionFailed':"OpenLayers.Util.pagePosition zlyhalo: prvok s id ${elemId} môže byť zle umiestnený.",'filterEvaluateNotImplemented':"evaluate nie je implementovaný pre tento typ filtra"});OpenLayers.Lang["te"]=OpenLayers.Util.applyDefaults({'permalink':"స్థిరలింకు",'W':"ప",'E':"తూ",'N':"ఉ",'S':"ద"});OpenLayers.Lang["vi"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Không xử lý được phản hồi ${statusText} cho yêu cầu",'permalink':"Liên kết thường trực",'overlays':"Lấp bản đồ",'baseLayer':"Lớp nền",'sameProjection':"Bản đồ toàn cảnh chỉ hoạt động khi cùng phép chiếu với bản đồ chính",'readNotImplemented':"Chưa hỗ trợ chức năng đọc.",'writeNotImplemented':"Chưa hỗ trợ chức năng viết.",'noFID':"Không thể cập nhật tính năng thiếu FID.",'errorLoadingGML':"Lỗi tải tập tin GML tại ${url}",'browserNotSupported':"Trình duyệt của bạn không hỗ trợ chức năng vẽ bằng vectơ. Hiện hỗ trợ các bộ kết xuất:\n${renderers}",'componentShouldBe':"addFeatures: bộ phận cần phải là ${geomType}",'getFeatureError':"getFeatureFromEvent được gọi từ lớp không có bộ kết xuất. Thường thì có lẽ lớp bị xóa nhưng một phần xử lý của nó vẫn còn.",'minZoomLevelError':"Chỉ nên sử dụng thuộc tính minZoomLevel với các lớp FixedZoomLevels-descendent. Việc lớp wfs này tìm cho minZoomLevel là di tích còn lại từ xưa. Tuy nhiên, nếu chúng tôi dời nó thì sẽ vỡ các chương trình OpenLayers mà dựa trên nó. Bởi vậy chúng tôi phản đối sử dụng nó\x26nbsp;– bước tìm cho minZoomLevel sẽ được dời vào phiên bản 3.0. Xin sử dụng thiết lập độ phân tích tối thiểu / tối đa thay thế, theo hướng dẫn này: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Giao dịch WFS: THÀNH CÔNG ${response}",'commitFailed':"Giao dịch WFS: THẤT BẠI ${response}",'googleWarning':"Không thể tải lớp Google đúng đắn.\x3cbr\x3e\x3cbr\x3eĐể tránh thông báo này lần sau, hãy chọn BaseLayer mới dùng điều khiển chọn lớp ở góc trên phải.\x3cbr\x3e\x3cbr\x3eChắc script thư viện Google Maps hoặc không được bao gồm hoặc không chứa khóa API hợp với website của bạn.\x3cbr\x3e\x3cbr\x3e\x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eTrợ giúp về tính năng này\x3c/a\x3e cho người phát triển.",'getLayerWarning':"Không thể tải lớp ${layerType} đúng đắn.\x3cbr\x3e\x3cbr\x3eĐể tránh thông báo này lần sau, hãy chọn BaseLayer mới dùng điều khiển chọn lớp ở góc trên phải.\x3cbr\x3e\x3cbr\x3eChắc script thư viện ${layerLib} không được bao gồm đúng kiểu.\x3cbr\x3e\x3cbr\x3e\x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eTrợ giúp về tính năng này\x3c/a\x3e cho người phát triển.",'scale':"Tỷ lệ = 1 : ${scaleDenom}",'W':"T",'E':"Đ",'N':"B",'S':"N",'layerAlreadyAdded':"Bạn muốn thêm lớp ${layerName} vào bản đồ, nhưng lớp này đã được thêm",'reprojectDeprecated':"Bạn đang áp dụng chế độ “reproject” vào lớp ${layerName}. Chế độ này đã bị phản đối: nó có mục đích hỗ trợ lấp dữ liệu trên các nền bản đồ thương mại; nên thực hiện hiệu ứng đó dùng tính năng Mercator Hình cầu. Có sẵn thêm chi tiết tại http://trac.openlayers.org/wiki/SphericalMercator .",'methodDeprecated':"Phương thức này đã bị phản đối và sẽ bị dời vào phiên bản 3.0. Xin hãy sử dụng ${newMethod} thay thế.",'boundsAddError':"Cần phải cho cả giá trị x và y vào hàm add.",'lonlatAddError':"Cần phải cho cả giá trị lon và lat vào hàm add.",'pixelAddError':"Cần phải cho cả giá trị x và y vào hàm add.",'unsupportedGeometryType':"Không hỗ trợ kiểu địa lý: ${geomType}",'pagePositionFailed':"OpenLayers.Util.pagePosition bị thất bại: nguyên tố với ID ${elemId} có thể ở chỗ sai.",'filterEvaluateNotImplemented':"chưa hỗ trợ evaluate cho loại bộ lọc này."});OpenLayers.Popup.AnchoredBubble=OpenLayers.Class(OpenLayers.Popup.Anchored,{rounded:false,initialize:function(id,lonlat,contentSize,contentHTML,anchor,closeBox,closeBoxCallback){this.padding=new OpenLayers.Bounds(0,OpenLayers.Popup.AnchoredBubble.CORNER_SIZE,0,OpenLayers.Popup.AnchoredBubble.CORNER_SIZE);OpenLayers.Popup.Anchored.prototype.initialize.apply(this,arguments);},draw:function(px){OpenLayers.Popup.Anchored.prototype.draw.apply(this,arguments);this.setContentHTML();this.setBackgroundColor();this.setOpacity();return this.div;},updateRelativePosition:function(){this.setRicoCorners();},setSize:function(contentSize){OpenLayers.Popup.Anchored.prototype.setSize.apply(this,arguments);this.setRicoCorners();},setBackgroundColor:function(color){if(color!=undefined){this.backgroundColor=color;}
59805 if(this.div!=null){if(this.contentDiv!=null){this.div.style.background="transparent";OpenLayers.Rico.Corner.changeColor(this.groupDiv,this.backgroundColor);}}},setOpacity:function(opacity){OpenLayers.Popup.Anchored.prototype.setOpacity.call(this,opacity);if(this.div!=null){if(this.groupDiv!=null){OpenLayers.Rico.Corner.changeOpacity(this.groupDiv,this.opacity);}}},setBorder:function(border){this.border=0;},setRicoCorners:function(){var corners=this.getCornersToRound(this.relativePosition);var options={corners:corners,color:this.backgroundColor,bgColor:"transparent",blend:false};if(!this.rounded){OpenLayers.Rico.Corner.round(this.div,options);this.rounded=true;}else{OpenLayers.Rico.Corner.reRound(this.groupDiv,options);this.setBackgroundColor();this.setOpacity();}},getCornersToRound:function(){var corners=['tl','tr','bl','br'];var corner=OpenLayers.Bounds.oppositeQuadrant(this.relativePosition);OpenLayers.Util.removeItem(corners,corner);return corners.join(" ");},CLASS_NAME:"OpenLayers.Popup.AnchoredBubble"});OpenLayers.Popup.AnchoredBubble.CORNER_SIZE=5;OpenLayers.Popup.Framed=OpenLayers.Class(OpenLayers.Popup.Anchored,{imageSrc:null,imageSize:null,isAlphaImage:false,positionBlocks:null,blocks:null,fixedRelativePosition:false,initialize:function(id,lonlat,contentSize,contentHTML,anchor,closeBox,closeBoxCallback){OpenLayers.Popup.Anchored.prototype.initialize.apply(this,arguments);if(this.fixedRelativePosition){this.updateRelativePosition();this.calculateRelativePosition=function(px){return this.relativePosition;};}
59806 this.contentDiv.style.position="absolute";this.contentDiv.style.zIndex=1;if(closeBox){this.closeDiv.style.zIndex=1;}
59807 this.groupDiv.style.position="absolute";this.groupDiv.style.top="0px";this.groupDiv.style.left="0px";this.groupDiv.style.height="100%";this.groupDiv.style.width="100%";},destroy:function(){this.imageSrc=null;this.imageSize=null;this.isAlphaImage=null;this.fixedRelativePosition=false;this.positionBlocks=null;for(var i=0;i<this.blocks.length;i++){var block=this.blocks[i];if(block.image){block.div.removeChild(block.image);}
59808 block.image=null;if(block.div){this.groupDiv.removeChild(block.div);}
59809 block.div=null;}
59810 this.blocks=null;OpenLayers.Popup.Anchored.prototype.destroy.apply(this,arguments);},setBackgroundColor:function(color){},setBorder:function(){},setOpacity:function(opacity){},setSize:function(contentSize){OpenLayers.Popup.Anchored.prototype.setSize.apply(this,arguments);this.updateBlocks();},updateRelativePosition:function(){this.padding=this.positionBlocks[this.relativePosition].padding;if(this.closeDiv){var contentDivPadding=this.getContentDivPadding();this.closeDiv.style.right=contentDivPadding.right+
59811 this.padding.right+"px";this.closeDiv.style.top=contentDivPadding.top+
59812 this.padding.top+"px";}
59813 this.updateBlocks();},calculateNewPx:function(px){var newPx=OpenLayers.Popup.Anchored.prototype.calculateNewPx.apply(this,arguments);newPx=newPx.offset(this.positionBlocks[this.relativePosition].offset);return newPx;},createBlocks:function(){this.blocks=[];var firstPosition=null;for(var key in this.positionBlocks){firstPosition=key;break;}
59814 var position=this.positionBlocks[firstPosition];for(var i=0;i<position.blocks.length;i++){var block={};this.blocks.push(block);var divId=this.id+'_FrameDecorationDiv_'+i;block.div=OpenLayers.Util.createDiv(divId,null,null,null,"absolute",null,"hidden",null);var imgId=this.id+'_FrameDecorationImg_'+i;var imageCreator=(this.isAlphaImage)?OpenLayers.Util.createAlphaImageDiv:OpenLayers.Util.createImage;block.image=imageCreator(imgId,null,this.imageSize,this.imageSrc,"absolute",null,null,null);block.div.appendChild(block.image);this.groupDiv.appendChild(block.div);}},updateBlocks:function(){if(!this.blocks){this.createBlocks();}
59815 if(this.size&&this.relativePosition){var position=this.positionBlocks[this.relativePosition];for(var i=0;i<position.blocks.length;i++){var positionBlock=position.blocks[i];var block=this.blocks[i];var l=positionBlock.anchor.left;var b=positionBlock.anchor.bottom;var r=positionBlock.anchor.right;var t=positionBlock.anchor.top;var w=(isNaN(positionBlock.size.w))?this.size.w-(r+l):positionBlock.size.w;var h=(isNaN(positionBlock.size.h))?this.size.h-(b+t):positionBlock.size.h;block.div.style.width=(w<0?0:w)+'px';block.div.style.height=(h<0?0:h)+'px';block.div.style.left=(l!=null)?l+'px':'';block.div.style.bottom=(b!=null)?b+'px':'';block.div.style.right=(r!=null)?r+'px':'';block.div.style.top=(t!=null)?t+'px':'';block.image.style.left=positionBlock.position.x+'px';block.image.style.top=positionBlock.position.y+'px';}
59816 this.contentDiv.style.left=this.padding.left+"px";this.contentDiv.style.top=this.padding.top+"px";}},CLASS_NAME:"OpenLayers.Popup.Framed"});OpenLayers.Projection=OpenLayers.Class({proj:null,projCode:null,initialize:function(projCode,options){OpenLayers.Util.extend(this,options);this.projCode=projCode;if(window.Proj4js){this.proj=new Proj4js.Proj(projCode);}},getCode:function(){return this.proj?this.proj.srsCode:this.projCode;},getUnits:function(){return this.proj?this.proj.units:null;},toString:function(){return this.getCode();},equals:function(projection){if(projection&&projection.getCode){return this.getCode()==projection.getCode();}else{return false;}},destroy:function(){delete this.proj;delete this.projCode;},CLASS_NAME:"OpenLayers.Projection"});OpenLayers.Projection.transforms={};OpenLayers.Projection.addTransform=function(from,to,method){if(!OpenLayers.Projection.transforms[from]){OpenLayers.Projection.transforms[from]={};}
59817 OpenLayers.Projection.transforms[from][to]=method;};OpenLayers.Projection.transform=function(point,source,dest){if(source.proj&&dest.proj){point=Proj4js.transform(source.proj,dest.proj,point);}else if(source&&dest&&OpenLayers.Projection.transforms[source.getCode()]&&OpenLayers.Projection.transforms[source.getCode()][dest.getCode()]){OpenLayers.Projection.transforms[source.getCode()][dest.getCode()](point);}
59818 return point;};OpenLayers.Protocol.WFS.v1=OpenLayers.Class(OpenLayers.Protocol,{version:null,srsName:"EPSG:4326",featureType:null,featureNS:null,geometryName:"the_geom",schema:null,featurePrefix:"feature",formatOptions:null,readFormat:null,initialize:function(options){OpenLayers.Protocol.prototype.initialize.apply(this,[options]);if(!options.format){this.format=OpenLayers.Format.WFST(OpenLayers.Util.extend({version:this.version,featureType:this.featureType,featureNS:this.featureNS,featurePrefix:this.featurePrefix,geometryName:this.geometryName,srsName:this.srsName,schema:this.schema},this.formatOptions));}
59819 if(!this.featureNS&&this.featurePrefix){var readNode=this.format.readNode;this.format.readNode=function(node,obj){if(!this.featureNS&&node.prefix==this.featurePrefix){this.featureNS=node.namespaceURI;this.setNamespace("feature",this.featureNS);}
59820 return readNode.apply(this,arguments);};}},destroy:function(){if(this.options&&!this.options.format){this.format.destroy();}
59821 this.format=null;OpenLayers.Protocol.prototype.destroy.apply(this);},read:function(options){OpenLayers.Protocol.prototype.read.apply(this,arguments);options=OpenLayers.Util.extend({},options);OpenLayers.Util.applyDefaults(options,this.options||{});var response=new OpenLayers.Protocol.Response({requestType:"read"});var data=OpenLayers.Format.XML.prototype.write.apply(this.format,[this.format.writeNode("wfs:GetFeature",options)]);response.priv=OpenLayers.Request.POST({url:options.url,callback:this.createCallback(this.handleRead,response,options),params:options.params,headers:options.headers,data:data});return response;},handleRead:function(response,options){if(options.callback){var request=response.priv;if(request.status>=200&&request.status<300){response.features=this.parseFeatures(request);response.code=OpenLayers.Protocol.Response.SUCCESS;}else{response.code=OpenLayers.Protocol.Response.FAILURE;}
59822 options.callback.call(options.scope,response);}},parseFeatures:function(request){var doc=request.responseXML;if(!doc||!doc.documentElement){doc=request.responseText;}
59823 if(!doc||doc.length<=0){return null;}
59824 return(this.readFormat!==null)?this.readFormat.read(doc):this.format.read(doc);},commit:function(features,options){options=OpenLayers.Util.extend({},options);OpenLayers.Util.applyDefaults(options,this.options);var response=new OpenLayers.Protocol.Response({requestType:"commit",reqFeatures:features});response.priv=OpenLayers.Request.POST({url:options.url,data:this.format.write(features,options),callback:this.createCallback(this.handleCommit,response,options)});return response;},handleCommit:function(response,options){if(options.callback){var request=response.priv;var data=request.responseXML;if(!data||!data.documentElement){data=request.responseText;}
59825 var obj=this.format.read(data)||{};response.insertIds=obj.insertIds||[];response.code=(obj.success)?OpenLayers.Protocol.Response.SUCCESS:OpenLayers.Protocol.Response.FAILURE;options.callback.call(options.scope,response);}},filterDelete:function(filter,options){options=OpenLayers.Util.extend({},options);OpenLayers.Util.applyDefaults(options,this.options);var response=new OpenLayers.Protocol.Response({requestType:"commit"});var root=this.format.createElementNSPlus("wfs:Transaction",{attributes:{service:"WFS",version:this.version}});var deleteNode=this.format.createElementNSPlus("wfs:Delete",{attributes:{typeName:(options.featureNS?this.featurePrefix+":":"")+
59826 options.featureType}});if(options.featureNS){deleteNode.setAttribute("xmlns:"+this.featurePrefix,options.featureNS);}
59827 var filterNode=this.format.writeNode("ogc:Filter",filter);deleteNode.appendChild(filterNode);root.appendChild(deleteNode);var data=OpenLayers.Format.XML.prototype.write.apply(this.format,[root]);return OpenLayers.Request.POST({url:this.url,callback:options.callback||function(){},data:data});},abort:function(response){if(response){response.priv.abort();}},CLASS_NAME:"OpenLayers.Protocol.WFS.v1"});OpenLayers.Renderer.SVG=OpenLayers.Class(OpenLayers.Renderer.Elements,{xmlns:"http://www.w3.org/2000/svg",xlinkns:"http://www.w3.org/1999/xlink",MAX_PIXEL:15000,translationParameters:null,symbolMetrics:null,isGecko:null,supportUse:null,initialize:function(containerID){if(!this.supported()){return;}
59828 OpenLayers.Renderer.Elements.prototype.initialize.apply(this,arguments);this.translationParameters={x:0,y:0};this.supportUse=(navigator.userAgent.toLowerCase().indexOf("applewebkit/5")==-1);this.isGecko=(navigator.userAgent.toLowerCase().indexOf("gecko/")!=-1);this.symbolMetrics={};},destroy:function(){OpenLayers.Renderer.Elements.prototype.destroy.apply(this,arguments);},supported:function(){var svgFeature="http://www.w3.org/TR/SVG11/feature#";return(document.implementation&&(document.implementation.hasFeature("org.w3c.svg","1.0")||document.implementation.hasFeature(svgFeature+"SVG","1.1")||document.implementation.hasFeature(svgFeature+"BasicStructure","1.1")));},inValidRange:function(x,y,xyOnly){var left=x+(xyOnly?0:this.translationParameters.x);var top=y+(xyOnly?0:this.translationParameters.y);return(left>=-this.MAX_PIXEL&&left<=this.MAX_PIXEL&&top>=-this.MAX_PIXEL&&top<=this.MAX_PIXEL);},setExtent:function(extent,resolutionChanged){OpenLayers.Renderer.Elements.prototype.setExtent.apply(this,arguments);var resolution=this.getResolution();var left=-extent.left/resolution;var top=extent.top/resolution;if(resolutionChanged){this.left=left;this.top=top;var extentString="0 0 "+this.size.w+" "+this.size.h;this.rendererRoot.setAttributeNS(null,"viewBox",extentString);this.translate(0,0);return true;}else{var inRange=this.translate(left-this.left,top-this.top);if(!inRange){this.setExtent(extent,true);}
59829 return inRange;}},translate:function(x,y){if(!this.inValidRange(x,y,true)){return false;}else{var transformString="";if(x||y){transformString="translate("+x+","+y+")";}
59830 this.root.setAttributeNS(null,"transform",transformString);this.translationParameters={x:x,y:y};return true;}},setSize:function(size){OpenLayers.Renderer.prototype.setSize.apply(this,arguments);this.rendererRoot.setAttributeNS(null,"width",this.size.w);this.rendererRoot.setAttributeNS(null,"height",this.size.h);},getNodeType:function(geometry,style){var nodeType=null;switch(geometry.CLASS_NAME){case"OpenLayers.Geometry.Point":if(style.externalGraphic){nodeType="image";}else if(this.isComplexSymbol(style.graphicName)){nodeType=this.supportUse===false?"svg":"use";}else{nodeType="circle";}
59831 break;case"OpenLayers.Geometry.Rectangle":nodeType="rect";break;case"OpenLayers.Geometry.LineString":nodeType="polyline";break;case"OpenLayers.Geometry.LinearRing":nodeType="polygon";break;case"OpenLayers.Geometry.Polygon":case"OpenLayers.Geometry.Curve":case"OpenLayers.Geometry.Surface":nodeType="path";break;default:break;}
59832 return nodeType;},setStyle:function(node,style,options){style=style||node._style;options=options||node._options;var r=parseFloat(node.getAttributeNS(null,"r"));var widthFactor=1;var pos;if(node._geometryClass=="OpenLayers.Geometry.Point"&&r){node.style.visibility="";if(style.graphic===false){node.style.visibility="hidden";}else if(style.externalGraphic){pos=this.getPosition(node);if(style.graphicTitle){node.setAttributeNS(null,"title",style.graphicTitle);}
59833 if(style.graphicWidth&&style.graphicHeight){node.setAttributeNS(null,"preserveAspectRatio","none");}
59834 var width=style.graphicWidth||style.graphicHeight;var height=style.graphicHeight||style.graphicWidth;width=width?width:style.pointRadius*2;height=height?height:style.pointRadius*2;var xOffset=(style.graphicXOffset!=undefined)?style.graphicXOffset:-(0.5*width);var yOffset=(style.graphicYOffset!=undefined)?style.graphicYOffset:-(0.5*height);var opacity=style.graphicOpacity||style.fillOpacity;node.setAttributeNS(null,"x",(pos.x+xOffset).toFixed());node.setAttributeNS(null,"y",(pos.y+yOffset).toFixed());node.setAttributeNS(null,"width",width);node.setAttributeNS(null,"height",height);node.setAttributeNS(this.xlinkns,"href",style.externalGraphic);node.setAttributeNS(null,"style","opacity: "+opacity);}else if(this.isComplexSymbol(style.graphicName)){var offset=style.pointRadius*3;var size=offset*2;var id=this.importSymbol(style.graphicName);pos=this.getPosition(node);widthFactor=this.symbolMetrics[id][0]*3/size;var parent=node.parentNode;var nextSibling=node.nextSibling;if(parent){parent.removeChild(node);}
59835 if(this.supportUse===false){var src=document.getElementById(id);node.firstChild&&node.removeChild(node.firstChild);node.appendChild(src.firstChild.cloneNode(true));node.setAttributeNS(null,"viewBox",src.getAttributeNS(null,"viewBox"));}else{node.setAttributeNS(this.xlinkns,"href","#"+id);}
59836 node.setAttributeNS(null,"width",size);node.setAttributeNS(null,"height",size);node.setAttributeNS(null,"x",pos.x-offset);node.setAttributeNS(null,"y",pos.y-offset);if(nextSibling){parent.insertBefore(node,nextSibling);}else if(parent){parent.appendChild(node);}}else{node.setAttributeNS(null,"r",style.pointRadius);}
59837 var rotation=style.rotation;if((rotation!==undefined||node._rotation!==undefined)&&pos){node._rotation=rotation;rotation|=0;if(node.nodeName!=="svg"){node.setAttributeNS(null,"transform","rotate("+rotation+" "+pos.x+" "+
59838 pos.y+")");}else{var metrics=this.symbolMetrics[id];node.firstChild.setAttributeNS(null,"transform","rotate("+style.rotation+" "+metrics[1]+" "+metrics[2]+")");}}}
59839 if(options.isFilled){node.setAttributeNS(null,"fill",style.fillColor);node.setAttributeNS(null,"fill-opacity",style.fillOpacity);}else{node.setAttributeNS(null,"fill","none");}
59840 if(options.isStroked){node.setAttributeNS(null,"stroke",style.strokeColor);node.setAttributeNS(null,"stroke-opacity",style.strokeOpacity);node.setAttributeNS(null,"stroke-width",style.strokeWidth*widthFactor);node.setAttributeNS(null,"stroke-linecap",style.strokeLinecap||"round");node.setAttributeNS(null,"stroke-linejoin","round");style.strokeDashstyle&&node.setAttributeNS(null,"stroke-dasharray",this.dashStyle(style,widthFactor));}else{node.setAttributeNS(null,"stroke","none");}
59841 if(style.pointerEvents){node.setAttributeNS(null,"pointer-events",style.pointerEvents);}
59842 if(style.cursor!=null){node.setAttributeNS(null,"cursor",style.cursor);}
59843 return node;},dashStyle:function(style,widthFactor){var w=style.strokeWidth*widthFactor;var str=style.strokeDashstyle;switch(str){case'solid':return'none';case'dot':return[1,4*w].join();case'dash':return[4*w,4*w].join();case'dashdot':return[4*w,4*w,1,4*w].join();case'longdash':return[8*w,4*w].join();case'longdashdot':return[8*w,4*w,1,4*w].join();default:return OpenLayers.String.trim(str).replace(/\s+/g,",");}},createNode:function(type,id){var node=document.createElementNS(this.xmlns,type);if(id){node.setAttributeNS(null,"id",id);}
59844 return node;},nodeTypeCompare:function(node,type){return(type==node.nodeName);},createRenderRoot:function(){return this.nodeFactory(this.container.id+"_svgRoot","svg");},createRoot:function(suffix){return this.nodeFactory(this.container.id+suffix,"g");},createDefs:function(){var defs=this.nodeFactory(this.container.id+"_defs","defs");this.rendererRoot.appendChild(defs);return defs;},drawPoint:function(node,geometry){return this.drawCircle(node,geometry,1);},drawCircle:function(node,geometry,radius){var resolution=this.getResolution();var x=(geometry.x/resolution+this.left);var y=(this.top-geometry.y/resolution);if(this.inValidRange(x,y)){node.setAttributeNS(null,"cx",x);node.setAttributeNS(null,"cy",y);node.setAttributeNS(null,"r",radius);return node;}else{return false;}},drawLineString:function(node,geometry){var componentsResult=this.getComponentsString(geometry.components);if(componentsResult.path){node.setAttributeNS(null,"points",componentsResult.path);return(componentsResult.complete?node:null);}else{return false;}},drawLinearRing:function(node,geometry){var componentsResult=this.getComponentsString(geometry.components);if(componentsResult.path){node.setAttributeNS(null,"points",componentsResult.path);return(componentsResult.complete?node:null);}else{return false;}},drawPolygon:function(node,geometry){var d="";var draw=true;var complete=true;var linearRingResult,path;for(var j=0,len=geometry.components.length;j<len;j++){d+=" M";linearRingResult=this.getComponentsString(geometry.components[j].components," ");path=linearRingResult.path;if(path){d+=" "+path;complete=linearRingResult.complete&&complete;}else{draw=false;}}
59845 d+=" z";if(draw){node.setAttributeNS(null,"d",d);node.setAttributeNS(null,"fill-rule","evenodd");return complete?node:null;}else{return false;}},drawRectangle:function(node,geometry){var resolution=this.getResolution();var x=(geometry.x/resolution+this.left);var y=(this.top-geometry.y/resolution);if(this.inValidRange(x,y)){node.setAttributeNS(null,"x",x);node.setAttributeNS(null,"y",y);node.setAttributeNS(null,"width",geometry.width/resolution);node.setAttributeNS(null,"height",geometry.height/resolution);return node;}else{return false;}},drawSurface:function(node,geometry){var d=null;var draw=true;for(var i=0,len=geometry.components.length;i<len;i++){if((i%3)==0&&(i/3)==0){var component=this.getShortString(geometry.components[i]);if(!component){draw=false;}
59846 d="M "+component;}else if((i%3)==1){var component=this.getShortString(geometry.components[i]);if(!component){draw=false;}
59847 d+=" C "+component;}else{var component=this.getShortString(geometry.components[i]);if(!component){draw=false;}
59848 d+=" "+component;}}
59849 d+=" Z";if(draw){node.setAttributeNS(null,"d",d);return node;}else{return false;}},drawText:function(featureId,style,location){var resolution=this.getResolution();var x=(location.x/resolution+this.left);var y=(location.y/resolution-this.top);var label=this.nodeFactory(featureId+this.LABEL_ID_SUFFIX,"text");var tspan=this.nodeFactory(featureId+this.LABEL_ID_SUFFIX+"_tspan","tspan");label.setAttributeNS(null,"x",x);label.setAttributeNS(null,"y",-y);if(style.fontColor){label.setAttributeNS(null,"fill",style.fontColor);}
59850 if(style.fontOpacity){label.setAttributeNS(null,"opacity",style.fontOpacity);}
59851 if(style.fontFamily){label.setAttributeNS(null,"font-family",style.fontFamily);}
59852 if(style.fontSize){label.setAttributeNS(null,"font-size",style.fontSize);}
59853 if(style.fontWeight){label.setAttributeNS(null,"font-weight",style.fontWeight);}
59854 if(style.labelSelect===true){label.setAttributeNS(null,"pointer-events","visible");label._featureId=featureId;tspan._featureId=featureId;tspan._geometry=location;tspan._geometryClass=location.CLASS_NAME;}else{label.setAttributeNS(null,"pointer-events","none");}
59855 var align=style.labelAlign||"cm";label.setAttributeNS(null,"text-anchor",OpenLayers.Renderer.SVG.LABEL_ALIGN[align[0]]||"middle");if(this.isGecko){label.setAttributeNS(null,"dominant-baseline",OpenLayers.Renderer.SVG.LABEL_ALIGN[align[1]]||"central");}else{tspan.setAttributeNS(null,"baseline-shift",OpenLayers.Renderer.SVG.LABEL_VSHIFT[align[1]]||"-35%");}
59856 tspan.textContent=style.label;if(!label.parentNode){label.appendChild(tspan);this.textRoot.appendChild(label);}},getComponentsString:function(components,separator){var renderCmp=[];var complete=true;var len=components.length;var strings=[];var str,component;for(var i=0;i<len;i++){component=components[i];renderCmp.push(component);str=this.getShortString(component);if(str){strings.push(str);}else{if(i>0){if(this.getShortString(components[i-1])){strings.push(this.clipLine(components[i],components[i-1]));}}
59857 if(i<len-1){if(this.getShortString(components[i+1])){strings.push(this.clipLine(components[i],components[i+1]));}}
59858 complete=false;}}
59859 return{path:strings.join(separator||","),complete:complete};},clipLine:function(badComponent,goodComponent){if(goodComponent.equals(badComponent)){return"";}
59860 var resolution=this.getResolution();var maxX=this.MAX_PIXEL-this.translationParameters.x;var maxY=this.MAX_PIXEL-this.translationParameters.y;var x1=goodComponent.x/resolution+this.left;var y1=this.top-goodComponent.y/resolution;var x2=badComponent.x/resolution+this.left;var y2=this.top-badComponent.y/resolution;var k;if(x2<-maxX||x2>maxX){k=(y2-y1)/(x2-x1);x2=x2<0?-maxX:maxX;y2=y1+(x2-x1)*k;}
59861 if(y2<-maxY||y2>maxY){k=(x2-x1)/(y2-y1);y2=y2<0?-maxY:maxY;x2=x1+(y2-y1)*k;}
59862 return x2+","+y2;},getShortString:function(point){var resolution=this.getResolution();var x=(point.x/resolution+this.left);var y=(this.top-point.y/resolution);if(this.inValidRange(x,y)){return x+","+y;}else{return false;}},getPosition:function(node){return({x:parseFloat(node.getAttributeNS(null,"cx")),y:parseFloat(node.getAttributeNS(null,"cy"))});},importSymbol:function(graphicName){if(!this.defs){this.defs=this.createDefs();}
59863 var id=this.container.id+"-"+graphicName;if(document.getElementById(id)!=null){return id;}
59864 var symbol=OpenLayers.Renderer.symbol[graphicName];if(!symbol){throw new Error(graphicName+' is not a valid symbol name');}
59865 var symbolNode=this.nodeFactory(id,"symbol");var node=this.nodeFactory(null,"polygon");symbolNode.appendChild(node);var symbolExtent=new OpenLayers.Bounds(Number.MAX_VALUE,Number.MAX_VALUE,0,0);var points=[];var x,y;for(var i=0;i<symbol.length;i=i+2){x=symbol[i];y=symbol[i+1];symbolExtent.left=Math.min(symbolExtent.left,x);symbolExtent.bottom=Math.min(symbolExtent.bottom,y);symbolExtent.right=Math.max(symbolExtent.right,x);symbolExtent.top=Math.max(symbolExtent.top,y);points.push(x,",",y);}
59866 node.setAttributeNS(null,"points",points.join(" "));var width=symbolExtent.getWidth();var height=symbolExtent.getHeight();var viewBox=[symbolExtent.left-width,symbolExtent.bottom-height,width*3,height*3];symbolNode.setAttributeNS(null,"viewBox",viewBox.join(" "));this.symbolMetrics[id]=[Math.max(width,height),symbolExtent.getCenterLonLat().lon,symbolExtent.getCenterLonLat().lat];this.defs.appendChild(symbolNode);return symbolNode.id;},getFeatureIdFromEvent:function(evt){var featureId=OpenLayers.Renderer.Elements.prototype.getFeatureIdFromEvent.apply(this,arguments);if(this.supportUse===false&&!featureId){var target=evt.target;featureId=target.parentNode&&target!=this.rendererRoot&&target.parentNode._featureId;}
59867 return featureId;},CLASS_NAME:"OpenLayers.Renderer.SVG"});OpenLayers.Renderer.SVG.LABEL_ALIGN={"l":"start","r":"end","b":"bottom","t":"hanging"};OpenLayers.Renderer.SVG.LABEL_VSHIFT={"t":"-70%","b":"0"};OpenLayers.Renderer.VML=OpenLayers.Class(OpenLayers.Renderer.Elements,{xmlns:"urn:schemas-microsoft-com:vml",symbolCache:{},offset:null,initialize:function(containerID){if(!this.supported()){return;}
59868 if(!document.namespaces.olv){document.namespaces.add("olv",this.xmlns);var style=document.createStyleSheet();var shapes=['shape','rect','oval','fill','stroke','imagedata','group','textbox'];for(var i=0,len=shapes.length;i<len;i++){style.addRule('olv\\:'+shapes[i],"behavior: url(#default#VML); "+"position: absolute; display: inline-block;");}}
59869 OpenLayers.Renderer.Elements.prototype.initialize.apply(this,arguments);},destroy:function(){OpenLayers.Renderer.Elements.prototype.destroy.apply(this,arguments);},supported:function(){return!!(document.namespaces);},setExtent:function(extent,resolutionChanged){OpenLayers.Renderer.Elements.prototype.setExtent.apply(this,arguments);var resolution=this.getResolution();var left=(extent.left/resolution)|0;var top=(extent.top/resolution-this.size.h)|0;if(resolutionChanged||!this.offset){this.offset={x:left,y:top};left=0;top=0;}else{left=left-this.offset.x;top=top-this.offset.y;}
59870 var org=left+" "+top;this.root.coordorigin=org;var roots=[this.root,this.vectorRoot,this.textRoot];var root;for(var i=0,len=roots.length;i<len;++i){root=roots[i];var size=this.size.w+" "+this.size.h;root.coordsize=size;}
59871 this.root.style.flip="y";return true;},setSize:function(size){OpenLayers.Renderer.prototype.setSize.apply(this,arguments);var roots=[this.rendererRoot,this.root,this.vectorRoot,this.textRoot];var w=this.size.w+"px";var h=this.size.h+"px";var root;for(var i=0,len=roots.length;i<len;++i){root=roots[i];root.style.width=w;root.style.height=h;}},getNodeType:function(geometry,style){var nodeType=null;switch(geometry.CLASS_NAME){case"OpenLayers.Geometry.Point":if(style.externalGraphic){nodeType="olv:rect";}else if(this.isComplexSymbol(style.graphicName)){nodeType="olv:shape";}else{nodeType="olv:oval";}
59872 break;case"OpenLayers.Geometry.Rectangle":nodeType="olv:rect";break;case"OpenLayers.Geometry.LineString":case"OpenLayers.Geometry.LinearRing":case"OpenLayers.Geometry.Polygon":case"OpenLayers.Geometry.Curve":case"OpenLayers.Geometry.Surface":nodeType="olv:shape";break;default:break;}
59873 return nodeType;},setStyle:function(node,style,options,geometry){style=style||node._style;options=options||node._options;var fillColor=style.fillColor;if(node._geometryClass==="OpenLayers.Geometry.Point"){if(style.externalGraphic){if(style.graphicTitle){node.title=style.graphicTitle;}
59874 var width=style.graphicWidth||style.graphicHeight;var height=style.graphicHeight||style.graphicWidth;width=width?width:style.pointRadius*2;height=height?height:style.pointRadius*2;var resolution=this.getResolution();var xOffset=(style.graphicXOffset!=undefined)?style.graphicXOffset:-(0.5*width);var yOffset=(style.graphicYOffset!=undefined)?style.graphicYOffset:-(0.5*height);node.style.left=(((geometry.x/resolution-this.offset.x)+xOffset)|0)+"px";node.style.top=(((geometry.y/resolution-this.offset.y)-(yOffset+height))|0)+"px";node.style.width=width+"px";node.style.height=height+"px";node.style.flip="y";fillColor="none";options.isStroked=false;}else if(this.isComplexSymbol(style.graphicName)){var cache=this.importSymbol(style.graphicName);node.path=cache.path;node.coordorigin=cache.left+","+cache.bottom;var size=cache.size;node.coordsize=size+","+size;this.drawCircle(node,geometry,style.pointRadius);node.style.flip="y";}else{this.drawCircle(node,geometry,style.pointRadius);}}
59875 if(options.isFilled){node.fillcolor=fillColor;}else{node.filled="false";}
59876 var fills=node.getElementsByTagName("fill");var fill=(fills.length==0)?null:fills[0];if(!options.isFilled){if(fill){node.removeChild(fill);}}else{if(!fill){fill=this.createNode('olv:fill',node.id+"_fill");}
59877 fill.opacity=style.fillOpacity;if(node._geometryClass==="OpenLayers.Geometry.Point"&&style.externalGraphic){if(style.graphicOpacity){fill.opacity=style.graphicOpacity;}
59878 fill.src=style.externalGraphic;fill.type="frame";if(!(style.graphicWidth&&style.graphicHeight)){fill.aspect="atmost";}}
59879 if(fill.parentNode!=node){node.appendChild(fill);}}
59880 var rotation=style.rotation;if((rotation!==undefined||node._rotation!==undefined)){node._rotation=rotation;if(style.externalGraphic){this.graphicRotate(node,xOffset,yOffset,style);fill.opacity=0;}else if(node._geometryClass==="OpenLayers.Geometry.Point"){node.style.rotation=rotation||0;}}
59881 var strokes=node.getElementsByTagName("stroke");var stroke=(strokes.length==0)?null:strokes[0];if(!options.isStroked){node.stroked=false;if(stroke){stroke.on=false;}}else{if(!stroke){stroke=this.createNode('olv:stroke',node.id+"_stroke");node.appendChild(stroke);}
59882 stroke.on=true;stroke.color=style.strokeColor;stroke.weight=style.strokeWidth+"px";stroke.opacity=style.strokeOpacity;stroke.endcap=style.strokeLinecap=='butt'?'flat':(style.strokeLinecap||'round');if(style.strokeDashstyle){stroke.dashstyle=this.dashStyle(style);}}
59883 if(style.cursor!="inherit"&&style.cursor!=null){node.style.cursor=style.cursor;}
59884 return node;},graphicRotate:function(node,xOffset,yOffset,style){var style=style||node._style;var rotation=style.rotation||0;var aspectRatio,size;if(!(style.graphicWidth&&style.graphicHeight)){var img=new Image();img.onreadystatechange=OpenLayers.Function.bind(function(){if(img.readyState=="complete"||img.readyState=="interactive"){aspectRatio=img.width/img.height;size=Math.max(style.pointRadius*2,style.graphicWidth||0,style.graphicHeight||0);xOffset=xOffset*aspectRatio;style.graphicWidth=size*aspectRatio;style.graphicHeight=size;this.graphicRotate(node,xOffset,yOffset,style);}},this);img.src=style.externalGraphic;return;}else{size=Math.max(style.graphicWidth,style.graphicHeight);aspectRatio=style.graphicWidth/style.graphicHeight;}
59885 var width=Math.round(style.graphicWidth||size*aspectRatio);var height=Math.round(style.graphicHeight||size);node.style.width=width+"px";node.style.height=height+"px";var image=document.getElementById(node.id+"_image");if(!image){image=this.createNode("olv:imagedata",node.id+"_image");node.appendChild(image);}
59886 image.style.width=width+"px";image.style.height=height+"px";image.src=style.externalGraphic;image.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader("+"src='', sizingMethod='scale')";var rot=rotation*Math.PI/180;var sintheta=Math.sin(rot);var costheta=Math.cos(rot);var filter="progid:DXImageTransform.Microsoft.Matrix(M11="+costheta+",M12="+(-sintheta)+",M21="+sintheta+",M22="+costheta+",SizingMethod='auto expand')\n";var opacity=style.graphicOpacity||style.fillOpacity;if(opacity&&opacity!=1){filter+="progid:DXImageTransform.Microsoft.BasicImage(opacity="+
59887 opacity+")\n";}
59888 node.style.filter=filter;var centerPoint=new OpenLayers.Geometry.Point(-xOffset,-yOffset);var imgBox=new OpenLayers.Bounds(0,0,width,height).toGeometry();imgBox.rotate(style.rotation,centerPoint);var imgBounds=imgBox.getBounds();node.style.left=Math.round(parseInt(node.style.left)+imgBounds.left)+"px";node.style.top=Math.round(parseInt(node.style.top)-imgBounds.bottom)+"px";},postDraw:function(node){node.style.visibility="visible";var fillColor=node._style.fillColor;var strokeColor=node._style.strokeColor;if(fillColor=="none"&&node.fillcolor!=fillColor){node.fillcolor=fillColor;}
59889 if(strokeColor=="none"&&node.strokecolor!=strokeColor){node.strokecolor=strokeColor;}},setNodeDimension:function(node,geometry){var bbox=geometry.getBounds();if(bbox){var resolution=this.getResolution();var scaledBox=new OpenLayers.Bounds((bbox.left/resolution-this.offset.x)|0,(bbox.bottom/resolution-this.offset.y)|0,(bbox.right/resolution-this.offset.x)|0,(bbox.top/resolution-this.offset.y)|0);node.style.left=scaledBox.left+"px";node.style.top=scaledBox.top+"px";node.style.width=scaledBox.getWidth()+"px";node.style.height=scaledBox.getHeight()+"px";node.coordorigin=scaledBox.left+" "+scaledBox.top;node.coordsize=scaledBox.getWidth()+" "+scaledBox.getHeight();}},dashStyle:function(style){var dash=style.strokeDashstyle;switch(dash){case'solid':case'dot':case'dash':case'dashdot':case'longdash':case'longdashdot':return dash;default:var parts=dash.split(/[ ,]/);if(parts.length==2){if(1*parts[0]>=2*parts[1]){return"longdash";}
59890 return(parts[0]==1||parts[1]==1)?"dot":"dash";}else if(parts.length==4){return(1*parts[0]>=2*parts[1])?"longdashdot":"dashdot";}
59891 return"solid";}},createNode:function(type,id){var node=document.createElement(type);if(id){node.id=id;}
59892 node.unselectable='on';node.onselectstart=OpenLayers.Function.False;return node;},nodeTypeCompare:function(node,type){var subType=type;var splitIndex=subType.indexOf(":");if(splitIndex!=-1){subType=subType.substr(splitIndex+1);}
59893 var nodeName=node.nodeName;splitIndex=nodeName.indexOf(":");if(splitIndex!=-1){nodeName=nodeName.substr(splitIndex+1);}
59894 return(subType==nodeName);},createRenderRoot:function(){return this.nodeFactory(this.container.id+"_vmlRoot","div");},createRoot:function(suffix){return this.nodeFactory(this.container.id+suffix,"olv:group");},drawPoint:function(node,geometry){return this.drawCircle(node,geometry,1);},drawCircle:function(node,geometry,radius){if(!isNaN(geometry.x)&&!isNaN(geometry.y)){var resolution=this.getResolution();node.style.left=(((geometry.x/resolution-this.offset.x)|0)-radius)+"px";node.style.top=(((geometry.y/resolution-this.offset.y)|0)-radius)+"px";var diameter=radius*2;node.style.width=diameter+"px";node.style.height=diameter+"px";return node;}
59895 return false;},drawLineString:function(node,geometry){return this.drawLine(node,geometry,false);},drawLinearRing:function(node,geometry){return this.drawLine(node,geometry,true);},drawLine:function(node,geometry,closeLine){this.setNodeDimension(node,geometry);var resolution=this.getResolution();var numComponents=geometry.components.length;var parts=new Array(numComponents);var comp,x,y;for(var i=0;i<numComponents;i++){comp=geometry.components[i];x=(comp.x/resolution-this.offset.x)|0;y=(comp.y/resolution-this.offset.y)|0;parts[i]=" "+x+","+y+" l ";}
59896 var end=(closeLine)?" x e":" e";node.path="m"+parts.join("")+end;return node;},drawPolygon:function(node,geometry){this.setNodeDimension(node,geometry);var resolution=this.getResolution();var path=[];var linearRing,i,j,len,ilen,comp,x,y;for(j=0,len=geometry.components.length;j<len;j++){linearRing=geometry.components[j];path.push("m");for(i=0,ilen=linearRing.components.length;i<ilen;i++){comp=linearRing.components[i];x=(comp.x/resolution-this.offset.x)|0;y=(comp.y/resolution-this.offset.y)|0;path.push(" "+x+","+y);if(i==0){path.push(" l");}}
59897 path.push(" x ");}
59898 path.push("e");node.path=path.join("");return node;},drawRectangle:function(node,geometry){var resolution=this.getResolution();node.style.left=((geometry.x/resolution-this.offset.x)|0)+"px";node.style.top=((geometry.y/resolution-this.offset.y)|0)+"px";node.style.width=((geometry.width/resolution)|0)+"px";node.style.height=((geometry.height/resolution)|0)+"px";return node;},drawText:function(featureId,style,location){var label=this.nodeFactory(featureId+this.LABEL_ID_SUFFIX,"olv:rect");var textbox=this.nodeFactory(featureId+this.LABEL_ID_SUFFIX+"_textbox","olv:textbox");var resolution=this.getResolution();label.style.left=((location.x/resolution-this.offset.x)|0)+"px";label.style.top=((location.y/resolution-this.offset.y)|0)+"px";label.style.flip="y";textbox.innerText=style.label;if(style.fontColor){textbox.style.color=style.fontColor;}
59899 if(style.fontOpacity){textbox.style.filter='alpha(opacity='+(style.fontOpacity*100)+')';}
59900 if(style.fontFamily){textbox.style.fontFamily=style.fontFamily;}
59901 if(style.fontSize){textbox.style.fontSize=style.fontSize;}
59902 if(style.fontWeight){textbox.style.fontWeight=style.fontWeight;}
59903 if(style.labelSelect===true){label._featureId=featureId;textbox._featureId=featureId;textbox._geometry=location;textbox._geometryClass=location.CLASS_NAME;}
59904 textbox.style.whiteSpace="nowrap";textbox.inset="1px,0px,0px,0px";if(!label.parentNode){label.appendChild(textbox);this.textRoot.appendChild(label);}
59905 var align=style.labelAlign||"cm";if(align.length==1){align+="m";}
59906 var xshift=textbox.clientWidth*(OpenLayers.Renderer.VML.LABEL_SHIFT[align.substr(0,1)]);var yshift=textbox.clientHeight*(OpenLayers.Renderer.VML.LABEL_SHIFT[align.substr(1,1)]);label.style.left=parseInt(label.style.left)-xshift-1+"px";label.style.top=parseInt(label.style.top)+yshift+"px";},drawSurface:function(node,geometry){this.setNodeDimension(node,geometry);var resolution=this.getResolution();var path=[];var comp,x,y;for(var i=0,len=geometry.components.length;i<len;i++){comp=geometry.components[i];x=(comp.x/resolution-this.offset.x)|0;y=(comp.y/resolution-this.offset.y)|0;if((i%3)==0&&(i/3)==0){path.push("m");}else if((i%3)==1){path.push(" c");}
59907 path.push(" "+x+","+y);}
59908 path.push(" x e");node.path=path.join("");return node;},moveRoot:function(renderer){var layer=this.map.getLayer(renderer.container.id);if(layer instanceof OpenLayers.Layer.Vector.RootContainer){layer=this.map.getLayer(this.container.id);}
59909 layer&&layer.renderer.clear();OpenLayers.Renderer.Elements.prototype.moveRoot.apply(this,arguments);layer&&layer.redraw();},importSymbol:function(graphicName){var id=this.container.id+"-"+graphicName;var cache=this.symbolCache[id];if(cache){return cache;}
59910 var symbol=OpenLayers.Renderer.symbol[graphicName];if(!symbol){throw new Error(graphicName+' is not a valid symbol name');}
59911 var symbolExtent=new OpenLayers.Bounds(Number.MAX_VALUE,Number.MAX_VALUE,0,0);var pathitems=["m"];for(var i=0;i<symbol.length;i=i+2){var x=symbol[i];var y=symbol[i+1];symbolExtent.left=Math.min(symbolExtent.left,x);symbolExtent.bottom=Math.min(symbolExtent.bottom,y);symbolExtent.right=Math.max(symbolExtent.right,x);symbolExtent.top=Math.max(symbolExtent.top,y);pathitems.push(x);pathitems.push(y);if(i==0){pathitems.push("l");}}
59912 pathitems.push("x e");var path=pathitems.join(" ");var diff=(symbolExtent.getWidth()-symbolExtent.getHeight())/2;if(diff>0){symbolExtent.bottom=symbolExtent.bottom-diff;symbolExtent.top=symbolExtent.top+diff;}else{symbolExtent.left=symbolExtent.left+diff;symbolExtent.right=symbolExtent.right-diff;}
59913 cache={path:path,size:symbolExtent.getWidth(),left:symbolExtent.left,bottom:symbolExtent.bottom};this.symbolCache[id]=cache;return cache;},CLASS_NAME:"OpenLayers.Renderer.VML"});OpenLayers.Renderer.VML.LABEL_SHIFT={"l":0,"c":.5,"r":1,"t":0,"m":.5,"b":1};OpenLayers.Tile=OpenLayers.Class({EVENT_TYPES:["loadstart","loadend","reload","unload"],events:null,id:null,layer:null,url:null,bounds:null,size:null,position:null,isLoading:false,initialize:function(layer,position,bounds,url,size){this.layer=layer;this.position=position.clone();this.bounds=bounds.clone();this.url=url;this.size=size.clone();this.id=OpenLayers.Util.createUniqueID("Tile_");this.events=new OpenLayers.Events(this,null,this.EVENT_TYPES);},unload:function(){if(this.isLoading){this.isLoading=false;this.events.triggerEvent("unload");}},destroy:function(){this.layer=null;this.bounds=null;this.size=null;this.position=null;this.events.destroy();this.events=null;},clone:function(obj){if(obj==null){obj=new OpenLayers.Tile(this.layer,this.position,this.bounds,this.url,this.size);}
59914 OpenLayers.Util.applyDefaults(obj,this);return obj;},draw:function(){var maxExtent=this.layer.maxExtent;var withinMaxExtent=(maxExtent&&this.bounds.intersectsBounds(maxExtent,false));this.shouldDraw=(withinMaxExtent||this.layer.displayOutsideMaxExtent);this.clear();return this.shouldDraw;},moveTo:function(bounds,position,redraw){if(redraw==null){redraw=true;}
59915 this.bounds=bounds.clone();this.position=position.clone();if(redraw){this.draw();}},clear:function(){},getBoundsFromBaseLayer:function(position){var msg=OpenLayers.i18n('reprojectDeprecated',{'layerName':this.layer.name});OpenLayers.Console.warn(msg);var topLeft=this.layer.map.getLonLatFromLayerPx(position);var bottomRightPx=position.clone();bottomRightPx.x+=this.size.w;bottomRightPx.y+=this.size.h;var bottomRight=this.layer.map.getLonLatFromLayerPx(bottomRightPx);if(topLeft.lon>bottomRight.lon){if(topLeft.lon<0){topLeft.lon=-180-(topLeft.lon+180);}else{bottomRight.lon=180+bottomRight.lon+180;}}
59916 var bounds=new OpenLayers.Bounds(topLeft.lon,bottomRight.lat,bottomRight.lon,topLeft.lat);return bounds;},showTile:function(){if(this.shouldDraw){this.show();}},show:function(){},hide:function(){},CLASS_NAME:"OpenLayers.Tile"});OpenLayers.Control.MouseToolbar=OpenLayers.Class(OpenLayers.Control.MouseDefaults,{mode:null,buttons:null,direction:"vertical",buttonClicked:null,initialize:function(position,direction){OpenLayers.Control.prototype.initialize.apply(this,arguments);this.position=new OpenLayers.Pixel(OpenLayers.Control.MouseToolbar.X,OpenLayers.Control.MouseToolbar.Y);if(position){this.position=position;}
59917 if(direction){this.direction=direction;}
59918 this.measureDivs=[];},destroy:function(){for(var btnId in this.buttons){var btn=this.buttons[btnId];btn.map=null;btn.events.destroy();}
59919 OpenLayers.Control.MouseDefaults.prototype.destroy.apply(this,arguments);},draw:function(){OpenLayers.Control.prototype.draw.apply(this,arguments);OpenLayers.Control.MouseDefaults.prototype.draw.apply(this,arguments);this.buttons={};var sz=new OpenLayers.Size(28,28);var centered=new OpenLayers.Pixel(OpenLayers.Control.MouseToolbar.X,0);this._addButton("zoombox","drag-rectangle-off.png","drag-rectangle-on.png",centered,sz,"Shift->Drag to zoom to area");centered=centered.add((this.direction=="vertical"?0:sz.w),(this.direction=="vertical"?sz.h:0));this._addButton("pan","panning-hand-off.png","panning-hand-on.png",centered,sz,"Drag the map to pan.");centered=centered.add((this.direction=="vertical"?0:sz.w),(this.direction=="vertical"?sz.h:0));this.switchModeTo("pan");return this.div;},_addButton:function(id,img,activeImg,xy,sz,title){var imgLocation=OpenLayers.Util.getImagesLocation()+img;var activeImgLocation=OpenLayers.Util.getImagesLocation()+activeImg;var btn=OpenLayers.Util.createAlphaImageDiv("OpenLayers_Control_MouseToolbar_"+id,xy,sz,imgLocation,"absolute");this.div.appendChild(btn);btn.imgLocation=imgLocation;btn.activeImgLocation=activeImgLocation;btn.events=new OpenLayers.Events(this,btn,null,true);btn.events.on({"mousedown":this.buttonDown,"mouseup":this.buttonUp,"dblclick":OpenLayers.Event.stop,scope:this});btn.action=id;btn.title=title;btn.alt=title;btn.map=this.map;this.buttons[id]=btn;return btn;},buttonDown:function(evt){if(!OpenLayers.Event.isLeftClick(evt)){return;}
59920 this.buttonClicked=evt.element.action;OpenLayers.Event.stop(evt);},buttonUp:function(evt){if(!OpenLayers.Event.isLeftClick(evt)){return;}
59921 if(this.buttonClicked!=null){if(this.buttonClicked==evt.element.action){this.switchModeTo(evt.element.action);}
59922 OpenLayers.Event.stop(evt);this.buttonClicked=null;}},defaultDblClick:function(evt){this.switchModeTo("pan");this.performedDrag=false;var newCenter=this.map.getLonLatFromViewPortPx(evt.xy);this.map.setCenter(newCenter,this.map.zoom+1);OpenLayers.Event.stop(evt);return false;},defaultMouseDown:function(evt){if(!OpenLayers.Event.isLeftClick(evt)){return;}
59923 this.mouseDragStart=evt.xy.clone();this.performedDrag=false;this.startViaKeyboard=false;if(evt.shiftKey&&this.mode!="zoombox"){this.switchModeTo("zoombox");this.startViaKeyboard=true;}else if(evt.altKey&&this.mode!="measure"){this.switchModeTo("measure");}else if(!this.mode){this.switchModeTo("pan");}
59924 switch(this.mode){case"zoombox":this.map.div.style.cursor="crosshair";this.zoomBox=OpenLayers.Util.createDiv('zoomBox',this.mouseDragStart,null,null,"absolute","2px solid red");this.zoomBox.style.backgroundColor="white";this.zoomBox.style.filter="alpha(opacity=50)";this.zoomBox.style.opacity="0.50";this.zoomBox.style.fontSize="1px";this.zoomBox.style.zIndex=this.map.Z_INDEX_BASE["Popup"]-1;this.map.viewPortDiv.appendChild(this.zoomBox);this.performedDrag=true;break;case"measure":var distance="";if(this.measureStart){var measureEnd=this.map.getLonLatFromViewPortPx(this.mouseDragStart);distance=OpenLayers.Util.distVincenty(this.measureStart,measureEnd);distance=Math.round(distance*100)/100;distance=distance+"km";this.measureStartBox=this.measureBox;}
59925 this.measureStart=this.map.getLonLatFromViewPortPx(this.mouseDragStart);;this.measureBox=OpenLayers.Util.createDiv(null,this.mouseDragStart.add(-2-parseInt(this.map.layerContainerDiv.style.left),-2-parseInt(this.map.layerContainerDiv.style.top)),null,null,"absolute");this.measureBox.style.width="4px";this.measureBox.style.height="4px";this.measureBox.style.fontSize="1px";this.measureBox.style.backgroundColor="red";this.measureBox.style.zIndex=this.map.Z_INDEX_BASE["Popup"]-1;this.map.layerContainerDiv.appendChild(this.measureBox);if(distance){this.measureBoxDistance=OpenLayers.Util.createDiv(null,this.mouseDragStart.add(-2-parseInt(this.map.layerContainerDiv.style.left),2-parseInt(this.map.layerContainerDiv.style.top)),null,null,"absolute");this.measureBoxDistance.innerHTML=distance;this.measureBoxDistance.style.zIndex=this.map.Z_INDEX_BASE["Popup"]-1;this.map.layerContainerDiv.appendChild(this.measureBoxDistance);this.measureDivs.push(this.measureBoxDistance);}
59926 this.measureBox.style.zIndex=this.map.Z_INDEX_BASE["Popup"]-1;this.map.layerContainerDiv.appendChild(this.measureBox);this.measureDivs.push(this.measureBox);break;default:this.map.div.style.cursor="move";break;}
59927 document.onselectstart=OpenLayers.Function.False;OpenLayers.Event.stop(evt);},switchModeTo:function(mode){if(mode!=this.mode){if(this.mode&&this.buttons[this.mode]){OpenLayers.Util.modifyAlphaImageDiv(this.buttons[this.mode],null,null,null,this.buttons[this.mode].imgLocation);}
59928 if(this.mode=="measure"&&mode!="measure"){for(var i=0,len=this.measureDivs.length;i<len;i++){if(this.measureDivs[i]){this.map.layerContainerDiv.removeChild(this.measureDivs[i]);}}
59929 this.measureDivs=[];this.measureStart=null;}
59930 this.mode=mode;if(this.buttons[mode]){OpenLayers.Util.modifyAlphaImageDiv(this.buttons[mode],null,null,null,this.buttons[mode].activeImgLocation);}
59931 switch(this.mode){case"zoombox":this.map.div.style.cursor="crosshair";break;default:this.map.div.style.cursor="";break;}}},leaveMode:function(){this.switchModeTo("pan");},defaultMouseMove:function(evt){if(this.mouseDragStart!=null){switch(this.mode){case"zoombox":var deltaX=Math.abs(this.mouseDragStart.x-evt.xy.x);var deltaY=Math.abs(this.mouseDragStart.y-evt.xy.y);this.zoomBox.style.width=Math.max(1,deltaX)+"px";this.zoomBox.style.height=Math.max(1,deltaY)+"px";if(evt.xy.x<this.mouseDragStart.x){this.zoomBox.style.left=evt.xy.x+"px";}
59932 if(evt.xy.y<this.mouseDragStart.y){this.zoomBox.style.top=evt.xy.y+"px";}
59933 break;default:var deltaX=this.mouseDragStart.x-evt.xy.x;var deltaY=this.mouseDragStart.y-evt.xy.y;var size=this.map.getSize();var newXY=new OpenLayers.Pixel(size.w/2+deltaX,size.h/2+deltaY);var newCenter=this.map.getLonLatFromViewPortPx(newXY);this.map.setCenter(newCenter,null,true);this.mouseDragStart=evt.xy.clone();}
59934 this.performedDrag=true;}},defaultMouseUp:function(evt){if(!OpenLayers.Event.isLeftClick(evt)){return;}
59935 switch(this.mode){case"zoombox":this.zoomBoxEnd(evt);if(this.startViaKeyboard){this.leaveMode();}
59936 break;case"pan":if(this.performedDrag){this.map.setCenter(this.map.center);}}
59937 document.onselectstart=null;this.mouseDragStart=null;this.map.div.style.cursor="default";},defaultMouseOut:function(evt){if(this.mouseDragStart!=null&&OpenLayers.Util.mouseLeft(evt,this.map.div)){if(this.zoomBox){this.removeZoomBox();if(this.startViaKeyboard){this.leaveMode();}}
59938 this.mouseDragStart=null;this.map.div.style.cursor="default";}},defaultClick:function(evt){if(this.performedDrag){this.performedDrag=false;return false;}},CLASS_NAME:"OpenLayers.Control.MouseToolbar"});OpenLayers.Control.MouseToolbar.X=6;OpenLayers.Control.MouseToolbar.Y=300;OpenLayers.Control.NavigationHistory=OpenLayers.Class(OpenLayers.Control,{type:OpenLayers.Control.TYPE_TOGGLE,previous:null,previousOptions:null,next:null,nextOptions:null,limit:50,autoActivate:true,clearOnDeactivate:false,registry:null,nextStack:null,previousStack:null,listeners:null,restoring:false,initialize:function(options){OpenLayers.Control.prototype.initialize.apply(this,[options]);this.registry=OpenLayers.Util.extend({"moveend":this.getState},this.registry);var previousOptions={trigger:OpenLayers.Function.bind(this.previousTrigger,this),displayClass:this.displayClass+" "+this.displayClass+"Previous"};OpenLayers.Util.extend(previousOptions,this.previousOptions);this.previous=new OpenLayers.Control.Button(previousOptions);var nextOptions={trigger:OpenLayers.Function.bind(this.nextTrigger,this),displayClass:this.displayClass+" "+this.displayClass+"Next"};OpenLayers.Util.extend(nextOptions,this.nextOptions);this.next=new OpenLayers.Control.Button(nextOptions);this.clear();},onPreviousChange:function(state,length){if(state&&!this.previous.active){this.previous.activate();}else if(!state&&this.previous.active){this.previous.deactivate();}},onNextChange:function(state,length){if(state&&!this.next.active){this.next.activate();}else if(!state&&this.next.active){this.next.deactivate();}},destroy:function(){OpenLayers.Control.prototype.destroy.apply(this);this.previous.destroy();this.next.destroy();this.deactivate();for(var prop in this){this[prop]=null;}},setMap:function(map){this.map=map;this.next.setMap(map);this.previous.setMap(map);},draw:function(){OpenLayers.Control.prototype.draw.apply(this,arguments);this.next.draw();this.previous.draw();},previousTrigger:function(){var current=this.previousStack.shift();var state=this.previousStack.shift();if(state!=undefined){this.nextStack.unshift(current);this.previousStack.unshift(state);this.restoring=true;this.restore(state);this.restoring=false;this.onNextChange(this.nextStack[0],this.nextStack.length);this.onPreviousChange(this.previousStack[1],this.previousStack.length-1);}else{this.previousStack.unshift(current);}
59939 return state;},nextTrigger:function(){var state=this.nextStack.shift();if(state!=undefined){this.previousStack.unshift(state);this.restoring=true;this.restore(state);this.restoring=false;this.onNextChange(this.nextStack[0],this.nextStack.length);this.onPreviousChange(this.previousStack[1],this.previousStack.length-1);}
59940 return state;},clear:function(){this.previousStack=[];this.previous.deactivate();this.nextStack=[];this.next.deactivate();},getState:function(){return{center:this.map.getCenter(),resolution:this.map.getResolution(),projection:this.map.getProjectionObject(),units:this.map.getProjectionObject().getUnits()||this.map.units||this.map.baseLayer.units};},restore:function(state){var center,zoom;if(this.map.getProjectionObject()==state.projection){zoom=this.map.getZoomForResolution(state.resolution);center=state.center;}else{center=state.center.clone();center.transform(state.projection,this.map.getProjectionObject());var sourceUnits=state.units;var targetUnits=this.map.getProjectionObject().getUnits()||this.map.units||this.map.baseLayer.units;var resolutionFactor=sourceUnits&&targetUnits?OpenLayers.INCHES_PER_UNIT[sourceUnits]/OpenLayers.INCHES_PER_UNIT[targetUnits]:1;zoom=this.map.getZoomForResolution(resolutionFactor*state.resolution);}
59941 this.map.setCenter(center,zoom);},setListeners:function(){this.listeners={};for(var type in this.registry){this.listeners[type]=OpenLayers.Function.bind(function(){if(!this.restoring){var state=this.registry[type].apply(this,arguments);this.previousStack.unshift(state);if(this.previousStack.length>1){this.onPreviousChange(this.previousStack[1],this.previousStack.length-1);}
59942 if(this.previousStack.length>(this.limit+1)){this.previousStack.pop();}
59943 if(this.nextStack.length>0){this.nextStack=[];this.onNextChange(null,0);}}
59944 return true;},this);}},activate:function(){var activated=false;if(this.map){if(OpenLayers.Control.prototype.activate.apply(this)){if(this.listeners==null){this.setListeners();}
59945 for(var type in this.listeners){this.map.events.register(type,this,this.listeners[type]);}
59946 activated=true;if(this.previousStack.length==0){this.initStack();}}}
59947 return activated;},initStack:function(){if(this.map.getCenter()){this.listeners.moveend();}},deactivate:function(){var deactivated=false;if(this.map){if(OpenLayers.Control.prototype.deactivate.apply(this)){for(var type in this.listeners){this.map.events.unregister(type,this,this.listeners[type]);}
59948 if(this.clearOnDeactivate){this.clear();}
59949 deactivated=true;}}
59950 return deactivated;},CLASS_NAME:"OpenLayers.Control.NavigationHistory"});OpenLayers.Control.PanPanel=OpenLayers.Class(OpenLayers.Control.Panel,{slideFactor:50,initialize:function(options){OpenLayers.Control.Panel.prototype.initialize.apply(this,[options]);this.addControls([new OpenLayers.Control.Pan(OpenLayers.Control.Pan.NORTH,{slideFactor:this.slideFactor}),new OpenLayers.Control.Pan(OpenLayers.Control.Pan.SOUTH,{slideFactor:this.slideFactor}),new OpenLayers.Control.Pan(OpenLayers.Control.Pan.EAST,{slideFactor:this.slideFactor}),new OpenLayers.Control.Pan(OpenLayers.Control.Pan.WEST,{slideFactor:this.slideFactor})]);},CLASS_NAME:"OpenLayers.Control.PanPanel"});OpenLayers.Control.PanZoomBar=OpenLayers.Class(OpenLayers.Control.PanZoom,{zoomStopWidth:18,zoomStopHeight:11,slider:null,sliderEvents:null,zoombarDiv:null,divEvents:null,zoomWorldIcon:false,forceFixedZoomLevel:false,mouseDragStart:null,zoomStart:null,initialize:function(){OpenLayers.Control.PanZoom.prototype.initialize.apply(this,arguments);},destroy:function(){this._removeZoomBar();this.map.events.un({"changebaselayer":this.redraw,scope:this});OpenLayers.Control.PanZoom.prototype.destroy.apply(this,arguments);delete this.mouseDragStart;delete this.zoomStart;},setMap:function(map){OpenLayers.Control.PanZoom.prototype.setMap.apply(this,arguments);this.map.events.register("changebaselayer",this,this.redraw);},redraw:function(){if(this.div!=null){this.removeButtons();this._removeZoomBar();}
59951 this.draw();},draw:function(px){OpenLayers.Control.prototype.draw.apply(this,arguments);px=this.position.clone();this.buttons=[];var sz=new OpenLayers.Size(18,18);var centered=new OpenLayers.Pixel(px.x+sz.w/2,px.y);var wposition=sz.w;if(this.zoomWorldIcon){centered=new OpenLayers.Pixel(px.x+sz.w,px.y);}
59952 this._addButton("panup","north-mini.png",centered,sz);px.y=centered.y+sz.h;this._addButton("panleft","west-mini.png",px,sz);if(this.zoomWorldIcon){this._addButton("zoomworld","zoom-world-mini.png",px.add(sz.w,0),sz);wposition*=2;}
59953 this._addButton("panright","east-mini.png",px.add(wposition,0),sz);this._addButton("pandown","south-mini.png",centered.add(0,sz.h*2),sz);this._addButton("zoomin","zoom-plus-mini.png",centered.add(0,sz.h*3+5),sz);centered=this._addZoomBar(centered.add(0,sz.h*4+5));this._addButton("zoomout","zoom-minus-mini.png",centered,sz);return this.div;},_addZoomBar:function(centered){var imgLocation=OpenLayers.Util.getImagesLocation();var id=this.id+"_"+this.map.id;var zoomsToEnd=this.map.getNumZoomLevels()-1-this.map.getZoom();var slider=OpenLayers.Util.createAlphaImageDiv(id,centered.add(-1,zoomsToEnd*this.zoomStopHeight),new OpenLayers.Size(20,9),imgLocation+"slider.png","absolute");this.slider=slider;this.sliderEvents=new OpenLayers.Events(this,slider,null,true,{includeXY:true});this.sliderEvents.on({"mousedown":this.zoomBarDown,"mousemove":this.zoomBarDrag,"mouseup":this.zoomBarUp,"dblclick":this.doubleClick,"click":this.doubleClick});var sz=new OpenLayers.Size();sz.h=this.zoomStopHeight*this.map.getNumZoomLevels();sz.w=this.zoomStopWidth;var div=null;if(OpenLayers.Util.alphaHack()){var id=this.id+"_"+this.map.id;div=OpenLayers.Util.createAlphaImageDiv(id,centered,new OpenLayers.Size(sz.w,this.zoomStopHeight),imgLocation+"zoombar.png","absolute",null,"crop");div.style.height=sz.h+"px";}else{div=OpenLayers.Util.createDiv('OpenLayers_Control_PanZoomBar_Zoombar'+this.map.id,centered,sz,imgLocation+"zoombar.png");}
59954 this.zoombarDiv=div;this.divEvents=new OpenLayers.Events(this,div,null,true,{includeXY:true});this.divEvents.on({"mousedown":this.divClick,"mousemove":this.passEventToSlider,"dblclick":this.doubleClick,"click":this.doubleClick});this.div.appendChild(div);this.startTop=parseInt(div.style.top);this.div.appendChild(slider);this.map.events.register("zoomend",this,this.moveZoomBar);centered=centered.add(0,this.zoomStopHeight*this.map.getNumZoomLevels());return centered;},_removeZoomBar:function(){this.sliderEvents.un({"mousedown":this.zoomBarDown,"mousemove":this.zoomBarDrag,"mouseup":this.zoomBarUp,"dblclick":this.doubleClick,"click":this.doubleClick});this.sliderEvents.destroy();this.divEvents.un({"mousedown":this.divClick,"mousemove":this.passEventToSlider,"dblclick":this.doubleClick,"click":this.doubleClick});this.divEvents.destroy();this.div.removeChild(this.zoombarDiv);this.zoombarDiv=null;this.div.removeChild(this.slider);this.slider=null;this.map.events.unregister("zoomend",this,this.moveZoomBar);},passEventToSlider:function(evt){this.sliderEvents.handleBrowserEvent(evt);},divClick:function(evt){if(!OpenLayers.Event.isLeftClick(evt)){return;}
59955 var y=evt.xy.y;var top=OpenLayers.Util.pagePosition(evt.object)[1];var levels=(y-top)/this.zoomStopHeight;if(this.forceFixedZoomLevel||!this.map.fractionalZoom){levels=Math.floor(levels);}
59956 var zoom=(this.map.getNumZoomLevels()-1)-levels;zoom=Math.min(Math.max(zoom,0),this.map.getNumZoomLevels()-1);this.map.zoomTo(zoom);OpenLayers.Event.stop(evt);},zoomBarDown:function(evt){if(!OpenLayers.Event.isLeftClick(evt)){return;}
59957 this.map.events.on({"mousemove":this.passEventToSlider,"mouseup":this.passEventToSlider,scope:this});this.mouseDragStart=evt.xy.clone();this.zoomStart=evt.xy.clone();this.div.style.cursor="move";this.zoombarDiv.offsets=null;OpenLayers.Event.stop(evt);},zoomBarDrag:function(evt){if(this.mouseDragStart!=null){var deltaY=this.mouseDragStart.y-evt.xy.y;var offsets=OpenLayers.Util.pagePosition(this.zoombarDiv);if((evt.clientY-offsets[1])>0&&(evt.clientY-offsets[1])<parseInt(this.zoombarDiv.style.height)-2){var newTop=parseInt(this.slider.style.top)-deltaY;this.slider.style.top=newTop+"px";this.mouseDragStart=evt.xy.clone();}
59958 OpenLayers.Event.stop(evt);}},zoomBarUp:function(evt){if(!OpenLayers.Event.isLeftClick(evt)){return;}
59959 if(this.mouseDragStart){this.div.style.cursor="";this.map.events.un({"mouseup":this.passEventToSlider,"mousemove":this.passEventToSlider,scope:this});var deltaY=this.zoomStart.y-evt.xy.y;var zoomLevel=this.map.zoom;if(!this.forceFixedZoomLevel&&this.map.fractionalZoom){zoomLevel+=deltaY/this.zoomStopHeight;zoomLevel=Math.min(Math.max(zoomLevel,0),this.map.getNumZoomLevels()-1);}else{zoomLevel+=Math.round(deltaY/this.zoomStopHeight);}
59960 this.map.zoomTo(zoomLevel);this.mouseDragStart=null;this.zoomStart=null;OpenLayers.Event.stop(evt);}},moveZoomBar:function(){var newTop=((this.map.getNumZoomLevels()-1)-this.map.getZoom())*this.zoomStopHeight+this.startTop+1;this.slider.style.top=newTop+"px";},CLASS_NAME:"OpenLayers.Control.PanZoomBar"});OpenLayers.Control.Permalink=OpenLayers.Class(OpenLayers.Control,{argParserClass:OpenLayers.Control.ArgParser,element:null,base:'',displayProjection:null,initialize:function(element,base,options){OpenLayers.Control.prototype.initialize.apply(this,[options]);this.element=OpenLayers.Util.getElement(element);this.base=base||document.location.href;},destroy:function(){if(this.element.parentNode==this.div){this.div.removeChild(this.element);}
59961 this.element=null;this.map.events.unregister('moveend',this,this.updateLink);OpenLayers.Control.prototype.destroy.apply(this,arguments);},setMap:function(map){OpenLayers.Control.prototype.setMap.apply(this,arguments);for(var i=0,len=this.map.controls.length;i<len;i++){var control=this.map.controls[i];if(control.CLASS_NAME==this.argParserClass.CLASS_NAME){if(control.displayProjection!=this.displayProjection){this.displayProjection=control.displayProjection;}
59962 break;}}
59963 if(i==this.map.controls.length){this.map.addControl(new this.argParserClass({'displayProjection':this.displayProjection}));}},draw:function(){OpenLayers.Control.prototype.draw.apply(this,arguments);if(!this.element){this.div.className=this.displayClass;this.element=document.createElement("a");this.element.innerHTML=OpenLayers.i18n("permalink");this.element.href="";this.div.appendChild(this.element);}
59964 this.map.events.on({'moveend':this.updateLink,'changelayer':this.updateLink,'changebaselayer':this.updateLink,scope:this});this.updateLink();return this.div;},updateLink:function(){var href=this.base;if(href.indexOf('?')!=-1){href=href.substring(0,href.indexOf('?'));}
59965 href+='?'+OpenLayers.Util.getParameterString(this.createParams());this.element.href=href;},createParams:function(center,zoom,layers){center=center||this.map.getCenter();var params=OpenLayers.Util.getParameters(this.base);if(center){params.zoom=zoom||this.map.getZoom();var lat=center.lat;var lon=center.lon;if(this.displayProjection){var mapPosition=OpenLayers.Projection.transform({x:lon,y:lat},this.map.getProjectionObject(),this.displayProjection);lon=mapPosition.x;lat=mapPosition.y;}
59966 params.lat=Math.round(lat*100000)/100000;params.lon=Math.round(lon*100000)/100000;layers=layers||this.map.layers;params.layers='';for(var i=0,len=layers.length;i<len;i++){var layer=layers[i];if(layer.isBaseLayer){params.layers+=(layer==this.map.baseLayer)?"B":"0";}else{params.layers+=(layer.getVisibility())?"T":"F";}}}
59967 return params;},CLASS_NAME:"OpenLayers.Control.Permalink"});OpenLayers.Control.ZoomPanel=OpenLayers.Class(OpenLayers.Control.Panel,{initialize:function(options){OpenLayers.Control.Panel.prototype.initialize.apply(this,[options]);this.addControls([new OpenLayers.Control.ZoomIn(),new OpenLayers.Control.ZoomToMaxExtent(),new OpenLayers.Control.ZoomOut()]);},CLASS_NAME:"OpenLayers.Control.ZoomPanel"});OpenLayers.Format.CSWGetDomain=function(options){options=OpenLayers.Util.applyDefaults(options,OpenLayers.Format.CSWGetDomain.DEFAULTS);var cls=OpenLayers.Format.CSWGetDomain["v"+options.version.replace(/\./g,"_")];if(!cls){throw"Unsupported CSWGetDomain version: "+options.version;}
59968 return new cls(options);};OpenLayers.Format.CSWGetDomain.DEFAULTS={"version":"2.0.2"};OpenLayers.Format.CSWGetRecords=function(options){options=OpenLayers.Util.applyDefaults(options,OpenLayers.Format.CSWGetRecords.DEFAULTS);var cls=OpenLayers.Format.CSWGetRecords["v"+options.version.replace(/\./g,"_")];if(!cls){throw"Unsupported CSWGetRecords version: "+options.version;}
59969 return new cls(options);};OpenLayers.Format.CSWGetRecords.DEFAULTS={"version":"2.0.2"};OpenLayers.Format.JSON=OpenLayers.Class(OpenLayers.Format,{indent:"    ",space:" ",newline:"\n",level:0,pretty:false,initialize:function(options){OpenLayers.Format.prototype.initialize.apply(this,[options]);},read:function(json,filter){try{if(/^[\],:{}\s]*$/.test(json.replace(/\\["\\\/bfnrtu]/g,'@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']').replace(/(?:^|:|,)(?:\s*\[)+/g,''))){var object=eval('('+json+')');if(typeof filter==='function'){function walk(k,v){if(v&&typeof v==='object'){for(var i in v){if(v.hasOwnProperty(i)){v[i]=walk(i,v[i]);}}}
59970 return filter(k,v);}
59971 object=walk('',object);}
59972 if(this.keepData){this.data=object;}
59973 return object;}}catch(e){}
59974 return null;},write:function(value,pretty){this.pretty=!!pretty;var json=null;var type=typeof value;if(this.serialize[type]){try{json=this.serialize[type].apply(this,[value]);}catch(err){OpenLayers.Console.error("Trouble serializing: "+err);}}
59975 return json;},writeIndent:function(){var pieces=[];if(this.pretty){for(var i=0;i<this.level;++i){pieces.push(this.indent);}}
59976 return pieces.join('');},writeNewline:function(){return(this.pretty)?this.newline:'';},writeSpace:function(){return(this.pretty)?this.space:'';},serialize:{'object':function(object){if(object==null){return"null";}
59977 if(object.constructor==Date){return this.serialize.date.apply(this,[object]);}
59978 if(object.constructor==Array){return this.serialize.array.apply(this,[object]);}
59979 var pieces=['{'];this.level+=1;var key,keyJSON,valueJSON;var addComma=false;for(key in object){if(object.hasOwnProperty(key)){keyJSON=OpenLayers.Format.JSON.prototype.write.apply(this,[key,this.pretty]);valueJSON=OpenLayers.Format.JSON.prototype.write.apply(this,[object[key],this.pretty]);if(keyJSON!=null&&valueJSON!=null){if(addComma){pieces.push(',');}
59980 pieces.push(this.writeNewline(),this.writeIndent(),keyJSON,':',this.writeSpace(),valueJSON);addComma=true;}}}
59981 this.level-=1;pieces.push(this.writeNewline(),this.writeIndent(),'}');return pieces.join('');},'array':function(array){var json;var pieces=['['];this.level+=1;for(var i=0,len=array.length;i<len;++i){json=OpenLayers.Format.JSON.prototype.write.apply(this,[array[i],this.pretty]);if(json!=null){if(i>0){pieces.push(',');}
59982 pieces.push(this.writeNewline(),this.writeIndent(),json);}}
59983 this.level-=1;pieces.push(this.writeNewline(),this.writeIndent(),']');return pieces.join('');},'string':function(string){var m={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'};if(/["\\\x00-\x1f]/.test(string)){return'"'+string.replace(/([\x00-\x1f\\"])/g,function(a,b){var c=m[b];if(c){return c;}
59984 c=b.charCodeAt();return'\\u00'+
59985 Math.floor(c/16).toString(16)+
59986 (c%16).toString(16);})+'"';}
59987 return'"'+string+'"';},'number':function(number){return isFinite(number)?String(number):"null";},'boolean':function(bool){return String(bool);},'date':function(date){function format(number){return(number<10)?'0'+number:number;}
59988 return'"'+date.getFullYear()+'-'+
59989 format(date.getMonth()+1)+'-'+
59990 format(date.getDate())+'T'+
59991 format(date.getHours())+':'+
59992 format(date.getMinutes())+':'+
59993 format(date.getSeconds())+'"';}},CLASS_NAME:"OpenLayers.Format.JSON"});OpenLayers.Format.WFST=function(options){options=OpenLayers.Util.applyDefaults(options,OpenLayers.Format.WFST.DEFAULTS);var cls=OpenLayers.Format.WFST["v"+options.version.replace(/\./g,"_")];if(!cls){throw"Unsupported WFST version: "+options.version;}
59994 return new cls(options);};OpenLayers.Format.WFST.DEFAULTS={"version":"1.0.0"};OpenLayers.Format.XML=OpenLayers.Class(OpenLayers.Format,{namespaces:null,namespaceAlias:null,defaultPrefix:null,readers:{},writers:{},xmldom:null,initialize:function(options){if(window.ActiveXObject){this.xmldom=new ActiveXObject("Microsoft.XMLDOM");}
59995 OpenLayers.Format.prototype.initialize.apply(this,[options]);this.namespaces=OpenLayers.Util.extend({},this.namespaces);this.namespaceAlias={};for(var alias in this.namespaces){this.namespaceAlias[this.namespaces[alias]]=alias;}},destroy:function(){this.xmldom=null;OpenLayers.Format.prototype.destroy.apply(this,arguments);},setNamespace:function(alias,uri){this.namespaces[alias]=uri;this.namespaceAlias[uri]=alias;},read:function(text){var index=text.indexOf('<');if(index>0){text=text.substring(index);}
59996 var node=OpenLayers.Util.Try(OpenLayers.Function.bind((function(){var xmldom;if(window.ActiveXObject&&!this.xmldom){xmldom=new ActiveXObject("Microsoft.XMLDOM");}else{xmldom=this.xmldom;}
59997 xmldom.loadXML(text);return xmldom;}),this),function(){return new DOMParser().parseFromString(text,'text/xml');},function(){var req=new XMLHttpRequest();req.open("GET","data:"+"text/xml"+";charset=utf-8,"+encodeURIComponent(text),false);if(req.overrideMimeType){req.overrideMimeType("text/xml");}
59998 req.send(null);return req.responseXML;});if(this.keepData){this.data=node;}
59999 return node;},write:function(node){var data;if(this.xmldom){data=node.xml;}else{var serializer=new XMLSerializer();if(node.nodeType==1){var doc=document.implementation.createDocument("","",null);if(doc.importNode){node=doc.importNode(node,true);}
60000 doc.appendChild(node);data=serializer.serializeToString(doc);}else{data=serializer.serializeToString(node);}}
60001 return data;},createElementNS:function(uri,name){var element;if(this.xmldom){if(typeof uri=="string"){element=this.xmldom.createNode(1,name,uri);}else{element=this.xmldom.createNode(1,name,"");}}else{element=document.createElementNS(uri,name);}
60002 return element;},createTextNode:function(text){var node;if(typeof text!=="string"){text=String(text);}
60003 if(this.xmldom){node=this.xmldom.createTextNode(text);}else{node=document.createTextNode(text);}
60004 return node;},getElementsByTagNameNS:function(node,uri,name){var elements=[];if(node.getElementsByTagNameNS){elements=node.getElementsByTagNameNS(uri,name);}else{var allNodes=node.getElementsByTagName("*");var potentialNode,fullName;for(var i=0,len=allNodes.length;i<len;++i){potentialNode=allNodes[i];fullName=(potentialNode.prefix)?(potentialNode.prefix+":"+name):name;if((name=="*")||(fullName==potentialNode.nodeName)){if((uri=="*")||(uri==potentialNode.namespaceURI)){elements.push(potentialNode);}}}}
60005 return elements;},getAttributeNodeNS:function(node,uri,name){var attributeNode=null;if(node.getAttributeNodeNS){attributeNode=node.getAttributeNodeNS(uri,name);}else{var attributes=node.attributes;var potentialNode,fullName;for(var i=0,len=attributes.length;i<len;++i){potentialNode=attributes[i];if(potentialNode.namespaceURI==uri){fullName=(potentialNode.prefix)?(potentialNode.prefix+":"+name):name;if(fullName==potentialNode.nodeName){attributeNode=potentialNode;break;}}}}
60006 return attributeNode;},getAttributeNS:function(node,uri,name){var attributeValue="";if(node.getAttributeNS){attributeValue=node.getAttributeNS(uri,name)||"";}else{var attributeNode=this.getAttributeNodeNS(node,uri,name);if(attributeNode){attributeValue=attributeNode.nodeValue;}}
60007 return attributeValue;},getChildValue:function(node,def){var value=def||"";if(node){for(var child=node.firstChild;child;child=child.nextSibling){switch(child.nodeType){case 3:case 4:value+=child.nodeValue;}}}
60008 return value;},concatChildValues:function(node,def){var value="";var child=node.firstChild;var childValue;while(child){childValue=child.nodeValue;if(childValue){value+=childValue;}
60009 child=child.nextSibling;}
60010 if(value==""&&def!=undefined){value=def;}
60011 return value;},isSimpleContent:function(node){var simple=true;for(var child=node.firstChild;child;child=child.nextSibling){if(child.nodeType===1){simple=false;break;}}
60012 return simple;},contentType:function(node){var simple=false,complex=false;var type=OpenLayers.Format.XML.CONTENT_TYPE.EMPTY;for(var child=node.firstChild;child;child=child.nextSibling){switch(child.nodeType){case 1:complex=true;break;case 8:break;default:simple=true;}
60013 if(complex&&simple){break;}}
60014 if(complex&&simple){type=OpenLayers.Format.XML.CONTENT_TYPE.MIXED;}else if(complex){return OpenLayers.Format.XML.CONTENT_TYPE.COMPLEX;}else if(simple){return OpenLayers.Format.XML.CONTENT_TYPE.SIMPLE;}
60015 return type;},hasAttributeNS:function(node,uri,name){var found=false;if(node.hasAttributeNS){found=node.hasAttributeNS(uri,name);}else{found=!!this.getAttributeNodeNS(node,uri,name);}
60016 return found;},setAttributeNS:function(node,uri,name,value){if(node.setAttributeNS){node.setAttributeNS(uri,name,value);}else{if(this.xmldom){if(uri){var attribute=node.ownerDocument.createNode(2,name,uri);attribute.nodeValue=value;node.setAttributeNode(attribute);}else{node.setAttribute(name,value);}}else{throw"setAttributeNS not implemented";}}},createElementNSPlus:function(name,options){options=options||{};var uri=options.uri||this.namespaces[options.prefix];if(!uri){var loc=name.indexOf(":");uri=this.namespaces[name.substring(0,loc)];}
60017 if(!uri){uri=this.namespaces[this.defaultPrefix];}
60018 var node=this.createElementNS(uri,name);if(options.attributes){this.setAttributes(node,options.attributes);}
60019 var value=options.value;if(value!=null){node.appendChild(this.createTextNode(value));}
60020 return node;},setAttributes:function(node,obj){var value,uri;for(var name in obj){if(obj[name]!=null&&obj[name].toString){value=obj[name].toString();uri=this.namespaces[name.substring(0,name.indexOf(":"))]||null;this.setAttributeNS(node,uri,name,value);}}},readNode:function(node,obj){if(!obj){obj={};}
60021 var group=this.readers[node.namespaceURI?this.namespaceAlias[node.namespaceURI]:this.defaultPrefix];if(group){var local=node.localName||node.nodeName.split(":").pop();var reader=group[local]||group["*"];if(reader){reader.apply(this,[node,obj]);}}
60022 return obj;},readChildNodes:function(node,obj){if(!obj){obj={};}
60023 var children=node.childNodes;var child;for(var i=0,len=children.length;i<len;++i){child=children[i];if(child.nodeType==1){this.readNode(child,obj);}}
60024 return obj;},writeNode:function(name,obj,parent){var prefix,local;var split=name.indexOf(":");if(split>0){prefix=name.substring(0,split);local=name.substring(split+1);}else{if(parent){prefix=this.namespaceAlias[parent.namespaceURI];}else{prefix=this.defaultPrefix;}
60025 local=name;}
60026 var child=this.writers[prefix][local].apply(this,[obj]);if(parent){parent.appendChild(child);}
60027 return child;},getChildEl:function(node,name,uri){return node&&this.getThisOrNextEl(node.firstChild,name,uri);},getNextEl:function(node,name,uri){return node&&this.getThisOrNextEl(node.nextSibling,name,uri);},getThisOrNextEl:function(node,name,uri){outer:for(var sibling=node;sibling;sibling=sibling.nextSibling){switch(sibling.nodeType){case 1:if((!name||name===(sibling.localName||sibling.nodeName.split(":").pop()))&&(!uri||uri===sibling.namespaceURI)){break outer;}
60028 sibling=null;break outer;case 3:if(/^\s*$/.test(sibling.nodeValue)){break;}
60029 case 4:case 6:case 12:case 10:case 11:sibling=null;break outer;}}
60030 return sibling||null;},lookupNamespaceURI:function(node,prefix){var uri=null;if(node){if(node.lookupNamespaceURI){uri=node.lookupNamespaceURI(prefix);}else{outer:switch(node.nodeType){case 1:if(node.namespaceURI!==null&&node.prefix===prefix){uri=node.namespaceURI;break outer;}
60031 var len=node.attributes.length;if(len){var attr;for(var i=0;i<len;++i){attr=node.attributes[i];if(attr.prefix==="xmlns"&&attr.name==="xmlns:"+prefix){uri=attr.value||null;break outer;}else if(attr.name==="xmlns"&&prefix===null){uri=attr.value||null;break outer;}}}
60032 uri=this.lookupNamespaceURI(node.parentNode,prefix);break outer;case 2:uri=this.lookupNamespaceURI(node.ownerElement,prefix);break outer;case 9:uri=this.lookupNamespaceURI(node.documentElement,prefix);break outer;case 6:case 12:case 10:case 11:break outer;default:uri=this.lookupNamespaceURI(node.parentNode,prefix);break outer;}}}
60033 return uri;},CLASS_NAME:"OpenLayers.Format.XML"});OpenLayers.Format.XML.CONTENT_TYPE={EMPTY:0,SIMPLE:1,COMPLEX:2,MIXED:3};OpenLayers.Format.XML.lookupNamespaceURI=OpenLayers.Function.bind(OpenLayers.Format.XML.prototype.lookupNamespaceURI,OpenLayers.Format.XML.prototype);OpenLayers.Handler=OpenLayers.Class({id:null,control:null,map:null,keyMask:null,active:false,evt:null,initialize:function(control,callbacks,options){OpenLayers.Util.extend(this,options);this.control=control;this.callbacks=callbacks;var map=this.map||control.map;if(map){this.setMap(map);}
60034 this.id=OpenLayers.Util.createUniqueID(this.CLASS_NAME+"_");},setMap:function(map){this.map=map;},checkModifiers:function(evt){if(this.keyMask==null){return true;}
60035 var keyModifiers=(evt.shiftKey?OpenLayers.Handler.MOD_SHIFT:0)|(evt.ctrlKey?OpenLayers.Handler.MOD_CTRL:0)|(evt.altKey?OpenLayers.Handler.MOD_ALT:0);return(keyModifiers==this.keyMask);},activate:function(){if(this.active){return false;}
60036 var events=OpenLayers.Events.prototype.BROWSER_EVENTS;for(var i=0,len=events.length;i<len;i++){if(this[events[i]]){this.register(events[i],this[events[i]]);}}
60037 this.active=true;return true;},deactivate:function(){if(!this.active){return false;}
60038 var events=OpenLayers.Events.prototype.BROWSER_EVENTS;for(var i=0,len=events.length;i<len;i++){if(this[events[i]]){this.unregister(events[i],this[events[i]]);}}
60039 this.active=false;return true;},callback:function(name,args){if(name&&this.callbacks[name]){this.callbacks[name].apply(this.control,args);}},register:function(name,method){this.map.events.registerPriority(name,this,method);this.map.events.registerPriority(name,this,this.setEvent);},unregister:function(name,method){this.map.events.unregister(name,this,method);this.map.events.unregister(name,this,this.setEvent);},setEvent:function(evt){this.evt=evt;return true;},destroy:function(){this.deactivate();this.control=this.map=null;},CLASS_NAME:"OpenLayers.Handler"});OpenLayers.Handler.MOD_NONE=0;OpenLayers.Handler.MOD_SHIFT=1;OpenLayers.Handler.MOD_CTRL=2;OpenLayers.Handler.MOD_ALT=4;OpenLayers.Map=OpenLayers.Class({Z_INDEX_BASE:{BaseLayer:100,Overlay:325,Feature:725,Popup:750,Control:1000},EVENT_TYPES:["preaddlayer","addlayer","removelayer","changelayer","movestart","move","moveend","zoomend","popupopen","popupclose","addmarker","removemarker","clearmarkers","mouseover","mouseout","mousemove","dragstart","drag","dragend","changebaselayer"],id:null,fractionalZoom:false,events:null,allOverlays:false,div:null,dragging:false,size:null,viewPortDiv:null,layerContainerOrigin:null,layerContainerDiv:null,layers:null,controls:null,popups:null,baseLayer:null,center:null,resolution:null,zoom:0,panRatio:1.5,viewRequestID:0,tileSize:null,projection:"EPSG:4326",units:'degrees',resolutions:null,maxResolution:1.40625,minResolution:null,maxScale:null,minScale:null,maxExtent:null,minExtent:null,restrictedExtent:null,numZoomLevels:16,theme:null,displayProjection:null,fallThrough:true,panTween:null,eventListeners:null,panMethod:OpenLayers.Easing.Expo.easeOut,panDuration:50,paddingForPopups:null,initialize:function(div,options){if(arguments.length===1&&typeof div==="object"){options=div;div=options&&options.div;}
60040 this.tileSize=new OpenLayers.Size(OpenLayers.Map.TILE_WIDTH,OpenLayers.Map.TILE_HEIGHT);this.maxExtent=new OpenLayers.Bounds(-180,-90,180,90);this.paddingForPopups=new OpenLayers.Bounds(15,15,15,15);this.theme=OpenLayers._getScriptLocation()?OpenLayers._getScriptLocation()+'theme/default/style.css':null;OpenLayers.Util.extend(this,options);this.layers=[];this.id=OpenLayers.Util.createUniqueID("OpenLayers.Map_");this.div=OpenLayers.Util.getElement(div);if(!this.div){this.div=document.createElement("div");this.div.style.height="1px";this.div.style.width="1px";}
60041 OpenLayers.Element.addClass(this.div,'olMap');var id=this.id+"_OpenLayers_ViewPort";this.viewPortDiv=OpenLayers.Util.createDiv(id,null,null,null,"relative",null,"hidden");this.viewPortDiv.style.width="100%";this.viewPortDiv.style.height="100%";this.viewPortDiv.className="olMapViewport";this.div.appendChild(this.viewPortDiv);id=this.id+"_OpenLayers_Container";this.layerContainerDiv=OpenLayers.Util.createDiv(id);this.layerContainerDiv.style.zIndex=this.Z_INDEX_BASE['Popup']-1;this.viewPortDiv.appendChild(this.layerContainerDiv);this.events=new OpenLayers.Events(this,this.div,this.EVENT_TYPES,this.fallThrough,{includeXY:true});this.updateSize();if(this.eventListeners instanceof Object){this.events.on(this.eventListeners);}
60042 this.events.register("movestart",this,this.updateSize);if(OpenLayers.String.contains(navigator.appName,"Microsoft")){this.events.register("resize",this,this.updateSize);}else{this.updateSizeDestroy=OpenLayers.Function.bind(this.updateSize,this);OpenLayers.Event.observe(window,'resize',this.updateSizeDestroy);}
60043 if(this.theme){var addNode=true;var nodes=document.getElementsByTagName('link');for(var i=0,len=nodes.length;i<len;++i){if(OpenLayers.Util.isEquivalentUrl(nodes.item(i).href,this.theme)){addNode=false;break;}}
60044 if(addNode){var cssNode=document.createElement('link');cssNode.setAttribute('rel','stylesheet');cssNode.setAttribute('type','text/css');cssNode.setAttribute('href',this.theme);document.getElementsByTagName('head')[0].appendChild(cssNode);}}
60045 if(this.controls==null){if(OpenLayers.Control!=null){this.controls=[new OpenLayers.Control.Navigation(),new OpenLayers.Control.PanZoom(),new OpenLayers.Control.ArgParser(),new OpenLayers.Control.Attribution()];}else{this.controls=[];}}
60046 for(var i=0,len=this.controls.length;i<len;i++){this.addControlToMap(this.controls[i]);}
60047 this.popups=[];this.unloadDestroy=OpenLayers.Function.bind(this.destroy,this);OpenLayers.Event.observe(window,'unload',this.unloadDestroy);if(options&&options.layers){this.addLayers(options.layers);if(options.center){this.setCenter(options.center,options.zoom);}}},render:function(div){this.div=OpenLayers.Util.getElement(div);OpenLayers.Element.addClass(this.div,'olMap');this.events.attachToElement(this.div);this.viewPortDiv.parentNode.removeChild(this.viewPortDiv);this.div.appendChild(this.viewPortDiv);this.updateSize();},unloadDestroy:null,updateSizeDestroy:null,destroy:function(){if(!this.unloadDestroy){return false;}
60048 if(this.panTween){this.panTween.stop();this.panTween=null;}
60049 OpenLayers.Event.stopObserving(window,'unload',this.unloadDestroy);this.unloadDestroy=null;if(this.updateSizeDestroy){OpenLayers.Event.stopObserving(window,'resize',this.updateSizeDestroy);}else{this.events.unregister("resize",this,this.updateSize);}
60050 this.paddingForPopups=null;if(this.controls!=null){for(var i=this.controls.length-1;i>=0;--i){this.controls[i].destroy();}
60051 this.controls=null;}
60052 if(this.layers!=null){for(var i=this.layers.length-1;i>=0;--i){this.layers[i].destroy(false);}
60053 this.layers=null;}
60054 if(this.viewPortDiv){this.div.removeChild(this.viewPortDiv);}
60055 this.viewPortDiv=null;if(this.eventListeners){this.events.un(this.eventListeners);this.eventListeners=null;}
60056 this.events.destroy();this.events=null;},setOptions:function(options){OpenLayers.Util.extend(this,options);},getTileSize:function(){return this.tileSize;},getBy:function(array,property,match){var test=(typeof match.test=="function");var found=OpenLayers.Array.filter(this[array],function(item){return item[property]==match||(test&&match.test(item[property]));});return found;},getLayersBy:function(property,match){return this.getBy("layers",property,match);},getLayersByName:function(match){return this.getLayersBy("name",match);},getLayersByClass:function(match){return this.getLayersBy("CLASS_NAME",match);},getControlsBy:function(property,match){return this.getBy("controls",property,match);},getControlsByClass:function(match){return this.getControlsBy("CLASS_NAME",match);},getLayer:function(id){var foundLayer=null;for(var i=0,len=this.layers.length;i<len;i++){var layer=this.layers[i];if(layer.id==id){foundLayer=layer;break;}}
60057 return foundLayer;},setLayerZIndex:function(layer,zIdx){layer.setZIndex(this.Z_INDEX_BASE[layer.isBaseLayer?'BaseLayer':'Overlay']
60058 +zIdx*5);},resetLayersZIndex:function(){for(var i=0,len=this.layers.length;i<len;i++){var layer=this.layers[i];this.setLayerZIndex(layer,i);}},addLayer:function(layer){for(var i=0,len=this.layers.length;i<len;i++){if(this.layers[i]==layer){var msg=OpenLayers.i18n('layerAlreadyAdded',{'layerName':layer.name});OpenLayers.Console.warn(msg);return false;}}
60059 if(this.allOverlays){layer.isBaseLayer=false;}
60060 if(this.events.triggerEvent("preaddlayer",{layer:layer})===false){return;}
60061 layer.div.className="olLayerDiv";layer.div.style.overflow="";this.setLayerZIndex(layer,this.layers.length);if(layer.isFixed){this.viewPortDiv.appendChild(layer.div);}else{this.layerContainerDiv.appendChild(layer.div);}
60062 this.layers.push(layer);layer.setMap(this);if(layer.isBaseLayer||(this.allOverlays&&!this.baseLayer)){if(this.baseLayer==null){this.setBaseLayer(layer);}else{layer.setVisibility(false);}}else{layer.redraw();}
60063 this.events.triggerEvent("addlayer",{layer:layer});layer.afterAdd();},addLayers:function(layers){for(var i=0,len=layers.length;i<len;i++){this.addLayer(layers[i]);}},removeLayer:function(layer,setNewBaseLayer){if(setNewBaseLayer==null){setNewBaseLayer=true;}
60064 if(layer.isFixed){this.viewPortDiv.removeChild(layer.div);}else{this.layerContainerDiv.removeChild(layer.div);}
60065 OpenLayers.Util.removeItem(this.layers,layer);layer.removeMap(this);layer.map=null;if(this.baseLayer==layer){this.baseLayer=null;if(setNewBaseLayer){for(var i=0,len=this.layers.length;i<len;i++){var iLayer=this.layers[i];if(iLayer.isBaseLayer||this.allOverlays){this.setBaseLayer(iLayer);break;}}}}
60066 this.resetLayersZIndex();this.events.triggerEvent("removelayer",{layer:layer});},getNumLayers:function(){return this.layers.length;},getLayerIndex:function(layer){return OpenLayers.Util.indexOf(this.layers,layer);},setLayerIndex:function(layer,idx){var base=this.getLayerIndex(layer);if(idx<0){idx=0;}else if(idx>this.layers.length){idx=this.layers.length;}
60067 if(base!=idx){this.layers.splice(base,1);this.layers.splice(idx,0,layer);for(var i=0,len=this.layers.length;i<len;i++){this.setLayerZIndex(this.layers[i],i);}
60068 this.events.triggerEvent("changelayer",{layer:layer,property:"order"});if(this.allOverlays){if(idx===0){this.setBaseLayer(layer);}else if(this.baseLayer!==this.layers[0]){this.setBaseLayer(this.layers[0]);}}}},raiseLayer:function(layer,delta){var idx=this.getLayerIndex(layer)+delta;this.setLayerIndex(layer,idx);},setBaseLayer:function(newBaseLayer){if(newBaseLayer!=this.baseLayer){if(OpenLayers.Util.indexOf(this.layers,newBaseLayer)!=-1){var center=this.getCenter();var newResolution=OpenLayers.Util.getResolutionFromScale(this.getScale(),newBaseLayer.units);if(this.baseLayer!=null&&!this.allOverlays){this.baseLayer.setVisibility(false);}
60069 this.baseLayer=newBaseLayer;this.viewRequestID++;if(!this.allOverlays||this.baseLayer.visibility){this.baseLayer.setVisibility(true);}
60070 if(center!=null){var newZoom=this.getZoomForResolution(newResolution||this.resolution,true);this.setCenter(center,newZoom,false,true);}
60071 this.events.triggerEvent("changebaselayer",{layer:this.baseLayer});}}},addControl:function(control,px){this.controls.push(control);this.addControlToMap(control,px);},addControls:function(controls,pixels){var pxs=(arguments.length===1)?[]:pixels;for(var i=0,len=controls.length;i<len;i++){var ctrl=controls[i];var px=(pxs[i])?pxs[i]:null;this.addControl(ctrl,px);}},addControlToMap:function(control,px){control.outsideViewport=(control.div!=null);if(this.displayProjection&&!control.displayProjection){control.displayProjection=this.displayProjection;}
60072 control.setMap(this);var div=control.draw(px);if(div){if(!control.outsideViewport){div.style.zIndex=this.Z_INDEX_BASE['Control']+
60073 this.controls.length;this.viewPortDiv.appendChild(div);}}
60074 if(control.autoActivate){control.activate();}},getControl:function(id){var returnControl=null;for(var i=0,len=this.controls.length;i<len;i++){var control=this.controls[i];if(control.id==id){returnControl=control;break;}}
60075 return returnControl;},removeControl:function(control){if((control)&&(control==this.getControl(control.id))){if(control.div&&(control.div.parentNode==this.viewPortDiv)){this.viewPortDiv.removeChild(control.div);}
60076 OpenLayers.Util.removeItem(this.controls,control);}},addPopup:function(popup,exclusive){if(exclusive){for(var i=this.popups.length-1;i>=0;--i){this.removePopup(this.popups[i]);}}
60077 popup.map=this;this.popups.push(popup);var popupDiv=popup.draw();if(popupDiv){popupDiv.style.zIndex=this.Z_INDEX_BASE['Popup']+
60078 this.popups.length;this.layerContainerDiv.appendChild(popupDiv);}},removePopup:function(popup){OpenLayers.Util.removeItem(this.popups,popup);if(popup.div){try{this.layerContainerDiv.removeChild(popup.div);}
60079 catch(e){}}
60080 popup.map=null;},getSize:function(){var size=null;if(this.size!=null){size=this.size.clone();}
60081 return size;},updateSize:function(){var newSize=this.getCurrentSize();if(newSize&&!isNaN(newSize.h)&&!isNaN(newSize.w)){this.events.clearMouseCache();var oldSize=this.getSize();if(oldSize==null){this.size=oldSize=newSize;}
60082 if(!newSize.equals(oldSize)){this.size=newSize;for(var i=0,len=this.layers.length;i<len;i++){this.layers[i].onMapResize();}
60083 var center=this.getCenter();if(this.baseLayer!=null&&center!=null){var zoom=this.getZoom();this.zoom=null;this.setCenter(center,zoom);}}}},getCurrentSize:function(){var size=new OpenLayers.Size(this.div.clientWidth,this.div.clientHeight);if(size.w==0&&size.h==0||isNaN(size.w)&&isNaN(size.h)){size.w=this.div.offsetWidth;size.h=this.div.offsetHeight;}
60084 if(size.w==0&&size.h==0||isNaN(size.w)&&isNaN(size.h)){size.w=parseInt(this.div.style.width);size.h=parseInt(this.div.style.height);}
60085 return size;},calculateBounds:function(center,resolution){var extent=null;if(center==null){center=this.getCenter();}
60086 if(resolution==null){resolution=this.getResolution();}
60087 if((center!=null)&&(resolution!=null)){var size=this.getSize();var w_deg=size.w*resolution;var h_deg=size.h*resolution;extent=new OpenLayers.Bounds(center.lon-w_deg/2,center.lat-h_deg/2,center.lon+w_deg/2,center.lat+h_deg/2);}
60088 return extent;},getCenter:function(){var center=null;if(this.center){center=this.center.clone();}
60089 return center;},getZoom:function(){return this.zoom;},pan:function(dx,dy,options){options=OpenLayers.Util.applyDefaults(options,{animate:true,dragging:false});var centerPx=this.getViewPortPxFromLonLat(this.getCenter());var newCenterPx=centerPx.add(dx,dy);if(!options.dragging||!newCenterPx.equals(centerPx)){var newCenterLonLat=this.getLonLatFromViewPortPx(newCenterPx);if(options.animate){this.panTo(newCenterLonLat);}else{this.setCenter(newCenterLonLat,null,options.dragging);}}},panTo:function(lonlat){if(this.panMethod&&this.getExtent().scale(this.panRatio).containsLonLat(lonlat)){if(!this.panTween){this.panTween=new OpenLayers.Tween(this.panMethod);}
60090 var center=this.getCenter();if(lonlat.lon==center.lon&&lonlat.lat==center.lat){return;}
60091 var from={lon:center.lon,lat:center.lat};var to={lon:lonlat.lon,lat:lonlat.lat};this.panTween.start(from,to,this.panDuration,{callbacks:{start:OpenLayers.Function.bind(function(lonlat){this.events.triggerEvent("movestart");},this),eachStep:OpenLayers.Function.bind(function(lonlat){lonlat=new OpenLayers.LonLat(lonlat.lon,lonlat.lat);this.moveTo(lonlat,this.zoom,{'dragging':true,'noEvent':true});},this),done:OpenLayers.Function.bind(function(lonlat){lonlat=new OpenLayers.LonLat(lonlat.lon,lonlat.lat);this.moveTo(lonlat,this.zoom,{'noEvent':true});this.events.triggerEvent("moveend");},this)}});}else{this.setCenter(lonlat);}},setCenter:function(lonlat,zoom,dragging,forceZoomChange){this.moveTo(lonlat,zoom,{'dragging':dragging,'forceZoomChange':forceZoomChange,'caller':'setCenter'});},moveTo:function(lonlat,zoom,options){if(!options){options={};}
60092 if(zoom!=null){zoom=parseFloat(zoom);if(!this.fractionalZoom){zoom=Math.round(zoom);}}
60093 var dragging=options.dragging;var forceZoomChange=options.forceZoomChange;var noEvent=options.noEvent;if(this.panTween&&options.caller=="setCenter"){this.panTween.stop();}
60094 if(!this.center&&!this.isValidLonLat(lonlat)){lonlat=this.maxExtent.getCenterLonLat();}
60095 if(this.restrictedExtent!=null){if(lonlat==null){lonlat=this.getCenter();}
60096 if(zoom==null){zoom=this.getZoom();}
60097 var resolution=this.getResolutionForZoom(zoom);var extent=this.calculateBounds(lonlat,resolution);if(!this.restrictedExtent.containsBounds(extent)){var maxCenter=this.restrictedExtent.getCenterLonLat();if(extent.getWidth()>this.restrictedExtent.getWidth()){lonlat=new OpenLayers.LonLat(maxCenter.lon,lonlat.lat);}else if(extent.left<this.restrictedExtent.left){lonlat=lonlat.add(this.restrictedExtent.left-
60098 extent.left,0);}else if(extent.right>this.restrictedExtent.right){lonlat=lonlat.add(this.restrictedExtent.right-
60099 extent.right,0);}
60100 if(extent.getHeight()>this.restrictedExtent.getHeight()){lonlat=new OpenLayers.LonLat(lonlat.lon,maxCenter.lat);}else if(extent.bottom<this.restrictedExtent.bottom){lonlat=lonlat.add(0,this.restrictedExtent.bottom-
60101 extent.bottom);}
60102 else if(extent.top>this.restrictedExtent.top){lonlat=lonlat.add(0,this.restrictedExtent.top-
60103 extent.top);}}}
60104 var zoomChanged=forceZoomChange||((this.isValidZoomLevel(zoom))&&(zoom!=this.getZoom()));var centerChanged=(this.isValidLonLat(lonlat))&&(!lonlat.equals(this.center));if(zoomChanged||centerChanged||!dragging){if(!this.dragging&&!noEvent){this.events.triggerEvent("movestart");}
60105 if(centerChanged){if((!zoomChanged)&&(this.center)){this.centerLayerContainer(lonlat);}
60106 this.center=lonlat.clone();}
60107 if((zoomChanged)||(this.layerContainerOrigin==null)){this.layerContainerOrigin=this.center.clone();this.layerContainerDiv.style.left="0px";this.layerContainerDiv.style.top="0px";}
60108 if(zoomChanged){this.zoom=zoom;this.resolution=this.getResolutionForZoom(zoom);this.viewRequestID++;}
60109 var bounds=this.getExtent();if(this.baseLayer.visibility){this.baseLayer.moveTo(bounds,zoomChanged,dragging);if(dragging){this.baseLayer.events.triggerEvent("move");}else{this.baseLayer.events.triggerEvent("moveend",{"zoomChanged":zoomChanged});}}
60110 bounds=this.baseLayer.getExtent();for(var i=0,len=this.layers.length;i<len;i++){var layer=this.layers[i];if(layer!==this.baseLayer&&!layer.isBaseLayer){var inRange=layer.calculateInRange();if(layer.inRange!=inRange){layer.inRange=inRange;if(!inRange){layer.display(false);}
60111 this.events.triggerEvent("changelayer",{layer:layer,property:"visibility"});}
60112 if(inRange&&layer.visibility){layer.moveTo(bounds,zoomChanged,dragging);if(dragging){layer.events.triggerEvent("move");}else{layer.events.triggerEvent("moveend",{"zoomChanged":zoomChanged});}}}}
60113 if(zoomChanged){for(var i=0,len=this.popups.length;i<len;i++){this.popups[i].updatePosition();}}
60114 this.events.triggerEvent("move");if(zoomChanged){this.events.triggerEvent("zoomend");}}
60115 if(!dragging&&!noEvent){this.events.triggerEvent("moveend");}
60116 this.dragging=!!dragging;},centerLayerContainer:function(lonlat){var originPx=this.getViewPortPxFromLonLat(this.layerContainerOrigin);var newPx=this.getViewPortPxFromLonLat(lonlat);if((originPx!=null)&&(newPx!=null)){this.layerContainerDiv.style.left=Math.round(originPx.x-newPx.x)+"px";this.layerContainerDiv.style.top=Math.round(originPx.y-newPx.y)+"px";}},isValidZoomLevel:function(zoomLevel){return((zoomLevel!=null)&&(zoomLevel>=0)&&(zoomLevel<this.getNumZoomLevels()));},isValidLonLat:function(lonlat){var valid=false;if(lonlat!=null){var maxExtent=this.getMaxExtent();valid=maxExtent.containsLonLat(lonlat);}
60117 return valid;},getProjection:function(){var projection=this.getProjectionObject();return projection?projection.getCode():null;},getProjectionObject:function(){var projection=null;if(this.baseLayer!=null){projection=this.baseLayer.projection;}
60118 return projection;},getMaxResolution:function(){var maxResolution=null;if(this.baseLayer!=null){maxResolution=this.baseLayer.maxResolution;}
60119 return maxResolution;},getMaxExtent:function(options){var maxExtent=null;if(options&&options.restricted&&this.restrictedExtent){maxExtent=this.restrictedExtent;}else if(this.baseLayer!=null){maxExtent=this.baseLayer.maxExtent;}
60120 return maxExtent;},getNumZoomLevels:function(){var numZoomLevels=null;if(this.baseLayer!=null){numZoomLevels=this.baseLayer.numZoomLevels;}
60121 return numZoomLevels;},getExtent:function(){var extent=null;if(this.baseLayer!=null){extent=this.baseLayer.getExtent();}
60122 return extent;},getResolution:function(){var resolution=null;if(this.baseLayer!=null){resolution=this.baseLayer.getResolution();}else if(this.allOverlays===true&&this.layers.length>0){resolution=this.layers[0].getResolution();}
60123 return resolution;},getUnits:function(){var units=null;if(this.baseLayer!=null){units=this.baseLayer.units;}
60124 return units;},getScale:function(){var scale=null;if(this.baseLayer!=null){var res=this.getResolution();var units=this.baseLayer.units;scale=OpenLayers.Util.getScaleFromResolution(res,units);}
60125 return scale;},getZoomForExtent:function(bounds,closest){var zoom=null;if(this.baseLayer!=null){zoom=this.baseLayer.getZoomForExtent(bounds,closest);}
60126 return zoom;},getResolutionForZoom:function(zoom){var resolution=null;if(this.baseLayer){resolution=this.baseLayer.getResolutionForZoom(zoom);}
60127 return resolution;},getZoomForResolution:function(resolution,closest){var zoom=null;if(this.baseLayer!=null){zoom=this.baseLayer.getZoomForResolution(resolution,closest);}
60128 return zoom;},zoomTo:function(zoom){if(this.isValidZoomLevel(zoom)){this.setCenter(null,zoom);}},zoomIn:function(){this.zoomTo(this.getZoom()+1);},zoomOut:function(){this.zoomTo(this.getZoom()-1);},zoomToExtent:function(bounds,closest){var center=bounds.getCenterLonLat();if(this.baseLayer.wrapDateLine){var maxExtent=this.getMaxExtent();bounds=bounds.clone();while(bounds.right<bounds.left){bounds.right+=maxExtent.getWidth();}
60129 center=bounds.getCenterLonLat().wrapDateLine(maxExtent);}
60130 this.setCenter(center,this.getZoomForExtent(bounds,closest));},zoomToMaxExtent:function(options){var restricted=(options)?options.restricted:true;var maxExtent=this.getMaxExtent({'restricted':restricted});this.zoomToExtent(maxExtent);},zoomToScale:function(scale,closest){var res=OpenLayers.Util.getResolutionFromScale(scale,this.baseLayer.units);var size=this.getSize();var w_deg=size.w*res;var h_deg=size.h*res;var center=this.getCenter();var extent=new OpenLayers.Bounds(center.lon-w_deg/2,center.lat-h_deg/2,center.lon+w_deg/2,center.lat+h_deg/2);this.zoomToExtent(extent,closest);},getLonLatFromViewPortPx:function(viewPortPx){var lonlat=null;if(this.baseLayer!=null){lonlat=this.baseLayer.getLonLatFromViewPortPx(viewPortPx);}
60131 return lonlat;},getViewPortPxFromLonLat:function(lonlat){var px=null;if(this.baseLayer!=null){px=this.baseLayer.getViewPortPxFromLonLat(lonlat);}
60132 return px;},getLonLatFromPixel:function(px){return this.getLonLatFromViewPortPx(px);},getPixelFromLonLat:function(lonlat){var px=this.getViewPortPxFromLonLat(lonlat);px.x=Math.round(px.x);px.y=Math.round(px.y);return px;},getGeodesicPixelSize:function(px){var lonlat=px?this.getLonLatFromPixel(px):(this.getCenter()||new OpenLayers.LonLat(0,0));var res=this.getResolution();var left=lonlat.add(-res/2,0);var right=lonlat.add(res/2,0);var bottom=lonlat.add(0,-res/2);var top=lonlat.add(0,res/2);var dest=new OpenLayers.Projection("EPSG:4326");var source=this.getProjectionObject()||dest;if(!source.equals(dest)){left.transform(source,dest);right.transform(source,dest);bottom.transform(source,dest);top.transform(source,dest);}
60133 return new OpenLayers.Size(OpenLayers.Util.distVincenty(left,right),OpenLayers.Util.distVincenty(bottom,top));},getViewPortPxFromLayerPx:function(layerPx){var viewPortPx=null;if(layerPx!=null){var dX=parseInt(this.layerContainerDiv.style.left);var dY=parseInt(this.layerContainerDiv.style.top);viewPortPx=layerPx.add(dX,dY);}
60134 return viewPortPx;},getLayerPxFromViewPortPx:function(viewPortPx){var layerPx=null;if(viewPortPx!=null){var dX=-parseInt(this.layerContainerDiv.style.left);var dY=-parseInt(this.layerContainerDiv.style.top);layerPx=viewPortPx.add(dX,dY);if(isNaN(layerPx.x)||isNaN(layerPx.y)){layerPx=null;}}
60135 return layerPx;},getLonLatFromLayerPx:function(px){px=this.getViewPortPxFromLayerPx(px);return this.getLonLatFromViewPortPx(px);},getLayerPxFromLonLat:function(lonlat){var px=this.getPixelFromLonLat(lonlat);return this.getLayerPxFromViewPortPx(px);},CLASS_NAME:"OpenLayers.Map"});OpenLayers.Map.TILE_WIDTH=256;OpenLayers.Map.TILE_HEIGHT=256;OpenLayers.Marker=OpenLayers.Class({icon:null,lonlat:null,events:null,map:null,initialize:function(lonlat,icon){this.lonlat=lonlat;var newIcon=(icon)?icon:OpenLayers.Marker.defaultIcon();if(this.icon==null){this.icon=newIcon;}else{this.icon.url=newIcon.url;this.icon.size=newIcon.size;this.icon.offset=newIcon.offset;this.icon.calculateOffset=newIcon.calculateOffset;}
60136 this.events=new OpenLayers.Events(this,this.icon.imageDiv,null);},destroy:function(){this.erase();this.map=null;this.events.destroy();this.events=null;if(this.icon!=null){this.icon.destroy();this.icon=null;}},draw:function(px){return this.icon.draw(px);},erase:function(){if(this.icon!=null){this.icon.erase();}},moveTo:function(px){if((px!=null)&&(this.icon!=null)){this.icon.moveTo(px);}
60137 this.lonlat=this.map.getLonLatFromLayerPx(px);},isDrawn:function(){var isDrawn=(this.icon&&this.icon.isDrawn());return isDrawn;},onScreen:function(){var onScreen=false;if(this.map){var screenBounds=this.map.getExtent();onScreen=screenBounds.containsLonLat(this.lonlat);}
60138 return onScreen;},inflate:function(inflate){if(this.icon){var newSize=new OpenLayers.Size(this.icon.size.w*inflate,this.icon.size.h*inflate);this.icon.setSize(newSize);}},setOpacity:function(opacity){this.icon.setOpacity(opacity);},setUrl:function(url){this.icon.setUrl(url);},display:function(display){this.icon.display(display);},CLASS_NAME:"OpenLayers.Marker"});OpenLayers.Marker.defaultIcon=function(){var url=OpenLayers.Util.getImagesLocation()+"marker.png";var size=new OpenLayers.Size(21,25);var calculateOffset=function(size){return new OpenLayers.Pixel(-(size.w/2),-size.h);};return new OpenLayers.Icon(url,size,null,calculateOffset);};OpenLayers.Popup.FramedCloud=OpenLayers.Class(OpenLayers.Popup.Framed,{contentDisplayClass:"olFramedCloudPopupContent",autoSize:true,panMapIfOutOfView:true,imageSize:new OpenLayers.Size(1276,736),isAlphaImage:false,fixedRelativePosition:false,positionBlocks:{"tl":{'offset':new OpenLayers.Pixel(44,0),'padding':new OpenLayers.Bounds(8,40,8,9),'blocks':[{size:new OpenLayers.Size('auto','auto'),anchor:new OpenLayers.Bounds(0,51,22,0),position:new OpenLayers.Pixel(0,0)},{size:new OpenLayers.Size(22,'auto'),anchor:new OpenLayers.Bounds(null,50,0,0),position:new OpenLayers.Pixel(-1238,0)},{size:new OpenLayers.Size('auto',19),anchor:new OpenLayers.Bounds(0,32,22,null),position:new OpenLayers.Pixel(0,-631)},{size:new OpenLayers.Size(22,18),anchor:new OpenLayers.Bounds(null,32,0,null),position:new OpenLayers.Pixel(-1238,-632)},{size:new OpenLayers.Size(81,35),anchor:new OpenLayers.Bounds(null,0,0,null),position:new OpenLayers.Pixel(0,-688)}]},"tr":{'offset':new OpenLayers.Pixel(-45,0),'padding':new OpenLayers.Bounds(8,40,8,9),'blocks':[{size:new OpenLayers.Size('auto','auto'),anchor:new OpenLayers.Bounds(0,51,22,0),position:new OpenLayers.Pixel(0,0)},{size:new OpenLayers.Size(22,'auto'),anchor:new OpenLayers.Bounds(null,50,0,0),position:new OpenLayers.Pixel(-1238,0)},{size:new OpenLayers.Size('auto',19),anchor:new OpenLayers.Bounds(0,32,22,null),position:new OpenLayers.Pixel(0,-631)},{size:new OpenLayers.Size(22,19),anchor:new OpenLayers.Bounds(null,32,0,null),position:new OpenLayers.Pixel(-1238,-631)},{size:new OpenLayers.Size(81,35),anchor:new OpenLayers.Bounds(0,0,null,null),position:new OpenLayers.Pixel(-215,-687)}]},"bl":{'offset':new OpenLayers.Pixel(45,0),'padding':new OpenLayers.Bounds(8,9,8,40),'blocks':[{size:new OpenLayers.Size('auto','auto'),anchor:new OpenLayers.Bounds(0,21,22,32),position:new OpenLayers.Pixel(0,0)},{size:new OpenLayers.Size(22,'auto'),anchor:new OpenLayers.Bounds(null,21,0,32),position:new OpenLayers.Pixel(-1238,0)},{size:new OpenLayers.Size('auto',21),anchor:new OpenLayers.Bounds(0,0,22,null),position:new OpenLayers.Pixel(0,-629)},{size:new OpenLayers.Size(22,21),anchor:new OpenLayers.Bounds(null,0,0,null),position:new OpenLayers.Pixel(-1238,-629)},{size:new OpenLayers.Size(81,33),anchor:new OpenLayers.Bounds(null,null,0,0),position:new OpenLayers.Pixel(-101,-674)}]},"br":{'offset':new OpenLayers.Pixel(-44,0),'padding':new OpenLayers.Bounds(8,9,8,40),'blocks':[{size:new OpenLayers.Size('auto','auto'),anchor:new OpenLayers.Bounds(0,21,22,32),position:new OpenLayers.Pixel(0,0)},{size:new OpenLayers.Size(22,'auto'),anchor:new OpenLayers.Bounds(null,21,0,32),position:new OpenLayers.Pixel(-1238,0)},{size:new OpenLayers.Size('auto',21),anchor:new OpenLayers.Bounds(0,0,22,null),position:new OpenLayers.Pixel(0,-629)},{size:new OpenLayers.Size(22,21),anchor:new OpenLayers.Bounds(null,0,0,null),position:new OpenLayers.Pixel(-1238,-629)},{size:new OpenLayers.Size(81,33),anchor:new OpenLayers.Bounds(0,null,null,0),position:new OpenLayers.Pixel(-311,-674)}]}},minSize:new OpenLayers.Size(105,10),maxSize:new OpenLayers.Size(1200,660),initialize:function(id,lonlat,contentSize,contentHTML,anchor,closeBox,closeBoxCallback){this.imageSrc=OpenLayers.Util.getImagesLocation()+'cloud-popup-relative.png';OpenLayers.Popup.Framed.prototype.initialize.apply(this,arguments);this.contentDiv.className=this.contentDisplayClass;},destroy:function(){OpenLayers.Popup.Framed.prototype.destroy.apply(this,arguments);},CLASS_NAME:"OpenLayers.Popup.FramedCloud"});OpenLayers.Request={DEFAULT_CONFIG:{method:"GET",url:window.location.href,async:true,user:undefined,password:undefined,params:null,proxy:OpenLayers.ProxyHost,headers:{},data:null,callback:function(){},success:null,failure:null,scope:null},events:new OpenLayers.Events(this,null,["complete","success","failure"]),issue:function(config){var defaultConfig=OpenLayers.Util.extend(this.DEFAULT_CONFIG,{proxy:OpenLayers.ProxyHost});config=OpenLayers.Util.applyDefaults(config,defaultConfig);var request=new OpenLayers.Request.XMLHttpRequest();var url=config.url;if(config.params){var paramString=OpenLayers.Util.getParameterString(config.params);if(paramString.length>0){var separator=(url.indexOf('?')>-1)?'&':'?';url+=separator+paramString;}}
60139 if(config.proxy&&(url.indexOf("http")==0)){if(typeof config.proxy=="function"){url=config.proxy(url);}else{url=config.proxy+encodeURIComponent(url);}}
60140 request.open(config.method,url,config.async,config.user,config.password);for(var header in config.headers){request.setRequestHeader(header,config.headers[header]);}
60141 var events=this.events;var self=this;request.onreadystatechange=function(){if(request.readyState==OpenLayers.Request.XMLHttpRequest.DONE){var proceed=events.triggerEvent("complete",{request:request,config:config,requestUrl:url});if(proceed!==false){self.runCallbacks({request:request,config:config,requestUrl:url});}}};if(config.async===false){request.send(config.data);}else{window.setTimeout(function(){if(request._aborted!==true){request.send(config.data);}},0);}
60142 return request;},runCallbacks:function(options){var request=options.request;var config=options.config;var complete=(config.scope)?OpenLayers.Function.bind(config.callback,config.scope):config.callback;var success;if(config.success){success=(config.scope)?OpenLayers.Function.bind(config.success,config.scope):config.success;}
60143 var failure;if(config.failure){failure=(config.scope)?OpenLayers.Function.bind(config.failure,config.scope):config.failure;}
60144 complete(request);if(!request.status||(request.status>=200&&request.status<300)){this.events.triggerEvent("success",options);if(success){success(request);}}
60145 if(request.status&&(request.status<200||request.status>=300)){this.events.triggerEvent("failure",options);if(failure){failure(request);}}},GET:function(config){config=OpenLayers.Util.extend(config,{method:"GET"});return OpenLayers.Request.issue(config);},POST:function(config){config=OpenLayers.Util.extend(config,{method:"POST"});config.headers=config.headers?config.headers:{};if(!("CONTENT-TYPE"in OpenLayers.Util.upperCaseObject(config.headers))){config.headers["Content-Type"]="application/xml";}
60146 return OpenLayers.Request.issue(config);},PUT:function(config){config=OpenLayers.Util.extend(config,{method:"PUT"});config.headers=config.headers?config.headers:{};if(!("CONTENT-TYPE"in OpenLayers.Util.upperCaseObject(config.headers))){config.headers["Content-Type"]="application/xml";}
60147 return OpenLayers.Request.issue(config);},DELETE:function(config){config=OpenLayers.Util.extend(config,{method:"DELETE"});return OpenLayers.Request.issue(config);},HEAD:function(config){config=OpenLayers.Util.extend(config,{method:"HEAD"});return OpenLayers.Request.issue(config);},OPTIONS:function(config){config=OpenLayers.Util.extend(config,{method:"OPTIONS"});return OpenLayers.Request.issue(config);}};OpenLayers.Tile.Image=OpenLayers.Class(OpenLayers.Tile,{url:null,imgDiv:null,frame:null,layerAlphaHack:null,isBackBuffer:false,lastRatio:1,isFirstDraw:true,backBufferTile:null,initialize:function(layer,position,bounds,url,size){OpenLayers.Tile.prototype.initialize.apply(this,arguments);this.url=url;this.frame=document.createElement('div');this.frame.style.overflow='hidden';this.frame.style.position='absolute';this.layerAlphaHack=this.layer.alpha&&OpenLayers.Util.alphaHack();},destroy:function(){if(this.imgDiv!=null){if(this.layerAlphaHack){OpenLayers.Event.stopObservingElement(this.imgDiv.childNodes[0]);}
60148 OpenLayers.Event.stopObservingElement(this.imgDiv);if(this.imgDiv.parentNode==this.frame){this.frame.removeChild(this.imgDiv);this.imgDiv.map=null;}
60149 this.imgDiv.urls=null;this.imgDiv.src=OpenLayers.Util.getImagesLocation()+"blank.gif";}
60150 this.imgDiv=null;if((this.frame!=null)&&(this.frame.parentNode==this.layer.div)){this.layer.div.removeChild(this.frame);}
60151 this.frame=null;if(this.backBufferTile){this.backBufferTile.destroy();this.backBufferTile=null;}
60152 this.layer.events.unregister("loadend",this,this.resetBackBuffer);OpenLayers.Tile.prototype.destroy.apply(this,arguments);},clone:function(obj){if(obj==null){obj=new OpenLayers.Tile.Image(this.layer,this.position,this.bounds,this.url,this.size);}
60153 obj=OpenLayers.Tile.prototype.clone.apply(this,[obj]);obj.imgDiv=null;return obj;},draw:function(){if(this.layer!=this.layer.map.baseLayer&&this.layer.reproject){this.bounds=this.getBoundsFromBaseLayer(this.position);}
60154 var drawTile=OpenLayers.Tile.prototype.draw.apply(this,arguments);if((OpenLayers.Util.indexOf(this.layer.SUPPORTED_TRANSITIONS,this.layer.transitionEffect)!=-1)||this.layer.singleTile){if(drawTile){if(!this.backBufferTile){this.backBufferTile=this.clone();this.backBufferTile.hide();this.backBufferTile.isBackBuffer=true;this.events.register('loadend',this,this.resetBackBuffer);this.layer.events.register("loadend",this,this.resetBackBuffer);}
60155 this.startTransition();}else{if(this.backBufferTile){this.backBufferTile.clear();}}}else{if(drawTile&&this.isFirstDraw){this.events.register('loadend',this,this.showTile);this.isFirstDraw=false;}}
60156 if(!drawTile){return false;}
60157 if(this.isLoading){this.events.triggerEvent("reload");}else{this.isLoading=true;this.events.triggerEvent("loadstart");}
60158 return this.renderTile();},resetBackBuffer:function(){this.showTile();if(this.backBufferTile&&(this.isFirstDraw||!this.layer.numLoadingTiles)){this.isFirstDraw=false;var maxExtent=this.layer.maxExtent;var withinMaxExtent=(maxExtent&&this.bounds.intersectsBounds(maxExtent,false));if(withinMaxExtent){this.backBufferTile.position=this.position;this.backBufferTile.bounds=this.bounds;this.backBufferTile.size=this.size;this.backBufferTile.imageSize=this.layer.getImageSize(this.bounds)||this.size;this.backBufferTile.imageOffset=this.layer.imageOffset;this.backBufferTile.resolution=this.layer.getResolution();this.backBufferTile.renderTile();}
60159 this.backBufferTile.hide();}},renderTile:function(){if(this.imgDiv==null){this.initImgDiv();}
60160 this.imgDiv.viewRequestID=this.layer.map.viewRequestID;if(this.layer.async){this.layer.getURLasync(this.bounds,this,"url",this.positionImage);}else{if(this.layer.url instanceof Array){this.imgDiv.urls=this.layer.url.slice();}
60161 this.url=this.layer.getURL(this.bounds);this.positionImage();}
60162 return true;},positionImage:function(){if(this.layer===null){return;}
60163 OpenLayers.Util.modifyDOMElement(this.frame,null,this.position,this.size);var imageSize=this.layer.getImageSize(this.bounds);if(this.layerAlphaHack){OpenLayers.Util.modifyAlphaImageDiv(this.imgDiv,null,null,imageSize,this.url);}else{OpenLayers.Util.modifyDOMElement(this.imgDiv,null,null,imageSize);this.imgDiv.src=this.url;}},clear:function(){if(this.imgDiv){this.hide();if(OpenLayers.Tile.Image.useBlankTile){this.imgDiv.src=OpenLayers.Util.getImagesLocation()+"blank.gif";}}},initImgDiv:function(){var offset=this.layer.imageOffset;var size=this.layer.getImageSize(this.bounds);if(this.layerAlphaHack){this.imgDiv=OpenLayers.Util.createAlphaImageDiv(null,offset,size,null,"relative",null,null,null,true);}else{this.imgDiv=OpenLayers.Util.createImage(null,offset,size,null,"relative",null,null,true);}
60164 this.imgDiv.className='olTileImage';this.frame.style.zIndex=this.isBackBuffer?0:1;this.frame.appendChild(this.imgDiv);this.layer.div.appendChild(this.frame);if(this.layer.opacity!=null){OpenLayers.Util.modifyDOMElement(this.imgDiv,null,null,null,null,null,null,this.layer.opacity);}
60165 this.imgDiv.map=this.layer.map;var onload=function(){if(this.isLoading){this.isLoading=false;this.events.triggerEvent("loadend");}};if(this.layerAlphaHack){OpenLayers.Event.observe(this.imgDiv.childNodes[0],'load',OpenLayers.Function.bind(onload,this));}else{OpenLayers.Event.observe(this.imgDiv,'load',OpenLayers.Function.bind(onload,this));}
60166 var onerror=function(){if(this.imgDiv._attempts>OpenLayers.IMAGE_RELOAD_ATTEMPTS){onload.call(this);}};OpenLayers.Event.observe(this.imgDiv,"error",OpenLayers.Function.bind(onerror,this));},checkImgURL:function(){if(this.layer){var loaded=this.layerAlphaHack?this.imgDiv.firstChild.src:this.imgDiv.src;if(!OpenLayers.Util.isEquivalentUrl(loaded,this.url)){this.hide();}}},startTransition:function(){if(!this.backBufferTile||!this.backBufferTile.imgDiv){return;}
60167 var ratio=1;if(this.backBufferTile.resolution){ratio=this.backBufferTile.resolution/this.layer.getResolution();}
60168 if(ratio!=this.lastRatio){if(this.layer.transitionEffect=='resize'){var upperLeft=new OpenLayers.LonLat(this.backBufferTile.bounds.left,this.backBufferTile.bounds.top);var size=new OpenLayers.Size(this.backBufferTile.size.w*ratio,this.backBufferTile.size.h*ratio);var px=this.layer.map.getLayerPxFromLonLat(upperLeft);OpenLayers.Util.modifyDOMElement(this.backBufferTile.frame,null,px,size);var imageSize=this.backBufferTile.imageSize;imageSize=new OpenLayers.Size(imageSize.w*ratio,imageSize.h*ratio);var imageOffset=this.backBufferTile.imageOffset;if(imageOffset){imageOffset=new OpenLayers.Pixel(imageOffset.x*ratio,imageOffset.y*ratio);}
60169 OpenLayers.Util.modifyDOMElement(this.backBufferTile.imgDiv,null,imageOffset,imageSize);this.backBufferTile.show();}}else{if(this.layer.singleTile){this.backBufferTile.show();}else{this.backBufferTile.hide();}}
60170 this.lastRatio=ratio;},show:function(){this.frame.style.display='';if(OpenLayers.Util.indexOf(this.layer.SUPPORTED_TRANSITIONS,this.layer.transitionEffect)!=-1){if(navigator.userAgent.toLowerCase().indexOf("gecko")!=-1){this.frame.scrollLeft=this.frame.scrollLeft;}}},hide:function(){this.frame.style.display='none';},CLASS_NAME:"OpenLayers.Tile.Image"});OpenLayers.Tile.Image.useBlankTile=(OpenLayers.Util.getBrowserName()=="safari"||OpenLayers.Util.getBrowserName()=="opera");OpenLayers.Control.OverviewMap=OpenLayers.Class(OpenLayers.Control,{element:null,ovmap:null,size:new OpenLayers.Size(180,90),layers:null,minRectSize:15,minRectDisplayClass:"RectReplacement",minRatio:8,maxRatio:32,mapOptions:null,autoPan:false,handlers:null,resolutionFactor:1,maximized:false,initialize:function(options){this.layers=[];this.handlers={};OpenLayers.Control.prototype.initialize.apply(this,[options]);},destroy:function(){if(!this.mapDiv){return;}
60171 if(this.handlers.click){this.handlers.click.destroy();}
60172 if(this.handlers.drag){this.handlers.drag.destroy();}
60173 this.mapDiv.removeChild(this.extentRectangle);this.extentRectangle=null;if(this.rectEvents){this.rectEvents.destroy();this.rectEvents=null;}
60174 if(this.ovmap){this.ovmap.destroy();this.ovmap=null;}
60175 this.element.removeChild(this.mapDiv);this.mapDiv=null;this.div.removeChild(this.element);this.element=null;if(this.maximizeDiv){OpenLayers.Event.stopObservingElement(this.maximizeDiv);this.div.removeChild(this.maximizeDiv);this.maximizeDiv=null;}
60176 if(this.minimizeDiv){OpenLayers.Event.stopObservingElement(this.minimizeDiv);this.div.removeChild(this.minimizeDiv);this.minimizeDiv=null;}
60177 this.map.events.un({"moveend":this.update,"changebaselayer":this.baseLayerDraw,scope:this});OpenLayers.Control.prototype.destroy.apply(this,arguments);},draw:function(){OpenLayers.Control.prototype.draw.apply(this,arguments);if(!(this.layers.length>0)){if(this.map.baseLayer){var layer=this.map.baseLayer.clone();this.layers=[layer];}else{this.map.events.register("changebaselayer",this,this.baseLayerDraw);return this.div;}}
60178 this.element=document.createElement('div');this.element.className=this.displayClass+'Element';this.element.style.display='none';this.mapDiv=document.createElement('div');this.mapDiv.style.width=this.size.w+'px';this.mapDiv.style.height=this.size.h+'px';this.mapDiv.style.position='relative';this.mapDiv.style.overflow='hidden';this.mapDiv.id=OpenLayers.Util.createUniqueID('overviewMap');this.extentRectangle=document.createElement('div');this.extentRectangle.style.position='absolute';this.extentRectangle.style.zIndex=1000;this.extentRectangle.className=this.displayClass+'ExtentRectangle';this.mapDiv.appendChild(this.extentRectangle);this.element.appendChild(this.mapDiv);this.div.appendChild(this.element);if(!this.outsideViewport){this.div.className+=" "+this.displayClass+'Container';var imgLocation=OpenLayers.Util.getImagesLocation();var img=imgLocation+'layer-switcher-maximize.png';this.maximizeDiv=OpenLayers.Util.createAlphaImageDiv(this.displayClass+'MaximizeButton',null,new OpenLayers.Size(18,18),img,'absolute');this.maximizeDiv.style.display='none';this.maximizeDiv.className=this.displayClass+'MaximizeButton';OpenLayers.Event.observe(this.maximizeDiv,'click',OpenLayers.Function.bindAsEventListener(this.maximizeControl,this));this.div.appendChild(this.maximizeDiv);var img=imgLocation+'layer-switcher-minimize.png';this.minimizeDiv=OpenLayers.Util.createAlphaImageDiv('OpenLayers_Control_minimizeDiv',null,new OpenLayers.Size(18,18),img,'absolute');this.minimizeDiv.style.display='none';this.minimizeDiv.className=this.displayClass+'MinimizeButton';OpenLayers.Event.observe(this.minimizeDiv,'click',OpenLayers.Function.bindAsEventListener(this.minimizeControl,this));this.div.appendChild(this.minimizeDiv);var eventsToStop=['dblclick','mousedown'];for(var i=0,len=eventsToStop.length;i<len;i++){OpenLayers.Event.observe(this.maximizeDiv,eventsToStop[i],OpenLayers.Event.stop);OpenLayers.Event.observe(this.minimizeDiv,eventsToStop[i],OpenLayers.Event.stop);}
60179 this.minimizeControl();}else{this.element.style.display='';}
60180 if(this.map.getExtent()){this.update();}
60181 this.map.events.register('moveend',this,this.update);if(this.maximized){this.maximizeControl();}
60182 return this.div;},baseLayerDraw:function(){this.draw();this.map.events.unregister("changebaselayer",this,this.baseLayerDraw);},rectDrag:function(px){var deltaX=this.handlers.drag.last.x-px.x;var deltaY=this.handlers.drag.last.y-px.y;if(deltaX!=0||deltaY!=0){var rectTop=this.rectPxBounds.top;var rectLeft=this.rectPxBounds.left;var rectHeight=Math.abs(this.rectPxBounds.getHeight());var rectWidth=this.rectPxBounds.getWidth();var newTop=Math.max(0,(rectTop-deltaY));newTop=Math.min(newTop,this.ovmap.size.h-this.hComp-rectHeight);var newLeft=Math.max(0,(rectLeft-deltaX));newLeft=Math.min(newLeft,this.ovmap.size.w-this.wComp-rectWidth);this.setRectPxBounds(new OpenLayers.Bounds(newLeft,newTop+rectHeight,newLeft+rectWidth,newTop));}},mapDivClick:function(evt){var pxCenter=this.rectPxBounds.getCenterPixel();var deltaX=evt.xy.x-pxCenter.x;var deltaY=evt.xy.y-pxCenter.y;var top=this.rectPxBounds.top;var left=this.rectPxBounds.left;var height=Math.abs(this.rectPxBounds.getHeight());var width=this.rectPxBounds.getWidth();var newTop=Math.max(0,(top+deltaY));newTop=Math.min(newTop,this.ovmap.size.h-height);var newLeft=Math.max(0,(left+deltaX));newLeft=Math.min(newLeft,this.ovmap.size.w-width);this.setRectPxBounds(new OpenLayers.Bounds(newLeft,newTop+height,newLeft+width,newTop));this.updateMapToRect();},maximizeControl:function(e){this.element.style.display='';this.showToggle(false);if(e!=null){OpenLayers.Event.stop(e);}},minimizeControl:function(e){this.element.style.display='none';this.showToggle(true);if(e!=null){OpenLayers.Event.stop(e);}},showToggle:function(minimize){this.maximizeDiv.style.display=minimize?'':'none';this.minimizeDiv.style.display=minimize?'none':'';},update:function(){if(this.ovmap==null){this.createMap();}
60183 if(this.autoPan||!this.isSuitableOverview()){this.updateOverview();}
60184 this.updateRectToMap();},isSuitableOverview:function(){var mapExtent=this.map.getExtent();var maxExtent=this.map.maxExtent;var testExtent=new OpenLayers.Bounds(Math.max(mapExtent.left,maxExtent.left),Math.max(mapExtent.bottom,maxExtent.bottom),Math.min(mapExtent.right,maxExtent.right),Math.min(mapExtent.top,maxExtent.top));if(this.ovmap.getProjection()!=this.map.getProjection()){testExtent=testExtent.transform(this.map.getProjectionObject(),this.ovmap.getProjectionObject());}
60185 var resRatio=this.ovmap.getResolution()/this.map.getResolution();return((resRatio>this.minRatio)&&(resRatio<=this.maxRatio)&&(this.ovmap.getExtent().containsBounds(testExtent)));},updateOverview:function(){var mapRes=this.map.getResolution();var targetRes=this.ovmap.getResolution();var resRatio=targetRes/mapRes;if(resRatio>this.maxRatio){targetRes=this.minRatio*mapRes;}else if(resRatio<=this.minRatio){targetRes=this.maxRatio*mapRes;}
60186 var center;if(this.ovmap.getProjection()!=this.map.getProjection()){center=this.map.center.clone();center.transform(this.map.getProjectionObject(),this.ovmap.getProjectionObject());}else{center=this.map.center;}
60187 this.ovmap.setCenter(center,this.ovmap.getZoomForResolution(targetRes*this.resolutionFactor));this.updateRectToMap();},createMap:function(){var options=OpenLayers.Util.extend({controls:[],maxResolution:'auto',fallThrough:false},this.mapOptions);this.ovmap=new OpenLayers.Map(this.mapDiv,options);OpenLayers.Event.stopObserving(window,'unload',this.ovmap.unloadDestroy);this.ovmap.addLayers(this.layers);this.ovmap.zoomToMaxExtent();this.wComp=parseInt(OpenLayers.Element.getStyle(this.extentRectangle,'border-left-width'))+
60188 parseInt(OpenLayers.Element.getStyle(this.extentRectangle,'border-right-width'));this.wComp=(this.wComp)?this.wComp:2;this.hComp=parseInt(OpenLayers.Element.getStyle(this.extentRectangle,'border-top-width'))+
60189 parseInt(OpenLayers.Element.getStyle(this.extentRectangle,'border-bottom-width'));this.hComp=(this.hComp)?this.hComp:2;this.handlers.drag=new OpenLayers.Handler.Drag(this,{move:this.rectDrag,done:this.updateMapToRect},{map:this.ovmap});this.handlers.click=new OpenLayers.Handler.Click(this,{"click":this.mapDivClick},{"single":true,"double":false,"stopSingle":true,"stopDouble":true,"pixelTolerance":1,map:this.ovmap});this.handlers.click.activate();this.rectEvents=new OpenLayers.Events(this,this.extentRectangle,null,true);this.rectEvents.register("mouseover",this,function(e){if(!this.handlers.drag.active&&!this.map.dragging){this.handlers.drag.activate();}});this.rectEvents.register("mouseout",this,function(e){if(!this.handlers.drag.dragging){this.handlers.drag.deactivate();}});if(this.ovmap.getProjection()!=this.map.getProjection()){var sourceUnits=this.map.getProjectionObject().getUnits()||this.map.units||this.map.baseLayer.units;var targetUnits=this.ovmap.getProjectionObject().getUnits()||this.ovmap.units||this.ovmap.baseLayer.units;this.resolutionFactor=sourceUnits&&targetUnits?OpenLayers.INCHES_PER_UNIT[sourceUnits]/OpenLayers.INCHES_PER_UNIT[targetUnits]:1;}},updateRectToMap:function(){var bounds;if(this.ovmap.getProjection()!=this.map.getProjection()){bounds=this.map.getExtent().transform(this.map.getProjectionObject(),this.ovmap.getProjectionObject());}else{bounds=this.map.getExtent();}
60190 var pxBounds=this.getRectBoundsFromMapBounds(bounds);if(pxBounds){this.setRectPxBounds(pxBounds);}},updateMapToRect:function(){var lonLatBounds=this.getMapBoundsFromRectBounds(this.rectPxBounds);if(this.ovmap.getProjection()!=this.map.getProjection()){lonLatBounds=lonLatBounds.transform(this.ovmap.getProjectionObject(),this.map.getProjectionObject());}
60191 this.map.panTo(lonLatBounds.getCenterLonLat());},setRectPxBounds:function(pxBounds){var top=Math.max(pxBounds.top,0);var left=Math.max(pxBounds.left,0);var bottom=Math.min(pxBounds.top+Math.abs(pxBounds.getHeight()),this.ovmap.size.h-this.hComp);var right=Math.min(pxBounds.left+pxBounds.getWidth(),this.ovmap.size.w-this.wComp);var width=Math.max(right-left,0);var height=Math.max(bottom-top,0);if(width<this.minRectSize||height<this.minRectSize){this.extentRectangle.className=this.displayClass+
60192 this.minRectDisplayClass;var rLeft=left+(width/2)-(this.minRectSize/2);var rTop=top+(height/2)-(this.minRectSize/2);this.extentRectangle.style.top=Math.round(rTop)+'px';this.extentRectangle.style.left=Math.round(rLeft)+'px';this.extentRectangle.style.height=this.minRectSize+'px';this.extentRectangle.style.width=this.minRectSize+'px';}else{this.extentRectangle.className=this.displayClass+'ExtentRectangle';this.extentRectangle.style.top=Math.round(top)+'px';this.extentRectangle.style.left=Math.round(left)+'px';this.extentRectangle.style.height=Math.round(height)+'px';this.extentRectangle.style.width=Math.round(width)+'px';}
60193 this.rectPxBounds=new OpenLayers.Bounds(Math.round(left),Math.round(bottom),Math.round(right),Math.round(top));},getRectBoundsFromMapBounds:function(lonLatBounds){var leftBottomLonLat=new OpenLayers.LonLat(lonLatBounds.left,lonLatBounds.bottom);var rightTopLonLat=new OpenLayers.LonLat(lonLatBounds.right,lonLatBounds.top);var leftBottomPx=this.getOverviewPxFromLonLat(leftBottomLonLat);var rightTopPx=this.getOverviewPxFromLonLat(rightTopLonLat);var bounds=null;if(leftBottomPx&&rightTopPx){bounds=new OpenLayers.Bounds(leftBottomPx.x,leftBottomPx.y,rightTopPx.x,rightTopPx.y);}
60194 return bounds;},getMapBoundsFromRectBounds:function(pxBounds){var leftBottomPx=new OpenLayers.Pixel(pxBounds.left,pxBounds.bottom);var rightTopPx=new OpenLayers.Pixel(pxBounds.right,pxBounds.top);var leftBottomLonLat=this.getLonLatFromOverviewPx(leftBottomPx);var rightTopLonLat=this.getLonLatFromOverviewPx(rightTopPx);return new OpenLayers.Bounds(leftBottomLonLat.lon,leftBottomLonLat.lat,rightTopLonLat.lon,rightTopLonLat.lat);},getLonLatFromOverviewPx:function(overviewMapPx){var size=this.ovmap.size;var res=this.ovmap.getResolution();var center=this.ovmap.getExtent().getCenterLonLat();var delta_x=overviewMapPx.x-(size.w/2);var delta_y=overviewMapPx.y-(size.h/2);return new OpenLayers.LonLat(center.lon+delta_x*res,center.lat-delta_y*res);},getOverviewPxFromLonLat:function(lonlat){var res=this.ovmap.getResolution();var extent=this.ovmap.getExtent();var px=null;if(extent){px=new OpenLayers.Pixel(Math.round(1/res*(lonlat.lon-extent.left)),Math.round(1/res*(extent.top-lonlat.lat)));}
60195 return px;},CLASS_NAME:'OpenLayers.Control.OverviewMap'});OpenLayers.Feature=OpenLayers.Class({layer:null,id:null,lonlat:null,data:null,marker:null,popupClass:OpenLayers.Popup.AnchoredBubble,popup:null,initialize:function(layer,lonlat,data){this.layer=layer;this.lonlat=lonlat;this.data=(data!=null)?data:{};this.id=OpenLayers.Util.createUniqueID(this.CLASS_NAME+"_");},destroy:function(){if((this.layer!=null)&&(this.layer.map!=null)){if(this.popup!=null){this.layer.map.removePopup(this.popup);}}
60196 if(this.layer!=null&&this.marker!=null){this.layer.removeMarker(this.marker);}
60197 this.layer=null;this.id=null;this.lonlat=null;this.data=null;if(this.marker!=null){this.destroyMarker(this.marker);this.marker=null;}
60198 if(this.popup!=null){this.destroyPopup(this.popup);this.popup=null;}},onScreen:function(){var onScreen=false;if((this.layer!=null)&&(this.layer.map!=null)){var screenBounds=this.layer.map.getExtent();onScreen=screenBounds.containsLonLat(this.lonlat);}
60199 return onScreen;},createMarker:function(){if(this.lonlat!=null){this.marker=new OpenLayers.Marker(this.lonlat,this.data.icon);}
60200 return this.marker;},destroyMarker:function(){this.marker.destroy();},createPopup:function(closeBox){if(this.lonlat!=null){var id=this.id+"_popup";var anchor=(this.marker)?this.marker.icon:null;if(!this.popup){this.popup=new this.popupClass(id,this.lonlat,this.data.popupSize,this.data.popupContentHTML,anchor,closeBox);}
60201 if(this.data.overflow!=null){this.popup.contentDiv.style.overflow=this.data.overflow;}
60202 this.popup.feature=this;}
60203 return this.popup;},destroyPopup:function(){if(this.popup){this.popup.feature=null;this.popup.destroy();this.popup=null;}},CLASS_NAME:"OpenLayers.Feature"});OpenLayers.Format.CSWGetDomain.v2_0_2=OpenLayers.Class(OpenLayers.Format.XML,{namespaces:{xlink:"http://www.w3.org/1999/xlink",xsi:"http://www.w3.org/2001/XMLSchema-instance",csw:"http://www.opengis.net/cat/csw/2.0.2"},defaultPrefix:"csw",version:"2.0.2",schemaLocation:"http://www.opengis.net/cat/csw/2.0.2 http://schemas.opengis.net/csw/2.0.2/CSW-discovery.xsd",PropertyName:null,ParameterName:null,initialize:function(options){OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);},read:function(data){if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);}
60204 if(data&&data.nodeType==9){data=data.documentElement;}
60205 var obj={};this.readNode(data,obj);return obj;},readers:{"csw":{"GetDomainResponse":function(node,obj){this.readChildNodes(node,obj);},"DomainValues":function(node,obj){if(!(obj.DomainValues instanceof Array)){obj.DomainValues=[];}
60206 var attrs=node.attributes;var domainValue={};for(var i=0,len=attrs.length;i<len;++i){domainValue[attrs[i].name]=attrs[i].nodeValue;}
60207 this.readChildNodes(node,domainValue);obj.DomainValues.push(domainValue);},"PropertyName":function(node,obj){obj.PropertyName=this.getChildValue(node);},"ParameterName":function(node,obj){obj.ParameterName=this.getChildValue(node);},"ListOfValues":function(node,obj){if(!(obj.ListOfValues instanceof Array)){obj.ListOfValues=[];}
60208 this.readChildNodes(node,obj.ListOfValues);},"Value":function(node,obj){var attrs=node.attributes;var value={}
60209 for(var i=0,len=attrs.length;i<len;++i){value[attrs[i].name]=attrs[i].nodeValue;}
60210 value.value=this.getChildValue(node);obj.push({Value:value});},"ConceptualScheme":function(node,obj){obj.ConceptualScheme={};this.readChildNodes(node,obj.ConceptualScheme);},"Name":function(node,obj){obj.Name=this.getChildValue(node);},"Document":function(node,obj){obj.Document=this.getChildValue(node);},"Authority":function(node,obj){obj.Authority=this.getChildValue(node);},"RangeOfValues":function(node,obj){obj.RangeOfValues={};this.readChildNodes(node,obj.RangeOfValues);},"MinValue":function(node,obj){var attrs=node.attributes;var value={}
60211 for(var i=0,len=attrs.length;i<len;++i){value[attrs[i].name]=attrs[i].nodeValue;}
60212 value.value=this.getChildValue(node);obj.MinValue=value;},"MaxValue":function(node,obj){var attrs=node.attributes;var value={}
60213 for(var i=0,len=attrs.length;i<len;++i){value[attrs[i].name]=attrs[i].nodeValue;}
60214 value.value=this.getChildValue(node);obj.MaxValue=value;}}},write:function(options){var node=this.writeNode("csw:GetDomain",options);return OpenLayers.Format.XML.prototype.write.apply(this,[node]);},writers:{"csw":{"GetDomain":function(options){var node=this.createElementNSPlus("csw:GetDomain",{attributes:{service:"CSW",version:this.version}});if(options.PropertyName||this.PropertyName){this.writeNode("csw:PropertyName",options.PropertyName||this.PropertyName,node);}else if(options.ParameterName||this.ParameterName){this.writeNode("csw:ParameterName",options.ParameterName||this.ParameterName,node);}
60215 this.readChildNodes(node,options);return node;},"PropertyName":function(value){var node=this.createElementNSPlus("csw:PropertyName",{value:value});return node;},"ParameterName":function(value){var node=this.createElementNSPlus("csw:ParameterName",{value:value});return node;}}},CLASS_NAME:"OpenLayers.Format.CSWGetDomain.v2_0_2"});OpenLayers.Format.Context=OpenLayers.Class({version:null,layerOptions:null,layerParams:null,parser:null,initialize:function(options){OpenLayers.Util.extend(this,options);this.options=options;},read:function(data,options){if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);}
60216 var root=data.documentElement;var version=this.version;if(!version){version=root.getAttribute("version");}
60217 var parser=this.getParser(version);var context=parser.read(data,options);var map;if(options&&options.map){this.context=context;if(options.map instanceof OpenLayers.Map){map=this.mergeContextToMap(context,options.map);}else{var mapOptions=options.map;if(OpenLayers.Util.isElement(mapOptions)||typeof mapOptions=="string"){mapOptions={div:mapOptions};}
60218 map=this.contextToMap(context,mapOptions);}}else{map=context;}
60219 return map;},getLayerFromContext:function(layerContext){var i,len;var options={queryable:layerContext.queryable,visibility:layerContext.visibility,maxExtent:layerContext.maxExtent,metadata:OpenLayers.Util.applyDefaults(layerContext.metadata,{styles:layerContext.styles}),numZoomLevels:layerContext.numZoomLevels,units:layerContext.units,isBaseLayer:layerContext.isBaseLayer,opacity:layerContext.opacity,displayInLayerSwitcher:layerContext.displayInLayerSwitcher,singleTile:layerContext.singleTile,tileSize:(layerContext.tileSize)?new OpenLayers.Size(layerContext.tileSize.width,layerContext.tileSize.height):undefined,minScale:layerContext.minScale||layerContext.maxScaleDenominator,maxScale:layerContext.maxScale||layerContext.minScaleDenominator};if(this.layerOptions){OpenLayers.Util.applyDefaults(options,this.layerOptions);}
60220 var params={layers:layerContext.name,transparent:layerContext.transparent,version:layerContext.version};if(layerContext.formats&&layerContext.formats.length>0){params.format=layerContext.formats[0].value;for(i=0,len=layerContext.formats.length;i<len;i++){var format=layerContext.formats[i];if(format.current==true){params.format=format.value;break;}}}
60221 if(layerContext.styles&&layerContext.styles.length>0){for(i=0,len=layerContext.styles.length;i<len;i++){var style=layerContext.styles[i];if(style.current==true){if(style.href){params.sld=style.href;}else if(style.body){params.sld_body=style.body;}else{params.styles=style.name;}
60222 break;}}}
60223 if(this.layerParams){OpenLayers.Util.applyDefaults(params,this.layerParams);}
60224 var layer=null;var service=layerContext.service;if(service==OpenLayers.Format.Context.serviceTypes.WFS){options.strategies=[new OpenLayers.Strategy.BBOX()];options.protocol=new OpenLayers.Protocol.WFS({url:layerContext.url,featurePrefix:layerContext.name.split(":")[0],featureType:layerContext.name.split(":").pop()});layer=new OpenLayers.Layer.Vector(layerContext.title||layerContext.name,options);}else if(service==OpenLayers.Format.Context.serviceTypes.KML){options.strategies=[new OpenLayers.Strategy.Fixed()];options.protocol=new OpenLayers.Protocol.HTTP({url:layerContext.url,format:new OpenLayers.Format.KML()});layer=new OpenLayers.Layer.Vector(layerContext.title||layerContext.name,options);}else if(service==OpenLayers.Format.Context.serviceTypes.GML){options.strategies=[new OpenLayers.Strategy.Fixed()];options.protocol=new OpenLayers.Protocol.HTTP({url:layerContext.url,format:new OpenLayers.Format.GML()});layer=new OpenLayers.Layer.Vector(layerContext.title||layerContext.name,options);}else if(layerContext.features){layer=new OpenLayers.Layer.Vector(layerContext.title||layerContext.name,options);layer.addFeatures(layerContext.features);}else if(layerContext.categoryLayer!==true){layer=new OpenLayers.Layer.WMS(layerContext.title||layerContext.name,layerContext.url,params,options);}
60225 return layer;},getLayersFromContext:function(layersContext){var layers=[];for(var i=0,len=layersContext.length;i<len;i++){var layer=this.getLayerFromContext(layersContext[i]);if(layer!==null){layers.push(layer);}}
60226 return layers;},contextToMap:function(context,options){options=OpenLayers.Util.applyDefaults({maxExtent:context.maxExtent,projection:context.projection},options);var map=new OpenLayers.Map(options);map.addLayers(this.getLayersFromContext(context.layersContext));map.setCenter(context.bounds.getCenterLonLat(),map.getZoomForExtent(context.bounds,true));return map;},mergeContextToMap:function(context,map){map.addLayers(this.getLayersFromContext(context.layersContext));return map;},write:function(obj,options){obj=this.toContext(obj);var version=options&&options.version;var parser=this.getParser(version);var context=parser.write(obj,options);return context;},CLASS_NAME:"OpenLayers.Format.Context"});OpenLayers.Format.Context.serviceTypes={"WMS":"urn:ogc:serviceType:WMS","WFS":"urn:ogc:serviceType:WFS","WCS":"urn:ogc:serviceType:WCS","GML":"urn:ogc:serviceType:GML","SLD":"urn:ogc:serviceType:SLD","FES":"urn:ogc:serviceType:FES","KML":"urn:ogc:serviceType:KML"};if(!OpenLayers.Format.OWSCommon){OpenLayers.Format.OWSCommon={};}
60227 OpenLayers.Format.OWSCommon.v1=OpenLayers.Class(OpenLayers.Format.XML,{regExes:{trimSpace:(/^\s*|\s*$/g),removeSpace:(/\s*/g),splitSpace:(/\s+/),trimComma:(/\s*,\s*/g)},readers:{"ows":{"ServiceIdentification":function(node,obj){obj.serviceIdentification={};this.readChildNodes(node,obj.serviceIdentification);},"Title":function(node,obj){obj.title=this.getChildValue(node);},"Abstract":function(node,serviceIdentification){serviceIdentification["abstract"]=this.getChildValue(node);},"Keywords":function(node,serviceIdentification){serviceIdentification.keywords={};this.readChildNodes(node,serviceIdentification.keywords);},"Keyword":function(node,keywords){keywords[this.getChildValue(node)]=true;},"ServiceType":function(node,serviceIdentification){serviceIdentification.serviceType={codeSpace:node.getAttribute('codeSpace'),value:this.getChildValue(node)};},"ServiceTypeVersion":function(node,serviceIdentification){serviceIdentification.serviceTypeVersion=this.getChildValue(node);},"Fees":function(node,serviceIdentification){serviceIdentification.fees=this.getChildValue(node);},"AccessConstraints":function(node,serviceIdentification){serviceIdentification.accessConstraints=this.getChildValue(node);},"ServiceProvider":function(node,obj){obj.serviceProvider={};this.readChildNodes(node,obj.serviceProvider);},"ProviderName":function(node,serviceProvider){serviceProvider.providerName=this.getChildValue(node);},"ProviderSite":function(node,serviceProvider){serviceProvider.providerSite=this.getAttributeNS(node,this.namespaces.xlink,"href");},"ServiceContact":function(node,serviceProvider){serviceProvider.serviceContact={};this.readChildNodes(node,serviceProvider.serviceContact);},"IndividualName":function(node,serviceContact){serviceContact.individualName=this.getChildValue(node);},"PositionName":function(node,serviceContact){serviceContact.positionName=this.getChildValue(node);},"ContactInfo":function(node,serviceContact){serviceContact.contactInfo={};this.readChildNodes(node,serviceContact.contactInfo);},"Phone":function(node,contactInfo){contactInfo.phone={};this.readChildNodes(node,contactInfo.phone);},"Voice":function(node,phone){phone.voice=this.getChildValue(node);},"Address":function(node,contactInfo){contactInfo.address={};this.readChildNodes(node,contactInfo.address);},"DeliveryPoint":function(node,address){address.deliveryPoint=this.getChildValue(node);},"City":function(node,address){address.city=this.getChildValue(node);},"AdministrativeArea":function(node,address){address.administrativeArea=this.getChildValue(node);},"PostalCode":function(node,address){address.postalCode=this.getChildValue(node);},"Country":function(node,address){address.country=this.getChildValue(node);},"ElectronicMailAddress":function(node,address){address.electronicMailAddress=this.getChildValue(node);},"Role":function(node,serviceContact){serviceContact.role=this.getChildValue(node);},"OperationsMetadata":function(node,obj){obj.operationsMetadata={};this.readChildNodes(node,obj.operationsMetadata);},"Operation":function(node,operationsMetadata){var name=node.getAttribute("name");operationsMetadata[name]={};this.readChildNodes(node,operationsMetadata[name]);},"DCP":function(node,operation){operation.dcp={};this.readChildNodes(node,operation.dcp);},"HTTP":function(node,dcp){dcp.http={};this.readChildNodes(node,dcp.http);},"Get":function(node,http){http.get=this.getAttributeNS(node,this.namespaces.xlink,"href");},"Post":function(node,http){http.post=this.getAttributeNS(node,this.namespaces.xlink,"href");},"Parameter":function(node,operation){if(!operation.parameters){operation.parameters={};}
60228 var name=node.getAttribute("name");operation.parameters[name]={};this.readChildNodes(node,operation.parameters[name]);},"Value":function(node,allowedValues){allowedValues[this.getChildValue(node)]=true;},"OutputFormat":function(node,obj){obj.formats.push({value:this.getChildValue(node)});this.readChildNodes(node,obj);},"WGS84BoundingBox":function(node,obj){var boundingBox={};boundingBox.crs=node.getAttribute("crs");if(obj.BoundingBox){obj.BoundingBox.push(boundingBox);}else{obj.projection=boundingBox.crs;boundingBox=obj;}
60229 this.readChildNodes(node,boundingBox);},"BoundingBox":function(node,obj){this.readers['ows']['WGS84BoundingBox'].apply(this,[node,obj]);},"LowerCorner":function(node,obj){var str=this.getChildValue(node).replace(this.regExes.trimSpace,"");str=str.replace(this.regExes.trimComma,",");var pointList=str.split(this.regExes.splitSpace);obj.left=pointList[0];obj.bottom=pointList[1];},"UpperCorner":function(node,obj){var str=this.getChildValue(node).replace(this.regExes.trimSpace,"");str=str.replace(this.regExes.trimComma,",");var pointList=str.split(this.regExes.splitSpace);obj.right=pointList[0];obj.top=pointList[1];obj.bounds=new OpenLayers.Bounds(obj.left,obj.bottom,obj.right,obj.top);delete obj.left;delete obj.bottom;delete obj.right;delete obj.top;}}},writers:{"ows":{"BoundingBox":function(options){var node=this.createElementNSPlus("ows:BoundingBox",{attributes:{crs:options.projection}});this.writeNode("ows:LowerCorner",options,node);this.writeNode("ows:UpperCorner",options,node);return node;},"LowerCorner":function(options){var node=this.createElementNSPlus("ows:LowerCorner",{value:options.bounds.left+" "+options.bounds.bottom});return node;},"UpperCorner":function(options){var node=this.createElementNSPlus("ows:UpperCorner",{value:options.bounds.right+" "+options.bounds.top});return node;},"Title":function(title){var node=this.createElementNSPlus("ows:Title",{value:title});return node;},"OutputFormat":function(format){var node=this.createElementNSPlus("ows:OutputFormat",{value:format});return node;}}},CLASS_NAME:"OpenLayers.Format.OWSCommon.v1"});OpenLayers.Format.SOSCapabilities=OpenLayers.Class(OpenLayers.Format.XML,{defaultVersion:"1.0.0",version:null,parser:null,initialize:function(options){OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);this.options=options;},read:function(data){if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);}
60230 var root=data.documentElement;var version=this.version||root.getAttribute("version")||this.defaultVersion;if(!this.parser||this.parser.version!==version){var constr=OpenLayers.Format.SOSCapabilities["v"+version.replace(/\./g,"_")];if(!constr){throw"Can't find a SOS capabilities parser for version "+version;}
60231 var parser=new constr(this.options);}
60232 var capabilities=parser.read(data);capabilities.version=version;return capabilities;},CLASS_NAME:"OpenLayers.Format.SOSCapabilities"});OpenLayers.Format.WFSCapabilities=OpenLayers.Class(OpenLayers.Format.XML,{defaultVersion:"1.1.0",version:null,initialize:function(options){OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);this.options=options;},read:function(data){if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);}
60233 var root=data.documentElement;var version=this.version;if(!version){version=root.getAttribute("version");if(!version){version=this.defaultVersion;}}
60234 var constr=OpenLayers.Format.WFSCapabilities["v"+version.replace(/\./g,"_")];if(!constr){throw"Can't find a WFS capabilities parser for version "+version;}
60235 var parser=new constr(this.options);var capabilities=parser.read(data);capabilities.version=version;return capabilities;},CLASS_NAME:"OpenLayers.Format.WFSCapabilities"});OpenLayers.Format.WFSDescribeFeatureType=OpenLayers.Class(OpenLayers.Format.XML,{namespaces:{xsd:"http://www.w3.org/2001/XMLSchema"},initialize:function(options){OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);},readers:{"xsd":{"schema":function(node,obj){var complexTypes=[];var customTypes={};var schema={complexTypes:complexTypes,customTypes:customTypes};this.readChildNodes(node,schema);var attributes=node.attributes;var attr,name;for(var i=0,len=attributes.length;i<len;++i){attr=attributes[i];name=attr.name;if(name.indexOf("xmlns")==0){this.setNamespace(name.split(":")[1]||"",attr.value);}else{obj[name]=attr.value;}}
60236 obj.featureTypes=complexTypes;obj.targetPrefix=this.namespaceAlias[obj.targetNamespace];var complexType,customType;for(var i=0,len=complexTypes.length;i<len;++i){complexType=complexTypes[i];customType=customTypes[complexType.typeName];if(customTypes[complexType.typeName]){complexType.typeName=customType.name;}}},"complexType":function(node,obj){var complexType={"typeName":node.getAttribute("name")};this.readChildNodes(node,complexType);obj.complexTypes.push(complexType);},"complexContent":function(node,obj){this.readChildNodes(node,obj);},"extension":function(node,obj){this.readChildNodes(node,obj);},"sequence":function(node,obj){var sequence={elements:[]};this.readChildNodes(node,sequence);obj.properties=sequence.elements;},"element":function(node,obj){if(obj.elements){var element={};var attributes=node.attributes;var attr;for(var i=0,len=attributes.length;i<len;++i){attr=attributes[i];element[attr.name]=attr.value;}
60237 var type=element.type;if(!type){type={};this.readChildNodes(node,type);element.restriction=type;element.type=type.base;}
60238 var fullType=type.base||type;element.localType=fullType.split(":").pop();obj.elements.push(element);}
60239 if(obj.complexTypes){var type=node.getAttribute("type");var localType=type.split(":").pop();obj.customTypes[localType]={"name":node.getAttribute("name"),"type":type};}},"simpleType":function(node,obj){this.readChildNodes(node,obj);},"restriction":function(node,obj){obj.base=node.getAttribute("base");this.readRestriction(node,obj);}}},readRestriction:function(node,obj){var children=node.childNodes;var child,nodeName,value;for(var i=0,len=children.length;i<len;++i){child=children[i];if(child.nodeType==1){nodeName=child.nodeName.split(":").pop();value=child.getAttribute("value");if(!obj[nodeName]){obj[nodeName]=value;}else{if(typeof obj[nodeName]=="string"){obj[nodeName]=[obj[nodeName]];}
60240 obj[nodeName].push(value);}}}},read:function(data){if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);}
60241 if(data&&data.nodeType==9){data=data.documentElement;}
60242 var schema={};this.readNode(data,schema);return schema;},CLASS_NAME:"OpenLayers.Format.WFSDescribeFeatureType"});OpenLayers.Format.WFST.v1=OpenLayers.Class(OpenLayers.Format.XML,{namespaces:{xlink:"http://www.w3.org/1999/xlink",xsi:"http://www.w3.org/2001/XMLSchema-instance",wfs:"http://www.opengis.net/wfs",gml:"http://www.opengis.net/gml",ogc:"http://www.opengis.net/ogc"},defaultPrefix:"wfs",version:null,schemaLocations:null,srsName:null,extractAttributes:true,xy:true,stateName:null,initialize:function(options){this.stateName={};this.stateName[OpenLayers.State.INSERT]="wfs:Insert";this.stateName[OpenLayers.State.UPDATE]="wfs:Update";this.stateName[OpenLayers.State.DELETE]="wfs:Delete";OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);},getSrsName:function(feature,options){var srsName=options&&options.srsName;if(!srsName){if(feature&&feature.layer){srsName=feature.layer.projection.getCode();}else{srsName=this.srsName;}}
60243 return srsName;},read:function(data,options){options=options||{};OpenLayers.Util.applyDefaults(options,{output:"features"});if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);}
60244 if(data&&data.nodeType==9){data=data.documentElement;}
60245 var obj={};if(data){this.readNode(data,obj);}
60246 if(obj.features&&options.output==="features"){obj=obj.features;}
60247 return obj;},readers:{"wfs":{"FeatureCollection":function(node,obj){obj.features=[];this.readChildNodes(node,obj);}}},write:function(features){var node=this.writeNode("wfs:Transaction",features);var value=this.schemaLocationAttr();if(value){this.setAttributeNS(node,this.namespaces["xsi"],"xsi:schemaLocation",value)}
60248 return OpenLayers.Format.XML.prototype.write.apply(this,[node]);},writers:{"wfs":{"GetFeature":function(options){var node=this.createElementNSPlus("wfs:GetFeature",{attributes:{service:"WFS",version:this.version,outputFormat:options&&options.outputFormat,maxFeatures:options&&options.maxFeatures,"xsi:schemaLocation":this.schemaLocationAttr(options)}});if(typeof this.featureType=="string"){this.writeNode("Query",options,node);}else{for(var i=0,len=this.featureType.length;i<len;i++){options.featureType=this.featureType[i];this.writeNode("Query",options,node);}}
60249 return node;},"Transaction":function(features){var node=this.createElementNSPlus("wfs:Transaction",{attributes:{service:"WFS",version:this.version}});if(features){var name,feature;for(var i=0,len=features.length;i<len;++i){feature=features[i];name=this.stateName[feature.state];if(name){this.writeNode(name,feature,node);}}}
60250 return node;},"Insert":function(feature){var node=this.createElementNSPlus("wfs:Insert");this.srsName=this.getSrsName(feature);this.writeNode("feature:_typeName",feature,node);return node;},"Update":function(feature){var node=this.createElementNSPlus("wfs:Update",{attributes:{typeName:(this.featureNS?this.featurePrefix+":":"")+
60251 this.featureType}});if(this.featureNS){node.setAttribute("xmlns:"+this.featurePrefix,this.featureNS);}
60252 if(this.geometryName!==null){this.writeNode("Property",{name:this.geometryName,value:feature},node);}
60253 for(var key in feature.attributes){if(feature.attributes[key]!==undefined){this.writeNode("Property",{name:key,value:feature.attributes[key]},node);}}
60254 this.writeNode("ogc:Filter",new OpenLayers.Filter.FeatureId({fids:[feature.fid]}),node);return node;},"Property":function(obj){var node=this.createElementNSPlus("wfs:Property");this.writeNode("Name",obj.name,node);if(obj.value!==null){this.writeNode("Value",obj.value,node);}
60255 return node;},"Name":function(name){return this.createElementNSPlus("wfs:Name",{value:name});},"Value":function(obj){var node;if(obj instanceof OpenLayers.Feature.Vector){node=this.createElementNSPlus("wfs:Value");this.srsName=this.getSrsName(obj);var geom=this.writeNode("feature:_geometry",obj.geometry).firstChild;node.appendChild(geom);}else{node=this.createElementNSPlus("wfs:Value",{value:obj});}
60256 return node;},"Delete":function(feature){var node=this.createElementNSPlus("wfs:Delete",{attributes:{typeName:(this.featureNS?this.featurePrefix+":":"")+
60257 this.featureType}});if(this.featureNS){node.setAttribute("xmlns:"+this.featurePrefix,this.featureNS);}
60258 this.writeNode("ogc:Filter",new OpenLayers.Filter.FeatureId({fids:[feature.fid]}),node);return node;}}},schemaLocationAttr:function(options){options=OpenLayers.Util.extend({featurePrefix:this.featurePrefix,schema:this.schema},options);var schemaLocations=OpenLayers.Util.extend({},this.schemaLocations);if(options.schema){schemaLocations[options.featurePrefix]=options.schema;}
60259 var parts=[];var uri;for(var key in schemaLocations){uri=this.namespaces[key];if(uri){parts.push(uri+" "+schemaLocations[key]);}}
60260 var value=parts.join(" ")||undefined;return value;},setFilterProperty:function(filter){if(filter.filters){for(var i=0,len=filter.filters.length;i<len;++i){this.setFilterProperty(filter.filters[i]);}}else{if(filter instanceof OpenLayers.Filter.Spatial){filter.property=this.geometryName;}}},CLASS_NAME:"OpenLayers.Format.WFST.v1"});OpenLayers.Format.WMSCapabilities=OpenLayers.Class(OpenLayers.Format.XML,{defaultVersion:"1.1.1",version:null,parser:null,initialize:function(options){OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);this.options=options;},read:function(data){if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);}
60261 var root=data.documentElement;var version=this.version||root.getAttribute("version")||this.defaultVersion;if(!this.parser||this.parser.version!==version){var constr=OpenLayers.Format.WMSCapabilities["v"+version.replace(/\./g,"_")];if(!constr){throw"Can't find a WMS capabilities parser for version "+version;}
60262 this.parser=new constr(this.options);}
60263 var capabilities=this.parser.read(data);capabilities.version=version;return capabilities;},CLASS_NAME:"OpenLayers.Format.WMSCapabilities"});OpenLayers.Format.WMSDescribeLayer=OpenLayers.Class(OpenLayers.Format.XML,{defaultVersion:"1.1.1",version:null,initialize:function(options){OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);this.options=options;},read:function(data){if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);}
60264 var root=data.documentElement;var version=this.version;if(!version){version=root.getAttribute("version");if(!version){version=this.defaultVersion;}}
60265 if(version=="1.1.1"||version=="1.1.0"){version="1.1";}
60266 var constructor=OpenLayers.Format.WMSDescribeLayer["v"+version.replace(/\./g,"_")];if(!constructor){throw"Can't find a WMS DescribeLayer parser for version "+
60267 version;}
60268 var parser=new constructor(this.options);var describelayer=parser.read(data);describelayer.version=version;return describelayer;},CLASS_NAME:"OpenLayers.Format.WMSDescribeLayer"});OpenLayers.Format.WMSGetFeatureInfo=OpenLayers.Class(OpenLayers.Format.XML,{layerIdentifier:'_layer',featureIdentifier:'_feature',regExes:{trimSpace:(/^\s*|\s*$/g),removeSpace:(/\s*/g),splitSpace:(/\s+/),trimComma:(/\s*,\s*/g)},gmlFormat:null,initialize:function(options){OpenLayers.Format.XML.prototype.initialize.apply(this,arguments);OpenLayers.Util.extend(this,options);this.options=options;},read:function(data){var result;if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);}
60269 var root=data.documentElement;if(root){var scope=this;var read=this["read_"+root.nodeName];if(read){result=read.call(this,root);}else{result=new OpenLayers.Format.GML((this.options?this.options:{})).read(data);}}else{result=data;}
60270 return result;},read_msGMLOutput:function(data){var response=[];var layerNodes=this.getSiblingNodesByTagCriteria(data,this.layerIdentifier);if(layerNodes){for(var i=0,len=layerNodes.length;i<len;++i){var node=layerNodes[i];var layerName=node.nodeName;if(node.prefix){layerName=layerName.split(':')[1];}
60271 var layerName=layerName.replace(this.layerIdentifier,'');var featureNodes=this.getSiblingNodesByTagCriteria(node,this.featureIdentifier);if(featureNodes){for(var j=0;j<featureNodes.length;j++){var featureNode=featureNodes[j];var geomInfo=this.parseGeometry(featureNode);var attributes=this.parseAttributes(featureNode);var feature=new OpenLayers.Feature.Vector(geomInfo.geometry,attributes,null);feature.bounds=geomInfo.bounds;feature.type=layerName;response.push(feature);}}}}
60272 return response;},read_FeatureInfoResponse:function(data){var response=[];var featureNodes=this.getElementsByTagNameNS(data,'*','FIELDS');for(var i=0,len=featureNodes.length;i<len;i++){var featureNode=featureNodes[i];var geom=null;var attributes={};for(var j=0,jlen=featureNode.attributes.length;j<jlen;j++){var attribute=featureNode.attributes[j];attributes[attribute.nodeName]=attribute.nodeValue;}
60273 response.push(new OpenLayers.Feature.Vector(geom,attributes,null));}
60274 return response;},getSiblingNodesByTagCriteria:function(node,criteria){var nodes=[];var children,tagName,n,matchNodes,child;if(node&&node.hasChildNodes()){children=node.childNodes;n=children.length;for(var k=0;k<n;k++){child=children[k];while(child&&child.nodeType!=1){child=child.nextSibling;k++;}
60275 tagName=(child?child.nodeName:'');if(tagName.length>0&&tagName.indexOf(criteria)>-1){nodes.push(child);}else{matchNodes=this.getSiblingNodesByTagCriteria(child,criteria);if(matchNodes.length>0){(nodes.length==0)?nodes=matchNodes:nodes.push(matchNodes);}}}}
60276 return nodes;},parseAttributes:function(node){var attributes={};if(node.nodeType==1){var children=node.childNodes;var n=children.length;for(var i=0;i<n;++i){var child=children[i];if(child.nodeType==1){var grandchildren=child.childNodes;if(grandchildren.length==1){var grandchild=grandchildren[0];if(grandchild.nodeType==3||grandchild.nodeType==4){var name=(child.prefix)?child.nodeName.split(":")[1]:child.nodeName;var value=grandchild.nodeValue.replace(this.regExes.trimSpace,"");attributes[name]=value;}}}}}
60277 return attributes;},parseGeometry:function(node){if(!this.gmlFormat){this.gmlFormat=new OpenLayers.Format.GML();}
60278 var feature=this.gmlFormat.parseFeature(node);var geometry,bounds=null;if(feature){geometry=feature.geometry&&feature.geometry.clone();bounds=feature.bounds&&feature.bounds.clone();feature.destroy();}
60279 return{geometry:geometry,bounds:bounds};},CLASS_NAME:"OpenLayers.Format.WMSGetFeatureInfo"});OpenLayers.Format.WMTSCapabilities=OpenLayers.Class(OpenLayers.Format.XML,{defaultVersion:"1.0.0",version:null,parser:null,yx:{"urn:ogc:def:crs:EPSG::4326":true},initialize:function(options){OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);this.options=options;},read:function(data){if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);}
60280 var root=data.documentElement;var version=this.version||root.getAttribute("version")||this.defaultVersion;if(!this.parser||this.parser.version!==version){var constr=OpenLayers.Format.WMTSCapabilities["v"+version.replace(/\./g,"_")];if(!constr){throw new Error("Can't find a WMTS capabilities parser for version "+version);}
60281 this.parser=new constr(this.options);}
60282 return this.parser.read(data);},createLayer:function(capabilities,config){var layer;var required={layer:true,matrixSet:true};for(var prop in required){if(!(prop in config)){throw new Error("Missing property '"+prop+"' in layer configuration.");}}
60283 var contents=capabilities.contents;var matrixSet=contents.tileMatrixSets[config.matrixSet];var layers=contents.layers;var layerDef;for(var i=0,ii=contents.layers.length;i<ii;++i){if(contents.layers[i].identifier===config.layer){layerDef=contents.layers[i];break;}}
60284 if(layerDef&&matrixSet){var style;for(var i=0,ii=layerDef.styles.length;i<ii;++i){style=layerDef.styles[i];if(style.isDefault){break;}}
60285 layer=new OpenLayers.Layer.WMTS(OpenLayers.Util.applyDefaults(config,{url:capabilities.operationsMetadata.GetTile.dcp.http.get,name:layerDef.title,style:style,matrixIds:matrixSet.matrixIds}));}
60286 return layer;},CLASS_NAME:"OpenLayers.Format.WMTSCapabilities"});OpenLayers.Handler.Click=OpenLayers.Class(OpenLayers.Handler,{delay:300,single:true,'double':false,pixelTolerance:0,stopSingle:false,stopDouble:false,timerId:null,down:null,rightclickTimerId:null,initialize:function(control,callbacks,options){OpenLayers.Handler.prototype.initialize.apply(this,arguments);if(this.pixelTolerance!=null){this.mousedown=function(evt){this.down=evt.xy;return true;};}},mousedown:null,mouseup:function(evt){var propagate=true;if(this.checkModifiers(evt)&&this.control.handleRightClicks&&OpenLayers.Event.isRightClick(evt)){propagate=this.rightclick(evt);}
60287 return propagate;},rightclick:function(evt){if(this.passesTolerance(evt)){if(this.rightclickTimerId!=null){this.clearTimer();this.callback('dblrightclick',[evt]);return!this.stopDouble;}else{var clickEvent=this['double']?OpenLayers.Util.extend({},evt):this.callback('rightclick',[evt]);var delayedRightCall=OpenLayers.Function.bind(this.delayedRightCall,this,clickEvent);this.rightclickTimerId=window.setTimeout(delayedRightCall,this.delay);}}
60288 return!this.stopSingle;},delayedRightCall:function(evt){this.rightclickTimerId=null;if(evt){this.callback('rightclick',[evt]);}
60289 return!this.stopSingle;},dblclick:function(evt){if(this.passesTolerance(evt)){if(this["double"]){this.callback('dblclick',[evt]);}
60290 this.clearTimer();}
60291 return!this.stopDouble;},click:function(evt){if(this.passesTolerance(evt)){if(this.timerId!=null){this.clearTimer();}else{var clickEvent=this.single?OpenLayers.Util.extend({},evt):null;this.timerId=window.setTimeout(OpenLayers.Function.bind(this.delayedCall,this,clickEvent),this.delay);}}
60292 return!this.stopSingle;},passesTolerance:function(evt){var passes=true;if(this.pixelTolerance!=null&&this.down){var dpx=Math.sqrt(Math.pow(this.down.x-evt.xy.x,2)+
60293 Math.pow(this.down.y-evt.xy.y,2));if(dpx>this.pixelTolerance){passes=false;}}
60294 return passes;},clearTimer:function(){if(this.timerId!=null){window.clearTimeout(this.timerId);this.timerId=null;}
60295 if(this.rightclickTimerId!=null){window.clearTimeout(this.rightclickTimerId);this.rightclickTimerId=null;}},delayedCall:function(evt){this.timerId=null;if(evt){this.callback('click',[evt]);}},deactivate:function(){var deactivated=false;if(OpenLayers.Handler.prototype.deactivate.apply(this,arguments)){this.clearTimer();this.down=null;deactivated=true;}
60296 return deactivated;},CLASS_NAME:"OpenLayers.Handler.Click"});OpenLayers.Handler.Drag=OpenLayers.Class(OpenLayers.Handler,{started:false,stopDown:true,dragging:false,last:null,start:null,oldOnselectstart:null,interval:0,timeoutId:null,documentDrag:false,documentEvents:null,initialize:function(control,callbacks,options){OpenLayers.Handler.prototype.initialize.apply(this,arguments);},down:function(evt){},move:function(evt){},up:function(evt){},out:function(evt){},mousedown:function(evt){var propagate=true;this.dragging=false;if(this.checkModifiers(evt)&&OpenLayers.Event.isLeftClick(evt)){this.started=true;this.start=evt.xy;this.last=evt.xy;OpenLayers.Element.addClass(this.map.viewPortDiv,"olDragDown");this.down(evt);this.callback("down",[evt.xy]);OpenLayers.Event.stop(evt);if(!this.oldOnselectstart){this.oldOnselectstart=(document.onselectstart)?document.onselectstart:OpenLayers.Function.True;}
60297 document.onselectstart=OpenLayers.Function.False;propagate=!this.stopDown;}else{this.started=false;this.start=null;this.last=null;}
60298 return propagate;},mousemove:function(evt){if(this.started&&!this.timeoutId&&(evt.xy.x!=this.last.x||evt.xy.y!=this.last.y)){if(this.documentDrag===true&&this.documentEvents){if(evt.element===document){this.adjustXY(evt);this.setEvent(evt);}else{this.destroyDocumentEvents();}}
60299 if(this.interval>0){this.timeoutId=setTimeout(OpenLayers.Function.bind(this.removeTimeout,this),this.interval);}
60300 this.dragging=true;this.move(evt);this.callback("move",[evt.xy]);if(!this.oldOnselectstart){this.oldOnselectstart=document.onselectstart;document.onselectstart=OpenLayers.Function.False;}
60301 this.last=this.evt.xy;}
60302 return true;},removeTimeout:function(){this.timeoutId=null;},mouseup:function(evt){if(this.started){if(this.documentDrag===true&&this.documentEvents){this.adjustXY(evt);this.destroyDocumentEvents();}
60303 var dragged=(this.start!=this.last);this.started=false;this.dragging=false;OpenLayers.Element.removeClass(this.map.viewPortDiv,"olDragDown");this.up(evt);this.callback("up",[evt.xy]);if(dragged){this.callback("done",[evt.xy]);}
60304 document.onselectstart=this.oldOnselectstart;}
60305 return true;},mouseout:function(evt){if(this.started&&OpenLayers.Util.mouseLeft(evt,this.map.div)){if(this.documentDrag===true){this.documentEvents=new OpenLayers.Events(this,document,null,null,{includeXY:true});this.documentEvents.on({mousemove:this.mousemove,mouseup:this.mouseup});OpenLayers.Element.addClass(document.body,"olDragDown");}else{var dragged=(this.start!=this.last);this.started=false;this.dragging=false;OpenLayers.Element.removeClass(this.map.viewPortDiv,"olDragDown");this.out(evt);this.callback("out",[]);if(dragged){this.callback("done",[evt.xy]);}
60306 if(document.onselectstart){document.onselectstart=this.oldOnselectstart;}}}
60307 return true;},click:function(evt){return(this.start==this.last);},activate:function(){var activated=false;if(OpenLayers.Handler.prototype.activate.apply(this,arguments)){this.dragging=false;activated=true;}
60308 return activated;},deactivate:function(){var deactivated=false;if(OpenLayers.Handler.prototype.deactivate.apply(this,arguments)){this.started=false;this.dragging=false;this.start=null;this.last=null;deactivated=true;OpenLayers.Element.removeClass(this.map.viewPortDiv,"olDragDown");}
60309 return deactivated;},adjustXY:function(evt){var pos=OpenLayers.Util.pagePosition(this.map.div);evt.xy.x-=pos[0];evt.xy.y-=pos[1];},destroyDocumentEvents:function(){OpenLayers.Element.removeClass(document.body,"olDragDown");this.documentEvents.destroy();this.documentEvents=null;},CLASS_NAME:"OpenLayers.Handler.Drag"});OpenLayers.Handler.Feature=OpenLayers.Class(OpenLayers.Handler,{EVENTMAP:{'click':{'in':'click','out':'clickout'},'mousemove':{'in':'over','out':'out'},'dblclick':{'in':'dblclick','out':null},'mousedown':{'in':null,'out':null},'mouseup':{'in':null,'out':null}},feature:null,lastFeature:null,down:null,up:null,clickTolerance:4,geometryTypes:null,stopClick:true,stopDown:true,stopUp:false,initialize:function(control,layer,callbacks,options){OpenLayers.Handler.prototype.initialize.apply(this,[control,callbacks,options]);this.layer=layer;},mousedown:function(evt){this.down=evt.xy;return this.handle(evt)?!this.stopDown:true;},mouseup:function(evt){this.up=evt.xy;return this.handle(evt)?!this.stopUp:true;},click:function(evt){return this.handle(evt)?!this.stopClick:true;},mousemove:function(evt){if(!this.callbacks['over']&&!this.callbacks['out']){return true;}
60310 this.handle(evt);return true;},dblclick:function(evt){return!this.handle(evt);},geometryTypeMatches:function(feature){return this.geometryTypes==null||OpenLayers.Util.indexOf(this.geometryTypes,feature.geometry.CLASS_NAME)>-1;},handle:function(evt){if(this.feature&&!this.feature.layer){this.feature=null;}
60311 var type=evt.type;var handled=false;var previouslyIn=!!(this.feature);var click=(type=="click"||type=="dblclick");this.feature=this.layer.getFeatureFromEvent(evt);if(this.feature&&!this.feature.layer){this.feature=null;}
60312 if(this.lastFeature&&!this.lastFeature.layer){this.lastFeature=null;}
60313 if(this.feature){var inNew=(this.feature!=this.lastFeature);if(this.geometryTypeMatches(this.feature)){if(previouslyIn&&inNew){if(this.lastFeature){this.triggerCallback(type,'out',[this.lastFeature]);}
60314 this.triggerCallback(type,'in',[this.feature]);}else if(!previouslyIn||click){this.triggerCallback(type,'in',[this.feature]);}
60315 this.lastFeature=this.feature;handled=true;}else{if(this.lastFeature&&(previouslyIn&&inNew||click)){this.triggerCallback(type,'out',[this.lastFeature]);}
60316 this.feature=null;}}else{if(this.lastFeature&&(previouslyIn||click)){this.triggerCallback(type,'out',[this.lastFeature]);}}
60317 return handled;},triggerCallback:function(type,mode,args){var key=this.EVENTMAP[type][mode];if(key){if(type=='click'&&this.up&&this.down){var dpx=Math.sqrt(Math.pow(this.up.x-this.down.x,2)+
60318 Math.pow(this.up.y-this.down.y,2));if(dpx<=this.clickTolerance){this.callback(key,args);}}else{this.callback(key,args);}}},activate:function(){var activated=false;if(OpenLayers.Handler.prototype.activate.apply(this,arguments)){this.moveLayerToTop();this.map.events.on({"removelayer":this.handleMapEvents,"changelayer":this.handleMapEvents,scope:this});activated=true;}
60319 return activated;},deactivate:function(){var deactivated=false;if(OpenLayers.Handler.prototype.deactivate.apply(this,arguments)){this.moveLayerBack();this.feature=null;this.lastFeature=null;this.down=null;this.up=null;this.map.events.un({"removelayer":this.handleMapEvents,"changelayer":this.handleMapEvents,scope:this});deactivated=true;}
60320 return deactivated;},handleMapEvents:function(evt){if(!evt.property||evt.property=="order"){this.moveLayerToTop();}},moveLayerToTop:function(){var index=Math.max(this.map.Z_INDEX_BASE['Feature']-1,this.layer.getZIndex())+1;this.layer.setZIndex(index);},moveLayerBack:function(){var index=this.layer.getZIndex()-1;if(index>=this.map.Z_INDEX_BASE['Feature']){this.layer.setZIndex(index);}else{this.map.setLayerZIndex(this.layer,this.map.getLayerIndex(this.layer));}},CLASS_NAME:"OpenLayers.Handler.Feature"});OpenLayers.Handler.Hover=OpenLayers.Class(OpenLayers.Handler,{delay:500,pixelTolerance:null,stopMove:false,px:null,timerId:null,initialize:function(control,callbacks,options){OpenLayers.Handler.prototype.initialize.apply(this,arguments);},mousemove:function(evt){if(this.passesTolerance(evt.xy)){this.clearTimer();this.callback('move',[evt]);this.px=evt.xy;evt=OpenLayers.Util.extend({},evt);this.timerId=window.setTimeout(OpenLayers.Function.bind(this.delayedCall,this,evt),this.delay);}
60321 return!this.stopMove;},mouseout:function(evt){if(OpenLayers.Util.mouseLeft(evt,this.map.div)){this.clearTimer();this.callback('move',[evt]);}
60322 return true;},passesTolerance:function(px){var passes=true;if(this.pixelTolerance&&this.px){var dpx=Math.sqrt(Math.pow(this.px.x-px.x,2)+
60323 Math.pow(this.px.y-px.y,2));if(dpx<this.pixelTolerance){passes=false;}}
60324 return passes;},clearTimer:function(){if(this.timerId!=null){window.clearTimeout(this.timerId);this.timerId=null;}},delayedCall:function(evt){this.callback('pause',[evt]);},deactivate:function(){var deactivated=false;if(OpenLayers.Handler.prototype.deactivate.apply(this,arguments)){this.clearTimer();deactivated=true;}
60325 return deactivated;},CLASS_NAME:"OpenLayers.Handler.Hover"});OpenLayers.Handler.Keyboard=OpenLayers.Class(OpenLayers.Handler,{KEY_EVENTS:["keydown","keyup"],eventListener:null,initialize:function(control,callbacks,options){OpenLayers.Handler.prototype.initialize.apply(this,arguments);this.eventListener=OpenLayers.Function.bindAsEventListener(this.handleKeyEvent,this);},destroy:function(){this.deactivate();this.eventListener=null;OpenLayers.Handler.prototype.destroy.apply(this,arguments);},activate:function(){if(OpenLayers.Handler.prototype.activate.apply(this,arguments)){for(var i=0,len=this.KEY_EVENTS.length;i<len;i++){OpenLayers.Event.observe(document,this.KEY_EVENTS[i],this.eventListener);}
60326 return true;}else{return false;}},deactivate:function(){var deactivated=false;if(OpenLayers.Handler.prototype.deactivate.apply(this,arguments)){for(var i=0,len=this.KEY_EVENTS.length;i<len;i++){OpenLayers.Event.stopObserving(document,this.KEY_EVENTS[i],this.eventListener);}
60327 deactivated=true;}
60328 return deactivated;},handleKeyEvent:function(evt){if(this.checkModifiers(evt)){this.callback(evt.type,[evt]);}},CLASS_NAME:"OpenLayers.Handler.Keyboard"});OpenLayers.Handler.MouseWheel=OpenLayers.Class(OpenLayers.Handler,{wheelListener:null,mousePosition:null,interval:0,delta:0,cumulative:true,initialize:function(control,callbacks,options){OpenLayers.Handler.prototype.initialize.apply(this,arguments);this.wheelListener=OpenLayers.Function.bindAsEventListener(this.onWheelEvent,this);},destroy:function(){OpenLayers.Handler.prototype.destroy.apply(this,arguments);this.wheelListener=null;},onWheelEvent:function(e){if(!this.map||!this.checkModifiers(e)){return;}
60329 var overScrollableDiv=false;var overLayerDiv=false;var overMapDiv=false;var elem=OpenLayers.Event.element(e);while((elem!=null)&&!overMapDiv&&!overScrollableDiv){if(!overScrollableDiv){try{if(elem.currentStyle){overflow=elem.currentStyle["overflow"];}else{var style=document.defaultView.getComputedStyle(elem,null);var overflow=style.getPropertyValue("overflow");}
60330 overScrollableDiv=(overflow&&(overflow=="auto")||(overflow=="scroll"));}catch(err){}}
60331 if(!overLayerDiv){for(var i=0,len=this.map.layers.length;i<len;i++){if(elem==this.map.layers[i].div||elem==this.map.layers[i].pane){overLayerDiv=true;break;}}}
60332 overMapDiv=(elem==this.map.div);elem=elem.parentNode;}
60333 if(!overScrollableDiv&&overMapDiv){if(overLayerDiv){var delta=0;if(!e){e=window.event;}
60334 if(e.wheelDelta){delta=e.wheelDelta/120;if(window.opera&&window.opera.version()<9.2){delta=-delta;}}else if(e.detail){delta=-e.detail/3;}
60335 this.delta=this.delta+delta;if(this.interval){window.clearTimeout(this._timeoutId);this._timeoutId=window.setTimeout(OpenLayers.Function.bind(function(){this.wheelZoom(e);},this),this.interval);}else{this.wheelZoom(e);}}
60336 OpenLayers.Event.stop(e);}},wheelZoom:function(e){var delta=this.delta;this.delta=0;if(delta){if(this.mousePosition){e.xy=this.mousePosition;}
60337 if(!e.xy){e.xy=this.map.getPixelFromLonLat(this.map.getCenter());}
60338 if(delta<0){this.callback("down",[e,this.cumulative?delta:-1]);}else{this.callback("up",[e,this.cumulative?delta:1]);}}},mousemove:function(evt){this.mousePosition=evt.xy;},activate:function(evt){if(OpenLayers.Handler.prototype.activate.apply(this,arguments)){var wheelListener=this.wheelListener;OpenLayers.Event.observe(window,"DOMMouseScroll",wheelListener);OpenLayers.Event.observe(window,"mousewheel",wheelListener);OpenLayers.Event.observe(document,"mousewheel",wheelListener);return true;}else{return false;}},deactivate:function(evt){if(OpenLayers.Handler.prototype.deactivate.apply(this,arguments)){var wheelListener=this.wheelListener;OpenLayers.Event.stopObserving(window,"DOMMouseScroll",wheelListener);OpenLayers.Event.stopObserving(window,"mousewheel",wheelListener);OpenLayers.Event.stopObserving(document,"mousewheel",wheelListener);return true;}else{return false;}},CLASS_NAME:"OpenLayers.Handler.MouseWheel"});OpenLayers.Layer=OpenLayers.Class({id:null,name:null,div:null,opacity:null,alwaysInRange:null,EVENT_TYPES:["loadstart","loadend","loadcancel","visibilitychanged","move","moveend"],RESOLUTION_PROPERTIES:['scales','resolutions','maxScale','minScale','maxResolution','minResolution','numZoomLevels','maxZoomLevel'],events:null,map:null,isBaseLayer:false,alpha:false,displayInLayerSwitcher:true,visibility:true,attribution:null,inRange:false,imageSize:null,imageOffset:null,options:null,eventListeners:null,gutter:0,projection:null,units:null,scales:null,resolutions:null,maxExtent:null,minExtent:null,maxResolution:null,minResolution:null,numZoomLevels:null,minScale:null,maxScale:null,displayOutsideMaxExtent:false,wrapDateLine:false,transitionEffect:null,SUPPORTED_TRANSITIONS:['resize'],metadata:{},initialize:function(name,options){this.addOptions(options);this.name=name;if(this.id==null){this.id=OpenLayers.Util.createUniqueID(this.CLASS_NAME+"_");this.div=OpenLayers.Util.createDiv(this.id);this.div.style.width="100%";this.div.style.height="100%";this.div.dir="ltr";this.events=new OpenLayers.Events(this,this.div,this.EVENT_TYPES);if(this.eventListeners instanceof Object){this.events.on(this.eventListeners);}}
60339 if(this.wrapDateLine){this.displayOutsideMaxExtent=true;}},destroy:function(setNewBaseLayer){if(setNewBaseLayer==null){setNewBaseLayer=true;}
60340 if(this.map!=null){this.map.removeLayer(this,setNewBaseLayer);}
60341 this.projection=null;this.map=null;this.name=null;this.div=null;this.options=null;if(this.events){if(this.eventListeners){this.events.un(this.eventListeners);}
60342 this.events.destroy();}
60343 this.eventListeners=null;this.events=null;},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer(this.name,this.getOptions());}
60344 OpenLayers.Util.applyDefaults(obj,this);obj.map=null;return obj;},getOptions:function(){var options={};for(var o in this.options){options[o]=this[o];}
60345 return options;},setName:function(newName){if(newName!=this.name){this.name=newName;if(this.map!=null){this.map.events.triggerEvent("changelayer",{layer:this,property:"name"});}}},addOptions:function(newOptions){if(this.options==null){this.options={};}
60346 OpenLayers.Util.extend(this.options,newOptions);OpenLayers.Util.extend(this,newOptions);if(typeof this.projection=="string"){this.projection=new OpenLayers.Projection(this.projection);}
60347 if(this.projection&&this.projection.getUnits()){this.units=this.projection.getUnits();}
60348 if(this.map){var properties=this.RESOLUTION_PROPERTIES.concat(["projection","units","minExtent","maxExtent"]);for(var o in newOptions){if(newOptions.hasOwnProperty(o)&&OpenLayers.Util.indexOf(properties,o)>=0){this.initResolutions();break;}}}},onMapResize:function(){},redraw:function(){var redrawn=false;if(this.map){this.inRange=this.calculateInRange();var extent=this.getExtent();if(extent&&this.inRange&&this.visibility){var zoomChanged=true;this.moveTo(extent,zoomChanged,false);this.events.triggerEvent("moveend",{"zoomChanged":zoomChanged});redrawn=true;}}
60349 return redrawn;},moveTo:function(bounds,zoomChanged,dragging){var display=this.visibility;if(!this.isBaseLayer){display=display&&this.inRange;}
60350 this.display(display);},setMap:function(map){if(this.map==null){this.map=map;this.maxExtent=this.maxExtent||this.map.maxExtent;this.minExtent=this.minExtent||this.map.minExtent;this.projection=this.projection||this.map.projection;if(typeof this.projection=="string"){this.projection=new OpenLayers.Projection(this.projection);}
60351 this.units=this.projection.getUnits()||this.units||this.map.units;this.initResolutions();if(!this.isBaseLayer){this.inRange=this.calculateInRange();var show=((this.visibility)&&(this.inRange));this.div.style.display=show?"":"none";}
60352 this.setTileSize();}},afterAdd:function(){},removeMap:function(map){},getImageSize:function(bounds){return(this.imageSize||this.tileSize);},setTileSize:function(size){var tileSize=(size)?size:((this.tileSize)?this.tileSize:this.map.getTileSize());this.tileSize=tileSize;if(this.gutter){this.imageOffset=new OpenLayers.Pixel(-this.gutter,-this.gutter);this.imageSize=new OpenLayers.Size(tileSize.w+(2*this.gutter),tileSize.h+(2*this.gutter));}},getVisibility:function(){return this.visibility;},setVisibility:function(visibility){if(visibility!=this.visibility){this.visibility=visibility;this.display(visibility);this.redraw();if(this.map!=null){this.map.events.triggerEvent("changelayer",{layer:this,property:"visibility"});}
60353 this.events.triggerEvent("visibilitychanged");}},display:function(display){if(display!=(this.div.style.display!="none")){this.div.style.display=(display&&this.calculateInRange())?"block":"none";}},calculateInRange:function(){var inRange=false;if(this.alwaysInRange){inRange=true;}else{if(this.map){var resolution=this.map.getResolution();inRange=((resolution>=this.minResolution)&&(resolution<=this.maxResolution));}}
60354 return inRange;},setIsBaseLayer:function(isBaseLayer){if(isBaseLayer!=this.isBaseLayer){this.isBaseLayer=isBaseLayer;if(this.map!=null){this.map.events.triggerEvent("changebaselayer",{layer:this});}}},initResolutions:function(){var i,len;var props={},alwaysInRange=true;for(i=0,len=this.RESOLUTION_PROPERTIES.length;i<len;i++){var p=this.RESOLUTION_PROPERTIES[i];props[p]=this.options[p];if(alwaysInRange&&this.options[p]){alwaysInRange=false;}}
60355 if(this.alwaysInRange==null){this.alwaysInRange=alwaysInRange;}
60356 if(props.resolutions==null){props.resolutions=this.resolutionsFromScales(props.scales);}
60357 if(props.resolutions==null){props.resolutions=this.calculateResolutions(props);}
60358 if(props.resolutions==null){for(i=0,len=this.RESOLUTION_PROPERTIES.length;i<len;i++){var p=this.RESOLUTION_PROPERTIES[i];props[p]=this.options[p]!=null?this.options[p]:this.map[p];}
60359 if(props.resolutions==null){props.resolutions=this.resolutionsFromScales(props.scales);}
60360 if(props.resolutions==null){props.resolutions=this.calculateResolutions(props);}}
60361 var maxResolution;if(this.options.maxResolution&&this.options.maxResolution!=="auto"){maxResolution=this.options.maxResolution;}
60362 if(this.options.minScale){maxResolution=OpenLayers.Util.getResolutionFromScale(this.options.minScale,this.units);}
60363 var minResolution;if(this.options.minResolution&&this.options.minResolution!=="auto"){minResolution=this.options.minResolution;}
60364 if(this.options.maxScale){minResolution=OpenLayers.Util.getResolutionFromScale(this.options.maxScale,this.units);}
60365 if(props.resolutions){props.resolutions.sort(function(a,b){return(b-a);});if(!maxResolution){maxResolution=props.resolutions[0];}
60366 if(!minResolution){var lastIdx=props.resolutions.length-1;minResolution=props.resolutions[lastIdx];}}
60367 this.resolutions=props.resolutions;if(this.resolutions){len=this.resolutions.length;this.scales=new Array(len);for(i=0;i<len;i++){this.scales[i]=OpenLayers.Util.getScaleFromResolution(this.resolutions[i],this.units);}
60368 this.numZoomLevels=len;}
60369 this.minResolution=minResolution;if(minResolution){this.maxScale=OpenLayers.Util.getScaleFromResolution(minResolution,this.units);}
60370 this.maxResolution=maxResolution;if(maxResolution){this.minScale=OpenLayers.Util.getScaleFromResolution(maxResolution,this.units);}},resolutionsFromScales:function(scales){if(scales==null){return;}
60371 var resolutions,i,len;len=scales.length;resolutions=new Array(len);for(i=0;i<len;i++){resolutions[i]=OpenLayers.Util.getResolutionFromScale(scales[i],this.units);}
60372 return resolutions;},calculateResolutions:function(props){var maxResolution=props.maxResolution;if(props.minScale!=null){maxResolution=OpenLayers.Util.getResolutionFromScale(props.minScale,this.units);}else if(maxResolution=="auto"&&this.maxExtent!=null){var viewSize=this.map.getSize();var wRes=this.maxExtent.getWidth()/viewSize.w;var hRes=this.maxExtent.getHeight()/viewSize.h;maxResolution=Math.max(wRes,hRes);}
60373 var minResolution=props.minResolution;if(props.maxScale!=null){minResolution=OpenLayers.Util.getResolutionFromScale(props.maxScale,this.units);}else if(props.minResolution=="auto"&&this.minExtent!=null){var viewSize=this.map.getSize();var wRes=this.minExtent.getWidth()/viewSize.w;var hRes=this.minExtent.getHeight()/viewSize.h;minResolution=Math.max(wRes,hRes);}
60374 var maxZoomLevel=props.maxZoomLevel;var numZoomLevels=props.numZoomLevels;if(typeof minResolution==="number"&&typeof maxResolution==="number"&&numZoomLevels===undefined){var ratio=maxResolution/minResolution;numZoomLevels=Math.floor(Math.log(ratio)/Math.log(2))+1;}else if(numZoomLevels===undefined&&maxZoomLevel!=null){numZoomLevels=maxZoomLevel+1;}
60375 if(typeof numZoomLevels!=="number"||numZoomLevels<=0||(typeof maxResolution!=="number"&&typeof minResolution!=="number")){return;}
60376 var resolutions=new Array(numZoomLevels);var base=2;if(typeof minResolution=="number"&&typeof maxResolution=="number"){base=Math.pow((maxResolution/minResolution),(1/(numZoomLevels-1)));}
60377 var i;if(typeof maxResolution==="number"){for(i=0;i<numZoomLevels;i++){resolutions[i]=maxResolution/Math.pow(base,i);}}else{for(i=0;i<numZoomLevels;i++){resolutions[numZoomLevels-1-i]=minResolution*Math.pow(base,i);}}
60378 return resolutions;},getResolution:function(){var zoom=this.map.getZoom();return this.getResolutionForZoom(zoom);},getExtent:function(){return this.map.calculateBounds();},getZoomForExtent:function(extent,closest){var viewSize=this.map.getSize();var idealResolution=Math.max(extent.getWidth()/viewSize.w,extent.getHeight()/viewSize.h);return this.getZoomForResolution(idealResolution,closest);},getDataExtent:function(){},getResolutionForZoom:function(zoom){zoom=Math.max(0,Math.min(zoom,this.resolutions.length-1));var resolution;if(this.map.fractionalZoom){var low=Math.floor(zoom);var high=Math.ceil(zoom);resolution=this.resolutions[low]-
60379 ((zoom-low)*(this.resolutions[low]-this.resolutions[high]));}else{resolution=this.resolutions[Math.round(zoom)];}
60380 return resolution;},getZoomForResolution:function(resolution,closest){var zoom;if(this.map.fractionalZoom){var lowZoom=0;var highZoom=this.resolutions.length-1;var highRes=this.resolutions[lowZoom];var lowRes=this.resolutions[highZoom];var res;for(var i=0,len=this.resolutions.length;i<len;++i){res=this.resolutions[i];if(res>=resolution){highRes=res;lowZoom=i;}
60381 if(res<=resolution){lowRes=res;highZoom=i;break;}}
60382 var dRes=highRes-lowRes;if(dRes>0){zoom=lowZoom+((highRes-resolution)/dRes);}else{zoom=lowZoom;}}else{var diff;var minDiff=Number.POSITIVE_INFINITY;for(var i=0,len=this.resolutions.length;i<len;i++){if(closest){diff=Math.abs(this.resolutions[i]-resolution);if(diff>minDiff){break;}
60383 minDiff=diff;}else{if(this.resolutions[i]<resolution){break;}}}
60384 zoom=Math.max(0,i-1);}
60385 return zoom;},getLonLatFromViewPortPx:function(viewPortPx){var lonlat=null;if(viewPortPx!=null){var size=this.map.getSize();var center=this.map.getCenter();if(center){var res=this.map.getResolution();var delta_x=viewPortPx.x-(size.w/2);var delta_y=viewPortPx.y-(size.h/2);lonlat=new OpenLayers.LonLat(center.lon+delta_x*res,center.lat-delta_y*res);if(this.wrapDateLine){lonlat=lonlat.wrapDateLine(this.maxExtent);}}}
60386 return lonlat;},getViewPortPxFromLonLat:function(lonlat){var px=null;if(lonlat!=null){var resolution=this.map.getResolution();var extent=this.map.getExtent();px=new OpenLayers.Pixel((1/resolution*(lonlat.lon-extent.left)),(1/resolution*(extent.top-lonlat.lat)));}
60387 return px;},setOpacity:function(opacity){if(opacity!=this.opacity){this.opacity=opacity;for(var i=0,len=this.div.childNodes.length;i<len;++i){var element=this.div.childNodes[i].firstChild;OpenLayers.Util.modifyDOMElement(element,null,null,null,null,null,null,opacity);}
60388 if(this.map!=null){this.map.events.triggerEvent("changelayer",{layer:this,property:"opacity"});}}},getZIndex:function(){return this.div.style.zIndex;},setZIndex:function(zIndex){this.div.style.zIndex=zIndex;},adjustBounds:function(bounds){if(this.gutter){var mapGutter=this.gutter*this.map.getResolution();bounds=new OpenLayers.Bounds(bounds.left-mapGutter,bounds.bottom-mapGutter,bounds.right+mapGutter,bounds.top+mapGutter);}
60389 if(this.wrapDateLine){var wrappingOptions={'rightTolerance':this.getResolution()};bounds=bounds.wrapDateLine(this.maxExtent,wrappingOptions);}
60390 return bounds;},CLASS_NAME:"OpenLayers.Layer"});OpenLayers.Marker.Box=OpenLayers.Class(OpenLayers.Marker,{bounds:null,div:null,initialize:function(bounds,borderColor,borderWidth){this.bounds=bounds;this.div=OpenLayers.Util.createDiv();this.div.style.overflow='hidden';this.events=new OpenLayers.Events(this,this.div,null);this.setBorder(borderColor,borderWidth);},destroy:function(){this.bounds=null;this.div=null;OpenLayers.Marker.prototype.destroy.apply(this,arguments);},setBorder:function(color,width){if(!color){color="red";}
60391 if(!width){width=2;}
60392 this.div.style.border=width+"px solid "+color;},draw:function(px,sz){OpenLayers.Util.modifyDOMElement(this.div,null,px,sz);return this.div;},onScreen:function(){var onScreen=false;if(this.map){var screenBounds=this.map.getExtent();onScreen=screenBounds.containsBounds(this.bounds,true,true);}
60393 return onScreen;},display:function(display){this.div.style.display=(display)?"":"none";},CLASS_NAME:"OpenLayers.Marker.Box"});(function(){var oXMLHttpRequest=window.XMLHttpRequest;var bGecko=!!window.controllers,bIE=window.document.all&&!window.opera,bIE7=bIE&&window.navigator.userAgent.match(/MSIE ([\.0-9]+)/)&&RegExp.$1==7;function cXMLHttpRequest(){this._object=oXMLHttpRequest&&!bIE7?new oXMLHttpRequest:new window.ActiveXObject("Microsoft.XMLHTTP");this._listeners=[];};if(bGecko&&oXMLHttpRequest.wrapped)
60394 cXMLHttpRequest.wrapped=oXMLHttpRequest.wrapped;cXMLHttpRequest.UNSENT=0;cXMLHttpRequest.OPENED=1;cXMLHttpRequest.HEADERS_RECEIVED=2;cXMLHttpRequest.LOADING=3;cXMLHttpRequest.DONE=4;cXMLHttpRequest.prototype.readyState=cXMLHttpRequest.UNSENT;cXMLHttpRequest.prototype.responseText='';cXMLHttpRequest.prototype.responseXML=null;cXMLHttpRequest.prototype.status=0;cXMLHttpRequest.prototype.statusText='';cXMLHttpRequest.prototype.onreadystatechange=null;cXMLHttpRequest.onreadystatechange=null;cXMLHttpRequest.onopen=null;cXMLHttpRequest.onsend=null;cXMLHttpRequest.onabort=null;cXMLHttpRequest.prototype.open=function(sMethod,sUrl,bAsync,sUser,sPassword){delete this._headers;if(arguments.length<3)
60395 bAsync=true;this._async=bAsync;var oRequest=this,nState=this.readyState,fOnUnload;if(bIE&&bAsync){fOnUnload=function(){if(nState!=cXMLHttpRequest.DONE){fCleanTransport(oRequest);oRequest.abort();}};window.attachEvent("onunload",fOnUnload);}
60396 if(cXMLHttpRequest.onopen)
60397 cXMLHttpRequest.onopen.apply(this,arguments);if(arguments.length>4)
60398 this._object.open(sMethod,sUrl,bAsync,sUser,sPassword);else
60399 if(arguments.length>3)
60400 this._object.open(sMethod,sUrl,bAsync,sUser);else
60401 this._object.open(sMethod,sUrl,bAsync);if(!bGecko&&!bIE){this.readyState=cXMLHttpRequest.OPENED;fReadyStateChange(this);}
60402 this._object.onreadystatechange=function(){if(bGecko&&!bAsync)
60403 return;oRequest.readyState=oRequest._object.readyState;fSynchronizeValues(oRequest);if(oRequest._aborted){oRequest.readyState=cXMLHttpRequest.UNSENT;return;}
60404 if(oRequest.readyState==cXMLHttpRequest.DONE){fCleanTransport(oRequest);if(bIE&&bAsync)
60405 window.detachEvent("onunload",fOnUnload);}
60406 if(nState!=oRequest.readyState)
60407 fReadyStateChange(oRequest);nState=oRequest.readyState;}};cXMLHttpRequest.prototype.send=function(vData){if(cXMLHttpRequest.onsend)
60408 cXMLHttpRequest.onsend.apply(this,arguments);if(vData&&vData.nodeType){vData=window.XMLSerializer?new window.XMLSerializer().serializeToString(vData):vData.xml;if(!this._headers["Content-Type"])
60409 this._object.setRequestHeader("Content-Type","application/xml");}
60410 this._object.send(vData);if(bGecko&&!this._async){this.readyState=cXMLHttpRequest.OPENED;fSynchronizeValues(this);while(this.readyState<cXMLHttpRequest.DONE){this.readyState++;fReadyStateChange(this);if(this._aborted)
60411 return;}}};cXMLHttpRequest.prototype.abort=function(){if(cXMLHttpRequest.onabort)
60412 cXMLHttpRequest.onabort.apply(this,arguments);if(this.readyState>cXMLHttpRequest.UNSENT)
60413 this._aborted=true;this._object.abort();fCleanTransport(this);};cXMLHttpRequest.prototype.getAllResponseHeaders=function(){return this._object.getAllResponseHeaders();};cXMLHttpRequest.prototype.getResponseHeader=function(sName){return this._object.getResponseHeader(sName);};cXMLHttpRequest.prototype.setRequestHeader=function(sName,sValue){if(!this._headers)
60414 this._headers={};this._headers[sName]=sValue;return this._object.setRequestHeader(sName,sValue);};cXMLHttpRequest.prototype.addEventListener=function(sName,fHandler,bUseCapture){for(var nIndex=0,oListener;oListener=this._listeners[nIndex];nIndex++)
60415 if(oListener[0]==sName&&oListener[1]==fHandler&&oListener[2]==bUseCapture)
60416 return;this._listeners.push([sName,fHandler,bUseCapture]);};cXMLHttpRequest.prototype.removeEventListener=function(sName,fHandler,bUseCapture){for(var nIndex=0,oListener;oListener=this._listeners[nIndex];nIndex++)
60417 if(oListener[0]==sName&&oListener[1]==fHandler&&oListener[2]==bUseCapture)
60418 break;if(oListener)
60419 this._listeners.splice(nIndex,1);};cXMLHttpRequest.prototype.dispatchEvent=function(oEvent){var oEventPseudo={'type':oEvent.type,'target':this,'currentTarget':this,'eventPhase':2,'bubbles':oEvent.bubbles,'cancelable':oEvent.cancelable,'timeStamp':oEvent.timeStamp,'stopPropagation':function(){},'preventDefault':function(){},'initEvent':function(){}};if(oEventPseudo.type=="readystatechange"&&this.onreadystatechange)
60420 (this.onreadystatechange.handleEvent||this.onreadystatechange).apply(this,[oEventPseudo]);for(var nIndex=0,oListener;oListener=this._listeners[nIndex];nIndex++)
60421 if(oListener[0]==oEventPseudo.type&&!oListener[2])
60422 (oListener[1].handleEvent||oListener[1]).apply(this,[oEventPseudo]);};cXMLHttpRequest.prototype.toString=function(){return'['+"object"+' '+"XMLHttpRequest"+']';};cXMLHttpRequest.toString=function(){return'['+"XMLHttpRequest"+']';};function fReadyStateChange(oRequest){if(cXMLHttpRequest.onreadystatechange)
60423 cXMLHttpRequest.onreadystatechange.apply(oRequest);oRequest.dispatchEvent({'type':"readystatechange",'bubbles':false,'cancelable':false,'timeStamp':new Date+0});};function fGetDocument(oRequest){var oDocument=oRequest.responseXML,sResponse=oRequest.responseText;if(bIE&&sResponse&&oDocument&&!oDocument.documentElement&&oRequest.getResponseHeader("Content-Type").match(/[^\/]+\/[^\+]+\+xml/)){oDocument=new window.ActiveXObject("Microsoft.XMLDOM");oDocument.async=false;oDocument.validateOnParse=false;oDocument.loadXML(sResponse);}
60424 if(oDocument)
60425 if((bIE&&oDocument.parseError!=0)||!oDocument.documentElement||(oDocument.documentElement&&oDocument.documentElement.tagName=="parsererror"))
60426 return null;return oDocument;};function fSynchronizeValues(oRequest){try{oRequest.responseText=oRequest._object.responseText;}catch(e){}
60427 try{oRequest.responseXML=fGetDocument(oRequest._object);}catch(e){}
60428 try{oRequest.status=oRequest._object.status;}catch(e){}
60429 try{oRequest.statusText=oRequest._object.statusText;}catch(e){}};function fCleanTransport(oRequest){oRequest._object.onreadystatechange=new window.Function;};if(!window.Function.prototype.apply){window.Function.prototype.apply=function(oRequest,oArguments){if(!oArguments)
60430 oArguments=[];oRequest.__func=this;oRequest.__func(oArguments[0],oArguments[1],oArguments[2],oArguments[3],oArguments[4]);delete oRequest.__func;};};OpenLayers.Request.XMLHttpRequest=cXMLHttpRequest;})();OpenLayers.Tile.Image.IFrame=OpenLayers.Class(OpenLayers.Tile.Image,{initialize:function(layer,position,bounds,url,size){OpenLayers.Tile.Image.prototype.initialize.apply(this,arguments);this.layerAlphaHack=false;},destroy:function(){if(this.imgDiv!=null){OpenLayers.Event.stopObservingElement(this.imgDiv.firstChild);}
60431 OpenLayers.Tile.Image.prototype.destroy.apply(this,arguments);},clear:function(){if(this.imgDiv){var iFrame=this.imgDiv.firstChild;OpenLayers.Event.stopObservingElement(iFrame);this.imgDiv.removeChild(iFrame);}},clone:function(obj){if(obj==null){obj=new OpenLayers.Tile.Image.IFrame(this.layer,this.position,this.bounds,this.url,this.size);}
60432 obj=OpenLayers.Tile.Image.prototype.clone.apply(this,[obj]);return obj;},renderTile:function(){if(OpenLayers.Tile.Image.prototype.renderTile.apply(this,arguments)){var form=this.createRequestForm();this.imgDiv.appendChild(form);form.submit();this.imgDiv.removeChild(form);}},initImgDiv:function(){this.imgDiv=this.createImgDiv();OpenLayers.Util.modifyDOMElement(this.imgDiv,this.id,null,this.layer.getImageSize(),"relative");this.imgDiv.className='olTileImage';this.frame.appendChild(this.imgDiv);this.layer.div.appendChild(this.frame);if(this.layer.opacity!=null){OpenLayers.Util.modifyDOMElement(this.imgDiv,null,null,null,null,null,null,this.layer.opacity);}
60433 this.imgDiv.map=this.layer.map;},createImgDiv:function(){var eventPane=document.createElement("div");if(OpenLayers.Util.getBrowserName()=="msie"){eventPane.style.backgroundColor='#FFFFFF';eventPane.style.filter='chroma(color=#FFFFFF)';}
60434 OpenLayers.Util.modifyDOMElement(eventPane,null,new OpenLayers.Pixel(0,0),this.layer.getImageSize(),"absolute");var imgDiv=document.createElement("div");imgDiv.appendChild(eventPane);return imgDiv;},createIFrame:function(){var id=this.id+'_iFrame';var iframe;if(OpenLayers.Util.getBrowserName()=="msie"){iframe=document.createElement('<iframe name="'+id+'">');iframe.style.backgroundColor='#FFFFFF';iframe.style.filter='chroma(color=#FFFFFF)';}
60435 else{iframe=document.createElement('iframe');iframe.style.backgroundColor='transparent';iframe.name=id;}
60436 iframe.id=id;iframe.scrolling='no';iframe.marginWidth='0px';iframe.marginHeight='0px';iframe.frameBorder='0';OpenLayers.Util.modifyDOMElement(iframe,id,new OpenLayers.Pixel(0,0),this.layer.getImageSize(),"absolute");var onload=function(){this.show();if(this.isLoading){this.isLoading=false;this.events.triggerEvent("loadend");}};OpenLayers.Event.observe(iframe,'load',OpenLayers.Function.bind(onload,this));return iframe;},createRequestForm:function(){var form=document.createElement('form');form.method='POST';var cacheId=this.layer.params["_OLSALT"];cacheId=(cacheId?cacheId+"_":"")+this.bounds.toBBOX();form.action=OpenLayers.Util.urlAppend(this.layer.url,cacheId);this.imgDiv.insertBefore(this.createIFrame(),this.imgDiv.firstChild);form.target=this.id+'_iFrame';var imageSize=this.layer.getImageSize();var params=OpenLayers.Util.extend({"BBOX":this.encodeBBOX?this.bounds.toBBOX():this.bounds.toArray(),"WIDTH":imageSize.w,"HEIGHT":imageSize.h},this.layer.params);for(var par in params){var field=document.createElement('input');field.type='hidden';field.name=par;field.value=params[par];form.appendChild(field);}
60437 return form;},CLASS_NAME:"OpenLayers.Tile.Image.IFrame"});OpenLayers.ProxyHost="";OpenLayers.nullHandler=function(request){OpenLayers.Console.userError(OpenLayers.i18n("unhandledRequest",{'statusText':request.statusText}));};OpenLayers.loadURL=function(uri,params,caller,onComplete,onFailure){if(typeof params=='string'){params=OpenLayers.Util.getParameters(params);}
60438 var success=(onComplete)?onComplete:OpenLayers.nullHandler;var failure=(onFailure)?onFailure:OpenLayers.nullHandler;return OpenLayers.Request.GET({url:uri,params:params,success:success,failure:failure,scope:caller});};OpenLayers.parseXMLString=function(text){var index=text.indexOf('<');if(index>0){text=text.substring(index);}
60439 var ajaxResponse=OpenLayers.Util.Try(function(){var xmldom=new ActiveXObject('Microsoft.XMLDOM');xmldom.loadXML(text);return xmldom;},function(){return new DOMParser().parseFromString(text,'text/xml');},function(){var req=new XMLHttpRequest();req.open("GET","data:"+"text/xml"+";charset=utf-8,"+encodeURIComponent(text),false);if(req.overrideMimeType){req.overrideMimeType("text/xml");}
60440 req.send(null);return req.responseXML;});return ajaxResponse;};OpenLayers.Ajax={emptyFunction:function(){},getTransport:function(){return OpenLayers.Util.Try(function(){return new XMLHttpRequest();},function(){return new ActiveXObject('Msxml2.XMLHTTP');},function(){return new ActiveXObject('Microsoft.XMLHTTP');})||false;},activeRequestCount:0};OpenLayers.Ajax.Responders={responders:[],register:function(responderToAdd){for(var i=0;i<this.responders.length;i++){if(responderToAdd==this.responders[i]){return;}}
60441 this.responders.push(responderToAdd);},unregister:function(responderToRemove){OpenLayers.Util.removeItem(this.reponders,responderToRemove);},dispatch:function(callback,request,transport){var responder;for(var i=0;i<this.responders.length;i++){responder=this.responders[i];if(responder[callback]&&typeof responder[callback]=='function'){try{responder[callback].apply(responder,[request,transport]);}catch(e){}}}}};OpenLayers.Ajax.Responders.register({onCreate:function(){OpenLayers.Ajax.activeRequestCount++;},onComplete:function(){OpenLayers.Ajax.activeRequestCount--;}});OpenLayers.Ajax.Base=OpenLayers.Class({initialize:function(options){this.options={method:'post',asynchronous:true,contentType:'application/xml',parameters:''};OpenLayers.Util.extend(this.options,options||{});this.options.method=this.options.method.toLowerCase();if(typeof this.options.parameters=='string'){this.options.parameters=OpenLayers.Util.getParameters(this.options.parameters);}}});OpenLayers.Ajax.Request=OpenLayers.Class(OpenLayers.Ajax.Base,{_complete:false,initialize:function(url,options){OpenLayers.Ajax.Base.prototype.initialize.apply(this,[options]);if(OpenLayers.ProxyHost&&OpenLayers.String.startsWith(url,"http")){url=OpenLayers.ProxyHost+encodeURIComponent(url);}
60442 this.transport=OpenLayers.Ajax.getTransport();this.request(url);},request:function(url){this.url=url;this.method=this.options.method;var params=OpenLayers.Util.extend({},this.options.parameters);if(this.method!='get'&&this.method!='post'){params['_method']=this.method;this.method='post';}
60443 this.parameters=params;if(params=OpenLayers.Util.getParameterString(params)){if(this.method=='get'){this.url+=((this.url.indexOf('?')>-1)?'&':'?')+params;}else if(/Konqueror|Safari|KHTML/.test(navigator.userAgent)){params+='&_=';}}
60444 try{var response=new OpenLayers.Ajax.Response(this);if(this.options.onCreate){this.options.onCreate(response);}
60445 OpenLayers.Ajax.Responders.dispatch('onCreate',this,response);this.transport.open(this.method.toUpperCase(),this.url,this.options.asynchronous);if(this.options.asynchronous){window.setTimeout(OpenLayers.Function.bind(this.respondToReadyState,this,1),10);}
60446 this.transport.onreadystatechange=OpenLayers.Function.bind(this.onStateChange,this);this.setRequestHeaders();this.body=this.method=='post'?(this.options.postBody||params):null;this.transport.send(this.body);if(!this.options.asynchronous&&this.transport.overrideMimeType){this.onStateChange();}}catch(e){this.dispatchException(e);}},onStateChange:function(){var readyState=this.transport.readyState;if(readyState>1&&!((readyState==4)&&this._complete)){this.respondToReadyState(this.transport.readyState);}},setRequestHeaders:function(){var headers={'X-Requested-With':'XMLHttpRequest','Accept':'text/javascript, text/html, application/xml, text/xml, */*','OpenLayers':true};if(this.method=='post'){headers['Content-type']=this.options.contentType+
60447 (this.options.encoding?'; charset='+this.options.encoding:'');if(this.transport.overrideMimeType&&(navigator.userAgent.match(/Gecko\/(\d{4})/)||[0,2005])[1]<2005){headers['Connection']='close';}}
60448 if(typeof this.options.requestHeaders=='object'){var extras=this.options.requestHeaders;if(typeof extras.push=='function'){for(var i=0,length=extras.length;i<length;i+=2){headers[extras[i]]=extras[i+1];}}else{for(var i in extras){headers[i]=extras[i];}}}
60449 for(var name in headers){this.transport.setRequestHeader(name,headers[name]);}},success:function(){var status=this.getStatus();return!status||(status>=200&&status<300);},getStatus:function(){try{return this.transport.status||0;}catch(e){return 0;}},respondToReadyState:function(readyState){var state=OpenLayers.Ajax.Request.Events[readyState];var response=new OpenLayers.Ajax.Response(this);if(state=='Complete'){try{this._complete=true;(this.options['on'+response.status]||this.options['on'+(this.success()?'Success':'Failure')]||OpenLayers.Ajax.emptyFunction)(response);}catch(e){this.dispatchException(e);}
60450 var contentType=response.getHeader('Content-type');}
60451 try{(this.options['on'+state]||OpenLayers.Ajax.emptyFunction)(response);OpenLayers.Ajax.Responders.dispatch('on'+state,this,response);}catch(e){this.dispatchException(e);}
60452 if(state=='Complete'){this.transport.onreadystatechange=OpenLayers.Ajax.emptyFunction;}},getHeader:function(name){try{return this.transport.getResponseHeader(name);}catch(e){return null;}},dispatchException:function(exception){var handler=this.options.onException;if(handler){handler(this,exception);OpenLayers.Ajax.Responders.dispatch('onException',this,exception);}else{var listener=false;var responders=OpenLayers.Ajax.Responders.responders;for(var i=0;i<responders.length;i++){if(responders[i].onException){listener=true;break;}}
60453 if(listener){OpenLayers.Ajax.Responders.dispatch('onException',this,exception);}else{throw exception;}}}});OpenLayers.Ajax.Request.Events=['Uninitialized','Loading','Loaded','Interactive','Complete'];OpenLayers.Ajax.Response=OpenLayers.Class({status:0,statusText:'',initialize:function(request){this.request=request;var transport=this.transport=request.transport,readyState=this.readyState=transport.readyState;if((readyState>2&&!(!!(window.attachEvent&&!window.opera)))||readyState==4){this.status=this.getStatus();this.statusText=this.getStatusText();this.responseText=transport.responseText==null?'':String(transport.responseText);}
60454 if(readyState==4){var xml=transport.responseXML;this.responseXML=xml===undefined?null:xml;}},getStatus:OpenLayers.Ajax.Request.prototype.getStatus,getStatusText:function(){try{return this.transport.statusText||'';}catch(e){return'';}},getHeader:OpenLayers.Ajax.Request.prototype.getHeader,getResponseHeader:function(name){return this.transport.getResponseHeader(name);}});OpenLayers.Ajax.getElementsByTagNameNS=function(parentnode,nsuri,nsprefix,tagname){var elem=null;if(parentnode.getElementsByTagNameNS){elem=parentnode.getElementsByTagNameNS(nsuri,tagname);}else{elem=parentnode.getElementsByTagName(nsprefix+':'+tagname);}
60455 return elem;};OpenLayers.Ajax.serializeXMLToString=function(xmldom){var serializer=new XMLSerializer();var data=serializer.serializeToString(xmldom);return data;};OpenLayers.Control.DragFeature=OpenLayers.Class(OpenLayers.Control,{geometryTypes:null,onStart:function(feature,pixel){},onDrag:function(feature,pixel){},onComplete:function(feature,pixel){},documentDrag:false,layer:null,feature:null,dragCallbacks:{},featureCallbacks:{},lastPixel:null,initialize:function(layer,options){OpenLayers.Control.prototype.initialize.apply(this,[options]);this.layer=layer;this.handlers={drag:new OpenLayers.Handler.Drag(this,OpenLayers.Util.extend({down:this.downFeature,move:this.moveFeature,up:this.upFeature,out:this.cancel,done:this.doneDragging},this.dragCallbacks),{documentDrag:this.documentDrag}),feature:new OpenLayers.Handler.Feature(this,this.layer,OpenLayers.Util.extend({over:this.overFeature,out:this.outFeature},this.featureCallbacks),{geometryTypes:this.geometryTypes})};},destroy:function(){this.layer=null;OpenLayers.Control.prototype.destroy.apply(this,[]);},activate:function(){return(this.handlers.feature.activate()&&OpenLayers.Control.prototype.activate.apply(this,arguments));},deactivate:function(){this.handlers.drag.deactivate();this.handlers.feature.deactivate();this.feature=null;this.dragging=false;this.lastPixel=null;OpenLayers.Element.removeClass(this.map.viewPortDiv,this.displayClass+"Over");return OpenLayers.Control.prototype.deactivate.apply(this,arguments);},overFeature:function(feature){if(!this.handlers.drag.dragging){this.feature=feature;this.handlers.drag.activate();this.over=true;OpenLayers.Element.addClass(this.map.viewPortDiv,this.displayClass+"Over");}else{if(this.feature.id==feature.id){this.over=true;}else{this.over=false;}}},downFeature:function(pixel){this.lastPixel=pixel;this.onStart(this.feature,pixel);},moveFeature:function(pixel){var res=this.map.getResolution();this.feature.geometry.move(res*(pixel.x-this.lastPixel.x),res*(this.lastPixel.y-pixel.y));this.layer.drawFeature(this.feature);this.lastPixel=pixel;this.onDrag(this.feature,pixel);},upFeature:function(pixel){if(!this.over){this.handlers.drag.deactivate();}},doneDragging:function(pixel){this.onComplete(this.feature,pixel);},outFeature:function(feature){if(!this.handlers.drag.dragging){this.over=false;this.handlers.drag.deactivate();OpenLayers.Element.removeClass(this.map.viewPortDiv,this.displayClass+"Over");this.feature=null;}else{if(this.feature.id==feature.id){this.over=false;}}},cancel:function(){this.handlers.drag.deactivate();this.over=false;},setMap:function(map){this.handlers.drag.setMap(map);this.handlers.feature.setMap(map);OpenLayers.Control.prototype.setMap.apply(this,arguments);},CLASS_NAME:"OpenLayers.Control.DragFeature"});OpenLayers.Control.DragPan=OpenLayers.Class(OpenLayers.Control,{type:OpenLayers.Control.TYPE_TOOL,panned:false,interval:25,documentDrag:false,draw:function(){this.handler=new OpenLayers.Handler.Drag(this,{"move":this.panMap,"done":this.panMapDone},{interval:this.interval,documentDrag:this.documentDrag});},panMap:function(xy){this.panned=true;this.map.pan(this.handler.last.x-xy.x,this.handler.last.y-xy.y,{dragging:this.handler.dragging,animate:false});},panMapDone:function(xy){if(this.panned){this.panMap(xy);this.panned=false;}},CLASS_NAME:"OpenLayers.Control.DragPan"});OpenLayers.Control.KeyboardDefaults=OpenLayers.Class(OpenLayers.Control,{autoActivate:true,slideFactor:75,initialize:function(){OpenLayers.Control.prototype.initialize.apply(this,arguments);},destroy:function(){if(this.handler){this.handler.destroy();}
60456 this.handler=null;OpenLayers.Control.prototype.destroy.apply(this,arguments);},draw:function(){this.handler=new OpenLayers.Handler.Keyboard(this,{"keydown":this.defaultKeyPress});},defaultKeyPress:function(evt){switch(evt.keyCode){case OpenLayers.Event.KEY_LEFT:this.map.pan(-this.slideFactor,0);break;case OpenLayers.Event.KEY_RIGHT:this.map.pan(this.slideFactor,0);break;case OpenLayers.Event.KEY_UP:this.map.pan(0,-this.slideFactor);break;case OpenLayers.Event.KEY_DOWN:this.map.pan(0,this.slideFactor);break;case 33:var size=this.map.getSize();this.map.pan(0,-0.75*size.h);break;case 34:var size=this.map.getSize();this.map.pan(0,0.75*size.h);break;case 35:var size=this.map.getSize();this.map.pan(0.75*size.w,0);break;case 36:var size=this.map.getSize();this.map.pan(-0.75*size.w,0);break;case 43:case 61:case 187:case 107:this.map.zoomIn();break;case 45:case 109:case 189:case 95:this.map.zoomOut();break;}},CLASS_NAME:"OpenLayers.Control.KeyboardDefaults"});OpenLayers.Control.WMSGetFeatureInfo=OpenLayers.Class(OpenLayers.Control,{hover:false,drillDown:false,maxFeatures:10,clickCallback:"click",layers:null,queryVisible:false,url:null,layerUrls:null,infoFormat:'text/html',vendorParams:{},format:null,formatOptions:null,handlerOptions:null,handler:null,hoverRequest:null,EVENT_TYPES:["beforegetfeatureinfo","nogetfeatureinfo","getfeatureinfo"],initialize:function(options){this.EVENT_TYPES=OpenLayers.Control.WMSGetFeatureInfo.prototype.EVENT_TYPES.concat(OpenLayers.Control.prototype.EVENT_TYPES);options=options||{};options.handlerOptions=options.handlerOptions||{};OpenLayers.Control.prototype.initialize.apply(this,[options]);if(!this.format){this.format=new OpenLayers.Format.WMSGetFeatureInfo(options.formatOptions);}
60457 if(this.drillDown===true){this.hover=false;}
60458 if(this.hover){this.handler=new OpenLayers.Handler.Hover(this,{'move':this.cancelHover,'pause':this.getInfoForHover},OpenLayers.Util.extend(this.handlerOptions.hover||{},{'delay':250}));}else{var callbacks={};callbacks[this.clickCallback]=this.getInfoForClick;this.handler=new OpenLayers.Handler.Click(this,callbacks,this.handlerOptions.click||{});}},activate:function(){if(!this.active){this.handler.activate();}
60459 return OpenLayers.Control.prototype.activate.apply(this,arguments);},deactivate:function(){return OpenLayers.Control.prototype.deactivate.apply(this,arguments);},getInfoForClick:function(evt){this.events.triggerEvent("beforegetfeatureinfo",{xy:evt.xy});OpenLayers.Element.addClass(this.map.viewPortDiv,"olCursorWait");this.request(evt.xy,{});},getInfoForHover:function(evt){this.events.triggerEvent("beforegetfeatureinfo",{xy:evt.xy});this.request(evt.xy,{hover:true});},cancelHover:function(){if(this.hoverRequest){this.hoverRequest.abort();this.hoverRequest=null;}},findLayers:function(){var candidates=this.layers||this.map.layers;var layers=[];var layer,url;for(var i=0,len=candidates.length;i<len;++i){layer=candidates[i];if(layer instanceof OpenLayers.Layer.WMS&&(!this.queryVisible||layer.getVisibility())){url=layer.url instanceof Array?layer.url[0]:layer.url;if(this.drillDown===false&&!this.url){this.url=url;}
60460 if(this.drillDown===true||this.urlMatches(url)){layers.push(layer);}}}
60461 return layers;},urlMatches:function(url){var matches=OpenLayers.Util.isEquivalentUrl(this.url,url);if(!matches&&this.layerUrls){for(var i=0,len=this.layerUrls.length;i<len;++i){if(OpenLayers.Util.isEquivalentUrl(this.layerUrls[i],url)){matches=true;break;}}}
60462 return matches;},buildWMSOptions:function(url,layers,clickPosition,format){var layerNames=[],styleNames=[];for(var i=0,len=layers.length;i<len;i++){layerNames=layerNames.concat(layers[i].params.LAYERS);styleNames=styleNames.concat(this.getStyleNames(layers[i]));}
60463 var params=OpenLayers.Util.extend({service:"WMS",version:layers[0].params.VERSION,request:"GetFeatureInfo",layers:layerNames,query_layers:layerNames,styles:styleNames,bbox:this.map.getExtent().toBBOX(null,layers[0].reverseAxisOrder()),feature_count:this.maxFeatures,height:this.map.getSize().h,width:this.map.getSize().w,format:format,info_format:this.infoFormat},(parseFloat(layers[0].params.VERSION)>=1.3)?{crs:this.map.getProjection(),i:clickPosition.x,j:clickPosition.y}:{srs:this.map.getProjection(),x:clickPosition.x,y:clickPosition.y});OpenLayers.Util.applyDefaults(params,this.vendorParams);return{url:url,params:OpenLayers.Util.upperCaseObject(params),callback:function(request){this.handleResponse(clickPosition,request);},scope:this};},getStyleNames:function(layer){var styleNames;if(layer.params.STYLES){styleNames=layer.params.STYLES;}else{if(layer.params.LAYERS instanceof Array){styleNames=new Array(layer.params.LAYERS.length);}else{styleNames=layer.params.LAYERS.replace(/[^,]/g,"");}}
60464 return styleNames;},request:function(clickPosition,options){var layers=this.findLayers();if(layers.length==0){this.events.triggerEvent("nogetfeatureinfo");OpenLayers.Element.removeClass(this.map.viewPortDiv,"olCursorWait");return;}
60465 options=options||{};if(this.drillDown===false){var wmsOptions=this.buildWMSOptions(this.url,layers,clickPosition,layers[0].params.FORMAT);var request=OpenLayers.Request.GET(wmsOptions);if(options.hover===true){this.hoverRequest=request;}}else{this._requestCount=0;this._numRequests=0;this.features=[];var services={},url;for(var i=0,len=layers.length;i<len;i++){var layer=layers[i];var service,found=false;url=layer.url instanceof Array?layer.url[0]:layer.url;if(url in services){services[url].push(layer);}else{this._numRequests++;services[url]=[layer];}}
60466 var layers;for(var url in services){layers=services[url];var wmsOptions=this.buildWMSOptions(url,layers,clickPosition,layers[0].params.FORMAT);OpenLayers.Request.GET(wmsOptions);}}},triggerGetFeatureInfo:function(request,xy,features){this.events.triggerEvent("getfeatureinfo",{text:request.responseText,features:features,request:request,xy:xy});OpenLayers.Element.removeClass(this.map.viewPortDiv,"olCursorWait");},handleResponse:function(xy,request){var doc=request.responseXML;if(!doc||!doc.documentElement){doc=request.responseText;}
60467 var features=this.format.read(doc);if(this.drillDown===false){this.triggerGetFeatureInfo(request,xy,features);}else{this._requestCount++;this._features=(this._features||[]).concat(features);if(this._requestCount===this._numRequests){this.triggerGetFeatureInfo(request,xy,this._features.concat());delete this._features;delete this._requestCount;delete this._numRequests;}}},CLASS_NAME:"OpenLayers.Control.WMSGetFeatureInfo"});OpenLayers.Control.WMTSGetFeatureInfo=OpenLayers.Class(OpenLayers.Control,{hover:false,requestEncoding:"KVP",drillDown:false,maxFeatures:10,clickCallback:"click",layers:null,queryVisible:true,infoFormat:'text/html',vendorParams:{},format:null,formatOptions:null,handlerOptions:null,handler:null,hoverRequest:null,EVENT_TYPES:["beforegetfeatureinfo","getfeatureinfo","exception"],pending:0,initialize:function(options){this.EVENT_TYPES=OpenLayers.Control.WMTSGetFeatureInfo.prototype.EVENT_TYPES.concat(OpenLayers.Control.prototype.EVENT_TYPES);options=options||{};options.handlerOptions=options.handlerOptions||{};OpenLayers.Control.prototype.initialize.apply(this,[options]);if(!this.format){this.format=new OpenLayers.Format.WMSGetFeatureInfo(options.formatOptions);}
60468 if(this.drillDown===true){this.hover=false;}
60469 if(this.hover){this.handler=new OpenLayers.Handler.Hover(this,{move:this.cancelHover,pause:this.getInfoForHover},OpenLayers.Util.extend(this.handlerOptions.hover||{},{delay:250}));}else{var callbacks={};callbacks[this.clickCallback]=this.getInfoForClick;this.handler=new OpenLayers.Handler.Click(this,callbacks,this.handlerOptions.click||{});}},activate:function(){if(!this.active){this.handler.activate();}
60470 return OpenLayers.Control.prototype.activate.apply(this,arguments);},deactivate:function(){return OpenLayers.Control.prototype.deactivate.apply(this,arguments);},getInfoForClick:function(evt){this.request(evt.xy,{});},getInfoForHover:function(evt){this.request(evt.xy,{hover:true});},cancelHover:function(){if(this.hoverRequest){--this.pending;if(this.pending<=0){OpenLayers.Element.removeClass(this.map.viewPortDiv,"olCursorWait");this.pending=0;}
60471 this.hoverRequest.abort();this.hoverRequest=null;}},findLayers:function(){var candidates=this.layers||this.map.layers;var layers=[];var layer;for(var i=candidates.length-1;i>=0;--i){layer=candidates[i];if(layer instanceof OpenLayers.Layer.WMTS&&layer.requestEncoding===this.requestEncoding&&(!this.queryVisible||layer.getVisibility())){layers.push(layer);if(!this.drillDown||this.hover){break;}}}
60472 return layers;},buildRequestOptions:function(layer,xy){var loc=this.map.getLonLatFromPixel(xy);var getTileUrl=layer.getURL(new OpenLayers.Bounds(loc.lon,loc.lat,loc.lon,loc.lat));var params=OpenLayers.Util.getParameters(getTileUrl);var tileInfo=layer.getTileInfo(loc);OpenLayers.Util.extend(params,{service:"WMTS",version:layer.version,request:"GetFeatureInfo",infoFormat:this.infoFormat,i:tileInfo.i,j:tileInfo.j});OpenLayers.Util.applyDefaults(params,this.vendorParams);return{url:layer.url instanceof Array?layer.url[0]:layer.url,params:OpenLayers.Util.upperCaseObject(params),callback:function(request){this.handleResponse(xy,request,layer);},scope:this};},request:function(xy,options){options=options||{};var layers=this.findLayers();if(layers.length>0){var issue,layer;for(var i=0,len=layers.length;i<len;i++){layer=layers[i];issue=this.events.triggerEvent("beforegetfeatureinfo",{xy:xy,layer:layer});if(issue!==false){++this.pending;var requestOptions=this.buildRequestOptions(layer,xy);var request=OpenLayers.Request.GET(requestOptions);if(options.hover===true){this.hoverRequest=request;}}}
60473 if(this.pending>0){OpenLayers.Element.addClass(this.map.viewPortDiv,"olCursorWait");}}},handleResponse:function(xy,request,layer){--this.pending;if(this.pending<=0){OpenLayers.Element.removeClass(this.map.viewPortDiv,"olCursorWait");this.pending=0;}
60474 if(request.status&&(request.status<200||request.status>=300)){this.events.triggerEvent("exception",{xy:xy,request:request,layer:layer});}else{var doc=request.responseXML;if(!doc||!doc.documentElement){doc=request.responseText;}
60475 var features,except;try{features=this.format.read(doc);}catch(error){except=true;this.events.triggerEvent("exception",{xy:xy,request:request,error:error,layer:layer});}
60476 if(!except){this.events.triggerEvent("getfeatureinfo",{text:request.responseText,features:features,request:request,xy:xy,layer:layer});}}},setMap:function(map){this.handler.setMap(map);OpenLayers.Control.prototype.setMap.apply(this,arguments);},CLASS_NAME:"OpenLayers.Control.WMTSGetFeatureInfo"});OpenLayers.State={UNKNOWN:'Unknown',INSERT:'Insert',UPDATE:'Update',DELETE:'Delete'};OpenLayers.Feature.Vector=OpenLayers.Class(OpenLayers.Feature,{fid:null,geometry:null,attributes:null,bounds:null,state:null,style:null,url:null,renderIntent:"default",initialize:function(geometry,attributes,style){OpenLayers.Feature.prototype.initialize.apply(this,[null,null,attributes]);this.lonlat=null;this.geometry=geometry?geometry:null;this.state=null;this.attributes={};if(attributes){this.attributes=OpenLayers.Util.extend(this.attributes,attributes);}
60477 this.style=style?style:null;},destroy:function(){if(this.layer){this.layer.removeFeatures(this);this.layer=null;}
60478 this.geometry=null;OpenLayers.Feature.prototype.destroy.apply(this,arguments);},clone:function(){return new OpenLayers.Feature.Vector(this.geometry?this.geometry.clone():null,this.attributes,this.style);},onScreen:function(boundsOnly){var onScreen=false;if(this.layer&&this.layer.map){var screenBounds=this.layer.map.getExtent();if(boundsOnly){var featureBounds=this.geometry.getBounds();onScreen=screenBounds.intersectsBounds(featureBounds);}else{var screenPoly=screenBounds.toGeometry();onScreen=screenPoly.intersects(this.geometry);}}
60479 return onScreen;},getVisibility:function(){return!(this.style&&this.style.display=='none'||!this.layer||this.layer&&this.layer.styleMap&&this.layer.styleMap.createSymbolizer(this,this.renderIntent).display=='none'||this.layer&&!this.layer.getVisibility());},createMarker:function(){return null;},destroyMarker:function(){},createPopup:function(){return null;},atPoint:function(lonlat,toleranceLon,toleranceLat){var atPoint=false;if(this.geometry){atPoint=this.geometry.atPoint(lonlat,toleranceLon,toleranceLat);}
60480 return atPoint;},destroyPopup:function(){},move:function(location){if(!this.layer||!this.geometry.move){return;}
60481 var pixel;if(location.CLASS_NAME=="OpenLayers.LonLat"){pixel=this.layer.getViewPortPxFromLonLat(location);}else{pixel=location;}
60482 var lastPixel=this.layer.getViewPortPxFromLonLat(this.geometry.getBounds().getCenterLonLat());var res=this.layer.map.getResolution();this.geometry.move(res*(pixel.x-lastPixel.x),res*(lastPixel.y-pixel.y));this.layer.drawFeature(this);return lastPixel;},toState:function(state){if(state==OpenLayers.State.UPDATE){switch(this.state){case OpenLayers.State.UNKNOWN:case OpenLayers.State.DELETE:this.state=state;break;case OpenLayers.State.UPDATE:case OpenLayers.State.INSERT:break;}}else if(state==OpenLayers.State.INSERT){switch(this.state){case OpenLayers.State.UNKNOWN:break;default:this.state=state;break;}}else if(state==OpenLayers.State.DELETE){switch(this.state){case OpenLayers.State.INSERT:break;case OpenLayers.State.DELETE:break;case OpenLayers.State.UNKNOWN:case OpenLayers.State.UPDATE:this.state=state;break;}}else if(state==OpenLayers.State.UNKNOWN){this.state=state;}},CLASS_NAME:"OpenLayers.Feature.Vector"});OpenLayers.Feature.Vector.style={'default':{fillColor:"#ee9900",fillOpacity:0.4,hoverFillColor:"white",hoverFillOpacity:0.8,strokeColor:"#ee9900",strokeOpacity:1,strokeWidth:1,strokeLinecap:"round",strokeDashstyle:"solid",hoverStrokeColor:"red",hoverStrokeOpacity:1,hoverStrokeWidth:0.2,pointRadius:6,hoverPointRadius:1,hoverPointUnit:"%",pointerEvents:"visiblePainted",cursor:"inherit"},'select':{fillColor:"blue",fillOpacity:0.4,hoverFillColor:"white",hoverFillOpacity:0.8,strokeColor:"blue",strokeOpacity:1,strokeWidth:2,strokeLinecap:"round",strokeDashstyle:"solid",hoverStrokeColor:"red",hoverStrokeOpacity:1,hoverStrokeWidth:0.2,pointRadius:6,hoverPointRadius:1,hoverPointUnit:"%",pointerEvents:"visiblePainted",cursor:"pointer"},'temporary':{fillColor:"#66cccc",fillOpacity:0.2,hoverFillColor:"white",hoverFillOpacity:0.8,strokeColor:"#66cccc",strokeOpacity:1,strokeLinecap:"round",strokeWidth:2,strokeDashstyle:"solid",hoverStrokeColor:"red",hoverStrokeOpacity:1,hoverStrokeWidth:0.2,pointRadius:6,hoverPointRadius:1,hoverPointUnit:"%",pointerEvents:"visiblePainted",cursor:"inherit"},'delete':{display:"none"}};OpenLayers.Feature.WFS=OpenLayers.Class(OpenLayers.Feature,{initialize:function(layer,xmlNode){var newArguments=arguments;var data=this.processXMLNode(xmlNode);newArguments=new Array(layer,data.lonlat,data);OpenLayers.Feature.prototype.initialize.apply(this,newArguments);this.createMarker();this.layer.addMarker(this.marker);},destroy:function(){if(this.marker!=null){this.layer.removeMarker(this.marker);}
60483 OpenLayers.Feature.prototype.destroy.apply(this,arguments);},processXMLNode:function(xmlNode){var point=OpenLayers.Ajax.getElementsByTagNameNS(xmlNode,"http://www.opengis.net/gml","gml","Point");var text=OpenLayers.Util.getXmlNodeValue(OpenLayers.Ajax.getElementsByTagNameNS(point[0],"http://www.opengis.net/gml","gml","coordinates")[0]);var floats=text.split(",");return{lonlat:new OpenLayers.LonLat(parseFloat(floats[0]),parseFloat(floats[1])),id:null};},CLASS_NAME:"OpenLayers.Feature.WFS"});OpenLayers.Format.OWSCommon.v1_0_0=OpenLayers.Class(OpenLayers.Format.OWSCommon.v1,{namespaces:{ows:"http://www.opengis.net/ows/1.0",xlink:"http://www.w3.org/1999/xlink"},readers:{"ows":OpenLayers.Format.OWSCommon.v1.prototype.readers["ows"]},writers:{"ows":OpenLayers.Format.OWSCommon.v1.prototype.writers["ows"]},CLASS_NAME:"OpenLayers.Format.OWSCommon.v1_1_0"});OpenLayers.Format.OWSCommon.v1_1_0=OpenLayers.Class(OpenLayers.Format.OWSCommon.v1,{namespaces:{ows:"http://www.opengis.net/ows/1.1",xlink:"http://www.w3.org/1999/xlink"},readers:{"ows":OpenLayers.Util.applyDefaults({"AllowedValues":function(node,parameter){parameter.allowedValues={};this.readChildNodes(node,parameter.allowedValues);},"AnyValue":function(node,parameter){parameter.anyValue=true;},"Range":function(node,allowedValues){allowedValues.range={};this.readChildNodes(node,allowedValues.range);},"MinimumValue":function(node,range){range.minValue=this.getChildValue(node);},"MaximumValue":function(node,range){range.maxValue=this.getChildValue(node);},"Identifier":function(node,obj){obj.identifier=this.getChildValue(node);},"SupportedCRS":function(node,obj){obj.supportedCRS=this.getChildValue(node);}},OpenLayers.Format.OWSCommon.v1.prototype.readers["ows"])},CLASS_NAME:"OpenLayers.Format.OWSCommon.v1_1_0"});OpenLayers.Format.OWSContext=OpenLayers.Class(OpenLayers.Format.Context,{defaultVersion:"0.3.1",getParser:function(version){var v=version||this.version||this.defaultVersion;if(v==="0.3.0"){v=this.defaultVersion;}
60484 if(!this.parser||this.parser.VERSION!=v){var format=OpenLayers.Format.OWSContext["v"+v.replace(/\./g,"_")];if(!format){throw"Can't find a OWSContext parser for version "+v;}
60485 this.parser=new format(this.options);}
60486 return this.parser;},toContext:function(obj){var context={};if(obj.CLASS_NAME=="OpenLayers.Map"){context.bounds=obj.getExtent();context.maxExtent=obj.maxExtent;context.projection=obj.projection;context.size=obj.getSize();context.layers=obj.layers;}
60487 return context;},CLASS_NAME:"OpenLayers.Format.OWSContext"});OpenLayers.Format.WFSCapabilities.v1=OpenLayers.Class(OpenLayers.Format.WFSCapabilities,{initialize:function(options){OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);this.options=options;},read:function(data){if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);}
60488 var capabilities={};var root=data.documentElement;this.runChildNodes(capabilities,root);return capabilities;},runChildNodes:function(obj,node){var children=node.childNodes;var childNode,processor;for(var i=0;i<children.length;++i){childNode=children[i];if(childNode.nodeType==1){processor=this["read_cap_"+childNode.nodeName];if(processor){processor.apply(this,[obj,childNode]);}}}},read_cap_FeatureTypeList:function(request,node){var featureTypeList={featureTypes:[]};this.runChildNodes(featureTypeList,node);request.featureTypeList=featureTypeList;},read_cap_FeatureType:function(featureTypeList,node,parentLayer){var featureType={};this.runChildNodes(featureType,node);featureTypeList.featureTypes.push(featureType);},read_cap_Name:function(obj,node){var name=this.getChildValue(node);if(name){var parts=name.split(":");obj.name=parts.pop();if(parts.length>0){obj.featureNS=this.lookupNamespaceURI(node,parts[0]);}}},read_cap_Title:function(obj,node){var title=this.getChildValue(node);if(title){obj.title=title;}},read_cap_Abstract:function(obj,node){var abst=this.getChildValue(node);if(abst){obj["abstract"]=abst;}},CLASS_NAME:"OpenLayers.Format.WFSCapabilities.v1"});OpenLayers.Format.WMC=OpenLayers.Class(OpenLayers.Format.Context,{defaultVersion:"1.1.0",getParser:function(version){var v=version||this.version||this.defaultVersion;if(!this.parser||this.parser.VERSION!=v){var format=OpenLayers.Format.WMC["v"+v.replace(/\./g,"_")];if(!format){throw"Can't find a WMC parser for version "+v;}
60489 this.parser=new format(this.options);}
60490 return this.parser;},layerToContext:function(layer){var parser=this.getParser();var layerContext={queryable:layer.queryable,visibility:layer.visibility,name:layer.params["LAYERS"],title:layer.name,metadataURL:layer.metadataURL,version:layer.params["VERSION"],url:layer.url,maxExtent:layer.maxExtent,transparent:layer.params["TRANSPARENT"],numZoomLevels:layer.numZoomLevels,units:layer.units,isBaseLayer:layer.isBaseLayer,opacity:layer.opacity,displayInLayerSwitcher:layer.displayInLayerSwitcher,singleTile:layer.singleTile,tileSize:(layer.singleTile||!layer.tileSize)?undefined:{width:layer.tileSize.w,height:layer.tileSize.h},minScale:(layer.options.resolutions||layer.options.scales||layer.options.maxResolution||layer.options.minScale)?layer.minScale:undefined,maxScale:(layer.options.resolutions||layer.options.scales||layer.options.minResolution||layer.options.maxScale)?layer.maxScale:undefined,formats:[{value:layer.params["FORMAT"],current:true}],styles:[{href:layer.params["SLD"],body:layer.params["SLD_BODY"],name:layer.params["STYLES"]||parser.defaultStyleName,title:parser.defaultStyleTitle,current:true}]};return layerContext;},toContext:function(obj){var context={};var layers=obj.layers;if(obj.CLASS_NAME=="OpenLayers.Map"){context.bounds=obj.getExtent();context.maxExtent=obj.maxExtent;context.projection=obj.projection;context.size=obj.getSize();}
60491 else{OpenLayers.Util.applyDefaults(context,obj);if(context.layers!=undefined){delete(context.layers);}}
60492 if(context.layersContext==undefined){context.layersContext=[];}
60493 if(layers!=undefined&&layers instanceof Array){for(var i=0,len=layers.length;i<len;i++){var layer=layers[i];if(layer instanceof OpenLayers.Layer.WMS){context.layersContext.push(this.layerToContext(layer));}}}
60494 return context;},CLASS_NAME:"OpenLayers.Format.WMC"});OpenLayers.Format.WMSCapabilities.v1=OpenLayers.Class(OpenLayers.Format.XML,{namespaces:{wms:"http://www.opengis.net/wms",xlink:"http://www.w3.org/1999/xlink",xsi:"http://www.w3.org/2001/XMLSchema-instance"},defaultPrefix:"wms",initialize:function(options){OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);},read:function(data){if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);}
60495 if(data&&data.nodeType==9){data=data.documentElement;}
60496 var capabilities={};this.readNode(data,capabilities);this.postProcessLayers(capabilities);return capabilities;},postProcessLayers:function(capabilities){if(capabilities.capability){capabilities.capability.layers=[];var layers=capabilities.capability.nestedLayers;for(var i=0,len=layers.length;i<len;++i){var layer=layers[i];this.processLayer(capabilities.capability,layer);}}},processLayer:function(capability,layer,parentLayer){if(layer.formats===undefined){layer.formats=capability.request.getmap.formats;}
60497 if(parentLayer){layer.styles=layer.styles.concat(parentLayer.styles);var attributes=["queryable","cascaded","fixedWidth","fixedHeight","opaque","noSubsets","llbbox","minScale","maxScale","attribution"];var complexAttr=["srs","bbox","dimensions","authorityURLs"];var key;for(var j=0;j<attributes.length;j++){key=attributes[j];if(key in parentLayer){if(layer[key]==null){layer[key]=parentLayer[key];}
60498 if(layer[key]==null){var intAttr=["cascaded","fixedWidth","fixedHeight"];var boolAttr=["queryable","opaque","noSubsets"];if(OpenLayers.Util.indexOf(intAttr,key)!=-1){layer[key]=0;}
60499 if(OpenLayers.Util.indexOf(boolAttr,key)!=-1){layer[key]=false;}}}}
60500 for(var j=0;j<complexAttr.length;j++){key=complexAttr[j];layer[key]=OpenLayers.Util.extend(layer[key],parentLayer[key]);}}
60501 for(var i=0,len=layer.nestedLayers.length;i<len;i++){var childLayer=layer.nestedLayers[i];this.processLayer(capability,childLayer,layer);}
60502 if(layer.name){capability.layers.push(layer);}},readers:{"wms":{"Service":function(node,obj){obj.service={};this.readChildNodes(node,obj.service);},"Name":function(node,obj){obj.name=this.getChildValue(node);},"Title":function(node,obj){obj.title=this.getChildValue(node);},"Abstract":function(node,obj){obj["abstract"]=this.getChildValue(node);},"BoundingBox":function(node,obj){var bbox={};bbox.bbox=[parseFloat(node.getAttribute("minx")),parseFloat(node.getAttribute("miny")),parseFloat(node.getAttribute("maxx")),parseFloat(node.getAttribute("maxy"))];var res={x:parseFloat(node.getAttribute("resx")),y:parseFloat(node.getAttribute("resy"))};if(!(isNaN(res.x)&&isNaN(res.y))){bbox.res=res;}
60503 return bbox;},"OnlineResource":function(node,obj){obj.href=this.getAttributeNS(node,this.namespaces.xlink,"href");},"ContactInformation":function(node,obj){obj.contactInformation={};this.readChildNodes(node,obj.contactInformation);},"ContactPersonPrimary":function(node,obj){obj.personPrimary={};this.readChildNodes(node,obj.personPrimary);},"ContactPerson":function(node,obj){obj.person=this.getChildValue(node);},"ContactOrganization":function(node,obj){obj.organization=this.getChildValue(node);},"ContactPosition":function(node,obj){obj.position=this.getChildValue(node);},"ContactAddress":function(node,obj){obj.contactAddress={};this.readChildNodes(node,obj.contactAddress);},"AddressType":function(node,obj){obj.type=this.getChildValue(node);},"Address":function(node,obj){obj.address=this.getChildValue(node);},"City":function(node,obj){obj.city=this.getChildValue(node);},"StateOrProvince":function(node,obj){obj.stateOrProvince=this.getChildValue(node);},"PostCode":function(node,obj){obj.postcode=this.getChildValue(node);},"Country":function(node,obj){obj.country=this.getChildValue(node);},"ContactVoiceTelephone":function(node,obj){obj.phone=this.getChildValue(node);},"ContactFacsimileTelephone":function(node,obj){obj.fax=this.getChildValue(node);},"ContactElectronicMailAddress":function(node,obj){obj.email=this.getChildValue(node);},"Fees":function(node,obj){var fees=this.getChildValue(node);if(fees&&fees.toLowerCase()!="none"){obj.fees=fees;}},"AccessConstraints":function(node,obj){var constraints=this.getChildValue(node);if(constraints&&constraints.toLowerCase()!="none"){obj.accessConstraints=constraints;}},"Capability":function(node,obj){obj.capability={nestedLayers:[]};this.readChildNodes(node,obj.capability);},"Request":function(node,obj){obj.request={};this.readChildNodes(node,obj.request);},"GetCapabilities":function(node,obj){obj.getcapabilities={formats:[]};this.readChildNodes(node,obj.getcapabilities);},"Format":function(node,obj){if(obj.formats instanceof Array){obj.formats.push(this.getChildValue(node));}else{obj.format=this.getChildValue(node);}},"DCPType":function(node,obj){this.readChildNodes(node,obj);},"HTTP":function(node,obj){this.readChildNodes(node,obj);},"Get":function(node,obj){this.readChildNodes(node,obj);},"Post":function(node,obj){this.readChildNodes(node,obj);},"GetMap":function(node,obj){obj.getmap={formats:[]};this.readChildNodes(node,obj.getmap);},"GetFeatureInfo":function(node,obj){obj.getfeatureinfo={formats:[]};this.readChildNodes(node,obj.getfeatureinfo);},"Exception":function(node,obj){obj.exception={formats:[]};this.readChildNodes(node,obj.exception);},"Layer":function(node,obj){var attrNode=node.getAttributeNode("queryable");var queryable=(attrNode&&attrNode.specified)?node.getAttribute("queryable"):null;attrNode=node.getAttributeNode("cascaded");var cascaded=(attrNode&&attrNode.specified)?node.getAttribute("cascaded"):null;attrNode=node.getAttributeNode("opaque");var opaque=(attrNode&&attrNode.specified)?node.getAttribute('opaque'):null;var noSubsets=node.getAttribute('noSubsets');var fixedWidth=node.getAttribute('fixedWidth');var fixedHeight=node.getAttribute('fixedHeight');var layer={nestedLayers:[],styles:[],srs:{},metadataURLs:[],bbox:{},dimensions:{},authorityURLs:{},identifiers:{},keywords:[],queryable:(queryable&&queryable!=="")?(queryable==="1"||queryable==="true"):null,cascaded:(cascaded!==null)?parseInt(cascaded):null,opaque:opaque?(opaque==="1"||opaque==="true"):null,noSubsets:(noSubsets!==null)?(noSubsets==="1"||noSubsets==="true"):null,fixedWidth:(fixedWidth!=null)?parseInt(fixedWidth):null,fixedHeight:(fixedHeight!=null)?parseInt(fixedHeight):null};obj.nestedLayers.push(layer);this.readChildNodes(node,layer);if(layer.name){var parts=layer.name.split(":");if(parts.length>0){layer.prefix=parts[0];}}},"Attribution":function(node,obj){obj.attribution={};this.readChildNodes(node,obj.attribution);},"LogoURL":function(node,obj){obj.logo={width:node.getAttribute("width"),height:node.getAttribute("height")};this.readChildNodes(node,obj.logo);},"Style":function(node,obj){var style={};obj.styles.push(style);this.readChildNodes(node,style);},"LegendURL":function(node,obj){var legend={width:node.getAttribute("width"),height:node.getAttribute("height")};obj.legend=legend;this.readChildNodes(node,legend);},"MetadataURL":function(node,obj){var metadataURL={type:node.getAttribute("type")};obj.metadataURLs.push(metadataURL);this.readChildNodes(node,metadataURL);},"DataURL":function(node,obj){obj.dataURL={};this.readChildNodes(node,obj.dataURL);},"FeatureListURL":function(node,obj){obj.featureListURL={};this.readChildNodes(node,obj.featureListURL);},"AuthorityURL":function(node,obj){var name=node.getAttribute("name");var authority={};this.readChildNodes(node,authority);obj.authorityURLs[name]=authority.href;},"Identifier":function(node,obj){var authority=node.getAttribute("authority");obj.identifiers[authority]=this.getChildValue(node);},"KeywordList":function(node,obj){this.readChildNodes(node,obj);},"SRS":function(node,obj){obj.srs[this.getChildValue(node)]=true;}}},CLASS_NAME:"OpenLayers.Format.WMSCapabilities.v1"});OpenLayers.Format.WMSDescribeLayer.v1_1=OpenLayers.Class(OpenLayers.Format.WMSDescribeLayer,{initialize:function(options){OpenLayers.Format.WMSDescribeLayer.prototype.initialize.apply(this,[options]);},read:function(data){if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);}
60504 var root=data.documentElement;var children=root.childNodes;var describelayer=[];var childNode,nodeName;for(var i=0;i<children.length;++i){childNode=children[i];nodeName=childNode.nodeName;if(nodeName=='LayerDescription'){var layerName=childNode.getAttribute('name');var owsType='';var owsURL='';var typeName='';if(childNode.getAttribute('owsType')){owsType=childNode.getAttribute('owsType');owsURL=childNode.getAttribute('owsURL');}else{if(childNode.getAttribute('wfs')!=''){owsType='WFS';owsURL=childNode.getAttribute('wfs');}else if(childNode.getAttribute('wcs')!=''){owsType='WCS';owsURL=childNode.getAttribute('wcs');}}
60505 var query=childNode.getElementsByTagName('Query');if(query.length>0){typeName=query[0].getAttribute('typeName');if(!typeName){typeName=query[0].getAttribute('typename');}}
60506 describelayer.push({layerName:layerName,owsType:owsType,owsURL:owsURL,typeName:typeName});}}
60507 return describelayer;},CLASS_NAME:"OpenLayers.Format.WMSDescribeLayer.v1_1"});OpenLayers.Handler.Box=OpenLayers.Class(OpenLayers.Handler,{dragHandler:null,boxDivClassName:'olHandlerBoxZoomBox',boxCharacteristics:null,initialize:function(control,callbacks,options){OpenLayers.Handler.prototype.initialize.apply(this,arguments);var callbacks={"down":this.startBox,"move":this.moveBox,"out":this.removeBox,"up":this.endBox};this.dragHandler=new OpenLayers.Handler.Drag(this,callbacks,{keyMask:this.keyMask});},destroy:function(){if(this.dragHandler){this.dragHandler.destroy();this.dragHandler=null;}
60508 OpenLayers.Handler.prototype.destroy.apply(this,arguments);},setMap:function(map){OpenLayers.Handler.prototype.setMap.apply(this,arguments);if(this.dragHandler){this.dragHandler.setMap(map);}},startBox:function(xy){this.zoomBox=OpenLayers.Util.createDiv('zoomBox',this.dragHandler.start);this.zoomBox.className=this.boxDivClassName;this.zoomBox.style.zIndex=this.map.Z_INDEX_BASE["Popup"]-1;this.map.viewPortDiv.appendChild(this.zoomBox);OpenLayers.Element.addClass(this.map.viewPortDiv,"olDrawBox");},moveBox:function(xy){var startX=this.dragHandler.start.x;var startY=this.dragHandler.start.y;var deltaX=Math.abs(startX-xy.x);var deltaY=Math.abs(startY-xy.y);this.zoomBox.style.width=Math.max(1,deltaX)+"px";this.zoomBox.style.height=Math.max(1,deltaY)+"px";this.zoomBox.style.left=xy.x<startX?xy.x+"px":startX+"px";this.zoomBox.style.top=xy.y<startY?xy.y+"px":startY+"px";var box=this.getBoxCharacteristics();if(box.newBoxModel){if(xy.x>startX){this.zoomBox.style.width=Math.max(1,deltaX-box.xOffset)+"px";}
60509 if(xy.y>startY){this.zoomBox.style.height=Math.max(1,deltaY-box.yOffset)+"px";}}},endBox:function(end){var result;if(Math.abs(this.dragHandler.start.x-end.x)>5||Math.abs(this.dragHandler.start.y-end.y)>5){var start=this.dragHandler.start;var top=Math.min(start.y,end.y);var bottom=Math.max(start.y,end.y);var left=Math.min(start.x,end.x);var right=Math.max(start.x,end.x);result=new OpenLayers.Bounds(left,bottom,right,top);}else{result=this.dragHandler.start.clone();}
60510 this.removeBox();this.callback("done",[result]);},removeBox:function(){this.map.viewPortDiv.removeChild(this.zoomBox);this.zoomBox=null;this.boxCharacteristics=null;OpenLayers.Element.removeClass(this.map.viewPortDiv,"olDrawBox");},activate:function(){if(OpenLayers.Handler.prototype.activate.apply(this,arguments)){this.dragHandler.activate();return true;}else{return false;}},deactivate:function(){if(OpenLayers.Handler.prototype.deactivate.apply(this,arguments)){this.dragHandler.deactivate();return true;}else{return false;}},getBoxCharacteristics:function(){if(!this.boxCharacteristics){var xOffset=parseInt(OpenLayers.Element.getStyle(this.zoomBox,"border-left-width"))+parseInt(OpenLayers.Element.getStyle(this.zoomBox,"border-right-width"))+1;var yOffset=parseInt(OpenLayers.Element.getStyle(this.zoomBox,"border-top-width"))+parseInt(OpenLayers.Element.getStyle(this.zoomBox,"border-bottom-width"))+1;var newBoxModel=OpenLayers.Util.getBrowserName()=="msie"?document.compatMode!="BackCompat":true;this.boxCharacteristics={xOffset:xOffset,yOffset:yOffset,newBoxModel:newBoxModel};}
60511 return this.boxCharacteristics;},CLASS_NAME:"OpenLayers.Handler.Box"});OpenLayers.Handler.RegularPolygon=OpenLayers.Class(OpenLayers.Handler.Drag,{sides:4,radius:null,snapAngle:null,snapToggle:'shiftKey',layerOptions:null,persist:false,irregular:false,angle:null,fixedRadius:false,feature:null,layer:null,origin:null,initialize:function(control,callbacks,options){if(!(options&&options.layerOptions&&options.layerOptions.styleMap)){this.style=OpenLayers.Util.extend(OpenLayers.Feature.Vector.style['default'],{});}
60512 OpenLayers.Handler.prototype.initialize.apply(this,[control,callbacks,options]);this.options=(options)?options:{};},setOptions:function(newOptions){OpenLayers.Util.extend(this.options,newOptions);OpenLayers.Util.extend(this,newOptions);},activate:function(){var activated=false;if(OpenLayers.Handler.prototype.activate.apply(this,arguments)){var options=OpenLayers.Util.extend({displayInLayerSwitcher:false,calculateInRange:OpenLayers.Function.True},this.layerOptions);this.layer=new OpenLayers.Layer.Vector(this.CLASS_NAME,options);this.map.addLayer(this.layer);activated=true;}
60513 return activated;},deactivate:function(){var deactivated=false;if(OpenLayers.Handler.Drag.prototype.deactivate.apply(this,arguments)){if(this.dragging){this.cancel();}
60514 if(this.layer.map!=null){this.layer.destroy(false);if(this.feature){this.feature.destroy();}}
60515 this.layer=null;this.feature=null;deactivated=true;}
60516 return deactivated;},down:function(evt){this.fixedRadius=!!(this.radius);var maploc=this.map.getLonLatFromPixel(evt.xy);this.origin=new OpenLayers.Geometry.Point(maploc.lon,maploc.lat);if(!this.fixedRadius||this.irregular){this.radius=this.map.getResolution();}
60517 if(this.persist){this.clear();}
60518 this.feature=new OpenLayers.Feature.Vector();this.createGeometry();this.callback("create",[this.origin,this.feature]);this.layer.addFeatures([this.feature],{silent:true});this.layer.drawFeature(this.feature,this.style);},move:function(evt){var maploc=this.map.getLonLatFromPixel(evt.xy);var point=new OpenLayers.Geometry.Point(maploc.lon,maploc.lat);if(this.irregular){var ry=Math.sqrt(2)*Math.abs(point.y-this.origin.y)/2;this.radius=Math.max(this.map.getResolution()/2,ry);}else if(this.fixedRadius){this.origin=point;}else{this.calculateAngle(point,evt);this.radius=Math.max(this.map.getResolution()/2,point.distanceTo(this.origin));}
60519 this.modifyGeometry();if(this.irregular){var dx=point.x-this.origin.x;var dy=point.y-this.origin.y;var ratio;if(dy==0){ratio=dx/(this.radius*Math.sqrt(2));}else{ratio=dx/dy;}
60520 this.feature.geometry.resize(1,this.origin,ratio);this.feature.geometry.move(dx/2,dy/2);}
60521 this.layer.drawFeature(this.feature,this.style);},up:function(evt){this.finalize();if(this.start==this.last){this.callback("done",[evt.xy]);}},out:function(evt){this.finalize();},createGeometry:function(){this.angle=Math.PI*((1/this.sides)-(1/2));if(this.snapAngle){this.angle+=this.snapAngle*(Math.PI/180);}
60522 this.feature.geometry=OpenLayers.Geometry.Polygon.createRegularPolygon(this.origin,this.radius,this.sides,this.snapAngle);},modifyGeometry:function(){var angle,point;var ring=this.feature.geometry.components[0];if(ring.components.length!=(this.sides+1)){this.createGeometry();ring=this.feature.geometry.components[0];}
60523 for(var i=0;i<this.sides;++i){point=ring.components[i];angle=this.angle+(i*2*Math.PI/this.sides);point.x=this.origin.x+(this.radius*Math.cos(angle));point.y=this.origin.y+(this.radius*Math.sin(angle));point.clearBounds();}},calculateAngle:function(point,evt){var alpha=Math.atan2(point.y-this.origin.y,point.x-this.origin.x);if(this.snapAngle&&(this.snapToggle&&!evt[this.snapToggle])){var snapAngleRad=(Math.PI/180)*this.snapAngle;this.angle=Math.round(alpha/snapAngleRad)*snapAngleRad;}else{this.angle=alpha;}},cancel:function(){this.callback("cancel",null);this.finalize();},finalize:function(){this.origin=null;this.radius=this.options.radius;},clear:function(){if(this.layer){this.layer.renderer.clear();this.layer.destroyFeatures();}},callback:function(name,args){if(this.callbacks[name]){this.callbacks[name].apply(this.control,[this.feature.geometry.clone()]);}
60524 if(!this.persist&&(name=="done"||name=="cancel")){this.clear();}},CLASS_NAME:"OpenLayers.Handler.RegularPolygon"});OpenLayers.Layer.EventPane=OpenLayers.Class(OpenLayers.Layer,{smoothDragPan:true,isBaseLayer:true,isFixed:true,pane:null,mapObject:null,initialize:function(name,options){OpenLayers.Layer.prototype.initialize.apply(this,arguments);if(this.pane==null){this.pane=OpenLayers.Util.createDiv(this.div.id+"_EventPane");}},destroy:function(){this.mapObject=null;this.pane=null;OpenLayers.Layer.prototype.destroy.apply(this,arguments);},setMap:function(map){OpenLayers.Layer.prototype.setMap.apply(this,arguments);this.pane.style.zIndex=parseInt(this.div.style.zIndex)+1;this.pane.style.display=this.div.style.display;this.pane.style.width="100%";this.pane.style.height="100%";if(OpenLayers.Util.getBrowserName()=="msie"){this.pane.style.background="url("+OpenLayers.Util.getImagesLocation()+"blank.gif)";}
60525 if(this.isFixed){this.map.viewPortDiv.appendChild(this.pane);}else{this.map.layerContainerDiv.appendChild(this.pane);}
60526 this.loadMapObject();if(this.mapObject==null){this.loadWarningMessage();}},removeMap:function(map){if(this.pane&&this.pane.parentNode){this.pane.parentNode.removeChild(this.pane);}
60527 OpenLayers.Layer.prototype.removeMap.apply(this,arguments);},loadWarningMessage:function(){this.div.style.backgroundColor="darkblue";var viewSize=this.map.getSize();var msgW=Math.min(viewSize.w,300);var msgH=Math.min(viewSize.h,200);var size=new OpenLayers.Size(msgW,msgH);var centerPx=new OpenLayers.Pixel(viewSize.w/2,viewSize.h/2);var topLeft=centerPx.add(-size.w/2,-size.h/2);var div=OpenLayers.Util.createDiv(this.name+"_warning",topLeft,size,null,null,null,"auto");div.style.padding="7px";div.style.backgroundColor="yellow";div.innerHTML=this.getWarningHTML();this.div.appendChild(div);},getWarningHTML:function(){return"";},display:function(display){OpenLayers.Layer.prototype.display.apply(this,arguments);this.pane.style.display=this.div.style.display;},setZIndex:function(zIndex){OpenLayers.Layer.prototype.setZIndex.apply(this,arguments);this.pane.style.zIndex=parseInt(this.div.style.zIndex)+1;},moveTo:function(bounds,zoomChanged,dragging){OpenLayers.Layer.prototype.moveTo.apply(this,arguments);if(this.mapObject!=null){var newCenter=this.map.getCenter();var newZoom=this.map.getZoom();if(newCenter!=null){var moOldCenter=this.getMapObjectCenter();var oldCenter=this.getOLLonLatFromMapObjectLonLat(moOldCenter);var moOldZoom=this.getMapObjectZoom();var oldZoom=this.getOLZoomFromMapObjectZoom(moOldZoom);if(!(newCenter.equals(oldCenter))||!(newZoom==oldZoom)){if(dragging&&this.dragPanMapObject&&this.smoothDragPan){var oldPx=this.map.getViewPortPxFromLonLat(oldCenter);var newPx=this.map.getViewPortPxFromLonLat(newCenter);this.dragPanMapObject(newPx.x-oldPx.x,oldPx.y-newPx.y);}else{var center=this.getMapObjectLonLatFromOLLonLat(newCenter);var zoom=this.getMapObjectZoomFromOLZoom(newZoom);this.setMapObjectCenter(center,zoom,dragging);}}}}},getLonLatFromViewPortPx:function(viewPortPx){var lonlat=null;if((this.mapObject!=null)&&(this.getMapObjectCenter()!=null)){var moPixel=this.getMapObjectPixelFromOLPixel(viewPortPx);var moLonLat=this.getMapObjectLonLatFromMapObjectPixel(moPixel);lonlat=this.getOLLonLatFromMapObjectLonLat(moLonLat);}
60528 return lonlat;},getViewPortPxFromLonLat:function(lonlat){var viewPortPx=null;if((this.mapObject!=null)&&(this.getMapObjectCenter()!=null)){var moLonLat=this.getMapObjectLonLatFromOLLonLat(lonlat);var moPixel=this.getMapObjectPixelFromMapObjectLonLat(moLonLat);viewPortPx=this.getOLPixelFromMapObjectPixel(moPixel);}
60529 return viewPortPx;},getOLLonLatFromMapObjectLonLat:function(moLonLat){var olLonLat=null;if(moLonLat!=null){var lon=this.getLongitudeFromMapObjectLonLat(moLonLat);var lat=this.getLatitudeFromMapObjectLonLat(moLonLat);olLonLat=new OpenLayers.LonLat(lon,lat);}
60530 return olLonLat;},getMapObjectLonLatFromOLLonLat:function(olLonLat){var moLatLng=null;if(olLonLat!=null){moLatLng=this.getMapObjectLonLatFromLonLat(olLonLat.lon,olLonLat.lat);}
60531 return moLatLng;},getOLPixelFromMapObjectPixel:function(moPixel){var olPixel=null;if(moPixel!=null){var x=this.getXFromMapObjectPixel(moPixel);var y=this.getYFromMapObjectPixel(moPixel);olPixel=new OpenLayers.Pixel(x,y);}
60532 return olPixel;},getMapObjectPixelFromOLPixel:function(olPixel){var moPixel=null;if(olPixel!=null){moPixel=this.getMapObjectPixelFromXY(olPixel.x,olPixel.y);}
60533 return moPixel;},CLASS_NAME:"OpenLayers.Layer.EventPane"});OpenLayers.Layer.FixedZoomLevels=OpenLayers.Class({initialize:function(){},initResolutions:function(){var props=new Array('minZoomLevel','maxZoomLevel','numZoomLevels');for(var i=0,len=props.length;i<len;i++){var property=props[i];this[property]=(this.options[property]!=null)?this.options[property]:this.map[property];}
60534 if((this.minZoomLevel==null)||(this.minZoomLevel<this.MIN_ZOOM_LEVEL)){this.minZoomLevel=this.MIN_ZOOM_LEVEL;}
60535 var desiredZoomLevels;var limitZoomLevels=this.MAX_ZOOM_LEVEL-this.minZoomLevel+1;if(((this.options.numZoomLevels==null)&&(this.options.maxZoomLevel!=null))||((this.numZoomLevels==null)&&(this.maxZoomLevel!=null))){desiredZoomLevels=this.maxZoomLevel-this.minZoomLevel+1;}else{desiredZoomLevels=this.numZoomLevels;}
60536 if(desiredZoomLevels!=null){this.numZoomLevels=Math.min(desiredZoomLevels,limitZoomLevels);}else{this.numZoomLevels=limitZoomLevels;}
60537 this.maxZoomLevel=this.minZoomLevel+this.numZoomLevels-1;if(this.RESOLUTIONS!=null){var resolutionsIndex=0;this.resolutions=[];for(var i=this.minZoomLevel;i<=this.maxZoomLevel;i++){this.resolutions[resolutionsIndex++]=this.RESOLUTIONS[i];}
60538 this.maxResolution=this.resolutions[0];this.minResolution=this.resolutions[this.resolutions.length-1];}},getResolution:function(){if(this.resolutions!=null){return OpenLayers.Layer.prototype.getResolution.apply(this,arguments);}else{var resolution=null;var viewSize=this.map.getSize();var extent=this.getExtent();if((viewSize!=null)&&(extent!=null)){resolution=Math.max(extent.getWidth()/viewSize.w,extent.getHeight()/viewSize.h);}
60539 return resolution;}},getExtent:function(){var extent=null;var size=this.map.getSize();var tlPx=new OpenLayers.Pixel(0,0);var tlLL=this.getLonLatFromViewPortPx(tlPx);var brPx=new OpenLayers.Pixel(size.w,size.h);var brLL=this.getLonLatFromViewPortPx(brPx);if((tlLL!=null)&&(brLL!=null)){extent=new OpenLayers.Bounds(tlLL.lon,brLL.lat,brLL.lon,tlLL.lat);}
60540 return extent;},getZoomForResolution:function(resolution){if(this.resolutions!=null){return OpenLayers.Layer.prototype.getZoomForResolution.apply(this,arguments);}else{var extent=OpenLayers.Layer.prototype.getExtent.apply(this,[]);return this.getZoomForExtent(extent);}},getOLZoomFromMapObjectZoom:function(moZoom){var zoom=null;if(moZoom!=null){zoom=moZoom-this.minZoomLevel;}
60541 return zoom;},getMapObjectZoomFromOLZoom:function(olZoom){var zoom=null;if(olZoom!=null){zoom=olZoom+this.minZoomLevel;}
60542 return zoom;},CLASS_NAME:"OpenLayers.Layer.FixedZoomLevels"});OpenLayers.Layer.HTTPRequest=OpenLayers.Class(OpenLayers.Layer,{URL_HASH_FACTOR:(Math.sqrt(5)-1)/2,url:null,params:null,reproject:false,initialize:function(name,url,params,options){var newArguments=arguments;newArguments=[name,options];OpenLayers.Layer.prototype.initialize.apply(this,newArguments);this.url=url;this.params=OpenLayers.Util.extend({},params);},destroy:function(){this.url=null;this.params=null;OpenLayers.Layer.prototype.destroy.apply(this,arguments);},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.HTTPRequest(this.name,this.url,this.params,this.getOptions());}
60543 obj=OpenLayers.Layer.prototype.clone.apply(this,[obj]);return obj;},setUrl:function(newUrl){this.url=newUrl;},mergeNewParams:function(newParams){this.params=OpenLayers.Util.extend(this.params,newParams);var ret=this.redraw();if(this.map!=null){this.map.events.triggerEvent("changelayer",{layer:this,property:"params"});}
60544 return ret;},redraw:function(force){if(force){return this.mergeNewParams({"_olSalt":Math.random()});}else{return OpenLayers.Layer.prototype.redraw.apply(this,[]);}},selectUrl:function(paramString,urls){var product=1;for(var i=0,len=paramString.length;i<len;i++){product*=paramString.charCodeAt(i)*this.URL_HASH_FACTOR;product-=Math.floor(product);}
60545 return urls[Math.floor(product*urls.length)];},getFullRequestString:function(newParams,altUrl){var url=altUrl||this.url;var allParams=OpenLayers.Util.extend({},this.params);allParams=OpenLayers.Util.extend(allParams,newParams);var paramsString=OpenLayers.Util.getParameterString(allParams);if(url instanceof Array){url=this.selectUrl(paramsString,url);}
60546 var urlParams=OpenLayers.Util.upperCaseObject(OpenLayers.Util.getParameters(url));for(var key in allParams){if(key.toUpperCase()in urlParams){delete allParams[key];}}
60547 paramsString=OpenLayers.Util.getParameterString(allParams);return OpenLayers.Util.urlAppend(url,paramsString);},CLASS_NAME:"OpenLayers.Layer.HTTPRequest"});OpenLayers.Layer.Image=OpenLayers.Class(OpenLayers.Layer,{isBaseLayer:true,url:null,extent:null,size:null,tile:null,aspectRatio:null,initialize:function(name,url,extent,size,options){this.url=url;this.extent=extent;this.maxExtent=extent;this.size=size;OpenLayers.Layer.prototype.initialize.apply(this,[name,options]);this.aspectRatio=(this.extent.getHeight()/this.size.h)/(this.extent.getWidth()/this.size.w);},destroy:function(){if(this.tile){this.removeTileMonitoringHooks(this.tile);this.tile.destroy();this.tile=null;}
60548 OpenLayers.Layer.prototype.destroy.apply(this,arguments);},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.Image(this.name,this.url,this.extent,this.size,this.getOptions());}
60549 obj=OpenLayers.Layer.prototype.clone.apply(this,[obj]);return obj;},setMap:function(map){if(this.options.maxResolution==null){this.options.maxResolution=this.aspectRatio*this.extent.getWidth()/this.size.w;}
60550 OpenLayers.Layer.prototype.setMap.apply(this,arguments);},moveTo:function(bounds,zoomChanged,dragging){OpenLayers.Layer.prototype.moveTo.apply(this,arguments);var firstRendering=(this.tile==null);if(zoomChanged||firstRendering){this.setTileSize();var ul=new OpenLayers.LonLat(this.extent.left,this.extent.top);var ulPx=this.map.getLayerPxFromLonLat(ul);if(firstRendering){this.tile=new OpenLayers.Tile.Image(this,ulPx,this.extent,null,this.tileSize);this.addTileMonitoringHooks(this.tile);}else{this.tile.size=this.tileSize.clone();this.tile.position=ulPx.clone();}
60551 this.tile.draw();}},setTileSize:function(){var tileWidth=this.extent.getWidth()/this.map.getResolution();var tileHeight=this.extent.getHeight()/this.map.getResolution();this.tileSize=new OpenLayers.Size(tileWidth,tileHeight);},addTileMonitoringHooks:function(tile){tile.onLoadStart=function(){this.events.triggerEvent("loadstart");};tile.events.register("loadstart",this,tile.onLoadStart);tile.onLoadEnd=function(){this.events.triggerEvent("loadend");};tile.events.register("loadend",this,tile.onLoadEnd);tile.events.register("unload",this,tile.onLoadEnd);},removeTileMonitoringHooks:function(tile){tile.unload();tile.events.un({"loadstart":tile.onLoadStart,"loadend":tile.onLoadEnd,"unload":tile.onLoadEnd,scope:this});},setUrl:function(newUrl){this.url=newUrl;this.tile.draw();},getURL:function(bounds){return this.url;},CLASS_NAME:"OpenLayers.Layer.Image"});OpenLayers.Layer.Markers=OpenLayers.Class(OpenLayers.Layer,{isBaseLayer:false,markers:null,drawn:false,initialize:function(name,options){OpenLayers.Layer.prototype.initialize.apply(this,arguments);this.markers=[];},destroy:function(){this.clearMarkers();this.markers=null;OpenLayers.Layer.prototype.destroy.apply(this,arguments);},setOpacity:function(opacity){if(opacity!=this.opacity){this.opacity=opacity;for(var i=0,len=this.markers.length;i<len;i++){this.markers[i].setOpacity(this.opacity);}}},moveTo:function(bounds,zoomChanged,dragging){OpenLayers.Layer.prototype.moveTo.apply(this,arguments);if(zoomChanged||!this.drawn){for(var i=0,len=this.markers.length;i<len;i++){this.drawMarker(this.markers[i]);}
60552 this.drawn=true;}},addMarker:function(marker){this.markers.push(marker);if(this.opacity!=null){marker.setOpacity(this.opacity);}
60553 if(this.map&&this.map.getExtent()){marker.map=this.map;this.drawMarker(marker);}},removeMarker:function(marker){if(this.markers&&this.markers.length){OpenLayers.Util.removeItem(this.markers,marker);marker.erase();}},clearMarkers:function(){if(this.markers!=null){while(this.markers.length>0){this.removeMarker(this.markers[0]);}}},drawMarker:function(marker){var px=this.map.getLayerPxFromLonLat(marker.lonlat);if(px==null){marker.display(false);}else{if(!marker.isDrawn()){var markerImg=marker.draw(px);this.div.appendChild(markerImg);}else if(marker.icon){marker.icon.moveTo(px);}}},getDataExtent:function(){var maxExtent=null;if(this.markers&&(this.markers.length>0)){var maxExtent=new OpenLayers.Bounds();for(var i=0,len=this.markers.length;i<len;i++){var marker=this.markers[i];maxExtent.extend(marker.lonlat);}}
60554 return maxExtent;},CLASS_NAME:"OpenLayers.Layer.Markers"});OpenLayers.Layer.SphericalMercator={getExtent:function(){var extent=null;if(this.sphericalMercator){extent=this.map.calculateBounds();}else{extent=OpenLayers.Layer.FixedZoomLevels.prototype.getExtent.apply(this);}
60555 return extent;},getLonLatFromViewPortPx:function(viewPortPx){return OpenLayers.Layer.prototype.getLonLatFromViewPortPx.apply(this,arguments);},getViewPortPxFromLonLat:function(lonlat){return OpenLayers.Layer.prototype.getViewPortPxFromLonLat.apply(this,arguments);},initMercatorParameters:function(){this.RESOLUTIONS=[];var maxResolution=156543.0339;for(var zoom=0;zoom<=this.MAX_ZOOM_LEVEL;++zoom){this.RESOLUTIONS[zoom]=maxResolution/Math.pow(2,zoom);}
60556 this.units="m";this.projection=this.projection||"EPSG:900913";},forwardMercator:function(lon,lat){var x=lon*20037508.34/180;var y=Math.log(Math.tan((90+lat)*Math.PI/360))/(Math.PI/180);y=y*20037508.34/180;return new OpenLayers.LonLat(x,y);},inverseMercator:function(x,y){var lon=(x/20037508.34)*180;var lat=(y/20037508.34)*180;lat=180/Math.PI*(2*Math.atan(Math.exp(lat*Math.PI/180))-Math.PI/2);return new OpenLayers.LonLat(lon,lat);},projectForward:function(point){var lonlat=OpenLayers.Layer.SphericalMercator.forwardMercator(point.x,point.y);point.x=lonlat.lon;point.y=lonlat.lat;return point;},projectInverse:function(point){var lonlat=OpenLayers.Layer.SphericalMercator.inverseMercator(point.x,point.y);point.x=lonlat.lon;point.y=lonlat.lat;return point;}};OpenLayers.Projection.addTransform("EPSG:4326","EPSG:900913",OpenLayers.Layer.SphericalMercator.projectForward);OpenLayers.Projection.addTransform("EPSG:900913","EPSG:4326",OpenLayers.Layer.SphericalMercator.projectInverse);OpenLayers.Tile.WFS=OpenLayers.Class(OpenLayers.Tile,{features:null,url:null,request:null,initialize:function(layer,position,bounds,url,size){OpenLayers.Tile.prototype.initialize.apply(this,arguments);this.url=url;this.features=[];},destroy:function(){OpenLayers.Tile.prototype.destroy.apply(this,arguments);this.destroyAllFeatures();this.features=null;this.url=null;if(this.request){this.request.abort();this.request=null;}},clear:function(){this.destroyAllFeatures();},draw:function(){if(OpenLayers.Tile.prototype.draw.apply(this,arguments)){if(this.isLoading){this.events.triggerEvent("reload");}else{this.isLoading=true;this.events.triggerEvent("loadstart");}
60557 this.loadFeaturesForRegion(this.requestSuccess);}},loadFeaturesForRegion:function(success,failure){if(this.request){this.request.abort();}
60558 this.request=OpenLayers.Request.GET({url:this.url,success:success,failure:failure,scope:this});},requestSuccess:function(request){if(this.features){var doc=request.responseXML;if(!doc||!doc.documentElement){doc=request.responseText;}
60559 if(this.layer.vectorMode){this.layer.addFeatures(this.layer.formatObject.read(doc));}else{var xml=new OpenLayers.Format.XML();if(typeof doc=="string"){doc=xml.read(doc);}
60560 var resultFeatures=xml.getElementsByTagNameNS(doc,"http://www.opengis.net/gml","featureMember");this.addResults(resultFeatures);}}
60561 if(this.events){this.events.triggerEvent("loadend");}
60562 this.request=null;},addResults:function(results){for(var i=0;i<results.length;i++){var feature=new this.layer.featureClass(this.layer,results[i]);this.features.push(feature);}},destroyAllFeatures:function(){while(this.features.length>0){var feature=this.features.shift();feature.destroy();}},CLASS_NAME:"OpenLayers.Tile.WFS"});OpenLayers.Control.DrawFeature=OpenLayers.Class(OpenLayers.Control,{layer:null,callbacks:null,EVENT_TYPES:["featureadded"],multi:false,featureAdded:function(){},handlerOptions:null,initialize:function(layer,handler,options){this.EVENT_TYPES=OpenLayers.Control.DrawFeature.prototype.EVENT_TYPES.concat(OpenLayers.Control.prototype.EVENT_TYPES);OpenLayers.Control.prototype.initialize.apply(this,[options]);this.callbacks=OpenLayers.Util.extend({done:this.drawFeature,modify:function(vertex,feature){this.layer.events.triggerEvent("sketchmodified",{vertex:vertex,feature:feature});},create:function(vertex,feature){this.layer.events.triggerEvent("sketchstarted",{vertex:vertex,feature:feature});}},this.callbacks);this.layer=layer;this.handlerOptions=this.handlerOptions||{};if(!("multi"in this.handlerOptions)){this.handlerOptions.multi=this.multi;}
60563 var sketchStyle=this.layer.styleMap&&this.layer.styleMap.styles.temporary;if(sketchStyle){this.handlerOptions.layerOptions=OpenLayers.Util.applyDefaults(this.handlerOptions.layerOptions,{styleMap:new OpenLayers.StyleMap({"default":sketchStyle})});}
60564 this.handler=new handler(this,this.callbacks,this.handlerOptions);},drawFeature:function(geometry){var feature=new OpenLayers.Feature.Vector(geometry);var proceed=this.layer.events.triggerEvent("sketchcomplete",{feature:feature});if(proceed!==false){feature.state=OpenLayers.State.INSERT;this.layer.addFeatures([feature]);this.featureAdded(feature);this.events.triggerEvent("featureadded",{feature:feature});}},CLASS_NAME:"OpenLayers.Control.DrawFeature"});OpenLayers.Control.Measure=OpenLayers.Class(OpenLayers.Control,{EVENT_TYPES:['measure','measurepartial'],handlerOptions:null,callbacks:null,displaySystem:'metric',geodesic:false,displaySystemUnits:{geographic:['dd'],english:['mi','ft','in'],metric:['km','m']},partialDelay:300,delayedTrigger:null,persist:false,initialize:function(handler,options){this.EVENT_TYPES=OpenLayers.Control.Measure.prototype.EVENT_TYPES.concat(OpenLayers.Control.prototype.EVENT_TYPES);OpenLayers.Control.prototype.initialize.apply(this,[options]);this.callbacks=OpenLayers.Util.extend({done:this.measureComplete,point:this.measurePartial},this.callbacks);this.handlerOptions=OpenLayers.Util.extend({persist:this.persist},this.handlerOptions);this.handler=new handler(this,this.callbacks,this.handlerOptions);},cancel:function(){this.handler.cancel();},updateHandler:function(handler,options){var active=this.active;if(active){this.deactivate();}
60565 this.handler=new handler(this,this.callbacks,options);if(active){this.activate();}},measureComplete:function(geometry){if(this.delayedTrigger){window.clearTimeout(this.delayedTrigger);}
60566 this.measure(geometry,"measure");},measurePartial:function(point,geometry){if(geometry.getLength()>0){geometry=geometry.clone();this.delayedTrigger=window.setTimeout(OpenLayers.Function.bind(function(){this.measure(geometry,"measurepartial");},this),this.partialDelay);}},measure:function(geometry,eventType){var stat,order;if(geometry.CLASS_NAME.indexOf('LineString')>-1){stat=this.getBestLength(geometry);order=1;}else{stat=this.getBestArea(geometry);order=2;}
60567 this.events.triggerEvent(eventType,{measure:stat[0],units:stat[1],order:order,geometry:geometry});},getBestArea:function(geometry){var units=this.displaySystemUnits[this.displaySystem];var unit,area;for(var i=0,len=units.length;i<len;++i){unit=units[i];area=this.getArea(geometry,unit);if(area>1){break;}}
60568 return[area,unit];},getArea:function(geometry,units){var area,geomUnits;if(this.geodesic){area=geometry.getGeodesicArea(this.map.getProjectionObject());geomUnits="m";}else{area=geometry.getArea();geomUnits=this.map.getUnits();}
60569 var inPerDisplayUnit=OpenLayers.INCHES_PER_UNIT[units];if(inPerDisplayUnit){var inPerMapUnit=OpenLayers.INCHES_PER_UNIT[geomUnits];area*=Math.pow((inPerMapUnit/inPerDisplayUnit),2);}
60570 return area;},getBestLength:function(geometry){var units=this.displaySystemUnits[this.displaySystem];var unit,length;for(var i=0,len=units.length;i<len;++i){unit=units[i];length=this.getLength(geometry,unit);if(length>1){break;}}
60571 return[length,unit];},getLength:function(geometry,units){var length,geomUnits;if(this.geodesic){length=geometry.getGeodesicLength(this.map.getProjectionObject());geomUnits="m";}else{length=geometry.getLength();geomUnits=this.map.getUnits();}
60572 var inPerDisplayUnit=OpenLayers.INCHES_PER_UNIT[units];if(inPerDisplayUnit){var inPerMapUnit=OpenLayers.INCHES_PER_UNIT[geomUnits];length*=(inPerMapUnit/inPerDisplayUnit);}
60573 return length;},CLASS_NAME:"OpenLayers.Control.Measure"});OpenLayers.Control.ZoomBox=OpenLayers.Class(OpenLayers.Control,{type:OpenLayers.Control.TYPE_TOOL,out:false,alwaysZoom:false,draw:function(){this.handler=new OpenLayers.Handler.Box(this,{done:this.zoomBox},{keyMask:this.keyMask});},zoomBox:function(position){if(position instanceof OpenLayers.Bounds){var bounds;if(!this.out){var minXY=this.map.getLonLatFromPixel(new OpenLayers.Pixel(position.left,position.bottom));var maxXY=this.map.getLonLatFromPixel(new OpenLayers.Pixel(position.right,position.top));bounds=new OpenLayers.Bounds(minXY.lon,minXY.lat,maxXY.lon,maxXY.lat);}else{var pixWidth=Math.abs(position.right-position.left);var pixHeight=Math.abs(position.top-position.bottom);var zoomFactor=Math.min((this.map.size.h/pixHeight),(this.map.size.w/pixWidth));var extent=this.map.getExtent();var center=this.map.getLonLatFromPixel(position.getCenterPixel());var xmin=center.lon-(extent.getWidth()/2)*zoomFactor;var xmax=center.lon+(extent.getWidth()/2)*zoomFactor;var ymin=center.lat-(extent.getHeight()/2)*zoomFactor;var ymax=center.lat+(extent.getHeight()/2)*zoomFactor;bounds=new OpenLayers.Bounds(xmin,ymin,xmax,ymax);}
60574 var lastZoom=this.map.getZoom();this.map.zoomToExtent(bounds);if(lastZoom==this.map.getZoom()&&this.alwaysZoom==true){this.map.zoomTo(lastZoom+(this.out?-1:1));}}else{if(!this.out){this.map.setCenter(this.map.getLonLatFromPixel(position),this.map.getZoom()+1);}else{this.map.setCenter(this.map.getLonLatFromPixel(position),this.map.getZoom()-1);}}},CLASS_NAME:"OpenLayers.Control.ZoomBox"});OpenLayers.Format.WFSCapabilities.v1_0_0=OpenLayers.Class(OpenLayers.Format.WFSCapabilities.v1,{initialize:function(options){OpenLayers.Format.WFSCapabilities.v1.prototype.initialize.apply(this,[options]);},read_cap_Service:function(capabilities,node){var service={};this.runChildNodes(service,node);capabilities.service=service;},read_cap_Fees:function(service,node){var fees=this.getChildValue(node);if(fees&&fees.toLowerCase()!="none"){service.fees=fees;}},read_cap_AccessConstraints:function(service,node){var constraints=this.getChildValue(node);if(constraints&&constraints.toLowerCase()!="none"){service.accessConstraints=constraints;}},read_cap_OnlineResource:function(service,node){var onlineResource=this.getChildValue(node);if(onlineResource&&onlineResource.toLowerCase()!="none"){service.onlineResource=onlineResource;}},read_cap_Keywords:function(service,node){var keywords=this.getChildValue(node);if(keywords&&keywords.toLowerCase()!="none"){service.keywords=keywords.split(', ');}},read_cap_Capability:function(capabilities,node){var capability={};this.runChildNodes(capability,node);capabilities.capability=capability;},read_cap_Request:function(obj,node){var request={};this.runChildNodes(request,node);obj.request=request;},read_cap_GetFeature:function(request,node){var getfeature={href:{},formats:[]};this.runChildNodes(getfeature,node);request.getfeature=getfeature;},read_cap_ResultFormat:function(obj,node){var children=node.childNodes;var childNode;for(var i=0;i<children.length;i++){childNode=children[i];if(childNode.nodeType==1){obj.formats.push(childNode.nodeName);}}},read_cap_DCPType:function(obj,node){this.runChildNodes(obj,node);},read_cap_HTTP:function(obj,node){this.runChildNodes(obj.href,node);},read_cap_Get:function(obj,node){obj.get=node.getAttribute("onlineResource");},read_cap_Post:function(obj,node){obj.post=node.getAttribute("onlineResource");},CLASS_NAME:"OpenLayers.Format.WFSCapabilities.v1_0_0"});OpenLayers.Format.WFSCapabilities.v1_1_0=OpenLayers.Class(OpenLayers.Format.WFSCapabilities.v1,{initialize:function(options){OpenLayers.Format.WFSCapabilities.v1.prototype.initialize.apply(this,[options]);},CLASS_NAME:"OpenLayers.Format.WFSCapabilities.v1_1_0"});OpenLayers.Format.WKT=OpenLayers.Class(OpenLayers.Format,{initialize:function(options){this.regExes={'typeStr':/^\s*(\w+)\s*\(\s*(.*)\s*\)\s*$/,'spaces':/\s+/,'parenComma':/\)\s*,\s*\(/,'doubleParenComma':/\)\s*\)\s*,\s*\(\s*\(/,'trimParens':/^\s*\(?(.*?)\)?\s*$/};OpenLayers.Format.prototype.initialize.apply(this,[options]);},read:function(wkt){var features,type,str;var matches=this.regExes.typeStr.exec(wkt);if(matches){type=matches[1].toLowerCase();str=matches[2];if(this.parse[type]){features=this.parse[type].apply(this,[str]);}
60575 if(this.internalProjection&&this.externalProjection){if(features&&features.CLASS_NAME=="OpenLayers.Feature.Vector"){features.geometry.transform(this.externalProjection,this.internalProjection);}else if(features&&type!="geometrycollection"&&typeof features=="object"){for(var i=0,len=features.length;i<len;i++){var component=features[i];component.geometry.transform(this.externalProjection,this.internalProjection);}}}}
60576 return features;},write:function(features){var collection,geometry,type,data,isCollection;if(features.constructor==Array){collection=features;isCollection=true;}else{collection=[features];isCollection=false;}
60577 var pieces=[];if(isCollection){pieces.push('GEOMETRYCOLLECTION(');}
60578 for(var i=0,len=collection.length;i<len;++i){if(isCollection&&i>0){pieces.push(',');}
60579 geometry=collection[i].geometry;type=geometry.CLASS_NAME.split('.')[2].toLowerCase();if(!this.extract[type]){return null;}
60580 if(this.internalProjection&&this.externalProjection){geometry=geometry.clone();geometry.transform(this.internalProjection,this.externalProjection);}
60581 data=this.extract[type].apply(this,[geometry]);pieces.push(type.toUpperCase()+'('+data+')');}
60582 if(isCollection){pieces.push(')');}
60583 return pieces.join('');},extract:{'point':function(point){return point.x+' '+point.y;},'multipoint':function(multipoint){var array=[];for(var i=0,len=multipoint.components.length;i<len;++i){array.push('('+
60584 this.extract.point.apply(this,[multipoint.components[i]])+')');}
60585 return array.join(',');},'linestring':function(linestring){var array=[];for(var i=0,len=linestring.components.length;i<len;++i){array.push(this.extract.point.apply(this,[linestring.components[i]]));}
60586 return array.join(',');},'multilinestring':function(multilinestring){var array=[];for(var i=0,len=multilinestring.components.length;i<len;++i){array.push('('+
60587 this.extract.linestring.apply(this,[multilinestring.components[i]])+')');}
60588 return array.join(',');},'polygon':function(polygon){var array=[];for(var i=0,len=polygon.components.length;i<len;++i){array.push('('+
60589 this.extract.linestring.apply(this,[polygon.components[i]])+')');}
60590 return array.join(',');},'multipolygon':function(multipolygon){var array=[];for(var i=0,len=multipolygon.components.length;i<len;++i){array.push('('+
60591 this.extract.polygon.apply(this,[multipolygon.components[i]])+')');}
60592 return array.join(',');}},parse:{'point':function(str){var coords=OpenLayers.String.trim(str).split(this.regExes.spaces);return new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(coords[0],coords[1]));},'multipoint':function(str){var point;var points=OpenLayers.String.trim(str).split(this.regExes.parenComma);var components=[];for(var i=0,len=points.length;i<len;++i){point=points[i].replace(this.regExes.trimParens,'$1');components.push(this.parse.point.apply(this,[point]).geometry);}
60593 return new OpenLayers.Feature.Vector(new OpenLayers.Geometry.MultiPoint(components));},'linestring':function(str){var points=OpenLayers.String.trim(str).split(',');var components=[];for(var i=0,len=points.length;i<len;++i){components.push(this.parse.point.apply(this,[points[i]]).geometry);}
60594 return new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LineString(components));},'multilinestring':function(str){var line;var lines=OpenLayers.String.trim(str).split(this.regExes.parenComma);var components=[];for(var i=0,len=lines.length;i<len;++i){line=lines[i].replace(this.regExes.trimParens,'$1');components.push(this.parse.linestring.apply(this,[line]).geometry);}
60595 return new OpenLayers.Feature.Vector(new OpenLayers.Geometry.MultiLineString(components));},'polygon':function(str){var ring,linestring,linearring;var rings=OpenLayers.String.trim(str).split(this.regExes.parenComma);var components=[];for(var i=0,len=rings.length;i<len;++i){ring=rings[i].replace(this.regExes.trimParens,'$1');linestring=this.parse.linestring.apply(this,[ring]).geometry;linearring=new OpenLayers.Geometry.LinearRing(linestring.components);components.push(linearring);}
60596 return new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Polygon(components));},'multipolygon':function(str){var polygon;var polygons=OpenLayers.String.trim(str).split(this.regExes.doubleParenComma);var components=[];for(var i=0,len=polygons.length;i<len;++i){polygon=polygons[i].replace(this.regExes.trimParens,'$1');components.push(this.parse.polygon.apply(this,[polygon]).geometry);}
60597 return new OpenLayers.Feature.Vector(new OpenLayers.Geometry.MultiPolygon(components));},'geometrycollection':function(str){str=str.replace(/,\s*([A-Za-z])/g,'|$1');var wktArray=OpenLayers.String.trim(str).split('|');var components=[];for(var i=0,len=wktArray.length;i<len;++i){components.push(OpenLayers.Format.WKT.prototype.read.apply(this,[wktArray[i]]));}
60598 return components;}},CLASS_NAME:"OpenLayers.Format.WKT"});OpenLayers.Format.WMC.v1=OpenLayers.Class(OpenLayers.Format.XML,{namespaces:{ol:"http://openlayers.org/context",wmc:"http://www.opengis.net/context",sld:"http://www.opengis.net/sld",xlink:"http://www.w3.org/1999/xlink",xsi:"http://www.w3.org/2001/XMLSchema-instance"},schemaLocation:"",getNamespacePrefix:function(uri){var prefix=null;if(uri==null){prefix=this.namespaces[this.defaultPrefix];}else{for(prefix in this.namespaces){if(this.namespaces[prefix]==uri){break;}}}
60599 return prefix;},defaultPrefix:"wmc",rootPrefix:null,defaultStyleName:"",defaultStyleTitle:"Default",initialize:function(options){OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);},read:function(data){if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);}
60600 var root=data.documentElement;this.rootPrefix=root.prefix;var context={version:root.getAttribute("version")};this.runChildNodes(context,root);return context;},runChildNodes:function(obj,node){var children=node.childNodes;var childNode,processor,prefix,local;for(var i=0,len=children.length;i<len;++i){childNode=children[i];if(childNode.nodeType==1){prefix=this.getNamespacePrefix(childNode.namespaceURI);local=childNode.nodeName.split(":").pop();processor=this["read_"+prefix+"_"+local];if(processor){processor.apply(this,[obj,childNode]);}}}},read_wmc_General:function(context,node){this.runChildNodes(context,node);},read_wmc_BoundingBox:function(context,node){context.projection=node.getAttribute("SRS");context.bounds=new OpenLayers.Bounds(parseFloat(node.getAttribute("minx")),parseFloat(node.getAttribute("miny")),parseFloat(node.getAttribute("maxx")),parseFloat(node.getAttribute("maxy")));},read_wmc_LayerList:function(context,node){context.layersContext=[];this.runChildNodes(context,node);},read_wmc_Layer:function(context,node){var layerContext={visibility:(node.getAttribute("hidden")!="1"),queryable:(node.getAttribute("queryable")=="1"),formats:[],styles:[]};this.runChildNodes(layerContext,node);context.layersContext.push(layerContext);},read_wmc_Extension:function(obj,node){this.runChildNodes(obj,node);},read_ol_units:function(layerContext,node){layerContext.units=this.getChildValue(node);},read_ol_maxExtent:function(obj,node){var bounds=new OpenLayers.Bounds(node.getAttribute("minx"),node.getAttribute("miny"),node.getAttribute("maxx"),node.getAttribute("maxy"));obj.maxExtent=bounds;},read_ol_transparent:function(layerContext,node){layerContext.transparent=this.getChildValue(node);},read_ol_numZoomLevels:function(layerContext,node){layerContext.numZoomLevels=parseInt(this.getChildValue(node));},read_ol_opacity:function(layerContext,node){layerContext.opacity=parseFloat(this.getChildValue(node));},read_ol_singleTile:function(layerContext,node){layerContext.singleTile=(this.getChildValue(node)=="true");},read_ol_tileSize:function(layerContext,node){var obj={"width":node.getAttribute("width"),"height":node.getAttribute("height")};layerContext.tileSize=obj;},read_ol_isBaseLayer:function(layerContext,node){layerContext.isBaseLayer=(this.getChildValue(node)=="true");},read_ol_displayInLayerSwitcher:function(layerContext,node){layerContext.displayInLayerSwitcher=(this.getChildValue(node)=="true");},read_wmc_Server:function(layerContext,node){layerContext.version=node.getAttribute("version");var server={};var links=node.getElementsByTagName("OnlineResource");if(links.length>0){this.read_wmc_OnlineResource(server,links[0]);}
60601 layerContext.url=server.href;},read_wmc_FormatList:function(layerContext,node){this.runChildNodes(layerContext,node);},read_wmc_Format:function(layerContext,node){var format={value:this.getChildValue(node)};if(node.getAttribute("current")=="1"){format.current=true;}
60602 layerContext.formats.push(format);},read_wmc_StyleList:function(layerContext,node){this.runChildNodes(layerContext,node);},read_wmc_Style:function(layerContext,node){var style={};this.runChildNodes(style,node);if(node.getAttribute("current")=="1"){style.current=true;}
60603 layerContext.styles.push(style);},read_wmc_SLD:function(style,node){this.runChildNodes(style,node);},read_sld_StyledLayerDescriptor:function(sld,node){var xml=OpenLayers.Format.XML.prototype.write.apply(this,[node]);sld.body=xml;},read_wmc_OnlineResource:function(obj,node){obj.href=this.getAttributeNS(node,this.namespaces.xlink,"href");},read_wmc_Name:function(obj,node){var name=this.getChildValue(node);if(name){obj.name=name;}},read_wmc_Title:function(obj,node){var title=this.getChildValue(node);if(title){obj.title=title;}},read_wmc_MetadataURL:function(layerContext,node){var metadataURL={};var links=node.getElementsByTagName("OnlineResource");if(links.length>0){this.read_wmc_OnlineResource(metadataURL,links[0]);}
60604 layerContext.metadataURL=metadataURL.href;},read_wmc_Abstract:function(obj,node){var abst=this.getChildValue(node);if(abst){obj["abstract"]=abst;}},read_wmc_LegendURL:function(style,node){var legend={width:node.getAttribute('width'),height:node.getAttribute('height')};var links=node.getElementsByTagName("OnlineResource");if(links.length>0){this.read_wmc_OnlineResource(legend,links[0]);}
60605 style.legend=legend;},write:function(context,options){var root=this.createElementDefaultNS("ViewContext");this.setAttributes(root,{version:this.VERSION,id:(options&&typeof options.id=="string")?options.id:OpenLayers.Util.createUniqueID("OpenLayers_Context_")});this.setAttributeNS(root,this.namespaces.xsi,"xsi:schemaLocation",this.schemaLocation);root.appendChild(this.write_wmc_General(context));root.appendChild(this.write_wmc_LayerList(context));return OpenLayers.Format.XML.prototype.write.apply(this,[root]);},createElementDefaultNS:function(name,childValue,attributes){var node=this.createElementNS(this.namespaces[this.defaultPrefix],name);if(childValue){node.appendChild(this.createTextNode(childValue));}
60606 if(attributes){this.setAttributes(node,attributes);}
60607 return node;},setAttributes:function(node,obj){var value;for(var name in obj){value=obj[name].toString();if(value.match(/[A-Z]/)){this.setAttributeNS(node,null,name,value);}else{node.setAttribute(name,value);}}},write_wmc_General:function(context){var node=this.createElementDefaultNS("General");if(context.size){node.appendChild(this.createElementDefaultNS("Window",null,{width:context.size.w,height:context.size.h}));}
60608 var bounds=context.bounds;node.appendChild(this.createElementDefaultNS("BoundingBox",null,{minx:bounds.left.toPrecision(18),miny:bounds.bottom.toPrecision(18),maxx:bounds.right.toPrecision(18),maxy:bounds.top.toPrecision(18),SRS:context.projection}));node.appendChild(this.createElementDefaultNS("Title",context.title));node.appendChild(this.write_ol_MapExtension(context));return node;},write_ol_MapExtension:function(context){var node=this.createElementDefaultNS("Extension");var bounds=context.maxExtent;if(bounds){var maxExtent=this.createElementNS(this.namespaces.ol,"ol:maxExtent");this.setAttributes(maxExtent,{minx:bounds.left.toPrecision(18),miny:bounds.bottom.toPrecision(18),maxx:bounds.right.toPrecision(18),maxy:bounds.top.toPrecision(18)});node.appendChild(maxExtent);}
60609 return node;},write_wmc_LayerList:function(context){var list=this.createElementDefaultNS("LayerList");for(var i=0,len=context.layersContext.length;i<len;++i){list.appendChild(this.write_wmc_Layer(context.layersContext[i]));}
60610 return list;},write_wmc_Layer:function(context){var node=this.createElementDefaultNS("Layer",null,{queryable:context.queryable?"1":"0",hidden:context.visibility?"0":"1"});node.appendChild(this.write_wmc_Server(context));node.appendChild(this.createElementDefaultNS("Name",context.name));node.appendChild(this.createElementDefaultNS("Title",context.title));if(context.metadataURL){node.appendChild(this.write_wmc_MetadataURL(context.metadataURL));}
60611 return node;},write_wmc_LayerExtension:function(context){var node=this.createElementDefaultNS("Extension");var bounds=context.maxExtent;var maxExtent=this.createElementNS(this.namespaces.ol,"ol:maxExtent");this.setAttributes(maxExtent,{minx:bounds.left.toPrecision(18),miny:bounds.bottom.toPrecision(18),maxx:bounds.right.toPrecision(18),maxy:bounds.top.toPrecision(18)});node.appendChild(maxExtent);if(context.tileSize&&!context.singleTile){var size=this.createElementNS(this.namespaces.ol,"ol:tileSize");this.setAttributes(size,context.tileSize);node.appendChild(size);}
60612 var properties=["transparent","numZoomLevels","units","isBaseLayer","opacity","displayInLayerSwitcher","singleTile"];var child;for(var i=0,len=properties.length;i<len;++i){child=this.createOLPropertyNode(context,properties[i]);if(child){node.appendChild(child);}}
60613 return node;},createOLPropertyNode:function(obj,prop){var node=null;if(obj[prop]!=null){node=this.createElementNS(this.namespaces.ol,"ol:"+prop);node.appendChild(this.createTextNode(obj[prop].toString()));}
60614 return node;},write_wmc_Server:function(context){var node=this.createElementDefaultNS("Server");this.setAttributes(node,{service:"OGC:WMS",version:context.version});node.appendChild(this.write_wmc_OnlineResource(context.url));return node;},write_wmc_MetadataURL:function(metadataURL){var node=this.createElementDefaultNS("MetadataURL");node.appendChild(this.write_wmc_OnlineResource(metadataURL));return node;},write_wmc_FormatList:function(context){var node=this.createElementDefaultNS("FormatList");for(var i=0,len=context.formats.length;i<len;i++){var format=context.formats[i];node.appendChild(this.createElementDefaultNS("Format",format.value,(format.current&&format.current==true)?{current:"1"}:null));}
60615 return node;},write_wmc_StyleList:function(layer){var node=this.createElementDefaultNS("StyleList");var styles=layer.styles;if(styles&&styles instanceof Array){var sld;for(var i=0,len=styles.length;i<len;i++){var s=styles[i];var style=this.createElementDefaultNS("Style",null,(s.current&&s.current==true)?{current:"1"}:null);if(s.href){sld=this.createElementDefaultNS("SLD");var link=this.write_wmc_OnlineResource(s.href);sld.appendChild(link);sld.appendChild(this.createElementDefaultNS("Name",s.name));if(s.title){sld.appendChild(this.createElementDefaultNS("Title",s.title));}
60616 style.appendChild(sld);}else if(s.body){sld=this.createElementDefaultNS("SLD");var doc=OpenLayers.Format.XML.prototype.read.apply(this,[s.body]);var imported=doc.documentElement;if(sld.ownerDocument&&sld.ownerDocument.importNode){imported=sld.ownerDocument.importNode(imported,true);}
60617 sld.appendChild(imported);sld.appendChild(this.createElementDefaultNS("Name",s.name));if(s.title){sld.appendChild(this.createElementDefaultNS("Title",s.title));}
60618 style.appendChild(sld);}else{style.appendChild(this.createElementDefaultNS("Name",s.name));style.appendChild(this.createElementDefaultNS("Title",s.title));if(s['abstract']){style.appendChild(this.createElementDefaultNS("Abstract",s['abstract']));}}
60619 node.appendChild(style);}}
60620 return node;},write_wmc_OnlineResource:function(href){var node=this.createElementDefaultNS("OnlineResource");this.setAttributeNS(node,this.namespaces.xlink,"xlink:type","simple");this.setAttributeNS(node,this.namespaces.xlink,"xlink:href",href);return node;},CLASS_NAME:"OpenLayers.Format.WMC.v1"});OpenLayers.Format.WMSCapabilities.v1_1=OpenLayers.Class(OpenLayers.Format.WMSCapabilities.v1,{readers:{"wms":OpenLayers.Util.applyDefaults({"WMT_MS_Capabilities":function(node,obj){this.readChildNodes(node,obj);},"Keyword":function(node,obj){if(obj.keywords){obj.keywords.push(this.getChildValue(node));}},"DescribeLayer":function(node,obj){obj.describelayer={formats:[]};this.readChildNodes(node,obj.describelayer);},"GetLegendGraphic":function(node,obj){obj.getlegendgraphic={formats:[]};this.readChildNodes(node,obj.getlegendgraphic);},"GetStyles":function(node,obj){obj.getstyles={formats:[]};this.readChildNodes(node,obj.getstyles);},"PutStyles":function(node,obj){obj.putstyles={formats:[]};this.readChildNodes(node,obj.putstyles);},"UserDefinedSymbolization":function(node,obj){var userSymbols={supportSLD:parseInt(node.getAttribute("SupportSLD"))==1,userLayer:parseInt(node.getAttribute("UserLayer"))==1,userStyle:parseInt(node.getAttribute("UserStyle"))==1,remoteWFS:parseInt(node.getAttribute("RemoteWFS"))==1};obj.userSymbols=userSymbols;},"LatLonBoundingBox":function(node,obj){obj.llbbox=[parseFloat(node.getAttribute("minx")),parseFloat(node.getAttribute("miny")),parseFloat(node.getAttribute("maxx")),parseFloat(node.getAttribute("maxy"))];},"BoundingBox":function(node,obj){var bbox=OpenLayers.Format.WMSCapabilities.v1.prototype.readers["wms"].BoundingBox.apply(this,[node,obj]);bbox.srs=node.getAttribute("SRS");obj.bbox[bbox.srs]=bbox;},"ScaleHint":function(node,obj){var min=node.getAttribute("min");var max=node.getAttribute("max");var rad2=Math.pow(2,0.5);var ipm=OpenLayers.INCHES_PER_UNIT["m"];obj.maxScale=parseFloat(((min/rad2)*ipm*OpenLayers.DOTS_PER_INCH).toPrecision(13));obj.minScale=parseFloat(((max/rad2)*ipm*OpenLayers.DOTS_PER_INCH).toPrecision(13));},"Dimension":function(node,obj){var name=node.getAttribute("name").toLowerCase();var dim={name:name,units:node.getAttribute("units"),unitsymbol:node.getAttribute("unitSymbol")};obj.dimensions[dim.name]=dim;},"Extent":function(node,obj){var name=node.getAttribute("name").toLowerCase();if(name in obj["dimensions"]){var extent=obj.dimensions[name];extent.nearestVal=node.getAttribute("nearestValue")==="1";extent.multipleVal=node.getAttribute("multipleValues")==="1";extent.current=node.getAttribute("current")==="1";extent["default"]=node.getAttribute("default")||"";var values=this.getChildValue(node);extent.values=values.split(",");}}},OpenLayers.Format.WMSCapabilities.v1.prototype.readers["wms"])},CLASS_NAME:"OpenLayers.Format.WMSCapabilities.v1_1"});OpenLayers.Format.WMSCapabilities.v1_3=OpenLayers.Class(OpenLayers.Format.WMSCapabilities.v1,{readers:{"wms":OpenLayers.Util.applyDefaults({"WMS_Capabilities":function(node,obj){this.readChildNodes(node,obj);},"LayerLimit":function(node,obj){obj.layerLimit=parseInt(this.getChildValue(node));},"MaxWidth":function(node,obj){obj.maxWidth=parseInt(this.getChildValue(node));},"MaxHeight":function(node,obj){obj.maxHeight=parseInt(this.getChildValue(node));},"BoundingBox":function(node,obj){var bbox=OpenLayers.Format.WMSCapabilities.v1.prototype.readers["wms"].BoundingBox.apply(this,[node,obj]);bbox.srs=node.getAttribute("CRS");obj.bbox[bbox.srs]=bbox;},"CRS":function(node,obj){this.readers.wms.SRS.apply(this,[node,obj]);},"EX_GeographicBoundingBox":function(node,obj){obj.llbbox=[];this.readChildNodes(node,obj.llbbox);},"westBoundLongitude":function(node,obj){obj[0]=this.getChildValue(node);},"eastBoundLongitude":function(node,obj){obj[2]=this.getChildValue(node);},"southBoundLatitude":function(node,obj){obj[1]=this.getChildValue(node);},"northBoundLatitude":function(node,obj){obj[3]=this.getChildValue(node);},"MinScaleDenominator":function(node,obj){obj.maxScale=parseFloat(this.getChildValue(node)).toPrecision(16);},"MaxScaleDenominator":function(node,obj){obj.minScale=parseFloat(this.getChildValue(node)).toPrecision(16);},"Dimension":function(node,obj){var name=node.getAttribute("name").toLowerCase();var dim={name:name,units:node.getAttribute("units"),unitsymbol:node.getAttribute("unitSymbol"),nearestVal:node.getAttribute("nearestValue")==="1",multipleVal:node.getAttribute("multipleValues")==="1","default":node.getAttribute("default")||"",current:node.getAttribute("current")==="1",values:this.getChildValue(node).split(",")};obj.dimensions[dim.name]=dim;},"Keyword":function(node,obj){var keyword={value:this.getChildValue(node),vocabulary:node.getAttribute("vocabulary")};if(obj.keywords){obj.keywords.push(keyword);}}},OpenLayers.Format.WMSCapabilities.v1.prototype.readers["wms"]),"sld":{"UserDefinedSymbolization":function(node,obj){this.readers.wms.UserDefinedSymbolization.apply(this,[node,obj]);obj.userSymbols.inlineFeature=parseInt(node.getAttribute("InlineFeature"))==1;obj.userSymbols.remoteWCS=parseInt(node.getAttribute("RemoteWCS"))==1;},"DescribeLayer":function(node,obj){this.readers.wms.DescribeLayer.apply(this,[node,obj]);},"GetLegendGraphic":function(node,obj){this.readers.wms.GetLegendGraphic.apply(this,[node,obj]);}}},CLASS_NAME:"OpenLayers.Format.WMSCapabilities.v1_3"});OpenLayers.Format.WMTSCapabilities.v1_0_0=OpenLayers.Class(OpenLayers.Format.OWSCommon.v1_1_0,{version:"1.0.0",namespaces:{ows:"http://www.opengis.net/ows/1.1",wmts:"http://www.opengis.net/wmts/1.0",xlink:"http://www.w3.org/1999/xlink"},yx:null,defaultPrefix:"wmts",initialize:function(options){OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);this.options=options;var yx=OpenLayers.Util.extend({},OpenLayers.Format.WMTSCapabilities.prototype.yx);this.yx=OpenLayers.Util.extend(yx,this.yx);},read:function(data){if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);}
60621 if(data&&data.nodeType==9){data=data.documentElement;}
60622 var capabilities={};this.readNode(data,capabilities);capabilities.version=this.version;return capabilities;},readers:{"wmts":{"Capabilities":function(node,obj){this.readChildNodes(node,obj);},"Contents":function(node,obj){obj.contents={};obj.contents.layers=[];obj.contents.tileMatrixSets={};this.readChildNodes(node,obj.contents);},"Layer":function(node,obj){var layer={styles:[],formats:[],tileMatrixSetLinks:[]};layer.layers=[];this.readChildNodes(node,layer);obj.layers.push(layer);},"Style":function(node,obj){var style={};style.isDefault=(node.getAttribute("isDefault")==="true");this.readChildNodes(node,style);obj.styles.push(style);},"Format":function(node,obj){obj.formats.push(this.getChildValue(node));},"TileMatrixSetLink":function(node,obj){var tileMatrixSetLink={};this.readChildNodes(node,tileMatrixSetLink);obj.tileMatrixSetLinks.push(tileMatrixSetLink);},"TileMatrixSet":function(node,obj){if(obj.layers){var tileMatrixSet={matrixIds:[]};this.readChildNodes(node,tileMatrixSet);obj.tileMatrixSets[tileMatrixSet.identifier]=tileMatrixSet;}else{obj.tileMatrixSet=this.getChildValue(node);}},"TileMatrix":function(node,obj){var tileMatrix={supportedCRS:obj.supportedCRS};this.readChildNodes(node,tileMatrix);obj.matrixIds.push(tileMatrix);},"ScaleDenominator":function(node,obj){obj.scaleDenominator=parseFloat(this.getChildValue(node));},"TopLeftCorner":function(node,obj){var topLeftCorner=this.getChildValue(node);var coords=topLeftCorner.split(" ");var yx;if(obj.supportedCRS){var crs=obj.supportedCRS.replace(/urn:ogc:def:crs:(\w+):.+:(\w+)$/,"urn:ogc:def:crs:$1::$2");yx=!!this.yx[crs];}
60623 if(yx){obj.topLeftCorner=new OpenLayers.LonLat(coords[1],coords[0]);}else{obj.topLeftCorner=new OpenLayers.LonLat(coords[0],coords[1]);}},"TileWidth":function(node,obj){obj.tileWidth=parseInt(this.getChildValue(node));},"TileHeight":function(node,obj){obj.tileHeight=parseInt(this.getChildValue(node));},"MatrixWidth":function(node,obj){obj.matrixWidth=parseInt(this.getChildValue(node));},"MatrixHeight":function(node,obj){obj.matrixHeight=parseInt(this.getChildValue(node));},"WSDL":function(node,obj){obj.wsdl={};obj.wsdl.href=node.getAttribute("xlink:href");},"ServiceMetadataURL":function(node,obj){obj.serviceMetadataUrl={};obj.serviceMetadataUrl.href=node.getAttribute("xlink:href");}},"ows":OpenLayers.Format.OWSCommon.v1_1_0.prototype.readers["ows"]},CLASS_NAME:"OpenLayers.Format.WMTSCapabilities.v1_0_0"});OpenLayers.Layer.Boxes=OpenLayers.Class(OpenLayers.Layer.Markers,{initialize:function(name,options){OpenLayers.Layer.Markers.prototype.initialize.apply(this,arguments);},drawMarker:function(marker){var bounds=marker.bounds;var topleft=this.map.getLayerPxFromLonLat(new OpenLayers.LonLat(bounds.left,bounds.top));var botright=this.map.getLayerPxFromLonLat(new OpenLayers.LonLat(bounds.right,bounds.bottom));if(botright==null||topleft==null){marker.display(false);}else{var sz=new OpenLayers.Size(Math.max(1,botright.x-topleft.x),Math.max(1,botright.y-topleft.y));var markerDiv=marker.draw(topleft,sz);if(!marker.drawn){this.div.appendChild(markerDiv);marker.drawn=true;}}},removeMarker:function(marker){OpenLayers.Util.removeItem(this.markers,marker);if((marker.div!=null)&&(marker.div.parentNode==this.div)){this.div.removeChild(marker.div);}},CLASS_NAME:"OpenLayers.Layer.Boxes"});OpenLayers.Layer.GeoRSS=OpenLayers.Class(OpenLayers.Layer.Markers,{location:null,features:null,formatOptions:null,selectedFeature:null,icon:null,popupSize:null,useFeedTitle:true,initialize:function(name,location,options){OpenLayers.Layer.Markers.prototype.initialize.apply(this,[name,options]);this.location=location;this.features=[];},destroy:function(){OpenLayers.Layer.Markers.prototype.destroy.apply(this,arguments);this.clearFeatures();this.features=null;},loadRSS:function(){if(!this.loaded){this.events.triggerEvent("loadstart");OpenLayers.Request.GET({url:this.location,success:this.parseData,scope:this});this.loaded=true;}},moveTo:function(bounds,zoomChanged,minor){OpenLayers.Layer.Markers.prototype.moveTo.apply(this,arguments);if(this.visibility&&!this.loaded){this.loadRSS();}},parseData:function(ajaxRequest){var doc=ajaxRequest.responseXML;if(!doc||!doc.documentElement){doc=OpenLayers.Format.XML.prototype.read(ajaxRequest.responseText);}
60624 if(this.useFeedTitle){var name=null;try{name=doc.getElementsByTagNameNS('*','title')[0].firstChild.nodeValue;}
60625 catch(e){name=doc.getElementsByTagName('title')[0].firstChild.nodeValue;}
60626 if(name){this.setName(name);}}
60627 var options={};OpenLayers.Util.extend(options,this.formatOptions);if(this.map&&!this.projection.equals(this.map.getProjectionObject())){options.externalProjection=this.projection;options.internalProjection=this.map.getProjectionObject();}
60628 var format=new OpenLayers.Format.GeoRSS(options);var features=format.read(doc);for(var i=0,len=features.length;i<len;i++){var data={};var feature=features[i];if(!feature.geometry){continue;}
60629 var title=feature.attributes.title?feature.attributes.title:"Untitled";var description=feature.attributes.description?feature.attributes.description:"No description.";var link=feature.attributes.link?feature.attributes.link:"";var location=feature.geometry.getBounds().getCenterLonLat();data.icon=this.icon==null?OpenLayers.Marker.defaultIcon():this.icon.clone();data.popupSize=this.popupSize?this.popupSize.clone():new OpenLayers.Size(250,120);if(title||description){data.title=title;data.description=description;var contentHTML='<div class="olLayerGeoRSSClose">[x]</div>';contentHTML+='<div class="olLayerGeoRSSTitle">';if(link){contentHTML+='<a class="link" href="'+link+'" target="_blank">';}
60630 contentHTML+=title;if(link){contentHTML+='</a>';}
60631 contentHTML+='</div>';contentHTML+='<div style="" class="olLayerGeoRSSDescription">';contentHTML+=description;contentHTML+='</div>';data['popupContentHTML']=contentHTML;}
60632 var feature=new OpenLayers.Feature(this,location,data);this.features.push(feature);var marker=feature.createMarker();marker.events.register('click',feature,this.markerClick);this.addMarker(marker);}
60633 this.events.triggerEvent("loadend");},markerClick:function(evt){var sameMarkerClicked=(this==this.layer.selectedFeature);this.layer.selectedFeature=(!sameMarkerClicked)?this:null;for(var i=0,len=this.layer.map.popups.length;i<len;i++){this.layer.map.removePopup(this.layer.map.popups[i]);}
60634 if(!sameMarkerClicked){var popup=this.createPopup();OpenLayers.Event.observe(popup.div,"click",OpenLayers.Function.bind(function(){for(var i=0,len=this.layer.map.popups.length;i<len;i++){this.layer.map.removePopup(this.layer.map.popups[i]);}},this));this.layer.map.addPopup(popup);}
60635 OpenLayers.Event.stop(evt);},clearFeatures:function(){if(this.features!=null){while(this.features.length>0){var feature=this.features[0];OpenLayers.Util.removeItem(this.features,feature);feature.destroy();}}},CLASS_NAME:"OpenLayers.Layer.GeoRSS"});OpenLayers.Layer.Google=OpenLayers.Class(OpenLayers.Layer.EventPane,OpenLayers.Layer.FixedZoomLevels,{MIN_ZOOM_LEVEL:0,MAX_ZOOM_LEVEL:21,RESOLUTIONS:[1.40625,0.703125,0.3515625,0.17578125,0.087890625,0.0439453125,0.02197265625,0.010986328125,0.0054931640625,0.00274658203125,0.001373291015625,0.0006866455078125,0.00034332275390625,0.000171661376953125,0.0000858306884765625,0.00004291534423828125,0.00002145767211914062,0.00001072883605957031,0.00000536441802978515,0.00000268220901489257,0.0000013411045074462891,0.00000067055225372314453],type:null,wrapDateLine:true,sphericalMercator:false,version:null,initialize:function(name,options){options=options||{};if(!options.version){options.version=typeof GMap2==="function"?"2":"3";}
60636 var mixin=OpenLayers.Layer.Google["v"+
60637 options.version.replace(/\./g,"_")];if(mixin){OpenLayers.Util.applyDefaults(options,mixin);}else{throw"Unsupported Google Maps API version: "+options.version;}
60638 OpenLayers.Util.applyDefaults(options,mixin.DEFAULTS);if(options.maxExtent){options.maxExtent=options.maxExtent.clone();}
60639 OpenLayers.Layer.EventPane.prototype.initialize.apply(this,[name,options]);OpenLayers.Layer.FixedZoomLevels.prototype.initialize.apply(this,[name,options]);if(this.sphericalMercator){OpenLayers.Util.extend(this,OpenLayers.Layer.SphericalMercator);this.initMercatorParameters();}},clone:function(){return new OpenLayers.Layer.Google(this.name,this.getOptions());},setVisibility:function(visible){var opacity=this.opacity==null?1:this.opacity;OpenLayers.Layer.EventPane.prototype.setVisibility.apply(this,arguments);this.setOpacity(opacity);},display:function(visible){if(!this._dragging){this.setGMapVisibility(visible);}
60640 OpenLayers.Layer.EventPane.prototype.display.apply(this,arguments);},moveTo:function(bounds,zoomChanged,dragging){this._dragging=dragging;OpenLayers.Layer.EventPane.prototype.moveTo.apply(this,arguments);delete this._dragging;},setOpacity:function(opacity){if(opacity!==this.opacity){if(this.map!=null){this.map.events.triggerEvent("changelayer",{layer:this,property:"opacity"});}
60641 this.opacity=opacity;}
60642 if(this.getVisibility()){var container=this.getMapContainer();OpenLayers.Util.modifyDOMElement(container,null,null,null,null,null,null,opacity);}},destroy:function(){if(this.map){this.setGMapVisibility(false);var cache=OpenLayers.Layer.Google.cache[this.map.id];if(cache&&cache.count<=1){this.removeGMapElements();}}
60643 OpenLayers.Layer.EventPane.prototype.destroy.apply(this,arguments);},removeGMapElements:function(){var cache=OpenLayers.Layer.Google.cache[this.map.id];if(cache){var container=this.mapObject&&this.getMapContainer();if(container&&container.parentNode){container.parentNode.removeChild(container);}
60644 var termsOfUse=cache.termsOfUse;if(termsOfUse&&termsOfUse.parentNode){termsOfUse.parentNode.removeChild(termsOfUse);}
60645 var poweredBy=cache.poweredBy;if(poweredBy&&poweredBy.parentNode){poweredBy.parentNode.removeChild(poweredBy);}}},removeMap:function(map){if(this.visibility&&this.mapObject){this.setGMapVisibility(false);}
60646 var cache=OpenLayers.Layer.Google.cache[map.id];if(cache){if(cache.count<=1){this.removeGMapElements();delete OpenLayers.Layer.Google.cache[map.id];}else{--cache.count;}}
60647 delete this.termsOfUse;delete this.poweredBy;delete this.mapObject;delete this.dragObject;OpenLayers.Layer.EventPane.prototype.removeMap.apply(this,arguments);},getOLBoundsFromMapObjectBounds:function(moBounds){var olBounds=null;if(moBounds!=null){var sw=moBounds.getSouthWest();var ne=moBounds.getNorthEast();if(this.sphericalMercator){sw=this.forwardMercator(sw.lng(),sw.lat());ne=this.forwardMercator(ne.lng(),ne.lat());}else{sw=new OpenLayers.LonLat(sw.lng(),sw.lat());ne=new OpenLayers.LonLat(ne.lng(),ne.lat());}
60648 olBounds=new OpenLayers.Bounds(sw.lon,sw.lat,ne.lon,ne.lat);}
60649 return olBounds;},getWarningHTML:function(){return OpenLayers.i18n("googleWarning");},getMapObjectCenter:function(){return this.mapObject.getCenter();},getMapObjectZoom:function(){return this.mapObject.getZoom();},getLongitudeFromMapObjectLonLat:function(moLonLat){return this.sphericalMercator?this.forwardMercator(moLonLat.lng(),moLonLat.lat()).lon:moLonLat.lng();},getLatitudeFromMapObjectLonLat:function(moLonLat){var lat=this.sphericalMercator?this.forwardMercator(moLonLat.lng(),moLonLat.lat()).lat:moLonLat.lat();return lat;},getXFromMapObjectPixel:function(moPixel){return moPixel.x;},getYFromMapObjectPixel:function(moPixel){return moPixel.y;},CLASS_NAME:"OpenLayers.Layer.Google"});OpenLayers.Layer.Google.cache={};OpenLayers.Layer.Google.v2={termsOfUse:null,poweredBy:null,dragObject:null,loadMapObject:function(){if(!this.type){this.type=G_NORMAL_MAP;}
60650 var mapObject,termsOfUse,poweredBy;var cache=OpenLayers.Layer.Google.cache[this.map.id];if(cache){mapObject=cache.mapObject;termsOfUse=cache.termsOfUse;poweredBy=cache.poweredBy;++cache.count;}else{var container=this.map.viewPortDiv;var div=document.createElement("div");div.id=this.map.id+"_GMap2Container";div.style.position="absolute";div.style.width="100%";div.style.height="100%";container.appendChild(div);try{mapObject=new GMap2(div);termsOfUse=div.lastChild;container.appendChild(termsOfUse);termsOfUse.style.zIndex="1100";termsOfUse.style.right="";termsOfUse.style.bottom="";termsOfUse.className="olLayerGoogleCopyright";poweredBy=div.lastChild;container.appendChild(poweredBy);poweredBy.style.zIndex="1100";poweredBy.style.right="";poweredBy.style.bottom="";poweredBy.className="olLayerGooglePoweredBy gmnoprint";}catch(e){throw(e);}
60651 OpenLayers.Layer.Google.cache[this.map.id]={mapObject:mapObject,termsOfUse:termsOfUse,poweredBy:poweredBy,count:1};}
60652 this.mapObject=mapObject;this.termsOfUse=termsOfUse;this.poweredBy=poweredBy;if(OpenLayers.Util.indexOf(this.mapObject.getMapTypes(),this.type)===-1){this.mapObject.addMapType(this.type);}
60653 if(typeof mapObject.getDragObject=="function"){this.dragObject=mapObject.getDragObject();}else{this.dragPanMapObject=null;}
60654 if(this.isBaseLayer===false){this.setGMapVisibility(this.div.style.display!=="none");}},onMapResize:function(){if(this.visibility&&this.mapObject.isLoaded()){this.mapObject.checkResize();}else{if(!this._resized){var layer=this;var handle=GEvent.addListener(this.mapObject,"load",function(){GEvent.removeListener(handle);delete layer._resized;layer.mapObject.checkResize();layer.moveTo(layer.map.getCenter(),layer.map.getZoom());});}
60655 this._resized=true;}},setGMapVisibility:function(visible){var cache=OpenLayers.Layer.Google.cache[this.map.id];if(cache){var container=this.mapObject.getContainer();if(visible===true){this.mapObject.setMapType(this.type);container.style.display="";this.termsOfUse.style.left="";this.termsOfUse.style.display="";this.poweredBy.style.display="";cache.displayed=this.id;}else{if(cache.displayed===this.id){delete cache.displayed;}
60656 if(!cache.displayed){container.style.display="none";this.termsOfUse.style.display="none";this.termsOfUse.style.left="-9999px";this.poweredBy.style.display="none";}}}},getMapContainer:function(){return this.mapObject.getContainer();},getMapObjectBoundsFromOLBounds:function(olBounds){var moBounds=null;if(olBounds!=null){var sw=this.sphericalMercator?this.inverseMercator(olBounds.bottom,olBounds.left):new OpenLayers.LonLat(olBounds.bottom,olBounds.left);var ne=this.sphericalMercator?this.inverseMercator(olBounds.top,olBounds.right):new OpenLayers.LonLat(olBounds.top,olBounds.right);moBounds=new GLatLngBounds(new GLatLng(sw.lat,sw.lon),new GLatLng(ne.lat,ne.lon));}
60657 return moBounds;},setMapObjectCenter:function(center,zoom){this.mapObject.setCenter(center,zoom);},dragPanMapObject:function(dX,dY){this.dragObject.moveBy(new GSize(-dX,dY));},getMapObjectLonLatFromMapObjectPixel:function(moPixel){return this.mapObject.fromContainerPixelToLatLng(moPixel);},getMapObjectPixelFromMapObjectLonLat:function(moLonLat){return this.mapObject.fromLatLngToContainerPixel(moLonLat);},getMapObjectZoomFromMapObjectBounds:function(moBounds){return this.mapObject.getBoundsZoomLevel(moBounds);},getMapObjectLonLatFromLonLat:function(lon,lat){var gLatLng;if(this.sphericalMercator){var lonlat=this.inverseMercator(lon,lat);gLatLng=new GLatLng(lonlat.lat,lonlat.lon);}else{gLatLng=new GLatLng(lat,lon);}
60658 return gLatLng;},getMapObjectPixelFromXY:function(x,y){return new GPoint(x,y);}};OpenLayers.Layer.Grid=OpenLayers.Class(OpenLayers.Layer.HTTPRequest,{tileSize:null,grid:null,singleTile:false,ratio:1.5,buffer:2,numLoadingTiles:0,initialize:function(name,url,params,options){OpenLayers.Layer.HTTPRequest.prototype.initialize.apply(this,arguments);this.events.addEventType("tileloaded");this.grid=[];},destroy:function(){this.clearGrid();this.grid=null;this.tileSize=null;OpenLayers.Layer.HTTPRequest.prototype.destroy.apply(this,arguments);},clearGrid:function(){if(this.grid){for(var iRow=0,len=this.grid.length;iRow<len;iRow++){var row=this.grid[iRow];for(var iCol=0,clen=row.length;iCol<clen;iCol++){var tile=row[iCol];this.removeTileMonitoringHooks(tile);tile.destroy();}}
60659 this.grid=[];}},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.Grid(this.name,this.url,this.params,this.getOptions());}
60660 obj=OpenLayers.Layer.HTTPRequest.prototype.clone.apply(this,[obj]);if(this.tileSize!=null){obj.tileSize=this.tileSize.clone();}
60661 obj.grid=[];return obj;},moveTo:function(bounds,zoomChanged,dragging){OpenLayers.Layer.HTTPRequest.prototype.moveTo.apply(this,arguments);bounds=bounds||this.map.getExtent();if(bounds!=null){var forceReTile=!this.grid.length||zoomChanged;var tilesBounds=this.getTilesBounds();if(this.singleTile){if(forceReTile||(!dragging&&!tilesBounds.containsBounds(bounds))){this.initSingleTile(bounds);}}else{if(forceReTile||!tilesBounds.containsBounds(bounds,true)){this.initGriddedTiles(bounds);}else{this.moveGriddedTiles(bounds);}}}},setTileSize:function(size){if(this.singleTile){size=this.map.getSize();size.h=parseInt(size.h*this.ratio);size.w=parseInt(size.w*this.ratio);}
60662 OpenLayers.Layer.HTTPRequest.prototype.setTileSize.apply(this,[size]);},getGridBounds:function(){var msg="The getGridBounds() function is deprecated. It will be "+"removed in 3.0. Please use getTilesBounds() instead.";OpenLayers.Console.warn(msg);return this.getTilesBounds();},getTilesBounds:function(){var bounds=null;if(this.grid.length){var bottom=this.grid.length-1;var bottomLeftTile=this.grid[bottom][0];var right=this.grid[0].length-1;var topRightTile=this.grid[0][right];bounds=new OpenLayers.Bounds(bottomLeftTile.bounds.left,bottomLeftTile.bounds.bottom,topRightTile.bounds.right,topRightTile.bounds.top);}
60663 return bounds;},initSingleTile:function(bounds){var center=bounds.getCenterLonLat();var tileWidth=bounds.getWidth()*this.ratio;var tileHeight=bounds.getHeight()*this.ratio;var tileBounds=new OpenLayers.Bounds(center.lon-(tileWidth/2),center.lat-(tileHeight/2),center.lon+(tileWidth/2),center.lat+(tileHeight/2));var ul=new OpenLayers.LonLat(tileBounds.left,tileBounds.top);var px=this.map.getLayerPxFromLonLat(ul);if(!this.grid.length){this.grid[0]=[];}
60664 var tile=this.grid[0][0];if(!tile){tile=this.addTile(tileBounds,px);this.addTileMonitoringHooks(tile);tile.draw();this.grid[0][0]=tile;}else{tile.moveTo(tileBounds,px);}
60665 this.removeExcessTiles(1,1);},calculateGridLayout:function(bounds,extent,resolution){var tilelon=resolution*this.tileSize.w;var tilelat=resolution*this.tileSize.h;var offsetlon=bounds.left-extent.left;var tilecol=Math.floor(offsetlon/tilelon)-this.buffer;var tilecolremain=offsetlon/tilelon-tilecol;var tileoffsetx=-tilecolremain*this.tileSize.w;var tileoffsetlon=extent.left+tilecol*tilelon;var offsetlat=bounds.top-(extent.bottom+tilelat);var tilerow=Math.ceil(offsetlat/tilelat)+this.buffer;var tilerowremain=tilerow-offsetlat/tilelat;var tileoffsety=-tilerowremain*this.tileSize.h;var tileoffsetlat=extent.bottom+tilerow*tilelat;return{tilelon:tilelon,tilelat:tilelat,tileoffsetlon:tileoffsetlon,tileoffsetlat:tileoffsetlat,tileoffsetx:tileoffsetx,tileoffsety:tileoffsety};},initGriddedTiles:function(bounds){var viewSize=this.map.getSize();var minRows=Math.ceil(viewSize.h/this.tileSize.h)+
60666 Math.max(1,2*this.buffer);var minCols=Math.ceil(viewSize.w/this.tileSize.w)+
60667 Math.max(1,2*this.buffer);var extent=this.getMaxExtent();var resolution=this.map.getResolution();var tileLayout=this.calculateGridLayout(bounds,extent,resolution);var tileoffsetx=Math.round(tileLayout.tileoffsetx);var tileoffsety=Math.round(tileLayout.tileoffsety);var tileoffsetlon=tileLayout.tileoffsetlon;var tileoffsetlat=tileLayout.tileoffsetlat;var tilelon=tileLayout.tilelon;var tilelat=tileLayout.tilelat;this.origin=new OpenLayers.Pixel(tileoffsetx,tileoffsety);var startX=tileoffsetx;var startLon=tileoffsetlon;var rowidx=0;var layerContainerDivLeft=parseInt(this.map.layerContainerDiv.style.left);var layerContainerDivTop=parseInt(this.map.layerContainerDiv.style.top);do{var row=this.grid[rowidx++];if(!row){row=[];this.grid.push(row);}
60668 tileoffsetlon=startLon;tileoffsetx=startX;var colidx=0;do{var tileBounds=new OpenLayers.Bounds(tileoffsetlon,tileoffsetlat,tileoffsetlon+tilelon,tileoffsetlat+tilelat);var x=tileoffsetx;x-=layerContainerDivLeft;var y=tileoffsety;y-=layerContainerDivTop;var px=new OpenLayers.Pixel(x,y);var tile=row[colidx++];if(!tile){tile=this.addTile(tileBounds,px);this.addTileMonitoringHooks(tile);row.push(tile);}else{tile.moveTo(tileBounds,px,false);}
60669 tileoffsetlon+=tilelon;tileoffsetx+=this.tileSize.w;}while((tileoffsetlon<=bounds.right+tilelon*this.buffer)||colidx<minCols);tileoffsetlat-=tilelat;tileoffsety+=this.tileSize.h;}while((tileoffsetlat>=bounds.bottom-tilelat*this.buffer)||rowidx<minRows);this.removeExcessTiles(rowidx,colidx);this.spiralTileLoad();},getMaxExtent:function(){return this.maxExtent;},spiralTileLoad:function(){var tileQueue=[];var directions=["right","down","left","up"];var iRow=0;var iCell=-1;var direction=OpenLayers.Util.indexOf(directions,"right");var directionsTried=0;while(directionsTried<directions.length){var testRow=iRow;var testCell=iCell;switch(directions[direction]){case"right":testCell++;break;case"down":testRow++;break;case"left":testCell--;break;case"up":testRow--;break;}
60670 var tile=null;if((testRow<this.grid.length)&&(testRow>=0)&&(testCell<this.grid[0].length)&&(testCell>=0)){tile=this.grid[testRow][testCell];}
60671 if((tile!=null)&&(!tile.queued)){tileQueue.unshift(tile);tile.queued=true;directionsTried=0;iRow=testRow;iCell=testCell;}else{direction=(direction+1)%4;directionsTried++;}}
60672 for(var i=0,len=tileQueue.length;i<len;i++){var tile=tileQueue[i];tile.draw();tile.queued=false;}},addTile:function(bounds,position){},addTileMonitoringHooks:function(tile){tile.onLoadStart=function(){if(this.numLoadingTiles==0){this.events.triggerEvent("loadstart");}
60673 this.numLoadingTiles++;};tile.events.register("loadstart",this,tile.onLoadStart);tile.onLoadEnd=function(){this.numLoadingTiles--;this.events.triggerEvent("tileloaded");if(this.numLoadingTiles==0){this.events.triggerEvent("loadend");}};tile.events.register("loadend",this,tile.onLoadEnd);tile.events.register("unload",this,tile.onLoadEnd);},removeTileMonitoringHooks:function(tile){tile.unload();tile.events.un({"loadstart":tile.onLoadStart,"loadend":tile.onLoadEnd,"unload":tile.onLoadEnd,scope:this});},moveGriddedTiles:function(bounds){var buffer=this.buffer||1;while(true){var tlLayer=this.grid[0][0].position;var tlViewPort=this.map.getViewPortPxFromLayerPx(tlLayer);if(tlViewPort.x>-this.tileSize.w*(buffer-1)){this.shiftColumn(true);}else if(tlViewPort.x<-this.tileSize.w*buffer){this.shiftColumn(false);}else if(tlViewPort.y>-this.tileSize.h*(buffer-1)){this.shiftRow(true);}else if(tlViewPort.y<-this.tileSize.h*buffer){this.shiftRow(false);}else{break;}};},shiftRow:function(prepend){var modelRowIndex=(prepend)?0:(this.grid.length-1);var grid=this.grid;var modelRow=grid[modelRowIndex];var resolution=this.map.getResolution();var deltaY=(prepend)?-this.tileSize.h:this.tileSize.h;var deltaLat=resolution*-deltaY;var row=(prepend)?grid.pop():grid.shift();for(var i=0,len=modelRow.length;i<len;i++){var modelTile=modelRow[i];var bounds=modelTile.bounds.clone();var position=modelTile.position.clone();bounds.bottom=bounds.bottom+deltaLat;bounds.top=bounds.top+deltaLat;position.y=position.y+deltaY;row[i].moveTo(bounds,position);}
60674 if(prepend){grid.unshift(row);}else{grid.push(row);}},shiftColumn:function(prepend){var deltaX=(prepend)?-this.tileSize.w:this.tileSize.w;var resolution=this.map.getResolution();var deltaLon=resolution*deltaX;for(var i=0,len=this.grid.length;i<len;i++){var row=this.grid[i];var modelTileIndex=(prepend)?0:(row.length-1);var modelTile=row[modelTileIndex];var bounds=modelTile.bounds.clone();var position=modelTile.position.clone();bounds.left=bounds.left+deltaLon;bounds.right=bounds.right+deltaLon;position.x=position.x+deltaX;var tile=prepend?this.grid[i].pop():this.grid[i].shift();tile.moveTo(bounds,position);if(prepend){row.unshift(tile);}else{row.push(tile);}}},removeExcessTiles:function(rows,columns){while(this.grid.length>rows){var row=this.grid.pop();for(var i=0,l=row.length;i<l;i++){var tile=row[i];this.removeTileMonitoringHooks(tile);tile.destroy();}}
60675 while(this.grid[0].length>columns){for(var i=0,l=this.grid.length;i<l;i++){var row=this.grid[i];var tile=row.pop();this.removeTileMonitoringHooks(tile);tile.destroy();}}},onMapResize:function(){if(this.singleTile){this.clearGrid();this.setTileSize();}},getTileBounds:function(viewPortPx){var maxExtent=this.maxExtent;var resolution=this.getResolution();var tileMapWidth=resolution*this.tileSize.w;var tileMapHeight=resolution*this.tileSize.h;var mapPoint=this.getLonLatFromViewPortPx(viewPortPx);var tileLeft=maxExtent.left+(tileMapWidth*Math.floor((mapPoint.lon-
60676 maxExtent.left)/tileMapWidth));var tileBottom=maxExtent.bottom+(tileMapHeight*Math.floor((mapPoint.lat-
60677 maxExtent.bottom)/tileMapHeight));return new OpenLayers.Bounds(tileLeft,tileBottom,tileLeft+tileMapWidth,tileBottom+tileMapHeight);},CLASS_NAME:"OpenLayers.Layer.Grid"});OpenLayers.Layer.MultiMap=OpenLayers.Class(OpenLayers.Layer.EventPane,OpenLayers.Layer.FixedZoomLevels,{MIN_ZOOM_LEVEL:1,MAX_ZOOM_LEVEL:17,RESOLUTIONS:[9,1.40625,0.703125,0.3515625,0.17578125,0.087890625,0.0439453125,0.02197265625,0.010986328125,0.0054931640625,0.00274658203125,0.001373291015625,0.0006866455078125,0.00034332275390625,0.000171661376953125,0.0000858306884765625,0.00004291534423828125],type:null,initialize:function(name,options){OpenLayers.Layer.EventPane.prototype.initialize.apply(this,arguments);OpenLayers.Layer.FixedZoomLevels.prototype.initialize.apply(this,arguments);if(this.sphericalMercator){OpenLayers.Util.extend(this,OpenLayers.Layer.SphericalMercator);this.initMercatorParameters();this.RESOLUTIONS.unshift(10);}},loadMapObject:function(){try{this.mapObject=new MultimapViewer(this.div);}catch(e){}},getWarningHTML:function(){return OpenLayers.i18n("getLayerWarning",{'layerType':"MM",'layerLib':"MultiMap"});},setMapObjectCenter:function(center,zoom){this.mapObject.goToPosition(center,zoom);},getMapObjectCenter:function(){return this.mapObject.getCurrentPosition();},getMapObjectZoom:function(){return this.mapObject.getZoomFactor();},getMapObjectLonLatFromMapObjectPixel:function(moPixel){moPixel.x=moPixel.x-(this.map.getSize().w/2);moPixel.y=moPixel.y-(this.map.getSize().h/2);return this.mapObject.getMapPositionAt(moPixel);},getMapObjectPixelFromMapObjectLonLat:function(moLonLat){return this.mapObject.geoPosToContainerPixels(moLonLat);},getLongitudeFromMapObjectLonLat:function(moLonLat){return this.sphericalMercator?this.forwardMercator(moLonLat.lon,moLonLat.lat).lon:moLonLat.lon;},getLatitudeFromMapObjectLonLat:function(moLonLat){return this.sphericalMercator?this.forwardMercator(moLonLat.lon,moLonLat.lat).lat:moLonLat.lat;},getMapObjectLonLatFromLonLat:function(lon,lat){var mmLatLon;if(this.sphericalMercator){var lonlat=this.inverseMercator(lon,lat);mmLatLon=new MMLatLon(lonlat.lat,lonlat.lon);}else{mmLatLon=new MMLatLon(lat,lon);}
60678 return mmLatLon;},getXFromMapObjectPixel:function(moPixel){return moPixel.x;},getYFromMapObjectPixel:function(moPixel){return moPixel.y;},getMapObjectPixelFromXY:function(x,y){return new MMPoint(x,y);},CLASS_NAME:"OpenLayers.Layer.MultiMap"});OpenLayers.Layer.VirtualEarth=OpenLayers.Class(OpenLayers.Layer.EventPane,OpenLayers.Layer.FixedZoomLevels,{MIN_ZOOM_LEVEL:1,MAX_ZOOM_LEVEL:19,RESOLUTIONS:[1.40625,0.703125,0.3515625,0.17578125,0.087890625,0.0439453125,0.02197265625,0.010986328125,0.0054931640625,0.00274658203125,0.001373291015625,0.0006866455078125,0.00034332275390625,0.000171661376953125,0.0000858306884765625,0.00004291534423828125,0.00002145767211914062,0.00001072883605957031,0.00000536441802978515],type:null,wrapDateLine:true,sphericalMercator:false,animationEnabled:true,initialize:function(name,options){OpenLayers.Layer.EventPane.prototype.initialize.apply(this,arguments);OpenLayers.Layer.FixedZoomLevels.prototype.initialize.apply(this,arguments);if(this.sphericalMercator){OpenLayers.Util.extend(this,OpenLayers.Layer.SphericalMercator);this.initMercatorParameters();}},loadMapObject:function(){var veDiv=OpenLayers.Util.createDiv(this.name);var sz=this.map.getSize();veDiv.style.width=sz.w+"px";veDiv.style.height=sz.h+"px";this.div.appendChild(veDiv);try{this.mapObject=new VEMap(this.name);}catch(e){}
60679 if(this.mapObject!=null){try{this.mapObject.LoadMap(null,null,this.type,true);this.mapObject.AttachEvent("onmousedown",OpenLayers.Function.True);}catch(e){}
60680 this.mapObject.HideDashboard();if(typeof this.mapObject.SetAnimationEnabled=="function"){this.mapObject.SetAnimationEnabled(this.animationEnabled);}}
60681 if(!this.mapObject||!this.mapObject.vemapcontrol||!this.mapObject.vemapcontrol.PanMap||(typeof this.mapObject.vemapcontrol.PanMap!="function")){this.dragPanMapObject=null;}},onMapResize:function(){this.mapObject.Resize(this.map.size.w,this.map.size.h);},getWarningHTML:function(){return OpenLayers.i18n("getLayerWarning",{'layerType':'VE','layerLib':'VirtualEarth'});},setMapObjectCenter:function(center,zoom){this.mapObject.SetCenterAndZoom(center,zoom);},getMapObjectCenter:function(){return this.mapObject.GetCenter();},dragPanMapObject:function(dX,dY){this.mapObject.vemapcontrol.PanMap(dX,-dY);},getMapObjectZoom:function(){return this.mapObject.GetZoomLevel();},getMapObjectLonLatFromMapObjectPixel:function(moPixel){return(typeof VEPixel!='undefined')?this.mapObject.PixelToLatLong(moPixel):this.mapObject.PixelToLatLong(moPixel.x,moPixel.y);},getMapObjectPixelFromMapObjectLonLat:function(moLonLat){return this.mapObject.LatLongToPixel(moLonLat);},getLongitudeFromMapObjectLonLat:function(moLonLat){return this.sphericalMercator?this.forwardMercator(moLonLat.Longitude,moLonLat.Latitude).lon:moLonLat.Longitude;},getLatitudeFromMapObjectLonLat:function(moLonLat){return this.sphericalMercator?this.forwardMercator(moLonLat.Longitude,moLonLat.Latitude).lat:moLonLat.Latitude;},getMapObjectLonLatFromLonLat:function(lon,lat){var veLatLong;if(this.sphericalMercator){var lonlat=this.inverseMercator(lon,lat);veLatLong=new VELatLong(lonlat.lat,lonlat.lon);}else{veLatLong=new VELatLong(lat,lon);}
60682 return veLatLong;},getXFromMapObjectPixel:function(moPixel){return moPixel.x;},getYFromMapObjectPixel:function(moPixel){return moPixel.y;},getMapObjectPixelFromXY:function(x,y){return(typeof VEPixel!='undefined')?new VEPixel(x,y):new Msn.VE.Pixel(x,y);},CLASS_NAME:"OpenLayers.Layer.VirtualEarth"});OpenLayers.Layer.Yahoo=OpenLayers.Class(OpenLayers.Layer.EventPane,OpenLayers.Layer.FixedZoomLevels,{MIN_ZOOM_LEVEL:0,MAX_ZOOM_LEVEL:17,RESOLUTIONS:[1.40625,0.703125,0.3515625,0.17578125,0.087890625,0.0439453125,0.02197265625,0.010986328125,0.0054931640625,0.00274658203125,0.001373291015625,0.0006866455078125,0.00034332275390625,0.000171661376953125,0.0000858306884765625,0.00004291534423828125,0.00002145767211914062,0.00001072883605957031],type:null,wrapDateLine:true,sphericalMercator:false,initialize:function(name,options){OpenLayers.Layer.EventPane.prototype.initialize.apply(this,arguments);OpenLayers.Layer.FixedZoomLevels.prototype.initialize.apply(this,arguments);if(this.sphericalMercator){OpenLayers.Util.extend(this,OpenLayers.Layer.SphericalMercator);this.initMercatorParameters();}},loadMapObject:function(){try{var size=this.getMapObjectSizeFromOLSize(this.map.getSize());this.mapObject=new YMap(this.div,this.type,size);this.mapObject.disableKeyControls();this.mapObject.disableDragMap();if(!this.mapObject.moveByXY||(typeof this.mapObject.moveByXY!="function")){this.dragPanMapObject=null;}}catch(e){}},onMapResize:function(){try{var size=this.getMapObjectSizeFromOLSize(this.map.getSize());this.mapObject.resizeTo(size);}catch(e){}},setMap:function(map){OpenLayers.Layer.EventPane.prototype.setMap.apply(this,arguments);this.map.events.register("moveend",this,this.fixYahooEventPane);},fixYahooEventPane:function(){var yahooEventPane=OpenLayers.Util.getElement("ygddfdiv");if(yahooEventPane!=null){if(yahooEventPane.parentNode!=null){yahooEventPane.parentNode.removeChild(yahooEventPane);}
60683 this.map.events.unregister("moveend",this,this.fixYahooEventPane);}},getWarningHTML:function(){return OpenLayers.i18n("getLayerWarning",{'layerType':'Yahoo','layerLib':'Yahoo'});},getOLZoomFromMapObjectZoom:function(moZoom){var zoom=null;if(moZoom!=null){zoom=OpenLayers.Layer.FixedZoomLevels.prototype.getOLZoomFromMapObjectZoom.apply(this,[moZoom]);zoom=18-zoom;}
60684 return zoom;},getMapObjectZoomFromOLZoom:function(olZoom){var zoom=null;if(olZoom!=null){zoom=OpenLayers.Layer.FixedZoomLevels.prototype.getMapObjectZoomFromOLZoom.apply(this,[olZoom]);zoom=18-zoom;}
60685 return zoom;},setMapObjectCenter:function(center,zoom){this.mapObject.drawZoomAndCenter(center,zoom);},getMapObjectCenter:function(){return this.mapObject.getCenterLatLon();},dragPanMapObject:function(dX,dY){this.mapObject.moveByXY({'x':-dX,'y':dY});},getMapObjectZoom:function(){return this.mapObject.getZoomLevel();},getMapObjectLonLatFromMapObjectPixel:function(moPixel){return this.mapObject.convertXYLatLon(moPixel);},getMapObjectPixelFromMapObjectLonLat:function(moLonLat){return this.mapObject.convertLatLonXY(moLonLat);},getLongitudeFromMapObjectLonLat:function(moLonLat){return this.sphericalMercator?this.forwardMercator(moLonLat.Lon,moLonLat.Lat).lon:moLonLat.Lon;},getLatitudeFromMapObjectLonLat:function(moLonLat){return this.sphericalMercator?this.forwardMercator(moLonLat.Lon,moLonLat.Lat).lat:moLonLat.Lat;},getMapObjectLonLatFromLonLat:function(lon,lat){var yLatLong;if(this.sphericalMercator){var lonlat=this.inverseMercator(lon,lat);yLatLong=new YGeoPoint(lonlat.lat,lonlat.lon);}else{yLatLong=new YGeoPoint(lat,lon);}
60686 return yLatLong;},getXFromMapObjectPixel:function(moPixel){return moPixel.x;},getYFromMapObjectPixel:function(moPixel){return moPixel.y;},getMapObjectPixelFromXY:function(x,y){return new YCoordPoint(x,y);},getMapObjectSizeFromOLSize:function(olSize){return new YSize(olSize.w,olSize.h);},CLASS_NAME:"OpenLayers.Layer.Yahoo"});OpenLayers.Style=OpenLayers.Class({id:null,name:null,title:null,description:null,layerName:null,isDefault:false,rules:null,context:null,defaultStyle:null,defaultsPerSymbolizer:false,propertyStyles:null,initialize:function(style,options){OpenLayers.Util.extend(this,options);this.rules=[];if(options&&options.rules){this.addRules(options.rules);}
60687 this.setDefaultStyle(style||OpenLayers.Feature.Vector.style["default"]);this.id=OpenLayers.Util.createUniqueID(this.CLASS_NAME+"_");},destroy:function(){for(var i=0,len=this.rules.length;i<len;i++){this.rules[i].destroy();this.rules[i]=null;}
60688 this.rules=null;this.defaultStyle=null;},createSymbolizer:function(feature){var style=this.defaultsPerSymbolizer?{}:this.createLiterals(OpenLayers.Util.extend({},this.defaultStyle),feature);var rules=this.rules;var rule,context;var elseRules=[];var appliedRules=false;for(var i=0,len=rules.length;i<len;i++){rule=rules[i];var applies=rule.evaluate(feature);if(applies){if(rule instanceof OpenLayers.Rule&&rule.elseFilter){elseRules.push(rule);}else{appliedRules=true;this.applySymbolizer(rule,style,feature);}}}
60689 if(appliedRules==false&&elseRules.length>0){appliedRules=true;for(var i=0,len=elseRules.length;i<len;i++){this.applySymbolizer(elseRules[i],style,feature);}}
60690 if(rules.length>0&&appliedRules==false){style.display="none";}
60691 return style;},applySymbolizer:function(rule,style,feature){var symbolizerPrefix=feature.geometry?this.getSymbolizerPrefix(feature.geometry):OpenLayers.Style.SYMBOLIZER_PREFIXES[0];var symbolizer=rule.symbolizer[symbolizerPrefix]||rule.symbolizer;if(this.defaultsPerSymbolizer===true){var defaults=this.defaultStyle;OpenLayers.Util.applyDefaults(symbolizer,{pointRadius:defaults.pointRadius});if(symbolizer.stroke===true||symbolizer.graphic===true){OpenLayers.Util.applyDefaults(symbolizer,{strokeWidth:defaults.strokeWidth,strokeColor:defaults.strokeColor,strokeOpacity:defaults.strokeOpacity,strokeDashstyle:defaults.strokeDashstyle,strokeLinecap:defaults.strokeLinecap});}
60692 if(symbolizer.fill===true||symbolizer.graphic===true){OpenLayers.Util.applyDefaults(symbolizer,{fillColor:defaults.fillColor,fillOpacity:defaults.fillOpacity});}
60693 if(symbolizer.graphic===true){OpenLayers.Util.applyDefaults(symbolizer,{pointRadius:this.defaultStyle.pointRadius,externalGraphic:this.defaultStyle.externalGraphic,graphicName:this.defaultStyle.graphicName,graphicOpacity:this.defaultStyle.graphicOpacity,graphicWidth:this.defaultStyle.graphicWidth,graphicHeight:this.defaultStyle.graphicHeight,graphicXOffset:this.defaultStyle.graphicXOffset,graphicYOffset:this.defaultStyle.graphicYOffset});}}
60694 return this.createLiterals(OpenLayers.Util.extend(style,symbolizer),feature);},createLiterals:function(style,feature){var context=OpenLayers.Util.extend({},feature.attributes||feature.data);OpenLayers.Util.extend(context,this.context);for(var i in this.propertyStyles){style[i]=OpenLayers.Style.createLiteral(style[i],context,feature,i);}
60695 return style;},findPropertyStyles:function(){var propertyStyles={};var style=this.defaultStyle;this.addPropertyStyles(propertyStyles,style);var rules=this.rules;var symbolizer,value;for(var i=0,len=rules.length;i<len;i++){symbolizer=rules[i].symbolizer;for(var key in symbolizer){value=symbolizer[key];if(typeof value=="object"){this.addPropertyStyles(propertyStyles,value);}else{this.addPropertyStyles(propertyStyles,symbolizer);break;}}}
60696 return propertyStyles;},addPropertyStyles:function(propertyStyles,symbolizer){var property;for(var key in symbolizer){property=symbolizer[key];if(typeof property=="string"&&property.match(/\$\{\w+\}/)){propertyStyles[key]=true;}}
60697 return propertyStyles;},addRules:function(rules){Array.prototype.push.apply(this.rules,rules);this.propertyStyles=this.findPropertyStyles();},setDefaultStyle:function(style){this.defaultStyle=style;this.propertyStyles=this.findPropertyStyles();},getSymbolizerPrefix:function(geometry){var prefixes=OpenLayers.Style.SYMBOLIZER_PREFIXES;for(var i=0,len=prefixes.length;i<len;i++){if(geometry.CLASS_NAME.indexOf(prefixes[i])!=-1){return prefixes[i];}}},clone:function(){var options=OpenLayers.Util.extend({},this);if(this.rules){options.rules=[];for(var i=0,len=this.rules.length;i<len;++i){options.rules.push(this.rules[i].clone());}}
60698 options.context=this.context&&OpenLayers.Util.extend({},this.context);var defaultStyle=OpenLayers.Util.extend({},this.defaultStyle);return new OpenLayers.Style(defaultStyle,options);},CLASS_NAME:"OpenLayers.Style"});OpenLayers.Style.createLiteral=function(value,context,feature,property){if(typeof value=="string"&&value.indexOf("${")!=-1){value=OpenLayers.String.format(value,context,[feature,property]);value=(isNaN(value)||!value)?value:parseFloat(value);}
60699 return value;};OpenLayers.Style.SYMBOLIZER_PREFIXES=['Point','Line','Polygon','Text','Raster'];OpenLayers.Control.Navigation=OpenLayers.Class(OpenLayers.Control,{dragPan:null,dragPanOptions:null,documentDrag:false,zoomBox:null,zoomBoxEnabled:true,zoomWheelEnabled:true,mouseWheelOptions:null,handleRightClicks:false,zoomBoxKeyMask:OpenLayers.Handler.MOD_SHIFT,autoActivate:true,initialize:function(options){this.handlers={};OpenLayers.Control.prototype.initialize.apply(this,arguments);},destroy:function(){this.deactivate();if(this.dragPan){this.dragPan.destroy();}
60700 this.dragPan=null;if(this.zoomBox){this.zoomBox.destroy();}
60701 this.zoomBox=null;OpenLayers.Control.prototype.destroy.apply(this,arguments);},activate:function(){this.dragPan.activate();if(this.zoomWheelEnabled){this.handlers.wheel.activate();}
60702 this.handlers.click.activate();if(this.zoomBoxEnabled){this.zoomBox.activate();}
60703 return OpenLayers.Control.prototype.activate.apply(this,arguments);},deactivate:function(){this.zoomBox.deactivate();this.dragPan.deactivate();this.handlers.click.deactivate();this.handlers.wheel.deactivate();return OpenLayers.Control.prototype.deactivate.apply(this,arguments);},draw:function(){if(this.handleRightClicks){this.map.viewPortDiv.oncontextmenu=OpenLayers.Function.False;}
60704 var clickCallbacks={'dblclick':this.defaultDblClick,'dblrightclick':this.defaultDblRightClick};var clickOptions={'double':true,'stopDouble':true};this.handlers.click=new OpenLayers.Handler.Click(this,clickCallbacks,clickOptions);this.dragPan=new OpenLayers.Control.DragPan(OpenLayers.Util.extend({map:this.map,documentDrag:this.documentDrag},this.dragPanOptions));this.zoomBox=new OpenLayers.Control.ZoomBox({map:this.map,keyMask:this.zoomBoxKeyMask});this.dragPan.draw();this.zoomBox.draw();this.handlers.wheel=new OpenLayers.Handler.MouseWheel(this,{"up":this.wheelUp,"down":this.wheelDown},this.mouseWheelOptions);},defaultDblClick:function(evt){var newCenter=this.map.getLonLatFromViewPortPx(evt.xy);this.map.setCenter(newCenter,this.map.zoom+1);},defaultDblRightClick:function(evt){var newCenter=this.map.getLonLatFromViewPortPx(evt.xy);this.map.setCenter(newCenter,this.map.zoom-1);},wheelChange:function(evt,deltaZ){var currentZoom=this.map.getZoom();var newZoom=this.map.getZoom()+Math.round(deltaZ);newZoom=Math.max(newZoom,0);newZoom=Math.min(newZoom,this.map.getNumZoomLevels());if(newZoom===currentZoom){return;}
60705 var size=this.map.getSize();var deltaX=size.w/2-evt.xy.x;var deltaY=evt.xy.y-size.h/2;var newRes=this.map.baseLayer.getResolutionForZoom(newZoom);var zoomPoint=this.map.getLonLatFromPixel(evt.xy);var newCenter=new OpenLayers.LonLat(zoomPoint.lon+deltaX*newRes,zoomPoint.lat+deltaY*newRes);this.map.setCenter(newCenter,newZoom);},wheelUp:function(evt,delta){this.wheelChange(evt,delta||1);},wheelDown:function(evt,delta){this.wheelChange(evt,delta||-1);},disableZoomBox:function(){this.zoomBoxEnabled=false;this.zoomBox.deactivate();},enableZoomBox:function(){this.zoomBoxEnabled=true;if(this.active){this.zoomBox.activate();}},disableZoomWheel:function(){this.zoomWheelEnabled=false;this.handlers.wheel.deactivate();},enableZoomWheel:function(){this.zoomWheelEnabled=true;if(this.active){this.handlers.wheel.activate();}},CLASS_NAME:"OpenLayers.Control.Navigation"});OpenLayers.Filter=OpenLayers.Class({initialize:function(options){OpenLayers.Util.extend(this,options);},destroy:function(){},evaluate:function(context){return true;},clone:function(){return null;},CLASS_NAME:"OpenLayers.Filter"});OpenLayers.Format.WMC.v1_0_0=OpenLayers.Class(OpenLayers.Format.WMC.v1,{VERSION:"1.0.0",schemaLocation:"http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd",initialize:function(options){OpenLayers.Format.WMC.v1.prototype.initialize.apply(this,[options]);},write_wmc_Layer:function(context){var node=OpenLayers.Format.WMC.v1.prototype.write_wmc_Layer.apply(this,[context]);node.appendChild(this.write_wmc_FormatList(context));node.appendChild(this.write_wmc_StyleList(context));node.appendChild(this.write_wmc_LayerExtension(context));},CLASS_NAME:"OpenLayers.Format.WMC.v1_0_0"});OpenLayers.Format.WMC.v1_1_0=OpenLayers.Class(OpenLayers.Format.WMC.v1,{VERSION:"1.1.0",schemaLocation:"http://www.opengis.net/context http://schemas.opengis.net/context/1.1.0/context.xsd",initialize:function(options){OpenLayers.Format.WMC.v1.prototype.initialize.apply(this,[options]);},read_sld_MinScaleDenominator:function(layerContext,node){var minScaleDenominator=parseFloat(this.getChildValue(node));if(minScaleDenominator>0){layerContext.maxScale=minScaleDenominator;}},read_sld_MaxScaleDenominator:function(layerContext,node){layerContext.minScale=parseFloat(this.getChildValue(node));},write_wmc_Layer:function(context){var node=OpenLayers.Format.WMC.v1.prototype.write_wmc_Layer.apply(this,[context]);if(context.maxScale){var minSD=this.createElementNS(this.namespaces.sld,"sld:MinScaleDenominator");minSD.appendChild(this.createTextNode(context.maxScale.toPrecision(16)));node.appendChild(minSD);}
60706 if(context.minScale){var maxSD=this.createElementNS(this.namespaces.sld,"sld:MaxScaleDenominator");maxSD.appendChild(this.createTextNode(context.minScale.toPrecision(16)));node.appendChild(maxSD);}
60707 node.appendChild(this.write_wmc_FormatList(context));node.appendChild(this.write_wmc_StyleList(context));node.appendChild(this.write_wmc_LayerExtension(context));return node;},CLASS_NAME:"OpenLayers.Format.WMC.v1_1_0"});OpenLayers.Format.WMSCapabilities.v1_1_0=OpenLayers.Class(OpenLayers.Format.WMSCapabilities.v1_1,{version:"1.1.0",initialize:function(options){OpenLayers.Format.WMSCapabilities.v1_1.prototype.initialize.apply(this,[options]);},readers:{"wms":OpenLayers.Util.applyDefaults({"SRS":function(node,obj){var srs=this.getChildValue(node);var values=srs.split(/ +/);for(var i=0,len=values.length;i<len;i++){obj.srs[values[i]]=true;}}},OpenLayers.Format.WMSCapabilities.v1_1.prototype.readers["wms"])},CLASS_NAME:"OpenLayers.Format.WMSCapabilities.v1_1_0"});OpenLayers.Format.WMSCapabilities.v1_1_1=OpenLayers.Class(OpenLayers.Format.WMSCapabilities.v1_1,{version:"1.1.1",initialize:function(options){OpenLayers.Format.WMSCapabilities.v1_1.prototype.initialize.apply(this,[options]);},readers:{"wms":OpenLayers.Util.applyDefaults({"SRS":function(node,obj){obj.srs[this.getChildValue(node)]=true;}},OpenLayers.Format.WMSCapabilities.v1_1.prototype.readers["wms"])},CLASS_NAME:"OpenLayers.Format.WMSCapabilities.v1_1_1"});OpenLayers.Format.WMSCapabilities.v1_3_0=OpenLayers.Class(OpenLayers.Format.WMSCapabilities.v1_3,{version:"1.3.0",CLASS_NAME:"OpenLayers.Format.WMSCapabilities.v1_3_0"});OpenLayers.Geometry=OpenLayers.Class({id:null,parent:null,bounds:null,initialize:function(){this.id=OpenLayers.Util.createUniqueID(this.CLASS_NAME+"_");},destroy:function(){this.id=null;this.bounds=null;},clone:function(){return new OpenLayers.Geometry();},setBounds:function(bounds){if(bounds){this.bounds=bounds.clone();}},clearBounds:function(){this.bounds=null;if(this.parent){this.parent.clearBounds();}},extendBounds:function(newBounds){var bounds=this.getBounds();if(!bounds){this.setBounds(newBounds);}else{this.bounds.extend(newBounds);}},getBounds:function(){if(this.bounds==null){this.calculateBounds();}
60708 return this.bounds;},calculateBounds:function(){},distanceTo:function(geometry,options){},getVertices:function(nodes){},atPoint:function(lonlat,toleranceLon,toleranceLat){var atPoint=false;var bounds=this.getBounds();if((bounds!=null)&&(lonlat!=null)){var dX=(toleranceLon!=null)?toleranceLon:0;var dY=(toleranceLat!=null)?toleranceLat:0;var toleranceBounds=new OpenLayers.Bounds(this.bounds.left-dX,this.bounds.bottom-dY,this.bounds.right+dX,this.bounds.top+dY);atPoint=toleranceBounds.containsLonLat(lonlat);}
60709 return atPoint;},getLength:function(){return 0.0;},getArea:function(){return 0.0;},getCentroid:function(){return null;},toString:function(){return OpenLayers.Format.WKT.prototype.write(new OpenLayers.Feature.Vector(this));},CLASS_NAME:"OpenLayers.Geometry"});OpenLayers.Geometry.fromWKT=function(wkt){var format=arguments.callee.format;if(!format){format=new OpenLayers.Format.WKT();arguments.callee.format=format;}
60710 var geom;var result=format.read(wkt);if(result instanceof OpenLayers.Feature.Vector){geom=result.geometry;}else if(result instanceof Array){var len=result.length;var components=new Array(len);for(var i=0;i<len;++i){components[i]=result[i].geometry;}
60711 geom=new OpenLayers.Geometry.Collection(components);}
60712 return geom;};OpenLayers.Geometry.segmentsIntersect=function(seg1,seg2,options){var point=options&&options.point;var tolerance=options&&options.tolerance;var intersection=false;var x11_21=seg1.x1-seg2.x1;var y11_21=seg1.y1-seg2.y1;var x12_11=seg1.x2-seg1.x1;var y12_11=seg1.y2-seg1.y1;var y22_21=seg2.y2-seg2.y1;var x22_21=seg2.x2-seg2.x1;var d=(y22_21*x12_11)-(x22_21*y12_11);var n1=(x22_21*y11_21)-(y22_21*x11_21);var n2=(x12_11*y11_21)-(y12_11*x11_21);if(d==0){if(n1==0&&n2==0){intersection=true;}}else{var along1=n1/d;var along2=n2/d;if(along1>=0&&along1<=1&&along2>=0&&along2<=1){if(!point){intersection=true;}else{var x=seg1.x1+(along1*x12_11);var y=seg1.y1+(along1*y12_11);intersection=new OpenLayers.Geometry.Point(x,y);}}}
60713 if(tolerance){var dist;if(intersection){if(point){var segs=[seg1,seg2];var seg,x,y;outer:for(var i=0;i<2;++i){seg=segs[i];for(var j=1;j<3;++j){x=seg["x"+j];y=seg["y"+j];dist=Math.sqrt(Math.pow(x-intersection.x,2)+
60714 Math.pow(y-intersection.y,2));if(dist<tolerance){intersection.x=x;intersection.y=y;break outer;}}}}}else{var segs=[seg1,seg2];var source,target,x,y,p,result;outer:for(var i=0;i<2;++i){source=segs[i];target=segs[(i+1)%2];for(var j=1;j<3;++j){p={x:source["x"+j],y:source["y"+j]};result=OpenLayers.Geometry.distanceToSegment(p,target);if(result.distance<tolerance){if(point){intersection=new OpenLayers.Geometry.Point(p.x,p.y);}else{intersection=true;}
60715 break outer;}}}}}
60716 return intersection;};OpenLayers.Geometry.distanceToSegment=function(point,segment){var x0=point.x;var y0=point.y;var x1=segment.x1;var y1=segment.y1;var x2=segment.x2;var y2=segment.y2;var dx=x2-x1;var dy=y2-y1;var along=((dx*(x0-x1))+(dy*(y0-y1)))/(Math.pow(dx,2)+Math.pow(dy,2));var x,y;if(along<=0.0){x=x1;y=y1;}else if(along>=1.0){x=x2;y=y2;}else{x=x1+along*dx;y=y1+along*dy;}
60717 return{distance:Math.sqrt(Math.pow(x-x0,2)+Math.pow(y-y0,2)),x:x,y:y};};OpenLayers.Layer.ArcGIS93Rest=OpenLayers.Class(OpenLayers.Layer.Grid,{DEFAULT_PARAMS:{format:"png"},isBaseLayer:true,initialize:function(name,url,params,options){var newArguments=[];params=OpenLayers.Util.upperCaseObject(params);newArguments.push(name,url,params,options);OpenLayers.Layer.Grid.prototype.initialize.apply(this,newArguments);OpenLayers.Util.applyDefaults(this.params,OpenLayers.Util.upperCaseObject(this.DEFAULT_PARAMS));if(this.params.TRANSPARENT&&this.params.TRANSPARENT.toString().toLowerCase()=="true"){if((options==null)||(!options.isBaseLayer)){this.isBaseLayer=false;}
60718 if(this.params.FORMAT=="jpg"){this.params.FORMAT=OpenLayers.Util.alphaHack()?"gif":"png";}}},destroy:function(){OpenLayers.Layer.Grid.prototype.destroy.apply(this,arguments);},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.ArcGIS93Rest(this.name,this.url,this.params,this.getOptions());}
60719 obj=OpenLayers.Layer.Grid.prototype.clone.apply(this,[obj]);return obj;},getURL:function(bounds){bounds=this.adjustBounds(bounds);var projWords=this.projection.getCode().split(":");var srid=projWords[projWords.length-1];var imageSize=this.getImageSize();var newParams={'BBOX':bounds.toBBOX(),'SIZE':imageSize.w+","+imageSize.h,'F':"image",'BBOXSR':srid,'IMAGESR':srid};if(this.layerDefs){var layerDefStrList=[];var layerID;for(layerID in this.layerDefs){if(this.layerDefs.hasOwnProperty(layerID)){if(this.layerDefs[layerID]){layerDefStrList.push(layerID);layerDefStrList.push(":");layerDefStrList.push(this.layerDefs[layerID]);layerDefStrList.push(";");}}}
60720 if(layerDefStrList.length>0){newParams['LAYERDEFS']=layerDefStrList.join("");}}
60721 var requestString=this.getFullRequestString(newParams);return requestString;},setLayerFilter:function(id,queryDef){if(!this.layerDefs){this.layerDefs={};}
60722 if(queryDef){this.layerDefs[id]=queryDef;}else{delete this.layerDefs[id];}},clearLayerFilter:function(id){if(id){delete this.layerDefs[id];}else{delete this.layerDefs;}},mergeNewParams:function(newParams){var upperParams=OpenLayers.Util.upperCaseObject(newParams);var newArguments=[upperParams];return OpenLayers.Layer.Grid.prototype.mergeNewParams.apply(this,newArguments);},addTile:function(bounds,position){return new OpenLayers.Tile.Image(this,position,bounds,null,this.tileSize);},CLASS_NAME:"OpenLayers.Layer.ArcGIS93Rest"});OpenLayers.Layer.Google.v3={DEFAULTS:{maxExtent:new OpenLayers.Bounds(-128*156543.0339,-128*156543.0339,128*156543.0339,128*156543.0339),sphericalMercator:true,maxResolution:156543.0339,units:"m",projection:"EPSG:900913"},loadMapObject:function(){if(!this.type){this.type=google.maps.MapTypeId.ROADMAP;}
60723 var mapObject;var cache=OpenLayers.Layer.Google.cache[this.map.id];if(cache){mapObject=cache.mapObject;++cache.count;}else{var container=this.map.viewPortDiv;var div=document.createElement("div");div.id=this.map.id+"_GMapContainer";div.style.position="absolute";div.style.width="100%";div.style.height="100%";container.appendChild(div);var center=this.map.getCenter();mapObject=new google.maps.Map(div,{center:center?new google.maps.LatLng(center.lat,center.lon):new google.maps.LatLng(0,0),zoom:this.map.getZoom()||0,mapTypeId:this.type,disableDefaultUI:true,keyboardShortcuts:false,draggable:false,disableDoubleClickZoom:true,scrollwheel:false});cache={mapObject:mapObject,count:1};OpenLayers.Layer.Google.cache[this.map.id]=cache;this.repositionListener=google.maps.event.addListenerOnce(mapObject,"center_changed",OpenLayers.Function.bind(this.repositionMapElements,this));}
60724 this.mapObject=mapObject;this.setGMapVisibility(this.visibility);},repositionMapElements:function(){google.maps.event.trigger(this.mapObject,"resize");var div=this.mapObject.getDiv().firstChild;if(!div||div.childNodes.length<3){this.repositionTimer=window.setTimeout(OpenLayers.Function.bind(this.repositionMapElements,this),250);return false;}
60725 var cache=OpenLayers.Layer.Google.cache[this.map.id];var container=this.map.viewPortDiv;var termsOfUse=div.lastChild;container.appendChild(termsOfUse);termsOfUse.style.zIndex="1100";termsOfUse.style.bottom="";termsOfUse.className="olLayerGoogleCopyright olLayerGoogleV3";termsOfUse.style.display="";cache.termsOfUse=termsOfUse;var poweredBy=div.lastChild;container.appendChild(poweredBy);poweredBy.style.zIndex="1100";poweredBy.style.bottom="";poweredBy.className="olLayerGooglePoweredBy olLayerGoogleV3 gmnoprint";poweredBy.style.display="";cache.poweredBy=poweredBy;this.setGMapVisibility(this.visibility);},onMapResize:function(){if(this.visibility){google.maps.event.trigger(this.mapObject,"resize");}else{if(!this._resized){var layer=this;google.maps.event.addListenerOnce(this.mapObject,"tilesloaded",function(){delete layer._resized;google.maps.event.trigger(layer.mapObject,"resize");layer.moveTo(layer.map.getCenter(),layer.map.getZoom());});}
60726 this._resized=true;}},setGMapVisibility:function(visible){var cache=OpenLayers.Layer.Google.cache[this.map.id];if(cache){var type=this.type;var layers=this.map.layers;var layer;for(var i=layers.length-1;i>=0;--i){layer=layers[i];if(layer instanceof OpenLayers.Layer.Google&&layer.visibility===true&&layer.inRange===true){type=layer.type;visible=true;break;}}
60727 var container=this.mapObject.getDiv();if(visible===true){this.mapObject.setMapTypeId(type);container.style.left="";if(cache.termsOfUse&&cache.termsOfUse.style){cache.termsOfUse.style.left="";cache.termsOfUse.style.display="";cache.poweredBy.style.display="";}
60728 cache.displayed=this.id;}else{delete cache.displayed;container.style.left="-9999px";if(cache.termsOfUse&&cache.termsOfUse.style){cache.termsOfUse.style.display="none";cache.termsOfUse.style.left="-9999px";cache.poweredBy.style.display="none";}}}},getMapContainer:function(){return this.mapObject.getDiv();},getMapObjectBoundsFromOLBounds:function(olBounds){var moBounds=null;if(olBounds!=null){var sw=this.sphericalMercator?this.inverseMercator(olBounds.bottom,olBounds.left):new OpenLayers.LonLat(olBounds.bottom,olBounds.left);var ne=this.sphericalMercator?this.inverseMercator(olBounds.top,olBounds.right):new OpenLayers.LonLat(olBounds.top,olBounds.right);moBounds=new google.maps.LatLngBounds(new google.maps.LatLng(sw.lat,sw.lon),new google.maps.LatLng(ne.lat,ne.lon));}
60729 return moBounds;},getMapObjectLonLatFromMapObjectPixel:function(moPixel){var size=this.map.getSize();var lon=this.getLongitudeFromMapObjectLonLat(this.mapObject.center);var lat=this.getLatitudeFromMapObjectLonLat(this.mapObject.center);var res=this.map.getResolution();var delta_x=moPixel.x-(size.w/2);var delta_y=moPixel.y-(size.h/2);var lonlat=new OpenLayers.LonLat(lon+delta_x*res,lat-delta_y*res);if(this.wrapDateLine){lonlat=lonlat.wrapDateLine(this.maxExtent);}
60730 return this.getMapObjectLonLatFromLonLat(lonlat.lon,lonlat.lat);},getMapObjectPixelFromMapObjectLonLat:function(moLonLat){var lon=this.getLongitudeFromMapObjectLonLat(moLonLat);var lat=this.getLatitudeFromMapObjectLonLat(moLonLat);var res=this.map.getResolution();var extent=this.map.getExtent();var px=new OpenLayers.Pixel((1/res*(lon-extent.left)),(1/res*(extent.top-lat)));return this.getMapObjectPixelFromXY(px.x,px.y);},setMapObjectCenter:function(center,zoom){this.mapObject.setOptions({center:center,zoom:zoom});},getMapObjectZoomFromMapObjectBounds:function(moBounds){return this.mapObject.getBoundsZoomLevel(moBounds);},getMapObjectLonLatFromLonLat:function(lon,lat){var gLatLng;if(this.sphericalMercator){var lonlat=this.inverseMercator(lon,lat);gLatLng=new google.maps.LatLng(lonlat.lat,lonlat.lon);}else{gLatLng=new google.maps.LatLng(lat,lon);}
60731 return gLatLng;},getMapObjectPixelFromXY:function(x,y){return new google.maps.Point(x,y);},destroy:function(){if(this.repositionListener){google.maps.event.removeListener(this.repositionListener);}
60732 if(this.repositionTimer){window.clearTimeout(this.repositionTimer);}
60733 OpenLayers.Layer.Google.prototype.destroy.apply(this,arguments);}};OpenLayers.Layer.KaMap=OpenLayers.Class(OpenLayers.Layer.Grid,{isBaseLayer:true,units:null,resolution:OpenLayers.DOTS_PER_INCH,DEFAULT_PARAMS:{i:'jpeg',map:''},initialize:function(name,url,params,options){var newArguments=[];newArguments.push(name,url,params,options);OpenLayers.Layer.Grid.prototype.initialize.apply(this,newArguments);this.params=OpenLayers.Util.applyDefaults(this.params,this.DEFAULT_PARAMS);},getURL:function(bounds){bounds=this.adjustBounds(bounds);var mapRes=this.map.getResolution();var scale=Math.round((this.map.getScale()*10000))/10000;var pX=Math.round(bounds.left/mapRes);var pY=-Math.round(bounds.top/mapRes);return this.getFullRequestString({t:pY,l:pX,s:scale});},addTile:function(bounds,position){var url=this.getURL(bounds);return new OpenLayers.Tile.Image(this,position,bounds,url,this.tileSize);},calculateGridLayout:function(bounds,extent,resolution){var tilelon=resolution*this.tileSize.w;var tilelat=resolution*this.tileSize.h;var offsetlon=bounds.left;var tilecol=Math.floor(offsetlon/tilelon)-this.buffer;var tilecolremain=offsetlon/tilelon-tilecol;var tileoffsetx=-tilecolremain*this.tileSize.w;var tileoffsetlon=tilecol*tilelon;var offsetlat=bounds.top;var tilerow=Math.ceil(offsetlat/tilelat)+this.buffer;var tilerowremain=tilerow-offsetlat/tilelat;var tileoffsety=-(tilerowremain+1)*this.tileSize.h;var tileoffsetlat=tilerow*tilelat;return{tilelon:tilelon,tilelat:tilelat,tileoffsetlon:tileoffsetlon,tileoffsetlat:tileoffsetlat,tileoffsetx:tileoffsetx,tileoffsety:tileoffsety};},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.KaMap(this.name,this.url,this.params,this.getOptions());}
60734 obj=OpenLayers.Layer.Grid.prototype.clone.apply(this,[obj]);if(this.tileSize!=null){obj.tileSize=this.tileSize.clone();}
60735 obj.grid=[];return obj;},getTileBounds:function(viewPortPx){var resolution=this.getResolution();var tileMapWidth=resolution*this.tileSize.w;var tileMapHeight=resolution*this.tileSize.h;var mapPoint=this.getLonLatFromViewPortPx(viewPortPx);var tileLeft=tileMapWidth*Math.floor(mapPoint.lon/tileMapWidth);var tileBottom=tileMapHeight*Math.floor(mapPoint.lat/tileMapHeight);return new OpenLayers.Bounds(tileLeft,tileBottom,tileLeft+tileMapWidth,tileBottom+tileMapHeight);},CLASS_NAME:"OpenLayers.Layer.KaMap"});OpenLayers.Layer.MapGuide=OpenLayers.Class(OpenLayers.Layer.Grid,{isBaseLayer:true,useHttpTile:false,singleTile:false,useOverlay:false,useAsyncOverlay:true,TILE_PARAMS:{operation:'GETTILEIMAGE',version:'1.2.0'},SINGLE_TILE_PARAMS:{operation:'GETMAPIMAGE',format:'PNG',locale:'en',clip:'1',version:'1.0.0'},OVERLAY_PARAMS:{operation:'GETDYNAMICMAPOVERLAYIMAGE',format:'PNG',locale:'en',clip:'1',version:'2.0.0'},FOLDER_PARAMS:{tileColumnsPerFolder:30,tileRowsPerFolder:30,format:'png',querystring:null},defaultSize:new OpenLayers.Size(300,300),initialize:function(name,url,params,options){OpenLayers.Layer.Grid.prototype.initialize.apply(this,arguments);if(options==null||options.isBaseLayer==null){this.isBaseLayer=((this.transparent!="true")&&(this.transparent!=true));}
60736 if(options&&options.useOverlay!=null){this.useOverlay=options.useOverlay;}
60737 if(this.singleTile){if(this.useOverlay){OpenLayers.Util.applyDefaults(this.params,this.OVERLAY_PARAMS);if(!this.useAsyncOverlay){this.params.version="1.0.0";}}else{OpenLayers.Util.applyDefaults(this.params,this.SINGLE_TILE_PARAMS);}}else{if(this.useHttpTile){OpenLayers.Util.applyDefaults(this.params,this.FOLDER_PARAMS);}else{OpenLayers.Util.applyDefaults(this.params,this.TILE_PARAMS);}
60738 this.setTileSize(this.defaultSize);}},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.MapGuide(this.name,this.url,this.params,this.getOptions());}
60739 obj=OpenLayers.Layer.Grid.prototype.clone.apply(this,[obj]);return obj;},addTile:function(bounds,position){return new OpenLayers.Tile.Image(this,position,bounds,null,this.tileSize);},getURL:function(bounds){var url;var center=bounds.getCenterLonLat();var mapSize=this.map.getSize();if(this.singleTile){var params={setdisplaydpi:OpenLayers.DOTS_PER_INCH,setdisplayheight:mapSize.h*this.ratio,setdisplaywidth:mapSize.w*this.ratio,setviewcenterx:center.lon,setviewcentery:center.lat,setviewscale:this.map.getScale()};if(this.useOverlay&&!this.useAsyncOverlay){var getVisParams={};getVisParams=OpenLayers.Util.extend(getVisParams,params);getVisParams.operation="GETVISIBLEMAPEXTENT";getVisParams.version="1.0.0";getVisParams.session=this.params.session;getVisParams.mapName=this.params.mapName;getVisParams.format='text/xml';url=this.getFullRequestString(getVisParams);OpenLayers.Request.GET({url:url,async:false});}
60740 url=this.getFullRequestString(params);}else{var currentRes=this.map.getResolution();var colidx=Math.floor((bounds.left-this.maxExtent.left)/currentRes);colidx=Math.round(colidx/this.tileSize.w);var rowidx=Math.floor((this.maxExtent.top-bounds.top)/currentRes);rowidx=Math.round(rowidx/this.tileSize.h);if(this.useHttpTile){url=this.getImageFilePath({tilecol:colidx,tilerow:rowidx,scaleindex:this.resolutions.length-this.map.zoom-1});}else{url=this.getFullRequestString({tilecol:colidx,tilerow:rowidx,scaleindex:this.resolutions.length-this.map.zoom-1});}}
60741 return url;},getFullRequestString:function(newParams,altUrl){var url=(altUrl==null)?this.url:altUrl;if(typeof url=="object"){url=url[Math.floor(Math.random()*url.length)];}
60742 var requestString=url;var allParams=OpenLayers.Util.extend({},this.params);allParams=OpenLayers.Util.extend(allParams,newParams);var urlParams=OpenLayers.Util.upperCaseObject(OpenLayers.Util.getParameters(url));for(var key in allParams){if(key.toUpperCase()in urlParams){delete allParams[key];}}
60743 var paramsString=OpenLayers.Util.getParameterString(allParams);paramsString=paramsString.replace(/,/g,"+");if(paramsString!=""){var lastServerChar=url.charAt(url.length-1);if((lastServerChar=="&")||(lastServerChar=="?")){requestString+=paramsString;}else{if(url.indexOf('?')==-1){requestString+='?'+paramsString;}else{requestString+='&'+paramsString;}}}
60744 return requestString;},getImageFilePath:function(newParams,altUrl){var url=(altUrl==null)?this.url:altUrl;if(typeof url=="object"){url=url[Math.floor(Math.random()*url.length)];}
60745 var requestString=url;var tileRowGroup="";var tileColGroup="";if(newParams.tilerow<0){tileRowGroup='-';}
60746 if(newParams.tilerow==0){tileRowGroup+='0';}else{tileRowGroup+=Math.floor(Math.abs(newParams.tilerow/this.params.tileRowsPerFolder))*this.params.tileRowsPerFolder;}
60747 if(newParams.tilecol<0){tileColGroup='-';}
60748 if(newParams.tilecol==0){tileColGroup+='0';}else{tileColGroup+=Math.floor(Math.abs(newParams.tilecol/this.params.tileColumnsPerFolder))*this.params.tileColumnsPerFolder;}
60749 var tilePath='/S'+Math.floor(newParams.scaleindex)
60750 +'/'+this.params.basemaplayergroupname
60751 +'/R'+tileRowGroup
60752 +'/C'+tileColGroup
60753 +'/'+(newParams.tilerow%this.params.tileRowsPerFolder)
60754 +'_'+(newParams.tilecol%this.params.tileColumnsPerFolder)
60755 +'.'+this.params.format;if(this.params.querystring){tilePath+="?"+this.params.querystring;}
60756 requestString+=tilePath;return requestString;},calculateGridLayout:function(bounds,extent,resolution){var tilelon=resolution*this.tileSize.w;var tilelat=resolution*this.tileSize.h;var offsetlon=bounds.left-extent.left;var tilecol=Math.floor(offsetlon/tilelon)-this.buffer;var tilecolremain=offsetlon/tilelon-tilecol;var tileoffsetx=-tilecolremain*this.tileSize.w;var tileoffsetlon=extent.left+tilecol*tilelon;var offsetlat=extent.top-bounds.top+tilelat;var tilerow=Math.floor(offsetlat/tilelat)-this.buffer;var tilerowremain=tilerow-offsetlat/tilelat;var tileoffsety=tilerowremain*this.tileSize.h;var tileoffsetlat=extent.top-tilelat*tilerow;return{tilelon:tilelon,tilelat:tilelat,tileoffsetlon:tileoffsetlon,tileoffsetlat:tileoffsetlat,tileoffsetx:tileoffsetx,tileoffsety:tileoffsety};},CLASS_NAME:"OpenLayers.Layer.MapGuide"});OpenLayers.Layer.MapServer=OpenLayers.Class(OpenLayers.Layer.Grid,{DEFAULT_PARAMS:{mode:"map",map_imagetype:"png"},initialize:function(name,url,params,options){var newArguments=[];newArguments.push(name,url,params,options);OpenLayers.Layer.Grid.prototype.initialize.apply(this,newArguments);this.params=OpenLayers.Util.applyDefaults(this.params,this.DEFAULT_PARAMS);if(options==null||options.isBaseLayer==null){this.isBaseLayer=((this.params.transparent!="true")&&(this.params.transparent!=true));}},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.MapServer(this.name,this.url,this.params,this.getOptions());}
60757 obj=OpenLayers.Layer.Grid.prototype.clone.apply(this,[obj]);return obj;},addTile:function(bounds,position){return new OpenLayers.Tile.Image(this,position,bounds,null,this.tileSize);},getURL:function(bounds){bounds=this.adjustBounds(bounds);var extent=[bounds.left,bounds.bottom,bounds.right,bounds.top];var imageSize=this.getImageSize();var url=this.getFullRequestString({mapext:extent,imgext:extent,map_size:[imageSize.w,imageSize.h],imgx:imageSize.w/2,imgy:imageSize.h/2,imgxy:[imageSize.w,imageSize.h]});return url;},getFullRequestString:function(newParams,altUrl){var url=(altUrl==null)?this.url:altUrl;var allParams=OpenLayers.Util.extend({},this.params);allParams=OpenLayers.Util.extend(allParams,newParams);var paramsString=OpenLayers.Util.getParameterString(allParams);if(url instanceof Array){url=this.selectUrl(paramsString,url);}
60758 var urlParams=OpenLayers.Util.upperCaseObject(OpenLayers.Util.getParameters(url));for(var key in allParams){if(key.toUpperCase()in urlParams){delete allParams[key];}}
60759 paramsString=OpenLayers.Util.getParameterString(allParams);var requestString=url;paramsString=paramsString.replace(/,/g,"+");if(paramsString!=""){var lastServerChar=url.charAt(url.length-1);if((lastServerChar=="&")||(lastServerChar=="?")){requestString+=paramsString;}else{if(url.indexOf('?')==-1){requestString+='?'+paramsString;}else{requestString+='&'+paramsString;}}}
60760 return requestString;},CLASS_NAME:"OpenLayers.Layer.MapServer"});OpenLayers.Layer.TMS=OpenLayers.Class(OpenLayers.Layer.Grid,{serviceVersion:"1.0.0",isBaseLayer:true,tileOrigin:null,serverResolutions:null,zoomOffset:0,initialize:function(name,url,options){var newArguments=[];newArguments.push(name,url,{},options);OpenLayers.Layer.Grid.prototype.initialize.apply(this,newArguments);},destroy:function(){OpenLayers.Layer.Grid.prototype.destroy.apply(this,arguments);},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.TMS(this.name,this.url,this.getOptions());}
60761 obj=OpenLayers.Layer.Grid.prototype.clone.apply(this,[obj]);return obj;},getURL:function(bounds){bounds=this.adjustBounds(bounds);var res=this.map.getResolution();var x=Math.round((bounds.left-this.tileOrigin.lon)/(res*this.tileSize.w));var y=Math.round((bounds.bottom-this.tileOrigin.lat)/(res*this.tileSize.h));var z=this.serverResolutions!=null?OpenLayers.Util.indexOf(this.serverResolutions,res):this.map.getZoom()+this.zoomOffset;var path=this.serviceVersion+"/"+this.layername+"/"+z+"/"+x+"/"+y+"."+this.type;var url=this.url;if(url instanceof Array){url=this.selectUrl(path,url);}
60762 return url+path;},addTile:function(bounds,position){return new OpenLayers.Tile.Image(this,position,bounds,null,this.tileSize);},setMap:function(map){OpenLayers.Layer.Grid.prototype.setMap.apply(this,arguments);if(!this.tileOrigin){this.tileOrigin=new OpenLayers.LonLat(this.map.maxExtent.left,this.map.maxExtent.bottom);}},CLASS_NAME:"OpenLayers.Layer.TMS"});OpenLayers.Layer.TileCache=OpenLayers.Class(OpenLayers.Layer.Grid,{isBaseLayer:true,format:'image/png',serverResolutions:null,initialize:function(name,url,layername,options){this.layername=layername;OpenLayers.Layer.Grid.prototype.initialize.apply(this,[name,url,{},options]);this.extension=this.format.split('/')[1].toLowerCase();this.extension=(this.extension=='jpg')?'jpeg':this.extension;},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.TileCache(this.name,this.url,this.layername,this.getOptions());}
60763 obj=OpenLayers.Layer.Grid.prototype.clone.apply(this,[obj]);return obj;},getURL:function(bounds){var res=this.map.getResolution();var bbox=this.maxExtent;var size=this.tileSize;var tileX=Math.round((bounds.left-bbox.left)/(res*size.w));var tileY=Math.round((bounds.bottom-bbox.bottom)/(res*size.h));var tileZ=this.serverResolutions!=null?OpenLayers.Util.indexOf(this.serverResolutions,res):this.map.getZoom();function zeroPad(number,length){number=String(number);var zeros=[];for(var i=0;i<length;++i){zeros.push('0');}
60764 return zeros.join('').substring(0,length-number.length)+number;}
60765 var components=[this.layername,zeroPad(tileZ,2),zeroPad(parseInt(tileX/1000000),3),zeroPad((parseInt(tileX/1000)%1000),3),zeroPad((parseInt(tileX)%1000),3),zeroPad(parseInt(tileY/1000000),3),zeroPad((parseInt(tileY/1000)%1000),3),zeroPad((parseInt(tileY)%1000),3)+'.'+this.extension];var path=components.join('/');var url=this.url;if(url instanceof Array){url=this.selectUrl(path,url);}
60766 url=(url.charAt(url.length-1)=='/')?url:url+'/';return url+path;},addTile:function(bounds,position){var url=this.getURL(bounds);return new OpenLayers.Tile.Image(this,position,bounds,url,this.tileSize);},CLASS_NAME:"OpenLayers.Layer.TileCache"});OpenLayers.Layer.WMS=OpenLayers.Class(OpenLayers.Layer.Grid,{DEFAULT_PARAMS:{service:"WMS",version:"1.1.1",request:"GetMap",styles:"",exceptions:"application/vnd.ogc.se_inimage",format:"image/jpeg"},reproject:false,isBaseLayer:true,encodeBBOX:false,noMagic:false,yx:{'EPSG:4326':true},initialize:function(name,url,params,options){var newArguments=[];params=OpenLayers.Util.upperCaseObject(params);if(parseFloat(params.VERSION)>=1.3&&!params.EXCEPTIONS){params.EXCEPTIONS="INIMAGE";}
60767 newArguments.push(name,url,params,options);OpenLayers.Layer.Grid.prototype.initialize.apply(this,newArguments);OpenLayers.Util.applyDefaults(this.params,OpenLayers.Util.upperCaseObject(this.DEFAULT_PARAMS));if(!this.noMagic&&this.params.TRANSPARENT&&this.params.TRANSPARENT.toString().toLowerCase()=="true"){if((options==null)||(!options.isBaseLayer)){this.isBaseLayer=false;}
60768 if(this.params.FORMAT=="image/jpeg"){this.params.FORMAT=OpenLayers.Util.alphaHack()?"image/gif":"image/png";}}},destroy:function(){OpenLayers.Layer.Grid.prototype.destroy.apply(this,arguments);},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.WMS(this.name,this.url,this.params,this.getOptions());}
60769 obj=OpenLayers.Layer.Grid.prototype.clone.apply(this,[obj]);return obj;},reverseAxisOrder:function(){return(parseFloat(this.params.VERSION)>=1.3&&!!this.yx[this.map.getProjectionObject().getCode()]);},getURL:function(bounds){bounds=this.adjustBounds(bounds);var imageSize=this.getImageSize();var newParams={};var reverseAxisOrder=this.reverseAxisOrder();newParams.BBOX=this.encodeBBOX?bounds.toBBOX(null,reverseAxisOrder):bounds.toArray(reverseAxisOrder);newParams.WIDTH=imageSize.w;newParams.HEIGHT=imageSize.h;var requestString=this.getFullRequestString(newParams);return requestString;},addTile:function(bounds,position){return new OpenLayers.Tile.Image(this,position,bounds,null,this.tileSize);},mergeNewParams:function(newParams){var upperParams=OpenLayers.Util.upperCaseObject(newParams);var newArguments=[upperParams];return OpenLayers.Layer.Grid.prototype.mergeNewParams.apply(this,newArguments);},getFullRequestString:function(newParams,altUrl){var projectionCode=this.map.getProjection();var value=(projectionCode=="none")?null:projectionCode
60770 if(parseFloat(this.params.VERSION)>=1.3){this.params.CRS=value;}else{this.params.SRS=value;}
60771 return OpenLayers.Layer.Grid.prototype.getFullRequestString.apply(this,arguments);},CLASS_NAME:"OpenLayers.Layer.WMS"});OpenLayers.Layer.WMTS=OpenLayers.Class(OpenLayers.Layer.Grid,{isBaseLayer:true,version:"1.0.0",requestEncoding:"KVP",url:null,layer:null,matrixSet:null,style:null,format:"image/jpeg",tileOrigin:null,tileFullExtent:null,formatSuffix:null,matrixIds:null,dimensions:null,params:null,zoomOffset:0,formatSuffixMap:{"image/png":"png","image/png8":"png","image/png24":"png","image/png32":"png","png":"png","image/jpeg":"jpg","image/jpg":"jpg","jpeg":"jpg","jpg":"jpg"},matrix:null,initialize:function(config){var required={url:true,layer:true,style:true,matrixSet:true};for(var prop in required){if(!(prop in config)){throw new Error("Missing property '"+prop+"' in layer configuration.");}}
60772 config.params=OpenLayers.Util.upperCaseObject(config.params);var args=[config.name,config.url,config.params,config];OpenLayers.Layer.Grid.prototype.initialize.apply(this,args);if(!this.formatSuffix){this.formatSuffix=this.formatSuffixMap[this.format]||this.format.split("/").pop();}
60773 if(this.matrixIds){var len=this.matrixIds.length;if(len&&typeof this.matrixIds[0]==="string"){var ids=this.matrixIds;this.matrixIds=new Array(len);for(var i=0;i<len;++i){this.matrixIds[i]={identifier:ids[i]};}}}},setMap:function(){OpenLayers.Layer.Grid.prototype.setMap.apply(this,arguments);this.updateMatrixProperties();},updateMatrixProperties:function(){this.matrix=this.getMatrix();if(this.matrix){if(this.matrix.topLeftCorner){this.tileOrigin=this.matrix.topLeftCorner;}
60774 if(this.matrix.tileWidth&&this.matrix.tileHeight){this.tileSize=new OpenLayers.Size(this.matrix.tileWidth,this.matrix.tileHeight);}
60775 if(!this.tileOrigin){this.tileOrigin=new OpenLayers.LonLat(this.maxExtent.left,this.maxExtent.top);}
60776 if(!this.tileFullExtent){this.tileFullExtent=this.maxExtent;}}},moveTo:function(bounds,zoomChanged,dragging){if(zoomChanged||!this.matrix){this.updateMatrixProperties();}
60777 return OpenLayers.Layer.Grid.prototype.moveTo.apply(this,arguments);},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.WMTS(this.options);}
60778 obj=OpenLayers.Layer.Grid.prototype.clone.apply(this,[obj]);return obj;},getMatrix:function(){var matrix;if(!this.matrixIds||this.matrixIds.length===0){matrix={identifier:this.map.getZoom()+this.zoomOffset};}else{if("scaleDenominator"in this.matrixIds[0]){var denom=OpenLayers.METERS_PER_INCH*OpenLayers.INCHES_PER_UNIT[this.units]*this.map.getResolution()/0.28E-3;var diff=Number.POSITIVE_INFINITY;var delta;for(var i=0,ii=this.matrixIds.length;i<ii;++i){delta=Math.abs(1-(this.matrixIds[i].scaleDenominator/denom));if(delta<diff){diff=delta;matrix=this.matrixIds[i];}}}else{matrix=this.matrixIds[this.map.getZoom()+this.zoomOffset];}}
60779 return matrix;},getTileInfo:function(loc){var res=this.map.getResolution();var fx=(loc.lon-this.tileOrigin.lon)/(res*this.tileSize.w);var fy=(this.tileOrigin.lat-loc.lat)/(res*this.tileSize.h);var col=Math.floor(fx);var row=Math.floor(fy);return{col:col,row:row,i:Math.floor((fx-col)*this.tileSize.w),j:Math.floor((fy-row)*this.tileSize.h)};},getURL:function(bounds){bounds=this.adjustBounds(bounds);var url="";if(!this.tileFullExtent||this.tileFullExtent.intersectsBounds(bounds)){var center=bounds.getCenterLonLat();var info=this.getTileInfo(center);var matrixId=this.matrix.identifier;if(this.requestEncoding.toUpperCase()==="REST"){var path=this.version+"/"+this.layer+"/"+this.style+"/";if(this.dimensions){for(var i=0;i<this.dimensions.length;i++){if(this.params[this.dimensions[i]]){path=path+this.params[this.dimensions[i]]+"/";}}}
60780 path=path+this.matrixSet+"/"+this.matrix.identifier+"/"+info.row+"/"+info.col+"."+this.formatSuffix;if(this.url instanceof Array){url=this.selectUrl(path,this.url);}else{url=this.url;}
60781 if(!url.match(/\/$/)){url=url+"/";}
60782 url=url+path;}else if(this.requestEncoding.toUpperCase()==="KVP"){var params={SERVICE:"WMTS",REQUEST:"GetTile",VERSION:this.version,LAYER:this.layer,STYLE:this.style,TILEMATRIXSET:this.matrixSet,TILEMATRIX:this.matrix.identifier,TILEROW:info.row,TILECOL:info.col,FORMAT:this.format};url=OpenLayers.Layer.Grid.prototype.getFullRequestString.apply(this,[params]);}}
60783 return url;},mergeNewParams:function(newParams){if(this.requestEncoding.toUpperCase()==="KVP"){return OpenLayers.Layer.Grid.prototype.mergeNewParams.apply(this,[OpenLayers.Util.upperCaseObject(newParams)]);}},addTile:function(bounds,position){return new OpenLayers.Tile.Image(this,position,bounds,null,this.tileSize);},CLASS_NAME:"OpenLayers.Layer.WMTS"});OpenLayers.Layer.WorldWind=OpenLayers.Class(OpenLayers.Layer.Grid,{DEFAULT_PARAMS:{},isBaseLayer:true,lzd:null,zoomLevels:null,initialize:function(name,url,lzd,zoomLevels,params,options){this.lzd=lzd;this.zoomLevels=zoomLevels;var newArguments=[];newArguments.push(name,url,params,options);OpenLayers.Layer.Grid.prototype.initialize.apply(this,newArguments);this.params=OpenLayers.Util.applyDefaults(this.params,this.DEFAULT_PARAMS);},addTile:function(bounds,position){return new OpenLayers.Tile.Image(this,position,bounds,null,this.tileSize);},getZoom:function(){var zoom=this.map.getZoom();var extent=this.map.getMaxExtent();zoom=zoom-Math.log(this.maxResolution/(this.lzd/512))/Math.log(2);return zoom;},getURL:function(bounds){bounds=this.adjustBounds(bounds);var zoom=this.getZoom();var extent=this.map.getMaxExtent();var deg=this.lzd/Math.pow(2,this.getZoom());var x=Math.floor((bounds.left-extent.left)/deg);var y=Math.floor((bounds.bottom-extent.bottom)/deg);if(this.map.getResolution()<=(this.lzd/512)&&this.getZoom()<=this.zoomLevels){return this.getFullRequestString({L:zoom,X:x,Y:y});}else{return OpenLayers.Util.getImagesLocation()+"blank.gif";}},CLASS_NAME:"OpenLayers.Layer.WorldWind"});OpenLayers.Layer.XYZ=OpenLayers.Class(OpenLayers.Layer.Grid,{isBaseLayer:true,sphericalMercator:false,zoomOffset:0,initialize:function(name,url,options){if(options&&options.sphericalMercator||this.sphericalMercator){options=OpenLayers.Util.extend({maxExtent:new OpenLayers.Bounds(-128*156543.0339,-128*156543.0339,128*156543.0339,128*156543.0339),maxResolution:156543.0339,numZoomLevels:19,units:"m",projection:"EPSG:900913"},options);}
60784 url=url||this.url;name=name||this.name;var newArguments=[name,url,{},options];OpenLayers.Layer.Grid.prototype.initialize.apply(this,newArguments);},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.XYZ(this.name,this.url,this.getOptions());}
60785 obj=OpenLayers.Layer.Grid.prototype.clone.apply(this,[obj]);return obj;},getURL:function(bounds){var res=this.map.getResolution();var x=Math.round((bounds.left-this.maxExtent.left)/(res*this.tileSize.w));var y=Math.round((this.maxExtent.top-bounds.top)/(res*this.tileSize.h));var z=this.map.getZoom()+this.zoomOffset;var url=this.url;var s=''+x+y+z;if(url instanceof Array)
60786 {url=this.selectUrl(s,url);}
60787 var path=OpenLayers.String.format(url,{'x':x,'y':y,'z':z});return path;},addTile:function(bounds,position){return new OpenLayers.Tile.Image(this,position,bounds,null,this.tileSize);},setMap:function(map){OpenLayers.Layer.Grid.prototype.setMap.apply(this,arguments);if(!this.tileOrigin){this.tileOrigin=new OpenLayers.LonLat(this.maxExtent.left,this.maxExtent.bottom);}},CLASS_NAME:"OpenLayers.Layer.XYZ"});OpenLayers.Layer.OSM=OpenLayers.Class(OpenLayers.Layer.XYZ,{name:"OpenStreetMap",attribution:"Data CC-By-SA by <a href='http://openstreetmap.org/'>OpenStreetMap</a>",sphericalMercator:true,url:'http://tile.openstreetmap.org/${z}/${x}/${y}.png',clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.OSM(this.name,this.url,this.getOptions());}
60788 obj=OpenLayers.Layer.XYZ.prototype.clone.apply(this,[obj]);return obj;},CLASS_NAME:"OpenLayers.Layer.OSM"});OpenLayers.Layer.Zoomify=OpenLayers.Class(OpenLayers.Layer.Grid,{url:null,size:null,isBaseLayer:true,standardTileSize:256,numberOfTiers:0,tileCountUpToTier:new Array(),tierSizeInTiles:new Array(),tierImageSize:new Array(),initialize:function(name,url,size,options){this.initializeZoomify(size);var newArguments=[];newArguments.push(name,url,size,{},options);OpenLayers.Layer.Grid.prototype.initialize.apply(this,newArguments);},initializeZoomify:function(size){var imageSize=size.clone()
60789 var tiles=new OpenLayers.Size(Math.ceil(imageSize.w/this.standardTileSize),Math.ceil(imageSize.h/this.standardTileSize));this.tierSizeInTiles.push(tiles);this.tierImageSize.push(imageSize);while(imageSize.w>this.standardTileSize||imageSize.h>this.standardTileSize){imageSize=new OpenLayers.Size(Math.floor(imageSize.w/2),Math.floor(imageSize.h/2));tiles=new OpenLayers.Size(Math.ceil(imageSize.w/this.standardTileSize),Math.ceil(imageSize.h/this.standardTileSize));this.tierSizeInTiles.push(tiles);this.tierImageSize.push(imageSize);}
60790 this.tierSizeInTiles.reverse();this.tierImageSize.reverse();this.numberOfTiers=this.tierSizeInTiles.length;this.tileCountUpToTier[0]=0;for(var i=1;i<this.numberOfTiers;i++){this.tileCountUpToTier.push(this.tierSizeInTiles[i-1].w*this.tierSizeInTiles[i-1].h+
60791 this.tileCountUpToTier[i-1]);}},destroy:function(){OpenLayers.Layer.Grid.prototype.destroy.apply(this,arguments);this.tileCountUpToTier.length=0
60792 this.tierSizeInTiles.length=0
60793 this.tierImageSize.length=0},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.Zoomify(this.name,this.url,this.size,this.options);}
60794 obj=OpenLayers.Layer.Grid.prototype.clone.apply(this,[obj]);return obj;},getURL:function(bounds){bounds=this.adjustBounds(bounds);var res=this.map.getResolution();var x=Math.round((bounds.left-this.tileOrigin.lon)/(res*this.tileSize.w));var y=Math.round((this.tileOrigin.lat-bounds.top)/(res*this.tileSize.h));var z=this.map.getZoom();var tileIndex=x+y*this.tierSizeInTiles[z].w+this.tileCountUpToTier[z];var path="TileGroup"+Math.floor((tileIndex)/256)+"/"+z+"-"+x+"-"+y+".jpg";var url=this.url;if(url instanceof Array){url=this.selectUrl(path,url);}
60795 return url+path;},getImageSize:function(){if(arguments.length>0){bounds=this.adjustBounds(arguments[0]);var res=this.map.getResolution();var x=Math.round((bounds.left-this.tileOrigin.lon)/(res*this.tileSize.w));var y=Math.round((this.tileOrigin.lat-bounds.top)/(res*this.tileSize.h));var z=this.map.getZoom();var w=this.standardTileSize;var h=this.standardTileSize;if(x==this.tierSizeInTiles[z].w-1){var w=this.tierImageSize[z].w%this.standardTileSize;};if(y==this.tierSizeInTiles[z].h-1){var h=this.tierImageSize[z].h%this.standardTileSize;};return(new OpenLayers.Size(w,h));}else{return this.tileSize;}},addTile:function(bounds,position){return new OpenLayers.Tile.Image(this,position,bounds,null,this.tileSize);},setMap:function(map){OpenLayers.Layer.Grid.prototype.setMap.apply(this,arguments);this.tileOrigin=new OpenLayers.LonLat(this.map.maxExtent.left,this.map.maxExtent.top);},calculateGridLayout:function(bounds,extent,resolution){var tilelon=resolution*this.tileSize.w;var tilelat=resolution*this.tileSize.h;var offsetlon=bounds.left-extent.left;var tilecol=Math.floor(offsetlon/tilelon)-this.buffer;var tilecolremain=offsetlon/tilelon-tilecol;var tileoffsetx=-tilecolremain*this.tileSize.w;var tileoffsetlon=extent.left+tilecol*tilelon;var offsetlat=extent.top-bounds.top+tilelat;var tilerow=Math.floor(offsetlat/tilelat)-this.buffer;var tilerowremain=tilerow-offsetlat/tilelat;var tileoffsety=tilerowremain*this.tileSize.h;var tileoffsetlat=extent.top-tilelat*tilerow;return{tilelon:tilelon,tilelat:tilelat,tileoffsetlon:tileoffsetlon,tileoffsetlat:tileoffsetlat,tileoffsetx:tileoffsetx,tileoffsety:tileoffsety};},CLASS_NAME:"OpenLayers.Layer.Zoomify"});OpenLayers.Protocol.SQL.Gears=OpenLayers.Class(OpenLayers.Protocol.SQL,{FID_PREFIX:'__gears_fid__',NULL_GEOMETRY:'__gears_null_geometry__',NULL_FEATURE_STATE:'__gears_null_feature_state__',jsonParser:null,wktParser:null,fidRegExp:null,saveFeatureState:true,typeOfFid:"string",db:null,initialize:function(options){if(!this.supported()){return;}
60796 OpenLayers.Protocol.SQL.prototype.initialize.apply(this,[options]);this.jsonParser=new OpenLayers.Format.JSON();this.wktParser=new OpenLayers.Format.WKT();this.fidRegExp=new RegExp('^'+this.FID_PREFIX);this.initializeDatabase();},initializeDatabase:function(){this.db=google.gears.factory.create('beta.database');this.db.open(this.databaseName);this.db.execute("CREATE TABLE IF NOT EXISTS "+this.tableName+" (fid TEXT UNIQUE, geometry TEXT, properties TEXT,"+"  state TEXT)");},destroy:function(){this.db.close();this.db=null;this.jsonParser=null;this.wktParser=null;OpenLayers.Protocol.SQL.prototype.destroy.apply(this);},supported:function(){return!!(window.google&&google.gears);},read:function(options){OpenLayers.Protocol.prototype.read.apply(this,arguments);options=OpenLayers.Util.applyDefaults(options,this.options);var feature,features=[];var rs=this.db.execute("SELECT * FROM "+this.tableName);while(rs.isValidRow()){feature=this.unfreezeFeature(rs);if(this.evaluateFilter(feature,options.filter)){if(!options.noFeatureStateReset){feature.state=null;}
60797 features.push(feature);}
60798 rs.next();}
60799 rs.close();var resp=new OpenLayers.Protocol.Response({code:OpenLayers.Protocol.Response.SUCCESS,requestType:"read",features:features});if(options&&options.callback){options.callback.call(options.scope,resp);}
60800 return resp;},unfreezeFeature:function(row){var feature;var wkt=row.fieldByName('geometry');if(wkt==this.NULL_GEOMETRY){feature=new OpenLayers.Feature.Vector();}else{feature=this.wktParser.read(wkt);}
60801 feature.attributes=this.jsonParser.read(row.fieldByName('properties'));feature.fid=this.extractFidFromField(row.fieldByName('fid'));var state=row.fieldByName('state');if(state==this.NULL_FEATURE_STATE){state=null;}
60802 feature.state=state;return feature;},extractFidFromField:function(field){if(!field.match(this.fidRegExp)&&this.typeOfFid=="number"){field=parseFloat(field);}
60803 return field;},create:function(features,options){options=OpenLayers.Util.applyDefaults(options,this.options);var resp=this.createOrUpdate(features);resp.requestType="create";if(options&&options.callback){options.callback.call(options.scope,resp);}
60804 return resp;},update:function(features,options){options=OpenLayers.Util.applyDefaults(options,this.options);var resp=this.createOrUpdate(features);resp.requestType="update";if(options&&options.callback){options.callback.call(options.scope,resp);}
60805 return resp;},createOrUpdate:function(features){if(!(features instanceof Array)){features=[features];}
60806 var i,len=features.length,feature;var insertedFeatures=new Array(len);for(i=0;i<len;i++){feature=features[i];var params=this.freezeFeature(feature);this.db.execute("REPLACE INTO "+this.tableName+" (fid, geometry, properties, state)"+" VALUES (?, ?, ?, ?)",params);var clone=feature.clone();clone.fid=this.extractFidFromField(params[0]);insertedFeatures[i]=clone;}
60807 return new OpenLayers.Protocol.Response({code:OpenLayers.Protocol.Response.SUCCESS,features:insertedFeatures,reqFeatures:features});},freezeFeature:function(feature){feature.fid=feature.fid!=null?""+feature.fid:OpenLayers.Util.createUniqueID(this.FID_PREFIX);var geometry=feature.geometry!=null?feature.geometry.toString():this.NULL_GEOMETRY;var properties=this.jsonParser.write(feature.attributes);var state=this.getFeatureStateForFreeze(feature);return[feature.fid,geometry,properties,state];},getFeatureStateForFreeze:function(feature){var state;if(!this.saveFeatureState){state=this.NULL_FEATURE_STATE;}else if(this.createdOffline(feature)){state=OpenLayers.State.INSERT;}else{state=feature.state;}
60808 return state;},"delete":function(features,options){if(!(features instanceof Array)){features=[features];}
60809 options=OpenLayers.Util.applyDefaults(options,this.options);var i,len,feature;for(i=0,len=features.length;i<len;i++){feature=features[i];if(this.saveFeatureState&&!this.createdOffline(feature)){var toDelete=feature.clone();toDelete.fid=feature.fid;if(toDelete.geometry){toDelete.geometry.destroy();toDelete.geometry=null;}
60810 toDelete.state=feature.state;this.createOrUpdate(toDelete);}else{this.db.execute("DELETE FROM "+this.tableName+" WHERE fid = ?",[feature.fid]);}}
60811 var resp=new OpenLayers.Protocol.Response({code:OpenLayers.Protocol.Response.SUCCESS,requestType:"delete",reqFeatures:features});if(options&&options.callback){options.callback.call(options.scope,resp);}
60812 return resp;},createdOffline:function(feature){return(typeof feature.fid=="string"&&!!(feature.fid.match(this.fidRegExp)));},commit:function(features,options){var opt,resp=[],nRequests=0,nResponses=0;function callback(resp){if(++nResponses<nRequests){resp.last=false;}
60813 this.callUserCallback(options,resp);}
60814 var feature,toCreate=[],toUpdate=[],toDelete=[];for(var i=features.length-1;i>=0;i--){feature=features[i];switch(feature.state){case OpenLayers.State.INSERT:toCreate.push(feature);break;case OpenLayers.State.UPDATE:toUpdate.push(feature);break;case OpenLayers.State.DELETE:toDelete.push(feature);break;}}
60815 if(toCreate.length>0){nRequests++;opt=OpenLayers.Util.applyDefaults({"callback":callback,"scope":this},options.create);resp.push(this.create(toCreate,opt));}
60816 if(toUpdate.length>0){nRequests++;opt=OpenLayers.Util.applyDefaults({"callback":callback,"scope":this},options.update);resp.push(this.update(toUpdate,opt));}
60817 if(toDelete.length>0){nRequests++;opt=OpenLayers.Util.applyDefaults({"callback":callback,"scope":this},options["delete"]);resp.push(this["delete"](toDelete,opt));}
60818 return resp;},clear:function(){this.db.execute("DELETE FROM "+this.tableName);},callUserCallback:function(options,resp){var opt=options[resp.requestType];if(opt&&opt.callback){opt.callback.call(opt.scope,resp);}
60819 if(resp.last&&options.callback){options.callback.call(options.scope);}},CLASS_NAME:"OpenLayers.Protocol.SQL.Gears"});OpenLayers.Rule=OpenLayers.Class({id:null,name:null,title:null,description:null,context:null,filter:null,elseFilter:false,symbolizer:null,symbolizers:null,minScaleDenominator:null,maxScaleDenominator:null,initialize:function(options){this.symbolizer={};OpenLayers.Util.extend(this,options);if(this.symbolizers){delete this.symbolizer;}
60820 this.id=OpenLayers.Util.createUniqueID(this.CLASS_NAME+"_");},destroy:function(){for(var i in this.symbolizer){this.symbolizer[i]=null;}
60821 this.symbolizer=null;delete this.symbolizers;},evaluate:function(feature){var context=this.getContext(feature);var applies=true;if(this.minScaleDenominator||this.maxScaleDenominator){var scale=feature.layer.map.getScale();}
60822 if(this.minScaleDenominator){applies=scale>=OpenLayers.Style.createLiteral(this.minScaleDenominator,context);}
60823 if(applies&&this.maxScaleDenominator){applies=scale<OpenLayers.Style.createLiteral(this.maxScaleDenominator,context);}
60824 if(applies&&this.filter){if(this.filter.CLASS_NAME=="OpenLayers.Filter.FeatureId"){applies=this.filter.evaluate(feature);}else{applies=this.filter.evaluate(context);}}
60825 return applies;},getContext:function(feature){var context=this.context;if(!context){context=feature.attributes||feature.data;}
60826 if(typeof this.context=="function"){context=this.context(feature);}
60827 return context;},clone:function(){var options=OpenLayers.Util.extend({},this);if(this.symbolizers){var len=this.symbolizers.length;options.symbolizers=new Array(len);for(var i=0;i<len;++i){options.symbolizers[i]=this.symbolizers[i].clone();}}else{options.symbolizer={};var value,type;for(var key in this.symbolizer){value=this.symbolizer[key];type=typeof value;if(type==="object"){options.symbolizer[key]=OpenLayers.Util.extend({},value);}else if(type==="string"){options.symbolizer[key]=value;}}}
60828 options.filter=this.filter&&this.filter.clone();options.context=this.context&&OpenLayers.Util.extend({},this.context);return new OpenLayers.Rule(options);},CLASS_NAME:"OpenLayers.Rule"});OpenLayers.StyleMap=OpenLayers.Class({styles:null,extendDefault:true,initialize:function(style,options){this.styles={"default":new OpenLayers.Style(OpenLayers.Feature.Vector.style["default"]),"select":new OpenLayers.Style(OpenLayers.Feature.Vector.style["select"]),"temporary":new OpenLayers.Style(OpenLayers.Feature.Vector.style["temporary"]),"delete":new OpenLayers.Style(OpenLayers.Feature.Vector.style["delete"])};if(style instanceof OpenLayers.Style){this.styles["default"]=style;this.styles["select"]=style;this.styles["temporary"]=style;this.styles["delete"]=style;}else if(typeof style=="object"){for(var key in style){if(style[key]instanceof OpenLayers.Style){this.styles[key]=style[key];}else if(typeof style[key]=="object"){this.styles[key]=new OpenLayers.Style(style[key]);}else{this.styles["default"]=new OpenLayers.Style(style);this.styles["select"]=new OpenLayers.Style(style);this.styles["temporary"]=new OpenLayers.Style(style);this.styles["delete"]=new OpenLayers.Style(style);break;}}}
60829 OpenLayers.Util.extend(this,options);},destroy:function(){for(var key in this.styles){this.styles[key].destroy();}
60830 this.styles=null;},createSymbolizer:function(feature,intent){if(!feature){feature=new OpenLayers.Feature.Vector();}
60831 if(!this.styles[intent]){intent="default";}
60832 feature.renderIntent=intent;var defaultSymbolizer={};if(this.extendDefault&&intent!="default"){defaultSymbolizer=this.styles["default"].createSymbolizer(feature);}
60833 return OpenLayers.Util.extend(defaultSymbolizer,this.styles[intent].createSymbolizer(feature));},addUniqueValueRules:function(renderIntent,property,symbolizers,context){var rules=[];for(var value in symbolizers){rules.push(new OpenLayers.Rule({symbolizer:symbolizers[value],context:context,filter:new OpenLayers.Filter.Comparison({type:OpenLayers.Filter.Comparison.EQUAL_TO,property:property,value:value})}));}
60834 this.styles[renderIntent].addRules(rules);},CLASS_NAME:"OpenLayers.StyleMap"});OpenLayers.Control.NavToolbar=OpenLayers.Class(OpenLayers.Control.Panel,{initialize:function(options){OpenLayers.Control.Panel.prototype.initialize.apply(this,[options]);this.addControls([new OpenLayers.Control.Navigation(),new OpenLayers.Control.ZoomBox()]);},draw:function(){var div=OpenLayers.Control.Panel.prototype.draw.apply(this,arguments);this.activateControl(this.controls[0]);return div;},CLASS_NAME:"OpenLayers.Control.NavToolbar"});OpenLayers.Filter.Comparison=OpenLayers.Class(OpenLayers.Filter,{type:null,property:null,value:null,matchCase:true,lowerBoundary:null,upperBoundary:null,initialize:function(options){OpenLayers.Filter.prototype.initialize.apply(this,[options]);},evaluate:function(context){if(context instanceof OpenLayers.Feature.Vector){context=context.attributes;}
60835 var result=false;var got=context[this.property];switch(this.type){case OpenLayers.Filter.Comparison.EQUAL_TO:var exp=this.value;if(!this.matchCase&&typeof got=="string"&&typeof exp=="string"){result=(got.toUpperCase()==exp.toUpperCase());}else{result=(got==exp);}
60836 break;case OpenLayers.Filter.Comparison.NOT_EQUAL_TO:var exp=this.value;if(!this.matchCase&&typeof got=="string"&&typeof exp=="string"){result=(got.toUpperCase()!=exp.toUpperCase());}else{result=(got!=exp);}
60837 break;case OpenLayers.Filter.Comparison.LESS_THAN:result=got<this.value;break;case OpenLayers.Filter.Comparison.GREATER_THAN:result=got>this.value;break;case OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO:result=got<=this.value;break;case OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO:result=got>=this.value;break;case OpenLayers.Filter.Comparison.BETWEEN:result=(got>=this.lowerBoundary)&&(got<=this.upperBoundary);break;case OpenLayers.Filter.Comparison.LIKE:var regexp=new RegExp(this.value,"gi");result=regexp.test(got);break;}
60838 return result;},value2regex:function(wildCard,singleChar,escapeChar){if(wildCard=="."){var msg="'.' is an unsupported wildCard character for "+"OpenLayers.Filter.Comparison";OpenLayers.Console.error(msg);return null;}
60839 wildCard=wildCard?wildCard:"*";singleChar=singleChar?singleChar:".";escapeChar=escapeChar?escapeChar:"!";this.value=this.value.replace(new RegExp("\\"+escapeChar+"(.|$)","g"),"\\$1");this.value=this.value.replace(new RegExp("\\"+singleChar,"g"),".");this.value=this.value.replace(new RegExp("\\"+wildCard,"g"),".*");this.value=this.value.replace(new RegExp("\\\\.\\*","g"),"\\"+wildCard);this.value=this.value.replace(new RegExp("\\\\\\.","g"),"\\"+singleChar);return this.value;},regex2value:function(){var value=this.value;value=value.replace(/!/g,"!!");value=value.replace(/(\\)?\\\./g,function($0,$1){return $1?$0:"!.";});value=value.replace(/(\\)?\\\*/g,function($0,$1){return $1?$0:"!*";});value=value.replace(/\\\\/g,"\\");value=value.replace(/\.\*/g,"*");return value;},clone:function(){return OpenLayers.Util.extend(new OpenLayers.Filter.Comparison(),this);},CLASS_NAME:"OpenLayers.Filter.Comparison"});OpenLayers.Filter.Comparison.EQUAL_TO="==";OpenLayers.Filter.Comparison.NOT_EQUAL_TO="!=";OpenLayers.Filter.Comparison.LESS_THAN="<";OpenLayers.Filter.Comparison.GREATER_THAN=">";OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO="<=";OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO=">=";OpenLayers.Filter.Comparison.BETWEEN="..";OpenLayers.Filter.Comparison.LIKE="~";OpenLayers.Filter.FeatureId=OpenLayers.Class(OpenLayers.Filter,{fids:null,initialize:function(options){this.fids=[];OpenLayers.Filter.prototype.initialize.apply(this,[options]);},evaluate:function(feature){for(var i=0,len=this.fids.length;i<len;i++){var fid=feature.fid||feature.id;if(fid==this.fids[i]){return true;}}
60840 return false;},clone:function(){var filter=new OpenLayers.Filter.FeatureId();OpenLayers.Util.extend(filter,this);filter.fids=this.fids.slice();return filter;},CLASS_NAME:"OpenLayers.Filter.FeatureId"});OpenLayers.Filter.Logical=OpenLayers.Class(OpenLayers.Filter,{filters:null,type:null,initialize:function(options){this.filters=[];OpenLayers.Filter.prototype.initialize.apply(this,[options]);},destroy:function(){this.filters=null;OpenLayers.Filter.prototype.destroy.apply(this);},evaluate:function(context){switch(this.type){case OpenLayers.Filter.Logical.AND:for(var i=0,len=this.filters.length;i<len;i++){if(this.filters[i].evaluate(context)==false){return false;}}
60841 return true;case OpenLayers.Filter.Logical.OR:for(var i=0,len=this.filters.length;i<len;i++){if(this.filters[i].evaluate(context)==true){return true;}}
60842 return false;case OpenLayers.Filter.Logical.NOT:return(!this.filters[0].evaluate(context));}},clone:function(){var filters=[];for(var i=0,len=this.filters.length;i<len;++i){filters.push(this.filters[i].clone());}
60843 return new OpenLayers.Filter.Logical({type:this.type,filters:filters});},CLASS_NAME:"OpenLayers.Filter.Logical"});OpenLayers.Filter.Logical.AND="&&";OpenLayers.Filter.Logical.OR="||";OpenLayers.Filter.Logical.NOT="!";OpenLayers.Filter.Spatial=OpenLayers.Class(OpenLayers.Filter,{type:null,property:null,value:null,distance:null,distanceUnits:null,initialize:function(options){OpenLayers.Filter.prototype.initialize.apply(this,[options]);},evaluate:function(feature){var intersect=false;switch(this.type){case OpenLayers.Filter.Spatial.BBOX:case OpenLayers.Filter.Spatial.INTERSECTS:if(feature.geometry){var geom=this.value;if(this.value.CLASS_NAME=="OpenLayers.Bounds"){geom=this.value.toGeometry();}
60844 if(feature.geometry.intersects(geom)){intersect=true;}}
60845 break;default:OpenLayers.Console.error(OpenLayers.i18n("filterEvaluateNotImplemented"));break;}
60846 return intersect;},clone:function(){var options=OpenLayers.Util.applyDefaults({value:this.value&&this.value.clone&&this.value.clone()},this);return new OpenLayers.Filter.Spatial(options);},CLASS_NAME:"OpenLayers.Filter.Spatial"});OpenLayers.Filter.Spatial.BBOX="BBOX";OpenLayers.Filter.Spatial.INTERSECTS="INTERSECTS";OpenLayers.Filter.Spatial.DWITHIN="DWITHIN";OpenLayers.Filter.Spatial.WITHIN="WITHIN";OpenLayers.Filter.Spatial.CONTAINS="CONTAINS";OpenLayers.Geometry.Collection=OpenLayers.Class(OpenLayers.Geometry,{components:null,componentTypes:null,initialize:function(components){OpenLayers.Geometry.prototype.initialize.apply(this,arguments);this.components=[];if(components!=null){this.addComponents(components);}},destroy:function(){this.components.length=0;this.components=null;OpenLayers.Geometry.prototype.destroy.apply(this,arguments);},clone:function(){var geometry=eval("new "+this.CLASS_NAME+"()");for(var i=0,len=this.components.length;i<len;i++){geometry.addComponent(this.components[i].clone());}
60847 OpenLayers.Util.applyDefaults(geometry,this);return geometry;},getComponentsString:function(){var strings=[];for(var i=0,len=this.components.length;i<len;i++){strings.push(this.components[i].toShortString());}
60848 return strings.join(",");},calculateBounds:function(){this.bounds=null;if(this.components&&this.components.length>0){this.setBounds(this.components[0].getBounds());for(var i=1,len=this.components.length;i<len;i++){this.extendBounds(this.components[i].getBounds());}}},addComponents:function(components){if(!(components instanceof Array)){components=[components];}
60849 for(var i=0,len=components.length;i<len;i++){this.addComponent(components[i]);}},addComponent:function(component,index){var added=false;if(component){if(this.componentTypes==null||(OpenLayers.Util.indexOf(this.componentTypes,component.CLASS_NAME)>-1)){if(index!=null&&(index<this.components.length)){var components1=this.components.slice(0,index);var components2=this.components.slice(index,this.components.length);components1.push(component);this.components=components1.concat(components2);}else{this.components.push(component);}
60850 component.parent=this;this.clearBounds();added=true;}}
60851 return added;},removeComponents:function(components){if(!(components instanceof Array)){components=[components];}
60852 for(var i=components.length-1;i>=0;--i){this.removeComponent(components[i]);}},removeComponent:function(component){OpenLayers.Util.removeItem(this.components,component);this.clearBounds();},getLength:function(){var length=0.0;for(var i=0,len=this.components.length;i<len;i++){length+=this.components[i].getLength();}
60853 return length;},getArea:function(){var area=0.0;for(var i=0,len=this.components.length;i<len;i++){area+=this.components[i].getArea();}
60854 return area;},getGeodesicArea:function(projection){var area=0.0;for(var i=0,len=this.components.length;i<len;i++){area+=this.components[i].getGeodesicArea(projection);}
60855 return area;},getCentroid:function(weighted){if(!weighted){return this.components.length&&this.components[0].getCentroid();}
60856 var len=this.components.length;if(!len){return false;}
60857 var areas=[];var centroids=[];var areaSum=0;var minArea=Number.MAX_VALUE;var component;for(var i=0;i<len;++i){component=this.components[i];var area=component.getArea();var centroid=component.getCentroid(true);if(isNaN(area)||isNaN(centroid.x)||isNaN(centroid.y)){continue;}
60858 areas.push(area);areaSum+=area;minArea=(area<minArea&&area>0)?area:minArea;centroids.push(centroid);}
60859 len=areas.length;if(areaSum===0){for(var i=0;i<len;++i){areas[i]=1;}
60860 areaSum=areas.length;}else{for(var i=0;i<len;++i){areas[i]/=minArea;}
60861 areaSum/=minArea;}
60862 var xSum=0,ySum=0,centroid,area;for(var i=0;i<len;++i){centroid=centroids[i];area=areas[i];xSum+=centroid.x*area;ySum+=centroid.y*area;}
60863 return new OpenLayers.Geometry.Point(xSum/areaSum,ySum/areaSum);},getGeodesicLength:function(projection){var length=0.0;for(var i=0,len=this.components.length;i<len;i++){length+=this.components[i].getGeodesicLength(projection);}
60864 return length;},move:function(x,y){for(var i=0,len=this.components.length;i<len;i++){this.components[i].move(x,y);}},rotate:function(angle,origin){for(var i=0,len=this.components.length;i<len;++i){this.components[i].rotate(angle,origin);}},resize:function(scale,origin,ratio){for(var i=0;i<this.components.length;++i){this.components[i].resize(scale,origin,ratio);}
60865 return this;},distanceTo:function(geometry,options){var edge=!(options&&options.edge===false);var details=edge&&options&&options.details;var result,best,distance;var min=Number.POSITIVE_INFINITY;for(var i=0,len=this.components.length;i<len;++i){result=this.components[i].distanceTo(geometry,options);distance=details?result.distance:result;if(distance<min){min=distance;best=result;if(min==0){break;}}}
60866 return best;},equals:function(geometry){var equivalent=true;if(!geometry||!geometry.CLASS_NAME||(this.CLASS_NAME!=geometry.CLASS_NAME)){equivalent=false;}else if(!(geometry.components instanceof Array)||(geometry.components.length!=this.components.length)){equivalent=false;}else{for(var i=0,len=this.components.length;i<len;++i){if(!this.components[i].equals(geometry.components[i])){equivalent=false;break;}}}
60867 return equivalent;},transform:function(source,dest){if(source&&dest){for(var i=0,len=this.components.length;i<len;i++){var component=this.components[i];component.transform(source,dest);}
60868 this.bounds=null;}
60869 return this;},intersects:function(geometry){var intersect=false;for(var i=0,len=this.components.length;i<len;++i){intersect=geometry.intersects(this.components[i]);if(intersect){break;}}
60870 return intersect;},getVertices:function(nodes){var vertices=[];for(var i=0,len=this.components.length;i<len;++i){Array.prototype.push.apply(vertices,this.components[i].getVertices(nodes));}
60871 return vertices;},CLASS_NAME:"OpenLayers.Geometry.Collection"});OpenLayers.Geometry.Point=OpenLayers.Class(OpenLayers.Geometry,{x:null,y:null,initialize:function(x,y){OpenLayers.Geometry.prototype.initialize.apply(this,arguments);this.x=parseFloat(x);this.y=parseFloat(y);},clone:function(obj){if(obj==null){obj=new OpenLayers.Geometry.Point(this.x,this.y);}
60872 OpenLayers.Util.applyDefaults(obj,this);return obj;},calculateBounds:function(){this.bounds=new OpenLayers.Bounds(this.x,this.y,this.x,this.y);},distanceTo:function(geometry,options){var edge=!(options&&options.edge===false);var details=edge&&options&&options.details;var distance,x0,y0,x1,y1,result;if(geometry instanceof OpenLayers.Geometry.Point){x0=this.x;y0=this.y;x1=geometry.x;y1=geometry.y;distance=Math.sqrt(Math.pow(x0-x1,2)+Math.pow(y0-y1,2));result=!details?distance:{x0:x0,y0:y0,x1:x1,y1:y1,distance:distance};}else{result=geometry.distanceTo(this,options);if(details){result={x0:result.x1,y0:result.y1,x1:result.x0,y1:result.y0,distance:result.distance};}}
60873 return result;},equals:function(geom){var equals=false;if(geom!=null){equals=((this.x==geom.x&&this.y==geom.y)||(isNaN(this.x)&&isNaN(this.y)&&isNaN(geom.x)&&isNaN(geom.y)));}
60874 return equals;},toShortString:function(){return(this.x+", "+this.y);},move:function(x,y){this.x=this.x+x;this.y=this.y+y;this.clearBounds();},rotate:function(angle,origin){angle*=Math.PI/180;var radius=this.distanceTo(origin);var theta=angle+Math.atan2(this.y-origin.y,this.x-origin.x);this.x=origin.x+(radius*Math.cos(theta));this.y=origin.y+(radius*Math.sin(theta));this.clearBounds();},getCentroid:function(){return new OpenLayers.Geometry.Point(this.x,this.y);},resize:function(scale,origin,ratio){ratio=(ratio==undefined)?1:ratio;this.x=origin.x+(scale*ratio*(this.x-origin.x));this.y=origin.y+(scale*(this.y-origin.y));this.clearBounds();return this;},intersects:function(geometry){var intersect=false;if(geometry.CLASS_NAME=="OpenLayers.Geometry.Point"){intersect=this.equals(geometry);}else{intersect=geometry.intersects(this);}
60875 return intersect;},transform:function(source,dest){if((source&&dest)){OpenLayers.Projection.transform(this,source,dest);this.bounds=null;}
60876 return this;},getVertices:function(nodes){return[this];},CLASS_NAME:"OpenLayers.Geometry.Point"});OpenLayers.Geometry.Rectangle=OpenLayers.Class(OpenLayers.Geometry,{x:null,y:null,width:null,height:null,initialize:function(x,y,width,height){OpenLayers.Geometry.prototype.initialize.apply(this,arguments);this.x=x;this.y=y;this.width=width;this.height=height;},calculateBounds:function(){this.bounds=new OpenLayers.Bounds(this.x,this.y,this.x+this.width,this.y+this.height);},getLength:function(){var length=(2*this.width)+(2*this.height);return length;},getArea:function(){var area=this.width*this.height;return area;},CLASS_NAME:"OpenLayers.Geometry.Rectangle"});OpenLayers.Geometry.Surface=OpenLayers.Class(OpenLayers.Geometry,{initialize:function(){OpenLayers.Geometry.prototype.initialize.apply(this,arguments);},CLASS_NAME:"OpenLayers.Geometry.Surface"});OpenLayers.Layer.KaMapCache=OpenLayers.Class(OpenLayers.Layer.KaMap,{IMAGE_EXTENSIONS:{'jpeg':'jpg','gif':'gif','png':'png','png8':'png','png24':'png','dithered':'png'},DEFAULT_FORMAT:'jpeg',initialize:function(name,url,params,options){OpenLayers.Layer.KaMap.prototype.initialize.apply(this,arguments);this.extension=this.IMAGE_EXTENSIONS[this.params.i.toLowerCase()||DEFAULT_FORMAT];},getURL:function(bounds){bounds=this.adjustBounds(bounds);var mapRes=this.map.getResolution();var scale=Math.round((this.map.getScale()*10000))/10000;var pX=Math.round(bounds.left/mapRes);var pY=-Math.round(bounds.top/mapRes);var metaX=Math.floor(pX/this.tileSize.w/this.params.metaTileSize.w)*this.tileSize.w*this.params.metaTileSize.w;var metaY=Math.floor(pY/this.tileSize.h/this.params.metaTileSize.h)*this.tileSize.h*this.params.metaTileSize.h;var url=this.url;if(url instanceof Array){url=this.selectUrl(paramsString,url);}
60877 var components=[url,"/",this.params.map,"/",scale,"/",this.params.g.replace(/\s/g,'_'),"/def/t",metaY,"/l",metaX,"/t",pY,"l",pX,".",this.extension];return components.join("");},CLASS_NAME:"OpenLayers.Layer.KaMapCache"});OpenLayers.Layer.MapServer.Untiled=OpenLayers.Class(OpenLayers.Layer.MapServer,{singleTile:true,initialize:function(name,url,params,options){OpenLayers.Layer.MapServer.prototype.initialize.apply(this,arguments);var msg="The OpenLayers.Layer.MapServer.Untiled class is deprecated and "+"will be removed in 3.0. Instead, you should use the "+"normal OpenLayers.Layer.MapServer class, passing it the option "+"'singleTile' as true.";OpenLayers.Console.warn(msg);},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.MapServer.Untiled(this.name,this.url,this.params,this.getOptions());}
60878 obj=OpenLayers.Layer.MapServer.prototype.clone.apply(this,[obj]);return obj;},CLASS_NAME:"OpenLayers.Layer.MapServer.Untiled"});OpenLayers.Layer.Vector=OpenLayers.Class(OpenLayers.Layer,{EVENT_TYPES:["beforefeatureadded","beforefeaturesadded","featureadded","featuresadded","beforefeatureremoved","beforefeaturesremoved","featureremoved","featuresremoved","beforefeatureselected","featureselected","featureunselected","beforefeaturemodified","featuremodified","afterfeaturemodified","vertexmodified","sketchstarted","sketchmodified","sketchcomplete","refresh"],isBaseLayer:false,isFixed:false,isVector:true,features:null,filter:null,selectedFeatures:null,unrenderedFeatures:null,reportError:true,style:null,styleMap:null,strategies:null,protocol:null,renderers:['SVG','VML','Canvas'],renderer:null,rendererOptions:null,geometryType:null,drawn:false,initialize:function(name,options){this.EVENT_TYPES=OpenLayers.Layer.Vector.prototype.EVENT_TYPES.concat(OpenLayers.Layer.prototype.EVENT_TYPES);OpenLayers.Layer.prototype.initialize.apply(this,arguments);if(!this.renderer||!this.renderer.supported()){this.assignRenderer();}
60879 if(!this.renderer||!this.renderer.supported()){this.renderer=null;this.displayError();}
60880 if(!this.styleMap){this.styleMap=new OpenLayers.StyleMap();}
60881 this.features=[];this.selectedFeatures=[];this.unrenderedFeatures={};if(this.strategies){for(var i=0,len=this.strategies.length;i<len;i++){this.strategies[i].setLayer(this);}}},destroy:function(){if(this.strategies){var strategy,i,len;for(i=0,len=this.strategies.length;i<len;i++){strategy=this.strategies[i];if(strategy.autoDestroy){strategy.destroy();}}
60882 this.strategies=null;}
60883 if(this.protocol){if(this.protocol.autoDestroy){this.protocol.destroy();}
60884 this.protocol=null;}
60885 this.destroyFeatures();this.features=null;this.selectedFeatures=null;this.unrenderedFeatures=null;if(this.renderer){this.renderer.destroy();}
60886 this.renderer=null;this.geometryType=null;this.drawn=null;OpenLayers.Layer.prototype.destroy.apply(this,arguments);},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.Vector(this.name,this.getOptions());}
60887 obj=OpenLayers.Layer.prototype.clone.apply(this,[obj]);var features=this.features;var len=features.length;var clonedFeatures=new Array(len);for(var i=0;i<len;++i){clonedFeatures[i]=features[i].clone();}
60888 obj.features=clonedFeatures;return obj;},refresh:function(obj){if(this.calculateInRange()&&this.visibility){this.events.triggerEvent("refresh",obj);}},assignRenderer:function(){for(var i=0,len=this.renderers.length;i<len;i++){var rendererClass=this.renderers[i];var renderer=(typeof rendererClass=="function")?rendererClass:OpenLayers.Renderer[rendererClass];if(renderer&&renderer.prototype.supported()){this.renderer=new renderer(this.div,this.rendererOptions);break;}}},displayError:function(){if(this.reportError){OpenLayers.Console.userError(OpenLayers.i18n("browserNotSupported",{'renderers':this.renderers.join("\n")}));}},setMap:function(map){OpenLayers.Layer.prototype.setMap.apply(this,arguments);if(!this.renderer){this.map.removeLayer(this);}else{this.renderer.map=this.map;this.renderer.setSize(this.map.getSize());}},afterAdd:function(){if(this.strategies){var strategy,i,len;for(i=0,len=this.strategies.length;i<len;i++){strategy=this.strategies[i];if(strategy.autoActivate){strategy.activate();}}}},removeMap:function(map){this.drawn=false;if(this.strategies){var strategy,i,len;for(i=0,len=this.strategies.length;i<len;i++){strategy=this.strategies[i];if(strategy.autoActivate){strategy.deactivate();}}}},onMapResize:function(){OpenLayers.Layer.prototype.onMapResize.apply(this,arguments);this.renderer.setSize(this.map.getSize());},moveTo:function(bounds,zoomChanged,dragging){OpenLayers.Layer.prototype.moveTo.apply(this,arguments);var coordSysUnchanged=true;if(!dragging){this.renderer.root.style.visibility="hidden";this.div.style.left=-parseInt(this.map.layerContainerDiv.style.left)+"px";this.div.style.top=-parseInt(this.map.layerContainerDiv.style.top)+"px";var extent=this.map.getExtent();coordSysUnchanged=this.renderer.setExtent(extent,zoomChanged);this.renderer.root.style.visibility="visible";if(navigator.userAgent.toLowerCase().indexOf("gecko")!=-1){this.div.scrollLeft=this.div.scrollLeft;}
60889 if(!zoomChanged&&coordSysUnchanged){for(var i in this.unrenderedFeatures){var feature=this.unrenderedFeatures[i];this.drawFeature(feature);}}}
60890 if(!this.drawn||zoomChanged||!coordSysUnchanged){this.drawn=true;var feature;for(var i=0,len=this.features.length;i<len;i++){this.renderer.locked=(i!==(len-1));feature=this.features[i];this.drawFeature(feature);}}},display:function(display){OpenLayers.Layer.prototype.display.apply(this,arguments);var currentDisplay=this.div.style.display;if(currentDisplay!=this.renderer.root.style.display){this.renderer.root.style.display=currentDisplay;}},addFeatures:function(features,options){if(!(features instanceof Array)){features=[features];}
60891 var notify=!options||!options.silent;if(notify){var event={features:features};var ret=this.events.triggerEvent("beforefeaturesadded",event);if(ret===false){return;}
60892 features=event.features;}
60893 var featuresAdded=[];for(var i=0,len=features.length;i<len;i++){if(i!=(features.length-1)){this.renderer.locked=true;}else{this.renderer.locked=false;}
60894 var feature=features[i];if(this.geometryType&&!(feature.geometry instanceof this.geometryType)){var throwStr=OpenLayers.i18n('componentShouldBe',{'geomType':this.geometryType.prototype.CLASS_NAME});throw throwStr;}
60895 feature.layer=this;if(!feature.style&&this.style){feature.style=OpenLayers.Util.extend({},this.style);}
60896 if(notify){if(this.events.triggerEvent("beforefeatureadded",{feature:feature})===false){continue;};this.preFeatureInsert(feature);}
60897 featuresAdded.push(feature);this.features.push(feature);this.drawFeature(feature);if(notify){this.events.triggerEvent("featureadded",{feature:feature});this.onFeatureInsert(feature);}}
60898 if(notify){this.events.triggerEvent("featuresadded",{features:featuresAdded});}},removeFeatures:function(features,options){if(!features||features.length===0){return;}
60899 if(features===this.features){return this.removeAllFeatures(options);}
60900 if(!(features instanceof Array)){features=[features];}
60901 if(features===this.selectedFeatures){features=features.slice();}
60902 var notify=!options||!options.silent;if(notify){this.events.triggerEvent("beforefeaturesremoved",{features:features});}
60903 for(var i=features.length-1;i>=0;i--){if(i!=0&&features[i-1].geometry){this.renderer.locked=true;}else{this.renderer.locked=false;}
60904 var feature=features[i];delete this.unrenderedFeatures[feature.id];if(notify){this.events.triggerEvent("beforefeatureremoved",{feature:feature});}
60905 this.features=OpenLayers.Util.removeItem(this.features,feature);feature.layer=null;if(feature.geometry){this.renderer.eraseFeatures(feature);}
60906 if(OpenLayers.Util.indexOf(this.selectedFeatures,feature)!=-1){OpenLayers.Util.removeItem(this.selectedFeatures,feature);}
60907 if(notify){this.events.triggerEvent("featureremoved",{feature:feature});}}
60908 if(notify){this.events.triggerEvent("featuresremoved",{features:features});}},removeAllFeatures:function(options){var notify=!options||!options.silent;var features=this.features;if(notify){this.events.triggerEvent("beforefeaturesremoved",{features:features});}
60909 var feature;for(var i=features.length-1;i>=0;i--){feature=features[i];if(notify){this.events.triggerEvent("beforefeatureremoved",{feature:feature});}
60910 feature.layer=null;if(notify){this.events.triggerEvent("featureremoved",{feature:feature});}}
60911 this.renderer.clear();this.features=[];this.unrenderedFeatures={};this.selectedFeatures=[];if(notify){this.events.triggerEvent("featuresremoved",{features:features});}},destroyFeatures:function(features,options){var all=(features==undefined);if(all){features=this.features;}
60912 if(features){this.removeFeatures(features,options);for(var i=features.length-1;i>=0;i--){features[i].destroy();}}},drawFeature:function(feature,style){if(!this.drawn){return}
60913 if(typeof style!="object"){if(!style&&feature.state===OpenLayers.State.DELETE){style="delete";}
60914 var renderIntent=style||feature.renderIntent;style=feature.style||this.style;if(!style){style=this.styleMap.createSymbolizer(feature,renderIntent);}}
60915 if(!this.renderer.drawFeature(feature,style)){this.unrenderedFeatures[feature.id]=feature;}else{delete this.unrenderedFeatures[feature.id];};},eraseFeatures:function(features){this.renderer.eraseFeatures(features);},getFeatureFromEvent:function(evt){if(!this.renderer){OpenLayers.Console.error(OpenLayers.i18n("getFeatureError"));return null;}
60916 var featureId=this.renderer.getFeatureIdFromEvent(evt);return this.getFeatureById(featureId);},getFeatureBy:function(property,value){var feature=null;for(var i=0,len=this.features.length;i<len;++i){if(this.features[i][property]==value){feature=this.features[i];break;}}
60917 return feature;},getFeatureById:function(featureId){return this.getFeatureBy('id',featureId);},getFeatureByFid:function(featureFid){return this.getFeatureBy('fid',featureFid);},onFeatureInsert:function(feature){},preFeatureInsert:function(feature){},getDataExtent:function(){var maxExtent=null;var features=this.features;if(features&&(features.length>0)){maxExtent=new OpenLayers.Bounds();var geometry=null;for(var i=0,len=features.length;i<len;i++){geometry=features[i].geometry;if(geometry){maxExtent.extend(geometry.getBounds());}}}
60918 return maxExtent;},CLASS_NAME:"OpenLayers.Layer.Vector"});OpenLayers.Layer.WMS.Post=OpenLayers.Class(OpenLayers.Layer.WMS,{tileClass:null,unsupportedBrowsers:["mozilla","firefox","opera"],SUPPORTED_TRANSITIONS:[],initialize:function(name,url,params,options){var newArguments=[];newArguments.push(name,url,params,options);OpenLayers.Layer.WMS.prototype.initialize.apply(this,newArguments);this.tileClass=OpenLayers.Util.indexOf(this.unsupportedBrowsers,OpenLayers.Util.getBrowserName())!=-1?OpenLayers.Tile.Image:OpenLayers.Tile.Image.IFrame;},addTile:function(bounds,position){return new this.tileClass(this,position,bounds,null,this.tileSize);},CLASS_NAME:'OpenLayers.Layer.WMS.Post'});OpenLayers.Layer.WMS.Untiled=OpenLayers.Class(OpenLayers.Layer.WMS,{singleTile:true,initialize:function(name,url,params,options){OpenLayers.Layer.WMS.prototype.initialize.apply(this,arguments);var msg="The OpenLayers.Layer.WMS.Untiled class is deprecated and "+"will be removed in 3.0. Instead, you should use the "+"normal OpenLayers.Layer.WMS class, passing it the option "+"'singleTile' as true.";OpenLayers.Console.warn(msg);},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.WMS.Untiled(this.name,this.url,this.params,this.getOptions());}
60919 obj=OpenLayers.Layer.WMS.prototype.clone.apply(this,[obj]);return obj;},CLASS_NAME:"OpenLayers.Layer.WMS.Untiled"});OpenLayers.Strategy.Filter=OpenLayers.Class(OpenLayers.Strategy,{filter:null,cache:null,caching:false,initialize:function(options){OpenLayers.Strategy.prototype.initialize.apply(this,[options]);if(!this.filter||!(this.filter instanceof OpenLayers.Filter)){throw new Error("Filter strategy must be constructed with a filter");}},activate:function(){var activated=OpenLayers.Strategy.prototype.activate.apply(this,arguments);if(activated){this.cache=[];this.layer.events.on({"beforefeaturesadded":this.handleAdd,"beforefeaturesremoved":this.handleRemove,scope:this});}
60920 return activated;},deactivate:function(){this.cache=null;if(this.layer&&this.layer.events){this.layer.events.un({"beforefeaturesadded":this.handleAdd,"beforefeaturesremoved":this.handleRemove,scope:this});}
60921 return OpenLayers.Strategy.prototype.deactivate.apply(this,arguments);},handleAdd:function(event){if(!this.caching){var features=event.features;event.features=[];var feature;for(var i=0,ii=features.length;i<ii;++i){feature=features[i];if(this.filter.evaluate(feature)){event.features.push(feature);}else{this.cache.push(feature);}}}},handleRemove:function(event){if(!this.caching){this.cache=[];}},setFilter:function(filter){this.filter=filter;var previousCache=this.cache;this.cache=[];this.handleAdd({features:this.layer.features});if(this.cache.length>0){this.caching=true;this.layer.removeFeatures(this.cache.slice(),{silent:true});this.caching=false;}
60922 if(previousCache.length>0){var event={features:previousCache};this.handleAdd(event);this.caching=true;this.layer.addFeatures(event.features,{silent:true});this.caching=false;}},CLASS_NAME:"OpenLayers.Strategy.Filter"});OpenLayers.Style2=OpenLayers.Class({id:null,name:null,title:null,description:null,layerName:null,isDefault:false,rules:null,initialize:function(config){OpenLayers.Util.extend(this,config);this.id=OpenLayers.Util.createUniqueID(this.CLASS_NAME+"_");},destroy:function(){for(var i=0,len=this.rules.length;i<len;i++){this.rules[i].destroy();}
60923 delete this.rules;},clone:function(){var config=OpenLayers.Util.extend({},this);if(this.rules){config.rules=[];for(var i=0,len=this.rules.length;i<len;++i){config.rules.push(this.rules[i].clone());}}
60924 return new OpenLayers.Style2(config);},CLASS_NAME:"OpenLayers.Style2"});OpenLayers.Control.GetFeature=OpenLayers.Class(OpenLayers.Control,{protocol:null,multipleKey:null,toggleKey:null,modifiers:null,multiple:false,click:true,single:true,clickout:true,toggle:false,clickTolerance:5,hover:false,box:false,maxFeatures:10,features:null,hoverFeature:null,handlerOptions:null,handlers:null,hoverResponse:null,filterType:OpenLayers.Filter.Spatial.BBOX,EVENT_TYPES:["featureselected","featuresselected","featureunselected","clickout","beforefeatureselected","beforefeaturesselected","hoverfeature","outfeature"],initialize:function(options){this.EVENT_TYPES=OpenLayers.Control.GetFeature.prototype.EVENT_TYPES.concat(OpenLayers.Control.prototype.EVENT_TYPES);options.handlerOptions=options.handlerOptions||{};OpenLayers.Control.prototype.initialize.apply(this,[options]);this.features={};this.handlers={};if(this.click){this.handlers.click=new OpenLayers.Handler.Click(this,{click:this.selectClick},this.handlerOptions.click||{});}
60925 if(this.box){this.handlers.box=new OpenLayers.Handler.Box(this,{done:this.selectBox},OpenLayers.Util.extend(this.handlerOptions.box,{boxDivClassName:"olHandlerBoxSelectFeature"}));}
60926 if(this.hover){this.handlers.hover=new OpenLayers.Handler.Hover(this,{'move':this.cancelHover,'pause':this.selectHover},OpenLayers.Util.extend(this.handlerOptions.hover,{'delay':250}));}},activate:function(){if(!this.active){for(var i in this.handlers){this.handlers[i].activate();}}
60927 return OpenLayers.Control.prototype.activate.apply(this,arguments);},deactivate:function(){if(this.active){for(var i in this.handlers){this.handlers[i].deactivate();}}
60928 return OpenLayers.Control.prototype.deactivate.apply(this,arguments);},selectClick:function(evt){var bounds=this.pixelToBounds(evt.xy);this.setModifiers(evt);this.request(bounds,{single:this.single});},selectBox:function(position){var bounds;if(position instanceof OpenLayers.Bounds){var minXY=this.map.getLonLatFromPixel(new OpenLayers.Pixel(position.left,position.bottom));var maxXY=this.map.getLonLatFromPixel(new OpenLayers.Pixel(position.right,position.top));bounds=new OpenLayers.Bounds(minXY.lon,minXY.lat,maxXY.lon,maxXY.lat);}else{if(this.click){return;}
60929 bounds=this.pixelToBounds(position);}
60930 this.setModifiers(this.handlers.box.dragHandler.evt);this.request(bounds);},selectHover:function(evt){var bounds=this.pixelToBounds(evt.xy);this.request(bounds,{single:true,hover:true});},cancelHover:function(){if(this.hoverResponse){this.protocol.abort(this.hoverResponse);this.hoverResponse=null;OpenLayers.Element.removeClass(this.map.viewPortDiv,"olCursorWait");}},request:function(bounds,options){options=options||{};var filter=new OpenLayers.Filter.Spatial({type:this.filterType,value:bounds});OpenLayers.Element.addClass(this.map.viewPortDiv,"olCursorWait");var response=this.protocol.read({maxFeatures:options.single==true?this.maxFeatures:undefined,filter:filter,callback:function(result){if(result.success()){if(result.features.length){if(options.single==true){this.selectBestFeature(result.features,bounds.getCenterLonLat(),options);}else{this.select(result.features);}}else if(options.hover){this.hoverSelect();}else{this.events.triggerEvent("clickout");if(this.clickout){this.unselectAll();}}}
60931 OpenLayers.Element.removeClass(this.map.viewPortDiv,"olCursorWait");},scope:this});if(options.hover==true){this.hoverResponse=response;}},selectBestFeature:function(features,clickPosition,options){options=options||{};if(features.length){var point=new OpenLayers.Geometry.Point(clickPosition.lon,clickPosition.lat);var feature,resultFeature,dist;var minDist=Number.MAX_VALUE;for(var i=0;i<features.length;++i){feature=features[i];if(feature.geometry){dist=point.distanceTo(feature.geometry,{edge:false});if(dist<minDist){minDist=dist;resultFeature=feature;if(minDist==0){break;}}}}
60932 if(options.hover==true){this.hoverSelect(resultFeature);}else{this.select(resultFeature||features);}}},setModifiers:function(evt){this.modifiers={multiple:this.multiple||(this.multipleKey&&evt[this.multipleKey]),toggle:this.toggle||(this.toggleKey&&evt[this.toggleKey])};},select:function(features){if(!this.modifiers.multiple&&!this.modifiers.toggle){this.unselectAll();}
60933 if(!(features instanceof Array)){features=[features];}
60934 var cont=this.events.triggerEvent("beforefeaturesselected",{features:features});if(cont!==false){var selectedFeatures=[];var feature;for(var i=0,len=features.length;i<len;++i){feature=features[i];if(this.features[feature.fid||feature.id]){if(this.modifiers.toggle){this.unselect(this.features[feature.fid||feature.id]);}}else{cont=this.events.triggerEvent("beforefeatureselected",{feature:feature});if(cont!==false){this.features[feature.fid||feature.id]=feature;selectedFeatures.push(feature);this.events.triggerEvent("featureselected",{feature:feature});}}}
60935 this.events.triggerEvent("featuresselected",{features:selectedFeatures});}},hoverSelect:function(feature){var fid=feature?feature.fid||feature.id:null;var hfid=this.hoverFeature?this.hoverFeature.fid||this.hoverFeature.id:null;if(hfid&&hfid!=fid){this.events.triggerEvent("outfeature",{feature:this.hoverFeature});this.hoverFeature=null;}
60936 if(fid&&fid!=hfid){this.events.triggerEvent("hoverfeature",{feature:feature});this.hoverFeature=feature;}},unselect:function(feature){delete this.features[feature.fid||feature.id];this.events.triggerEvent("featureunselected",{feature:feature});},unselectAll:function(){for(var fid in this.features){this.unselect(this.features[fid]);}},setMap:function(map){for(var i in this.handlers){this.handlers[i].setMap(map);}
60937 OpenLayers.Control.prototype.setMap.apply(this,arguments);},pixelToBounds:function(pixel){var llPx=pixel.add(-this.clickTolerance/2,this.clickTolerance/2);var urPx=pixel.add(this.clickTolerance/2,-this.clickTolerance/2);var ll=this.map.getLonLatFromPixel(llPx);var ur=this.map.getLonLatFromPixel(urPx);return new OpenLayers.Bounds(ll.lon,ll.lat,ur.lon,ur.lat);},CLASS_NAME:"OpenLayers.Control.GetFeature"});OpenLayers.Control.Snapping=OpenLayers.Class(OpenLayers.Control,{EVENT_TYPES:["beforesnap","snap","unsnap"],DEFAULTS:{tolerance:10,node:true,edge:true,vertex:true},greedy:true,precedence:["node","vertex","edge"],resolution:null,geoToleranceCache:null,layer:null,feature:null,point:null,initialize:function(options){Array.prototype.push.apply(this.EVENT_TYPES,OpenLayers.Control.prototype.EVENT_TYPES);OpenLayers.Control.prototype.initialize.apply(this,[options]);this.options=options||{};if(this.options.layer){this.setLayer(this.options.layer);}
60938 var defaults=OpenLayers.Util.extend({},this.options.defaults);this.defaults=OpenLayers.Util.applyDefaults(defaults,this.DEFAULTS);this.setTargets(this.options.targets);if(this.targets.length===0&&this.layer){this.addTargetLayer(this.layer);}
60939 this.geoToleranceCache={};},setLayer:function(layer){if(this.active){this.deactivate();this.layer=layer;this.activate();}else{this.layer=layer;}},setTargets:function(targets){this.targets=[];if(targets&&targets.length){var target;for(var i=0,len=targets.length;i<len;++i){target=targets[i];if(target instanceof OpenLayers.Layer.Vector){this.addTargetLayer(target);}else{this.addTarget(target);}}}},addTargetLayer:function(layer){this.addTarget({layer:layer});},addTarget:function(target){target=OpenLayers.Util.applyDefaults(target,this.defaults);target.nodeTolerance=target.nodeTolerance||target.tolerance;target.vertexTolerance=target.vertexTolerance||target.tolerance;target.edgeTolerance=target.edgeTolerance||target.tolerance;this.targets.push(target);},removeTargetLayer:function(layer){var target;for(var i=this.targets.length-1;i>=0;--i){target=this.targets[i];if(target.layer===layer){this.removeTarget(target);}}},removeTarget:function(target){return OpenLayers.Util.removeItem(this.targets,target);},activate:function(){var activated=OpenLayers.Control.prototype.activate.call(this);if(activated){if(this.layer&&this.layer.events){this.layer.events.on({sketchstarted:this.onSketchModified,sketchmodified:this.onSketchModified,vertexmodified:this.onVertexModified,scope:this});}}
60940 return activated;},deactivate:function(){var deactivated=OpenLayers.Control.prototype.deactivate.call(this);if(deactivated){if(this.layer&&this.layer.events){this.layer.events.un({sketchstarted:this.onSketchModified,sketchmodified:this.onSketchModified,vertexmodified:this.onVertexModified,scope:this});}}
60941 this.feature=null;this.point=null;return deactivated;},onSketchModified:function(event){this.feature=event.feature;this.considerSnapping(event.vertex,event.vertex);},onVertexModified:function(event){this.feature=event.feature;var loc=this.layer.map.getLonLatFromViewPortPx(event.pixel);this.considerSnapping(event.vertex,new OpenLayers.Geometry.Point(loc.lon,loc.lat));},considerSnapping:function(point,loc){var best={rank:Number.POSITIVE_INFINITY,dist:Number.POSITIVE_INFINITY,x:null,y:null};var snapped=false;var result,target;for(var i=0,len=this.targets.length;i<len;++i){target=this.targets[i];result=this.testTarget(target,loc);if(result){if(this.greedy){best=result;best.target=target;snapped=true;break;}else{if((result.rank<best.rank)||(result.rank===best.rank&&result.dist<best.dist)){best=result;best.target=target;snapped=true;}}}}
60942 if(snapped){var proceed=this.events.triggerEvent("beforesnap",{point:point,x:best.x,y:best.y,distance:best.dist,layer:best.target.layer,snapType:this.precedence[best.rank]});if(proceed!==false){point.x=best.x;point.y=best.y;this.point=point;this.events.triggerEvent("snap",{point:point,snapType:this.precedence[best.rank],layer:best.target.layer,distance:best.dist});}else{snapped=false;}}
60943 if(this.point&&!snapped){point.x=loc.x;point.y=loc.y;this.point=null;this.events.triggerEvent("unsnap",{point:point});}},testTarget:function(target,loc){var tolerance={node:this.getGeoTolerance(target.nodeTolerance),vertex:this.getGeoTolerance(target.vertexTolerance),edge:this.getGeoTolerance(target.edgeTolerance)};var maxTolerance=Math.max(tolerance.node,tolerance.vertex,tolerance.edge);var result={rank:Number.POSITIVE_INFINITY,dist:Number.POSITIVE_INFINITY};var eligible=false;var features=target.layer.features;var feature,type,vertices,vertex,closest,dist,found;var numTypes=this.precedence.length;var ll=new OpenLayers.LonLat(loc.x,loc.y);for(var i=0,len=features.length;i<len;++i){feature=features[i];if(feature!==this.feature&&!feature._sketch&&feature.state!==OpenLayers.State.DELETE&&(!target.filter||target.filter.evaluate(feature.attributes))){if(feature.atPoint(ll,maxTolerance,maxTolerance)){for(var j=0,stop=Math.min(result.rank+1,numTypes);j<stop;++j){type=this.precedence[j];if(target[type]){if(type==="edge"){closest=feature.geometry.distanceTo(loc,{details:true});dist=closest.distance;if(dist<=tolerance[type]&&dist<result.dist){result={rank:j,dist:dist,x:closest.x0,y:closest.y0};eligible=true;break;}}else{vertices=feature.geometry.getVertices(type==="node");found=false;for(var k=0,klen=vertices.length;k<klen;++k){vertex=vertices[k];dist=vertex.distanceTo(loc);if(dist<=tolerance[type]&&(j<result.rank||(j===result.rank&&dist<result.dist))){result={rank:j,dist:dist,x:vertex.x,y:vertex.y};eligible=true;found=true;}}
60944 if(found){break;}}}}}}}
60945 return eligible?result:null;},getGeoTolerance:function(tolerance){var resolution=this.layer.map.getResolution();if(resolution!==this.resolution){this.resolution=resolution;this.geoToleranceCache={};}
60946 var geoTolerance=this.geoToleranceCache[tolerance];if(geoTolerance===undefined){geoTolerance=tolerance*resolution;this.geoToleranceCache[tolerance]=geoTolerance;}
60947 return geoTolerance;},destroy:function(){if(this.active){this.deactivate();}
60948 delete this.layer;delete this.targets;OpenLayers.Control.prototype.destroy.call(this);},CLASS_NAME:"OpenLayers.Control.Snapping"});OpenLayers.Format.Filter=OpenLayers.Class(OpenLayers.Format.XML,{defaultVersion:"1.0.0",version:null,parser:null,initialize:function(options){OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);},write:function(filter,options){var version=(options&&options.version)||this.version||this.defaultVersion;if(!this.parser||this.parser.VERSION!=version){var format=OpenLayers.Format.Filter["v"+version.replace(/\./g,"_")];if(!format){throw"Can't find a Filter parser for version "+
60949 version;}
60950 this.parser=new format(this.options);}
60951 return this.parser.write(filter);},read:function(data){if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);}
60952 var version=this.version;if(!version){version=this.defaultVersion;}
60953 if(!this.parser||this.parser.VERSION!=version){var format=OpenLayers.Format.Filter["v"+version.replace(/\./g,"_")];if(!format){throw"Can't find a Filter parser for version "+
60954 version;}
60955 this.parser=new format(this.options);}
60956 var filter=this.parser.read(data);return filter;},CLASS_NAME:"OpenLayers.Format.Filter"});OpenLayers.Format.SLD=OpenLayers.Class(OpenLayers.Format.XML,{defaultVersion:"1.0.0",version:null,namedLayersAsArray:false,parser:null,initialize:function(options){OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);},write:function(sld,options){var version=(options&&options.version)||this.version||this.defaultVersion;if(!this.parser||this.parser.VERSION!=version){var format=OpenLayers.Format.SLD["v"+version.replace(/\./g,"_")];if(!format){throw"Can't find a SLD parser for version "+
60957 version;}
60958 this.parser=new format(this.options);}
60959 var root=this.parser.write(sld);return OpenLayers.Format.XML.prototype.write.apply(this,[root]);},read:function(data,options){if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);}
60960 var root=data.documentElement;var version=this.version;if(!version){version=root.getAttribute("version");if(!version){version=this.defaultVersion;}}
60961 if(!this.parser||this.parser.VERSION!=version){var format=OpenLayers.Format.SLD["v"+version.replace(/\./g,"_")];if(!format){throw"Can't find a SLD parser for version "+
60962 version;}
60963 this.parser=new format(this.options);}
60964 var sld=this.parser.read(data,options);return sld;},CLASS_NAME:"OpenLayers.Format.SLD"});OpenLayers.Format.Text=OpenLayers.Class(OpenLayers.Format,{defaultStyle:null,extractStyles:true,initialize:function(options){options=options||{};if(options.extractStyles!==false){options.defaultStyle={'externalGraphic':OpenLayers.Util.getImagesLocation()+"marker.png",'graphicWidth':21,'graphicHeight':25,'graphicXOffset':-10.5,'graphicYOffset':-12.5};}
60965 OpenLayers.Format.prototype.initialize.apply(this,[options]);},read:function(text){var lines=text.split('\n');var columns;var features=[];for(var lcv=0;lcv<(lines.length-1);lcv++){var currLine=lines[lcv].replace(/^\s*/,'').replace(/\s*$/,'');if(currLine.charAt(0)!='#'){if(!columns){columns=currLine.split('\t');}else{var vals=currLine.split('\t');var geometry=new OpenLayers.Geometry.Point(0,0);var attributes={};var style=this.defaultStyle?OpenLayers.Util.applyDefaults({},this.defaultStyle):null;var icon,iconSize,iconOffset,overflow;var set=false;for(var valIndex=0;valIndex<vals.length;valIndex++){if(vals[valIndex]){if(columns[valIndex]=='point'){var coords=vals[valIndex].split(',');geometry.y=parseFloat(coords[0]);geometry.x=parseFloat(coords[1]);set=true;}else if(columns[valIndex]=='lat'){geometry.y=parseFloat(vals[valIndex]);set=true;}else if(columns[valIndex]=='lon'){geometry.x=parseFloat(vals[valIndex]);set=true;}else if(columns[valIndex]=='title')
60966 attributes['title']=vals[valIndex];else if(columns[valIndex]=='image'||columns[valIndex]=='icon'&&style){style['externalGraphic']=vals[valIndex];}else if(columns[valIndex]=='iconSize'&&style){var size=vals[valIndex].split(',');style['graphicWidth']=parseFloat(size[0]);style['graphicHeight']=parseFloat(size[1]);}else if(columns[valIndex]=='iconOffset'&&style){var offset=vals[valIndex].split(',');style['graphicXOffset']=parseFloat(offset[0]);style['graphicYOffset']=parseFloat(offset[1]);}else if(columns[valIndex]=='description'){attributes['description']=vals[valIndex];}else if(columns[valIndex]=='overflow'){attributes['overflow']=vals[valIndex];}else{attributes[columns[valIndex]]=vals[valIndex];}}}
60967 if(set){if(this.internalProjection&&this.externalProjection){geometry.transform(this.externalProjection,this.internalProjection);}
60968 var feature=new OpenLayers.Feature.Vector(geometry,attributes,style);features.push(feature);}}}}
60969 return features;},CLASS_NAME:"OpenLayers.Format.Text"});OpenLayers.Geometry.MultiPoint=OpenLayers.Class(OpenLayers.Geometry.Collection,{componentTypes:["OpenLayers.Geometry.Point"],initialize:function(components){OpenLayers.Geometry.Collection.prototype.initialize.apply(this,arguments);},addPoint:function(point,index){this.addComponent(point,index);},removePoint:function(point){this.removeComponent(point);},CLASS_NAME:"OpenLayers.Geometry.MultiPoint"});OpenLayers.Handler.Point=OpenLayers.Class(OpenLayers.Handler,{point:null,layer:null,multi:false,drawing:false,mouseDown:false,lastDown:null,lastUp:null,persist:false,layerOptions:null,initialize:function(control,callbacks,options){if(!(options&&options.layerOptions&&options.layerOptions.styleMap)){this.style=OpenLayers.Util.extend(OpenLayers.Feature.Vector.style['default'],{});}
60970 OpenLayers.Handler.prototype.initialize.apply(this,arguments);},activate:function(){if(!OpenLayers.Handler.prototype.activate.apply(this,arguments)){return false;}
60971 var options=OpenLayers.Util.extend({displayInLayerSwitcher:false,calculateInRange:OpenLayers.Function.True},this.layerOptions);this.layer=new OpenLayers.Layer.Vector(this.CLASS_NAME,options);this.map.addLayer(this.layer);return true;},createFeature:function(pixel){var lonlat=this.map.getLonLatFromPixel(pixel);this.point=new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(lonlat.lon,lonlat.lat));this.callback("create",[this.point.geometry,this.point]);this.point.geometry.clearBounds();this.layer.addFeatures([this.point],{silent:true});},deactivate:function(){if(!OpenLayers.Handler.prototype.deactivate.apply(this,arguments)){return false;}
60972 if(this.drawing){this.cancel();}
60973 this.destroyFeature();if(this.layer.map!=null){this.layer.destroy(false);}
60974 this.layer=null;return true;},destroyFeature:function(){if(this.layer){this.layer.destroyFeatures();}
60975 this.point=null;},finalize:function(cancel){var key=cancel?"cancel":"done";this.drawing=false;this.mouseDown=false;this.lastDown=null;this.lastUp=null;this.callback(key,[this.geometryClone()]);if(cancel||!this.persist){this.destroyFeature();}},cancel:function(){this.finalize(true);},click:function(evt){OpenLayers.Event.stop(evt);return false;},dblclick:function(evt){OpenLayers.Event.stop(evt);return false;},modifyFeature:function(pixel){var lonlat=this.map.getLonLatFromPixel(pixel);this.point.geometry.x=lonlat.lon;this.point.geometry.y=lonlat.lat;this.callback("modify",[this.point.geometry,this.point]);this.point.geometry.clearBounds();this.drawFeature();},drawFeature:function(){this.layer.drawFeature(this.point,this.style);},getGeometry:function(){var geometry=this.point&&this.point.geometry;if(geometry&&this.multi){geometry=new OpenLayers.Geometry.MultiPoint([geometry]);}
60976 return geometry;},geometryClone:function(){var geom=this.getGeometry();return geom&&geom.clone();},mousedown:function(evt){if(!this.checkModifiers(evt)){return true;}
60977 if(this.lastDown&&this.lastDown.equals(evt.xy)){return true;}
60978 this.drawing=true;if(this.lastDown==null){if(this.persist){this.destroyFeature();}
60979 this.createFeature(evt.xy);}else{this.modifyFeature(evt.xy);}
60980 this.lastDown=evt.xy;return false;},mousemove:function(evt){if(this.drawing){this.modifyFeature(evt.xy);}
60981 return true;},mouseup:function(evt){if(this.drawing){this.finalize();return false;}else{return true;}},CLASS_NAME:"OpenLayers.Handler.Point"});OpenLayers.Layer.GML=OpenLayers.Class(OpenLayers.Layer.Vector,{loaded:false,format:null,formatOptions:null,initialize:function(name,url,options){var newArguments=[];newArguments.push(name,options);OpenLayers.Layer.Vector.prototype.initialize.apply(this,newArguments);this.url=url;},setVisibility:function(visibility,noEvent){OpenLayers.Layer.Vector.prototype.setVisibility.apply(this,arguments);if(this.visibility&&!this.loaded){this.loadGML();}},moveTo:function(bounds,zoomChanged,minor){OpenLayers.Layer.Vector.prototype.moveTo.apply(this,arguments);if(this.visibility&&!this.loaded){this.loadGML();}},loadGML:function(){if(!this.loaded){this.events.triggerEvent("loadstart");OpenLayers.Request.GET({url:this.url,success:this.requestSuccess,failure:this.requestFailure,scope:this});this.loaded=true;}},setUrl:function(url){this.url=url;this.destroyFeatures();this.loaded=false;this.loadGML();},requestSuccess:function(request){var doc=request.responseXML;if(!doc||!doc.documentElement){doc=request.responseText;}
60982 var options={};OpenLayers.Util.extend(options,this.formatOptions);if(this.map&&!this.projection.equals(this.map.getProjectionObject())){options.externalProjection=this.projection;options.internalProjection=this.map.getProjectionObject();}
60983 var gml=this.format?new this.format(options):new OpenLayers.Format.GML(options);this.addFeatures(gml.read(doc));this.events.triggerEvent("loadend");},requestFailure:function(request){OpenLayers.Console.userError(OpenLayers.i18n("errorLoadingGML",{'url':this.url}));this.events.triggerEvent("loadend");},CLASS_NAME:"OpenLayers.Layer.GML"});OpenLayers.Layer.PointTrack=OpenLayers.Class(OpenLayers.Layer.Vector,{dataFrom:null,initialize:function(name,options){OpenLayers.Layer.Vector.prototype.initialize.apply(this,arguments);},addNodes:function(pointFeatures){if(pointFeatures.length<2){OpenLayers.Console.error("At least two point features have to be added to create"+"a line from");return;}
60984 var lines=new Array(pointFeatures.length-1);var pointFeature,startPoint,endPoint;for(var i=0,len=pointFeatures.length;i<len;i++){pointFeature=pointFeatures[i];endPoint=pointFeature.geometry;if(!endPoint){var lonlat=pointFeature.lonlat;endPoint=new OpenLayers.Geometry.Point(lonlat.lon,lonlat.lat);}else if(endPoint.CLASS_NAME!="OpenLayers.Geometry.Point"){OpenLayers.Console.error("Only features with point geometries are supported.");return;}
60985 if(i>0){var attributes=(this.dataFrom!=null)?(pointFeatures[i+this.dataFrom].data||pointFeatures[i+this.dataFrom].attributes):null;var line=new OpenLayers.Geometry.LineString([startPoint,endPoint]);lines[i-1]=new OpenLayers.Feature.Vector(line,attributes);}
60986 startPoint=endPoint;}
60987 this.addFeatures(lines);},CLASS_NAME:"OpenLayers.Layer.PointTrack"});OpenLayers.Layer.PointTrack.dataFrom={'SOURCE_NODE':-1,'TARGET_NODE':0};OpenLayers.Layer.Vector.RootContainer=OpenLayers.Class(OpenLayers.Layer.Vector,{displayInLayerSwitcher:false,layers:null,initialize:function(name,options){OpenLayers.Layer.Vector.prototype.initialize.apply(this,arguments);},display:function(){},getFeatureFromEvent:function(evt){var layers=this.layers;var feature;for(var i=0;i<layers.length;i++){feature=layers[i].getFeatureFromEvent(evt);if(feature){return feature;}}},setMap:function(map){OpenLayers.Layer.Vector.prototype.setMap.apply(this,arguments);this.collectRoots();map.events.register("changelayer",this,this.handleChangeLayer);},removeMap:function(map){map.events.unregister("changelayer",this,this.handleChangeLayer);this.resetRoots();OpenLayers.Layer.Vector.prototype.removeMap.apply(this,arguments);},collectRoots:function(){var layer;for(var i=0;i<this.map.layers.length;++i){layer=this.map.layers[i];if(OpenLayers.Util.indexOf(this.layers,layer)!=-1){layer.renderer.moveRoot(this.renderer);}}},resetRoots:function(){var layer;for(var i=0;i<this.layers.length;++i){layer=this.layers[i];if(this.renderer&&layer.renderer.getRenderLayerId()==this.id){this.renderer.moveRoot(layer.renderer);}}},handleChangeLayer:function(evt){var layer=evt.layer;if(evt.property=="order"&&OpenLayers.Util.indexOf(this.layers,layer)!=-1){this.resetRoots();this.collectRoots();}},CLASS_NAME:"OpenLayers.Layer.Vector.RootContainer"});OpenLayers.Layer.WFS=OpenLayers.Class(OpenLayers.Layer.Vector,OpenLayers.Layer.Markers,{isBaseLayer:false,tile:null,ratio:2,DEFAULT_PARAMS:{service:"WFS",version:"1.0.0",request:"GetFeature"},featureClass:null,format:null,formatObject:null,formatOptions:null,vectorMode:true,encodeBBOX:false,extractAttributes:false,initialize:function(name,url,params,options){if(options==undefined){options={};}
60988 if(options.featureClass||!OpenLayers.Layer.Vector||!OpenLayers.Feature.Vector){this.vectorMode=false;}
60989 params=OpenLayers.Util.upperCaseObject(params);OpenLayers.Util.extend(options,{'reportError':false});var newArguments=[];newArguments.push(name,options);OpenLayers.Layer.Vector.prototype.initialize.apply(this,newArguments);if(!this.renderer||!this.vectorMode){this.vectorMode=false;if(!options.featureClass){options.featureClass=OpenLayers.Feature.WFS;}
60990 OpenLayers.Layer.Markers.prototype.initialize.apply(this,newArguments);}
60991 if(this.params&&this.params.typename&&!this.options.typename){this.options.typename=this.params.typename;}
60992 if(!this.options.geometry_column){this.options.geometry_column="the_geom";}
60993 this.params=OpenLayers.Util.applyDefaults(params,OpenLayers.Util.upperCaseObject(this.DEFAULT_PARAMS));this.url=url;},destroy:function(){if(this.vectorMode){OpenLayers.Layer.Vector.prototype.destroy.apply(this,arguments);}else{OpenLayers.Layer.Markers.prototype.destroy.apply(this,arguments);}
60994 if(this.tile){this.tile.destroy();}
60995 this.tile=null;this.ratio=null;this.featureClass=null;this.format=null;if(this.formatObject&&this.formatObject.destroy){this.formatObject.destroy();}
60996 this.formatObject=null;this.formatOptions=null;this.vectorMode=null;this.encodeBBOX=null;this.extractAttributes=null;},setMap:function(map){if(this.vectorMode){OpenLayers.Layer.Vector.prototype.setMap.apply(this,arguments);var options={'extractAttributes':this.extractAttributes};OpenLayers.Util.extend(options,this.formatOptions);if(this.map&&!this.projection.equals(this.map.getProjectionObject())){options.externalProjection=this.projection;options.internalProjection=this.map.getProjectionObject();}
60997 this.formatObject=this.format?new this.format(options):new OpenLayers.Format.GML(options);}else{OpenLayers.Layer.Markers.prototype.setMap.apply(this,arguments);}},moveTo:function(bounds,zoomChanged,dragging){if(this.vectorMode){OpenLayers.Layer.Vector.prototype.moveTo.apply(this,arguments);}else{OpenLayers.Layer.Markers.prototype.moveTo.apply(this,arguments);}
60998 if(dragging){return false;}
60999 if(zoomChanged){if(this.vectorMode){this.renderer.clear();}}
61000 if(this.options.minZoomLevel){OpenLayers.Console.warn(OpenLayers.i18n('minZoomLevelError'));if(this.map.getZoom()<this.options.minZoomLevel){return null;}}
61001 if(bounds==null){bounds=this.map.getExtent();}
61002 var firstRendering=(this.tile==null);var outOfBounds=(!firstRendering&&!this.tile.bounds.containsBounds(bounds));if(zoomChanged||firstRendering||(!dragging&&outOfBounds)){var center=bounds.getCenterLonLat();var tileWidth=bounds.getWidth()*this.ratio;var tileHeight=bounds.getHeight()*this.ratio;var tileBounds=new OpenLayers.Bounds(center.lon-(tileWidth/2),center.lat-(tileHeight/2),center.lon+(tileWidth/2),center.lat+(tileHeight/2));var tileSize=this.map.getSize();tileSize.w=tileSize.w*this.ratio;tileSize.h=tileSize.h*this.ratio;var ul=new OpenLayers.LonLat(tileBounds.left,tileBounds.top);var pos=this.map.getLayerPxFromLonLat(ul);var url=this.getFullRequestString();var params=null;var filter=this.params.filter||this.params.FILTER;if(filter){params={FILTER:filter};}
61003 else{params={BBOX:this.encodeBBOX?tileBounds.toBBOX():tileBounds.toArray()};}
61004 if(this.map&&!this.projection.equals(this.map.getProjectionObject())){var projectedBounds=tileBounds.clone();projectedBounds.transform(this.map.getProjectionObject(),this.projection);if(!filter){params.BBOX=this.encodeBBOX?projectedBounds.toBBOX():projectedBounds.toArray();}}
61005 url+="&"+OpenLayers.Util.getParameterString(params);if(!this.tile){this.tile=new OpenLayers.Tile.WFS(this,pos,tileBounds,url,tileSize);this.addTileMonitoringHooks(this.tile);this.tile.draw();}else{if(this.vectorMode){this.destroyFeatures();this.renderer.clear();}else{this.clearMarkers();}
61006 this.removeTileMonitoringHooks(this.tile);this.tile.destroy();this.tile=null;this.tile=new OpenLayers.Tile.WFS(this,pos,tileBounds,url,tileSize);this.addTileMonitoringHooks(this.tile);this.tile.draw();}}},addTileMonitoringHooks:function(tile){tile.onLoadStart=function(){if(this==this.layer.tile){this.layer.events.triggerEvent("loadstart");}};tile.events.register("loadstart",tile,tile.onLoadStart);tile.onLoadEnd=function(){if(this==this.layer.tile){this.layer.events.triggerEvent("tileloaded");this.layer.events.triggerEvent("loadend");}};tile.events.register("loadend",tile,tile.onLoadEnd);tile.events.register("unload",tile,tile.onLoadEnd);},removeTileMonitoringHooks:function(tile){tile.unload();tile.events.un({"loadstart":tile.onLoadStart,"loadend":tile.onLoadEnd,"unload":tile.onLoadEnd,scope:tile});},onMapResize:function(){if(this.vectorMode){OpenLayers.Layer.Vector.prototype.onMapResize.apply(this,arguments);}else{OpenLayers.Layer.Markers.prototype.onMapResize.apply(this,arguments);}},display:function(){if(this.vectorMode){OpenLayers.Layer.Vector.prototype.display.apply(this,arguments);}else{OpenLayers.Layer.Markers.prototype.display.apply(this,arguments);}},mergeNewParams:function(newParams){var upperParams=OpenLayers.Util.upperCaseObject(newParams);var newArguments=[upperParams];return OpenLayers.Layer.HTTPRequest.prototype.mergeNewParams.apply(this,newArguments);},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.WFS(this.name,this.url,this.params,this.getOptions());}
61007 if(this.vectorMode){obj=OpenLayers.Layer.Vector.prototype.clone.apply(this,[obj]);}else{obj=OpenLayers.Layer.Markers.prototype.clone.apply(this,[obj]);}
61008 return obj;},getFullRequestString:function(newParams,altUrl){var projectionCode=this.projection.getCode()||this.map.getProjection();this.params.SRS=(projectionCode=="none")?null:projectionCode;return OpenLayers.Layer.Grid.prototype.getFullRequestString.apply(this,arguments);},commit:function(){if(!this.writer){var options={};if(this.map&&!this.projection.equals(this.map.getProjectionObject())){options.externalProjection=this.projection;options.internalProjection=this.map.getProjectionObject();}
61009 this.writer=new OpenLayers.Format.WFS(options,this);}
61010 var data=this.writer.write(this.features);OpenLayers.Request.POST({url:this.url,data:data,success:this.commitSuccess,failure:this.commitFailure,scope:this});},commitSuccess:function(request){var response=request.responseText;if(response.indexOf('SUCCESS')!=-1){this.commitReport(OpenLayers.i18n("commitSuccess",{'response':response}));for(var i=0;i<this.features.length;i++){this.features[i].state=null;}}else if(response.indexOf('FAILED')!=-1||response.indexOf('Exception')!=-1){this.commitReport(OpenLayers.i18n("commitFailed",{'response':response}));}},commitFailure:function(request){},commitReport:function(string,response){OpenLayers.Console.userError(string);},refresh:function(){if(this.tile){if(this.vectorMode){this.renderer.clear();this.features.length=0;}else{this.clearMarkers();this.markers.length=0;}
61011 this.tile.draw();}},getDataExtent:function(){var extent;if(this.vectorMode){extent=OpenLayers.Layer.Vector.prototype.getDataExtent.apply(this);}else{extent=OpenLayers.Layer.Markers.prototype.getDataExtent.apply(this);}
61012 return extent;},setOpacity:function(opacity){if(this.vectorMode){OpenLayers.Layer.Vector.prototype.setOpacity.apply(this,[opacity]);}else{OpenLayers.Layer.Markers.prototype.setOpacity.apply(this,[opacity]);}},CLASS_NAME:"OpenLayers.Layer.WFS"});OpenLayers.Protocol.HTTP=OpenLayers.Class(OpenLayers.Protocol,{url:null,headers:null,params:null,callback:null,scope:null,readWithPOST:false,wildcarded:false,initialize:function(options){options=options||{};this.params={};this.headers={};OpenLayers.Protocol.prototype.initialize.apply(this,arguments);},destroy:function(){this.params=null;this.headers=null;OpenLayers.Protocol.prototype.destroy.apply(this);},read:function(options){OpenLayers.Protocol.prototype.read.apply(this,arguments);options=OpenLayers.Util.applyDefaults(options,this.options);options.params=OpenLayers.Util.applyDefaults(options.params,this.options.params);if(options.filter){options.params=this.filterToParams(options.filter,options.params);}
61013 var readWithPOST=(options.readWithPOST!==undefined)?options.readWithPOST:this.readWithPOST;var resp=new OpenLayers.Protocol.Response({requestType:"read"});if(readWithPOST){resp.priv=OpenLayers.Request.POST({url:options.url,callback:this.createCallback(this.handleRead,resp,options),data:OpenLayers.Util.getParameterString(options.params),headers:{"Content-Type":"application/x-www-form-urlencoded"}});}else{resp.priv=OpenLayers.Request.GET({url:options.url,callback:this.createCallback(this.handleRead,resp,options),params:options.params,headers:options.headers});}
61014 return resp;},handleRead:function(resp,options){this.handleResponse(resp,options);},filterToParams:function(filter,params){params=params||{};var className=filter.CLASS_NAME;var filterType=className.substring(className.lastIndexOf(".")+1);switch(filterType){case"Spatial":switch(filter.type){case OpenLayers.Filter.Spatial.BBOX:params.bbox=filter.value.toArray();break;case OpenLayers.Filter.Spatial.DWITHIN:params.tolerance=filter.distance;case OpenLayers.Filter.Spatial.WITHIN:params.lon=filter.value.x;params.lat=filter.value.y;break;default:OpenLayers.Console.warn("Unknown spatial filter type "+filter.type);}
61015 break;case"Comparison":var op=OpenLayers.Protocol.HTTP.COMP_TYPE_TO_OP_STR[filter.type];if(op!==undefined){var value=filter.value;if(filter.type==OpenLayers.Filter.Comparison.LIKE){value=this.regex2value(value);if(this.wildcarded){value="%"+value+"%";}}
61016 params[filter.property+"__"+op]=value;params.queryable=params.queryable||[];params.queryable.push(filter.property);}else{OpenLayers.Console.warn("Unknown comparison filter type "+filter.type);}
61017 break;case"Logical":if(filter.type===OpenLayers.Filter.Logical.AND){for(var i=0,len=filter.filters.length;i<len;i++){params=this.filterToParams(filter.filters[i],params);}}else{OpenLayers.Console.warn("Unsupported logical filter type "+filter.type);}
61018 break;default:OpenLayers.Console.warn("Unknown filter type "+filterType);}
61019 return params;},regex2value:function(value){value=value.replace(/%/g,"\\%");value=value.replace(/\\\\\.(\*)?/g,function($0,$1){return $1?$0:"\\\\_";});value=value.replace(/\\\\\.\*/g,"\\\\%");value=value.replace(/(\\)?\.(\*)?/g,function($0,$1,$2){return $1||$2?$0:"_";});value=value.replace(/(\\)?\.\*/g,function($0,$1){return $1?$0:"%";});value=value.replace(/\\\./g,".");value=value.replace(/(\\)?\\\*/g,function($0,$1){return $1?$0:"*";});return value;},create:function(features,options){options=OpenLayers.Util.applyDefaults(options,this.options);var resp=new OpenLayers.Protocol.Response({reqFeatures:features,requestType:"create"});resp.priv=OpenLayers.Request.POST({url:options.url,callback:this.createCallback(this.handleCreate,resp,options),headers:options.headers,data:this.format.write(features)});return resp;},handleCreate:function(resp,options){this.handleResponse(resp,options);},update:function(feature,options){options=options||{};var url=options.url||feature.url||this.options.url+"/"+feature.fid;options=OpenLayers.Util.applyDefaults(options,this.options);var resp=new OpenLayers.Protocol.Response({reqFeatures:feature,requestType:"update"});resp.priv=OpenLayers.Request.PUT({url:url,callback:this.createCallback(this.handleUpdate,resp,options),headers:options.headers,data:this.format.write(feature)});return resp;},handleUpdate:function(resp,options){this.handleResponse(resp,options);},"delete":function(feature,options){options=options||{};var url=options.url||feature.url||this.options.url+"/"+feature.fid;options=OpenLayers.Util.applyDefaults(options,this.options);var resp=new OpenLayers.Protocol.Response({reqFeatures:feature,requestType:"delete"});resp.priv=OpenLayers.Request.DELETE({url:url,callback:this.createCallback(this.handleDelete,resp,options),headers:options.headers});return resp;},handleDelete:function(resp,options){this.handleResponse(resp,options);},handleResponse:function(resp,options){var request=resp.priv;if(options.callback){if(request.status>=200&&request.status<300){if(resp.requestType!="delete"){resp.features=this.parseFeatures(request);}
61020 resp.code=OpenLayers.Protocol.Response.SUCCESS;}else{resp.code=OpenLayers.Protocol.Response.FAILURE;}
61021 options.callback.call(options.scope,resp);}},parseFeatures:function(request){var doc=request.responseXML;if(!doc||!doc.documentElement){doc=request.responseText;}
61022 if(!doc||doc.length<=0){return null;}
61023 return this.format.read(doc);},commit:function(features,options){options=OpenLayers.Util.applyDefaults(options,this.options);var resp=[],nResponses=0;var types={};types[OpenLayers.State.INSERT]=[];types[OpenLayers.State.UPDATE]=[];types[OpenLayers.State.DELETE]=[];var feature,list,requestFeatures=[];for(var i=0,len=features.length;i<len;++i){feature=features[i];list=types[feature.state];if(list){list.push(feature);requestFeatures.push(feature);}}
61024 var nRequests=(types[OpenLayers.State.INSERT].length>0?1:0)+
61025 types[OpenLayers.State.UPDATE].length+
61026 types[OpenLayers.State.DELETE].length;var success=true;var finalResponse=new OpenLayers.Protocol.Response({reqFeatures:requestFeatures});function insertCallback(response){var len=response.features?response.features.length:0;var fids=new Array(len);for(var i=0;i<len;++i){fids[i]=response.features[i].fid;}
61027 finalResponse.insertIds=fids;callback.apply(this,[response]);}
61028 function callback(response){this.callUserCallback(response,options);success=success&&response.success();nResponses++;if(nResponses>=nRequests){if(options.callback){finalResponse.code=success?OpenLayers.Protocol.Response.SUCCESS:OpenLayers.Protocol.Response.FAILURE;options.callback.apply(options.scope,[finalResponse]);}}}
61029 var queue=types[OpenLayers.State.INSERT];if(queue.length>0){resp.push(this.create(queue,OpenLayers.Util.applyDefaults({callback:insertCallback,scope:this},options.create)));}
61030 queue=types[OpenLayers.State.UPDATE];for(var i=queue.length-1;i>=0;--i){resp.push(this.update(queue[i],OpenLayers.Util.applyDefaults({callback:callback,scope:this},options.update)));}
61031 queue=types[OpenLayers.State.DELETE];for(var i=queue.length-1;i>=0;--i){resp.push(this["delete"](queue[i],OpenLayers.Util.applyDefaults({callback:callback,scope:this},options["delete"])));}
61032 return resp;},abort:function(response){if(response){response.priv.abort();}},callUserCallback:function(resp,options){var opt=options[resp.requestType];if(opt&&opt.callback){opt.callback.call(opt.scope,resp);}},CLASS_NAME:"OpenLayers.Protocol.HTTP"});(function(){var o=OpenLayers.Protocol.HTTP.COMP_TYPE_TO_OP_STR={};o[OpenLayers.Filter.Comparison.EQUAL_TO]="eq";o[OpenLayers.Filter.Comparison.NOT_EQUAL_TO]="ne";o[OpenLayers.Filter.Comparison.LESS_THAN]="lt";o[OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO]="lte";o[OpenLayers.Filter.Comparison.GREATER_THAN]="gt";o[OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO]="gte";o[OpenLayers.Filter.Comparison.LIKE]="ilike";})();OpenLayers.Strategy.BBOX=OpenLayers.Class(OpenLayers.Strategy,{bounds:null,resolution:null,ratio:2,resFactor:null,response:null,initialize:function(options){OpenLayers.Strategy.prototype.initialize.apply(this,[options]);},activate:function(){var activated=OpenLayers.Strategy.prototype.activate.call(this);if(activated){this.layer.events.on({"moveend":this.update,scope:this});this.layer.events.on({"refresh":this.update,scope:this});}
61033 return activated;},deactivate:function(){var deactivated=OpenLayers.Strategy.prototype.deactivate.call(this);if(deactivated){this.layer.events.un({"moveend":this.update,scope:this});this.layer.events.un({"refresh":this.update,scope:this});}
61034 return deactivated;},update:function(options){var mapBounds=this.getMapBounds();if((options&&options.force)||this.invalidBounds(mapBounds)){this.calculateBounds(mapBounds);this.resolution=this.layer.map.getResolution();this.triggerRead();}},getMapBounds:function(){var bounds=this.layer.map.getExtent();if(!this.layer.projection.equals(this.layer.map.getProjectionObject())){bounds=bounds.clone().transform(this.layer.map.getProjectionObject(),this.layer.projection);}
61035 return bounds;},invalidBounds:function(mapBounds){if(!mapBounds){mapBounds=this.getMapBounds();}
61036 var invalid=!this.bounds||!this.bounds.containsBounds(mapBounds);if(!invalid&&this.resFactor){var ratio=this.resolution/this.layer.map.getResolution();invalid=(ratio>=this.resFactor||ratio<=(1/this.resFactor));}
61037 return invalid;},calculateBounds:function(mapBounds){if(!mapBounds){mapBounds=this.getMapBounds();}
61038 var center=mapBounds.getCenterLonLat();var dataWidth=mapBounds.getWidth()*this.ratio;var dataHeight=mapBounds.getHeight()*this.ratio;this.bounds=new OpenLayers.Bounds(center.lon-(dataWidth/2),center.lat-(dataHeight/2),center.lon+(dataWidth/2),center.lat+(dataHeight/2));},triggerRead:function(){if(this.response){this.layer.protocol.abort(this.response);this.layer.events.triggerEvent("loadend");}
61039 this.layer.events.triggerEvent("loadstart");this.response=this.layer.protocol.read({filter:this.createFilter(),callback:this.merge,scope:this});},createFilter:function(){var filter=new OpenLayers.Filter.Spatial({type:OpenLayers.Filter.Spatial.BBOX,value:this.bounds,projection:this.layer.projection});if(this.layer.filter){filter=new OpenLayers.Filter.Logical({type:OpenLayers.Filter.Logical.AND,filters:[this.layer.filter,filter]});}
61040 return filter;},merge:function(resp){this.layer.destroyFeatures();var features=resp.features;if(features&&features.length>0){var remote=this.layer.projection;var local=this.layer.map.getProjectionObject();if(!local.equals(remote)){var geom;for(var i=0,len=features.length;i<len;++i){geom=features[i].geometry;if(geom){geom.transform(remote,local);}}}
61041 this.layer.addFeatures(features);}
61042 this.response=null;this.layer.events.triggerEvent("loadend");},CLASS_NAME:"OpenLayers.Strategy.BBOX"});OpenLayers.Control.SelectFeature=OpenLayers.Class(OpenLayers.Control,{EVENT_TYPES:["beforefeaturehighlighted","featurehighlighted","featureunhighlighted"],multipleKey:null,toggleKey:null,multiple:false,clickout:true,toggle:false,hover:false,highlightOnly:false,box:false,onBeforeSelect:function(){},onSelect:function(){},onUnselect:function(){},scope:null,geometryTypes:null,layer:null,layers:null,callbacks:null,selectStyle:null,renderIntent:"select",handlers:null,initialize:function(layers,options){this.EVENT_TYPES=OpenLayers.Control.SelectFeature.prototype.EVENT_TYPES.concat(OpenLayers.Control.prototype.EVENT_TYPES);OpenLayers.Control.prototype.initialize.apply(this,[options]);if(this.scope===null){this.scope=this;}
61043 this.initLayer(layers);var callbacks={click:this.clickFeature,clickout:this.clickoutFeature};if(this.hover){callbacks.over=this.overFeature;callbacks.out=this.outFeature;}
61044 this.callbacks=OpenLayers.Util.extend(callbacks,this.callbacks);this.handlers={feature:new OpenLayers.Handler.Feature(this,this.layer,this.callbacks,{geometryTypes:this.geometryTypes})};if(this.box){this.handlers.box=new OpenLayers.Handler.Box(this,{done:this.selectBox},{boxDivClassName:"olHandlerBoxSelectFeature"});}},initLayer:function(layers){if(layers instanceof Array){this.layers=layers;this.layer=new OpenLayers.Layer.Vector.RootContainer(this.id+"_container",{layers:layers});}else{this.layer=layers;}},destroy:function(){if(this.active&&this.layers){this.map.removeLayer(this.layer);}
61045 OpenLayers.Control.prototype.destroy.apply(this,arguments);if(this.layers){this.layer.destroy();}},activate:function(){if(!this.active){if(this.layers){this.map.addLayer(this.layer);}
61046 this.handlers.feature.activate();if(this.box&&this.handlers.box){this.handlers.box.activate();}}
61047 return OpenLayers.Control.prototype.activate.apply(this,arguments);},deactivate:function(){if(this.active){this.handlers.feature.deactivate();if(this.handlers.box){this.handlers.box.deactivate();}
61048 if(this.layers){this.map.removeLayer(this.layer);}}
61049 return OpenLayers.Control.prototype.deactivate.apply(this,arguments);},unselectAll:function(options){var layers=this.layers||[this.layer];var layer,feature;for(var l=0;l<layers.length;++l){layer=layers[l];for(var i=layer.selectedFeatures.length-1;i>=0;--i){feature=layer.selectedFeatures[i];if(!options||options.except!=feature){this.unselect(feature);}}}},clickFeature:function(feature){if(!this.hover){var selected=(OpenLayers.Util.indexOf(feature.layer.selectedFeatures,feature)>-1);if(selected){if(this.toggleSelect()){this.unselect(feature);}else if(!this.multipleSelect()){this.unselectAll({except:feature});}}else{if(!this.multipleSelect()){this.unselectAll({except:feature});}
61050 this.select(feature);}}},multipleSelect:function(){return this.multiple||(this.handlers.feature.evt&&this.handlers.feature.evt[this.multipleKey]);},toggleSelect:function(){return this.toggle||(this.handlers.feature.evt&&this.handlers.feature.evt[this.toggleKey]);},clickoutFeature:function(feature){if(!this.hover&&this.clickout){this.unselectAll();}},overFeature:function(feature){var layer=feature.layer;if(this.hover){if(this.highlightOnly){this.highlight(feature);}else if(OpenLayers.Util.indexOf(layer.selectedFeatures,feature)==-1){this.select(feature);}}},outFeature:function(feature){if(this.hover){if(this.highlightOnly){if(feature._lastHighlighter==this.id){if(feature._prevHighlighter&&feature._prevHighlighter!=this.id){delete feature._lastHighlighter;var control=this.map.getControl(feature._prevHighlighter);if(control){control.highlight(feature);}}else{this.unhighlight(feature);}}}else{this.unselect(feature);}}},highlight:function(feature){var layer=feature.layer;var cont=this.events.triggerEvent("beforefeaturehighlighted",{feature:feature});if(cont!==false){feature._prevHighlighter=feature._lastHighlighter;feature._lastHighlighter=this.id;var style=this.selectStyle||this.renderIntent;layer.drawFeature(feature,style);this.events.triggerEvent("featurehighlighted",{feature:feature});}},unhighlight:function(feature){var layer=feature.layer;feature._lastHighlighter=feature._prevHighlighter;delete feature._prevHighlighter;layer.drawFeature(feature,feature.style||feature.layer.style||"default");this.events.triggerEvent("featureunhighlighted",{feature:feature});},select:function(feature){var cont=this.onBeforeSelect.call(this.scope,feature);var layer=feature.layer;if(cont!==false){cont=layer.events.triggerEvent("beforefeatureselected",{feature:feature});if(cont!==false){layer.selectedFeatures.push(feature);this.highlight(feature);if(!this.handlers.feature.lastFeature){this.handlers.feature.lastFeature=layer.selectedFeatures[0];}
61051 layer.events.triggerEvent("featureselected",{feature:feature});this.onSelect.call(this.scope,feature);}}},unselect:function(feature){var layer=feature.layer;this.unhighlight(feature);OpenLayers.Util.removeItem(layer.selectedFeatures,feature);layer.events.triggerEvent("featureunselected",{feature:feature});this.onUnselect.call(this.scope,feature);},selectBox:function(position){if(position instanceof OpenLayers.Bounds){var minXY=this.map.getLonLatFromPixel(new OpenLayers.Pixel(position.left,position.bottom));var maxXY=this.map.getLonLatFromPixel(new OpenLayers.Pixel(position.right,position.top));var bounds=new OpenLayers.Bounds(minXY.lon,minXY.lat,maxXY.lon,maxXY.lat);if(!this.multipleSelect()){this.unselectAll();}
61052 var prevMultiple=this.multiple;this.multiple=true;var layers=this.layers||[this.layer];var layer;for(var l=0;l<layers.length;++l){layer=layers[l];for(var i=0,len=layer.features.length;i<len;++i){var feature=layer.features[i];if(!feature.getVisibility()){continue;}
61053 if(this.geometryTypes==null||OpenLayers.Util.indexOf(this.geometryTypes,feature.geometry.CLASS_NAME)>-1){if(bounds.toGeometry().intersects(feature.geometry)){if(OpenLayers.Util.indexOf(layer.selectedFeatures,feature)==-1){this.select(feature);}}}}}
61054 this.multiple=prevMultiple;}},setMap:function(map){this.handlers.feature.setMap(map);if(this.box){this.handlers.box.setMap(map);}
61055 OpenLayers.Control.prototype.setMap.apply(this,arguments);},setLayer:function(layers){var isActive=this.active;this.unselectAll();this.deactivate();if(this.layers){this.layer.destroy();this.layers=null;}
61056 this.initLayer(layers);this.handlers.feature.layer=this.layer;if(isActive){this.activate();}},CLASS_NAME:"OpenLayers.Control.SelectFeature"});OpenLayers.Format.Filter.v1=OpenLayers.Class(OpenLayers.Format.XML,{namespaces:{ogc:"http://www.opengis.net/ogc",gml:"http://www.opengis.net/gml",xlink:"http://www.w3.org/1999/xlink",xsi:"http://www.w3.org/2001/XMLSchema-instance"},defaultPrefix:"ogc",schemaLocation:null,initialize:function(options){OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);},read:function(data){var obj={};this.readers.ogc["Filter"].apply(this,[data,obj]);return obj.filter;},readers:{"ogc":{"Filter":function(node,parent){var obj={fids:[],filters:[]};this.readChildNodes(node,obj);if(obj.fids.length>0){parent.filter=new OpenLayers.Filter.FeatureId({fids:obj.fids});}else if(obj.filters.length>0){parent.filter=obj.filters[0];}},"FeatureId":function(node,obj){var fid=node.getAttribute("fid");if(fid){obj.fids.push(fid);}},"And":function(node,obj){var filter=new OpenLayers.Filter.Logical({type:OpenLayers.Filter.Logical.AND});this.readChildNodes(node,filter);obj.filters.push(filter);},"Or":function(node,obj){var filter=new OpenLayers.Filter.Logical({type:OpenLayers.Filter.Logical.OR});this.readChildNodes(node,filter);obj.filters.push(filter);},"Not":function(node,obj){var filter=new OpenLayers.Filter.Logical({type:OpenLayers.Filter.Logical.NOT});this.readChildNodes(node,filter);obj.filters.push(filter);},"PropertyIsLessThan":function(node,obj){var filter=new OpenLayers.Filter.Comparison({type:OpenLayers.Filter.Comparison.LESS_THAN});this.readChildNodes(node,filter);obj.filters.push(filter);},"PropertyIsGreaterThan":function(node,obj){var filter=new OpenLayers.Filter.Comparison({type:OpenLayers.Filter.Comparison.GREATER_THAN});this.readChildNodes(node,filter);obj.filters.push(filter);},"PropertyIsLessThanOrEqualTo":function(node,obj){var filter=new OpenLayers.Filter.Comparison({type:OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO});this.readChildNodes(node,filter);obj.filters.push(filter);},"PropertyIsGreaterThanOrEqualTo":function(node,obj){var filter=new OpenLayers.Filter.Comparison({type:OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO});this.readChildNodes(node,filter);obj.filters.push(filter);},"PropertyIsBetween":function(node,obj){var filter=new OpenLayers.Filter.Comparison({type:OpenLayers.Filter.Comparison.BETWEEN});this.readChildNodes(node,filter);obj.filters.push(filter);},"Literal":function(node,obj){obj.value=OpenLayers.String.numericIf(this.getChildValue(node));},"PropertyName":function(node,filter){filter.property=this.getChildValue(node);},"LowerBoundary":function(node,filter){filter.lowerBoundary=OpenLayers.String.numericIf(this.readOgcExpression(node));},"UpperBoundary":function(node,filter){filter.upperBoundary=OpenLayers.String.numericIf(this.readOgcExpression(node));},"Intersects":function(node,obj){this.readSpatial(node,obj,OpenLayers.Filter.Spatial.INTERSECTS);},"Within":function(node,obj){this.readSpatial(node,obj,OpenLayers.Filter.Spatial.WITHIN);},"Contains":function(node,obj){this.readSpatial(node,obj,OpenLayers.Filter.Spatial.CONTAINS);},"DWithin":function(node,obj){this.readSpatial(node,obj,OpenLayers.Filter.Spatial.DWITHIN);},"Distance":function(node,obj){obj.distance=parseInt(this.getChildValue(node));obj.distanceUnits=node.getAttribute("units");}}},readSpatial:function(node,obj,type){var filter=new OpenLayers.Filter.Spatial({type:type});this.readChildNodes(node,filter);filter.value=filter.components[0];delete filter.components;obj.filters.push(filter);},readOgcExpression:function(node){var obj={};this.readChildNodes(node,obj);var value=obj.value;if(value===undefined){value=this.getChildValue(node);}
61057 return value;},write:function(filter){return this.writers.ogc["Filter"].apply(this,[filter]);},writers:{"ogc":{"Filter":function(filter){var node=this.createElementNSPlus("ogc:Filter");var sub=filter.CLASS_NAME.split(".").pop();if(sub=="FeatureId"){for(var i=0;i<filter.fids.length;++i){this.writeNode("FeatureId",filter.fids[i],node);}}else{this.writeNode(this.getFilterType(filter),filter,node);}
61058 return node;},"FeatureId":function(fid){return this.createElementNSPlus("ogc:FeatureId",{attributes:{fid:fid}});},"And":function(filter){var node=this.createElementNSPlus("ogc:And");var childFilter;for(var i=0;i<filter.filters.length;++i){childFilter=filter.filters[i];this.writeNode(this.getFilterType(childFilter),childFilter,node);}
61059 return node;},"Or":function(filter){var node=this.createElementNSPlus("ogc:Or");var childFilter;for(var i=0;i<filter.filters.length;++i){childFilter=filter.filters[i];this.writeNode(this.getFilterType(childFilter),childFilter,node);}
61060 return node;},"Not":function(filter){var node=this.createElementNSPlus("ogc:Not");var childFilter=filter.filters[0];this.writeNode(this.getFilterType(childFilter),childFilter,node);return node;},"PropertyIsLessThan":function(filter){var node=this.createElementNSPlus("ogc:PropertyIsLessThan");this.writeNode("PropertyName",filter,node);this.writeNode("Literal",filter.value,node);return node;},"PropertyIsGreaterThan":function(filter){var node=this.createElementNSPlus("ogc:PropertyIsGreaterThan");this.writeNode("PropertyName",filter,node);this.writeNode("Literal",filter.value,node);return node;},"PropertyIsLessThanOrEqualTo":function(filter){var node=this.createElementNSPlus("ogc:PropertyIsLessThanOrEqualTo");this.writeNode("PropertyName",filter,node);this.writeNode("Literal",filter.value,node);return node;},"PropertyIsGreaterThanOrEqualTo":function(filter){var node=this.createElementNSPlus("ogc:PropertyIsGreaterThanOrEqualTo");this.writeNode("PropertyName",filter,node);this.writeNode("Literal",filter.value,node);return node;},"PropertyIsBetween":function(filter){var node=this.createElementNSPlus("ogc:PropertyIsBetween");this.writeNode("PropertyName",filter,node);this.writeNode("LowerBoundary",filter,node);this.writeNode("UpperBoundary",filter,node);return node;},"PropertyName":function(filter){return this.createElementNSPlus("ogc:PropertyName",{value:filter.property});},"Literal":function(value){return this.createElementNSPlus("ogc:Literal",{value:value});},"LowerBoundary":function(filter){var node=this.createElementNSPlus("ogc:LowerBoundary");this.writeNode("Literal",filter.lowerBoundary,node);return node;},"UpperBoundary":function(filter){var node=this.createElementNSPlus("ogc:UpperBoundary");this.writeNode("Literal",filter.upperBoundary,node);return node;},"INTERSECTS":function(filter){return this.writeSpatial(filter,"Intersects");},"WITHIN":function(filter){return this.writeSpatial(filter,"Within");},"CONTAINS":function(filter){return this.writeSpatial(filter,"Contains");},"DWITHIN":function(filter){var node=this.writeSpatial(filter,"DWithin");this.writeNode("Distance",filter,node);return node;},"Distance":function(filter){return this.createElementNSPlus("ogc:Distance",{attributes:{units:filter.distanceUnits},value:filter.distance});}}},getFilterType:function(filter){var filterType=this.filterMap[filter.type];if(!filterType){throw"Filter writing not supported for rule type: "+filter.type;}
61061 return filterType;},filterMap:{"&&":"And","||":"Or","!":"Not","==":"PropertyIsEqualTo","!=":"PropertyIsNotEqualTo","<":"PropertyIsLessThan",">":"PropertyIsGreaterThan","<=":"PropertyIsLessThanOrEqualTo",">=":"PropertyIsGreaterThanOrEqualTo","..":"PropertyIsBetween","~":"PropertyIsLike","BBOX":"BBOX","DWITHIN":"DWITHIN","WITHIN":"WITHIN","CONTAINS":"CONTAINS","INTERSECTS":"INTERSECTS"},CLASS_NAME:"OpenLayers.Format.Filter.v1"});OpenLayers.Geometry.Curve=OpenLayers.Class(OpenLayers.Geometry.MultiPoint,{componentTypes:["OpenLayers.Geometry.Point"],initialize:function(points){OpenLayers.Geometry.MultiPoint.prototype.initialize.apply(this,arguments);},getLength:function(){var length=0.0;if(this.components&&(this.components.length>1)){for(var i=1,len=this.components.length;i<len;i++){length+=this.components[i-1].distanceTo(this.components[i]);}}
61062 return length;},getGeodesicLength:function(projection){var geom=this;if(projection){var gg=new OpenLayers.Projection("EPSG:4326");if(!gg.equals(projection)){geom=this.clone().transform(projection,gg);}}
61063 var length=0.0;if(geom.components&&(geom.components.length>1)){var p1,p2;for(var i=1,len=geom.components.length;i<len;i++){p1=geom.components[i-1];p2=geom.components[i];length+=OpenLayers.Util.distVincenty({lon:p1.x,lat:p1.y},{lon:p2.x,lat:p2.y});}}
61064 return length*1000;},CLASS_NAME:"OpenLayers.Geometry.Curve"});OpenLayers.Layer.Text=OpenLayers.Class(OpenLayers.Layer.Markers,{location:null,features:null,formatOptions:null,selectedFeature:null,initialize:function(name,options){OpenLayers.Layer.Markers.prototype.initialize.apply(this,arguments);this.features=new Array();},destroy:function(){OpenLayers.Layer.Markers.prototype.destroy.apply(this,arguments);this.clearFeatures();this.features=null;},loadText:function(){if(!this.loaded){if(this.location!=null){var onFail=function(e){this.events.triggerEvent("loadend");};this.events.triggerEvent("loadstart");OpenLayers.Request.GET({url:this.location,success:this.parseData,failure:onFail,scope:this});this.loaded=true;}}},moveTo:function(bounds,zoomChanged,minor){OpenLayers.Layer.Markers.prototype.moveTo.apply(this,arguments);if(this.visibility&&!this.loaded){this.loadText();}},parseData:function(ajaxRequest){var text=ajaxRequest.responseText;var options={};OpenLayers.Util.extend(options,this.formatOptions);if(this.map&&!this.projection.equals(this.map.getProjectionObject())){options.externalProjection=this.projection;options.internalProjection=this.map.getProjectionObject();}
61065 var parser=new OpenLayers.Format.Text(options);var features=parser.read(text);for(var i=0,len=features.length;i<len;i++){var data={};var feature=features[i];var location;var iconSize,iconOffset;location=new OpenLayers.LonLat(feature.geometry.x,feature.geometry.y);if(feature.style.graphicWidth&&feature.style.graphicHeight){iconSize=new OpenLayers.Size(feature.style.graphicWidth,feature.style.graphicHeight);}
61066 if(feature.style.graphicXOffset!==undefined&&feature.style.graphicYOffset!==undefined){iconOffset=new OpenLayers.Pixel(feature.style.graphicXOffset,feature.style.graphicYOffset);}
61067 if(feature.style.externalGraphic!=null){data.icon=new OpenLayers.Icon(feature.style.externalGraphic,iconSize,iconOffset);}else{data.icon=OpenLayers.Marker.defaultIcon();if(iconSize!=null){data.icon.setSize(iconSize);}}
61068 if((feature.attributes.title!=null)&&(feature.attributes.description!=null)){data['popupContentHTML']='<h2>'+feature.attributes.title+'</h2>'+'<p>'+feature.attributes.description+'</p>';}
61069 data['overflow']=feature.attributes.overflow||"auto";var markerFeature=new OpenLayers.Feature(this,location,data);this.features.push(markerFeature);var marker=markerFeature.createMarker();if((feature.attributes.title!=null)&&(feature.attributes.description!=null)){marker.events.register('click',markerFeature,this.markerClick);}
61070 this.addMarker(marker);}
61071 this.events.triggerEvent("loadend");},markerClick:function(evt){var sameMarkerClicked=(this==this.layer.selectedFeature);this.layer.selectedFeature=(!sameMarkerClicked)?this:null;for(var i=0,len=this.layer.map.popups.length;i<len;i++){this.layer.map.removePopup(this.layer.map.popups[i]);}
61072 if(!sameMarkerClicked){this.layer.map.addPopup(this.createPopup());}
61073 OpenLayers.Event.stop(evt);},clearFeatures:function(){if(this.features!=null){while(this.features.length>0){var feature=this.features[0];OpenLayers.Util.removeItem(this.features,feature);feature.destroy();}}},CLASS_NAME:"OpenLayers.Layer.Text"});OpenLayers.Control.ModifyFeature=OpenLayers.Class(OpenLayers.Control,{geometryTypes:null,clickout:true,toggle:true,standalone:false,layer:null,feature:null,vertices:null,virtualVertices:null,selectControl:null,dragControl:null,handlers:null,deleteCodes:null,virtualStyle:null,mode:null,modified:false,radiusHandle:null,dragHandle:null,onModificationStart:function(){},onModification:function(){},onModificationEnd:function(){},initialize:function(layer,options){this.layer=layer;this.vertices=[];this.virtualVertices=[];this.virtualStyle=OpenLayers.Util.extend({},this.layer.style||this.layer.styleMap.createSymbolizer());this.virtualStyle.fillOpacity=0.3;this.virtualStyle.strokeOpacity=0.3;this.deleteCodes=[46,68];this.mode=OpenLayers.Control.ModifyFeature.RESHAPE;OpenLayers.Control.prototype.initialize.apply(this,[options]);if(!(this.deleteCodes instanceof Array)){this.deleteCodes=[this.deleteCodes];}
61074 var control=this;var selectOptions={geometryTypes:this.geometryTypes,clickout:this.clickout,toggle:this.toggle,onBeforeSelect:this.beforeSelectFeature,onSelect:this.selectFeature,onUnselect:this.unselectFeature,scope:this};if(this.standalone===false){this.selectControl=new OpenLayers.Control.SelectFeature(layer,selectOptions);}
61075 var dragOptions={geometryTypes:["OpenLayers.Geometry.Point"],snappingOptions:this.snappingOptions,onStart:function(feature,pixel){control.dragStart.apply(control,[feature,pixel]);},onDrag:function(feature,pixel){control.dragVertex.apply(control,[feature,pixel]);},onComplete:function(feature){control.dragComplete.apply(control,[feature]);},featureCallbacks:{over:function(feature){if(control.standalone!==true||feature._sketch||control.feature===feature){control.dragControl.overFeature.apply(control.dragControl,[feature]);}}}};this.dragControl=new OpenLayers.Control.DragFeature(layer,dragOptions);var keyboardOptions={keydown:this.handleKeypress};this.handlers={keyboard:new OpenLayers.Handler.Keyboard(this,keyboardOptions)};},destroy:function(){this.layer=null;this.standalone||this.selectControl.destroy();this.dragControl.destroy();OpenLayers.Control.prototype.destroy.apply(this,[]);},activate:function(){return((this.standalone||this.selectControl.activate())&&this.handlers.keyboard.activate()&&OpenLayers.Control.prototype.activate.apply(this,arguments));},deactivate:function(){var deactivated=false;if(OpenLayers.Control.prototype.deactivate.apply(this,arguments)){this.layer.removeFeatures(this.vertices,{silent:true});this.layer.removeFeatures(this.virtualVertices,{silent:true});this.vertices=[];this.dragControl.deactivate();var feature=this.feature;var valid=feature&&feature.geometry&&feature.layer;if(this.standalone===false){if(valid){this.selectControl.unselect.apply(this.selectControl,[feature]);}
61076 this.selectControl.deactivate();}else{if(valid){this.unselectFeature(feature);}}
61077 this.handlers.keyboard.deactivate();deactivated=true;}
61078 return deactivated;},beforeSelectFeature:function(feature){return this.layer.events.triggerEvent("beforefeaturemodified",{feature:feature});},selectFeature:function(feature){this.feature=feature;this.modified=false;this.resetVertices();this.dragControl.activate();this.onModificationStart(this.feature);},unselectFeature:function(feature){this.layer.removeFeatures(this.vertices,{silent:true});this.vertices=[];this.layer.destroyFeatures(this.virtualVertices,{silent:true});this.virtualVertices=[];if(this.dragHandle){this.layer.destroyFeatures([this.dragHandle],{silent:true});delete this.dragHandle;}
61079 if(this.radiusHandle){this.layer.destroyFeatures([this.radiusHandle],{silent:true});delete this.radiusHandle;}
61080 this.feature=null;this.dragControl.deactivate();this.onModificationEnd(feature);this.layer.events.triggerEvent("afterfeaturemodified",{feature:feature,modified:this.modified});this.modified=false;},dragStart:function(feature,pixel){if(feature!=this.feature&&!feature.geometry.parent&&feature!=this.dragHandle&&feature!=this.radiusHandle){if(this.standalone===false&&this.feature){this.selectControl.clickFeature.apply(this.selectControl,[this.feature]);}
61081 if(this.geometryTypes==null||OpenLayers.Util.indexOf(this.geometryTypes,feature.geometry.CLASS_NAME)!=-1){this.standalone||this.selectControl.clickFeature.apply(this.selectControl,[feature]);this.dragControl.overFeature.apply(this.dragControl,[feature]);this.dragControl.lastPixel=pixel;this.dragControl.handlers.drag.started=true;this.dragControl.handlers.drag.start=pixel;this.dragControl.handlers.drag.last=pixel;}}},dragVertex:function(vertex,pixel){this.modified=true;if(this.feature.geometry.CLASS_NAME=="OpenLayers.Geometry.Point"){if(this.feature!=vertex){this.feature=vertex;}
61082 this.layer.events.triggerEvent("vertexmodified",{vertex:vertex.geometry,feature:this.feature,pixel:pixel});}else{if(vertex._index){vertex.geometry.parent.addComponent(vertex.geometry,vertex._index);delete vertex._index;OpenLayers.Util.removeItem(this.virtualVertices,vertex);this.vertices.push(vertex);}else if(vertex==this.dragHandle){this.layer.removeFeatures(this.vertices,{silent:true});this.vertices=[];if(this.radiusHandle){this.layer.destroyFeatures([this.radiusHandle],{silent:true});this.radiusHandle=null;}}else if(vertex!==this.radiusHandle){this.layer.events.triggerEvent("vertexmodified",{vertex:vertex.geometry,feature:this.feature,pixel:pixel});}
61083 if(this.virtualVertices.length>0){this.layer.destroyFeatures(this.virtualVertices,{silent:true});this.virtualVertices=[];}
61084 this.layer.drawFeature(this.feature,this.standalone?undefined:this.selectControl.renderIntent);}
61085 this.layer.drawFeature(vertex);},dragComplete:function(vertex){this.resetVertices();this.setFeatureState();this.onModification(this.feature);this.layer.events.triggerEvent("featuremodified",{feature:this.feature});},setFeatureState:function(){if(this.feature.state!=OpenLayers.State.INSERT&&this.feature.state!=OpenLayers.State.DELETE){this.feature.state=OpenLayers.State.UPDATE;}},resetVertices:function(){if(this.dragControl.feature){this.dragControl.outFeature(this.dragControl.feature);}
61086 if(this.vertices.length>0){this.layer.removeFeatures(this.vertices,{silent:true});this.vertices=[];}
61087 if(this.virtualVertices.length>0){this.layer.removeFeatures(this.virtualVertices,{silent:true});this.virtualVertices=[];}
61088 if(this.dragHandle){this.layer.destroyFeatures([this.dragHandle],{silent:true});this.dragHandle=null;}
61089 if(this.radiusHandle){this.layer.destroyFeatures([this.radiusHandle],{silent:true});this.radiusHandle=null;}
61090 if(this.feature&&this.feature.geometry.CLASS_NAME!="OpenLayers.Geometry.Point"){if((this.mode&OpenLayers.Control.ModifyFeature.DRAG)){this.collectDragHandle();}
61091 if((this.mode&(OpenLayers.Control.ModifyFeature.ROTATE|OpenLayers.Control.ModifyFeature.RESIZE))){this.collectRadiusHandle();}
61092 if(this.mode&OpenLayers.Control.ModifyFeature.RESHAPE){if(!(this.mode&OpenLayers.Control.ModifyFeature.RESIZE)){this.collectVertices();}}}},handleKeypress:function(evt){var code=evt.keyCode;if(this.feature&&OpenLayers.Util.indexOf(this.deleteCodes,code)!=-1){var vertex=this.dragControl.feature;if(vertex&&OpenLayers.Util.indexOf(this.vertices,vertex)!=-1&&!this.dragControl.handlers.drag.dragging&&vertex.geometry.parent){vertex.geometry.parent.removeComponent(vertex.geometry);this.layer.drawFeature(this.feature,this.standalone?undefined:this.selectControl.renderIntent);this.resetVertices();this.setFeatureState();this.onModification(this.feature);this.layer.events.triggerEvent("featuremodified",{feature:this.feature});}}},collectVertices:function(){this.vertices=[];this.virtualVertices=[];var control=this;function collectComponentVertices(geometry){var i,vertex,component,len;if(geometry.CLASS_NAME=="OpenLayers.Geometry.Point"){vertex=new OpenLayers.Feature.Vector(geometry);vertex._sketch=true;control.vertices.push(vertex);}else{var numVert=geometry.components.length;if(geometry.CLASS_NAME=="OpenLayers.Geometry.LinearRing"){numVert-=1;}
61093 for(i=0;i<numVert;++i){component=geometry.components[i];if(component.CLASS_NAME=="OpenLayers.Geometry.Point"){vertex=new OpenLayers.Feature.Vector(component);vertex._sketch=true;control.vertices.push(vertex);}else{collectComponentVertices(component);}}
61094 if(geometry.CLASS_NAME!="OpenLayers.Geometry.MultiPoint"){for(i=0,len=geometry.components.length;i<len-1;++i){var prevVertex=geometry.components[i];var nextVertex=geometry.components[i+1];if(prevVertex.CLASS_NAME=="OpenLayers.Geometry.Point"&&nextVertex.CLASS_NAME=="OpenLayers.Geometry.Point"){var x=(prevVertex.x+nextVertex.x)/2;var y=(prevVertex.y+nextVertex.y)/2;var point=new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(x,y),null,control.virtualStyle);point.geometry.parent=geometry;point._index=i+1;point._sketch=true;control.virtualVertices.push(point);}}}}}
61095 collectComponentVertices.call(this,this.feature.geometry);this.layer.addFeatures(this.virtualVertices,{silent:true});this.layer.addFeatures(this.vertices,{silent:true});},collectDragHandle:function(){var geometry=this.feature.geometry;var center=geometry.getBounds().getCenterLonLat();var originGeometry=new OpenLayers.Geometry.Point(center.lon,center.lat);var origin=new OpenLayers.Feature.Vector(originGeometry);originGeometry.move=function(x,y){OpenLayers.Geometry.Point.prototype.move.call(this,x,y);geometry.move(x,y);};origin._sketch=true;this.dragHandle=origin;this.layer.addFeatures([this.dragHandle],{silent:true});},collectRadiusHandle:function(){var geometry=this.feature.geometry;var bounds=geometry.getBounds();var center=bounds.getCenterLonLat();var originGeometry=new OpenLayers.Geometry.Point(center.lon,center.lat);var radiusGeometry=new OpenLayers.Geometry.Point(bounds.right,bounds.bottom);var radius=new OpenLayers.Feature.Vector(radiusGeometry);var resize=(this.mode&OpenLayers.Control.ModifyFeature.RESIZE);var reshape=(this.mode&OpenLayers.Control.ModifyFeature.RESHAPE);var rotate=(this.mode&OpenLayers.Control.ModifyFeature.ROTATE);radiusGeometry.move=function(x,y){OpenLayers.Geometry.Point.prototype.move.call(this,x,y);var dx1=this.x-originGeometry.x;var dy1=this.y-originGeometry.y;var dx0=dx1-x;var dy0=dy1-y;if(rotate){var a0=Math.atan2(dy0,dx0);var a1=Math.atan2(dy1,dx1);var angle=a1-a0;angle*=180/Math.PI;geometry.rotate(angle,originGeometry);}
61096 if(resize){var scale,ratio;if(reshape){scale=dy1/dy0;ratio=(dx1/dx0)/scale;}else{var l0=Math.sqrt((dx0*dx0)+(dy0*dy0));var l1=Math.sqrt((dx1*dx1)+(dy1*dy1));scale=l1/l0;}
61097 geometry.resize(scale,originGeometry,ratio);}};radius._sketch=true;this.radiusHandle=radius;this.layer.addFeatures([this.radiusHandle],{silent:true});},setMap:function(map){this.standalone||this.selectControl.setMap(map);this.dragControl.setMap(map);OpenLayers.Control.prototype.setMap.apply(this,arguments);},CLASS_NAME:"OpenLayers.Control.ModifyFeature"});OpenLayers.Control.ModifyFeature.RESHAPE=1;OpenLayers.Control.ModifyFeature.RESIZE=2;OpenLayers.Control.ModifyFeature.ROTATE=4;OpenLayers.Control.ModifyFeature.DRAG=8;OpenLayers.Geometry.LineString=OpenLayers.Class(OpenLayers.Geometry.Curve,{initialize:function(points){OpenLayers.Geometry.Curve.prototype.initialize.apply(this,arguments);},removeComponent:function(point){if(this.components&&(this.components.length>2)){OpenLayers.Geometry.Collection.prototype.removeComponent.apply(this,arguments);}},intersects:function(geometry){var intersect=false;var type=geometry.CLASS_NAME;if(type=="OpenLayers.Geometry.LineString"||type=="OpenLayers.Geometry.LinearRing"||type=="OpenLayers.Geometry.Point"){var segs1=this.getSortedSegments();var segs2;if(type=="OpenLayers.Geometry.Point"){segs2=[{x1:geometry.x,y1:geometry.y,x2:geometry.x,y2:geometry.y}];}else{segs2=geometry.getSortedSegments();}
61098 var seg1,seg1x1,seg1x2,seg1y1,seg1y2,seg2,seg2y1,seg2y2;outer:for(var i=0,len=segs1.length;i<len;++i){seg1=segs1[i];seg1x1=seg1.x1;seg1x2=seg1.x2;seg1y1=seg1.y1;seg1y2=seg1.y2;inner:for(var j=0,jlen=segs2.length;j<jlen;++j){seg2=segs2[j];if(seg2.x1>seg1x2){break;}
61099 if(seg2.x2<seg1x1){continue;}
61100 seg2y1=seg2.y1;seg2y2=seg2.y2;if(Math.min(seg2y1,seg2y2)>Math.max(seg1y1,seg1y2)){continue;}
61101 if(Math.max(seg2y1,seg2y2)<Math.min(seg1y1,seg1y2)){continue;}
61102 if(OpenLayers.Geometry.segmentsIntersect(seg1,seg2)){intersect=true;break outer;}}}}else{intersect=geometry.intersects(this);}
61103 return intersect;},getSortedSegments:function(){var numSeg=this.components.length-1;var segments=new Array(numSeg),point1,point2;for(var i=0;i<numSeg;++i){point1=this.components[i];point2=this.components[i+1];if(point1.x<point2.x){segments[i]={x1:point1.x,y1:point1.y,x2:point2.x,y2:point2.y};}else{segments[i]={x1:point2.x,y1:point2.y,x2:point1.x,y2:point1.y};}}
61104 function byX1(seg1,seg2){return seg1.x1-seg2.x1;}
61105 return segments.sort(byX1);},splitWithSegment:function(seg,options){var edge=!(options&&options.edge===false);var tolerance=options&&options.tolerance;var lines=[];var verts=this.getVertices();var points=[];var intersections=[];var split=false;var vert1,vert2,point;var node,vertex,target;var interOptions={point:true,tolerance:tolerance};var result=null;for(var i=0,stop=verts.length-2;i<=stop;++i){vert1=verts[i];points.push(vert1.clone());vert2=verts[i+1];target={x1:vert1.x,y1:vert1.y,x2:vert2.x,y2:vert2.y};point=OpenLayers.Geometry.segmentsIntersect(seg,target,interOptions);if(point instanceof OpenLayers.Geometry.Point){if((point.x===seg.x1&&point.y===seg.y1)||(point.x===seg.x2&&point.y===seg.y2)||point.equals(vert1)||point.equals(vert2)){vertex=true;}else{vertex=false;}
61106 if(vertex||edge){if(!point.equals(intersections[intersections.length-1])){intersections.push(point.clone());}
61107 if(i===0){if(point.equals(vert1)){continue;}}
61108 if(point.equals(vert2)){continue;}
61109 split=true;if(!point.equals(vert1)){points.push(point);}
61110 lines.push(new OpenLayers.Geometry.LineString(points));points=[point.clone()];}}}
61111 if(split){points.push(vert2.clone());lines.push(new OpenLayers.Geometry.LineString(points));}
61112 if(intersections.length>0){var xDir=seg.x1<seg.x2?1:-1;var yDir=seg.y1<seg.y2?1:-1;result={lines:lines,points:intersections.sort(function(p1,p2){return(xDir*p1.x-xDir*p2.x)||(yDir*p1.y-yDir*p2.y);})};}
61113 return result;},split:function(target,options){var results=null;var mutual=options&&options.mutual;var sourceSplit,targetSplit,sourceParts,targetParts;if(target instanceof OpenLayers.Geometry.LineString){var verts=this.getVertices();var vert1,vert2,seg,splits,lines,point;var points=[];sourceParts=[];for(var i=0,stop=verts.length-2;i<=stop;++i){vert1=verts[i];vert2=verts[i+1];seg={x1:vert1.x,y1:vert1.y,x2:vert2.x,y2:vert2.y};targetParts=targetParts||[target];if(mutual){points.push(vert1.clone());}
61114 for(var j=0;j<targetParts.length;++j){splits=targetParts[j].splitWithSegment(seg,options);if(splits){lines=splits.lines;if(lines.length>0){lines.unshift(j,1);Array.prototype.splice.apply(targetParts,lines);j+=lines.length-2;}
61115 if(mutual){for(var k=0,len=splits.points.length;k<len;++k){point=splits.points[k];if(!point.equals(vert1)){points.push(point);sourceParts.push(new OpenLayers.Geometry.LineString(points));if(point.equals(vert2)){points=[];}else{points=[point.clone()];}}}}}}}
61116 if(mutual&&sourceParts.length>0&&points.length>0){points.push(vert2.clone());sourceParts.push(new OpenLayers.Geometry.LineString(points));}}else{results=target.splitWith(this,options);}
61117 if(targetParts&&targetParts.length>1){targetSplit=true;}else{targetParts=[];}
61118 if(sourceParts&&sourceParts.length>1){sourceSplit=true;}else{sourceParts=[];}
61119 if(targetSplit||sourceSplit){if(mutual){results=[sourceParts,targetParts];}else{results=targetParts;}}
61120 return results;},splitWith:function(geometry,options){return geometry.split(this,options);},getVertices:function(nodes){var vertices;if(nodes===true){vertices=[this.components[0],this.components[this.components.length-1]];}else if(nodes===false){vertices=this.components.slice(1,this.components.length-1);}else{vertices=this.components.slice();}
61121 return vertices;},distanceTo:function(geometry,options){var edge=!(options&&options.edge===false);var details=edge&&options&&options.details;var result,best={};var min=Number.POSITIVE_INFINITY;if(geometry instanceof OpenLayers.Geometry.Point){var segs=this.getSortedSegments();var x=geometry.x;var y=geometry.y;var seg;for(var i=0,len=segs.length;i<len;++i){seg=segs[i];result=OpenLayers.Geometry.distanceToSegment(geometry,seg);if(result.distance<min){min=result.distance;best=result;if(min===0){break;}}else{if(seg.x2>x&&((y>seg.y1&&y<seg.y2)||(y<seg.y1&&y>seg.y2))){break;}}}
61122 if(details){best={distance:best.distance,x0:best.x,y0:best.y,x1:x,y1:y};}else{best=best.distance;}}else if(geometry instanceof OpenLayers.Geometry.LineString){var segs0=this.getSortedSegments();var segs1=geometry.getSortedSegments();var seg0,seg1,intersection,x0,y0;var len1=segs1.length;var interOptions={point:true};outer:for(var i=0,len=segs0.length;i<len;++i){seg0=segs0[i];x0=seg0.x1;y0=seg0.y1;for(var j=0;j<len1;++j){seg1=segs1[j];intersection=OpenLayers.Geometry.segmentsIntersect(seg0,seg1,interOptions);if(intersection){min=0;best={distance:0,x0:intersection.x,y0:intersection.y,x1:intersection.x,y1:intersection.y};break outer;}else{result=OpenLayers.Geometry.distanceToSegment({x:x0,y:y0},seg1);if(result.distance<min){min=result.distance;best={distance:min,x0:x0,y0:y0,x1:result.x,y1:result.y};}}}}
61123 if(!details){best=best.distance;}
61124 if(min!==0){if(seg0){result=geometry.distanceTo(new OpenLayers.Geometry.Point(seg0.x2,seg0.y2),options);var dist=details?result.distance:result;if(dist<min){if(details){best={distance:min,x0:result.x1,y0:result.y1,x1:result.x0,y1:result.y0};}else{best=dist;}}}}}else{best=geometry.distanceTo(this,options);if(details){best={distance:best.distance,x0:best.x1,y0:best.y1,x1:best.x0,y1:best.y0};}}
61125 return best;},CLASS_NAME:"OpenLayers.Geometry.LineString"});OpenLayers.Control.TransformFeature=OpenLayers.Class(OpenLayers.Control,{EVENT_TYPES:["beforesetfeature","setfeature","beforetransform","transform","transformcomplete"],geometryTypes:null,layer:null,preserveAspectRatio:false,rotate:true,feature:null,renderIntent:"temporary",rotationHandleSymbolizer:null,box:null,center:null,scale:1,ratio:1,rotation:0,handles:null,rotationHandles:null,dragControl:null,initialize:function(layer,options){this.EVENT_TYPES=OpenLayers.Control.TransformFeature.prototype.EVENT_TYPES.concat(OpenLayers.Control.prototype.EVENT_TYPES);OpenLayers.Control.prototype.initialize.apply(this,[options]);this.layer=layer;if(!this.rotationHandleSymbolizer){this.rotationHandleSymbolizer={stroke:false,pointRadius:10,fillOpacity:0,cursor:"pointer"};}
61126 this.createBox();this.createControl();},activate:function(){var activated=false;if(OpenLayers.Control.prototype.activate.apply(this,arguments)){this.dragControl.activate();this.layer.addFeatures([this.box]);this.rotate&&this.layer.addFeatures(this.rotationHandles);this.layer.addFeatures(this.handles);activated=true;}
61127 return activated;},deactivate:function(){var deactivated=false;if(OpenLayers.Control.prototype.deactivate.apply(this,arguments)){this.layer.removeFeatures(this.handles);this.rotate&&this.layer.removeFeatures(this.rotationHandles);this.layer.removeFeatures([this.box]);this.dragControl.deactivate();deactivated=true;}
61128 return deactivated;},setMap:function(map){this.dragControl.setMap(map);OpenLayers.Control.prototype.setMap.apply(this,arguments);},setFeature:function(feature,initialParams){initialParams=OpenLayers.Util.applyDefaults(initialParams,{rotation:0,scale:1,ratio:1});var evt={feature:feature};var oldRotation=this.rotation;var oldCenter=this.center;OpenLayers.Util.extend(this,initialParams);if(this.events.triggerEvent("beforesetfeature",evt)===false){return;}
61129 this.feature=feature;this.activate();this._setfeature=true;var featureBounds=this.feature.geometry.getBounds();this.box.move(featureBounds.getCenterLonLat());this.box.geometry.rotate(-oldRotation,oldCenter);this._angle=0;var ll;if(this.rotation){var geom=feature.geometry.clone();geom.rotate(-this.rotation,this.center);var box=new OpenLayers.Feature.Vector(geom.getBounds().toGeometry());box.geometry.rotate(this.rotation,this.center);this.box.geometry.rotate(this.rotation,this.center);this.box.move(box.geometry.getBounds().getCenterLonLat());var llGeom=box.geometry.components[0].components[0];ll=llGeom.getBounds().getCenterLonLat();}else{ll=new OpenLayers.LonLat(featureBounds.left,featureBounds.bottom);}
61130 this.handles[0].move(ll);delete this._setfeature;this.events.triggerEvent("setfeature",evt);},createBox:function(){var control=this;this.center=new OpenLayers.Geometry.Point(0,0);var box=new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LineString([new OpenLayers.Geometry.Point(-1,-1),new OpenLayers.Geometry.Point(0,-1),new OpenLayers.Geometry.Point(1,-1),new OpenLayers.Geometry.Point(1,0),new OpenLayers.Geometry.Point(1,1),new OpenLayers.Geometry.Point(0,1),new OpenLayers.Geometry.Point(-1,1),new OpenLayers.Geometry.Point(-1,0),new OpenLayers.Geometry.Point(-1,-1)]),null,typeof this.renderIntent=="string"?null:this.renderIntent);box.geometry.move=function(x,y){control._moving=true;OpenLayers.Geometry.LineString.prototype.move.apply(this,arguments);control.center.move(x,y);delete control._moving;};var vertexMoveFn=function(x,y){OpenLayers.Geometry.Point.prototype.move.apply(this,arguments);this._rotationHandle&&this._rotationHandle.geometry.move(x,y);this._handle.geometry.move(x,y);};var vertexResizeFn=function(scale,center,ratio){OpenLayers.Geometry.Point.prototype.resize.apply(this,arguments);this._rotationHandle&&this._rotationHandle.geometry.resize(scale,center,ratio);this._handle.geometry.resize(scale,center,ratio);};var vertexRotateFn=function(angle,center){OpenLayers.Geometry.Point.prototype.rotate.apply(this,arguments);this._rotationHandle&&this._rotationHandle.geometry.rotate(angle,center);this._handle.geometry.rotate(angle,center);};var handleMoveFn=function(x,y){var oldX=this.x,oldY=this.y;OpenLayers.Geometry.Point.prototype.move.call(this,x,y);if(control._moving){return;}
61131 var evt=control.dragControl.handlers.drag.evt;var preserveAspectRatio=!control._setfeature&&control.preserveAspectRatio;var reshape=!preserveAspectRatio&&!(evt&&evt.shiftKey);var oldGeom=new OpenLayers.Geometry.Point(oldX,oldY);var centerGeometry=control.center;this.rotate(-control.rotation,centerGeometry);oldGeom.rotate(-control.rotation,centerGeometry);var dx1=this.x-centerGeometry.x;var dy1=this.y-centerGeometry.y;var dx0=dx1-(this.x-oldGeom.x);var dy0=dy1-(this.y-oldGeom.y);this.x=oldX;this.y=oldY;var scale,ratio=1;if(reshape){scale=Math.abs(dy0)<0.00001?1:dy1/dy0;ratio=(Math.abs(dx0)<0.00001?1:(dx1/dx0))/scale;}else{var l0=Math.sqrt((dx0*dx0)+(dy0*dy0));var l1=Math.sqrt((dx1*dx1)+(dy1*dy1));scale=l1/l0;}
61132 control._moving=true;control.box.geometry.rotate(-control.rotation,centerGeometry);delete control._moving;control.box.geometry.resize(scale,centerGeometry,ratio);control.box.geometry.rotate(control.rotation,centerGeometry);control.transformFeature({scale:scale,ratio:ratio});};var rotationHandleMoveFn=function(x,y){var oldX=this.x,oldY=this.y;OpenLayers.Geometry.Point.prototype.move.call(this,x,y);if(control._moving){return;}
61133 var evt=control.dragControl.handlers.drag.evt;var constrain=(evt&&evt.shiftKey)?45:1;var centerGeometry=control.center;var dx1=this.x-centerGeometry.x;var dy1=this.y-centerGeometry.y;var dx0=dx1-x;var dy0=dy1-y;this.x=oldX;this.y=oldY;var a0=Math.atan2(dy0,dx0);var a1=Math.atan2(dy1,dx1);var angle=a1-a0;angle*=180/Math.PI;control._angle=(control._angle+angle)%360;var diff=control.rotation%constrain;if(Math.abs(control._angle)>=constrain||diff!==0){angle=Math.round(control._angle/constrain)*constrain-
61134 diff;control._angle=0;control.box.geometry.rotate(angle,centerGeometry);control.transformFeature({rotation:angle});}};var handles=new Array(8);var rotationHandles=new Array(4);var geom,handle,rotationHandle;for(var i=0;i<8;++i){geom=box.geometry.components[i];handle=new OpenLayers.Feature.Vector(geom.clone(),null,typeof this.renderIntent=="string"?null:this.renderIntent);if(i%2==0){rotationHandle=new OpenLayers.Feature.Vector(geom.clone(),null,typeof this.rotationHandleSymbolizer=="string"?null:this.rotationHandleSymbolizer);rotationHandle.geometry.move=rotationHandleMoveFn;geom._rotationHandle=rotationHandle;rotationHandles[i/2]=rotationHandle;}
61135 geom.move=vertexMoveFn;geom.resize=vertexResizeFn;geom.rotate=vertexRotateFn;handle.geometry.move=handleMoveFn;geom._handle=handle;handles[i]=handle;}
61136 this.box=box;this.rotationHandles=rotationHandles;this.handles=handles;},createControl:function(){var control=this;this.dragControl=new OpenLayers.Control.DragFeature(this.layer,{documentDrag:true,moveFeature:function(pixel){if(this.feature===control.feature){this.feature=control.box;}
61137 OpenLayers.Control.DragFeature.prototype.moveFeature.apply(this,arguments);},onDrag:function(feature,pixel){if(feature===control.box){control.transformFeature({center:control.center});control.drawHandles();}},onStart:function(feature,pixel){var eligible=!control.geometryTypes||OpenLayers.Util.indexOf(control.geometryTypes,feature.geometry.CLASS_NAME)!==-1;var i=OpenLayers.Util.indexOf(control.handles,feature);i+=OpenLayers.Util.indexOf(control.rotationHandles,feature);if(feature!==control.feature&&feature!==control.box&&i==-2&&eligible){control.setFeature(feature);}},onComplete:function(feature,pixel){control.events.triggerEvent("transformcomplete",{feature:control.feature});}});},drawHandles:function(){var layer=this.layer;for(var i=0;i<8;++i){if(this.rotate&&i%2===0){layer.drawFeature(this.rotationHandles[i/2],this.rotationHandleSymbolizer);}
61138 layer.drawFeature(this.handles[i],this.renderIntent);}},transformFeature:function(mods){if(!this._setfeature){this.scale*=(mods.scale||1);this.ratio*=(mods.ratio||1);var oldRotation=this.rotation;this.rotation=(this.rotation+(mods.rotation||0))%360;if(this.events.triggerEvent("beforetransform",mods)!==false){var feature=this.feature;var geom=feature.geometry;var center=this.center;geom.rotate(-oldRotation,center);if(mods.scale||mods.ratio){geom.resize(mods.scale,center,mods.ratio);}else if(mods.center){feature.move(mods.center.getBounds().getCenterLonLat());}
61139 geom.rotate(this.rotation,center);this.layer.drawFeature(feature);feature.toState(OpenLayers.State.UPDATE);this.events.triggerEvent("transform",mods);}}
61140 this.layer.drawFeature(this.box,this.renderIntent);this.drawHandles();},destroy:function(){var geom;for(var i=0;i<8;++i){geom=this.box.geometry.components[i];geom._handle.destroy();geom._handle=null;geom._rotationHandle&&geom._rotationHandle.destroy();geom._rotationHandle=null;}
61141 this.box.destroy();this.box=null;this.layer=null;this.dragControl.destroy();OpenLayers.Control.prototype.destroy.apply(this,arguments);},CLASS_NAME:"OpenLayers.Control.TransformFeature"});OpenLayers.Format.GPX=OpenLayers.Class(OpenLayers.Format.XML,{extractWaypoints:true,extractTracks:true,extractRoutes:true,extractAttributes:true,initialize:function(options){this.externalProjection=new OpenLayers.Projection("EPSG:4326");OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);},read:function(doc){if(typeof doc=="string"){doc=OpenLayers.Format.XML.prototype.read.apply(this,[doc]);}
61142 var features=[];if(this.extractTracks){var tracks=doc.getElementsByTagName("trk");for(var i=0,len=tracks.length;i<len;i++){var attrs={};if(this.extractAttributes){attrs=this.parseAttributes(tracks[i]);}
61143 var segs=this.getElementsByTagNameNS(tracks[i],tracks[i].namespaceURI,"trkseg");for(var j=0,seglen=segs.length;j<seglen;j++){var track=this.extractSegment(segs[j],"trkpt");features.push(new OpenLayers.Feature.Vector(track,attrs));}}}
61144 if(this.extractRoutes){var routes=doc.getElementsByTagName("rte");for(var k=0,klen=routes.length;k<klen;k++){var attrs={};if(this.extractAttributes){attrs=this.parseAttributes(routes[k]);}
61145 var route=this.extractSegment(routes[k],"rtept");features.push(new OpenLayers.Feature.Vector(route,attrs));}}
61146 if(this.extractWaypoints){var waypoints=doc.getElementsByTagName("wpt");for(var l=0,len=waypoints.length;l<len;l++){var attrs={};if(this.extractAttributes){attrs=this.parseAttributes(waypoints[l]);}
61147 var wpt=new OpenLayers.Geometry.Point(waypoints[l].getAttribute("lon"),waypoints[l].getAttribute("lat"));features.push(new OpenLayers.Feature.Vector(wpt,attrs));}}
61148 if(this.internalProjection&&this.externalProjection){for(var g=0,featLength=features.length;g<featLength;g++){features[g].geometry.transform(this.externalProjection,this.internalProjection);}}
61149 return features;},extractSegment:function(segment,segmentType){var points=this.getElementsByTagNameNS(segment,segment.namespaceURI,segmentType);var point_features=[];for(var i=0,len=points.length;i<len;i++){point_features.push(new OpenLayers.Geometry.Point(points[i].getAttribute("lon"),points[i].getAttribute("lat")));}
61150 return new OpenLayers.Geometry.LineString(point_features);},parseAttributes:function(node){var attributes={};var attrNode=node.firstChild;while(attrNode){if(attrNode.nodeType==1){var value=attrNode.firstChild;if(value.nodeType==3||value.nodeType==4){name=(attrNode.prefix)?attrNode.nodeName.split(":")[1]:attrNode.nodeName;if(name!="trkseg"&&name!="rtept"){attributes[name]=value.nodeValue;}}}
61151 attrNode=attrNode.nextSibling;}
61152 return attributes;},CLASS_NAME:"OpenLayers.Format.GPX"});OpenLayers.Geometry.LinearRing=OpenLayers.Class(OpenLayers.Geometry.LineString,{componentTypes:["OpenLayers.Geometry.Point"],initialize:function(points){OpenLayers.Geometry.LineString.prototype.initialize.apply(this,arguments);},addComponent:function(point,index){var added=false;var lastPoint=this.components.pop();if(index!=null||!point.equals(lastPoint)){added=OpenLayers.Geometry.Collection.prototype.addComponent.apply(this,arguments);}
61153 var firstPoint=this.components[0];OpenLayers.Geometry.Collection.prototype.addComponent.apply(this,[firstPoint]);return added;},removeComponent:function(point){if(this.components.length>4){this.components.pop();OpenLayers.Geometry.Collection.prototype.removeComponent.apply(this,arguments);var firstPoint=this.components[0];OpenLayers.Geometry.Collection.prototype.addComponent.apply(this,[firstPoint]);}},move:function(x,y){for(var i=0,len=this.components.length;i<len-1;i++){this.components[i].move(x,y);}},rotate:function(angle,origin){for(var i=0,len=this.components.length;i<len-1;++i){this.components[i].rotate(angle,origin);}},resize:function(scale,origin,ratio){for(var i=0,len=this.components.length;i<len-1;++i){this.components[i].resize(scale,origin,ratio);}
61154 return this;},transform:function(source,dest){if(source&&dest){for(var i=0,len=this.components.length;i<len-1;i++){var component=this.components[i];component.transform(source,dest);}
61155 this.bounds=null;}
61156 return this;},getCentroid:function(){if(this.components&&(this.components.length>2)){var sumX=0.0;var sumY=0.0;for(var i=0;i<this.components.length-1;i++){var b=this.components[i];var c=this.components[i+1];sumX+=(b.x+c.x)*(b.x*c.y-c.x*b.y);sumY+=(b.y+c.y)*(b.x*c.y-c.x*b.y);}
61157 var area=-1*this.getArea();var x=sumX/(6*area);var y=sumY/(6*area);return new OpenLayers.Geometry.Point(x,y);}else{return null;}},getArea:function(){var area=0.0;if(this.components&&(this.components.length>2)){var sum=0.0;for(var i=0,len=this.components.length;i<len-1;i++){var b=this.components[i];var c=this.components[i+1];sum+=(b.x+c.x)*(c.y-b.y);}
61158 area=-sum/2.0;}
61159 return area;},getGeodesicArea:function(projection){var ring=this;if(projection){var gg=new OpenLayers.Projection("EPSG:4326");if(!gg.equals(projection)){ring=this.clone().transform(projection,gg);}}
61160 var area=0.0;var len=ring.components&&ring.components.length;if(len>2){var p1,p2;for(var i=0;i<len-1;i++){p1=ring.components[i];p2=ring.components[i+1];area+=OpenLayers.Util.rad(p2.x-p1.x)*(2+Math.sin(OpenLayers.Util.rad(p1.y))+
61161 Math.sin(OpenLayers.Util.rad(p2.y)));}
61162 area=area*6378137.0*6378137.0/2.0;}
61163 return area;},containsPoint:function(point){var approx=OpenLayers.Number.limitSigDigs;var digs=14;var px=approx(point.x,digs);var py=approx(point.y,digs);function getX(y,x1,y1,x2,y2){return(((x1-x2)*y)+((x2*y1)-(x1*y2)))/(y1-y2);}
61164 var numSeg=this.components.length-1;var start,end,x1,y1,x2,y2,cx,cy;var crosses=0;for(var i=0;i<numSeg;++i){start=this.components[i];x1=approx(start.x,digs);y1=approx(start.y,digs);end=this.components[i+1];x2=approx(end.x,digs);y2=approx(end.y,digs);if(y1==y2){if(py==y1){if(x1<=x2&&(px>=x1&&px<=x2)||x1>=x2&&(px<=x1&&px>=x2)){crosses=-1;break;}}
61165 continue;}
61166 cx=approx(getX(py,x1,y1,x2,y2),digs);if(cx==px){if(y1<y2&&(py>=y1&&py<=y2)||y1>y2&&(py<=y1&&py>=y2)){crosses=-1;break;}}
61167 if(cx<=px){continue;}
61168 if(x1!=x2&&(cx<Math.min(x1,x2)||cx>Math.max(x1,x2))){continue;}
61169 if(y1<y2&&(py>=y1&&py<y2)||y1>y2&&(py<y1&&py>=y2)){++crosses;}}
61170 var contained=(crosses==-1)?1:!!(crosses&1);return contained;},intersects:function(geometry){var intersect=false;if(geometry.CLASS_NAME=="OpenLayers.Geometry.Point"){intersect=this.containsPoint(geometry);}else if(geometry.CLASS_NAME=="OpenLayers.Geometry.LineString"){intersect=geometry.intersects(this);}else if(geometry.CLASS_NAME=="OpenLayers.Geometry.LinearRing"){intersect=OpenLayers.Geometry.LineString.prototype.intersects.apply(this,[geometry]);}else{for(var i=0,len=geometry.components.length;i<len;++i){intersect=geometry.components[i].intersects(this);if(intersect){break;}}}
61171 return intersect;},getVertices:function(nodes){return(nodes===true)?[]:this.components.slice(0,this.components.length-1);},CLASS_NAME:"OpenLayers.Geometry.LinearRing"});OpenLayers.Geometry.MultiLineString=OpenLayers.Class(OpenLayers.Geometry.Collection,{componentTypes:["OpenLayers.Geometry.LineString"],initialize:function(components){OpenLayers.Geometry.Collection.prototype.initialize.apply(this,arguments);},split:function(geometry,options){var results=null;var mutual=options&&options.mutual;var splits,sourceLine,sourceLines,sourceSplit,targetSplit;var sourceParts=[];var targetParts=[geometry];for(var i=0,len=this.components.length;i<len;++i){sourceLine=this.components[i];sourceSplit=false;for(var j=0;j<targetParts.length;++j){splits=sourceLine.split(targetParts[j],options);if(splits){if(mutual){sourceLines=splits[0];for(var k=0,klen=sourceLines.length;k<klen;++k){if(k===0&&sourceParts.length){sourceParts[sourceParts.length-1].addComponent(sourceLines[k]);}else{sourceParts.push(new OpenLayers.Geometry.MultiLineString([sourceLines[k]]));}}
61172 sourceSplit=true;splits=splits[1];}
61173 if(splits.length){splits.unshift(j,1);Array.prototype.splice.apply(targetParts,splits);break;}}}
61174 if(!sourceSplit){if(sourceParts.length){sourceParts[sourceParts.length-1].addComponent(sourceLine.clone());}else{sourceParts=[new OpenLayers.Geometry.MultiLineString(sourceLine.clone())];}}}
61175 if(sourceParts&&sourceParts.length>1){sourceSplit=true;}else{sourceParts=[];}
61176 if(targetParts&&targetParts.length>1){targetSplit=true;}else{targetParts=[];}
61177 if(sourceSplit||targetSplit){if(mutual){results=[sourceParts,targetParts];}else{results=targetParts;}}
61178 return results;},splitWith:function(geometry,options){var results=null;var mutual=options&&options.mutual;var splits,targetLine,sourceLines,sourceSplit,targetSplit,sourceParts,targetParts;if(geometry instanceof OpenLayers.Geometry.LineString){targetParts=[];sourceParts=[geometry];for(var i=0,len=this.components.length;i<len;++i){targetSplit=false;targetLine=this.components[i];for(var j=0;j<sourceParts.length;++j){splits=sourceParts[j].split(targetLine,options);if(splits){if(mutual){sourceLines=splits[0];if(sourceLines.length){sourceLines.unshift(j,1);Array.prototype.splice.apply(sourceParts,sourceLines);j+=sourceLines.length-2;}
61179 splits=splits[1];if(splits.length===0){splits=[targetLine.clone()];}}
61180 for(var k=0,klen=splits.length;k<klen;++k){if(k===0&&targetParts.length){targetParts[targetParts.length-1].addComponent(splits[k]);}else{targetParts.push(new OpenLayers.Geometry.MultiLineString([splits[k]]));}}
61181 targetSplit=true;}}
61182 if(!targetSplit){if(targetParts.length){targetParts[targetParts.length-1].addComponent(targetLine.clone());}else{targetParts=[new OpenLayers.Geometry.MultiLineString([targetLine.clone()])];}}}}else{results=geometry.split(this);}
61183 if(sourceParts&&sourceParts.length>1){sourceSplit=true;}else{sourceParts=[];}
61184 if(targetParts&&targetParts.length>1){targetSplit=true;}else{targetParts=[];}
61185 if(sourceSplit||targetSplit){if(mutual){results=[sourceParts,targetParts];}else{results=targetParts;}}
61186 return results;},CLASS_NAME:"OpenLayers.Geometry.MultiLineString"});OpenLayers.Handler.Path=OpenLayers.Class(OpenLayers.Handler.Point,{line:null,freehand:false,freehandToggle:'shiftKey',initialize:function(control,callbacks,options){OpenLayers.Handler.Point.prototype.initialize.apply(this,arguments);},createFeature:function(pixel){var lonlat=this.control.map.getLonLatFromPixel(pixel);this.point=new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(lonlat.lon,lonlat.lat));this.line=new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LineString([this.point.geometry]));this.callback("create",[this.point.geometry,this.getSketch()]);this.point.geometry.clearBounds();this.layer.addFeatures([this.line,this.point],{silent:true});},destroyFeature:function(){OpenLayers.Handler.Point.prototype.destroyFeature.apply(this);this.line=null;},removePoint:function(){if(this.point){this.layer.removeFeatures([this.point]);}},addPoint:function(pixel){this.layer.removeFeatures([this.point]);var lonlat=this.control.map.getLonLatFromPixel(pixel);this.point=new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(lonlat.lon,lonlat.lat));this.line.geometry.addComponent(this.point.geometry,this.line.geometry.components.length);this.callback("point",[this.point.geometry,this.getGeometry()]);this.callback("modify",[this.point.geometry,this.getSketch()]);this.drawFeature();},freehandMode:function(evt){return(this.freehandToggle&&evt[this.freehandToggle])?!this.freehand:this.freehand;},modifyFeature:function(pixel){var lonlat=this.control.map.getLonLatFromPixel(pixel);this.point.geometry.x=lonlat.lon;this.point.geometry.y=lonlat.lat;this.callback("modify",[this.point.geometry,this.getSketch()]);this.point.geometry.clearBounds();this.drawFeature();},drawFeature:function(){this.layer.drawFeature(this.line,this.style);this.layer.drawFeature(this.point,this.style);},getSketch:function(){return this.line;},getGeometry:function(){var geometry=this.line&&this.line.geometry;if(geometry&&this.multi){geometry=new OpenLayers.Geometry.MultiLineString([geometry]);}
61187 return geometry;},mousedown:function(evt){if(this.lastDown&&this.lastDown.equals(evt.xy)){return false;}
61188 if(this.lastDown==null){if(this.persist){this.destroyFeature();}
61189 this.createFeature(evt.xy);}else if((this.lastUp==null)||!this.lastUp.equals(evt.xy)){this.addPoint(evt.xy);}
61190 this.mouseDown=true;this.lastDown=evt.xy;this.drawing=true;return false;},mousemove:function(evt){if(this.drawing){if(this.mouseDown&&this.freehandMode(evt)){this.addPoint(evt.xy);}else{this.modifyFeature(evt.xy);}}
61191 return true;},mouseup:function(evt){this.mouseDown=false;if(this.drawing){if(this.freehandMode(evt)){this.removePoint();this.finalize();}else{if(this.lastUp==null){this.addPoint(evt.xy);}
61192 this.lastUp=evt.xy;}
61193 return false;}
61194 return true;},dblclick:function(evt){if(!this.freehandMode(evt)){var index=this.line.geometry.components.length-1;this.line.geometry.removeComponent(this.line.geometry.components[index]);this.removePoint();this.finalize();}
61195 return false;},CLASS_NAME:"OpenLayers.Handler.Path"});OpenLayers.Control.Split=OpenLayers.Class(OpenLayers.Control,{EVENT_TYPES:["beforesplit","split","aftersplit"],layer:null,source:null,sourceOptions:null,tolerance:null,edge:true,deferDelete:false,mutual:true,targetFilter:null,sourceFilter:null,handler:null,initialize:function(options){Array.prototype.push.apply(this.EVENT_TYPES,OpenLayers.Control.prototype.EVENT_TYPES);OpenLayers.Control.prototype.initialize.apply(this,[options]);this.options=options||{};if(this.options.source){this.setSource(this.options.source);}},setSource:function(layer){if(this.active){this.deactivate();if(this.handler){this.handler.destroy();delete this.handler;}
61196 this.source=layer;this.activate();}else{this.source=layer;}},activate:function(){var activated=OpenLayers.Control.prototype.activate.call(this);if(activated){if(!this.source){if(!this.handler){this.handler=new OpenLayers.Handler.Path(this,{done:function(geometry){this.onSketchComplete({feature:new OpenLayers.Feature.Vector(geometry)});}},{layerOptions:this.sourceOptions});}
61197 this.handler.activate();}else if(this.source.events){this.source.events.on({sketchcomplete:this.onSketchComplete,afterfeaturemodified:this.afterFeatureModified,scope:this});}}
61198 return activated;},deactivate:function(){var deactivated=OpenLayers.Control.prototype.deactivate.call(this);if(deactivated){if(this.source&&this.source.events){this.layer.events.un({sketchcomplete:this.onSketchComplete,afterfeaturemodified:this.afterFeatureModified,scope:this});}}
61199 return deactivated;},onSketchComplete:function(event){this.feature=null;return!this.considerSplit(event.feature);},afterFeatureModified:function(event){if(event.modified){var feature=event.feature;if(feature.geometry instanceof OpenLayers.Geometry.LineString||feature.geometry instanceof OpenLayers.Geometry.MultiLineString){this.feature=event.feature;this.considerSplit(event.feature);}}},removeByGeometry:function(features,geometry){for(var i=0,len=features.length;i<len;++i){if(features[i].geometry===geometry){features.splice(i,1);break;}}},isEligible:function(target){return(target.state!==OpenLayers.State.DELETE)&&(target.geometry instanceof OpenLayers.Geometry.LineString||target.geometry instanceof OpenLayers.Geometry.MultiLineString)&&(this.feature!==target)&&(!this.targetFilter||this.targetFilter.evaluate(target.attributes));},considerSplit:function(feature){var sourceSplit=false;var targetSplit=false;if(!this.sourceFilter||this.sourceFilter.evaluate(feature.attributes)){var features=this.layer&&this.layer.features||[];var target,results,proceed;var additions=[],removals=[];var mutual=(this.layer===this.source)&&this.mutual;var options={edge:this.edge,tolerance:this.tolerance,mutual:mutual};var sourceParts=[feature.geometry];var targetFeature,targetParts;var source,parts;for(var i=0,len=features.length;i<len;++i){targetFeature=features[i];if(this.isEligible(targetFeature)){targetParts=[targetFeature.geometry];for(var j=0;j<sourceParts.length;++j){source=sourceParts[j];for(var k=0;k<targetParts.length;++k){target=targetParts[k];if(source.getBounds().intersectsBounds(target.getBounds())){results=source.split(target,options);if(results){proceed=this.events.triggerEvent("beforesplit",{source:feature,target:targetFeature});if(proceed!==false){if(mutual){parts=results[0];if(parts.length>1){parts.unshift(j,1);Array.prototype.splice.apply(sourceParts,parts);j+=parts.length-3;}
61200 results=results[1];}
61201 if(results.length>1){results.unshift(k,1);Array.prototype.splice.apply(targetParts,results);k+=results.length-3;}}}}}}
61202 if(targetParts&&targetParts.length>1){this.geomsToFeatures(targetFeature,targetParts);this.events.triggerEvent("split",{original:targetFeature,features:targetParts});Array.prototype.push.apply(additions,targetParts);removals.push(targetFeature);targetSplit=true;}}}
61203 if(sourceParts&&sourceParts.length>1){this.geomsToFeatures(feature,sourceParts);this.events.triggerEvent("split",{original:feature,features:sourceParts});Array.prototype.push.apply(additions,sourceParts);removals.push(feature);sourceSplit=true;}
61204 if(sourceSplit||targetSplit){if(this.deferDelete){var feat,destroys=[];for(var i=0,len=removals.length;i<len;++i){feat=removals[i];if(feat.state===OpenLayers.State.INSERT){destroys.push(feat);}else{feat.state=OpenLayers.State.DELETE;this.layer.drawFeature(feat);}}
61205 this.layer.destroyFeatures(destroys,{silent:true});for(var i=0,len=additions.length;i<len;++i){additions[i].state=OpenLayers.State.INSERT;}}else{this.layer.destroyFeatures(removals,{silent:true});}
61206 this.layer.addFeatures(additions,{silent:true});this.events.triggerEvent("aftersplit",{source:feature,features:additions});}}
61207 return sourceSplit;},geomsToFeatures:function(feature,geoms){var clone=feature.clone();delete clone.geometry;var newFeature;for(var i=0,len=geoms.length;i<len;++i){newFeature=clone.clone();newFeature.geometry=geoms[i];newFeature.state=OpenLayers.State.INSERT;geoms[i]=newFeature;}},destroy:function(){if(this.active){this.deactivate();}
61208 OpenLayers.Control.prototype.destroy.call(this);},CLASS_NAME:"OpenLayers.Control.Split"});OpenLayers.Geometry.Polygon=OpenLayers.Class(OpenLayers.Geometry.Collection,{componentTypes:["OpenLayers.Geometry.LinearRing"],initialize:function(components){OpenLayers.Geometry.Collection.prototype.initialize.apply(this,arguments);},getArea:function(){var area=0.0;if(this.components&&(this.components.length>0)){area+=Math.abs(this.components[0].getArea());for(var i=1,len=this.components.length;i<len;i++){area-=Math.abs(this.components[i].getArea());}}
61209 return area;},getGeodesicArea:function(projection){var area=0.0;if(this.components&&(this.components.length>0)){area+=Math.abs(this.components[0].getGeodesicArea(projection));for(var i=1,len=this.components.length;i<len;i++){area-=Math.abs(this.components[i].getGeodesicArea(projection));}}
61210 return area;},containsPoint:function(point){var numRings=this.components.length;var contained=false;if(numRings>0){contained=this.components[0].containsPoint(point);if(contained!==1){if(contained&&numRings>1){var hole;for(var i=1;i<numRings;++i){hole=this.components[i].containsPoint(point);if(hole){if(hole===1){contained=1;}else{contained=false;}
61211 break;}}}}}
61212 return contained;},intersects:function(geometry){var intersect=false;var i,len;if(geometry.CLASS_NAME=="OpenLayers.Geometry.Point"){intersect=this.containsPoint(geometry);}else if(geometry.CLASS_NAME=="OpenLayers.Geometry.LineString"||geometry.CLASS_NAME=="OpenLayers.Geometry.LinearRing"){for(i=0,len=this.components.length;i<len;++i){intersect=geometry.intersects(this.components[i]);if(intersect){break;}}
61213 if(!intersect){for(i=0,len=geometry.components.length;i<len;++i){intersect=this.containsPoint(geometry.components[i]);if(intersect){break;}}}}else{for(i=0,len=geometry.components.length;i<len;++i){intersect=this.intersects(geometry.components[i]);if(intersect){break;}}}
61214 if(!intersect&&geometry.CLASS_NAME=="OpenLayers.Geometry.Polygon"){var ring=this.components[0];for(i=0,len=ring.components.length;i<len;++i){intersect=geometry.containsPoint(ring.components[i]);if(intersect){break;}}}
61215 return intersect;},distanceTo:function(geometry,options){var edge=!(options&&options.edge===false);var result;if(!edge&&this.intersects(geometry)){result=0;}else{result=OpenLayers.Geometry.Collection.prototype.distanceTo.apply(this,[geometry,options]);}
61216 return result;},CLASS_NAME:"OpenLayers.Geometry.Polygon"});OpenLayers.Geometry.Polygon.createRegularPolygon=function(origin,radius,sides,rotation){var angle=Math.PI*((1/sides)-(1/2));if(rotation){angle+=(rotation/180)*Math.PI;}
61217 var rotatedAngle,x,y;var points=[];for(var i=0;i<sides;++i){rotatedAngle=angle+(i*2*Math.PI/sides);x=origin.x+(radius*Math.cos(rotatedAngle));y=origin.y+(radius*Math.sin(rotatedAngle));points.push(new OpenLayers.Geometry.Point(x,y));}
61218 var ring=new OpenLayers.Geometry.LinearRing(points);return new OpenLayers.Geometry.Polygon([ring]);};OpenLayers.Format.GeoRSS=OpenLayers.Class(OpenLayers.Format.XML,{rssns:"http://backend.userland.com/rss2",featureNS:"http://mapserver.gis.umn.edu/mapserver",georssns:"http://www.georss.org/georss",geons:"http://www.w3.org/2003/01/geo/wgs84_pos#",featureTitle:"Untitled",featureDescription:"No Description",gmlParser:null,xy:false,initialize:function(options){OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);},createGeometryFromItem:function(item){var point=this.getElementsByTagNameNS(item,this.georssns,"point");var lat=this.getElementsByTagNameNS(item,this.geons,'lat');var lon=this.getElementsByTagNameNS(item,this.geons,'long');var line=this.getElementsByTagNameNS(item,this.georssns,"line");var polygon=this.getElementsByTagNameNS(item,this.georssns,"polygon");var where=this.getElementsByTagNameNS(item,this.georssns,"where");var box=this.getElementsByTagNameNS(item,this.georssns,"box");if(point.length>0||(lat.length>0&&lon.length>0)){var location;if(point.length>0){location=OpenLayers.String.trim(point[0].firstChild.nodeValue).split(/\s+/);if(location.length!=2){location=OpenLayers.String.trim(point[0].firstChild.nodeValue).split(/\s*,\s*/);}}else{location=[parseFloat(lat[0].firstChild.nodeValue),parseFloat(lon[0].firstChild.nodeValue)];}
61219 var geometry=new OpenLayers.Geometry.Point(parseFloat(location[1]),parseFloat(location[0]));}else if(line.length>0){var coords=OpenLayers.String.trim(this.concatChildValues(line[0])).split(/\s+/);var components=[];var point;for(var i=0,len=coords.length;i<len;i+=2){point=new OpenLayers.Geometry.Point(parseFloat(coords[i+1]),parseFloat(coords[i]));components.push(point);}
61220 geometry=new OpenLayers.Geometry.LineString(components);}else if(polygon.length>0){var coords=OpenLayers.String.trim(this.concatChildValues(polygon[0])).split(/\s+/);var components=[];var point;for(var i=0,len=coords.length;i<len;i+=2){point=new OpenLayers.Geometry.Point(parseFloat(coords[i+1]),parseFloat(coords[i]));components.push(point);}
61221 geometry=new OpenLayers.Geometry.Polygon([new OpenLayers.Geometry.LinearRing(components)]);}else if(where.length>0){if(!this.gmlParser){this.gmlParser=new OpenLayers.Format.GML({'xy':this.xy});}
61222 var feature=this.gmlParser.parseFeature(where[0]);geometry=feature.geometry;}else if(box.length>0){var coords=OpenLayers.String.trim(box[0].firstChild.nodeValue).split(/\s+/);var components=[];var point;if(coords.length>3){point=new OpenLayers.Geometry.Point(parseFloat(coords[1]),parseFloat(coords[0]));components.push(point);point=new OpenLayers.Geometry.Point(parseFloat(coords[1]),parseFloat(coords[2]));components.push(point);point=new OpenLayers.Geometry.Point(parseFloat(coords[3]),parseFloat(coords[2]));components.push(point);point=new OpenLayers.Geometry.Point(parseFloat(coords[3]),parseFloat(coords[0]));components.push(point);point=new OpenLayers.Geometry.Point(parseFloat(coords[1]),parseFloat(coords[0]));components.push(point);}
61223 geometry=new OpenLayers.Geometry.Polygon([new OpenLayers.Geometry.LinearRing(components)]);}
61224 if(geometry&&this.internalProjection&&this.externalProjection){geometry.transform(this.externalProjection,this.internalProjection);}
61225 return geometry;},createFeatureFromItem:function(item){var geometry=this.createGeometryFromItem(item);var title=this.getChildValue(item,"*","title",this.featureTitle);var description=this.getChildValue(item,"*","description",this.getChildValue(item,"*","content",this.getChildValue(item,"*","summary",this.featureDescription)));var link=this.getChildValue(item,"*","link");if(!link){try{link=this.getElementsByTagNameNS(item,"*","link")[0].getAttribute("href");}catch(e){link=null;}}
61226 var id=this.getChildValue(item,"*","id",null);var data={"title":title,"description":description,"link":link};var feature=new OpenLayers.Feature.Vector(geometry,data);feature.fid=id;return feature;},getChildValue:function(node,nsuri,name,def){var value;var eles=this.getElementsByTagNameNS(node,nsuri,name);if(eles&&eles[0]&&eles[0].firstChild&&eles[0].firstChild.nodeValue){value=eles[0].firstChild.nodeValue;}else{value=(def==undefined)?"":def;}
61227 return value;},read:function(doc){if(typeof doc=="string"){doc=OpenLayers.Format.XML.prototype.read.apply(this,[doc]);}
61228 var itemlist=null;itemlist=this.getElementsByTagNameNS(doc,'*','item');if(itemlist.length==0){itemlist=this.getElementsByTagNameNS(doc,'*','entry');}
61229 var numItems=itemlist.length;var features=new Array(numItems);for(var i=0;i<numItems;i++){features[i]=this.createFeatureFromItem(itemlist[i]);}
61230 return features;},write:function(features){var georss;if(features instanceof Array){georss=this.createElementNS(this.rssns,"rss");for(var i=0,len=features.length;i<len;i++){georss.appendChild(this.createFeatureXML(features[i]));}}else{georss=this.createFeatureXML(features);}
61231 return OpenLayers.Format.XML.prototype.write.apply(this,[georss]);},createFeatureXML:function(feature){var geometryNode=this.buildGeometryNode(feature.geometry);var featureNode=this.createElementNS(this.rssns,"item");var titleNode=this.createElementNS(this.rssns,"title");titleNode.appendChild(this.createTextNode(feature.attributes.title?feature.attributes.title:""));var descNode=this.createElementNS(this.rssns,"description");descNode.appendChild(this.createTextNode(feature.attributes.description?feature.attributes.description:""));featureNode.appendChild(titleNode);featureNode.appendChild(descNode);if(feature.attributes.link){var linkNode=this.createElementNS(this.rssns,"link");linkNode.appendChild(this.createTextNode(feature.attributes.link));featureNode.appendChild(linkNode);}
61232 for(var attr in feature.attributes){if(attr=="link"||attr=="title"||attr=="description"){continue;}
61233 var attrText=this.createTextNode(feature.attributes[attr]);var nodename=attr;if(attr.search(":")!=-1){nodename=attr.split(":")[1];}
61234 var attrContainer=this.createElementNS(this.featureNS,"feature:"+nodename);attrContainer.appendChild(attrText);featureNode.appendChild(attrContainer);}
61235 featureNode.appendChild(geometryNode);return featureNode;},buildGeometryNode:function(geometry){if(this.internalProjection&&this.externalProjection){geometry=geometry.clone();geometry.transform(this.internalProjection,this.externalProjection);}
61236 var node;if(geometry.CLASS_NAME=="OpenLayers.Geometry.Polygon"){node=this.createElementNS(this.georssns,'georss:polygon');node.appendChild(this.buildCoordinatesNode(geometry.components[0]));}
61237 else if(geometry.CLASS_NAME=="OpenLayers.Geometry.LineString"){node=this.createElementNS(this.georssns,'georss:line');node.appendChild(this.buildCoordinatesNode(geometry));}
61238 else if(geometry.CLASS_NAME=="OpenLayers.Geometry.Point"){node=this.createElementNS(this.georssns,'georss:point');node.appendChild(this.buildCoordinatesNode(geometry));}else{throw"Couldn't parse "+geometry.CLASS_NAME;}
61239 return node;},buildCoordinatesNode:function(geometry){var points=null;if(geometry.components){points=geometry.components;}
61240 var path;if(points){var numPoints=points.length;var parts=new Array(numPoints);for(var i=0;i<numPoints;i++){parts[i]=points[i].y+" "+points[i].x;}
61241 path=parts.join(" ");}else{path=geometry.y+" "+geometry.x;}
61242 return this.createTextNode(path);},CLASS_NAME:"OpenLayers.Format.GeoRSS"});OpenLayers.Format.KML=OpenLayers.Class(OpenLayers.Format.XML,{namespaces:{kml:"http://www.opengis.net/kml/2.2",gx:"http://www.google.com/kml/ext/2.2"},kmlns:"http://earth.google.com/kml/2.0",placemarksDesc:"No description available",foldersName:"OpenLayers export",foldersDesc:"Exported on "+new Date(),extractAttributes:true,extractStyles:false,extractTracks:false,trackAttributes:null,internalns:null,features:null,styles:null,styleBaseUrl:"",fetched:null,maxDepth:0,initialize:function(options){this.regExes={trimSpace:(/^\s*|\s*$/g),removeSpace:(/\s*/g),splitSpace:(/\s+/),trimComma:(/\s*,\s*/g),kmlColor:(/(\w{2})(\w{2})(\w{2})(\w{2})/),kmlIconPalette:(/root:\/\/icons\/palette-(\d+)(\.\w+)/),straightBracket:(/\$\[(.*?)\]/g)};this.externalProjection=new OpenLayers.Projection("EPSG:4326");OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);},read:function(data){this.features=[];this.styles={};this.fetched={};var options={depth:0,styleBaseUrl:this.styleBaseUrl};return this.parseData(data,options);},parseData:function(data,options){if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);}
61243 var types=["Link","NetworkLink","Style","StyleMap","Placemark"];for(var i=0,len=types.length;i<len;++i){var type=types[i];var nodes=this.getElementsByTagNameNS(data,"*",type);if(nodes.length==0){continue;}
61244 switch(type.toLowerCase()){case"link":case"networklink":this.parseLinks(nodes,options);break;case"style":if(this.extractStyles){this.parseStyles(nodes,options);}
61245 break;case"stylemap":if(this.extractStyles){this.parseStyleMaps(nodes,options);}
61246 break;case"placemark":this.parseFeatures(nodes,options);break;}}
61247 return this.features;},parseLinks:function(nodes,options){if(options.depth>=this.maxDepth){return false;}
61248 var newOptions=OpenLayers.Util.extend({},options);newOptions.depth++;for(var i=0,len=nodes.length;i<len;i++){var href=this.parseProperty(nodes[i],"*","href");if(href&&!this.fetched[href]){this.fetched[href]=true;var data=this.fetchLink(href);if(data){this.parseData(data,newOptions);}}}},fetchLink:function(href){var request=OpenLayers.Request.GET({url:href,async:false});if(request){return request.responseText;}},parseStyles:function(nodes,options){for(var i=0,len=nodes.length;i<len;i++){var style=this.parseStyle(nodes[i]);if(style){var styleName=(options.styleBaseUrl||"")+"#"+style.id;this.styles[styleName]=style;}}},parseKmlColor:function(kmlColor){var color=null;if(kmlColor){var matches=kmlColor.match(this.regExes.kmlColor);if(matches){color={color:'#'+matches[4]+matches[3]+matches[2],opacity:parseInt(matches[1],16)/255};}}
61249 return color;},parseStyle:function(node){var style={};var types=["LineStyle","PolyStyle","IconStyle","BalloonStyle","LabelStyle"];var type,nodeList,geometry,parser;for(var i=0,len=types.length;i<len;++i){type=types[i];styleTypeNode=this.getElementsByTagNameNS(node,"*",type)[0];if(!styleTypeNode){continue;}
61250 switch(type.toLowerCase()){case"linestyle":var kmlColor=this.parseProperty(styleTypeNode,"*","color");var color=this.parseKmlColor(kmlColor);if(color){style["strokeColor"]=color.color;style["strokeOpacity"]=color.opacity;}
61251 var width=this.parseProperty(styleTypeNode,"*","width");if(width){style["strokeWidth"]=width;}
61252 break;case"polystyle":var kmlColor=this.parseProperty(styleTypeNode,"*","color");var color=this.parseKmlColor(kmlColor);if(color){style["fillOpacity"]=color.opacity;style["fillColor"]=color.color;}
61253 var fill=this.parseProperty(styleTypeNode,"*","fill");if(fill=="0"){style["fillColor"]="none";}
61254 var outline=this.parseProperty(styleTypeNode,"*","outline");if(outline=="0"){style["strokeWidth"]="0";}
61255 break;case"iconstyle":var scale=parseFloat(this.parseProperty(styleTypeNode,"*","scale")||1);var width=32*scale;var height=32*scale;var iconNode=this.getElementsByTagNameNS(styleTypeNode,"*","Icon")[0];if(iconNode){var href=this.parseProperty(iconNode,"*","href");if(href){var w=this.parseProperty(iconNode,"*","w");var h=this.parseProperty(iconNode,"*","h");var google="http://maps.google.com/mapfiles/kml";if(OpenLayers.String.startsWith(href,google)&&!w&&!h){w=64;h=64;scale=scale/2;}
61256 w=w||h;h=h||w;if(w){width=parseInt(w)*scale;}
61257 if(h){height=parseInt(h)*scale;}
61258 var matches=href.match(this.regExes.kmlIconPalette);if(matches){var palette=matches[1];var file_extension=matches[2];var x=this.parseProperty(iconNode,"*","x");var y=this.parseProperty(iconNode,"*","y");var posX=x?x/32:0;var posY=y?(7-y/32):7;var pos=posY*8+posX;href="http://maps.google.com/mapfiles/kml/pal"
61259 +palette+"/icon"+pos+file_extension;}
61260 style["graphicOpacity"]=1;style["externalGraphic"]=href;}}
61261 var hotSpotNode=this.getElementsByTagNameNS(styleTypeNode,"*","hotSpot")[0];if(hotSpotNode){var x=parseFloat(hotSpotNode.getAttribute("x"));var y=parseFloat(hotSpotNode.getAttribute("y"));var xUnits=hotSpotNode.getAttribute("xunits");if(xUnits=="pixels"){style["graphicXOffset"]=-x*scale;}
61262 else if(xUnits=="insetPixels"){style["graphicXOffset"]=-width+(x*scale);}
61263 else if(xUnits=="fraction"){style["graphicXOffset"]=-width*x;}
61264 var yUnits=hotSpotNode.getAttribute("yunits");if(yUnits=="pixels"){style["graphicYOffset"]=-height+(y*scale)+1;}
61265 else if(yUnits=="insetPixels"){style["graphicYOffset"]=-(y*scale)+1;}
61266 else if(yUnits=="fraction"){style["graphicYOffset"]=-height*(1-y)+1;}}
61267 style["graphicWidth"]=width;style["graphicHeight"]=height;break;case"balloonstyle":var balloonStyle=OpenLayers.Util.getXmlNodeValue(styleTypeNode);if(balloonStyle){style["balloonStyle"]=balloonStyle.replace(this.regExes.straightBracket,"${$1}");}
61268 break;case"labelstyle":var kmlColor=this.parseProperty(styleTypeNode,"*","color");var color=this.parseKmlColor(kmlColor);if(color){style["fontColor"]=color.color;style["fontOpacity"]=color.opacity;}
61269 break;default:}}
61270 if(!style["strokeColor"]&&style["fillColor"]){style["strokeColor"]=style["fillColor"];}
61271 var id=node.getAttribute("id");if(id&&style){style.id=id;}
61272 return style;},parseStyleMaps:function(nodes,options){for(var i=0,len=nodes.length;i<len;i++){var node=nodes[i];var pairs=this.getElementsByTagNameNS(node,"*","Pair");var id=node.getAttribute("id");for(var j=0,jlen=pairs.length;j<jlen;j++){var pair=pairs[j];var key=this.parseProperty(pair,"*","key");var styleUrl=this.parseProperty(pair,"*","styleUrl");if(styleUrl&&key=="normal"){this.styles[(options.styleBaseUrl||"")+"#"+id]=this.styles[(options.styleBaseUrl||"")+styleUrl];}
61273 if(styleUrl&&key=="highlight"){}}}},parseFeatures:function(nodes,options){var features=[];for(var i=0,len=nodes.length;i<len;i++){var featureNode=nodes[i];var feature=this.parseFeature.apply(this,[featureNode]);if(feature){if(this.extractStyles&&feature.attributes&&feature.attributes.styleUrl){feature.style=this.getStyle(feature.attributes.styleUrl,options);}
61274 if(this.extractStyles){var inlineStyleNode=this.getElementsByTagNameNS(featureNode,"*","Style")[0];if(inlineStyleNode){var inlineStyle=this.parseStyle(inlineStyleNode);if(inlineStyle){feature.style=OpenLayers.Util.extend(feature.style,inlineStyle);}}}
61275 if(this.extractTracks){var tracks=this.getElementsByTagNameNS(featureNode,this.namespaces.gx,"Track");if(tracks&&tracks.length>0){var track=tracks[0];var container={features:[],feature:feature};this.readNode(track,container);if(container.features.length>0){features.push.apply(features,container.features);}}}else{features.push(feature);}}else{throw"Bad Placemark: "+i;}}
61276 this.features=this.features.concat(features);},readers:{"kml":{"when":function(node,container){container.whens.push(OpenLayers.Date.parse(this.getChildValue(node)));},"_trackPointAttribute":function(node,container){var name=node.nodeName.split(":").pop();container.attributes[name].push(this.getChildValue(node));}},"gx":{"Track":function(node,container){var obj={whens:[],points:[],angles:[]};if(this.trackAttributes){var name;obj.attributes={};for(var i=0,ii=this.trackAttributes.length;i<ii;++i){name=this.trackAttributes[i];obj.attributes[name]=[];if(!(name in this.readers.kml)){this.readers.kml[name]=this.readers.kml._trackPointAttribute;}}}
61277 this.readChildNodes(node,obj);if(obj.whens.length!==obj.points.length){throw new Error("gx:Track with unequal number of when ("+obj.whens.length+") and gx:coord ("+obj.points.length+") elements.");}
61278 var hasAngles=obj.angles.length>0;if(hasAngles&&obj.whens.length!==obj.angles.length){throw new Error("gx:Track with unequal number of when ("+obj.whens.length+") and gx:angles ("+obj.angles.length+") elements.");}
61279 var feature,point,angles;for(var i=0,ii=obj.whens.length;i<ii;++i){feature=container.feature.clone();feature.fid=container.feature.fid||container.feature.id;point=obj.points[i];feature.geometry=point;if("z"in point){feature.attributes.altitude=point.z;}
61280 if(this.internalProjection&&this.externalProjection){feature.geometry.transform(this.externalProjection,this.internalProjection);}
61281 if(this.trackAttributes){for(var j=0,jj=this.trackAttributes.length;j<jj;++j){feature.attributes[name]=obj.attributes[this.trackAttributes[j]][i];}}
61282 feature.attributes.when=obj.whens[i];feature.attributes.trackId=container.feature.id;if(hasAngles){angles=obj.angles[i];feature.attributes.heading=parseFloat(angles[0]);feature.attributes.tilt=parseFloat(angles[1]);feature.attributes.roll=parseFloat(angles[2]);}
61283 container.features.push(feature);}},"coord":function(node,container){var str=this.getChildValue(node);var coords=str.replace(this.regExes.trimSpace,"").split(/\s+/);var point=new OpenLayers.Geometry.Point(coords[0],coords[1]);if(coords.length>2){point.z=parseFloat(coords[2]);}
61284 container.points.push(point);},"angles":function(node,container){var str=this.getChildValue(node);var parts=str.replace(this.regExes.trimSpace,"").split(/\s+/);container.angles.push(parts);}}},parseFeature:function(node){var order=["MultiGeometry","Polygon","LineString","Point"];var type,nodeList,geometry,parser;for(var i=0,len=order.length;i<len;++i){type=order[i];this.internalns=node.namespaceURI?node.namespaceURI:this.kmlns;nodeList=this.getElementsByTagNameNS(node,this.internalns,type);if(nodeList.length>0){var parser=this.parseGeometry[type.toLowerCase()];if(parser){geometry=parser.apply(this,[nodeList[0]]);if(this.internalProjection&&this.externalProjection){geometry.transform(this.externalProjection,this.internalProjection);}}else{OpenLayers.Console.error(OpenLayers.i18n("unsupportedGeometryType",{'geomType':type}));}
61285 break;}}
61286 var attributes;if(this.extractAttributes){attributes=this.parseAttributes(node);}
61287 var feature=new OpenLayers.Feature.Vector(geometry,attributes);var fid=node.getAttribute("id")||node.getAttribute("name");if(fid!=null){feature.fid=fid;}
61288 return feature;},getStyle:function(styleUrl,options){var styleBaseUrl=OpenLayers.Util.removeTail(styleUrl);var newOptions=OpenLayers.Util.extend({},options);newOptions.depth++;newOptions.styleBaseUrl=styleBaseUrl;if(!this.styles[styleUrl]&&!OpenLayers.String.startsWith(styleUrl,"#")&&newOptions.depth<=this.maxDepth&&!this.fetched[styleBaseUrl]){var data=this.fetchLink(styleBaseUrl);if(data){this.parseData(data,newOptions);}}
61289 var style=OpenLayers.Util.extend({},this.styles[styleUrl]);return style;},parseGeometry:{point:function(node){var nodeList=this.getElementsByTagNameNS(node,this.internalns,"coordinates");var coords=[];if(nodeList.length>0){var coordString=nodeList[0].firstChild.nodeValue;coordString=coordString.replace(this.regExes.removeSpace,"");coords=coordString.split(",");}
61290 var point=null;if(coords.length>1){if(coords.length==2){coords[2]=null;}
61291 point=new OpenLayers.Geometry.Point(coords[0],coords[1],coords[2]);}else{throw"Bad coordinate string: "+coordString;}
61292 return point;},linestring:function(node,ring){var nodeList=this.getElementsByTagNameNS(node,this.internalns,"coordinates");var line=null;if(nodeList.length>0){var coordString=this.getChildValue(nodeList[0]);coordString=coordString.replace(this.regExes.trimSpace,"");coordString=coordString.replace(this.regExes.trimComma,",");var pointList=coordString.split(this.regExes.splitSpace);var numPoints=pointList.length;var points=new Array(numPoints);var coords,numCoords;for(var i=0;i<numPoints;++i){coords=pointList[i].split(",");numCoords=coords.length;if(numCoords>1){if(coords.length==2){coords[2]=null;}
61293 points[i]=new OpenLayers.Geometry.Point(coords[0],coords[1],coords[2]);}else{throw"Bad LineString point coordinates: "+
61294 pointList[i];}}
61295 if(numPoints){if(ring){line=new OpenLayers.Geometry.LinearRing(points);}else{line=new OpenLayers.Geometry.LineString(points);}}else{throw"Bad LineString coordinates: "+coordString;}}
61296 return line;},polygon:function(node){var nodeList=this.getElementsByTagNameNS(node,this.internalns,"LinearRing");var numRings=nodeList.length;var components=new Array(numRings);if(numRings>0){var ring;for(var i=0,len=nodeList.length;i<len;++i){ring=this.parseGeometry.linestring.apply(this,[nodeList[i],true]);if(ring){components[i]=ring;}else{throw"Bad LinearRing geometry: "+i;}}}
61297 return new OpenLayers.Geometry.Polygon(components);},multigeometry:function(node){var child,parser;var parts=[];var children=node.childNodes;for(var i=0,len=children.length;i<len;++i){child=children[i];if(child.nodeType==1){var type=(child.prefix)?child.nodeName.split(":")[1]:child.nodeName;var parser=this.parseGeometry[type.toLowerCase()];if(parser){parts.push(parser.apply(this,[child]));}}}
61298 return new OpenLayers.Geometry.Collection(parts);}},parseAttributes:function(node){var attributes={};var edNodes=node.getElementsByTagName("ExtendedData");if(edNodes.length){attributes=this.parseExtendedData(edNodes[0]);}
61299 var child,grandchildren,grandchild;var children=node.childNodes;for(var i=0,len=children.length;i<len;++i){child=children[i];if(child.nodeType==1){grandchildren=child.childNodes;if(grandchildren.length>=1&&grandchildren.length<=3){var grandchild;switch(grandchildren.length){case 1:grandchild=grandchildren[0];break;case 2:var c1=grandchildren[0];var c2=grandchildren[1];grandchild=(c1.nodeType==3||c1.nodeType==4)?c1:c2;break;case 3:default:grandchild=grandchildren[1];break;}
61300 if(grandchild.nodeType==3||grandchild.nodeType==4){var name=(child.prefix)?child.nodeName.split(":")[1]:child.nodeName;var value=OpenLayers.Util.getXmlNodeValue(grandchild);if(value){value=value.replace(this.regExes.trimSpace,"");attributes[name]=value;}}}}}
61301 return attributes;},parseExtendedData:function(node){var attributes={};var i,len,data,key;var dataNodes=node.getElementsByTagName("Data");for(i=0,len=dataNodes.length;i<len;i++){data=dataNodes[i];key=data.getAttribute("name");var ed={};var valueNode=data.getElementsByTagName("value");if(valueNode.length){ed['value']=this.getChildValue(valueNode[0]);}
61302 var nameNode=data.getElementsByTagName("displayName");if(nameNode.length){ed['displayName']=this.getChildValue(nameNode[0]);}
61303 attributes[key]=ed;}
61304 var simpleDataNodes=node.getElementsByTagName("SimpleData");for(i=0,len=simpleDataNodes.length;i<len;i++){var ed={};data=simpleDataNodes[i];key=data.getAttribute("name");ed['value']=this.getChildValue(data);ed['displayName']=key;attributes[key]=ed;}
61305 return attributes;},parseProperty:function(xmlNode,namespace,tagName){var value;var nodeList=this.getElementsByTagNameNS(xmlNode,namespace,tagName);try{value=OpenLayers.Util.getXmlNodeValue(nodeList[0]);}catch(e){value=null;}
61306 return value;},write:function(features){if(!(features instanceof Array)){features=[features];}
61307 var kml=this.createElementNS(this.kmlns,"kml");var folder=this.createFolderXML();for(var i=0,len=features.length;i<len;++i){folder.appendChild(this.createPlacemarkXML(features[i]));}
61308 kml.appendChild(folder);return OpenLayers.Format.XML.prototype.write.apply(this,[kml]);},createFolderXML:function(){var folder=this.createElementNS(this.kmlns,"Folder");if(this.foldersName){var folderName=this.createElementNS(this.kmlns,"name");var folderNameText=this.createTextNode(this.foldersName);folderName.appendChild(folderNameText);folder.appendChild(folderName);}
61309 if(this.foldersDesc){var folderDesc=this.createElementNS(this.kmlns,"description");var folderDescText=this.createTextNode(this.foldersDesc);folderDesc.appendChild(folderDescText);folder.appendChild(folderDesc);}
61310 return folder;},createPlacemarkXML:function(feature){var placemarkName=this.createElementNS(this.kmlns,"name");var name=feature.style&&feature.style.label?feature.style.label:feature.attributes.name||feature.id;placemarkName.appendChild(this.createTextNode(name));var placemarkDesc=this.createElementNS(this.kmlns,"description");var desc=feature.attributes.description||this.placemarksDesc;placemarkDesc.appendChild(this.createTextNode(desc));var placemarkNode=this.createElementNS(this.kmlns,"Placemark");if(feature.fid!=null){placemarkNode.setAttribute("id",feature.fid);}
61311 placemarkNode.appendChild(placemarkName);placemarkNode.appendChild(placemarkDesc);var geometryNode=this.buildGeometryNode(feature.geometry);placemarkNode.appendChild(geometryNode);return placemarkNode;},buildGeometryNode:function(geometry){if(this.internalProjection&&this.externalProjection){geometry=geometry.clone();geometry.transform(this.internalProjection,this.externalProjection);}
61312 var className=geometry.CLASS_NAME;var type=className.substring(className.lastIndexOf(".")+1);var builder=this.buildGeometry[type.toLowerCase()];var node=null;if(builder){node=builder.apply(this,[geometry]);}
61313 return node;},buildGeometry:{point:function(geometry){var kml=this.createElementNS(this.kmlns,"Point");kml.appendChild(this.buildCoordinatesNode(geometry));return kml;},multipoint:function(geometry){return this.buildGeometry.collection.apply(this,[geometry]);},linestring:function(geometry){var kml=this.createElementNS(this.kmlns,"LineString");kml.appendChild(this.buildCoordinatesNode(geometry));return kml;},multilinestring:function(geometry){return this.buildGeometry.collection.apply(this,[geometry]);},linearring:function(geometry){var kml=this.createElementNS(this.kmlns,"LinearRing");kml.appendChild(this.buildCoordinatesNode(geometry));return kml;},polygon:function(geometry){var kml=this.createElementNS(this.kmlns,"Polygon");var rings=geometry.components;var ringMember,ringGeom,type;for(var i=0,len=rings.length;i<len;++i){type=(i==0)?"outerBoundaryIs":"innerBoundaryIs";ringMember=this.createElementNS(this.kmlns,type);ringGeom=this.buildGeometry.linearring.apply(this,[rings[i]]);ringMember.appendChild(ringGeom);kml.appendChild(ringMember);}
61314 return kml;},multipolygon:function(geometry){return this.buildGeometry.collection.apply(this,[geometry]);},collection:function(geometry){var kml=this.createElementNS(this.kmlns,"MultiGeometry");var child;for(var i=0,len=geometry.components.length;i<len;++i){child=this.buildGeometryNode.apply(this,[geometry.components[i]]);if(child){kml.appendChild(child);}}
61315 return kml;}},buildCoordinatesNode:function(geometry){var coordinatesNode=this.createElementNS(this.kmlns,"coordinates");var path;var points=geometry.components;if(points){var point;var numPoints=points.length;var parts=new Array(numPoints);for(var i=0;i<numPoints;++i){point=points[i];parts[i]=point.x+","+point.y;}
61316 path=parts.join(" ");}else{path=geometry.x+","+geometry.y;}
61317 var txtNode=this.createTextNode(path);coordinatesNode.appendChild(txtNode);return coordinatesNode;},CLASS_NAME:"OpenLayers.Format.KML"});OpenLayers.Format.OSM=OpenLayers.Class(OpenLayers.Format.XML,{checkTags:false,interestingTagsExclude:null,areaTags:null,initialize:function(options){var layer_defaults={'interestingTagsExclude':['source','source_ref','source:ref','history','attribution','created_by'],'areaTags':['area','building','leisure','tourism','ruins','historic','landuse','military','natural','sport']};layer_defaults=OpenLayers.Util.extend(layer_defaults,options);var interesting={};for(var i=0;i<layer_defaults.interestingTagsExclude.length;i++){interesting[layer_defaults.interestingTagsExclude[i]]=true;}
61318 layer_defaults.interestingTagsExclude=interesting;var area={};for(var i=0;i<layer_defaults.areaTags.length;i++){area[layer_defaults.areaTags[i]]=true;}
61319 layer_defaults.areaTags=area;this.externalProjection=new OpenLayers.Projection("EPSG:4326");OpenLayers.Format.XML.prototype.initialize.apply(this,[layer_defaults]);},read:function(doc){if(typeof doc=="string"){doc=OpenLayers.Format.XML.prototype.read.apply(this,[doc]);}
61320 var nodes=this.getNodes(doc);var ways=this.getWays(doc);var feat_list=new Array(ways.length);for(var i=0;i<ways.length;i++){var point_list=new Array(ways[i].nodes.length);var poly=this.isWayArea(ways[i])?1:0;for(var j=0;j<ways[i].nodes.length;j++){var node=nodes[ways[i].nodes[j]];var point=new OpenLayers.Geometry.Point(node.lon,node.lat);point.osm_id=parseInt(ways[i].nodes[j]);point_list[j]=point;node.used=true;}
61321 var geometry=null;if(poly){geometry=new OpenLayers.Geometry.Polygon(new OpenLayers.Geometry.LinearRing(point_list));}else{geometry=new OpenLayers.Geometry.LineString(point_list);}
61322 if(this.internalProjection&&this.externalProjection){geometry.transform(this.externalProjection,this.internalProjection);}
61323 var feat=new OpenLayers.Feature.Vector(geometry,ways[i].tags);feat.osm_id=parseInt(ways[i].id);feat.fid="way."+feat.osm_id;feat_list[i]=feat;}
61324 for(var node_id in nodes){var node=nodes[node_id];if(!node.used||this.checkTags){var tags=null;if(this.checkTags){var result=this.getTags(node.node,true);if(node.used&&!result[1]){continue;}
61325 tags=result[0];}else{tags=this.getTags(node.node);}
61326 var feat=new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(node['lon'],node['lat']),tags);if(this.internalProjection&&this.externalProjection){feat.geometry.transform(this.externalProjection,this.internalProjection);}
61327 feat.osm_id=parseInt(node_id);feat.fid="node."+feat.osm_id;feat_list.push(feat);}
61328 node.node=null;}
61329 return feat_list;},getNodes:function(doc){var node_list=doc.getElementsByTagName("node");var nodes={};for(var i=0;i<node_list.length;i++){var node=node_list[i];var id=node.getAttribute("id");nodes[id]={'lat':node.getAttribute("lat"),'lon':node.getAttribute("lon"),'node':node};}
61330 return nodes;},getWays:function(doc){var way_list=doc.getElementsByTagName("way");var return_ways=[];for(var i=0;i<way_list.length;i++){var way=way_list[i];var way_object={id:way.getAttribute("id")};way_object.tags=this.getTags(way);var node_list=way.getElementsByTagName("nd");way_object.nodes=new Array(node_list.length);for(var j=0;j<node_list.length;j++){way_object.nodes[j]=node_list[j].getAttribute("ref");}
61331 return_ways.push(way_object);}
61332 return return_ways;},getTags:function(dom_node,interesting_tags){var tag_list=dom_node.getElementsByTagName("tag");var tags={};var interesting=false;for(var j=0;j<tag_list.length;j++){var key=tag_list[j].getAttribute("k");tags[key]=tag_list[j].getAttribute("v");if(interesting_tags){if(!this.interestingTagsExclude[key]){interesting=true;}}}
61333 return interesting_tags?[tags,interesting]:tags;},isWayArea:function(way){var poly_shaped=false;var poly_tags=false;if(way.nodes[0]==way.nodes[way.nodes.length-1]){poly_shaped=true;}
61334 if(this.checkTags){for(var key in way.tags){if(this.areaTags[key]){poly_tags=true;break;}}}
61335 return poly_shaped&&(this.checkTags?poly_tags:true);},write:function(features){if(!(features instanceof Array)){features=[features];}
61336 this.osm_id=1;this.created_nodes={};var root_node=this.createElementNS(null,"osm");root_node.setAttribute("version","0.5");root_node.setAttribute("generator","OpenLayers "+OpenLayers.VERSION_NUMBER);for(var i=features.length-1;i>=0;i--){var nodes=this.createFeatureNodes(features[i]);for(var j=0;j<nodes.length;j++){root_node.appendChild(nodes[j]);}}
61337 return OpenLayers.Format.XML.prototype.write.apply(this,[root_node]);},createFeatureNodes:function(feature){var nodes=[];var className=feature.geometry.CLASS_NAME;var type=className.substring(className.lastIndexOf(".")+1);type=type.toLowerCase();var builder=this.createXML[type];if(builder){nodes=builder.apply(this,[feature]);}
61338 return nodes;},createXML:{'point':function(point){var id=null;var geometry=point.geometry?point.geometry:point;var already_exists=false;if(point.osm_id){id=point.osm_id;if(this.created_nodes[id]){already_exists=true;}}else{id=-this.osm_id;this.osm_id++;}
61339 if(already_exists){node=this.created_nodes[id];}else{var node=this.createElementNS(null,"node");}
61340 this.created_nodes[id]=node;node.setAttribute("id",id);node.setAttribute("lon",geometry.x);node.setAttribute("lat",geometry.y);if(point.attributes){this.serializeTags(point,node);}
61341 this.setState(point,node);return already_exists?[]:[node];},linestring:function(feature){var nodes=[];var geometry=feature.geometry;if(feature.osm_id){id=feature.osm_id;}else{id=-this.osm_id;this.osm_id++;}
61342 var way=this.createElementNS(null,"way");way.setAttribute("id",id);for(var i=0;i<geometry.components.length;i++){var node=this.createXML['point'].apply(this,[geometry.components[i]]);if(node.length){node=node[0];var node_ref=node.getAttribute("id");nodes.push(node);}else{node_ref=geometry.components[i].osm_id;node=this.created_nodes[node_ref];}
61343 this.setState(feature,node);var nd_dom=this.createElementNS(null,"nd");nd_dom.setAttribute("ref",node_ref);way.appendChild(nd_dom);}
61344 this.serializeTags(feature,way);nodes.push(way);return nodes;},polygon:function(feature){var attrs=OpenLayers.Util.extend({'area':'yes'},feature.attributes);var feat=new OpenLayers.Feature.Vector(feature.geometry.components[0],attrs);feat.osm_id=feature.osm_id;return this.createXML['linestring'].apply(this,[feat]);}},serializeTags:function(feature,node){for(var key in feature.attributes){var tag=this.createElementNS(null,"tag");tag.setAttribute("k",key);tag.setAttribute("v",feature.attributes[key]);node.appendChild(tag);}},setState:function(feature,node){if(feature.state){var state=null;switch(feature.state){case OpenLayers.State.UPDATE:state="modify";case OpenLayers.State.DELETE:state="delete";}
61345 if(state){node.setAttribute("action",state);}}},CLASS_NAME:"OpenLayers.Format.OSM"});OpenLayers.Geometry.MultiPolygon=OpenLayers.Class(OpenLayers.Geometry.Collection,{componentTypes:["OpenLayers.Geometry.Polygon"],initialize:function(components){OpenLayers.Geometry.Collection.prototype.initialize.apply(this,arguments);},CLASS_NAME:"OpenLayers.Geometry.MultiPolygon"});OpenLayers.Handler.Polygon=OpenLayers.Class(OpenLayers.Handler.Path,{polygon:null,initialize:function(control,callbacks,options){OpenLayers.Handler.Path.prototype.initialize.apply(this,arguments);},createFeature:function(pixel){var lonlat=this.control.map.getLonLatFromPixel(pixel);this.point=new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(lonlat.lon,lonlat.lat));this.line=new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LinearRing([this.point.geometry]));this.polygon=new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Polygon([this.line.geometry]));this.callback("create",[this.point.geometry,this.getSketch()]);this.point.geometry.clearBounds();this.layer.addFeatures([this.polygon,this.point],{silent:true});},destroyFeature:function(){OpenLayers.Handler.Path.prototype.destroyFeature.apply(this);this.polygon=null;},drawFeature:function(){this.layer.drawFeature(this.polygon,this.style);this.layer.drawFeature(this.point,this.style);},getSketch:function(){return this.polygon;},getGeometry:function(){var geometry=this.polygon&&this.polygon.geometry;if(geometry&&this.multi){geometry=new OpenLayers.Geometry.MultiPolygon([geometry]);}
61346 return geometry;},dblclick:function(evt){if(!this.freehandMode(evt)){var index=this.line.geometry.components.length-2;this.line.geometry.removeComponent(this.line.geometry.components[index]);this.removePoint();this.finalize();}
61347 return false;},CLASS_NAME:"OpenLayers.Handler.Polygon"});OpenLayers.Control.EditingToolbar=OpenLayers.Class(OpenLayers.Control.Panel,{initialize:function(layer,options){OpenLayers.Control.Panel.prototype.initialize.apply(this,[options]);this.addControls([new OpenLayers.Control.Navigation()]);var controls=[new OpenLayers.Control.DrawFeature(layer,OpenLayers.Handler.Point,{'displayClass':'olControlDrawFeaturePoint'}),new OpenLayers.Control.DrawFeature(layer,OpenLayers.Handler.Path,{'displayClass':'olControlDrawFeaturePath'}),new OpenLayers.Control.DrawFeature(layer,OpenLayers.Handler.Polygon,{'displayClass':'olControlDrawFeaturePolygon'})];this.addControls(controls);},draw:function(){var div=OpenLayers.Control.Panel.prototype.draw.apply(this,arguments);this.activateControl(this.controls[0]);return div;},CLASS_NAME:"OpenLayers.Control.EditingToolbar"});OpenLayers.Control.SLDSelect=OpenLayers.Class(OpenLayers.Control,{EVENT_TYPES:["selected"],clearOnDeactivate:false,layers:null,callbacks:null,selectionSymbolizer:{'Polygon':{fillColor:'#FF0000',stroke:false},'Line':{strokeColor:'#FF0000',strokeWidth:2},'Point':{graphicName:'square',fillColor:'#FF0000',pointRadius:5}},layerOptions:null,handlerOptions:null,sketchStyle:null,wfsCache:{},layerCache:{},initialize:function(handler,options){this.EVENT_TYPES=OpenLayers.Control.SLDSelect.prototype.EVENT_TYPES.concat(OpenLayers.Control.prototype.EVENT_TYPES);OpenLayers.Control.prototype.initialize.apply(this,[options]);this.callbacks=OpenLayers.Util.extend({done:this.select,click:this.select},this.callbacks);this.handlerOptions=this.handlerOptions||{};this.layerOptions=OpenLayers.Util.applyDefaults(this.layerOptions,{displayInLayerSwitcher:false});if(this.sketchStyle){this.handlerOptions.layerOptions=OpenLayers.Util.applyDefaults(this.handlerOptions.layerOptions,{styleMap:new OpenLayers.StyleMap({"default":this.sketchStyle})});}
61348 this.handler=new handler(this,this.callbacks,this.handlerOptions);},destroy:function(){for(var key in this.layerCache){delete this.layerCache[key];}
61349 for(var key in this.wfsCache){delete this.wfsCache[key];}
61350 OpenLayers.Control.prototype.destroy.apply(this,arguments);},coupleLayerVisiblity:function(evt){this.setVisibility(evt.object.getVisibility());},createSelectionLayer:function(source){var selectionLayer;if(!this.layerCache[source.id]){selectionLayer=new OpenLayers.Layer.WMS.Post(source.name,source.url,source.params,OpenLayers.Util.applyDefaults(this.layerOptions,source.getOptions()));this.layerCache[source.id]=selectionLayer;if(this.layerOptions.displayInLayerSwitcher===false){source.events.on({"visibilitychanged":this.coupleLayerVisiblity,scope:selectionLayer});}
61351 this.map.addLayer(selectionLayer);}else{selectionLayer=this.layerCache[source.id];}
61352 return selectionLayer;},createSLD:function(layer,filters,geometryAttributes){var sld={version:"1.0.0",namedLayers:{}};var layerNames=[layer.params.LAYERS].join(",").split(",");for(var i=0,len=layerNames.length;i<len;i++){var name=layerNames[i];sld.namedLayers[name]={name:name,userStyles:[]};var symbolizer=this.selectionSymbolizer;var geometryAttribute=geometryAttributes[i];if(geometryAttribute.type.indexOf('Polygon')>=0){symbolizer={Polygon:this.selectionSymbolizer['Polygon']};}else if(geometryAttribute.type.indexOf('LineString')>=0){symbolizer={Line:this.selectionSymbolizer['Line']};}else if(geometryAttribute.type.indexOf('Point')>=0){symbolizer={Point:this.selectionSymbolizer['Point']};}
61353 var filter=filters[i];sld.namedLayers[name].userStyles.push({name:'default',rules:[new OpenLayers.Rule({symbolizer:symbolizer,filter:filter,maxScaleDenominator:layer.options.minScale})]});}
61354 return new OpenLayers.Format.SLD().write(sld);},parseDescribeLayer:function(request){var format=new OpenLayers.Format.WMSDescribeLayer();var doc=request.responseXML;if(!doc||!doc.documentElement){doc=request.responseText;}
61355 var describeLayer=format.read(doc);var typeNames=[];var url=null;for(var i=0,len=describeLayer.length;i<len;i++){if(describeLayer[i].owsType=="WFS"){typeNames.push(describeLayer[i].typeName);url=describeLayer[i].owsURL;}}
61356 var options={url:url,params:{SERVICE:"WFS",TYPENAME:typeNames.toString(),REQUEST:"DescribeFeatureType",VERSION:"1.0.0"},callback:function(request){var format=new OpenLayers.Format.WFSDescribeFeatureType();var doc=request.responseXML;if(!doc||!doc.documentElement){doc=request.responseText;}
61357 var describeFeatureType=format.read(doc);this.control.wfsCache[this.layer.id]=describeFeatureType;this.control._queue&&this.control.applySelection();},scope:this};OpenLayers.Request.GET(options);},getGeometryAttributes:function(layer){var result=[];var cache=this.wfsCache[layer.id];for(var i=0,len=cache.featureTypes.length;i<len;i++){var typeName=cache.featureTypes[i];var properties=typeName.properties;for(var j=0,lenj=properties.length;j<lenj;j++){var property=properties[j];var type=property.type;if((type.indexOf('LineString')>=0)||(type.indexOf('GeometryAssociationType')>=0)||(type.indexOf('GeometryPropertyType')>=0)||(type.indexOf('Point')>=0)||(type.indexOf('Polygon')>=0)){result.push(property);}}}
61358 return result;},activate:function(){var activated=OpenLayers.Control.prototype.activate.call(this);if(activated){for(var i=0,len=this.layers.length;i<len;i++){var layer=this.layers[i];if(layer&&!this.wfsCache[layer.id]){var options={url:layer.url,params:{SERVICE:"WMS",VERSION:layer.params.VERSION,LAYERS:layer.params.LAYERS,REQUEST:"DescribeLayer"},callback:this.parseDescribeLayer,scope:{layer:layer,control:this}};OpenLayers.Request.GET(options);}}}
61359 return activated;},deactivate:function(){var deactivated=OpenLayers.Control.prototype.deactivate.call(this);if(deactivated){for(var i=0,len=this.layers.length;i<len;i++){var layer=this.layers[i];if(layer&&this.clearOnDeactivate===true){var layerCache=this.layerCache;var selectionLayer=layerCache[layer.id];if(selectionLayer){layer.events.un({"visibilitychanged":this.coupleLayerVisiblity,scope:selectionLayer});selectionLayer.destroy();delete layerCache[layer.id];}}}}
61360 return deactivated;},setLayers:function(layers){if(this.active){this.deactivate();this.layers=layers;this.activate();}else{this.layers=layers;}},createFilter:function(geometryAttribute,geometry){var filter=null;if(this.handler instanceof OpenLayers.Handler.RegularPolygon){if(this.handler.irregular===true){filter=new OpenLayers.Filter.Spatial({type:OpenLayers.Filter.Spatial.BBOX,property:geometryAttribute.name,value:geometry.getBounds()});}else{filter=new OpenLayers.Filter.Spatial({type:OpenLayers.Filter.Spatial.INTERSECTS,property:geometryAttribute.name,value:geometry});}}else if(this.handler instanceof OpenLayers.Handler.Polygon){filter=new OpenLayers.Filter.Spatial({type:OpenLayers.Filter.Spatial.INTERSECTS,property:geometryAttribute.name,value:geometry});}else if(this.handler instanceof OpenLayers.Handler.Path){if(geometryAttribute.type.indexOf('Point')>=0){filter=new OpenLayers.Filter.Spatial({type:OpenLayers.Filter.Spatial.DWITHIN,property:geometryAttribute.name,distance:this.map.getExtent().getWidth()*0.01,distanceUnits:this.map.getUnits(),value:geometry});}else{filter=new OpenLayers.Filter.Spatial({type:OpenLayers.Filter.Spatial.INTERSECTS,property:geometryAttribute.name,value:geometry});}}else if(this.handler instanceof OpenLayers.Handler.Click){if(geometryAttribute.type.indexOf('Polygon')>=0){filter=new OpenLayers.Filter.Spatial({type:OpenLayers.Filter.Spatial.INTERSECTS,property:geometryAttribute.name,value:geometry});}else{filter=new OpenLayers.Filter.Spatial({type:OpenLayers.Filter.Spatial.DWITHIN,property:geometryAttribute.name,distance:this.map.getExtent().getWidth()*0.01,distanceUnits:this.map.getUnits(),value:geometry});}}
61361 return filter;},select:function(geometry){this._queue=function(){for(var i=0,len=this.layers.length;i<len;i++){var layer=this.layers[i];var geometryAttributes=this.getGeometryAttributes(layer);var filters=[];for(var j=0,lenj=geometryAttributes.length;j<lenj;j++){var geometryAttribute=geometryAttributes[j];if(geometryAttribute!==null){if(!(geometry instanceof OpenLayers.Geometry)){var point=this.map.getLonLatFromPixel(geometry.xy);geometry=new OpenLayers.Geometry.Point(point.lon,point.lat);}
61362 var filter=this.createFilter(geometryAttribute,geometry);if(filter!==null){filters.push(filter);}}}
61363 var selectionLayer=this.createSelectionLayer(layer);var sld=this.createSLD(layer,filters,geometryAttributes);this.events.triggerEvent("selected",{layer:layer,filters:filters});selectionLayer.mergeNewParams({SLD_BODY:sld});delete this._queue;}};this.applySelection();},applySelection:function(){var canApply=true;for(var i=0,len=this.layers.length;i<len;i++){if(!this.wfsCache[this.layers[i].id]){canApply=false;break;}}
61364 canApply&&this._queue.call(this);},CLASS_NAME:"OpenLayers.Control.SLDSelect"});OpenLayers.Format.ArcXML=OpenLayers.Class(OpenLayers.Format.XML,{fontStyleKeys:['antialiasing','blockout','font','fontcolor','fontsize','fontstyle','glowing','interval','outline','printmode','shadow','transparency'],request:null,response:null,initialize:function(options){this.request=new OpenLayers.Format.ArcXML.Request();this.response=new OpenLayers.Format.ArcXML.Response();if(options){if(options.requesttype=="feature"){this.request.get_image=null;var qry=this.request.get_feature.query;this.addCoordSys(qry.featurecoordsys,options.featureCoordSys);this.addCoordSys(qry.filtercoordsys,options.filterCoordSys);if(options.polygon){qry.isspatial=true;qry.spatialfilter.polygon=options.polygon;}else if(options.envelope){qry.isspatial=true;qry.spatialfilter.envelope={minx:0,miny:0,maxx:0,maxy:0};this.parseEnvelope(qry.spatialfilter.envelope,options.envelope);}}else if(options.requesttype=="image"){this.request.get_feature=null;var props=this.request.get_image.properties;this.parseEnvelope(props.envelope,options.envelope);this.addLayers(props.layerlist,options.layers);this.addImageSize(props.imagesize,options.tileSize);this.addCoordSys(props.featurecoordsys,options.featureCoordSys);this.addCoordSys(props.filtercoordsys,options.filterCoordSys);}else{this.request=null;}}
61365 OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);},parseEnvelope:function(env,arr){if(arr&&arr.length==4){env.minx=arr[0];env.miny=arr[1];env.maxx=arr[2];env.maxy=arr[3];}},addLayers:function(ll,lyrs){for(var lind=0,len=lyrs.length;lind<len;lind++){ll.push(lyrs[lind]);}},addImageSize:function(imsize,olsize){if(olsize!==null){imsize.width=olsize.w;imsize.height=olsize.h;imsize.printwidth=olsize.w;imsize.printheight=olsize.h;}},addCoordSys:function(featOrFilt,fsys){if(typeof fsys=="string"){featOrFilt.id=parseInt(fsys);featOrFilt.string=fsys;}
61366 else if(typeof fsys=="object"&&fsys.proj!==null){featOrFilt.id=fsys.proj.srsProjNumber;featOrFilt.string=fsys.proj.srsCode;}else{featOrFilt=fsys;}},iserror:function(data){var ret=null;if(!data){ret=(this.response.error!=='');}else{data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);var errorNodes=data.documentElement.getElementsByTagName("ERROR");ret=(errorNodes!==null&&errorNodes.length>0);}
61367 return ret;},read:function(data){if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);}
61368 var arcNode=null;if(data&&data.documentElement){if(data.documentElement.nodeName=="ARCXML"){arcNode=data.documentElement;}else{arcNode=data.documentElement.getElementsByTagName("ARCXML")[0];}}
61369 if(!arcNode||arcNode.firstChild.nodeName==='parsererror'){var error,source;try{error=data.firstChild.nodeValue;source=data.firstChild.childNodes[1].firstChild.nodeValue;}catch(err){}
61370 throw{message:"Error parsing the ArcXML request",error:error,source:source};}
61371 var response=this.parseResponse(arcNode);return response;},write:function(request){if(!request){request=this.request;}
61372 var root=this.createElementNS("","ARCXML");root.setAttribute("version","1.1");var reqElem=this.createElementNS("","REQUEST");if(request.get_image!=null){var getElem=this.createElementNS("","GET_IMAGE");reqElem.appendChild(getElem);var propElem=this.createElementNS("","PROPERTIES");getElem.appendChild(propElem);var props=request.get_image.properties;if(props.featurecoordsys!=null){var feat=this.createElementNS("","FEATURECOORDSYS");propElem.appendChild(feat);if(props.featurecoordsys.id===0){feat.setAttribute("string",props.featurecoordsys['string']);}
61373 else{feat.setAttribute("id",props.featurecoordsys.id);}}
61374 if(props.filtercoordsys!=null){var filt=this.createElementNS("","FILTERCOORDSYS");propElem.appendChild(filt);if(props.filtercoordsys.id===0){filt.setAttribute("string",props.filtercoordsys.string);}
61375 else{filt.setAttribute("id",props.filtercoordsys.id);}}
61376 if(props.envelope!=null){var env=this.createElementNS("","ENVELOPE");propElem.appendChild(env);env.setAttribute("minx",props.envelope.minx);env.setAttribute("miny",props.envelope.miny);env.setAttribute("maxx",props.envelope.maxx);env.setAttribute("maxy",props.envelope.maxy);}
61377 var imagesz=this.createElementNS("","IMAGESIZE");propElem.appendChild(imagesz);imagesz.setAttribute("height",props.imagesize.height);imagesz.setAttribute("width",props.imagesize.width);if(props.imagesize.height!=props.imagesize.printheight||props.imagesize.width!=props.imagesize.printwidth){imagesz.setAttribute("printheight",props.imagesize.printheight);imagesz.setArrtibute("printwidth",props.imagesize.printwidth);}
61378 if(props.background!=null){var backgrnd=this.createElementNS("","BACKGROUND");propElem.appendChild(backgrnd);backgrnd.setAttribute("color",props.background.color.r+","+
61379 props.background.color.g+","+
61380 props.background.color.b);if(props.background.transcolor!==null){backgrnd.setAttribute("transcolor",props.background.transcolor.r+","+
61381 props.background.transcolor.g+","+
61382 props.background.transcolor.b);}}
61383 if(props.layerlist!=null&&props.layerlist.length>0){var layerlst=this.createElementNS("","LAYERLIST");propElem.appendChild(layerlst);for(var ld=0;ld<props.layerlist.length;ld++){var ldef=this.createElementNS("","LAYERDEF");layerlst.appendChild(ldef);ldef.setAttribute("id",props.layerlist[ld].id);ldef.setAttribute("visible",props.layerlist[ld].visible);if(typeof props.layerlist[ld].query=="object"){var query=props.layerlist[ld].query;if(query.where.length<0){continue;}
61384 var queryElem=null;if(typeof query.spatialfilter=="boolean"&&query.spatialfilter){queryElem=this.createElementNS("","SPATIALQUERY");}
61385 else{queryElem=this.createElementNS("","QUERY");}
61386 queryElem.setAttribute("where",query.where);if(typeof query.accuracy=="number"&&query.accuracy>0){queryElem.setAttribute("accuracy",query.accuracy);}
61387 if(typeof query.featurelimit=="number"&&query.featurelimit<2000){queryElem.setAttribute("featurelimit",query.featurelimit);}
61388 if(typeof query.subfields=="string"&&query.subfields!="#ALL#"){queryElem.setAttribute("subfields",query.subfields);}
61389 if(typeof query.joinexpression=="string"&&query.joinexpression.length>0){queryElem.setAttribute("joinexpression",query.joinexpression);}
61390 if(typeof query.jointables=="string"&&query.jointables.length>0){queryElem.setAttribute("jointables",query.jointables);}
61391 ldef.appendChild(queryElem);}
61392 if(typeof props.layerlist[ld].renderer=="object"){this.addRenderer(ldef,props.layerlist[ld].renderer);}}}}else if(request.get_feature!=null){var getElem=this.createElementNS("","GET_FEATURES");getElem.setAttribute("outputmode","newxml");getElem.setAttribute("checkesc","true");if(request.get_feature.geometry){getElem.setAttribute("geometry",request.get_feature.geometry);}
61393 else{getElem.setAttribute("geometry","false");}
61394 if(request.get_feature.compact){getElem.setAttribute("compact",request.get_feature.compact);}
61395 if(request.get_feature.featurelimit=="number"){getElem.setAttribute("featurelimit",request.get_feature.featurelimit);}
61396 getElem.setAttribute("globalenvelope","true");reqElem.appendChild(getElem);if(request.get_feature.layer!=null&&request.get_feature.layer.length>0){var lyrElem=this.createElementNS("","LAYER");lyrElem.setAttribute("id",request.get_feature.layer);getElem.appendChild(lyrElem);}
61397 var fquery=request.get_feature.query;if(fquery!=null){var qElem=null;if(fquery.isspatial){qElem=this.createElementNS("","SPATIALQUERY");}else{qElem=this.createElementNS("","QUERY");}
61398 getElem.appendChild(qElem);if(typeof fquery.accuracy=="number"){qElem.setAttribute("accuracy",fquery.accuracy);}
61399 if(fquery.featurecoordsys!=null){var fcsElem1=this.createElementNS("","FEATURECOORDSYS");if(fquery.featurecoordsys.id==0){fcsElem1.setAttribute("string",fquery.featurecoordsys.string);}else{fcsElem1.setAttribute("id",fquery.featurecoordsys.id);}
61400 qElem.appendChild(fcsElem1);}
61401 if(fquery.filtercoordsys!=null){var fcsElem2=this.createElementNS("","FILTERCOORDSYS");if(fquery.filtercoordsys.id===0){fcsElem2.setAttribute("string",fquery.filtercoordsys.string);}else{fcsElem2.setAttribute("id",fquery.filtercoordsys.id);}
61402 qElem.appendChild(fcsElem2);}
61403 if(fquery.buffer>0){var bufElem=this.createElementNS("","BUFFER");bufElem.setAttribute("distance",fquery.buffer);qElem.appendChild(bufElem);}
61404 if(fquery.isspatial){var spfElem=this.createElementNS("","SPATIALFILTER");spfElem.setAttribute("relation",fquery.spatialfilter.relation);qElem.appendChild(spfElem);if(fquery.spatialfilter.envelope){var envElem=this.createElementNS("","ENVELOPE");envElem.setAttribute("minx",fquery.spatialfilter.envelope.minx);envElem.setAttribute("miny",fquery.spatialfilter.envelope.miny);envElem.setAttribute("maxx",fquery.spatialfilter.envelope.maxx);envElem.setAttribute("maxy",fquery.spatialfilter.envelope.maxy);spfElem.appendChild(envElem);}else if(typeof fquery.spatialfilter.polygon=="object"){spfElem.appendChild(this.writePolygonGeometry(fquery.spatialfilter.polygon));}}
61405 if(fquery.where!=null&&fquery.where.length>0){qElem.setAttribute("where",fquery.where);}}}
61406 root.appendChild(reqElem);return OpenLayers.Format.XML.prototype.write.apply(this,[root]);},addGroupRenderer:function(ldef,toprenderer){var topRelem=this.createElementNS("","GROUPRENDERER");ldef.appendChild(topRelem);for(var rind=0;rind<toprenderer.length;rind++){var renderer=toprenderer[rind];this.addRenderer(topRelem,renderer);}},addRenderer:function(topRelem,renderer){if(renderer instanceof Array){this.addGroupRenderer(topRelem,renderer);}else{var renderElem=this.createElementNS("",renderer.type.toUpperCase()+"RENDERER");topRelem.appendChild(renderElem);if(renderElem.tagName=="VALUEMAPRENDERER"){this.addValueMapRenderer(renderElem,renderer);}else if(renderElem.tagName=="VALUEMAPLABELRENDERER"){this.addValueMapLabelRenderer(renderElem,renderer);}else if(renderElem.tagName=="SIMPLELABELRENDERER"){this.addSimpleLabelRenderer(renderElem,renderer);}else if(renderElem.tagName=="SCALEDEPENDENTRENDERER"){this.addScaleDependentRenderer(renderElem,renderer);}}},addScaleDependentRenderer:function(renderElem,renderer){if(typeof renderer.lower=="string"||typeof renderer.lower=="number"){renderElem.setAttribute("lower",renderer.lower);}
61407 if(typeof renderer.upper=="string"||typeof renderer.upper=="number"){renderElem.setAttribute("upper",renderer.upper);}
61408 this.addRenderer(renderElem,renderer.renderer);},addValueMapLabelRenderer:function(renderElem,renderer){renderElem.setAttribute("lookupfield",renderer.lookupfield);renderElem.setAttribute("labelfield",renderer.labelfield);if(typeof renderer.exacts=="object"){for(var ext=0,extlen=renderer.exacts.length;ext<extlen;ext++){var exact=renderer.exacts[ext];var eelem=this.createElementNS("","EXACT");if(typeof exact.value=="string"){eelem.setAttribute("value",exact.value);}
61409 if(typeof exact.label=="string"){eelem.setAttribute("label",exact.label);}
61410 if(typeof exact.method=="string"){eelem.setAttribute("method",exact.method);}
61411 renderElem.appendChild(eelem);if(typeof exact.symbol=="object"){var selem=null;if(exact.symbol.type=="text"){selem=this.createElementNS("","TEXTSYMBOL");}
61412 if(selem!=null){var keys=this.fontStyleKeys;for(var i=0,len=keys.length;i<len;i++){var key=keys[i];if(exact.symbol[key]){selem.setAttribute(key,exact.symbol[key]);}}
61413 eelem.appendChild(selem);}}}}},addValueMapRenderer:function(renderElem,renderer){renderElem.setAttribute("lookupfield",renderer.lookupfield);if(typeof renderer.ranges=="object"){for(var rng=0,rnglen=renderer.ranges.length;rng<rnglen;rng++){var range=renderer.ranges[rng];var relem=this.createElementNS("","RANGE");relem.setAttribute("lower",range.lower);relem.setAttribute("upper",range.upper);renderElem.appendChild(relem);if(typeof range.symbol=="object"){var selem=null;if(range.symbol.type=="simplepolygon"){selem=this.createElementNS("","SIMPLEPOLYGONSYMBOL");}
61414 if(selem!=null){if(typeof range.symbol.boundarycolor=="string"){selem.setAttribute("boundarycolor",range.symbol.boundarycolor);}
61415 if(typeof range.symbol.fillcolor=="string"){selem.setAttribute("fillcolor",range.symbol.fillcolor);}
61416 if(typeof range.symbol.filltransparency=="number"){selem.setAttribute("filltransparency",range.symbol.filltransparency);}
61417 relem.appendChild(selem);}}}}else if(typeof renderer.exacts=="object"){for(var ext=0,extlen=renderer.exacts.length;ext<extlen;ext++){var exact=renderer.exacts[ext];var eelem=this.createElementNS("","EXACT");if(typeof exact.value=="string"){eelem.setAttribute("value",exact.value);}
61418 if(typeof exact.label=="string"){eelem.setAttribute("label",exact.label);}
61419 if(typeof exact.method=="string"){eelem.setAttribute("method",exact.method);}
61420 renderElem.appendChild(eelem);if(typeof exact.symbol=="object"){var selem=null;if(exact.symbol.type=="simplemarker"){selem=this.createElementNS("","SIMPLEMARKERSYMBOL");}
61421 if(selem!=null){if(typeof exact.symbol.antialiasing=="string"){selem.setAttribute("antialiasing",exact.symbol.antialiasing);}
61422 if(typeof exact.symbol.color=="string"){selem.setAttribute("color",exact.symbol.color);}
61423 if(typeof exact.symbol.outline=="string"){selem.setAttribute("outline",exact.symbol.outline);}
61424 if(typeof exact.symbol.overlap=="string"){selem.setAttribute("overlap",exact.symbol.overlap);}
61425 if(typeof exact.symbol.shadow=="string"){selem.setAttribute("shadow",exact.symbol.shadow);}
61426 if(typeof exact.symbol.transparency=="number"){selem.setAttribute("transparency",exact.symbol.transparency);}
61427 if(typeof exact.symbol.usecentroid=="string"){selem.setAttribute("usecentroid",exact.symbol.usecentroid);}
61428 if(typeof exact.symbol.width=="number"){selem.setAttribute("width",exact.symbol.width);}
61429 eelem.appendChild(selem);}}}}},addSimpleLabelRenderer:function(renderElem,renderer){renderElem.setAttribute("field",renderer.field);var keys=['featureweight','howmanylabels','labelbufferratio','labelpriorities','labelweight','linelabelposition','rotationalangles'];for(var i=0,len=keys.length;i<len;i++){var key=keys[i];if(renderer[key]){renderElem.setAttribute(key,renderer[key]);}}
61430 if(renderer.symbol.type=="text"){var symbol=renderer.symbol;var selem=this.createElementNS("","TEXTSYMBOL");renderElem.appendChild(selem);var keys=this.fontStyleKeys;for(var i=0,len=keys.length;i<len;i++){var key=keys[i];if(symbol[key]){selem.setAttribute(key,renderer[key]);}}}},writePolygonGeometry:function(polygon){if(!(polygon instanceof OpenLayers.Geometry.Polygon)){throw{message:'Cannot write polygon geometry to ArcXML with an '+
61431 polygon.CLASS_NAME+' object.',geometry:polygon};}
61432 var polyElem=this.createElementNS("","POLYGON");for(var ln=0,lnlen=polygon.components.length;ln<lnlen;ln++){var ring=polygon.components[ln];var ringElem=this.createElementNS("","RING");for(var rn=0,rnlen=ring.components.length;rn<rnlen;rn++){var point=ring.components[rn];var pointElem=this.createElementNS("","POINT");pointElem.setAttribute("x",point.x);pointElem.setAttribute("y",point.y);ringElem.appendChild(pointElem);}
61433 polyElem.appendChild(ringElem);}
61434 return polyElem;},parseResponse:function(data){if(typeof data=="string"){var newData=new OpenLayers.Format.XML();data=newData.read(data);}
61435 var response=new OpenLayers.Format.ArcXML.Response();var errorNode=data.getElementsByTagName("ERROR");if(errorNode!=null&&errorNode.length>0){response.error=this.getChildValue(errorNode,"Unknown error.");}else{var responseNode=data.getElementsByTagName("RESPONSE");if(responseNode==null||responseNode.length==0){response.error="No RESPONSE tag found in ArcXML response.";return response;}
61436 var rtype=responseNode[0].firstChild.nodeName;if(rtype=="#text"){rtype=responseNode[0].firstChild.nextSibling.nodeName;}
61437 if(rtype=="IMAGE"){var envelopeNode=data.getElementsByTagName("ENVELOPE");var outputNode=data.getElementsByTagName("OUTPUT");if(envelopeNode==null||envelopeNode.length==0){response.error="No ENVELOPE tag found in ArcXML response.";}else if(outputNode==null||outputNode.length==0){response.error="No OUTPUT tag found in ArcXML response.";}else{var envAttr=this.parseAttributes(envelopeNode[0]);var outputAttr=this.parseAttributes(outputNode[0]);if(typeof outputAttr.type=="string"){response.image={envelope:envAttr,output:{type:outputAttr.type,data:this.getChildValue(outputNode[0])}};}else{response.image={envelope:envAttr,output:outputAttr};}}}else if(rtype=="FEATURES"){var features=responseNode[0].getElementsByTagName("FEATURES");var featureCount=features[0].getElementsByTagName("FEATURECOUNT");response.features.featurecount=featureCount[0].getAttribute("count");if(response.features.featurecount>0){var envelope=features[0].getElementsByTagName("ENVELOPE");response.features.envelope=this.parseAttributes(envelope[0],typeof(0));var featureList=features[0].getElementsByTagName("FEATURE");for(var fn=0;fn<featureList.length;fn++){var feature=new OpenLayers.Feature.Vector();var fields=featureList[fn].getElementsByTagName("FIELD");for(var fdn=0;fdn<fields.length;fdn++){var fieldName=fields[fdn].getAttribute("name");var fieldValue=fields[fdn].getAttribute("value");feature.attributes[fieldName]=fieldValue;}
61438 var geom=featureList[fn].getElementsByTagName("POLYGON");if(geom.length>0){var ring=geom[0].getElementsByTagName("RING");var polys=[];for(var rn=0;rn<ring.length;rn++){var linearRings=[];linearRings.push(this.parsePointGeometry(ring[rn]));var holes=ring[rn].getElementsByTagName("HOLE");for(var hn=0;hn<holes.length;hn++){linearRings.push(this.parsePointGeometry(holes[hn]));}
61439 holes=null;polys.push(new OpenLayers.Geometry.Polygon(linearRings));linearRings=null;}
61440 ring=null;if(polys.length==1){feature.geometry=polys[0];}else
61441 {feature.geometry=new OpenLayers.Geometry.MultiPolygon(polys);}}
61442 response.features.feature.push(feature);}}}else{response.error="Unidentified response type.";}}
61443 return response;},parseAttributes:function(node,type){var attributes={};for(var attr=0;attr<node.attributes.length;attr++){if(type=="number"){attributes[node.attributes[attr].nodeName]=parseFloat(node.attributes[attr].nodeValue);}else{attributes[node.attributes[attr].nodeName]=node.attributes[attr].nodeValue;}}
61444 return attributes;},parsePointGeometry:function(node){var ringPoints=[];var coords=node.getElementsByTagName("COORDS");if(coords.length>0){var coordArr=this.getChildValue(coords[0]);coordArr=coordArr.split(/;/);for(var cn=0;cn<coordArr.length;cn++){var coordItems=coordArr[cn].split(/ /);ringPoints.push(new OpenLayers.Geometry.Point(parseFloat(coordItems[0]),parseFloat(coordItems[1])));}
61445 coords=null;}else{var point=node.getElementsByTagName("POINT");if(point.length>0){for(var pn=0;pn<point.length;pn++){ringPoints.push(new OpenLayers.Geometry.Point(parseFloat(point[pn].getAttribute("x")),parseFloat(point[pn].getAttribute("y"))));}}
61446 point=null;}
61447 return new OpenLayers.Geometry.LinearRing(ringPoints);},CLASS_NAME:"OpenLayers.Format.ArcXML"});OpenLayers.Format.ArcXML.Request=OpenLayers.Class({initialize:function(params){var defaults={get_image:{properties:{background:null,draw:true,envelope:{minx:0,miny:0,maxx:0,maxy:0},featurecoordsys:{id:0,string:"",datumtransformid:0,datumtransformstring:""},filtercoordsys:{id:0,string:"",datumtransformid:0,datumtransformstring:""},imagesize:{height:0,width:0,dpi:96,printheight:0,printwidth:0,scalesymbols:false},layerlist:[],output:{baseurl:"",legendbaseurl:"",legendname:"",legendpath:"",legendurl:"",name:"",path:"",type:"jpg",url:""}}},get_feature:{layer:"",query:{isspatial:false,featurecoordsys:{id:0,string:"",datumtransformid:0,datumtransformstring:""},filtercoordsys:{id:0,string:"",datumtransformid:0,datumtransformstring:""},buffer:0,where:"",spatialfilter:{relation:"envelope_intersection",envelope:null}}},environment:{separators:{cs:" ",ts:";"}},layer:[],workspaces:[]};return OpenLayers.Util.extend(this,defaults);},CLASS_NAME:"OpenLayers.Format.ArcXML.Request"});OpenLayers.Format.ArcXML.Response=OpenLayers.Class({initialize:function(params){var defaults={image:{envelope:null,output:''},features:{featurecount:0,envelope:null,feature:[]},error:''};return OpenLayers.Util.extend(this,defaults);},CLASS_NAME:"OpenLayers.Format.ArcXML.Response"});OpenLayers.Format.GML=OpenLayers.Class(OpenLayers.Format.XML,{featureNS:"http://mapserver.gis.umn.edu/mapserver",featurePrefix:"feature",featureName:"featureMember",layerName:"features",geometryName:"geometry",collectionName:"FeatureCollection",gmlns:"http://www.opengis.net/gml",extractAttributes:true,xy:true,initialize:function(options){this.regExes={trimSpace:(/^\s*|\s*$/g),removeSpace:(/\s*/g),splitSpace:(/\s+/),trimComma:(/\s*,\s*/g)};OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);},read:function(data){if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);}
61448 var featureNodes=this.getElementsByTagNameNS(data.documentElement,this.gmlns,this.featureName);var features=[];for(var i=0;i<featureNodes.length;i++){var feature=this.parseFeature(featureNodes[i]);if(feature){features.push(feature);}}
61449 return features;},parseFeature:function(node){var order=["MultiPolygon","Polygon","MultiLineString","LineString","MultiPoint","Point","Envelope"];var type,nodeList,geometry,parser;for(var i=0;i<order.length;++i){type=order[i];nodeList=this.getElementsByTagNameNS(node,this.gmlns,type);if(nodeList.length>0){parser=this.parseGeometry[type.toLowerCase()];if(parser){geometry=parser.apply(this,[nodeList[0]]);if(this.internalProjection&&this.externalProjection){geometry.transform(this.externalProjection,this.internalProjection);}}else{OpenLayers.Console.error(OpenLayers.i18n("unsupportedGeometryType",{'geomType':type}));}
61450 break;}}
61451 var bounds;var boxNodes=this.getElementsByTagNameNS(node,this.gmlns,"Box");for(i=0;i<boxNodes.length;++i){var boxNode=boxNodes[i];var box=this.parseGeometry["box"].apply(this,[boxNode]);var parentNode=boxNode.parentNode;var parentName=parentNode.localName||parentNode.nodeName.split(":").pop();if(parentName==="boundedBy"){bounds=box;}else{geometry=box.toGeometry();}}
61452 var attributes;if(this.extractAttributes){attributes=this.parseAttributes(node);}
61453 var feature=new OpenLayers.Feature.Vector(geometry,attributes);feature.bounds=bounds;feature.gml={featureType:node.firstChild.nodeName.split(":")[1],featureNS:node.firstChild.namespaceURI,featureNSPrefix:node.firstChild.prefix};var childNode=node.firstChild;var fid;while(childNode){if(childNode.nodeType==1){fid=childNode.getAttribute("fid")||childNode.getAttribute("id");if(fid){break;}}
61454 childNode=childNode.nextSibling;}
61455 feature.fid=fid;return feature;},parseGeometry:{point:function(node){var nodeList,coordString;var coords=[];var nodeList=this.getElementsByTagNameNS(node,this.gmlns,"pos");if(nodeList.length>0){coordString=nodeList[0].firstChild.nodeValue;coordString=coordString.replace(this.regExes.trimSpace,"");coords=coordString.split(this.regExes.splitSpace);}
61456 if(coords.length==0){nodeList=this.getElementsByTagNameNS(node,this.gmlns,"coordinates");if(nodeList.length>0){coordString=nodeList[0].firstChild.nodeValue;coordString=coordString.replace(this.regExes.removeSpace,"");coords=coordString.split(",");}}
61457 if(coords.length==0){nodeList=this.getElementsByTagNameNS(node,this.gmlns,"coord");if(nodeList.length>0){var xList=this.getElementsByTagNameNS(nodeList[0],this.gmlns,"X");var yList=this.getElementsByTagNameNS(nodeList[0],this.gmlns,"Y");if(xList.length>0&&yList.length>0){coords=[xList[0].firstChild.nodeValue,yList[0].firstChild.nodeValue];}}}
61458 if(coords.length==2){coords[2]=null;}
61459 if(this.xy){return new OpenLayers.Geometry.Point(coords[0],coords[1],coords[2]);}
61460 else{return new OpenLayers.Geometry.Point(coords[1],coords[0],coords[2]);}},multipoint:function(node){var nodeList=this.getElementsByTagNameNS(node,this.gmlns,"Point");var components=[];if(nodeList.length>0){var point;for(var i=0;i<nodeList.length;++i){point=this.parseGeometry.point.apply(this,[nodeList[i]]);if(point){components.push(point);}}}
61461 return new OpenLayers.Geometry.MultiPoint(components);},linestring:function(node,ring){var nodeList,coordString;var coords=[];var points=[];nodeList=this.getElementsByTagNameNS(node,this.gmlns,"posList");if(nodeList.length>0){coordString=this.getChildValue(nodeList[0]);coordString=coordString.replace(this.regExes.trimSpace,"");coords=coordString.split(this.regExes.splitSpace);var dim=parseInt(nodeList[0].getAttribute("dimension"));var j,x,y,z;for(var i=0;i<coords.length/dim;++i){j=i*dim;x=coords[j];y=coords[j+1];z=(dim==2)?null:coords[j+2];if(this.xy){points.push(new OpenLayers.Geometry.Point(x,y,z));}else{points.push(new OpenLayers.Geometry.Point(y,x,z));}}}
61462 if(coords.length==0){nodeList=this.getElementsByTagNameNS(node,this.gmlns,"coordinates");if(nodeList.length>0){coordString=this.getChildValue(nodeList[0]);coordString=coordString.replace(this.regExes.trimSpace,"");coordString=coordString.replace(this.regExes.trimComma,",");var pointList=coordString.split(this.regExes.splitSpace);for(var i=0;i<pointList.length;++i){coords=pointList[i].split(",");if(coords.length==2){coords[2]=null;}
61463 if(this.xy){points.push(new OpenLayers.Geometry.Point(coords[0],coords[1],coords[2]));}else{points.push(new OpenLayers.Geometry.Point(coords[1],coords[0],coords[2]));}}}}
61464 var line=null;if(points.length!=0){if(ring){line=new OpenLayers.Geometry.LinearRing(points);}else{line=new OpenLayers.Geometry.LineString(points);}}
61465 return line;},multilinestring:function(node){var nodeList=this.getElementsByTagNameNS(node,this.gmlns,"LineString");var components=[];if(nodeList.length>0){var line;for(var i=0;i<nodeList.length;++i){line=this.parseGeometry.linestring.apply(this,[nodeList[i]]);if(line){components.push(line);}}}
61466 return new OpenLayers.Geometry.MultiLineString(components);},polygon:function(node){var nodeList=this.getElementsByTagNameNS(node,this.gmlns,"LinearRing");var components=[];if(nodeList.length>0){var ring;for(var i=0;i<nodeList.length;++i){ring=this.parseGeometry.linestring.apply(this,[nodeList[i],true]);if(ring){components.push(ring);}}}
61467 return new OpenLayers.Geometry.Polygon(components);},multipolygon:function(node){var nodeList=this.getElementsByTagNameNS(node,this.gmlns,"Polygon");var components=[];if(nodeList.length>0){var polygon;for(var i=0;i<nodeList.length;++i){polygon=this.parseGeometry.polygon.apply(this,[nodeList[i]]);if(polygon){components.push(polygon);}}}
61468 return new OpenLayers.Geometry.MultiPolygon(components);},envelope:function(node){var components=[];var coordString;var envelope;var lpoint=this.getElementsByTagNameNS(node,this.gmlns,"lowerCorner");if(lpoint.length>0){var coords=[];if(lpoint.length>0){coordString=lpoint[0].firstChild.nodeValue;coordString=coordString.replace(this.regExes.trimSpace,"");coords=coordString.split(this.regExes.splitSpace);}
61469 if(coords.length==2){coords[2]=null;}
61470 if(this.xy){var lowerPoint=new OpenLayers.Geometry.Point(coords[0],coords[1],coords[2]);}else{var lowerPoint=new OpenLayers.Geometry.Point(coords[1],coords[0],coords[2]);}}
61471 var upoint=this.getElementsByTagNameNS(node,this.gmlns,"upperCorner");if(upoint.length>0){var coords=[];if(upoint.length>0){coordString=upoint[0].firstChild.nodeValue;coordString=coordString.replace(this.regExes.trimSpace,"");coords=coordString.split(this.regExes.splitSpace);}
61472 if(coords.length==2){coords[2]=null;}
61473 if(this.xy){var upperPoint=new OpenLayers.Geometry.Point(coords[0],coords[1],coords[2]);}else{var upperPoint=new OpenLayers.Geometry.Point(coords[1],coords[0],coords[2]);}}
61474 if(lowerPoint&&upperPoint){components.push(new OpenLayers.Geometry.Point(lowerPoint.x,lowerPoint.y));components.push(new OpenLayers.Geometry.Point(upperPoint.x,lowerPoint.y));components.push(new OpenLayers.Geometry.Point(upperPoint.x,upperPoint.y));components.push(new OpenLayers.Geometry.Point(lowerPoint.x,upperPoint.y));components.push(new OpenLayers.Geometry.Point(lowerPoint.x,lowerPoint.y));var ring=new OpenLayers.Geometry.LinearRing(components);envelope=new OpenLayers.Geometry.Polygon([ring]);}
61475 return envelope;},box:function(node){var nodeList=this.getElementsByTagNameNS(node,this.gmlns,"coordinates");var coordString;var coords,beginPoint=null,endPoint=null;if(nodeList.length>0){coordString=nodeList[0].firstChild.nodeValue;coords=coordString.split(" ");if(coords.length==2){beginPoint=coords[0].split(",");endPoint=coords[1].split(",");}}
61476 if(beginPoint!==null&&endPoint!==null){return new OpenLayers.Bounds(parseFloat(beginPoint[0]),parseFloat(beginPoint[1]),parseFloat(endPoint[0]),parseFloat(endPoint[1]));}}},parseAttributes:function(node){var attributes={};var childNode=node.firstChild;var children,i,child,grandchildren,grandchild,name,value;while(childNode){if(childNode.nodeType==1){children=childNode.childNodes;for(i=0;i<children.length;++i){child=children[i];if(child.nodeType==1){grandchildren=child.childNodes;if(grandchildren.length==1){grandchild=grandchildren[0];if(grandchild.nodeType==3||grandchild.nodeType==4){name=(child.prefix)?child.nodeName.split(":")[1]:child.nodeName;value=grandchild.nodeValue.replace(this.regExes.trimSpace,"");attributes[name]=value;}}else{attributes[child.nodeName.split(":").pop()]=null;}}}
61477 break;}
61478 childNode=childNode.nextSibling;}
61479 return attributes;},write:function(features){if(!(features instanceof Array)){features=[features];}
61480 var gml=this.createElementNS("http://www.opengis.net/wfs","wfs:"+this.collectionName);for(var i=0;i<features.length;i++){gml.appendChild(this.createFeatureXML(features[i]));}
61481 return OpenLayers.Format.XML.prototype.write.apply(this,[gml]);},createFeatureXML:function(feature){var geometry=feature.geometry;var geometryNode=this.buildGeometryNode(geometry);var geomContainer=this.createElementNS(this.featureNS,this.featurePrefix+":"+
61482 this.geometryName);geomContainer.appendChild(geometryNode);var featureNode=this.createElementNS(this.gmlns,"gml:"+this.featureName);var featureContainer=this.createElementNS(this.featureNS,this.featurePrefix+":"+
61483 this.layerName);var fid=feature.fid||feature.id;featureContainer.setAttribute("fid",fid);featureContainer.appendChild(geomContainer);for(var attr in feature.attributes){var attrText=this.createTextNode(feature.attributes[attr]);var nodename=attr.substring(attr.lastIndexOf(":")+1);var attrContainer=this.createElementNS(this.featureNS,this.featurePrefix+":"+
61484 nodename);attrContainer.appendChild(attrText);featureContainer.appendChild(attrContainer);}
61485 featureNode.appendChild(featureContainer);return featureNode;},buildGeometryNode:function(geometry){if(this.externalProjection&&this.internalProjection){geometry=geometry.clone();geometry.transform(this.internalProjection,this.externalProjection);}
61486 var className=geometry.CLASS_NAME;var type=className.substring(className.lastIndexOf(".")+1);var builder=this.buildGeometry[type.toLowerCase()];return builder.apply(this,[geometry]);},buildGeometry:{point:function(geometry){var gml=this.createElementNS(this.gmlns,"gml:Point");gml.appendChild(this.buildCoordinatesNode(geometry));return gml;},multipoint:function(geometry){var gml=this.createElementNS(this.gmlns,"gml:MultiPoint");var points=geometry.components;var pointMember,pointGeom;for(var i=0;i<points.length;i++){pointMember=this.createElementNS(this.gmlns,"gml:pointMember");pointGeom=this.buildGeometry.point.apply(this,[points[i]]);pointMember.appendChild(pointGeom);gml.appendChild(pointMember);}
61487 return gml;},linestring:function(geometry){var gml=this.createElementNS(this.gmlns,"gml:LineString");gml.appendChild(this.buildCoordinatesNode(geometry));return gml;},multilinestring:function(geometry){var gml=this.createElementNS(this.gmlns,"gml:MultiLineString");var lines=geometry.components;var lineMember,lineGeom;for(var i=0;i<lines.length;++i){lineMember=this.createElementNS(this.gmlns,"gml:lineStringMember");lineGeom=this.buildGeometry.linestring.apply(this,[lines[i]]);lineMember.appendChild(lineGeom);gml.appendChild(lineMember);}
61488 return gml;},linearring:function(geometry){var gml=this.createElementNS(this.gmlns,"gml:LinearRing");gml.appendChild(this.buildCoordinatesNode(geometry));return gml;},polygon:function(geometry){var gml=this.createElementNS(this.gmlns,"gml:Polygon");var rings=geometry.components;var ringMember,ringGeom,type;for(var i=0;i<rings.length;++i){type=(i==0)?"outerBoundaryIs":"innerBoundaryIs";ringMember=this.createElementNS(this.gmlns,"gml:"+type);ringGeom=this.buildGeometry.linearring.apply(this,[rings[i]]);ringMember.appendChild(ringGeom);gml.appendChild(ringMember);}
61489 return gml;},multipolygon:function(geometry){var gml=this.createElementNS(this.gmlns,"gml:MultiPolygon");var polys=geometry.components;var polyMember,polyGeom;for(var i=0;i<polys.length;++i){polyMember=this.createElementNS(this.gmlns,"gml:polygonMember");polyGeom=this.buildGeometry.polygon.apply(this,[polys[i]]);polyMember.appendChild(polyGeom);gml.appendChild(polyMember);}
61490 return gml;},bounds:function(bounds){var gml=this.createElementNS(this.gmlns,"gml:Box");gml.appendChild(this.buildCoordinatesNode(bounds));return gml;}},buildCoordinatesNode:function(geometry){var coordinatesNode=this.createElementNS(this.gmlns,"gml:coordinates");coordinatesNode.setAttribute("decimal",".");coordinatesNode.setAttribute("cs",",");coordinatesNode.setAttribute("ts"," ");var parts=[];if(geometry instanceof OpenLayers.Bounds){parts.push(geometry.left+","+geometry.bottom);parts.push(geometry.right+","+geometry.top);}else{var points=(geometry.components)?geometry.components:[geometry];for(var i=0;i<points.length;i++){parts.push(points[i].x+","+points[i].y);}}
61491 var txtNode=this.createTextNode(parts.join(" "));coordinatesNode.appendChild(txtNode);return coordinatesNode;},CLASS_NAME:"OpenLayers.Format.GML"});OpenLayers.Format.GeoJSON=OpenLayers.Class(OpenLayers.Format.JSON,{ignoreExtraDims:false,initialize:function(options){OpenLayers.Format.JSON.prototype.initialize.apply(this,[options]);},read:function(json,type,filter){type=(type)?type:"FeatureCollection";var results=null;var obj=null;if(typeof json=="string"){obj=OpenLayers.Format.JSON.prototype.read.apply(this,[json,filter]);}else{obj=json;}
61492 if(!obj){OpenLayers.Console.error("Bad JSON: "+json);}else if(typeof(obj.type)!="string"){OpenLayers.Console.error("Bad GeoJSON - no type: "+json);}else if(this.isValidType(obj,type)){switch(type){case"Geometry":try{results=this.parseGeometry(obj);}catch(err){OpenLayers.Console.error(err);}
61493 break;case"Feature":try{results=this.parseFeature(obj);results.type="Feature";}catch(err){OpenLayers.Console.error(err);}
61494 break;case"FeatureCollection":results=[];switch(obj.type){case"Feature":try{results.push(this.parseFeature(obj));}catch(err){results=null;OpenLayers.Console.error(err);}
61495 break;case"FeatureCollection":for(var i=0,len=obj.features.length;i<len;++i){try{results.push(this.parseFeature(obj.features[i]));}catch(err){results=null;OpenLayers.Console.error(err);}}
61496 break;default:try{var geom=this.parseGeometry(obj);results.push(new OpenLayers.Feature.Vector(geom));}catch(err){results=null;OpenLayers.Console.error(err);}}
61497 break;}}
61498 return results;},isValidType:function(obj,type){var valid=false;switch(type){case"Geometry":if(OpenLayers.Util.indexOf(["Point","MultiPoint","LineString","MultiLineString","Polygon","MultiPolygon","Box","GeometryCollection"],obj.type)==-1){OpenLayers.Console.error("Unsupported geometry type: "+
61499 obj.type);}else{valid=true;}
61500 break;case"FeatureCollection":valid=true;break;default:if(obj.type==type){valid=true;}else{OpenLayers.Console.error("Cannot convert types from "+
61501 obj.type+" to "+type);}}
61502 return valid;},parseFeature:function(obj){var feature,geometry,attributes,bbox;attributes=(obj.properties)?obj.properties:{};bbox=(obj.geometry&&obj.geometry.bbox)||obj.bbox;try{geometry=this.parseGeometry(obj.geometry);}catch(err){throw err;}
61503 feature=new OpenLayers.Feature.Vector(geometry,attributes);if(bbox){feature.bounds=OpenLayers.Bounds.fromArray(bbox);}
61504 if(obj.id){feature.fid=obj.id;}
61505 return feature;},parseGeometry:function(obj){if(obj==null){return null;}
61506 var geometry,collection=false;if(obj.type=="GeometryCollection"){if(!(obj.geometries instanceof Array)){throw"GeometryCollection must have geometries array: "+obj;}
61507 var numGeom=obj.geometries.length;var components=new Array(numGeom);for(var i=0;i<numGeom;++i){components[i]=this.parseGeometry.apply(this,[obj.geometries[i]]);}
61508 geometry=new OpenLayers.Geometry.Collection(components);collection=true;}else{if(!(obj.coordinates instanceof Array)){throw"Geometry must have coordinates array: "+obj;}
61509 if(!this.parseCoords[obj.type.toLowerCase()]){throw"Unsupported geometry type: "+obj.type;}
61510 try{geometry=this.parseCoords[obj.type.toLowerCase()].apply(this,[obj.coordinates]);}catch(err){throw err;}}
61511 if(this.internalProjection&&this.externalProjection&&!collection){geometry.transform(this.externalProjection,this.internalProjection);}
61512 return geometry;},parseCoords:{"point":function(array){if(this.ignoreExtraDims==false&&array.length!=2){throw"Only 2D points are supported: "+array;}
61513 return new OpenLayers.Geometry.Point(array[0],array[1]);},"multipoint":function(array){var points=[];var p=null;for(var i=0,len=array.length;i<len;++i){try{p=this.parseCoords["point"].apply(this,[array[i]]);}catch(err){throw err;}
61514 points.push(p);}
61515 return new OpenLayers.Geometry.MultiPoint(points);},"linestring":function(array){var points=[];var p=null;for(var i=0,len=array.length;i<len;++i){try{p=this.parseCoords["point"].apply(this,[array[i]]);}catch(err){throw err;}
61516 points.push(p);}
61517 return new OpenLayers.Geometry.LineString(points);},"multilinestring":function(array){var lines=[];var l=null;for(var i=0,len=array.length;i<len;++i){try{l=this.parseCoords["linestring"].apply(this,[array[i]]);}catch(err){throw err;}
61518 lines.push(l);}
61519 return new OpenLayers.Geometry.MultiLineString(lines);},"polygon":function(array){var rings=[];var r,l;for(var i=0,len=array.length;i<len;++i){try{l=this.parseCoords["linestring"].apply(this,[array[i]]);}catch(err){throw err;}
61520 r=new OpenLayers.Geometry.LinearRing(l.components);rings.push(r);}
61521 return new OpenLayers.Geometry.Polygon(rings);},"multipolygon":function(array){var polys=[];var p=null;for(var i=0,len=array.length;i<len;++i){try{p=this.parseCoords["polygon"].apply(this,[array[i]]);}catch(err){throw err;}
61522 polys.push(p);}
61523 return new OpenLayers.Geometry.MultiPolygon(polys);},"box":function(array){if(array.length!=2){throw"GeoJSON box coordinates must have 2 elements";}
61524 return new OpenLayers.Geometry.Polygon([new OpenLayers.Geometry.LinearRing([new OpenLayers.Geometry.Point(array[0][0],array[0][1]),new OpenLayers.Geometry.Point(array[1][0],array[0][1]),new OpenLayers.Geometry.Point(array[1][0],array[1][1]),new OpenLayers.Geometry.Point(array[0][0],array[1][1]),new OpenLayers.Geometry.Point(array[0][0],array[0][1])])]);}},write:function(obj,pretty){var geojson={"type":null};if(obj instanceof Array){geojson.type="FeatureCollection";var numFeatures=obj.length;geojson.features=new Array(numFeatures);for(var i=0;i<numFeatures;++i){var element=obj[i];if(!element instanceof OpenLayers.Feature.Vector){var msg="FeatureCollection only supports collections "+"of features: "+element;throw msg;}
61525 geojson.features[i]=this.extract.feature.apply(this,[element]);}}else if(obj.CLASS_NAME.indexOf("OpenLayers.Geometry")==0){geojson=this.extract.geometry.apply(this,[obj]);}else if(obj instanceof OpenLayers.Feature.Vector){geojson=this.extract.feature.apply(this,[obj]);if(obj.layer&&obj.layer.projection){geojson.crs=this.createCRSObject(obj);}}
61526 return OpenLayers.Format.JSON.prototype.write.apply(this,[geojson,pretty]);},createCRSObject:function(object){var proj=object.layer.projection.toString();var crs={};if(proj.match(/epsg:/i)){var code=parseInt(proj.substring(proj.indexOf(":")+1));if(code==4326){crs={"type":"OGC","properties":{"urn":"urn:ogc:def:crs:OGC:1.3:CRS84"}};}else{crs={"type":"EPSG","properties":{"code":code}};}}
61527 return crs;},extract:{'feature':function(feature){var geom=this.extract.geometry.apply(this,[feature.geometry]);return{"type":"Feature","id":feature.fid==null?feature.id:feature.fid,"properties":feature.attributes,"geometry":geom};},'geometry':function(geometry){if(geometry==null){return null;}
61528 if(this.internalProjection&&this.externalProjection){geometry=geometry.clone();geometry.transform(this.internalProjection,this.externalProjection);}
61529 var geometryType=geometry.CLASS_NAME.split('.')[2];var data=this.extract[geometryType.toLowerCase()].apply(this,[geometry]);var json;if(geometryType=="Collection"){json={"type":"GeometryCollection","geometries":data};}else{json={"type":geometryType,"coordinates":data};}
61530 return json;},'point':function(point){return[point.x,point.y];},'multipoint':function(multipoint){var array=[];for(var i=0,len=multipoint.components.length;i<len;++i){array.push(this.extract.point.apply(this,[multipoint.components[i]]));}
61531 return array;},'linestring':function(linestring){var array=[];for(var i=0,len=linestring.components.length;i<len;++i){array.push(this.extract.point.apply(this,[linestring.components[i]]));}
61532 return array;},'multilinestring':function(multilinestring){var array=[];for(var i=0,len=multilinestring.components.length;i<len;++i){array.push(this.extract.linestring.apply(this,[multilinestring.components[i]]));}
61533 return array;},'polygon':function(polygon){var array=[];for(var i=0,len=polygon.components.length;i<len;++i){array.push(this.extract.linestring.apply(this,[polygon.components[i]]));}
61534 return array;},'multipolygon':function(multipolygon){var array=[];for(var i=0,len=multipolygon.components.length;i<len;++i){array.push(this.extract.polygon.apply(this,[multipolygon.components[i]]));}
61535 return array;},'collection':function(collection){var len=collection.components.length;var array=new Array(len);for(var i=0;i<len;++i){array[i]=this.extract.geometry.apply(this,[collection.components[i]]);}
61536 return array;}},CLASS_NAME:"OpenLayers.Format.GeoJSON"});OpenLayers.Format.ArcXML.Features=OpenLayers.Class(OpenLayers.Format.XML,{initialize:function(options){OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);},read:function(data){var axl=new OpenLayers.Format.ArcXML();var parsed=axl.read(data);return parsed.features.feature;}});if(!OpenLayers.Format.GML){OpenLayers.Format.GML={};}
61537 OpenLayers.Format.GML.Base=OpenLayers.Class(OpenLayers.Format.XML,{namespaces:{gml:"http://www.opengis.net/gml",xlink:"http://www.w3.org/1999/xlink",xsi:"http://www.w3.org/2001/XMLSchema-instance",wfs:"http://www.opengis.net/wfs"},defaultPrefix:"gml",schemaLocation:null,featureType:null,featureNS:null,geometryName:"geometry",extractAttributes:true,srsName:null,xy:true,geometryTypes:null,singleFeatureType:null,regExes:{trimSpace:(/^\s*|\s*$/g),removeSpace:(/\s*/g),splitSpace:(/\s+/),trimComma:(/\s*,\s*/g)},initialize:function(options){OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);this.setGeometryTypes();if(options&&options.featureNS){this.setNamespace("feature",options.featureNS);}
61538 this.singleFeatureType=!options||(typeof options.featureType==="string");},read:function(data){if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);}
61539 if(data&&data.nodeType==9){data=data.documentElement;}
61540 var features=[];this.readNode(data,{features:features});if(features.length==0){var elements=this.getElementsByTagNameNS(data,this.namespaces.gml,"featureMember");if(elements.length){for(var i=0,len=elements.length;i<len;++i){this.readNode(elements[i],{features:features});}}else{var elements=this.getElementsByTagNameNS(data,this.namespaces.gml,"featureMembers");if(elements.length){this.readNode(elements[0],{features:features});}}}
61541 return features;},readers:{"gml":{"featureMember":function(node,obj){this.readChildNodes(node,obj);},"featureMembers":function(node,obj){this.readChildNodes(node,obj);},"name":function(node,obj){obj.name=this.getChildValue(node);},"boundedBy":function(node,obj){var container={};this.readChildNodes(node,container);if(container.components&&container.components.length>0){obj.bounds=container.components[0];}},"Point":function(node,container){var obj={points:[]};this.readChildNodes(node,obj);if(!container.components){container.components=[];}
61542 container.components.push(obj.points[0]);},"coordinates":function(node,obj){var str=this.getChildValue(node).replace(this.regExes.trimSpace,"");str=str.replace(this.regExes.trimComma,",");var pointList=str.split(this.regExes.splitSpace);var coords;var numPoints=pointList.length;var points=new Array(numPoints);for(var i=0;i<numPoints;++i){coords=pointList[i].split(",");if(this.xy){points[i]=new OpenLayers.Geometry.Point(coords[0],coords[1],coords[2]);}else{points[i]=new OpenLayers.Geometry.Point(coords[1],coords[0],coords[2]);}}
61543 obj.points=points;},"coord":function(node,obj){var coord={};this.readChildNodes(node,coord);if(!obj.points){obj.points=[];}
61544 obj.points.push(new OpenLayers.Geometry.Point(coord.x,coord.y,coord.z));},"X":function(node,coord){coord.x=this.getChildValue(node);},"Y":function(node,coord){coord.y=this.getChildValue(node);},"Z":function(node,coord){coord.z=this.getChildValue(node);},"MultiPoint":function(node,container){var obj={components:[]};this.readChildNodes(node,obj);container.components=[new OpenLayers.Geometry.MultiPoint(obj.components)];},"pointMember":function(node,obj){this.readChildNodes(node,obj);},"LineString":function(node,container){var obj={};this.readChildNodes(node,obj);if(!container.components){container.components=[];}
61545 container.components.push(new OpenLayers.Geometry.LineString(obj.points));},"MultiLineString":function(node,container){var obj={components:[]};this.readChildNodes(node,obj);container.components=[new OpenLayers.Geometry.MultiLineString(obj.components)];},"lineStringMember":function(node,obj){this.readChildNodes(node,obj);},"Polygon":function(node,container){var obj={outer:null,inner:[]};this.readChildNodes(node,obj);obj.inner.unshift(obj.outer);if(!container.components){container.components=[];}
61546 container.components.push(new OpenLayers.Geometry.Polygon(obj.inner));},"LinearRing":function(node,obj){var container={};this.readChildNodes(node,container);obj.components=[new OpenLayers.Geometry.LinearRing(container.points)];},"MultiPolygon":function(node,container){var obj={components:[]};this.readChildNodes(node,obj);container.components=[new OpenLayers.Geometry.MultiPolygon(obj.components)];},"polygonMember":function(node,obj){this.readChildNodes(node,obj);},"GeometryCollection":function(node,container){var obj={components:[]};this.readChildNodes(node,obj);container.components=[new OpenLayers.Geometry.Collection(obj.components)];},"geometryMember":function(node,obj){this.readChildNodes(node,obj);}},"feature":{"*":function(node,obj){var name;var local=node.localName||node.nodeName.split(":").pop();if(obj.features){if(!this.singleFeatureType&&(OpenLayers.Util.indexOf(this.featureType,local)!==-1)){name="_typeName";}else if(local===this.featureType){name="_typeName";}}else{if(node.childNodes.length==0||(node.childNodes.length==1&&node.firstChild.nodeType==3)){if(this.extractAttributes){name="_attribute";}}else{name="_geometry";}}
61547 if(name){this.readers.feature[name].apply(this,[node,obj]);}},"_typeName":function(node,obj){var container={components:[],attributes:{}};this.readChildNodes(node,container);if(container.name){container.attributes.name=container.name;}
61548 var feature=new OpenLayers.Feature.Vector(container.components[0],container.attributes);if(!this.singleFeatureType){feature.type=node.nodeName.split(":").pop();feature.namespace=node.namespaceURI;}
61549 var fid=node.getAttribute("fid")||this.getAttributeNS(node,this.namespaces["gml"],"id");if(fid){feature.fid=fid;}
61550 if(this.internalProjection&&this.externalProjection&&feature.geometry){feature.geometry.transform(this.externalProjection,this.internalProjection);}
61551 if(container.bounds){feature.bounds=container.bounds;}
61552 obj.features.push(feature);},"_geometry":function(node,obj){this.readChildNodes(node,obj);},"_attribute":function(node,obj){var local=node.localName||node.nodeName.split(":").pop();var value=this.getChildValue(node);obj.attributes[local]=value;}},"wfs":{"FeatureCollection":function(node,obj){this.readChildNodes(node,obj);}}},write:function(features){var name;if(features instanceof Array){name="featureMembers";}else{name="featureMember";}
61553 var root=this.writeNode("gml:"+name,features);this.setAttributeNS(root,this.namespaces["xsi"],"xsi:schemaLocation",this.schemaLocation);return OpenLayers.Format.XML.prototype.write.apply(this,[root]);},writers:{"gml":{"featureMember":function(feature){var node=this.createElementNSPlus("gml:featureMember");this.writeNode("feature:_typeName",feature,node);return node;},"MultiPoint":function(geometry){var node=this.createElementNSPlus("gml:MultiPoint");for(var i=0;i<geometry.components.length;++i){this.writeNode("pointMember",geometry.components[i],node);}
61554 return node;},"pointMember":function(geometry){var node=this.createElementNSPlus("gml:pointMember");this.writeNode("Point",geometry,node);return node;},"MultiLineString":function(geometry){var node=this.createElementNSPlus("gml:MultiLineString");for(var i=0;i<geometry.components.length;++i){this.writeNode("lineStringMember",geometry.components[i],node);}
61555 return node;},"lineStringMember":function(geometry){var node=this.createElementNSPlus("gml:lineStringMember");this.writeNode("LineString",geometry,node);return node;},"MultiPolygon":function(geometry){var node=this.createElementNSPlus("gml:MultiPolygon");for(var i=0;i<geometry.components.length;++i){this.writeNode("polygonMember",geometry.components[i],node);}
61556 return node;},"polygonMember":function(geometry){var node=this.createElementNSPlus("gml:polygonMember");this.writeNode("Polygon",geometry,node);return node;},"GeometryCollection":function(geometry){var node=this.createElementNSPlus("gml:GeometryCollection");for(var i=0,len=geometry.components.length;i<len;++i){this.writeNode("geometryMember",geometry.components[i],node);}
61557 return node;},"geometryMember":function(geometry){var node=this.createElementNSPlus("gml:geometryMember");var child=this.writeNode("feature:_geometry",geometry);node.appendChild(child.firstChild);return node;}},"feature":{"_typeName":function(feature){var node=this.createElementNSPlus("feature:"+this.featureType,{attributes:{fid:feature.fid}});if(feature.geometry){this.writeNode("feature:_geometry",feature.geometry,node);}
61558 for(var name in feature.attributes){var value=feature.attributes[name];if(value!=null){this.writeNode("feature:_attribute",{name:name,value:value},node);}}
61559 return node;},"_geometry":function(geometry){if(this.externalProjection&&this.internalProjection){geometry=geometry.clone().transform(this.internalProjection,this.externalProjection);}
61560 var node=this.createElementNSPlus("feature:"+this.geometryName);var type=this.geometryTypes[geometry.CLASS_NAME];var child=this.writeNode("gml:"+type,geometry,node);if(this.srsName){child.setAttribute("srsName",this.srsName);}
61561 return node;},"_attribute":function(obj){return this.createElementNSPlus("feature:"+obj.name,{value:obj.value});}},"wfs":{"FeatureCollection":function(features){var node=this.createElementNSPlus("wfs:FeatureCollection");for(var i=0,len=features.length;i<len;++i){this.writeNode("gml:featureMember",features[i],node);}
61562 return node;}}},setGeometryTypes:function(){this.geometryTypes={"OpenLayers.Geometry.Point":"Point","OpenLayers.Geometry.MultiPoint":"MultiPoint","OpenLayers.Geometry.LineString":"LineString","OpenLayers.Geometry.MultiLineString":"MultiLineString","OpenLayers.Geometry.Polygon":"Polygon","OpenLayers.Geometry.MultiPolygon":"MultiPolygon","OpenLayers.Geometry.Collection":"GeometryCollection"};},CLASS_NAME:"OpenLayers.Format.GML.Base"});OpenLayers.Format.WFS=OpenLayers.Class(OpenLayers.Format.GML,{layer:null,wfsns:"http://www.opengis.net/wfs",ogcns:"http://www.opengis.net/ogc",initialize:function(options,layer){OpenLayers.Format.GML.prototype.initialize.apply(this,[options]);this.layer=layer;if(this.layer.featureNS){this.featureNS=this.layer.featureNS;}
61563 if(this.layer.options.geometry_column){this.geometryName=this.layer.options.geometry_column;}
61564 if(this.layer.options.typename){this.featureName=this.layer.options.typename;}},write:function(features){var transaction=this.createElementNS(this.wfsns,'wfs:Transaction');transaction.setAttribute("version","1.0.0");transaction.setAttribute("service","WFS");for(var i=0;i<features.length;i++){switch(features[i].state){case OpenLayers.State.INSERT:transaction.appendChild(this.insert(features[i]));break;case OpenLayers.State.UPDATE:transaction.appendChild(this.update(features[i]));break;case OpenLayers.State.DELETE:transaction.appendChild(this.remove(features[i]));break;}}
61565 return OpenLayers.Format.XML.prototype.write.apply(this,[transaction]);},createFeatureXML:function(feature){var geometryNode=this.buildGeometryNode(feature.geometry);var geomContainer=this.createElementNS(this.featureNS,"feature:"+this.geometryName);geomContainer.appendChild(geometryNode);var featureContainer=this.createElementNS(this.featureNS,"feature:"+this.featureName);featureContainer.appendChild(geomContainer);for(var attr in feature.attributes){var attrText=this.createTextNode(feature.attributes[attr]);var nodename=attr;if(attr.search(":")!=-1){nodename=attr.split(":")[1];}
61566 var attrContainer=this.createElementNS(this.featureNS,"feature:"+nodename);attrContainer.appendChild(attrText);featureContainer.appendChild(attrContainer);}
61567 return featureContainer;},insert:function(feature){var insertNode=this.createElementNS(this.wfsns,'wfs:Insert');insertNode.appendChild(this.createFeatureXML(feature));return insertNode;},update:function(feature){if(!feature.fid){OpenLayers.Console.userError(OpenLayers.i18n("noFID"));}
61568 var updateNode=this.createElementNS(this.wfsns,'wfs:Update');updateNode.setAttribute("typeName",this.featurePrefix+':'+this.featureName);updateNode.setAttribute("xmlns:"+this.featurePrefix,this.featureNS);var propertyNode=this.createElementNS(this.wfsns,'wfs:Property');var nameNode=this.createElementNS(this.wfsns,'wfs:Name');var txtNode=this.createTextNode(this.geometryName);nameNode.appendChild(txtNode);propertyNode.appendChild(nameNode);var valueNode=this.createElementNS(this.wfsns,'wfs:Value');var geometryNode=this.buildGeometryNode(feature.geometry);if(feature.layer){geometryNode.setAttribute("srsName",feature.layer.projection.getCode());}
61569 valueNode.appendChild(geometryNode);propertyNode.appendChild(valueNode);updateNode.appendChild(propertyNode);for(var propName in feature.attributes){propertyNode=this.createElementNS(this.wfsns,'wfs:Property');nameNode=this.createElementNS(this.wfsns,'wfs:Name');nameNode.appendChild(this.createTextNode(propName));propertyNode.appendChild(nameNode);valueNode=this.createElementNS(this.wfsns,'wfs:Value');valueNode.appendChild(this.createTextNode(feature.attributes[propName]));propertyNode.appendChild(valueNode);updateNode.appendChild(propertyNode);}
61570 var filterNode=this.createElementNS(this.ogcns,'ogc:Filter');var filterIdNode=this.createElementNS(this.ogcns,'ogc:FeatureId');filterIdNode.setAttribute("fid",feature.fid);filterNode.appendChild(filterIdNode);updateNode.appendChild(filterNode);return updateNode;},remove:function(feature){if(!feature.fid){OpenLayers.Console.userError(OpenLayers.i18n("noFID"));return false;}
61571 var deleteNode=this.createElementNS(this.wfsns,'wfs:Delete');deleteNode.setAttribute("typeName",this.featurePrefix+':'+this.featureName);deleteNode.setAttribute("xmlns:"+this.featurePrefix,this.featureNS);var filterNode=this.createElementNS(this.ogcns,'ogc:Filter');var filterIdNode=this.createElementNS(this.ogcns,'ogc:FeatureId');filterIdNode.setAttribute("fid",feature.fid);filterNode.appendChild(filterIdNode);deleteNode.appendChild(filterNode);return deleteNode;},destroy:function(){this.layer=null;},CLASS_NAME:"OpenLayers.Format.WFS"});OpenLayers.Layer.ArcIMS=OpenLayers.Class(OpenLayers.Layer.Grid,{DEFAULT_PARAMS:{ClientVersion:"9.2",ServiceName:''},tileSize:null,featureCoordSys:"4326",filterCoordSys:"4326",layers:null,async:true,name:"ArcIMS",isBaseLayer:true,DEFAULT_OPTIONS:{tileSize:new OpenLayers.Size(512,512),featureCoordSys:"4326",filterCoordSys:"4326",layers:null,isBaseLayer:true,async:true,name:"ArcIMS"},initialize:function(name,url,options){this.tileSize=new OpenLayers.Size(512,512);this.params=OpenLayers.Util.applyDefaults({ServiceName:options.serviceName},this.DEFAULT_PARAMS);this.options=OpenLayers.Util.applyDefaults(options,this.DEFAULT_OPTIONS);OpenLayers.Layer.Grid.prototype.initialize.apply(this,[name,url,this.params,options]);if(this.transparent){if(!this.isBaseLayer){this.isBaseLayer=false;}
61572 if(this.format=="image/jpeg"){this.format=OpenLayers.Util.alphaHack()?"image/gif":"image/png";}}
61573 if(this.options.layers===null){this.options.layers=[];}},destroy:function(){OpenLayers.Layer.Grid.prototype.destroy.apply(this,arguments);},getURL:function(bounds){var url="";bounds=this.adjustBounds(bounds);var axlReq=new OpenLayers.Format.ArcXML(OpenLayers.Util.extend(this.options,{requesttype:"image",envelope:bounds.toArray(),tileSize:this.tileSize}));var req=new OpenLayers.Request.POST({url:this.getFullRequestString(),data:axlReq.write(),async:false});if(req!=null){var doc=req.responseXML;if(!doc||!doc.documentElement){doc=req.responseText;}
61574 var axlResp=new OpenLayers.Format.ArcXML();var arcxml=axlResp.read(doc);url=this.getUrlOrImage(arcxml.image.output);}
61575 return url;},getURLasync:function(bounds,scope,prop,callback){bounds=this.adjustBounds(bounds);var axlReq=new OpenLayers.Format.ArcXML(OpenLayers.Util.extend(this.options,{requesttype:"image",envelope:bounds.toArray(),tileSize:this.tileSize}));OpenLayers.Request.POST({url:this.getFullRequestString(),async:true,data:axlReq.write(),callback:function(req){var doc=req.responseXML;if(!doc||!doc.documentElement){doc=req.responseText;}
61576 var axlResp=new OpenLayers.Format.ArcXML();var arcxml=axlResp.read(doc);scope[prop]=this.getUrlOrImage(arcxml.image.output);callback.apply(scope);},scope:this});},getUrlOrImage:function(output){var ret="";if(output.url){ret=output.url;}else if(output.data){ret="data:image/"+output.type+";base64,"+output.data;}
61577 return ret;},setLayerQuery:function(id,querydef){for(var lyr=0;lyr<this.options.layers.length;lyr++){if(id==this.options.layers[lyr].id){this.options.layers[lyr].query=querydef;return;}}
61578 this.options.layers.push({id:id,visible:true,query:querydef});},getFeatureInfo:function(geometry,layer,options){var buffer=options.buffer||1;var callback=options.callback||function(){};var scope=options.scope||window;var requestOptions={};OpenLayers.Util.extend(requestOptions,this.options);requestOptions.requesttype="feature";if(geometry instanceof OpenLayers.LonLat){requestOptions.polygon=null;requestOptions.envelope=[geometry.lon-buffer,geometry.lat-buffer,geometry.lon+buffer,geometry.lat+buffer];}else if(geometry instanceof OpenLayers.Geometry.Polygon){requestOptions.envelope=null;requestOptions.polygon=geometry;}
61579 var arcxml=new OpenLayers.Format.ArcXML(requestOptions);OpenLayers.Util.extend(arcxml.request.get_feature,options);arcxml.request.get_feature.layer=layer.id;if(typeof layer.query.accuracy=="number"){arcxml.request.get_feature.query.accuracy=layer.query.accuracy;}else{var mapCenter=this.map.getCenter();var viewPx=this.map.getViewPortPxFromLonLat(mapCenter);viewPx.x++;var mapOffCenter=this.map.getLonLatFromPixel(viewPx);arcxml.request.get_feature.query.accuracy=mapOffCenter.lon-mapCenter.lon;}
61580 arcxml.request.get_feature.query.where=layer.query.where;arcxml.request.get_feature.query.spatialfilter.relation="area_intersection";OpenLayers.Request.POST({url:this.getFullRequestString({'CustomService':'Query'}),data:arcxml.write(),callback:function(request){var response=arcxml.parseResponse(request.responseText);if(!arcxml.iserror()){callback.call(scope,response.features);}else{callback.call(scope,null);}}});},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.ArcIMS(this.name,this.url,this.getOptions());}
61581 obj=OpenLayers.Layer.Grid.prototype.clone.apply(this,[obj]);return obj;},addTile:function(bounds,position){return new OpenLayers.Tile.Image(this,position,bounds,null,this.tileSize);},CLASS_NAME:"OpenLayers.Layer.ArcIMS"});OpenLayers.Format.GML.v2=OpenLayers.Class(OpenLayers.Format.GML.Base,{schemaLocation:"http://www.opengis.net/gml http://schemas.opengis.net/gml/2.1.2/feature.xsd",initialize:function(options){OpenLayers.Format.GML.Base.prototype.initialize.apply(this,[options]);},readers:{"gml":OpenLayers.Util.applyDefaults({"outerBoundaryIs":function(node,container){var obj={};this.readChildNodes(node,obj);container.outer=obj.components[0];},"innerBoundaryIs":function(node,container){var obj={};this.readChildNodes(node,obj);container.inner.push(obj.components[0]);},"Box":function(node,container){var obj={};this.readChildNodes(node,obj);if(!container.components){container.components=[];}
61582 var min=obj.points[0];var max=obj.points[1];container.components.push(new OpenLayers.Bounds(min.x,min.y,max.x,max.y));}},OpenLayers.Format.GML.Base.prototype.readers["gml"]),"feature":OpenLayers.Format.GML.Base.prototype.readers["feature"],"wfs":OpenLayers.Format.GML.Base.prototype.readers["wfs"]},write:function(features){var name;if(features instanceof Array){name="wfs:FeatureCollection";}else{name="gml:featureMember";}
61583 var root=this.writeNode(name,features);this.setAttributeNS(root,this.namespaces["xsi"],"xsi:schemaLocation",this.schemaLocation);return OpenLayers.Format.XML.prototype.write.apply(this,[root]);},writers:{"gml":OpenLayers.Util.applyDefaults({"Point":function(geometry){var node=this.createElementNSPlus("gml:Point");this.writeNode("coordinates",[geometry],node);return node;},"coordinates":function(points){var numPoints=points.length;var parts=new Array(numPoints);var point;for(var i=0;i<numPoints;++i){point=points[i];if(this.xy){parts[i]=point.x+","+point.y;}else{parts[i]=point.y+","+point.x;}
61584 if(point.z!=undefined){parts[i]+=","+point.z;}}
61585 return this.createElementNSPlus("gml:coordinates",{attributes:{decimal:".",cs:",",ts:" "},value:(numPoints==1)?parts[0]:parts.join(" ")});},"LineString":function(geometry){var node=this.createElementNSPlus("gml:LineString");this.writeNode("coordinates",geometry.components,node);return node;},"Polygon":function(geometry){var node=this.createElementNSPlus("gml:Polygon");this.writeNode("outerBoundaryIs",geometry.components[0],node);for(var i=1;i<geometry.components.length;++i){this.writeNode("innerBoundaryIs",geometry.components[i],node);}
61586 return node;},"outerBoundaryIs":function(ring){var node=this.createElementNSPlus("gml:outerBoundaryIs");this.writeNode("LinearRing",ring,node);return node;},"innerBoundaryIs":function(ring){var node=this.createElementNSPlus("gml:innerBoundaryIs");this.writeNode("LinearRing",ring,node);return node;},"LinearRing":function(ring){var node=this.createElementNSPlus("gml:LinearRing");this.writeNode("coordinates",ring.components,node);return node;},"Box":function(bounds){var node=this.createElementNSPlus("gml:Box");this.writeNode("coordinates",[{x:bounds.left,y:bounds.bottom},{x:bounds.right,y:bounds.top}],node);if(this.srsName){node.setAttribute("srsName",this.srsName);}
61587 return node;}},OpenLayers.Format.GML.Base.prototype.writers["gml"]),"feature":OpenLayers.Format.GML.Base.prototype.writers["feature"],"wfs":OpenLayers.Format.GML.Base.prototype.writers["wfs"]},CLASS_NAME:"OpenLayers.Format.GML.v2"});OpenLayers.Format.GML.v3=OpenLayers.Class(OpenLayers.Format.GML.Base,{schemaLocation:"http://www.opengis.net/gml http://schemas.opengis.net/gml/3.1.1/profiles/gmlsfProfile/1.0.0/gmlsf.xsd",curve:false,multiCurve:true,surface:false,multiSurface:true,initialize:function(options){OpenLayers.Format.GML.Base.prototype.initialize.apply(this,[options]);},readers:{"gml":OpenLayers.Util.applyDefaults({"featureMembers":function(node,obj){this.readChildNodes(node,obj);},"Curve":function(node,container){var obj={points:[]};this.readChildNodes(node,obj);if(!container.components){container.components=[];}
61588 container.components.push(new OpenLayers.Geometry.LineString(obj.points));},"segments":function(node,obj){this.readChildNodes(node,obj);},"LineStringSegment":function(node,container){var obj={};this.readChildNodes(node,obj);if(obj.points){Array.prototype.push.apply(container.points,obj.points);}},"pos":function(node,obj){var str=this.getChildValue(node).replace(this.regExes.trimSpace,"");var coords=str.split(this.regExes.splitSpace);var point;if(this.xy){point=new OpenLayers.Geometry.Point(coords[0],coords[1],coords[2]);}else{point=new OpenLayers.Geometry.Point(coords[1],coords[0],coords[2]);}
61589 obj.points=[point];},"posList":function(node,obj){var str=this.getChildValue(node).replace(this.regExes.trimSpace,"");var coords=str.split(this.regExes.splitSpace);var dim=parseInt(node.getAttribute("dimension"))||2;var j,x,y,z;var numPoints=coords.length/dim;var points=new Array(numPoints);for(var i=0,len=coords.length;i<len;i+=dim){x=coords[i];y=coords[i+1];z=(dim==2)?undefined:coords[i+2];if(this.xy){points[i/dim]=new OpenLayers.Geometry.Point(x,y,z);}else{points[i/dim]=new OpenLayers.Geometry.Point(y,x,z);}}
61590 obj.points=points;},"Surface":function(node,obj){this.readChildNodes(node,obj);},"patches":function(node,obj){this.readChildNodes(node,obj);},"PolygonPatch":function(node,obj){this.readers.gml.Polygon.apply(this,[node,obj]);},"exterior":function(node,container){var obj={};this.readChildNodes(node,obj);container.outer=obj.components[0];},"interior":function(node,container){var obj={};this.readChildNodes(node,obj);container.inner.push(obj.components[0]);},"MultiCurve":function(node,container){var obj={components:[]};this.readChildNodes(node,obj);if(obj.components.length>0){container.components=[new OpenLayers.Geometry.MultiLineString(obj.components)];}},"curveMember":function(node,obj){this.readChildNodes(node,obj);},"MultiSurface":function(node,container){var obj={components:[]};this.readChildNodes(node,obj);if(obj.components.length>0){container.components=[new OpenLayers.Geometry.MultiPolygon(obj.components)];}},"surfaceMember":function(node,obj){this.readChildNodes(node,obj);},"surfaceMembers":function(node,obj){this.readChildNodes(node,obj);},"pointMembers":function(node,obj){this.readChildNodes(node,obj);},"lineStringMembers":function(node,obj){this.readChildNodes(node,obj);},"polygonMembers":function(node,obj){this.readChildNodes(node,obj);},"geometryMembers":function(node,obj){this.readChildNodes(node,obj);},"Envelope":function(node,container){var obj={points:new Array(2)};this.readChildNodes(node,obj);if(!container.components){container.components=[];}
61591 var min=obj.points[0];var max=obj.points[1];container.components.push(new OpenLayers.Bounds(min.x,min.y,max.x,max.y));},"lowerCorner":function(node,container){var obj={};this.readers.gml.pos.apply(this,[node,obj]);container.points[0]=obj.points[0];},"upperCorner":function(node,container){var obj={};this.readers.gml.pos.apply(this,[node,obj]);container.points[1]=obj.points[0];}},OpenLayers.Format.GML.Base.prototype.readers["gml"]),"feature":OpenLayers.Format.GML.Base.prototype.readers["feature"],"wfs":OpenLayers.Format.GML.Base.prototype.readers["wfs"]},write:function(features){var name;if(features instanceof Array){name="featureMembers";}else{name="featureMember";}
61592 var root=this.writeNode("gml:"+name,features);this.setAttributeNS(root,this.namespaces["xsi"],"xsi:schemaLocation",this.schemaLocation);return OpenLayers.Format.XML.prototype.write.apply(this,[root]);},writers:{"gml":OpenLayers.Util.applyDefaults({"featureMembers":function(features){var node=this.createElementNSPlus("gml:featureMembers");for(var i=0,len=features.length;i<len;++i){this.writeNode("feature:_typeName",features[i],node);}
61593 return node;},"Point":function(geometry){var node=this.createElementNSPlus("gml:Point");this.writeNode("pos",geometry,node);return node;},"pos":function(point){var pos=(this.xy)?(point.x+" "+point.y):(point.y+" "+point.x);return this.createElementNSPlus("gml:pos",{value:pos});},"LineString":function(geometry){var node=this.createElementNSPlus("gml:LineString");this.writeNode("posList",geometry.components,node);return node;},"Curve":function(geometry){var node=this.createElementNSPlus("gml:Curve");this.writeNode("segments",geometry,node);return node;},"segments":function(geometry){var node=this.createElementNSPlus("gml:segments");this.writeNode("LineStringSegment",geometry,node);return node;},"LineStringSegment":function(geometry){var node=this.createElementNSPlus("gml:LineStringSegment");this.writeNode("posList",geometry.components,node);return node;},"posList":function(points){var len=points.length;var parts=new Array(len);var point;for(var i=0;i<len;++i){point=points[i];if(this.xy){parts[i]=point.x+" "+point.y;}else{parts[i]=point.y+" "+point.x;}}
61594 return this.createElementNSPlus("gml:posList",{value:parts.join(" ")});},"Surface":function(geometry){var node=this.createElementNSPlus("gml:Surface");this.writeNode("patches",geometry,node);return node;},"patches":function(geometry){var node=this.createElementNSPlus("gml:patches");this.writeNode("PolygonPatch",geometry,node);return node;},"PolygonPatch":function(geometry){var node=this.createElementNSPlus("gml:PolygonPatch",{attributes:{interpolation:"planar"}});this.writeNode("exterior",geometry.components[0],node);for(var i=1,len=geometry.components.length;i<len;++i){this.writeNode("interior",geometry.components[i],node);}
61595 return node;},"Polygon":function(geometry){var node=this.createElementNSPlus("gml:Polygon");this.writeNode("exterior",geometry.components[0],node);for(var i=1,len=geometry.components.length;i<len;++i){this.writeNode("interior",geometry.components[i],node);}
61596 return node;},"exterior":function(ring){var node=this.createElementNSPlus("gml:exterior");this.writeNode("LinearRing",ring,node);return node;},"interior":function(ring){var node=this.createElementNSPlus("gml:interior");this.writeNode("LinearRing",ring,node);return node;},"LinearRing":function(ring){var node=this.createElementNSPlus("gml:LinearRing");this.writeNode("posList",ring.components,node);return node;},"MultiCurve":function(geometry){var node=this.createElementNSPlus("gml:MultiCurve");for(var i=0,len=geometry.components.length;i<len;++i){this.writeNode("curveMember",geometry.components[i],node);}
61597 return node;},"curveMember":function(geometry){var node=this.createElementNSPlus("gml:curveMember");if(this.curve){this.writeNode("Curve",geometry,node);}else{this.writeNode("LineString",geometry,node);}
61598 return node;},"MultiSurface":function(geometry){var node=this.createElementNSPlus("gml:MultiSurface");for(var i=0,len=geometry.components.length;i<len;++i){this.writeNode("surfaceMember",geometry.components[i],node);}
61599 return node;},"surfaceMember":function(polygon){var node=this.createElementNSPlus("gml:surfaceMember");if(this.surface){this.writeNode("Surface",polygon,node);}else{this.writeNode("Polygon",polygon,node);}
61600 return node;},"Envelope":function(bounds){var node=this.createElementNSPlus("gml:Envelope");this.writeNode("lowerCorner",bounds,node);this.writeNode("upperCorner",bounds,node);if(this.srsName){node.setAttribute("srsName",this.srsName);}
61601 return node;},"lowerCorner":function(bounds){var pos=(this.xy)?(bounds.left+" "+bounds.bottom):(bounds.bottom+" "+bounds.left);return this.createElementNSPlus("gml:lowerCorner",{value:pos});},"upperCorner":function(bounds){var pos=(this.xy)?(bounds.right+" "+bounds.top):(bounds.top+" "+bounds.right);return this.createElementNSPlus("gml:upperCorner",{value:pos});}},OpenLayers.Format.GML.Base.prototype.writers["gml"]),"feature":OpenLayers.Format.GML.Base.prototype.writers["feature"],"wfs":OpenLayers.Format.GML.Base.prototype.writers["wfs"]},setGeometryTypes:function(){this.geometryTypes={"OpenLayers.Geometry.Point":"Point","OpenLayers.Geometry.MultiPoint":"MultiPoint","OpenLayers.Geometry.LineString":(this.curve===true)?"Curve":"LineString","OpenLayers.Geometry.MultiLineString":(this.multiCurve===false)?"MultiLineString":"MultiCurve","OpenLayers.Geometry.Polygon":(this.surface===true)?"Surface":"Polygon","OpenLayers.Geometry.MultiPolygon":(this.multiSurface===false)?"MultiPolygon":"MultiSurface","OpenLayers.Geometry.Collection":"GeometryCollection"};},CLASS_NAME:"OpenLayers.Format.GML.v3"});OpenLayers.Format.Atom=OpenLayers.Class(OpenLayers.Format.XML,{namespaces:{atom:"http://www.w3.org/2005/Atom",georss:"http://www.georss.org/georss"},feedTitle:"untitled",defaultEntryTitle:"untitled",gmlParser:null,xy:false,initialize:function(options){OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);},read:function(doc){if(typeof doc=="string"){doc=OpenLayers.Format.XML.prototype.read.apply(this,[doc]);}
61602 return this.parseFeatures(doc);},write:function(features){var doc;if(features instanceof Array){doc=this.createElementNSPlus("atom:feed");doc.appendChild(this.createElementNSPlus("atom:title",{value:this.feedTitle}));for(var i=0,ii=features.length;i<ii;i++){doc.appendChild(this.buildEntryNode(features[i]));}}
61603 else{doc=this.buildEntryNode(features);}
61604 return OpenLayers.Format.XML.prototype.write.apply(this,[doc]);},buildContentNode:function(content){var node=this.createElementNSPlus("atom:content",{attributes:{type:content.type||null}});if(content.src){node.setAttribute("src",content.src);}else{if(content.type=="text"||content.type==null){node.appendChild(this.createTextNode(content.value));}else if(content.type=="html"){if(typeof content.value!="string"){throw"HTML content must be in form of an escaped string";}
61605 node.appendChild(this.createTextNode(content.value));}else if(content.type=="xhtml"){node.appendChild(content.value);}else if(content.type=="xhtml"||content.type.match(/(\+|\/)xml$/)){node.appendChild(content.value);}
61606 else{node.appendChild(this.createTextNode(content.value));}}
61607 return node;},buildEntryNode:function(feature){var attrib=feature.attributes;var atomAttrib=attrib.atom||{};var entryNode=this.createElementNSPlus("atom:entry");if(atomAttrib.authors){var authors=atomAttrib.authors instanceof Array?atomAttrib.authors:[atomAttrib.authors];for(var i=0,ii=authors.length;i<ii;i++){entryNode.appendChild(this.buildPersonConstructNode("author",authors[i]));}}
61608 if(atomAttrib.categories){var categories=atomAttrib.categories instanceof Array?atomAttrib.categories:[atomAttrib.categories];var category;for(var i=0,ii=categories.length;i<ii;i++){category=categories[i];entryNode.appendChild(this.createElementNSPlus("atom:category",{attributes:{term:category.term,scheme:category.scheme||null,label:category.label||null}}));}}
61609 if(atomAttrib.content){entryNode.appendChild(this.buildContentNode(atomAttrib.content));}
61610 if(atomAttrib.contributors){var contributors=atomAttrib.contributors instanceof Array?atomAttrib.contributors:[atomAttrib.contributors];for(var i=0,ii=contributors.length;i<ii;i++){entryNode.appendChild(this.buildPersonConstructNode("contributor",contributors[i]));}}
61611 if(feature.fid){entryNode.appendChild(this.createElementNSPlus("atom:id",{value:feature.fid}));}
61612 if(atomAttrib.links){var links=atomAttrib.links instanceof Array?atomAttrib.links:[atomAttrib.links];var link;for(var i=0,ii=links.length;i<ii;i++){link=links[i];entryNode.appendChild(this.createElementNSPlus("atom:link",{attributes:{href:link.href,rel:link.rel||null,type:link.type||null,hreflang:link.hreflang||null,title:link.title||null,length:link.length||null}}));}}
61613 if(atomAttrib.published){entryNode.appendChild(this.createElementNSPlus("atom:published",{value:atomAttrib.published}));}
61614 if(atomAttrib.rights){entryNode.appendChild(this.createElementNSPlus("atom:rights",{value:atomAttrib.rights}));}
61615 if(atomAttrib.summary||attrib.description){entryNode.appendChild(this.createElementNSPlus("atom:summary",{value:atomAttrib.summary||attrib.description}));}
61616 entryNode.appendChild(this.createElementNSPlus("atom:title",{value:atomAttrib.title||attrib.title||this.defaultEntryTitle}));if(atomAttrib.updated){entryNode.appendChild(this.createElementNSPlus("atom:updated",{value:atomAttrib.updated}));}
61617 if(feature.geometry){var whereNode=this.createElementNSPlus("georss:where");whereNode.appendChild(this.buildGeometryNode(feature.geometry));entryNode.appendChild(whereNode);}
61618 return entryNode;},initGmlParser:function(){this.gmlParser=new OpenLayers.Format.GML.v3({xy:this.xy,featureNS:"http://example.com#feature",internalProjection:this.internalProjection,externalProjection:this.externalProjection});},buildGeometryNode:function(geometry){if(!this.gmlParser){this.initGmlParser();}
61619 var node=this.gmlParser.writeNode("feature:_geometry",geometry);return node.firstChild;},buildPersonConstructNode:function(name,value){var oNames=["uri","email"];var personNode=this.createElementNSPlus("atom:"+name);personNode.appendChild(this.createElementNSPlus("atom:name",{value:value.name}));for(var i=0,ii=oNames.length;i<ii;i++){if(value[oNames[i]]){personNode.appendChild(this.createElementNSPlus("atom:"+oNames[i],{value:value[oNames[i]]}));}}
61620 return personNode;},getFirstChildValue:function(node,nsuri,name,def){var value;var nodes=this.getElementsByTagNameNS(node,nsuri,name);if(nodes&&nodes.length>0){value=this.getChildValue(nodes[0],def);}else{value=def;}
61621 return value;},parseFeature:function(node){var atomAttrib={};var value=null;var nodes=null;var attval=null;var atomns=this.namespaces.atom;this.parsePersonConstructs(node,"author",atomAttrib);nodes=this.getElementsByTagNameNS(node,atomns,"category");if(nodes.length>0){atomAttrib.categories=[];}
61622 for(var i=0,ii=nodes.length;i<ii;i++){value={};value.term=nodes[i].getAttribute("term");attval=nodes[i].getAttribute("scheme");if(attval){value.scheme=attval;}
61623 attval=nodes[i].getAttribute("label");if(attval){value.label=attval;}
61624 atomAttrib.categories.push(value);}
61625 nodes=this.getElementsByTagNameNS(node,atomns,"content");if(nodes.length>0){value={};attval=nodes[0].getAttribute("type");if(attval){value.type=attval;}
61626 attval=nodes[0].getAttribute("src");if(attval){value.src=attval;}else{if(value.type=="text"||value.type=="html"||value.type==null){value.value=this.getFirstChildValue(node,atomns,"content",null);}else if(value.type=="xhtml"||value.type.match(/(\+|\/)xml$/)){value.value=this.getChildEl(nodes[0]);}else{value.value=this.getFirstChildValue(node,atomns,"content",null);}
61627 atomAttrib.content=value;}}
61628 this.parsePersonConstructs(node,"contributor",atomAttrib);atomAttrib.id=this.getFirstChildValue(node,atomns,"id",null);nodes=this.getElementsByTagNameNS(node,atomns,"link");if(nodes.length>0){atomAttrib.links=new Array(nodes.length);}
61629 var oAtts=["rel","type","hreflang","title","length"];for(var i=0,ii=nodes.length;i<ii;i++){value={};value.href=nodes[i].getAttribute("href");for(var j=0,jj=oAtts.length;j<jj;j++){attval=nodes[i].getAttribute(oAtts[j]);if(attval){value[oAtts[j]]=attval;}}
61630 atomAttrib.links[i]=value;}
61631 value=this.getFirstChildValue(node,atomns,"published",null);if(value){atomAttrib.published=value;}
61632 value=this.getFirstChildValue(node,atomns,"rights",null);if(value){atomAttrib.rights=value;}
61633 value=this.getFirstChildValue(node,atomns,"summary",null);if(value){atomAttrib.summary=value;}
61634 atomAttrib.title=this.getFirstChildValue(node,atomns,"title",null);atomAttrib.updated=this.getFirstChildValue(node,atomns,"updated",null);var featureAttrib={title:atomAttrib.title,description:atomAttrib.summary,atom:atomAttrib};var geometry=this.parseLocations(node)[0];var feature=new OpenLayers.Feature.Vector(geometry,featureAttrib);feature.fid=atomAttrib.id;return feature;},parseFeatures:function(node){var features=[];var entries=this.getElementsByTagNameNS(node,this.namespaces.atom,"entry");if(entries.length==0){entries=[node];}
61635 for(var i=0,ii=entries.length;i<ii;i++){features.push(this.parseFeature(entries[i]));}
61636 return features;},parseLocations:function(node){var georssns=this.namespaces.georss;var locations={components:[]};var where=this.getElementsByTagNameNS(node,georssns,"where");if(where&&where.length>0){if(!this.gmlParser){this.initGmlParser();}
61637 for(var i=0,ii=where.length;i<ii;i++){this.gmlParser.readChildNodes(where[i],locations);}}
61638 var components=locations.components;var point=this.getElementsByTagNameNS(node,georssns,"point");if(point&&point.length>0){for(var i=0,ii=point.length;i<ii;i++){var xy=OpenLayers.String.trim(point[i].firstChild.nodeValue).split(/\s+/);if(xy.length!=2){xy=OpenLayers.String.trim(point[i].firstChild.nodeValue).split(/\s*,\s*/);}
61639 components.push(new OpenLayers.Geometry.Point(parseFloat(xy[1]),parseFloat(xy[0])));}}
61640 var line=this.getElementsByTagNameNS(node,georssns,"line");if(line&&line.length>0){var coords;var p;var points;for(var i=0,ii=line.length;i<ii;i++){coords=OpenLayers.String.trim(line[i].firstChild.nodeValue).split(/\s+/);points=[];for(var j=0,jj=coords.length;j<jj;j+=2){p=new OpenLayers.Geometry.Point(parseFloat(coords[j+1]),parseFloat(coords[j]));points.push(p);}
61641 components.push(new OpenLayers.Geometry.LineString(points));}}
61642 var polygon=this.getElementsByTagNameNS(node,georssns,"polygon");if(polygon&&polygon.length>0){var coords;var p;var points;for(var i=0,ii=polygon.length;i<ii;i++){coords=OpenLayers.String.trim(polygon[i].firstChild.nodeValue).split(/\s+/);points=[];for(var j=0,jj=coords.length;j<jj;j+=2){p=new OpenLayers.Geometry.Point(parseFloat(coords[j+1]),parseFloat(coords[j]));points.push(p);}
61643 components.push(new OpenLayers.Geometry.Polygon([new OpenLayers.Geometry.LinearRing(components)]));}}
61644 if(this.internalProjection&&this.externalProjection){for(var i=0,ii=components.length;i<ii;i++){if(components[i]){components[i].transform(this.externalProjection,this.internalProjection);}}}
61645 return components;},parsePersonConstructs:function(node,name,data){var persons=[];var atomns=this.namespaces.atom;var nodes=this.getElementsByTagNameNS(node,atomns,name);var oAtts=["uri","email"];for(var i=0,ii=nodes.length;i<ii;i++){var value={};value.name=this.getFirstChildValue(nodes[i],atomns,"name",null);for(var j=0,jj=oAtts.length;j<jj;j++){var attval=this.getFirstChildValue(nodes[i],atomns,oAtts[j],null);if(attval){value[oAtts[j]]=attval;}}
61646 persons.push(value);}
61647 if(persons.length>0){data[name+"s"]=persons;}},CLASS_NAME:"OpenLayers.Format.Atom"});OpenLayers.Format.Filter.v1_0_0=OpenLayers.Class(OpenLayers.Format.GML.v2,OpenLayers.Format.Filter.v1,{VERSION:"1.0.0",schemaLocation:"http://www.opengis.net/ogc/filter/1.0.0/filter.xsd",initialize:function(options){OpenLayers.Format.GML.v2.prototype.initialize.apply(this,[options]);},readers:{"ogc":OpenLayers.Util.applyDefaults({"PropertyIsEqualTo":function(node,obj){var filter=new OpenLayers.Filter.Comparison({type:OpenLayers.Filter.Comparison.EQUAL_TO});this.readChildNodes(node,filter);obj.filters.push(filter);},"PropertyIsNotEqualTo":function(node,obj){var filter=new OpenLayers.Filter.Comparison({type:OpenLayers.Filter.Comparison.NOT_EQUAL_TO});this.readChildNodes(node,filter);obj.filters.push(filter);},"PropertyIsLike":function(node,obj){var filter=new OpenLayers.Filter.Comparison({type:OpenLayers.Filter.Comparison.LIKE});this.readChildNodes(node,filter);var wildCard=node.getAttribute("wildCard");var singleChar=node.getAttribute("singleChar");var esc=node.getAttribute("escape");filter.value2regex(wildCard,singleChar,esc);obj.filters.push(filter);}},OpenLayers.Format.Filter.v1.prototype.readers["ogc"]),"gml":OpenLayers.Format.GML.v2.prototype.readers["gml"],"feature":OpenLayers.Format.GML.v2.prototype.readers["feature"]},writers:{"ogc":OpenLayers.Util.applyDefaults({"PropertyIsEqualTo":function(filter){var node=this.createElementNSPlus("ogc:PropertyIsEqualTo");this.writeNode("PropertyName",filter,node);this.writeNode("Literal",filter.value,node);return node;},"PropertyIsNotEqualTo":function(filter){var node=this.createElementNSPlus("ogc:PropertyIsNotEqualTo");this.writeNode("PropertyName",filter,node);this.writeNode("Literal",filter.value,node);return node;},"PropertyIsLike":function(filter){var node=this.createElementNSPlus("ogc:PropertyIsLike",{attributes:{wildCard:"*",singleChar:".",escape:"!"}});this.writeNode("PropertyName",filter,node);this.writeNode("Literal",filter.regex2value(),node);return node;},"BBOX":function(filter){var node=this.createElementNSPlus("ogc:BBOX");this.writeNode("PropertyName",filter,node);var box=this.writeNode("gml:Box",filter.value,node);if(filter.projection){box.setAttribute("srsName",filter.projection);}
61648 return node;}},OpenLayers.Format.Filter.v1.prototype.writers["ogc"]),"gml":OpenLayers.Format.GML.v2.prototype.writers["gml"],"feature":OpenLayers.Format.GML.v2.prototype.writers["feature"]},writeSpatial:function(filter,name){var node=this.createElementNSPlus("ogc:"+name);this.writeNode("PropertyName",filter,node);var child;if(filter.value instanceof OpenLayers.Geometry){child=this.writeNode("feature:_geometry",filter.value).firstChild;}else{child=this.writeNode("gml:Box",filter.value);}
61649 if(filter.projection){child.setAttribute("srsName",filter.projection);}
61650 node.appendChild(child);return node;},CLASS_NAME:"OpenLayers.Format.Filter.v1_0_0"});OpenLayers.Format.Filter.v1_1_0=OpenLayers.Class(OpenLayers.Format.GML.v3,OpenLayers.Format.Filter.v1,{VERSION:"1.1.0",schemaLocation:"http://www.opengis.net/ogc/filter/1.1.0/filter.xsd",initialize:function(options){OpenLayers.Format.GML.v3.prototype.initialize.apply(this,[options]);},readers:{"ogc":OpenLayers.Util.applyDefaults({"PropertyIsEqualTo":function(node,obj){var matchCase=node.getAttribute("matchCase");var filter=new OpenLayers.Filter.Comparison({type:OpenLayers.Filter.Comparison.EQUAL_TO,matchCase:!(matchCase==="false"||matchCase==="0")});this.readChildNodes(node,filter);obj.filters.push(filter);},"PropertyIsNotEqualTo":function(node,obj){var matchCase=node.getAttribute("matchCase");var filter=new OpenLayers.Filter.Comparison({type:OpenLayers.Filter.Comparison.NOT_EQUAL_TO,matchCase:!(matchCase==="false"||matchCase==="0")});this.readChildNodes(node,filter);obj.filters.push(filter);},"PropertyIsLike":function(node,obj){var filter=new OpenLayers.Filter.Comparison({type:OpenLayers.Filter.Comparison.LIKE});this.readChildNodes(node,filter);var wildCard=node.getAttribute("wildCard");var singleChar=node.getAttribute("singleChar");var esc=node.getAttribute("escapeChar");filter.value2regex(wildCard,singleChar,esc);obj.filters.push(filter);}},OpenLayers.Format.Filter.v1.prototype.readers["ogc"]),"gml":OpenLayers.Format.GML.v3.prototype.readers["gml"],"feature":OpenLayers.Format.GML.v3.prototype.readers["feature"]},writers:{"ogc":OpenLayers.Util.applyDefaults({"PropertyIsEqualTo":function(filter){var node=this.createElementNSPlus("ogc:PropertyIsEqualTo",{attributes:{matchCase:filter.matchCase}});this.writeNode("PropertyName",filter,node);this.writeNode("Literal",filter.value,node);return node;},"PropertyIsNotEqualTo":function(filter){var node=this.createElementNSPlus("ogc:PropertyIsNotEqualTo",{attributes:{matchCase:filter.matchCase}});this.writeNode("PropertyName",filter,node);this.writeNode("Literal",filter.value,node);return node;},"PropertyIsLike":function(filter){var node=this.createElementNSPlus("ogc:PropertyIsLike",{attributes:{wildCard:"*",singleChar:".",escapeChar:"!"}});this.writeNode("PropertyName",filter,node);this.writeNode("Literal",filter.regex2value(),node);return node;},"BBOX":function(filter){var node=this.createElementNSPlus("ogc:BBOX");this.writeNode("PropertyName",filter,node);var box=this.writeNode("gml:Envelope",filter.value);if(filter.projection){box.setAttribute("srsName",filter.projection);}
61651 node.appendChild(box);return node;}},OpenLayers.Format.Filter.v1.prototype.writers["ogc"]),"gml":OpenLayers.Format.GML.v3.prototype.writers["gml"],"feature":OpenLayers.Format.GML.v3.prototype.writers["feature"]},writeSpatial:function(filter,name){var node=this.createElementNSPlus("ogc:"+name);this.writeNode("PropertyName",filter,node);var child;if(filter.value instanceof OpenLayers.Geometry){child=this.writeNode("feature:_geometry",filter.value).firstChild;}else{child=this.writeNode("gml:Envelope",filter.value);}
61652 if(filter.projection){child.setAttribute("srsName",filter.projection);}
61653 node.appendChild(child);return node;},CLASS_NAME:"OpenLayers.Format.Filter.v1_1_0"});OpenLayers.Format.SOSCapabilities.v1_0_0=OpenLayers.Class(OpenLayers.Format.SOSCapabilities,{namespaces:{ows:"http://www.opengis.net/ows/1.1",sos:"http://www.opengis.net/sos/1.0",gml:"http://www.opengis.net/gml",xlink:"http://www.w3.org/1999/xlink"},regExes:{trimSpace:(/^\s*|\s*$/g),removeSpace:(/\s*/g),splitSpace:(/\s+/),trimComma:(/\s*,\s*/g)},initialize:function(options){OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);this.options=options;},read:function(data){if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);}
61654 if(data&&data.nodeType==9){data=data.documentElement;}
61655 var capabilities={};this.readNode(data,capabilities);return capabilities;},readers:{"gml":OpenLayers.Util.applyDefaults({"name":function(node,obj){obj.name=this.getChildValue(node);},"TimePeriod":function(node,obj){obj.timePeriod={};this.readChildNodes(node,obj.timePeriod);},"beginPosition":function(node,timePeriod){timePeriod.beginPosition=this.getChildValue(node);},"endPosition":function(node,timePeriod){timePeriod.endPosition=this.getChildValue(node);}},OpenLayers.Format.GML.v3.prototype.readers["gml"]),"sos":{"Capabilities":function(node,obj){this.readChildNodes(node,obj);},"Contents":function(node,obj){obj.contents={};this.readChildNodes(node,obj.contents);},"ObservationOfferingList":function(node,contents){contents.offeringList={};this.readChildNodes(node,contents.offeringList);},"ObservationOffering":function(node,offeringList){var id=this.getAttributeNS(node,this.namespaces.gml,"id");offeringList[id]={procedures:[],observedProperties:[],featureOfInterestIds:[],responseFormats:[],resultModels:[],responseModes:[]};this.readChildNodes(node,offeringList[id]);},"time":function(node,offering){offering.time={};this.readChildNodes(node,offering.time);},"procedure":function(node,offering){offering.procedures.push(this.getAttributeNS(node,this.namespaces.xlink,"href"));},"observedProperty":function(node,offering){offering.observedProperties.push(this.getAttributeNS(node,this.namespaces.xlink,"href"));},"featureOfInterest":function(node,offering){offering.featureOfInterestIds.push(this.getAttributeNS(node,this.namespaces.xlink,"href"));},"responseFormat":function(node,offering){offering.responseFormats.push(this.getChildValue(node));},"resultModel":function(node,offering){offering.resultModels.push(this.getChildValue(node));},"responseMode":function(node,offering){offering.responseModes.push(this.getChildValue(node));;}},"ows":OpenLayers.Format.OWSCommon.v1_1_0.prototype.readers["ows"]},CLASS_NAME:"OpenLayers.Format.SOSCapabilities.v1_0_0"});OpenLayers.Format.SOSGetFeatureOfInterest=OpenLayers.Class(OpenLayers.Format.XML,{VERSION:"1.0.0",namespaces:{sos:"http://www.opengis.net/sos/1.0",gml:"http://www.opengis.net/gml",sa:"http://www.opengis.net/sampling/1.0",xsi:"http://www.w3.org/2001/XMLSchema-instance"},schemaLocation:"http://www.opengis.net/sos/1.0 http://schemas.opengis.net/sos/1.0.0/sosAll.xsd",defaultPrefix:"sos",regExes:{trimSpace:(/^\s*|\s*$/g),removeSpace:(/\s*/g),splitSpace:(/\s+/),trimComma:(/\s*,\s*/g)},initialize:function(options){OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);},read:function(data){if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);}
61656 if(data&&data.nodeType==9){data=data.documentElement;}
61657 var info={features:[]};this.readNode(data,info);var features=[];for(var i=0,len=info.features.length;i<len;i++){var container=info.features[i];if(this.internalProjection&&this.externalProjection&&container.components[0]){container.components[0].transform(this.externalProjection,this.internalProjection);}
61658 var feature=new OpenLayers.Feature.Vector(container.components[0],container.attributes);features.push(feature);}
61659 return features;},readers:{"sa":{"SamplingPoint":function(node,obj){if(!obj.attributes){var feature={attributes:{}};obj.features.push(feature);obj=feature;}
61660 obj.attributes.id=this.getAttributeNS(node,this.namespaces.gml,"id");this.readChildNodes(node,obj);},"position":function(node,obj){this.readChildNodes(node,obj);}},"gml":OpenLayers.Util.applyDefaults({"FeatureCollection":function(node,obj){this.readChildNodes(node,obj);},"featureMember":function(node,obj){var feature={attributes:{}};obj.features.push(feature);this.readChildNodes(node,feature);},"name":function(node,obj){obj.attributes.name=this.getChildValue(node);},"pos":function(node,obj){if(!this.externalProjection){this.externalProjection=new OpenLayers.Projection(node.getAttribute("srsName"));}
61661 OpenLayers.Format.GML.v3.prototype.readers.gml.pos.apply(this,[node,obj]);}},OpenLayers.Format.GML.v3.prototype.readers.gml)},writers:{"sos":{"GetFeatureOfInterest":function(options){var node=this.createElementNSPlus("GetFeatureOfInterest",{attributes:{version:this.VERSION,service:'SOS',"xsi:schemaLocation":this.schemaLocation}});for(var i=0,len=options.fois.length;i<len;i++){this.writeNode("FeatureOfInterestId",{foi:options.fois[i]},node);}
61662 return node;},"FeatureOfInterestId":function(options){var node=this.createElementNSPlus("FeatureOfInterestId",{value:options.foi});return node;}}},CLASS_NAME:"OpenLayers.Format.SOSGetFeatureOfInterest"});OpenLayers.Format.SOSGetObservation=OpenLayers.Class(OpenLayers.Format.XML,{namespaces:{ows:"http://www.opengis.net/ows",gml:"http://www.opengis.net/gml",sos:"http://www.opengis.net/sos/1.0",ogc:"http://www.opengis.net/ogc",om:"http://www.opengis.net/om/1.0",xlink:"http://www.w3.org/1999/xlink",xsi:"http://www.w3.org/2001/XMLSchema-instance"},regExes:{trimSpace:(/^\s*|\s*$/g),removeSpace:(/\s*/g),splitSpace:(/\s+/),trimComma:(/\s*,\s*/g)},VERSION:"1.0.0",schemaLocation:"http://www.opengis.net/sos/1.0 http://schemas.opengis.net/sos/1.0.0/sosGetObservation.xsd",defaultPrefix:"sos",initialize:function(options){OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);},read:function(data){if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);}
61663 if(data&&data.nodeType==9){data=data.documentElement;}
61664 var info={measurements:[]};this.readNode(data,info);return info;},write:function(options){var node=this.writeNode("sos:GetObservation",options);node.setAttribute("xmlns:om",this.namespaces.om);this.setAttributeNS(node,this.namespaces.xsi,"xsi:schemaLocation",this.schemaLocation);return OpenLayers.Format.XML.prototype.write.apply(this,[node]);},readers:{"om":{"ObservationCollection":function(node,obj){obj.id=this.getAttributeNS(node,this.namespaces.gml,"id");this.readChildNodes(node,obj);},"member":function(node,observationCollection){this.readChildNodes(node,observationCollection);},"Measurement":function(node,observationCollection){var measurement={};observationCollection.measurements.push(measurement);this.readChildNodes(node,measurement);},"samplingTime":function(node,measurement){var samplingTime={};measurement.samplingTime=samplingTime;this.readChildNodes(node,samplingTime);},"observedProperty":function(node,measurement){measurement.observedProperty=this.getAttributeNS(node,this.namespaces.xlink,"href");this.readChildNodes(node,measurement);},"procedure":function(node,measurement){measurement.procedure=this.getAttributeNS(node,this.namespaces.xlink,"href");this.readChildNodes(node,measurement);},"result":function(node,measurement){var result={};measurement.result=result;if(this.getChildValue(node)!==''){result.value=this.getChildValue(node);result.uom=node.getAttribute("uom");}else{this.readChildNodes(node,result);}}},"gml":OpenLayers.Util.applyDefaults({"TimeInstant":function(node,samplingTime){var timeInstant={};samplingTime.timeInstant=timeInstant;this.readChildNodes(node,timeInstant);},"timePosition":function(node,timeInstant){timeInstant.timePosition=this.getChildValue(node);}},OpenLayers.Format.GML.v3.prototype.readers.gml)},writers:{"sos":{"GetObservation":function(options){var node=this.createElementNSPlus("GetObservation",{attributes:{version:this.VERSION,service:'SOS'}});this.writeNode("offering",options,node);this.writeNode("eventTime",options,node);this.writeNode("procedure",options,node);this.writeNode("observedProperty",options,node);this.writeNode("responseFormat",options,node);this.writeNode("resultModel",options,node);this.writeNode("responseMode",options,node);return node;},"responseFormat":function(options){return this.createElementNSPlus("responseFormat",{value:options.responseFormat});},"procedure":function(options){return this.createElementNSPlus("procedure",{value:options.procedure});},"offering":function(options){return this.createElementNSPlus("offering",{value:options.offering});},"observedProperty":function(options){return this.createElementNSPlus("observedProperty",{value:options.observedProperty});},"eventTime":function(options){var node=this.createElementNSPlus("eventTime");if(options.eventTime==='latest'){this.writeNode("ogc:TM_Equals",options,node);}
61665 return node;},"resultModel":function(options){return this.createElementNSPlus("resultModel",{value:options.resultModel});},"responseMode":function(options){return this.createElementNSPlus("responseMode",{value:options.responseMode});}},"ogc":{"TM_Equals":function(options){var node=this.createElementNSPlus("ogc:TM_Equals");this.writeNode("ogc:PropertyName",{property:"urn:ogc:data:time:iso8601"},node);if(options.eventTime==='latest'){this.writeNode("gml:TimeInstant",{value:'latest'},node);}
61666 return node;},"PropertyName":function(options){return this.createElementNSPlus("ogc:PropertyName",{value:options.property});}},"gml":{"TimeInstant":function(options){var node=this.createElementNSPlus("gml:TimeInstant");this.writeNode("gml:timePosition",options,node);return node;},"timePosition":function(options){var node=this.createElementNSPlus("gml:timePosition",{value:options.value});return node;}}},CLASS_NAME:"OpenLayers.Format.SOSGetObservation"});OpenLayers.Format.CSWGetRecords.v2_0_2=OpenLayers.Class(OpenLayers.Format.XML,{namespaces:{xlink:"http://www.w3.org/1999/xlink",xsi:"http://www.w3.org/2001/XMLSchema-instance",csw:"http://www.opengis.net/cat/csw/2.0.2",dc:"http://purl.org/dc/elements/1.1/",dct:"http://purl.org/dc/terms/",ows:"http://www.opengis.net/ows"},defaultPrefix:"csw",version:"2.0.2",schemaLocation:"http://www.opengis.net/cat/csw/2.0.2 http://schemas.opengis.net/csw/2.0.2/CSW-discovery.xsd",requestId:null,resultType:null,outputFormat:null,outputSchema:null,startPosition:null,maxRecords:null,DistributedSearch:null,ResponseHandler:null,Query:null,regExes:{trimSpace:(/^\s*|\s*$/g),removeSpace:(/\s*/g),splitSpace:(/\s+/),trimComma:(/\s*,\s*/g)},initialize:function(options){OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);},read:function(data){if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);}
61667 if(data&&data.nodeType==9){data=data.documentElement;}
61668 var obj={};this.readNode(data,obj);return obj;},readers:{"csw":{"GetRecordsResponse":function(node,obj){obj.records=[];this.readChildNodes(node,obj);var version=this.getAttributeNS(node,"",'version');if(version!=""){obj.version=version;}},"RequestId":function(node,obj){obj.RequestId=this.getChildValue(node);},"SearchStatus":function(node,obj){obj.SearchStatus={};var timestamp=this.getAttributeNS(node,"",'timestamp');if(timestamp!=""){obj.SearchStatus.timestamp=timestamp;}},"SearchResults":function(node,obj){this.readChildNodes(node,obj);var attrs=node.attributes;var SearchResults={};for(var i=0,len=attrs.length;i<len;++i){if((attrs[i].name=="numberOfRecordsMatched")||(attrs[i].name=="numberOfRecordsReturned")||(attrs[i].name=="nextRecord")){SearchResults[attrs[i].name]=parseInt(attrs[i].nodeValue);}else{SearchResults[attrs[i].name]=attrs[i].nodeValue;}}
61669 obj.SearchResults=SearchResults;},"SummaryRecord":function(node,obj){var record={type:"SummaryRecord"};this.readChildNodes(node,record);obj.records.push(record);},"BriefRecord":function(node,obj){var record={type:"BriefRecord"};this.readChildNodes(node,record);obj.records.push(record);},"DCMIRecord":function(node,obj){var record={type:"DCMIRecord"};this.readChildNodes(node,record);obj.records.push(record);},"Record":function(node,obj){var record={type:"Record"};this.readChildNodes(node,record);obj.records.push(record);}},"dc":{"*":function(node,obj){var name=node.localName||node.nodeName.split(":").pop();if(!(obj[name]instanceof Array)){obj[name]=new Array();}
61670 var dc_element={};var attrs=node.attributes;for(var i=0,len=attrs.length;i<len;++i){dc_element[attrs[i].name]=attrs[i].nodeValue;}
61671 dc_element.value=this.getChildValue(node);obj[name].push(dc_element);}},"dct":{"*":function(node,obj){var name=node.localName||node.nodeName.split(":").pop();if(!(obj[name]instanceof Array)){obj[name]=new Array();}
61672 obj[name].push(this.getChildValue(node));}},"ows":OpenLayers.Util.applyDefaults({"BoundingBox":function(node,obj){if(obj.bounds){obj.BoundingBox=[{crs:obj.projection,value:[obj.bounds.left,obj.bounds.bottom,obj.bounds.right,obj.bounds.top]}];delete obj.projection;delete obj.bounds;}
61673 OpenLayers.Format.OWSCommon.v1_0_0.prototype.readers["ows"]["BoundingBox"].apply(this,arguments);}},OpenLayers.Format.OWSCommon.v1_0_0.prototype.readers["ows"])},write:function(options){var node=this.writeNode("csw:GetRecords",options);return OpenLayers.Format.XML.prototype.write.apply(this,[node]);},writers:{"csw":{"GetRecords":function(options){if(!options){options={};}
61674 var node=this.createElementNSPlus("csw:GetRecords",{attributes:{service:"CSW",version:this.version,requestId:options.requestId||this.requestId,resultType:options.resultType||this.resultType,outputFormat:options.outputFormat||this.outputFormat,outputSchema:options.outputSchema||this.outputSchema,startPosition:options.startPosition||this.startPosition,maxRecords:options.maxRecords||this.maxRecords}});if(options.DistributedSearch||this.DistributedSearch){this.writeNode("csw:DistributedSearch",options.DistributedSearch||this.DistributedSearch,node);}
61675 var ResponseHandler=options.ResponseHandler||this.ResponseHandler;if(ResponseHandler instanceof Array&&ResponseHandler.length>0){for(var i=0,len=ResponseHandler.length;i<len;i++){this.writeNode("csw:ResponseHandler",ResponseHandler[i],node);}}
61676 this.writeNode("Query",options.Query||this.Query,node);return node;},"DistributedSearch":function(options){var node=this.createElementNSPlus("csw:DistributedSearch",{attributes:{hopCount:options.hopCount}});return node;},"ResponseHandler":function(options){var node=this.createElementNSPlus("csw:ResponseHandler",{value:options.value});return node;},"Query":function(options){if(!options){options={};}
61677 var node=this.createElementNSPlus("csw:Query",{attributes:{typeNames:options.typeNames||"csw:Record"}});var ElementName=options.ElementName;if(ElementName instanceof Array&&ElementName.length>0){for(var i=0,len=ElementName.length;i<len;i++){this.writeNode("csw:ElementName",ElementName[i],node);}}else{this.writeNode("csw:ElementSetName",options.ElementSetName||{value:'summary'},node);}
61678 if(options.Constraint){this.writeNode("csw:Constraint",options.Constraint,node);}
61679 return node;},"ElementName":function(options){var node=this.createElementNSPlus("csw:ElementName",{value:options.value});return node;},"ElementSetName":function(options){var node=this.createElementNSPlus("csw:ElementSetName",{attributes:{typeNames:options.typeNames},value:options.value});return node;},"Constraint":function(options){var node=this.createElementNSPlus("csw:Constraint",{attributes:{version:options.version}});if(options.Filter){var format=new OpenLayers.Format.Filter({version:options.version});node.appendChild(format.write(options.Filter));}else if(options.CqlText){var child=this.createElementNSPlus("CqlText",{value:options.CqlText.value});node.appendChild(child);}
61680 return node;}}},CLASS_NAME:"OpenLayers.Format.CSWGetRecords.v2_0_2"});OpenLayers.Format.SLD.v1=OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0,{namespaces:{sld:"http://www.opengis.net/sld",ogc:"http://www.opengis.net/ogc",gml:"http://www.opengis.net/gml",xlink:"http://www.w3.org/1999/xlink",xsi:"http://www.w3.org/2001/XMLSchema-instance"},defaultPrefix:"sld",schemaLocation:null,multipleSymbolizers:false,featureTypeCounter:null,defaultSymbolizer:{fillColor:"#808080",fillOpacity:1,strokeColor:"#000000",strokeOpacity:1,strokeWidth:1,strokeDashstyle:"solid",pointRadius:3,graphicName:"square"},initialize:function(options){OpenLayers.Format.Filter.v1_0_0.prototype.initialize.apply(this,[options]);},read:function(data,options){options=OpenLayers.Util.applyDefaults(options,this.options);var sld={namedLayers:options.namedLayersAsArray===true?[]:{}};this.readChildNodes(data,sld);return sld;},readers:OpenLayers.Util.applyDefaults({"sld":{"StyledLayerDescriptor":function(node,sld){sld.version=node.getAttribute("version");this.readChildNodes(node,sld);},"Name":function(node,obj){obj.name=this.getChildValue(node);},"Title":function(node,obj){obj.title=this.getChildValue(node);},"Abstract":function(node,obj){obj.description=this.getChildValue(node);},"NamedLayer":function(node,sld){var layer={userStyles:[],namedStyles:[]};this.readChildNodes(node,layer);for(var i=0,len=layer.userStyles.length;i<len;++i){layer.userStyles[i].layerName=layer.name;}
61681 if(sld.namedLayers instanceof Array){sld.namedLayers.push(layer);}else{sld.namedLayers[layer.name]=layer;}},"NamedStyle":function(node,layer){layer.namedStyles.push(this.getChildName(node.firstChild));},"UserStyle":function(node,layer){var obj={defaultsPerSymbolizer:true,rules:[]};this.featureTypeCounter=-1;this.readChildNodes(node,obj);var style;if(this.multipleSymbolizers){delete obj.defaultsPerSymbolizer;style=new OpenLayers.Style2(obj);}else{style=new OpenLayers.Style(this.defaultSymbolizer,obj);}
61682 layer.userStyles.push(style);},"IsDefault":function(node,style){if(this.getChildValue(node)=="1"){style.isDefault=true;}},"FeatureTypeStyle":function(node,style){++this.featureTypeCounter;var obj={rules:this.multipleSymbolizers?style.rules:[]};this.readChildNodes(node,obj);if(!this.multipleSymbolizers){style.rules=obj.rules;}},"Rule":function(node,obj){var config;if(this.multipleSymbolizers){config={symbolizers:[]};}
61683 var rule=new OpenLayers.Rule(config);this.readChildNodes(node,rule);obj.rules.push(rule);},"ElseFilter":function(node,rule){rule.elseFilter=true;},"MinScaleDenominator":function(node,rule){rule.minScaleDenominator=parseFloat(this.getChildValue(node));},"MaxScaleDenominator":function(node,rule){rule.maxScaleDenominator=parseFloat(this.getChildValue(node));},"TextSymbolizer":function(node,rule){var config={};this.readChildNodes(node,config);if(this.multipleSymbolizers){config.zIndex=this.featureTypeCounter;rule.symbolizers.push(new OpenLayers.Symbolizer.Text(config));}else{rule.symbolizer["Text"]=OpenLayers.Util.applyDefaults(config,rule.symbolizer["Text"]);}},"Label":function(node,symbolizer){var obj={};this.readChildNodes(node,obj);if(obj.property){symbolizer.label="${"+obj.property+"}";}else{var value=this.readOgcExpression(node);if(value){symbolizer.label=value;}}},"Font":function(node,symbolizer){this.readChildNodes(node,symbolizer);},"Halo":function(node,symbolizer){var obj={};this.readChildNodes(node,obj);symbolizer.haloRadius=obj.haloRadius;symbolizer.haloColor=obj.fillColor;symbolizer.haloOpacity=obj.fillOpacity;},"Radius":function(node,symbolizer){var radius=this.readOgcExpression(node);if(radius!=null){symbolizer.haloRadius=radius;}},"RasterSymbolizer":function(node,rule){var config={};this.readChildNodes(node,config);if(this.multipleSymbolizers){config.zIndex=this.featureTypeCounter;rule.symbolizers.push(new OpenLayers.Symbolizer.Raster(config));}else{rule.symbolizer["Raster"]=OpenLayers.Util.applyDefaults(config,rule.symbolizer["Raster"]);}},"Geometry":function(node,obj){obj.geometry={};this.readChildNodes(node,obj.geometry);},"ColorMap":function(node,symbolizer){symbolizer.colorMap=[];this.readChildNodes(node,symbolizer.colorMap);},"ColorMapEntry":function(node,colorMap){var q=node.getAttribute("quantity");var o=node.getAttribute("opacity");colorMap.push({color:node.getAttribute("color"),quantity:q!==null?parseFloat(q):undefined,label:node.getAttribute("label")||undefined,opacity:o!==null?parseFloat(o):undefined});},"LineSymbolizer":function(node,rule){var config={};this.readChildNodes(node,config);if(this.multipleSymbolizers){config.zIndex=this.featureTypeCounter;rule.symbolizers.push(new OpenLayers.Symbolizer.Line(config));}else{rule.symbolizer["Line"]=OpenLayers.Util.applyDefaults(config,rule.symbolizer["Line"]);}},"PolygonSymbolizer":function(node,rule){var config={fill:false,stroke:false};if(!this.multipleSymbolizers){config=rule.symbolizer["Polygon"]||config;}
61684 this.readChildNodes(node,config);if(this.multipleSymbolizers){config.zIndex=this.featureTypeCounter;rule.symbolizers.push(new OpenLayers.Symbolizer.Polygon(config));}else{rule.symbolizer["Polygon"]=config;}},"PointSymbolizer":function(node,rule){var config={fill:false,stroke:false,graphic:false};if(!this.multipleSymbolizers){config=rule.symbolizer["Point"]||config;}
61685 this.readChildNodes(node,config);if(this.multipleSymbolizers){config.zIndex=this.featureTypeCounter;rule.symbolizers.push(new OpenLayers.Symbolizer.Point(config));}else{rule.symbolizer["Point"]=config;}},"Stroke":function(node,symbolizer){symbolizer.stroke=true;this.readChildNodes(node,symbolizer);},"Fill":function(node,symbolizer){symbolizer.fill=true;this.readChildNodes(node,symbolizer);},"CssParameter":function(node,symbolizer){var cssProperty=node.getAttribute("name");var symProperty=this.cssMap[cssProperty];if(symProperty){var value=this.readOgcExpression(node);if(value){symbolizer[symProperty]=value;}}},"Graphic":function(node,symbolizer){symbolizer.graphic=true;var graphic={};this.readChildNodes(node,graphic);var properties=["stroke","strokeColor","strokeWidth","strokeOpacity","strokeLinecap","fill","fillColor","fillOpacity","graphicName","rotation","graphicFormat"];var prop,value;for(var i=0,len=properties.length;i<len;++i){prop=properties[i];value=graphic[prop];if(value!=undefined){symbolizer[prop]=value;}}
61686 if(graphic.opacity!=undefined){symbolizer.graphicOpacity=graphic.opacity;}
61687 if(graphic.size!=undefined){symbolizer.pointRadius=graphic.size/2;}
61688 if(graphic.href!=undefined){symbolizer.externalGraphic=graphic.href;}
61689 if(graphic.rotation!=undefined){symbolizer.rotation=graphic.rotation;}},"ExternalGraphic":function(node,graphic){this.readChildNodes(node,graphic);},"Mark":function(node,graphic){this.readChildNodes(node,graphic);},"WellKnownName":function(node,graphic){graphic.graphicName=this.getChildValue(node);},"Opacity":function(node,obj){var opacity=this.readOgcExpression(node);if(opacity){obj.opacity=opacity;}},"Size":function(node,obj){var size=this.readOgcExpression(node);if(size){obj.size=size;}},"Rotation":function(node,obj){var rotation=this.readOgcExpression(node);if(rotation){obj.rotation=rotation;}},"OnlineResource":function(node,obj){obj.href=this.getAttributeNS(node,this.namespaces.xlink,"href");},"Format":function(node,graphic){graphic.graphicFormat=this.getChildValue(node);}}},OpenLayers.Format.Filter.v1_0_0.prototype.readers),cssMap:{"stroke":"strokeColor","stroke-opacity":"strokeOpacity","stroke-width":"strokeWidth","stroke-linecap":"strokeLinecap","stroke-dasharray":"strokeDashstyle","fill":"fillColor","fill-opacity":"fillOpacity","font-family":"fontFamily","font-size":"fontSize","font-weight":"fontWeight","font-style":"fontStyle"},getCssProperty:function(sym){var css=null;for(var prop in this.cssMap){if(this.cssMap[prop]==sym){css=prop;break;}}
61690 return css;},getGraphicFormat:function(href){var format,regex;for(var key in this.graphicFormats){if(this.graphicFormats[key].test(href)){format=key;break;}}
61691 return format||this.defautlGraphicFormat;},defaultGraphicFormat:"image/png",graphicFormats:{"image/jpeg":/\.jpe?g$/i,"image/gif":/\.gif$/i,"image/png":/\.png$/i},write:function(sld){return this.writers.sld.StyledLayerDescriptor.apply(this,[sld]);},writers:OpenLayers.Util.applyDefaults({"sld":{"StyledLayerDescriptor":function(sld){var root=this.createElementNSPlus("sld:StyledLayerDescriptor",{attributes:{"version":this.VERSION,"xsi:schemaLocation":this.schemaLocation}});root.setAttribute("xmlns:ogc",this.namespaces.ogc);root.setAttribute("xmlns:gml",this.namespaces.gml);if(sld.name){this.writeNode("Name",sld.name,root);}
61692 if(sld.title){this.writeNode("Title",sld.title,root);}
61693 if(sld.description){this.writeNode("Abstract",sld.description,root);}
61694 if(sld.namedLayers instanceof Array){for(var i=0,len=sld.namedLayers.length;i<len;++i){this.writeNode("NamedLayer",sld.namedLayers[i],root);}}else{for(var name in sld.namedLayers){this.writeNode("NamedLayer",sld.namedLayers[name],root);}}
61695 return root;},"Name":function(name){return this.createElementNSPlus("sld:Name",{value:name});},"Title":function(title){return this.createElementNSPlus("sld:Title",{value:title});},"Abstract":function(description){return this.createElementNSPlus("sld:Abstract",{value:description});},"NamedLayer":function(layer){var node=this.createElementNSPlus("sld:NamedLayer");this.writeNode("Name",layer.name,node);if(layer.namedStyles){for(var i=0,len=layer.namedStyles.length;i<len;++i){this.writeNode("NamedStyle",layer.namedStyles[i],node);}}
61696 if(layer.userStyles){for(var i=0,len=layer.userStyles.length;i<len;++i){this.writeNode("UserStyle",layer.userStyles[i],node);}}
61697 return node;},"NamedStyle":function(name){var node=this.createElementNSPlus("sld:NamedStyle");this.writeNode("Name",name,node);return node;},"UserStyle":function(style){var node=this.createElementNSPlus("sld:UserStyle");if(style.name){this.writeNode("Name",style.name,node);}
61698 if(style.title){this.writeNode("Title",style.title,node);}
61699 if(style.description){this.writeNode("Abstract",style.description,node);}
61700 if(style.isDefault){this.writeNode("IsDefault",style.isDefault,node);}
61701 if(this.multipleSymbolizers&&style.rules){var rulesByZ={0:[]};var zValues=[0];var rule,ruleMap,symbolizer,zIndex,clone;for(var i=0,ii=style.rules.length;i<ii;++i){rule=style.rules[i];if(rule.symbolizers){ruleMap={};for(var j=0,jj=rule.symbolizers.length;j<jj;++j){symbolizer=rule.symbolizers[j];zIndex=symbolizer.zIndex;if(!(zIndex in ruleMap)){clone=rule.clone();clone.symbolizers=[];ruleMap[zIndex]=clone;}
61702 ruleMap[zIndex].symbolizers.push(symbolizer.clone());}
61703 for(zIndex in ruleMap){if(!(zIndex in rulesByZ)){zValues.push(zIndex);rulesByZ[zIndex]=[];}
61704 rulesByZ[zIndex].push(ruleMap[zIndex]);}}else{rulesByZ[0].push(rule.clone());}}
61705 zValues.sort();var rules;for(var i=0,ii=zValues.length;i<ii;++i){rules=rulesByZ[zValues[i]];if(rules.length>0){clone=style.clone();clone.rules=rulesByZ[zValues[i]];this.writeNode("FeatureTypeStyle",clone,node);}}}else{this.writeNode("FeatureTypeStyle",style,node);}
61706 return node;},"IsDefault":function(bool){return this.createElementNSPlus("sld:IsDefault",{value:(bool)?"1":"0"});},"FeatureTypeStyle":function(style){var node=this.createElementNSPlus("sld:FeatureTypeStyle");for(var i=0,len=style.rules.length;i<len;++i){this.writeNode("Rule",style.rules[i],node);}
61707 return node;},"Rule":function(rule){var node=this.createElementNSPlus("sld:Rule");if(rule.name){this.writeNode("Name",rule.name,node);}
61708 if(rule.title){this.writeNode("Title",rule.title,node);}
61709 if(rule.description){this.writeNode("Abstract",rule.description,node);}
61710 if(rule.elseFilter){this.writeNode("ElseFilter",null,node);}else if(rule.filter){this.writeNode("ogc:Filter",rule.filter,node);}
61711 if(rule.minScaleDenominator!=undefined){this.writeNode("MinScaleDenominator",rule.minScaleDenominator,node);}
61712 if(rule.maxScaleDenominator!=undefined){this.writeNode("MaxScaleDenominator",rule.maxScaleDenominator,node);}
61713 var type,symbolizer;if(this.multipleSymbolizers&&rule.symbolizers){var symbolizer;for(var i=0,ii=rule.symbolizers.length;i<ii;++i){symbolizer=rule.symbolizers[i];type=symbolizer.CLASS_NAME.split(".").pop();this.writeNode(type+"Symbolizer",symbolizer,node);}}else{var types=OpenLayers.Style.SYMBOLIZER_PREFIXES;for(var i=0,len=types.length;i<len;++i){type=types[i];symbolizer=rule.symbolizer[type];if(symbolizer){this.writeNode(type+"Symbolizer",symbolizer,node);}}}
61714 return node;},"ElseFilter":function(){return this.createElementNSPlus("sld:ElseFilter");},"MinScaleDenominator":function(scale){return this.createElementNSPlus("sld:MinScaleDenominator",{value:scale});},"MaxScaleDenominator":function(scale){return this.createElementNSPlus("sld:MaxScaleDenominator",{value:scale});},"LineSymbolizer":function(symbolizer){var node=this.createElementNSPlus("sld:LineSymbolizer");this.writeNode("Stroke",symbolizer,node);return node;},"Stroke":function(symbolizer){var node=this.createElementNSPlus("sld:Stroke");if(symbolizer.strokeColor!=undefined){this.writeNode("CssParameter",{symbolizer:symbolizer,key:"strokeColor"},node);}
61715 if(symbolizer.strokeOpacity!=undefined){this.writeNode("CssParameter",{symbolizer:symbolizer,key:"strokeOpacity"},node);}
61716 if(symbolizer.strokeWidth!=undefined){this.writeNode("CssParameter",{symbolizer:symbolizer,key:"strokeWidth"},node);}
61717 if(symbolizer.strokeDashstyle!=undefined&&symbolizer.strokeDashstyle!=="solid"){this.writeNode("CssParameter",{symbolizer:symbolizer,key:"strokeDashstyle"},node);}
61718 if(symbolizer.strokeLinecap!=undefined){this.writeNode("CssParameter",{symbolizer:symbolizer,key:"strokeLinecap"},node);}
61719 return node;},"CssParameter":function(obj){return this.createElementNSPlus("sld:CssParameter",{attributes:{name:this.getCssProperty(obj.key)},value:obj.symbolizer[obj.key]});},"TextSymbolizer":function(symbolizer){var node=this.createElementNSPlus("sld:TextSymbolizer");if(symbolizer.label!=null){this.writeNode("Label",symbolizer.label,node);}
61720 if(symbolizer.fontFamily!=null||symbolizer.fontSize!=null||symbolizer.fontWeight!=null||symbolizer.fontStyle!=null){this.writeNode("Font",symbolizer,node);}
61721 if(symbolizer.haloRadius!=null||symbolizer.haloColor!=null||symbolizer.haloOpacity!=null){this.writeNode("Halo",symbolizer,node);}
61722 if(symbolizer.fillColor!=null||symbolizer.fillOpacity!=null){this.writeNode("Fill",symbolizer,node);}
61723 return node;},"Font":function(symbolizer){var node=this.createElementNSPlus("sld:Font");if(symbolizer.fontFamily){this.writeNode("CssParameter",{symbolizer:symbolizer,key:"fontFamily"},node);}
61724 if(symbolizer.fontSize){this.writeNode("CssParameter",{symbolizer:symbolizer,key:"fontSize"},node);}
61725 if(symbolizer.fontWeight){this.writeNode("CssParameter",{symbolizer:symbolizer,key:"fontWeight"},node);}
61726 if(symbolizer.fontStyle){this.writeNode("CssParameter",{symbolizer:symbolizer,key:"fontStyle"},node);}
61727 return node;},"Label":function(label){var node=this.createElementNSPlus("sld:Label");var tokens=label.split("${");node.appendChild(this.createTextNode(tokens[0]));var item,last;for(var i=1,len=tokens.length;i<len;i++){item=tokens[i];last=item.indexOf("}");if(last>0){this.writeNode("ogc:PropertyName",{property:item.substring(0,last)},node);node.appendChild(this.createTextNode(item.substring(++last)));}else{node.appendChild(this.createTextNode("${"+item));}}
61728 return node;},"Halo":function(symbolizer){var node=this.createElementNSPlus("sld:Halo");if(symbolizer.haloRadius){this.writeNode("Radius",symbolizer.haloRadius,node);}
61729 if(symbolizer.haloColor||symbolizer.haloOpacity){this.writeNode("Fill",{fillColor:symbolizer.haloColor,fillOpacity:symbolizer.haloOpacity},node);}
61730 return node;},"Radius":function(value){return this.createElementNSPlus("sld:Radius",{value:value});},"RasterSymbolizer":function(symbolizer){var node=this.createElementNSPlus("sld:RasterSymbolizer");if(symbolizer.geometry){this.writeNode("Geometry",symbolizer.geometry,node);}
61731 if(symbolizer.opacity){this.writeNode("Opacity",symbolizer.opacity,node);}
61732 if(symbolizer.colorMap){this.writeNode("ColorMap",symbolizer.colorMap,node);}
61733 return node;},"Geometry":function(geometry){var node=this.createElementNSPlus("sld:Geometry");if(geometry.property){this.writeNode("ogc:PropertyName",geometry,node);}
61734 return node;},"ColorMap":function(colorMap){var node=this.createElementNSPlus("sld:ColorMap");for(var i=0,len=colorMap.length;i<len;++i){this.writeNode("ColorMapEntry",colorMap[i],node);}
61735 return node;},"ColorMapEntry":function(colorMapEntry){var node=this.createElementNSPlus("sld:ColorMapEntry");var a=colorMapEntry;node.setAttribute("color",a.color);a.opacity!==undefined&&node.setAttribute("opacity",parseFloat(a.opacity));a.quantity!==undefined&&node.setAttribute("quantity",parseFloat(a.quantity));a.label!==undefined&&node.setAttribute("label",a.label);return node;},"PolygonSymbolizer":function(symbolizer){var node=this.createElementNSPlus("sld:PolygonSymbolizer");if(symbolizer.fill!==false){this.writeNode("Fill",symbolizer,node);}
61736 if(symbolizer.stroke!==false){this.writeNode("Stroke",symbolizer,node);}
61737 return node;},"Fill":function(symbolizer){var node=this.createElementNSPlus("sld:Fill");if(symbolizer.fillColor){this.writeNode("CssParameter",{symbolizer:symbolizer,key:"fillColor"},node);}
61738 if(symbolizer.fillOpacity!=null){this.writeNode("CssParameter",{symbolizer:symbolizer,key:"fillOpacity"},node);}
61739 return node;},"PointSymbolizer":function(symbolizer){var node=this.createElementNSPlus("sld:PointSymbolizer");this.writeNode("Graphic",symbolizer,node);return node;},"Graphic":function(symbolizer){var node=this.createElementNSPlus("sld:Graphic");if(symbolizer.externalGraphic!=undefined){this.writeNode("ExternalGraphic",symbolizer,node);}else{this.writeNode("Mark",symbolizer,node);}
61740 if(symbolizer.graphicOpacity!=undefined){this.writeNode("Opacity",symbolizer.graphicOpacity,node);}
61741 if(symbolizer.pointRadius!=undefined){this.writeNode("Size",symbolizer.pointRadius*2,node);}
61742 if(symbolizer.rotation!=undefined){this.writeNode("Rotation",symbolizer.rotation,node);}
61743 return node;},"ExternalGraphic":function(symbolizer){var node=this.createElementNSPlus("sld:ExternalGraphic");this.writeNode("OnlineResource",symbolizer.externalGraphic,node);var format=symbolizer.graphicFormat||this.getGraphicFormat(symbolizer.externalGraphic);this.writeNode("Format",format,node);return node;},"Mark":function(symbolizer){var node=this.createElementNSPlus("sld:Mark");if(symbolizer.graphicName){this.writeNode("WellKnownName",symbolizer.graphicName,node);}
61744 if(symbolizer.fill!==false){this.writeNode("Fill",symbolizer,node);}
61745 if(symbolizer.stroke!==false){this.writeNode("Stroke",symbolizer,node);}
61746 return node;},"WellKnownName":function(name){return this.createElementNSPlus("sld:WellKnownName",{value:name});},"Opacity":function(value){return this.createElementNSPlus("sld:Opacity",{value:value});},"Size":function(value){return this.createElementNSPlus("sld:Size",{value:value});},"Rotation":function(value){return this.createElementNSPlus("sld:Rotation",{value:value});},"OnlineResource":function(href){return this.createElementNSPlus("sld:OnlineResource",{attributes:{"xlink:type":"simple","xlink:href":href}});},"Format":function(format){return this.createElementNSPlus("sld:Format",{value:format});}}},OpenLayers.Format.Filter.v1_0_0.prototype.writers),CLASS_NAME:"OpenLayers.Format.SLD.v1"});OpenLayers.Format.WFST.v1_0_0=OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0,OpenLayers.Format.WFST.v1,{version:"1.0.0",srsNameInQuery:false,schemaLocations:{"wfs":"http://schemas.opengis.net/wfs/1.0.0/WFS-transaction.xsd"},initialize:function(options){OpenLayers.Format.Filter.v1_0_0.prototype.initialize.apply(this,[options]);OpenLayers.Format.WFST.v1.prototype.initialize.apply(this,[options]);},readers:{"wfs":OpenLayers.Util.applyDefaults({"WFS_TransactionResponse":function(node,obj){obj.insertIds=[];obj.success=false;this.readChildNodes(node,obj);},"InsertResult":function(node,container){var obj={fids:[]};this.readChildNodes(node,obj);container.insertIds.push(obj.fids[0]);},"TransactionResult":function(node,obj){this.readChildNodes(node,obj);},"Status":function(node,obj){this.readChildNodes(node,obj);},"SUCCESS":function(node,obj){obj.success=true;}},OpenLayers.Format.WFST.v1.prototype.readers["wfs"]),"gml":OpenLayers.Format.GML.v2.prototype.readers["gml"],"feature":OpenLayers.Format.GML.v2.prototype.readers["feature"],"ogc":OpenLayers.Format.Filter.v1_0_0.prototype.readers["ogc"]},writers:{"wfs":OpenLayers.Util.applyDefaults({"Query":function(options){options=OpenLayers.Util.extend({featureNS:this.featureNS,featurePrefix:this.featurePrefix,featureType:this.featureType,srsName:this.srsName,srsNameInQuery:this.srsNameInQuery},options);var node=this.createElementNSPlus("wfs:Query",{attributes:{typeName:(options.featureNS?options.featurePrefix+":":"")+
61747 options.featureType}});if(options.srsNameInQuery&&options.srsName){node.setAttribute("srsName",options.srsName);}
61748 if(options.featureNS){node.setAttribute("xmlns:"+options.featurePrefix,options.featureNS);}
61749 if(options.propertyNames){for(var i=0,len=options.propertyNames.length;i<len;i++){this.writeNode("ogc:PropertyName",{property:options.propertyNames[i]},node);}}
61750 if(options.filter){this.setFilterProperty(options.filter);this.writeNode("ogc:Filter",options.filter,node);}
61751 return node;}},OpenLayers.Format.WFST.v1.prototype.writers["wfs"]),"gml":OpenLayers.Format.GML.v2.prototype.writers["gml"],"feature":OpenLayers.Format.GML.v2.prototype.writers["feature"],"ogc":OpenLayers.Format.Filter.v1_0_0.prototype.writers["ogc"]},CLASS_NAME:"OpenLayers.Format.WFST.v1_0_0"});OpenLayers.Format.WFST.v1_1_0=OpenLayers.Class(OpenLayers.Format.Filter.v1_1_0,OpenLayers.Format.WFST.v1,{version:"1.1.0",schemaLocations:{"wfs":"http://schemas.opengis.net/wfs/1.1.0/wfs.xsd"},initialize:function(options){OpenLayers.Format.Filter.v1_1_0.prototype.initialize.apply(this,[options]);OpenLayers.Format.WFST.v1.prototype.initialize.apply(this,[options]);},readers:{"wfs":OpenLayers.Util.applyDefaults({"FeatureCollection":function(node,obj){obj.numberOfFeatures=parseInt(node.getAttribute("numberOfFeatures"));OpenLayers.Format.WFST.v1.prototype.readers["wfs"]["FeatureCollection"].apply(this,arguments);},"TransactionResponse":function(node,obj){obj.insertIds=[];obj.success=false;this.readChildNodes(node,obj);},"TransactionSummary":function(node,obj){obj.success=true;},"InsertResults":function(node,obj){this.readChildNodes(node,obj);},"Feature":function(node,container){var obj={fids:[]};this.readChildNodes(node,obj);container.insertIds.push(obj.fids[0]);}},OpenLayers.Format.WFST.v1.prototype.readers["wfs"]),"gml":OpenLayers.Format.GML.v3.prototype.readers["gml"],"feature":OpenLayers.Format.GML.v3.prototype.readers["feature"],"ogc":OpenLayers.Format.Filter.v1_1_0.prototype.readers["ogc"]},writers:{"wfs":OpenLayers.Util.applyDefaults({"GetFeature":function(options){var node=OpenLayers.Format.WFST.v1.prototype.writers["wfs"]["GetFeature"].apply(this,arguments);options&&options.resultType&&this.setAttributes(node,{resultType:options.resultType});return node;},"Query":function(options){options=OpenLayers.Util.extend({featureNS:this.featureNS,featurePrefix:this.featurePrefix,featureType:this.featureType,srsName:this.srsName},options);var node=this.createElementNSPlus("wfs:Query",{attributes:{typeName:(options.featureNS?options.featurePrefix+":":"")+
61752 options.featureType,srsName:options.srsName}});if(options.featureNS){node.setAttribute("xmlns:"+options.featurePrefix,options.featureNS);}
61753 if(options.propertyNames){for(var i=0,len=options.propertyNames.length;i<len;i++){this.writeNode("wfs:PropertyName",{property:options.propertyNames[i]},node);}}
61754 if(options.filter){this.setFilterProperty(options.filter);this.writeNode("ogc:Filter",options.filter,node);}
61755 return node;},"PropertyName":function(obj){return this.createElementNSPlus("wfs:PropertyName",{value:obj.property});}},OpenLayers.Format.WFST.v1.prototype.writers["wfs"]),"gml":OpenLayers.Format.GML.v3.prototype.writers["gml"],"feature":OpenLayers.Format.GML.v3.prototype.writers["feature"],"ogc":OpenLayers.Format.Filter.v1_1_0.prototype.writers["ogc"]},CLASS_NAME:"OpenLayers.Format.WFST.v1_1_0"});OpenLayers.Protocol.SOS.v1_0_0=OpenLayers.Class(OpenLayers.Protocol,{fois:null,formatOptions:null,initialize:function(options){OpenLayers.Protocol.prototype.initialize.apply(this,[options]);if(!options.format){this.format=new OpenLayers.Format.SOSGetFeatureOfInterest(this.formatOptions);}},destroy:function(){if(this.options&&!this.options.format){this.format.destroy();}
61756 this.format=null;OpenLayers.Protocol.prototype.destroy.apply(this);},read:function(options){options=OpenLayers.Util.extend({},options);OpenLayers.Util.applyDefaults(options,this.options||{});var response=new OpenLayers.Protocol.Response({requestType:"read"});var format=this.format;var data=OpenLayers.Format.XML.prototype.write.apply(format,[format.writeNode("sos:GetFeatureOfInterest",{fois:this.fois})]);response.priv=OpenLayers.Request.POST({url:options.url,callback:this.createCallback(this.handleRead,response,options),data:data});return response;},handleRead:function(response,options){if(options.callback){var request=response.priv;if(request.status>=200&&request.status<300){response.features=this.parseFeatures(request);response.code=OpenLayers.Protocol.Response.SUCCESS;}else{response.code=OpenLayers.Protocol.Response.FAILURE;}
61757 options.callback.call(options.scope,response);}},parseFeatures:function(request){var doc=request.responseXML;if(!doc||!doc.documentElement){doc=request.responseText;}
61758 if(!doc||doc.length<=0){return null;}
61759 return this.format.read(doc);},CLASS_NAME:"OpenLayers.Protocol.SOS.v1_0_0"});OpenLayers.Format.SLD.v1_0_0=OpenLayers.Class(OpenLayers.Format.SLD.v1,{VERSION:"1.0.0",schemaLocation:"http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd",initialize:function(options){OpenLayers.Format.SLD.v1.prototype.initialize.apply(this,[options]);},CLASS_NAME:"OpenLayers.Format.SLD.v1_0_0"});OpenLayers.Protocol.WFS.v1_0_0=OpenLayers.Class(OpenLayers.Protocol.WFS.v1,{version:"1.0.0",CLASS_NAME:"OpenLayers.Protocol.WFS.v1_0_0"});OpenLayers.Protocol.WFS.v1_1_0=OpenLayers.Class(OpenLayers.Protocol.WFS.v1,{version:"1.1.0",CLASS_NAME:"OpenLayers.Protocol.WFS.v1_1_0"});OpenLayers.Format.OWSContext.v0_3_1=OpenLayers.Class(OpenLayers.Format.XML,{namespaces:{owc:"http://www.opengis.net/ows-context",gml:"http://www.opengis.net/gml",kml:"http://www.opengis.net/kml/2.2",ogc:"http://www.opengis.net/ogc",ows:"http://www.opengis.net/ows",sld:"http://www.opengis.net/sld",xlink:"http://www.w3.org/1999/xlink",xsi:"http://www.w3.org/2001/XMLSchema-instance"},VERSION:"0.3.1",schemaLocation:"http://www.opengis.net/ows-context http://www.ogcnetwork.net/schemas/owc/0.3.1/owsContext.xsd",defaultPrefix:"owc",extractAttributes:true,xy:true,regExes:{trimSpace:(/^\s*|\s*$/g),removeSpace:(/\s*/g),splitSpace:(/\s+/),trimComma:(/\s*,\s*/g)},featureNS:"http://mapserver.gis.umn.edu/mapserver",featureType:'vector',geometryName:'geometry',nestingLayerLookup:null,initialize:function(options){OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);OpenLayers.Format.GML.v2.prototype.setGeometryTypes.call(this);},setNestingPath:function(l){if(l.layersContext){for(var i=0,len=l.layersContext.length;i<len;i++){var layerContext=l.layersContext[i];var nPath=[];var nTitle=l.title||"";if(l.metadata&&l.metadata.nestingPath){nPath=l.metadata.nestingPath.slice();}
61760 if(nTitle!=""){nPath.push(nTitle);}
61761 layerContext.metadata.nestingPath=nPath;if(layerContext.layersContext){this.setNestingPath(layerContext);}}}},decomposeNestingPath:function(nPath){var a=[];if(nPath instanceof Array){while(nPath.length>0){a.push(nPath.slice());nPath.pop();}
61762 a.reverse();}
61763 return a;},read:function(data){if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);}
61764 if(data&&data.nodeType==9){data=data.documentElement;}
61765 var context={};this.readNode(data,context);this.setNestingPath({layersContext:context.layersContext});var layers=[];this.processLayer(layers,context);delete context.layersContext;context.layersContext=layers;return context;},processLayer:function(layerArray,layer){if(layer.layersContext){for(var i=0,len=layer.layersContext.length;i<len;i++){var l=layer.layersContext[i];layerArray.push(l);if(l.layersContext){this.processLayer(layerArray,l);}}}},write:function(context,options){var name="OWSContext";this.nestingLayerLookup={};options=options||{};OpenLayers.Util.applyDefaults(options,context);var root=this.writeNode(name,options);this.nestingLayerLookup=null;this.setAttributeNS(root,this.namespaces["xsi"],"xsi:schemaLocation",this.schemaLocation);return OpenLayers.Format.XML.prototype.write.apply(this,[root]);},readers:{"kml":{"Document":function(node,obj){obj.features=new OpenLayers.Format.KML({kmlns:this.namespaces.kml,extractStyles:true}).read(node);}},"owc":{"OWSContext":function(node,obj){this.readChildNodes(node,obj);},"General":function(node,obj){this.readChildNodes(node,obj);},"ResourceList":function(node,obj){this.readChildNodes(node,obj);},"Layer":function(node,obj){var layerContext={metadata:{},visibility:(node.getAttribute("hidden")!="1"),queryable:(node.getAttribute("queryable")=="1"),opacity:((node.getAttribute("opacity")!=null)?parseFloat(node.getAttribute("opacity")):null),name:node.getAttribute("name"),categoryLayer:(node.getAttribute("name")==null),formats:[],styles:[]};if(!obj.layersContext){obj.layersContext=[];}
61766 obj.layersContext.push(layerContext);this.readChildNodes(node,layerContext);},"InlineGeometry":function(node,obj){obj.features=[];var elements=this.getElementsByTagNameNS(node,this.namespaces.gml,"featureMember");var el;if(elements.length>=1){el=elements[0];}
61767 if(el&&el.firstChild){var featurenode=(el.firstChild.nextSibling)?el.firstChild.nextSibling:el.firstChild;this.setNamespace("feature",featurenode.namespaceURI);this.featureType=featurenode.localName||featurenode.nodeName.split(":").pop();this.readChildNodes(node,obj);}},"Server":function(node,obj){if((!obj.service&&!obj.version)||(obj.service!=OpenLayers.Format.Context.serviceTypes.WMS)){obj.service=node.getAttribute("service");obj.version=node.getAttribute("version");this.readChildNodes(node,obj);}},"Name":function(node,obj){obj.name=this.getChildValue(node);this.readChildNodes(node,obj);},"Title":function(node,obj){obj.title=this.getChildValue(node);this.readChildNodes(node,obj);},"StyleList":function(node,obj){this.readChildNodes(node,obj.styles);},"Style":function(node,obj){var style={};obj.push(style);this.readChildNodes(node,style);},"LegendURL":function(node,obj){var legend={};obj.legend=legend;this.readChildNodes(node,legend);},"OnlineResource":function(node,obj){obj.url=this.getAttributeNS(node,this.namespaces.xlink,"href");this.readChildNodes(node,obj);}},"ows":OpenLayers.Format.OWSCommon.v1_0_0.prototype.readers.ows,"gml":OpenLayers.Format.GML.v2.prototype.readers.gml,"sld":OpenLayers.Format.SLD.v1_0_0.prototype.readers.sld,"feature":OpenLayers.Format.GML.v2.prototype.readers.feature},writers:{"owc":{"OWSContext":function(options){var node=this.createElementNSPlus("OWSContext",{attributes:{version:this.VERSION,id:options.id||OpenLayers.Util.createUniqueID("OpenLayers_OWSContext_")}});this.writeNode("General",options,node);this.writeNode("ResourceList",options,node);return node;},"General":function(options){var node=this.createElementNSPlus("General");this.writeNode("ows:BoundingBox",options,node);this.writeNode("ows:Title",options.title||'OpenLayers OWSContext',node);return node;},"ResourceList":function(options){var node=this.createElementNSPlus("ResourceList");for(var i=0,len=options.layers.length;i<len;i++){var layer=options.layers[i];var decomposedPath=this.decomposeNestingPath(layer.metadata.nestingPath);this.writeNode("_Layer",{layer:layer,subPaths:decomposedPath},node);}
61768 return node;},"Server":function(options){var node=this.createElementNSPlus("Server",{attributes:{version:options.version,service:options.service}});this.writeNode("OnlineResource",options,node);return node;},"OnlineResource":function(options){var node=this.createElementNSPlus("OnlineResource",{attributes:{"xlink:href":options.url}});return node;},"InlineGeometry":function(layer){var node=this.createElementNSPlus("InlineGeometry");this.writeNode("gml:boundedBy",layer.getDataExtent(),node);for(var i=0,len=layer.features.length;i<len;i++){this.writeNode("gml:featureMember",layer.features[i],node);}
61769 return node;},"StyleList":function(styles){var node=this.createElementNSPlus("StyleList");for(var i=0,len=styles.length;i<len;i++){this.writeNode("Style",styles[i],node);}
61770 return node;},"Style":function(style){var node=this.createElementNSPlus("Style");this.writeNode("Name",style,node);this.writeNode("Title",style,node);this.writeNode("LegendURL",style,node);return node;},"Name":function(obj){var node=this.createElementNSPlus("Name",{value:obj.name});return node;},"Title":function(obj){var node=this.createElementNSPlus("Title",{value:obj.title});return node;},"LegendURL":function(style){var node=this.createElementNSPlus("LegendURL");this.writeNode("OnlineResource",style.legend,node);return node;},"_WMS":function(layer){var node=this.createElementNSPlus("Layer",{attributes:{name:layer.params.LAYERS,queryable:layer.queryable?"1":"0",hidden:layer.visibility?"0":"1",opacity:layer.opacity?layer.opacity:null}});this.writeNode("ows:Title",layer.name,node);this.writeNode("ows:OutputFormat",layer.params.FORMAT,node);this.writeNode("Server",{service:OpenLayers.Format.Context.serviceTypes.WMS,version:layer.params.VERSION,url:layer.url},node);if(layer.metadata.styles&&layer.metadata.styles.length>0){this.writeNode("StyleList",layer.metadata.styles,node);}
61771 return node;},"_Layer":function(options){var layer,subPaths,node,title;layer=options.layer;subPaths=options.subPaths;node=null;title=null;if(subPaths.length>0){var path=subPaths[0].join("/");var index=path.lastIndexOf("/");node=this.nestingLayerLookup[path];title=(index>0)?path.substring(index+1,path.length):path;if(!node){node=this.createElementNSPlus("Layer");this.writeNode("ows:Title",title,node);this.nestingLayerLookup[path]=node;}
61772 options.subPaths.shift();this.writeNode("_Layer",options,node);return node;}else{if(layer instanceof OpenLayers.Layer.WMS){node=this.writeNode("_WMS",layer);}else if(layer instanceof OpenLayers.Layer.Vector){if(layer.protocol instanceof OpenLayers.Protocol.WFS.v1){node=this.writeNode("_WFS",layer);}else if(layer.protocol instanceof OpenLayers.Protocol.HTTP){if(layer.protocol.format instanceof OpenLayers.Format.GML){layer.protocol.format.version="2.1.2";node=this.writeNode("_GML",layer);}else if(layer.protocol.format instanceof OpenLayers.Format.KML){layer.protocol.format.version="2.2";node=this.writeNode("_KML",layer);}}else{this.setNamespace("feature",this.featureNS);node=this.writeNode("_InlineGeometry",layer);}}
61773 if(layer.options.maxScale){this.writeNode("sld:MinScaleDenominator",layer.options.maxScale,node);}
61774 if(layer.options.minScale){this.writeNode("sld:MaxScaleDenominator",layer.options.minScale,node);}
61775 this.nestingLayerLookup[layer.name]=node;return node;}},"_WFS":function(layer){var node=this.createElementNSPlus("Layer",{attributes:{name:layer.protocol.featurePrefix+":"+layer.protocol.featureType,hidden:layer.visibility?"0":"1"}});this.writeNode("ows:Title",layer.name,node);this.writeNode("Server",{service:OpenLayers.Format.Context.serviceTypes.WFS,version:layer.protocol.version,url:layer.protocol.url},node);return node;},"_InlineGeometry":function(layer){var node=this.createElementNSPlus("Layer",{attributes:{name:this.featureType,hidden:layer.visibility?"0":"1"}});this.writeNode("ows:Title",layer.name,node);this.writeNode("InlineGeometry",layer,node);return node;},"_GML":function(layer){var node=this.createElementNSPlus("Layer");this.writeNode("ows:Title",layer.name,node);this.writeNode("Server",{service:OpenLayers.Format.Context.serviceTypes.GML,url:layer.protocol.url,version:layer.protocol.format.version},node);return node;},"_KML":function(layer){var node=this.createElementNSPlus("Layer");this.writeNode("ows:Title",layer.name,node);this.writeNode("Server",{service:OpenLayers.Format.Context.serviceTypes.KML,version:layer.protocol.format.version,url:layer.protocol.url},node);return node;}},"gml":OpenLayers.Util.applyDefaults({"boundedBy":function(bounds){var node=this.createElementNSPlus("gml:boundedBy");this.writeNode("gml:Box",bounds,node);return node;}},OpenLayers.Format.GML.v2.prototype.writers.gml),"ows":OpenLayers.Format.OWSCommon.v1_0_0.prototype.writers.ows,"sld":OpenLayers.Format.SLD.v1_0_0.prototype.writers.sld,"feature":OpenLayers.Format.GML.v2.prototype.writers.feature},CLASS_NAME:"OpenLayers.Format.OWSContext.v0_3_1"});
61776 (function(){var n=this,t=n._,r={},e=Array.prototype,u=Object.prototype,i=Function.prototype,a=e.push,o=e.slice,c=e.concat,l=u.toString,f=u.hasOwnProperty,s=e.forEach,p=e.map,h=e.reduce,v=e.reduceRight,d=e.filter,g=e.every,m=e.some,y=e.indexOf,b=e.lastIndexOf,x=Array.isArray,_=Object.keys,j=i.bind,w=function(n){return n instanceof w?n:this instanceof w?(this._wrapped=n,void 0):new w(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=w),exports._=w):n._=w,w.VERSION="1.4.4";var A=w.each=w.forEach=function(n,t,e){if(null!=n)if(s&&n.forEach===s)n.forEach(t,e);else if(n.length===+n.length){for(var u=0,i=n.length;i>u;u++)if(t.call(e,n[u],u,n)===r)return}else for(var a in n)if(w.has(n,a)&&t.call(e,n[a],a,n)===r)return};w.map=w.collect=function(n,t,r){var e=[];return null==n?e:p&&n.map===p?n.map(t,r):(A(n,function(n,u,i){e[e.length]=t.call(r,n,u,i)}),e)};var O="Reduce of empty array with no initial value";w.reduce=w.foldl=w.inject=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),h&&n.reduce===h)return e&&(t=w.bind(t,e)),u?n.reduce(t,r):n.reduce(t);if(A(n,function(n,i,a){u?r=t.call(e,r,n,i,a):(r=n,u=!0)}),!u)throw new TypeError(O);return r},w.reduceRight=w.foldr=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),v&&n.reduceRight===v)return e&&(t=w.bind(t,e)),u?n.reduceRight(t,r):n.reduceRight(t);var i=n.length;if(i!==+i){var a=w.keys(n);i=a.length}if(A(n,function(o,c,l){c=a?a[--i]:--i,u?r=t.call(e,r,n[c],c,l):(r=n[c],u=!0)}),!u)throw new TypeError(O);return r},w.find=w.detect=function(n,t,r){var e;return E(n,function(n,u,i){return t.call(r,n,u,i)?(e=n,!0):void 0}),e},w.filter=w.select=function(n,t,r){var e=[];return null==n?e:d&&n.filter===d?n.filter(t,r):(A(n,function(n,u,i){t.call(r,n,u,i)&&(e[e.length]=n)}),e)},w.reject=function(n,t,r){return w.filter(n,function(n,e,u){return!t.call(r,n,e,u)},r)},w.every=w.all=function(n,t,e){t||(t=w.identity);var u=!0;return null==n?u:g&&n.every===g?n.every(t,e):(A(n,function(n,i,a){return(u=u&&t.call(e,n,i,a))?void 0:r}),!!u)};var E=w.some=w.any=function(n,t,e){t||(t=w.identity);var u=!1;return null==n?u:m&&n.some===m?n.some(t,e):(A(n,function(n,i,a){return u||(u=t.call(e,n,i,a))?r:void 0}),!!u)};w.contains=w.include=function(n,t){return null==n?!1:y&&n.indexOf===y?n.indexOf(t)!=-1:E(n,function(n){return n===t})},w.invoke=function(n,t){var r=o.call(arguments,2),e=w.isFunction(t);return w.map(n,function(n){return(e?t:n[t]).apply(n,r)})},w.pluck=function(n,t){return w.map(n,function(n){return n[t]})},w.where=function(n,t,r){return w.isEmpty(t)?r?null:[]:w[r?"find":"filter"](n,function(n){for(var r in t)if(t[r]!==n[r])return!1;return!0})},w.findWhere=function(n,t){return w.where(n,t,!0)},w.max=function(n,t,r){if(!t&&w.isArray(n)&&n[0]===+n[0]&&65535>n.length)return Math.max.apply(Math,n);if(!t&&w.isEmpty(n))return-1/0;var e={computed:-1/0,value:-1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;a>=e.computed&&(e={value:n,computed:a})}),e.value},w.min=function(n,t,r){if(!t&&w.isArray(n)&&n[0]===+n[0]&&65535>n.length)return Math.min.apply(Math,n);if(!t&&w.isEmpty(n))return 1/0;var e={computed:1/0,value:1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;e.computed>a&&(e={value:n,computed:a})}),e.value},w.shuffle=function(n){var t,r=0,e=[];return A(n,function(n){t=w.random(r++),e[r-1]=e[t],e[t]=n}),e};var k=function(n){return w.isFunction(n)?n:function(t){return t[n]}};w.sortBy=function(n,t,r){var e=k(t);return w.pluck(w.map(n,function(n,t,u){return{value:n,index:t,criteria:e.call(r,n,t,u)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index<t.index?-1:1}),"value")};var F=function(n,t,r,e){var u={},i=k(t||w.identity);return A(n,function(t,a){var o=i.call(r,t,a,n);e(u,o,t)}),u};w.groupBy=function(n,t,r){return F(n,t,r,function(n,t,r){(w.has(n,t)?n[t]:n[t]=[]).push(r)})},w.countBy=function(n,t,r){return F(n,t,r,function(n,t){w.has(n,t)||(n[t]=0),n[t]++})},w.sortedIndex=function(n,t,r,e){r=null==r?w.identity:k(r);for(var u=r.call(e,t),i=0,a=n.length;a>i;){var o=i+a>>>1;u>r.call(e,n[o])?i=o+1:a=o}return i},w.toArray=function(n){return n?w.isArray(n)?o.call(n):n.length===+n.length?w.map(n,w.identity):w.values(n):[]},w.size=function(n){return null==n?0:n.length===+n.length?n.length:w.keys(n).length},w.first=w.head=w.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:o.call(n,0,t)},w.initial=function(n,t,r){return o.call(n,0,n.length-(null==t||r?1:t))},w.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:o.call(n,Math.max(n.length-t,0))},w.rest=w.tail=w.drop=function(n,t,r){return o.call(n,null==t||r?1:t)},w.compact=function(n){return w.filter(n,w.identity)};var R=function(n,t,r){return A(n,function(n){w.isArray(n)?t?a.apply(r,n):R(n,t,r):r.push(n)}),r};w.flatten=function(n,t){return R(n,t,[])},w.without=function(n){return w.difference(n,o.call(arguments,1))},w.uniq=w.unique=function(n,t,r,e){w.isFunction(t)&&(e=r,r=t,t=!1);var u=r?w.map(n,r,e):n,i=[],a=[];return A(u,function(r,e){(t?e&&a[a.length-1]===r:w.contains(a,r))||(a.push(r),i.push(n[e]))}),i},w.union=function(){return w.uniq(c.apply(e,arguments))},w.intersection=function(n){var t=o.call(arguments,1);return w.filter(w.uniq(n),function(n){return w.every(t,function(t){return w.indexOf(t,n)>=0})})},w.difference=function(n){var t=c.apply(e,o.call(arguments,1));return w.filter(n,function(n){return!w.contains(t,n)})},w.zip=function(){for(var n=o.call(arguments),t=w.max(w.pluck(n,"length")),r=Array(t),e=0;t>e;e++)r[e]=w.pluck(n,""+e);return r},w.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},w.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if("number"!=typeof r)return e=w.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}if(y&&n.indexOf===y)return n.indexOf(t,r);for(;u>e;e++)if(n[e]===t)return e;return-1},w.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=null!=r;if(b&&n.lastIndexOf===b)return e?n.lastIndexOf(t,r):n.lastIndexOf(t);for(var u=e?r:n.length;u--;)if(n[u]===t)return u;return-1},w.range=function(n,t,r){1>=arguments.length&&(t=n||0,n=0),r=arguments[2]||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=0,i=Array(e);e>u;)i[u++]=n,n+=r;return i},w.bind=function(n,t){if(n.bind===j&&j)return j.apply(n,o.call(arguments,1));var r=o.call(arguments,2);return function(){return n.apply(t,r.concat(o.call(arguments)))}},w.partial=function(n){var t=o.call(arguments,1);return function(){return n.apply(this,t.concat(o.call(arguments)))}},w.bindAll=function(n){var t=o.call(arguments,1);return 0===t.length&&(t=w.functions(n)),A(t,function(t){n[t]=w.bind(n[t],n)}),n},w.memoize=function(n,t){var r={};return t||(t=w.identity),function(){var e=t.apply(this,arguments);return w.has(r,e)?r[e]:r[e]=n.apply(this,arguments)}},w.delay=function(n,t){var r=o.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},w.defer=function(n){return w.delay.apply(w,[n,1].concat(o.call(arguments,1)))},w.throttle=function(n,t){var r,e,u,i,a=0,o=function(){a=new Date,u=null,i=n.apply(r,e)};return function(){var c=new Date,l=t-(c-a);return r=this,e=arguments,0>=l?(clearTimeout(u),u=null,a=c,i=n.apply(r,e)):u||(u=setTimeout(o,l)),i}},w.debounce=function(n,t,r){var e,u;return function(){var i=this,a=arguments,o=function(){e=null,r||(u=n.apply(i,a))},c=r&&!e;return clearTimeout(e),e=setTimeout(o,t),c&&(u=n.apply(i,a)),u}},w.once=function(n){var t,r=!1;return function(){return r?t:(r=!0,t=n.apply(this,arguments),n=null,t)}},w.wrap=function(n,t){return function(){var r=[n];return a.apply(r,arguments),t.apply(this,r)}},w.compose=function(){var n=arguments;return function(){for(var t=arguments,r=n.length-1;r>=0;r--)t=[n[r].apply(this,t)];return t[0]}},w.after=function(n,t){return 0>=n?t():function(){return 1>--n?t.apply(this,arguments):void 0}},w.keys=_||function(n){if(n!==Object(n))throw new TypeError("Invalid object");var t=[];for(var r in n)w.has(n,r)&&(t[t.length]=r);return t},w.values=function(n){var t=[];for(var r in n)w.has(n,r)&&t.push(n[r]);return t},w.pairs=function(n){var t=[];for(var r in n)w.has(n,r)&&t.push([r,n[r]]);return t},w.invert=function(n){var t={};for(var r in n)w.has(n,r)&&(t[n[r]]=r);return t},w.functions=w.methods=function(n){var t=[];for(var r in n)w.isFunction(n[r])&&t.push(r);return t.sort()},w.extend=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]=t[r]}),n},w.pick=function(n){var t={},r=c.apply(e,o.call(arguments,1));return A(r,function(r){r in n&&(t[r]=n[r])}),t},w.omit=function(n){var t={},r=c.apply(e,o.call(arguments,1));for(var u in n)w.contains(r,u)||(t[u]=n[u]);return t},w.defaults=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)null==n[r]&&(n[r]=t[r])}),n},w.clone=function(n){return w.isObject(n)?w.isArray(n)?n.slice():w.extend({},n):n},w.tap=function(n,t){return t(n),n};var I=function(n,t,r,e){if(n===t)return 0!==n||1/n==1/t;if(null==n||null==t)return n===t;n instanceof w&&(n=n._wrapped),t instanceof w&&(t=t._wrapped);var u=l.call(n);if(u!=l.call(t))return!1;switch(u){case"[object String]":return n==t+"";case"[object Number]":return n!=+n?t!=+t:0==n?1/n==1/t:n==+t;case"[object Date]":case"[object Boolean]":return+n==+t;case"[object RegExp]":return n.source==t.source&&n.global==t.global&&n.multiline==t.multiline&&n.ignoreCase==t.ignoreCase}if("object"!=typeof n||"object"!=typeof t)return!1;for(var i=r.length;i--;)if(r[i]==n)return e[i]==t;r.push(n),e.push(t);var a=0,o=!0;if("[object Array]"==u){if(a=n.length,o=a==t.length)for(;a--&&(o=I(n[a],t[a],r,e)););}else{var c=n.constructor,f=t.constructor;if(c!==f&&!(w.isFunction(c)&&c instanceof c&&w.isFunction(f)&&f instanceof f))return!1;for(var s in n)if(w.has(n,s)&&(a++,!(o=w.has(t,s)&&I(n[s],t[s],r,e))))break;if(o){for(s in t)if(w.has(t,s)&&!a--)break;o=!a}}return r.pop(),e.pop(),o};w.isEqual=function(n,t){return I(n,t,[],[])},w.isEmpty=function(n){if(null==n)return!0;if(w.isArray(n)||w.isString(n))return 0===n.length;for(var t in n)if(w.has(n,t))return!1;return!0},w.isElement=function(n){return!(!n||1!==n.nodeType)},w.isArray=x||function(n){return"[object Array]"==l.call(n)},w.isObject=function(n){return n===Object(n)},A(["Arguments","Function","String","Number","Date","RegExp"],function(n){w["is"+n]=function(t){return l.call(t)=="[object "+n+"]"}}),w.isArguments(arguments)||(w.isArguments=function(n){return!(!n||!w.has(n,"callee"))}),"function"!=typeof/./&&(w.isFunction=function(n){return"function"==typeof n}),w.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},w.isNaN=function(n){return w.isNumber(n)&&n!=+n},w.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"==l.call(n)},w.isNull=function(n){return null===n},w.isUndefined=function(n){return n===void 0},w.has=function(n,t){return f.call(n,t)},w.noConflict=function(){return n._=t,this},w.identity=function(n){return n},w.times=function(n,t,r){for(var e=Array(n),u=0;n>u;u++)e[u]=t.call(r,u);return e},w.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))};var M={escape:{"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","/":"&#x2F;"}};M.unescape=w.invert(M.escape);var S={escape:RegExp("["+w.keys(M.escape).join("")+"]","g"),unescape:RegExp("("+w.keys(M.unescape).join("|")+")","g")};w.each(["escape","unescape"],function(n){w[n]=function(t){return null==t?"":(""+t).replace(S[n],function(t){return M[n][t]})}}),w.result=function(n,t){if(null==n)return null;var r=n[t];return w.isFunction(r)?r.call(n):r},w.mixin=function(n){A(w.functions(n),function(t){var r=w[t]=n[t];w.prototype[t]=function(){var n=[this._wrapped];return a.apply(n,arguments),D.call(this,r.apply(w,n))}})};var N=0;w.uniqueId=function(n){var t=++N+"";return n?n+t:t},w.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var T=/(.)^/,q={"'":"'","\\":"\\","\r":"r","\n":"n","        ":"t","\u2028":"u2028","\u2029":"u2029"},B=/\\|'|\r|\n|\t|\u2028|\u2029/g;w.template=function(n,t,r){var e;r=w.defaults({},r,w.templateSettings);var u=RegExp([(r.escape||T).source,(r.interpolate||T).source,(r.evaluate||T).source].join("|")+"|$","g"),i=0,a="__p+='";n.replace(u,function(t,r,e,u,o){return a+=n.slice(i,o).replace(B,function(n){return"\\"+q[n]}),r&&(a+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'"),e&&(a+="'+\n((__t=("+e+"))==null?'':__t)+\n'"),u&&(a+="';\n"+u+"\n__p+='"),i=o+t.length,t}),a+="';\n",r.variable||(a="with(obj||{}){\n"+a+"}\n"),a="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{e=Function(r.variable||"obj","_",a)}catch(o){throw o.source=a,o}if(t)return e(t,w);var c=function(n){return e.call(this,n,w)};return c.source="function("+(r.variable||"obj")+"){\n"+a+"}",c},w.chain=function(n){return w(n).chain()};var D=function(n){return this._chain?w(n).chain():n};w.mixin(w),A(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=e[n];w.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!=n&&"splice"!=n||0!==r.length||delete r[0],D.call(this,r)}}),A(["concat","join","slice"],function(n){var t=e[n];w.prototype[n]=function(){return D.call(this,t.apply(this._wrapped,arguments))}}),w.extend(w.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this);/*global setImmediate: false, setTimeout: false, console: false */
61777 (function () {
61778
61779     var async = {};
61780
61781     // global on the server, window in the browser
61782     var root, previous_async;
61783
61784     root = this;
61785     if (root != null) {
61786       previous_async = root.async;
61787     }
61788
61789     async.noConflict = function () {
61790         root.async = previous_async;
61791         return async;
61792     };
61793
61794     function only_once(fn) {
61795         var called = false;
61796         return function() {
61797             if (called) throw new Error("Callback was already called.");
61798             called = true;
61799             fn.apply(root, arguments);
61800         }
61801     }
61802
61803     //// cross-browser compatiblity functions ////
61804
61805     var _each = function (arr, iterator) {
61806         if (arr.forEach) {
61807             return arr.forEach(iterator);
61808         }
61809         for (var i = 0; i < arr.length; i += 1) {
61810             iterator(arr[i], i, arr);
61811         }
61812     };
61813
61814     var _map = function (arr, iterator) {
61815         if (arr.map) {
61816             return arr.map(iterator);
61817         }
61818         var results = [];
61819         _each(arr, function (x, i, a) {
61820             results.push(iterator(x, i, a));
61821         });
61822         return results;
61823     };
61824
61825     var _reduce = function (arr, iterator, memo) {
61826         if (arr.reduce) {
61827             return arr.reduce(iterator, memo);
61828         }
61829         _each(arr, function (x, i, a) {
61830             memo = iterator(memo, x, i, a);
61831         });
61832         return memo;
61833     };
61834
61835     var _keys = function (obj) {
61836         if (Object.keys) {
61837             return Object.keys(obj);
61838         }
61839         var keys = [];
61840         for (var k in obj) {
61841             if (obj.hasOwnProperty(k)) {
61842                 keys.push(k);
61843             }
61844         }
61845         return keys;
61846     };
61847
61848     //// exported async module functions ////
61849
61850     //// nextTick implementation with browser-compatible fallback ////
61851     if (typeof process === 'undefined' || !(process.nextTick)) {
61852         if (typeof setImmediate === 'function') {
61853             async.nextTick = function (fn) {
61854                 // not a direct alias for IE10 compatibility
61855                 setImmediate(fn);
61856             };
61857             async.setImmediate = async.nextTick;
61858         }
61859         else {
61860             async.nextTick = function (fn) {
61861                 setTimeout(fn, 0);
61862             };
61863             async.setImmediate = async.nextTick;
61864         }
61865     }
61866     else {
61867         async.nextTick = process.nextTick;
61868         if (typeof setImmediate !== 'undefined') {
61869             async.setImmediate = setImmediate;
61870         }
61871         else {
61872             async.setImmediate = async.nextTick;
61873         }
61874     }
61875
61876     async.each = function (arr, iterator, callback) {
61877         callback = callback || function () {};
61878         if (!arr.length) {
61879             return callback();
61880         }
61881         var completed = 0;
61882         _each(arr, function (x) {
61883             iterator(x, only_once(function (err) {
61884                 if (err) {
61885                     callback(err);
61886                     callback = function () {};
61887                 }
61888                 else {
61889                     completed += 1;
61890                     if (completed >= arr.length) {
61891                         callback(null);
61892                     }
61893                 }
61894             }));
61895         });
61896     };
61897     async.forEach = async.each;
61898
61899     async.eachSeries = function (arr, iterator, callback) {
61900         callback = callback || function () {};
61901         if (!arr.length) {
61902             return callback();
61903         }
61904         var completed = 0;
61905         var iterate = function () {
61906             iterator(arr[completed], function (err) {
61907                 if (err) {
61908                     callback(err);
61909                     callback = function () {};
61910                 }
61911                 else {
61912                     completed += 1;
61913                     if (completed >= arr.length) {
61914                         callback(null);
61915                     }
61916                     else {
61917                         iterate();
61918                     }
61919                 }
61920             });
61921         };
61922         iterate();
61923     };
61924     async.forEachSeries = async.eachSeries;
61925
61926     async.eachLimit = function (arr, limit, iterator, callback) {
61927         var fn = _eachLimit(limit);
61928         fn.apply(null, [arr, iterator, callback]);
61929     };
61930     async.forEachLimit = async.eachLimit;
61931
61932     var _eachLimit = function (limit) {
61933
61934         return function (arr, iterator, callback) {
61935             callback = callback || function () {};
61936             if (!arr.length || limit <= 0) {
61937                 return callback();
61938             }
61939             var completed = 0;
61940             var started = 0;
61941             var running = 0;
61942
61943             (function replenish () {
61944                 if (completed >= arr.length) {
61945                     return callback();
61946                 }
61947
61948                 while (running < limit && started < arr.length) {
61949                     started += 1;
61950                     running += 1;
61951                     iterator(arr[started - 1], function (err) {
61952                         if (err) {
61953                             callback(err);
61954                             callback = function () {};
61955                         }
61956                         else {
61957                             completed += 1;
61958                             running -= 1;
61959                             if (completed >= arr.length) {
61960                                 callback();
61961                             }
61962                             else {
61963                                 replenish();
61964                             }
61965                         }
61966                     });
61967                 }
61968             })();
61969         };
61970     };
61971
61972
61973     var doParallel = function (fn) {
61974         return function () {
61975             var args = Array.prototype.slice.call(arguments);
61976             return fn.apply(null, [async.each].concat(args));
61977         };
61978     };
61979     var doParallelLimit = function(limit, fn) {
61980         return function () {
61981             var args = Array.prototype.slice.call(arguments);
61982             return fn.apply(null, [_eachLimit(limit)].concat(args));
61983         };
61984     };
61985     var doSeries = function (fn) {
61986         return function () {
61987             var args = Array.prototype.slice.call(arguments);
61988             return fn.apply(null, [async.eachSeries].concat(args));
61989         };
61990     };
61991
61992
61993     var _asyncMap = function (eachfn, arr, iterator, callback) {
61994         var results = [];
61995         arr = _map(arr, function (x, i) {
61996             return {index: i, value: x};
61997         });
61998         eachfn(arr, function (x, callback) {
61999             iterator(x.value, function (err, v) {
62000                 results[x.index] = v;
62001                 callback(err);
62002             });
62003         }, function (err) {
62004             callback(err, results);
62005         });
62006     };
62007     async.map = doParallel(_asyncMap);
62008     async.mapSeries = doSeries(_asyncMap);
62009     async.mapLimit = function (arr, limit, iterator, callback) {
62010         return _mapLimit(limit)(arr, iterator, callback);
62011     };
62012
62013     var _mapLimit = function(limit) {
62014         return doParallelLimit(limit, _asyncMap);
62015     };
62016
62017     // reduce only has a series version, as doing reduce in parallel won't
62018     // work in many situations.
62019     async.reduce = function (arr, memo, iterator, callback) {
62020         async.eachSeries(arr, function (x, callback) {
62021             iterator(memo, x, function (err, v) {
62022                 memo = v;
62023                 callback(err);
62024             });
62025         }, function (err) {
62026             callback(err, memo);
62027         });
62028     };
62029     // inject alias
62030     async.inject = async.reduce;
62031     // foldl alias
62032     async.foldl = async.reduce;
62033
62034     async.reduceRight = function (arr, memo, iterator, callback) {
62035         var reversed = _map(arr, function (x) {
62036             return x;
62037         }).reverse();
62038         async.reduce(reversed, memo, iterator, callback);
62039     };
62040     // foldr alias
62041     async.foldr = async.reduceRight;
62042
62043     var _filter = function (eachfn, arr, iterator, callback) {
62044         var results = [];
62045         arr = _map(arr, function (x, i) {
62046             return {index: i, value: x};
62047         });
62048         eachfn(arr, function (x, callback) {
62049             iterator(x.value, function (v) {
62050                 if (v) {
62051                     results.push(x);
62052                 }
62053                 callback();
62054             });
62055         }, function (err) {
62056             callback(_map(results.sort(function (a, b) {
62057                 return a.index - b.index;
62058             }), function (x) {
62059                 return x.value;
62060             }));
62061         });
62062     };
62063     async.filter = doParallel(_filter);
62064     async.filterSeries = doSeries(_filter);
62065     // select alias
62066     async.select = async.filter;
62067     async.selectSeries = async.filterSeries;
62068
62069     var _reject = function (eachfn, arr, iterator, callback) {
62070         var results = [];
62071         arr = _map(arr, function (x, i) {
62072             return {index: i, value: x};
62073         });
62074         eachfn(arr, function (x, callback) {
62075             iterator(x.value, function (v) {
62076                 if (!v) {
62077                     results.push(x);
62078                 }
62079                 callback();
62080             });
62081         }, function (err) {
62082             callback(_map(results.sort(function (a, b) {
62083                 return a.index - b.index;
62084             }), function (x) {
62085                 return x.value;
62086             }));
62087         });
62088     };
62089     async.reject = doParallel(_reject);
62090     async.rejectSeries = doSeries(_reject);
62091
62092     var _detect = function (eachfn, arr, iterator, main_callback) {
62093         eachfn(arr, function (x, callback) {
62094             iterator(x, function (result) {
62095                 if (result) {
62096                     main_callback(x);
62097                     main_callback = function () {};
62098                 }
62099                 else {
62100                     callback();
62101                 }
62102             });
62103         }, function (err) {
62104             main_callback();
62105         });
62106     };
62107     async.detect = doParallel(_detect);
62108     async.detectSeries = doSeries(_detect);
62109
62110     async.some = function (arr, iterator, main_callback) {
62111         async.each(arr, function (x, callback) {
62112             iterator(x, function (v) {
62113                 if (v) {
62114                     main_callback(true);
62115                     main_callback = function () {};
62116                 }
62117                 callback();
62118             });
62119         }, function (err) {
62120             main_callback(false);
62121         });
62122     };
62123     // any alias
62124     async.any = async.some;
62125
62126     async.every = function (arr, iterator, main_callback) {
62127         async.each(arr, function (x, callback) {
62128             iterator(x, function (v) {
62129                 if (!v) {
62130                     main_callback(false);
62131                     main_callback = function () {};
62132                 }
62133                 callback();
62134             });
62135         }, function (err) {
62136             main_callback(true);
62137         });
62138     };
62139     // all alias
62140     async.all = async.every;
62141
62142     async.sortBy = function (arr, iterator, callback) {
62143         async.map(arr, function (x, callback) {
62144             iterator(x, function (err, criteria) {
62145                 if (err) {
62146                     callback(err);
62147                 }
62148                 else {
62149                     callback(null, {value: x, criteria: criteria});
62150                 }
62151             });
62152         }, function (err, results) {
62153             if (err) {
62154                 return callback(err);
62155             }
62156             else {
62157                 var fn = function (left, right) {
62158                     var a = left.criteria, b = right.criteria;
62159                     return a < b ? -1 : a > b ? 1 : 0;
62160                 };
62161                 callback(null, _map(results.sort(fn), function (x) {
62162                     return x.value;
62163                 }));
62164             }
62165         });
62166     };
62167
62168     async.auto = function (tasks, callback) {
62169         callback = callback || function () {};
62170         var keys = _keys(tasks);
62171         if (!keys.length) {
62172             return callback(null);
62173         }
62174
62175         var results = {};
62176
62177         var listeners = [];
62178         var addListener = function (fn) {
62179             listeners.unshift(fn);
62180         };
62181         var removeListener = function (fn) {
62182             for (var i = 0; i < listeners.length; i += 1) {
62183                 if (listeners[i] === fn) {
62184                     listeners.splice(i, 1);
62185                     return;
62186                 }
62187             }
62188         };
62189         var taskComplete = function () {
62190             _each(listeners.slice(0), function (fn) {
62191                 fn();
62192             });
62193         };
62194
62195         addListener(function () {
62196             if (_keys(results).length === keys.length) {
62197                 callback(null, results);
62198                 callback = function () {};
62199             }
62200         });
62201
62202         _each(keys, function (k) {
62203             var task = (tasks[k] instanceof Function) ? [tasks[k]]: tasks[k];
62204             var taskCallback = function (err) {
62205                 var args = Array.prototype.slice.call(arguments, 1);
62206                 if (args.length <= 1) {
62207                     args = args[0];
62208                 }
62209                 if (err) {
62210                     var safeResults = {};
62211                     _each(_keys(results), function(rkey) {
62212                         safeResults[rkey] = results[rkey];
62213                     });
62214                     safeResults[k] = args;
62215                     callback(err, safeResults);
62216                     // stop subsequent errors hitting callback multiple times
62217                     callback = function () {};
62218                 }
62219                 else {
62220                     results[k] = args;
62221                     async.setImmediate(taskComplete);
62222                 }
62223             };
62224             var requires = task.slice(0, Math.abs(task.length - 1)) || [];
62225             var ready = function () {
62226                 return _reduce(requires, function (a, x) {
62227                     return (a && results.hasOwnProperty(x));
62228                 }, true) && !results.hasOwnProperty(k);
62229             };
62230             if (ready()) {
62231                 task[task.length - 1](taskCallback, results);
62232             }
62233             else {
62234                 var listener = function () {
62235                     if (ready()) {
62236                         removeListener(listener);
62237                         task[task.length - 1](taskCallback, results);
62238                     }
62239                 };
62240                 addListener(listener);
62241             }
62242         });
62243     };
62244
62245     async.waterfall = function (tasks, callback) {
62246         callback = callback || function () {};
62247         if (tasks.constructor !== Array) {
62248           var err = new Error('First argument to waterfall must be an array of functions');
62249           return callback(err);
62250         }
62251         if (!tasks.length) {
62252             return callback();
62253         }
62254         var wrapIterator = function (iterator) {
62255             return function (err) {
62256                 if (err) {
62257                     callback.apply(null, arguments);
62258                     callback = function () {};
62259                 }
62260                 else {
62261                     var args = Array.prototype.slice.call(arguments, 1);
62262                     var next = iterator.next();
62263                     if (next) {
62264                         args.push(wrapIterator(next));
62265                     }
62266                     else {
62267                         args.push(callback);
62268                     }
62269                     async.setImmediate(function () {
62270                         iterator.apply(null, args);
62271                     });
62272                 }
62273             };
62274         };
62275         wrapIterator(async.iterator(tasks))();
62276     };
62277
62278     var _parallel = function(eachfn, tasks, callback) {
62279         callback = callback || function () {};
62280         if (tasks.constructor === Array) {
62281             eachfn.map(tasks, function (fn, callback) {
62282                 if (fn) {
62283                     fn(function (err) {
62284                         var args = Array.prototype.slice.call(arguments, 1);
62285                         if (args.length <= 1) {
62286                             args = args[0];
62287                         }
62288                         callback.call(null, err, args);
62289                     });
62290                 }
62291             }, callback);
62292         }
62293         else {
62294             var results = {};
62295             eachfn.each(_keys(tasks), function (k, callback) {
62296                 tasks[k](function (err) {
62297                     var args = Array.prototype.slice.call(arguments, 1);
62298                     if (args.length <= 1) {
62299                         args = args[0];
62300                     }
62301                     results[k] = args;
62302                     callback(err);
62303                 });
62304             }, function (err) {
62305                 callback(err, results);
62306             });
62307         }
62308     };
62309
62310     async.parallel = function (tasks, callback) {
62311         _parallel({ map: async.map, each: async.each }, tasks, callback);
62312     };
62313
62314     async.parallelLimit = function(tasks, limit, callback) {
62315         _parallel({ map: _mapLimit(limit), each: _eachLimit(limit) }, tasks, callback);
62316     };
62317
62318     async.series = function (tasks, callback) {
62319         callback = callback || function () {};
62320         if (tasks.constructor === Array) {
62321             async.mapSeries(tasks, function (fn, callback) {
62322                 if (fn) {
62323                     fn(function (err) {
62324                         var args = Array.prototype.slice.call(arguments, 1);
62325                         if (args.length <= 1) {
62326                             args = args[0];
62327                         }
62328                         callback.call(null, err, args);
62329                     });
62330                 }
62331             }, callback);
62332         }
62333         else {
62334             var results = {};
62335             async.eachSeries(_keys(tasks), function (k, callback) {
62336                 tasks[k](function (err) {
62337                     var args = Array.prototype.slice.call(arguments, 1);
62338                     if (args.length <= 1) {
62339                         args = args[0];
62340                     }
62341                     results[k] = args;
62342                     callback(err);
62343                 });
62344             }, function (err) {
62345                 callback(err, results);
62346             });
62347         }
62348     };
62349
62350     async.iterator = function (tasks) {
62351         var makeCallback = function (index) {
62352             var fn = function () {
62353                 if (tasks.length) {
62354                     tasks[index].apply(null, arguments);
62355                 }
62356                 return fn.next();
62357             };
62358             fn.next = function () {
62359                 return (index < tasks.length - 1) ? makeCallback(index + 1): null;
62360             };
62361             return fn;
62362         };
62363         return makeCallback(0);
62364     };
62365
62366     async.apply = function (fn) {
62367         var args = Array.prototype.slice.call(arguments, 1);
62368         return function () {
62369             return fn.apply(
62370                 null, args.concat(Array.prototype.slice.call(arguments))
62371             );
62372         };
62373     };
62374
62375     var _concat = function (eachfn, arr, fn, callback) {
62376         var r = [];
62377         eachfn(arr, function (x, cb) {
62378             fn(x, function (err, y) {
62379                 r = r.concat(y || []);
62380                 cb(err);
62381             });
62382         }, function (err) {
62383             callback(err, r);
62384         });
62385     };
62386     async.concat = doParallel(_concat);
62387     async.concatSeries = doSeries(_concat);
62388
62389     async.whilst = function (test, iterator, callback) {
62390         if (test()) {
62391             iterator(function (err) {
62392                 if (err) {
62393                     return callback(err);
62394                 }
62395                 async.whilst(test, iterator, callback);
62396             });
62397         }
62398         else {
62399             callback();
62400         }
62401     };
62402
62403     async.doWhilst = function (iterator, test, callback) {
62404         iterator(function (err) {
62405             if (err) {
62406                 return callback(err);
62407             }
62408             if (test()) {
62409                 async.doWhilst(iterator, test, callback);
62410             }
62411             else {
62412                 callback();
62413             }
62414         });
62415     };
62416
62417     async.until = function (test, iterator, callback) {
62418         if (!test()) {
62419             iterator(function (err) {
62420                 if (err) {
62421                     return callback(err);
62422                 }
62423                 async.until(test, iterator, callback);
62424             });
62425         }
62426         else {
62427             callback();
62428         }
62429     };
62430
62431     async.doUntil = function (iterator, test, callback) {
62432         iterator(function (err) {
62433             if (err) {
62434                 return callback(err);
62435             }
62436             if (!test()) {
62437                 async.doUntil(iterator, test, callback);
62438             }
62439             else {
62440                 callback();
62441             }
62442         });
62443     };
62444
62445     async.queue = function (worker, concurrency) {
62446         if (concurrency === undefined) {
62447             concurrency = 1;
62448         }
62449         function _insert(q, data, pos, callback) {
62450           if(data.constructor !== Array) {
62451               data = [data];
62452           }
62453           _each(data, function(task) {
62454               var item = {
62455                   data: task,
62456                   callback: typeof callback === 'function' ? callback : null
62457               };
62458
62459               if (pos) {
62460                 q.tasks.unshift(item);
62461               } else {
62462                 q.tasks.push(item);
62463               }
62464
62465               if (q.saturated && q.tasks.length === concurrency) {
62466                   q.saturated();
62467               }
62468               async.setImmediate(q.process);
62469           });
62470         }
62471
62472         var workers = 0;
62473         var q = {
62474             tasks: [],
62475             concurrency: concurrency,
62476             saturated: null,
62477             empty: null,
62478             drain: null,
62479             push: function (data, callback) {
62480               _insert(q, data, false, callback);
62481             },
62482             unshift: function (data, callback) {
62483               _insert(q, data, true, callback);
62484             },
62485             process: function () {
62486                 if (workers < q.concurrency && q.tasks.length) {
62487                     var task = q.tasks.shift();
62488                     if (q.empty && q.tasks.length === 0) {
62489                         q.empty();
62490                     }
62491                     workers += 1;
62492                     var next = function () {
62493                         workers -= 1;
62494                         if (task.callback) {
62495                             task.callback.apply(task, arguments);
62496                         }
62497                         if (q.drain && q.tasks.length + workers === 0) {
62498                             q.drain();
62499                         }
62500                         q.process();
62501                     };
62502                     var cb = only_once(next);
62503                     worker(task.data, cb);
62504                 }
62505             },
62506             length: function () {
62507                 return q.tasks.length;
62508             },
62509             running: function () {
62510                 return workers;
62511             }
62512         };
62513         return q;
62514     };
62515
62516     async.cargo = function (worker, payload) {
62517         var working     = false,
62518             tasks       = [];
62519
62520         var cargo = {
62521             tasks: tasks,
62522             payload: payload,
62523             saturated: null,
62524             empty: null,
62525             drain: null,
62526             push: function (data, callback) {
62527                 if(data.constructor !== Array) {
62528                     data = [data];
62529                 }
62530                 _each(data, function(task) {
62531                     tasks.push({
62532                         data: task,
62533                         callback: typeof callback === 'function' ? callback : null
62534                     });
62535                     if (cargo.saturated && tasks.length === payload) {
62536                         cargo.saturated();
62537                     }
62538                 });
62539                 async.setImmediate(cargo.process);
62540             },
62541             process: function process() {
62542                 if (working) return;
62543                 if (tasks.length === 0) {
62544                     if(cargo.drain) cargo.drain();
62545                     return;
62546                 }
62547
62548                 var ts = typeof payload === 'number'
62549                             ? tasks.splice(0, payload)
62550                             : tasks.splice(0);
62551
62552                 var ds = _map(ts, function (task) {
62553                     return task.data;
62554                 });
62555
62556                 if(cargo.empty) cargo.empty();
62557                 working = true;
62558                 worker(ds, function () {
62559                     working = false;
62560
62561                     var args = arguments;
62562                     _each(ts, function (data) {
62563                         if (data.callback) {
62564                             data.callback.apply(null, args);
62565                         }
62566                     });
62567
62568                     process();
62569                 });
62570             },
62571             length: function () {
62572                 return tasks.length;
62573             },
62574             running: function () {
62575                 return working;
62576             }
62577         };
62578         return cargo;
62579     };
62580
62581     var _console_fn = function (name) {
62582         return function (fn) {
62583             var args = Array.prototype.slice.call(arguments, 1);
62584             fn.apply(null, args.concat([function (err) {
62585                 var args = Array.prototype.slice.call(arguments, 1);
62586                 if (typeof console !== 'undefined') {
62587                     if (err) {
62588                         if (console.error) {
62589                             console.error(err);
62590                         }
62591                     }
62592                     else if (console[name]) {
62593                         _each(args, function (x) {
62594                             console[name](x);
62595                         });
62596                     }
62597                 }
62598             }]));
62599         };
62600     };
62601     async.log = _console_fn('log');
62602     async.dir = _console_fn('dir');
62603     /*async.info = _console_fn('info');
62604     async.warn = _console_fn('warn');
62605     async.error = _console_fn('error');*/
62606
62607     async.memoize = function (fn, hasher) {
62608         var memo = {};
62609         var queues = {};
62610         hasher = hasher || function (x) {
62611             return x;
62612         };
62613         var memoized = function () {
62614             var args = Array.prototype.slice.call(arguments);
62615             var callback = args.pop();
62616             var key = hasher.apply(null, args);
62617             if (key in memo) {
62618                 callback.apply(null, memo[key]);
62619             }
62620             else if (key in queues) {
62621                 queues[key].push(callback);
62622             }
62623             else {
62624                 queues[key] = [callback];
62625                 fn.apply(null, args.concat([function () {
62626                     memo[key] = arguments;
62627                     var q = queues[key];
62628                     delete queues[key];
62629                     for (var i = 0, l = q.length; i < l; i++) {
62630                       q[i].apply(null, arguments);
62631                     }
62632                 }]));
62633             }
62634         };
62635         memoized.memo = memo;
62636         memoized.unmemoized = fn;
62637         return memoized;
62638     };
62639
62640     async.unmemoize = function (fn) {
62641       return function () {
62642         return (fn.unmemoized || fn).apply(null, arguments);
62643       };
62644     };
62645
62646     async.times = function (count, iterator, callback) {
62647         var counter = [];
62648         for (var i = 0; i < count; i++) {
62649             counter.push(i);
62650         }
62651         return async.map(counter, iterator, callback);
62652     };
62653
62654     async.timesSeries = function (count, iterator, callback) {
62655         var counter = [];
62656         for (var i = 0; i < count; i++) {
62657             counter.push(i);
62658         }
62659         return async.mapSeries(counter, iterator, callback);
62660     };
62661
62662     async.compose = function (/* functions... */) {
62663         var fns = Array.prototype.reverse.call(arguments);
62664         return function () {
62665             var that = this;
62666             var args = Array.prototype.slice.call(arguments);
62667             var callback = args.pop();
62668             async.reduce(fns, args, function (newargs, fn, cb) {
62669                 fn.apply(that, newargs.concat([function () {
62670                     var err = arguments[0];
62671                     var nextargs = Array.prototype.slice.call(arguments, 1);
62672                     cb(err, nextargs);
62673                 }]))
62674             },
62675             function (err, results) {
62676                 callback.apply(that, [err].concat(results));
62677             });
62678         };
62679     };
62680
62681     var _applyEach = function (eachfn, fns /*args...*/) {
62682         var go = function () {
62683             var that = this;
62684             var args = Array.prototype.slice.call(arguments);
62685             var callback = args.pop();
62686             return eachfn(fns, function (fn, cb) {
62687                 fn.apply(that, args.concat([cb]));
62688             },
62689             callback);
62690         };
62691         if (arguments.length > 2) {
62692             var args = Array.prototype.slice.call(arguments, 2);
62693             return go.apply(this, args);
62694         }
62695         else {
62696             return go;
62697         }
62698     };
62699     async.applyEach = doParallel(_applyEach);
62700     async.applyEachSeries = doSeries(_applyEach);
62701
62702     async.forever = function (fn, callback) {
62703         function next(err) {
62704             if (err) {
62705                 if (callback) {
62706                     return callback(err);
62707                 }
62708                 throw err;
62709             }
62710             fn(next);
62711         }
62712         next();
62713     };
62714
62715     root.async = async;
62716
62717 }());
62718 (function() {
62719
62720     var redblack = {};
62721     var root = this;
62722     var orig = root.redblack;
62723
62724     if (typeof module !== 'undefined' && module.exports) {
62725         module.exports = redblack;
62726     } else {
62727         root.redblack = redblack;
62728     }
62729
62730     redblack.VERSION = '0.1.2';
62731
62732     redblack.noConflict = function() {
62733         root.redblack = orig;
62734         return redblack;
62735     };
62736
62737     redblack.tree = function() {
62738         return new Tree();
62739     };
62740
62741     var BLACK = redblack.BLACK = 'black';
62742     var RED = redblack.RED = 'red';
62743
62744     // Node
62745     // ---------------
62746
62747     function Node(key, value) {
62748         this.key = key;
62749         this.value = value;
62750         this.color = RED;
62751         this.left = null;
62752         this.right = null;
62753         this.parent = null;
62754     };
62755
62756     Node.prototype.grandparent = function() {
62757         if (this.parent === null) return null;
62758         return this.parent.parent;
62759     };
62760
62761     Node.prototype.sibling = function() {
62762         if (this.parent === null) return null;
62763         return this === this.parent.left ? this.parent.right : this.parent.left;
62764     };
62765
62766     Node.prototype.uncle = function() {
62767         if (this.parent === null) return null;
62768         return this.parent.sibling();
62769     };
62770
62771     // Cursor
62772     // ---------------
62773
62774     function Cursor(tree, start, end) {
62775         this.tree = tree;
62776         this.start = start;
62777         this.end = end;
62778
62779         var self = this;
62780         this.walk = function walk(node, iterator) {
62781             if (node === null) return;
62782
62783             if (start !== undefined && node.key < start) {
62784                 walk(node.right, iterator);
62785             } else if (end !== undefined && node.key > end) {
62786                 walk(node.left, iterator);
62787             } else {
62788                 walk(node.left, iterator);
62789                 iterator(node.value, node.key, self.tree);
62790                 walk(node.right, iterator);
62791             }
62792         };
62793     };
62794
62795     Cursor.prototype.forEach = function(iterator) {
62796         this.walk(this.tree.root, iterator);
62797     };
62798
62799     Cursor.prototype.map = function(iterator) {
62800         var results = [];
62801
62802         this.forEach(function(value, key, tree) {
62803             results.push(iterator(value, key, tree));
62804         });
62805
62806         return results;
62807     };
62808
62809     // Tree
62810     // ---------------
62811
62812     function Tree() {
62813         this.root = null;
62814         this.balancer = new Balancer(this);
62815     };
62816
62817     Tree.prototype.get = function(key) {
62818         var node = find(this.root, key);
62819         return node === null ? null : node.value;
62820     };
62821
62822     Tree.prototype.insert = function(key, value) {
62823         var newNode = new Node(key, value);
62824
62825         if (this.root === null) {
62826             this.root = newNode;
62827         } else {
62828             var node = this.root;
62829
62830             while (true) {
62831                 if (key < node.key) {
62832                     if (node.left === null) {
62833                         node.left = newNode;
62834                         break;
62835                     } else {
62836                         node = node.left;
62837                     }
62838                 } else if (key > node.key) {
62839                     if (node.right === null) {
62840                         node.right = newNode;
62841                         break;
62842                     } else {
62843                         node = node.right;
62844                     }
62845                 } else {
62846                     node.value = value;
62847                     return;
62848                 }
62849             }
62850
62851             newNode.parent = node;
62852         }
62853
62854         this.balancer.inserted(newNode);
62855     };
62856
62857     Tree.prototype.delete = function(key) {
62858         var node = find(this.root, key);
62859         if (node === null) return;
62860
62861         if (node.left !== null && node.right !== null) {
62862             var pred = node.left;
62863             while (pred.right !== null) pred = pred.right;
62864
62865             node.key = pred.key;
62866             node.value = pred.value;
62867             node = pred;
62868         }
62869
62870         var child = (node.right === null) ? node.left : node.right;
62871         if (nodeColor(node) === BLACK) {
62872             node.color = nodeColor(child);
62873             this.balancer.deleted(node);
62874         }
62875
62876         this.balancer.replaceNode(node, child);
62877
62878         if (nodeColor(this.root) === RED) {
62879             this.root.color = BLACK;
62880         }
62881     };
62882
62883     Tree.prototype.range = function(start, end) {
62884         return new Cursor(this, start, end);
62885     };
62886
62887     // Proxy cursor methods
62888     for (var method in Cursor.prototype) {
62889         if (Cursor.prototype.hasOwnProperty(method)) {
62890             var func = Cursor.prototype[method];
62891             Tree.prototype[method] = function() {
62892                 var cursor = new Cursor(this);
62893                 return func.apply(cursor, arguments);
62894             };
62895         }
62896     }
62897
62898     // Balancer
62899     // ---------------
62900
62901     function Balancer(tree) {
62902         this.tree = tree;
62903     };
62904
62905     Balancer.prototype.inserted = function(node) {
62906         this.insertCase1(node);
62907     };
62908
62909     Balancer.prototype.deleted = function(node) {
62910         this.deleteCase1(node);
62911     };
62912
62913     Balancer.prototype.replaceNode = function(original, replacement) {
62914         if (original.parent === null) {
62915             this.tree.root = replacement;
62916         } else {
62917             if (original === original.parent.left) {
62918                 original.parent.left = replacement;
62919             } else {
62920                 original.parent.right = replacement;
62921             }
62922         }
62923
62924         if (replacement !== null) {
62925             replacement.parent = original.parent;
62926         }
62927     };
62928
62929     Balancer.prototype.rotateLeft = function(node) {
62930         var right = node.right;
62931         this.replaceNode(node, right);
62932
62933         // Update pointers
62934         node.right = right.left;
62935         if (right.left !== null) right.left.parent = node;
62936         right.left = node;
62937         node.parent = right;
62938     };
62939
62940     Balancer.prototype.rotateRight = function(node) {
62941         var left = node.left;
62942         this.replaceNode(node, left);
62943
62944         // Update pointers
62945         node.left = left.right;
62946         if (left.right !== null) left.right.parent = node;
62947         left.right = node;
62948         node.parent = left;
62949     };
62950
62951     Balancer.prototype.insertCase1 = function(node) {
62952         if (node.parent === null) {
62953             node.color = BLACK;
62954         } else {
62955             this.insertCase2(node);
62956         }
62957     };
62958
62959     Balancer.prototype.insertCase2 = function(node) {
62960         if (nodeColor(node.parent) === BLACK) {
62961             return;
62962         } else {
62963             this.insertCase3(node);
62964         }
62965     };
62966
62967     Balancer.prototype.insertCase3 = function(node) {
62968         var uncle = node.uncle();
62969         var grandparent = node.grandparent();
62970
62971         if (uncle !== null && nodeColor(uncle) === RED) {
62972             node.parent.color = BLACK;
62973             uncle.color = BLACK;
62974             grandparent.color = RED;
62975             this.insertCase1(grandparent);
62976         } else {
62977             this.insertCase4(node);
62978         }
62979     };
62980
62981     Balancer.prototype.insertCase4 = function(node) {
62982         var grandparent = node.grandparent();
62983
62984         if (node === node.parent.right && node.parent === grandparent.left) {
62985             this.rotateLeft(node.parent);
62986             node = node.left;
62987         } else if (node === node.parent.left && node.parent === grandparent.right) {
62988             this.rotateRight(node.parent);
62989             node = node.right;
62990         }
62991
62992         this.insertCase5(node);
62993     };
62994
62995     Balancer.prototype.insertCase5 = function(node) {
62996         var grandparent = node.grandparent();
62997
62998         node.parent.color = BLACK;
62999         grandparent.color = RED;
63000
63001         if (node === node.parent.left && node.parent === grandparent.left) {
63002             this.rotateRight(grandparent);
63003         } else if (node === node.parent.right && node.parent === grandparent.right) {
63004             this.rotateLeft(grandparent);
63005         }
63006     };
63007
63008     Balancer.prototype.deleteCase1 = function(node) {
63009         if (node.parent !== null) this.deleteCase2(node);
63010     };
63011
63012     Balancer.prototype.deleteCase2 = function(node) {
63013         var sibling = node.sibling();
63014
63015         if (nodeColor(sibling) === RED) {
63016             node.parent.color = RED;
63017             sibling.color = BLACK;
63018             if (node === node.parent.left) {
63019                 this.rotateLeft(node.parent);
63020             } else {
63021                 this.rotateRight(node.parent);
63022             }
63023         }
63024
63025         this.deleteCase3(node);
63026     };
63027
63028     Balancer.prototype.deleteCase3 = function(node) {
63029         var sibling = node.sibling();
63030
63031         if (nodeColor(node.parent) === BLACK &&
63032             nodeColor(sibling) === BLACK &&
63033             nodeColor(sibling.left) === BLACK &&
63034             nodeColor(sibling.right) === BLACK) {
63035
63036             sibling.color = RED;
63037             this.deleteCase1(node.parent);
63038         } else {
63039             this.deleteCase4(node);
63040         }
63041     };
63042
63043     Balancer.prototype.deleteCase4 = function(node) {
63044         var sibling = node.sibling();
63045
63046         if (nodeColor(node.parent) === RED &&
63047             nodeColor(sibling) === BLACK &&
63048             nodeColor(sibling.left) === BLACK &&
63049             nodeColor(sibling.right) === BLACK) {
63050
63051             sibling.color = RED;
63052             node.parent.color = BLACK;
63053         } else {
63054             this.deleteCase5(node);
63055         }
63056     };
63057
63058     Balancer.prototype.deleteCase5 = function(node) {
63059         var sibling = node.sibling();
63060
63061         if (node === node.parent.left &&
63062             nodeColor(sibling) === BLACK &&
63063             nodeColor(sibling.left) === RED &&
63064             nodeColor(sibling.right) === BLACK) {
63065
63066             sibling.color = RED;
63067             sibling.left.color = BLACK;
63068             this.rotateRight(sibling);
63069         } else if (node === node.parent.right &&
63070             nodeColor(sibling) === BLACK &&
63071             nodeColor(sibling.right) === RED &&
63072             nodeColor(sibling.left) === BLACK) {
63073
63074             sibling.color = RED;
63075             sibling.right.color = BLACK;
63076             this.rotateLeft(sibling);
63077         }
63078
63079         this.deleteCase6(node);
63080     };
63081
63082     Balancer.prototype.deleteCase6 = function(node) {
63083         var sibling = node.sibling();
63084
63085         sibling.color = nodeColor(node.parent);
63086         node.parent.color = BLACK;
63087
63088         if (node === node.parent.left) {
63089             sibling.right.color = BLACK;
63090             this.rotateLeft(node.parent);
63091         } else {
63092             sibling.left.color = BLACK;
63093             this.rotateRight(node.parent);
63094         }
63095     };
63096
63097     // Helpers
63098     // ---------------
63099
63100     function nodeColor(node) {
63101         return node === null ? BLACK : node.color;
63102     };
63103
63104     function find(node, key) {
63105         while (node !== null) {
63106             if (key === node.key) {
63107                 return node;
63108             } else if (key < node.key) {
63109                 node = node.left;
63110             } else if (key > node.key) {
63111                 node = node.right;
63112             }
63113         }
63114
63115         return node;
63116     };
63117
63118 })();
63119 /*
63120         meSpeak  v.1.9.6
63121         based on speak.js, https://github.com/kripken/speak.js
63122         eSpeak and other code here are under the GNU GPL.
63123         meSpeak (Modular eSpeak) is a mod of 'speak.js' by N.Landsteiner (2011-2014), www.masswerk.at
63124         adding support for Webkit/Safari and external voice-modules
63125         v.1.1 and later default to play via the Web Audio API and uses the HTMLAudioElement as a second option.
63126         official project page: http://www.masswerk.at/mespeak
63127 */
63128 var meSpeak=(function(){"use strict";function ESpeak(){var vprint=(self.console)?console.log:function(){};var Module={noInitialRun:true};"use strict";if(!Module.arguments){try{Module.arguments=arguments;}catch(e){Module.arguments=[];}}
63129 var Runtime={stackSave:function(){return STACKTOP;},stackRestore:function(stackTop){STACKTOP=stackTop;},forceAlign:function(target,quantum){quantum=quantum||4;if(isNumber(target)&&isNumber(quantum)){return Math.ceil(target/quantum)*quantum;}else{return'Math.ceil(('+target+')/'+quantum+')*'+quantum;}},isNumberType:function(type){return type in Runtime.INT_TYPES||type in Runtime.FLOAT_TYPES;},isPointerType:function isPointerType(type){return pointingLevels(type)>0;},isStructType:function isStructType(type){if(isPointerType(type))return false;if(new RegExp(/^\[\d+\ x\ (.*)\]/g).test(type))return true;if(new RegExp(/<?{ [^}]* }>?/g).test(type))return true;return!Runtime.isNumberType(type)&&type[0]=='%';},INT_TYPES:{"i1":0,"i8":0,"i16":0,"i32":0,"i64":0},FLOAT_TYPES:{"float":0,"double":0},or64:function(x,y){var l=(x|0)|(y|0);var h=(Math.round(x/4294967296)|Math.round(y/4294967296))*4294967296;return l+h;},and64:function(x,y){var l=(x|0)&(y|0);var h=(Math.round(x/4294967296)&Math.round(y/4294967296))*4294967296;return l+h;},xor64:function(x,y){var l=(x|0)^(y|0);var h=(Math.round(x/4294967296)^Math.round(y/4294967296))*4294967296;return l+h;},getNativeFieldSize:function getNativeFieldSize(type){return Math.max(Runtime.getNativeTypeSize(type),4);},getNativeTypeSize:function getNativeTypeSize(type){if(4==1)return 1;var size={'_i1':1,'_i8':1,'_i16':2,'_i32':4,'_i64':8,"_float":4,"_double":8}['_'+type];if(!size&&type[type.length-1]=='*'){size=4;}
63130 return size;},dedup:function dedup(items,ident){var seen={};if(ident){return items.filter(function(item){if(seen[item[ident]])return false;seen[item[ident]]=true;return true;});}else{return items.filter(function(item){if(seen[item])return false;seen[item]=true;return true;});}},set:function set(){var args=typeof arguments[0]==='object'?arguments[0]:arguments;var ret={};for(var i=0;i<args.length;i++){ret[args[i]]=0;}
63131 return ret;},calculateStructAlignment:function calculateStructAlignment(type){type.flatSize=0;type.alignSize=0;var diffs=[];var prev=-1;type.flatIndexes=type.fields.map(function(field){var size,alignSize;if(Runtime.isNumberType(field)||Runtime.isPointerType(field)){size=Runtime.getNativeTypeSize(field);alignSize=size;}else if(Runtime.isStructType(field)){size=Types.types[field].flatSize;alignSize=Types.types[field].alignSize;}else{dprint('Unclear type in struct: '+field+', in '+type.name_+' :: '+dump(Types.types[type.name_]));assert(0);}
63132 alignSize=type.packed?1:Math.min(alignSize,4);type.alignSize=Math.max(type.alignSize,alignSize);var curr=Runtime.alignMemory(type.flatSize,alignSize);type.flatSize=curr+size;if(prev>=0){diffs.push(curr-prev);}
63133 prev=curr;return curr;});type.flatSize=Runtime.alignMemory(type.flatSize,type.alignSize);if(diffs.length==0){type.flatFactor=type.flatSize;}else if(Runtime.dedup(diffs).length==1){type.flatFactor=diffs[0];}
63134 type.needsFlattening=(type.flatFactor!=1);return type.flatIndexes;},generateStructInfo:function(struct,typeName,offset){var type,alignment;if(typeName){offset=offset||0;type=(typeof Types==='undefined'?Runtime.typeInfo:Types.types)[typeName];if(!type)return null;if(!struct)struct=(typeof Types==='undefined'?Runtime:Types).structMetadata[typeName.replace(/.*\./,'')];if(!struct)return null;assert(type.fields.length===struct.length,'Number of named fields must match the type for '+typeName+'. Perhaps due to inheritance, which is not supported yet?');alignment=type.flatIndexes;}else{var type={fields:struct.map(function(item){return item[0]})};alignment=Runtime.calculateStructAlignment(type);}
63135 var ret={__size__:type.flatSize};if(typeName){struct.forEach(function(item,i){if(typeof item==='string'){ret[item]=alignment[i]+offset;}else{var key;for(var k in item)key=k;ret[key]=Runtime.generateStructInfo(item[key],type.fields[i],alignment[i]);}});}else{struct.forEach(function(item,i){ret[item[1]]=alignment[i];});}
63136 return ret;},stackAlloc:function stackAlloc(size){var ret=STACKTOP;_memset(STACKTOP,0,size);STACKTOP+=size;STACKTOP=Math.ceil((STACKTOP)/4)*4;;return ret;},staticAlloc:function staticAlloc(size){var ret=STATICTOP;STATICTOP+=size;STATICTOP=Math.ceil((STATICTOP)/4)*4;;return ret;},alignMemory:function alignMemory(size,quantum){var ret=size=Math.ceil((size)/(quantum?quantum:4))*(quantum?quantum:4);;return ret;},__dummy__:0}
63137 var CorrectionsMonitor={MAX_ALLOWED:0,corrections:0,sigs:{},note:function(type,succeed,sig){if(!succeed){this.corrections++;if(this.corrections>=this.MAX_ALLOWED)abort('\n\nToo many corrections!');}},vprint:function(){var items=[];for(var sig in this.sigs){items.push({sig:sig,fails:this.sigs[sig][0],succeeds:this.sigs[sig][1],total:this.sigs[sig][0]+this.sigs[sig][1]});}
63138 items.sort(function(x,y){return y.total-x.total;});for(var i=0;i<items.length;i++){var item=items[i];vprint(item.sig+' : '+item.total+' hits, %'+(Math.ceil(100*item.fails/item.total))+' failures');}}};function cRound(x){return x>=0?Math.floor(x):Math.ceil(x);}
63139 var __globalConstructor__=function globalConstructor(){};var __THREW__=false;var __ATEXIT__=[];var ABORT=false;var undef=0;var tempValue,tempInt,tempBigInt;function abort(text){vprint(text+':\n'+(new Error).stack);ABORT=true;throw"Assertion: "+text;}
63140 function assert(condition,text){if(!condition){abort('Assertion failed: '+text);}}
63141 function setValue(ptr,value,type){if(type[type.length-1]==='*')type='i32';switch(type){case'i1':HEAP8[(ptr)]=value;;break;case'i8':HEAP8[(ptr)]=value;;break;case'i16':HEAP16[((ptr)>>1)]=value;;break;case'i32':HEAP32[((ptr)>>2)]=value;;break;case'i64':HEAP32[((ptr)>>2)]=value;;break;case'float':HEAPF32[((ptr)>>2)]=value;;break;case'double':HEAPF32[((ptr)>>2)]=value;;break;default:abort('invalid type for setValue: '+type);}}
63142 Module.setValue=setValue;function getValue(ptr,type){if(type[type.length-1]==='*')type='i32';switch(type){case'i1':return HEAP8[(ptr)];case'i8':return HEAP8[(ptr)];case'i16':return HEAP16[((ptr)>>1)];case'i32':return HEAP32[((ptr)>>2)];case'i64':return HEAP32[((ptr)>>2)];case'float':return HEAPF32[((ptr)>>2)];case'double':return HEAPF32[((ptr)>>2)];default:abort('invalid type for setValue: '+type);}
63143 return null;}
63144 Module.getValue=getValue;var ALLOC_NORMAL=0;var ALLOC_STACK=1;var ALLOC_STATIC=2;Module.ALLOC_NORMAL=ALLOC_NORMAL;Module.ALLOC_STACK=ALLOC_STACK;Module.ALLOC_STATIC=ALLOC_STATIC;function allocate(slab,types,allocator){var zeroinit,size;if(typeof slab==='number'){zeroinit=true;size=slab;}else{zeroinit=false;size=slab.length;}
63145 var ret=[_malloc,Runtime.stackAlloc,Runtime.staticAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,1));var singleType=typeof types==='string'?types:null;var i=0,type;while(i<size){var curr=zeroinit?0:slab[i];if(typeof curr==='function'){curr=Runtime.getFunctionIndex(curr);}
63146 type=singleType||types[i];if(type===0){i++;continue;}
63147 setValue(ret+i,curr,type);i+=Runtime.getNativeTypeSize(type);}
63148 return ret;}
63149 Module.allocate=allocate;function Pointer_stringify(ptr){var ret="";var i=0;var t;var nullByte=String.fromCharCode(0);while(1){t=String.fromCharCode(HEAPU8[(ptr+i)]);if(t==nullByte){break;}else{}
63150 ret+=t;i+=1;}
63151 return ret;}
63152 Module.Pointer_stringify=Pointer_stringify;function Array_stringify(array){var ret="";for(var i=0;i<array.length;i++){ret+=String.fromCharCode(array[i]);}
63153 return ret;}
63154 Module.Array_stringify=Array_stringify;var FUNCTION_TABLE;var PAGE_SIZE=4096;function alignMemoryPage(x){return Math.ceil(x/PAGE_SIZE)*PAGE_SIZE;}
63155 var HEAP;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32;var STACK_ROOT,STACKTOP,STACK_MAX;var STATICTOP;var HAS_TYPED_ARRAYS=false;var TOTAL_MEMORY=Module.TOTAL_MEMORY||52428800;var FAST_MEMORY=Module.FAST_MEMORY||2097152;HAS_TYPED_ARRAYS=false;try{HAS_TYPED_ARRAYS=!!Int32Array&&!!Float32Array&&!!(new Int32Array(1).subarray);}catch(e){}
63156 if(HAS_TYPED_ARRAYS){var buffer=new ArrayBuffer(TOTAL_MEMORY);HEAP8=new Int8Array(buffer);HEAP16=new Int16Array(buffer);HEAP32=new Int32Array(buffer);HEAPU8=new Uint8Array(buffer);HEAPU16=new Uint16Array(buffer);HEAPU32=new Uint32Array(buffer);HEAPF32=new Float32Array(buffer);HEAP32[0]=255;assert(HEAPU8[0]===255&&HEAPU8[3]===0,'Typed arrays 2 must be run on a little-endian system');}else
63157 {abort('Cannot fallback to non-typed array case in USE_TYPED_ARRAYS == 2: Code is too specialized');}
63158 var base=intArrayFromString('(null)');for(var i=0;i<base.length;i++){HEAP8[(i)]=base[i];}
63159 Module.HEAP=HEAP;Module.HEAP8=HEAP8;Module.HEAP16=HEAP16;Module.HEAP32=HEAP32;Module.HEAPU8=HEAPU8;Module.HEAPU16=HEAPU16;Module.HEAPU32=HEAPU32;Module.HEAPF32=HEAPF32;STACK_ROOT=STACKTOP=alignMemoryPage(10);var TOTAL_STACK=1024*1024;STACK_MAX=STACK_ROOT+TOTAL_STACK;STATICTOP=alignMemoryPage(STACK_MAX);function __shutdownRuntime__(){while(__ATEXIT__.length>0){var atexit=__ATEXIT__.pop();var func=atexit.func;if(typeof func==='number'){func=FUNCTION_TABLE[func];}
63160 func(atexit.arg===undefined?null:atexit.arg);}
63161 CorrectionsMonitor.vprint();}
63162 function Array_copy(ptr,num){if(HAS_TYPED_ARRAYS){return Array.prototype.slice.call(HEAP8.subarray(ptr,ptr+num));}else{return HEAP8.slice(ptr,ptr+num);}
63163 return HEAP.slice(ptr,ptr+num);}
63164 Module.Array_copy=Array_copy;function String_len(ptr){var i=0;while(HEAP8[(ptr+i)])i++;return i;}
63165 Module.String_len=String_len;function String_copy(ptr,addZero){var len=String_len(ptr);if(addZero)len++;var ret=Array_copy(ptr,len);if(addZero)ret[len-1]=0;return ret;}
63166 Module.String_copy=String_copy;if(typeof self.console==='object'&&typeof console.log==='function'){this.vprint=function(x){console.log(x)};}else if(typeof vprint==='undefined'){this.vprint=function(){};}
63167 function intArrayFromString(stringy,dontAddNull){var ret=[];var t;var i=0;while(i<stringy.length){var chr=stringy.charCodeAt(i);if(chr>0xFF){chr&=0xFF;}
63168 ret.push(chr);i=i+1;}
63169 if(!dontAddNull){ret.push(0);}
63170 return ret;}
63171 Module.intArrayFromString=intArrayFromString;function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>0xFF){chr&=0xFF;}
63172 ret.push(String.fromCharCode(chr));}
63173 return ret.join('');}
63174 Module.intArrayToString=intArrayToString;function unSign(value,bits,ignore,sig){if(value>=0){return value;}
63175 return bits<=32?2*Math.abs(1<<(bits-1))+value:Math.pow(2,bits)+value;}
63176 function reSign(value,bits,ignore,sig){if(value<=0){return value;}
63177 var half=bits<=32?Math.abs(1<<(bits-1)):Math.pow(2,bits-1);if(value>=half&&(bits<=32||value>half)){value=-2*half+value;}
63178 return value;}
63179 Runtime.QUANTUM_SIZE=4
63180 var $struct___sFILE___SIZE=104;var $struct___sFILE___FLATTENER=[0,4,8,12,14,16,24,28,32,36,40,44,48,56,60,64,67,68,76,80,84,88,92,100];var $struct___sbuf___SIZE=8;var $struct__reent___SIZE=1060;var $struct__reent___FLATTENER=[0,4,8,12,16,20,48,52,56,60,64,68,72,76,80,84,88,328,332,732,736,748];var $struct__Bigint___SIZE=24;var $union_anon_0___SIZE=240;var $struct_anon_1___SIZE=240;var $struct__atexit___SIZE=400;var $struct__atexit___FLATTENER=[0,4,8,136];var $struct__on_exit_args___SIZE=264;var $struct__on_exit_args___FLATTENER=[0,128,256,260];var $struct__glue___SIZE=12;var $struct__mbstate_t___SIZE=8;var $union_anon___SIZE=4;var $struct_option___SIZE=16;var $struct_MNEM_TAB___SIZE=8;var $struct_MatchRecord___SIZE=16;var $struct_TUNE___SIZE=68;var $struct_TUNE___FLATTENER=[0,12,16,24,25,26,27,28,29,30,31,32,33,34,35,36,39,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,64];var $struct_SYLLABLE___SIZE=6;var $struct_TONE_HEAD___SIZE=16;var $struct_TONE_HEAD___FLATTENER=[0,1,2,3,4,8,9,10,12];var $struct_SSML_STACK___SIZE=76;var $struct_SSML_STACK___FLATTENER=[0,4,8,12,16,56];var $struct_PARAM_STACK_45___SIZE=64;var $struct_ACCENTS___SIZE=8;var $struct_MBROLA_TAB___SIZE=24;var $struct_PHONEME_TAB___SIZE=16;var $struct_PHONEME_TAB___FLATTENER=[0,4,8,10,11,12,13,14,15];var $struct_PHONEME_TAB_LIST_106___SIZE=48;var $struct_PHONEME_TAB_LIST_106___FLATTENER=[0,32,36,40,44];var $struct_frameref_t___SIZE=8;var $struct_frame_t___SIZE=64;var $struct_frame_t___FLATTENER=[0,2,16,17,18,26,32,35,39,44,49,56,63];var $struct_PHONEME_DATA___SIZE=152;var $struct_PHONEME_DATA___FLATTENER=[0,4,68,88,108,124,128,132];var $struct_PHONEME_LIST___SIZE=24;var $struct_PHONEME_LIST___FLATTENER=[0,1,2,3,4,6,8,12,14,15,16,17,18,19,20,21];var $struct_SPEED_FACTORS___SIZE=64;var $struct_voice_t___SIZE=1344;var $struct_voice_t___FLATTENER=[0,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,144,162,180,198,216,234,252,272,308,344];var $struct_SOUND_ICON___SIZE=16;var $struct_Translator___SIZE=8328;var $struct_Translator___FLATTENER=[0,280,284,288,292,332,632,652,656,660,668,676,692,696,700,704,708,964,968,1000,1048,1052,1056,5152,5256,6280,6792,7272,7752,7756,8012,8268,8272,8276,8280,8284,8288,8292,8296,8300,8304,8308,8312,8316,8320,8324];var $struct_LANGUAGE_OPTIONS___SIZE=280;var $struct_LANGUAGE_OPTIONS___FLATTENER=[0,4,8,12,16,20,24,100,176,180,184,188,192,196,200,204,208,212,216,220,224,228,232,240,244,248,249,250,251,252,256,260,264,268,272,276];var $struct_PHONEME_LIST2___SIZE=8;var $struct_PHONEME_LIST2___FLATTENER=[0,1,2,3,4,6];var $struct_REPLACE_PHONEMES___SIZE=3;var $struct_datablock___SIZE=16;var $struct_espeak_VOICE___SIZE=24;var $struct_espeak_VOICE___FLATTENER=[0,4,8,12,13,14,15,16,20];var $struct_wavegen_peaks_t___SIZE=80;var $struct_wavegen_peaks_t___FLATTENER=[0,4,8,12,16,24,32,40,48,56,64,72];var $struct_RESONATOR___SIZE=40;var $struct_WGEN_DATA___SIZE=64;var $struct_sonicStreamStruct___SIZE=88;var $struct_klatt_frame_t___SIZE=288;var $struct_klatt_frame_t___FLATTENER=[0,4,8,48,88,128,168,172,176,180,184,188,192,196,200,204,208,248];var $struct_klatt_global_t___SIZE=2748;var $struct_klatt_global_t___FLATTENER=[0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,64,72,80,88,96,104,112,120,128,136,144,152,160,164,172,176,180,184,188,1468];var $struct_resonator_t___SIZE=64;var $struct_klatt_peaks_t___SIZE=80;var $struct_klatt_peaks_t___FLATTENER=[0,4,8,12,16,24,32,40,48,56,64,72];var $struct_frame_t_199___SIZE=64;var $struct_frame_t_199___FLATTENER=[0,2,16,17,18,26,32,35,39,44,49,56,63];var $struct_stat___SIZE=80;var $struct_stat___FLATTENER=[0,8,12,16,20,24,28,36,40,44,48,52,56,60,64,68,72];var $struct_PARAM_STACK___SIZE=64;var $struct_PHONEME_TAB_LIST___SIZE=48;var $struct_PHONEME_TAB_LIST___FLATTENER=[0,32,36,40,44];var $struct_PHONEME_TAB_11___SIZE=16;var $struct_PHONEME_TAB_11___FLATTENER=[0,4,8,10,11,12,13,14,15];var $struct_RGROUP___SIZE=28;var $struct_RGROUP___FLATTENER=[0,16,20,24];var $struct_WORD_TAB___SIZE=12;var $struct_WORD_TAB___FLATTENER=[0,4,6,8,9,10];var $struct_PHONEME_TAB_LIST_25___SIZE=48;var $struct_PHONEME_TAB_LIST_25___FLATTENER=[0,32,36,40,44];var $struct_WORD_TAB_29___SIZE=12;var $struct_WORD_TAB_29___FLATTENER=[0,4,6,8,9,10];var $struct_Translator_33___SIZE=8328;var $struct_Translator_33___FLATTENER=[0,280,284,288,292,332,632,652,656,660,668,676,692,696,700,704,708,964,968,1000,1048,1052,1056,5152,5256,6280,6792,7272,7752,7756,8012,8268,8272,8276,8280,8284,8288,8292,8296,8300,8304,8308,8312,8316,8320,8324];var $struct_LANGUAGE_OPTIONS_32___SIZE=280;var $struct_LANGUAGE_OPTIONS_32___FLATTENER=[0,4,8,12,16,20,24,100,176,180,184,188,192,196,200,204,208,212,216,220,224,228,232,240,244,248,249,250,251,252,256,260,264,268,272,276];var $struct_TONE_NUCLEUS___SIZE=16;var $struct_TONE_NUCLEUS___FLATTENER=[0,1,2,3,4,5,8,12,13,14];var $struct_PARAM_STACK_54___SIZE=64;var $struct_FMT_PARAMS___SIZE=48;var $struct_FMT_PARAMS_111___SIZE=48;var $struct_SPECT_SEQ___SIZE=1104;var $struct_SPECT_SEQ___FLATTENER=[0,2,3,4];var $struct_frame_t2___SIZE=44;var $struct_frame_t2___FLATTENER=[0,2,16,17,18,26,32,35,39];var $struct_SPECT_SEQK___SIZE=1604;var $struct_SPECT_SEQK___FLATTENER=[0,2,3,4];var $struct_pollfd___SIZE=8;var $struct_pollfd___FLATTENER=[0,4,6];var $struct_dirent___SIZE=1040;var $struct_dirent___FLATTENER=[0,4,1028,1032,1036];var $struct_getopt_data___SIZE=20;var _path_home;var _filetype;var _wavefile;var _uri_callback;var _phoneme_callback;var _f_wave;var _quiet;var _samples_total;var _samples_split;var _wavefile_count;var _end_of_sentence;var _voice_pcnt;var __impure_ptr;var __ZZ13DisplayVoicesP7__sFILEPcE7genders;var __str1;var __str3;var __str4;var __str5;var __ZZ4mainE12long_options;var __str6;var __str7;var __str8;var __str9;var __str10;var __str11;var __str12;var __str13;var __str14;var __str15;var __str16;var __str17;var __str18;var __str19;var __str21;var __str23;var __str25;var __str27;var __str28;var __str29;var __str30;var __ZZL12OpenWaveFilePKciE8wave_hdr;var __str32;var __str33;var __str35;var __str36;var __str37;var __str38;var __str39;var __str40;var __str41;var __ZL5f_log;var __str42;var __str143;var __str244;var __str345;var __str446;var __str547;var __str648;var _mnem_rules;var __str749;var __str850;var __str951;var __str1052;var __str1153;var __str1254;var __str1355;var __str1456;var __str1557;var __str1658;var __str1759;var __str1860;var __str1961;var __str2062;var __str2163;var __str2264;var __str2365;var __str2466;var __str2567;var __str2668;var __str2769;var __str2870;var __str2971;var __str3072;var __str3173;var __str3274;var __str3375;var __str3476;var __str3577;var __str3678;var __str3779;var __str3880;var __str3981;var __str4082;var __str4183;var __str4284;var __str43;var __str44;var __str45;var __str46;var __str47;var __str48;var __str49;var __str50;var __str51;var __str52;var __str53;var __str54;var __str55;var __str56;var __str57;var _mnem_flags;var __ZZ22print_dictionary_flagsPjE3buf;var __str59;var __ZZ10DecodeRulePKciPciE6output;var __ZZ10DecodeRulePKciPciE7symbols;var __ZZ10DecodeRulePKciPciE10symbols_lg;var __str60;var __str61;var __str62;var __str64;var __str65;var __ZL11error_count;var __ZL21error_need_dictionary;var __ZL19letterGroupsDefined;var __ZL10debug_flag;var __str66;var __str67;var __str69;var __str71;var __str72;var __str73;var __str74;var __str75;var __str76;var __str77;var __str78;var __ZL7linenum;var __ZL10group_name;var __str79;var __ZL9group3_ix;var __str81;var __str82;var __str83;var __str84;var __str85;var __str89;var __ZL9rule_cond;var __ZL8rule_pre;var __ZL9rule_post;var __ZL10rule_match;var __ZL13rule_phonemes;var __str90;var __str91;var __str92;var __str93;var __str94;var __str95;var __ZZL16copy_rule_stringPcRiE6outbuf;var __ZZL16copy_rule_stringPcRiE10next_state;var __ZZL16copy_rule_stringPcRiE16lettergp_letters;var __str97;var __str98;var __str99;var __str100;var __str101;var __str102;var __str103;var __ZL11hash_chains;var __ZL11hash_counts;var __ZL9text_mode_b;var __str104;var __str106;var __str107;var __ZZL12compile_linePcS_PiE10nullstring;var __str108;var __str109;var __str110;var __str111;var __str112;var __str113;var __str114;var __str115;var _dictionary_skipwords;var _dictionary_name;var __ZL13remove_accent;var __str116;var __str2118;var __str3119;var __str4120;var __str5121;var __str7123;var _ipa1;var __str8124;var __str9125;var __ZL15stress_phonemes;var __ZZ13SetWordStressP10TranslatorPcPjiiE15consonant_types;var __ZZ13SetWordStressP10TranslatorPcPjiiE8guess_ru;var __ZZ13SetWordStressP10TranslatorPcPjiiE10guess_ru_v;var __ZZ13SetWordStressP10TranslatorPcPjiiE10guess_ru_t;var __ZZ14TranslateRulesP10TranslatorPcS1_iS1_iPjE9str_pause;var __str10126;var __str11127;var __ZL13diereses_list;var __ZZ14LookupDictListP10TranslatorPPcS1_PjiP8WORD_TABE16word_replacement;var __str15131;var __str16132;var __ZZ11LookupFlagsP10TranslatorPKcE5flags;var __ZZ12RemoveEndingP10TranslatorPciS1_E6ending;var __ZZ12RemoveEndingP10TranslatorPciS1_E16add_e_exceptions;var __str17133;var __ZZ12RemoveEndingP10TranslatorPciS1_E15add_e_additions;var __str18134;var __str19135;var __str20136;var __str21137;var __str22138;var __str23139;var __str24140;var __str25141;var __str27143;var __str28144;var __str29145;var __str30146;var __str31147;var __ZZL9MatchRuleP10TranslatorPPcS1_iS1_P11MatchRecordiiE4best;var __str32148;var __str34150;var _env_fall;var _env_rise;var _env_frise;var __ZL11env_r_frise;var __ZL10env_frise2;var __ZL12env_r_frise2;var __ZL12env_risefall;var __ZL13env_fallrise3;var __ZL13env_fallrise4;var __ZL9env_fall2;var __ZL9env_rise2;var __ZL16env_risefallrise;var _envelope_data;var __ZL18tone_nucleus_table;var _punctuation_to_tone;var _n_tunes;var _tunes;var __ZL12syllable_tab;var __ZL8no_tonic_b;var __ZL15tone_head_table;var __ZL10number_pre;var __ZL10tone_posn2;var __ZL9tone_posn;var __ZL11number_tail;var __ZL14tone_pitch_env;var __ZZL18calc_pitch_segmentiiP9TONE_HEADP12TONE_NUCLEUSiiE12continue_tab;var __ZL8min_drop;var __ZL7drops_0;var __ZL5oflow;var __ZL9oflow_emf;var __ZL10oflow_less;var __ZL12last_primary;var _namedata;var __ZL7f_input;var _p_textinput;var _p_wchar_input;var __ZL10ungot_word;var _count_characters;var __ZL10ssml_stack;var __ZL16current_voice_id;var _param_stack;var _param_defaults;var _walpha_tab;var __ZL10ungot_char;var __ZL12end_of_input_b;var __str167;var __str1168;var __str2169;var __str3170;var __str4171;var __str5172;var __str6173;var __str7174;var __str8175;var __str9176;var __str10177;var __str11178;var __str12179;var __str13180;var __str14181;var __str15182;var __str16183;var __str17184;var __str18185;var __str19186;var __str20187;var __str21188;var __str22189;var __str23190;var __str24191;var __str25192;var __str26193;var __str27194;var __str28195;var __str29196;var __str30197;var __str31198;var __ZL8ssmltags;var __ZL10n_namedata;var __ZL11namedata_ix;var __str32199;var __str33200;var __str34201;var __str35202;var __str36203;var __str37204;var __ZL18xml_char_mnemonics;var __ZZ10ReadClauseP10TranslatorP7__sFILEPcPsPiiS5_S3_E12ungot_string;var __ZZ10ReadClauseP10TranslatorP7__sFILEPcPsPiiS5_S3_E15ungot_string_ix;var __ZL19clear_skipping_text_b;var __ZL11ungot_char2;var __ZL19ssml_ignore_l_angle;var __str38205;var __ZL10sayas_mode;var __ZL11ignore_text_b;var __ZL11punct_chars;var __ZL16punct_attributes;var __str41208;var __ZL12chars_ignore;var __str42209;var __ZL10audio_text_b;var __ZL17speech_parameters;var __ZL12n_ssml_stack;var __ZL13n_param_stack;var __ZL7xmlbase;var __ZZL14LookupCharNameP10TranslatoriiE3buf;var __str47214;var __str48215;var __str49216;var __ZZL13WordToString2jE3buf;var __str50217;var __str51218;var __str52219;var __str53220;var __str54221;var __str55222;var __str57224;var __str58225;var __str59226;var __str60227;var __ZZL14ProcessSsmlTagPwPcRiiiE10mnem_punct;var __str61228;var __str62229;var __str63230;var __ZZL14ProcessSsmlTagPwPcRiiiE13mnem_capitals;var __str64231;var __str65232;var __str66233;var __ZZL14ProcessSsmlTagPwPcRiiiE17mnem_interpret_as;var __str68235;var __str69236;var __str70237;var __str71238;var __str72239;var __ZZL14ProcessSsmlTagPwPcRiiiE17mnem_sayas_format;var __str73240;var __ZZL14ProcessSsmlTagPwPcRiiiE10mnem_break;var __str74241;var __str75242;var __str76243;var __str77244;var __ZZL14ProcessSsmlTagPwPcRiiiE13mnem_emphasis;var __str78245;var __str79246;var __ZZL14ProcessSsmlTagPwPcRiiiE12prosody_attr;var __str80247;var __str81248;var __str82249;var __ZL22ignore_if_self_closing;var __str83250;var __str84251;var __str85252;var __str86253;var __str87254;var __ZZL14ProcessSsmlTagPwPcRiiiE23emphasis_to_pitch_range;var __ZZL14ProcessSsmlTagPwPcRiiiE18emphasis_to_volume;var __str88255;var __str89256;var __str90257;var __str91258;var __ZL11sayas_start;var __str92259;var __str94261;var __str95262;var __str96263;var __str97264;var __str98265;var __str99266;var __ZZL14ProcessSsmlTagPwPcRiiiE11break_value;var __str100267;var __str101268;var __str102269;var __ZZL18GetVoiceAttributesPwiE11mnem_gender;var __str105272;var __str106273;var __str108275;var __ZZL14LoadSoundFile2PKcE4slot;var __str111278;var __str112279;var __str113280;var __str114281;var __ZZL14ReplaceKeyNamePciRiE8keynames;var __ZZL19SetProsodyParameteriPwP11PARAM_STACKE11mnem_volume;var __str115282;var __str116283;var __str117;var __str118;var __str119;var __ZZL19SetProsodyParameteriPwP11PARAM_STACKE9mnem_rate;var __str120;var __str121;var __str122;var __str123;var __ZZL19SetProsodyParameteriPwP11PARAM_STACKE10mnem_pitch;var __str124;var __str125;var __str126;var __str127;var __ZZL19SetProsodyParameteriPwP11PARAM_STACKE10mnem_range;var __ZZL19SetProsodyParameteriPwP11PARAM_STACKE9mnem_tabs;var __ZZL17ProcessParamStackPcRiE10cmd_letter;var __str128;var __ZZL16GetSsmlAttributePwPKcE5empty;var __ZZL4GetCvE6ungot2;var __ZZL4GetCvE5mask2;var __ZL6speed1;var __ZL6speed2;var __ZL6speed3;var __ZL12speed_lookup;var __ZL14wav_factor_350;var __ZL16pause_factor_350;var __ZZ11CalcLengthsP10TranslatorE14more_syllables;var __str294;var __ZL18letter_accents_0e0;var __ZL18letter_accents_250;var __ZL13non_ascii_tab;var __ZL11accents_tab;var __str297;var __str1298;var __str2299;var __ZZ12LookupLetterP10TranslatorjiPciE13single_letter;var __str5302;var __str6303;var __str7304;var __str8305;var __str9306;var __str10307;var __str11308;var __str12309;var __ZZ14TranslateRomanP10TranslatorPcS1_P8WORD_TABE12roman_values;var __str13310;var __str14311;var __ZZL17TranslateNumber_1P10TranslatorPcS1_PjP8WORD_TABiE9str_pause;var __ZL14n_digit_lookup;var __ZL12digit_lookup;var __ZL14number_control;var __ZL23speak_missing_thousands;var __ZL11ph_ordinal2;var __str15312;var __str16313;var __str17314;var __str18315;var __str19316;var __str20317;var __str21318;var __str22319;var __str23320;var __str24321;var __str25322;var __str26323;var __str27324;var __str28325;var __str29326;var __str30327;var __str31328;var __str32329;var __str33330;var __str35332;var __str36333;var __str37334;var __str39336;var __str40337;var __str41338;var __str42339;var __str43340;var __str44341;var __str45342;var __str46343;var __str47344;var __str48345;var __str49346;var __str50347;var __str51348;var __str52349;var __str53350;var __str54351;var __str55352;var __str56353;var __str57354;var __str58355;var __str59356;var __str60357;var __str61358;var __str62359;var __str63360;var __str64361;var __str65362;var __str66363;var __str67364;var __str68365;var __str69366;var __str70367;var __str71368;var __str72369;var __str73370;var __str74371;var __str75372;var __str76373;var __str77374;var __str78375;var _option_mbrola_phonemes;var __ZL10mbrola_tab;var __ZL15mbr_name_prefix;var __str382;var __str1383;var __str2384;var __str3385;var __str4386;var __ZL14mbrola_control;var __ZZ15MbrolaTranslateP12PHONEME_LISTiiP7__sFILEE4phix;var __ZZ15MbrolaTranslateP12PHONEME_LISTiiP7__sFILEE11embedded_ix;var __ZZ15MbrolaTranslateP12PHONEME_LISTiiP7__sFILEE10word_count;var __str6388;var __str8390;var __str9391;var __str10392;var __str11393;var __str12394;var __ZZ10MbrolaFilliiE9n_samples;var __ZZL10WritePitchiiiiiE6output;var __str13395;var __str14396;var __str15397;var __str16398;var __ZZL10GetMbrNameP12PHONEME_LISTP11PHONEME_TABS2_S2_PiS3_S3_E4mnem;var __str399;var _version_string;var _version_phdata;var _option_device_number;var _f_logespeak;var _logging_type;var _n_phoneme_tab;var _current_phoneme_table;var _phoneme_tab;var _phoneme_tab_flags;var _phoneme_index;var _phondata_ptr;var _wavefile_data;var __ZL16phoneme_tab_data;var _n_phoneme_tables;var _phoneme_tab_list;var _phoneme_tab_number;var _wavefile_ix;var _wavefile_amp;var _wavefile_ix2;var _wavefile_amp2;var _seq_len_adjust;var _vowel_transition;var _vowel_transition0;var _vowel_transition1;var __str1412;var __str2413;var __str3414;var __str4415;var __ZZ11LookupSpectP11PHONEME_TABiP10FMT_PARAMSPiP12PHONEME_LISTE10frames_buf;var __str5416;var __str7418;var __str9420;var __str10421;var __str11422;var __str13424;var __str15426;var __str16427;var _this_ph_data;var __ZZL13NumInstnWordsPtE7n_words;var __ZZL18InterpretConditionP10TranslatoriP12PHONEME_LISTiE11ph_position;var __ZZL15StressConditionP10TranslatorP12PHONEME_LISTiiE15condition_level;var __str17428;var __str18429;var __str19430;var _n_phoneme_list;var _phoneme_list;var _mbrola_delay;var _mbrola_name;var _speed;var __ZL9new_voice;var _n_soundicon_tab;var _soundicon_tab;var __ZZ12WordToStringjE3buf;var __ZL14last_pitch_cmd;var __ZL12last_amp_cmd;var __ZL10last_frame;var __ZL15syllable_centre;var __ZZ18FormantTransition2P10frameref_tRijjP11PHONEME_TABiE10vcolouring;var __ZL10modn_flags;var __ZZ8DoSpect2P11PHONEME_TABiP10FMT_PARAMSP12PHONEME_LISTiE9wave_flag_b;var __ZL13fmt_amplitude;var __ZL10last_wcmdq;var __ZL12pitch_length;var __ZL10amp_length;var __ZZ8GenerateP12PHONEME_LISTPiiE2ix;var __ZZ8GenerateP12PHONEME_LISTPiiE11embedded_ix;var __ZZ8GenerateP12PHONEME_LISTPiiE10word_count;var __ZZ8GenerateP12PHONEME_LISTPiiE8sourceix;var __ZL14syllable_start;var __ZL12syllable_end;var __ZL8timer_on_b;var __ZL6paused_b;var __ZZ15SpeakNextClauseP7__sFILEPKviE6f_text;var __ZZ15SpeakNextClauseP7__sFILEPKviE6p_text;var __str459;var __str1460;var __ZZL13set_frame_rmsP7frame_tiE8sqrt_tab;var __ZZL10AllocFramevE2ix;var __ZZL10AllocFramevE10frame_pool;var _translator;var _translator2;var __ZL20translator2_language;var _f_trans;var _option_tone2;var _option_tone_flags;var _option_phonemes;var _option_phoneme_events;var _option_quiet;var _option_endpause;var _option_capitals;var _option_punctuation;var _option_sayas;var _option_ssml;var _option_phoneme_input;var _option_phoneme_variants;var _option_wordgap;var _skip_sentences;var _skip_words;var _skip_characters;var _skip_marker;var _skipping_text;var _end_character_position;var _count_sentences;var _count_words;var _clause_start_char;var _clause_start_word;var _new_sentence;var _pre_pause;var _word_phonemes;var _n_ph_list2;var _ph_list2;var _option_punctlist;var _ctrl_embedded;var _option_multibyte;var _option_linelength;var _embedded_list;var _n_replace_phonemes;var _replace_phonemes;var __ZL10ISO_8859_1;var __ZL10ISO_8859_2;var __ZL10ISO_8859_3;var __ZL10ISO_8859_4;var __ZL10ISO_8859_5;var __ZL10ISO_8859_7;var __ZL10ISO_8859_9;var __ZL11ISO_8859_14;var __ZL6KOI8_R;var __ZL5ISCII;var _charsets;var __ZL15length_mod_tabs;var __ZZ7IsAlphajE18extra_indic_alphas;var __ZL8brackets;var __ZZ8utf8_outjPcE4code;var __ZZ8utf8_in2PiPKciE4mask;var __str543;var __str1544;var __ZZ13TranslateWordP10TranslatorPciP8WORD_TABE7word_zz;var __ZZ13TranslateWordP10TranslatorPciP8WORD_TABE7word_iz;var __ZZ13TranslateWordP10TranslatorPciP8WORD_TABE7word_ss;var __str2545;var __str4547;var __str5548;var __str6549;var __ZL18any_stressed_words_b;var __ZZ15TranslateClauseP10TranslatorP7__sFILEPKvPiPPcE17voice_change_name;var __ZL11embedded_ix;var __ZL13embedded_read;var __ZL6source;var __str7550;var __str8551;var __ZL16max_clause_pause;var __ZL13option_sayas2;var __ZL18count_sayas_digits;var __ZL6breaks;var __ZL13word_emphasis_b;var __ZL15option_emphasis;var __ZL13embedded_flag_b;var __str9552;var __str10553;var __str11554;var __ZZL13TranslateCharP10TranslatorPcijjPiE20hangul_compatibility;var __ZZL14SubstituteCharP10TranslatorjjPiE11ignore_next_b;var __str12555;var __ZL14length_mods_en;var __ZL15length_mods_en0;var __ZL17length_mods_equal;var __str580;var __str1581;var __str2582;var __str3583;var __str4584;var __ZL14mbr_samplerate;var __ZL14mbr_voice_path;var __ZL10mbr_volume;var __ZL9mbr_state;var __ZL7mbr_pid;var __ZL10mbr_cmd_fd;var __str5585;var __ZL12mbr_audio_fd;var __ZL12mbr_errorbuf;var __ZL12mbr_error_fd;var __str7587;var __str8588;var __str9589;var __str10590;var __str11591;var __str12592;var __str13593;var __str14594;var __str15595;var __str16596;var __str17597;var __ZL21mbr_pending_data_head;var __ZL21mbr_pending_data_tail;var __str18598;var __str19599;var __str20600;var __str21601;var __ZL13mbr_proc_stat;var __str22602;var __str23603;var __str24604;var __str25605;var __str27607;var __str28608;var __str30610;var __str31611;var __str32612;var __str33613;var __str34614;var __str35615;var __ZZ15SetIndicLettersP10TranslatorE15dev_consonants2;var __ZZ16SelectTranslatorPKcE17stress_lengths_fr;var __ZZ16SelectTranslatorPKcE14stress_amps_fr;var __ZZ16SelectTranslatorPKcE14stress_amps_sk;var __ZZ16SelectTranslatorPKcE17stress_lengths_sk;var __ZZ16SelectTranslatorPKcE17stress_lengths_ta;var __ZZ16SelectTranslatorPKcE14stress_amps_ta;var __ZZ16SelectTranslatorPKcE17stress_lengths_af;var __ZZ16SelectTranslatorPKcE17stress_lengths_bn;var __ZZ16SelectTranslatorPKcE14stress_amps_bn;var __ZZ16SelectTranslatorPKcE17stress_lengths_cy;var __ZZ16SelectTranslatorPKcE14stress_amps_cy;var __ZZ16SelectTranslatorPKcE17stress_lengths_da;var __ZZ16SelectTranslatorPKcE17stress_lengths_de;var __ZZ16SelectTranslatorPKcE14stress_amps_de;var __ZZ16SelectTranslatorPKcE17stress_lengths_en;var __str630;var __ZZ16SelectTranslatorPKcE17stress_lengths_el;var __ZZ16SelectTranslatorPKcE14stress_amps_el;var __ZZ16SelectTranslatorPKcE9el_vowels;var __ZZ16SelectTranslatorPKcE10el_fvowels;var __ZZ16SelectTranslatorPKcE12el_voiceless;var __ZZ16SelectTranslatorPKcE13el_consonants;var __ZZ16SelectTranslatorPKcE18el_char_apostrophe;var __ZZ16SelectTranslatorPKcE17stress_lengths_eo;var __ZZ16SelectTranslatorPKcE14stress_amps_eo;var __ZZ16SelectTranslatorPKcE18eo_char_apostrophe;var __ZZ16SelectTranslatorPKcE17stress_lengths_es;var __ZZ16SelectTranslatorPKcE14stress_amps_es;var __ZZ16SelectTranslatorPKcE20ca_punct_within_word;var __ZZ16SelectTranslatorPKcE17stress_lengths_eu;var __ZZ16SelectTranslatorPKcE14stress_amps_eu;var __ZZ16SelectTranslatorPKcE14stress_amps_fi;var __ZZ16SelectTranslatorPKcE17stress_lengths_fi;var __ZZ16SelectTranslatorPKcE17stress_lengths_hi;var __ZZ16SelectTranslatorPKcE14stress_amps_hi;var __ZZ16SelectTranslatorPKcE14stress_amps_hr;var __ZZ16SelectTranslatorPKcE17stress_lengths_hr;var __ZZ16SelectTranslatorPKcE17stress_lengths_sr;var __ZL22replace_cyrillic_latin;var __ZZ16SelectTranslatorPKcE14stress_amps_hu;var __ZZ16SelectTranslatorPKcE17stress_lengths_hu;var __ZZ16SelectTranslatorPKcE17stress_lengths_hy;var __ZZ16SelectTranslatorPKcE9hy_vowels;var __ZZ16SelectTranslatorPKcE13hy_consonants;var __ZZ16SelectTranslatorPKcE17stress_lengths_id;var __ZZ16SelectTranslatorPKcE14stress_amps_id;var __ZZ16SelectTranslatorPKcE17stress_lengths_is;var __ZZ16SelectTranslatorPKcE16is_lettergroup_B;var __str1631;var __str2632;var __ZZ16SelectTranslatorPKcE17stress_lengths_it;var __ZZ16SelectTranslatorPKcE14stress_amps_it;var __ZZ16SelectTranslatorPKcE18stress_lengths_jbo;var __ZZ16SelectTranslatorPKcE21jbo_punct_within_word;var __ZZ16SelectTranslatorPKcE9ka_vowels;var __ZZ16SelectTranslatorPKcE13ka_consonants;var __ZZ16SelectTranslatorPKcE10ko_ivowels;var __ZZ16SelectTranslatorPKcE9ko_voiced;var __ZZ16SelectTranslatorPKcE14stress_amps_ku;var __ZZ16SelectTranslatorPKcE17stress_lengths_ku;var __ZZ16SelectTranslatorPKcE14stress_amps_lv;var __ZZ16SelectTranslatorPKcE17stress_lengths_lv;var __ZZ16SelectTranslatorPKcE15vowels_cyrillic;var __ZZ16SelectTranslatorPKcE14stress_amps_mk;var __ZZ16SelectTranslatorPKcE17stress_lengths_mk;var __ZZ16SelectTranslatorPKcE17stress_lengths_nl;var __str3633;var __ZZ16SelectTranslatorPKcE17stress_lengths_no;var __ZZ16SelectTranslatorPKcE14stress_amps_om;var __ZZ16SelectTranslatorPKcE17stress_lengths_om;var __ZZ16SelectTranslatorPKcE17stress_lengths_pl;var __ZZ16SelectTranslatorPKcE14stress_amps_pl;var __ZZ16SelectTranslatorPKcE17stress_lengths_pt;var __ZZ16SelectTranslatorPKcE14stress_amps_pt;var __str4634;var __ZZ16SelectTranslatorPKcE17stress_lengths_ro;var __ZZ16SelectTranslatorPKcE14stress_amps_ro;var __str5635;var __ZZ16SelectTranslatorPKcE17stress_lengths_sq;var __ZZ16SelectTranslatorPKcE14stress_amps_sq;var __ZZ16SelectTranslatorPKcE14stress_amps_sv;var __ZZ16SelectTranslatorPKcE17stress_lengths_sv;var __ZZ16SelectTranslatorPKcE17stress_lengths_sw;var __ZZ16SelectTranslatorPKcE14stress_amps_sw;var __ZZ16SelectTranslatorPKcE14stress_amps_tr;var __ZZ16SelectTranslatorPKcE17stress_lengths_tr;var __ZZ16SelectTranslatorPKcE17stress_lengths_vi;var __ZZ16SelectTranslatorPKcE14stress_amps_vi;var __ZZ16SelectTranslatorPKcE9vowels_vi;var __ZZ16SelectTranslatorPKcE17stress_lengths_zh;var __ZZ16SelectTranslatorPKcE14stress_amps_zh;var __ZZL18Translator_RussianP10TranslatorE14stress_amps_ru;var __ZZL18Translator_RussianP10TranslatorE17stress_lengths_ru;var __ZZL18Translator_RussianP10TranslatorE11ru_ivowels2;var __ZZL18SetCyrillicLettersP10TranslatorE9ru_vowels;var __ZZL18SetCyrillicLettersP10TranslatorE13ru_consonants;var __ZZL18SetCyrillicLettersP10TranslatorE7ru_soft;var __ZZL18SetCyrillicLettersP10TranslatorE7ru_hard;var __ZZL18SetCyrillicLettersP10TranslatorE10ru_nothard;var __ZZL18SetCyrillicLettersP10TranslatorE9ru_voiced;var __ZZL18SetCyrillicLettersP10TranslatorE10ru_ivowels;var __ZL8pairs_ru;var __ZZL13NewTranslatorvE12stress_amps2;var __ZZL13NewTranslatorvE15stress_lengths2;var __ZZL13NewTranslatorvE13empty_wstring;var __ZZL13NewTranslatorvE13punct_in_word;var __ZZL13NewTranslatorvE13default_tunes;var __str6636;var __str7637;var __str8638;var __str9639;var __str10640;var __str11641;var __str12642;var __str13643;var __str646;var __str1647;var __str2648;var _genders;var _tone_points;var _formant_rate;var _voice_selected;var __str3653;var __str4654;var __ZL11options_tab;var __str5655;var __str6656;var __str7657;var __str8658;var __str9659;var __str10660;var __str11661;var __str12662;var __str13663;var __str14664;var __str15665;var __str16666;var __str17667;var __str18668;var __str19669;var __str20670;var __str21671;var __str22672;var __str23673;var __str24674;var __str25675;var __str26676;var __str27677;var __str28678;var __str29679;var __str30680;var __str31681;var __str32682;var __str33683;var __str34684;var __str35685;var __str36686;var __str37687;var __str38688;var __str39689;var __str40690;var __str41691;var __str42692;var __str43693;var __ZL11keyword_tab;var __ZL15variants_either;var __ZL13variants_male;var __ZL15variants_female;var _variant_lists;var __ZL9voicedata;var _voice;var __str44696;var __ZZ10VoiceResetiE15default_heights;var __ZZ10VoiceResetiE14default_widths;var __ZZ10VoiceResetiE13breath_widths;var __ZL18formant_rate_22050;var __ZZ9LoadVoicePKciE16voice_identifier;var __ZZ9LoadVoicePKciE10voice_name;var __ZZ9LoadVoicePKciE15voice_languages;var __str45697;var __str46698;var __str47699;var __str48700;var __str49701;var __str50702;var __str51703;var __str52704;var __str53705;var __str54706;var __str55707;var __str56708;var __str57709;var __str58710;var __str59711;var __str60712;var __str61713;var __str62714;var __str63715;var __str64716;var __str65717;var __str66718;var __str67719;var __str68720;var __str69721;var __ZL13n_voices_list;var __ZL11voices_list;var __str70722;var __ZZ11SelectVoiceP12espeak_VOICEPiE14voice_variants;var __ZZ11SelectVoiceP12espeak_VOICEPiE8voice_id;var __ZZ11SelectVoiceP12espeak_VOICEPiE3buf;var __str71723;var __ZZ14SetVoiceByNamePKcE3buf;var __ZZ17espeak_ListVoicesE6voices;var __str72724;var __ZL15len_path_voices;var __str73725;var __str74726;var __str75727;var __ZZL23ExtractVoiceVariantNamePciE12variant_name;var __str76728;var __str77729;var __str78730;var __str79731;var __str80732;var __str81733;var __str82734;var _sin_tab;var _wvoice;var _f_log;var _option_waveout;var _option_log_frames;var _embedded_value;var _samplerate;var _samplerate_native;var __ZL5peaks;var _echo_head;var _echo_tail;var _echo_amp;var _echo_buf;var __ZL7rbreath;var _wdata;var __ZL13amplitude_env;var _out_ptr;var _out_start;var _out_end;var _outbuf_size;var _wcmdq;var _wcmdq_head;var _wcmdq_tail;var _embedded_default;var _current_source_index;var __ZL18sonicSpeedupStream;var _sonicSpeed;var _pitch_adjust_tab;var _pk_shape1;var __ZL16PHASE_INC_FACTOR;var __ZL11Flutter_inc;var __ZL11samplecount;var __ZL8nsamples;var __ZL9wavephase;var __ZL12wavemult_max;var __ZL15wavemult_offset;var __ZL8wavemult;var __ZL9pk_shape2;var __ZL8pk_shape;var __ZZ12GetAmplitudevE12amp_emphasis;var __ZL17general_amplitude;var __ZL11peak_height;var __ZL13peak_harmonic;var __ZL16option_harmonic1_b;var __ZL9harmspect;var __ZL8harm_inc;var __ZL10minus_pi_t;var __ZL8two_pi_t;var __ZZ7WavegenvE4maxh;var __ZZ7WavegenvE5maxh2;var __ZZ7WavegenvE3agc;var __ZZ7WavegenvE13h_switch_sign;var __ZZ7WavegenvE11cycle_count;var __ZZ7WavegenvE10amplitude2;var __ZL8end_wave_b;var __ZL7hswitch;var __ZL6hspect;var __ZL8phaseinc;var __ZL13cycle_samples;var __ZL9hf_factor;var __ZL6cbytes;var __ZL12glottal_flag;var __ZL14glottal_reduce;var __ZL6amp_ix;var __ZL15modulation_type;var __ZL14modulation_tab;var __ZL7voicing;var __ZL12embedded_max;var __ZZ15WavegenSetVoiceP7voice_tE2v2;var __ZL13consonant_amp;var __ZL11flutter_amp;var __ZZ8SetSynthiiP7frame_tS0_P7voice_tE19glottal_reduce_tab1;var __ZZ8SetSynthiiP7frame_tS0_P7voice_tE19glottal_reduce_tab2;var __ZL17samplecount_start;var __ZZ12WavegenFill2iE6resume;var __ZZ12WavegenFill2iE13echo_complete;var __ZL11echo_length;var __ZL7amp_inc;var __ZZL8PlayWaveiiPhiiE9n_samples;var __ZZL8PlayWaveiiPhiiE2ix;var __ZZL11PlaySilenceiiE9n_samples;var __ZZL17AdvanceParametersvE10Flutter_ix;var __ZL11Flutter_tab;var _pause_phonemes;var __ZZ15MakePhonemeListP10TranslatoriiE12types_double;var __ZL8kt_frame;var __ZL10kt_globals;var __ZL5peaks801;var __ZL12sample_count;var __ZL8nsamples802;var __ZL6klattp;var __ZL10klattp_inc;var __ZL7klattp1;var __ZL8end_wave803;var __ZZ14SetSynth_KlattiiP7frame_tS0_P7voice_tiE7prev_fr;var __ZL13scale_wav_tab;var __ZZ9KlattInitvE15natural_samples;var __ZZ9KlattInitvE10formant_hz;var __ZZ9KlattInitvE9bandwidth;var __ZZ9KlattInitvE12parallel_amp;var __ZZ9KlattInitvE11parallel_bw;var __ZZL7parwaveP13klatt_frame_tE5noise;var __ZZL7parwaveP13klatt_frame_tE5voice;var __ZZL7parwaveP13klatt_frame_tE5vlast;var __ZZL7parwaveP13klatt_frame_tE8glotlast;var __ZZL7parwaveP13klatt_frame_tE5sourc;var __ZZL21pitch_synch_par_resetP13klatt_frame_tE4skew;var __ZZL21pitch_synch_par_resetP13klatt_frame_tE2B0;var __ZZL7DBtoLINlE8amptable;var __ZZL14natural_sourcevE5vwave;var __ZZL16impulsive_sourcevE7doublet;var __ZZL16impulsive_sourcevE5vwave;var __ZZL9gen_noisedE5nlast;var __ZZL7flutterP13klatt_frame_tE10time_count;var __ZZL10frame_initP13klatt_frame_tE14amp_par_factor;var __str810;var __str1811;var _optarg;var _optind;var _opterr;var _optopt;var __ZL8optwhere;var __str831;var __str1832;var __str2833;var __str3834;var __str4835;var __str5836;var __str6837;var _llvm_dbg_declare;var ERRNO_CODES={E2BIG:7,EACCES:13,EADDRINUSE:98,EADDRNOTAVAIL:99,EAFNOSUPPORT:97,EAGAIN:11,EALREADY:114,EBADF:9,EBADMSG:74,EBUSY:16,ECANCELED:125,ECHILD:10,ECONNABORTED:103,ECONNREFUSED:111,ECONNRESET:104,EDEADLK:35,EDESTADDRREQ:89,EDOM:33,EDQUOT:122,EEXIST:17,EFAULT:14,EFBIG:27,EHOSTUNREACH:113,EIDRM:43,EILSEQ:84,EINPROGRESS:115,EINTR:4,EINVAL:22,EIO:5,EISCONN:106,EISDIR:21,ELOOP:40,EMFILE:24,EMLINK:31,EMSGSIZE:90,EMULTIHOP:72,ENAMETOOLONG:36,ENETDOWN:100,ENETRESET:102,ENETUNREACH:101,ENFILE:23,ENOBUFS:105,ENODATA:61,ENODEV:19,ENOENT:2,ENOEXEC:8,ENOLCK:37,ENOLINK:67,ENOMEM:12,ENOMSG:42,ENOPROTOOPT:92,ENOSPC:28,ENOSR:63,ENOSTR:60,ENOSYS:38,ENOTCONN:107,ENOTDIR:20,ENOTEMPTY:39,ENOTRECOVERABLE:131,ENOTSOCK:88,ENOTSUP:95,ENOTTY:25,ENXIO:6,EOVERFLOW:75,EOWNERDEAD:130,EPERM:1,EPIPE:32,EPROTO:71,EPROTONOSUPPORT:93,EPROTOTYPE:91,ERANGE:34,EROFS:30,ESPIPE:29,ESRCH:3,ESTALE:116,ETIME:62,ETIMEDOUT:110,ETXTBSY:26,EWOULDBLOCK:11,EXDEV:18};function ___setErrNo(value){if(!___setErrNo.ret)___setErrNo.ret=allocate([0],'i32',ALLOC_STATIC);HEAP32[((___setErrNo.ret)>>2)]=value;return value;}
63181 var _stdin=0;var _stdout=0;var _stderr=0;var __impure_ptr=0;var FS={currentPath:"/",nextInode:2,streams:[null],ignorePermissions:true,absolutePath:function(relative,base){if(typeof relative!=='string')return null;if(base===undefined)base=FS.currentPath;if(relative&&relative[0]=='/')base='';var full=base+'/'+relative;var parts=full.split('/').reverse();var absolute=[''];while(parts.length){var part=parts.pop();if(part==''||part=='.'){}else if(part=='..'){if(absolute.length>1)absolute.pop();}else{absolute.push(part);}}
63182 return absolute.length==1?'/':absolute.join('/');},analyzePath:function(path,dontResolveLastLink,linksVisited){var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};path=FS.absolutePath(path);if(path=='/'){ret.isRoot=true;ret.exists=ret.parentExists=true;ret.name='/';ret.path=ret.parentPath='/';ret.object=ret.parentObject=FS.root;}else if(path!==null){linksVisited=linksVisited||0;path=path.slice(1).split('/');var current=FS.root;var traversed=[''];while(path.length){if(path.length==1&&current.isFolder){ret.parentExists=true;ret.parentPath=traversed.length==1?'/':traversed.join('/');ret.parentObject=current;ret.name=path[0];}
63183 var target=path.shift();if(!current.isFolder){ret.error=ERRNO_CODES.ENOTDIR;break;}else if(!current.read){ret.error=ERRNO_CODES.EACCES;break;}else if(!current.contents.hasOwnProperty(target)){ret.error=ERRNO_CODES.ENOENT;break;}
63184 current=current.contents[target];if(current.link&&!(dontResolveLastLink&&path.length==0)){if(linksVisited>40){ret.error=ERRNO_CODES.ELOOP;break;}
63185 var link=FS.absolutePath(current.link,traversed.join('/'));return FS.analyzePath([link].concat(path).join('/'),dontResolveLastLink,linksVisited+1);}
63186 traversed.push(target);if(path.length==0){ret.exists=true;ret.path=traversed.join('/');ret.object=current;}}
63187 return ret;}
63188 return ret;},findObject:function(path,dontResolveLastLink){FS.ensureRoot();var ret=FS.analyzePath(path,dontResolveLastLink);if(ret.exists){return ret.object;}else{___setErrNo(ret.error);return null;}},createObject:function(parent,name,properties,canRead,canWrite){if(!parent)parent='/';if(typeof parent==='string')parent=FS.findObject(parent);if(!parent){___setErrNo(ERRNO_CODES.EACCES);throw new Error('Parent path must exist.');}
63189 if(!parent.isFolder){___setErrNo(ERRNO_CODES.ENOTDIR);throw new Error('Parent must be a folder.');}
63190 if(!parent.write&&!FS.ignorePermissions){___setErrNo(ERRNO_CODES.EACCES);throw new Error('Parent folder must be writeable.');}
63191 if(!name||name=='.'||name=='..'){___setErrNo(ERRNO_CODES.ENOENT);throw new Error('Name must not be empty.');}
63192 if(parent.contents.hasOwnProperty(name)){___setErrNo(ERRNO_CODES.EEXIST);throw new Error("Can't overwrite object.");}
63193 parent.contents[name]={read:canRead===undefined?true:canRead,write:canWrite===undefined?false:canWrite,timestamp:Date.now(),inodeNumber:FS.nextInode++};for(var key in properties){if(properties.hasOwnProperty(key)){parent.contents[name][key]=properties[key];}}
63194 return parent.contents[name];},createFolder:function(parent,name,canRead,canWrite){var properties={isFolder:true,isDevice:false,contents:{}};return FS.createObject(parent,name,properties,canRead,canWrite);},createPath:function(parent,path,canRead,canWrite){var current=FS.findObject(parent);if(current===null)throw new Error('Invalid parent.');path=path.split('/').reverse();while(path.length){var part=path.pop();if(!part)continue;if(!current.contents.hasOwnProperty(part)){FS.createFolder(current,part,canRead,canWrite);}
63195 current=current.contents[part];}
63196 return current;},createFile:function(parent,name,properties,canRead,canWrite){properties.isFolder=false;return FS.createObject(parent,name,properties,canRead,canWrite);},createDataFile:function(parent,name,data,canRead,canWrite){if(typeof data==='string'){var dataArray=[];for(var i=0;i<data.length;i++)dataArray.push(data.charCodeAt(i));data=dataArray;}
63197 var properties={isDevice:false,contents:data};return FS.createFile(parent,name,properties,canRead,canWrite);},createLazyFile:function(parent,name,url,canRead,canWrite){var properties={isDevice:false,url:url};return FS.createFile(parent,name,properties,canRead,canWrite);},createLink:function(parent,name,target,canRead,canWrite){var properties={isDevice:false,link:target};return FS.createFile(parent,name,properties,canRead,canWrite);},createDevice:function(parent,name,input,output){if(!(input||output)){throw new Error('A device must have at least one callback defined.');}
63198 var ops={isDevice:true,input:input,output:output};return FS.createFile(parent,name,ops,Boolean(input),Boolean(output));},forceLoadFile:function(obj){if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;___setErrNo(ERRNO_CODES.EIO);return false;},ensureRoot:function(){if(FS.root)return;FS.root={read:true,write:false,isFolder:true,isDevice:false,timestamp:Date.now(),inodeNumber:1,contents:{}};},init:function(input,output,error){if(FS.init.initialized)return;FS.init.initialized=true;FS.ensureRoot();if(!input)input=function(){if(!input.cache||!input.cache.length){var result;if(typeof readline=='function'){result=readline();}
63199 if(!result)result='';input.cache=intArrayFromString(result+'\n',true);input.cache=intArrayFromString('\n',true);}
63200 return input.cache.shift();};if(!output)output=function(val){if(val===null||val==='\n'.charCodeAt(0)){output.printer(output.buffer.join(''));output.buffer=[];}else{output.buffer.push(String.fromCharCode(val));}};if(!output.printer)output.printer=vprint;if(!output.buffer)output.buffer=[];if(!error)error=output;FS.createFolder('/','tmp',true,true);var devFolder=FS.createFolder('/','dev',true,false);var stdin=FS.createDevice(devFolder,'stdin',input);var stdout=FS.createDevice(devFolder,'stdout',null,output);var stderr=FS.createDevice(devFolder,'stderr',null,error);FS.createDevice(devFolder,'tty',input,output);FS.streams[1]={path:'/dev/stdin',object:stdin,position:0,isRead:true,isWrite:false,isAppend:false,error:false,eof:false,ungotten:[]};FS.streams[2]={path:'/dev/stdout',object:stdout,position:0,isRead:false,isWrite:true,isAppend:false,error:false,eof:false,ungotten:[]};FS.streams[3]={path:'/dev/stderr',object:stderr,position:0,isRead:false,isWrite:true,isAppend:false,error:false,eof:false,ungotten:[]};_stdin=allocate([1],'void*',ALLOC_STATIC);_stdout=allocate([2],'void*',ALLOC_STATIC);_stderr=allocate([3],'void*',ALLOC_STATIC);FS.streams[_stdin]=FS.streams[1];FS.streams[_stdout]=FS.streams[2];FS.streams[_stderr]=FS.streams[3];__impure_ptr=allocate([allocate([0,0,0,0,_stdin,0,0,0,_stdout,0,0,0,_stderr,0,0,0],'void*',ALLOC_STATIC)],'void*',ALLOC_STATIC);FS.ignorePermissions=false;},quit:function(){try{if(FS.streams[2].object.output.buffer.length>0)FS.streams[2].object.output('\n'.charCodeAt(0));if(FS.streams[3].object.output.buffer.length>0)FS.streams[3].object.output('\n'.charCodeAt(0));}
63201 catch(e){recoverFromFSError(e);}}};var ___stat_struct_layout={__size__:80,st_dev:0,st_ino:8,st_mode:12,st_nlink:16,st_uid:20,st_gid:24,st_rdev:28,st_size:36,st_atime:40,st_spare1:44,st_mtime:48,st_spare2:52,st_ctime:56,st_spare3:60,st_blksize:64,st_blocks:68,st_spare4:72};function _stat(path,buf,dontResolveLastLink){var obj=FS.findObject(Pointer_stringify(path),dontResolveLastLink);if(obj===null||!FS.forceLoadFile(obj))return-1;var offsets=___stat_struct_layout;HEAP32[((buf+offsets.st_nlink)>>2)]=1;HEAP32[((buf+offsets.st_uid)>>2)]=0;HEAP32[((buf+offsets.st_gid)>>2)]=0;HEAP32[((buf+offsets.st_blksize)>>2)]=4096;HEAP32[((buf+offsets.st_ino)>>2)]=obj.inodeNumber;var time=Math.floor(obj.timestamp/1000);if(offsets.st_atime===undefined){offsets.st_atime=offsets.st_atim.tv_sec;offsets.st_mtime=offsets.st_mtim.tv_sec;offsets.st_ctime=offsets.st_ctim.tv_sec;var nanosec=(obj.timestamp%1000)*1000;HEAP32[((buf+offsets.st_atim.tv_nsec)>>2)]=nanosec;HEAP32[((buf+offsets.st_mtim.tv_nsec)>>2)]=nanosec;HEAP32[((buf+offsets.st_ctim.tv_nsec)>>2)]=nanosec;}
63202 HEAP32[((buf+offsets.st_atime)>>2)]=time;HEAP32[((buf+offsets.st_mtime)>>2)]=time;HEAP32[((buf+offsets.st_ctime)>>2)]=time;var mode=0;var size=0;var blocks=0;var dev=0;var rdev=0;if(obj.isDevice){dev=rdev=obj.inodeNumber;size=blocks=0;mode=0x2000;}else{dev=1;rdev=0;if(obj.isFolder){size=4096;blocks=1;mode=0x4000;}else{var data=obj.contents||obj.link;size=data.length;blocks=Math.ceil(data.length/4096);mode=obj.link===undefined?0x8000:0xA000;}}
63203 HEAP32[((buf+offsets.st_dev)>>2)]=dev;HEAP32[((buf+offsets.st_rdev)>>2)]=rdev;HEAP32[((buf+offsets.st_size)>>2)]=size;HEAP32[((buf+offsets.st_blocks)>>2)]=blocks;if(obj.read)mode|=0x16D;if(obj.write)mode|=0x92;HEAP32[((buf+offsets.st_mode)>>2)]=mode;return 0;}
63204 function _malloc(size){var ret=STATICTOP;STATICTOP+=size;STATICTOP=Math.ceil((STATICTOP)/4)*4;;return ret;}
63205 function _pwrite(fildes,buf,nbyte,offset){var stream=FS.streams[fildes];if(!stream||stream.object.isDevice){___setErrNo(ERRNO_CODES.EBADF);return-1;}else if(!stream.isWrite){___setErrNo(ERRNO_CODES.EACCES);return-1;}else if(stream.object.isFolder){___setErrNo(ERRNO_CODES.EISDIR);return-1;}else if(nbyte<0||offset<0){___setErrNo(ERRNO_CODES.EINVAL);return-1;}else{var contents=stream.object.contents;while(contents.length<offset)contents.push(0);for(var i=0;i<nbyte;i++){contents[offset+i]=HEAP8[(buf+i)];}
63206 stream.object.timestamp=Date.now();return i;}}function _write(fildes,buf,nbyte){var stream=FS.streams[fildes];if(!stream){___setErrNo(ERRNO_CODES.EBADF);return-1;}else if(!stream.isWrite){___setErrNo(ERRNO_CODES.EACCES);return-1;}else if(nbyte<0){___setErrNo(ERRNO_CODES.EINVAL);return-1;}else{if(stream.object.isDevice){if(stream.object.output){for(var i=0;i<nbyte;i++){try{stream.object.output(HEAP8[(buf+i)]);}catch(e){___setErrNo(ERRNO_CODES.EIO);return-1;}}
63207 stream.object.timestamp=Date.now();return i;}else{___setErrNo(ERRNO_CODES.ENXIO);return-1;}}else{var bytesWritten=_pwrite(fildes,buf,nbyte,stream.position);if(bytesWritten!=-1)stream.position+=bytesWritten;return bytesWritten;}}}function _fwrite(ptr,size,nitems,stream){var bytesToWrite=nitems*size;if(bytesToWrite==0)return 0;var bytesWritten=_write(stream,ptr,bytesToWrite);if(bytesWritten==-1){if(FS.streams[stream])FS.streams[stream].error=true;return-1;}else{return Math.floor(bytesWritten/size);}}
63208 function __formatString(format,varargs){var textIndex=format;var argIndex=0;var getNextArg=function(type){var ret;if(type==='float'||type==='double'){ret=HEAPF32[((varargs+argIndex)>>2)];}else{ret=HEAP32[((varargs+argIndex)>>2)];}
63209 argIndex+=Runtime.getNativeFieldSize(type);return Number(ret);};var ret=[];var curr,next,currArg;while(1){var startTextIndex=textIndex;curr=HEAP8[(textIndex)];if(curr===0)break;next=HEAP8[(textIndex+1)];if(curr=='%'.charCodeAt(0)){var flagAlwaysSigned=false;var flagLeftAlign=false;var flagAlternative=false;var flagZeroPad=false;flagsLoop:while(1){switch(next){case'+'.charCodeAt(0):flagAlwaysSigned=true;break;case'-'.charCodeAt(0):flagLeftAlign=true;break;case'#'.charCodeAt(0):flagAlternative=true;break;case'0'.charCodeAt(0):if(flagZeroPad){break flagsLoop;}else{flagZeroPad=true;break;}
63210 default:break flagsLoop;}
63211 textIndex++;next=HEAP8[(textIndex+1)];}
63212 var width=0;if(next=='*'.charCodeAt(0)){width=getNextArg('i32');textIndex++;next=HEAP8[(textIndex+1)];}else{while(next>='0'.charCodeAt(0)&&next<='9'.charCodeAt(0)){width=width*10+(next-'0'.charCodeAt(0));textIndex++;next=HEAP8[(textIndex+1)];}}
63213 var precisionSet=false;if(next=='.'.charCodeAt(0)){var precision=0;precisionSet=true;textIndex++;next=HEAP8[(textIndex+1)];if(next=='*'.charCodeAt(0)){precision=getNextArg('i32');textIndex++;}else{while(1){var precisionChr=HEAP8[(textIndex+1)];if(precisionChr<'0'.charCodeAt(0)||precisionChr>'9'.charCodeAt(0))break;precision=precision*10+(precisionChr-'0'.charCodeAt(0));textIndex++;}}
63214 next=HEAP8[(textIndex+1)];}else{var precision=6;}
63215 var argSize;switch(String.fromCharCode(next)){case'h':var nextNext=HEAP8[(textIndex+2)];if(nextNext=='h'.charCodeAt(0)){textIndex++;argSize=1;}else{argSize=2;}
63216 break;case'l':var nextNext=HEAP8[(textIndex+2)];if(nextNext=='l'.charCodeAt(0)){textIndex++;argSize=8;}else{argSize=4;}
63217 break;case'L':case'q':case'j':argSize=8;break;case'z':case't':case'I':argSize=4;break;default:argSize=undefined;}
63218 if(argSize!==undefined)textIndex++;next=HEAP8[(textIndex+1)];if(['d','i','u','o','x','X','p'].indexOf(String.fromCharCode(next))!=-1){var signed=next=='d'.charCodeAt(0)||next=='i'.charCodeAt(0);argSize=argSize||4;var currArg=getNextArg('i'+(argSize*8));if(argSize<=4){var limit=Math.pow(256,argSize)-1;currArg=(signed?reSign:unSign)(currArg&limit,argSize*8);}
63219 var currAbsArg=Math.abs(currArg);var argText;var prefix='';if(next=='d'.charCodeAt(0)||next=='i'.charCodeAt(0)){argText=reSign(currArg,8*argSize,1).toString(10);}else if(next=='u'.charCodeAt(0)){argText=unSign(currArg,8*argSize,1).toString(10);currArg=Math.abs(currArg);}else if(next=='o'.charCodeAt(0)){argText=(flagAlternative?'0':'')+currAbsArg.toString(8);}else if(next=='x'.charCodeAt(0)||next=='X'.charCodeAt(0)){prefix=flagAlternative?'0x':'';if(currArg<0){currArg=-currArg;argText=(currAbsArg-1).toString(16);var buffer=[];for(var i=0;i<argText.length;i++){buffer.push((0xF-parseInt(argText[i],16)).toString(16));}
63220 argText=buffer.join('');while(argText.length<argSize*2)argText='f'+argText;}else{argText=currAbsArg.toString(16);}
63221 if(next=='X'.charCodeAt(0)){prefix=prefix.toUpperCase();argText=argText.toUpperCase();}}else if(next=='p'.charCodeAt(0)){if(currAbsArg===0){argText='(nil)';}else{prefix='0x';argText=currAbsArg.toString(16);}}
63222 if(precisionSet){while(argText.length<precision){argText='0'+argText;}}
63223 if(flagAlwaysSigned){if(currArg<0){prefix='-'+prefix;}else{prefix='+'+prefix;}}
63224 while(prefix.length+argText.length<width){if(flagLeftAlign){argText+=' ';}else{if(flagZeroPad){argText='0'+argText;}else{prefix=' '+prefix;}}}
63225 argText=prefix+argText;argText.split('').forEach(function(chr){ret.push(chr.charCodeAt(0));});}else if(['f','F','e','E','g','G'].indexOf(String.fromCharCode(next))!=-1){var currArg=getNextArg(argSize===4?'float':'double');var argText;if(isNaN(currArg)){argText='nan';flagZeroPad=false;}else if(!isFinite(currArg)){argText=(currArg<0?'-':'')+'inf';flagZeroPad=false;}else{var isGeneral=false;var effectivePrecision=Math.min(precision,20);if(next=='g'.charCodeAt(0)||next=='G'.charCodeAt(0)){isGeneral=true;precision=precision||1;var exponent=parseInt(currArg.toExponential(effectivePrecision).split('e')[1],10);if(precision>exponent&&exponent>=-4){next=((next=='g'.charCodeAt(0))?'f':'F').charCodeAt(0);precision-=exponent+1;}else{next=((next=='g'.charCodeAt(0))?'e':'E').charCodeAt(0);precision--;}
63226 effectivePrecision=Math.min(precision,20);}
63227 if(next=='e'.charCodeAt(0)||next=='E'.charCodeAt(0)){argText=currArg.toExponential(effectivePrecision);if(/[eE][-+]\d$/.test(argText)){argText=argText.slice(0,-1)+'0'+argText.slice(-1);}}else if(next=='f'.charCodeAt(0)||next=='F'.charCodeAt(0)){argText=currArg.toFixed(effectivePrecision);}
63228 var parts=argText.split('e');if(isGeneral&&!flagAlternative){while(parts[0].length>1&&parts[0].indexOf('.')!=-1&&(parts[0].slice(-1)=='0'||parts[0].slice(-1)=='.')){parts[0]=parts[0].slice(0,-1);}}else{if(flagAlternative&&argText.indexOf('.')==-1)parts[0]+='.';while(precision>effectivePrecision++)parts[0]+='0';}
63229 argText=parts[0]+(parts.length>1?'e'+parts[1]:'');if(next=='E'.charCodeAt(0))argText=argText.toUpperCase();if(flagAlwaysSigned&&currArg>=0){argText='+'+argText;}}
63230 while(argText.length<width){if(flagLeftAlign){argText+=' ';}else{if(flagZeroPad&&(argText[0]=='-'||argText[0]=='+')){argText=argText[0]+'0'+argText.slice(1);}else{argText=(flagZeroPad?'0':' ')+argText;}}}
63231 if(next<'a'.charCodeAt(0))argText=argText.toUpperCase();argText.split('').forEach(function(chr){ret.push(chr.charCodeAt(0));});}else if(next=='s'.charCodeAt(0)){var arg=getNextArg('i8*');var copiedString;if(arg){copiedString=String_copy(arg);if(precisionSet&&copiedString.length>precision){copiedString=copiedString.slice(0,precision);}}else{copiedString=intArrayFromString('(null)',true);}
63232 if(!flagLeftAlign){while(copiedString.length<width--){ret.push(' '.charCodeAt(0));}}
63233 ret=ret.concat(copiedString);if(flagLeftAlign){while(copiedString.length<width--){ret.push(' '.charCodeAt(0));}}}else if(next=='c'.charCodeAt(0)){if(flagLeftAlign)ret.push(getNextArg('i8'));while(--width>0){ret.push(' '.charCodeAt(0));}
63234 if(!flagLeftAlign)ret.push(getNextArg('i8'));}else if(next=='n'.charCodeAt(0)){var ptr=getNextArg('i32*');HEAP32[((ptr)>>2)]=ret.length;}else if(next=='%'.charCodeAt(0)){ret.push(curr);}else{for(var i=startTextIndex;i<textIndex+2;i++){ret.push(HEAP8[(i)]);}}
63235 textIndex+=2;}else{ret.push(curr);textIndex+=1;}}
63236 return ret;}function _fprintf(stream,format,varargs){var result=__formatString(format,varargs);var stack=Runtime.stackSave();var ret=_fwrite(allocate(result,'i8',ALLOC_STACK),1,result.length,stream);Runtime.stackRestore(stack);return ret;}
63237 function _free(){}
63238 function _strlen(ptr){return String_len(ptr);}
63239 function _strcpy(pdest,psrc){var i=0;do{var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=psrc+i;$dest$=pdest+i;$stop$=$src$+1;if(($dest$%4)==($src$%4)&&1>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
63240 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
63241 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
63242 i++;}while(HEAP8[(psrc+i-1)]!=0);return pdest;}
63243 function _snprintf(s,n,format,varargs){var result=__formatString(format,varargs);var limit=(n===undefined)?result.length:Math.min(result.length,n-1);for(var i=0;i<limit;i++){HEAP8[(s+i)]=result[i];;}
63244 HEAP8[(s+i)]=0;;return result.length;}function _sprintf(s,format,varargs){return _snprintf(s,undefined,format,varargs);}
63245 function _fputc(c,stream){var chr=unSign(c&0xFF);HEAP8[(_fputc.ret)]=chr;var ret=_write(stream,_fputc.ret,1);if(ret==-1){if(stream in FS.streams)FS.streams[stream].error=true;return-1;}else{return chr;}}
63246 function __scanString(format,get,unget,varargs){format=Pointer_stringify(format);var formatIndex=0;var argsi=0;var fields=0;var argIndex=0;for(var formatIndex=0;formatIndex<format.length;formatIndex++){if(next<=0)return fields;var next=get();if(next<=0)return fields;if(format[formatIndex]==='%'){formatIndex++;var maxSpecifierStart=formatIndex;while(format[formatIndex].charCodeAt(0)>='0'.charCodeAt(0)&&format[formatIndex].charCodeAt(0)<='9'.charCodeAt(0)){formatIndex++;}
63247 var max_;if(formatIndex!=maxSpecifierStart){max_=parseInt(format.slice(maxSpecifierStart,formatIndex),10);}
63248 var type=format[formatIndex];formatIndex++;var curr=0;var buffer=[];while((curr<max_||isNaN(max_))&&next>0){if((type==='d'&&next>='0'.charCodeAt(0)&&next<='9'.charCodeAt(0))||(type==='x'&&(next>='0'.charCodeAt(0)&&next<='9'.charCodeAt(0)||next>='a'.charCodeAt(0)&&next<='f'.charCodeAt(0)||next>='A'.charCodeAt(0)&&next<='F'.charCodeAt(0)))||(type==='s')&&(formatIndex>=format.length||next!==format[formatIndex].charCodeAt(0))){buffer.push(String.fromCharCode(next));next=get();curr++;}else{break;}}
63249 if(buffer.length===0)return 0;var text=buffer.join('');var argPtr=HEAP32[((varargs+argIndex)>>2)];argIndex+=Runtime.getNativeFieldSize('void*');switch(type){case'd':HEAP32[((argPtr)>>2)]=parseInt(text,10);break;case'x':HEAP32[((argPtr)>>2)]=parseInt(text,16);break;case's':var array=intArrayFromString(text);for(var j=0;j<array.length;j++){HEAP8[(argPtr+j)]=array[j];}
63250 break;}
63251 fields++;}else{if(format[formatIndex].charCodeAt(0)!==next){unget(next);return fields;}}}
63252 return fields;}function _sscanf(s,format,varargs){var index=0;var get=function(){return HEAP8[(s+index++)];};var unget=function(){index--;};return __scanString(format,get,unget,varargs);}
63253 function _printf(format,varargs){var stdout=HEAP32[((_stdout)>>2)];return _fprintf(stdout,format,varargs);}
63254 function __exit(status){__shutdownRuntime__();ABORT=true;throw'exit('+status+') called, at '+new Error().stack;}function _exit(status){__exit(status);}
63255 function _isspace(chr){return chr in{32:0,9:0,10:0,11:0,12:0,13:0};}
63256 function _isdigit(chr){return chr>='0'.charCodeAt(0)&&chr<='9'.charCodeAt(0);}function _atoi(s){var c;while((c=HEAP8[(s)])&&_isspace(c))s++;if(!c||!_isdigit(c))return 0;var e=s;while((c=HEAP8[(e)])&&_isdigit(c))e++;return Math.floor(Number(Pointer_stringify(s).substr(0,e-s)));}
63257 var ___dirent_struct_layout={__size__:1040,d_ino:0,d_name:4,d_off:1028,d_reclen:1032,d_type:1036};function _open(path,oflag,varargs){var mode=HEAP32[((varargs)>>2)];var accessMode=oflag&3;var isWrite=accessMode!=0;var isRead=accessMode!=1;var isCreate=Boolean(oflag&512);var isExistCheck=Boolean(oflag&2048);var isTruncate=Boolean(oflag&1024);var isAppend=Boolean(oflag&8);var origPath=path;path=FS.analyzePath(Pointer_stringify(path));if(!path.parentExists){___setErrNo(path.error);return-1;}
63258 var target=path.object||null;var finalPath;if(target){if(isCreate&&isExistCheck){___setErrNo(ERRNO_CODES.EEXIST);return-1;}
63259 if((isWrite||isCreate||isTruncate)&&target.isFolder){___setErrNo(ERRNO_CODES.EISDIR);return-1;}
63260 if(isRead&&!target.read||isWrite&&!target.write){___setErrNo(ERRNO_CODES.EACCES);return-1;}
63261 if(isTruncate&&!target.isDevice){target.contents=[];}else{if(!FS.forceLoadFile(target)){___setErrNo(ERRNO_CODES.EIO);return-1;}}
63262 finalPath=path.path;}else{if(!isCreate){___setErrNo(ERRNO_CODES.ENOENT);return-1;}
63263 if(!path.parentObject.write){___setErrNo(ERRNO_CODES.EACCES);return-1;}
63264 target=FS.createDataFile(path.parentObject,path.name,[],mode&0x100,mode&0x80);finalPath=path.parentPath+'/'+path.name;}
63265 var id=FS.streams.length;if(target.isFolder){var entryBuffer=0;if(___dirent_struct_layout){entryBuffer=_malloc(___dirent_struct_layout.__size__);}
63266 var contents=[];for(var key in target.contents)contents.push(key);FS.streams[id]={path:finalPath,object:target,position:-2,isRead:true,isWrite:false,isAppend:false,error:false,eof:false,ungotten:[],contents:contents,currentEntry:entryBuffer};}else{FS.streams[id]={path:finalPath,object:target,position:0,isRead:isRead,isWrite:isWrite,isAppend:isAppend,error:false,eof:false,ungotten:[]};}
63267 return id;}function _fopen(filename,mode){var flags;mode=Pointer_stringify(mode);if(mode[0]=='r'){if(mode.indexOf('+')!=-1){flags=2;}else{flags=0;}}else if(mode[0]=='w'){if(mode.indexOf('+')!=-1){flags=2;}else{flags=1;}
63268 flags|=512;flags|=1024;}else if(mode[0]=='a'){if(mode.indexOf('+')!=-1){flags=2;}else{flags=1;}
63269 flags|=512;flags|=8;}else{___setErrNo(ERRNO_CODES.EINVAL);return 0;}
63270 var ret=_open(filename,flags,allocate([0x1FF,0,0,0],'i32',ALLOC_STACK));return(ret==-1)?0:ret;}
63271 function _memset(ptr,value,num){var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=ptr;$stop$=$dest$+num;$value4$=value;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=value;}
63272 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
63273 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=value;}}var _llvm_memset_p0i8_i32=_memset;function _strrchr(ptr,chr){var ptr2=ptr+_strlen(ptr);do{if(HEAP8[(ptr2)]==chr)return ptr2;ptr2--;}while(ptr2>=ptr);return 0;}
63274 function _close(fildes){if(FS.streams[fildes]){if(FS.streams[fildes].currentEntry){_free(FS.streams[fildes].currentEntry);}
63275 delete FS.streams[fildes];return 0;}else{___setErrNo(ERRNO_CODES.EBADF);return-1;}}
63276 function _fsync(fildes){if(FS.streams[fildes]){return 0;}else{___setErrNo(ERRNO_CODES.EBADF);return-1;}}function _fclose(stream){_fsync(stream);return _close(stream);}
63277 function _fflush(stream){var flush=function(filedes){if(filedes in FS.streams&&FS.streams[filedes].object.output){FS.streams[filedes].object.output(null);}};try{if(stream===0){for(var i in FS.streams)flush(i);}else{flush(stream);}
63278 return 0;}catch(e){___setErrNo(ERRNO_CODES.EIO);return-1;}}
63279 function _ftell(stream){if(stream in FS.streams){stream=FS.streams[stream];if(stream.object.isDevice){___setErrNo(ERRNO_CODES.ESPIPE);return-1;}else{return stream.position;}}else{___setErrNo(ERRNO_CODES.EBADF);return-1;}}
63280 function _lseek(fildes,offset,whence){if(FS.streams[fildes]&&!FS.streams[fildes].isDevice){var stream=FS.streams[fildes];var position=offset;if(whence===1){position+=stream.position;}else if(whence===2){position+=stream.object.contents.length;}
63281 if(position<0){___setErrNo(ERRNO_CODES.EINVAL);return-1;}else{stream.ungotten=[];stream.position=position;return position;}}else{___setErrNo(ERRNO_CODES.EBADF);return-1;}}function _fseek(stream,offset,whence){var ret=_lseek(stream,offset,whence);if(ret==-1){return-1;}else{FS.streams[stream].eof=false;return 0;}}
63282 function _strncmp(px,py,n){var i=0;while(i<n){var x=HEAP8[(px+i)];var y=HEAP8[(py+i)];if(x==y&&x==0)return 0;if(x==0)return-1;if(y==0)return 1;if(x==y){i++;continue;}else{return x>y?1:-1;}}
63283 return 0;}function _strcmp(px,py){return _strncmp(px,py,TOTAL_MEMORY);}
63284 function _setlocale(category,locale){if(!_setlocale.ret)_setlocale.ret=allocate([0],'i8',ALLOC_NORMAL);return _setlocale.ret;}
63285 var _environ=null;var ___environ=null;function ___buildEnvironment(env){var MAX_ENV_VALUES=64;var TOTAL_ENV_SIZE=1024;var poolPtr;var envPtr;if(_environ===null){ENV.USER='root';ENV.PATH='/';ENV.PWD='/';ENV.HOME='/';ENV.LANG='en_US.UTF-8';ENV._='./this.program';poolPtr=allocate(TOTAL_ENV_SIZE,'i8',ALLOC_STATIC);envPtr=allocate(MAX_ENV_VALUES*4,'i8*',ALLOC_STATIC);HEAP32[((envPtr)>>2)]=poolPtr;_environ=allocate([envPtr],'i8**',ALLOC_STATIC);___environ=_environ;}else{envPtr=HEAP32[((_environ)>>2)];poolPtr=HEAP32[((envPtr)>>2)];}
63286 var strings=[];var totalSize=0;for(var key in env){if(typeof env[key]==='string'){var line=key+'='+env[key];strings.push(line);totalSize+=line.length;}}
63287 if(totalSize>TOTAL_ENV_SIZE){throw new Error('Environment size exceeded TOTAL_ENV_SIZE!');}
63288 var ptrSize=4;for(var i=0;i<strings.length;i++){var line=strings[i];for(var j=0;j<line.length;j++){HEAP8[(poolPtr+j)]=line.charCodeAt(j);}
63289 HEAP8[(poolPtr+j)]=0;HEAP32[((envPtr+i*ptrSize)>>2)]=poolPtr;poolPtr+=line.length+1;}
63290 HEAP32[((envPtr+strings.length*ptrSize)>>2)]=0;}var ENV={};function _getenv(name){if(name===0)return 0;name=Pointer_stringify(name);if(!ENV.hasOwnProperty(name))return 0;if(_getenv.ret)_free(_getenv.ret);_getenv.ret=allocate(intArrayFromString(ENV[name]),'i8',ALLOC_NORMAL);return _getenv.ret;}
63291 function _access(path,amode){path=Pointer_stringify(path);var target=FS.findObject(path);if(target===null)return-1;if((amode&2&&!target.write)||((amode&1||amode&4)&&!target.read)){___setErrNo(ERRNO_CODES.EACCES);return-1;}else{return 0;}}
63292 function _strcat(pdest,psrc){var len=_strlen(pdest);var i=0;do{var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=psrc+i;$dest$=pdest+len+i;$stop$=$src$+1;if(($dest$%4)==($src$%4)&&1>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
63293 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
63294 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
63295 i++;}while(HEAP8[(psrc+i-1)]!=0);return pdest;}
63296 function _pread(fildes,buf,nbyte,offset){var stream=FS.streams[fildes];if(!stream||stream.object.isDevice){___setErrNo(ERRNO_CODES.EBADF);return-1;}else if(!stream.isRead){___setErrNo(ERRNO_CODES.EACCES);return-1;}else if(stream.object.isFolder){___setErrNo(ERRNO_CODES.EISDIR);return-1;}else if(nbyte<0||offset<0){___setErrNo(ERRNO_CODES.EINVAL);return-1;}else{var bytesRead=0;while(stream.ungotten.length&&nbyte>0){HEAP8[(buf++)]=stream.ungotten.pop();nbyte--;bytesRead++;}
63297 var contents=stream.object.contents;var size=Math.min(contents.length-offset,nbyte);for(var i=0;i<size;i++){HEAP8[(buf+i)]=contents[offset+i];bytesRead++;}
63298 return bytesRead;}}function _read(fildes,buf,nbyte){var stream=FS.streams[fildes];if(!stream){___setErrNo(ERRNO_CODES.EBADF);return-1;}else if(!stream.isRead){___setErrNo(ERRNO_CODES.EACCES);return-1;}else if(nbyte<0){___setErrNo(ERRNO_CODES.EINVAL);return-1;}else{var bytesRead;if(stream.object.isDevice){if(stream.object.input){bytesRead=0;while(stream.ungotten.length&&nbyte>0){HEAP8[(buf++)]=stream.ungotten.pop();nbyte--;bytesRead++;}
63299 for(var i=0;i<nbyte;i++){try{var result=stream.object.input();}catch(e){___setErrNo(ERRNO_CODES.EIO);return-1;}
63300 if(result===null||result===undefined)break;bytesRead++;HEAP8[(buf+i)]=result;}
63301 return bytesRead;}else{___setErrNo(ERRNO_CODES.ENXIO);return-1;}}else{var ungotSize=stream.ungotten.length;bytesRead=_pread(fildes,buf,nbyte,stream.position);if(bytesRead!=-1){stream.position+=(stream.ungotten.length-ungotSize)+bytesRead;}
63302 return bytesRead;}}}function _fgetc(stream){if(!(stream in FS.streams))return-1;var streamObj=FS.streams[stream];if(streamObj.eof||streamObj.error)return-1;var ret=_read(stream,_fgetc.ret,1);if(ret==0){streamObj.eof=true;return-1;}else if(ret==-1){streamObj.error=true;return-1;}else{return HEAP8[(_fgetc.ret)];}}function _fgets(s,n,stream){if(!(stream in FS.streams))return 0;var streamObj=FS.streams[stream];if(streamObj.error||streamObj.eof)return 0;var byte_;for(var i=0;i<n-1&&byte_!='\n'.charCodeAt(0);i++){byte_=_fgetc(stream);if(byte_==-1){if(streamObj.error)return 0;else if(streamObj.eof)break;}
63303 HEAP8[(s+i)]=byte_;}
63304 HEAP8[(s+i)]=0;return s;}
63305 function _strstr(ptr1,ptr2){var str1=Pointer_stringify(ptr1);var str2=Pointer_stringify(ptr2);var ret=str1.search(str2);return ret>=0?ptr1+ret:0;}
63306 function _memcmp(p1,p2,num){for(var i=0;i<num;i++){var v1=HEAP8[(p1+i)];var v2=HEAP8[(p2+i)];if(v1!=v2)return v1>v2?1:-1;}
63307 return 0;}
63308 function _memcpy(dest,src,num,idunno){var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=src;$dest$=dest;$stop$=$src$+num;if(($dest$%4)==($src$%4)&&num>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
63309 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
63310 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};}function _qsort(base,num,size,comparator){if(num==0||size==0)return;comparator=FUNCTION_TABLE[comparator];var keys=[];for(var i=0;i<num;i++)keys.push(i);keys.sort(function(a,b){return comparator(base+a*size,base+b*size);});var temp=_malloc(num*size);_memcpy(temp,base,num*size);for(var i=0;i<num;i++){if(keys[i]==i)continue;_memcpy(base+i*size,temp+keys[i]*size,size);}
63311 _free(temp);}
63312 function _unlink(path){path=FS.analyzePath(Pointer_stringify(path));if(!path.parentExists||!path.exists){___setErrNo(path.error);return-1;}else if(path.object.isFolder){___setErrNo(ERRNO_CODES.EISDIR);return-1;}else if(!path.object.write){___setErrNo(ERRNO_CODES.EACCES);return-1;}else{delete path.parentObject.contents[path.name];return 0;}}
63313 function _rmdir(path){path=FS.analyzePath(Pointer_stringify(path));if(!path.parentExists||!path.exists){___setErrNo(path.error);return-1;}else if(!path.object.write||path.isRoot){___setErrNo(ERRNO_CODES.EACCES);return-1;}else if(!path.object.isFolder){___setErrNo(ERRNO_CODES.ENOTDIR);return-1;}else{for(var i in path.object.contents){___setErrNo(ERRNO_CODES.ENOTEMPTY);return-1;}
63314 if(path.path==FS.currentPath){___setErrNo(ERRNO_CODES.EBUSY);return-1;}else{delete path.parentObject.contents[path.name];return 0;}}}function _remove(path){var ret=_unlink(path);if(ret==-1)ret=_rmdir(path);return ret;}
63315 var _llvm_memcpy_p0i8_p0i8_i32=_memcpy;function _isalnum(chr){return(chr>=48&&chr<=57)||(chr>=97&&chr<=122)||(chr>=65&&chr<=90)||(chr>=0xC0&&chr<=0xD6)||(chr>=0xDF&&chr<=0xF6)||(chr>=0xD8&&chr<=0xDE)||(chr>=0xF8&&chr<=0xFF);}
63316 function _strchr(ptr,chr){ptr--;do{ptr++;var val=HEAP8[(ptr)];if(val==chr)return ptr;}while(val);return 0;}
63317 function _strncpy(pdest,psrc,num){var padding=false,curr;for(var i=0;i<num;i++){curr=padding?0:HEAP8[(psrc+i)];HEAP8[(pdest+i)]=curr;padding=padding||HEAP8[(psrc+i)]==0;}
63318 return pdest;}
63319 function _fread(ptr,size,nitems,stream){var bytesToRead=nitems*size;if(bytesToRead==0)return 0;var bytesRead=_read(stream,ptr,bytesToRead);var streamObj=FS.streams[stream];if(bytesRead==-1){if(streamObj)streamObj.error=true;return-1;}else{if(bytesRead<bytesToRead)streamObj.eof=true;return Math.floor(bytesRead/size);}}
63320 function _tolower(chr){if((chr>=65&&chr<90)||(chr>=0xC0&&chr<=0xD6)||(chr>=0xD8&&chr<=0xDE))return chr-65+97;return chr;}
63321 function _isalpha(chr){return(chr>=97&&chr<=122)||(chr>=65&&chr<=90)||(chr>=0xC0&&chr<=0xD6)||(chr>=0xDF&&chr<=0xF6)||(chr>=0xD8&&chr<=0xDE)||(chr>=0xF8&&chr<=0xFF);}
63322 function _isupper(chr){return(chr>=65&&chr<=90)||(chr>=0xC0&&chr<=0xD6)||(chr>=0xD8&&chr<=0xDE);}
63323 function _islower(chr){return(chr>=97&&chr<=122)||(chr>=0xDF&&chr<=0xF6)||(chr>=0xF8&&chr<=0xFF);}
63324 function _ispunct(chr){return(chr>=33&&chr<=47)||(chr>=58&&chr<=64)||(chr>=91&&chr<=96)||(chr>=123&&chr<=126);}
63325 var _atof;function _realloc(ptr,size){if(!size){if(ptr)_free(ptr);return 0;}
63326 var ret=_malloc(size);if(ptr){_memcpy(ret,ptr,size);_free(ptr);}
63327 return ret;}
63328 var _mkstemp;function _system(command){___setErrNo(ERRNO_CODES.EAGAIN);return-1;}
63329 function _ungetc(c,stream){if(stream in FS.streams){c=unSign(c&0xFF);FS.streams[stream].ungotten.push(c);return c;}else{return-1;}}
63330 function _strdup(ptr){var len=String_len(ptr);var newStr=_malloc(len+1);var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=ptr;$dest$=newStr;$stop$=$src$+len;if(($dest$%4)==($src$%4)&&len>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
63331 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
63332 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};HEAP8[(newStr+len)]=0;;return newStr;}
63333 function _kill(pid,sig){___setErrNo(ERRNO_CODES.EPERM);return-1;}
63334 function ___errno_location(){return ___setErrNo.ret;}
63335 var ___errno=___errno_location;var ERRNO_MESSAGES={1:"Operation not permitted",2:"No such file or directory",3:"No such process",4:"Interrupted system call",5:"Input/output error",6:"No such device or address",8:"Exec format error",9:"Bad file descriptor",10:"No child processes",11:"Resource temporarily unavailable",12:"Cannot allocate memory",13:"Permission denied",14:"Bad address",16:"Device or resource busy",17:"File exists",18:"Invalid cross-device link",19:"No such device",20:"Not a directory",21:"Is a directory",22:"Invalid argument",23:"Too many open files in system",24:"Too many open files",25:"Inappropriate ioctl for device",26:"Text file busy",27:"File too large",28:"No space left on device",29:"Illegal seek",30:"Read-only file system",31:"Too many links",32:"Broken pipe",33:"Numerical argument out of domain",34:"Numerical result out of range",35:"Resource deadlock avoided",36:"File name too long",37:"No locks available",38:"Function not implemented",39:"Directory not empty",40:"Too many levels of symbolic links",42:"No message of desired type",43:"Identifier removed",60:"Device not a stream",61:"No data available",62:"Timer expired",63:"Out of streams resources",67:"Link has been severed",71:"Protocol error",72:"Multihop attempted",74:"Bad message",75:"Value too large for defined data type",84:"Invalid or incomplete multibyte or wide character",88:"Socket operation on non-socket",89:"Destination address required",90:"Message too long",91:"Protocol wrong type for socket",92:"Protocol not available",93:"Protocol not supported",95:"Operation not supported",97:"Address family not supported by protocol",98:"Address already in use",99:"Cannot assign requested address",100:"Network is down",101:"Network is unreachable",102:"Network dropped connection on reset",103:"Software caused connection abort",104:"Connection reset by peer",105:"No buffer space available",106:"Transport endpoint is already connected",107:"Transport endpoint is not connected",110:"Connection timed out",111:"Connection refused",113:"No route to host",114:"Operation already in progress",115:"Operation now in progress",116:"Stale NFS file handle",122:"Disk quota exceeded",125:"Operation canceled",130:"Owner died",131:"State not recoverable"};function _strerror_r(errnum,strerrbuf,buflen){if(errnum in ERRNO_MESSAGES){if(ERRNO_MESSAGES[errnum].length>buflen-1){return ___setErrNo(ERRNO_CODES.ERANGE);}else{var msg=ERRNO_MESSAGES[errnum];for(var i=0;i<msg.length;i++){HEAP8[(strerrbuf+i)]=msg.charCodeAt(i);}
63336 HEAP8[(strerrbuf+i)]=0;return 0;}}else{return ___setErrNo(ERRNO_CODES.EINVAL);}}function _strerror(errnum){if(!_strerror.buffer)_strerror.buffer=_malloc(256);_strerror_r(errnum,_strerror.buffer,256);return _strerror.buffer;}
63337 function _memmove(dest,src,num,idunno){if(num===0)return;var tmp=_malloc(num);_memcpy(tmp,src,num);_memcpy(dest,tmp,num);_free(tmp);}
63338 var _llvm_memmove_p0i8_p0i8_i32=_memmove;var _llvm_va_start;var _vfprintf=_fprintf;function _llvm_va_end(){}
63339 function _wait(stat_loc){___setErrNo(ERRNO_CODES.ECHILD);return-1;}
63340 var _waitpid=_wait;var _vsnprintf=_snprintf;var ___pollfd_struct_layout=null;function _poll(fds,nfds,timeout){var offsets=___pollfd_struct_layout;var nonzero=0;for(var i=0;i<nfds;i++){var pollfd=fds+___pollfd_struct_layout.__size__*i;var fd=HEAP32[((pollfd+offsets.fd)>>2)];var events=HEAP16[((pollfd+offsets.events)>>1)];var revents=0;if(fd in FS.streams){var stream=FS.streams[fd];if(events&1)revents|=1;if(events&2)revents|=2;}else{if(events&4)revents|=4;}
63341 if(revents)nonzero++;HEAP16[((pollfd+offsets.revents)>>1)]=revents;}
63342 return nonzero;}
63343 function _memchr(ptr,chr,num){chr=unSign(chr);for(var i=0;i<num;i++){if(HEAP8[(ptr)]==chr)return ptr;ptr++;}
63344 return 0;}
63345 function _fork(){___setErrNo(ERRNO_CODES.EAGAIN);return-1;}
63346 var ___flock_struct_layout=null;function _fcntl(fildes,cmd,varargs){if(!(fildes in FS.streams)){___setErrNo(ERRNO_CODES.EBADF);return-1;}
63347 var stream=FS.streams[fildes];switch(cmd){case 0:var arg=HEAP32[((varargs)>>2)];if(arg<0){___setErrNo(ERRNO_CODES.EINVAL);return-1;}
63348 var newStream={};for(var member in stream){newStream[member]=stream[member];}
63349 if(arg in FS.streams)arg=FS.streams.length;FS.streams[arg]=newStream;return arg;case 1:case 2:return 0;case 3:var flags=0;if(stream.isRead&&stream.isWrite)flags=2;else if(!stream.isRead&&stream.isWrite)flags=1;else if(stream.isRead&&!stream.isWrite)flags=0;if(stream.isAppend)flags|=8;return flags;case 4:var arg=HEAP32[((varargs)>>2)];stream.isAppend=Boolean(arg|8);return 0;case 7:case 20:var arg=HEAP32[((varargs)>>2)];var offset=___flock_struct_layout.l_type;HEAP16[((arg+offset)>>1)]=3;return 0;case 8:case 9:case 21:case 22:return 0;case 6:case 5:___setErrNo(ERRNO_CODES.EINVAL);return-1;default:___setErrNo(ERRNO_CODES.EINVAL);return-1;}
63350 return-1;}
63351 function _dup2(fildes,fildes2){if(fildes2<0){___setErrNo(ERRNO_CODES.EBADF);return-1;}else if(fildes===fildes2&&FS.streams[fildes]){return fildes;}else{_close(fildes2);return _fcntl(fildes,0,allocate([fildes2,0,0,0],'i32',ALLOC_STACK));}}
63352 function _signal(sig,func){return 0;}
63353 function _execl(){___setErrNo(ERRNO_CODES.ENOEXEC);return-1;}
63354 var _execlp=_execl;function _pipe(fildes){___setErrNo(ERRNO_CODES.ENOSYS);return-1;}
63355 function _opendir(dirname){var path=FS.absolutePath(Pointer_stringify(dirname));if(path===null){___setErrNo(ERRNO_CODES.ENOENT);return 0;}
63356 var target=FS.findObject(path);if(target===null)return 0;if(!target.isFolder){___setErrNo(ERRNO_CODES.ENOTDIR);return 0;}else if(!target.read){___setErrNo(ERRNO_CODES.EACCES);return 0;}
63357 var id=FS.streams.length;var contents=[];for(var key in target.contents)contents.push(key);FS.streams[id]={path:path,object:target,position:-2,isRead:true,isWrite:false,isAppend:false,error:false,eof:false,ungotten:[],contents:contents,currentEntry:_malloc(___dirent_struct_layout.__size__)};return id;}
63358 function _readdir_r(dirp,entry,result){if(!FS.streams[dirp]||!FS.streams[dirp].object.isFolder){return ___setErrNo(ERRNO_CODES.EBADF);}
63359 var stream=FS.streams[dirp];var loc=stream.position;var entries=0;for(var key in stream.contents)entries++;if(loc<-2||loc>=entries){HEAP32[((result)>>2)]=0;}else{var name,inode;if(loc===-2){name='.';inode=1;}else if(loc===-1){name='..';inode=1;}else{name=stream.contents[loc];inode=stream.object.contents[name].inodeNumber;}
63360 stream.position++;var offsets=___dirent_struct_layout;HEAP32[((entry+offsets.d_ino)>>2)]=inode;HEAP32[((entry+offsets.d_off)>>2)]=stream.position;HEAP32[((entry+offsets.d_reclen)>>2)]=name.length+1;for(var i=0;i<name.length;i++){HEAP8[(entry+offsets.d_name+i)]=name.charCodeAt(i);}
63361 HEAP8[(entry+offsets.d_name+i)]=0;var type=stream.object.isDevice?2:stream.object.isFolder?4:stream.object.link!==undefined?10:8;HEAP8[(entry+offsets.d_type)]=type;HEAP32[((result)>>2)]=entry;}
63362 return 0;}
63363 function _readdir(dirp){if(!FS.streams[dirp]||!FS.streams[dirp].object.isFolder){___setErrNo(ERRNO_CODES.EBADF);return 0;}else{if(!_readdir.result)_readdir.result=_malloc(4);_readdir_r(dirp,FS.streams[dirp].currentEntry,_readdir.result);if(HEAP32[((_readdir.result)>>2)]===0){return 0;}else{return FS.streams[dirp].currentEntry;}}}
63364 function _closedir(dirp){if(!FS.streams[dirp]||!FS.streams[dirp].object.isFolder){return ___setErrNo(ERRNO_CODES.EBADF);}else{_free(FS.streams[dirp].currentEntry);delete FS.streams[dirp];return 0;}}
63365 function _calloc(n,s){var ret=_malloc(n*s);_memset(ret,0,n*s);return ret;}
63366 var _cos=Math.cos;var ___rand_state=42;function _rand(){___rand_state=(1103515245*___rand_state+12345)%0x100000000;return ___rand_state&0x7FFFFFFF;}
63367 var _exp=Math.exp;var _sin=Math.sin;var _vsprintf=_sprintf;function _fputs(s,stream){return _write(stream,s,_strlen(s));}
63368 function _exp2(x){return Math.pow(2,x);}
63369 function __Z13GetFileLengthPKc($filename){var __stackBase__=STACKTOP;STACKTOP+=80;_memset(__stackBase__,0,80);var __label__;var $retval;var $filename_addr;var $statbuf=__stackBase__;$filename_addr=$filename;var $0=$filename_addr;var $call=_stat($0,$statbuf);var $cmp=((($call))|0)!=0;if($cmp){__label__=1;;}else{__label__=2;;}
63370 if(__label__==1){$retval=0;;}
63371 else if(__label__==2){var $st_mode=(($statbuf+12)&4294967295);var $1=HEAP32[(($st_mode)>>2)];var $and=($1)&61440;var $cmp1=((($and))|0)==16384;if($cmp1){__label__=3;;}else{__label__=4;;}
63372 if(__label__==3){$retval=-2;;}
63373 else if(__label__==4){var $st_size=(($statbuf+36)&4294967295);var $2=HEAP32[(($st_size)>>2)];$retval=$2;;}}
63374 var $3=$retval;STACKTOP=__stackBase__;return $3;return null;}
63375 function __Z5Alloci($size){;var __label__;var $size_addr;var $p;$size_addr=$size;var $0=$size_addr;var $call=_malloc($0);$p=$call;var $cmp=((($call))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
63376 if(__label__==1){var $1=HEAP32[((__impure_ptr)>>2)];var $_stderr=(($1+12)&4294967295);var $2=HEAP32[(($_stderr)>>2)];var $3=_fwrite(((__str106)&4294967295),22,1,$2);;}
63377 var $4=$p;;return $4;return null;}
63378 function __Z4FreePv($ptr){;var __label__;var $ptr_addr;$ptr_addr=$ptr;var $0=$ptr_addr;var $cmp=((($0))|0)!=0;if($cmp){__label__=1;;}else{__label__=2;;}
63379 if(__label__==1){var $1=$ptr_addr;;;};return;return;}
63380 function __Z13DisplayVoicesP7__sFILEPc($f_out,$language){var __stackBase__=STACKTOP;STACKTOP+=36;_memset(__stackBase__,0,36);var __label__;var $f_out_addr;var $language_addr;var $ix;var $p;var $len;var $count;var $scores;var $v;var $lang_name;var $age_buf=__stackBase__;var $voices;var $voice_select=__stackBase__+12;$f_out_addr=$f_out;$language_addr=$language;$scores=0;var $0=$language_addr;var $cmp=((($0))|0)!=0;if($cmp){__label__=1;;}else{__label__=3;;}
63381 $land_lhs_true$$if_else$2:do{if(__label__==1){var $1=$language_addr;var $arrayidx=(($1)&4294967295);var $2=HEAP8[($arrayidx)];var $conv=(tempInt=(($2)),(tempInt>=128?tempInt-256:tempInt));var $cmp1=((($conv))|0)!=0;if(!($cmp1)){__label__=3;break $land_lhs_true$$if_else$2;}
63382 var $3=$language_addr;var $languages=(($voice_select+4)&4294967295);HEAP32[(($languages)>>2)]=$3;var $age=(($voice_select+13)&4294967295);HEAP8[($age)]=0;var $gender=(($voice_select+12)&4294967295);HEAP8[($gender)]=0;var $name=(($voice_select)&4294967295);HEAP32[(($name)>>2)]=0;var $call=_espeak_ListVoices($voice_select);$voices=((__ZZ17espeak_ListVoicesE6voices)&4294967295);$scores=1;__label__=4;break $land_lhs_true$$if_else$2;}}while(0);if(__label__==3){var $call2=_espeak_ListVoices(0);$voices=((__ZZ17espeak_ListVoicesE6voices)&4294967295);;}
63383 var $4=$f_out_addr;var $5=_fwrite(((__str1)&4294967295),64,1,$4);$ix=0;var $6=$ix;var $7=$voices;var $arrayidx43=(($7+4*$6)&4294967295);var $8=HEAP32[(($arrayidx43)>>2)];$v=$8;var $cmp54=((($8))|0)!=0;if($cmp54){__label__=5;;}else{__label__=15;;}
63384 $for_body_lr_ph$$for_end$8:do{if(__label__==5){var $arraydecay=(($age_buf)&4294967295);var $arraydecay26=(($age_buf)&4294967295);;$for_body$10:while(1){$count=0;var $9=$v;var $languages6=(($9+4)&4294967295);var $10=HEAP32[(($languages6)>>2)];$p=$10;var $11=$p;var $12=HEAP8[($11)];var $conv71=(tempInt=(($12)),(tempInt>=128?tempInt-256:tempInt));var $cmp82=((($conv71))|0)!=0;if($cmp82){__label__=7;;}else{__label__=14;;}
63385 $while_body$$while_end$12:do{if(__label__==7){while(1){var $13=$p;var $add_ptr=(($13+1)&4294967295);var $call9=_strlen($add_ptr);$len=$call9;var $14=$p;var $add_ptr10=(($14+1)&4294967295);$lang_name=$add_ptr10;var $15=$v;var $age11=(($15+13)&4294967295);var $16=HEAPU8[($age11)];var $conv12=((($16))&255);var $cmp13=((($conv12))|0)==0;if($cmp13){__label__=8;;}else{__label__=9;;}
63386 if(__label__==8){var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=((__str41208)&4294967295);$dest$=$arraydecay;$stop$=$src$+4;if(($dest$%4)==($src$%4)&&4>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
63387 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
63388 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};;}
63389 else if(__label__==9){var $17=$v;var $age18=(($17+13)&4294967295);var $18=HEAPU8[($age18)];var $conv19=((($18))&255);var $call20=_sprintf($arraydecay,((__str3)&4294967295),allocate([$conv19,0,0,0],["i32",0,0,0],ALLOC_STACK));;}
63390 var $19=$count;var $cmp22=((($19))|0)==0;var $20=$f_out_addr;if($cmp22){__label__=11;;}else{__label__=12;;}
63391 if(__label__==11){var $21=$p;var $arrayidx24=(($21)&4294967295);var $22=HEAP8[($arrayidx24)];var $conv25=(tempInt=(($22)),(tempInt>=128?tempInt-256:tempInt));var $23=$lang_name;var $24=$v;var $gender27=(($24+12)&4294967295);var $25=HEAPU8[($gender27)];var $idxprom=((($25))&255);var $arrayidx28=((__ZZ13DisplayVoicesP7__sFILEPcE7genders+$idxprom)&4294967295);var $26=HEAP8[($arrayidx28)];var $conv29=(tempInt=(($26)),(tempInt>=128?tempInt-256:tempInt));var $27=$v;var $name30=(($27)&4294967295);var $28=HEAP32[(($name30)>>2)];var $29=$v;var $identifier=(($29+8)&4294967295);var $30=HEAP32[(($identifier)>>2)];var $call31=_fprintf($20,((__str4)&4294967295),allocate([$conv25,0,0,0,$23,0,0,0,$arraydecay26,0,0,0,$conv29,0,0,0,$28,0,0,0,$30,0,0,0],["i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));;}
63392 else if(__label__==12){var $31=$lang_name;var $32=$p;var $arrayidx33=(($32)&4294967295);var $33=HEAP8[($arrayidx33)];var $conv34=(tempInt=(($33)),(tempInt>=128?tempInt-256:tempInt));var $call35=_fprintf($20,((__str5)&4294967295),allocate([$31,0,0,0,$conv34,0,0,0],["i8*",0,0,0,"i32",0,0,0],ALLOC_STACK));;}
63393 var $34=$count;var $inc=((($34)+1)&4294967295);$count=$inc;var $35=$len;var $add=((($35)+2)&4294967295);var $36=$p;var $add_ptr37=(($36+$add)&4294967295);$p=$add_ptr37;var $37=$p;var $38=HEAP8[($37)];var $conv7=(tempInt=(($38)),(tempInt>=128?tempInt-256:tempInt));var $cmp8=((($conv7))|0)!=0;if($cmp8){__label__=7;continue;}else{__label__=14;break $while_body$$while_end$12;}}}}while(0);var $39=$f_out_addr;var $call38=_fputc(10,$39);var $40=$ix;var $inc39=((($40)+1)&4294967295);$ix=$inc39;var $41=$ix;var $42=$voices;var $arrayidx4=(($42+4*$41)&4294967295);var $43=HEAP32[(($arrayidx4)>>2)];$v=$43;var $cmp5=((($43))|0)!=0;if($cmp5){__label__=6;continue $for_body$10;}else{__label__=15;break $for_body_lr_ph$$for_end$8;}}}}while(0);STACKTOP=__stackBase__;return;return;}
63394 function __Z13WVoiceChangedP7voice_t($wvoice){;var __label__;;return;return;}
63395 function __Z11MarkerEventijiPh($type,$char_position,$value,$out_ptr){;var __label__;var $type_addr;var $char_position_addr;var $value_addr;var $out_ptr_addr;$type_addr=$type;$char_position_addr=$char_position;$value_addr=$value;$out_ptr_addr=$out_ptr;var $0=$type_addr;var $cmp=((($0))|0)==2;if($cmp){__label__=1;;}else{__label__=2;;}
63396 if(__label__==1){HEAP32[((_end_of_sentence)>>2)]=1;;};return;return;}
63397 function _main($argc,$argv){;var __label__;var __lastLabel__=null;var $_ZL9help_text;$_ZL9help_text=((__str37)&4294967295);var $_ZZ4mainE8err_load;$_ZZ4mainE8err_load=((__str18)&4294967295);var $retval;var $argc_addr;var $argv_addr;var $f_text;var $p_text;var $data_path;var $option_index=STACKTOP;_memset(STACKTOP,0,4);STACKTOP+=4;STACKTOP=Math.ceil((STACKTOP)/4)*4;;var $c;var $value=STACKTOP;_memset(STACKTOP,0,4);STACKTOP+=4;STACKTOP=Math.ceil((STACKTOP)/4)*4;;var $speed;var $ix;var $optarg2;var $amp;var $wordgap;var $speaking;var $flag_stdin;var $flag_compile;var $pitch_adjustment;var $voice_select=STACKTOP;_memset(STACKTOP,0,24);STACKTOP+=24;STACKTOP=Math.ceil((STACKTOP)/4)*4;;var $filename=STACKTOP;_memset(STACKTOP,0,200);STACKTOP+=200;STACKTOP=Math.ceil((STACKTOP)/4)*4;;var $voicename=STACKTOP;_memset(STACKTOP,0,40);STACKTOP+=40;STACKTOP=Math.ceil((STACKTOP)/4)*4;;var $dictname=STACKTOP;_memset(STACKTOP,0,40);STACKTOP+=40;STACKTOP=Math.ceil((STACKTOP)/4)*4;;var $extn;$retval=0;$argc_addr=$argc;$argv_addr=$argv;$f_text=0;$p_text=0;$data_path=0;HEAP32[(($option_index)>>2)]=0;$speed=175;$amp=100;$wordgap=0;$speaking=0;$flag_stdin=0;$flag_compile=0;$pitch_adjustment=50;var $arrayidx=(($voicename)&4294967295);HEAP8[($arrayidx)]=0;HEAP8[(((_mbrola_name)&4294967295))]=0;var $arrayidx1=(($dictname)&4294967295);HEAP8[($arrayidx1)]=0;HEAP8[(((_wavefile)&4294967295))]=0;var $arrayidx2=(($filename)&4294967295);HEAP8[($arrayidx2)]=0;HEAP32[((_option_linelength)>>2)]=0;HEAP32[((_option_phonemes)>>2)]=0;HEAP32[((_option_waveout)>>2)]=0;HEAP32[((_option_wordgap)>>2)]=0;HEAP32[((_option_endpause)>>2)]=1;HEAP32[((_option_phoneme_input)>>2)]=1;HEAP32[((_option_multibyte)>>2)]=0;var $0=HEAP32[((__impure_ptr)>>2)];var $_stdout=(($0+8)&4294967295);var $1=HEAP32[(($_stdout)>>2)];HEAP32[((_f_trans)>>2)]=$1;var $2=$argc_addr;var $3=$argv_addr;var $call6=_getopt_long($2,$3,((__str19)&4294967295),((__ZZ4mainE12long_options)&4294967295),$option_index);$c=$call6;var $cmp7=((($call6))|0)==-1;if($cmp7){__label__=43;;}else{__label__=1;;}
63398 $while_end71$$if_end_lr_ph$2:do{if(__label__==1){var $arraydecay=(($filename)&4294967295);var $arraydecay32=(($voicename)&4294967295);var $arraydecay41=(($voicename)&4294967295);var $_pr8=$c;__lastLabel__=1;;$if_end$4:while(1){var $4=__lastLabel__==1?$_pr8:($call);var $5=HEAP32[((_optarg)>>2)];$optarg2=$5;if($4==98){__lastLabel__=2;__label__=3;;}
63399 else if($4==104){__lastLabel__=2;__label__=5;;}
63400 else if($4==107){__lastLabel__=2;__label__=6;;}
63401 else if($4==120){__lastLabel__=2;__label__=7;;}
63402 else if($4==88){__lastLabel__=2;__label__=8;;}
63403 else if($4==109){__lastLabel__=2;__label__=9;;}
63404 else if($4==112){__lastLabel__=2;__label__=10;;}
63405 else if($4==113){__lastLabel__=2;__label__=12;;}
63406 else if($4==102){__lastLabel__=2;__label__=13;;}
63407 else if($4==108){__lastLabel__=2;__label__=14;;}
63408 else if($4==97){__lastLabel__=2;__label__=15;;}
63409 else if($4==115){__lastLabel__=2;__label__=16;;}
63410 else if($4==103){__lastLabel__=2;__label__=17;;}
63411 else if($4==118){__lastLabel__=2;__label__=18;;}
63412 else if($4==119){__lastLabel__=2;__label__=19;;}
63413 else if($4==122){__lastLabel__=2;__label__=20;;}
63414 else if($4==256){__lastLabel__=2;__label__=21;;}
63415 else if($4==261){__lastLabel__=2;__label__=22;;}
63416 else if($4==257){__lastLabel__=2;__label__=23;;}
63417 else if($4==258){__lastLabel__=2;__label__=23;;}
63418 else if($4==259){__lastLabel__=2;__label__=26;;}
63419 else if($4==260){__lastLabel__=2;__label__=32;;}
63420 else if($4==262){__lastLabel__=2;__label__=33;;}
63421 else if($4==263){__lastLabel__=2;__label__=36;;}
63422 else if($4==264){__lastLabel__=2;__label__=37;;}
63423 else if($4==265){__lastLabel__=2;__label__=40;;}
63424 else if($4==266){__lastLabel__=2;__label__=41;;}
63425 else{__lastLabel__=2;__label__=42;;}
63426 $sw_default$$sw_bb$$sw_bb8$$sw_bb11$$sw_bb13$$sw_bb14$$sw_bb15$$sw_bb16$$sw_bb21$$sw_bb22$$sw_bb23$$sw_bb25$$sw_bb27$$sw_bb29$$sw_bb31$$sw_bb33$$sw_bb34$$sw_bb35$$sw_bb36$$sw_bb38$$sw_bb43$$sw_bb53$$sw_bb56$$sw_bb61$$sw_bb62$$sw_bb69$$sw_bb70$6:do{if(__label__==42){_exit(0);__label__=38;break $sw_default$$sw_bb$$sw_bb8$$sw_bb11$$sw_bb13$$sw_bb14$$sw_bb15$$sw_bb16$$sw_bb21$$sw_bb22$$sw_bb23$$sw_bb25$$sw_bb27$$sw_bb29$$sw_bb31$$sw_bb33$$sw_bb34$$sw_bb35$$sw_bb36$$sw_bb38$$sw_bb43$$sw_bb53$$sw_bb56$$sw_bb61$$sw_bb62$$sw_bb69$$sw_bb70$6;}
63427 else if(__label__==3){HEAP32[((_option_multibyte)>>2)]=2;var $6=$optarg2;var $call3=_sscanf($6,((__str63715)&4294967295),allocate([$value,0,0,0],["i32*",0,0,0],ALLOC_STACK));var $cmp4=((($call3))|0)==1;var $7=HEAP32[(($value)>>2)];var $cmp5=((($7))|0)<=4;var $or_cond=($cmp4)&($cmp5);if(!($or_cond)){__label__=38;break $sw_default$$sw_bb$$sw_bb8$$sw_bb11$$sw_bb13$$sw_bb14$$sw_bb15$$sw_bb16$$sw_bb21$$sw_bb22$$sw_bb23$$sw_bb25$$sw_bb27$$sw_bb29$$sw_bb31$$sw_bb33$$sw_bb34$$sw_bb35$$sw_bb36$$sw_bb38$$sw_bb43$$sw_bb53$$sw_bb56$$sw_bb61$$sw_bb62$$sw_bb69$$sw_bb70$6;}
63428 var $8=HEAP32[(($value)>>2)];HEAP32[((_option_multibyte)>>2)]=$8;__label__=38;break $sw_default$$sw_bb$$sw_bb8$$sw_bb11$$sw_bb13$$sw_bb14$$sw_bb15$$sw_bb16$$sw_bb21$$sw_bb22$$sw_bb23$$sw_bb25$$sw_bb27$$sw_bb29$$sw_bb31$$sw_bb33$$sw_bb34$$sw_bb35$$sw_bb36$$sw_bb38$$sw_bb43$$sw_bb53$$sw_bb56$$sw_bb61$$sw_bb62$$sw_bb69$$sw_bb70$6;}
63429 else if(__label__==5){var $9=$argv_addr;var $arrayidx9=(($9)&4294967295);var $10=HEAP32[(($arrayidx9)>>2)];var $11=$data_path;__ZL9init_pathPcS_($10,$11);var $12=HEAP32[((_version_string)>>2)];var $13=$_ZL9help_text;var $call10=_printf(((__str21)&4294967295),allocate([$12,0,0,0,((_path_home)&4294967295),0,0,0,$13,0,0,0],["i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));_exit(0);__label__=38;break $sw_default$$sw_bb$$sw_bb8$$sw_bb11$$sw_bb13$$sw_bb14$$sw_bb15$$sw_bb16$$sw_bb21$$sw_bb22$$sw_bb23$$sw_bb25$$sw_bb27$$sw_bb29$$sw_bb31$$sw_bb33$$sw_bb34$$sw_bb35$$sw_bb36$$sw_bb38$$sw_bb43$$sw_bb53$$sw_bb56$$sw_bb61$$sw_bb62$$sw_bb69$$sw_bb70$6;}
63430 else if(__label__==6){var $14=$optarg2;var $call12=_atoi($14);HEAP32[((_option_capitals)>>2)]=$call12;__label__=38;break $sw_default$$sw_bb$$sw_bb8$$sw_bb11$$sw_bb13$$sw_bb14$$sw_bb15$$sw_bb16$$sw_bb21$$sw_bb22$$sw_bb23$$sw_bb25$$sw_bb27$$sw_bb29$$sw_bb31$$sw_bb33$$sw_bb34$$sw_bb35$$sw_bb36$$sw_bb38$$sw_bb43$$sw_bb53$$sw_bb56$$sw_bb61$$sw_bb62$$sw_bb69$$sw_bb70$6;}
63431 else if(__label__==7){HEAP32[((_option_phonemes)>>2)]=1;__label__=38;break $sw_default$$sw_bb$$sw_bb8$$sw_bb11$$sw_bb13$$sw_bb14$$sw_bb15$$sw_bb16$$sw_bb21$$sw_bb22$$sw_bb23$$sw_bb25$$sw_bb27$$sw_bb29$$sw_bb31$$sw_bb33$$sw_bb34$$sw_bb35$$sw_bb36$$sw_bb38$$sw_bb43$$sw_bb53$$sw_bb56$$sw_bb61$$sw_bb62$$sw_bb69$$sw_bb70$6;}
63432 else if(__label__==8){HEAP32[((_option_phonemes)>>2)]=2;__label__=38;break $sw_default$$sw_bb$$sw_bb8$$sw_bb11$$sw_bb13$$sw_bb14$$sw_bb15$$sw_bb16$$sw_bb21$$sw_bb22$$sw_bb23$$sw_bb25$$sw_bb27$$sw_bb29$$sw_bb31$$sw_bb33$$sw_bb34$$sw_bb35$$sw_bb36$$sw_bb38$$sw_bb43$$sw_bb53$$sw_bb56$$sw_bb61$$sw_bb62$$sw_bb69$$sw_bb70$6;}
63433 else if(__label__==9){HEAP32[((_option_ssml)>>2)]=1;__label__=38;break $sw_default$$sw_bb$$sw_bb8$$sw_bb11$$sw_bb13$$sw_bb14$$sw_bb15$$sw_bb16$$sw_bb21$$sw_bb22$$sw_bb23$$sw_bb25$$sw_bb27$$sw_bb29$$sw_bb31$$sw_bb33$$sw_bb34$$sw_bb35$$sw_bb36$$sw_bb38$$sw_bb43$$sw_bb53$$sw_bb56$$sw_bb61$$sw_bb62$$sw_bb69$$sw_bb70$6;}
63434 else if(__label__==10){var $15=$optarg2;var $call17=_atoi($15);$pitch_adjustment=$call17;var $16=$pitch_adjustment;var $cmp18=((($16))|0)>99;if(!($cmp18)){__label__=38;break $sw_default$$sw_bb$$sw_bb8$$sw_bb11$$sw_bb13$$sw_bb14$$sw_bb15$$sw_bb16$$sw_bb21$$sw_bb22$$sw_bb23$$sw_bb25$$sw_bb27$$sw_bb29$$sw_bb31$$sw_bb33$$sw_bb34$$sw_bb35$$sw_bb36$$sw_bb38$$sw_bb43$$sw_bb53$$sw_bb56$$sw_bb61$$sw_bb62$$sw_bb69$$sw_bb70$6;}
63435 $pitch_adjustment=99;__label__=38;break $sw_default$$sw_bb$$sw_bb8$$sw_bb11$$sw_bb13$$sw_bb14$$sw_bb15$$sw_bb16$$sw_bb21$$sw_bb22$$sw_bb23$$sw_bb25$$sw_bb27$$sw_bb29$$sw_bb31$$sw_bb33$$sw_bb34$$sw_bb35$$sw_bb36$$sw_bb38$$sw_bb43$$sw_bb53$$sw_bb56$$sw_bb61$$sw_bb62$$sw_bb69$$sw_bb70$6;}
63436 else if(__label__==12){HEAP32[((_quiet)>>2)]=1;__label__=38;break $sw_default$$sw_bb$$sw_bb8$$sw_bb11$$sw_bb13$$sw_bb14$$sw_bb15$$sw_bb16$$sw_bb21$$sw_bb22$$sw_bb23$$sw_bb25$$sw_bb27$$sw_bb29$$sw_bb31$$sw_bb33$$sw_bb34$$sw_bb35$$sw_bb36$$sw_bb38$$sw_bb43$$sw_bb53$$sw_bb56$$sw_bb61$$sw_bb62$$sw_bb69$$sw_bb70$6;}
63437 else if(__label__==13){var $17=$optarg2;__Z8strncpy0PcPKci($arraydecay,$17,200);__label__=38;break $sw_default$$sw_bb$$sw_bb8$$sw_bb11$$sw_bb13$$sw_bb14$$sw_bb15$$sw_bb16$$sw_bb21$$sw_bb22$$sw_bb23$$sw_bb25$$sw_bb27$$sw_bb29$$sw_bb31$$sw_bb33$$sw_bb34$$sw_bb35$$sw_bb36$$sw_bb38$$sw_bb43$$sw_bb53$$sw_bb56$$sw_bb61$$sw_bb62$$sw_bb69$$sw_bb70$6;}
63438 else if(__label__==14){HEAP32[(($value)>>2)]=0;var $18=$optarg2;var $call24=_atoi($18);HEAP32[(($value)>>2)]=$call24;var $19=HEAP32[(($value)>>2)];HEAP32[((_option_linelength)>>2)]=$19;__label__=38;break $sw_default$$sw_bb$$sw_bb8$$sw_bb11$$sw_bb13$$sw_bb14$$sw_bb15$$sw_bb16$$sw_bb21$$sw_bb22$$sw_bb23$$sw_bb25$$sw_bb27$$sw_bb29$$sw_bb31$$sw_bb33$$sw_bb34$$sw_bb35$$sw_bb36$$sw_bb38$$sw_bb43$$sw_bb53$$sw_bb56$$sw_bb61$$sw_bb62$$sw_bb69$$sw_bb70$6;}
63439 else if(__label__==15){var $20=$optarg2;var $call26=_atoi($20);$amp=$call26;__label__=38;break $sw_default$$sw_bb$$sw_bb8$$sw_bb11$$sw_bb13$$sw_bb14$$sw_bb15$$sw_bb16$$sw_bb21$$sw_bb22$$sw_bb23$$sw_bb25$$sw_bb27$$sw_bb29$$sw_bb31$$sw_bb33$$sw_bb34$$sw_bb35$$sw_bb36$$sw_bb38$$sw_bb43$$sw_bb53$$sw_bb56$$sw_bb61$$sw_bb62$$sw_bb69$$sw_bb70$6;}
63440 else if(__label__==16){var $21=$optarg2;var $call28=_atoi($21);$speed=$call28;__label__=38;break $sw_default$$sw_bb$$sw_bb8$$sw_bb11$$sw_bb13$$sw_bb14$$sw_bb15$$sw_bb16$$sw_bb21$$sw_bb22$$sw_bb23$$sw_bb25$$sw_bb27$$sw_bb29$$sw_bb31$$sw_bb33$$sw_bb34$$sw_bb35$$sw_bb36$$sw_bb38$$sw_bb43$$sw_bb53$$sw_bb56$$sw_bb61$$sw_bb62$$sw_bb69$$sw_bb70$6;}
63441 else if(__label__==17){var $22=$optarg2;var $call30=_atoi($22);$wordgap=$call30;__label__=38;break $sw_default$$sw_bb$$sw_bb8$$sw_bb11$$sw_bb13$$sw_bb14$$sw_bb15$$sw_bb16$$sw_bb21$$sw_bb22$$sw_bb23$$sw_bb25$$sw_bb27$$sw_bb29$$sw_bb31$$sw_bb33$$sw_bb34$$sw_bb35$$sw_bb36$$sw_bb38$$sw_bb43$$sw_bb53$$sw_bb56$$sw_bb61$$sw_bb62$$sw_bb69$$sw_bb70$6;}
63442 else if(__label__==18){var $23=$optarg2;__Z8strncpy0PcPKci($arraydecay32,$23,40);__label__=38;break $sw_default$$sw_bb$$sw_bb8$$sw_bb11$$sw_bb13$$sw_bb14$$sw_bb15$$sw_bb16$$sw_bb21$$sw_bb22$$sw_bb23$$sw_bb25$$sw_bb27$$sw_bb29$$sw_bb31$$sw_bb33$$sw_bb34$$sw_bb35$$sw_bb36$$sw_bb38$$sw_bb43$$sw_bb53$$sw_bb56$$sw_bb61$$sw_bb62$$sw_bb69$$sw_bb70$6;}
63443 else if(__label__==19){HEAP32[((_option_waveout)>>2)]=1;var $24=$optarg2;__Z8strncpy0PcPKci(((_wavefile)&4294967295),$24,200);__label__=38;break $sw_default$$sw_bb$$sw_bb8$$sw_bb11$$sw_bb13$$sw_bb14$$sw_bb15$$sw_bb16$$sw_bb21$$sw_bb22$$sw_bb23$$sw_bb25$$sw_bb27$$sw_bb29$$sw_bb31$$sw_bb33$$sw_bb34$$sw_bb35$$sw_bb36$$sw_bb38$$sw_bb43$$sw_bb53$$sw_bb56$$sw_bb61$$sw_bb62$$sw_bb69$$sw_bb70$6;}
63444 else if(__label__==20){HEAP32[((_option_endpause)>>2)]=0;__label__=38;break $sw_default$$sw_bb$$sw_bb8$$sw_bb11$$sw_bb13$$sw_bb14$$sw_bb15$$sw_bb16$$sw_bb21$$sw_bb22$$sw_bb23$$sw_bb25$$sw_bb27$$sw_bb29$$sw_bb31$$sw_bb33$$sw_bb34$$sw_bb35$$sw_bb36$$sw_bb38$$sw_bb43$$sw_bb53$$sw_bb56$$sw_bb61$$sw_bb62$$sw_bb69$$sw_bb70$6;}
63445 else if(__label__==21){$flag_stdin=1;__label__=38;break $sw_default$$sw_bb$$sw_bb8$$sw_bb11$$sw_bb13$$sw_bb14$$sw_bb15$$sw_bb16$$sw_bb21$$sw_bb22$$sw_bb23$$sw_bb25$$sw_bb27$$sw_bb29$$sw_bb31$$sw_bb33$$sw_bb34$$sw_bb35$$sw_bb36$$sw_bb38$$sw_bb43$$sw_bb53$$sw_bb56$$sw_bb61$$sw_bb62$$sw_bb69$$sw_bb70$6;}
63446 else if(__label__==22){HEAP32[((_option_waveout)>>2)]=1;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=((__str12)&4294967295);$dest$=((_wavefile)&4294967295);$stop$=$src$+7;if(($dest$%4)==($src$%4)&&7>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
63447 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
63448 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};__label__=38;break $sw_default$$sw_bb$$sw_bb8$$sw_bb11$$sw_bb13$$sw_bb14$$sw_bb15$$sw_bb16$$sw_bb21$$sw_bb22$$sw_bb23$$sw_bb25$$sw_bb27$$sw_bb29$$sw_bb31$$sw_bb33$$sw_bb34$$sw_bb35$$sw_bb36$$sw_bb38$$sw_bb43$$sw_bb53$$sw_bb56$$sw_bb61$$sw_bb62$$sw_bb69$$sw_bb70$6;}
63449 else if(__label__==23){var $cmp39=((($5))|0)!=0;if($cmp39){__label__=24;;}else{__label__=25;;}
63450 if(__label__==24){var $25=$optarg2;__Z8strncpy0PcPKci($arraydecay41,$25,40);;}
63451 var $26=$c;$flag_compile=$26;__label__=38;break $sw_default$$sw_bb$$sw_bb8$$sw_bb11$$sw_bb13$$sw_bb14$$sw_bb15$$sw_bb16$$sw_bb21$$sw_bb22$$sw_bb23$$sw_bb25$$sw_bb27$$sw_bb29$$sw_bb31$$sw_bb33$$sw_bb34$$sw_bb35$$sw_bb36$$sw_bb38$$sw_bb43$$sw_bb53$$sw_bb56$$sw_bb61$$sw_bb62$$sw_bb69$$sw_bb70$6;}
63452 else if(__label__==26){HEAP32[((_option_punctuation)>>2)]=1;var $27=$optarg2;var $cmp44=((($27))|0)!=0;if(!($cmp44)){__label__=38;break $sw_default$$sw_bb$$sw_bb8$$sw_bb11$$sw_bb13$$sw_bb14$$sw_bb15$$sw_bb16$$sw_bb21$$sw_bb22$$sw_bb23$$sw_bb25$$sw_bb27$$sw_bb29$$sw_bb31$$sw_bb33$$sw_bb34$$sw_bb35$$sw_bb36$$sw_bb38$$sw_bb43$$sw_bb53$$sw_bb56$$sw_bb61$$sw_bb62$$sw_bb69$$sw_bb70$6;}
63453 $ix=0;__lastLabel__=27;;while(1){var $28=__lastLabel__==30?$inc:(0);var $cmp47=((($28))|0)<60;if(!($cmp47)){__label__=31;break;}
63454 var $29=$ix;var $30=$optarg2;var $arrayidx48=(($30+$29)&4294967295);var $31=HEAP8[($arrayidx48)];var $conv=(tempInt=(($31)),(tempInt>=128?tempInt-256:tempInt));var $32=$ix;var $arrayidx49=((_option_punctlist+$32*4)&4294967295);HEAP32[(($arrayidx49)>>2)]=$conv;var $cmp50=((($conv))|0)!=0;if(!($cmp50)){__label__=31;break;}
63455 var $33=$ix;var $inc=((($33)+1)&4294967295);$ix=$inc;__lastLabel__=30;__label__=28;continue;}
63456 HEAP32[((((_option_punctlist+236)&4294967295))>>2)]=0;HEAP32[((_option_punctuation)>>2)]=2;__label__=38;break $sw_default$$sw_bb$$sw_bb8$$sw_bb11$$sw_bb13$$sw_bb14$$sw_bb15$$sw_bb16$$sw_bb21$$sw_bb22$$sw_bb23$$sw_bb25$$sw_bb27$$sw_bb29$$sw_bb31$$sw_bb33$$sw_bb34$$sw_bb35$$sw_bb36$$sw_bb38$$sw_bb43$$sw_bb53$$sw_bb56$$sw_bb61$$sw_bb62$$sw_bb69$$sw_bb70$6;}
63457 else if(__label__==32){var $34=$argv_addr;var $arrayidx54=(($34)&4294967295);var $35=HEAP32[(($arrayidx54)>>2)];var $36=$data_path;__ZL9init_pathPcS_($35,$36);var $37=HEAP32[((__impure_ptr)>>2)];var $_stdout55=(($37+8)&4294967295);var $38=HEAP32[(($_stdout55)>>2)];var $39=$optarg2;__Z13DisplayVoicesP7__sFILEPc($38,$39);_exit(0);var $_pr=$optarg2;__lastLabel__=32;__label__=33;break $sw_default$$sw_bb$$sw_bb8$$sw_bb11$$sw_bb13$$sw_bb14$$sw_bb15$$sw_bb16$$sw_bb21$$sw_bb22$$sw_bb23$$sw_bb25$$sw_bb27$$sw_bb29$$sw_bb31$$sw_bb33$$sw_bb34$$sw_bb35$$sw_bb36$$sw_bb38$$sw_bb43$$sw_bb53$$sw_bb56$$sw_bb61$$sw_bb62$$sw_bb69$$sw_bb70$6;}
63458 else if(__label__==36){var $42=$optarg2;$data_path=$42;__label__=38;break $sw_default$$sw_bb$$sw_bb8$$sw_bb11$$sw_bb13$$sw_bb14$$sw_bb15$$sw_bb16$$sw_bb21$$sw_bb22$$sw_bb23$$sw_bb25$$sw_bb27$$sw_bb29$$sw_bb31$$sw_bb33$$sw_bb34$$sw_bb35$$sw_bb36$$sw_bb38$$sw_bb43$$sw_bb53$$sw_bb56$$sw_bb61$$sw_bb62$$sw_bb69$$sw_bb70$6;}
63459 else if(__label__==37){var $43=$optarg2;var $call63=_fopen($43,((__str11422)&4294967295));HEAP32[((_f_trans)>>2)]=$call63;var $cmp64=((($call63))|0)==0;if(!($cmp64)){__label__=38;break $sw_default$$sw_bb$$sw_bb8$$sw_bb11$$sw_bb13$$sw_bb14$$sw_bb15$$sw_bb16$$sw_bb21$$sw_bb22$$sw_bb23$$sw_bb25$$sw_bb27$$sw_bb29$$sw_bb31$$sw_bb33$$sw_bb34$$sw_bb35$$sw_bb36$$sw_bb38$$sw_bb43$$sw_bb53$$sw_bb56$$sw_bb61$$sw_bb62$$sw_bb69$$sw_bb70$6;}
63460 var $46=HEAP32[((__impure_ptr)>>2)];var $_stderr=(($46+12)&4294967295);var $47=HEAP32[(($_stderr)>>2)];var $48=$optarg2;var $call66=_fprintf($47,((__str23)&4294967295),allocate([$48,0,0,0],["i8*",0,0,0],ALLOC_STACK));var $49=HEAP32[((__impure_ptr)>>2)];var $_stderr67=(($49+12)&4294967295);var $50=HEAP32[(($_stderr67)>>2)];HEAP32[((_f_trans)>>2)]=$50;__label__=38;break $sw_default$$sw_bb$$sw_bb8$$sw_bb11$$sw_bb13$$sw_bb14$$sw_bb15$$sw_bb16$$sw_bb21$$sw_bb22$$sw_bb23$$sw_bb25$$sw_bb27$$sw_bb29$$sw_bb31$$sw_bb33$$sw_bb34$$sw_bb35$$sw_bb36$$sw_bb38$$sw_bb43$$sw_bb53$$sw_bb56$$sw_bb61$$sw_bb62$$sw_bb69$$sw_bb70$6;}
63461 else if(__label__==40){HEAP32[((_option_mbrola_phonemes)>>2)]=16;__label__=38;break $sw_default$$sw_bb$$sw_bb8$$sw_bb11$$sw_bb13$$sw_bb14$$sw_bb15$$sw_bb16$$sw_bb21$$sw_bb22$$sw_bb23$$sw_bb25$$sw_bb27$$sw_bb29$$sw_bb31$$sw_bb33$$sw_bb34$$sw_bb35$$sw_bb36$$sw_bb38$$sw_bb43$$sw_bb53$$sw_bb56$$sw_bb61$$sw_bb62$$sw_bb69$$sw_bb70$6;}
63462 else if(__label__==41){HEAP32[((_option_phonemes)>>2)]=3;__label__=38;break $sw_default$$sw_bb$$sw_bb8$$sw_bb11$$sw_bb13$$sw_bb14$$sw_bb15$$sw_bb16$$sw_bb21$$sw_bb22$$sw_bb23$$sw_bb25$$sw_bb27$$sw_bb29$$sw_bb31$$sw_bb33$$sw_bb34$$sw_bb35$$sw_bb36$$sw_bb38$$sw_bb43$$sw_bb53$$sw_bb56$$sw_bb61$$sw_bb62$$sw_bb69$$sw_bb70$6;}}while(0);if(__label__==33){var $40=__lastLabel__==32?$_pr:($5);var $cmp57=((($40))|0)==0;if($cmp57){__label__=34;;}else{__label__=35;;}
63463 if(__label__==34){HEAP32[((_samples_split)>>2)]=30;;}
63464 else if(__label__==35){var $41=$optarg2;var $call59=_atoi($41);HEAP32[((_samples_split)>>2)]=$call59;;}}
63465 var $44=$argc_addr;var $45=$argv_addr;var $call=_getopt_long($44,$45,((__str19)&4294967295),((__ZZ4mainE12long_options)&4294967295),$option_index);$c=$call;var $cmp=((($call))|0)==-1;if($cmp){__lastLabel__=38;__label__=43;break $while_end71$$if_end_lr_ph$2;}else{__lastLabel__=38;__label__=2;continue $if_end$4;}}}}while(0);var $51=$argv_addr;var $arrayidx72=(($51)&4294967295);var $52=HEAP32[(($arrayidx72)>>2)];var $53=$data_path;__ZL9init_pathPcS_($52,$53);__ZL10initialisev();var $54=$flag_compile;var $tobool=((($54))|0)!=0;if($tobool){__label__=44;;}else{__label__=45;;}
63466 if(__label__==44){var $arraydecay75=(($voicename)&4294967295);var $call76=__Z9LoadVoicePKci($arraydecay75,5);var $55=$flag_compile;var $and=($55)&1;var $call77=__Z17CompileDictionaryPKcS0_P7__sFILEPci(0,((_dictionary_name)&4294967295),0,0,$and);_exit(0);;}
63467 var $arrayidx79=(($voicename)&4294967295);var $56=HEAP8[($arrayidx79)];var $conv80=(tempInt=(($56)),(tempInt>=128?tempInt-256:tempInt));var $cmp81=((($conv80))|0)==0;if($cmp81){__label__=46;;}else{__label__=47;;}
63468 if(__label__==46){var $arraydecay83=(($voicename)&4294967295);var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=((__str45697)&4294967295);$dest$=$arraydecay83;$stop$=$src$+8;if(($dest$%4)==($src$%4)&&8>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
63469 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
63470 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};;}
63471 var $arraydecay86=(($voicename)&4294967295);var $call87=__Z14SetVoiceByNamePKc($arraydecay86);var $cmp88=((($call87))|0)!=0;if($cmp88){__label__=48;;}else{__label__=50;;}
63472 $if_then89$$if_end98$58:do{if(__label__==48){var $57=$voice_select;var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=$57;$stop$=$dest$+24;$value4$=0;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=0;}
63473 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
63474 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=0;};var $arraydecay90=(($voicename)&4294967295);var $languages=(($voice_select+4)&4294967295);HEAP32[(($languages)>>2)]=$arraydecay90;var $call91=__Z20SetVoiceByPropertiesP12espeak_VOICE($voice_select);var $cmp92=((($call91))|0)!=0;if(!($cmp92)){__label__=50;break $if_then89$$if_end98$58;}
63475 var $58=HEAP32[((__impure_ptr)>>2)];var $_stderr94=(($58+12)&4294967295);var $59=HEAP32[(($_stderr94)>>2)];var $60=$_ZZ4mainE8err_load;var $arraydecay95=(($voicename)&4294967295);var $call96=_fprintf($59,((__str25)&4294967295),allocate([$60,0,0,0,$arraydecay95,0,0,0],["i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));_exit(2);;}}while(0);var $61=$speed;__Z12SetParameteriii(1,$61,0);var $62=$amp;__Z12SetParameteriii(2,$62,0);var $63=HEAP32[((_option_capitals)>>2)];__Z12SetParameteriii(6,$63,0);var $64=HEAP32[((_option_punctuation)>>2)];__Z12SetParameteriii(5,$64,0);var $65=$wordgap;__Z12SetParameteriii(7,$65,0);var $66=$pitch_adjustment;var $cmp99=((($66))|0)!=50;if($cmp99){__label__=51;;}else{__label__=52;;}
63476 if(__label__==51){var $67=$pitch_adjustment;__Z12SetParameteriii(3,$67,0);;}
63477 var $68=HEAP32[((_voice)>>2)];__Z13DoVoiceChangeP7voice_t($68);var $arrayidx102=(($filename)&4294967295);var $69=HEAP8[($arrayidx102)];var $conv103=(tempInt=(($69)),(tempInt>=128?tempInt-256:tempInt));var $cmp104=((($conv103))|0)==0;if($cmp104){__label__=53;;}else{__label__=59;;}
63478 $if_then105$$if_else116$65:do{if(__label__==53){var $70=HEAP32[((_optind)>>2)];var $71=$argc_addr;var $cmp106=((($70))|0)<((($71))|0);var $72=$flag_stdin;if($cmp106){__label__=54;;}else{__label__=57;;}
63479 if(__label__==54){var $cmp108=((($72))|0)==0;if($cmp108){__label__=56;;}else{__label__=55;;}
63480 if(__label__==56){var $75=HEAP32[((_optind)>>2)];var $76=$argv_addr;var $arrayidx110=(($76+4*$75)&4294967295);var $77=HEAP32[(($arrayidx110)>>2)];$p_text=$77;;}
63481 else if(__label__==55){var $73=HEAP32[((__impure_ptr)>>2)];var $_stdin3=(($73+4)&4294967295);var $74=HEAP32[(($_stdin3)>>2)];$f_text=$74;__lastLabel__=55;__label__=61;break $if_then105$$if_else116$65;}}
63482 else if(__label__==57){var $78=HEAP32[((__impure_ptr)>>2)];var $_stdin=(($78+4)&4294967295);var $79=HEAP32[(($_stdin)>>2)];$f_text=$79;var $cmp112=((($72))|0)==0;if($cmp112){__lastLabel__=57;;}else{__lastLabel__=57;__label__=61;break $if_then105$$if_else116$65;}
63483 HEAP32[((_option_linelength)>>2)]=-1;;}
63484 var $_pr5=$f_text;__lastLabel__=60;;}
63485 else if(__label__==59){var $arraydecay117=(($filename)&4294967295);var $call118=_fopen($arraydecay117,((__str51703)&4294967295));$f_text=$call118;__lastLabel__=59;;}}while(0);var $80=__lastLabel__==60?$_pr5:(__lastLabel__==55?$74:(__lastLabel__==57?$79:($call118)));var $cmp120=((($80))|0)==0;if($cmp120){__label__=62;;}else{__label__=64;;}
63486 $land_lhs_true121$$if_end127$77:do{if(__label__==62){var $81=$p_text;var $cmp122=((($81))|0)==0;if(!($cmp122)){__label__=64;break $land_lhs_true121$$if_end127$77;}
63487 var $82=HEAP32[((__impure_ptr)>>2)];var $_stderr124=(($82+12)&4294967295);var $83=HEAP32[(($_stderr124)>>2)];var $84=$_ZZ4mainE8err_load;var $arraydecay125=(($filename)&4294967295);var $call126=_fprintf($83,((__str27)&4294967295),allocate([$84,0,0,0,$arraydecay125,0,0,0],["i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));_exit(1);;}}while(0);var $85=HEAP32[((_option_waveout)>>2)];var $tobool128=((($85))|0)!=0;var $86=HEAP32[((_quiet)>>2)];var $tobool129=((($86))|0)!=0;var $or_cond1=($tobool128)|($tobool129);if($or_cond1){__label__=65;;}else{__label__=79;;}
63488 $if_then130$$if_else168$81:do{if(__label__==65){var $87=HEAP32[((_quiet)>>2)];var $tobool131=((($87))|0)!=0;var $88=HEAP32[((_samplerate)>>2)];if($tobool131){__label__=66;;}else{__label__=67;;}
63489 $if_then132$$if_else134$83:do{if(__label__==66){var $call133=__ZL12OpenWaveFilePKci(0,$88);HEAP32[((_option_waveout)>>2)]=1;;}
63490 else if(__label__==67){var $89=HEAP32[((_samples_split)>>2)];var $mul=((($88)*60)&4294967295);var $mul135=((($mul)*($89))&4294967295);HEAP32[((_samples_split)>>2)]=$mul135;var $90=HEAP32[((_samples_split)>>2)];var $tobool136=((($90))|0)!=0;if($tobool136){__label__=68;;}else{__label__=71;;}
63491 if(__label__==68){var $call138=_strrchr(((_wavefile)&4294967295),46);$extn=$call138;var $91=$extn;var $cmp139=((($91))|0)!=0;if(!($cmp139)){__label__=73;break $if_then132$$if_else134$83;}
63492 var $call141=_strlen(((_wavefile)&4294967295));var $add_ptr=((((_wavefile)&4294967295)+$call141)&4294967295);var $92=$extn;var $sub_ptr_lhs_cast=($add_ptr);var $sub_ptr_rhs_cast=($92);var $sub_ptr_sub=((($sub_ptr_lhs_cast)-($sub_ptr_rhs_cast))&4294967295);var $cmp142=((($sub_ptr_sub))|0)<=4;if(!($cmp142)){__label__=73;break $if_then132$$if_else134$83;}
63493 var $93=$extn;var $call144=_strcpy(((_filetype)&4294967295),$93);var $94=$extn;HEAP8[($94)]=0;;}
63494 else if(__label__==71){var $95=HEAP32[((_samplerate)>>2)];var $call147=__ZL12OpenWaveFilePKci(((_wavefile)&4294967295),$95);var $cmp148=((($call147))|0)!=0;if(!($cmp148)){__label__=73;break $if_then132$$if_else134$83;}
63495 var $96=HEAP32[((__impure_ptr)>>2)];var $_stderr150=(($96+12)&4294967295);var $97=HEAP32[(($_stderr150)>>2)];var $call151=_fprintf($97,((__str28)&4294967295),allocate([((_wavefile)&4294967295),0,0,0],["i8*",0,0,0],ALLOC_STACK));_exit(3);;}}}while(0);__Z8InitTexti(0);var $98=$f_text;var $99=$p_text;var $call155=__Z15SpeakNextClauseP7__sFILEPKvi($98,$99,0);$ix=1;;while(1){var $call156=__ZL11WavegenFilev();var $cmp157=((($call156))|0)!=0;if($cmp157){__label__=75;;}else{__label__=76;;}
63496 if(__label__==75){var $100=$ix;var $cmp159=((($100))|0)==0;if($cmp159){__label__=78;break;}}
63497 var $call163=__Z8GenerateP12PHONEME_LISTPii(((_phoneme_list)&4294967295),_n_phoneme_list,1);var $cmp164=((($call163))|0)==0;if(!($cmp164)){__label__=74;continue;}
63498 var $call166=__Z15SpeakNextClauseP7__sFILEPKvi(0,0,1);$ix=$call166;__label__=74;continue;}
63499 __ZL13CloseWaveFilev();__label__=83;break $if_then130$$if_else168$81;}
63500 else if(__label__==79){__Z8InitTexti(0);var $101=$f_text;var $102=$p_text;var $call170=__Z15SpeakNextClauseP7__sFILEPKvi($101,$102,0);var $103=HEAP32[((_option_quiet)>>2)];var $tobool171=((($103))|0)!=0;if($tobool171){__label__=80;;}else{__label__=82;;}
63501 if(__label__==80){while(1){var $call173=__Z15SpeakNextClauseP7__sFILEPKvi(0,0,1);var $cmp174=((($call173))|0)!=0;if($cmp174){__label__=80;continue;}else{__label__=81;break;}}
63502 $retval=0;__label__=87;break $if_then130$$if_else168$81;}
63503 else if(__label__==82){var $104=HEAP32[((__impure_ptr)>>2)];var $_stderr178=(($104+12)&4294967295);var $105=HEAP32[(($_stderr178)>>2)];var $106=_fwrite(((__str29)&4294967295),79,1,$105);__label__=83;break $if_then130$$if_else168$81;}}}while(0);if(__label__==83){var $107=HEAP32[((_f_trans)>>2)];var $108=HEAP32[((__impure_ptr)>>2)];var $_stdout181=(($108+8)&4294967295);var $109=HEAP32[(($_stdout181)>>2)];var $cmp182=((($107))|0)!=((($109))|0);if($cmp182){__label__=84;;}else{__label__=86;;}
63504 $land_lhs_true183$$if_end188$108:do{if(__label__==84){var $110=HEAP32[((_f_trans)>>2)];var $111=HEAP32[((__impure_ptr)>>2)];var $_stderr184=(($111+12)&4294967295);var $112=HEAP32[(($_stderr184)>>2)];var $cmp185=((($110))|0)!=((($112))|0);if(!($cmp185)){__label__=86;break $land_lhs_true183$$if_end188$108;}
63505 var $113=HEAP32[((_f_trans)>>2)];var $call187=_fclose($113);;}}while(0);$retval=0;;}
63506 var $114=$retval;;return $114;return null;}
63507 Module["_main"]=_main;function __ZL9init_pathPcS_($argv0,$path_specified){;var __label__;var $argv0_addr;var $path_specified_addr;var $env;$argv0_addr=$argv0;$path_specified_addr=$path_specified;var $0=$path_specified_addr;var $tobool=((($0))|0)!=0;if($tobool){__label__=1;;}else{__label__=2;;}
63508 $if_then$$if_end$2:do{if(__label__==1){var $1=$path_specified_addr;var $call=_sprintf(((_path_home)&4294967295),((__str38)&4294967295),allocate([$1,0,0,0],["i8*",0,0,0],ALLOC_STACK));;}
63509 else if(__label__==2){var $call1=_getenv(((__str39)&4294967295));$env=$call1;var $cmp=((($call1))|0)!=0;if($cmp){__label__=3;;}else{__label__=4;;}
63510 if(__label__==3){var $2=$env;var $call3=_snprintf(((_path_home)&4294967295),150,((__str38)&4294967295),allocate([$2,0,0,0],["i8*",0,0,0],ALLOC_STACK));var $call4=__Z13GetFileLengthPKc(((_path_home)&4294967295));var $cmp5=((($call4))|0)==-2;if($cmp5){__label__=6;break $if_then$$if_end$2;}}
63511 var $call9=_getenv(((__str40)&4294967295));var $call10=_snprintf(((_path_home)&4294967295),150,((__str38)&4294967295),allocate([$call9,0,0,0],["i8*",0,0,0],ALLOC_STACK));var $call11=_access(((_path_home)&4294967295),4);var $cmp12=((($call11))|0)!=0;if(!($cmp12)){__label__=6;break $if_then$$if_end$2;}
63512 var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=((__str41)&4294967295);$dest$=((_path_home)&4294967295);$stop$=$src$+23;if(($dest$%4)==($src$%4)&&23>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
63513 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
63514 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};;}}while(0);;return;return;}
63515 function __ZL10initialisev(){;var __label__;var $param;var $result;var $call=_setlocale(2,((__str32)&4294967295));var $cmp=((($call))|0)==0;if($cmp){__label__=1;;}else{__label__=3;;}
63516 $if_then$$if_end5$2:do{if(__label__==1){var $call1=_setlocale(2,((__str33)&4294967295));var $cmp2=((($call1))|0)==0;if(!($cmp2)){__label__=3;break $if_then$$if_end5$2;}
63517 var $call4=_setlocale(2,((__str13643)&4294967295));;}}while(0);__Z11WavegenInitii(22050,0);var $call6=__Z10LoadPhDatav();$result=$call6;var $cmp7=((($call6))|0)!=1;if($cmp7){__label__=4;;}else{__label__=7;;}
63518 if(__label__==4){var $0=$result;var $cmp9=((($0))|0)==-1;var $1=HEAP32[((__impure_ptr)>>2)];var $_stderr=(($1+12)&4294967295);var $2=HEAP32[(($_stderr)>>2)];if($cmp9){__label__=5;;}else{__label__=6;;}
63519 if(__label__==5){var $3=_fwrite(((__str35)&4294967295),27,1,$2);_exit(1);;}
63520 else if(__label__==6){var $4=$result;var $call13=_fprintf($2,((__str36)&4294967295),allocate([$4,0,0,0,83200,0,0,0,((_path_home)&4294967295),0,0,0],["i32",0,0,0,"i32",0,0,0,"i8*",0,0,0],ALLOC_STACK));;}}
63521 __Z10LoadConfigv();__Z13SetVoiceStackP12espeak_VOICE(0);__Z14SynthesizeInitv();$param=0;;while(1){var $5=$param;var $arrayidx=((_param_defaults+$5*4)&4294967295);var $6=HEAP32[(($arrayidx)>>2)];var $7=$param;var $arrayidx17=((((_param_stack+4)&4294967295)+$7*4)&4294967295);HEAP32[(($arrayidx17)>>2)]=$6;var $8=$param;var $inc=((($8)+1)&4294967295);$param=$inc;var $cmp16=((($inc))|0)<15;if($cmp16){__label__=8;continue;}else{__label__=9;break;}};return;return;}
63522 function __ZL12OpenWaveFilePKci($path,$rate){;var __label__;var __lastLabel__=null;var $retval;var $path_addr;var $rate_addr;$path_addr=$path;$rate_addr=$rate;var $0=$path_addr;var $cmp=((($0))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
63523 if(__label__==1){$retval=2;;}
63524 else if(__label__==2){var $1=$path_addr;var $call=_strcmp($1,((__str12)&4294967295));var $cmp1=((($call))|0)==0;if($cmp1){__label__=3;;}else{__label__=4;;}
63525 if(__label__==3){var $2=HEAP32[((__impure_ptr)>>2)];var $_stdout=(($2+8)&4294967295);var $3=HEAP32[(($_stdout)>>2)];HEAP32[((_f_wave)>>2)]=$3;__lastLabel__=3;;}
63526 else if(__label__==4){var $4=$path_addr;var $call3=_fopen($4,((__str79)&4294967295));HEAP32[((_f_wave)>>2)]=$call3;__lastLabel__=4;;}
63527 var $5=__lastLabel__==4?$call3:($3);var $cmp5=((($5))|0)!=0;if($cmp5){__label__=6;;}else{__label__=7;;}
63528 if(__label__==6){var $6=HEAP32[((_f_wave)>>2)];var $call7=_fwrite(((__ZZL12OpenWaveFilePKciE8wave_hdr)&4294967295),1,24,$6);var $7=HEAP32[((_f_wave)>>2)];var $8=$rate_addr;__Z11Write4BytesP7__sFILEi($7,$8);var $9=HEAP32[((_f_wave)>>2)];var $10=$rate_addr;var $mul=((($10)*2)&4294967295);__Z11Write4BytesP7__sFILEi($9,$mul);var $11=HEAP32[((_f_wave)>>2)];var $call8=_fwrite(((__ZZL12OpenWaveFilePKciE8wave_hdr+32)&4294967295),1,12,$11);$retval=0;;}
63529 else if(__label__==7){$retval=1;;}}
63530 var $12=$retval;;return $12;return null;}
63531 function __ZL11WavegenFilev(){var __stackBase__=STACKTOP;STACKTOP+=1236;_memset(__stackBase__,0,1236);var __label__;var $retval;var $finished;var $wav_outbuf=__stackBase__;var $fname=__stackBase__+1024;var $arraydecay=(($wav_outbuf)&4294967295);HEAP32[((_out_start)>>2)]=$arraydecay;HEAP32[((_out_ptr)>>2)]=$arraydecay;var $arraydecay1=(($wav_outbuf)&4294967295);var $add_ptr=(($arraydecay1+1024)&4294967295);HEAP32[((_out_end)>>2)]=$add_ptr;var $call=__Z11WavegenFilli(0);$finished=$call;var $0=HEAP32[((_quiet)>>2)];var $tobool=((($0))|0)!=0;if($tobool){__label__=1;;}else{__label__=2;;}
63532 $if_then$$if_end$2:do{if(__label__==1){var $1=$finished;$retval=$1;;}
63533 else if(__label__==2){var $2=HEAP32[((_f_wave)>>2)];var $cmp=((($2))|0)==0;if($cmp){__label__=3;;}else{__label__=5;;}
63534 $if_then2$$if_end10$5:do{if(__label__==3){var $arraydecay3=(($fname)&4294967295);var $3=HEAP32[((_wavefile_count)>>2)];var $inc=((($3)+1)&4294967295);HEAP32[((_wavefile_count)>>2)]=$inc;var $call4=_sprintf($arraydecay3,((__str30)&4294967295),allocate([((_wavefile)&4294967295),0,0,0,$inc,0,0,0,((_filetype)&4294967295),0,0,0],["i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0],ALLOC_STACK));var $arraydecay5=(($fname)&4294967295);var $4=HEAP32[((_samplerate)>>2)];var $call6=__ZL12OpenWaveFilePKci($arraydecay5,$4);var $cmp7=((($call6))|0)!=0;if(!($cmp7)){__label__=5;break $if_then2$$if_end10$5;}
63535 $retval=1;__label__=12;break $if_then$$if_end$2;}}while(0);var $5=HEAP32[((_end_of_sentence)>>2)];var $tobool11=((($5))|0)!=0;if($tobool11){__label__=6;;}else{__label__=9;;}
63536 $if_then12$$if_end17$9:do{if(__label__==6){HEAP32[((_end_of_sentence)>>2)]=0;var $6=HEAPU32[((_samples_split)>>2)];var $cmp13=((($6))>>>0)>0;if(!($cmp13)){__label__=9;break $if_then12$$if_end17$9;}
63537 var $7=HEAPU32[((_samples_total)>>2)];var $8=HEAPU32[((_samples_split)>>2)];var $cmp14=((($7))>>>0)>((($8))>>>0);if(!($cmp14)){__label__=9;break $if_then12$$if_end17$9;}
63538 __ZL13CloseWaveFilev();HEAP32[((_samples_total)>>2)]=0;;}}while(0);var $9=HEAP32[((_f_wave)>>2)];var $cmp18=((($9))|0)!=0;if($cmp18){__label__=10;;}else{__label__=11;;}
63539 if(__label__==10){var $10=HEAP32[((_out_ptr)>>2)];var $arraydecay20=(($wav_outbuf)&4294967295);var $sub_ptr_lhs_cast=($10);var $sub_ptr_rhs_cast=($arraydecay20);var $sub_ptr_sub=((($sub_ptr_lhs_cast)-($sub_ptr_rhs_cast))&4294967295);var $div=((((($sub_ptr_sub))|0)/2)|0);var $11=HEAP32[((_samples_total)>>2)];var $add=((($11)+($div))&4294967295);HEAP32[((_samples_total)>>2)]=$add;var $arraydecay21=(($wav_outbuf)&4294967295);var $12=HEAP32[((_out_ptr)>>2)];var $arraydecay22=(($wav_outbuf)&4294967295);var $sub_ptr_lhs_cast23=($12);var $sub_ptr_rhs_cast24=($arraydecay22);var $sub_ptr_sub25=((($sub_ptr_lhs_cast23)-($sub_ptr_rhs_cast24))&4294967295);var $13=HEAP32[((_f_wave)>>2)];var $call26=_fwrite($arraydecay21,1,$sub_ptr_sub25,$13);;}
63540 var $14=$finished;$retval=$14;;}}while(0);var $15=$retval;STACKTOP=__stackBase__;return $15;return null;}
63541 function __ZL13CloseWaveFilev(){;var __label__;var $pos;var $0=HEAP32[((_f_wave)>>2)];var $cmp=((($0))|0)==0;if($cmp){__label__=3;;}else{__label__=1;;}
63542 $return$$lor_lhs_false$2:do{if(__label__==1){var $1=HEAP32[((_f_wave)>>2)];var $2=HEAP32[((__impure_ptr)>>2)];var $_stdout=(($2+8)&4294967295);var $3=HEAP32[(($_stdout)>>2)];var $cmp1=((($1))|0)==((($3))|0);if($cmp1){__label__=3;break $return$$lor_lhs_false$2;}
63543 var $4=HEAP32[((_f_wave)>>2)];var $call=_fflush($4);var $5=HEAP32[((_f_wave)>>2)];var $call2=_ftell($5);$pos=$call2;var $6=HEAP32[((_f_wave)>>2)];var $call3=_fseek($6,4,0);var $7=HEAP32[((_f_wave)>>2)];var $8=$pos;var $sub=((($8)-8)&4294967295);__Z11Write4BytesP7__sFILEi($7,$sub);var $9=HEAP32[((_f_wave)>>2)];var $call4=_fseek($9,40,0);var $10=HEAP32[((_f_wave)>>2)];var $11=$pos;var $sub5=((($11)-44)&4294967295);__Z11Write4BytesP7__sFILEi($10,$sub5);var $12=HEAP32[((_f_wave)>>2)];var $call6=_fclose($12);HEAP32[((_f_wave)>>2)]=0;;}}while(0);;return;return;}
63544 function __Z8isspace2j($c){;var __label__;var $retval;var $c_addr;var $c2;$c_addr=$c;var $0=$c_addr;var $and=($0)&255;$c2=$and;var $cmp=((($and))|0)==0;var $1=$c_addr;var $cmp1=((($1))>>>0)>32;var $or_cond=($cmp)|($cmp1);if($or_cond){__label__=1;;}else{__label__=2;;}
63545 if(__label__==1){$retval=0;;}
63546 else if(__label__==2){$retval=1;;}
63547 var $2=$retval;;return $2;return null;}
63548 function __Z14LookupMnemNameP8MNEM_TABi($table,$value){;var __label__;var $retval;var $table_addr;var $value_addr;$table_addr=$table;$value_addr=$value;;while(1){var $0=$table_addr;var $mnem=(($0)&4294967295);var $1=HEAP32[(($mnem)>>2)];var $cmp=((($1))|0)!=0;if(!($cmp)){__label__=5;break;}
63549 var $2=$table_addr;var $value1=(($2+4)&4294967295);var $3=HEAP32[(($value1)>>2)];var $4=$value_addr;var $cmp2=((($3))|0)==((($4))|0);var $5=$table_addr;if($cmp2){__label__=3;break;}
63550 var $incdec_ptr=(($5+8)&4294967295);$table_addr=$incdec_ptr;__label__=1;continue;}
63551 if(__label__==5){$retval=((__str13643)&4294967295);;}
63552 else if(__label__==3){var $mnem3=(($5)&4294967295);var $6=HEAP32[(($mnem3)>>2)];$retval=$6;;}
63553 var $7=$retval;;return $7;return null;}
63554 function __Z22print_dictionary_flagsPj($flags){;var __label__;var $flags_addr;$flags_addr=$flags;var $0=$flags_addr;var $arrayidx=(($0)&4294967295);var $1=HEAP32[(($arrayidx)>>2)];var $and=($1)&15;var $add=((($and)+64)&4294967295);var $call=__Z14LookupMnemNameP8MNEM_TABi(((_mnem_flags)&4294967295),$add);var $2=$flags_addr;var $arrayidx1=(($2)&4294967295);var $3=HEAP32[(($arrayidx1)>>2)];var $4=$flags_addr;var $arrayidx2=(($4+4)&4294967295);var $5=HEAP32[(($arrayidx2)>>2)];var $call3=_sprintf(((__ZZ22print_dictionary_flagsPjE3buf)&4294967295),((__str59)&4294967295),allocate([$call,0,0,0,$3,0,0,0,$5,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i32",0,0,0],ALLOC_STACK));;return((__ZZ22print_dictionary_flagsPjE3buf)&4294967295);return null;}
63555 function __Z10DecodeRulePKciPci($group_chars,$group_length,$rule,$control){var __stackBase__=STACKTOP;STACKTOP+=140;_memset(__stackBase__,0,140);var __label__;var __lastLabel__=null;var $group_chars_addr;var $group_length_addr;var $rule_addr;var $control_addr;var $rb;var $c;var $p;var $ix;var $match_type;var $finished;var $value;var $linenum;var $flags;var $suffix_char;var $condition_num;var $at_start;var $name;var $buf=__stackBase__;var $buf_pre=__stackBase__+60;var $suffix=__stackBase__+120;$group_chars_addr=$group_chars;$group_length_addr=$group_length;$rule_addr=$rule;$control_addr=$control;$finished=0;$linenum=0;$condition_num=0;$at_start=0;$match_type=0;var $arrayidx=(($buf_pre)&4294967295);HEAP8[($arrayidx)]=0;$ix=0;var $0=$ix;var $1=$group_length_addr;var $cmp9=((($0))|0)<((($1))|0);var $2=$ix;if($cmp9){__lastLabel__=0;__label__=1;;}else{__lastLabel__=0;__label__=2;;}
63556 $for_body$$for_end$2:do{if(__label__==1){while(1){var $3=__lastLabel__==1?$10:($2);var $4=$group_chars_addr;var $arrayidx1=(($4+$3)&4294967295);var $5=HEAP8[($arrayidx1)];var $6=$ix;var $arrayidx2=(($buf+$6)&4294967295);HEAP8[($arrayidx2)]=$5;var $7=$ix;var $inc=((($7)+1)&4294967295);$ix=$inc;var $8=$ix;var $9=$group_length_addr;var $cmp=((($8))|0)<((($9))|0);var $10=$ix;if($cmp){__lastLabel__=1;__label__=1;continue;}else{__lastLabel__=1;__label__=2;break $for_body$$for_end$2;}}}}while(0);var $_lcssa8=__lastLabel__==0?$2:($10);var $arrayidx3=(($buf+$_lcssa8)&4294967295);HEAP8[($arrayidx3)]=0;var $arraydecay=(($buf)&4294967295);var $call=_strlen($arraydecay);var $arrayidx4=(($buf+$call)&4294967295);$p=$arrayidx4;var $11=$finished;var $tobool6=((($11))|0)!=0;var $lnot7=($tobool6)^1;if($lnot7){__label__=3;;}else{__label__=38;;}
63557 $while_body_lr_ph$$while_end$6:do{if(__label__==3){var $arraydecay9=(($buf_pre)&4294967295);var $arraydecay11=(($buf)&4294967295);var $arraydecay13=(($buf)&4294967295);var $arraydecay58=(($suffix)&4294967295);var $arraydecay70=(($suffix)&4294967295);var $arraydecay80=(($suffix)&4294967295);var $arraydecay82=(($suffix)&4294967295);;$while_body$8:while(1){var $12=$rule_addr;var $incdec_ptr=(($12+1)&4294967295);$rule_addr=$incdec_ptr;var $13=HEAP8[($12)];$rb=$13;var $14=$rb;var $conv=((($14))&255);var $cmp5=((($conv))|0)<=9;var $15=$rb;var $conv6=((($15))&255);if($cmp5){__label__=5;;}else{__label__=12;;}
63558 $if_then$$if_end$10:do{if(__label__==5){if($conv6==0){__label__=6;;}
63559 else if($conv6==3){__label__=6;;}
63560 else if($conv6==8){__label__=7;;}
63561 else if($conv6==1){__label__=8;;}
63562 else if($conv6==2){__label__=9;;}
63563 else if($conv6==9){__label__=11;;}
63564 else if($conv6==5){__label__=10;;}
63565 else{__label__=37;break $if_then$$if_end$10;}
63566 if(__label__==6){$finished=1;__label__=37;break $if_then$$if_end$10;}
63567 else if(__label__==7){$at_start=1;;}
63568 else if(__label__==9){$match_type=2;var $17=$p;HEAP8[($17)]=0;var $strlen=_strlen($arraydecay11);var $endptr=(($arraydecay11+$strlen)&4294967295);var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=((__str60)&4294967295);$dest$=$endptr;$stop$=$src$+3;if(($dest$%4)==($src$%4)&&3>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
63569 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
63570 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $call14=_strlen($arraydecay13);var $arrayidx15=(($buf+$call14)&4294967295);$p=$arrayidx15;__label__=37;break $if_then$$if_end$10;}
63571 else if(__label__==11){var $20=$rule_addr;var $arrayidx20=(($20+1)&4294967295);var $21=HEAP8[($arrayidx20)];var $conv21=(tempInt=(($21)),(tempInt>=128?tempInt-256:tempInt));var $and=($conv21)&255;var $sub=((($and)-1)&4294967295);$value=$sub;var $22=$rule_addr;var $arrayidx22=(($22)&4294967295);var $23=HEAP8[($arrayidx22)];var $conv23=(tempInt=(($23)),(tempInt>=128?tempInt-256:tempInt));var $and24=($conv23)&255;var $24=$value;var $mul=((($24)*255)&4294967295);var $sub25=((($mul)-1)&4294967295);var $add=((($sub25)+($and24))&4294967295);$linenum=$add;var $25=$rule_addr;var $add_ptr=(($25+2)&4294967295);$rule_addr=$add_ptr;__label__=37;break $if_then$$if_end$10;}
63572 else if(__label__==10){var $18=$rule_addr;var $incdec_ptr17=(($18+1)&4294967295);$rule_addr=$incdec_ptr17;var $19=HEAP8[($18)];var $conv18=(tempInt=(($19)),(tempInt>=128?tempInt-256:tempInt));$condition_num=$conv18;__label__=37;break $if_then$$if_end$10;}
63573 $match_type=1;var $16=$p;HEAP8[($16)]=0;$p=$arraydecay9;;}
63574 else if(__label__==12){var $cmp27=((($conv6))|0)==28;if($cmp27){__label__=13;;}else{__label__=17;;}
63575 if(__label__==13){var $26=$rule_addr;var $incdec_ptr29=(($26+1)&4294967295);$rule_addr=$incdec_ptr29;var $27=HEAP8[($26)];var $conv30=(tempInt=(($27)),(tempInt>=128?tempInt-256:tempInt));var $and31=($conv30)&255;$value=$and31;var $28=$value;var $cmp32=((($28))|0)!=1;if($cmp32){__label__=15;;}else{__label__=14;;}
63576 $if_then35$$lor_lhs_false$22:do{if(__label__==14){var $29=$control_addr;var $and33=($29)&-2147483648;var $tobool34=((($and33))|0)!=0;if($tobool34){__label__=15;break $if_then35$$lor_lhs_false$22;}else{__label__=16;break $if_then35$$lor_lhs_false$22;}}}while(0);if(__label__==15){var $30=$p;var $arrayidx36=(($30)&4294967295);HEAP8[($arrayidx36)]=36;var $31=$value;var $call37=__Z14LookupMnemNameP8MNEM_TABi(((_mnem_rules)&4294967295),$31);$name=$call37;var $32=$p;var $arrayidx38=(($32+1)&4294967295);var $33=$name;var $call39=_strcpy($arrayidx38,$33);var $34=$name;var $call40=_strlen($34);var $add41=((($call40)+1)&4294967295);var $35=$p;var $add_ptr42=(($35+$add41)&4294967295);$p=$add_ptr42;;}
63577 $c=32;;}
63578 else if(__label__==17){var $36=$rb;var $conv44=((($36))&255);var $cmp45=((($conv44))|0)==14;if($cmp45){__label__=18;;}else{__label__=25;;}
63579 if(__label__==18){var $37=$rule_addr;var $arrayidx47=(($37)&4294967295);var $38=HEAP8[($arrayidx47)];var $conv48=(tempInt=(($38)),(tempInt>=128?tempInt-256:tempInt));var $and49=($conv48)&127;var $shl=((($and49)*256)&4294967295);var $39=$rule_addr;var $arrayidx50=(($39+1)&4294967295);var $40=HEAP8[($arrayidx50)];var $conv51=(tempInt=(($40)),(tempInt>=128?tempInt-256:tempInt));var $and52=($conv51)&127;var $add53=((($and52)+($shl))&4294967295);$flags=$add53;$suffix_char=83;var $41=$flags;var $and54=($41)&4;var $tobool55=((($and54))|0)!=0;if($tobool55){__label__=19;;}else{__label__=20;;}
63580 if(__label__==19){$suffix_char=80;;}
63581 var $42=$suffix_char;var $43=$rule_addr;var $arrayidx59=(($43+2)&4294967295);var $44=HEAP8[($arrayidx59)];var $conv60=(tempInt=(($44)),(tempInt>=128?tempInt-256:tempInt));var $and61=($conv60)&127;var $call62=_sprintf($arraydecay58,((__str62)&4294967295),allocate([$42,0,0,0,$and61,0,0,0],["i32",0,0,0,"i32",0,0,0],ALLOC_STACK));var $45=$rule_addr;var $add_ptr63=(($45+3)&4294967295);$rule_addr=$add_ptr63;$ix=0;;while(1){var $46=$flags;var $and67=($46)&1;var $tobool68=((($and67))|0)!=0;if($tobool68){__label__=22;;}else{__label__=23;;}
63582 if(__label__==22){var $call71=_strlen($arraydecay70);var $arrayidx72=(($suffix+$call71)&4294967295);var $47=$ix;var $arrayidx73=((((__str61)&4294967295)+$47)&4294967295);var $48=HEAP8[($arrayidx73)];var $conv74=(tempInt=(($48)),(tempInt>=128?tempInt-256:tempInt));var $char=((($conv74))&255);HEAP8[($arrayidx72)]=$char;var $nul=(($arrayidx72+1)&4294967295);HEAP8[($nul)]=0;;}
63583 var $49=$flags;var $shr=($49)>>1;$flags=$shr;var $50=$ix;var $inc78=((($50)+1)&4294967295);$ix=$inc78;var $cmp65=((($inc78))|0)<9;if($cmp65){__label__=21;continue;}else{__label__=24;break;}}
63584 var $51=$p;var $call81=_strcpy($51,$arraydecay80);var $call83=_strlen($arraydecay82);var $52=$p;var $add_ptr84=(($52+$call83)&4294967295);$p=$add_ptr84;$c=32;;}
63585 else if(__label__==25){var $53=$rb;var $conv86=((($53))&255);var $cmp87=((($conv86))|0)==17;if($cmp87){__label__=26;;}else{__label__=27;;}
63586 if(__label__==26){var $54=$rule_addr;var $incdec_ptr89=(($54+1)&4294967295);$rule_addr=$incdec_ptr89;var $55=HEAP8[($54)];var $conv90=(tempInt=(($55)),(tempInt>=128?tempInt-256:tempInt));var $sub91=((($conv90)-65)&4294967295);var $arrayidx92=((__ZZ10DecodeRulePKciPciE10symbols_lg+$sub91)&4294967295);var $56=HEAP8[($arrayidx92)];$c=$56;;}
63587 else if(__label__==27){var $57=$rb;var $conv94=((($57))&255);var $cmp95=((($conv94))|0)==18;if($cmp95){__label__=28;;}else{__label__=31;;}
63588 if(__label__==28){var $58=$rule_addr;var $incdec_ptr97=(($58+1)&4294967295);$rule_addr=$incdec_ptr97;var $59=HEAP8[($58)];var $conv98=(tempInt=(($59)),(tempInt>=128?tempInt-256:tempInt));var $sub99=((($conv98)-65)&4294967295);$value=$sub99;var $60=$p;var $arrayidx100=(($60)&4294967295);HEAP8[($arrayidx100)]=76;var $61=$value;var $div=((((($61))|0)/10)|0);var $add101=((($div)+48)&4294967295);var $conv102=((($add101))&255);var $62=$p;var $arrayidx103=(($62+1)&4294967295);HEAP8[($arrayidx103)]=$conv102;var $63=$value;var $rem=((($63))|0)%10;var $add104=((($rem)+48)&4294967295);var $conv105=((($add104))&255);$c=$conv105;var $64=$match_type;var $cmp106=((($64))|0)==1;if($cmp106){__label__=29;;}else{__label__=30;;}
63589 if(__label__==29){var $65=$c;var $66=$p;var $arrayidx108=(($66)&4294967295);HEAP8[($arrayidx108)]=$65;$c=76;;}
63590 var $67=$p;var $add_ptr110=(($67+2)&4294967295);$p=$add_ptr110;;}
63591 else if(__label__==31){var $68=$rb;var $conv112=((($68))&255);var $cmp113=((($conv112))|0)<=31;var $69=$rb;var $idxprom=((($69))&255);if($cmp113){__label__=32;;}else{__label__=33;;}
63592 if(__label__==32){var $arrayidx115=((__ZZ10DecodeRulePKciPciE7symbols+$idxprom)&4294967295);var $70=HEAP8[($arrayidx115)];$c=$70;;}
63593 else if(__label__==33){var $cmp118=((($idxprom))|0)==32;if($cmp118){__label__=34;;}else{__label__=35;;}
63594 if(__label__==34){$c=95;;}
63595 else if(__label__==35){var $71=$rb;$c=$71;;}}}}}}
63596 var $72=$c;var $73=$p;var $incdec_ptr127=(($73+1)&4294967295);$p=$incdec_ptr127;HEAP8[($73)]=$72;;}}while(0);var $74=$finished;var $tobool=((($74))|0)!=0;var $lnot=($tobool)^1;if($lnot){__label__=4;continue $while_body$8;}else{__label__=38;break $while_body_lr_ph$$while_end$6;}}}}while(0);var $75=$p;HEAP8[($75)]=0;$p=((__ZZ10DecodeRulePKciPciE6output)&4294967295);var $76=$linenum;var $cmp128=((($76))|0)>0;if($cmp128){__label__=39;;}else{__label__=40;;}
63597 if(__label__==39){var $77=$p;var $78=$linenum;var $call130=_sprintf($77,((__str64)&4294967295),allocate([$78,0,0,0],["i32",0,0,0],ALLOC_STACK));var $79=$p;var $add_ptr131=(($79+7)&4294967295);$p=$add_ptr131;;}
63598 var $80=$condition_num;var $cmp133=((($80))|0)>0;if($cmp133){__label__=41;;}else{__label__=42;;}
63599 if(__label__==41){var $81=$p;var $82=$condition_num;var $call135=_sprintf($81,((__str65)&4294967295),allocate([$82,0,0,0],["i32",0,0,0],ALLOC_STACK));var $83=$p;var $call136=_strlen($83);var $84=$p;var $arrayidx137=(($84+$call136)&4294967295);$p=$arrayidx137;;}
63600 var $arraydecay139=(($buf_pre)&4294967295);var $call140=_strlen($arraydecay139);$ix=$call140;var $cmp141=((($call140))|0)>0;var $_pr=$at_start;var $tobool145=((($_pr))|0)!=0;if($cmp141){__label__=44;;}else{__label__=43;;}
63601 $if_then144$$lor_lhs_false142$64:do{if(__label__==44){if($tobool145){__label__=45;break $if_then144$$lor_lhs_false142$64;}else{__label__=46;break $if_then144$$lor_lhs_false142$64;}}
63602 else if(__label__==43){if($tobool145){__label__=45;break $if_then144$$lor_lhs_false142$64;}else{__label__=49;break $if_then144$$lor_lhs_false142$64;}}}while(0);$if_then146$$while_cond149_preheader$$if_end157$67:do{if(__label__==45){var $85=$p;var $incdec_ptr147=(($85+1)&4294967295);$p=$incdec_ptr147;HEAP8[($85)]=95;__label__=46;break $if_then146$$while_cond149_preheader$$if_end157$67;}}while(0);if(__label__==46){var $86=$ix;var $dec4=((($86)-1)&4294967295);$ix=$dec4;var $cmp1505=((($dec4))|0)>=0;if($cmp1505){__label__=47;;}else{__label__=48;;}
63603 $while_body151$$while_end154$71:do{if(__label__==47){while(1){var $87=$ix;var $arrayidx152=(($buf_pre+$87)&4294967295);var $88=HEAP8[($arrayidx152)];var $89=$p;var $incdec_ptr153=(($89+1)&4294967295);$p=$incdec_ptr153;HEAP8[($89)]=$88;var $90=$ix;var $dec=((($90)-1)&4294967295);$ix=$dec;var $cmp150=((($dec))|0)>=0;if($cmp150){__label__=47;continue;}else{__label__=48;break $while_body151$$while_end154$71;}}}}while(0);var $91=$p;var $incdec_ptr155=(($91+1)&4294967295);$p=$incdec_ptr155;HEAP8[($91)]=41;var $92=$p;var $incdec_ptr156=(($92+1)&4294967295);$p=$incdec_ptr156;HEAP8[($92)]=32;;}
63604 var $93=$p;HEAP8[($93)]=0;var $94=$p;var $arraydecay158=(($buf)&4294967295);var $call159=_strcat($94,$arraydecay158);var $call160=_strlen(((__ZZ10DecodeRulePKciPciE6output)&4294967295));$ix=$call160;var $cmp1623=((($call160))|0)<8;var $95=$ix;if($cmp1623){__lastLabel__=49;__label__=50;;}else{__lastLabel__=49;__label__=51;;}
63605 $while_body163$$while_end166$76:do{if(__label__==50){while(1){var $96=__lastLabel__==50?$97:($95);var $inc164=((($96)+1)&4294967295);$ix=$inc164;var $arrayidx165=((__ZZ10DecodeRulePKciPciE6output+$96)&4294967295);HEAP8[($arrayidx165)]=32;var $_pr2=$ix;var $cmp162=((($_pr2))|0)<8;var $97=$ix;if($cmp162){__lastLabel__=50;__label__=50;continue;}else{__lastLabel__=50;__label__=51;break $while_body163$$while_end166$76;}}}}while(0);var $_lcssa=__lastLabel__==49?$95:($97);var $arrayidx167=((__ZZ10DecodeRulePKciPciE6output+$_lcssa)&4294967295);HEAP8[($arrayidx167)]=0;STACKTOP=__stackBase__;return((__ZZ10DecodeRulePKciPciE6output)&4294967295);return null;}
63606 function __Z13string_sorterPPcS0_($a,$b){;var __label__;var $retval;var $a_addr;var $b_addr;var $pa;var $pb;var $ix;$a_addr=$a;$b_addr=$b;var $0=$a_addr;var $1=HEAP32[(($0)>>2)];$pa=$1;var $2=$b_addr;var $3=HEAP32[(($2)>>2)];$pb=$3;var $call=_strcmp($1,$3);$ix=$call;var $cmp=((($call))|0)!=0;if($cmp){__label__=1;;}else{__label__=2;;}
63607 if(__label__==1){var $4=$ix;$retval=$4;;}
63608 else if(__label__==2){var $5=$pa;var $call1=_strlen($5);var $add=((($call1)+1)&4294967295);var $6=$pa;var $add_ptr=(($6+$add)&4294967295);$pa=$add_ptr;var $7=$pb;var $call2=_strlen($7);var $add3=((($call2)+1)&4294967295);var $8=$pb;var $add_ptr4=(($8+$add3)&4294967295);$pb=$add_ptr4;var $9=$pa;var $10=$pb;var $call5=_strcmp($9,$10);$retval=$call5;;}
63609 var $11=$retval;;return $11;return null;}
63610 function __Z17CompileDictionaryPKcS0_P7__sFILEPci($dsource,$dict_name,$log,$fname_err,$flags){var __stackBase__=STACKTOP;STACKTOP+=724;_memset(__stackBase__,0,724);var __label__;var $retval;var $dsource_addr;var $dict_name_addr;var $log_addr;var $fname_err_addr;var $flags_addr;var $f_in;var $f_out;var $offset_rules;var $value;var $fname_in=__stackBase__;var $fname_out=__stackBase__+196;var $fname_temp=__stackBase__+364;var $path=__stackBase__+532;$dsource_addr=$dsource;$dict_name_addr=$dict_name;$log_addr=$log;$fname_err_addr=$fname_err;$flags_addr=$flags;$offset_rules=0;HEAP32[((__ZL11error_count)>>2)]=0;HEAP32[((__ZL21error_need_dictionary)>>2)]=0;var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=((__ZL19letterGroupsDefined)&4294967295);$stop$=$dest$+26;$value4$=0;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=0;}
63611 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
63612 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=0;};var $0=$flags_addr;var $and=($0)&1;HEAP32[((__ZL10debug_flag)>>2)]=$and;var $1=$dsource_addr;var $cmp=((($1))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
63613 if(__label__==1){$dsource_addr=((__str13643)&4294967295);;}
63614 var $2=$log_addr;HEAP32[((__ZL5f_log)>>2)]=$2;var $cmp1=((($2))|0)==0;if($cmp1){__label__=3;;}else{__label__=4;;}
63615 if(__label__==3){var $3=HEAP32[((__impure_ptr)>>2)];var $_stderr=(($3+12)&4294967295);var $4=HEAP32[(($_stderr)>>2)];HEAP32[((__ZL5f_log)>>2)]=$4;;}
63616 var $arraydecay=(($path)&4294967295);var $5=$dsource_addr;var $6=$dict_name_addr;var $call=_sprintf($arraydecay,((__str66)&4294967295),allocate([$5,0,0,0,$6,0,0,0],["i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));var $arraydecay4=(($fname_in)&4294967295);var $arraydecay5=(($path)&4294967295);var $call6=_sprintf($arraydecay4,((__str67)&4294967295),allocate([$arraydecay5,0,0,0],["i8*",0,0,0],ALLOC_STACK));var $arraydecay7=(($fname_in)&4294967295);var $call8=_fopen($arraydecay7,((__str51703)&4294967295));$f_in=$call8;var $cmp9=((($call8))|0)==0;if($cmp9){__label__=5;;}else{__label__=9;;}
63617 $if_then10$$if_end23$8:do{if(__label__==5){var $arraydecay11=(($fname_in)&4294967295);var $arraydecay12=(($path)&4294967295);var $call13=_sprintf($arraydecay11,((__str69)&4294967295),allocate([$arraydecay12,0,0,0],["i8*",0,0,0],ALLOC_STACK));var $arraydecay14=(($fname_in)&4294967295);var $call15=__ZL9fopen_logPKcS0_($arraydecay14,((__str51703)&4294967295));$f_in=$call15;var $cmp16=((($call15))|0)==0;if(!($cmp16)){__label__=9;break $if_then10$$if_end23$8;}
63618 var $7=$fname_err_addr;var $tobool=((($7))|0)!=0;if($tobool){__label__=7;;}else{__label__=8;;}
63619 if(__label__==7){var $8=$fname_err_addr;var $arraydecay19=(($fname_in)&4294967295);var $call20=_strcpy($8,$arraydecay19);;}
63620 $retval=-1;__label__=17;break $if_then10$$if_end23$8;}}while(0);if(__label__==9){var $arraydecay24=(($fname_out)&4294967295);var $9=$dict_name_addr;var $call25=_sprintf($arraydecay24,((__str116)&4294967295),allocate([((_path_home)&4294967295),0,0,0,47,0,0,0,$9,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0],ALLOC_STACK));var $arraydecay26=(($fname_out)&4294967295);var $call27=__ZL9fopen_logPKcS0_($arraydecay26,((__str71)&4294967295));$f_out=$call27;var $cmp28=((($call27))|0)==0;if($cmp28){__label__=10;;}else{__label__=13;;}
63621 if(__label__==10){var $10=$fname_err_addr;var $tobool30=((($10))|0)!=0;if($tobool30){__label__=11;;}else{__label__=12;;}
63622 if(__label__==11){var $11=$fname_err_addr;var $arraydecay32=(($fname_in)&4294967295);var $call33=_strcpy($11,$arraydecay32);;}
63623 $retval=-1;;}
63624 else if(__label__==13){var $arraydecay36=(($fname_temp)&4294967295);var $call37=_sprintf($arraydecay36,((__str72)&4294967295),allocate([((_path_home)&4294967295),0,0,0,47,0,0,0],["i8*",0,0,0,"i32",0,0,0],ALLOC_STACK));$value=1024;var $12=$f_out;var $13=$value;__Z11Write4BytesP7__sFILEi($12,$13);var $14=$f_out;var $15=$offset_rules;__Z11Write4BytesP7__sFILEi($14,$15);__ZL22compile_dictlist_startv();var $16=HEAP32[((__ZL5f_log)>>2)];var $17=HEAP32[((_phoneme_tab_number)>>2)];var $arrayidx=((_phoneme_tab_list+$17*48)&4294967295);var $name=(($arrayidx)&4294967295);var $arraydecay38=(($name)&4294967295);var $call39=_fprintf($16,((__str73)&4294967295),allocate([$arraydecay38,0,0,0],["i8*",0,0,0],ALLOC_STACK));var $arraydecay40=(($path)&4294967295);__ZL21compile_dictlist_filePKcS0_($arraydecay40,((__str74)&4294967295));var $18=HEAP32[((_translator)>>2)];var $langopts=(($18)&4294967295);var $listx=(($langopts+260)&4294967295);var $19=HEAP32[(($listx)>>2)];var $tobool42=((($19))|0)!=0;var $arraydecay44=(($path)&4294967295);if($tobool42){__label__=14;;}else{__label__=15;;}
63625 if(__label__==14){__ZL21compile_dictlist_filePKcS0_($arraydecay44,((__str75)&4294967295));var $arraydecay46=(($path)&4294967295);__ZL21compile_dictlist_filePKcS0_($arraydecay46,((__str76)&4294967295));;}
63626 else if(__label__==15){__ZL21compile_dictlist_filePKcS0_($arraydecay44,((__str76)&4294967295));var $arraydecay50=(($path)&4294967295);__ZL21compile_dictlist_filePKcS0_($arraydecay50,((__str75)&4294967295));;}
63627 var $arraydecay53=(($path)&4294967295);__ZL21compile_dictlist_filePKcS0_($arraydecay53,((__str77)&4294967295));var $20=$f_out;__ZL20compile_dictlist_endP7__sFILE($20);var $21=$f_out;var $call55=_ftell($21);$offset_rules=$call55;var $22=HEAP32[((__ZL5f_log)>>2)];var $arraydecay56=(($fname_in)&4294967295);var $call57=_fprintf($22,((__str78)&4294967295),allocate([$arraydecay56,0,0,0],["i8*",0,0,0],ALLOC_STACK));var $23=$f_in;var $24=$f_out;var $arraydecay58=(($fname_temp)&4294967295);__ZL17compile_dictrulesP7__sFILES0_Pc($23,$24,$arraydecay58);var $25=$f_in;var $call60=_fclose($25);var $26=$f_out;var $call61=_fseek($26,4,0);var $27=$f_out;var $28=$offset_rules;__Z11Write4BytesP7__sFILEi($27,$28);var $29=$f_out;var $call62=_fclose($29);var $30=HEAP32[((_translator)>>2)];var $31=$dict_name_addr;var $call63=__Z14LoadDictionaryP10TranslatorPKci($30,$31,0);var $32=HEAP32[((__ZL11error_count)>>2)];$retval=$32;;}}
63628 var $33=$retval;STACKTOP=__stackBase__;return $33;return null;}
63629 function __ZL9fopen_logPKcS0_($fname,$access){;var __label__;var $fname_addr;var $access_addr;var $f;$fname_addr=$fname;$access_addr=$access;var $0=$fname_addr;var $1=$access_addr;var $call=_fopen($0,$1);$f=$call;var $cmp=((($call))|0)==0;var $2=HEAP32[((__ZL5f_log)>>2)];var $cmp1=((($2))|0)!=0;var $or_cond=($cmp)&($cmp1);if($or_cond){__label__=1;;}else{__label__=2;;}
63630 if(__label__==1){var $3=HEAP32[((__ZL5f_log)>>2)];var $4=$access_addr;var $5=$fname_addr;var $call3=_fprintf($3,((__str115)&4294967295),allocate([$4,0,0,0,$5,0,0,0],["i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));;}
63631 var $6=$f;;return $6;return null;}
63632 function __ZL22compile_dictlist_startv(){var __stackBase__=STACKTOP;STACKTOP+=4;_memset(__stackBase__,0,4);var __label__;var $ix;var $p;var $p2=__stackBase__;$ix=0;var $0=$p2;;$for_body$2:while(1){var $1=$ix;var $arrayidx=((__ZL11hash_chains+$1*4)&4294967295);var $2=HEAP32[(($arrayidx)>>2)];$p=$2;var $cmp11=((($2))|0)!=0;if($cmp11){__label__=2;;}else{__label__=3;;}
63633 $while_body$$while_end$4:do{if(__label__==2){while(1){var $3=$p;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$3;$dest$=$0;$stop$=$src$+4;if(($dest$%4)==($src$%4)&&4>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
63634 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
63635 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $4=$p;;var $5=HEAP32[(($p2)>>2)];$p=$5;var $cmp1=((($5))|0)!=0;if($cmp1){__label__=2;continue;}else{__label__=3;break $while_body$$while_end$4;}}}}while(0);var $6=$ix;var $arrayidx2=((__ZL11hash_chains+$6*4)&4294967295);HEAP32[(($arrayidx2)>>2)]=0;var $7=$ix;var $arrayidx3=((__ZL11hash_counts+$7*4)&4294967295);HEAP32[(($arrayidx3)>>2)]=0;var $8=$ix;var $inc=((($8)+1)&4294967295);$ix=$inc;var $cmp=((($inc))|0)<1024;if($cmp){__label__=1;continue $for_body$2;}else{__label__=4;break $for_body$2;}}
63636 STACKTOP=__stackBase__;return;return;}
63637 function __ZL21compile_dictlist_filePKcS0_($path,$filename){var __stackBase__=STACKTOP;STACKTOP+=528;_memset(__stackBase__,0,528);var __label__;var $retval;var $path_addr;var $filename_addr;var $length;var $hash=__stackBase__;var $p;var $count;var $f_in;var $buf=__stackBase__+4;var $fname=__stackBase__+204;var $dict_line=__stackBase__+400;$path_addr=$path;$filename_addr=$filename;$count=0;HEAP8[(__ZL9text_mode_b)]=0;var $arraydecay=(($fname)&4294967295);var $0=$path_addr;var $1=$filename_addr;var $call=_sprintf($arraydecay,((__str104)&4294967295),allocate([$0,0,0,0,$1,0,0,0],["i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));var $arraydecay1=(($fname)&4294967295);var $call2=_fopen($arraydecay1,((__str51703)&4294967295));$f_in=$call2;var $cmp=((($call2))|0)==0;if($cmp){__label__=1;;}else{__label__=3;;}
63638 $if_then$$if_end9$2:do{if(__label__==1){var $arraydecay3=(($fname)&4294967295);var $2=$path_addr;var $3=$filename_addr;var $call4=_sprintf($arraydecay3,((__str47699)&4294967295),allocate([$2,0,0,0,$3,0,0,0],["i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));var $arraydecay5=(($fname)&4294967295);var $call6=_fopen($arraydecay5,((__str51703)&4294967295));$f_in=$call6;var $cmp7=((($call6))|0)==0;if(!($cmp7)){__label__=3;break $if_then$$if_end9$2;}
63639 $retval=-1;__label__=11;break $if_then$$if_end9$2;}}while(0);if(__label__==3){var $4=HEAP32[((__ZL5f_log)>>2)];var $arraydecay10=(($fname)&4294967295);var $call11=_fprintf($4,((__str78)&4294967295),allocate([$arraydecay10,0,0,0],["i8*",0,0,0],ALLOC_STACK));HEAP32[((__ZL7linenum)>>2)]=0;var $arraydecay12=(($buf)&4294967295);var $arraydecay15=(($buf)&4294967295);var $arraydecay16=(($dict_line)&4294967295);var $arraydecay33=(($dict_line)&4294967295);;$while_cond$7:while(1){var $5=$f_in;var $call13=_fgets($arraydecay12,200,$5);var $cmp14=((($call13))|0)!=0;if(!($cmp14)){__label__=10;break $while_cond$7;}
63640 var $6=HEAP32[((__ZL7linenum)>>2)];var $inc=((($6)+1)&4294967295);HEAP32[((__ZL7linenum)>>2)]=$inc;var $call17=__ZL12compile_linePcS_Pi($arraydecay15,$arraydecay16,$hash);$length=$call17;var $7=$length;var $cmp18=((($7))|0)==0;if($cmp18){__label__=4;continue $while_cond$7;}
63641 var $8=HEAP32[(($hash)>>2)];var $arrayidx=((__ZL11hash_counts+$8*4)&4294967295);var $9=HEAP32[(($arrayidx)>>2)];var $inc21=((($9)+1)&4294967295);HEAP32[(($arrayidx)>>2)]=$inc21;var $10=$length;var $add=((($10)+4)&4294967295);var $call22=_malloc($add);$p=$call22;var $11=$p;var $cmp23=((($11))|0)==0;if($cmp23){__label__=7;break $while_cond$7;}
63642 var $16=$p;var $17=HEAP32[(($hash)>>2)];var $arrayidx31=((__ZL11hash_chains+$17*4)&4294967295);var $18=$arrayidx31;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$18;$dest$=$16;$stop$=$src$+4;if(($dest$%4)==($src$%4)&&4>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
63643 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
63644 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $19=$p;var $20=HEAP32[(($hash)>>2)];var $arrayidx32=((__ZL11hash_chains+$20*4)&4294967295);HEAP32[(($arrayidx32)>>2)]=$19;var $21=$p;var $add_ptr=(($21+4)&4294967295);var $22=$length;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$arraydecay33;$dest$=$add_ptr;$stop$=$src$+$22;if(($dest$%4)==($src$%4)&&$22>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
63645 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
63646 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $23=$count;var $inc34=((($23)+1)&4294967295);$count=$inc34;__label__=4;continue $while_cond$7;}
63647 $while_end$$if_then24$12:do{if(__label__==7){var $12=HEAP32[((__ZL5f_log)>>2)];var $cmp25=((($12))|0)!=0;if(!($cmp25)){__label__=10;break $while_end$$if_then24$12;}
63648 var $13=HEAP32[((__ZL5f_log)>>2)];var $14=_fwrite(((__str106)&4294967295),22,1,$13);var $15=HEAP32[((__ZL11error_count)>>2)];var $inc28=((($15)+1)&4294967295);HEAP32[((__ZL11error_count)>>2)]=$inc28;;}}while(0);var $24=HEAP32[((__ZL5f_log)>>2)];var $25=$count;var $call35=_fprintf($24,((__str107)&4294967295),allocate([$25,0,0,0],["i32",0,0,0],ALLOC_STACK));var $26=$f_in;var $call36=_fclose($26);$retval=0;;}
63649 STACKTOP=__stackBase__;return;return;}
63650 function __ZL20compile_dictlist_endP7__sFILE($f_out){var __stackBase__=STACKTOP;STACKTOP+=4;_memset(__stackBase__,0,4);var __label__;var $f_out_addr;var $hash;var $length;var $p=__stackBase__;$f_out_addr=$f_out;$hash=0;var $0=$p;;$for_body$2:while(1){var $1=$hash;var $arrayidx=((__ZL11hash_chains+$1*4)&4294967295);var $2=HEAP32[(($arrayidx)>>2)];HEAP32[(($p)>>2)]=$2;var $3=$f_out_addr;var $call=_ftell($3);var $4=$hash;var $arrayidx2=((__ZL11hash_counts+$4*4)&4294967295);HEAP32[(($arrayidx2)>>2)]=$call;var $5=HEAP32[(($p)>>2)];var $cmp31=((($5))|0)!=0;if($cmp31){__label__=2;;}else{__label__=3;;}
63651 $while_body$$while_end$4:do{if(__label__==2){while(1){var $6=HEAP32[(($p)>>2)];var $add_ptr=(($6+4)&4294967295);var $7=HEAP8[($add_ptr)];var $conv=(tempInt=(($7)),(tempInt>=128?tempInt-256:tempInt));$length=$conv;var $8=HEAP32[(($p)>>2)];var $add_ptr4=(($8+4)&4294967295);var $9=$length;var $10=$f_out_addr;var $call5=_fwrite($add_ptr4,$9,1,$10);var $11=HEAP32[(($p)>>2)];var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$11;$dest$=$0;$stop$=$src$+4;if(($dest$%4)==($src$%4)&&4>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
63652 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
63653 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $12=HEAP32[(($p)>>2)];var $cmp3=((($12))|0)!=0;if($cmp3){__label__=2;continue;}else{__label__=3;break $while_body$$while_end$4;}}}}while(0);var $13=$f_out_addr;var $call6=_fputc(0,$13);var $14=$hash;var $inc=((($14)+1)&4294967295);$hash=$inc;var $cmp1=((($inc))|0)<1024;if($cmp1){__label__=1;continue $for_body$2;}else{__label__=4;break $for_body$2;}}
63654 STACKTOP=__stackBase__;return;return;}
63655 function __ZL17compile_dictrulesP7__sFILES0_Pc($f_in,$f_out,$fname_temp){var __stackBase__=STACKTOP;STACKTOP+=11876;_memset(__stackBase__,0,11876);var __label__;var __lastLabel__=null;var $retval;var $f_in_addr;var $f_out_addr;var $fname_temp_addr;var $prule;var $p;var $ix;var $c=__stackBase__;var $gp;var $f_temp;var $n_rules=__stackBase__+4;var $count;var $different;var $wc=__stackBase__+8;var $prev_rgroup_name;var $char_code=__stackBase__+12;var $compile_mode;var $buf;var $buf1=__stackBase__+16;var $rules=__stackBase__+516;var $n_rgroups;var $n_groups3;var $rgroup=__stackBase__+8516;var $replace1;var $replace2;var $p123;$f_in_addr=$f_in;$f_out_addr=$f_out;$fname_temp_addr=$fname_temp;HEAP32[(($n_rules)>>2)]=0;$count=0;$compile_mode=0;$n_rgroups=0;$n_groups3=0;HEAP32[((__ZL7linenum)>>2)]=0;HEAP8[(((__ZL10group_name)&4294967295))]=0;var $0=$fname_temp_addr;var $call=__ZL9fopen_logPKcS0_($0,((__str79)&4294967295));$f_temp=$call;var $cmp=((($call))|0)==0;if($cmp){__label__=2;;}else{__label__=1;;}
63656 if(__label__==2){$retval=1;;}
63657 else if(__label__==1){var $arraydecay=(($buf1)&4294967295);var $arraydecay25=(($rules)&4294967295);var $1=$n_rules;;$for_cond$5:while(1){var $2=HEAP32[((__ZL7linenum)>>2)];var $inc=((($2)+1)&4294967295);HEAP32[((__ZL7linenum)>>2)]=$inc;var $3=$f_in_addr;var $call1=_fgets($arraydecay,500,$3);$buf=$call1;var $cmp2=((($call1))|0)!=0;if($cmp2){__label__=4;;}else{__label__=10;;}
63658 $if_then3$$if_then16$7:do{if(__label__==4){var $4=$buf;var $call4=_strstr($4,((__str82734)&4294967295));$p=$call4;var $cmp5=((($call4))|0)!=0;if($cmp5){__label__=5;;}else{__label__=6;;}
63659 if(__label__==5){var $5=$p;HEAP8[($5)]=0;;}
63660 var $6=$buf;var $arrayidx=(($6)&4294967295);var $7=HEAP8[($arrayidx)];var $conv=(tempInt=(($7)),(tempInt>=128?tempInt-256:tempInt));var $cmp8=((($conv))|0)==13;if($cmp8){__lastLabel__=6;__label__=7;;}else{__lastLabel__=6;__label__=8;;}
63661 if(__label__==7){var $8=$buf;var $incdec_ptr=(($8+1)&4294967295);$buf=$incdec_ptr;__lastLabel__=7;;}
63662 var $9=__lastLabel__==6?$6:($incdec_ptr);var $cmp12=((($9))|0)==0;if($cmp12){__label__=10;break $if_then3$$if_then16$7;}
63663 var $10=$buf;var $arrayidx13=(($10)&4294967295);var $11=HEAP8[($arrayidx13)];var $conv14=(tempInt=(($11)),(tempInt>=128?tempInt-256:tempInt));var $cmp15=((($conv14))|0)==46;if($cmp15){__label__=10;break $if_then3$$if_then16$7;}
63664 var $69=$compile_mode;if($69==1){__label__=44;;}
63665 else if($69==2){__label__=47;;}
63666 else{__label__=3;continue $for_cond$5;}
63667 if(__label__==44){var $70=$buf;var $call114=__ZL12compile_rulePc($70);$prule=$call114;var $71=$prule;var $cmp115=((($71))|0)!=0;if(!($cmp115)){__label__=3;continue $for_cond$5;}
63668 var $72=HEAP32[(($n_rules)>>2)];var $cmp117=((($72))|0)<2000;if(!($cmp117)){__label__=3;continue $for_cond$5;}
63669 var $73=$prule;var $74=HEAP32[(($n_rules)>>2)];var $inc119=((($74)+1)&4294967295);HEAP32[(($n_rules)>>2)]=$inc119;var $arrayidx120=(($rules+$74*4)&4294967295);HEAP32[(($arrayidx120)>>2)]=$73;__label__=3;continue $for_cond$5;}
63670 else if(__label__==47){var $75=$buf;$p123=$75;$replace1=0;$replace2=0;var $76=$p123;var $77=HEAP8[($76)];var $conv1254=(tempInt=(($77)),(tempInt>=128?tempInt-256:tempInt));var $call1265=__Z8isspace2j($conv1254);var $tobool6=((($call1265))|0)!=0;if($tobool6){__label__=48;;}else{__label__=49;;}
63671 $while_body127$$while_end129$22:do{if(__label__==48){while(1){var $78=$p123;var $incdec_ptr128=(($78+1)&4294967295);$p123=$incdec_ptr128;var $79=$p123;var $80=HEAP8[($79)];var $conv125=(tempInt=(($80)),(tempInt>=128?tempInt-256:tempInt));var $call126=__Z8isspace2j($conv125);var $tobool=((($call126))|0)!=0;if($tobool){__label__=48;continue;}else{__label__=49;break $while_body127$$while_end129$22;}}}}while(0);$ix=0;var $81=$p123;var $82=HEAPU8[($81)];var $conv1317=((($82))&255);var $cmp1328=((($conv1317))|0)>32;if($cmp1328){__label__=50;;}else{__label__=51;;}
63672 $while_body133$$while_cond138_loopexit$26:do{if(__label__==50){while(1){var $83=$p123;var $call134=__Z7utf8_inPiPKc($c,$83);var $84=$p123;var $add_ptr=(($84+$call134)&4294967295);$p123=$add_ptr;var $85=HEAP32[(($c)>>2)];var $86=$ix;var $shl=($85)<<($86);var $87=$replace1;var $add135=((($87)+($shl))&4294967295);$replace1=$add135;var $88=$ix;var $add136=((($88)+16)&4294967295);$ix=$add136;var $89=$p123;var $90=HEAPU8[($89)];var $conv131=((($90))&255);var $cmp132=((($conv131))|0)>32;if($cmp132){__label__=50;continue;}else{__label__=51;break $while_body133$$while_cond138_loopexit$26;}}}}while(0);var $91=$p123;var $92=HEAP8[($91)];var $conv1399=(tempInt=(($92)),(tempInt>=128?tempInt-256:tempInt));var $call14010=__Z8isspace2j($conv1399);var $tobool14111=((($call14010))|0)!=0;if($tobool14111){__label__=52;;}else{__label__=53;;}
63673 $while_body142$$while_end144$30:do{if(__label__==52){while(1){var $93=$p123;var $incdec_ptr143=(($93+1)&4294967295);$p123=$incdec_ptr143;var $94=$p123;var $95=HEAP8[($94)];var $conv139=(tempInt=(($95)),(tempInt>=128?tempInt-256:tempInt));var $call140=__Z8isspace2j($conv139);var $tobool141=((($call140))|0)!=0;if($tobool141){__label__=52;continue;}else{__label__=53;break $while_body142$$while_end144$30;}}}}while(0);$ix=0;var $96=$p123;var $97=HEAPU8[($96)];var $conv14612=((($97))&255);var $cmp14713=((($conv14612))|0)>32;if($cmp14713){__label__=54;;}else{__label__=55;;}
63674 $while_body148$$while_end154$34:do{if(__label__==54){while(1){var $98=$p123;var $call149=__Z7utf8_inPiPKc($c,$98);var $99=$p123;var $add_ptr150=(($99+$call149)&4294967295);$p123=$add_ptr150;var $100=HEAP32[(($c)>>2)];var $101=$ix;var $shl151=($100)<<($101);var $102=$replace2;var $add152=((($102)+($shl151))&4294967295);$replace2=$add152;var $103=$ix;var $add153=((($103)+16)&4294967295);$ix=$add153;var $104=$p123;var $105=HEAPU8[($104)];var $conv146=((($105))&255);var $cmp147=((($conv146))|0)>32;if($cmp147){__label__=54;continue;}else{__label__=55;break $while_body148$$while_end154$34;}}}}while(0);var $106=$replace1;var $cmp155=((($106))|0)!=0;if(!($cmp155)){__label__=3;continue $for_cond$5;}
63675 var $107=$f_out_addr;var $108=$replace1;__Z11Write4BytesP7__sFILEi($107,$108);var $109=$f_out_addr;var $110=$replace2;__Z11Write4BytesP7__sFILEi($109,$110);__label__=3;continue $for_cond$5;}}}while(0);var $12=HEAP32[(($n_rules)>>2)];var $cmp17=((($12))|0)>0;if($cmp17){__label__=11;;}else{__label__=12;;}
63676 if(__label__==11){var $13=$n_rgroups;var $arrayidx19=(($rgroup+$13*28)&4294967295);var $name=(($arrayidx19)&4294967295);var $arraydecay20=(($name)&4294967295);var $call21=_strcpy($arraydecay20,((__ZL10group_name)&4294967295));var $14=HEAP32[((__ZL9group3_ix)>>2)];var $15=$n_rgroups;var $arrayidx22=(($rgroup+$15*28)&4294967295);var $group3_ix=(($arrayidx22+24)&4294967295);HEAP32[(($group3_ix)>>2)]=$14;var $16=$f_temp;var $call23=_ftell($16);var $17=$n_rgroups;var $arrayidx24=(($rgroup+$17*28)&4294967295);var $start=(($arrayidx24+16)&4294967295);HEAP32[(($start)>>2)]=$call23;var $18=$f_temp;var $19=HEAP32[(($n_rules)>>2)];__ZL17output_rule_groupP7__sFILEiPPcS1_($18,$19,$arraydecay25);var $20=$f_temp;var $call26=_ftell($20);var $21=$n_rgroups;var $arrayidx27=(($rgroup+$21*28)&4294967295);var $start28=(($arrayidx27+16)&4294967295);var $22=HEAP32[(($start28)>>2)];var $sub=((($call26)-($22))&4294967295);var $23=$n_rgroups;var $arrayidx29=(($rgroup+$23*28)&4294967295);var $length=(($arrayidx29+20)&4294967295);HEAP32[(($length)>>2)]=$sub;var $24=$n_rgroups;var $inc30=((($24)+1)&4294967295);$n_rgroups=$inc30;var $25=HEAP32[(($n_rules)>>2)];var $26=$count;var $add=((($26)+($25))&4294967295);$count=$add;;}
63677 HEAP32[(($n_rules)>>2)]=0;var $27=$compile_mode;var $cmp32=((($27))|0)==2;if($cmp32){__label__=13;;}else{__label__=14;;}
63678 if(__label__==13){var $28=$f_out_addr;var $call34=_fwrite($1,1,4,$28);$compile_mode=0;;}
63679 var $29=$buf;var $cmp36=((($29))|0)==0;if($cmp36){__label__=57;break $for_cond$5;}
63680 var $30=$buf;var $call39=_memcmp($30,((__str81)&4294967295),2);var $cmp40=((($call39))|0)==0;var $31=$buf;if($cmp40){__label__=16;;}else{__label__=17;;}
63681 if(__label__==16){var $arrayidx42=(($31+2)&4294967295);var $32=$f_out_addr;__ZL19compile_lettergroupPcP7__sFILE($arrayidx42,$32);__label__=3;continue $for_cond$5;}
63682 else if(__label__==17){var $call45=_memcmp($31,((__str82)&4294967295),8);var $cmp46=((($call45))|0)==0;if($cmp46){__label__=18;;}else{__label__=20;;}
63683 $if_then47$$if_end53$50:do{if(__label__==18){$compile_mode=2;var $33=$f_out_addr;var $call48=_fputc(6,$33);var $34=$f_out_addr;var $call49=_fputc(20,$34);var $35=$f_out_addr;var $call5014=_ftell($35);var $and15=($call5014)&3;var $cmp5116=((($and15))|0)!=0;if(!($cmp5116)){__label__=20;break $if_then47$$if_end53$50;}
63684 while(1){var $36=$f_out_addr;var $call52=_fputc(0,$36);var $37=$f_out_addr;var $call50=_ftell($37);var $and=($call50)&3;var $cmp51=((($and))|0)!=0;if($cmp51){__label__=19;continue;}else{__label__=20;break $if_then47$$if_end53$50;}}}}while(0);var $38=$buf;var $call54=_memcmp($38,((__str83)&4294967295),6);var $cmp55=((($call54))|0)==0;if(!($cmp55)){__label__=3;continue $for_cond$5;}
63685 $compile_mode=1;var $39=$buf;var $arrayidx57=(($39+6)&4294967295);$p=$arrayidx57;;$while_cond58$56:while(1){var $40=$p;var $arrayidx59=(($40)&4294967295);var $41=HEAPU8[($arrayidx59)];var $conv60=((($41))&255);var $cmp61=((($conv60))|0)==32;if($cmp61){__label__=24;;}else{__label__=23;;}
63686 if(__label__==23){var $42=$p;var $arrayidx62=(($42)&4294967295);var $43=HEAPU8[($arrayidx62)];var $conv63=((($43))&255);var $cmp64=((($conv63))|0)==9;if(!($cmp64)){__label__=25;break $while_cond58$56;}}
63687 var $44=$p;var $incdec_ptr66=(($44+1)&4294967295);$p=$incdec_ptr66;__label__=22;continue $while_cond58$56;}
63688 $ix=0;;$while_cond68$62:while(1){var $45=$p;var $46=HEAPU8[($45)];var $conv69=((($46))&255);var $cmp70=((($conv69))|0)>32;if(!($cmp70)){__label__=29;break $while_cond68$62;}
63689 var $47=$ix;var $cmp71=((($47))|0)<12;if(!($cmp71)){__label__=29;break $while_cond68$62;}
63690 var $48=$p;var $incdec_ptr73=(($48+1)&4294967295);$p=$incdec_ptr73;var $49=HEAP8[($48)];var $50=$ix;var $inc74=((($50)+1)&4294967295);$ix=$inc74;var $arrayidx75=((__ZL10group_name+$50)&4294967295);HEAP8[($arrayidx75)]=$49;__label__=26;continue $while_cond68$62;}
63691 var $51=$ix;var $arrayidx77=((__ZL10group_name+$51)&4294967295);HEAP8[($arrayidx77)]=0;HEAP32[((__ZL9group3_ix)>>2)]=0;var $call78=_sscanf(((__ZL10group_name)&4294967295),((__str84)&4294967295),allocate([$char_code,0,0,0],["i32*",0,0,0],ALLOC_STACK));var $cmp79=((($call78))|0)==1;if($cmp79){__label__=30;;}else{__label__=33;;}
63692 $if_then80$$if_else$67:do{if(__label__==30){$p=((__ZL10group_name)&4294967295);var $52=HEAPU32[(($char_code)>>2)];var $cmp81=((($52))>>>0)>256;if($cmp81){__label__=31;;}else{__label__=32;;}
63693 if(__label__==31){var $53=HEAPU32[(($char_code)>>2)];var $shr=($53)>>>8;var $conv83=((($shr))&255);var $54=$p;var $incdec_ptr84=(($54+1)&4294967295);$p=$incdec_ptr84;HEAP8[($54)]=$conv83;;}
63694 var $55=HEAP32[(($char_code)>>2)];var $conv86=((($55))&255);var $56=$p;var $incdec_ptr87=(($56+1)&4294967295);$p=$incdec_ptr87;HEAP8[($56)]=$conv86;var $57=$p;HEAP8[($57)]=0;__label__=37;break $if_then80$$if_else$67;}
63695 else if(__label__==33){var $58=HEAP32[((_translator)>>2)];var $letter_bits_offset=(($58+964)&4294967295);var $59=HEAP32[(($letter_bits_offset)>>2)];var $cmp88=((($59))|0)>0;if(!($cmp88)){__label__=37;break $if_then80$$if_else$67;}
63696 var $call90=__Z7utf8_inPiPKc($wc,((__ZL10group_name)&4294967295));var $60=HEAP32[(($wc)>>2)];var $61=HEAP32[((_translator)>>2)];var $letter_bits_offset91=(($61+964)&4294967295);var $62=HEAP32[(($letter_bits_offset91)>>2)];var $sub92=((($60)-($62))&4294967295);$ix=$sub92;var $cmp93=((($sub92))|0)>=0;if(!($cmp93)){__label__=37;break $if_then80$$if_else$67;}
63697 var $63=$ix;var $cmp94=((($63))|0)<128;if(!($cmp94)){__label__=37;break $if_then80$$if_else$67;}
63698 var $64=$ix;var $add96=((($64)+1)&4294967295);HEAP32[((__ZL9group3_ix)>>2)]=$add96;__lastLabel__=36;__label__=38;break $if_then80$$if_else$67;}}while(0);if(__label__==37){var $_pr=HEAP32[((__ZL9group3_ix)>>2)];__lastLabel__=37;;}
63699 var $65=__lastLabel__==37?$_pr:($add96);var $cmp100=((($65))|0)==0;if(!($cmp100)){__label__=3;continue $for_cond$5;}
63700 var $call102=_strlen(((__ZL10group_name)&4294967295));var $cmp103=((($call102))>>>0)>2;if(!($cmp103)){__label__=3;continue $for_cond$5;}
63701 var $call105=__Z7utf8_inPiPKc($c,((__ZL10group_name)&4294967295));var $cmp106=((($call105))|0)<2;if($cmp106){__label__=41;;}else{__label__=42;;}
63702 if(__label__==41){var $66=HEAP32[((__ZL5f_log)>>2)];var $67=HEAP32[((__ZL7linenum)>>2)];var $call108=_fprintf($66,((__str85)&4294967295),allocate([$67,0,0,0],["i32",0,0,0],ALLOC_STACK));var $68=HEAP32[((__ZL11error_count)>>2)];var $inc109=((($68)+1)&4294967295);HEAP32[((__ZL11error_count)>>2)]=$inc109;;}
63703 HEAP8[(((__ZL10group_name+2)&4294967295))]=0;__label__=3;continue $for_cond$5;}}
63704 var $111=$f_temp;var $call158=_fclose($111);var $arraydecay159=(($rgroup)&4294967295);var $112=$arraydecay159;var $113=$n_rgroups;_qsort($112,$113,28,2);var $114=$fname_temp_addr;var $call160=_fopen($114,((__str18429)&4294967295));$f_temp=$call160;var $cmp161=((($call160))|0)==0;if($cmp161){__label__=58;;}else{__label__=59;;}
63705 if(__label__==58){$retval=2;;}
63706 else if(__label__==59){$prev_rgroup_name=((__str15397)&4294967295);$gp=0;var $115=$gp;var $116=$n_rgroups;var $cmp1653=((($115))|0)<((($116))|0);if($cmp1653){__label__=60;;}else{__label__=70;;}
63707 $for_body$$for_end210$88:do{if(__label__==60){$for_body$89:while(1){var $117=$f_temp;var $118=$gp;var $arrayidx166=(($rgroup+$118*28)&4294967295);var $start167=(($arrayidx166+16)&4294967295);var $119=HEAP32[(($start167)>>2)];var $call168=_fseek($117,$119,0);var $120=$gp;var $arrayidx169=(($rgroup+$120*28)&4294967295);var $name170=(($arrayidx169)&4294967295);var $arraydecay171=(($name170)&4294967295);var $121=$prev_rgroup_name;var $call172=_strcmp($arraydecay171,$121);$different=$call172;var $cmp173=((($call172))|0)!=0;if($cmp173){__label__=61;;}else{__label__=67;;}
63708 if(__label__==61){var $122=$gp;var $cmp175=((($122))|0)>0;if($cmp175){__label__=62;;}else{__label__=63;;}
63709 if(__label__==62){var $123=$f_out_addr;var $call177=_fputc(7,$123);;}
63710 var $124=$f_out_addr;var $call179=_fputc(6,$124);var $125=$gp;var $arrayidx180=(($rgroup+$125*28)&4294967295);var $group3_ix181=(($arrayidx180+24)&4294967295);var $126=HEAP32[(($group3_ix181)>>2)];var $cmp182=((($126))|0)!=0;if($cmp182){__label__=64;;}else{__label__=65;;}
63711 if(__label__==64){var $127=$n_groups3;var $inc184=((($127)+1)&4294967295);$n_groups3=$inc184;var $128=$f_out_addr;var $call185=_fputc(1,$128);var $129=$gp;var $arrayidx186=(($rgroup+$129*28)&4294967295);var $group3_ix187=(($arrayidx186+24)&4294967295);var $130=HEAP32[(($group3_ix187)>>2)];var $131=$f_out_addr;var $call188=_fputc($130,$131);;}
63712 else if(__label__==65){var $132=$f_out_addr;var $133=$gp;var $arrayidx190=(($rgroup+$133*28)&4294967295);var $name191=(($arrayidx190)&4294967295);var $arraydecay192=(($name191)&4294967295);$prev_rgroup_name=$arraydecay192;var $fputs=_fputs($arraydecay192,$132);;}
63713 var $134=$f_out_addr;var $call195=_fputc(0,$134);;}
63714 var $135=$gp;var $arrayidx197=(($rgroup+$135*28)&4294967295);var $length198=(($arrayidx197+20)&4294967295);var $136=HEAP32[(($length198)>>2)];$ix=$136;var $cmp2002=((($136))|0)>0;if($cmp2002){__label__=68;;}else{__label__=69;;}
63715 $for_body201$$for_end204$101:do{if(__label__==68){while(1){var $137=$f_temp;var $call202=_fgetc($137);HEAP32[(($c)>>2)]=$call202;var $138=HEAP32[(($c)>>2)];var $139=$f_out_addr;var $call203=_fputc($138,$139);var $140=$ix;var $dec=((($140)-1)&4294967295);$ix=$dec;var $cmp200=((($dec))|0)>0;if($cmp200){__label__=68;continue;}else{__label__=69;break $for_body201$$for_end204$101;}}}}while(0);var $141=$gp;var $inc209=((($141)+1)&4294967295);$gp=$inc209;var $142=$gp;var $143=$n_rgroups;var $cmp165=((($142))|0)<((($143))|0);if($cmp165){__label__=60;continue $for_body$89;}else{__label__=70;break $for_body$$for_end210$88;}}}}while(0);var $144=$f_out_addr;var $call211=_fputc(7,$144);var $145=$f_out_addr;var $call212=_fputc(0,$145);var $146=$f_temp;var $call213=_fclose($146);var $147=$fname_temp_addr;var $call214=_remove($147);var $148=HEAP32[((__ZL5f_log)>>2)];var $149=$count;var $150=$n_rgroups;var $151=$n_groups3;var $call215=_fprintf($148,((__str89)&4294967295),allocate([$149,0,0,0,$150,0,0,0,$151,0,0,0],["i32",0,0,0,"i32",0,0,0,"i32",0,0,0],ALLOC_STACK));$retval=0;;}}
63716 STACKTOP=__stackBase__;return;return;}
63717 function __ZL17output_rule_groupP7__sFILEiPPcS1_($f_out,$n_rules,$rules){var __stackBase__=STACKTOP;STACKTOP+=512;_memset(__stackBase__,0,512);var __label__;var $f_out_addr;var $n_rules_addr;var $rules_addr;var $name_addr;var $ix;var $len1;var $len2;var $len_name;var $p;var $p2;var $p3;var $common;var $nextchar_count=__stackBase__;$f_out_addr=$f_out;$n_rules_addr=$n_rules;$rules_addr=$rules;$name_addr=((__ZL10group_name)&4294967295);var $arraydecay=(($nextchar_count)&4294967295);var $0=$arraydecay;var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=$0;$stop$=$dest$+512;$value4$=0;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=0;}
63718 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
63719 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=0;};var $1=$name_addr;var $call=_strlen($1);$len_name=$call;$common=((__str13643)&4294967295);var $2=$rules_addr;var $3=$2;var $4=$n_rules_addr;_qsort($3,$4,4,4);var $5=$name_addr;var $call1=_strcmp($5,((__str103)&4294967295));var $cmp=((($call1))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
63720 if(__label__==1){$len_name=0;;}
63721 $ix=0;var $6=$ix;var $7=$n_rules_addr;var $cmp21=((($6))|0)<((($7))|0);if($cmp21){__label__=3;;}else{__label__=11;;}
63722 $for_body$$for_end$5:do{if(__label__==3){$for_body$6:while(1){var $8=$ix;var $9=$rules_addr;var $arrayidx=(($9+4*$8)&4294967295);var $10=HEAP32[(($arrayidx)>>2)];$p=$10;var $11=$p;var $call3=_strlen($11);var $add=((($call3)+1)&4294967295);$len1=$add;var $12=$len1;var $13=$p;var $arrayidx4=(($13+$12)&4294967295);$p3=$arrayidx4;var $14=$p3;var $15=$len_name;var $add_ptr=(($14+$15)&4294967295);$p2=$add_ptr;var $16=$p2;var $call5=_strlen($16);$len2=$call5;var $17=$p2;var $arrayidx6=(($17)&4294967295);var $18=HEAPU8[($arrayidx6)];var $idxprom=((($18))&255);var $arrayidx7=(($nextchar_count+$idxprom*2)&4294967295);var $19=HEAP16[(($arrayidx7)>>1)];var $inc=((($19)+1)&65535);HEAP16[(($arrayidx7)>>1)]=$inc;var $20=$common;var $arrayidx8=(($20)&4294967295);var $21=HEAP8[($arrayidx8)];var $conv=(tempInt=(($21)),(tempInt>=128?tempInt-256:tempInt));var $cmp9=((($conv))|0)!=0;if($cmp9){__label__=4;;}else{__label__=6;;}
63723 $land_lhs_true$$if_else$8:do{if(__label__==4){var $22=$p;var $23=$common;var $call10=_strcmp($22,$23);var $cmp11=((($call10))|0)==0;if(!($cmp11)){__label__=6;break $land_lhs_true$$if_else$8;}
63724 var $24=$p2;var $25=$len2;var $26=$f_out_addr;var $call13=_fwrite($24,$25,1,$26);var $27=$f_out_addr;var $call14=_fputc(0,$27);__label__=10;break $land_lhs_true$$if_else$8;}}while(0);if(__label__==6){var $28=$ix;var $29=$n_rules_addr;var $sub=((($29)-1)&4294967295);var $cmp15=((($28))|0)<((($sub))|0);if($cmp15){__label__=7;;}else{__label__=9;;}
63725 $land_lhs_true16$$if_end24$13:do{if(__label__==7){var $30=$p;var $31=$ix;var $add17=((($31)+1)&4294967295);var $32=$rules_addr;var $arrayidx18=(($32+4*$add17)&4294967295);var $33=HEAP32[(($arrayidx18)>>2)];var $call19=_strcmp($30,$33);var $cmp20=((($call19))|0)==0;if(!($cmp20)){__label__=9;break $land_lhs_true16$$if_end24$13;}
63726 var $34=$ix;var $35=$rules_addr;var $arrayidx22=(($35+4*$34)&4294967295);var $36=HEAP32[(($arrayidx22)>>2)];$common=$36;var $37=$f_out_addr;var $call23=_fputc(4,$37);;}}while(0);var $38=$p2;var $39=$len2;var $40=$f_out_addr;var $call25=_fwrite($38,$39,1,$40);var $41=$f_out_addr;var $call26=_fputc(3,$41);var $42=$p;var $43=$len1;var $44=$f_out_addr;var $call27=_fwrite($42,$43,1,$44);;}
63727 var $45=$ix;var $inc29=((($45)+1)&4294967295);$ix=$inc29;var $46=$ix;var $47=$n_rules_addr;var $cmp2=((($46))|0)<((($47))|0);if($cmp2){__label__=3;continue $for_body$6;}else{__label__=11;break $for_body$$for_end$5;}}}}while(0);STACKTOP=__stackBase__;return;return;}
63728 function __ZL19compile_lettergroupPcP7__sFILE($input,$f_out){var __stackBase__=STACKTOP;STACKTOP+=1000;_memset(__stackBase__,0,1000);var __label__;var __lastLabel__=null;var $retval;var $input_addr;var $f_out_addr;var $p;var $p_start;var $group;var $ix;var $n_items;var $length;var $max_length;var $items=__stackBase__;var $item_length=__stackBase__+800;$input_addr=$input;$f_out_addr=$f_out;$max_length=0;var $0=$input_addr;$p=$0;var $1=$p;var $arrayidx=(($1)&4294967295);var $2=HEAP8[($arrayidx)];var $conv=(tempInt=(($2)),(tempInt>=128?tempInt-256:tempInt));var $isdigittmp=((($conv)-48)&4294967295);var $isdigit=((($isdigittmp))>>>0)<10;var $call=((($isdigit))&1);var $tobool=((($call))|0)!=0;if($tobool){__label__=1;;}else{__label__=2;;}
63729 $lor_lhs_false$$if_then$2:do{if(__label__==1){var $3=$p;var $arrayidx1=(($3+1)&4294967295);var $4=HEAP8[($arrayidx1)];var $conv2=(tempInt=(($4)),(tempInt>=128?tempInt-256:tempInt));var $isdigittmp1=((($conv2)-48)&4294967295);var $isdigit2=((($isdigittmp1))>>>0)<10;var $call3=((($isdigit2))&1);var $tobool4=((($call3))|0)!=0;if(!($tobool4)){__label__=2;break $lor_lhs_false$$if_then$2;}
63730 var $8=$p;var $arrayidx6=(($8)&4294967295);var $call7=_atoi($arrayidx6);$group=$call7;var $9=$group;var $cmp=((($9))|0)>=26;if($cmp){__label__=5;;}else{__label__=4;;}
63731 if(__label__==5){var $12=HEAP32[((__ZL5f_log)>>2)];var $13=HEAP32[((__ZL7linenum)>>2)];var $call9=_fprintf($12,((__str101)&4294967295),allocate([$13,0,0,0,25,0,0,0],["i32",0,0,0,"i32",0,0,0],ALLOC_STACK));var $14=HEAP32[((__ZL11error_count)>>2)];var $inc10=((($14)+1)&4294967295);HEAP32[((__ZL11error_count)>>2)]=$inc10;$retval=1;__label__=26;break $lor_lhs_false$$if_then$2;}
63732 else if(__label__==4){var $10=$p;var $11=HEAP8[($10)];var $conv1210=(tempInt=(($11)),(tempInt>=128?tempInt-256:tempInt));var $call1311=__Z8isspace2j($conv1210);var $tobool1412=((($call1311))|0)!=0;var $lnot13=($tobool1412)^1;if($lnot13){__label__=6;;}else{__label__=7;;}
63733 $while_body$$while_end$8:do{if(__label__==6){while(1){var $15=$p;var $incdec_ptr=(($15+1)&4294967295);$p=$incdec_ptr;var $16=$p;var $17=HEAP8[($16)];var $conv12=(tempInt=(($17)),(tempInt>=128?tempInt-256:tempInt));var $call13=__Z8isspace2j($conv12);var $tobool14=((($call13))|0)!=0;var $lnot=($tobool14)^1;if($lnot){__label__=6;continue;}else{__label__=7;break $while_body$$while_end$8;}}}}while(0);var $18=$f_out_addr;var $call15=_fputc(6,$18);var $19=$f_out_addr;var $call16=_fputc(18,$19);var $20=$group;var $add=((($20)+65)&4294967295);var $21=$f_out_addr;var $call17=_fputc($add,$21);var $22=$group;var $arrayidx18=((__ZL19letterGroupsDefined+$22)&4294967295);var $23=HEAP8[($arrayidx18)];var $conv19=(tempInt=(($23)),(tempInt>=128?tempInt-256:tempInt));var $cmp20=((($conv19))|0)!=0;if($cmp20){__label__=8;;}else{__label__=9;;}
63734 if(__label__==8){var $24=HEAP32[((__ZL5f_log)>>2)];var $25=HEAP32[((__ZL7linenum)>>2)];var $26=$group;var $call22=_fprintf($24,((__str102)&4294967295),allocate([$25,0,0,0,$26,0,0,0],["i32",0,0,0,"i32",0,0,0],ALLOC_STACK));var $27=HEAP32[((__ZL11error_count)>>2)];var $inc23=((($27)+1)&4294967295);HEAP32[((__ZL11error_count)>>2)]=$inc23;;}
63735 var $28=$group;var $arrayidx25=((__ZL19letterGroupsDefined+$28)&4294967295);HEAP8[($arrayidx25)]=1;$n_items=0;__lastLabel__=9;;$while_cond26$15:while(1){var $29=__lastLabel__==18?$_pr:(0);var $cmp27=((($29))|0)<200;if(!($cmp27)){__label__=19;break $while_cond26$15;}
63736 var $30=$p;var $31=HEAP8[($30)];var $conv306=(tempInt=(($31)),(tempInt>=128?tempInt-256:tempInt));var $call317=__Z8isspace2j($conv306);var $tobool328=((($call317))|0)!=0;var $32=$p;if($tobool328){__lastLabel__=11;__label__=12;;}else{__lastLabel__=11;__label__=13;;}
63737 $while_body33$$while_end35$18:do{if(__label__==12){while(1){var $33=__lastLabel__==12?$36:($32);var $incdec_ptr34=(($33+1)&4294967295);$p=$incdec_ptr34;var $34=$p;var $35=HEAP8[($34)];var $conv30=(tempInt=(($35)),(tempInt>=128?tempInt-256:tempInt));var $call31=__Z8isspace2j($conv30);var $tobool32=((($call31))|0)!=0;var $36=$p;if($tobool32){__lastLabel__=12;__label__=12;continue;}else{__lastLabel__=12;__label__=13;break $while_body33$$while_end35$18;}}}}while(0);var $_lcssa=__lastLabel__==11?$32:($36);var $37=HEAP8[($_lcssa)];var $conv36=(tempInt=(($37)),(tempInt>=128?tempInt-256:tempInt));var $cmp37=((($conv36))|0)==0;if($cmp37){__label__=19;break $while_cond26$15;}
63738 var $38=$p;$p_start=$38;var $39=$n_items;var $arrayidx40=(($items+$39*4)&4294967295);HEAP32[(($arrayidx40)>>2)]=$38;;while(1){var $40=$p;var $41=HEAP8[($40)];var $conv42=(tempInt=(($41)),(tempInt>=128?tempInt-256:tempInt));var $and=($conv42)&255;var $cmp43=((($and))|0)>32;var $42=$p;var $incdec_ptr45=(($42+1)&4294967295);$p=$incdec_ptr45;if($cmp43){__label__=15;continue;}else{__label__=16;break;}}
63739 HEAP8[($42)]=0;var $43=$p;var $44=$p_start;var $sub_ptr_lhs_cast=($43);var $sub_ptr_rhs_cast=($44);var $sub_ptr_sub=((($sub_ptr_lhs_cast)-($sub_ptr_rhs_cast))&4294967295);$length=$sub_ptr_sub;var $45=$length;var $46=$max_length;var $cmp48=((($45))|0)>((($46))|0);if($cmp48){__label__=17;;}else{__label__=18;;}
63740 if(__label__==17){var $47=$length;$max_length=$47;;}
63741 var $48=$length;var $conv51=((($48))&255);var $49=$n_items;var $inc52=((($49)+1)&4294967295);$n_items=$inc52;var $arrayidx53=(($item_length+$49)&4294967295);HEAP8[($arrayidx53)]=$conv51;var $_pr=$n_items;__lastLabel__=18;__label__=10;continue $while_cond26$15;}
63742 var $_pr3=$max_length;var $cmp565=((($_pr3))|0)>1;if($cmp565){__label__=20;;}else{__label__=25;;}
63743 $while_body57$$while_end67$30:do{if(__label__==20){$while_body57$31:while(1){$ix=0;var $50=$ix;var $51=$n_items;var $cmp584=((($50))|0)<((($51))|0);if($cmp584){__label__=21;;}else{__label__=24;;}
63744 $for_body$$for_end$33:do{if(__label__==21){while(1){var $52=$ix;var $arrayidx59=(($item_length+$52)&4294967295);var $53=HEAP8[($arrayidx59)];var $conv60=(tempInt=(($53)),(tempInt>=128?tempInt-256:tempInt));var $54=$max_length;var $cmp61=((($conv60))|0)==((($54))|0);if($cmp61){__label__=22;;}else{__label__=23;;}
63745 if(__label__==22){var $55=$ix;var $arrayidx63=(($items+$55*4)&4294967295);var $56=HEAP32[(($arrayidx63)>>2)];var $57=$max_length;var $58=$f_out_addr;var $call64=_fwrite($56,1,$57,$58);;}
63746 var $59=$ix;var $inc66=((($59)+1)&4294967295);$ix=$inc66;var $60=$ix;var $61=$n_items;var $cmp58=((($60))|0)<((($61))|0);if($cmp58){__label__=21;continue;}else{__label__=24;break $for_body$$for_end$33;}}}}while(0);var $62=$max_length;var $dec=((($62)-1)&4294967295);$max_length=$dec;var $cmp56=((($dec))|0)>1;if($cmp56){__label__=20;continue $while_body57$31;}else{__label__=25;break $while_body57$$while_end67$30;}}}}while(0);var $63=$f_out_addr;var $call68=_fputc(7,$63);$retval=0;__label__=26;break $lor_lhs_false$$if_then$2;}}}while(0);if(__label__==2){var $5=HEAP32[((__ZL5f_log)>>2)];var $6=HEAP32[((__ZL7linenum)>>2)];var $call5=_fprintf($5,((__str100)&4294967295),allocate([$6,0,0,0],["i32",0,0,0],ALLOC_STACK));var $7=HEAP32[((__ZL11error_count)>>2)];var $inc=((($7)+1)&4294967295);HEAP32[((__ZL11error_count)>>2)]=$inc;$retval=1;;}
63747 STACKTOP=__stackBase__;return;return;}
63748 function __ZL12compile_rulePc($input){var __stackBase__=STACKTOP;STACKTOP+=244;_memset(__stackBase__,0,244);var __label__;var $retval;var $input_addr;var $ix;var $c;var $wc=__stackBase__;var $p;var $prule;var $len;var $len_name;var $start;var $state=__stackBase__+4;var $finish;var $pre_bracket;var $buf=__stackBase__+8;var $output=__stackBase__+88;var $bad_phoneme=__stackBase__+240;$input_addr=$input;HEAP32[(($state)>>2)]=2;$finish=0;$pre_bracket=0;var $arrayidx=(($buf)&4294967295);HEAP8[($arrayidx)]=0;HEAP8[(((__ZL9rule_cond)&4294967295))]=0;HEAP8[(((__ZL8rule_pre)&4294967295))]=0;HEAP8[(((__ZL9rule_post)&4294967295))]=0;HEAP8[(((__ZL10rule_match)&4294967295))]=0;HEAP8[(((__ZL13rule_phonemes)&4294967295))]=0;var $arraydecay=(($buf)&4294967295);$p=$arraydecay;$ix=0;var $0=$finish;var $cmp2=((($0))|0)==0;if($cmp2){__label__=1;;}else{__label__=13;;}
63749 $for_body_lr_ph$$for_end$2:do{if(__label__==1){var $arraydecay3=(($buf)&4294967295);var $arraydecay4=(($buf)&4294967295);var $arraydecay6=(($buf)&4294967295);var $arraydecay7=(($buf)&4294967295);var $arraydecay12=(($buf)&4294967295);var $arraydecay14=(($buf)&4294967295);var $arraydecay15=(($buf)&4294967295);;$for_body$4:while(1){var $1=$ix;var $2=$input_addr;var $arrayidx1=(($2+$1)&4294967295);var $3=HEAP8[($arrayidx1)];$c=$3;var $4=$ix;var $5=$input_addr;var $arrayidx2=(($5+$4)&4294967295);var $6=HEAPU8[($arrayidx2)];$c=$6;var $conv=((($6))&255);if($conv==41){__label__=3;;}
63750 else if($conv==40){__label__=4;;}
63751 else if($conv==10){__label__=6;break $for_body$4;}
63752 else if($conv==13){__label__=6;break $for_body$4;}
63753 else if($conv==0){__label__=6;break $for_body$4;}
63754 else if($conv==9){__label__=7;;}
63755 else if($conv==32){__label__=7;;}
63756 else if($conv==63){__label__=8;;}
63757 else{__label__=11;;}
63758 $sw_default$$sw_bb$$sw_bb5$$sw_bb13$$sw_bb16$6:do{if(__label__==11){var $21=$c;var $22=$p;var $incdec_ptr20=(($22+1)&4294967295);$p=$incdec_ptr20;HEAP8[($22)]=$21;;}
63759 else if(__label__==3){var $7=$p;HEAP8[($7)]=0;HEAP32[(($state)>>2)]=1;$pre_bracket=1;__ZL16copy_rule_stringPcRi($arraydecay3,$state);$p=$arraydecay4;;}
63760 else if(__label__==4){var $8=$p;HEAP8[($8)]=0;HEAP32[(($state)>>2)]=2;__ZL16copy_rule_stringPcRi($arraydecay6,$state);HEAP32[(($state)>>2)]=3;$p=$arraydecay7;var $9=$ix;var $add=((($9)+1)&4294967295);var $10=$input_addr;var $arrayidx8=(($10+$add)&4294967295);var $11=HEAP8[($arrayidx8)];var $conv9=(tempInt=(($11)),(tempInt>=128?tempInt-256:tempInt));var $cmp10=((($conv9))|0)==32;if(!($cmp10)){__label__=12;break $sw_default$$sw_bb$$sw_bb5$$sw_bb13$$sw_bb16$6;}
63761 var $12=HEAP32[((__ZL5f_log)>>2)];var $13=HEAP32[((__ZL7linenum)>>2)];var $call=_fprintf($12,((__str90)&4294967295),allocate([$13,0,0,0],["i32",0,0,0],ALLOC_STACK));var $14=HEAP32[((__ZL11error_count)>>2)];var $inc=((($14)+1)&4294967295);HEAP32[((__ZL11error_count)>>2)]=$inc;;}
63762 else if(__label__==7){var $17=$p;HEAP8[($17)]=0;__ZL16copy_rule_stringPcRi($arraydecay14,$state);$p=$arraydecay15;;}
63763 else if(__label__==8){var $18=HEAP32[(($state)>>2)];var $cmp17=((($18))|0)==2;if($cmp17){__label__=9;;}else{__label__=10;;}
63764 if(__label__==9){HEAP32[(($state)>>2)]=0;;}
63765 else if(__label__==10){var $19=$c;var $20=$p;var $incdec_ptr=(($20+1)&4294967295);$p=$incdec_ptr;HEAP8[($20)]=$19;;}}}while(0);var $_pr=$finish;var $23=$ix;var $inc21=((($23)+1)&4294967295);$ix=$inc21;var $cmp=((($_pr))|0)==0;if($cmp){__label__=2;continue $for_body$4;}else{__label__=13;break $for_body_lr_ph$$for_end$2;}}
63766 var $15=$p;HEAP8[($15)]=0;__ZL16copy_rule_stringPcRi($arraydecay12,$state);$finish=1;var $16=$ix;var $inc213=((($16)+1)&4294967295);$ix=$inc213;;}}while(0);var $call22=_strcmp(((__ZL10rule_match)&4294967295),((__str91)&4294967295));var $cmp23=((($call22))|0)==0;if($cmp23){__label__=14;;}else{__label__=15;;}
63767 if(__label__==14){var $call25=_strcpy(((__ZL10rule_match)&4294967295),((__ZL10group_name)&4294967295));;}
63768 var $24=HEAP8[(((__ZL10rule_match)&4294967295))];var $conv27=(tempInt=(($24)),(tempInt>=128?tempInt-256:tempInt));var $cmp28=((($conv27))|0)==0;if($cmp28){__label__=16;;}else{__label__=19;;}
63769 if(__label__==16){var $25=HEAP8[(((__ZL9rule_post)&4294967295))];var $conv30=(tempInt=(($25)),(tempInt>=128?tempInt-256:tempInt));var $cmp31=((($conv30))|0)!=0;if($cmp31){__label__=17;;}else{__label__=18;;}
63770 if(__label__==17){var $26=HEAP32[((__ZL5f_log)>>2)];var $27=HEAP32[((__ZL7linenum)>>2)];var $call33=_fprintf($26,((__str92)&4294967295),allocate([$27,0,0,0],["i32",0,0,0],ALLOC_STACK));var $28=HEAP32[((__ZL11error_count)>>2)];var $inc34=((($28)+1)&4294967295);HEAP32[((__ZL11error_count)>>2)]=$inc34;;}
63771 $retval=0;;}
63772 else if(__label__==19){var $arraydecay37=(($buf)&4294967295);var $arraydecay38=(($bad_phoneme)&4294967295);var $call39=__Z14EncodePhonemesPcS_Ph(((__ZL13rule_phonemes)&4294967295),$arraydecay37,$arraydecay38);var $arrayidx40=(($bad_phoneme)&4294967295);var $29=HEAPU8[($arrayidx40)];var $conv41=((($29))&255);var $cmp42=((($conv41))|0)!=0;if($cmp42){__label__=20;;}else{__label__=21;;}
63773 if(__label__==20){var $30=HEAP32[((__ZL5f_log)>>2)];var $31=HEAP32[((__ZL7linenum)>>2)];var $arrayidx44=(($bad_phoneme)&4294967295);var $32=HEAPU8[($arrayidx44)];var $conv45=((($32))&255);var $33=$input_addr;var $call46=_fprintf($30,((__str93)&4294967295),allocate([$31,0,0,0,$conv45,0,0,0,$33,0,0,0],["i32",0,0,0,"i32",0,0,0,"i8*",0,0,0],ALLOC_STACK));var $34=HEAP32[((__ZL11error_count)>>2)];var $inc47=((($34)+1)&4294967295);HEAP32[((__ZL11error_count)>>2)]=$inc47;;}
63774 var $arraydecay49=(($output)&4294967295);var $arraydecay50=(($buf)&4294967295);var $call51=_strcpy($arraydecay49,$arraydecay50);var $arraydecay52=(($buf)&4294967295);var $call53=_strlen($arraydecay52);var $add54=((($call53)+1)&4294967295);$len=$add54;var $call55=_strlen(((__ZL10group_name)&4294967295));$len_name=$call55;var $cmp56=((($call55))|0)>0;if($cmp56){__label__=22;;}else{__label__=26;;}
63775 $land_lhs_true$$if_end70$31:do{if(__label__==22){var $35=$len_name;var $call57=_memcmp(((__ZL10rule_match)&4294967295),((__ZL10group_name)&4294967295),$35);var $cmp58=((($call57))|0)!=0;if(!($cmp58)){__label__=26;break $land_lhs_true$$if_end70$31;}
63776 var $call60=__Z7utf8_inPiPKc($wc,((__ZL10rule_match)&4294967295));var $36=HEAP8[(((__ZL10group_name)&4294967295))];var $conv61=(tempInt=(($36)),(tempInt>=128?tempInt-256:tempInt));var $cmp62=((($conv61))|0)==57;if($cmp62){__label__=24;;}else{__label__=25;;}
63777 if(__label__==24){var $37=HEAP32[(($wc)>>2)];var $call64=__Z7IsDigitj($37);var $tobool=((($call64))|0)!=0;if($tobool){__label__=26;break $land_lhs_true$$if_end70$31;}}
63778 var $38=HEAP32[((__ZL5f_log)>>2)];var $39=HEAP32[((__ZL7linenum)>>2)];var $call67=_fprintf($38,((__str94)&4294967295),allocate([$39,0,0,0,((__ZL10rule_match)&4294967295),0,0,0,((__ZL10group_name)&4294967295),0,0,0],["i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));var $40=HEAP32[((__ZL11error_count)>>2)];var $inc68=((($40)+1)&4294967295);HEAP32[((__ZL11error_count)>>2)]=$inc68;;}}while(0);var $41=$len;var $arrayidx71=(($output+$41)&4294967295);var $call72=_strcpy($arrayidx71,((__ZL10rule_match)&4294967295));var $call73=_strlen(((__ZL10rule_match)&4294967295));var $42=$len;var $add74=((($42)+($call73))&4294967295);$len=$add74;var $43=HEAP32[((__ZL10debug_flag)>>2)];var $tobool75=((($43))|0)!=0;if($tobool75){__label__=27;;}else{__label__=28;;}
63779 if(__label__==27){var $44=$len;var $arrayidx77=(($output+$44)&4294967295);HEAP8[($arrayidx77)]=9;var $45=HEAP32[((__ZL7linenum)>>2)];var $rem=((($45))|0)%255;var $add78=((($rem)+1)&4294967295);var $conv79=((($add78))&255);var $46=$len;var $add80=((($46)+1)&4294967295);var $arrayidx81=(($output+$add80)&4294967295);HEAP8[($arrayidx81)]=$conv79;var $47=HEAP32[((__ZL7linenum)>>2)];var $div=((((($47))|0)/255)|0);var $add82=((($div)+1)&4294967295);var $conv83=((($add82))&255);var $48=$len;var $add84=((($48)+2)&4294967295);var $arrayidx85=(($output+$add84)&4294967295);HEAP8[($arrayidx85)]=$conv83;var $49=$len;var $add86=((($49)+3)&4294967295);$len=$add86;;}
63780 var $50=HEAP8[(((__ZL9rule_cond)&4294967295))];var $conv88=(tempInt=(($50)),(tempInt>=128?tempInt-256:tempInt));var $cmp89=((($conv88))|0)!=0;if($cmp89){__label__=29;;}else{__label__=35;;}
63781 if(__label__==29){$ix=-1;var $51=HEAP8[(((__ZL9rule_cond)&4294967295))];var $conv91=(tempInt=(($51)),(tempInt>=128?tempInt-256:tempInt));var $cmp92=((($conv91))|0)==33;if($cmp92){__label__=30;;}else{__label__=31;;}
63782 if(__label__==30){var $call94=_atoi(((__ZL9rule_cond+1)&4294967295));var $add95=((($call94)+32)&4294967295);$ix=$add95;;}
63783 else if(__label__==31){var $call97=_atoi(((__ZL9rule_cond)&4294967295));$ix=$call97;;}
63784 var $52=$ix;var $cmp99=((($52))|0)>0;var $53=$ix;var $cmp101=((($53))|0)<255;var $or_cond=($cmp99)&($cmp101);if($or_cond){__label__=33;;}else{__label__=34;;}
63785 if(__label__==33){var $54=$len;var $inc103=((($54)+1)&4294967295);$len=$inc103;var $arrayidx104=(($output+$54)&4294967295);HEAP8[($arrayidx104)]=5;var $55=$ix;var $conv105=((($55))&255);var $56=$len;var $inc106=((($56)+1)&4294967295);$len=$inc106;var $arrayidx107=(($output+$56)&4294967295);HEAP8[($arrayidx107)]=$conv105;;}
63786 else if(__label__==34){var $57=HEAP32[((__ZL5f_log)>>2)];var $58=HEAP32[((__ZL7linenum)>>2)];var $59=$ix;var $call109=_fprintf($57,((__str95)&4294967295),allocate([$58,0,0,0,$59,0,0,0],["i32",0,0,0,"i32",0,0,0],ALLOC_STACK));var $60=HEAP32[((__ZL11error_count)>>2)];var $inc110=((($60)+1)&4294967295);HEAP32[((__ZL11error_count)>>2)]=$inc110;;}}
63787 var $61=HEAP8[(((__ZL8rule_pre)&4294967295))];var $conv113=(tempInt=(($61)),(tempInt>=128?tempInt-256:tempInt));var $cmp114=((($conv113))|0)!=0;if($cmp114){__label__=36;;}else{__label__=41;;}
63788 $if_then115$$if_end132$51:do{if(__label__==36){$start=0;var $62=HEAP8[(((__ZL8rule_pre)&4294967295))];var $conv116=(tempInt=(($62)),(tempInt>=128?tempInt-256:tempInt));var $cmp117=((($conv116))|0)==32;if($cmp117){__label__=37;;}else{__label__=38;;}
63789 if(__label__==37){$c=8;$start=1;;}
63790 else if(__label__==38){$c=1;;}
63791 var $63=$c;var $64=$len;var $inc121=((($64)+1)&4294967295);$len=$inc121;var $arrayidx122=(($output+$64)&4294967295);HEAP8[($arrayidx122)]=$63;var $call123=_strlen(((__ZL8rule_pre)&4294967295));var $sub=((($call123)-1)&4294967295);$ix=$sub;var $65=$ix;var $66=$start;var $cmp1251=((($65))|0)>=((($66))|0);if(!($cmp1251)){__label__=41;break $if_then115$$if_end132$51;}
63792 while(1){var $67=$ix;var $arrayidx127=((__ZL8rule_pre+$67)&4294967295);var $68=HEAP8[($arrayidx127)];var $69=$len;var $inc128=((($69)+1)&4294967295);$len=$inc128;var $arrayidx129=(($output+$69)&4294967295);HEAP8[($arrayidx129)]=$68;var $70=$ix;var $dec=((($70)-1)&4294967295);$ix=$dec;var $71=$ix;var $72=$start;var $cmp125=((($71))|0)>=((($72))|0);if($cmp125){__label__=40;continue;}else{__label__=41;break $if_then115$$if_end132$51;}}}}while(0);var $73=HEAP8[(((__ZL9rule_post)&4294967295))];var $conv133=(tempInt=(($73)),(tempInt>=128?tempInt-256:tempInt));var $cmp134=((($conv133))|0)!=0;if($cmp134){__label__=42;;}else{__label__=43;;}
63793 if(__label__==42){var $74=$len;var $arrayidx136=(($output+$74)&4294967295);var $call137=_sprintf($arrayidx136,((__str70722)&4294967295),allocate([2,0,0,0,((__ZL9rule_post)&4294967295),0,0,0],["i32",0,0,0,"i8*",0,0,0],ALLOC_STACK));var $call138=_strlen(((__ZL9rule_post)&4294967295));var $75=$len;var $add139=((($call138)+1)&4294967295);var $add140=((($add139)+($75))&4294967295);$len=$add140;;}
63794 var $76=$len;var $inc142=((($76)+1)&4294967295);$len=$inc142;var $arrayidx143=(($output+$76)&4294967295);HEAP8[($arrayidx143)]=0;var $77=$len;var $call144=_malloc($77);$prule=$call144;var $78=$prule;var $arraydecay145=(($output)&4294967295);var $79=$len;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$arraydecay145;$dest$=$78;$stop$=$src$+$79;if(($dest$%4)==($src$%4)&&$79>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
63795 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
63796 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $80=$prule;$retval=$80;;}
63797 var $81=$retval;STACKTOP=__stackBase__;return $81;return null;}
63798 function __ZL13rgroup_sorterP6RGROUPS0_($a,$b){;var __label__;var $retval;var $a_addr;var $b_addr;var $ix;$a_addr=$a;$b_addr=$b;var $0=$b_addr;var $name=(($0)&4294967295);var $arraydecay=(($name)&4294967295);var $call=_strlen($arraydecay);var $1=$a_addr;var $name1=(($1)&4294967295);var $arraydecay2=(($name1)&4294967295);var $call3=_strlen($arraydecay2);var $sub=((($call)-($call3))&4294967295);$ix=$sub;var $2=$ix;var $cmp=((($2))|0)!=0;if($cmp){__label__=1;;}else{__label__=2;;}
63799 if(__label__==1){var $3=$ix;$retval=$3;;}
63800 else if(__label__==2){var $4=$a_addr;var $name4=(($4)&4294967295);var $arraydecay5=(($name4)&4294967295);var $5=$b_addr;var $name6=(($5)&4294967295);var $arraydecay7=(($name6)&4294967295);var $call8=_strcmp($arraydecay5,$arraydecay7);$ix=$call8;var $6=$ix;var $cmp9=((($6))|0)!=0;if($cmp9){__label__=3;;}else{__label__=4;;}
63801 if(__label__==3){var $7=$ix;$retval=$7;;}
63802 else if(__label__==4){var $8=$a_addr;var $start=(($8+16)&4294967295);var $9=HEAP32[(($start)>>2)];var $10=$b_addr;var $start12=(($10+16)&4294967295);var $11=HEAP32[(($start12)>>2)];var $sub13=((($9)-($11))&4294967295);$retval=$sub13;;}}
63803 var $12=$retval;;return $12;return null;}
63804 function __ZL16copy_rule_stringPcRi($string,$state){;var __label__;var $string_addr;var $state_addr;var $output;var $p;var $ix;var $len;var $c;var $sxflags;var $value;var $literal;var $mr;$string_addr=$string;$state_addr=$state;var $0=$string_addr;var $arrayidx=(($0)&4294967295);var $1=HEAP8[($arrayidx)];var $conv=(tempInt=(($1)),(tempInt>=128?tempInt-256:tempInt));var $cmp=((($conv))|0)==0;if($cmp){__label__=75;;}else{__label__=1;;}
63805 if(__label__==1){var $2=$state_addr;var $3=HEAP32[(($2)>>2)];var $arrayidx1=((__ZZL16copy_rule_stringPcRiE6outbuf+$3*4)&4294967295);var $4=HEAP32[(($arrayidx1)>>2)];$output=$4;var $5=$state_addr;var $6=HEAP32[(($5)>>2)];var $cmp2=((($6))|0)==4;if($cmp2){__label__=2;;}else{__label__=5;;}
63806 if(__label__==2){var $call=_strlen(((__ZL13rule_phonemes)&4294967295));$len=$call;var $7=$len;var $cmp4=((($7))|0)>0;if($cmp4){__label__=3;;}else{__label__=4;;}
63807 if(__label__==3){var $8=$len;var $inc=((($8)+1)&4294967295);$len=$inc;var $arrayidx6=((__ZL13rule_phonemes+$8)&4294967295);HEAP8[($arrayidx6)]=32;;}
63808 var $9=$len;var $arrayidx8=((__ZL13rule_phonemes+$9)&4294967295);$output=$arrayidx8;;}
63809 $sxflags=8421376;var $10=$string_addr;$p=$10;$ix=0;;$for_cond$10:while(1){$literal=0;var $11=$p;var $incdec_ptr=(($11+1)&4294967295);$p=$incdec_ptr;var $12=HEAP8[($11)];$c=$12;var $13=$c;var $conv10=(tempInt=(($13)),(tempInt>=128?tempInt-256:tempInt));var $cmp11=((($conv10))|0)==92;if($cmp11){__label__=7;;}else{__label__=15;;}
63810 if(__label__==7){var $14=$p;var $incdec_ptr13=(($14+1)&4294967295);$p=$incdec_ptr13;var $15=HEAP8[($14)];$c=$15;var $16=$c;var $conv14=(tempInt=(($16)),(tempInt>=128?tempInt-256:tempInt));var $cmp15=((($conv14))|0)>=48;if($cmp15){__label__=8;;}else{__label__=14;;}
63811 $land_lhs_true$$if_end45$14:do{if(__label__==8){var $17=$c;var $conv16=(tempInt=(($17)),(tempInt>=128?tempInt-256:tempInt));var $cmp17=((($conv16))|0)<=51;if(!($cmp17)){__label__=14;break $land_lhs_true$$if_end45$14;}
63812 var $18=$p;var $arrayidx19=(($18)&4294967295);var $19=HEAP8[($arrayidx19)];var $conv20=(tempInt=(($19)),(tempInt>=128?tempInt-256:tempInt));var $cmp21=((($conv20))|0)>=48;if(!($cmp21)){__label__=14;break $land_lhs_true$$if_end45$14;}
63813 var $20=$p;var $arrayidx23=(($20)&4294967295);var $21=HEAP8[($arrayidx23)];var $conv24=(tempInt=(($21)),(tempInt>=128?tempInt-256:tempInt));var $cmp25=((($conv24))|0)<=55;if(!($cmp25)){__label__=14;break $land_lhs_true$$if_end45$14;}
63814 var $22=$p;var $arrayidx27=(($22+1)&4294967295);var $23=HEAP8[($arrayidx27)];var $conv28=(tempInt=(($23)),(tempInt>=128?tempInt-256:tempInt));var $cmp29=((($conv28))|0)>=48;if(!($cmp29)){__label__=14;break $land_lhs_true$$if_end45$14;}
63815 var $24=$p;var $arrayidx31=(($24+1)&4294967295);var $25=HEAP8[($arrayidx31)];var $conv32=(tempInt=(($25)),(tempInt>=128?tempInt-256:tempInt));var $cmp33=((($conv32))|0)<=55;if(!($cmp33)){__label__=14;break $land_lhs_true$$if_end45$14;}
63816 var $26=$c;var $conv35=(tempInt=(($26)),(tempInt>=128?tempInt-256:tempInt));var $sub=((($conv35)-48)&4294967295);var $mul=((($sub)*64)&4294967295);var $27=$p;var $arrayidx36=(($27)&4294967295);var $28=HEAP8[($arrayidx36)];var $conv37=(tempInt=(($28)),(tempInt>=128?tempInt-256:tempInt));var $sub38=((($conv37)-48)&4294967295);var $mul39=((($sub38)*8)&4294967295);var $29=$p;var $arrayidx40=(($29+1)&4294967295);var $30=HEAP8[($arrayidx40)];var $conv41=(tempInt=(($30)),(tempInt>=128?tempInt-256:tempInt));var $add=((($mul)-48)&4294967295);var $sub42=((($add)+($conv41))&4294967295);var $add43=((($sub42)+($mul39))&4294967295);var $conv44=((($add43))&255);$c=$conv44;var $31=$p;var $add_ptr=(($31+2)&4294967295);$p=$add_ptr;;}}while(0);$literal=1;;}
63817 var $32=$state_addr;var $33=HEAP32[(($32)>>2)];var $cmp47=((($33))|0)==1;if($cmp47){__label__=17;;}else{__label__=16;;}
63818 $if_then49$$lor_lhs_false$23:do{if(__label__==16){var $34=$state_addr;var $35=HEAP32[(($34)>>2)];var $cmp48=((($35))|0)==3;if($cmp48){__label__=17;break $if_then49$$lor_lhs_false$23;}else{__label__=73;break $if_then49$$lor_lhs_false$23;}}}while(0);$if_then49$$if_end212$25:do{if(__label__==17){var $36=$literal;var $cmp50=((($36))|0)==0;if(!($cmp50)){__label__=73;break $if_then49$$if_end212$25;}
63819 var $37=$c;var $conv52=(tempInt=(($37)),(tempInt>=128?tempInt-256:tempInt));if($conv52==95){__label__=19;;}
63820 else if($conv52==89){__label__=20;;}
63821 else if($conv52==65){__label__=21;;}
63822 else if($conv52==66){__label__=21;;}
63823 else if($conv52==67){__label__=21;;}
63824 else if($conv52==72){__label__=21;;}
63825 else if($conv52==70){__label__=21;;}
63826 else if($conv52==71){__label__=21;;}
63827 else if($conv52==68){__label__=24;;}
63828 else if($conv52==75){__label__=25;;}
63829 else if($conv52==78){__label__=26;;}
63830 else if($conv52==86){__label__=27;;}
63831 else if($conv52==90){__label__=28;;}
63832 else if($conv52==43){__label__=29;;}
63833 else if($conv52==64){__label__=30;;}
63834 else if($conv52==38){__label__=31;;}
63835 else if($conv52==37){__label__=32;;}
63836 else if($conv52==35){__label__=33;;}
63837 else if($conv52==33){__label__=34;;}
63838 else if($conv52==84){__label__=35;;}
63839 else if($conv52==87){__label__=36;;}
63840 else if($conv52==88){__label__=37;;}
63841 else if($conv52==74){__label__=38;;}
63842 else if($conv52==76){__label__=39;;}
63843 else if($conv52==36){__label__=48;;}
63844 else if($conv52==80){__label__=55;;}
63845 else if($conv52==83){__label__=56;;}
63846 else{__label__=73;break $if_then49$$if_end212$25;}
63847 $sw_bb$$sw_bb53$$sw_bb54$$sw_bb74$$sw_bb75$$sw_bb76$$sw_bb77$$sw_bb78$$sw_bb79$$sw_bb80$$sw_bb81$$sw_bb82$$sw_bb83$$sw_bb84$$sw_bb85$$sw_bb88$$sw_bb89$$sw_bb90$$sw_bb91$$sw_bb137$$sw_bb158$$sw_bb159$28:do{if(__label__==19){$c=32;__label__=73;break $if_then49$$if_end212$25;}
63848 else if(__label__==20){$c=73;__label__=21;break $sw_bb$$sw_bb53$$sw_bb54$$sw_bb74$$sw_bb75$$sw_bb76$$sw_bb77$$sw_bb78$$sw_bb79$$sw_bb80$$sw_bb81$$sw_bb82$$sw_bb83$$sw_bb84$$sw_bb85$$sw_bb88$$sw_bb89$$sw_bb90$$sw_bb91$$sw_bb137$$sw_bb158$$sw_bb159$28;}
63849 else if(__label__==24){$c=15;__label__=73;break $if_then49$$if_end212$25;}
63850 else if(__label__==25){$c=25;__label__=73;break $if_then49$$if_end212$25;}
63851 else if(__label__==26){$c=24;__label__=73;break $if_then49$$if_end212$25;}
63852 else if(__label__==27){$c=26;__label__=73;break $if_then49$$if_end212$25;}
63853 else if(__label__==28){$c=16;__label__=73;break $if_then49$$if_end212$25;}
63854 else if(__label__==29){$c=12;__label__=73;break $if_then49$$if_end212$25;}
63855 else if(__label__==30){$c=21;__label__=73;break $if_then49$$if_end212$25;}
63856 else if(__label__==31){$c=10;__label__=73;break $if_then49$$if_end212$25;}
63857 else if(__label__==32){$c=11;__label__=73;break $if_then49$$if_end212$25;}
63858 else if(__label__==33){$c=13;__label__=73;break $if_then49$$if_end212$25;}
63859 else if(__label__==34){$c=19;__label__=73;break $if_then49$$if_end212$25;}
63860 else if(__label__==35){var $48=$ix;var $inc86=((($48)+1)&4294967295);$ix=$inc86;var $49=$output;var $arrayidx87=(($49+$48)&4294967295);HEAP8[($arrayidx87)]=28;$c=17;__label__=73;break $if_then49$$if_end212$25;}
63861 else if(__label__==36){$c=31;__label__=73;break $if_then49$$if_end212$25;}
63862 else if(__label__==37){$c=29;__label__=73;break $if_then49$$if_end212$25;}
63863 else if(__label__==38){$c=23;__label__=73;break $if_then49$$if_end212$25;}
63864 else if(__label__==39){var $50=$p;var $incdec_ptr92=(($50+1)&4294967295);$p=$incdec_ptr92;var $51=HEAP8[($50)];var $conv93=(tempInt=(($51)),(tempInt>=128?tempInt-256:tempInt));var $sub94=((($conv93)-48)&4294967295);var $conv95=((($sub94))&255);$c=$conv95;var $52=$p;var $incdec_ptr96=(($52+1)&4294967295);$p=$incdec_ptr96;var $53=HEAP8[($52)];var $conv97=(tempInt=(($53)),(tempInt>=128?tempInt-256:tempInt));var $sub98=((($conv97)-48)&4294967295);$value=$sub98;var $54=$c;var $conv99=(tempInt=(($54)),(tempInt>=128?tempInt-256:tempInt));var $mul100=((($conv99)*10)&4294967295);var $55=$value;var $add101=((($mul100)+($55))&4294967295);var $conv102=((($add101))&255);$c=$conv102;var $56=$value;var $cmp103=((($56))|0)<0;var $57=$value;var $cmp105=((($57))|0)>9;var $or_cond=($cmp103)|($cmp105);if($or_cond){__label__=40;;}else{__label__=41;;}
63865 $if_then106$$if_else109$47:do{if(__label__==40){$c=0;var $58=HEAP32[((__ZL5f_log)>>2)];var $59=HEAP32[((__ZL7linenum)>>2)];var $call107=_fprintf($58,((__str97)&4294967295),allocate([$59,0,0,0],["i32",0,0,0],ALLOC_STACK));var $60=HEAP32[((__ZL11error_count)>>2)];var $inc108=((($60)+1)&4294967295);HEAP32[((__ZL11error_count)>>2)]=$inc108;;}
63866 else if(__label__==41){var $61=$c;var $conv110=(tempInt=(($61)),(tempInt>=128?tempInt-256:tempInt));var $cmp111=((($conv110))|0)<=0;if($cmp111){__label__=44;;}else{__label__=42;;}
63867 $if_then120$$lor_lhs_false112$50:do{if(__label__==42){var $62=$c;var $conv113=(tempInt=(($62)),(tempInt>=128?tempInt-256:tempInt));var $cmp114=((($conv113))|0)>=26;if($cmp114){__label__=44;break $if_then120$$lor_lhs_false112$50;}
63868 var $63=$c;var $conv116=(tempInt=(($63)),(tempInt>=128?tempInt-256:tempInt));var $arrayidx117=((__ZL19letterGroupsDefined+$conv116)&4294967295);var $64=HEAP8[($arrayidx117)];var $conv118=(tempInt=(($64)),(tempInt>=128?tempInt-256:tempInt));var $cmp119=((($conv118))|0)==0;if(!($cmp119)){__label__=45;break $if_then106$$if_else109$47;}}}while(0);var $65=HEAP32[((__ZL5f_log)>>2)];var $66=HEAP32[((__ZL7linenum)>>2)];var $67=$c;var $conv121=(tempInt=(($67)),(tempInt>=128?tempInt-256:tempInt));var $call122=_fprintf($65,((__str98)&4294967295),allocate([$66,0,0,0,$conv121,0,0,0],["i32",0,0,0,"i32",0,0,0],ALLOC_STACK));var $68=HEAP32[((__ZL11error_count)>>2)];var $inc123=((($68)+1)&4294967295);HEAP32[((__ZL11error_count)>>2)]=$inc123;;}}while(0);var $69=$c;var $conv126=(tempInt=(($69)),(tempInt>=128?tempInt-256:tempInt));var $add127=((($conv126)+65)&4294967295);var $conv128=((($add127))&255);$c=$conv128;var $70=$state_addr;var $71=HEAP32[(($70)>>2)];var $cmp129=((($71))|0)==1;if($cmp129){__label__=46;;}else{__label__=47;;}
63869 if(__label__==46){var $72=$c;var $73=$ix;var $inc131=((($73)+1)&4294967295);$ix=$inc131;var $74=$output;var $arrayidx132=(($74+$73)&4294967295);HEAP8[($arrayidx132)]=$72;$c=18;__label__=73;break $if_then49$$if_end212$25;}
63870 else if(__label__==47){var $75=$ix;var $inc134=((($75)+1)&4294967295);$ix=$inc134;var $76=$output;var $arrayidx135=(($76+$75)&4294967295);HEAP8[($arrayidx135)]=18;__label__=73;break $if_then49$$if_end212$25;}}
63871 else if(__label__==48){var $77=$ix;var $inc138=((($77)+1)&4294967295);$ix=$inc138;var $78=$output;var $arrayidx139=(($78+$77)&4294967295);HEAP8[($arrayidx139)]=28;$c=0;$mr=((_mnem_rules)&4294967295);;while(1){var $79=$mr;var $mnem=(($79)&4294967295);var $80=HEAP32[(($mnem)>>2)];var $cmp140=((($80))|0)!=0;if(!($cmp140)){__label__=53;break;}
63872 var $81=$mr;var $mnem141=(($81)&4294967295);var $82=HEAP32[(($mnem141)>>2)];var $call142=_strlen($82);$len=$call142;var $83=$p;var $84=$mr;var $mnem143=(($84)&4294967295);var $85=HEAP32[(($mnem143)>>2)];var $86=$len;var $call144=_memcmp($83,$85,$86);var $cmp145=((($call144))|0)==0;var $87=$mr;if($cmp145){__label__=51;break;}
63873 var $incdec_ptr151=(($87+8)&4294967295);$mr=$incdec_ptr151;__label__=49;continue;}
63874 if(__label__==51){var $value147=(($87+4)&4294967295);var $88=HEAP32[(($value147)>>2)];var $conv148=((($88))&255);$c=$conv148;var $89=$len;var $90=$p;var $add_ptr149=(($90+$89)&4294967295);$p=$add_ptr149;;}
63875 var $91=$c;var $conv152=(tempInt=(($91)),(tempInt>=128?tempInt-256:tempInt));var $cmp153=((($conv152))|0)==0;if(!($cmp153)){__label__=73;break $if_then49$$if_end212$25;}
63876 var $92=HEAP32[((__ZL5f_log)>>2)];var $93=HEAP32[((__ZL7linenum)>>2)];var $call155=_fprintf($92,((__str99)&4294967295),allocate([$93,0,0,0],["i32",0,0,0],ALLOC_STACK));var $94=HEAP32[((__ZL11error_count)>>2)];var $inc156=((($94)+1)&4294967295);HEAP32[((__ZL11error_count)>>2)]=$inc156;__label__=73;break $if_then49$$if_end212$25;}
63877 else if(__label__==55){var $95=$sxflags;var $or=($95)|1024;$sxflags=$or;__label__=56;break $sw_bb$$sw_bb53$$sw_bb54$$sw_bb74$$sw_bb75$$sw_bb76$$sw_bb77$$sw_bb78$$sw_bb79$$sw_bb80$$sw_bb81$$sw_bb82$$sw_bb83$$sw_bb84$$sw_bb85$$sw_bb88$$sw_bb89$$sw_bb90$$sw_bb91$$sw_bb137$$sw_bb158$$sw_bb159$28;}}while(0);if(__label__==21){var $38=$state_addr;var $39=HEAP32[(($38)>>2)];var $cmp55=((($39))|0)==1;if($cmp55){__label__=22;;}else{__label__=23;;}
63878 if(__label__==22){var $40=$c;var $conv57=(tempInt=(($40)),(tempInt>=128?tempInt-256:tempInt));var $sub58=((($conv57)-65)&4294967295);var $arrayidx59=((__ZZL16copy_rule_stringPcRiE16lettergp_letters+$sub58)&4294967295);var $41=HEAP8[($arrayidx59)];var $conv60=(tempInt=(($41)),(tempInt>=128?tempInt-256:tempInt));var $add61=((($conv60)+65)&4294967295);var $conv62=((($add61))&255);var $42=$ix;var $inc63=((($42)+1)&4294967295);$ix=$inc63;var $43=$output;var $arrayidx64=(($43+$42)&4294967295);HEAP8[($arrayidx64)]=$conv62;$c=17;;}
63879 else if(__label__==23){var $44=$ix;var $inc65=((($44)+1)&4294967295);$ix=$inc65;var $45=$output;var $arrayidx66=(($45+$44)&4294967295);HEAP8[($arrayidx66)]=17;var $46=$c;var $conv67=(tempInt=(($46)),(tempInt>=128?tempInt-256:tempInt));var $sub68=((($conv67)-65)&4294967295);var $arrayidx69=((__ZZL16copy_rule_stringPcRiE16lettergp_letters+$sub68)&4294967295);var $47=HEAP8[($arrayidx69)];var $conv70=(tempInt=(($47)),(tempInt>=128?tempInt-256:tempInt));var $add71=((($conv70)+65)&4294967295);var $conv72=((($add71))&255);$c=$conv72;;}}
63880 else if(__label__==56){var $96=$ix;var $inc160=((($96)+1)&4294967295);$ix=$inc160;var $97=$output;var $arrayidx161=(($97+$96)&4294967295);HEAP8[($arrayidx161)]=14;$value=0;;while(1){var $98=$p;var $incdec_ptr163=(($98+1)&4294967295);$p=$incdec_ptr163;var $99=HEAP8[($98)];$c=$99;var $conv164=(tempInt=(($99)),(tempInt>=128?tempInt-256:tempInt));var $call165=__Z8isspace2j($conv164);var $tobool=((($call165))|0)!=0;if($tobool){__label__=72;break;}
63881 var $100=$c;var $conv166=(tempInt=(($100)),(tempInt>=128?tempInt-256:tempInt));var $cmp167=((($conv166))|0)!=0;if(!($cmp167)){__label__=72;break;}
63882 var $101=$c;var $conv169=(tempInt=(($101)),(tempInt>=128?tempInt-256:tempInt));if($conv169==101){__label__=60;;}
63883 else if($conv169==105){__label__=61;;}
63884 else if($conv169==112){__label__=62;;}
63885 else if($conv169==118){__label__=63;;}
63886 else if($conv169==100){__label__=64;;}
63887 else if($conv169==102){__label__=65;;}
63888 else if($conv169==113){__label__=66;;}
63889 else if($conv169==116){__label__=67;;}
63890 else if($conv169==98){__label__=68;;}
63891 else if($conv169==97){__label__=69;;}
63892 else{__label__=70;;}
63893 if(__label__==70){var $112=$c;var $conv190=(tempInt=(($112)),(tempInt>=128?tempInt-256:tempInt));var $isdigittmp=((($conv190)-48)&4294967295);var $isdigit=((($isdigittmp))>>>0)<10;var $call191=((($isdigit))&1);var $tobool192=((($call191))|0)!=0;if(!($tobool192)){__label__=57;continue;}
63894 var $113=$value;var $mul194=((($113)*10)&4294967295);var $114=$c;var $conv195=(tempInt=(($114)),(tempInt>=128?tempInt-256:tempInt));var $sub196=((($mul194)-48)&4294967295);var $add197=((($sub196)+($conv195))&4294967295);$value=$add197;__label__=57;continue;}
63895 else if(__label__==60){var $102=$sxflags;var $or171=($102)|256;$sxflags=$or171;__label__=57;continue;}
63896 else if(__label__==61){var $103=$sxflags;var $or173=($103)|512;$sxflags=$or173;__label__=57;continue;}
63897 else if(__label__==62){var $104=$sxflags;var $or175=($104)|1024;$sxflags=$or175;__label__=57;continue;}
63898 else if(__label__==63){var $105=$sxflags;var $or177=($105)|2048;$sxflags=$or177;__label__=57;continue;}
63899 else if(__label__==64){var $106=$sxflags;var $or179=($106)|4096;$sxflags=$or179;__label__=57;continue;}
63900 else if(__label__==65){var $107=$sxflags;var $or181=($107)|8192;$sxflags=$or181;__label__=57;continue;}
63901 else if(__label__==66){var $108=$sxflags;var $or183=($108)|16384;$sxflags=$or183;__label__=57;continue;}
63902 else if(__label__==67){var $109=$sxflags;var $or185=($109)|65536;$sxflags=$or185;__label__=57;continue;}
63903 else if(__label__==68){var $110=$sxflags;var $or187=($110)|131072;$sxflags=$or187;__label__=57;continue;}
63904 else if(__label__==69){var $111=$sxflags;var $or189=($111)|262144;$sxflags=$or189;__label__=57;continue;}}
63905 var $115=$p;var $incdec_ptr200=(($115+-1)&4294967295);$p=$incdec_ptr200;var $116=$sxflags;var $shr=($116)>>16;var $conv201=((($shr))&255);var $117=$ix;var $inc202=((($117)+1)&4294967295);$ix=$inc202;var $118=$output;var $arrayidx203=(($118+$117)&4294967295);HEAP8[($arrayidx203)]=$conv201;var $119=$sxflags;var $shr204=($119)>>8;var $conv205=((($shr204))&255);var $120=$ix;var $inc206=((($120)+1)&4294967295);$ix=$inc206;var $121=$output;var $arrayidx207=(($121+$120)&4294967295);HEAP8[($arrayidx207)]=$conv205;var $122=$value;var $or208=($122)|128;var $conv209=((($or208))&255);$c=$conv209;;}}}while(0);var $123=$c;var $124=$ix;var $inc213=((($124)+1)&4294967295);$ix=$inc213;var $125=$output;var $arrayidx214=(($125+$124)&4294967295);HEAP8[($arrayidx214)]=$123;var $126=$c;var $conv215=(tempInt=(($126)),(tempInt>=128?tempInt-256:tempInt));var $cmp216=((($conv215))|0)==0;if($cmp216){__label__=74;break $for_cond$10;}else{__label__=6;continue $for_cond$10;}}
63906 var $127=$state_addr;var $128=HEAP32[(($127)>>2)];var $arrayidx219=((__ZZL16copy_rule_stringPcRiE10next_state+$128*4)&4294967295);var $129=HEAP32[(($arrayidx219)>>2)];var $130=$state_addr;HEAP32[(($130)>>2)]=$129;;};return;return;}
63907 function __ZL12compile_linePcS_Pi($linebuf,$dict_line,$hash){var __stackBase__=STACKTOP;STACKTOP+=312;_memset(__stackBase__,0,312);var __label__;var __lastLabel__=null;var $retval;var $linebuf_addr;var $dict_line_addr;var $hash_addr;var $c;var $p;var $word;var $phonetic;var $ix;var $step;var $n_flag_codes;var $flag_offset;var $length;var $multiple_words;var $multiple_numeric_hyphen;var $multiple_string;var $multiple_string_end;var $len_word;var $len_phonetic;var $text_not_phonemes;var $wc=__stackBase__;var $all_upper_case;var $mnemptr;var $comment;var $flag_codes=__stackBase__+4;var $encoded_ph=__stackBase__+104;var $bad_phoneme=__stackBase__+304;var $c2=__stackBase__+308;$linebuf_addr=$linebuf;$dict_line_addr=$dict_line;$hash_addr=$hash;$n_flag_codes=0;$multiple_words=0;$multiple_numeric_hyphen=0;$multiple_string=0;$multiple_string_end=0;$comment=0;$text_not_phonemes=0;$word=((__ZZL12compile_linePcS_PiE10nullstring)&4294967295);$phonetic=((__ZZL12compile_linePcS_PiE10nullstring)&4294967295);var $0=$linebuf_addr;var $call=_memcmp($0,((__str108)&4294967295),2);var $cmp=((($call))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
63908 if(__label__==1){$step=1;;}
63909 var $1=$linebuf_addr;$p=$1;$step=0;$c=0;var $2=$c;var $conv13=((($2))&255);var $cmp114=((($conv13))|0)!=10;if($cmp114){__label__=3;;}else{__label__=55;;}
63910 $while_body$$while_end147$5:do{if(__label__==3){$while_body$6:while(1){var $3=$p;var $4=HEAP8[($3)];$c=$4;var $5=$c;var $conv2=((($5))&255);var $cmp3=((($conv2))|0)==63;if($cmp3){__label__=4;;}else{__label__=12;;}
63911 $land_lhs_true$$if_end28$8:do{if(__label__==4){var $6=$step;var $cmp4=((($6))|0)==0;if(!($cmp4)){__label__=12;break $land_lhs_true$$if_end28$8;}
63912 $flag_offset=100;var $7=$p;var $incdec_ptr=(($7+1)&4294967295);$p=$incdec_ptr;var $8=$p;var $9=HEAP8[($8)];var $conv6=(tempInt=(($9)),(tempInt>=128?tempInt-256:tempInt));var $cmp7=((($conv6))|0)==33;if($cmp7){__label__=6;;}else{__label__=7;;}
63913 if(__label__==6){$flag_offset=132;var $10=$p;var $incdec_ptr9=(($10+1)&4294967295);$p=$incdec_ptr9;;}
63914 $ix=0;var $11=$p;var $12=HEAP8[($11)];var $conv11=(tempInt=(($12)),(tempInt>=128?tempInt-256:tempInt));var $isdigittmp=((($conv11)-48)&4294967295);var $isdigit=((($isdigittmp))>>>0)<10;var $call12=((($isdigit))&1);var $tobool=((($call12))|0)!=0;if($tobool){__label__=8;;}else{__label__=9;;}
63915 if(__label__==8){var $13=$p;var $14=HEAP8[($13)];var $conv14=(tempInt=(($14)),(tempInt>=128?tempInt-256:tempInt));var $15=$ix;var $sub=((($15)-48)&4294967295);var $add=((($sub)+($conv14))&4294967295);$ix=$add;var $16=$p;var $incdec_ptr15=(($16+1)&4294967295);$p=$incdec_ptr15;;}
63916 var $17=$p;var $18=HEAP8[($17)];var $conv17=(tempInt=(($18)),(tempInt>=128?tempInt-256:tempInt));var $isdigittmp1=((($conv17)-48)&4294967295);var $isdigit2=((($isdigittmp1))>>>0)<10;var $call18=((($isdigit2))&1);var $tobool19=((($call18))|0)!=0;if($tobool19){__label__=10;;}else{__label__=11;;}
63917 if(__label__==10){var $19=$ix;var $mul=((($19)*10)&4294967295);var $20=$p;var $21=HEAP8[($20)];var $conv21=(tempInt=(($21)),(tempInt>=128?tempInt-256:tempInt));var $sub22=((($mul)-48)&4294967295);var $add23=((($sub22)+($conv21))&4294967295);$ix=$add23;var $22=$p;var $incdec_ptr24=(($22+1)&4294967295);$p=$incdec_ptr24;;}
63918 var $23=$ix;var $24=$flag_offset;var $add26=((($24)+($23))&4294967295);var $conv27=((($add26))&255);var $25=$n_flag_codes;var $inc=((($25)+1)&4294967295);$n_flag_codes=$inc;var $arrayidx=(($flag_codes+$25)&4294967295);HEAP8[($arrayidx)]=$conv27;var $26=$p;var $27=HEAP8[($26)];$c=$27;;}}while(0);var $28=$c;var $conv29=((($28))&255);var $cmp30=((($conv29))|0)==36;if($cmp30){__label__=13;;}else{__label__=25;;}
63919 $land_lhs_true31$$if_end64$21:do{if(__label__==13){var $29=$p;var $arrayidx32=(($29+1)&4294967295);var $30=HEAP8[($arrayidx32)];var $conv33=(tempInt=(($30)),(tempInt>=128?tempInt-256:tempInt));var $call34=_isalnum($conv33);var $tobool35=((($call34))|0)!=0;if(!($tobool35)){__label__=25;break $land_lhs_true31$$if_end64$21;}
63920 var $31=$p;$mnemptr=$31;var $32=$p;var $33=HEAPU8[($32)];$c=$33;var $conv389=((($33))&255);var $call3910=__Z8isspace2j($conv389);var $tobool4011=((($call3910))|0)!=0;var $lnot12=($tobool4011)^1;var $34=$p;if($lnot12){__lastLabel__=14;__label__=15;;}else{__lastLabel__=14;__label__=16;;}
63921 $while_body41$$while_end$24:do{if(__label__==15){while(1){var $35=__lastLabel__==15?$38:($34);var $incdec_ptr42=(($35+1)&4294967295);$p=$incdec_ptr42;var $36=$p;var $37=HEAPU8[($36)];$c=$37;var $conv38=((($37))&255);var $call39=__Z8isspace2j($conv38);var $tobool40=((($call39))|0)!=0;var $lnot=($tobool40)^1;var $38=$p;if($lnot){__lastLabel__=15;__label__=15;continue;}else{__lastLabel__=15;__label__=16;break $while_body41$$while_end$24;}}}}while(0);var $_lcssa=__lastLabel__==14?$34:($38);HEAP8[($_lcssa)]=0;var $39=$mnemptr;var $call43=__Z10LookupMnemP8MNEM_TABPKc(((_mnem_flags)&4294967295),$39);$ix=$call43;var $cmp44=((($call43))>>>0)>0;if($cmp44){__label__=17;;}else{__label__=24;;}
63922 if(__label__==17){var $40=$ix;var $cmp46=((($40))|0)==200;if($cmp46){__label__=18;;}else{__label__=19;;}
63923 if(__label__==18){HEAP8[(__ZL9text_mode_b)]=1;;}
63924 else if(__label__==19){var $41=$ix;var $cmp48=((($41))|0)==201;if($cmp48){__label__=20;;}else{__label__=21;;}
63925 if(__label__==20){HEAP8[(__ZL9text_mode_b)]=0;;}
63926 else if(__label__==21){var $42=$ix;var $cmp51=((($42))|0)==29;if($cmp51){__label__=22;;}else{__label__=23;;}
63927 if(__label__==22){$text_not_phonemes=1;;}
63928 else if(__label__==23){var $43=$ix;var $conv54=((($43))&255);var $44=$n_flag_codes;var $inc55=((($44)+1)&4294967295);$n_flag_codes=$inc55;var $arrayidx56=(($flag_codes+$44)&4294967295);HEAP8[($arrayidx56)]=$conv54;;}}}}
63929 else if(__label__==24){var $45=HEAP32[((__ZL5f_log)>>2)];var $46=HEAP32[((__ZL7linenum)>>2)];var $47=$mnemptr;var $call61=_fprintf($45,((__str109)&4294967295),allocate([$46,0,0,0,$47,0,0,0],["i32",0,0,0,"i8*",0,0,0],ALLOC_STACK));var $48=HEAP32[((__ZL11error_count)>>2)];var $inc62=((($48)+1)&4294967295);HEAP32[((__ZL11error_count)>>2)]=$inc62;;}}}while(0);var $49=$c;var $conv65=((($49))&255);var $cmp66=((($conv65))|0)==47;if($cmp66){__label__=26;;}else{__label__=29;;}
63930 $land_lhs_true67$$if_end74$41:do{if(__label__==26){var $50=$p;var $arrayidx68=(($50+1)&4294967295);var $51=HEAP8[($arrayidx68)];var $conv69=(tempInt=(($51)),(tempInt>=128?tempInt-256:tempInt));var $cmp70=((($conv69))|0)==47;if(!($cmp70)){__label__=29;break $land_lhs_true67$$if_end74$41;}
63931 var $52=$multiple_words;var $cmp72=((($52))|0)==0;if(!($cmp72)){__label__=29;break $land_lhs_true67$$if_end74$41;}
63932 $c=10;var $53=$p;$comment=$53;;}}while(0);var $54=$step;if($54==0){__label__=30;;}
63933 else if($54==1){__label__=34;;}
63934 else if($54==2){__label__=46;;}
63935 else if($54==3){__label__=50;;}
63936 else if($54==4){__label__=52;;}
63937 else{__label__=54;;}
63938 $sw_epilog$$sw_bb$$sw_bb85$$sw_bb119$$sw_bb133$$sw_bb139$46:do{if(__label__==30){var $55=$c;var $conv75=((($55))&255);var $cmp76=((($conv75))|0)==40;if($cmp76){__label__=31;;}else{__label__=32;;}
63939 if(__label__==31){$multiple_words=1;var $56=$p;var $add_ptr=(($56+1)&4294967295);$word=$add_ptr;$step=1;;}
63940 else if(__label__==32){var $57=$c;var $conv79=((($57))&255);var $call80=__Z8isspace2j($conv79);var $tobool81=((($call80))|0)!=0;if($tobool81){__label__=54;break $sw_epilog$$sw_bb$$sw_bb85$$sw_bb119$$sw_bb133$$sw_bb139$46;}
63941 var $58=$p;$word=$58;$step=1;;}}
63942 else if(__label__==34){var $59=$c;var $conv86=((($59))&255);var $cmp87=((($conv86))|0)==45;if($cmp87){__label__=35;;}else{__label__=39;;}
63943 $land_lhs_true88$$if_end99$53:do{if(__label__==35){var $60=$multiple_words;var $tobool89=((($60))|0)!=0;if(!($tobool89)){__label__=39;break $land_lhs_true88$$if_end99$53;}
63944 var $61=$word;var $arrayidx91=(($61)&4294967295);var $62=HEAP8[($arrayidx91)];var $conv92=(tempInt=(($62)),(tempInt>=128?tempInt-256:tempInt));var $isdigittmp3=((($conv92)-48)&4294967295);var $isdigit4=((($isdigittmp3))>>>0)<10;var $call93=((($isdigit4))&1);var $tobool94=((($call93))|0)!=0;if($tobool94){__label__=37;;}else{__label__=38;;}
63945 if(__label__==37){$multiple_numeric_hyphen=1;;}
63946 var $63=$n_flag_codes;var $inc97=((($63)+1)&4294967295);$n_flag_codes=$inc97;var $arrayidx98=(($flag_codes+$63)&4294967295);HEAP8[($arrayidx98)]=44;$c=32;;}}while(0);var $64=$c;var $conv100=((($64))&255);var $call101=__Z8isspace2j($conv100);var $tobool102=((($call101))|0)!=0;if($tobool102){__label__=40;;}else{__label__=43;;}
63947 if(__label__==40){var $65=$p;var $arrayidx104=(($65)&4294967295);HEAP8[($arrayidx104)]=0;var $66=$multiple_words;var $tobool105=((($66))|0)!=0;if($tobool105){__label__=41;;}else{__label__=42;;}
63948 if(__label__==41){var $67=$p;var $add_ptr107=(($67+1)&4294967295);$multiple_string_end=$add_ptr107;$multiple_string=$add_ptr107;$step=2;;}
63949 else if(__label__==42){$step=3;;}}
63950 else if(__label__==43){var $68=$c;var $conv111=((($68))&255);var $cmp112=((($conv111))|0)==41;if(!($cmp112)){__label__=54;break $sw_epilog$$sw_bb$$sw_bb85$$sw_bb119$$sw_bb133$$sw_bb139$46;}
63951 var $69=$multiple_words;var $tobool114=((($69))|0)!=0;if(!($tobool114)){__label__=54;break $sw_epilog$$sw_bb$$sw_bb85$$sw_bb119$$sw_bb133$$sw_bb139$46;}
63952 var $70=$p;var $arrayidx116=(($70)&4294967295);HEAP8[($arrayidx116)]=0;$step=3;$multiple_words=0;;}}
63953 else if(__label__==46){var $71=$c;var $conv120=((($71))&255);var $call121=__Z8isspace2j($conv120);var $tobool122=((($call121))|0)!=0;if($tobool122){__label__=47;;}else{__label__=48;;}
63954 if(__label__==47){var $72=$multiple_words;var $inc124=((($72)+1)&4294967295);$multiple_words=$inc124;;}
63955 else if(__label__==48){var $73=$c;var $conv126=((($73))&255);var $cmp127=((($conv126))|0)==41;if(!($cmp127)){__label__=54;break $sw_epilog$$sw_bb$$sw_bb85$$sw_bb119$$sw_bb133$$sw_bb139$46;}
63956 var $74=$p;var $arrayidx129=(($74)&4294967295);HEAP8[($arrayidx129)]=32;var $75=$p;var $add_ptr130=(($75+1)&4294967295);$multiple_string_end=$add_ptr130;$step=3;;}}
63957 else if(__label__==50){var $76=$c;var $conv134=((($76))&255);var $call135=__Z8isspace2j($conv134);var $tobool136=((($call135))|0)!=0;if($tobool136){__label__=54;break $sw_epilog$$sw_bb$$sw_bb85$$sw_bb119$$sw_bb133$$sw_bb139$46;}
63958 var $77=$p;$phonetic=$77;$step=4;;}
63959 else if(__label__==52){var $78=$c;var $conv140=((($78))&255);var $call141=__Z8isspace2j($conv140);var $tobool142=((($call141))|0)!=0;if(!($tobool142)){__label__=54;break $sw_epilog$$sw_bb$$sw_bb85$$sw_bb119$$sw_bb133$$sw_bb139$46;}
63960 var $79=$p;var $arrayidx144=(($79)&4294967295);HEAP8[($arrayidx144)]=0;$step=5;;}}while(0);var $80=$p;var $incdec_ptr146=(($80+1)&4294967295);$p=$incdec_ptr146;var $81=$c;var $conv=((($81))&255);var $cmp1=((($conv))|0)!=10;if($cmp1){__label__=3;continue $while_body$6;}else{__label__=55;break $while_body$$while_end147$5;}}}}while(0);var $82=$word;var $arrayidx148=(($82)&4294967295);var $83=HEAP8[($arrayidx148)];var $conv149=(tempInt=(($83)),(tempInt>=128?tempInt-256:tempInt));var $cmp150=((($conv149))|0)==0;if($cmp150){__label__=56;;}else{__label__=57;;}
63961 if(__label__==56){$retval=0;;}
63962 else if(__label__==57){var $_b=HEAPU8[(__ZL9text_mode_b)];var $84=((($_b))&1);var $tobool153=((($84))|0)!=0;if($tobool153){__label__=58;;}else{__label__=59;;}
63963 $if_end155_thread$$if_end155$82:do{if(__label__==58){$text_not_phonemes=1;__label__=60;break $if_end155_thread$$if_end155$82;}
63964 else if(__label__==59){var $_pr=$text_not_phonemes;var $tobool156=((($_pr))|0)!=0;if($tobool156){__label__=60;break $if_end155_thread$$if_end155$82;}
63965 var $96=$phonetic;var $arraydecay176=(($encoded_ph)&4294967295);var $arraydecay177=(($bad_phoneme)&4294967295);var $call178=__Z14EncodePhonemesPcS_Ph($96,$arraydecay176,$arraydecay177);var $arraydecay179=(($encoded_ph)&4294967295);var $call180=_strchr($arraydecay179,21);var $cmp181=((($call180))|0)!=0;if($cmp181){__label__=65;;}else{__label__=66;;}
63966 if(__label__==65){var $97=$n_flag_codes;var $inc183=((($97)+1)&4294967295);$n_flag_codes=$inc183;var $arrayidx184=(($flag_codes+$97)&4294967295);HEAP8[($arrayidx184)]=10;;}
63967 var $arrayidx186=(($bad_phoneme)&4294967295);var $98=HEAPU8[($arrayidx186)];var $conv187=((($98))&255);var $cmp188=((($conv187))|0)!=0;if(!($cmp188)){__label__=68;break $if_end155_thread$$if_end155$82;}
63968 var $99=HEAP32[((__ZL5f_log)>>2)];var $100=HEAP32[((__ZL7linenum)>>2)];var $arrayidx190=(($bad_phoneme)&4294967295);var $101=HEAPU8[($arrayidx190)];var $conv191=((($101))&255);var $arrayidx192=(($bad_phoneme)&4294967295);var $102=HEAPU8[($arrayidx192)];var $conv193=((($102))&255);var $103=$word;var $104=$phonetic;var $call194=_fprintf($99,((__str112)&4294967295),allocate([$100,0,0,0,$conv191,0,0,0,$conv193,0,0,0,$103,0,0,0,$104,0,0,0],["i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));var $105=HEAP32[((__ZL11error_count)>>2)];var $inc195=((($105)+1)&4294967295);HEAP32[((__ZL11error_count)>>2)]=$inc195;__label__=68;break $if_end155_thread$$if_end155$82;}}while(0);$if_then157$$if_end197$90:do{if(__label__==60){var $85=$word;var $arrayidx158=(($85)&4294967295);var $86=HEAP8[($arrayidx158)];var $conv159=(tempInt=(($86)),(tempInt>=128?tempInt-256:tempInt));var $cmp160=((($conv159))|0)==95;if($cmp160){__label__=61;;}else{__label__=63;;}
63969 if(__label__==61){var $87=$phonetic;var $strlen=_strlen($87);var $endptr=(($87+$strlen)&4294967295);var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=((__str110)&4294967295);$dest$=$endptr;$stop$=$src$+2;if(($dest$%4)==($src$%4)&&2>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
63970 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
63971 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $88=HEAP32[((_translator)>>2)];var $89=$phonetic;var $call163=__Z13TranslateWordP10TranslatorPciP8WORD_TAB($88,$89,0,0);$text_not_phonemes=0;var $arraydecay=(($encoded_ph)&4294967295);__Z8strncpy0PcPKci($arraydecay,((_word_phonemes)&4294967295),156);var $90=HEAP8[(((_word_phonemes)&4294967295))];var $conv164=(tempInt=(($90)),(tempInt>=128?tempInt-256:tempInt));var $cmp165=((($conv164))|0)==0;var $91=HEAP32[((__ZL21error_need_dictionary)>>2)];var $cmp167=((($91))|0)<3;var $or_cond=($cmp165)&($cmp167);if(!($or_cond)){__label__=68;break $if_then157$$if_end197$90;}
63972 var $92=HEAP32[((__ZL21error_need_dictionary)>>2)];var $inc169=((($92)+1)&4294967295);HEAP32[((__ZL21error_need_dictionary)>>2)]=$inc169;var $93=HEAP32[((__ZL5f_log)>>2)];var $94=HEAP32[((__ZL7linenum)>>2)];var $call170=_fprintf($93,((__str111)&4294967295),allocate([$94,0,0,0],["i32",0,0,0],ALLOC_STACK));;}
63973 else if(__label__==63){var $arraydecay173=(($encoded_ph)&4294967295);var $95=$phonetic;__Z8strncpy0PcPKci($arraydecay173,$95,156);;}}}while(0);var $106=$text_not_phonemes;var $107=HEAP32[((_translator)>>2)];var $langopts=(($107)&4294967295);var $textmode=(($langopts+252)&4294967295);var $108=HEAP8[($textmode)];var $conv198=(tempInt=(($108)),(tempInt>=128?tempInt-256:tempInt));var $cmp199=((($106))|0)!=((($conv198))|0);if($cmp199){__label__=69;;}else{__label__=70;;}
63974 if(__label__==69){var $109=$n_flag_codes;var $inc201=((($109)+1)&4294967295);$n_flag_codes=$inc201;var $arrayidx202=(($flag_codes+$109)&4294967295);HEAP8[($arrayidx202)]=29;;}
63975 var $110=$word;var $call204=_sscanf($110,((__str113)&4294967295),allocate([$wc,0,0,0],["i32*",0,0,0],ALLOC_STACK));var $cmp205=((($call204))|0)==1;if($cmp205){__label__=71;;}else{__label__=72;;}
63976 $if_then206$$if_else209$100:do{if(__label__==71){var $111=HEAP32[(($wc)>>2)];var $112=$word;var $call207=__Z8utf8_outjPc($111,$112);$ix=$call207;var $113=$ix;var $114=$word;var $arrayidx208=(($114+$113)&4294967295);HEAP8[($arrayidx208)]=0;;}
63977 else if(__label__==72){var $115=$word;var $arrayidx210=(($115)&4294967295);var $116=HEAP8[($arrayidx210)];var $conv211=(tempInt=(($116)),(tempInt>=128?tempInt-256:tempInt));var $cmp212=((($conv211))|0)!=95;if(!($cmp212)){__label__=80;break $if_then206$$if_else209$100;}
63978 $all_upper_case=1;var $117=$word;$p=$117;var $118=$word;$p=$118;var $119=$p;var $call2146=__Z7utf8_inPiPKc($c2,$119);$ix=$call2146;var $120=HEAP32[(($c2)>>2)];var $cmp2157=((($120))|0)==0;if($cmp2157){__label__=78;;}else{__label__=74;;}
63979 $for_end$$if_end217$104:do{if(__label__==74){while(1){var $121=HEAP32[(($c2)>>2)];var $call218=_iswupper($121);var $tobool219=((($call218))|0)!=0;if($tobool219){__label__=75;;}else{__label__=76;;}
63980 if(__label__==75){var $122=HEAP32[(($c2)>>2)];var $call221=_towlower($122);var $123=$p;var $call222=__Z8utf8_outjPc($call221,$123);;}
63981 else if(__label__==76){$all_upper_case=0;;}
63982 var $124=$ix;var $125=$p;var $add_ptr225=(($125+$124)&4294967295);$p=$add_ptr225;var $126=$p;var $call214=__Z7utf8_inPiPKc($c2,$126);$ix=$call214;var $127=HEAP32[(($c2)>>2)];var $cmp215=((($127))|0)==0;if($cmp215){__label__=78;break $for_end$$if_end217$104;}else{__label__=74;continue;}}}}while(0);var $128=$all_upper_case;var $tobool226=((($128))|0)!=0;if(!($tobool226)){__label__=80;break $if_then206$$if_else209$100;}
63983 var $129=$n_flag_codes;var $inc228=((($129)+1)&4294967295);$n_flag_codes=$inc228;var $arrayidx229=(($flag_codes+$129)&4294967295);HEAP8[($arrayidx229)]=42;;}}while(0);var $130=$word;var $call233=_strlen($130);$len_word=$call233;var $131=HEAP32[((_translator)>>2)];var $transpose_min=(($131+288)&4294967295);var $132=HEAP32[(($transpose_min)>>2)];var $cmp234=((($132))|0)>0;if($cmp234){__label__=81;;}else{__label__=82;;}
63984 if(__label__==81){var $133=HEAP32[((_translator)>>2)];var $134=$word;var $call236=__Z17TransposeAlphabetP10TranslatorPc($133,$134);$len_word=$call236;;}
63985 var $135=$word;var $call238=__Z14HashDictionaryPKc($135);var $136=$hash_addr;HEAP32[(($136)>>2)]=$call238;var $arraydecay239=(($encoded_ph)&4294967295);var $call240=_strlen($arraydecay239);$len_phonetic=$call240;var $137=$len_word;var $conv241=((($137))&255);var $138=$dict_line_addr;var $arrayidx242=(($138+1)&4294967295);HEAP8[($arrayidx242)]=$conv241;var $139=$len_word;var $and=($139)&63;$len_word=$and;var $140=$dict_line_addr;var $arrayidx243=(($140+2)&4294967295);var $141=$word;var $142=$len_word;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$141;$dest$=$arrayidx243;$stop$=$src$+$142;if(($dest$%4)==($src$%4)&&$142>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
63986 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
63987 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $143=$len_phonetic;var $cmp244=((($143))|0)==0;if($cmp244){__label__=83;;}else{__label__=84;;}
63988 if(__label__==83){var $144=$dict_line_addr;var $arrayidx246=(($144+1)&4294967295);var $145=HEAP8[($arrayidx246)];var $conv247=(tempInt=(($145)),(tempInt>=128?tempInt-256:tempInt));var $or=($conv247)|128;var $conv248=((($or))&255);HEAP8[($arrayidx246)]=$conv248;var $146=$len_word;var $add249=((($146)+2)&4294967295);$length=$add249;;}
63989 else if(__label__==84){var $147=$len_word;var $148=$len_phonetic;var $add251=((($147)+3)&4294967295);var $add252=((($add251)+($148))&4294967295);$length=$add252;var $149=$len_word;var $add253=((($149)+2)&4294967295);var $150=$dict_line_addr;var $arrayidx254=(($150+$add253)&4294967295);var $arraydecay255=(($encoded_ph)&4294967295);var $call256=_strcpy($arrayidx254,$arraydecay255);;}
63990 $ix=0;var $151=$ix;var $152=$n_flag_codes;var $cmp2598=((($151))>>>0)<((($152))>>>0);if($cmp2598){__label__=86;;}else{__label__=87;;}
63991 $for_body$$for_end264$121:do{if(__label__==86){while(1){var $153=$ix;var $arrayidx260=(($flag_codes+$153)&4294967295);var $154=HEAP8[($arrayidx260)];var $155=$ix;var $156=$length;var $add261=((($156)+($155))&4294967295);var $157=$dict_line_addr;var $arrayidx262=(($157+$add261)&4294967295);HEAP8[($arrayidx262)]=$154;var $158=$ix;var $inc263=((($158)+1)&4294967295);$ix=$inc263;var $159=$ix;var $160=$n_flag_codes;var $cmp259=((($159))>>>0)<((($160))>>>0);if($cmp259){__label__=86;continue;}else{__label__=87;break $for_body$$for_end264$121;}}}}while(0);var $161=$n_flag_codes;var $162=$length;var $add265=((($162)+($161))&4294967295);$length=$add265;var $163=$multiple_string;var $cmp266=((($163))|0)!=0;if($cmp266){__label__=88;;}else{__label__=94;;}
63992 $land_lhs_true267$$if_end286$125:do{if(__label__==88){var $164=$multiple_words;var $cmp268=((($164))|0)>0;if(!($cmp268)){__label__=94;break $land_lhs_true267$$if_end286$125;}
63993 var $165=$multiple_words;var $cmp270=((($165))|0)>10;if($cmp270){__label__=90;;}else{__label__=91;;}
63994 if(__label__==90){var $166=HEAP32[((__ZL5f_log)>>2)];var $167=HEAP32[((__ZL7linenum)>>2)];var $168=$multiple_words;var $call272=_fprintf($166,((__str114)&4294967295),allocate([$167,0,0,0,$168,0,0,0],["i32",0,0,0,"i32",0,0,0],ALLOC_STACK));;}
63995 else if(__label__==91){var $169=$multiple_words;var $add274=((($169)+80)&4294967295);var $conv275=((($add274))&255);var $170=$length;var $inc276=((($170)+1)&4294967295);$length=$inc276;var $171=$dict_line_addr;var $arrayidx277=(($171+$170)&4294967295);HEAP8[($arrayidx277)]=$conv275;var $172=$multiple_string_end;var $173=$multiple_string;var $sub_ptr_lhs_cast=($172);var $sub_ptr_rhs_cast=($173);var $sub_ptr_sub=((($sub_ptr_lhs_cast)-($sub_ptr_rhs_cast))&4294967295);$ix=$sub_ptr_sub;var $174=$multiple_numeric_hyphen;var $tobool278=((($174))|0)!=0;if($tobool278){__label__=92;;}else{__label__=93;;}
63996 if(__label__==92){var $175=$length;var $inc280=((($175)+1)&4294967295);$length=$inc280;var $176=$dict_line_addr;var $arrayidx281=(($176+$175)&4294967295);HEAP8[($arrayidx281)]=32;;}
63997 var $177=$length;var $178=$dict_line_addr;var $arrayidx283=(($178+$177)&4294967295);var $179=$multiple_string;var $180=$ix;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$179;$dest$=$arrayidx283;$stop$=$src$+$180;if(($dest$%4)==($src$%4)&&$180>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
63998 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
63999 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $181=$ix;var $182=$length;var $add284=((($182)+($181))&4294967295);$length=$add284;;}}}while(0);var $183=$length;var $conv287=((($183))&255);var $184=$dict_line_addr;var $arrayidx288=(($184)&4294967295);HEAP8[($arrayidx288)]=$conv287;var $185=$length;$retval=$185;;}
64000 var $186=$retval;STACKTOP=__stackBase__;return $186;return null;}
64001 function __Z8strncpy0PcPKci($to,$from,$size){;var __label__;var $to_addr;var $from_addr;var $size_addr;$to_addr=$to;$from_addr=$from;$size_addr=$size;var $0=$to_addr;var $1=$from_addr;var $2=$size_addr;var $call=_strncpy($0,$1,$2);var $3=$size_addr;var $sub=((($3)-1)&4294967295);var $4=$to_addr;var $arrayidx=(($4+$sub)&4294967295);HEAP8[($arrayidx)]=0;;return;return;}
64002 function __Z13Reverse4Bytesi($word){;var __label__;var $word_addr;$word_addr=$word;var $0=$word_addr;;return $0;return null;}
64003 function __Z10LookupMnemP8MNEM_TABPKc($table,$string){;var __label__;var $retval;var $table_addr;var $string_addr;$table_addr=$table;$string_addr=$string;;while(1){var $0=$table_addr;var $mnem=(($0)&4294967295);var $1=HEAP32[(($mnem)>>2)];var $cmp=((($1))|0)!=0;if(!($cmp)){__label__=5;break;}
64004 var $2=$string_addr;var $3=$table_addr;var $mnem1=(($3)&4294967295);var $4=HEAP32[(($mnem1)>>2)];var $call=_strcmp($2,$4);var $cmp2=((($call))|0)==0;var $5=$table_addr;if($cmp2){__label__=3;break;}
64005 var $incdec_ptr=(($5+8)&4294967295);$table_addr=$incdec_ptr;__label__=1;continue;}
64006 if(__label__==5){var $7=$table_addr;var $value3=(($7+4)&4294967295);var $8=HEAP32[(($value3)>>2)];$retval=$8;;}
64007 else if(__label__==3){var $value=(($5+4)&4294967295);var $6=HEAP32[(($value)>>2)];$retval=$6;;}
64008 var $9=$retval;;return $9;return null;}
64009 function __Z14LoadDictionaryP10TranslatorPKci($tr,$name,$no_error){var __stackBase__=STACKTOP;STACKTOP+=172;_memset(__stackBase__,0,172);var __label__;var $retval;var $tr_addr;var $name_addr;var $no_error_addr;var $hash;var $p;var $pw;var $length;var $f;var $size;var $fname=__stackBase__;$tr_addr=$tr;$name_addr=$name;$no_error_addr=$no_error;var $0=$name_addr;var $call=_strcpy(((_dictionary_name)&4294967295),$0);var $1=$tr_addr;var $dictionary_name=(($1+292)&4294967295);var $arraydecay=(($dictionary_name)&4294967295);var $2=$name_addr;var $call1=_strcpy($arraydecay,$2);var $arraydecay2=(($fname)&4294967295);var $3=$name_addr;var $call3=_sprintf($arraydecay2,((__str116)&4294967295),allocate([((_path_home)&4294967295),0,0,0,47,0,0,0,$3,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0],ALLOC_STACK));var $arraydecay4=(($fname)&4294967295);var $call5=__Z13GetFileLengthPKc($arraydecay4);$size=$call5;var $4=$tr_addr;var $data_dictlist=(($4+1052)&4294967295);var $5=HEAP32[(($data_dictlist)>>2)];var $cmp=((($5))|0)!=0;if($cmp){__label__=1;;}else{__label__=2;;}
64010 if(__label__==1){var $6=$tr_addr;var $data_dictlist6=(($6+1052)&4294967295);var $7=HEAP32[(($data_dictlist6)>>2)];__Z4FreePv($7);var $8=$tr_addr;var $data_dictlist7=(($8+1052)&4294967295);HEAP32[(($data_dictlist7)>>2)]=0;;}
64011 var $arraydecay8=(($fname)&4294967295);var $call9=_fopen($arraydecay8,((__str18429)&4294967295));$f=$call9;var $cmp10=((($call9))|0)==0;if($cmp10){__label__=4;;}else{__label__=3;;}
64012 $if_then12$$lor_lhs_false$5:do{if(__label__==3){var $9=$size;var $cmp11=((($9))>>>0)<=0;if($cmp11){__label__=4;break $if_then12$$lor_lhs_false$5;}
64013 var $13=$size;var $call19=__Z5Alloci($13);var $14=$tr_addr;var $data_dictlist20=(($14+1052)&4294967295);HEAP32[(($data_dictlist20)>>2)]=$call19;var $15=$tr_addr;var $data_dictlist21=(($15+1052)&4294967295);var $16=HEAP32[(($data_dictlist21)>>2)];var $17=$size;var $18=$f;var $call22=_fread($16,1,$17,$18);$size=$call22;var $19=$f;var $call23=_fclose($19);var $20=$tr_addr;var $data_dictlist24=(($20+1052)&4294967295);var $21=HEAP32[(($data_dictlist24)>>2)];var $22=$21;$pw=$22;var $23=$pw;var $arrayidx=(($23+4)&4294967295);var $24=HEAP32[(($arrayidx)>>2)];var $call25=__Z13Reverse4Bytesi($24);$length=$call25;var $25=$size;var $cmp26=((($25))>>>0)<=1032;if($cmp26){__label__=8;;}else{__label__=9;;}
64014 if(__label__==8){var $26=HEAP32[((__impure_ptr)>>2)];var $_stderr28=(($26+12)&4294967295);var $27=HEAP32[(($_stderr28)>>2)];var $arraydecay29=(($fname)&4294967295);var $call30=_fprintf($27,((__str3119)&4294967295),allocate([$arraydecay29,0,0,0],["i8*",0,0,0],ALLOC_STACK));$retval=2;__label__=19;break $if_then12$$lor_lhs_false$5;}
64015 else if(__label__==9){var $28=$pw;var $arrayidx32=(($28)&4294967295);var $29=HEAP32[(($arrayidx32)>>2)];var $call33=__Z13Reverse4Bytesi($29);var $cmp34=((($call33))|0)!=1024;if($cmp34){__label__=11;;}else{__label__=10;;}
64016 $if_then39$$lor_lhs_false35$11:do{if(__label__==10){var $30=$length;var $cmp36=((($30))|0)<=0;var $31=$length;var $cmp38=((($31))|0)>134217728;var $or_cond=($cmp36)|($cmp38);if($or_cond){__label__=11;break $if_then39$$lor_lhs_false35$11;}
64017 var $37=$length;var $38=$tr_addr;var $data_dictlist46=(($38+1052)&4294967295);var $39=HEAP32[(($data_dictlist46)>>2)];var $arrayidx47=(($39+$37)&4294967295);var $40=$tr_addr;var $data_dictrules=(($40+1048)&4294967295);HEAP32[(($data_dictrules)>>2)]=$arrayidx47;var $41=$tr_addr;__ZL10InitGroupsP10Translator($41);var $42=$tr_addr;var $groups1=(($42+5256)&4294967295);var $arrayidx48=(($groups1)&4294967295);var $43=HEAP32[(($arrayidx48)>>2)];var $cmp49=((($43))|0)==0;if($cmp49){__label__=13;;}else{__label__=14;;}
64018 if(__label__==13){var $44=HEAP32[((__impure_ptr)>>2)];var $_stderr51=(($44+12)&4294967295);var $45=HEAP32[(($_stderr51)>>2)];var $46=$name_addr;var $call52=_fprintf($45,((__str5121)&4294967295),allocate([$46,0,0,0],["i8*",0,0,0],ALLOC_STACK));;}
64019 var $47=$tr_addr;var $data_dictlist54=(($47+1052)&4294967295);var $48=HEAP32[(($data_dictlist54)>>2)];var $arrayidx55=(($48+8)&4294967295);$p=$arrayidx55;$hash=0;;$for_body$17:while(1){var $49=$p;var $50=$hash;var $51=$tr_addr;var $dict_hashtab=(($51+1056)&4294967295);var $arrayidx57=(($dict_hashtab+$50*4)&4294967295);HEAP32[(($arrayidx57)>>2)]=$49;var $52=$p;var $53=HEAP8[($52)];var $conv1=(tempInt=(($53)),(tempInt>=128?tempInt-256:tempInt));$length=$conv1;var $cmp582=((($conv1))|0)!=0;if($cmp582){__label__=16;;}else{__label__=17;;}
64020 $while_body$$while_end$19:do{if(__label__==16){while(1){var $54=$length;var $55=$p;var $add_ptr=(($55+$54)&4294967295);$p=$add_ptr;var $56=$p;var $57=HEAP8[($56)];var $conv=(tempInt=(($57)),(tempInt>=128?tempInt-256:tempInt));$length=$conv;var $cmp58=((($conv))|0)!=0;if($cmp58){__label__=16;continue;}else{__label__=17;break $while_body$$while_end$19;}}}}while(0);var $58=$p;var $incdec_ptr=(($58+1)&4294967295);$p=$incdec_ptr;var $59=$hash;var $inc=((($59)+1)&4294967295);$hash=$inc;var $cmp56=((($inc))|0)<1024;if($cmp56){__label__=15;continue $for_body$17;}else{__label__=18;break $for_body$17;}}
64021 $retval=0;__label__=19;break $if_then12$$lor_lhs_false$5;}}while(0);var $32=HEAP32[((__impure_ptr)>>2)];var $_stderr40=(($32+12)&4294967295);var $33=HEAP32[(($_stderr40)>>2)];var $arraydecay41=(($fname)&4294967295);var $34=$pw;var $arrayidx42=(($34)&4294967295);var $35=HEAP32[(($arrayidx42)>>2)];var $call43=__Z13Reverse4Bytesi($35);var $36=$length;var $call44=_fprintf($33,((__str4120)&4294967295),allocate([$arraydecay41,0,0,0,$call43,0,0,0,$36,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i32",0,0,0],ALLOC_STACK));$retval=2;__label__=19;break $if_then12$$lor_lhs_false$5;}}}while(0);if(__label__==4){var $10=$no_error_addr;var $cmp13=((($10))|0)==0;if($cmp13){__label__=5;;}else{__label__=6;;}
64022 if(__label__==5){var $11=HEAP32[((__impure_ptr)>>2)];var $_stderr=(($11+12)&4294967295);var $12=HEAP32[(($_stderr)>>2)];var $arraydecay15=(($fname)&4294967295);var $call16=_fprintf($12,((__str2118)&4294967295),allocate([$arraydecay15,0,0,0],["i8*",0,0,0],ALLOC_STACK));;}
64023 $retval=1;;}
64024 var $60=$retval;STACKTOP=__stackBase__;return $60;return null;}
64025 function __ZL10InitGroupsP10Translator($tr){;var __label__;var __lastLabel__=null;var $tr_addr;var $ix;var $p;var $p_name;var $pw;var $c;var $c2;var $len;$tr_addr=$tr;var $0=$tr_addr;var $n_groups2=(($0+7752)&4294967295);HEAP32[(($n_groups2)>>2)]=0;$ix=0;;$for_body$2:while(1){var $1=$ix;var $2=$tr_addr;var $groups1=(($2+5256)&4294967295);var $arrayidx=(($groups1+$1*4)&4294967295);HEAP32[(($arrayidx)>>2)]=0;var $3=$ix;var $4=$tr_addr;var $groups2_count=(($4+7756)&4294967295);var $arrayidx1=(($groups2_count+$3)&4294967295);HEAP8[($arrayidx1)]=0;var $5=$ix;var $6=$tr_addr;var $groups2_start=(($6+8012)&4294967295);var $arrayidx2=(($groups2_start+$5)&4294967295);HEAP8[($arrayidx2)]=-1;var $7=$ix;var $inc=((($7)+1)&4294967295);$ix=$inc;var $cmp=((($inc))|0)<256;if($cmp){__label__=1;continue $for_body$2;}else{__label__=2;break $for_body$2;}}
64026 var $8=$tr_addr;var $letterGroups=(($8+5152)&4294967295);var $arraydecay=(($letterGroups)&4294967295);var $9=$arraydecay;var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=$9;$stop$=$dest$+104;$value4$=0;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=0;}
64027 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
64028 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=0;};var $10=$tr_addr;var $groups3=(($10+6280)&4294967295);var $arraydecay3=(($groups3)&4294967295);var $11=$arraydecay3;var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=$11;$stop$=$dest$+512;$value4$=0;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=0;}
64029 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
64030 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=0;};var $12=$tr_addr;var $data_dictrules=(($12+1048)&4294967295);var $13=HEAP32[(($data_dictrules)>>2)];$p=$13;;$while_cond$5:while(1){var $14=$p;var $15=HEAP8[($14)];var $conv=(tempInt=(($15)),(tempInt>=128?tempInt-256:tempInt));var $cmp4=((($conv))|0)!=0;if(!($cmp4)){__label__=25;break $while_cond$5;}
64031 var $16=$p;var $17=HEAP8[($16)];var $conv5=(tempInt=(($17)),(tempInt>=128?tempInt-256:tempInt));var $cmp6=((($conv5))|0)!=6;if($cmp6){__label__=5;break $while_cond$5;}
64032 var $23=$p;var $incdec_ptr=(($23+1)&4294967295);$p=$incdec_ptr;var $24=$p;var $arrayidx8=(($24)&4294967295);var $25=HEAP8[($arrayidx8)];var $conv9=(tempInt=(($25)),(tempInt>=128?tempInt-256:tempInt));var $cmp10=((($conv9))|0)==20;var $26=$p;if($cmp10){__label__=7;;}else{__label__=10;;}
64033 if(__label__==7){var $27=($26);var $add=((($27)+4)&4294967295);var $and=($add)&-4;var $28=($and);$pw=$28;var $29=$pw;var $30=$tr_addr;var $langopts=(($30)&4294967295);var $replace_chars=(($langopts+264)&4294967295);HEAP32[(($replace_chars)>>2)]=$29;var $31=$pw;var $arrayidx134=(($31)&4294967295);var $32=HEAP32[(($arrayidx134)>>2)];var $cmp145=((($32))|0)!=0;var $33=$pw;if($cmp145){__lastLabel__=7;__label__=8;;}else{__lastLabel__=7;__label__=9;;}
64034 $while_body15$$while_end$11:do{if(__label__==8){while(1){var $34=__lastLabel__==8?$37:($33);var $add_ptr=(($34+8)&4294967295);$pw=$add_ptr;var $35=$pw;var $arrayidx13=(($35)&4294967295);var $36=HEAP32[(($arrayidx13)>>2)];var $cmp14=((($36))|0)!=0;var $37=$pw;if($cmp14){__lastLabel__=8;__label__=8;continue;}else{__lastLabel__=8;__label__=9;break $while_body15$$while_end$11;}}}}while(0);var $_lcssa3=__lastLabel__==7?$33:($37);var $add_ptr16=(($_lcssa3+4)&4294967295);var $38=$add_ptr16;$p=$38;__label__=3;continue $while_cond$5;}
64035 else if(__label__==10){var $arrayidx18=(($26)&4294967295);var $39=HEAP8[($arrayidx18)];var $conv19=(tempInt=(($39)),(tempInt>=128?tempInt-256:tempInt));var $cmp20=((($conv19))|0)==18;var $40=$p;if($cmp20){__label__=11;;}else{__label__=13;;}
64036 $if_then21$$if_else$16:do{if(__label__==11){var $arrayidx22=(($40+1)&4294967295);var $41=HEAP8[($arrayidx22)];var $conv23=(tempInt=(($41)),(tempInt>=128?tempInt-256:tempInt));var $sub=((($conv23)-65)&4294967295);$ix=$sub;var $42=$p;var $add_ptr24=(($42+2)&4294967295);$p=$add_ptr24;var $43=$ix;var $cmp25=((($43))|0)>=0;var $44=$ix;var $cmp26=((($44))|0)<26;var $or_cond=($cmp25)&($cmp26);if(!($or_cond)){__label__=22;break $if_then21$$if_else$16;}
64037 var $45=$p;var $46=$ix;var $47=$tr_addr;var $letterGroups28=(($47+5152)&4294967295);var $arrayidx29=(($letterGroups28+$46*4)&4294967295);HEAP32[(($arrayidx29)>>2)]=$45;;}
64038 else if(__label__==13){var $call31=_strlen($40);$len=$call31;var $48=$p;$p_name=$48;var $49=$p_name;var $arrayidx32=(($49)&4294967295);var $50=HEAP8[($arrayidx32)];$c=$50;var $51=$p_name;var $arrayidx33=(($51+1)&4294967295);var $52=HEAP8[($arrayidx33)];$c2=$52;var $53=$len;var $add34=((($53)+1)&4294967295);var $54=$p;var $add_ptr35=(($54+$add34)&4294967295);$p=$add_ptr35;var $55=$len;var $cmp36=((($55))|0)==1;if($cmp36){__label__=14;;}else{__label__=15;;}
64039 if(__label__==14){var $56=$p;var $57=$c;var $idxprom=((($57))&255);var $58=$tr_addr;var $groups138=(($58+5256)&4294967295);var $arrayidx39=(($groups138+$idxprom*4)&4294967295);HEAP32[(($arrayidx39)>>2)]=$56;;}
64040 else if(__label__==15){var $59=$len;var $cmp41=((($59))|0)==0;if($cmp41){__label__=16;;}else{__label__=17;;}
64041 if(__label__==16){var $60=$p;var $61=$tr_addr;var $groups143=(($61+5256)&4294967295);var $arrayidx44=(($groups143)&4294967295);HEAP32[(($arrayidx44)>>2)]=$60;;}
64042 else if(__label__==17){var $62=$c;var $conv46=((($62))&255);var $cmp47=((($conv46))|0)==1;if($cmp47){__label__=18;;}else{__label__=19;;}
64043 if(__label__==18){var $63=$p;var $64=$c2;var $conv49=((($64))&255);var $sub50=((($conv49)-1)&4294967295);var $65=$tr_addr;var $groups351=(($65+6280)&4294967295);var $arrayidx52=(($groups351+$sub50*4)&4294967295);HEAP32[(($arrayidx52)>>2)]=$63;;}
64044 else if(__label__==19){var $66=$c;var $idxprom54=((($66))&255);var $67=$tr_addr;var $groups2_start55=(($67+8012)&4294967295);var $arrayidx56=(($groups2_start55+$idxprom54)&4294967295);var $68=HEAPU8[($arrayidx56)];var $conv57=((($68))&255);var $cmp58=((($conv57))|0)==255;if($cmp58){__label__=20;;}else{__label__=21;;}
64045 if(__label__==20){var $69=$tr_addr;var $n_groups260=(($69+7752)&4294967295);var $70=HEAP32[(($n_groups260)>>2)];var $conv61=((($70))&255);var $71=$c;var $idxprom62=((($71))&255);var $72=$tr_addr;var $groups2_start63=(($72+8012)&4294967295);var $arrayidx64=(($groups2_start63+$idxprom62)&4294967295);HEAP8[($arrayidx64)]=$conv61;;}
64046 var $73=$c;var $idxprom66=((($73))&255);var $74=$tr_addr;var $groups2_count67=(($74+7756)&4294967295);var $arrayidx68=(($groups2_count67+$idxprom66)&4294967295);var $75=HEAP8[($arrayidx68)];var $inc69=((($75)+1)&255);HEAP8[($arrayidx68)]=$inc69;var $76=$p;var $77=$tr_addr;var $n_groups270=(($77+7752)&4294967295);var $78=HEAP32[(($n_groups270)>>2)];var $79=$tr_addr;var $groups2=(($79+6792)&4294967295);var $arrayidx71=(($groups2+$78*4)&4294967295);HEAP32[(($arrayidx71)>>2)]=$76;var $80=$c;var $conv72=((($80))&255);var $81=$c2;var $conv73=((($81))&255);var $shl=((($conv73)*256)&4294967295);var $add74=((($shl)+($conv72))&4294967295);var $82=$tr_addr;var $n_groups275=(($82+7752)&4294967295);var $83=HEAPU32[(($n_groups275)>>2)];var $inc76=((($83)+1)&4294967295);HEAP32[(($n_groups275)>>2)]=$inc76;var $84=$tr_addr;var $groups2_name=(($84+7272)&4294967295);var $arrayidx77=(($groups2_name+$83*4)&4294967295);HEAP32[(($arrayidx77)>>2)]=$add74;;}}}}}while(0);var $85=$p;var $86=HEAP8[($85)];var $conv831=(tempInt=(($86)),(tempInt>=128?tempInt-256:tempInt));var $cmp842=((($conv831))|0)!=7;var $87=$p;if($cmp842){__lastLabel__=22;__label__=23;;}else{__lastLabel__=22;__label__=24;;}
64047 $while_body85$$while_end89$33:do{if(__label__==23){while(1){var $88=__lastLabel__==23?$92:($87);var $call86=_strlen($88);var $add87=((($call86)+1)&4294967295);var $89=$p;var $add_ptr88=(($89+$add87)&4294967295);$p=$add_ptr88;var $90=$p;var $91=HEAP8[($90)];var $conv83=(tempInt=(($91)),(tempInt>=128?tempInt-256:tempInt));var $cmp84=((($conv83))|0)!=7;var $92=$p;if($cmp84){__lastLabel__=23;__label__=23;continue;}else{__lastLabel__=23;__label__=24;break $while_body85$$while_end89$33;}}}}while(0);var $_lcssa=__lastLabel__==22?$87:($92);var $incdec_ptr90=(($_lcssa+1)&4294967295);$p=$incdec_ptr90;__label__=3;continue $while_cond$5;}}
64048 if(__label__==5){var $18=HEAP32[((__impure_ptr)>>2)];var $_stderr=(($18+12)&4294967295);var $19=HEAP32[(($_stderr)>>2)];var $20=$p;var $21=$tr_addr;var $data_dictrules7=(($21+1048)&4294967295);var $22=HEAP32[(($data_dictrules7)>>2)];var $sub_ptr_lhs_cast=($20);var $sub_ptr_rhs_cast=($22);var $sub_ptr_sub=((($sub_ptr_lhs_cast)-($sub_ptr_rhs_cast))&4294967295);var $call=_fprintf($19,((__str34150)&4294967295),allocate([((_dictionary_name)&4294967295),0,0,0,$sub_ptr_sub,0,0,0],["i8*",0,0,0,"i32",0,0,0],ALLOC_STACK));;};return;return;}
64049 function __Z14HashDictionaryPKc($string){;var __label__;var __lastLabel__=null;var $string_addr;var $c;var $chars;var $hash;$string_addr=$string;$chars=0;$hash=0;var $0=$string_addr;var $incdec_ptr1=(($0+1)&4294967295);$string_addr=$incdec_ptr1;var $1=HEAP8[($0)];var $conv2=(tempInt=(($1)),(tempInt>=128?tempInt-256:tempInt));var $and4=($conv2)&255;$c=$and4;var $cmp5=((($and4))|0)!=0;var $2=$hash;if($cmp5){__lastLabel__=0;__label__=1;;}else{__lastLabel__=0;__label__=2;;}
64050 $while_body$$while_end$2:do{if(__label__==1){while(1){var $3=__lastLabel__==1?$10:($2);var $mul=((($3)*8)&4294967295);var $4=$c;var $add=((($4)+($mul))&4294967295);$hash=$add;var $5=$hash;var $and1=($5)&1023;var $6=$hash;var $shr=($6)>>8;var $xor=($shr)^($and1);$hash=$xor;var $7=$chars;var $inc=((($7)+1)&4294967295);$chars=$inc;var $8=$string_addr;var $incdec_ptr=(($8+1)&4294967295);$string_addr=$incdec_ptr;var $9=HEAP8[($8)];var $conv=(tempInt=(($9)),(tempInt>=128?tempInt-256:tempInt));var $and=($conv)&255;$c=$and;var $cmp=((($and))|0)!=0;var $10=$hash;if($cmp){__lastLabel__=1;__label__=1;continue;}else{__lastLabel__=1;__label__=2;break $while_body$$while_end$2;}}}}while(0);var $_lcssa=__lastLabel__==0?$2:($10);var $11=$chars;var $add2=((($11)+($_lcssa))&4294967295);var $and3=($add2)&1023;;return $and3;return null;}
64051 function __Z14EncodePhonemesPcS_Ph($p,$outptr,$bad_phoneme){;var __label__;var __lastLabel__=null;var $retval;var $p_addr;var $outptr_addr;var $bad_phoneme_addr;var $ix;var $c;var $count;var $max;var $max_ph;var $consumed;var $mnemonic_word;var $p_lang;$p_addr=$p;$outptr_addr=$outptr;$bad_phoneme_addr=$bad_phoneme;var $0=$bad_phoneme_addr;var $arrayidx=(($0)&4294967295);HEAP8[($arrayidx)]=0;var $1=$p_addr;var $2=HEAP8[($1)];var $conv4=(tempInt=(($2)),(tempInt>=128?tempInt-256:tempInt));var $call5=_isspace($conv4);var $tobool6=((($call5))|0)!=0;if($tobool6){__label__=1;;}else{__label__=2;;}
64052 $while_body$$while_cond1$2:do{if(__label__==1){while(1){var $3=$p_addr;var $incdec_ptr=(($3+1)&4294967295);$p_addr=$incdec_ptr;var $4=$p_addr;var $5=HEAP8[($4)];var $conv=(tempInt=(($5)),(tempInt>=128?tempInt-256:tempInt));var $call=_isspace($conv);var $tobool=((($call))|0)!=0;if($tobool){__label__=1;continue;}else{__label__=2;break $while_body$$while_cond1$2;}}}}while(0);$while_cond1$5:while(1){var $6=$p_addr;var $7=HEAPU8[($6)];$c=$7;var $conv2=((($7))&255);var $cmp=((($conv2))|0)!=0;if(!($cmp)){__label__=34;break $while_cond1$5;}
64053 var $8=$c;var $conv3=((($8))&255);var $call4=_isspace($conv3);var $tobool5=((($call4))|0)!=0;var $lnot=($tobool5)^1;if(!($lnot)){__label__=34;break $while_cond1$5;}
64054 $consumed=0;var $9=$c;var $conv7=((($9))&255);var $cond=((($conv7))|0)==124;if($cond){__label__=5;;}else{__label__=7;;}
64055 $sw_bb$$sw_default$9:do{if(__label__==5){var $10=$p_addr;var $arrayidx8=(($10+1)&4294967295);var $11=HEAPU8[($arrayidx8)];$c=$11;var $conv9=((($11))&255);var $cmp10=((($conv9))|0)==124;if($cmp10){__label__=7;break $sw_bb$$sw_default$9;}
64056 var $12=$p_addr;var $incdec_ptr11=(($12+1)&4294967295);$p_addr=$incdec_ptr11;__label__=2;continue $while_cond1$5;}}while(0);$max=-1;$max_ph=0;$ix=1;var $13=$ix;var $14=HEAP32[((_n_phoneme_tab)>>2)];var $cmp121=((($13))|0)<((($14))|0);if(!($cmp121)){__label__=22;break $while_cond1$5;}
64057 $for_body$13:while(1){var $15=$ix;var $arrayidx13=((_phoneme_tab+$15*4)&4294967295);var $16=HEAP32[(($arrayidx13)>>2)];var $cmp14=((($16))|0)==0;if($cmp14){__label__=20;;}else{__label__=9;;}
64058 $for_inc$$if_end16$15:do{if(__label__==9){var $17=$ix;var $arrayidx17=((_phoneme_tab+$17*4)&4294967295);var $18=HEAP32[(($arrayidx17)>>2)];var $type=(($18+11)&4294967295);var $19=HEAPU8[($type)];var $conv18=((($19))&255);var $cmp19=((($conv18))|0)==15;if($cmp19){__label__=20;break $for_inc$$if_end16$15;}
64059 $count=0;var $20=$ix;var $arrayidx22=((_phoneme_tab+$20*4)&4294967295);var $21=HEAP32[(($arrayidx22)>>2)];var $mnemonic=(($21)&4294967295);var $22=HEAP32[(($mnemonic)>>2)];$mnemonic_word=$22;;while(1){var $23=$count;var $24=$p_addr;var $arrayidx24=(($24+$23)&4294967295);var $25=HEAPU8[($arrayidx24)];$c=$25;var $conv25=((($25))&255);var $cmp26=((($conv25))|0)>32;if(!($cmp26)){__label__=13;break;}
64060 var $26=$count;var $cmp27=((($26))|0)<4;if(!($cmp27)){__label__=13;break;}
64061 var $28=$c;var $conv29=((($28))&255);var $29=$mnemonic_word;var $30=$count;var $mul=((($30)*8)&4294967295);var $shr=($29)>>>((($mul))>>>0);var $and=($shr)&255;var $cmp30=((($conv29))|0)==((($and))|0);var $31=$count;if($cmp30){__lastLabel__=14;;}else{__lastLabel__=14;__label__=16;break;}
64062 var $inc=((($31)+1)&4294967295);$count=$inc;__label__=11;continue;}
64063 if(__label__==13){var $27=$count;__lastLabel__=13;;}
64064 var $32=__lastLabel__==13?$27:($31);var $33=$max;var $cmp34=((($32))|0)>((($33))|0);if(!($cmp34)){__label__=20;break $for_inc$$if_end16$15;}
64065 var $34=$count;var $cmp36=((($34))|0)==4;if($cmp36){__label__=19;;}else{__label__=18;;}
64066 if(__label__==18){var $35=$mnemonic_word;var $36=$count;var $mul37=((($36)*8)&4294967295);var $shr38=($35)>>>((($mul37))>>>0);var $and39=($shr38)&255;var $cmp40=((($and39))|0)==0;if(!($cmp40)){__label__=20;break $for_inc$$if_end16$15;}}
64067 var $37=$count;$max=$37;var $38=$ix;var $arrayidx42=((_phoneme_tab+$38*4)&4294967295);var $39=HEAP32[(($arrayidx42)>>2)];var $code=(($39+10)&4294967295);var $40=HEAPU8[($code)];var $conv43=((($40))&255);$max_ph=$conv43;;}}while(0);var $41=$ix;var $inc45=((($41)+1)&4294967295);$ix=$inc45;var $42=$ix;var $43=HEAP32[((_n_phoneme_tab)>>2)];var $cmp12=((($42))|0)<((($43))|0);if($cmp12){__label__=8;continue $for_body$13;}else{__label__=21;break $for_body$13;}}
64068 var $_pr=$max_ph;var $cmp46=((($_pr))|0)==0;if($cmp46){__label__=22;break $while_cond1$5;}
64069 var $50=$max;var $cmp52=((($50))|0)<=0;if($cmp52){__label__=24;;}else{__label__=25;;}
64070 if(__label__==24){$max=1;;}
64071 var $51=$consumed;var $52=$max;var $add=((($52)+($51))&4294967295);var $53=$p_addr;var $add_ptr55=(($53+$add)&4294967295);$p_addr=$add_ptr55;var $54=$max_ph;var $conv56=((($54))&255);var $55=$outptr_addr;var $incdec_ptr57=(($55+1)&4294967295);$outptr_addr=$incdec_ptr57;HEAP8[($55)]=$conv56;var $56=$max_ph;var $cmp58=((($56))|0)==21;if(!($cmp58)){__label__=2;continue $while_cond1$5;}
64072 var $57=$outptr_addr;$p_lang=$57;;while(1){var $58=$p_addr;var $59=HEAPU8[($58)];$c=$59;var $conv61=((($59))&255);var $call62=_isspace($conv61);var $tobool63=((($call62))|0)!=0;if($tobool63){__label__=30;break;}
64073 var $60=$c;var $conv65=((($60))&255);var $cmp66=((($conv65))|0)!=0;if(!($cmp66)){__label__=30;break;}
64074 var $61=$p_addr;var $incdec_ptr69=(($61+1)&4294967295);$p_addr=$incdec_ptr69;var $62=$c;var $conv70=((($62))&255);var $call71=_tolower($conv70);var $conv72=((($call71))&255);var $63=$outptr_addr;var $incdec_ptr73=(($63+1)&4294967295);$outptr_addr=$incdec_ptr73;HEAP8[($63)]=$conv72;__label__=27;continue;}
64075 var $64=$outptr_addr;HEAP8[($64)]=0;var $65=$c;var $conv75=((($65))&255);var $cmp76=((($conv75))|0)==0;if($cmp76){__label__=31;;}else{__label__=33;;}
64076 if(__label__==31){var $66=$p_lang;var $call78=_strcmp($66,((__str52704)&4294967295));var $cmp79=((($call78))|0)==0;if($cmp79){__label__=32;break $while_cond1$5;}else{__label__=2;continue $while_cond1$5;}}
64077 else if(__label__==33){var $69=$outptr_addr;var $incdec_ptr83=(($69+1)&4294967295);$outptr_addr=$incdec_ptr83;HEAP8[($69)]=124;__label__=2;continue $while_cond1$5;}}
64078 if(__label__==34){var $70=$outptr_addr;HEAP8[($70)]=0;var $71=$p_addr;$retval=$71;;}
64079 else if(__label__==22){var $44=$p_addr;var $45=HEAP8[($44)];var $46=$bad_phoneme_addr;var $arrayidx48=(($46)&4294967295);HEAP8[($arrayidx48)]=$45;var $47=$bad_phoneme_addr;var $arrayidx49=(($47+1)&4294967295);HEAP8[($arrayidx49)]=0;var $48=$outptr_addr;var $incdec_ptr50=(($48+1)&4294967295);$outptr_addr=$incdec_ptr50;HEAP8[($48)]=0;var $49=$p_addr;var $add_ptr=(($49+1)&4294967295);$retval=$add_ptr;;}
64080 else if(__label__==32){var $67=$p_lang;HEAP8[($67)]=0;var $68=$p_addr;$retval=$68;;}
64081 var $72=$retval;;return $72;return null;}
64082 function __Z14DecodePhonemesPKcPc($inptr,$outptr){;var __label__;var $inptr_addr;var $outptr_addr;var $phcode;var $c;var $mnem;var $ph;$inptr_addr=$inptr;$outptr_addr=$outptr;var $0=$inptr_addr;var $incdec_ptr8=(($0+1)&4294967295);$inptr_addr=$incdec_ptr8;var $1=HEAPU8[($0)];$phcode=$1;var $conv9=((($1))&255);var $cmp10=((($conv9))|0)>0;if($cmp10){__label__=1;;}else{__label__=14;;}
64083 $while_body$$while_end40$2:do{if(__label__==1){$while_body$3:while(1){var $2=$phcode;var $conv1=((($2))&255);var $cmp2=((($conv1))|0)==255;if($cmp2){__label__=2;;}else{__label__=3;;}
64084 $while_cond_backedge$$if_end$5:do{if(__label__==3){var $5=$phcode;var $idxprom=((($5))&255);var $arrayidx=((_phoneme_tab+$idxprom*4)&4294967295);var $6=HEAPU32[(($arrayidx)>>2)];$ph=$6;var $cmp3=((($6))|0)==0;if($cmp3){__label__=2;break $while_cond_backedge$$if_end$5;}
64085 var $7=$ph;var $type=(($7+11)&4294967295);var $8=HEAPU8[($type)];var $conv6=((($8))&255);var $cmp7=((($conv6))|0)==1;if($cmp7){__label__=5;;}else{__label__=9;;}
64086 $land_lhs_true$$if_else$8:do{if(__label__==5){var $9=$ph;var $std_length=(($9+14)&4294967295);var $10=HEAPU8[($std_length)];var $conv8=((($10))&255);var $cmp9=((($conv8))|0)<=4;if(!($cmp9)){__label__=9;break $land_lhs_true$$if_else$8;}
64087 var $11=$ph;var $program=(($11+8)&4294967295);var $12=HEAPU16[(($program)>>1)];var $conv11=((($12))&65535);var $cmp12=((($conv11))|0)==0;if(!($cmp12)){__label__=9;break $land_lhs_true$$if_else$8;}
64088 var $13=$ph;var $std_length14=(($13+14)&4294967295);var $14=HEAPU8[($std_length14)];var $conv15=((($14))&255);var $cmp16=((($conv15))|0)>1;if(!($cmp16)){__label__=2;break $while_cond_backedge$$if_end$5;}
64089 var $15=$ph;var $std_length18=(($15+14)&4294967295);var $16=HEAPU8[($std_length18)];var $idxprom19=((($16))&255);var $arrayidx20=((((__str7123)&4294967295)+$idxprom19)&4294967295);var $17=HEAP8[($arrayidx20)];var $18=$outptr_addr;var $incdec_ptr21=(($18+1)&4294967295);$outptr_addr=$incdec_ptr21;HEAP8[($18)]=$17;__label__=2;break $while_cond_backedge$$if_end$5;}}while(0);var $19=$ph;var $mnemonic=(($19)&4294967295);var $20=HEAP32[(($mnemonic)>>2)];$mnem=$20;var $21=$mnem;var $and4=($21)&255;var $conv245=((($and4))&255);$c=$conv245;var $conv256=((($conv245))&255);var $cmp267=((($conv256))|0)!=0;if($cmp267){__label__=10;;}else{__label__=11;;}
64090 $while_body27$$while_end$14:do{if(__label__==10){while(1){var $22=$c;var $23=$outptr_addr;var $incdec_ptr28=(($23+1)&4294967295);$outptr_addr=$incdec_ptr28;HEAP8[($23)]=$22;var $24=$mnem;var $shr=($24)>>>8;$mnem=$shr;var $25=$mnem;var $and=($25)&255;var $conv24=((($and))&255);$c=$conv24;var $conv25=((($conv24))&255);var $cmp26=((($conv25))|0)!=0;if($cmp26){__label__=10;continue;}else{__label__=11;break $while_body27$$while_end$14;}}}}while(0);var $26=$phcode;var $conv29=((($26))&255);var $cmp30=((($conv29))|0)==21;if(!($cmp30)){__label__=2;break $while_cond_backedge$$if_end$5;}
64091 var $27=$inptr_addr;var $28=HEAP8[($27)];var $conv331=(tempInt=(($28)),(tempInt>=128?tempInt-256:tempInt));var $call2=_isalpha($conv331);var $tobool3=((($call2))|0)!=0;if(!($tobool3)){__label__=2;break $while_cond_backedge$$if_end$5;}
64092 while(1){var $29=$inptr_addr;var $incdec_ptr35=(($29+1)&4294967295);$inptr_addr=$incdec_ptr35;var $30=HEAP8[($29)];var $31=$outptr_addr;var $incdec_ptr36=(($31+1)&4294967295);$outptr_addr=$incdec_ptr36;HEAP8[($31)]=$30;var $32=$inptr_addr;var $33=HEAP8[($32)];var $conv33=(tempInt=(($33)),(tempInt>=128?tempInt-256:tempInt));var $call=_isalpha($conv33);var $tobool=((($call))|0)!=0;if($tobool){__label__=13;continue;}else{__label__=2;break $while_cond_backedge$$if_end$5;}}}}while(0);var $3=$inptr_addr;var $incdec_ptr=(($3+1)&4294967295);$inptr_addr=$incdec_ptr;var $4=HEAPU8[($3)];$phcode=$4;var $conv=((($4))&255);var $cmp=((($conv))|0)>0;if($cmp){__label__=1;continue $while_body$3;}else{__label__=14;break $while_body$$while_end40$2;}}}}while(0);var $34=$outptr_addr;HEAP8[($34)]=0;;return;return;}
64093 function __Z26GetTranslatedPhonemeStringPci($phon_out,$n_phon_out){var __stackBase__=STACKTOP;STACKTOP+=4;_memset(__stackBase__,0,4);var __label__;var $phon_out_addr;var $n_phon_out_addr;var $ix;var $phon_out_ix=__stackBase__;var $stress;var $c;var $p;var $plist;$phon_out_addr=$phon_out;$n_phon_out_addr=$n_phon_out;HEAP32[(($phon_out_ix)>>2)]=0;var $0=$phon_out_addr;var $cmp=((($0))|0)!=0;if($cmp){__label__=1;;}else{__label__=28;;}
64094 if(__label__==1){$ix=1;;$for_cond$4:while(1){var $1=$ix;var $2=HEAP32[((_n_phoneme_list)>>2)];var $sub=((($2)-2)&4294967295);var $cmp1=((($1))|0)<((($sub))|0);if(!($cmp1)){__label__=25;break $for_cond$4;}
64095 var $3=HEAP32[(($phon_out_ix)>>2)];var $4=$n_phon_out_addr;var $sub2=((($4)-6)&4294967295);var $cmp3=((($3))|0)<((($sub2))|0);if(!($cmp3)){__label__=25;break $for_cond$4;}
64096 var $5=$ix;var $arrayidx=((_phoneme_list+$5*24)&4294967295);$plist=$arrayidx;var $6=$plist;var $newword=(($6+19)&4294967295);var $7=HEAP8[($newword)];var $tobool=(tempInt=(($7)),(tempInt>=128?tempInt-256:tempInt))!=0;if($tobool){__label__=5;;}else{__label__=6;;}
64097 if(__label__==5){var $8=HEAP32[(($phon_out_ix)>>2)];var $inc=((($8)+1)&4294967295);HEAP32[(($phon_out_ix)>>2)]=$inc;var $9=$phon_out_addr;var $arrayidx5=(($9+$8)&4294967295);HEAP8[($arrayidx5)]=32;;}
64098 var $10=$plist;var $synthflags=(($10+4)&4294967295);var $11=HEAPU16[(($synthflags)>>1)];var $conv=((($11))&65535);var $and=($conv)&4;var $tobool6=((($and))|0)!=0;if($tobool6){__label__=7;;}else{__label__=15;;}
64099 $if_then7$$if_end27$11:do{if(__label__==7){var $12=$plist;var $stresslevel=(($12+1)&4294967295);var $13=HEAPU8[($stresslevel)];var $conv8=((($13))&255);$stress=$conv8;var $cmp9=((($conv8))|0)>1;if(!($cmp9)){__label__=15;break $if_then7$$if_end27$11;}
64100 $c=0;var $14=$stress;var $cmp11=((($14))|0)>5;if($cmp11){__label__=9;;}else{__label__=10;;}
64101 if(__label__==9){$stress=5;;}
64102 var $15=HEAP32[((_option_phonemes)>>2)];var $cmp14=((($15))|0)==3;if($cmp14){__label__=11;;}else{__label__=13;;}
64103 $if_then15$$if_end21$17:do{if(__label__==11){$c=716;var $16=$stress;var $cmp16=((($16))|0)>3;if(!($cmp16)){__label__=14;break $if_then15$$if_end21$17;}
64104 $c=712;;}
64105 else if(__label__==13){var $17=$stress;var $arrayidx19=((((__str8124)&4294967295)+$17)&4294967295);var $18=HEAP8[($arrayidx19)];var $conv20=(tempInt=(($18)),(tempInt>=128?tempInt-256:tempInt));$c=$conv20;var $cmp22=((($conv20))|0)!=0;if(!($cmp22)){__label__=15;break $if_then7$$if_end27$11;}}}while(0);var $19=$c;var $20=HEAP32[(($phon_out_ix)>>2)];var $21=$phon_out_addr;var $arrayidx24=(($21+$20)&4294967295);var $call=__Z8utf8_outjPc($19,$arrayidx24);var $22=HEAP32[(($phon_out_ix)>>2)];var $add=((($22)+($call))&4294967295);HEAP32[(($phon_out_ix)>>2)]=$add;;}}while(0);var $23=$plist;var $ph=(($23+8)&4294967295);var $24=HEAP32[(($ph)>>2)];var $code=(($24+10)&4294967295);var $25=HEAPU8[($code)];var $conv28=((($25))&255);var $cmp29=((($conv28))|0)==21;if($cmp29){__label__=16;;}else{__label__=17;;}
64106 $if_then30$$if_else37$23:do{if(__label__==16){var $26=$plist;var $tone_ph=(($26+3)&4294967295);var $27=HEAPU8[($tone_ph)];var $idxprom=((($27))&255);var $arrayidx31=((_phoneme_tab_list+$idxprom*48)&4294967295);var $name=(($arrayidx31)&4294967295);var $arraydecay=(($name)&4294967295);$p=$arraydecay;var $28=HEAP32[(($phon_out_ix)>>2)];var $29=$phon_out_addr;var $arrayidx32=(($29+$28)&4294967295);var $30=$p;var $call33=_sprintf($arrayidx32,((__str9125)&4294967295),allocate([$30,0,0,0],["i8*",0,0,0],ALLOC_STACK));var $31=$p;var $call34=_strlen($31);var $32=HEAP32[(($phon_out_ix)>>2)];var $add35=((($call34)+2)&4294967295);var $add36=((($add35)+($32))&4294967295);HEAP32[(($phon_out_ix)>>2)]=$add36;;}
64107 else if(__label__==17){var $33=$phon_out_addr;var $34=$plist;var $ph38=(($34+8)&4294967295);var $35=HEAP32[(($ph38)>>2)];var $36=$plist;__ZL15WritePhMnemonicPcPiP11PHONEME_TABP12PHONEME_LIST($33,$phon_out_ix,$35,$36);var $37=$plist;var $synthflags39=(($37+4)&4294967295);var $38=HEAPU16[(($synthflags39)>>1)];var $conv40=((($38))&65535);var $and41=($conv40)&8;var $tobool42=((($and41))|0)!=0;if($tobool42){__label__=18;;}else{__label__=19;;}
64108 if(__label__==18){var $39=$phon_out_addr;var $40=HEAP32[((((_phoneme_tab+48)&4294967295))>>2)];__ZL15WritePhMnemonicPcPiP11PHONEME_TABP12PHONEME_LIST($39,$phon_out_ix,$40,0);;}
64109 var $41=$plist;var $synthflags45=(($41+4)&4294967295);var $42=HEAPU16[(($synthflags45)>>1)];var $conv46=((($42))&65535);var $and47=($conv46)&4;var $tobool48=((($and47))|0)!=0;if($tobool48){__label__=20;;}else{__label__=22;;}
64110 $land_lhs_true$$if_end52$29:do{if(__label__==20){var $43=$plist;var $type=(($43+15)&4294967295);var $44=HEAPU8[($type)];var $conv49=((($44))&255);var $cmp50=((($conv49))|0)!=2;if(!($cmp50)){__label__=22;break $land_lhs_true$$if_end52$29;}
64111 var $45=$phon_out_addr;var $46=HEAP32[((((_phoneme_tab+80)&4294967295))>>2)];__ZL15WritePhMnemonicPcPiP11PHONEME_TABP12PHONEME_LIST($45,$phon_out_ix,$46,0);;}}while(0);var $47=$plist;var $tone_ph53=(($47+3)&4294967295);var $48=HEAPU8[($tone_ph53)];var $conv54=((($48))&255);var $cmp55=((($conv54))|0)>0;if(!($cmp55)){__label__=24;break $if_then30$$if_else37$23;}
64112 var $49=$phon_out_addr;var $50=$plist;var $tone_ph57=(($50+3)&4294967295);var $51=HEAPU8[($tone_ph57)];var $idxprom58=((($51))&255);var $arrayidx59=((_phoneme_tab+$idxprom58*4)&4294967295);var $52=HEAP32[(($arrayidx59)>>2)];__ZL15WritePhMnemonicPcPiP11PHONEME_TABP12PHONEME_LIST($49,$phon_out_ix,$52,0);;}}while(0);var $53=$ix;var $inc62=((($53)+1)&4294967295);$ix=$inc62;__label__=2;continue $for_cond$4;}
64113 var $54=HEAP32[(($phon_out_ix)>>2)];var $55=$n_phon_out_addr;var $cmp63=((($54))|0)>=((($55))|0);if($cmp63){__label__=26;;}else{__label__=27;;}
64114 if(__label__==26){var $56=$n_phon_out_addr;var $sub65=((($56)-1)&4294967295);HEAP32[(($phon_out_ix)>>2)]=$sub65;;}
64115 var $57=HEAP32[(($phon_out_ix)>>2)];var $58=$phon_out_addr;var $arrayidx67=(($58+$57)&4294967295);HEAP8[($arrayidx67)]=0;;}
64116 STACKTOP=__stackBase__;return;return;}
64117 function __ZL15WritePhMnemonicPcPiP11PHONEME_TABP12PHONEME_LIST($phon_out,$ix,$ph,$plist){var __stackBase__=STACKTOP;STACKTOP+=152;_memset(__stackBase__,0,152);var __label__;var __lastLabel__=null;var $phon_out_addr;var $ix_addr;var $ph_addr;var $plist_addr;var $c;var $mnem;var $len;var $first;var $ipa_control;var $phdata=__stackBase__;$phon_out_addr=$phon_out;$ix_addr=$ix;$ph_addr=$ph;$plist_addr=$plist;$ipa_control=0;var $0=HEAP32[((_option_phonemes)>>2)];var $cmp=((($0))|0)==3;if($cmp){__label__=1;;}else{__label__=8;;}
64118 $if_then$$if_end20$2:do{if(__label__==1){var $ipa_string=(($phdata+132)&4294967295);var $arrayidx=(($ipa_string)&4294967295);HEAP8[($arrayidx)]=0;var $1=$plist_addr;var $cmp1=((($1))|0)==0;if($cmp1){__label__=2;;}else{__label__=3;;}
64119 if(__label__==2){var $2=$ph_addr;var $code=(($2+10)&4294967295);var $3=HEAPU8[($code)];var $conv=((($3))&255);__Z17InterpretPhoneme2iP12PHONEME_DATA($conv,$phdata);;}
64120 else if(__label__==3){var $4=$plist_addr;__Z16InterpretPhonemeP10TranslatoriP12PHONEME_LISTP12PHONEME_DATA(0,0,$4,$phdata);;}
64121 var $ipa_string3=(($phdata+132)&4294967295);var $arraydecay=(($ipa_string3)&4294967295);var $call=_strlen($arraydecay);$len=$call;var $cmp4=((($call))|0)>0;if(!($cmp4)){__label__=8;break $if_then$$if_end20$2;}
64122 var $ipa_string6=(($phdata+132)&4294967295);var $arrayidx7=(($ipa_string6)&4294967295);var $5=HEAP8[($arrayidx7)];var $conv8=(tempInt=(($5)),(tempInt>=128?tempInt-256:tempInt));$ipa_control=$conv8;var $cmp9=((($conv8))>>>0)>32;if($cmp9){__lastLabel__=5;__label__=6;;}else{__lastLabel__=5;__label__=7;;}
64123 if(__label__==6){var $6=$ix_addr;var $7=HEAP32[(($6)>>2)];var $8=$phon_out_addr;var $arrayidx11=(($8+$7)&4294967295);var $ipa_string12=(($phdata+132)&4294967295);var $arraydecay13=(($ipa_string12)&4294967295);var $call14=_strcpy($arrayidx11,$arraydecay13);var $9=$len;var $10=$ix_addr;var $11=HEAP32[(($10)>>2)];var $add=((($11)+($9))&4294967295);HEAP32[(($10)>>2)]=$add;var $_pr=$ipa_control;__lastLabel__=6;;}
64124 var $12=__lastLabel__==6?$_pr:($conv8);var $cmp16=((($12))>>>0)>=32;if($cmp16){__label__=23;break $if_then$$if_end20$2;}else{__label__=8;break $if_then$$if_end20$2;}}}while(0);$for_end$$if_end20$12:do{if(__label__==8){$first=1;var $13=$ph_addr;var $mnemonic=(($13)&4294967295);var $14=HEAP32[(($mnemonic)>>2)];$mnem=$14;;$for_cond$14:while(1){var $15=$mnem;var $and=($15)&255;$c=$and;var $cmp21=((($and))|0)!=0;if(!($cmp21)){__label__=23;break $for_end$$if_end20$12;}
64125 var $16=$c;var $cmp22=((($16))|0)==47;var $17=HEAP32[((_option_phoneme_variants)>>2)];var $cmp23=((($17))|0)==0;var $or_cond=($cmp22)&($cmp23);if($or_cond){__label__=23;break $for_end$$if_end20$12;}
64126 var $18=HEAP32[((_option_phonemes)>>2)];var $cmp26=((($18))|0)==3;if($cmp26){__label__=12;;}else{__label__=20;;}
64127 $if_then27$$if_else54$18:do{if(__label__==12){var $19=$first;var $tobool=((($19))|0)!=0;var $20=$c;var $cmp29=((($20))|0)==95;var $or_cond3=($tobool)&($cmp29);if($or_cond3){__label__=23;break $for_end$$if_end20$12;}
64128 var $cmp32=((($20))|0)==35;if($cmp32){__label__=14;;}else{__label__=15;;}
64129 if(__label__==14){var $21=$ph_addr;var $type=(($21+11)&4294967295);var $22=HEAPU8[($type)];var $conv34=((($22))&255);var $cmp35=((($conv34))|0)==2;if($cmp35){__label__=23;break $for_end$$if_end20$12;}}
64130 var $23=$first;var $tobool38=((($23))|0)!=0;if($tobool38){__label__=17;;}else{__label__=16;;}
64131 if(__label__==16){var $24=$c;var $isdigittmp=((($24)-48)&4294967295);var $isdigit=((($isdigittmp))>>>0)<10;var $call40=((($isdigit))&1);var $tobool41=((($call40))|0)!=0;if($tobool41){__label__=22;break $if_then27$$if_else54$18;}}
64132 var $25=$c;var $cmp44=((($25))|0)>=32;var $26=$c;var $cmp46=((($26))|0)<128;var $or_cond1=($cmp44)&($cmp46);if($or_cond1){__label__=18;;}else{__label__=19;;}
64133 if(__label__==18){var $27=$c;var $sub=((($27)-32)&4294967295);var $arrayidx48=((_ipa1+$sub*2)&4294967295);var $28=HEAPU16[(($arrayidx48)>>1)];var $conv49=((($28))&65535);$c=$conv49;;}
64134 var $29=$c;var $30=$ix_addr;var $31=HEAP32[(($30)>>2)];var $32=$phon_out_addr;var $arrayidx51=(($32+$31)&4294967295);var $call52=__Z8utf8_outjPc($29,$arrayidx51);var $33=$ix_addr;var $34=HEAP32[(($33)>>2)];var $add53=((($34)+($call52))&4294967295);HEAP32[(($33)>>2)]=$add53;__label__=21;break $if_then27$$if_else54$18;}
64135 else if(__label__==20){var $35=$c;var $conv55=((($35))&255);var $36=$ix_addr;var $37=HEAP32[(($36)>>2)];var $inc=((($37)+1)&4294967295);HEAP32[(($36)>>2)]=$inc;var $38=$phon_out_addr;var $arrayidx56=(($38+$37)&4294967295);HEAP8[($arrayidx56)]=$conv55;__label__=21;break $if_then27$$if_else54$18;}}while(0);if(__label__==21){$first=0;;}
64136 var $39=$mnem;var $shr=($39)>>8;$mnem=$shr;__label__=9;continue $for_cond$14;}}}while(0);STACKTOP=__stackBase__;return;return;}
64137 function __Z7IsVowelP10Translatori($tr,$letter){;var __label__;var $tr_addr;var $letter_addr;$tr_addr=$tr;$letter_addr=$letter;var $0=$tr_addr;var $1=$letter_addr;var $call=__ZL8IsLetterP10Translatorii($0,$1,7);;return $call;return null;}
64138 function __ZL8IsLetterP10Translatorii($tr,$letter,$group){;var __label__;var $retval;var $tr_addr;var $letter_addr;var $group_addr;var $letter2;$tr_addr=$tr;$letter_addr=$letter;$group_addr=$group;var $0=$group_addr;var $1=$tr_addr;var $letter_groups=(($1+968)&4294967295);var $arrayidx=(($letter_groups+$0*4)&4294967295);var $2=HEAP32[(($arrayidx)>>2)];var $cmp=((($2))|0)!=0;var $3=$group_addr;if($cmp){__label__=1;;}else{__label__=4;;}
64139 $if_then$$if_end4$2:do{if(__label__==1){var $4=$tr_addr;var $letter_groups1=(($4+968)&4294967295);var $arrayidx2=(($letter_groups1+$3*4)&4294967295);var $5=HEAP32[(($arrayidx2)>>2)];var $6=$letter_addr;var $call=_wcschr($5,$6);var $tobool=((($call))|0)!=0;if($tobool){__label__=2;;}else{__label__=3;;}
64140 if(__label__==2){$retval=1;;}
64141 else if(__label__==3){$retval=0;;}}
64142 else if(__label__==4){var $cmp5=((($3))|0)>7;if($cmp5){__label__=5;;}else{__label__=6;;}
64143 if(__label__==5){$retval=0;;}
64144 else if(__label__==6){var $7=$tr_addr;var $letter_bits_offset=(($7+964)&4294967295);var $8=HEAP32[(($letter_bits_offset)>>2)];var $cmp8=((($8))|0)>0;var $9=$letter_addr;if($cmp8){__label__=7;;}else{__label__=11;;}
64145 $if_then9$$if_else15$11:do{if(__label__==7){var $10=$tr_addr;var $letter_bits_offset10=(($10+964)&4294967295);var $11=HEAP32[(($letter_bits_offset10)>>2)];var $sub=((($9)-($11))&4294967295);$letter2=$sub;var $cmp11=((($sub))|0)>0;if($cmp11){__label__=8;;}else{__label__=10;;}
64146 $land_lhs_true$$if_else$13:do{if(__label__==8){var $12=$letter2;var $cmp12=((($12))|0)<128;if(!($cmp12)){__label__=10;break $land_lhs_true$$if_else$13;}
64147 var $13=$letter2;$letter_addr=$13;__label__=13;break $if_then9$$if_else15$11;}}while(0);$retval=0;__label__=16;break $if_then$$if_end4$2;}
64148 else if(__label__==11){var $cmp16=((($9))|0)>=192;var $14=$letter_addr;var $cmp18=((($14))|0)<606;var $or_cond=($cmp16)&($cmp18);if(!($or_cond)){__label__=13;break $if_then9$$if_else15$11;}
64149 var $15=$letter_addr;var $sub20=((($15)-192)&4294967295);var $arrayidx21=((__ZL13remove_accent+$sub20)&4294967295);var $16=HEAPU8[($arrayidx21)];var $idxprom=((($16))&255);var $17=$tr_addr;var $letter_bits=(($17+708)&4294967295);var $arrayidx22=(($letter_bits+$idxprom)&4294967295);var $18=HEAPU8[($arrayidx22)];var $conv=((($18))&255);var $19=$group_addr;var $shl=1<<($19);var $and=($shl)&($conv);$retval=$and;__label__=16;break $if_then$$if_end4$2;}}while(0);var $20=$letter_addr;var $cmp25=((($20))|0)>=0;var $21=$letter_addr;var $cmp27=((($21))|0)<128;var $or_cond1=($cmp25)&($cmp27);if($or_cond1){__label__=14;;}else{__label__=15;;}
64150 if(__label__==14){var $22=$letter_addr;var $23=$tr_addr;var $letter_bits29=(($23+708)&4294967295);var $arrayidx30=(($letter_bits29+$22)&4294967295);var $24=HEAPU8[($arrayidx30)];var $conv31=((($24))&255);var $25=$group_addr;var $shl32=1<<($25);var $and33=($shl32)&($conv31);$retval=$and33;;}
64151 else if(__label__==15){$retval=0;;}}}}while(0);var $26=$retval;;return $26;return null;}
64152 function __Z14UnpronouncableP10TranslatorPci($tr,$word,$posn){var __stackBase__=STACKTOP;STACKTOP+=4;_memset(__stackBase__,0,4);var __label__;var __lastLabel__=null;var $retval;var $tr_addr;var $word_addr;var $posn_addr;var $c=__stackBase__;var $c1;var $vowel_posn;var $index;var $count;var $apostrophe;$tr_addr=$tr;$word_addr=$word;$posn_addr=$posn;$c1=0;$vowel_posn=9;$apostrophe=0;var $0=$word_addr;var $call=__Z7utf8_inPiPKc($c,$0);var $1=$tr_addr;var $letter_bits_offset=(($1+964)&4294967295);var $2=HEAP32[(($letter_bits_offset)>>2)];var $cmp=((($2))|0)>0;if($cmp){__label__=1;;}else{__label__=3;;}
64153 $land_lhs_true$$if_end$2:do{if(__label__==1){var $3=HEAP32[(($c)>>2)];var $cmp1=((($3))|0)<577;if(!($cmp1)){__label__=3;break $land_lhs_true$$if_end$2;}
64154 $retval=0;__label__=30;break $land_lhs_true$$if_end$2;}}while(0);$return$$if_end$5:do{if(__label__==3){var $4=$tr_addr;var $langopts=(($4)&4294967295);var $param=(($langopts+24)&4294967295);var $arrayidx=(($param+20)&4294967295);var $5=HEAP32[(($arrayidx)>>2)];var $cmp2=((($5))|0)==1;if($cmp2){__label__=4;;}else{__label__=5;;}
64155 if(__label__==4){$retval=0;;}
64156 else if(__label__==5){var $6=$word_addr;var $7=HEAP8[($6)];var $conv=(tempInt=(($7)),(tempInt>=128?tempInt-256:tempInt));HEAP32[(($c)>>2)]=$conv;var $cmp5=((($conv))|0)==32;if($cmp5){__label__=7;;}else{__label__=6;;}
64157 $if_then9$$lor_lhs_false$10:do{if(__label__==6){var $8=HEAP32[(($c)>>2)];var $cmp6=((($8))|0)==0;var $9=HEAP32[(($c)>>2)];var $cmp8=((($9))|0)==39;var $or_cond=($cmp6)|($cmp8);if($or_cond){__label__=7;break $if_then9$$lor_lhs_false$10;}
64158 $index=0;$count=0;;$for_cond$13:while(1){var $10=$index;var $11=$word_addr;var $arrayidx11=(($11+$10)&4294967295);var $call12=__Z7utf8_inPiPKc($c,$arrayidx11);var $12=$index;var $add=((($12)+($call12))&4294967295);$index=$add;var $13=HEAP32[(($c)>>2)];var $cmp13=((($13))|0)==0;var $14=HEAP32[(($c)>>2)];var $cmp15=((($14))|0)==32;var $or_cond1=($cmp13)|($cmp15);if($or_cond1){__label__=21;break $for_cond$13;}
64159 var $15=HEAP32[(($c)>>2)];var $cmp18=((($15))|0)==39;if($cmp18){__label__=11;;}else{__label__=13;;}
64160 if(__label__==11){var $16=$count;var $cmp20=((($16))|0)>1;if($cmp20){__label__=21;break $for_cond$13;}
64161 var $17=$posn_addr;var $cmp22=((($17))|0)>0;if($cmp22){__label__=21;break $for_cond$13;}}
64162 var $18=$count;var $cmp25=((($18))|0)==0;if($cmp25){__label__=14;;}else{__label__=15;;}
64163 if(__label__==14){var $19=HEAP32[(($c)>>2)];$c1=$19;;}
64164 var $20=$count;var $inc=((($20)+1)&4294967295);$count=$inc;var $21=$tr_addr;var $22=HEAP32[(($c)>>2)];var $call28=__Z7IsVowelP10Translatori($21,$22);var $tobool=((($call28))|0)!=0;if($tobool){__label__=16;break $for_cond$13;}
64165 var $24=HEAP32[(($c)>>2)];var $cmp31=((($24))|0)==39;if($cmp31){__label__=18;;}else{__label__=19;;}
64166 if(__label__==18){$apostrophe=1;__label__=9;continue $for_cond$13;}
64167 else if(__label__==19){var $25=HEAP32[(($c)>>2)];var $call33=_iswalpha($25);var $tobool34=((($call33))|0)!=0;if($tobool34){__label__=9;continue $for_cond$13;}else{__label__=20;break $for_cond$13;}}}
64168 if(__label__==21){var $_pr=$vowel_posn;__lastLabel__=21;;}
64169 else if(__label__==16){var $23=$count;$vowel_posn=$23;__lastLabel__=16;;}
64170 else if(__label__==20){$retval=0;__label__=30;break $return$$if_end$5;}
64171 var $26=__lastLabel__==21?$_pr:($23);var $cmp38=((($26))|0)>2;if($cmp38){__label__=23;;}else{__label__=25;;}
64172 $land_lhs_true39$$if_end46$32:do{if(__label__==23){var $27=$tr_addr;var $langopts40=(($27)&4294967295);var $param41=(($langopts40+24)&4294967295);var $arrayidx42=(($param41+20)&4294967295);var $28=HEAP32[(($arrayidx42)>>2)];var $cmp43=((($28))|0)==2;if(!($cmp43)){__label__=25;break $land_lhs_true39$$if_end46$32;}
64173 var $29=$tr_addr;var $30=$word_addr;var $call45=__ZL15Unpronouncable2P10TranslatorPc($29,$30);$retval=$call45;__label__=30;break $return$$if_end$5;}}while(0);var $31=$c1;var $32=$tr_addr;var $langopts47=(($32)&4294967295);var $param48=(($langopts47+24)&4294967295);var $arrayidx49=(($param48+20)&4294967295);var $33=HEAP32[(($arrayidx49)>>2)];var $cmp50=((($31))|0)==((($33))|0);if($cmp50){__label__=26;;}else{__label__=27;;}
64174 if(__label__==26){var $34=$vowel_posn;var $dec=((($34)-1)&4294967295);$vowel_posn=$dec;;}
64175 var $35=$vowel_posn;var $36=$tr_addr;var $langopts53=(($36)&4294967295);var $max_initial_consonants=(($langopts53+248)&4294967295);var $37=HEAP8[($max_initial_consonants)];var $conv54=(tempInt=(($37)),(tempInt>=128?tempInt-256:tempInt));var $add55=((($conv54)+1)&4294967295);var $cmp56=((($35))|0)>((($add55))|0);if($cmp56){__label__=28;;}else{__label__=29;;}
64176 if(__label__==28){$retval=1;__label__=30;break $return$$if_end$5;}
64177 else if(__label__==29){$retval=0;__label__=30;break $return$$if_end$5;}}}while(0);$retval=0;;}}}while(0);var $38=$retval;STACKTOP=__stackBase__;return $38;return null;}
64178 function __ZL15Unpronouncable2P10TranslatorPc($tr,$word){var __stackBase__=STACKTOP;STACKTOP+=160;_memset(__stackBase__,0,160);var __label__;var $retval;var $tr_addr;var $word_addr;var $c;var $end_flags;var $ph_buf=__stackBase__;$tr_addr=$tr;$word_addr=$word;var $arrayidx=(($ph_buf)&4294967295);HEAP8[($arrayidx)]=0;var $0=$word_addr;var $arrayidx1=(($0+-1)&4294967295);var $1=HEAP8[($arrayidx1)];var $conv=(tempInt=(($1)),(tempInt>=128?tempInt-256:tempInt));$c=$conv;var $2=$word_addr;var $arrayidx2=(($2+-1)&4294967295);HEAP8[($arrayidx2)]=32;var $3=$tr_addr;var $4=$word_addr;var $arraydecay=(($ph_buf)&4294967295);var $call=__Z14TranslateRulesP10TranslatorPcS1_iS1_iPj($3,$4,$arraydecay,160,0,-2147483648,0);$end_flags=$call;var $5=$c;var $conv3=((($5))&255);var $6=$word_addr;var $arrayidx4=(($6+-1)&4294967295);HEAP8[($arrayidx4)]=$conv3;var $7=$end_flags;var $cmp=((($7))|0)==0;if($cmp){__label__=2;;}else{__label__=1;;}
64179 $if_then$$lor_lhs_false$2:do{if(__label__==1){var $8=$end_flags;var $and=($8)&32768;var $tobool=((($and))|0)!=0;if($tobool){__label__=2;break $if_then$$lor_lhs_false$2;}
64180 $retval=0;__label__=4;break $if_then$$lor_lhs_false$2;}}while(0);if(__label__==2){$retval=1;;}
64181 var $9=$retval;STACKTOP=__stackBase__;return $9;return null;}
64182 function __Z16ChangeWordStressP10TranslatorPci($tr,$word,$new_stress){var __stackBase__=STACKTOP;STACKTOP+=248;_memset(__stackBase__,0,248);var __label__;var $tr_addr;var $word_addr;var $new_stress_addr;var $ix;var $p;var $max_stress;var $vowel_count=__stackBase__;var $stressed_syllable=__stackBase__+4;var $phonetic=__stackBase__+8;var $vowel_stress=__stackBase__+168;$tr_addr=$tr;$word_addr=$word;$new_stress_addr=$new_stress;HEAP32[(($stressed_syllable)>>2)]=0;var $arraydecay=(($phonetic)&4294967295);var $0=$word_addr;var $call=_strcpy($arraydecay,$0);var $1=$tr_addr;var $arraydecay1=(($phonetic)&4294967295);var $arraydecay2=(($vowel_stress)&4294967295);var $call3=__ZL14GetVowelStressP10TranslatorPhPaRiS3_i($1,$arraydecay1,$arraydecay2,$vowel_count,$stressed_syllable,0);$max_stress=$call3;var $2=$new_stress_addr;var $cmp=((($2))|0)>=4;$ix=1;if($cmp){__label__=2;;}else{__label__=1;;}
64183 $for_cond$$for_cond9_preheader$2:do{if(__label__==2){while(1){var $5=$ix;var $6=HEAP32[(($vowel_count)>>2)];var $cmp4=((($5))|0)<((($6))|0);if(!($cmp4)){__label__=9;break $for_cond$$for_cond9_preheader$2;}
64184 var $7=$ix;var $arrayidx=(($vowel_stress+$7)&4294967295);var $8=HEAP8[($arrayidx)];var $conv=(tempInt=(($8)),(tempInt>=128?tempInt-256:tempInt));var $9=$max_stress;var $cmp5=((($conv))|0)>=((($9))|0);if($cmp5){__label__=4;break;}
64185 var $12=$ix;var $inc=((($12)+1)&4294967295);$ix=$inc;__label__=2;continue;}
64186 var $10=$new_stress_addr;var $conv7=((($10))&255);var $11=$ix;var $arrayidx8=(($vowel_stress+$11)&4294967295);HEAP8[($arrayidx8)]=$conv7;;}
64187 else if(__label__==1){var $3=$ix;var $4=HEAP32[(($vowel_count)>>2)];var $cmp101=((($3))|0)<((($4))|0);if(!($cmp101)){__label__=9;break $for_cond$$for_cond9_preheader$2;}
64188 while(1){var $13=$ix;var $arrayidx12=(($vowel_stress+$13)&4294967295);var $14=HEAP8[($arrayidx12)];var $conv13=(tempInt=(($14)),(tempInt>=128?tempInt-256:tempInt));var $15=$new_stress_addr;var $cmp14=((($conv13))|0)>((($15))|0);if($cmp14){__label__=7;;}else{__label__=8;;}
64189 if(__label__==7){var $16=$new_stress_addr;var $conv16=((($16))&255);var $17=$ix;var $arrayidx17=(($vowel_stress+$17)&4294967295);HEAP8[($arrayidx17)]=$conv16;;}
64190 var $18=$ix;var $inc20=((($18)+1)&4294967295);$ix=$inc20;var $19=$ix;var $20=HEAP32[(($vowel_count)>>2)];var $cmp10=((($19))|0)<((($20))|0);if($cmp10){__label__=6;continue;}else{__label__=9;break $for_cond$$for_cond9_preheader$2;}}}}while(0);$ix=1;var $arraydecay23=(($phonetic)&4294967295);$p=$arraydecay23;var $21=$p;var $22=HEAPU8[($21)];var $conv242=((($22))&255);var $cmp253=((($conv242))|0)!=0;if($cmp253){__label__=10;;}else{__label__=17;;}
64191 $while_body$$while_end$15:do{if(__label__==10){$while_body$16:while(1){var $23=$p;var $24=HEAPU8[($23)];var $idxprom=((($24))&255);var $arrayidx26=((_phoneme_tab+$idxprom*4)&4294967295);var $25=HEAP32[(($arrayidx26)>>2)];var $type=(($25+11)&4294967295);var $26=HEAPU8[($type)];var $conv27=((($26))&255);var $cmp28=((($conv27))|0)==2;if($cmp28){__label__=11;;}else{__label__=16;;}
64192 $land_lhs_true$$if_end44$18:do{if(__label__==11){var $27=$p;var $28=HEAPU8[($27)];var $idxprom29=((($28))&255);var $arrayidx30=((_phoneme_tab+$idxprom29*4)&4294967295);var $29=HEAP32[(($arrayidx30)>>2)];var $phflags=(($29+4)&4294967295);var $30=HEAP32[(($phflags)>>2)];var $and=($30)&1048576;var $tobool=((($and))|0)!=0;if($tobool){__label__=16;break $land_lhs_true$$if_end44$18;}
64193 var $31=$ix;var $arrayidx32=(($vowel_stress+$31)&4294967295);var $32=HEAP8[($arrayidx32)];var $conv33=(tempInt=(($32)),(tempInt>=128?tempInt-256:tempInt));var $cmp34=((($conv33))|0)==0;if($cmp34){__label__=14;;}else{__label__=13;;}
64194 $if_then38$$lor_lhs_false$21:do{if(__label__==13){var $33=$ix;var $arrayidx35=(($vowel_stress+$33)&4294967295);var $34=HEAP8[($arrayidx35)];var $conv36=(tempInt=(($34)),(tempInt>=128?tempInt-256:tempInt));var $cmp37=((($conv36))|0)>1;if($cmp37){__label__=14;break $if_then38$$lor_lhs_false$21;}else{__label__=15;break $if_then38$$lor_lhs_false$21;}}}while(0);if(__label__==14){var $35=$ix;var $arrayidx39=(($vowel_stress+$35)&4294967295);var $36=HEAPU8[($arrayidx39)];var $idxprom40=((($36))&255);var $arrayidx41=((__ZL15stress_phonemes+$idxprom40)&4294967295);var $37=HEAP8[($arrayidx41)];var $38=$word_addr;var $incdec_ptr=(($38+1)&4294967295);$word_addr=$incdec_ptr;HEAP8[($38)]=$37;;}
64195 var $39=$ix;var $inc43=((($39)+1)&4294967295);$ix=$inc43;;}}while(0);var $40=$p;var $incdec_ptr45=(($40+1)&4294967295);$p=$incdec_ptr45;var $41=HEAP8[($40)];var $42=$word_addr;var $incdec_ptr46=(($42+1)&4294967295);$word_addr=$incdec_ptr46;HEAP8[($42)]=$41;var $43=$p;var $44=HEAPU8[($43)];var $conv24=((($44))&255);var $cmp25=((($conv24))|0)!=0;if($cmp25){__label__=10;continue $while_body$16;}else{__label__=17;break $while_body$$while_end$15;}}}}while(0);var $45=$word_addr;HEAP8[($45)]=0;STACKTOP=__stackBase__;return;return;}
64196 function __ZL14GetVowelStressP10TranslatorPhPaRiS3_i($tr,$phonemes,$vowel_stress,$vowel_count,$stressed_syllable,$control){;var __label__;var __lastLabel__=null;var $tr_addr;var $phonemes_addr;var $vowel_stress_addr;var $vowel_count_addr;var $stressed_syllable_addr;var $control_addr;var $phcode;var $ph;var $ph_out;var $count;var $max_stress;var $ix;var $j;var $stress;var $primary_posn;$tr_addr=$tr;$phonemes_addr=$phonemes;$vowel_stress_addr=$vowel_stress;$vowel_count_addr=$vowel_count;$stressed_syllable_addr=$stressed_syllable;$control_addr=$control;var $0=$phonemes_addr;$ph_out=$0;$count=1;$max_stress=-1;$stress=-1;$primary_posn=0;var $1=$vowel_stress_addr;var $arrayidx=(($1)&4294967295);HEAP8[($arrayidx)]=1;;$while_cond$2:while(1){var $2=$phonemes_addr;var $incdec_ptr=(($2+1)&4294967295);$phonemes_addr=$incdec_ptr;var $3=HEAPU8[($2)];$phcode=$3;var $conv=((($3))&255);var $cmp=((($conv))|0)!=0;if(!($cmp)){__label__=39;break $while_cond$2;}
64197 var $4=$count;var $cmp1=((($4))|0)<79;if(!($cmp1)){__label__=39;break $while_cond$2;}
64198 var $5=$phcode;var $idxprom=((($5))&255);var $arrayidx2=((_phoneme_tab+$idxprom*4)&4294967295);var $6=HEAPU32[(($arrayidx2)>>2)];$ph=$6;var $cmp3=((($6))|0)==0;if($cmp3){__label__=1;continue $while_cond$2;}
64199 var $7=$ph;var $type=(($7+11)&4294967295);var $8=HEAPU8[($type)];var $conv4=((($8))&255);var $cmp5=((($conv4))|0)==1;if($cmp5){__label__=5;;}else{__label__=24;;}
64200 $land_lhs_true$$if_end53$7:do{if(__label__==5){var $9=$ph;var $program=(($9+8)&4294967295);var $10=HEAPU16[(($program)>>1)];var $conv6=((($10))&65535);var $cmp7=((($conv6))|0)==0;if(!($cmp7)){__label__=24;break $land_lhs_true$$if_end53$7;}
64201 var $11=$phcode;var $conv9=((($11))&255);var $cmp10=((($conv9))|0)==8;if($cmp10){__label__=7;;}else{__label__=20;;}
64202 if(__label__==7){var $12=$count;var $sub=((($12)-1)&4294967295);$j=$sub;__lastLabel__=7;;$while_cond12$12:while(1){var $13=__lastLabel__==19?$dec:($sub);var $cmp13=((($13))|0)>0;if(!($cmp13)){__label__=1;continue $while_cond$2;}
64203 var $14=$stressed_syllable_addr;var $15=HEAP32[(($14)>>2)];var $cmp15=((($15))|0)==0;if(!($cmp15)){__label__=1;continue $while_cond$2;}
64204 var $16=$j;var $17=$vowel_stress_addr;var $arrayidx17=(($17+$16)&4294967295);var $18=HEAP8[($arrayidx17)];var $conv18=(tempInt=(($18)),(tempInt>=128?tempInt-256:tempInt));var $cmp19=((($conv18))|0)<4;if(!($cmp19)){__label__=1;continue $while_cond$2;}
64205 var $19=$j;var $20=$vowel_stress_addr;var $arrayidx22=(($20+$19)&4294967295);var $21=HEAP8[($arrayidx22)];var $conv23=(tempInt=(($21)),(tempInt>=128?tempInt-256:tempInt));var $cmp24=((($conv23))|0)!=0;if($cmp24){__label__=12;;}else{__label__=19;;}
64206 if(__label__==12){var $22=$j;var $23=$vowel_stress_addr;var $arrayidx26=(($23+$22)&4294967295);var $24=HEAP8[($arrayidx26)];var $conv27=(tempInt=(($24)),(tempInt>=128?tempInt-256:tempInt));var $cmp28=((($conv27))|0)!=1;if($cmp28){__label__=13;break $while_cond12$12;}}
64207 var $39=$j;var $dec=((($39)-1)&4294967295);$j=$dec;__lastLabel__=19;__label__=8;continue $while_cond12$12;}
64208 var $25=$j;var $26=$vowel_stress_addr;var $arrayidx30=(($26+$25)&4294967295);HEAP8[($arrayidx30)]=4;var $27=$max_stress;var $cmp31=((($27))|0)<4;if($cmp31){__label__=14;;}else{__label__=15;;}
64209 if(__label__==14){$max_stress=4;var $28=$j;$primary_posn=$28;;}
64210 $ix=1;var $29=$ix;var $30=$j;var $cmp344=((($29))|0)<((($30))|0);if(!($cmp344)){__label__=1;continue $while_cond$2;}
64211 while(1){var $31=$ix;var $32=$vowel_stress_addr;var $arrayidx35=(($32+$31)&4294967295);var $33=HEAP8[($arrayidx35)];var $conv36=(tempInt=(($33)),(tempInt>=128?tempInt-256:tempInt));var $cmp37=((($conv36))|0)==4;if($cmp37){__label__=17;;}else{__label__=18;;}
64212 if(__label__==17){var $34=$ix;var $35=$vowel_stress_addr;var $arrayidx39=(($35+$34)&4294967295);HEAP8[($arrayidx39)]=3;;}
64213 var $36=$ix;var $inc=((($36)+1)&4294967295);$ix=$inc;var $37=$ix;var $38=$j;var $cmp34=((($37))|0)<((($38))|0);if($cmp34){__label__=16;continue;}else{__label__=1;continue $while_cond$2;}}}
64214 else if(__label__==20){var $40=$ph;var $std_length=(($40+14)&4294967295);var $41=HEAPU8[($std_length)];var $conv42=((($41))&255);var $cmp43=((($conv42))|0)<4;if($cmp43){__label__=22;;}else{__label__=21;;}
64215 if(__label__==21){var $42=$stressed_syllable_addr;var $43=HEAP32[(($42)>>2)];var $cmp44=((($43))|0)==0;if(!($cmp44)){__label__=1;continue $while_cond$2;}}
64216 var $44=$ph;var $std_length46=(($44+14)&4294967295);var $45=HEAPU8[($std_length46)];var $conv47=((($45))&255);$stress=$conv47;var $46=$stress;var $47=$max_stress;var $cmp48=((($46))|0)>((($47))|0);if(!($cmp48)){__label__=1;continue $while_cond$2;}
64217 var $48=$stress;$max_stress=$48;__label__=1;continue $while_cond$2;}}}while(0);var $49=$ph;var $type54=(($49+11)&4294967295);var $50=HEAPU8[($type54)];var $conv55=((($50))&255);var $cmp56=((($conv55))|0)==2;if($cmp56){__label__=25;;}else{__label__=34;;}
64218 $land_lhs_true57$$if_else78$35:do{if(__label__==25){var $51=$ph;var $phflags=(($51+4)&4294967295);var $52=HEAP32[(($phflags)>>2)];var $and=($52)&1048576;var $tobool=((($and))|0)!=0;if($tobool){__label__=34;break $land_lhs_true57$$if_else78$35;}
64219 var $53=$stress;var $conv59=((($53))&255);var $54=$count;var $55=$vowel_stress_addr;var $arrayidx60=(($55+$54)&4294967295);HEAP8[($arrayidx60)]=$conv59;var $56=$stress;var $cmp61=((($56))|0)>=4;if($cmp61){__lastLabel__=26;__label__=27;;}else{__lastLabel__=26;__label__=29;;}
64220 $land_lhs_true62$$if_end65$38:do{if(__label__==27){var $57=$stress;var $58=$max_stress;var $cmp63=((($57))|0)>=((($58))|0);if($cmp63){__lastLabel__=27;;}else{__lastLabel__=27;__label__=29;break $land_lhs_true62$$if_end65$38;}
64221 var $59=$count;$primary_posn=$59;var $60=$stress;$max_stress=$60;__lastLabel__=28;;}}while(0);var $61=__lastLabel__==28?$60:(__lastLabel__==27?$57:($56));var $cmp66=((($61))|0)<0;if($cmp66){__label__=30;;}else{__label__=33;;}
64222 $land_lhs_true67$$if_end76$42:do{if(__label__==30){var $62=$control_addr;var $and68=($62)&1;var $tobool69=((($and68))|0)!=0;if(!($tobool69)){__label__=33;break $land_lhs_true67$$if_end76$42;}
64223 var $63=$ph;var $phflags71=(($63+4)&4294967295);var $64=HEAP32[(($phflags71)>>2)];var $and72=($64)&2;var $tobool73=((($and72))|0)!=0;if(!($tobool73)){__label__=33;break $land_lhs_true67$$if_end76$42;}
64224 var $65=$count;var $66=$vowel_stress_addr;var $arrayidx75=(($66+$65)&4294967295);HEAP8[($arrayidx75)]=1;;}}while(0);var $67=$count;var $inc77=((($67)+1)&4294967295);$count=$inc77;$stress=-1;__label__=38;break $land_lhs_true57$$if_else78$35;}}while(0);$if_else78$$if_end93$47:do{if(__label__==34){var $68=$phcode;var $conv79=((($68))&255);var $cmp80=((($conv79))|0)==20;if(!($cmp80)){__label__=38;break $if_else78$$if_end93$47;}
64225 var $69=$stress;var $conv82=((($69))&255);var $70=$count;var $71=$vowel_stress_addr;var $arrayidx83=(($71+$70)&4294967295);HEAP8[($arrayidx83)]=$conv82;var $72=$stress;var $cmp84=((($72))|0)==0;if(!($cmp84)){__label__=38;break $if_else78$$if_end93$47;}
64226 var $73=$control_addr;var $and86=($73)&1;var $tobool87=((($and86))|0)!=0;if(!($tobool87)){__label__=38;break $if_else78$$if_end93$47;}
64227 var $74=$count;var $inc89=((($74)+1)&4294967295);$count=$inc89;var $75=$vowel_stress_addr;var $arrayidx90=(($75+$74)&4294967295);HEAP8[($arrayidx90)]=1;;}}while(0);var $76=$phcode;var $77=$ph_out;var $incdec_ptr94=(($77+1)&4294967295);$ph_out=$incdec_ptr94;HEAP8[($77)]=$76;__label__=1;continue $while_cond$2;}
64228 var $78=$count;var $79=$vowel_stress_addr;var $arrayidx96=(($79+$78)&4294967295);HEAP8[($arrayidx96)]=1;var $80=$ph_out;HEAP8[($80)]=0;var $81=$stressed_syllable_addr;var $82=HEAP32[(($81)>>2)];var $cmp97=((($82))|0)>0;if($cmp97){__label__=40;;}else{__label__=43;;}
64229 $if_then98$$if_end104$54:do{if(__label__==40){var $83=$stressed_syllable_addr;var $84=HEAP32[(($83)>>2)];var $85=$count;var $cmp99=((($84))|0)>=((($85))|0);if($cmp99){__label__=41;;}else{__label__=42;;}
64230 if(__label__==41){var $86=$count;var $sub101=((($86)-1)&4294967295);var $87=$stressed_syllable_addr;HEAP32[(($87)>>2)]=$sub101;;}
64231 var $88=$stressed_syllable_addr;var $89=HEAP32[(($88)>>2)];var $90=$vowel_stress_addr;var $arrayidx103=(($90+$89)&4294967295);HEAP8[($arrayidx103)]=4;$max_stress=4;var $91=$stressed_syllable_addr;var $92=HEAP32[(($91)>>2)];$primary_posn=$92;;}
64232 else if(__label__==43){var $_pr=$max_stress;var $cmp105=((($_pr))|0)==5;if(!($cmp105)){__label__=53;break $if_then98$$if_end104$54;}
64233 $ix=1;var $93=$ix;var $94=$count;var $cmp1083=((($93))|0)<((($94))|0);if($cmp1083){__label__=45;;}else{__label__=52;;}
64234 $for_body109$$for_end130$61:do{if(__label__==45){while(1){var $95=$ix;var $96=$vowel_stress_addr;var $arrayidx110=(($96+$95)&4294967295);var $97=HEAP8[($arrayidx110)];var $conv111=(tempInt=(($97)),(tempInt>=128?tempInt-256:tempInt));var $cmp112=((($conv111))|0)==4;if($cmp112){__label__=46;;}else{__label__=49;;}
64235 if(__label__==46){var $98=$tr_addr;var $langopts=(($98)&4294967295);var $stress_flags=(($langopts+12)&4294967295);var $99=HEAP32[(($stress_flags)>>2)];var $and114=($99)&131072;var $tobool115=((($and114))|0)!=0;var $100=$ix;var $101=$vowel_stress_addr;var $arrayidx117=(($101+$100)&4294967295);if($tobool115){__label__=47;;}else{__label__=48;;}
64236 if(__label__==47){HEAP8[($arrayidx117)]=1;;}
64237 else if(__label__==48){HEAP8[($arrayidx117)]=3;;}}
64238 var $102=$ix;var $103=$vowel_stress_addr;var $arrayidx122=(($103+$102)&4294967295);var $104=HEAP8[($arrayidx122)];var $conv123=(tempInt=(($104)),(tempInt>=128?tempInt-256:tempInt));var $cmp124=((($conv123))|0)==5;if($cmp124){__label__=50;;}else{__label__=51;;}
64239 if(__label__==50){var $105=$ix;var $106=$vowel_stress_addr;var $arrayidx126=(($106+$105)&4294967295);HEAP8[($arrayidx126)]=4;var $107=$ix;$primary_posn=$107;;}
64240 var $108=$ix;var $inc129=((($108)+1)&4294967295);$ix=$inc129;var $109=$ix;var $110=$count;var $cmp108=((($109))|0)<((($110))|0);if($cmp108){__label__=45;continue;}else{__label__=52;break $for_body109$$for_end130$61;}}}}while(0);$max_stress=4;;}}while(0);var $111=$primary_posn;var $112=$stressed_syllable_addr;HEAP32[(($112)>>2)]=$111;var $113=$count;var $114=$vowel_count_addr;HEAP32[(($114)>>2)]=$113;var $115=$max_stress;;return $115;return null;}
64241 function __Z13SetWordStressP10TranslatorPcPjii($tr,$output,$dictionary_flags,$tonic,$control){var __stackBase__=STACKTOP;STACKTOP+=408;_memset(__stackBase__,0,408);var __label__;var __lastLabel__=null;var $tr_addr;var $output_addr;var $dictionary_flags_addr;var $tonic_addr;var $control_addr;var $phcode;var $p;var $ph;var $stress;var $max_stress;var $vowel_count=__stackBase__;var $ix;var $v;var $v_stress;var $stressed_syllable=__stackBase__+4;var $max_stress_posn;var $unstressed_word;var $max_output;var $final_ph;var $final_ph2;var $mnem;var $mnem2;var $post_tonic;var $opt_length;var $done;var $stressflags;var $dflags;var $first_primary;var $vowel_stress=__stackBase__+8;var $syllable_weight=__stackBase__+88;var $vowel_length=__stackBase__+168;var $phonetic=__stackBase__+248;var $weight;var $lengthened;var $wt;var $max_weight;var $prev_stressed;var $shorten;$tr_addr=$tr;$output_addr=$output;$dictionary_flags_addr=$dictionary_flags;$tonic_addr=$tonic;$control_addr=$control;$unstressed_word=0;$dflags=0;var $0=$tr_addr;var $langopts=(($0)&4294967295);var $stress_flags=(($langopts+12)&4294967295);var $1=HEAP32[(($stress_flags)>>2)];$stressflags=$1;var $2=$dictionary_flags_addr;var $cmp=((($2))|0)!=0;if($cmp){__label__=1;;}else{__label__=2;;}
64242 if(__label__==1){var $3=$dictionary_flags_addr;var $arrayidx=(($3)&4294967295);var $4=HEAP32[(($arrayidx)>>2)];$dflags=$4;;}
64243 $ix=0;__lastLabel__=2;;$for_cond$5:while(1){var $5=__lastLabel__==7?$inc:(0);var $cmp1=((($5))|0)<160;var $6=$ix;if($cmp1){__lastLabel__=3;;}else{__lastLabel__=3;__label__=8;break $for_cond$5;}
64244 var $7=$output_addr;var $arrayidx2=(($7+$6)&4294967295);var $8=HEAP8[($arrayidx2)];var $9=$ix;var $arrayidx3=(($phonetic+$9)&4294967295);HEAP8[($arrayidx3)]=$8;var $10=$ix;var $arrayidx4=(($phonetic+$10)&4294967295);var $11=HEAPU8[($arrayidx4)];var $conv=((($11))&255);var $12=HEAP32[((_n_phoneme_tab)>>2)];var $cmp5=((($conv))|0)>=((($12))|0);if($cmp5){__label__=5;;}else{__label__=6;;}
64245 if(__label__==5){var $13=$ix;var $arrayidx7=(($phonetic+$13)&4294967295);HEAP8[($arrayidx7)]=13;;}
64246 var $14=$ix;var $arrayidx9=(($phonetic+$14)&4294967295);var $15=HEAPU8[($arrayidx9)];var $conv10=((($15))&255);var $cmp11=((($conv10))|0)==0;if($cmp11){__lastLabel__=6;__label__=8;break $for_cond$5;}else{__lastLabel__=6;;}
64247 var $16=$ix;var $inc=((($16)+1)&4294967295);$ix=$inc;__lastLabel__=7;__label__=3;continue $for_cond$5;}
64248 var $17=__lastLabel__==6?$14:($6);var $cmp14=((($17))|0)==0;if($cmp14){__label__=223;;}else{__label__=9;;}
64249 if(__label__==9){var $18=$ix;var $sub=((($18)-1)&4294967295);var $arrayidx17=(($phonetic+$sub)&4294967295);var $19=HEAPU8[($arrayidx17)];var $conv18=((($19))&255);$final_ph=$conv18;var $20=$ix;var $sub19=((($20)-2)&4294967295);var $arrayidx20=(($phonetic+$sub19)&4294967295);var $21=HEAPU8[($arrayidx20)];var $conv21=((($21))&255);$final_ph2=$conv21;var $22=$output_addr;var $add_ptr=(($22+157)&4294967295);$max_output=$add_ptr;var $23=$dflags;var $and=($23)&7;HEAP32[(($stressed_syllable)>>2)]=$and;var $24=$dflags;var $and22=($24)&8;var $tobool=((($and22))|0)!=0;if($tobool){__label__=10;;}else{__label__=11;;}
64250 if(__label__==10){var $25=$dflags;var $and24=($25)&3;HEAP32[(($stressed_syllable)>>2)]=$and24;$unstressed_word=1;;}
64251 var $26=$tr_addr;var $arraydecay=(($phonetic)&4294967295);var $arraydecay26=(($vowel_stress)&4294967295);var $call=__ZL14GetVowelStressP10TranslatorPhPaRiS3_i($26,$arraydecay,$arraydecay26,$vowel_count,$stressed_syllable,1);$max_stress=$call;var $cmp27=((($call))|0)<0;if($cmp27){__label__=12;;}else{__label__=17;;}
64252 $land_lhs_true$$if_end40$18:do{if(__label__==12){var $27=$dictionary_flags_addr;var $tobool28=((($27))|0)!=0;if(!($tobool28)){__label__=17;break $land_lhs_true$$if_end40$18;}
64253 var $28=$tr_addr;var $langopts30=(($28)&4294967295);var $stress_flags31=(($langopts30+12)&4294967295);var $29=HEAP32[(($stress_flags31)>>2)];var $and32=($29)&1;var $tobool33=((($and32))|0)!=0;if($tobool33){__label__=14;;}else{__label__=16;;}
64254 $land_lhs_true34$$if_end39$21:do{if(__label__==14){var $30=HEAP32[(($vowel_count)>>2)];var $cmp35=((($30))|0)==2;if(!($cmp35)){__label__=16;break $land_lhs_true34$$if_end39$21;}
64255 var $arrayidx37=(($vowel_stress+1)&4294967295);HEAP8[($arrayidx37)]=0;var $31=$dictionary_flags_addr;var $arrayidx38=(($31)&4294967295);var $32=HEAP32[(($arrayidx38)>>2)];var $or=($32)|4096;HEAP32[(($arrayidx38)>>2)]=$or;;}}while(0);$max_stress=0;;}}while(0);$ix=1;var $arraydecay41=(($phonetic)&4294967295);$p=$arraydecay41;var $33=$p;var $34=HEAPU8[($33)];var $conv4319=((($34))&255);var $cmp4420=((($conv4319))|0)!=0;if($cmp4420){__label__=18;;}else{__label__=33;;}
64256 $for_body45$$for_end109$26:do{if(__label__==18){$for_body45$27:while(1){var $35=$p;var $arrayidx46=(($35)&4294967295);var $36=HEAPU8[($arrayidx46)];var $idxprom=((($36))&255);var $arrayidx47=((_phoneme_tab+$idxprom*4)&4294967295);var $37=HEAP32[(($arrayidx47)>>2)];var $type=(($37+11)&4294967295);var $38=HEAPU8[($type)];var $conv48=((($38))&255);var $cmp49=((($conv48))|0)==2;if($cmp49){__label__=19;;}else{__label__=32;;}
64257 $land_lhs_true50$$for_inc107$29:do{if(__label__==19){var $39=$p;var $arrayidx51=(($39)&4294967295);var $40=HEAPU8[($arrayidx51)];var $idxprom52=((($40))&255);var $arrayidx53=((_phoneme_tab+$idxprom52*4)&4294967295);var $41=HEAP32[(($arrayidx53)>>2)];var $phflags=(($41+4)&4294967295);var $42=HEAP32[(($phflags)>>2)];var $and54=($42)&1048576;var $tobool55=((($and54))|0)!=0;if($tobool55){__label__=32;break $land_lhs_true50$$for_inc107$29;}
64258 $weight=0;$lengthened=0;var $43=$p;var $arrayidx57=(($43+1)&4294967295);var $44=HEAPU8[($arrayidx57)];var $idxprom58=((($44))&255);var $arrayidx59=((_phoneme_tab+$idxprom58*4)&4294967295);var $45=HEAP32[(($arrayidx59)>>2)];var $code=(($45+10)&4294967295);var $46=HEAPU8[($code)];var $conv60=((($46))&255);var $cmp61=((($conv60))|0)==12;if($cmp61){__label__=21;;}else{__label__=22;;}
64259 $if_end63_thread$$if_end63$32:do{if(__label__==21){$lengthened=1;__label__=24;break $if_end63_thread$$if_end63$32;}
64260 else if(__label__==22){var $_pr3=$lengthened;var $tobool64=((($_pr3))|0)!=0;if($tobool64){__label__=24;break $if_end63_thread$$if_end63$32;}
64261 var $47=$p;var $arrayidx65=(($47)&4294967295);var $48=HEAPU8[($arrayidx65)];var $idxprom66=((($48))&255);var $arrayidx67=((_phoneme_tab+$idxprom66*4)&4294967295);var $49=HEAP32[(($arrayidx67)>>2)];var $phflags68=(($49+4)&4294967295);var $50=HEAP32[(($phflags68)>>2)];var $and69=($50)&2097152;var $tobool70=((($and69))|0)!=0;if($tobool70){__label__=24;break $if_end63_thread$$if_end63$32;}else{__label__=25;break $if_end63_thread$$if_end63$32;}}}while(0);if(__label__==24){var $51=$weight;var $inc72=((($51)+1)&4294967295);$weight=$inc72;;}
64262 var $52=$weight;var $conv74=((($52))&255);var $53=$ix;var $arrayidx75=(($vowel_length+$53)&4294967295);HEAP8[($arrayidx75)]=$conv74;var $54=$lengthened;var $tobool76=((($54))|0)!=0;if($tobool76){__label__=26;;}else{__label__=27;;}
64263 if(__label__==26){var $55=$p;var $incdec_ptr=(($55+1)&4294967295);$p=$incdec_ptr;;}
64264 var $56=$p;var $arrayidx79=(($56+1)&4294967295);var $57=HEAPU8[($arrayidx79)];var $idxprom80=((($57))&255);var $arrayidx81=((_phoneme_tab+$idxprom80*4)&4294967295);var $58=HEAP32[(($arrayidx81)>>2)];var $type82=(($58+11)&4294967295);var $59=HEAPU8[($type82)];var $idxprom83=((($59))&255);var $arrayidx84=((__ZZ13SetWordStressP10TranslatorPcPjiiE15consonant_types+$idxprom83)&4294967295);var $60=HEAP8[($arrayidx84)];var $tobool85=(tempInt=(($60)),(tempInt>=128?tempInt-256:tempInt))!=0;if($tobool85){__label__=28;;}else{__label__=31;;}
64265 $land_lhs_true86$$if_end102$42:do{if(__label__==28){var $61=$p;var $arrayidx87=(($61+2)&4294967295);var $62=HEAPU8[($arrayidx87)];var $idxprom88=((($62))&255);var $arrayidx89=((_phoneme_tab+$idxprom88*4)&4294967295);var $63=HEAP32[(($arrayidx89)>>2)];var $type90=(($63+11)&4294967295);var $64=HEAPU8[($type90)];var $conv91=((($64))&255);var $cmp92=((($conv91))|0)!=2;if($cmp92){__label__=30;;}else{__label__=29;;}
64266 if(__label__==29){var $65=$p;var $arrayidx94=(($65+1)&4294967295);var $66=HEAPU8[($arrayidx94)];var $idxprom95=((($66))&255);var $arrayidx96=((_phoneme_tab+$idxprom95*4)&4294967295);var $67=HEAP32[(($arrayidx96)>>2)];var $phflags97=(($67+4)&4294967295);var $68=HEAP32[(($phflags97)>>2)];var $and98=($68)&2097152;var $tobool99=((($and98))|0)!=0;if(!($tobool99)){__label__=31;break $land_lhs_true86$$if_end102$42;}}
64267 var $69=$weight;var $inc101=((($69)+1)&4294967295);$weight=$inc101;;}}while(0);var $70=$weight;var $conv103=((($70))&255);var $71=$ix;var $arrayidx104=(($syllable_weight+$71)&4294967295);HEAP8[($arrayidx104)]=$conv103;var $72=$ix;var $inc105=((($72)+1)&4294967295);$ix=$inc105;;}}while(0);var $73=$p;var $incdec_ptr108=(($73+1)&4294967295);$p=$incdec_ptr108;var $74=$p;var $75=HEAPU8[($74)];var $conv43=((($75))&255);var $cmp44=((($conv43))|0)!=0;if($cmp44){__label__=18;continue $for_body45$27;}else{__label__=33;break $for_body45$$for_end109$26;}}}}while(0);var $76=$tr_addr;var $langopts110=(($76)&4294967295);var $stress_rule=(($langopts110+8)&4294967295);var $77=HEAP32[(($stress_rule)>>2)];if($77==8){__label__=34;;}
64268 else if($77==1){__label__=36;;}
64269 else if($77==10){__label__=41;;}
64270 else if($77==2){__label__=44;;}
64271 else if($77==3){__label__=68;;}
64272 else if($77==4){__label__=75;;}
64273 else if($77==5){__label__=81;;}
64274 else if($77==6){__label__=89;;}
64275 else if($77==7){__label__=101;;}
64276 else if($77==9){__label__=108;;}
64277 else{__label__=112;;}
64278 $sw_epilog$$sw_bb$$sw_bb120$$sw_bb130$$sw_bb139$$sw_bb228$$sw_bb242$$sw_bb254$$sw_bb283$$sw_bb318$$sw_bb336$50:do{if(__label__==34){var $arrayidx111=(($syllable_weight+1)&4294967295);var $78=HEAP8[($arrayidx111)];var $conv112=(tempInt=(($78)),(tempInt>=128?tempInt-256:tempInt));var $cmp113=((($conv112))|0)>0;if($cmp113){__label__=112;break $sw_epilog$$sw_bb$$sw_bb120$$sw_bb130$$sw_bb139$$sw_bb228$$sw_bb242$$sw_bb254$$sw_bb283$$sw_bb318$$sw_bb336$50;}
64279 var $arrayidx115=(($syllable_weight+2)&4294967295);var $79=HEAP8[($arrayidx115)];var $conv116=(tempInt=(($79)),(tempInt>=128?tempInt-256:tempInt));var $cmp117=((($conv116))|0)==0;if($cmp117){__label__=112;break $sw_epilog$$sw_bb$$sw_bb120$$sw_bb130$$sw_bb139$$sw_bb228$$sw_bb242$$sw_bb254$$sw_bb283$$sw_bb318$$sw_bb336$50;}else{__label__=36;break $sw_epilog$$sw_bb$$sw_bb120$$sw_bb130$$sw_bb139$$sw_bb228$$sw_bb242$$sw_bb254$$sw_bb283$$sw_bb318$$sw_bb336$50;}}
64280 else if(__label__==41){var $84=HEAP32[(($stressed_syllable)>>2)];var $cmp131=((($84))|0)==0;if(!($cmp131)){__label__=112;break $sw_epilog$$sw_bb$$sw_bb120$$sw_bb130$$sw_bb139$$sw_bb228$$sw_bb242$$sw_bb254$$sw_bb283$$sw_bb318$$sw_bb336$50;}
64281 var $85=HEAP32[(($vowel_count)>>2)];var $cmp133=((($85))|0)<4;if(!($cmp133)){__label__=44;break $sw_epilog$$sw_bb$$sw_bb120$$sw_bb130$$sw_bb139$$sw_bb228$$sw_bb242$$sw_bb254$$sw_bb283$$sw_bb318$$sw_bb336$50;}
64282 var $86=HEAP32[(($vowel_count)>>2)];var $sub135=((($86)-1)&4294967295);var $arrayidx136=(($vowel_stress+$sub135)&4294967295);HEAP8[($arrayidx136)]=4;$max_stress=4;__label__=114;break $sw_epilog$$sw_bb$$sw_bb120$$sw_bb130$$sw_bb139$$sw_bb228$$sw_bb242$$sw_bb254$$sw_bb283$$sw_bb318$$sw_bb336$50;}
64283 else if(__label__==68){var $129=HEAP32[(($stressed_syllable)>>2)];var $cmp229=((($129))|0)==0;if(!($cmp229)){__label__=112;break $sw_epilog$$sw_bb$$sw_bb120$$sw_bb130$$sw_bb139$$sw_bb228$$sw_bb242$$sw_bb254$$sw_bb283$$sw_bb318$$sw_bb336$50;}
64284 var $130=HEAP32[(($vowel_count)>>2)];var $sub231=((($130)-1)&4294967295);HEAP32[(($stressed_syllable)>>2)]=$sub231;__lastLabel__=69;;while(1){var $131=__lastLabel__==73?$dec239:($sub231);var $cmp232=((($131))|0)>0;if(!($cmp232)){__label__=74;break;}
64285 var $132=HEAP32[(($stressed_syllable)>>2)];var $arrayidx233=(($vowel_stress+$132)&4294967295);var $133=HEAP8[($arrayidx233)];var $conv234=(tempInt=(($133)),(tempInt>=128?tempInt-256:tempInt));var $cmp235=((($conv234))|0)<0;var $134=HEAP32[(($stressed_syllable)>>2)];if($cmp235){__label__=72;break;}
64286 var $dec239=((($134)-1)&4294967295);HEAP32[(($stressed_syllable)>>2)]=$dec239;__lastLabel__=73;__label__=70;continue;}
64287 if(__label__==72){var $arrayidx237=(($vowel_stress+$134)&4294967295);HEAP8[($arrayidx237)]=4;;}
64288 $max_stress=4;__label__=114;break $sw_epilog$$sw_bb$$sw_bb120$$sw_bb130$$sw_bb139$$sw_bb228$$sw_bb242$$sw_bb254$$sw_bb283$$sw_bb318$$sw_bb336$50;}
64289 else if(__label__==75){var $135=HEAP32[(($stressed_syllable)>>2)];var $cmp243=((($135))|0)==0;if(!($cmp243)){__label__=112;break $sw_epilog$$sw_bb$$sw_bb120$$sw_bb130$$sw_bb139$$sw_bb228$$sw_bb242$$sw_bb254$$sw_bb283$$sw_bb318$$sw_bb336$50;}
64290 var $136=HEAP32[(($vowel_count)>>2)];var $sub245=((($136)-3)&4294967295);HEAP32[(($stressed_syllable)>>2)]=$sub245;var $137=HEAP32[(($stressed_syllable)>>2)];var $cmp246=((($137))|0)<1;if($cmp246){__label__=77;;}else{__label__=78;;}
64291 if(__label__==77){HEAP32[(($stressed_syllable)>>2)]=1;;}
64292 var $138=$max_stress;var $cmp249=((($138))|0)==0;if($cmp249){__label__=79;;}else{__label__=80;;}
64293 if(__label__==79){var $139=HEAP32[(($stressed_syllable)>>2)];var $arrayidx251=(($vowel_stress+$139)&4294967295);HEAP8[($arrayidx251)]=4;;}
64294 $max_stress=4;__label__=114;break $sw_epilog$$sw_bb$$sw_bb120$$sw_bb130$$sw_bb139$$sw_bb228$$sw_bb242$$sw_bb254$$sw_bb283$$sw_bb318$$sw_bb336$50;}
64295 else if(__label__==81){var $140=HEAP32[(($stressed_syllable)>>2)];var $cmp255=((($140))|0)==0;if(!($cmp255)){__label__=112;break $sw_epilog$$sw_bb$$sw_bb120$$sw_bb130$$sw_bb139$$sw_bb228$$sw_bb242$$sw_bb254$$sw_bb283$$sw_bb318$$sw_bb336$50;}
64296 var $141=HEAP32[(($vowel_count)>>2)];var $sub257=((($141)-3)&4294967295);HEAP32[(($stressed_syllable)>>2)]=$sub257;var $142=HEAP32[(($vowel_count)>>2)];var $cmp258=((($142))|0)<16;if($cmp258){__label__=83;;}else{__label__=88;;}
64297 if(__label__==83){var $143=$final_ph;var $arrayidx260=((_phoneme_tab+$143*4)&4294967295);var $144=HEAP32[(($arrayidx260)>>2)];var $type261=(($144+11)&4294967295);var $145=HEAPU8[($type261)];var $conv262=((($145))&255);var $cmp263=((($conv262))|0)==2;if($cmp263){__label__=84;;}else{__label__=85;;}
64298 if(__label__==84){var $146=HEAP32[(($vowel_count)>>2)];var $arrayidx265=((__ZZ13SetWordStressP10TranslatorPcPjiiE10guess_ru_v+$146)&4294967295);var $147=HEAP8[($arrayidx265)];var $conv266=(tempInt=(($147)),(tempInt>=128?tempInt-256:tempInt));HEAP32[(($stressed_syllable)>>2)]=$conv266;;}
64299 else if(__label__==85){var $148=$final_ph;var $arrayidx268=((_phoneme_tab+$148*4)&4294967295);var $149=HEAP32[(($arrayidx268)>>2)];var $type269=(($149+11)&4294967295);var $150=HEAPU8[($type269)];var $conv270=((($150))&255);var $cmp271=((($conv270))|0)==4;var $151=HEAP32[(($vowel_count)>>2)];if($cmp271){__label__=86;;}else{__label__=87;;}
64300 if(__label__==86){var $arrayidx273=((__ZZ13SetWordStressP10TranslatorPcPjiiE10guess_ru_t+$151)&4294967295);var $152=HEAP8[($arrayidx273)];var $conv274=(tempInt=(($152)),(tempInt>=128?tempInt-256:tempInt));HEAP32[(($stressed_syllable)>>2)]=$conv274;;}
64301 else if(__label__==87){var $arrayidx276=((__ZZ13SetWordStressP10TranslatorPcPjiiE8guess_ru+$151)&4294967295);var $153=HEAP8[($arrayidx276)];var $conv277=(tempInt=(($153)),(tempInt>=128?tempInt-256:tempInt));HEAP32[(($stressed_syllable)>>2)]=$conv277;;}}}
64302 var $154=HEAP32[(($stressed_syllable)>>2)];var $arrayidx281=(($vowel_stress+$154)&4294967295);HEAP8[($arrayidx281)]=4;$max_stress=4;__label__=114;break $sw_epilog$$sw_bb$$sw_bb120$$sw_bb130$$sw_bb139$$sw_bb228$$sw_bb242$$sw_bb254$$sw_bb283$$sw_bb318$$sw_bb336$50;}
64303 else if(__label__==89){var $155=HEAP32[(($stressed_syllable)>>2)];var $cmp284=((($155))|0)==0;if(!($cmp284)){__label__=112;break $sw_epilog$$sw_bb$$sw_bb120$$sw_bb130$$sw_bb139$$sw_bb228$$sw_bb242$$sw_bb254$$sw_bb283$$sw_bb318$$sw_bb336$50;}
64304 $max_weight=-1;$ix=1;var $156=$ix;var $157=HEAP32[(($vowel_count)>>2)];var $sub28714=((($157)-1)&4294967295);var $cmp28815=((($156))|0)<((($sub28714))|0);if($cmp28815){__label__=91;;}else{__label__=95;;}
64305 $for_body289$$for_end302$86:do{if(__label__==91){$for_body289$87:while(1){var $158=$ix;var $arrayidx290=(($vowel_stress+$158)&4294967295);var $159=HEAP8[($arrayidx290)];var $conv291=(tempInt=(($159)),(tempInt>=128?tempInt-256:tempInt));var $cmp292=((($conv291))|0)<0;if($cmp292){__label__=92;;}else{__label__=94;;}
64306 $if_then293$$for_inc300$89:do{if(__label__==92){var $160=$ix;var $arrayidx294=(($syllable_weight+$160)&4294967295);var $161=HEAP8[($arrayidx294)];var $conv295=(tempInt=(($161)),(tempInt>=128?tempInt-256:tempInt));$wt=$conv295;var $162=$max_weight;var $cmp296=((($conv295))|0)>=((($162))|0);if(!($cmp296)){__label__=94;break $if_then293$$for_inc300$89;}
64307 var $163=$wt;$max_weight=$163;var $164=HEAP32[(($stressed_syllable)>>2)];$prev_stressed=$164;var $165=$ix;HEAP32[(($stressed_syllable)>>2)]=$165;;}}while(0);var $166=$ix;var $inc301=((($166)+1)&4294967295);$ix=$inc301;var $167=$ix;var $168=HEAP32[(($vowel_count)>>2)];var $sub287=((($168)-1)&4294967295);var $cmp288=((($167))|0)<((($sub287))|0);if($cmp288){__label__=91;continue $for_body289$87;}else{__label__=95;break $for_body289$$for_end302$86;}}}}while(0);var $169=HEAP32[(($vowel_count)>>2)];var $sub303=((($169)-1)&4294967295);var $arrayidx304=(($syllable_weight+$sub303)&4294967295);var $170=HEAP8[($arrayidx304)];var $conv305=(tempInt=(($170)),(tempInt>=128?tempInt-256:tempInt));var $cmp306=((($conv305))|0)==2;var $171=$max_weight;if($cmp306){__label__=96;;}else{__label__=98;;}
64308 $land_lhs_true307$$if_else311$94:do{if(__label__==96){var $cmp308=((($171))|0)<2;if(!($cmp308)){__label__=100;break $land_lhs_true307$$if_else311$94;}
64309 var $172=HEAP32[(($vowel_count)>>2)];var $sub310=((($172)-1)&4294967295);HEAP32[(($stressed_syllable)>>2)]=$sub310;;}
64310 else if(__label__==98){var $cmp312=((($171))|0)<=0;if(!($cmp312)){__label__=100;break $land_lhs_true307$$if_else311$94;}
64311 HEAP32[(($stressed_syllable)>>2)]=1;;}}while(0);var $173=HEAP32[(($stressed_syllable)>>2)];var $arrayidx316=(($vowel_stress+$173)&4294967295);HEAP8[($arrayidx316)]=4;$max_stress=4;__label__=114;break $sw_epilog$$sw_bb$$sw_bb120$$sw_bb130$$sw_bb139$$sw_bb228$$sw_bb242$$sw_bb254$$sw_bb283$$sw_bb318$$sw_bb336$50;}
64312 else if(__label__==101){var $174=HEAP32[(($stressed_syllable)>>2)];var $cmp319=((($174))|0)==0;if(!($cmp319)){__label__=112;break $sw_epilog$$sw_bb$$sw_bb120$$sw_bb130$$sw_bb139$$sw_bb228$$sw_bb242$$sw_bb254$$sw_bb283$$sw_bb318$$sw_bb336$50;}
64313 var $175=HEAP32[(($vowel_count)>>2)];var $sub321=((($175)-1)&4294967295);HEAP32[(($stressed_syllable)>>2)]=$sub321;$ix=1;;while(1){var $176=$ix;var $177=HEAP32[(($vowel_count)>>2)];var $cmp323=((($176))|0)<((($177))|0);if(!($cmp323)){__label__=107;break;}
64314 var $178=$ix;var $arrayidx325=(($vowel_stress+$178)&4294967295);var $179=HEAP8[($arrayidx325)];var $conv326=(tempInt=(($179)),(tempInt>=128?tempInt-256:tempInt));var $cmp327=((($conv326))|0)==1;var $180=$ix;if($cmp327){__label__=105;break;}
64315 var $inc332=((($180)+1)&4294967295);$ix=$inc332;__label__=103;continue;}
64316 if(__label__==105){var $sub329=((($180)-1)&4294967295);HEAP32[(($stressed_syllable)>>2)]=$sub329;;}
64317 var $181=HEAP32[(($stressed_syllable)>>2)];var $arrayidx334=(($vowel_stress+$181)&4294967295);HEAP8[($arrayidx334)]=4;$max_stress=4;__label__=114;break $sw_epilog$$sw_bb$$sw_bb120$$sw_bb130$$sw_bb139$$sw_bb228$$sw_bb242$$sw_bb254$$sw_bb283$$sw_bb318$$sw_bb336$50;}
64318 else if(__label__==108){$ix=1;var $182=$ix;var $183=HEAP32[(($vowel_count)>>2)];var $cmp33813=((($182))|0)<((($183))|0);if(!($cmp33813)){__label__=112;break $sw_epilog$$sw_bb$$sw_bb120$$sw_bb130$$sw_bb139$$sw_bb228$$sw_bb242$$sw_bb254$$sw_bb283$$sw_bb318$$sw_bb336$50;}
64319 while(1){var $184=$ix;var $arrayidx340=(($vowel_stress+$184)&4294967295);var $185=HEAP8[($arrayidx340)];var $conv341=(tempInt=(($185)),(tempInt>=128?tempInt-256:tempInt));var $cmp342=((($conv341))|0)<0;if($cmp342){__label__=110;;}else{__label__=111;;}
64320 if(__label__==110){var $186=$ix;var $arrayidx344=(($vowel_stress+$186)&4294967295);HEAP8[($arrayidx344)]=4;;}
64321 var $187=$ix;var $inc347=((($187)+1)&4294967295);$ix=$inc347;var $188=$ix;var $189=HEAP32[(($vowel_count)>>2)];var $cmp338=((($188))|0)<((($189))|0);if($cmp338){__label__=109;continue;}else{__label__=112;break $sw_epilog$$sw_bb$$sw_bb120$$sw_bb130$$sw_bb139$$sw_bb228$$sw_bb242$$sw_bb254$$sw_bb283$$sw_bb318$$sw_bb336$50;}}}}while(0);$sw_epilog$$sw_bb120$$if_else351$$sw_bb139$115:do{if(__label__==36){var $80=HEAP32[(($stressed_syllable)>>2)];var $cmp121=((($80))|0)==0;if(!($cmp121)){__label__=112;break $sw_epilog$$sw_bb120$$if_else351$$sw_bb139$115;}
64322 var $81=HEAP32[(($vowel_count)>>2)];var $cmp123=((($81))|0)>2;if(!($cmp123)){__label__=112;break $sw_epilog$$sw_bb120$$if_else351$$sw_bb139$115;}
64323 HEAP32[(($stressed_syllable)>>2)]=2;var $82=$max_stress;var $cmp125=((($82))|0)==0;if($cmp125){__label__=39;;}else{__label__=40;;}
64324 if(__label__==39){var $83=HEAP32[(($stressed_syllable)>>2)];var $arrayidx127=(($vowel_stress+$83)&4294967295);HEAP8[($arrayidx127)]=4;;}
64325 $max_stress=4;__label__=114;break $sw_epilog$$sw_bb120$$if_else351$$sw_bb139$115;}
64326 else if(__label__==44){var $_pr5=HEAP32[(($stressed_syllable)>>2)];var $cmp140=((($_pr5))|0)==0;if(!($cmp140)){__label__=112;break $sw_epilog$$sw_bb120$$if_else351$$sw_bb139$115;}
64327 $max_stress=4;var $87=HEAP32[(($vowel_count)>>2)];var $cmp142=((($87))|0)>2;if($cmp142){__label__=46;;}else{__label__=63;;}
64328 $if_then143$$if_else208$124:do{if(__label__==46){var $88=HEAP32[(($vowel_count)>>2)];var $sub144=((($88)-2)&4294967295);HEAP32[(($stressed_syllable)>>2)]=$sub144;var $89=$stressflags;var $and145=($89)&768;var $tobool146=((($and145))|0)!=0;if($tobool146){__label__=47;;}else{__label__=55;;}
64329 $if_then147$$if_end179$126:do{if(__label__==47){var $90=$final_ph;var $arrayidx148=((_phoneme_tab+$90*4)&4294967295);var $91=HEAP32[(($arrayidx148)>>2)];var $type149=(($91+11)&4294967295);var $92=HEAPU8[($type149)];var $conv150=((($92))&255);var $cmp151=((($conv150))|0)!=2;if(!($cmp151)){__label__=55;break $if_then147$$if_end179$126;}
64330 var $93=$stressflags;var $and153=($93)&256;var $tobool154=((($and153))|0)!=0;if($tobool154){__label__=49;;}else{__label__=50;;}
64331 if(__label__==49){var $94=HEAP32[(($vowel_count)>>2)];var $sub156=((($94)-1)&4294967295);HEAP32[(($stressed_syllable)>>2)]=$sub156;;}
64332 else if(__label__==50){var $95=$final_ph;var $arrayidx157=((_phoneme_tab+$95*4)&4294967295);var $96=HEAP32[(($arrayidx157)>>2)];var $mnemonic=(($96)&4294967295);var $97=HEAP32[(($mnemonic)>>2)];$mnem=$97;var $98=$final_ph2;var $arrayidx158=((_phoneme_tab+$98*4)&4294967295);var $99=HEAP32[(($arrayidx158)>>2)];var $mnemonic159=(($99)&4294967295);var $100=HEAP32[(($mnemonic159)>>2)];$mnem2=$100;var $101=$mnem;var $cmp160=((($101))|0)==115;if($cmp160){__label__=51;;}else{__label__=52;;}
64333 if(__label__==51){var $102=$mnem2;var $cmp162=((($102))|0)==110;if($cmp162){__label__=55;break $if_then147$$if_end179$126;}}
64334 var $103=$mnem;var $cmp165=((($103))|0)!=110;var $104=$mnem;var $cmp167=((($104))|0)!=115;var $or_cond=($cmp165)&($cmp167);if($or_cond){__label__=54;;}else{__label__=53;;}
64335 if(__label__==53){var $105=$final_ph2;var $arrayidx169=((_phoneme_tab+$105*4)&4294967295);var $106=HEAP32[(($arrayidx169)>>2)];var $type170=(($106+11)&4294967295);var $107=HEAPU8[($type170)];var $conv171=((($107))&255);var $cmp172=((($conv171))|0)!=2;if(!($cmp172)){__label__=55;break $if_then147$$if_end179$126;}}
64336 var $108=HEAP32[(($vowel_count)>>2)];var $sub174=((($108)-1)&4294967295);HEAP32[(($stressed_syllable)>>2)]=$sub174;;}}}while(0);var $109=$stressflags;var $and180=($109)&524288;var $tobool181=((($and180))|0)!=0;if($tobool181){__label__=56;;}else{__label__=58;;}
64337 $if_then182$$if_end193$139:do{if(__label__==56){var $110=HEAP32[(($vowel_count)>>2)];var $sub183=((($110)-1)&4294967295);var $arrayidx184=(($vowel_length+$sub183)&4294967295);var $111=HEAP8[($arrayidx184)];var $conv185=(tempInt=(($111)),(tempInt>=128?tempInt-256:tempInt));var $112=HEAP32[(($vowel_count)>>2)];var $sub186=((($112)-2)&4294967295);var $arrayidx187=(($vowel_length+$sub186)&4294967295);var $113=HEAP8[($arrayidx187)];var $conv188=(tempInt=(($113)),(tempInt>=128?tempInt-256:tempInt));var $cmp189=((($conv185))|0)>((($conv188))|0);if(!($cmp189)){__label__=58;break $if_then182$$if_end193$139;}
64338 var $114=HEAP32[(($vowel_count)>>2)];var $sub191=((($114)-1)&4294967295);HEAP32[(($stressed_syllable)>>2)]=$sub191;;}}while(0);var $115=HEAP32[(($stressed_syllable)>>2)];var $arrayidx194=(($vowel_stress+$115)&4294967295);var $116=HEAP8[($arrayidx194)];var $conv195=(tempInt=(($116)),(tempInt>=128?tempInt-256:tempInt));var $cmp196=((($conv195))|0)==0;if($cmp196){__lastLabel__=58;__label__=60;;}else{__lastLabel__=58;__label__=59;;}
64339 if(__label__==59){var $117=HEAP32[(($stressed_syllable)>>2)];var $arrayidx198=(($vowel_stress+$117)&4294967295);var $118=HEAP8[($arrayidx198)];var $conv199=(tempInt=(($118)),(tempInt>=128?tempInt-256:tempInt));var $cmp200=((($conv199))|0)==1;if($cmp200){__lastLabel__=59;;}else{__lastLabel__=59;__label__=64;break $if_then143$$if_else208$124;}}
64340 var $119=__lastLabel__==59?$117:($115);var $cmp202=((($119))|0)>1;var $120=HEAP32[(($stressed_syllable)>>2)];if($cmp202){__label__=61;;}else{__label__=62;;}
64341 if(__label__==61){var $dec=((($120)-1)&4294967295);HEAP32[(($stressed_syllable)>>2)]=$dec;;}
64342 else if(__label__==62){var $inc205=((($120)+1)&4294967295);HEAP32[(($stressed_syllable)>>2)]=$inc205;;}}
64343 else if(__label__==63){HEAP32[(($stressed_syllable)>>2)]=1;;}}while(0);var $121=HEAP32[(($stressed_syllable)>>2)];var $arrayidx210=(($vowel_stress+$121)&4294967295);var $122=HEAP8[($arrayidx210)];var $conv211=(tempInt=(($122)),(tempInt>=128?tempInt-256:tempInt));var $cmp212=((($conv211))|0)<0;if(!($cmp212)){__label__=112;break $sw_epilog$$sw_bb120$$if_else351$$sw_bb139$115;}
64344 var $123=HEAP32[(($stressed_syllable)>>2)];var $sub214=((($123)-1)&4294967295);var $arrayidx215=(($vowel_stress+$sub214)&4294967295);var $124=HEAP8[($arrayidx215)];var $conv216=(tempInt=(($124)),(tempInt>=128?tempInt-256:tempInt));var $cmp217=((($conv216))|0)<4;if($cmp217){__label__=67;;}else{__label__=66;;}
64345 if(__label__==66){var $125=HEAP32[(($stressed_syllable)>>2)];var $add=((($125)+1)&4294967295);var $arrayidx219=(($vowel_stress+$add)&4294967295);var $126=HEAP8[($arrayidx219)];var $conv220=(tempInt=(($126)),(tempInt>=128?tempInt-256:tempInt));var $cmp221=((($conv220))|0)<4;if(!($cmp221)){__label__=112;break $sw_epilog$$sw_bb120$$if_else351$$sw_bb139$115;}}
64346 var $127=$max_stress;var $conv223=((($127))&255);var $128=HEAP32[(($stressed_syllable)>>2)];var $arrayidx224=(($vowel_stress+$128)&4294967295);HEAP8[($arrayidx224)]=$conv223;__label__=112;break $sw_epilog$$sw_bb120$$if_else351$$sw_bb139$115;}}while(0);$sw_epilog$$if_else351$155:do{if(__label__==112){var $_pr9=$max_stress;var $cmp349=((($_pr9))|0)<4;if(!($cmp349)){__label__=114;break $sw_epilog$$if_else351$155;}
64347 $stress=4;__label__=115;break $sw_epilog$$if_else351$155;}}while(0);if(__label__==114){$stress=3;;}
64348 var $190=$stressflags;var $and353=($190)&4096;var $tobool354=((($and353))|0)!=0;if($tobool354){__label__=116;;}else{__label__=121;;}
64349 $land_lhs_true355$$if_end370$161:do{if(__label__==116){var $191=HEAP32[(($vowel_count)>>2)];var $cmp356=((($191))|0)==2;if(!($cmp356)){__label__=121;break $land_lhs_true355$$if_end370$161;}
64350 var $arrayidx358=(($vowel_stress+1)&4294967295);var $192=HEAP8[($arrayidx358)];var $conv359=(tempInt=(($192)),(tempInt>=128?tempInt-256:tempInt));var $cmp360=((($conv359))|0)==4;if($cmp360){__label__=118;;}else{__label__=119;;}
64351 if(__label__==118){var $arrayidx362=(($vowel_stress+2)&4294967295);HEAP8[($arrayidx362)]=3;;}
64352 var $arrayidx364=(($vowel_stress+2)&4294967295);var $193=HEAP8[($arrayidx364)];var $conv365=(tempInt=(($193)),(tempInt>=128?tempInt-256:tempInt));var $cmp366=((($conv365))|0)==4;if(!($cmp366)){__label__=121;break $land_lhs_true355$$if_end370$161;}
64353 var $arrayidx368=(($vowel_stress+1)&4294967295);HEAP8[($arrayidx368)]=3;;}}while(0);var $194=$stressflags;var $and371=($194)&8192;var $tobool372=((($and371))|0)!=0;if($tobool372){__label__=122;;}else{__label__=126;;}
64354 $land_lhs_true373$$if_end386$169:do{if(__label__==122){var $arrayidx374=(($vowel_stress+1)&4294967295);var $195=HEAP8[($arrayidx374)];var $conv375=(tempInt=(($195)),(tempInt>=128?tempInt-256:tempInt));var $cmp376=((($conv375))|0)<0;if(!($cmp376)){__label__=126;break $land_lhs_true373$$if_end386$169;}
64355 var $196=HEAP32[(($vowel_count)>>2)];var $cmp378=((($196))|0)>2;if(!($cmp378)){__label__=126;break $land_lhs_true373$$if_end386$169;}
64356 var $arrayidx380=(($vowel_stress+2)&4294967295);var $197=HEAP8[($arrayidx380)];var $conv381=(tempInt=(($197)),(tempInt>=128?tempInt-256:tempInt));var $cmp382=((($conv381))|0)>=4;if(!($cmp382)){__label__=126;break $land_lhs_true373$$if_end386$169;}
64357 var $arrayidx384=(($vowel_stress+1)&4294967295);HEAP8[($arrayidx384)]=3;;}}while(0);$done=0;$first_primary=0;$v=1;var $198=$v;var $199=HEAP32[(($vowel_count)>>2)];var $cmp38818=((($198))|0)<((($199))|0);if($cmp38818){__label__=127;;}else{__label__=151;;}
64358 $for_body389$$for_end471$175:do{if(__label__==127){$for_body389$176:while(1){var $200=$v;var $arrayidx390=(($vowel_stress+$200)&4294967295);var $201=HEAP8[($arrayidx390)];var $conv391=(tempInt=(($201)),(tempInt>=128?tempInt-256:tempInt));var $cmp392=((($conv391))|0)<0;if($cmp392){__label__=128;;}else{__label__=145;;}
64359 $if_then393$$if_end454$178:do{if(__label__==128){var $202=$stressflags;var $and394=($202)&16;var $tobool395=((($and394))|0)!=0;if($tobool395){__label__=129;;}else{__label__=131;;}
64360 $land_lhs_true396$$if_else402$180:do{if(__label__==129){var $203=$stress;var $cmp397=((($203))|0)<4;if(!($cmp397)){__label__=131;break $land_lhs_true396$$if_else402$180;}
64361 var $204=$v;var $205=HEAP32[(($vowel_count)>>2)];var $sub399=((($205)-1)&4294967295);var $cmp400=((($204))|0)==((($sub399))|0);if($cmp400){__label__=145;break $if_then393$$if_end454$178;}}}while(0);var $206=$stressflags;var $and403=($206)&32768;var $tobool404=((($and403))|0)!=0;if($tobool404){__label__=132;;}else{__label__=134;;}
64362 $land_lhs_true405$$if_else410$184:do{if(__label__==132){var $207=$done;var $cmp406=((($207))|0)==0;if(!($cmp406)){__label__=134;break $land_lhs_true405$$if_else410$184;}
64363 var $208=$stress;var $conv408=((($208))&255);var $209=$v;var $arrayidx409=(($vowel_stress+$209)&4294967295);HEAP8[($arrayidx409)]=$conv408;$done=1;$stress=3;__label__=145;break $if_then393$$if_end454$178;}}while(0);var $210=$v;var $sub411=((($210)-1)&4294967295);var $arrayidx412=(($vowel_stress+$sub411)&4294967295);var $211=HEAP8[($arrayidx412)];var $conv413=(tempInt=(($211)),(tempInt>=128?tempInt-256:tempInt));var $cmp414=((($conv413))|0)<=1;if(!($cmp414)){__label__=145;break $if_then393$$if_end454$178;}
64364 var $212=$v;var $add416=((($212)+1)&4294967295);var $arrayidx417=(($vowel_stress+$add416)&4294967295);var $213=HEAP8[($arrayidx417)];var $conv418=(tempInt=(($213)),(tempInt>=128?tempInt-256:tempInt));var $cmp419=((($conv418))|0)<=1;if($cmp419){__label__=138;;}else{__label__=136;;}
64365 if(__label__==136){var $214=$stress;var $cmp421=((($214))|0)==4;if(!($cmp421)){__label__=145;break $if_then393$$if_end454$178;}
64366 var $215=$v;var $add423=((($215)+1)&4294967295);var $arrayidx424=(($vowel_stress+$add423)&4294967295);var $216=HEAP8[($arrayidx424)];var $conv425=(tempInt=(($216)),(tempInt>=128?tempInt-256:tempInt));var $cmp426=((($conv425))|0)<=2;if(!($cmp426)){__label__=145;break $if_then393$$if_end454$178;}}
64367 var $217=$stress;var $cmp428=((($217))|0)==3;if($cmp428){__label__=139;;}else{__label__=140;;}
64368 if(__label__==139){var $218=$stressflags;var $and430=($218)&32;var $tobool431=((($and430))|0)!=0;if($tobool431){__label__=150;break $if_then393$$if_end454$178;}}
64369 var $219=$v;var $cmp434=((($219))|0)>1;if($cmp434){__label__=141;;}else{__label__=144;;}
64370 $land_lhs_true435$$if_end448$196:do{if(__label__==141){var $220=$stressflags;var $and436=($220)&64;var $tobool437=((($and436))|0)!=0;if(!($tobool437)){__label__=144;break $land_lhs_true435$$if_end448$196;}
64371 var $221=$v;var $arrayidx439=(($syllable_weight+$221)&4294967295);var $222=HEAP8[($arrayidx439)];var $conv440=(tempInt=(($222)),(tempInt>=128?tempInt-256:tempInt));var $cmp441=((($conv440))|0)==0;if(!($cmp441)){__label__=144;break $land_lhs_true435$$if_end448$196;}
64372 var $223=$v;var $add443=((($223)+1)&4294967295);var $arrayidx444=(($syllable_weight+$add443)&4294967295);var $224=HEAP8[($arrayidx444)];var $conv445=(tempInt=(($224)),(tempInt>=128?tempInt-256:tempInt));var $cmp446=((($conv445))|0)>0;if($cmp446){__label__=150;break $if_then393$$if_end454$178;}}}while(0);var $225=$stress;var $conv449=((($225))&255);var $226=$v;var $arrayidx450=(($vowel_stress+$226)&4294967295);HEAP8[($arrayidx450)]=$conv449;$done=1;$stress=3;__label__=145;break $if_then393$$if_end454$178;}}while(0);$if_end454$$for_inc469$201:do{if(__label__==145){var $227=$v;var $arrayidx455=(($vowel_stress+$227)&4294967295);var $228=HEAP8[($arrayidx455)];var $conv456=(tempInt=(($228)),(tempInt>=128?tempInt-256:tempInt));var $cmp457=((($conv456))|0)>=4;if(!($cmp457)){__label__=150;break $if_end454$$for_inc469$201;}
64373 var $229=$first_primary;var $cmp459=((($229))|0)==0;if($cmp459){__label__=147;;}else{__label__=148;;}
64374 if(__label__==147){var $230=$v;$first_primary=$230;;}
64375 else if(__label__==148){var $231=$stressflags;var $and462=($231)&128;var $tobool463=((($and462))|0)!=0;if(!($tobool463)){__label__=150;break $if_end454$$for_inc469$201;}
64376 var $232=$v;var $arrayidx465=(($vowel_stress+$232)&4294967295);HEAP8[($arrayidx465)]=3;;}}}while(0);var $233=$v;var $inc470=((($233)+1)&4294967295);$v=$inc470;var $234=$v;var $235=HEAP32[(($vowel_count)>>2)];var $cmp388=((($234))|0)<((($235))|0);if($cmp388){__label__=127;continue $for_body389$176;}else{__label__=151;break $for_body389$$for_end471$175;}}}}while(0);var $236=$unstressed_word;var $tobool472=((($236))|0)!=0;if($tobool472){__label__=152;;}else{__label__=156;;}
64377 $land_lhs_true473$$if_end482$210:do{if(__label__==152){var $237=$tonic_addr;var $cmp474=((($237))|0)<0;if(!($cmp474)){__label__=156;break $land_lhs_true473$$if_end482$210;}
64378 var $238=HEAP32[(($vowel_count)>>2)];var $cmp476=((($238))|0)<=2;var $239=$tr_addr;var $langopts478=(($239)&4294967295);if($cmp476){__label__=154;;}else{__label__=155;;}
64379 if(__label__==154){var $unstressed_wd1=(($langopts478+16)&4294967295);var $240=HEAP32[(($unstressed_wd1)>>2)];$tonic_addr=$240;;}
64380 else if(__label__==155){var $unstressed_wd2=(($langopts478+20)&4294967295);var $241=HEAP32[(($unstressed_wd2)>>2)];$tonic_addr=$241;;}}}while(0);$max_stress=0;$max_stress_posn=0;$v=1;var $242=$v;var $243=HEAP32[(($vowel_count)>>2)];var $cmp48417=((($242))|0)<((($243))|0);if($cmp48417){__label__=157;;}else{__label__=160;;}
64381 $for_body485$$for_end495$217:do{if(__label__==157){while(1){var $244=$v;var $arrayidx486=(($vowel_stress+$244)&4294967295);var $245=HEAP8[($arrayidx486)];var $conv487=(tempInt=(($245)),(tempInt>=128?tempInt-256:tempInt));var $246=$max_stress;var $cmp488=((($conv487))|0)>=((($246))|0);if($cmp488){__label__=158;;}else{__label__=159;;}
64382 if(__label__==158){var $247=$v;var $arrayidx490=(($vowel_stress+$247)&4294967295);var $248=HEAP8[($arrayidx490)];var $conv491=(tempInt=(($248)),(tempInt>=128?tempInt-256:tempInt));$max_stress=$conv491;var $249=$v;$max_stress_posn=$249;;}
64383 var $250=$v;var $inc494=((($250)+1)&4294967295);$v=$inc494;var $251=$v;var $252=HEAP32[(($vowel_count)>>2)];var $cmp484=((($251))|0)<((($252))|0);if($cmp484){__label__=157;continue;}else{__label__=160;break $for_body485$$for_end495$217;}}}}while(0);var $253=$tonic_addr;var $cmp496=((($253))|0)>=0;if($cmp496){__label__=161;;}else{__label__=164;;}
64384 if(__label__==161){var $254=$tonic_addr;var $255=$max_stress;var $cmp498=((($254))|0)>((($255))|0);var $256=$max_stress;var $cmp500=((($256))|0)<=4;var $or_cond1=($cmp498)|($cmp500);if($or_cond1){__label__=162;;}else{__label__=163;;}
64385 if(__label__==162){var $257=$tonic_addr;var $conv502=((($257))&255);var $258=$max_stress_posn;var $arrayidx503=(($vowel_stress+$258)&4294967295);HEAP8[($arrayidx503)]=$conv502;;}
64386 var $259=$tonic_addr;$max_stress=$259;;}
64387 var $arraydecay506=(($phonetic)&4294967295);$p=$arraydecay506;$v=1;var $260=$control_addr;var $and507=($260)&1;var $tobool508=((($and507))|0)!=0;if($tobool508){__label__=174;;}else{__label__=165;;}
64388 $if_end544$$land_lhs_true509$230:do{if(__label__==165){var $261=$p;var $262=HEAPU8[($261)];var $idxprom510=((($262))&255);var $arrayidx511=((_phoneme_tab+$idxprom510*4)&4294967295);var $263=HEAPU32[(($arrayidx511)>>2)];$ph=$263;var $cmp512=((($263))|0)!=0;if(!($cmp512)){__label__=174;break $if_end544$$land_lhs_true509$230;}
64389 var $264=$ph;var $type514=(($264+11)&4294967295);var $265=HEAPU8[($type514)];var $conv515=((($265))&255);var $cmp516=((($conv515))|0)==1;if($cmp516){__label__=167;;}else{__label__=168;;}
64390 if(__label__==167){var $266=$p;var $arrayidx518=(($266+1)&4294967295);var $267=HEAPU8[($arrayidx518)];var $idxprom519=((($267))&255);var $arrayidx520=((_phoneme_tab+$idxprom519*4)&4294967295);var $268=HEAP32[(($arrayidx520)>>2)];$ph=$268;;}
64391 var $269=$tr_addr;var $langopts522=(($269)&4294967295);var $vowel_pause=(($langopts522+4)&4294967295);var $270=HEAP32[(($vowel_pause)>>2)];var $and523=($270)&48;var $tobool524=((($and523))|0)!=0;if(!($tobool524)){__label__=174;break $if_end544$$land_lhs_true509$230;}
64392 var $271=$ph;var $type526=(($271+11)&4294967295);var $272=HEAPU8[($type526)];var $conv527=((($272))&255);var $cmp528=((($conv527))|0)==2;if(!($cmp528)){__label__=174;break $if_end544$$land_lhs_true509$230;}
64393 var $273=$tr_addr;var $langopts530=(($273)&4294967295);var $vowel_pause531=(($langopts530+4)&4294967295);var $274=HEAP32[(($vowel_pause531)>>2)];var $and532=($274)&32;var $tobool533=((($and532))|0)!=0;if($tobool533){__label__=171;;}else{__label__=173;;}
64394 $land_lhs_true534$$if_else540$238:do{if(__label__==171){var $arrayidx535=(($vowel_stress+1)&4294967295);var $275=HEAP8[($arrayidx535)];var $conv536=(tempInt=(($275)),(tempInt>=128?tempInt-256:tempInt));var $cmp537=((($conv536))|0)>=4;if(!($cmp537)){__label__=173;break $land_lhs_true534$$if_else540$238;}
64395 var $276=$output_addr;var $incdec_ptr539=(($276+1)&4294967295);$output_addr=$incdec_ptr539;HEAP8[($276)]=11;__label__=174;break $if_end544$$land_lhs_true509$230;}}while(0);var $277=$output_addr;var $incdec_ptr541=(($277+1)&4294967295);$output_addr=$incdec_ptr541;HEAP8[($277)]=23;;}}while(0);var $arraydecay545=(($phonetic)&4294967295);$p=$arraydecay545;$post_tonic=0;;$while_cond546$243:while(1){var $278=$p;var $incdec_ptr547=(($278+1)&4294967295);$p=$incdec_ptr547;var $279=HEAPU8[($278)];$phcode=$279;var $conv548=((($279))&255);var $cmp549=((($conv548))|0)!=0;if(!($cmp549)){__label__=222;break $while_cond546$243;}
64396 var $280=$output_addr;var $281=$max_output;var $cmp550=((($280))>>>0)<((($281))>>>0);if(!($cmp550)){__label__=222;break $while_cond546$243;}
64397 var $282=$phcode;var $idxprom552=((($282))&255);var $arrayidx553=((_phoneme_tab+$idxprom552*4)&4294967295);var $283=HEAPU32[(($arrayidx553)>>2)];$ph=$283;var $cmp554=((($283))|0)==0;if($cmp554){__label__=175;continue $while_cond546$243;}
64398 var $284=$ph;var $type557=(($284+11)&4294967295);var $285=HEAPU8[($type557)];var $conv558=((($285))&255);var $cmp559=((($conv558))|0)==0;if($cmp559){__label__=179;;}else{__label__=180;;}
64399 $if_then560$$if_else561$248:do{if(__label__==179){var $286=$tr_addr;var $prev_last_stress=(($286+8288)&4294967295);HEAP32[(($prev_last_stress)>>2)]=0;;}
64400 else if(__label__==180){var $287=$ph;var $type562=(($287+11)&4294967295);var $288=HEAPU8[($type562)];var $conv563=((($288))&255);var $cmp564=((($conv563))|0)==2;if($cmp564){__label__=181;;}else{__label__=182;;}
64401 $land_lhs_true565$$lor_lhs_false569$251:do{if(__label__==181){var $289=$ph;var $phflags566=(($289+4)&4294967295);var $290=HEAP32[(($phflags566)>>2)];var $and567=($290)&1048576;var $tobool568=((($and567))|0)!=0;if($tobool568){__label__=182;break $land_lhs_true565$$lor_lhs_false569$251;}else{__label__=183;break $land_lhs_true565$$lor_lhs_false569$251;}}}while(0);if(__label__==182){var $291=$p;var $292=HEAPU8[($291)];var $conv570=((($292))&255);var $cmp571=((($conv570))|0)==20;if(!($cmp571)){__label__=220;break $if_then560$$if_else561$248;}}
64402 var $293=$v;var $arrayidx573=(($vowel_stress+$293)&4294967295);var $294=HEAP8[($arrayidx573)];var $conv574=(tempInt=(($294)),(tempInt>=128?tempInt-256:tempInt));$v_stress=$conv574;var $295=$v_stress;var $296=$tr_addr;var $prev_last_stress575=(($296+8288)&4294967295);HEAP32[(($prev_last_stress575)>>2)]=$295;var $297=$v;var $sub576=((($297)-1)&4294967295);var $arrayidx577=(($vowel_stress+$sub576)&4294967295);var $298=HEAP8[($arrayidx577)];var $conv578=(tempInt=(($298)),(tempInt>=128?tempInt-256:tempInt));var $299=$max_stress;var $cmp579=((($conv578))|0)>=((($299))|0);if($cmp579){__label__=184;;}else{__label__=185;;}
64403 if(__label__==184){$post_tonic=1;;}
64404 var $300=$v_stress;var $cmp582=((($300))|0)<=1;if($cmp582){__label__=186;;}else{__label__=201;;}
64405 $if_then583$$if_end627$259:do{if(__label__==186){var $301=$v;var $cmp584=((($301))|0)>1;if($cmp584){__label__=187;;}else{__label__=191;;}
64406 $land_lhs_true585$$if_else594$261:do{if(__label__==187){var $302=$max_stress;var $cmp586=((($302))|0)>=4;if(!($cmp586)){__label__=191;break $land_lhs_true585$$if_else594$261;}
64407 var $303=$stressflags;var $and588=($303)&4;var $tobool589=((($and588))|0)!=0;if(!($tobool589)){__label__=191;break $land_lhs_true585$$if_else594$261;}
64408 var $304=$v;var $305=HEAP32[(($vowel_count)>>2)];var $sub591=((($305)-1)&4294967295);var $cmp592=((($304))|0)==((($sub591))|0);if(!($cmp592)){__label__=191;break $land_lhs_true585$$if_else594$261;}
64409 $v_stress=0;__label__=201;break $if_then583$$if_end627$259;}}while(0);var $306=$stressflags;var $and595=($306)&2;var $tobool596=((($and595))|0)!=0;if($tobool596){__label__=194;;}else{__label__=192;;}
64410 $if_then602$$lor_lhs_false597$267:do{if(__label__==192){var $307=$v;var $cmp598=((($307))|0)==1;if($cmp598){__label__=194;break $if_then602$$lor_lhs_false597$267;}
64411 var $308=$v;var $309=HEAP32[(($vowel_count)>>2)];var $sub600=((($309)-1)&4294967295);var $cmp601=((($308))|0)==((($sub600))|0);if($cmp601){__label__=194;break $if_then602$$lor_lhs_false597$267;}
64412 var $310=$v;var $311=HEAP32[(($vowel_count)>>2)];var $sub604=((($311)-2)&4294967295);var $cmp605=((($310))|0)==((($sub604))|0);if($cmp605){__label__=196;;}else{__label__=198;;}
64413 $land_lhs_true606$$if_else612$271:do{if(__label__==196){var $312=HEAP32[(($vowel_count)>>2)];var $sub607=((($312)-1)&4294967295);var $arrayidx608=(($vowel_stress+$sub607)&4294967295);var $313=HEAP8[($arrayidx608)];var $conv609=(tempInt=(($313)),(tempInt>=128?tempInt-256:tempInt));var $cmp610=((($conv609))|0)<=1;if(!($cmp610)){__label__=198;break $land_lhs_true606$$if_else612$271;}
64414 $v_stress=1;__label__=201;break $if_then583$$if_end627$259;}}while(0);var $314=$v;var $sub613=((($314)-1)&4294967295);var $arrayidx614=(($vowel_stress+$sub613)&4294967295);var $315=HEAP8[($arrayidx614)];var $conv615=(tempInt=(($315)),(tempInt>=128?tempInt-256:tempInt));var $cmp616=((($conv615))|0)<0;if($cmp616){__label__=200;;}else{__label__=199;;}
64415 if(__label__==199){var $316=$stressflags;var $and618=($316)&65536;var $cmp619=((($and618))|0)==0;if(!($cmp619)){__label__=201;break $if_then583$$if_end627$259;}}
64416 $v_stress=0;var $317=$v_stress;var $conv621=((($317))&255);var $318=$v;var $arrayidx622=(($vowel_stress+$318)&4294967295);HEAP8[($arrayidx622)]=$conv621;__label__=201;break $if_then583$$if_end627$259;}}while(0);$v_stress=1;;}}while(0);var $319=$v_stress;var $cmp628=((($319))|0)==0;var $320=$v_stress;var $cmp630=((($320))|0)>1;var $or_cond2=($cmp628)|($cmp630);if($or_cond2){__label__=202;;}else{__label__=203;;}
64417 if(__label__==202){var $321=$v_stress;var $arrayidx632=((__ZL15stress_phonemes+$321)&4294967295);var $322=HEAP8[($arrayidx632)];var $323=$output_addr;var $incdec_ptr633=(($323+1)&4294967295);$output_addr=$incdec_ptr633;HEAP8[($323)]=$322;;}
64418 var $324=$v;var $arrayidx635=(($vowel_stress+$324)&4294967295);var $325=HEAP8[($arrayidx635)];var $conv636=(tempInt=(($325)),(tempInt>=128?tempInt-256:tempInt));var $326=$max_stress;var $cmp637=((($conv636))|0)>((($326))|0);if($cmp637){__label__=204;;}else{__label__=205;;}
64419 if(__label__==204){var $327=$v;var $arrayidx639=(($vowel_stress+$327)&4294967295);var $328=HEAP8[($arrayidx639)];var $conv640=(tempInt=(($328)),(tempInt>=128?tempInt-256:tempInt));$max_stress=$conv640;;}
64420 var $329=$p;var $330=HEAPU8[($329)];var $conv642=((($330))&255);var $cmp643=((($conv642))|0)==12;if($cmp643){__label__=206;;}else{__label__=214;;}
64421 $land_lhs_true644$$if_end665$286:do{if(__label__==206){var $331=$tr_addr;var $langopts645=(($331)&4294967295);var $param=(($langopts645+24)&4294967295);var $arrayidx646=(($param+8)&4294967295);var $332=HEAP32[(($arrayidx646)>>2)];$opt_length=$332;var $and647=($332)&1;var $tobool648=((($and647))|0)!=0;if(!($tobool648)){__label__=214;break $land_lhs_true644$$if_end665$286;}
64422 $shorten=0;var $333=$opt_length;var $and650=($333)&16;var $tobool651=((($and650))|0)!=0;if($tobool651){__label__=208;;}else{__label__=210;;}
64423 $if_then652$$if_else656$289:do{if(__label__==208){var $334=$v;var $335=$max_stress_posn;var $cmp653=((($334))|0)!=((($335))|0);if(!($cmp653)){__label__=212;break $if_then652$$if_else656$289;}
64424 $shorten=1;__label__=213;break $if_then652$$if_else656$289;}
64425 else if(__label__==210){var $336=$v_stress;var $cmp657=((($336))|0)<4;if(!($cmp657)){__label__=212;break $if_then652$$if_else656$289;}
64426 $shorten=1;__label__=213;break $if_then652$$if_else656$289;}}while(0);if(__label__==212){var $_pr11=$shorten;var $tobool661=((($_pr11))|0)!=0;if(!($tobool661)){__label__=214;break $land_lhs_true644$$if_end665$286;}}
64427 var $337=$p;var $incdec_ptr663=(($337+1)&4294967295);$p=$incdec_ptr663;;}}while(0);var $338=$v_stress;var $cmp666=((($338))|0)>=4;if($cmp666){__label__=215;;}else{__label__=219;;}
64428 $land_lhs_true667$$if_end682$298:do{if(__label__==215){var $339=$tr_addr;var $langopts668=(($339)&4294967295);var $param669=(($langopts668+24)&4294967295);var $arrayidx670=(($param669+8)&4294967295);var $340=HEAP32[(($arrayidx670)>>2)];var $cmp671=((($340))|0)==2;if(!($cmp671)){__label__=219;break $land_lhs_true667$$if_end682$298;}
64429 var $341=$v;var $342=HEAP32[(($vowel_count)>>2)];var $sub673=((($342)-2)&4294967295);var $cmp674=((($341))|0)==((($sub673))|0);if(!($cmp674)){__label__=219;break $land_lhs_true667$$if_end682$298;}
64430 var $343=$v;var $arrayidx676=(($syllable_weight+$343)&4294967295);var $344=HEAP8[($arrayidx676)];var $conv677=(tempInt=(($344)),(tempInt>=128?tempInt-256:tempInt));var $cmp678=((($conv677))|0)==0;if(!($cmp678)){__label__=219;break $land_lhs_true667$$if_end682$298;}
64431 var $345=$phcode;var $346=$output_addr;var $incdec_ptr680=(($346+1)&4294967295);$output_addr=$incdec_ptr680;HEAP8[($346)]=$345;$phcode=12;;}}while(0);var $347=$v;var $inc683=((($347)+1)&4294967295);$v=$inc683;;}}while(0);var $348=$phcode;var $conv686=((($348))&255);var $cmp687=((($conv686))|0)!=1;if(!($cmp687)){__label__=175;continue $while_cond546$243;}
64432 var $349=$phcode;var $350=$output_addr;var $incdec_ptr689=(($350+1)&4294967295);$output_addr=$incdec_ptr689;HEAP8[($350)]=$349;__label__=175;continue $while_cond546$243;}
64433 var $351=$output_addr;var $incdec_ptr692=(($351+1)&4294967295);$output_addr=$incdec_ptr692;HEAP8[($351)]=0;;}
64434 STACKTOP=__stackBase__;return;return;}
64435 function __Z14AppendPhonemesP10TranslatorPciPKc($tr,$string,$size,$ph){;var __label__;var $tr_addr;var $string_addr;var $size_addr;var $ph_addr;var $p;var $c;var $unstress_mark;var $length;$tr_addr=$tr;$string_addr=$string;$size_addr=$size;$ph_addr=$ph;var $0=$ph_addr;var $call=_strlen($0);var $1=$string_addr;var $call1=_strlen($1);var $add=((($call1)+($call))&4294967295);$length=$add;var $2=$length;var $3=$size_addr;var $cmp=((($2))|0)>=((($3))|0);if($cmp){__label__=14;;}else{__label__=1;;}
64436 $if_end34$$if_end$2:do{if(__label__==1){$unstress_mark=0;var $4=$ph_addr;$p=$4;var $5=$p;var $incdec_ptr1=(($5+1)&4294967295);$p=$incdec_ptr1;var $6=HEAPU8[($5)];$c=$6;var $conv2=((($6))&255);var $cmp23=((($conv2))|0)!=0;if($cmp23){__label__=2;;}else{__label__=12;;}
64437 $while_body$$while_end$4:do{if(__label__==2){$while_body$5:while(1){var $7=$c;var $conv3=((($7))&255);var $8=HEAP32[((_n_phoneme_tab)>>2)];var $cmp4=((($conv3))|0)>=((($8))|0);if($cmp4){__label__=3;;}else{__label__=4;;}
64438 $while_cond_backedge$$if_end6$7:do{if(__label__==4){var $11=$c;var $idxprom=((($11))&255);var $arrayidx=((_phoneme_tab+$idxprom*4)&4294967295);var $12=HEAP32[(($arrayidx)>>2)];var $type=(($12+11)&4294967295);var $13=HEAPU8[($type)];var $conv7=((($13))&255);var $cmp8=((($conv7))|0)==1;var $14=$c;var $idxprom10=((($14))&255);var $arrayidx11=((_phoneme_tab+$idxprom10*4)&4294967295);var $15=HEAP32[(($arrayidx11)>>2)];if($cmp8){__label__=5;;}else{__label__=7;;}
64439 if(__label__==5){var $std_length=(($15+14)&4294967295);var $16=HEAPU8[($std_length)];var $conv12=((($16))&255);var $cmp13=((($conv12))|0)<4;if(!($cmp13)){__label__=3;break $while_cond_backedge$$if_end6$7;}
64440 $unstress_mark=1;;}
64441 else if(__label__==7){var $type18=(($15+11)&4294967295);var $17=HEAPU8[($type18)];var $conv19=((($17))&255);var $cmp20=((($conv19))|0)==2;if(!($cmp20)){__label__=3;break $while_cond_backedge$$if_end6$7;}
64442 var $18=$c;var $idxprom22=((($18))&255);var $arrayidx23=((_phoneme_tab+$idxprom22*4)&4294967295);var $19=HEAP32[(($arrayidx23)>>2)];var $phflags=(($19+4)&4294967295);var $20=HEAP32[(($phflags)>>2)];var $and=($20)&2;var $cmp24=((($and))|0)==0;if($cmp24){__label__=9;;}else{__label__=11;;}
64443 $land_lhs_true$$if_end27$14:do{if(__label__==9){var $21=$unstress_mark;var $cmp25=((($21))|0)==0;if(!($cmp25)){__label__=11;break $land_lhs_true$$if_end27$14;}
64444 var $22=$tr_addr;var $word_stressed_count=(($22+8300)&4294967295);var $23=HEAP32[(($word_stressed_count)>>2)];var $inc=((($23)+1)&4294967295);HEAP32[(($word_stressed_count)>>2)]=$inc;;}}while(0);$unstress_mark=0;var $24=$tr_addr;var $word_vowel_count=(($24+8296)&4294967295);var $25=HEAP32[(($word_vowel_count)>>2)];var $inc28=((($25)+1)&4294967295);HEAP32[(($word_vowel_count)>>2)]=$inc28;;}}}while(0);var $9=$p;var $incdec_ptr=(($9+1)&4294967295);$p=$incdec_ptr;var $10=HEAPU8[($9)];$c=$10;var $conv=((($10))&255);var $cmp2=((($conv))|0)!=0;if($cmp2){__label__=2;continue $while_body$5;}else{__label__=12;break $while_body$$while_end$4;}}}}while(0);var $26=$string_addr;var $cmp31=((($26))|0)!=0;if(!($cmp31)){__label__=14;break $if_end34$$if_end$2;}
64445 var $27=$string_addr;var $28=$ph_addr;var $call33=_strcat($27,$28);;}}while(0);;return;return;}
64446 function __Z14TranslateRulesP10TranslatorPcS1_iS1_iPj($tr,$p_start,$phonemes,$ph_size,$end_phonemes,$word_flags,$dict_flags){var __stackBase__=STACKTOP;STACKTOP+=416;_memset(__stackBase__,0,416);var __label__;var __lastLabel__=null;var $retval;var $tr_addr;var $p_start_addr;var $phonemes_addr;var $ph_size_addr;var $end_phonemes_addr;var $word_flags_addr;var $dict_flags_addr;var $c;var $c2;var $c12;var $c123;var $wc=__stackBase__;var $wc_prev;var $wc_bytes;var $p2=__stackBase__+4;var $found;var $g;var $g1;var $n;var $letter=__stackBase__+8;var $any_alpha;var $ix;var $digit_count;var $p=__stackBase__+12;var $dict_flags0;var $match1=__stackBase__+16;var $match2=__stackBase__+32;var $ph_buf=__stackBase__+48;var $word_copy=__stackBase__+88;var $wordbuf=__stackBase__+248;var $ix14;var $string=__stackBase__+368;var $buf=__stackBase__+376;$tr_addr=$tr;$p_start_addr=$p_start;$phonemes_addr=$phonemes;$ph_size_addr=$ph_size;$end_phonemes_addr=$end_phonemes;$word_flags_addr=$word_flags;$dict_flags_addr=$dict_flags;HEAP32[(($wc)>>2)]=0;$any_alpha=0;$digit_count=0;$dict_flags0=0;var $0=$tr_addr;var $data_dictrules=(($0+1048)&4294967295);var $1=HEAP32[(($data_dictrules)>>2)];var $cmp=((($1))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
64447 $if_then$$if_end$2:do{if(__label__==1){$retval=0;;}
64448 else if(__label__==2){var $2=$dict_flags_addr;var $cmp1=((($2))|0)!=0;if($cmp1){__label__=3;;}else{__label__=4;;}
64449 if(__label__==3){var $3=$dict_flags_addr;var $arrayidx=(($3)&4294967295);var $4=HEAP32[(($arrayidx)>>2)];$dict_flags0=$4;;}
64450 $ix=0;__lastLabel__=4;;$for_cond$8:while(1){var $5=__lastLabel__==5?$_pr:(0);var $cmp4=((($5))|0)<159;if(!($cmp4)){__label__=8;break $for_cond$8;}
64451 var $6=$ix;var $7=$p_start_addr;var $arrayidx5=(($7+$6)&4294967295);var $8=HEAP8[($arrayidx5)];$c=$8;var $9=$c;var $10=$ix;var $inc=((($10)+1)&4294967295);$ix=$inc;var $arrayidx6=(($word_copy+$10)&4294967295);HEAP8[($arrayidx6)]=$9;var $11=$c;var $conv=((($11))&255);var $cmp7=((($conv))|0)==0;if($cmp7){__label__=8;break $for_cond$8;}
64452 var $_pr=$ix;__lastLabel__=5;__label__=6;continue $for_cond$8;}
64453 var $12=$ix;var $arrayidx10=(($word_copy+$12)&4294967295);HEAP8[($arrayidx10)]=0;var $13=HEAP32[((_option_phonemes)>>2)];var $cmp11=((($13))|0)==2;if($cmp11){__label__=9;;}else{__label__=17;;}
64454 $land_lhs_true$$if_end31$13:do{if(__label__==9){var $14=$word_flags_addr;var $and=($14)&268435456;var $cmp12=((($and))|0)==0;if(!($cmp12)){__label__=17;break $land_lhs_true$$if_end31$13;}
64455 $ix14=0;;while(1){var $15=$ix14;var $16=$p_start_addr;var $arrayidx16=(($16+$15)&4294967295);var $17=HEAPU8[($arrayidx16)];$c=$17;var $conv17=((($17))&255);var $cmp18=((($conv17))|0)!=32;if(!($cmp18)){__label__=14;break;}
64456 var $18=$c;var $conv19=((($18))&255);var $cmp20=((($conv19))|0)!=0;if(!($cmp20)){__label__=14;break;}
64457 var $19=$c;var $20=$ix14;var $arrayidx22=(($wordbuf+$20)&4294967295);HEAP8[($arrayidx22)]=$19;var $21=$ix14;var $inc23=((($21)+1)&4294967295);$ix14=$inc23;__label__=11;continue;}
64458 var $22=$ix14;var $arrayidx25=(($wordbuf+$22)&4294967295);HEAP8[($arrayidx25)]=0;var $23=$word_flags_addr;var $and26=($23)&-2147483648;var $tobool=((($and26))|0)!=0;var $24=HEAP32[((_f_trans)>>2)];var $arraydecay=(($wordbuf)&4294967295);if($tobool){__label__=15;;}else{__label__=16;;}
64459 if(__label__==15){var $call=_fprintf($24,((__str10126)&4294967295),allocate([$arraydecay,0,0,0],["i8*",0,0,0],ALLOC_STACK));;}
64460 else if(__label__==16){var $call29=_fprintf($24,((__str11127)&4294967295),allocate([$arraydecay,0,0,0],["i8*",0,0,0],ALLOC_STACK));;}}}while(0);var $25=$p_start_addr;HEAP32[(($p)>>2)]=$25;var $26=$tr_addr;var $word_vowel_count=(($26+8296)&4294967295);HEAP32[(($word_vowel_count)>>2)]=0;var $27=$tr_addr;var $word_stressed_count=(($27+8300)&4294967295);HEAP32[(($word_stressed_count)>>2)]=0;var $28=$end_phonemes_addr;var $cmp32=((($28))|0)!=0;if($cmp32){__label__=18;;}else{__label__=19;;}
64461 if(__label__==18){var $29=$end_phonemes_addr;var $arrayidx34=(($29)&4294967295);HEAP8[($arrayidx34)]=0;;}
64462 var $arrayidx57=(($string)&4294967295);var $arrayidx58=(($string+1)&4294967295);var $arraydecay60=(($string)&4294967295);var $arraydecay61=(($buf)&4294967295);var $arraydecay66=(($buf)&4294967295);var $arraydecay69=(($buf)&4294967295);var $phonemes282=(($match1+4)&4294967295);var $phonemes285=(($match1+4)&4294967295);var $points287=(($match1)&4294967295);var $phonemes295=(($match1+4)&4294967295);var $end_type306=(($match1+8)&4294967295);var $end_type313=(($match1+8)&4294967295);var $del_fwd=(($match1+12)&4294967295);var $del_fwd342=(($match1+12)&4294967295);var $phonemes344=(($match1+4)&4294967295);var $points=(($match2)&4294967295);var $points107=(($match2)&4294967295);var $points112=(($match2)&4294967295);var $points113=(($match1)&4294967295);var $30=$match1;var $31=$match2;var $points241=(($match1)&4294967295);var $arraydecay266=(($ph_buf)&4294967295);var $arrayidx267=(($ph_buf)&4294967295);var $arraydecay270=(($ph_buf)&4294967295);var $phonemes271=(($match1+4)&4294967295);var $points272=(($match1)&4294967295);var $points135=(($match1)&4294967295);var $arraydecay230=(($ph_buf)&4294967295);var $arraydecay232=(($ph_buf)&4294967295);var $phonemes233=(($match1+4)&4294967295);var $points234=(($match1)&4294967295);;$while_cond$28:while(1){var $32=HEAP32[(($p)>>2)];var $33=HEAPU8[($32)];$c=$33;var $conv36=((($33))&255);var $cmp37=((($conv36))|0)!=32;if(!($cmp37)){__label__=104;break $while_cond$28;}
64463 var $34=$c;var $conv39=((($34))&255);var $cmp40=((($conv39))|0)!=0;if(!($cmp40)){__label__=104;break $while_cond$28;}
64464 var $35=HEAP32[(($wc)>>2)];$wc_prev=$35;var $36=HEAP32[(($p)>>2)];var $call42=__Z7utf8_inPiPKc($wc,$36);$wc_bytes=$call42;var $37=HEAP32[(($wc)>>2)];var $call43=__Z7IsAlphaj($37);var $tobool44=((($call43))|0)!=0;if($tobool44){__label__=23;;}else{__label__=24;;}
64465 if(__label__==23){var $38=$any_alpha;var $inc46=((($38)+1)&4294967295);$any_alpha=$inc46;;}
64466 var $39=$c;var $idxprom=((($39))&255);var $40=$tr_addr;var $groups2_count=(($40+7756)&4294967295);var $arrayidx48=(($groups2_count+$idxprom)&4294967295);var $41=HEAPU8[($arrayidx48)];var $conv49=((($41))&255);$n=$conv49;var $42=HEAP32[(($wc)>>2)];var $call50=__Z7IsDigitj($42);var $tobool51=((($call50))|0)!=0;if($tobool51){__label__=25;;}else{__label__=30;;}
64467 $land_lhs_true52$$if_else70$35:do{if(__label__==25){var $43=$tr_addr;var $langopts=(($43)&4294967295);var $tone_numbers=(($langopts+250)&4294967295);var $44=HEAP8[($tone_numbers)];var $conv53=(tempInt=(($44)),(tempInt>=128?tempInt-256:tempInt));var $cmp54=((($conv53))|0)==0;if($cmp54){__label__=27;;}else{__label__=26;;}
64468 if(__label__==26){var $45=$any_alpha;var $tobool55=((($45))|0)!=0;if($tobool55){__label__=30;break $land_lhs_true52$$if_else70$35;}}
64469 HEAP8[($arrayidx57)]=95;var $46=HEAP32[(($p)>>2)];var $47=$wc_bytes;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$46;$dest$=$arrayidx58;$stop$=$src$+$47;if(($dest$%4)==($src$%4)&&$47>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
64470 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
64471 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $48=$wc_bytes;var $add=((($48)+1)&4294967295);var $arrayidx59=(($string+$add)&4294967295);HEAP8[($arrayidx59)]=0;var $49=$tr_addr;var $call62=__Z6LookupP10TranslatorPKcPc($49,$arraydecay60,$arraydecay61);var $50=$digit_count;var $inc63=((($50)+1)&4294967295);$digit_count=$inc63;var $cmp64=((($inc63))>>>0)>=2;if($cmp64){__label__=28;;}else{__label__=29;;}
64472 if(__label__==28){var $strlen=_strlen($arraydecay66);var $endptr=(($arraydecay66+$strlen)&4294967295);var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=((__ZZ14TranslateRulesP10TranslatorPcS1_iS1_iPjE9str_pause)&4294967295);$dest$=$endptr;$stop$=$src$+2;if(($dest$%4)==($src$%4)&&2>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
64473 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
64474 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};$digit_count=0;;}
64475 var $51=$tr_addr;var $52=$phonemes_addr;var $53=$ph_size_addr;__Z14AppendPhonemesP10TranslatorPciPKc($51,$52,$53,$arraydecay69);var $54=$wc_bytes;var $55=HEAP32[(($p)>>2)];var $add_ptr=(($55+$54)&4294967295);HEAP32[(($p)>>2)]=$add_ptr;__label__=20;continue $while_cond$28;}}while(0);$digit_count=0;$found=0;var $56=HEAP32[(($wc)>>2)];var $57=$tr_addr;var $letter_bits_offset=(($57+964)&4294967295);var $58=HEAP32[(($letter_bits_offset)>>2)];var $sub=((($56)-($58))&4294967295);$ix=$sub;var $cmp71=((($sub))|0)>=0;if($cmp71){__label__=31;;}else{__label__=34;;}
64476 $land_lhs_true72$$if_end81$44:do{if(__label__==31){var $59=$ix;var $cmp73=((($59))|0)<128;if(!($cmp73)){__label__=34;break $land_lhs_true72$$if_end81$44;}
64477 var $60=$ix;var $61=$tr_addr;var $groups3=(($61+6280)&4294967295);var $arrayidx75=(($groups3+$60*4)&4294967295);var $62=HEAP32[(($arrayidx75)>>2)];var $cmp76=((($62))|0)!=0;if(!($cmp76)){__label__=34;break $land_lhs_true72$$if_end81$44;}
64478 var $63=$tr_addr;var $64=$p_start_addr;var $65=$wc_bytes;var $66=$ix;var $67=$tr_addr;var $groups378=(($67+6280)&4294967295);var $arrayidx79=(($groups378+$66*4)&4294967295);var $68=HEAP32[(($arrayidx79)>>2)];var $69=$word_flags_addr;var $70=$dict_flags0;__ZL9MatchRuleP10TranslatorPPcS1_iS1_P11MatchRecordii($63,$p,$64,$65,$68,$match1,$69,$70);$found=1;__label__=85;break $land_lhs_true72$$if_end81$44;}}while(0);$if_end281$$if_end81$48:do{if(__label__==34){var $_pr3=$found;var $tobool82=((($_pr3))|0)!=0;if($tobool82){__label__=85;break $if_end281$$if_end81$48;}
64479 var $71=$n;var $cmp84=((($71))|0)>0;if($cmp84){__label__=36;;}else{__label__=43;;}
64480 $if_then85$$if_end121$51:do{if(__label__==36){var $72=HEAP32[(($p)>>2)];var $arrayidx86=(($72+1)&4294967295);var $73=HEAP8[($arrayidx86)];$c2=$73;var $74=$c;var $conv87=((($74))&255);var $75=$c2;var $conv88=((($75))&255);var $shl=((($conv88)*256)&4294967295);var $add89=((($shl)+($conv87))&4294967295);$c12=$add89;var $76=$c12;var $77=HEAP32[(($p)>>2)];var $arrayidx90=(($77+2)&4294967295);var $78=HEAP8[($arrayidx90)];var $conv91=(tempInt=(($78)),(tempInt>=128?tempInt-256:tempInt));var $shl92=((($conv91)*65536)&4294967295);var $add93=((($shl92)+($76))&4294967295);$c123=$add93;var $79=$c;var $idxprom94=((($79))&255);var $80=$tr_addr;var $groups2_start=(($80+8012)&4294967295);var $arrayidx95=(($groups2_start+$idxprom94)&4294967295);var $81=HEAPU8[($arrayidx95)];var $conv96=((($81))&255);$g1=$conv96;var $82=$g1;$g=$82;var $83=$g;var $84=$g1;var $85=$n;var $add989=((($85)+($84))&4294967295);var $cmp9910=((($83))|0)<((($add989))|0);if(!($cmp9910)){__label__=43;break $if_then85$$if_end121$51;}
64481 $for_body100$53:while(1){var $86=$g;var $87=$tr_addr;var $groups2_name=(($87+7272)&4294967295);var $arrayidx101=(($groups2_name+$86*4)&4294967295);var $88=HEAP32[(($arrayidx101)>>2)];var $89=$c12;var $cmp102=((($88))|0)==((($89))|0);if($cmp102){__label__=38;;}else{__label__=42;;}
64482 $if_then103$$for_inc118$55:do{if(__label__==38){$found=1;var $90=HEAP32[(($p)>>2)];HEAP32[(($p2)>>2)]=$90;var $91=$tr_addr;var $92=$p_start_addr;var $93=$g;var $94=$tr_addr;var $groups2=(($94+6792)&4294967295);var $arrayidx104=(($groups2+$93*4)&4294967295);var $95=HEAP32[(($arrayidx104)>>2)];var $96=$word_flags_addr;var $97=$dict_flags0;__ZL9MatchRuleP10TranslatorPPcS1_iS1_P11MatchRecordii($91,$p2,$92,2,$95,$match2,$96,$97);var $98=HEAP32[(($points)>>2)];var $cmp105=((($98))|0)>0;if($cmp105){__label__=39;;}else{__label__=40;;}
64483 if(__label__==39){var $99=HEAP32[(($points107)>>2)];var $add108=((($99)+35)&4294967295);HEAP32[(($points107)>>2)]=$add108;;}
64484 var $100=$tr_addr;var $101=$p_start_addr;var $102=$c;var $idxprom110=((($102))&255);var $103=$tr_addr;var $groups1=(($103+5256)&4294967295);var $arrayidx111=(($groups1+$idxprom110*4)&4294967295);var $104=HEAP32[(($arrayidx111)>>2)];var $105=$word_flags_addr;var $106=$dict_flags0;__ZL9MatchRuleP10TranslatorPPcS1_iS1_P11MatchRecordii($100,$p,$101,1,$104,$match1,$105,$106);var $107=HEAP32[(($points112)>>2)];var $108=HEAP32[(($points113)>>2)];var $cmp114=((($107))|0)>=((($108))|0);if(!($cmp114)){__label__=42;break $if_then103$$for_inc118$55;}
64485 var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$31;$dest$=$30;$stop$=$src$+16;if(($dest$%4)==($src$%4)&&16>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
64486 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
64487 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $109=HEAP32[(($p2)>>2)];HEAP32[(($p)>>2)]=$109;;}}while(0);var $110=$g;var $inc119=((($110)+1)&4294967295);$g=$inc119;var $111=$g;var $112=$g1;var $113=$n;var $add98=((($113)+($112))&4294967295);var $cmp99=((($111))|0)<((($add98))|0);if($cmp99){__label__=37;continue $for_body100$53;}else{__label__=43;break $if_then85$$if_end121$51;}}}}while(0);var $_pr5_pr=$found;var $tobool122=((($_pr5_pr))|0)!=0;if($tobool122){__label__=85;break $if_end281$$if_end81$48;}
64488 var $114=$c;var $idxprom124=((($114))&255);var $115=$tr_addr;var $groups1125=(($115+5256)&4294967295);var $arrayidx126=(($groups1125+$idxprom124*4)&4294967295);var $116=HEAP32[(($arrayidx126)>>2)];var $cmp127=((($116))|0)!=0;var $117=$tr_addr;var $118=$p_start_addr;if($cmp127){__label__=45;;}else{__label__=46;;}
64489 $if_then128$$if_else132$64:do{if(__label__==45){var $119=$c;var $idxprom129=((($119))&255);var $120=$tr_addr;var $groups1130=(($120+5256)&4294967295);var $arrayidx131=(($groups1130+$idxprom129*4)&4294967295);var $121=HEAP32[(($arrayidx131)>>2)];var $122=$word_flags_addr;var $123=$dict_flags0;__ZL9MatchRuleP10TranslatorPPcS1_iS1_P11MatchRecordii($117,$p,$118,1,$121,$match1,$122,$123);__label__=74;break $if_then128$$if_else132$64;}
64490 else if(__label__==46){var $124=$tr_addr;var $groups1133=(($124+5256)&4294967295);var $arrayidx134=(($groups1133)&4294967295);var $125=HEAP32[(($arrayidx134)>>2)];var $126=$word_flags_addr;var $127=$dict_flags0;__ZL9MatchRuleP10TranslatorPPcS1_iS1_P11MatchRecordii($117,$p,$118,0,$125,$match1,$126,$127);var $128=HEAP32[(($points135)>>2)];var $cmp136=((($128))|0)==0;if(!($cmp136)){__label__=84;break $if_then128$$if_else132$64;}
64491 var $129=HEAP32[((_option_sayas)>>2)];var $and138=($129)&16;var $cmp139=((($and138))|0)==0;if(!($cmp139)){__label__=74;break $if_then128$$if_else132$64;}
64492 var $130=HEAP32[(($p)>>2)];var $add_ptr141=(($130+-1)&4294967295);var $call142=__Z7utf8_inPiPKc($letter,$add_ptr141);var $sub143=((($call142)-1)&4294967295);$n=$sub143;var $131=$tr_addr;var $letter_bits_offset144=(($131+964)&4294967295);var $132=HEAP32[(($letter_bits_offset144)>>2)];var $cmp145=((($132))|0)>0;if($cmp145){__label__=49;;}else{__label__=52;;}
64493 $if_then146$$if_end155thread_pre_split$69:do{if(__label__==49){var $133=HEAP32[(($letter)>>2)];var $cmp147=((($133))|0)<=577;if($cmp147){__lastLabel__=49;;}else{__lastLabel__=49;__label__=53;break $if_then146$$if_end155thread_pre_split$69;}
64494 var $134=HEAP32[(($letter)>>2)];var $call149=_iswalpha($134);var $tobool150=((($call149))|0)!=0;if($tobool150){__label__=51;break $while_cond$28;}else{__label__=52;break $if_then146$$if_end155thread_pre_split$69;}}}while(0);if(__label__==52){var $_pr7=HEAP32[(($letter)>>2)];__lastLabel__=52;;}
64495 var $138=__lastLabel__==52?$_pr7:($133);var $cmp156=((($138))|0)==57384;if($cmp156){__label__=54;;}else{__label__=56;;}
64496 $if_then157$$if_end166$75:do{if(__label__==54){var $139=HEAP32[((_pre_pause)>>2)];var $140=$tr_addr;var $langopts158=(($140)&4294967295);var $param2=(($langopts158+100)&4294967295);var $arrayidx159=(($param2+64)&4294967295);var $141=HEAP32[(($arrayidx159)>>2)];var $cmp160=((($139))|0)<((($141))|0);if(!($cmp160)){__label__=56;break $if_then157$$if_end166$75;}
64497 var $142=$tr_addr;var $langopts162=(($142)&4294967295);var $param2163=(($langopts162+100)&4294967295);var $arrayidx164=(($param2163+64)&4294967295);var $143=HEAP32[(($arrayidx164)>>2)];HEAP32[((_pre_pause)>>2)]=$143;;}}while(0);var $144=HEAP32[(($letter)>>2)];var $call167=__Z9IsBracketi($144);var $tobool168=((($call167))|0)!=0;if($tobool168){__label__=57;;}else{__label__=59;;}
64498 $if_then169$$if_end178$79:do{if(__label__==57){var $145=HEAP32[((_pre_pause)>>2)];var $146=$tr_addr;var $langopts170=(($146)&4294967295);var $param=(($langopts170+24)&4294967295);var $arrayidx171=(($param+64)&4294967295);var $147=HEAP32[(($arrayidx171)>>2)];var $cmp172=((($145))|0)<((($147))|0);if(!($cmp172)){__label__=59;break $if_then169$$if_end178$79;}
64499 var $148=$tr_addr;var $langopts174=(($148)&4294967295);var $param175=(($langopts174+24)&4294967295);var $arrayidx176=(($param175+64)&4294967295);var $149=HEAP32[(($arrayidx176)>>2)];HEAP32[((_pre_pause)>>2)]=$149;;}}while(0);var $150=HEAP32[(($letter)>>2)];var $cmp179=((($150))|0)>=192;var $151=HEAP32[(($letter)>>2)];var $cmp181=((($151))|0)<606;var $or_cond=($cmp179)&($cmp181);if($or_cond){__label__=60;;}else{__label__=71;;}
64500 $land_lhs_true182$$if_else223$83:do{if(__label__==60){var $152=HEAP32[(($letter)>>2)];var $sub183=((($152)-192)&4294967295);var $arrayidx184=((__ZL13remove_accent+$sub183)&4294967295);var $153=HEAPU8[($arrayidx184)];var $conv185=((($153))&255);$ix=$conv185;var $cmp186=((($conv185))|0)!=0;if(!($cmp186)){__label__=71;break $land_lhs_true182$$if_else223$83;}
64501 var $154=HEAP32[(($p)>>2)];var $arrayidx188=(($154+-2)&4294967295);var $155=HEAP8[($arrayidx188)];var $conv189=(tempInt=(($155)),(tempInt>=128?tempInt-256:tempInt));var $cmp190=((($conv189))|0)!=32;if($cmp190){__label__=63;;}else{__label__=62;;}
64502 if(__label__==62){var $156=$n;var $157=HEAP32[(($p)>>2)];var $arrayidx192=(($157+$156)&4294967295);var $158=HEAP8[($arrayidx192)];var $conv193=(tempInt=(($158)),(tempInt>=128?tempInt-256:tempInt));var $cmp194=((($conv193))|0)!=32;if(!($cmp194)){__label__=74;break $if_then128$$if_else132$64;}}
64503 var $159=HEAP32[(($p)>>2)];var $add_ptr196=(($159+-1)&4294967295);HEAP32[(($p2)>>2)]=$add_ptr196;var $160=$ix;var $conv197=((($160))&255);var $161=HEAP32[(($p)>>2)];var $arrayidx198=(($161+-1)&4294967295);HEAP8[($arrayidx198)]=$conv197;var $162=$n;var $163=HEAP32[(($p)>>2)];var $arrayidx20011=(($163+$162)&4294967295);var $164=HEAP8[($arrayidx20011)];var $165=HEAP32[(($p)>>2)];var $arrayidx20112=(($165)&4294967295);HEAP8[($arrayidx20112)]=$164;var $conv20213=(tempInt=(($164)),(tempInt>=128?tempInt-256:tempInt));var $cmp20314=((($conv20213))|0)!=32;if($cmp20314){__label__=64;;}else{__label__=65;;}
64504 $while_body204$$while_cond205_loopexit$89:do{if(__label__==64){while(1){var $166=HEAP32[(($p)>>2)];var $incdec_ptr=(($166+1)&4294967295);HEAP32[(($p)>>2)]=$incdec_ptr;var $167=$n;var $168=HEAP32[(($p)>>2)];var $arrayidx200=(($168+$167)&4294967295);var $169=HEAP8[($arrayidx200)];var $170=HEAP32[(($p)>>2)];var $arrayidx201=(($170)&4294967295);HEAP8[($arrayidx201)]=$169;var $conv202=(tempInt=(($169)),(tempInt>=128?tempInt-256:tempInt));var $cmp203=((($conv202))|0)!=32;if($cmp203){__label__=64;continue;}else{__label__=65;break $while_body204$$while_cond205_loopexit$89;}}}}while(0);var $171=$n;var $dec15=((($171)-1)&4294967295);$n=$dec15;var $cmp20616=((($171))|0)>0;if($cmp20616){__label__=66;;}else{__label__=67;;}
64505 $while_body207$$while_end209$93:do{if(__label__==66){while(1){var $172=HEAP32[(($p)>>2)];var $incdec_ptr208=(($172+1)&4294967295);HEAP32[(($p)>>2)]=$incdec_ptr208;HEAP8[($172)]=32;var $173=$n;var $dec=((($173)-1)&4294967295);$n=$dec;var $cmp206=((($173))|0)>0;if($cmp206){__label__=66;continue;}else{__label__=67;break $while_body207$$while_end209$93;}}}}while(0);var $174=$tr_addr;var $langopts210=(($174)&4294967295);var $param211=(($langopts210+24)&4294967295);var $arrayidx212=(($param211+4)&4294967295);var $175=HEAP32[(($arrayidx212)>>2)];var $tobool213=((($175))|0)!=0;if($tobool213){__label__=68;;}else{__label__=70;;}
64506 $land_lhs_true214$$if_end218$97:do{if(__label__==68){var $176=HEAP32[(($letter)>>2)];var $call215=__Z11lookupwcharPKti(((__ZL13diereses_list)&4294967295),$176);var $cmp216=((($call215))|0)>0;if(!($cmp216)){__label__=70;break $land_lhs_true214$$if_end218$97;}
64507 var $177=HEAP32[(($p2)>>2)];HEAP32[(($p)>>2)]=$177;__label__=20;continue $while_cond$28;}}while(0);var $178=$phonemes_addr;var $arrayidx219=(($178)&4294967295);HEAP8[($arrayidx219)]=0;var $179=$p_start_addr;HEAP32[(($p)>>2)]=$179;var $180=$tr_addr;var $word_vowel_count220=(($180+8296)&4294967295);HEAP32[(($word_vowel_count220)>>2)]=0;var $181=$tr_addr;var $word_stressed_count221=(($181+8300)&4294967295);HEAP32[(($word_stressed_count221)>>2)]=0;__label__=20;continue $while_cond$28;}}while(0);var $182=HEAP32[(($letter)>>2)];var $cmp224=((($182))|0)>=12800;var $183=HEAP32[(($letter)>>2)];var $cmp226=((($183))|0)<42752;var $or_cond1=($cmp224)&($cmp226);if(!($or_cond1)){__label__=74;break $if_then128$$if_else132$64;}
64508 var $184=$end_phonemes_addr;var $cmp228=((($184))|0)!=0;if(!($cmp228)){__label__=74;break $if_then128$$if_else132$64;}
64509 var $185=$tr_addr;var $call231=__Z6LookupP10TranslatorPKcPc($185,((__str9306)&4294967295),$arraydecay230);HEAP32[(($phonemes233)>>2)]=$arraydecay232;HEAP32[(($points234)>>2)]=1;var $186=$wc_bytes;var $sub235=((($186)-1)&4294967295);var $187=HEAP32[(($p)>>2)];var $add_ptr236=(($187+$sub235)&4294967295);HEAP32[(($p)>>2)]=$add_ptr236;__label__=74;break $if_then128$$if_else132$64;}}while(0);$if_end240$$if_else278$104:do{if(__label__==74){var $_pr17=HEAP32[(($points241)>>2)];var $cmp242=((($_pr17))|0)==0;if(!($cmp242)){__label__=84;break $if_end240$$if_else278$104;}
64510 var $188=HEAP32[(($wc)>>2)];var $cmp244=((($188))|0)>=768;var $189=HEAP32[(($wc)>>2)];var $cmp246=((($189))|0)<=879;var $or_cond2=($cmp244)&($cmp246);if($or_cond2){__label__=83;;}else{__label__=76;;}
64511 $if_end275$$if_else248$107:do{if(__label__==76){var $190=HEAP32[(($wc)>>2)];var $call249=__Z7IsAlphaj($190);var $tobool250=((($call249))|0)!=0;if($tobool250){__label__=77;;}else{__label__=81;;}
64512 if(__label__==77){var $191=$any_alpha;var $cmp252=((($191))|0)>1;if($cmp252){__label__=79;break $while_cond$28;}
64513 var $192=$wc_bytes;var $sub254=((($192)-1)&4294967295);var $193=HEAP32[(($p)>>2)];var $arrayidx255=(($193+$sub254)&4294967295);var $194=HEAP8[($arrayidx255)];var $conv256=(tempInt=(($194)),(tempInt>=128?tempInt-256:tempInt));var $cmp257=((($conv256))|0)>32;if($cmp257){__label__=79;break $while_cond$28;}}
64514 else if(__label__==81){var $199=$tr_addr;var $200=HEAP32[(($wc)>>2)];__Z12LookupLetterP10TranslatorjiPci($199,$200,-1,$arraydecay266,0);var $201=HEAP8[($arrayidx267)];var $tobool268=(tempInt=(($201)),(tempInt>=128?tempInt-256:tempInt))!=0;if(!($tobool268)){__label__=83;break $if_end275$$if_else248$107;}
64515 HEAP32[(($phonemes271)>>2)]=$arraydecay270;HEAP32[(($points272)>>2)]=1;;}}}while(0);var $202=$wc_bytes;var $sub276=((($202)-1)&4294967295);var $203=HEAP32[(($p)>>2)];var $add_ptr277=(($203+$sub276)&4294967295);HEAP32[(($p)>>2)]=$add_ptr277;__label__=85;break $if_end281$$if_end81$48;}}while(0);var $204=$tr_addr;var $phonemes_repeat_count=(($204+652)&4294967295);HEAP32[(($phonemes_repeat_count)>>2)]=0;;}}while(0);var $205=HEAP32[(($phonemes282)>>2)];var $cmp283=((($205))|0)==0;if($cmp283){__label__=86;;}else{__label__=87;;}
64516 if(__label__==86){HEAP32[(($phonemes285)>>2)]=((__str13643)&4294967295);;}
64517 var $206=HEAP32[(($points287)>>2)];var $cmp288=((($206))|0)>0;if(!($cmp288)){__label__=20;continue $while_cond$28;}
64518 var $207=$word_flags_addr;var $and290=($207)&-2147483648;var $tobool291=((($and290))|0)!=0;if($tobool291){__label__=89;break $while_cond$28;}
64519 var $209=HEAP32[(($phonemes295)>>2)];var $arrayidx296=(($209)&4294967295);var $210=HEAP8[($arrayidx296)];var $conv297=(tempInt=(($210)),(tempInt>=128?tempInt-256:tempInt));var $cmp298=((($conv297))|0)==21;if($cmp298){__label__=91;;}else{__label__=93;;}
64520 if(__label__==91){var $211=$word_flags_addr;var $and300=($211)&4096;var $cmp301=((($and300))|0)==0;if($cmp301){__label__=92;break $while_cond$28;}}
64521 var $214=HEAP32[(($end_type306)>>2)];var $and307=($214)&-32769;HEAP32[(($end_type306)>>2)]=$and307;var $cmp309=((($and307))|0)!=0;if($cmp309){__label__=94;;}else{__label__=101;;}
64522 $land_lhs_true310$$if_end339$125:do{if(__label__==94){var $215=$end_phonemes_addr;var $cmp311=((($215))|0)!=0;if(!($cmp311)){__label__=101;break $land_lhs_true310$$if_end339$125;}
64523 var $216=HEAP32[(($end_type313)>>2)];var $and314=($216)&1024;var $tobool315=((($and314))|0)!=0;if(!($tobool315)){__label__=97;break $while_cond$28;}
64524 var $217=$word_flags_addr;var $and317=($217)&536870912;var $tobool318=((($and317))|0)!=0;if(!($tobool318)){__label__=97;break $while_cond$28;}}}while(0);var $227=HEAP32[(($del_fwd)>>2)];var $cmp340=((($227))|0)!=0;if($cmp340){__label__=102;;}else{__label__=103;;}
64525 if(__label__==102){var $228=HEAP32[(($del_fwd342)>>2)];HEAP8[($228)]=69;;}
64526 var $229=$tr_addr;var $230=$phonemes_addr;var $231=$ph_size_addr;var $232=HEAP32[(($phonemes344)>>2)];__Z14AppendPhonemesP10TranslatorPciPKc($229,$230,$231,$232);__label__=20;continue $while_cond$28;}
64527 $while_end346$$if_then292$$if_then302$$if_else320$$if_then258$$if_then151$133:do{if(__label__==89){var $end_type=(($match1+8)&4294967295);var $208=HEAP32[(($end_type)>>2)];var $or293=($208)|1;$retval=$or293;__label__=105;break $if_then$$if_end$2;}
64528 else if(__label__==92){var $212=$phonemes_addr;var $phonemes303=(($match1+4)&4294967295);var $213=HEAP32[(($phonemes303)>>2)];var $call304=_strcpy($212,$213);$retval=0;__label__=105;break $if_then$$if_end$2;}
64529 else if(__label__==97){var $end_type321=(($match1+8)&4294967295);var $218=HEAP32[(($end_type321)>>2)];var $and322=($218)&1024;var $tobool323=((($and322))|0)!=0;if($tobool323){__label__=98;;}else{__label__=100;;}
64530 $land_lhs_true324$$if_end331$137:do{if(__label__==98){var $end_type325=(($match1+8)&4294967295);var $219=HEAP32[(($end_type325)>>2)];var $and326=($219)&127;var $cmp327=((($and326))|0)==0;if(!($cmp327)){__label__=100;break $land_lhs_true324$$if_end331$137;}
64531 var $220=HEAP32[(($p)>>2)];var $221=$p_start_addr;var $sub_ptr_lhs_cast=($220);var $sub_ptr_rhs_cast=($221);var $sub_ptr_sub=((($sub_ptr_lhs_cast)-($sub_ptr_rhs_cast))&4294967295);var $end_type329=(($match1+8)&4294967295);var $222=HEAP32[(($end_type329)>>2)];var $or330=($sub_ptr_sub)|($222);HEAP32[(($end_type329)>>2)]=$or330;;}}while(0);var $223=$end_phonemes_addr;var $phonemes332=(($match1+4)&4294967295);var $224=HEAP32[(($phonemes332)>>2)];var $call333=_strcpy($223,$224);var $225=$p_start_addr;var $arraydecay334=(($word_copy)&4294967295);var $arraydecay335=(($word_copy)&4294967295);var $call336=_strlen($arraydecay335);var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$arraydecay334;$dest$=$225;$stop$=$src$+$call336;if(($dest$%4)==($src$%4)&&$call336>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
64532 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
64533 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $end_type337=(($match1+8)&4294967295);var $226=HEAP32[(($end_type337)>>2)];$retval=$226;__label__=105;break $if_then$$if_end$2;}
64534 else if(__label__==79){var $195=$phonemes_addr;var $arrayidx259=(($195)&4294967295);HEAP8[($arrayidx259)]=0;var $196=$dict_flags_addr;var $cmp260=((($196))|0)!=0;if(!($cmp260)){__label__=104;break $while_end346$$if_then292$$if_then302$$if_else320$$if_then258$$if_then151$133;}
64535 var $197=$dict_flags_addr;var $arrayidx262=(($197)&4294967295);var $198=HEAP32[(($arrayidx262)>>2)];var $or=($198)|65536;HEAP32[(($arrayidx262)>>2)]=$or;;}
64536 else if(__label__==51){var $135=$phonemes_addr;var $136=$tr_addr;var $langopts152=(($136)&4294967295);var $ascii_language=(($langopts152+268)&4294967295);var $137=HEAP32[(($ascii_language)>>2)];var $call153=_sprintf($135,((__str70722)&4294967295),allocate([21,0,0,0,$137,0,0,0],["i32",0,0,0,"i8*",0,0,0],ALLOC_STACK));$retval=0;__label__=105;break $if_then$$if_end$2;}}while(0);var $233=$tr_addr;var $234=$phonemes_addr;var $235=$dict_flags0;__Z21ApplySpecialAttributeP10TranslatorPci($233,$234,$235);var $236=$p_start_addr;var $arraydecay347=(($word_copy)&4294967295);var $arraydecay348=(($word_copy)&4294967295);var $call349=_strlen($arraydecay348);var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$arraydecay347;$dest$=$236;$stop$=$src$+$call349;if(($dest$%4)==($src$%4)&&$call349>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
64537 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
64538 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};$retval=0;;}}while(0);var $237=$retval;STACKTOP=__stackBase__;return $237;return null;}
64539 function __Z6LookupP10TranslatorPKcPc($tr,$word,$ph_out){var __stackBase__=STACKTOP;STACKTOP+=12;_memset(__stackBase__,0,12);var __label__;var $tr_addr;var $word_addr;var $ph_out_addr;var $flags=__stackBase__;var $word1=__stackBase__+8;$tr_addr=$tr;$word_addr=$word;$ph_out_addr=$ph_out;var $arrayidx=(($flags+4)&4294967295);HEAP32[(($arrayidx)>>2)]=0;var $arrayidx1=(($flags)&4294967295);HEAP32[(($arrayidx1)>>2)]=0;var $0=$word_addr;HEAP32[(($word1)>>2)]=$0;var $1=$tr_addr;var $2=$ph_out_addr;var $arraydecay=(($flags)&4294967295);var $call=__Z14LookupDictListP10TranslatorPPcS1_PjiP8WORD_TAB($1,$word1,$2,$arraydecay,0,0);STACKTOP=__stackBase__;return $call;return null;}
64540 function __ZL9MatchRuleP10TranslatorPPcS1_iS1_P11MatchRecordii($tr,$word,$word_start,$group_length,$rule,$match_out,$word_flags,$dict_flags){var __stackBase__=STACKTOP;STACKTOP+=264;_memset(__stackBase__,0,264);var __label__;var __lastLabel__=null;var $tr_addr;var $word_addr;var $word_start_addr;var $group_length_addr;var $rule_addr;var $match_out_addr;var $word_flags_addr;var $dict_flags_addr;var $rb;var $letter;var $letter_w=__stackBase__;var $letter_xbytes;var $last_letter;var $pre_ptr;var $post_ptr;var $rule_start;var $p;var $ix;var $match_type;var $failed;var $unpron_ignore;var $consumed;var $syllable_count;var $vowel;var $letter_group;var $distance_right;var $distance_left;var $lg_pts;var $n_bytes;var $add_points;var $command;var $check_atstart;var $match=__stackBase__+4;var $total_consumed;var $condition_num;var $common_phonemes;var $group_chars;var $word_buf=__stackBase__+20;var $p222;var $vowel_count;var $p252;var $p269;var $p2;var $rule_w=__stackBase__+180;var $p419;var $pts;var $decoded_phonemes=__stackBase__+184;$tr_addr=$tr;$word_addr=$word;$word_start_addr=$word_start;$group_length_addr=$group_length;$rule_addr=$rule;$match_out_addr=$match_out;$word_flags_addr=$word_flags;$dict_flags_addr=$dict_flags;var $0=$word_addr;var $1=HEAP32[(($0)>>2)];$group_chars=$1;var $2=$rule_addr;var $cmp=((($2))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
64541 if(__label__==1){var $3=$match_out_addr;var $points=(($3)&4294967295);HEAP32[(($points)>>2)]=0;var $4=$word_addr;var $5=HEAP32[(($4)>>2)];var $incdec_ptr=(($5+1)&4294967295);HEAP32[(($4)>>2)]=$incdec_ptr;;}
64542 else if(__label__==2){$total_consumed=0;$common_phonemes=0;$match_type=0;HEAP32[((((__ZZL9MatchRuleP10TranslatorPPcS1_iS1_P11MatchRecordiiE4best)&4294967295))>>2)]=0;HEAP32[((((__ZZL9MatchRuleP10TranslatorPPcS1_iS1_P11MatchRecordiiE4best+4)&4294967295))>>2)]=((__str13643)&4294967295);HEAP32[((((__ZZL9MatchRuleP10TranslatorPPcS1_iS1_P11MatchRecordiiE4best+8)&4294967295))>>2)]=0;HEAP32[((((__ZZL9MatchRuleP10TranslatorPPcS1_iS1_P11MatchRecordiiE4best+12)&4294967295))>>2)]=0;var $6=$rule_addr;var $7=HEAP8[($6)];var $conv22=(tempInt=(($7)),(tempInt>=128?tempInt-256:tempInt));var $cmp123=((($conv22))|0)!=7;if($cmp123){__label__=3;;}else{__label__=198;;}
64543 $while_body_lr_ph$$while_end549$5:do{if(__label__==3){var $points2=(($match)&4294967295);var $end_type=(($match+8)&4294967295);var $del_fwd=(($match+12)&4294967295);var $points518=(($match)&4294967295);var $8=$match;var $points524=(($match)&4294967295);var $points530=(($match)&4294967295);var $phonemes535=(($match+4)&4294967295);var $arraydecay536=(($decoded_phonemes)&4294967295);var $arraydecay538=(($decoded_phonemes)&4294967295);var $points515=(($match)&4294967295);var $phonemes=(($match+4)&4294967295);var $phonemes13=(($match+4)&4294967295);var $phonemes23=(($match+4)&4294967295);var $phonemes29=(($match+4)&4294967295);var $phonemes32=(($match+4)&4294967295);var $phonemes43=(($match+4)&4294967295);var $points66=(($match)&4294967295);var $points499=(($match)&4294967295);var $end_type171=(($match+8)&4294967295);var $arraydecay=(($word_buf)&4294967295);var $arrayidx195=(($word_buf+1)&4294967295);var $del_fwd291=(($match+12)&4294967295);var $end_type307=(($match+8)&4294967295);;$while_body$7:while(1){var $11=$word_flags_addr;var $and=($11)&-2147483648;$unpron_ignore=$and;$match_type=0;$consumed=0;$letter=0;$distance_right=-6;$distance_left=-2;$check_atstart=0;HEAP32[(($points2)>>2)]=1;HEAP32[(($end_type)>>2)]=0;HEAP32[(($del_fwd)>>2)]=0;var $12=$word_addr;var $13=HEAP32[(($12)>>2)];$pre_ptr=$13;var $14=$word_addr;var $15=HEAP32[(($14)>>2)];var $16=$group_length_addr;var $add_ptr=(($15+$16)&4294967295);$post_ptr=$add_ptr;var $17=$rule_addr;$rule_start=$17;$failed=0;var $18=$failed;var $tobool20=((($18))|0)!=0;var $lnot21=($tobool20)^1;if($lnot21){__lastLabel__=5;__label__=6;;}else{__lastLabel__=5;__label__=183;;}
64544 $while_body4$$while_end502$9:do{if(__label__==6){$while_body4$10:while(1){var $19=$rule_addr;var $incdec_ptr5=(($19+1)&4294967295);$rule_addr=$incdec_ptr5;var $20=HEAP8[($19)];$rb=$20;var $21=$rb;var $conv6=((($21))&255);var $cmp7=((($conv6))|0)<=9;if($cmp7){__label__=7;;}else{__label__=33;;}
64545 $if_then8$$if_end70$12:do{if(__label__==7){var $22=$rb;var $conv9=((($22))&255);if($conv9==0){__label__=8;;}
64546 else if($conv9==8){__label__=18;;}
64547 else if($conv9==1){__label__=19;;}
64548 else if($conv9==2){__label__=21;;}
64549 else if($conv9==3){__label__=22;;}
64550 else if($conv9==4){__label__=23;;}
64551 else if($conv9==5){__label__=24;;}
64552 else if($conv9==9){__label__=32;;}
64553 else{__label__=30;break $if_then8$$if_end70$12;}
64554 if(__label__==8){var $23=$common_phonemes;var $cmp10=((($23))|0)!=0;if($cmp10){__label__=9;;}else{__label__=16;;}
64555 $if_then11$$if_else$16:do{if(__label__==9){var $24=$common_phonemes;HEAP32[(($phonemes)>>2)]=$24;;while(1){var $25=HEAP32[(($phonemes13)>>2)];var $incdec_ptr14=(($25+1)&4294967295);HEAP32[(($phonemes13)>>2)]=$incdec_ptr14;var $26=HEAPU8[($25)];$rb=$26;var $conv15=((($26))&255);var $cmp16=((($conv15))|0)!=0;if(!($cmp16)){__label__=17;break $if_then11$$if_else$16;}
64556 var $27=$rb;var $conv17=((($27))&255);var $cmp18=((($conv17))|0)!=3;if(!($cmp18)){__label__=17;break $if_then11$$if_else$16;}
64557 var $28=$rb;var $conv20=((($28))&255);var $cmp21=((($conv20))|0)==5;if($cmp21){__label__=13;;}else{__label__=14;;}
64558 if(__label__==13){var $29=HEAP32[(($phonemes23)>>2)];var $incdec_ptr24=(($29+1)&4294967295);HEAP32[(($phonemes23)>>2)]=$incdec_ptr24;;}
64559 var $30=$rb;var $conv26=((($30))&255);var $cmp27=((($conv26))|0)==9;if(!($cmp27)){__label__=10;continue;}
64560 var $31=HEAP32[(($phonemes29)>>2)];var $add_ptr30=(($31+2)&4294967295);HEAP32[(($phonemes29)>>2)]=$add_ptr30;__label__=10;continue;}}
64561 else if(__label__==16){HEAP32[(($phonemes32)>>2)]=((__str13643)&4294967295);;}}while(0);var $32=$rule_addr;var $incdec_ptr34=(($32+-1)&4294967295);$rule_addr=$incdec_ptr34;$failed=2;;}
64562 else if(__label__==18){$check_atstart=1;$unpron_ignore=0;$match_type=1;;}
64563 else if(__label__==19){$match_type=1;var $33=$word_flags_addr;var $and37=($33)&-2147483648;var $tobool38=((($and37))|0)!=0;if(!($tobool38)){__label__=30;break $if_then8$$if_end70$12;}
64564 $failed=1;;}
64565 else if(__label__==21){$match_type=2;;}
64566 else if(__label__==22){var $34=$rule_addr;HEAP32[(($phonemes43)>>2)]=$34;$failed=2;;}
64567 else if(__label__==23){var $35=$rule_addr;$common_phonemes=$35;;}
64568 else if(__label__==24){var $36=$rule_addr;var $incdec_ptr46=(($36+1)&4294967295);$rule_addr=$incdec_ptr46;var $37=HEAP8[($36)];$condition_num=$37;var $38=$condition_num;var $conv47=((($38))&255);var $cmp48=((($conv47))|0)>=32;var $39=$tr_addr;var $dict_condition=(($39+692)&4294967295);var $40=HEAP32[(($dict_condition)>>2)];var $41=$condition_num;var $conv50=((($41))&255);if($cmp48){__label__=25;;}else{__label__=27;;}
64569 $if_then49$$if_else55$35:do{if(__label__==25){var $sub=((($conv50)-32)&4294967295);var $shl=1<<($sub);var $and51=($shl)&($40);var $cmp52=((($and51))|0)!=0;if(!($cmp52)){__label__=29;break $if_then49$$if_else55$35;}
64570 $failed=1;__label__=30;break $if_then8$$if_end70$12;}
64571 else if(__label__==27){var $shl58=1<<($conv50);var $and59=($shl58)&($40);var $cmp60=((($and59))|0)==0;if(!($cmp60)){__label__=29;break $if_then49$$if_else55$35;}
64572 $failed=1;__label__=30;break $if_then8$$if_end70$12;}}while(0);var $_pr=$failed;var $tobool64=((($_pr))|0)!=0;if($tobool64){__label__=30;break $if_then8$$if_end70$12;}
64573 var $43=HEAP32[(($points66)>>2)];var $inc=((($43)+1)&4294967295);HEAP32[(($points66)>>2)]=$inc;;}
64574 else if(__label__==32){var $44=$rule_addr;var $add_ptr69=(($44+2)&4294967295);$rule_addr=$add_ptr69;;}}
64575 else if(__label__==33){$add_points=0;var $45=$match_type;if($45==0){__label__=34;;}
64576 else if($45==2){__label__=41;;}
64577 else if($45==1){__label__=119;;}
64578 else{__label__=181;;}
64579 $sw_epilog496$$sw_bb71$$sw_bb89$$sw_bb328$44:do{if(__label__==34){var $46=$letter;$last_letter=$46;var $47=$post_ptr;var $incdec_ptr72=(($47+1)&4294967295);$post_ptr=$incdec_ptr72;var $48=HEAP8[($47)];$letter=$48;var $49=$letter;var $conv73=((($49))&255);var $50=$rb;var $conv74=((($50))&255);var $cmp75=((($conv73))|0)==((($conv74))|0);if($cmp75){__label__=37;;}else{__label__=35;;}
64580 $if_then80$$lor_lhs_false$46:do{if(__label__==35){var $51=$letter;var $conv76=((($51))&255);var $cmp77=((($conv76))|0)==69;if($cmp77){__label__=36;;}else{__label__=40;;}
64581 if(__label__==36){var $52=$rb;var $conv78=((($52))&255);var $cmp79=((($conv78))|0)==101;if($cmp79){__label__=37;break $if_then80$$lor_lhs_false$46;}}
64582 $failed=1;__label__=30;break $if_then8$$if_end70$12;}}while(0);var $53=$letter;var $conv81=((($53))&255);var $and82=($conv81)&192;var $cmp83=((($and82))|0)!=128;if($cmp83){__label__=38;;}else{__label__=39;;}
64583 if(__label__==38){$add_points=21;;}
64584 var $54=$consumed;var $inc86=((($54)+1)&4294967295);$consumed=$inc86;;}
64585 else if(__label__==41){var $55=$distance_right;var $add=((($55)+6)&4294967295);$distance_right=$add;var $56=$distance_right;var $cmp90=((($56))|0)>18;if($cmp90){__label__=42;;}else{__label__=43;;}
64586 if(__label__==42){$distance_right=19;;}
64587 var $57=$letter;$last_letter=$57;var $58=$post_ptr;var $call=__Z7utf8_inPiPKc($letter_w,$58);var $sub93=((($call)-1)&4294967295);$letter_xbytes=$sub93;var $59=$post_ptr;var $incdec_ptr94=(($59+1)&4294967295);$post_ptr=$incdec_ptr94;var $60=HEAP8[($59)];$letter=$60;var $61=$rb;var $conv95=((($61))&255);if($conv95==17){__label__=44;;}
64588 else if($conv95==18){__label__=49;;}
64589 else if($conv95==25){__label__=52;;}
64590 else if($conv95==15){__label__=57;;}
64591 else if($conv95==16){__label__=62;;}
64592 else if($conv95==11){__label__=65;;}
64593 else if($conv95==28){__label__=68;;}
64594 else if($conv95==45){__label__=78;;}
64595 else if($conv95==21){__label__=83;;}
64596 else if($conv95==29){__label__=94;;}
64597 else if($conv95==23){__label__=101;;}
64598 else if($conv95==12){__label__=105;;}
64599 else if($conv95==13){__label__=106;;}
64600 else if($conv95==14){__label__=111;;}
64601 else if($conv95==24){__label__=112;;}
64602 else{__label__=115;;}
64603 if(__label__==115){var $186=$letter;var $conv315=((($186))&255);var $187=$rb;var $conv316=((($187))&255);var $cmp317=((($conv315))|0)==((($conv316))|0);if($cmp317){__label__=116;;}else{__label__=118;;}
64604 if(__label__==116){var $188=$letter;var $conv319=((($188))&255);var $and320=($conv319)&192;var $cmp321=((($and320))|0)!=128;if(!($cmp321)){__label__=181;break $sw_epilog496$$sw_bb71$$sw_bb89$$sw_bb328$44;}
64605 var $189=$distance_right;var $sub323=((21-($189))&4294967295);$add_points=$sub323;;}
64606 else if(__label__==118){$failed=1;__label__=30;break $if_then8$$if_end70$12;}}
64607 else if(__label__==44){var $62=$rule_addr;var $incdec_ptr97=(($62+1)&4294967295);$rule_addr=$incdec_ptr97;var $63=HEAP8[($62)];var $conv98=(tempInt=(($63)),(tempInt>=128?tempInt-256:tempInt));var $sub99=((($conv98)-65)&4294967295);$letter_group=$sub99;var $64=$tr_addr;var $65=HEAP32[(($letter_w)>>2)];var $66=$letter_group;var $call100=__ZL8IsLetterP10Translatorii($64,$65,$66);var $tobool101=((($call100))|0)!=0;if($tobool101){__label__=45;;}else{__label__=48;;}
64608 if(__label__==45){$lg_pts=20;var $67=$letter_group;var $cmp103=((($67))|0)==2;if($cmp103){__label__=46;;}else{__label__=47;;}
64609 if(__label__==46){$lg_pts=19;;}
64610 var $68=$lg_pts;var $69=$distance_right;var $sub106=((($68)-($69))&4294967295);$add_points=$sub106;var $70=$letter_xbytes;var $71=$post_ptr;var $add_ptr107=(($71+$70)&4294967295);$post_ptr=$add_ptr107;;}
64611 else if(__label__==48){$failed=1;__label__=30;break $if_then8$$if_end70$12;}}
64612 else if(__label__==49){var $72=$rule_addr;var $incdec_ptr111=(($72+1)&4294967295);$rule_addr=$incdec_ptr111;var $73=HEAP8[($72)];var $conv112=(tempInt=(($73)),(tempInt>=128?tempInt-256:tempInt));var $sub113=((($conv112)-65)&4294967295);$letter_group=$sub113;var $74=$tr_addr;var $75=$post_ptr;var $add_ptr114=(($75+-1)&4294967295);var $76=$letter_group;var $call115=__ZL13IsLetterGroupP10TranslatorPcii($74,$add_ptr114,$76,0);$n_bytes=$call115;var $cmp116=((($call115))|0)>0;if($cmp116){__label__=50;;}else{__label__=51;;}
64613 if(__label__==50){var $77=$distance_right;var $sub118=((20-($77))&4294967295);$add_points=$sub118;var $78=$n_bytes;var $sub119=((($78)-1)&4294967295);var $79=$post_ptr;var $add_ptr120=(($79+$sub119)&4294967295);$post_ptr=$add_ptr120;;}
64614 else if(__label__==51){$failed=1;__label__=30;break $if_then8$$if_end70$12;}}
64615 else if(__label__==52){var $80=$tr_addr;var $81=HEAP32[(($letter_w)>>2)];var $call124=__ZL8IsLetterP10Translatorii($80,$81,0);var $tobool125=((($call124))|0)!=0;if($tobool125){__label__=55;;}else{__label__=53;;}
64616 $if_then131$$lor_lhs_false126$77:do{if(__label__==53){var $82=HEAP32[(($letter_w)>>2)];var $cmp127=((($82))|0)==32;if($cmp127){__label__=54;;}else{__label__=56;;}
64617 if(__label__==54){var $83=$word_flags_addr;var $and129=($83)&134217728;var $tobool130=((($and129))|0)!=0;if($tobool130){__label__=55;break $if_then131$$lor_lhs_false126$77;}}
64618 var $84=$distance_right;var $sub133=((20-($84))&4294967295);$add_points=$sub133;var $85=$letter_xbytes;var $86=$post_ptr;var $add_ptr134=(($86+$85)&4294967295);$post_ptr=$add_ptr134;__label__=181;break $sw_epilog496$$sw_bb71$$sw_bb89$$sw_bb328$44;}}while(0);$failed=1;__label__=30;break $if_then8$$if_end70$12;}
64619 else if(__label__==57){var $87=HEAP32[(($letter_w)>>2)];var $call137=__Z7IsDigitj($87);var $tobool138=((($call137))|0)!=0;if($tobool138){__label__=58;;}else{__label__=59;;}
64620 if(__label__==58){var $88=$distance_right;var $sub140=((20-($88))&4294967295);$add_points=$sub140;var $89=$letter_xbytes;var $90=$post_ptr;var $add_ptr141=(($90+$89)&4294967295);$post_ptr=$add_ptr141;;}
64621 else if(__label__==59){var $91=$tr_addr;var $langopts=(($91)&4294967295);var $tone_numbers=(($langopts+250)&4294967295);var $92=HEAP8[($tone_numbers)];var $tobool143=(tempInt=(($92)),(tempInt>=128?tempInt-256:tempInt))!=0;if($tobool143){__label__=60;;}else{__label__=61;;}
64622 if(__label__==60){var $93=$distance_right;var $sub145=((20-($93))&4294967295);$add_points=$sub145;var $94=$post_ptr;var $incdec_ptr146=(($94+-1)&4294967295);$post_ptr=$incdec_ptr146;;}
64623 else if(__label__==61){$failed=1;__label__=30;break $if_then8$$if_end70$12;}}}
64624 else if(__label__==62){var $95=HEAP32[(($letter_w)>>2)];var $call151=_iswalpha($95);var $tobool152=((($call151))|0)!=0;if($tobool152){__label__=64;;}else{__label__=63;;}
64625 if(__label__==64){$failed=1;__label__=30;break $if_then8$$if_end70$12;}
64626 else if(__label__==63){var $96=$distance_right;var $sub154=((21-($96))&4294967295);$add_points=$sub154;var $97=$letter_xbytes;var $98=$post_ptr;var $add_ptr155=(($98+$97)&4294967295);$post_ptr=$add_ptr155;;}}
64627 else if(__label__==65){var $99=$letter;var $conv159=((($99))&255);var $100=$last_letter;var $conv160=((($100))&255);var $cmp161=((($conv159))|0)==((($conv160))|0);if($cmp161){__label__=66;;}else{__label__=67;;}
64628 if(__label__==66){var $101=$distance_right;var $sub163=((21-($101))&4294967295);$add_points=$sub163;;}
64629 else if(__label__==67){$failed=1;__label__=30;break $if_then8$$if_end70$12;}}
64630 else if(__label__==68){var $102=$rule_addr;var $incdec_ptr167=(($102+1)&4294967295);$rule_addr=$incdec_ptr167;var $103=HEAP8[($102)];var $conv168=(tempInt=(($103)),(tempInt>=128?tempInt-256:tempInt));$command=$conv168;var $104=$command;var $cmp169=((($104))|0)==1;if($cmp169){__label__=69;;}else{__label__=70;;}
64631 if(__label__==69){HEAP32[(($end_type171)>>2)]=32768;;}
64632 else if(__label__==70){var $105=$command;var $and173=($105)&240;var $cmp174=((($and173))|0)==16;if($cmp174){__label__=71;;}else{__label__=74;;}
64633 if(__label__==71){var $106=$dict_flags_addr;var $107=$command;var $and176=($107)&15;var $add177=((($and176)+19)&4294967295);var $shl178=1<<($add177);var $and179=($shl178)&($106);var $tobool180=((($and179))|0)!=0;if($tobool180){__label__=72;;}else{__label__=73;;}
64634 if(__label__==72){$add_points=23;;}
64635 else if(__label__==73){$failed=1;__label__=30;break $if_then8$$if_end70$12;}}
64636 else if(__label__==74){var $108=$command;var $and185=($108)&240;var $cmp186=((($and185))|0)==32;if(!($cmp186)){__label__=181;break $sw_epilog496$$sw_bb71$$sw_bb89$$sw_bb328$44;}
64637 var $109=$word_addr;var $110=HEAP32[(($109)>>2)];var $111=$word_start_addr;var $sub_ptr_lhs_cast=($110);var $sub_ptr_rhs_cast=($111);var $sub_ptr_rhs_cast_neg=(((-($sub_ptr_rhs_cast)))&4294967295);var $112=$consumed;var $113=$group_length_addr;var $sub_ptr_sub=((($sub_ptr_lhs_cast)+1)&4294967295);var $add188=((($sub_ptr_sub)+($112))&4294967295);var $add189=((($add188)+($sub_ptr_rhs_cast_neg))&4294967295);var $add190=((($add189)+($113))&4294967295);$ix=$add190;var $114=$word_start_addr;var $add_ptr191=(($114+-1)&4294967295);var $115=$ix;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$add_ptr191;$dest$=$arraydecay;$stop$=$src$+$115;if(($dest$%4)==($src$%4)&&$115>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
64638 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
64639 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $116=$ix;var $arrayidx192=(($word_buf+$116)&4294967295);HEAP8[($arrayidx192)]=32;var $117=$ix;var $add193=((($117)+1)&4294967295);var $arrayidx194=(($word_buf+$add193)&4294967295);HEAP8[($arrayidx194)]=0;var $118=$tr_addr;var $call196=__Z11LookupFlagsP10TranslatorPKc($118,$arrayidx195);var $119=$command;var $and197=($119)&15;var $add198=((($and197)+19)&4294967295);var $shl199=1<<($add198);var $and200=($shl199)&($call196);var $tobool201=((($and200))|0)!=0;if($tobool201){__label__=76;;}else{__label__=77;;}
64640 if(__label__==76){$add_points=23;;}
64641 else if(__label__==77){$failed=1;__label__=30;break $if_then8$$if_end70$12;}}}}
64642 else if(__label__==78){var $120=$letter;var $conv209=((($120))&255);var $cmp210=((($conv209))|0)==45;if($cmp210){__label__=81;;}else{__label__=79;;}
64643 $if_then217$$lor_lhs_false211$113:do{if(__label__==79){var $121=$letter;var $conv212=((($121))&255);var $cmp213=((($conv212))|0)==32;if($cmp213){__label__=80;;}else{__label__=82;;}
64644 if(__label__==80){var $122=$word_flags_addr;var $and215=($122)&16384;var $tobool216=((($and215))|0)!=0;if($tobool216){__label__=81;break $if_then217$$lor_lhs_false211$113;}}
64645 $failed=1;__label__=30;break $if_then8$$if_end70$12;}}while(0);var $123=$distance_right;var $sub218=((22-($123))&4294967295);$add_points=$sub218;;}
64646 else if(__label__==83){var $124=$post_ptr;var $125=$letter_xbytes;var $add_ptr223=(($124+$125)&4294967295);$p222=$add_ptr223;$vowel_count=0;$syllable_count=1;var $126=$rule_addr;var $127=HEAP8[($126)];var $conv22514=(tempInt=(($127)),(tempInt>=128?tempInt-256:tempInt));var $cmp22615=((($conv22514))|0)==21;if($cmp22615){__label__=84;;}else{__label__=85;;}
64647 $while_body227$$while_end230$120:do{if(__label__==84){while(1){var $128=$rule_addr;var $incdec_ptr228=(($128+1)&4294967295);$rule_addr=$incdec_ptr228;var $129=$syllable_count;var $add229=((($129)+1)&4294967295);$syllable_count=$add229;var $130=$rule_addr;var $131=HEAP8[($130)];var $conv225=(tempInt=(($131)),(tempInt>=128?tempInt-256:tempInt));var $cmp226=((($conv225))|0)==21;if($cmp226){__label__=84;continue;}else{__label__=85;break $while_body227$$while_end230$120;}}}}while(0);$vowel=0;var $132=HEAP32[(($letter_w)>>2)];var $cmp23216=((($132))|0)!=32;if($cmp23216){__lastLabel__=85;__label__=87;;}else{__lastLabel__=85;__label__=91;;}
64648 $while_body233$$while_end244$124:do{if(__label__==87){$while_body233$125:while(1){var $133=__lastLabel__==86?$_pr24:(0);var $cmp234=((($133))|0)==0;if($cmp234){__label__=88;;}else{__label__=90;;}
64649 $land_lhs_true235$$if_end240$127:do{if(__label__==88){var $134=$tr_addr;var $135=HEAP32[(($letter_w)>>2)];var $call236=__ZL8IsLetterP10Translatorii($134,$135,7);var $tobool237=((($call236))|0)!=0;if(!($tobool237)){__label__=90;break $land_lhs_true235$$if_end240$127;}
64650 var $136=$vowel_count;var $inc239=((($136)+1)&4294967295);$vowel_count=$inc239;;}}while(0);var $137=$tr_addr;var $138=HEAP32[(($letter_w)>>2)];var $call241=__ZL8IsLetterP10Translatorii($137,$138,7);$vowel=$call241;var $139=$p222;var $call242=__Z7utf8_inPiPKc($letter_w,$139);var $140=$p222;var $add_ptr243=(($140+$call242)&4294967295);$p222=$add_ptr243;var $141=HEAP32[(($letter_w)>>2)];var $cmp232=((($141))|0)!=32;if(!($cmp232)){__label__=91;break $while_body233$$while_end244$124;}
64651 var $_pr24=$vowel;__lastLabel__=86;__label__=87;continue $while_body233$125;}}}while(0);var $142=$syllable_count;var $143=$vowel_count;var $cmp245=((($142))|0)<=((($143))|0);if($cmp245){__label__=92;;}else{__label__=93;;}
64652 if(__label__==92){var $144=$syllable_count;var $145=$distance_right;var $_neg=(((-($145)))&4294967295);var $add247=((($144)+18)&4294967295);var $sub248=((($add247)+($_neg))&4294967295);$add_points=$sub248;;}
64653 else if(__label__==93){$failed=1;__label__=30;break $if_then8$$if_end70$12;}}
64654 else if(__label__==94){var $146=$post_ptr;var $147=$letter_xbytes;var $add_ptr253=(($146+$147)&4294967295);$p252=$add_ptr253;;while(1){var $148=HEAP32[(($letter_w)>>2)];var $cmp255=((($148))|0)!=32;if(!($cmp255)){__label__=99;break;}
64655 var $149=$tr_addr;var $150=HEAP32[(($letter_w)>>2)];var $call257=__ZL8IsLetterP10Translatorii($149,$150,7);var $tobool258=((($call257))|0)!=0;if($tobool258){__label__=97;break;}
64656 var $151=$p252;var $call261=__Z7utf8_inPiPKc($letter_w,$151);var $152=$p252;var $add_ptr262=(($152+$call261)&4294967295);$p252=$add_ptr262;__label__=95;continue;}
64657 if(__label__==99){var $_pr2=$failed;var $tobool264=((($_pr2))|0)!=0;if($tobool264){__label__=30;break $if_then8$$if_end70$12;}
64658 var $153=$distance_right;var $sub266=((19-($153))&4294967295);$add_points=$sub266;;}
64659 else if(__label__==97){$failed=1;__label__=30;break $if_then8$$if_end70$12;}}
64660 else if(__label__==101){var $154=$post_ptr;var $155=$letter_xbytes;var $add_ptr270=(($154+$155)&4294967295);$p269=$add_ptr270;var $156=$p269;$p2=$156;var $157=$rule_addr;var $call271=__Z7utf8_inPiPKc($rule_w,$157);var $158=HEAP32[(($letter_w)>>2)];var $159=HEAP32[(($rule_w)>>2)];var $cmp27317=((($158))|0)!=((($159))|0);var $160=HEAP32[(($letter_w)>>2)];var $cmp27518=((($160))|0)!=32;var $or_cond19=($cmp27317)&($cmp27518);if($or_cond19){__label__=102;;}else{__label__=103;;}
64661 $while_body277$$while_end280$146:do{if(__label__==102){while(1){var $161=$p269;$p2=$161;var $162=$p269;var $call278=__Z7utf8_inPiPKc($letter_w,$162);var $163=$p269;var $add_ptr279=(($163+$call278)&4294967295);$p269=$add_ptr279;var $164=HEAP32[(($letter_w)>>2)];var $165=HEAP32[(($rule_w)>>2)];var $cmp273=((($164))|0)!=((($165))|0);var $166=HEAP32[(($letter_w)>>2)];var $cmp275=((($166))|0)!=32;var $or_cond=($cmp273)&($cmp275);if($or_cond){__label__=102;continue;}else{__label__=103;break $while_body277$$while_end280$146;}}}}while(0);var $167=HEAP32[(($letter_w)>>2)];var $168=HEAP32[(($rule_w)>>2)];var $cmp281=((($167))|0)==((($168))|0);if(!($cmp281)){__label__=181;break $sw_epilog496$$sw_bb71$$sw_bb89$$sw_bb328$44;}
64662 var $169=$p2;$post_ptr=$169;;}
64663 else if(__label__==105){$add_points=20;;}
64664 else if(__label__==106){var $170=$word_addr;var $171=HEAP32[(($170)>>2)];var $172=$group_length_addr;var $add_ptr286=(($171+$172)&4294967295);$p=$add_ptr286;;while(1){var $173=$p;var $174=$post_ptr;var $cmp287=((($173))>>>0)<((($174))>>>0);if(!($cmp287)){__label__=181;break $sw_epilog496$$sw_bb71$$sw_bb89$$sw_bb328$44;}
64665 var $175=$p;var $176=HEAP8[($175)];var $conv288=(tempInt=(($176)),(tempInt>=128?tempInt-256:tempInt));var $cmp289=((($conv288))|0)==101;var $177=$p;if($cmp289){__label__=109;break;}
64666 var $incdec_ptr293=(($177+1)&4294967295);$p=$incdec_ptr293;__label__=107;continue;}
64667 HEAP32[(($del_fwd291)>>2)]=$177;;}
64668 else if(__label__==111){var $178=$rule_addr;var $arrayidx295=(($178)&4294967295);var $179=HEAP8[($arrayidx295)];var $conv296=(tempInt=(($179)),(tempInt>=128?tempInt-256:tempInt));var $shl297=((($conv296)*65536)&4294967295);var $180=$rule_addr;var $arrayidx298=(($180+1)&4294967295);var $181=HEAP8[($arrayidx298)];var $conv299=(tempInt=(($181)),(tempInt>=128?tempInt-256:tempInt));var $and300=($conv299)&127;var $shl301=((($and300)*256)&4294967295);var $182=$rule_addr;var $arrayidx303=(($182+2)&4294967295);var $183=HEAP8[($arrayidx303)];var $conv304=(tempInt=(($183)),(tempInt>=128?tempInt-256:tempInt));var $and305=($conv304)&127;var $add302=((($shl301)+($shl297))&4294967295);var $add306=((($add302)+($and305))&4294967295);HEAP32[(($end_type307)>>2)]=$add306;var $184=$rule_addr;var $add_ptr308=(($184+3)&4294967295);$rule_addr=$add_ptr308;;}
64669 else if(__label__==112){var $185=$word_flags_addr;var $and310=($185)&8192;var $tobool311=((($and310))|0)!=0;if($tobool311){__label__=113;;}else{__label__=114;;}
64670 if(__label__==113){$failed=1;__label__=30;break $if_then8$$if_end70$12;}
64671 else if(__label__==114){$add_points=1;;}}}
64672 else if(__label__==119){var $190=$distance_left;var $add329=((($190)+2)&4294967295);$distance_left=$add329;var $191=$distance_left;var $cmp330=((($191))|0)>18;if($cmp330){__label__=120;;}else{__label__=121;;}
64673 if(__label__==120){$distance_left=19;;}
64674 var $192=$pre_ptr;var $193=HEAP8[($192)];$last_letter=$193;var $194=$pre_ptr;var $incdec_ptr333=(($194+-1)&4294967295);$pre_ptr=$incdec_ptr333;var $195=$pre_ptr;var $call334=__Z8utf8_in2PiPKci($letter_w,$195,1);var $sub335=((($call334)-1)&4294967295);$letter_xbytes=$sub335;var $196=$pre_ptr;var $197=HEAP8[($196)];$letter=$197;var $198=$rb;var $conv336=((($198))&255);if($conv336==17){__label__=122;;}
64675 else if($conv336==18){__label__=127;;}
64676 else if($conv336==25){__label__=130;;}
64677 else if($conv336==11){__label__=133;;}
64678 else if($conv336==15){__label__=136;;}
64679 else if($conv336==16){__label__=139;;}
64680 else if($conv336==21){__label__=142;;}
64681 else if($conv336==10){__label__=147;;}
64682 else if($conv336==29){__label__=150;;}
64683 else if($conv336==26){__label__=157;;}
64684 else if($conv336==19){__label__=160;;}
64685 else if($conv336==46){__label__=163;;}
64686 else if($conv336==45){__label__=170;;}
64687 else{__label__=175;;}
64688 if(__label__==175){var $268=$letter;var $conv478=((($268))&255);var $269=$rb;var $conv479=((($269))&255);var $cmp480=((($conv478))|0)==((($conv479))|0);if($cmp480){__label__=176;;}else{__label__=180;;}
64689 if(__label__==176){var $270=$letter;var $conv482=((($270))&255);var $cmp483=((($conv482))|0)==32;if($cmp483){__label__=177;;}else{__label__=178;;}
64690 if(__label__==177){$add_points=4;;}
64691 else if(__label__==178){var $271=$letter;var $conv486=((($271))&255);var $and487=($conv486)&192;var $cmp488=((($and487))|0)!=128;if(!($cmp488)){__label__=181;break $sw_epilog496$$sw_bb71$$sw_bb89$$sw_bb328$44;}
64692 var $272=$distance_left;var $sub490=((21-($272))&4294967295);$add_points=$sub490;;}}
64693 else if(__label__==180){$failed=1;__label__=30;break $if_then8$$if_end70$12;}}
64694 else if(__label__==122){var $199=$rule_addr;var $incdec_ptr338=(($199+1)&4294967295);$rule_addr=$incdec_ptr338;var $200=HEAP8[($199)];var $conv339=(tempInt=(($200)),(tempInt>=128?tempInt-256:tempInt));var $sub340=((($conv339)-65)&4294967295);$letter_group=$sub340;var $201=$tr_addr;var $202=HEAP32[(($letter_w)>>2)];var $203=$letter_group;var $call341=__ZL8IsLetterP10Translatorii($201,$202,$203);var $tobool342=((($call341))|0)!=0;if($tobool342){__label__=123;;}else{__label__=126;;}
64695 if(__label__==123){$lg_pts=20;var $204=$letter_group;var $cmp344=((($204))|0)==2;if($cmp344){__label__=124;;}else{__label__=125;;}
64696 if(__label__==124){$lg_pts=19;;}
64697 var $205=$lg_pts;var $206=$distance_left;var $sub347=((($205)-($206))&4294967295);$add_points=$sub347;var $207=$letter_xbytes;var $208=$pre_ptr;var $idx_neg=(((-($207)))&4294967295);var $add_ptr348=(($208+$idx_neg)&4294967295);$pre_ptr=$add_ptr348;;}
64698 else if(__label__==126){$failed=1;__label__=30;break $if_then8$$if_end70$12;}}
64699 else if(__label__==127){var $209=$rule_addr;var $incdec_ptr352=(($209+1)&4294967295);$rule_addr=$incdec_ptr352;var $210=HEAP8[($209)];var $conv353=(tempInt=(($210)),(tempInt>=128?tempInt-256:tempInt));var $sub354=((($conv353)-65)&4294967295);$letter_group=$sub354;var $211=$tr_addr;var $212=$pre_ptr;var $213=$letter_group;var $call355=__ZL13IsLetterGroupP10TranslatorPcii($211,$212,$213,1);$n_bytes=$call355;var $cmp356=((($call355))|0)>0;if($cmp356){__label__=128;;}else{__label__=129;;}
64700 if(__label__==128){var $214=$distance_right;var $sub358=((20-($214))&4294967295);$add_points=$sub358;var $215=$n_bytes;var $sub359=((($215)-1)&4294967295);var $216=$pre_ptr;var $idx_neg360=(((-($sub359)))&4294967295);var $add_ptr361=(($216+$idx_neg360)&4294967295);$pre_ptr=$add_ptr361;;}
64701 else if(__label__==129){$failed=1;__label__=30;break $if_then8$$if_end70$12;}}
64702 else if(__label__==130){var $217=$tr_addr;var $218=HEAP32[(($letter_w)>>2)];var $call365=__ZL8IsLetterP10Translatorii($217,$218,0);var $tobool366=((($call365))|0)!=0;if($tobool366){__label__=132;;}else{__label__=131;;}
64703 if(__label__==132){$failed=1;__label__=30;break $if_then8$$if_end70$12;}
64704 else if(__label__==131){var $219=$distance_left;var $sub368=((20-($219))&4294967295);$add_points=$sub368;var $220=$letter_xbytes;var $221=$pre_ptr;var $idx_neg369=(((-($220)))&4294967295);var $add_ptr370=(($221+$idx_neg369)&4294967295);$pre_ptr=$add_ptr370;;}}
64705 else if(__label__==133){var $222=$letter;var $conv374=((($222))&255);var $223=$last_letter;var $conv375=((($223))&255);var $cmp376=((($conv374))|0)==((($conv375))|0);if($cmp376){__label__=134;;}else{__label__=135;;}
64706 if(__label__==134){var $224=$distance_left;var $sub378=((21-($224))&4294967295);$add_points=$sub378;;}
64707 else if(__label__==135){$failed=1;__label__=30;break $if_then8$$if_end70$12;}}
64708 else if(__label__==136){var $225=HEAP32[(($letter_w)>>2)];var $call382=__Z7IsDigitj($225);var $tobool383=((($call382))|0)!=0;if($tobool383){__label__=137;;}else{__label__=138;;}
64709 if(__label__==137){var $226=$distance_left;var $sub385=((21-($226))&4294967295);$add_points=$sub385;var $227=$letter_xbytes;var $228=$pre_ptr;var $idx_neg386=(((-($227)))&4294967295);var $add_ptr387=(($228+$idx_neg386)&4294967295);$pre_ptr=$add_ptr387;;}
64710 else if(__label__==138){$failed=1;__label__=30;break $if_then8$$if_end70$12;}}
64711 else if(__label__==139){var $229=HEAP32[(($letter_w)>>2)];var $call391=_iswalpha($229);var $tobool392=((($call391))|0)!=0;if($tobool392){__label__=141;;}else{__label__=140;;}
64712 if(__label__==141){$failed=1;__label__=30;break $if_then8$$if_end70$12;}
64713 else if(__label__==140){var $230=$distance_right;var $sub394=((21-($230))&4294967295);$add_points=$sub394;var $231=$letter_xbytes;var $232=$pre_ptr;var $idx_neg395=(((-($231)))&4294967295);var $add_ptr396=(($232+$idx_neg395)&4294967295);$pre_ptr=$add_ptr396;;}}
64714 else if(__label__==142){$syllable_count=1;var $233=$rule_addr;var $234=HEAP8[($233)];var $conv40112=(tempInt=(($234)),(tempInt>=128?tempInt-256:tempInt));var $cmp40213=((($conv40112))|0)==21;if($cmp40213){__label__=143;;}else{__label__=144;;}
64715 $while_body403$$while_end406$204:do{if(__label__==143){while(1){var $235=$rule_addr;var $incdec_ptr404=(($235+1)&4294967295);$rule_addr=$incdec_ptr404;var $236=$syllable_count;var $inc405=((($236)+1)&4294967295);$syllable_count=$inc405;var $237=$rule_addr;var $238=HEAP8[($237)];var $conv401=(tempInt=(($238)),(tempInt>=128?tempInt-256:tempInt));var $cmp402=((($conv401))|0)==21;if($cmp402){__label__=143;continue;}else{__label__=144;break $while_body403$$while_end406$204;}}}}while(0);var $239=$syllable_count;var $240=$tr_addr;var $word_vowel_count=(($240+8296)&4294967295);var $241=HEAP32[(($word_vowel_count)>>2)];var $cmp407=((($239))|0)<=((($241))|0);if($cmp407){__label__=145;;}else{__label__=146;;}
64716 if(__label__==145){var $242=$syllable_count;var $243=$distance_left;var $_neg11=(((-($243)))&4294967295);var $add409=((($242)+18)&4294967295);var $sub410=((($add409)+($_neg11))&4294967295);$add_points=$sub410;;}
64717 else if(__label__==146){$failed=1;__label__=30;break $if_then8$$if_end70$12;}}
64718 else if(__label__==147){var $244=$tr_addr;var $word_stressed_count=(($244+8300)&4294967295);var $245=HEAP32[(($word_stressed_count)>>2)];var $cmp414=((($245))|0)>0;if($cmp414){__label__=148;;}else{__label__=149;;}
64719 if(__label__==148){$add_points=19;;}
64720 else if(__label__==149){$failed=1;__label__=30;break $if_then8$$if_end70$12;}}
64721 else if(__label__==150){var $246=$pre_ptr;var $247=$letter_xbytes;var $idx_neg420=(((-($247)))&4294967295);var $add_ptr421=(($246+$idx_neg420)&4294967295);var $add_ptr422=(($add_ptr421+-1)&4294967295);$p419=$add_ptr422;;while(1){var $248=HEAP32[(($letter_w)>>2)];var $cmp424=((($248))|0)!=32;if(!($cmp424)){__label__=155;break;}
64722 var $249=$tr_addr;var $250=HEAP32[(($letter_w)>>2)];var $call426=__ZL8IsLetterP10Translatorii($249,$250,7);var $tobool427=((($call426))|0)!=0;if($tobool427){__label__=153;break;}
64723 var $251=$p419;var $call430=__Z8utf8_in2PiPKci($letter_w,$251,1);var $252=$p419;var $idx_neg431=(((-($call430)))&4294967295);var $add_ptr432=(($252+$idx_neg431)&4294967295);$p419=$add_ptr432;__label__=151;continue;}
64724 if(__label__==155){var $_pr4=$failed;var $tobool434=((($_pr4))|0)!=0;if($tobool434){__label__=30;break $if_then8$$if_end70$12;}
64725 $add_points=3;;}
64726 else if(__label__==153){$failed=1;__label__=30;break $if_then8$$if_end70$12;}}
64727 else if(__label__==157){var $253=$tr_addr;var $expect_verb=(($253+8272)&4294967295);var $254=HEAP32[(($expect_verb)>>2)];var $tobool438=((($254))|0)!=0;if($tobool438){__label__=158;;}else{__label__=159;;}
64728 if(__label__==158){$add_points=1;;}
64729 else if(__label__==159){$failed=1;__label__=30;break $if_then8$$if_end70$12;}}
64730 else if(__label__==160){var $255=$word_flags_addr;var $and443=($255)&2;var $tobool444=((($and443))|0)!=0;if($tobool444){__label__=161;;}else{__label__=162;;}
64731 if(__label__==161){$add_points=1;;}
64732 else if(__label__==162){$failed=1;__label__=30;break $if_then8$$if_end70$12;}}
64733 else if(__label__==163){var $256=$pre_ptr;$p=$256;;while(1){var $257=$p;var $258=HEAP8[($257)];var $conv450=(tempInt=(($258)),(tempInt>=128?tempInt-256:tempInt));var $cmp451=((($conv450))|0)!=32;if(!($cmp451)){__label__=168;break;}
64734 var $259=$p;var $260=HEAP8[($259)];var $conv453=(tempInt=(($260)),(tempInt>=128?tempInt-256:tempInt));var $cmp454=((($conv453))|0)==46;if($cmp454){__label__=166;break;}
64735 var $261=$p;var $incdec_ptr458=(($261+-1)&4294967295);$p=$incdec_ptr458;__label__=164;continue;}
64736 if(__label__==166){$add_points=50;;}
64737 var $262=$p;var $263=HEAP8[($262)];var $conv460=(tempInt=(($263)),(tempInt>=128?tempInt-256:tempInt));var $cmp461=((($conv460))|0)==32;if(!($cmp461)){__label__=181;break $sw_epilog496$$sw_bb71$$sw_bb89$$sw_bb328$44;}
64738 $failed=1;__label__=30;break $if_then8$$if_end70$12;}
64739 else if(__label__==170){var $264=$letter;var $conv465=((($264))&255);var $cmp466=((($conv465))|0)==45;if($cmp466){__label__=173;;}else{__label__=171;;}
64740 $if_then473$$lor_lhs_false467$242:do{if(__label__==171){var $265=$letter;var $conv468=((($265))&255);var $cmp469=((($conv468))|0)==32;if($cmp469){__label__=172;;}else{__label__=174;;}
64741 if(__label__==172){var $266=$word_flags_addr;var $and471=($266)&128;var $tobool472=((($and471))|0)!=0;if($tobool472){__label__=173;break $if_then473$$lor_lhs_false467$242;}}
64742 $failed=1;__label__=30;break $if_then8$$if_end70$12;}}while(0);var $267=$distance_right;var $sub474=((22-($267))&4294967295);$add_points=$sub474;;}}}while(0);var $_pr6_pr=$failed;var $cmp497=((($_pr6_pr))|0)==0;if(!($cmp497)){__label__=30;break $if_then8$$if_end70$12;}
64743 var $273=$add_points;var $274=HEAP32[(($points499)>>2)];var $add500=((($274)+($273))&4294967295);HEAP32[(($points499)>>2)]=$add500;;}}while(0);var $42=$failed;var $tobool=((($42))|0)!=0;var $lnot=($tobool)^1;if($lnot){__lastLabel__=30;__label__=6;continue $while_body4$10;}else{__lastLabel__=30;__label__=183;break $while_body4$$while_end502$9;}}}}while(0);var $275=__lastLabel__==30?$42:($18);var $cmp503=((($275))|0)==2;if($cmp503){__label__=184;;}else{__label__=197;;}
64744 $land_lhs_true504$$while_cond543$252:do{if(__label__==184){var $276=$unpron_ignore;var $cmp505=((($276))|0)==0;if(!($cmp505)){__label__=197;break $land_lhs_true504$$while_cond543$252;}
64745 var $277=$check_atstart;var $cmp507=((($277))|0)==0;if($cmp507){__label__=189;;}else{__label__=186;;}
64746 $if_end517$$lor_lhs_false508$255:do{if(__label__==186){var $278=$pre_ptr;var $arrayidx509=(($278+-1)&4294967295);var $279=HEAP8[($arrayidx509)];var $conv510=(tempInt=(($279)),(tempInt>=128?tempInt-256:tempInt));var $cmp511=((($conv510))|0)==32;if(!($cmp511)){__label__=197;break $land_lhs_true504$$while_cond543$252;}
64747 var $_pr8=$check_atstart;var $tobool513=((($_pr8))|0)!=0;if(!($tobool513)){__label__=189;break $if_end517$$lor_lhs_false508$255;}
64748 var $280=HEAP32[(($points515)>>2)];var $add516=((($280)+4)&4294967295);HEAP32[(($points515)>>2)]=$add516;;}}while(0);var $281=HEAP32[(($points518)>>2)];var $282=HEAP32[((((__ZZL9MatchRuleP10TranslatorPPcS1_iS1_P11MatchRecordiiE4best)&4294967295))>>2)];var $cmp519=((($281))|0)>=((($282))|0);if($cmp519){__label__=190;;}else{__label__=191;;}
64749 if(__label__==190){var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$8;$dest$=__ZZL9MatchRuleP10TranslatorPPcS1_iS1_P11MatchRecordiiE4best;$stop$=$src$+16;if(($dest$%4)==($src$%4)&&16>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
64750 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
64751 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $283=$consumed;$total_consumed=$283;;}
64752 var $284=HEAP32[((_option_phonemes)>>2)];var $cmp522=((($284))|0)==2;if(!($cmp522)){__label__=197;break $land_lhs_true504$$while_cond543$252;}
64753 var $285=HEAP32[(($points524)>>2)];var $cmp525=((($285))|0)>0;if(!($cmp525)){__label__=197;break $land_lhs_true504$$while_cond543$252;}
64754 var $286=$word_flags_addr;var $and527=($286)&268435456;var $cmp528=((($and527))|0)==0;if(!($cmp528)){__label__=197;break $land_lhs_true504$$while_cond543$252;}
64755 var $287=HEAP32[(($points530)>>2)];$pts=$287;var $288=$group_length_addr;var $cmp531=((($288))|0)>1;if($cmp531){__label__=195;;}else{__label__=196;;}
64756 if(__label__==195){var $289=$pts;var $add533=((($289)+35)&4294967295);$pts=$add533;;}
64757 var $290=HEAP32[(($phonemes535)>>2)];__Z14DecodePhonemesPKcPc($290,$arraydecay536);var $291=HEAP32[((_f_trans)>>2)];var $292=$pts;var $293=$group_chars;var $294=$group_length_addr;var $295=$rule_start;var $296=$word_flags_addr;var $call537=__Z10DecodeRulePKciPci($293,$294,$295,$296);var $call539=_fprintf($291,((__str32148)&4294967295),allocate([$292,0,0,0,((__ZZ10DecodeRulePKciPciE6output)&4294967295),0,0,0,$arraydecay538,0,0,0],["i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));;}}while(0);while(1){var $297=$rule_addr;var $incdec_ptr544=(($297+1)&4294967295);$rule_addr=$incdec_ptr544;var $298=HEAP8[($297)];var $conv545=(tempInt=(($298)),(tempInt>=128?tempInt-256:tempInt));var $cmp546=((($conv545))|0)!=0;if($cmp546){__label__=197;continue;}else{__label__=4;break;}}
64758 var $9=$rule_addr;var $arrayidx=(($9)&4294967295);var $10=HEAP8[($arrayidx)];var $conv=(tempInt=(($10)),(tempInt>=128?tempInt-256:tempInt));var $cmp1=((($conv))|0)!=7;if($cmp1){__label__=5;continue $while_body$7;}else{__label__=198;break $while_body_lr_ph$$while_end549$5;}}}}while(0);var $299=HEAP32[((_option_phonemes)>>2)];var $cmp550=((($299))|0)==2;if($cmp550){__label__=199;;}else{__label__=202;;}
64759 $land_lhs_true551$$if_end559$273:do{if(__label__==199){var $300=$word_flags_addr;var $and552=($300)&268435456;var $cmp553=((($and552))|0)==0;if(!($cmp553)){__label__=202;break $land_lhs_true551$$if_end559$273;}
64760 var $301=$group_length_addr;var $cmp555=((($301))|0)<=1;if(!($cmp555)){__label__=202;break $land_lhs_true551$$if_end559$273;}
64761 var $302=HEAP32[((_f_trans)>>2)];var $fputc=_fputc(10,$302);;}}while(0);var $303=$group_length_addr;var $304=$total_consumed;var $add560=((($304)+($303))&4294967295);$total_consumed=$add560;var $cmp561=((($add560))|0)==0;if($cmp561){__label__=203;;}else{__label__=204;;}
64762 if(__label__==203){$total_consumed=1;;}
64763 var $305=$total_consumed;var $306=$word_addr;var $307=HEAP32[(($306)>>2)];var $add_ptr564=(($307+$305)&4294967295);HEAP32[(($306)>>2)]=$add_ptr564;var $308=HEAP32[((((__ZZL9MatchRuleP10TranslatorPPcS1_iS1_P11MatchRecordiiE4best)&4294967295))>>2)];var $cmp565=((($308))|0)==0;if($cmp565){__label__=205;;}else{__label__=206;;}
64764 if(__label__==205){HEAP32[((((__ZZL9MatchRuleP10TranslatorPPcS1_iS1_P11MatchRecordiiE4best+4)&4294967295))>>2)]=((__str13643)&4294967295);;}
64765 var $309=$match_out_addr;var $310=$309;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=__ZZL9MatchRuleP10TranslatorPPcS1_iS1_P11MatchRecordiiE4best;$dest$=$310;$stop$=$src$+16;if(($dest$%4)==($src$%4)&&16>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
64766 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
64767 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};;}
64768 STACKTOP=__stackBase__;return;return;}
64769 function __Z21ApplySpecialAttributeP10TranslatorPci($tr,$phonemes,$dict_flags){;var __label__;var $tr_addr;var $phonemes_addr;var $dict_flags_addr;var $len;var $p_end;$tr_addr=$tr;$phonemes_addr=$phonemes;$dict_flags_addr=$dict_flags;var $0=$dict_flags_addr;var $and=($0)&3145728;var $cmp=((($and))|0)==0;if($cmp){__label__=4;;}else{__label__=1;;}
64770 $sw_epilog$$if_end$2:do{if(__label__==1){var $1=$phonemes_addr;var $call=_strlen($1);$len=$call;var $2=$len;var $sub=((($2)-1)&4294967295);var $3=$phonemes_addr;var $arrayidx=(($3+$sub)&4294967295);$p_end=$arrayidx;var $4=$tr_addr;var $translator_name=(($4+280)&4294967295);var $5=HEAP32[(($translator_name)>>2)];var $cond=((($5))|0)==29295;if(!($cond)){__label__=4;break $sw_epilog$$if_end$2;}
64771 var $6=$p_end;var $arrayidx1=(($6)&4294967295);var $7=HEAP8[($arrayidx1)];var $conv=(tempInt=(($7)),(tempInt>=128?tempInt-256:tempInt));var $call2=__Z11PhonemeCodej(106);var $cmp3=((($conv))|0)==((($call2))|0);if(!($cmp3)){__label__=4;break $sw_epilog$$if_end$2;}
64772 var $8=$p_end;var $arrayidx5=(($8)&4294967295);HEAP8[($arrayidx5)]=6;var $call6=__Z11PhonemeCodej(105);var $conv7=((($call6))&255);var $9=$p_end;var $arrayidx8=(($9+1)&4294967295);HEAP8[($arrayidx8)]=$conv7;var $10=$p_end;var $arrayidx9=(($10+2)&4294967295);HEAP8[($arrayidx9)]=0;;}}while(0);;return;return;}
64773 function __Z22ApplySpecialAttribute2P10TranslatorPci($tr,$phonemes,$dict_flags){;var __label__;var $tr_addr;var $phonemes_addr;var $dict_flags_addr;var $ix;var $len;var $p;$tr_addr=$tr;$phonemes_addr=$phonemes;$dict_flags_addr=$dict_flags;var $0=$phonemes_addr;var $call=_strlen($0);$len=$call;var $1=$tr_addr;var $langopts=(($1)&4294967295);var $param=(($langopts+24)&4294967295);var $arrayidx=(($param+60)&4294967295);var $2=HEAP32[(($arrayidx)>>2)];var $and=($2)&2;var $tobool=((($and))|0)!=0;if($tobool){__label__=1;;}else{__label__=14;;}
64774 $if_then$$if_end37$2:do{if(__label__==1){$ix=0;;while(1){var $3=$ix;var $4=$len;var $sub=((($4)-1)&4294967295);var $cmp=((($3))|0)<((($sub))|0);if(!($cmp)){__label__=14;break $if_then$$if_end37$2;}
64775 var $5=$ix;var $6=$phonemes_addr;var $arrayidx1=(($6+$5)&4294967295);var $7=HEAP8[($arrayidx1)];var $conv=(tempInt=(($7)),(tempInt>=128?tempInt-256:tempInt));var $cmp2=((($conv))|0)==6;var $8=$ix;var $add=((($8)+1)&4294967295);if($cmp2){__label__=4;break;}
64776 $ix=$add;__label__=2;continue;}
64777 var $9=$phonemes_addr;var $arrayidx4=(($9+$add)&4294967295);$p=$arrayidx4;var $10=$dict_flags_addr;var $and5=($10)&2097152;var $cmp6=((($and5))|0)!=0;var $11=$p;var $12=HEAP8[($11)];var $conv8=(tempInt=(($12)),(tempInt>=128?tempInt-256:tempInt));if($cmp6){__label__=5;;}else{__label__=9;;}
64778 if(__label__==5){var $call9=__Z11PhonemeCodej(69);var $cmp10=((($conv8))|0)==((($call9))|0);if($cmp10){__label__=6;;}else{__label__=7;;}
64779 if(__label__==6){var $call12=__Z11PhonemeCodej(101);var $conv13=((($call12))&255);var $13=$p;HEAP8[($13)]=$conv13;;}
64780 var $14=$p;var $15=HEAP8[($14)];var $conv14=(tempInt=(($15)),(tempInt>=128?tempInt-256:tempInt));var $call15=__Z11PhonemeCodej(79);var $cmp16=((($conv14))|0)==((($call15))|0);if(!($cmp16)){__label__=14;break $if_then$$if_end37$2;}
64781 var $call18=__Z11PhonemeCodej(111);var $conv19=((($call18))&255);var $16=$p;HEAP8[($16)]=$conv19;;}
64782 else if(__label__==9){var $call22=__Z11PhonemeCodej(101);var $cmp23=((($conv8))|0)==((($call22))|0);if($cmp23){__label__=10;;}else{__label__=11;;}
64783 if(__label__==10){var $call25=__Z11PhonemeCodej(69);var $conv26=((($call25))&255);var $17=$p;HEAP8[($17)]=$conv26;;}
64784 var $18=$p;var $19=HEAP8[($18)];var $conv28=(tempInt=(($19)),(tempInt>=128?tempInt-256:tempInt));var $call29=__Z11PhonemeCodej(111);var $cmp30=((($conv28))|0)==((($call29))|0);if(!($cmp30)){__label__=14;break $if_then$$if_end37$2;}
64785 var $call32=__Z11PhonemeCodej(79);var $conv33=((($call32))&255);var $20=$p;HEAP8[($20)]=$conv33;;}}}while(0);;return;return;}
64786 function __Z17TransposeAlphabetP10TranslatorPc($tr,$text){var __stackBase__=STACKTOP;STACKTOP+=4;_memset(__stackBase__,0,4);var __label__;var __lastLabel__=null;var $retval;var $tr_addr;var $text_addr;var $c=__stackBase__;var $c2;var $ix;var $offset;var $min;var $max;var $p;var $p2;var $all_alpha;var $bits;var $acc;var $pairs_start;var $pairs_list;$tr_addr=$tr;$text_addr=$text;var $0=$text_addr;$p=$0;var $1=$text_addr;$p2=$1;$all_alpha=1;var $2=$tr_addr;var $transpose_min=(($2+288)&4294967295);var $3=HEAP32[(($transpose_min)>>2)];var $sub=((($3)-1)&4294967295);$offset=$sub;var $4=$tr_addr;var $transpose_min1=(($4+288)&4294967295);var $5=HEAP32[(($transpose_min1)>>2)];$min=$5;var $6=$tr_addr;var $transpose_max=(($6+284)&4294967295);var $7=HEAP32[(($transpose_max)>>2)];$max=$7;var $8=$max;var $9=$min;var $_neg=(((-($9)))&4294967295);var $sub2=((($8)+2)&4294967295);var $add=((($sub2)+($_neg))&4294967295);$pairs_start=$add;;$do_body$2:while(1){var $10=$p;var $call=__Z7utf8_inPiPKc($c,$10);var $11=$p;var $add_ptr=(($11+$call)&4294967295);$p=$add_ptr;var $12=HEAP32[(($c)>>2)];var $13=$min;var $cmp=((($12))|0)>=((($13))|0);if($cmp){__lastLabel__=1;__label__=2;;}else{__lastLabel__=1;__label__=4;;}
64787 $land_lhs_true$$if_else$4:do{if(__label__==2){var $14=HEAP32[(($c)>>2)];var $15=$max;var $cmp3=((($14))|0)<=((($15))|0);if($cmp3){__lastLabel__=2;;}else{__lastLabel__=2;__label__=4;break $land_lhs_true$$if_else$4;}
64788 var $16=HEAP32[(($c)>>2)];var $17=$offset;var $sub4=((($16)-($17))&4294967295);var $conv=((($sub4))&255);var $18=$p2;var $incdec_ptr=(($18+1)&4294967295);$p2=$incdec_ptr;HEAP8[($18)]=$conv;__label__=6;break $land_lhs_true$$if_else$4;}}while(0);$do_cond$$if_else$7:do{if(__label__==4){var $19=__lastLabel__==2?$14:($12);var $cmp5=((($19))|0)!=0;if(!($cmp5)){__label__=6;break $do_cond$$if_else$7;}
64789 var $20=HEAP32[(($c)>>2)];var $21=$p2;var $call7=__Z8utf8_outjPc($20,$21);var $22=$p2;var $add_ptr8=(($22+$call7)&4294967295);$p2=$add_ptr8;$all_alpha=0;;}}while(0);var $23=HEAP32[(($c)>>2)];var $cmp10=((($23))|0)!=0;if($cmp10){__label__=1;continue $do_body$2;}else{__label__=7;break $do_body$2;}}
64790 var $24=$p2;HEAP8[($24)]=0;var $25=$all_alpha;var $tobool=((($25))|0)!=0;if($tobool){__label__=8;;}else{__label__=21;;}
64791 if(__label__==8){$acc=0;$bits=0;var $26=$text_addr;$p=$26;var $27=$text_addr;$p2=$27;var $28=$p;var $incdec_ptr121=(($28+1)&4294967295);$p=$incdec_ptr121;var $29=HEAP8[($28)];var $conv132=(tempInt=(($29)),(tempInt>=128?tempInt-256:tempInt));HEAP32[(($c)>>2)]=$conv132;var $cmp143=((($conv132))|0)!=0;if($cmp143){__label__=9;;}else{__label__=18;;}
64792 $while_body$$while_end$14:do{if(__label__==9){$while_body$15:while(1){var $30=$tr_addr;var $frequent_pairs=(($30+8268)&4294967295);var $31=HEAP32[(($frequent_pairs)>>2)];$pairs_list=$31;var $cmp15=((($31))|0)!=0;if($cmp15){__label__=10;;}else{__label__=15;;}
64793 $if_then16$$if_end28$17:do{if(__label__==10){var $32=HEAP32[(($c)>>2)];var $33=$p;var $34=HEAP8[($33)];var $conv17=(tempInt=(($34)),(tempInt>=128?tempInt-256:tempInt));var $shl=((($conv17)*256)&4294967295);var $add18=((($shl)+($32))&4294967295);$c2=$add18;$ix=0;;while(1){var $35=$c2;var $36=$ix;var $37=$pairs_list;var $arrayidx=(($37+2*$36)&4294967295);var $38=HEAP16[(($arrayidx)>>1)];var $conv19=(tempInt=(($38)),(tempInt>=32768?tempInt-65536:tempInt));var $cmp20=((($35))|0)>=((($conv19))|0);if(!($cmp20)){__label__=15;break $if_then16$$if_end28$17;}
64794 var $39=$c2;var $40=$ix;var $41=$pairs_list;var $arrayidx21=(($41+2*$40)&4294967295);var $42=HEAP16[(($arrayidx21)>>1)];var $conv22=(tempInt=(($42)),(tempInt>=32768?tempInt-65536:tempInt));var $cmp23=((($39))|0)==((($conv22))|0);var $43=$ix;if($cmp23){__label__=13;break;}
64795 var $inc=((($43)+1)&4294967295);$ix=$inc;__label__=11;continue;}
64796 var $44=$pairs_start;var $add25=((($44)+($43))&4294967295);HEAP32[(($c)>>2)]=$add25;var $45=$p;var $incdec_ptr26=(($45+1)&4294967295);$p=$incdec_ptr26;;}}while(0);var $46=$acc;var $shl29=((($46)*64)&4294967295);var $47=HEAP32[(($c)>>2)];var $and=($47)&63;var $add30=((($and)+($shl29))&4294967295);$acc=$add30;var $48=$bits;var $add31=((($48)+6)&4294967295);$bits=$add31;var $cmp32=((($add31))|0)>=8;if($cmp32){__label__=16;;}else{__label__=17;;}
64797 if(__label__==16){var $49=$bits;var $sub34=((($49)-8)&4294967295);$bits=$sub34;var $50=$acc;var $51=$bits;var $shr=($50)>>((($51))|0);var $conv35=((($shr))&255);var $52=$p2;var $incdec_ptr36=(($52+1)&4294967295);$p2=$incdec_ptr36;HEAP8[($52)]=$conv35;;}
64798 var $53=$p;var $incdec_ptr12=(($53+1)&4294967295);$p=$incdec_ptr12;var $54=HEAP8[($53)];var $conv13=(tempInt=(($54)),(tempInt>=128?tempInt-256:tempInt));HEAP32[(($c)>>2)]=$conv13;var $cmp14=((($conv13))|0)!=0;if($cmp14){__label__=9;continue $while_body$15;}else{__label__=18;break $while_body$$while_end$14;}}}}while(0);var $55=$bits;var $cmp38=((($55))|0)>0;if($cmp38){__label__=19;;}else{__label__=20;;}
64799 if(__label__==19){var $56=$acc;var $57=$bits;var $sub40=((8-($57))&4294967295);var $shl41=($56)<<($sub40);var $conv42=((($shl41))&255);var $58=$p2;var $incdec_ptr43=(($58+1)&4294967295);$p2=$incdec_ptr43;HEAP8[($58)]=$conv42;;}
64800 var $59=$p2;HEAP8[($59)]=0;var $60=$p2;var $61=$text_addr;var $sub_ptr_lhs_cast=($60);var $sub_ptr_rhs_cast=($61);var $sub_ptr_sub=((($sub_ptr_lhs_cast)-($sub_ptr_rhs_cast))&4294967295);var $or=($sub_ptr_sub)|64;$retval=$or;;}
64801 else if(__label__==21){var $62=$p2;var $63=$text_addr;var $sub_ptr_lhs_cast46=($62);var $sub_ptr_rhs_cast47=($63);var $sub_ptr_sub48=((($sub_ptr_lhs_cast46)-($sub_ptr_rhs_cast47))&4294967295);$retval=$sub_ptr_sub48;;}
64802 var $64=$retval;STACKTOP=__stackBase__;return $64;return null;}
64803 function __Z14LookupDictListP10TranslatorPPcS1_PjiP8WORD_TAB($tr,$wordptr,$ph_out,$flags,$end_flags,$wtab){var __stackBase__=STACKTOP;STACKTOP+=164;_memset(__stackBase__,0,164);var __label__;var __lastLabel__=null;var $retval;var $tr_addr;var $wordptr_addr;var $ph_out_addr;var $flags_addr;var $end_flags_addr;var $wtab_addr;var $length;var $found;var $word1;var $word2;var $c;var $nbytes;var $len;var $word=__stackBase__;var $letter=__stackBase__+160;$tr_addr=$tr;$wordptr_addr=$wordptr;$ph_out_addr=$ph_out;$flags_addr=$flags;$end_flags_addr=$end_flags;$wtab_addr=$wtab;$length=0;var $0=$wordptr_addr;var $1=HEAP32[(($0)>>2)];$word1=$1;$word2=$1;;$while_cond$2:while(1){var $2=$word2;var $call=__Z11utf8_nbytesPKc($2);$nbytes=$call;var $3=$word2;var $arrayidx=(($3+$call)&4294967295);var $4=HEAP8[($arrayidx)];var $conv=(tempInt=(($4)),(tempInt>=128?tempInt-256:tempInt));var $cmp=((($conv))|0)==32;if(!($cmp)){__label__=2;break $while_cond$2;}
64804 var $6=$nbytes;var $add=((($6)+1)&4294967295);var $7=$word2;var $arrayidx1=(($7+$add)&4294967295);var $8=HEAP8[($arrayidx1)];var $conv2=(tempInt=(($8)),(tempInt>=128?tempInt-256:tempInt));var $cmp3=((($conv2))|0)==46;var $9=$length;if($cmp3){__lastLabel__=3;;}else{__lastLabel__=3;__label__=5;break $while_cond$2;}
64805 var $arrayidx4=(($word+$9)&4294967295);var $10=$word2;var $11=$nbytes;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$10;$dest$=$arrayidx4;$stop$=$src$+$11;if(($dest$%4)==($src$%4)&&$11>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
64806 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
64807 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $12=$nbytes;var $13=$length;var $add5=((($13)+($12))&4294967295);$length=$add5;var $14=$length;var $inc=((($14)+1)&4294967295);$length=$inc;var $arrayidx6=(($word+$14)&4294967295);HEAP8[($arrayidx6)]=46;var $15=$nbytes;var $add7=((($15)+3)&4294967295);var $16=$word2;var $add_ptr=(($16+$add7)&4294967295);$word2=$add_ptr;__label__=1;continue $while_cond$2;}
64808 if(__label__==2){var $5=$length;__lastLabel__=2;;}
64809 var $17=__lastLabel__==2?$5:($9);var $cmp8=((($17))|0)>0;if($cmp8){__label__=6;;}else{__label__=12;;}
64810 $if_then$$if_end26$9:do{if(__label__==6){$nbytes=0;;while(1){var $18=$nbytes;var $19=$word2;var $arrayidx10=(($19+$18)&4294967295);var $20=HEAPU8[($arrayidx10)];$c=$20;var $conv11=((($20))&255);var $cmp12=((($conv11))|0)!=0;if(!($cmp12)){__label__=10;break;}
64811 var $21=$c;var $conv14=((($21))&255);var $cmp15=((($conv14))|0)!=32;if(!($cmp15)){__label__=10;break;}
64812 var $22=$nbytes;var $inc18=((($22)+1)&4294967295);$nbytes=$inc18;__label__=7;continue;}
64813 var $23=$length;var $arrayidx20=(($word+$23)&4294967295);var $24=$word2;var $25=$nbytes;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$24;$dest$=$arrayidx20;$stop$=$src$+$25;if(($dest$%4)==($src$%4)&&$25>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
64814 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
64815 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $26=$length;var $27=$nbytes;var $add21=((($27)+($26))&4294967295);var $arrayidx22=(($word+$add21)&4294967295);HEAP8[($arrayidx22)]=0;var $28=$tr_addr;var $arraydecay=(($word)&4294967295);var $29=$word2;var $30=$ph_out_addr;var $31=$flags_addr;var $32=$end_flags_addr;var $33=$wtab_addr;var $call23=__ZL11LookupDict2P10TranslatorPKcS2_PcPjiP8WORD_TAB($28,$arraydecay,$29,$30,$31,$32,$33);$found=$call23;var $tobool=((($call23))|0)!=0;if(!($tobool)){__label__=12;break $if_then$$if_end26$9;}
64816 var $34=$flags_addr;var $arrayidx25=(($34)&4294967295);var $35=HEAP32[(($arrayidx25)>>2)];var $or=($35)|128;HEAP32[(($arrayidx25)>>2)]=$or;var $36=$length;HEAP32[((_dictionary_skipwords)>>2)]=$36;$retval=1;__label__=50;break $if_then$$if_end26$9;}}while(0);if(__label__==12){$length=0;__lastLabel__=12;;$for_cond$19:while(1){var $37=__lastLabel__==19?$inc45:(0);var $cmp27=((($37))|0)<159;if(!($cmp27)){__label__=20;break $for_cond$19;}
64817 var $38=$word1;var $incdec_ptr=(($38+1)&4294967295);$word1=$incdec_ptr;var $39=HEAPU8[($38)];$c=$39;var $conv28=((($39))&255);var $cmp29=((($conv28))|0)==0;if($cmp29){__label__=20;break $for_cond$19;}
64818 var $40=$c;var $conv30=((($40))&255);var $cmp31=((($conv30))|0)==32;if($cmp31){__label__=20;break $for_cond$19;}
64819 var $41=$c;var $conv34=((($41))&255);var $cmp35=((($conv34))|0)==46;if($cmp35){__label__=17;;}else{__label__=19;;}
64820 $land_lhs_true$$if_end43$24:do{if(__label__==17){var $42=$length;var $cmp36=((($42))|0)>0;if(!($cmp36)){__label__=19;break $land_lhs_true$$if_end43$24;}
64821 var $43=$length;var $sub=((($43)-1)&4294967295);var $arrayidx38=(($word+$sub)&4294967295);var $44=HEAP8[($arrayidx38)];var $conv39=(tempInt=(($44)),(tempInt>=128?tempInt-256:tempInt));var $isdigittmp=((($conv39)-48)&4294967295);var $isdigit=((($isdigittmp))>>>0)<10;var $call40=((($isdigit))&1);var $tobool41=((($call40))|0)!=0;if($tobool41){__label__=20;break $for_cond$19;}}}while(0);var $45=$c;var $46=$length;var $arrayidx44=(($word+$46)&4294967295);HEAP8[($arrayidx44)]=$45;var $47=$length;var $inc45=((($47)+1)&4294967295);$length=$inc45;__lastLabel__=19;__label__=13;continue $for_cond$19;}
64822 var $48=$length;var $arrayidx46=(($word+$48)&4294967295);HEAP8[($arrayidx46)]=0;var $49=$tr_addr;var $arraydecay47=(($word)&4294967295);var $50=$word1;var $51=$ph_out_addr;var $52=$flags_addr;var $53=$end_flags_addr;var $54=$wtab_addr;var $call48=__ZL11LookupDict2P10TranslatorPKcS2_PcPjiP8WORD_TAB($49,$arraydecay47,$50,$51,$52,$53,$54);$found=$call48;var $55=$flags_addr;var $arrayidx49=(($55)&4294967295);var $56=HEAP32[(($arrayidx49)>>2)];var $and=($56)&134217728;var $tobool50=((($and))|0)!=0;if($tobool50){__label__=21;;}else{__label__=25;;}
64823 $if_then51$$if_else66$29:do{if(__label__==21){var $57=$ph_out_addr;var $58=$tr_addr;var $phonemes_repeat=(($58+632)&4294967295);var $arraydecay52=(($phonemes_repeat)&4294967295);var $call53=_strcmp($57,$arraydecay52);var $cmp54=((($call53))|0)==0;var $59=$tr_addr;if($cmp54){__label__=22;;}else{__label__=24;;}
64824 if(__label__==22){var $phonemes_repeat_count=(($59+652)&4294967295);var $60=HEAP32[(($phonemes_repeat_count)>>2)];var $inc56=((($60)+1)&4294967295);HEAP32[(($phonemes_repeat_count)>>2)]=$inc56;var $61=$tr_addr;var $phonemes_repeat_count57=(($61+652)&4294967295);var $62=HEAP32[(($phonemes_repeat_count57)>>2)];var $cmp58=((($62))|0)>3;if(!($cmp58)){__label__=26;break $if_then51$$if_else66$29;}
64825 var $63=$ph_out_addr;var $arrayidx60=(($63)&4294967295);HEAP8[($arrayidx60)]=0;;}
64826 else if(__label__==24){var $phonemes_repeat62=(($59+632)&4294967295);var $arraydecay63=(($phonemes_repeat62)&4294967295);var $64=$ph_out_addr;__Z8strncpy0PcPKci($arraydecay63,$64,20);var $65=$tr_addr;var $phonemes_repeat_count64=(($65+652)&4294967295);HEAP32[(($phonemes_repeat_count64)>>2)]=1;;}}
64827 else if(__label__==25){var $66=$tr_addr;var $phonemes_repeat_count67=(($66+652)&4294967295);HEAP32[(($phonemes_repeat_count67)>>2)]=0;;}}while(0);var $67=$found;var $cmp69=((($67))|0)==0;if($cmp69){__label__=27;;}else{__label__=39;;}
64828 $land_lhs_true70$$if_end117thread_pre_split$37:do{if(__label__==27){var $68=$flags_addr;var $arrayidx71=(($68+4)&4294967295);var $69=HEAP32[(($arrayidx71)>>2)];var $and72=($69)&2048;var $tobool73=((($and72))|0)!=0;if($tobool73){__label__=28;;}else{__label__=31;;}
64829 if(__label__==28){var $arraydecay75=(($word)&4294967295);$word2=$arraydecay75;var $70=$word2;var $71=HEAP8[($70)];var $conv76=(tempInt=(($71)),(tempInt>=128?tempInt-256:tempInt));var $cmp77=((($conv76))|0)==95;if($cmp77){__label__=29;;}else{__label__=30;;}
64830 if(__label__==29){var $72=$word2;var $incdec_ptr79=(($72+1)&4294967295);$word2=$incdec_ptr79;;}
64831 var $73=$word2;var $call81=__Z7utf8_inPiPKc($letter,$73);$len=$call81;var $74=$tr_addr;var $75=HEAP32[(($letter)>>2)];var $76=$ph_out_addr;__Z20LookupAccentedLetterP10TranslatorjPc($74,$75,$76);var $77=$word2;var $78=$len;var $add_ptr82=(($77+$78)&4294967295);$found=$add_ptr82;__lastLabel__=30;;}
64832 else if(__label__==31){var $_pr=$found;__lastLabel__=31;;}
64833 var $79=__lastLabel__==31?$_pr:($add_ptr82);var $cmp84=((($79))|0)==0;if(!($cmp84)){__label__=39;break $land_lhs_true70$$if_end117thread_pre_split$37;}
64834 var $80=$ph_out_addr;var $arrayidx86=(($80)&4294967295);HEAP8[($arrayidx86)]=0;var $81=$end_flags_addr;var $and87=($81)&16;var $tobool88=((($and87))|0)!=0;if($tobool88){__label__=34;;}else{__label__=36;;}
64835 $land_lhs_true89$$if_else99$47:do{if(__label__==34){var $82=$length;var $sub90=((($82)-1)&4294967295);var $arrayidx91=(($word+$sub90)&4294967295);var $83=HEAP8[($arrayidx91)];var $conv92=(tempInt=(($83)),(tempInt>=128?tempInt-256:tempInt));var $cmp93=((($conv92))|0)==101;if(!($cmp93)){__label__=36;break $land_lhs_true89$$if_else99$47;}
64836 var $84=$length;var $sub95=((($84)-1)&4294967295);var $arrayidx96=(($word+$sub95)&4294967295);HEAP8[($arrayidx96)]=0;var $85=$tr_addr;var $arraydecay97=(($word)&4294967295);var $86=$word1;var $87=$ph_out_addr;var $88=$flags_addr;var $89=$end_flags_addr;var $90=$wtab_addr;var $call98=__ZL11LookupDict2P10TranslatorPKcS2_PcPjiP8WORD_TAB($85,$arraydecay97,$86,$87,$88,$89,$90);$found=$call98;__lastLabel__=35;__label__=40;break $land_lhs_true70$$if_end117thread_pre_split$37;}}while(0);var $91=$end_flags_addr;var $and100=($91)&4096;var $tobool101=((($and100))|0)!=0;if(!($tobool101)){__label__=39;break $land_lhs_true70$$if_end117thread_pre_split$37;}
64837 var $92=$length;var $sub103=((($92)-1)&4294967295);var $arrayidx104=(($word+$sub103)&4294967295);var $93=HEAP8[($arrayidx104)];var $conv105=(tempInt=(($93)),(tempInt>=128?tempInt-256:tempInt));var $94=$length;var $sub106=((($94)-2)&4294967295);var $arrayidx107=(($word+$sub106)&4294967295);var $95=HEAP8[($arrayidx107)];var $conv108=(tempInt=(($95)),(tempInt>=128?tempInt-256:tempInt));var $cmp109=((($conv105))|0)==((($conv108))|0);if(!($cmp109)){__label__=39;break $land_lhs_true70$$if_end117thread_pre_split$37;}
64838 var $96=$length;var $sub111=((($96)-1)&4294967295);var $arrayidx112=(($word+$sub111)&4294967295);HEAP8[($arrayidx112)]=0;var $97=$tr_addr;var $arraydecay113=(($word)&4294967295);var $98=$word1;var $99=$ph_out_addr;var $100=$flags_addr;var $101=$end_flags_addr;var $102=$wtab_addr;var $call114=__ZL11LookupDict2P10TranslatorPKcS2_PcPjiP8WORD_TAB($97,$arraydecay113,$98,$99,$100,$101,$102);$found=$call114;__lastLabel__=38;__label__=40;break $land_lhs_true70$$if_end117thread_pre_split$37;}}while(0);if(__label__==39){var $_pr2=$found;__lastLabel__=39;;}
64839 var $103=__lastLabel__==39?$_pr2:(__lastLabel__==35?$call98:($call114));var $tobool118=((($103))|0)!=0;if($tobool118){__label__=41;;}else{__label__=49;;}
64840 if(__label__==41){var $104=$tr_addr;var $langopts=(($104)&4294967295);var $textmode=(($langopts+252)&4294967295);var $105=HEAP8[($textmode)];var $tobool120=(tempInt=(($105)),(tempInt>=128?tempInt-256:tempInt))!=0;if($tobool120){__label__=42;;}else{__label__=43;;}
64841 if(__label__==42){var $106=$flags_addr;var $107=HEAP32[(($106)>>2)];var $xor=($107)^536870912;HEAP32[(($106)>>2)]=$xor;;}
64842 var $108=$flags_addr;var $109=HEAP32[(($108)>>2)];var $and123=($109)&536870912;var $tobool124=((($and123))|0)!=0;if($tobool124){__label__=44;;}else{__label__=48;;}
64843 if(__label__==44){var $110=$end_flags_addr;var $and126=($110)&2;var $tobool127=((($and126))|0)!=0;if($tobool127){__label__=45;;}else{__label__=47;;}
64844 $if_then128$$if_end138$63:do{if(__label__==45){HEAP8[(((__ZZ14LookupDictListP10TranslatorPPcS1_PjiP8WORD_TABE16word_replacement)&4294967295))]=0;HEAP8[(((__ZZ14LookupDictListP10TranslatorPPcS1_PjiP8WORD_TABE16word_replacement+1)&4294967295))]=32;var $111=$ph_out_addr;var $call129=_sprintf(((__ZZ14LookupDictListP10TranslatorPPcS1_PjiP8WORD_TABE16word_replacement+2)&4294967295),((__str15131)&4294967295),allocate([$111,0,0,0],["i8*",0,0,0],ALLOC_STACK));var $112=$wordptr_addr;var $113=HEAP32[(($112)>>2)];$word1=$113;var $114=$wordptr_addr;HEAP32[(($114)>>2)]=((__ZZ14LookupDictListP10TranslatorPPcS1_PjiP8WORD_TABE16word_replacement+2)&4294967295);var $115=HEAP32[((_option_phonemes)>>2)];var $cmp130=((($115))|0)==2;if(!($cmp130)){__label__=47;break $if_then128$$if_end138$63;}
64845 var $116=$found;var $117=$word1;var $sub_ptr_lhs_cast=($116);var $sub_ptr_rhs_cast=($117);var $sub_ptr_sub=((($sub_ptr_lhs_cast)-($sub_ptr_rhs_cast))&4294967295);$len=$sub_ptr_sub;var $arraydecay132=(($word)&4294967295);var $118=$word1;var $119=$len;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$118;$dest$=$arraydecay132;$stop$=$src$+$119;if(($dest$%4)==($src$%4)&&$119>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
64846 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
64847 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $120=$len;var $arrayidx133=(($word+$120)&4294967295);HEAP8[($arrayidx133)]=0;var $121=HEAP32[((_f_trans)>>2)];var $arraydecay134=(($word)&4294967295);var $122=$wordptr_addr;var $123=HEAP32[(($122)>>2)];var $call135=_fprintf($121,((__str16132)&4294967295),allocate([$arraydecay134,0,0,0,$123,0,0,0],["i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));;}}while(0);var $124=$ph_out_addr;var $arrayidx139=(($124)&4294967295);HEAP8[($arrayidx139)]=0;$retval=0;;}
64848 else if(__label__==48){$retval=1;;}}
64849 else if(__label__==49){var $125=$ph_out_addr;var $arrayidx142=(($125)&4294967295);HEAP8[($arrayidx142)]=0;$retval=0;;}}
64850 var $126=$retval;STACKTOP=__stackBase__;return $126;return null;}
64851 function __ZL11LookupDict2P10TranslatorPKcS2_PcPjiP8WORD_TAB($tr,$word,$word2,$phonetic,$flags,$end_flags,$wtab){var __stackBase__=STACKTOP;STACKTOP+=320;_memset(__stackBase__,0,320);var __label__;var $retval;var $tr_addr;var $word_addr;var $word2_addr;var $phonetic_addr;var $flags_addr;var $end_flags_addr;var $wtab_addr;var $p;var $next;var $hash;var $phoneme_len;var $wlen;var $flag;var $dictionary_flags;var $dictionary_flags2;var $condition_failed;var $n_chars;var $no_phonemes;var $skipwords;var $ix;var $word_end;var $word1;var $wflags;var $word_buf=__stackBase__;var $flags1259;var $ph_decoded=__stackBase__+160;var $textmode;$tr_addr=$tr;$word_addr=$word;$word2_addr=$word2;$phonetic_addr=$phonetic;$flags_addr=$flags;$end_flags_addr=$end_flags;$wtab_addr=$wtab;$condition_failed=0;$wflags=0;var $0=$wtab_addr;var $cmp=((($0))|0)!=0;if($cmp){__label__=1;;}else{__label__=2;;}
64852 if(__label__==1){var $1=$wtab_addr;var $flags1=(($1)&4294967295);var $2=HEAP32[(($flags1)>>2)];$wflags=$2;;}
64853 var $3=$word_addr;$word1=$3;var $4=$tr_addr;var $transpose_min=(($4+288)&4294967295);var $5=HEAP32[(($transpose_min)>>2)];var $cmp2=((($5))|0)>0;if($cmp2){__label__=3;;}else{__label__=4;;}
64854 if(__label__==3){var $arraydecay=(($word_buf)&4294967295);var $6=$word_addr;var $call=_strcpy($arraydecay,$6);var $7=$tr_addr;var $arraydecay4=(($word_buf)&4294967295);var $call5=__Z17TransposeAlphabetP10TranslatorPc($7,$arraydecay4);$wlen=$call5;var $arraydecay6=(($word_buf)&4294967295);$word_addr=$arraydecay6;;}
64855 else if(__label__==4){var $8=$word_addr;var $call7=_strlen($8);$wlen=$call7;;}
64856 var $9=$word_addr;var $call9=__Z14HashDictionaryPKc($9);$hash=$call9;var $10=$hash;var $11=$tr_addr;var $dict_hashtab=(($11+1056)&4294967295);var $arrayidx=(($dict_hashtab+$10*4)&4294967295);var $12=HEAP32[(($arrayidx)>>2)];$p=$12;var $cmp10=((($12))|0)==0;if($cmp10){__label__=6;;}else{__label__=9;;}
64857 if(__label__==6){var $13=$flags_addr;var $cmp12=((($13))|0)!=0;if($cmp12){__label__=7;;}else{__label__=8;;}
64858 if(__label__==7){var $14=$flags_addr;HEAP32[(($14)>>2)]=0;;}
64859 $retval=0;;}
64860 else if(__label__==9){$while_cond$14:while(1){var $15=$p;var $16=HEAP8[($15)];var $conv=(tempInt=(($16)),(tempInt>=128?tempInt-256:tempInt));var $cmp16=((($conv))|0)!=0;if(!($cmp16)){__label__=95;break $while_cond$14;}
64861 var $17=$p;var $18=$p;var $arrayidx17=(($18)&4294967295);var $19=HEAP8[($arrayidx17)];var $conv18=(tempInt=(($19)),(tempInt>=128?tempInt-256:tempInt));var $add_ptr=(($17+$conv18)&4294967295);$next=$add_ptr;var $20=$p;var $arrayidx19=(($20+1)&4294967295);var $21=HEAP8[($arrayidx19)];var $conv20=(tempInt=(($21)),(tempInt>=128?tempInt-256:tempInt));var $and=($conv20)&127;var $22=$wlen;var $cmp21=((($and))|0)!=((($22))|0);if($cmp21){__label__=12;;}else{__label__=11;;}
64862 $if_then26$$lor_lhs_false$17:do{if(__label__==11){var $23=$word_addr;var $24=$p;var $arrayidx22=(($24+2)&4294967295);var $25=$wlen;var $and23=($25)&63;var $call24=_memcmp($23,$arrayidx22,$and23);var $cmp25=((($call24))|0)!=0;if($cmp25){__label__=12;break $if_then26$$lor_lhs_false$17;}
64863 var $27=$word2_addr;$word_end=$27;$dictionary_flags=0;$dictionary_flags2=0;var $28=$p;var $arrayidx28=(($28+1)&4294967295);var $29=HEAP8[($arrayidx28)];var $conv29=(tempInt=(($29)),(tempInt>=128?tempInt-256:tempInt));var $and30=($conv29)&128;$no_phonemes=$and30;var $30=$p;var $arrayidx31=(($30+1)&4294967295);var $31=HEAP8[($arrayidx31)];var $conv32=(tempInt=(($31)),(tempInt>=128?tempInt-256:tempInt));var $and33=($conv32)&63;var $add=((($and33)+2)&4294967295);var $32=$p;var $add_ptr34=(($32+$add)&4294967295);$p=$add_ptr34;var $33=$no_phonemes;var $tobool=((($33))|0)!=0;var $34=$phonetic_addr;if($tobool){__label__=14;;}else{__label__=15;;}
64864 if(__label__==14){var $arrayidx36=(($34)&4294967295);HEAP8[($arrayidx36)]=0;$phoneme_len=0;;}
64865 else if(__label__==15){var $35=$p;var $call38=_strcpy($34,$35);var $36=$p;var $call39=_strlen($36);$phoneme_len=$call39;var $37=$phoneme_len;var $add40=((($37)+1)&4294967295);var $38=$p;var $add_ptr41=(($38+$add40)&4294967295);$p=$add_ptr41;;}
64866 $while_cond43$23:while(1){var $39=$p;var $40=$next;var $cmp44=((($39))>>>0)<((($40))>>>0);if(!($cmp44)){__label__=39;break $while_cond43$23;}
64867 var $41=$p;var $incdec_ptr=(($41+1)&4294967295);$p=$incdec_ptr;var $42=HEAP8[($41)];$flag=$42;var $43=$flag;var $conv46=((($43))&255);var $cmp47=((($conv46))|0)>=100;var $44=$flag;var $conv49=((($44))&255);if($cmp47){__label__=18;;}else{__label__=23;;}
64868 if(__label__==18){var $cmp50=((($conv49))|0)>=132;var $45=$tr_addr;var $dict_condition=(($45+692)&4294967295);var $46=HEAPU32[(($dict_condition)>>2)];var $47=$flag;var $conv52=((($47))&255);if($cmp50){__label__=19;;}else{__label__=21;;}
64869 if(__label__==19){var $sub=((($conv52)-132)&4294967295);var $shl=1<<($sub);var $and53=($shl)&($46);var $cmp54=((($and53))|0)!=0;if(!($cmp54)){__label__=16;continue $while_cond43$23;}
64870 $condition_failed=1;__label__=16;continue $while_cond43$23;}
64871 else if(__label__==21){var $sub60=((($conv52)-100)&4294967295);var $shl61=1<<($sub60);var $and62=($shl61)&($46);var $cmp63=((($and62))|0)==0;if(!($cmp63)){__label__=16;continue $while_cond43$23;}
64872 $condition_failed=1;__label__=16;continue $while_cond43$23;}}
64873 else if(__label__==23){var $cmp69=((($conv49))|0)>80;if($cmp69){__label__=24;;}else{__label__=33;;}
64874 if(__label__==24){var $48=$next;var $49=$p;var $sub_ptr_lhs_cast=($48);var $sub_ptr_rhs_cast=($49);var $sub_ptr_sub=((($sub_ptr_lhs_cast)-($sub_ptr_rhs_cast))&4294967295);$n_chars=$sub_ptr_sub;var $50=$flag;var $conv71=((($50))&255);var $sub72=((($conv71)-80)&4294967295);$skipwords=$sub72;$ix=0;var $51=$ix;var $52=$skipwords;var $cmp732=((($51))|0)<=((($52))|0);if($cmp732){__label__=25;;}else{__label__=28;;}
64875 $for_body$$for_end$36:do{if(__label__==25){while(1){var $53=$wflags;var $and74=($53)&3072;var $tobool75=((($and74))|0)!=0;if($tobool75){__label__=26;;}else{__label__=27;;}
64876 if(__label__==26){$condition_failed=1;;}
64877 var $54=$ix;var $inc=((($54)+1)&4294967295);$ix=$inc;var $55=$ix;var $56=$skipwords;var $cmp73=((($55))|0)<=((($56))|0);if($cmp73){__label__=25;continue;}else{__label__=28;break $for_body$$for_end$36;}}}}while(0);var $57=$word2_addr;var $58=$p;var $59=$n_chars;var $call78=_memcmp($57,$58,$59);var $cmp79=((($call78))|0)!=0;if($cmp79){__label__=29;break $while_cond43$23;}
64878 var $_pr=$condition_failed;var $tobool82=((($_pr))|0)!=0;if($tobool82){__label__=31;break $while_cond43$23;}
64879 var $61=$dictionary_flags;var $or=($61)|128;$dictionary_flags=$or;var $62=$skipwords;HEAP32[((_dictionary_skipwords)>>2)]=$62;var $63=$next;$p=$63;var $64=$word2_addr;var $65=$n_chars;var $add_ptr85=(($64+$65)&4294967295);$word_end=$add_ptr85;__label__=16;continue $while_cond43$23;}
64880 else if(__label__==33){var $66=$flag;var $conv87=((($66))&255);var $cmp88=((($conv87))|0)>64;if($cmp88){__label__=34;;}else{__label__=36;;}
64881 if(__label__==34){var $67=$dictionary_flags;var $and90=($67)&-16;var $68=$flag;var $conv91=((($68))&255);var $and92=($conv91)&15;var $or93=($and92)|($and90);$dictionary_flags=$or93;var $69=$flag;var $conv94=((($69))&255);var $and95=($conv94)&12;var $cmp96=((($and95))|0)==12;if(!($cmp96)){__label__=16;continue $while_cond43$23;}
64882 var $70=$dictionary_flags;var $or98=($70)|2048;$dictionary_flags=$or98;__label__=16;continue $while_cond43$23;}
64883 else if(__label__==36){var $71=$flag;var $conv101=((($71))&255);var $cmp102=((($conv101))|0)>=32;var $72=$flag;var $conv104=((($72))&255);if($cmp102){__label__=37;;}else{__label__=38;;}
64884 if(__label__==37){var $sub105=((($conv104)-32)&4294967295);var $shl106=1<<($sub105);var $73=$dictionary_flags2;var $or107=($73)|($shl106);$dictionary_flags2=$or107;__label__=16;continue $while_cond43$23;}
64885 else if(__label__==38){var $shl110=1<<($conv104);var $74=$dictionary_flags;var $or111=($74)|($shl110);$dictionary_flags=$or111;__label__=16;continue $while_cond43$23;}}}}}
64886 $while_end$$if_end81_thread$$if_then83$53:do{if(__label__==29){$condition_failed=1;__label__=31;break $while_end$$if_end81_thread$$if_then83$53;}}while(0);if(__label__==31){var $60=$next;$p=$60;;}
64887 var $75=$condition_failed;var $tobool116=((($75))|0)!=0;if($tobool116){__label__=40;;}else{__label__=41;;}
64888 if(__label__==40){$condition_failed=0;__label__=9;continue $while_cond$14;}
64889 else if(__label__==41){var $76=$end_flags_addr;var $and119=($76)&4;var $cmp120=((($and119))|0)==0;if($cmp120){__label__=42;;}else{__label__=43;;}
64890 if(__label__==42){var $77=$dictionary_flags;var $and122=($77)&262144;var $tobool123=((($and122))|0)!=0;if($tobool123){__label__=9;continue $while_cond$14;}}
64891 var $78=$end_flags_addr;var $and127=($78)&1024;var $tobool128=((($and127))|0)!=0;if($tobool128){__label__=44;;}else{__label__=45;;}
64892 if(__label__==44){var $79=$dictionary_flags;var $and129=($79)&1536;var $tobool130=((($and129))|0)!=0;if($tobool130){__label__=9;continue $while_cond$14;}}
64893 var $80=$end_flags_addr;var $and133=($80)&4;var $tobool134=((($and133))|0)!=0;if($tobool134){__label__=46;;}else{__label__=49;;}
64894 $if_then135$$if_end147$67:do{if(__label__==46){var $81=$dictionary_flags;var $and136=($81)&512;var $tobool137=((($and136))|0)!=0;if($tobool137){__label__=9;continue $while_cond$14;}
64895 var $82=$dictionary_flags;var $and140=($82)&1024;var $tobool141=((($and140))|0)!=0;if(!($tobool141)){__label__=49;break $if_then135$$if_end147$67;}
64896 var $83=$end_flags_addr;var $and143=($83)&8;var $cmp144=((($and143))|0)==0;if($cmp144){__label__=9;continue $while_cond$14;}}}while(0);var $84=$dictionary_flags2;var $and148=($84)&4096;var $tobool149=((($and148))|0)!=0;if($tobool149){__label__=50;;}else{__label__=51;;}
64897 if(__label__==50){var $85=$wflags;var $and151=($85)&16384;var $tobool152=((($and151))|0)!=0;if(!($tobool152)){__label__=9;continue $while_cond$14;}}
64898 var $86=$dictionary_flags2;var $and156=($86)&512;var $tobool157=((($and156))|0)!=0;if($tobool157){__label__=52;;}else{__label__=53;;}
64899 if(__label__==52){var $87=$wflags;var $and159=($87)&2;var $tobool160=((($and159))|0)!=0;if(!($tobool160)){__label__=9;continue $while_cond$14;}}
64900 var $88=$dictionary_flags2;var $and164=($88)&1024;var $tobool165=((($and164))|0)!=0;if($tobool165){__label__=54;;}else{__label__=55;;}
64901 if(__label__==54){var $89=$wflags;var $and167=($89)&1;var $tobool168=((($and167))|0)!=0;if(!($tobool168)){__label__=9;continue $while_cond$14;}}
64902 var $90=$dictionary_flags;var $and172=($90)&33554432;var $tobool173=((($and172))|0)!=0;if($tobool173){__label__=56;;}else{__label__=57;;}
64903 if(__label__==56){var $91=$wflags;var $and175=($91)&65536;var $tobool176=((($and175))|0)!=0;if(!($tobool176)){__label__=9;continue $while_cond$14;}}
64904 var $92=$dictionary_flags;var $and180=($92)&16384;var $tobool181=((($and180))|0)!=0;if($tobool181){__label__=58;;}else{__label__=59;;}
64905 if(__label__==58){var $93=$word_end;var $94=$tr_addr;var $clause_end=(($94+8292)&4294967295);var $95=HEAPU32[(($clause_end)>>2)];var $cmp183=((($93))>>>0)<((($95))>>>0);if($cmp183){__label__=9;continue $while_cond$14;}}
64906 var $96=$dictionary_flags;var $and186=($96)&32768;var $tobool187=((($and186))|0)!=0;if($tobool187){__label__=60;;}else{__label__=61;;}
64907 if(__label__==60){var $97=$wtab_addr;var $flags189=(($97)&4294967295);var $98=HEAP32[(($flags189)>>2)];var $and190=($98)&512;var $tobool191=((($and190))|0)!=0;if(!($tobool191)){__label__=9;continue $while_cond$14;}}
64908 var $99=$dictionary_flags2;var $and194=($99)&8192;var $tobool195=((($and194))|0)!=0;if($tobool195){__label__=62;;}else{__label__=63;;}
64909 if(__label__==62){var $100=$tr_addr;var $clause_terminator=(($100+8324)&4294967295);var $101=HEAP32[(($clause_terminator)>>2)];var $and197=($101)&524288;var $tobool198=((($and197))|0)!=0;if(!($tobool198)){__label__=9;continue $while_cond$14;}}
64910 var $102=$dictionary_flags2;var $and201=($102)&16;var $tobool202=((($and201))|0)!=0;if($tobool202){__label__=64;;}else{__label__=67;;}
64911 $if_then203$$if_end213$93:do{if(__label__==64){var $103=$tr_addr;var $expect_verb=(($103+8272)&4294967295);var $104=HEAP32[(($expect_verb)>>2)];var $tobool204=((($104))|0)!=0;if($tobool204){__label__=67;break $if_then203$$if_end213$93;}
64912 var $105=$tr_addr;var $expect_verb_s=(($105+8280)&4294967295);var $106=HEAP32[(($expect_verb_s)>>2)];var $tobool206=((($106))|0)!=0;if(!($tobool206)){__label__=9;continue $while_cond$14;}
64913 var $107=$end_flags_addr;var $and208=($107)&8;var $tobool209=((($and208))|0)!=0;if(!($tobool209)){__label__=9;continue $while_cond$14;}}}while(0);var $108=$dictionary_flags2;var $and214=($108)&64;var $tobool215=((($and214))|0)!=0;if($tobool215){__label__=68;;}else{__label__=69;;}
64914 if(__label__==68){var $109=$tr_addr;var $expect_past=(($109+8276)&4294967295);var $110=HEAP32[(($expect_past)>>2)];var $tobool217=((($110))|0)!=0;if(!($tobool217)){__label__=9;continue $while_cond$14;}}
64915 var $111=$dictionary_flags2;var $and221=($111)&32;var $tobool222=((($and221))|0)!=0;if($tobool222){__label__=70;;}else{__label__=71;;}
64916 if(__label__==70){var $112=$tr_addr;var $expect_noun=(($112+8284)&4294967295);var $113=HEAP32[(($expect_noun)>>2)];var $tobool224=((($113))|0)!=0;if(!($tobool224)){__label__=9;continue $while_cond$14;}}
64917 var $114=$dictionary_flags;var $and228=($114)&2097152;var $tobool229=((($and228))|0)!=0;if(!($tobool229)){__label__=74;break $while_cond$14;}
64918 var $115=$tr_addr;var $translator_name=(($115+280)&4294967295);var $116=HEAP32[(($translator_name)>>2)];var $cmp231=((($116))|0)==26741;if(!($cmp231)){__label__=74;break $while_cond$14;}
64919 var $117=$tr_addr;var $prev_dict_flags=(($117+8320)&4294967295);var $118=HEAP32[(($prev_dict_flags)>>2)];var $and233=($118)&1048576;var $tobool234=((($and233))|0)!=0;if($tobool234){__label__=74;break $while_cond$14;}else{__label__=9;continue $while_cond$14;}}}}while(0);var $26=$next;$p=$26;__label__=9;continue $while_cond$14;}
64920 if(__label__==95){$retval=0;;}
64921 else if(__label__==74){var $119=$flags_addr;var $cmp238=((($119))|0)!=0;if($cmp238){__label__=75;;}else{__label__=76;;}
64922 if(__label__==75){var $120=$dictionary_flags;var $or240=($120)|1073741824;var $121=$flags_addr;var $arrayidx241=(($121)&4294967295);HEAP32[(($arrayidx241)>>2)]=$or240;var $122=$dictionary_flags2;var $123=$flags_addr;var $arrayidx242=(($123+4)&4294967295);HEAP32[(($arrayidx242)>>2)]=$122;;}
64923 var $124=$phoneme_len;var $cmp244=((($124))|0)==0;if($cmp244){__label__=77;;}else{__label__=80;;}
64924 if(__label__==77){var $125=HEAP32[((_option_phonemes)>>2)];var $cmp246=((($125))|0)==2;if($cmp246){__label__=78;;}else{__label__=79;;}
64925 if(__label__==78){var $126=HEAP32[((_f_trans)>>2)];var $127=$word1;var $128=$flags_addr;var $call248=__Z22print_dictionary_flagsPj($128);var $call249=_fprintf($126,((__str28144)&4294967295),allocate([$127,0,0,0,((__ZZ22print_dictionary_flagsPjE3buf)&4294967295),0,0,0],["i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));;}
64926 $retval=0;;}
64927 else if(__label__==80){var $129=$flags_addr;var $cmp252=((($129))|0)!=0;if($cmp252){__label__=81;;}else{__label__=82;;}
64928 if(__label__==81){var $130=$flags_addr;var $arrayidx254=(($130)&4294967295);var $131=HEAP32[(($arrayidx254)>>2)];var $or255=($131)|-2147483648;HEAP32[(($arrayidx254)>>2)]=$or255;;}
64929 var $132=HEAP32[((_option_phonemes)>>2)];var $cmp257=((($132))|0)==2;if($cmp257){__label__=83;;}else{__label__=94;;}
64930 $if_then258$$if_end296$122:do{if(__label__==83){$flags1259=0;var $133=$phonetic_addr;var $arraydecay260=(($ph_decoded)&4294967295);__Z14DecodePhonemesPKcPc($133,$arraydecay260);var $134=$flags_addr;var $cmp261=((($134))|0)!=0;if($cmp261){__label__=84;;}else{__label__=85;;}
64931 if(__label__==84){var $135=$flags_addr;var $arrayidx263=(($135)&4294967295);var $136=HEAP32[(($arrayidx263)>>2)];$flags1259=$136;;}
64932 var $137=$dictionary_flags;var $and265=($137)&536870912;var $cmp266=((($and265))|0)==0;if($cmp266){__label__=86;;}else{__label__=87;;}
64933 if(__label__==86){$textmode=0;;}
64934 else if(__label__==87){$textmode=1;;}
64935 var $138=$textmode;var $139=HEAP32[((_translator)>>2)];var $langopts=(($139)&4294967295);var $textmode270=(($langopts+252)&4294967295);var $140=HEAP8[($textmode270)];var $conv271=(tempInt=(($140)),(tempInt>=128?tempInt-256:tempInt));var $cmp272=((($138))|0)==((($conv271))|0);if(!($cmp272)){__label__=94;break $if_then258$$if_end296$122;}
64936 var $141=HEAP32[((_dictionary_skipwords)>>2)];var $tobool274=((($141))|0)!=0;if($tobool274){__label__=90;;}else{__label__=92;;}
64937 $land_lhs_true275$$if_else289$132:do{if(__label__==90){var $142=$wtab_addr;var $cmp276=((($142))|0)!=0;if(!($cmp276)){__label__=92;break $land_lhs_true275$$if_else289$132;}
64938 var $arraydecay278=(($word_buf)&4294967295);var $143=$word2_addr;var $144=$word_end;var $145=$word2_addr;var $sub_ptr_lhs_cast279=($144);var $sub_ptr_rhs_cast280=($145);var $sub_ptr_sub281=((($sub_ptr_lhs_cast279)-($sub_ptr_rhs_cast280))&4294967295);var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$143;$dest$=$arraydecay278;$stop$=$src$+$sub_ptr_sub281;if(($dest$%4)==($src$%4)&&$sub_ptr_sub281>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
64939 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
64940 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $146=$word_end;var $147=$word2_addr;var $sub_ptr_lhs_cast282=($146);var $sub_ptr_rhs_cast283=($147);var $sub_ptr_rhs_cast283_neg=(((-($sub_ptr_rhs_cast283)))&4294967295);var $sub_ptr_sub284=((($sub_ptr_lhs_cast282)-1)&4294967295);var $sub285=((($sub_ptr_sub284)+($sub_ptr_rhs_cast283_neg))&4294967295);var $arrayidx286=(($word_buf+$sub285)&4294967295);HEAP8[($arrayidx286)]=0;var $148=HEAP32[((_f_trans)>>2)];var $149=$word1;var $arraydecay287=(($word_buf)&4294967295);var $call288=_fprintf($148,((__str29145)&4294967295),allocate([$149,0,0,0,$arraydecay287,0,0,0],["i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));__label__=93;break $land_lhs_true275$$if_else289$132;}}while(0);if(__label__==92){var $150=HEAP32[((_f_trans)>>2)];var $151=$word1;var $call290=_fprintf($150,((__str30146)&4294967295),allocate([$151,0,0,0],["i8*",0,0,0],ALLOC_STACK));;}
64941 var $152=HEAP32[((_f_trans)>>2)];var $arraydecay292=(($ph_decoded)&4294967295);var $153=$flags_addr;var $call293=__Z22print_dictionary_flagsPj($153);var $call294=_fprintf($152,((__str31147)&4294967295),allocate([$arraydecay292,0,0,0,((__ZZ22print_dictionary_flagsPjE3buf)&4294967295),0,0,0],["i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));;}}while(0);var $154=$word_end;$retval=$154;;}}}
64942 var $155=$retval;STACKTOP=__stackBase__;return $155;return null;}
64943 function __Z11LookupFlagsP10TranslatorPKc($tr,$word){var __stackBase__=STACKTOP;STACKTOP+=104;_memset(__stackBase__,0,104);var __label__;var $tr_addr;var $word_addr;var $buf=__stackBase__;var $word1=__stackBase__+100;$tr_addr=$tr;$word_addr=$word;HEAP32[((((__ZZ11LookupFlagsP10TranslatorPKcE5flags+4)&4294967295))>>2)]=0;HEAP32[((((__ZZ11LookupFlagsP10TranslatorPKcE5flags)&4294967295))>>2)]=0;var $0=$word_addr;HEAP32[(($word1)>>2)]=$0;var $1=$tr_addr;var $arraydecay=(($buf)&4294967295);var $call=__Z14LookupDictListP10TranslatorPPcS1_PjiP8WORD_TAB($1,$word1,$arraydecay,((__ZZ11LookupFlagsP10TranslatorPKcE5flags)&4294967295),0,0);var $2=HEAP32[((((__ZZ11LookupFlagsP10TranslatorPKcE5flags)&4294967295))>>2)];STACKTOP=__stackBase__;return $2;return null;}
64944 function __Z12RemoveEndingP10TranslatorPciS1_($tr,$word,$end_type,$word_copy){;var __label__;var __lastLabel__=null;var $tr_addr;var $word_addr;var $end_type_addr;var $word_copy_addr;var $i;var $word_end;var $len_ending;var $end_flags;var $p;var $len;$tr_addr=$tr;$word_addr=$word;$end_type_addr=$end_type;$word_copy_addr=$word_copy;var $0=$word_addr;$word_end=$0;var $1=$word_end;var $2=HEAP8[($1)];var $conv8=(tempInt=(($2)),(tempInt>=128?tempInt-256:tempInt));var $cmp10=((($conv8))|0)!=32;var $3=$word_end;if($cmp10){__lastLabel__=0;__label__=1;;}else{__lastLabel__=0;__label__=4;;}
64945 $for_body$$for_end$2:do{if(__label__==1){while(1){var $4=__lastLabel__==3?$10:($3);var $5=HEAP8[($4)];var $conv1=(tempInt=(($5)),(tempInt>=128?tempInt-256:tempInt));var $cmp2=((($conv1))|0)==69;if($cmp2){__label__=2;;}else{__label__=3;;}
64946 if(__label__==2){var $6=$word_end;HEAP8[($6)]=101;;}
64947 var $7=$word_end;var $incdec_ptr=(($7+1)&4294967295);$word_end=$incdec_ptr;var $8=$word_end;var $9=HEAP8[($8)];var $conv=(tempInt=(($9)),(tempInt>=128?tempInt-256:tempInt));var $cmp=((($conv))|0)!=32;var $10=$word_end;if($cmp){__lastLabel__=3;__label__=1;continue;}else{__lastLabel__=3;__label__=4;break $for_body$$for_end$2;}}}}while(0);var $_lcssa7=__lastLabel__==0?$3:($10);var $11=$word_addr;var $sub_ptr_lhs_cast=($_lcssa7);var $sub_ptr_rhs_cast=($11);var $sub_ptr_sub=((($sub_ptr_lhs_cast)-($sub_ptr_rhs_cast))&4294967295);$i=$sub_ptr_sub;var $12=$word_copy_addr;var $13=$word_addr;var $14=$i;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$13;$dest$=$12;$stop$=$src$+$14;if(($dest$%4)==($src$%4)&&$14>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
64948 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
64949 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $15=$i;var $16=$word_copy_addr;var $arrayidx=(($16+$15)&4294967295);HEAP8[($arrayidx)]=0;var $17=$end_type_addr;var $and=($17)&63;$i=$and;$len_ending=$and;var $cmp46=((($and))|0)>0;if($cmp46){__label__=5;;}else{__label__=8;;}
64950 $for_body5$$for_end12$9:do{if(__label__==5){$for_body5$10:while(1){var $18=$word_end;var $incdec_ptr6=(($18+-1)&4294967295);$word_end=$incdec_ptr6;var $19=$word_end;var $20=HEAP8[($19)];var $conv73=(tempInt=(($20)),(tempInt>=128?tempInt-256:tempInt));var $and84=($conv73)&192;var $cmp95=((($and84))|0)==128;if($cmp95){__label__=6;;}else{__label__=7;;}
64951 $while_body$$for_inc11$12:do{if(__label__==6){while(1){var $21=$word_end;var $incdec_ptr10=(($21+-1)&4294967295);$word_end=$incdec_ptr10;var $22=$len_ending;var $inc=((($22)+1)&4294967295);$len_ending=$inc;var $23=$word_end;var $24=HEAP8[($23)];var $conv7=(tempInt=(($24)),(tempInt>=128?tempInt-256:tempInt));var $and8=($conv7)&192;var $cmp9=((($and8))|0)==128;if($cmp9){__label__=6;continue;}else{__label__=7;break $while_body$$for_inc11$12;}}}}while(0);var $25=$i;var $dec=((($25)-1)&4294967295);$i=$dec;var $cmp4=((($dec))|0)>0;if($cmp4){__label__=5;continue $for_body5$10;}else{__label__=8;break $for_body5$$for_end12$9;}}}}while(0);$i=0;var $26=$i;var $27=$len_ending;var $cmp142=((($26))|0)<((($27))|0);var $28=$i;if($cmp142){__lastLabel__=8;__label__=9;;}else{__lastLabel__=8;__label__=10;;}
64952 $for_body15$$for_end21$17:do{if(__label__==9){while(1){var $29=__lastLabel__==9?$38:($28);var $30=$word_end;var $arrayidx16=(($30+$29)&4294967295);var $31=HEAP8[($arrayidx16)];var $32=$i;var $arrayidx17=((__ZZ12RemoveEndingP10TranslatorPciS1_E6ending+$32)&4294967295);HEAP8[($arrayidx17)]=$31;var $33=$i;var $34=$word_end;var $arrayidx18=(($34+$33)&4294967295);HEAP8[($arrayidx18)]=32;var $35=$i;var $inc20=((($35)+1)&4294967295);$i=$inc20;var $36=$i;var $37=$len_ending;var $cmp14=((($36))|0)<((($37))|0);var $38=$i;if($cmp14){__lastLabel__=9;__label__=9;continue;}else{__lastLabel__=9;__label__=10;break $for_body15$$for_end21$17;}}}}while(0);var $_lcssa=__lastLabel__==8?$28:($38);var $arrayidx22=((__ZZ12RemoveEndingP10TranslatorPciS1_E6ending+$_lcssa)&4294967295);HEAP8[($arrayidx22)]=0;var $39=$word_end;var $incdec_ptr23=(($39+-1)&4294967295);$word_end=$incdec_ptr23;var $40=$end_type_addr;var $and24=($40)&65520;var $or=($and24)|4;$end_flags=$or;var $41=$end_type_addr;var $and25=($41)&512;var $tobool=((($and25))|0)!=0;if($tobool){__label__=11;;}else{__label__=13;;}
64953 $if_then26$$if_end33$21:do{if(__label__==11){var $42=$word_end;var $arrayidx27=(($42)&4294967295);var $43=HEAP8[($arrayidx27)];var $conv28=(tempInt=(($43)),(tempInt>=128?tempInt-256:tempInt));var $cmp29=((($conv28))|0)==105;if(!($cmp29)){__label__=13;break $if_then26$$if_end33$21;}
64954 var $44=$word_end;var $arrayidx31=(($44)&4294967295);HEAP8[($arrayidx31)]=121;;}}while(0);var $45=$end_type_addr;var $and34=($45)&256;var $tobool35=((($and34))|0)!=0;if($tobool35){__label__=14;;}else{__label__=33;;}
64955 $if_then36$$if_end98$25:do{if(__label__==14){var $46=$tr_addr;var $translator_name=(($46+280)&4294967295);var $47=HEAP32[(($translator_name)>>2)];var $cmp37=((($47))|0)==25966;var $48=$tr_addr;if($cmp37){__label__=15;;}else{__label__=28;;}
64956 $if_then38$$if_else80$27:do{if(__label__==15){var $49=$word_end;var $arrayidx39=(($49+-1)&4294967295);var $50=HEAP8[($arrayidx39)];var $conv40=(tempInt=(($50)),(tempInt>=128?tempInt-256:tempInt));var $call=__ZL8IsLetterP10Translatorii($48,$conv40,7);var $tobool41=((($call))|0)!=0;if($tobool41){__label__=16;;}else{__label__=23;;}
64957 $land_lhs_true$$if_else$29:do{if(__label__==16){var $51=$tr_addr;var $52=$word_end;var $arrayidx42=(($52)&4294967295);var $53=HEAP8[($arrayidx42)];var $conv43=(tempInt=(($53)),(tempInt>=128?tempInt-256:tempInt));var $call44=__ZL8IsLetterP10Translatorii($51,$conv43,1);var $tobool45=((($call44))|0)!=0;if(!($tobool45)){__label__=23;break $land_lhs_true$$if_else$29;}
64958 $i=0;;while(1){var $54=$i;var $arrayidx48=((__ZZ12RemoveEndingP10TranslatorPciS1_E16add_e_exceptions+$54*4)&4294967295);var $55=HEAP32[(($arrayidx48)>>2)];$p=$55;var $cmp49=((($55))|0)!=0;if(!($cmp49)){__label__=22;break;}
64959 var $56=$p;var $call51=_strlen($56);$len=$call51;var $57=$p;var $58=$len;var $sub=((1-($58))&4294967295);var $59=$word_end;var $arrayidx52=(($59+$sub)&4294967295);var $60=$len;var $call53=_memcmp($57,$arrayidx52,$60);var $cmp54=((($call53))|0)==0;if($cmp54){__label__=21;break;}
64960 var $61=$i;var $inc58=((($61)+1)&4294967295);$i=$inc58;__label__=18;continue;}
64961 if(__label__==21){var $_pr=$p;var $cmp60=((($_pr))|0)==0;if(!($cmp60)){__label__=30;break $if_then38$$if_else80$27;}}
64962 var $62=$end_flags;var $or62=($62)|16;$end_flags=$or62;__label__=30;break $if_then38$$if_else80$27;}}while(0);$i=0;;while(1){var $63=$i;var $arrayidx65=((__ZZ12RemoveEndingP10TranslatorPciS1_E15add_e_additions+$63*4)&4294967295);var $64=HEAP32[(($arrayidx65)>>2)];$p=$64;var $cmp66=((($64))|0)!=0;if(!($cmp66)){__label__=30;break $if_then38$$if_else80$27;}
64963 var $65=$p;var $call68=_strlen($65);$len=$call68;var $66=$p;var $67=$len;var $sub69=((1-($67))&4294967295);var $68=$word_end;var $arrayidx70=(($68+$sub69)&4294967295);var $69=$len;var $call71=_memcmp($66,$arrayidx70,$69);var $cmp72=((($call71))|0)==0;if($cmp72){__label__=26;break;}
64964 var $71=$i;var $inc77=((($71)+1)&4294967295);$i=$inc77;__label__=24;continue;}
64965 var $70=$end_flags;var $or74=($70)|16;$end_flags=$or74;;}
64966 else if(__label__==28){var $langopts=(($48)&4294967295);var $suffix_add_e=(($langopts+276)&4294967295);var $72=HEAP32[(($suffix_add_e)>>2)];var $cmp81=((($72))|0)!=0;if(!($cmp81)){__label__=30;break $if_then38$$if_else80$27;}
64967 var $73=$end_flags;var $or83=($73)|16;$end_flags=$or83;;}}while(0);var $74=$end_flags;var $and86=($74)&16;var $tobool87=((($and86))|0)!=0;if(!($tobool87)){__label__=33;break $if_then36$$if_end98$25;}
64968 var $75=$tr_addr;var $langopts89=(($75)&4294967295);var $suffix_add_e90=(($langopts89+276)&4294967295);var $76=HEAP32[(($suffix_add_e90)>>2)];var $77=$word_end;var $arrayidx91=(($77+1)&4294967295);var $call92=__Z8utf8_outjPc($76,$arrayidx91);var $78=HEAP32[((_option_phonemes)>>2)];var $cmp93=((($78))|0)==2;if(!($cmp93)){__label__=33;break $if_then36$$if_end98$25;}
64969 var $79=HEAP32[((_f_trans)>>2)];var $80=_fwrite(((__str25141)&4294967295),6,1,$79);;}}while(0);var $81=$end_type_addr;var $and99=($81)&2048;var $tobool100=((($and99))|0)!=0;if($tobool100){__label__=34;;}else{__label__=36;;}
64970 $land_lhs_true101$$if_end105$51:do{if(__label__==34){var $82=$tr_addr;var $expect_verb=(($82+8272)&4294967295);var $83=HEAP32[(($expect_verb)>>2)];var $cmp102=((($83))|0)==0;if(!($cmp102)){__label__=36;break $land_lhs_true101$$if_end105$51;}
64971 var $84=$tr_addr;var $expect_verb104=(($84+8272)&4294967295);HEAP32[(($expect_verb104)>>2)]=1;;}}while(0);var $call106=_strcmp(((__ZZ12RemoveEndingP10TranslatorPciS1_E6ending)&4294967295),((__str5172)&4294967295));var $cmp107=((($call106))|0)==0;if($cmp107){__label__=38;;}else{__label__=37;;}
64972 $if_then110$$lor_lhs_false$55:do{if(__label__==37){var $call108=_strcmp(((__ZZ12RemoveEndingP10TranslatorPciS1_E6ending)&4294967295),((__str27143)&4294967295));var $cmp109=((($call108))|0)==0;if($cmp109){__label__=38;break $if_then110$$lor_lhs_false$55;}else{__label__=39;break $if_then110$$lor_lhs_false$55;}}}while(0);if(__label__==38){var $85=$end_flags;var $or111=($85)|8;$end_flags=$or111;;}
64973 var $86=HEAP8[(((__ZZ12RemoveEndingP10TranslatorPciS1_E6ending)&4294967295))];var $conv113=(tempInt=(($86)),(tempInt>=128?tempInt-256:tempInt));var $cmp114=((($conv113))|0)==39;if($cmp114){__label__=40;;}else{__label__=41;;}
64974 if(__label__==40){var $87=$end_flags;var $and116=($87)&-5;$end_flags=$and116;;}
64975 var $88=$end_flags;;return $88;return null;}
64976 function __ZL13IsLetterGroupP10TranslatorPcii($tr,$word,$group,$pre){;var __label__;var $retval;var $tr_addr;var $word_addr;var $group_addr;var $pre_addr;var $p;var $w;var $len;$tr_addr=$tr;$word_addr=$word;$group_addr=$group;$pre_addr=$pre;$len=0;var $0=$group_addr;var $1=$tr_addr;var $letterGroups=(($1+5152)&4294967295);var $arrayidx=(($letterGroups+$0*4)&4294967295);var $2=HEAP32[(($arrayidx)>>2)];$p=$2;var $3=$p;var $cmp=((($3))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
64977 if(__label__==1){$retval=0;;}
64978 else if(__label__==2){$while_cond$4:while(1){var $4=$p;var $5=HEAP8[($4)];var $conv=(tempInt=(($5)),(tempInt>=128?tempInt-256:tempInt));var $cmp1=((($conv))|0)!=7;if(!($cmp1)){__label__=13;break $while_cond$4;}
64979 var $6=$pre_addr;var $tobool=((($6))|0)!=0;if($tobool){__label__=4;;}else{__label__=5;;}
64980 if(__label__==4){var $7=$p;var $call=_strlen($7);$len=$call;var $8=$word_addr;var $9=$len;var $idx_neg=(((-($9)))&4294967295);var $add_ptr=(($8+$idx_neg)&4294967295);var $add_ptr3=(($add_ptr+1)&4294967295);$w=$add_ptr3;;}
64981 else if(__label__==5){var $10=$word_addr;$w=$10;;}
64982 var $11=$p;var $12=HEAP8[($11)];var $conv61=(tempInt=(($12)),(tempInt>=128?tempInt-256:tempInt));var $13=$w;var $14=HEAP8[($13)];var $conv72=(tempInt=(($14)),(tempInt>=128?tempInt-256:tempInt));var $cmp83=((($conv61))|0)==((($conv72))|0);if($cmp83){__label__=7;;}else{__label__=8;;}
64983 $while_body9$$while_end$11:do{if(__label__==7){while(1){var $15=$w;var $incdec_ptr=(($15+1)&4294967295);$w=$incdec_ptr;var $16=$p;var $incdec_ptr10=(($16+1)&4294967295);$p=$incdec_ptr10;var $17=$p;var $18=HEAP8[($17)];var $conv6=(tempInt=(($18)),(tempInt>=128?tempInt-256:tempInt));var $19=$w;var $20=HEAP8[($19)];var $conv7=(tempInt=(($20)),(tempInt>=128?tempInt-256:tempInt));var $cmp8=((($conv6))|0)==((($conv7))|0);if($cmp8){__label__=7;continue;}else{__label__=8;break $while_body9$$while_end$11;}}}}while(0);var $21=$p;var $22=HEAP8[($21)];var $conv11=(tempInt=(($22)),(tempInt>=128?tempInt-256:tempInt));var $cmp12=((($conv11))|0)==0;if($cmp12){__label__=9;break $while_cond$4;}
64984 while(1){var $27=$p;var $incdec_ptr19=(($27+1)&4294967295);$p=$incdec_ptr19;var $28=HEAP8[($27)];var $conv20=(tempInt=(($28)),(tempInt>=128?tempInt-256:tempInt));var $cmp21=((($conv20))|0)!=0;if($cmp21){__label__=12;continue;}else{__label__=2;continue $while_cond$4;}}}
64985 if(__label__==13){$retval=0;;}
64986 else if(__label__==9){var $23=$pre_addr;var $tobool14=((($23))|0)!=0;if($tobool14){__label__=10;;}else{__label__=11;;}
64987 if(__label__==10){var $24=$len;$retval=$24;;}
64988 else if(__label__==11){var $25=$w;var $26=$word_addr;var $sub_ptr_lhs_cast=($25);var $sub_ptr_rhs_cast=($26);var $sub_ptr_sub=((($sub_ptr_lhs_cast)-($sub_ptr_rhs_cast))&4294967295);$retval=$sub_ptr_sub;;}}}
64989 var $29=$retval;;return $29;return null;}
64990 function __Z11CalcPitchesP10Translatori($tr,$clause_type){var __stackBase__=STACKTOP;STACKTOP+=6000;_memset(__stackBase__,0,6000);var __label__;var __lastLabel__=null;var $tr_addr;var $clause_type_addr;var $p;var $syl;var $ix;var $x;var $st_ix;var $n_st;var $option;var $group_tone;var $group_tone_emph;var $group_tone_comma;var $ph_start;var $st_start;var $st_clause_end;var $count;var $n_primary;var $count_primary;var $ph;var $ph_end;var $syllable_tab2=__stackBase__;$tr_addr=$tr;$clause_type_addr=$clause_type;$ph_start=0;var $0=HEAP32[((_n_phoneme_list)>>2)];$ph_end=$0;var $arraydecay=(($syllable_tab2)&4294967295);HEAP32[((__ZL12syllable_tab)>>2)]=$arraydecay;$n_st=0;$n_primary=0;$ix=0;var $1=$ix;var $2=HEAP32[((_n_phoneme_list)>>2)];var $sub4=((($2)-1)&4294967295);var $cmp5=((($1))|0)<((($sub4))|0);if($cmp5){__label__=1;;}else{__label__=8;;}
64991 $for_body$$for_end$2:do{if(__label__==1){$for_body$3:while(1){var $3=$ix;var $arrayidx=((_phoneme_list+$3*24)&4294967295);$p=$arrayidx;var $4=$p;var $synthflags=(($4+4)&4294967295);var $5=HEAPU16[(($synthflags)>>1)];var $conv=((($5))&65535);var $and=($conv)&4;var $tobool=((($and))|0)!=0;if($tobool){__label__=2;;}else{__label__=4;;}
64992 $if_then$$if_else$5:do{if(__label__==2){var $6=$n_st;var $7=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx1=(($7+6*$6)&4294967295);var $flags=(($arrayidx1+2)&4294967295);HEAP8[($flags)]=0;var $8=$n_st;var $9=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx2=(($9+6*$8)&4294967295);var $env=(($arrayidx2+1)&4294967295);HEAP8[($env)]=0;var $10=$ix;var $add=((($10)+1)&4294967295);var $arrayidx3=((_phoneme_list+$add*24)&4294967295);var $type=(($arrayidx3+15)&4294967295);var $11=HEAP8[($type)];var $12=$n_st;var $13=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx4=(($13+6*$12)&4294967295);var $nextph_type=(($arrayidx4+3)&4294967295);HEAP8[($nextph_type)]=$11;var $14=$p;var $stresslevel=(($14+1)&4294967295);var $15=HEAP8[($stresslevel)];var $16=$n_st;var $inc=((($16)+1)&4294967295);$n_st=$inc;var $17=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx5=(($17+6*$16)&4294967295);var $stress=(($arrayidx5)&4294967295);HEAP8[($stress)]=$15;var $18=$p;var $stresslevel6=(($18+1)&4294967295);var $19=HEAPU8[($stresslevel6)];var $conv7=((($19))&255);var $cmp8=((($conv7))|0)>=4;if(!($cmp8)){__label__=7;break $if_then$$if_else$5;}
64993 var $20=$n_primary;var $inc10=((($20)+1)&4294967295);$n_primary=$inc10;;}
64994 else if(__label__==4){var $21=$p;var $ph11=(($21+8)&4294967295);var $22=HEAP32[(($ph11)>>2)];var $code=(($22+10)&4294967295);var $23=HEAPU8[($code)];var $conv12=((($23))&255);var $cmp13=((($conv12))|0)==27;if(!($cmp13)){__label__=7;break $if_then$$if_else$5;}
64995 var $24=$n_st;var $cmp14=((($24))|0)>0;if(!($cmp14)){__label__=7;break $if_then$$if_else$5;}
64996 var $25=$n_st;var $sub16=((($25)-1)&4294967295);var $26=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx17=(($26+6*$sub16)&4294967295);var $flags18=(($arrayidx17+2)&4294967295);var $27=HEAP8[($flags18)];var $conv19=(tempInt=(($27)),(tempInt>=128?tempInt-256:tempInt));var $or=($conv19)|4;var $conv20=((($or))&255);HEAP8[($flags18)]=$conv20;;}}while(0);var $28=$ix;var $inc23=((($28)+1)&4294967295);$ix=$inc23;var $29=$ix;var $30=HEAP32[((_n_phoneme_list)>>2)];var $sub=((($30)-1)&4294967295);var $cmp=((($29))|0)<((($sub))|0);if($cmp){__label__=1;continue $for_body$3;}else{__label__=8;break $for_body$$for_end$2;}}}}while(0);var $31=$n_st;var $32=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx24=(($32+6*$31)&4294967295);var $stress25=(($arrayidx24)&4294967295);HEAP8[($stress25)]=0;var $33=$n_st;var $cmp26=((($33))|0)==0;if($cmp26){__label__=70;;}else{__label__=9;;}
64997 $for_end258$$if_end28$13:do{if(__label__==9){var $34=$tr_addr;var $langopts=(($34)&4294967295);var $tone_language=(($langopts+224)&4294967295);var $35=HEAP32[(($tone_language)>>2)];var $cmp29=((($35))|0)==1;var $36=$tr_addr;if($cmp29){__label__=10;;}else{__label__=11;;}
64998 if(__label__==10){var $37=$clause_type_addr;__ZL16CalcPitches_ToneP10Translatori($36,$37);;}
64999 else if(__label__==11){var $langopts32=(($36)&4294967295);var $intonation_group=(($langopts32+228)&4294967295);var $38=HEAP32[(($intonation_group)>>2)];$option=$38;var $39=$option;var $cmp33=((($39))|0)>=8;if($cmp33){__label__=12;;}else{__label__=13;;}
65000 $if_end35_thread$$if_end35$18:do{if(__label__==12){$option=1;var $40=$clause_type_addr;__lastLabel__=12;__label__=15;break $if_end35_thread$$if_end35$18;}
65001 else if(__label__==13){var $cmp36=((($39))|0)==0;var $41=$clause_type_addr;if($cmp36){__lastLabel__=13;;}else{__lastLabel__=13;__label__=15;break $if_end35_thread$$if_end35$18;}
65002 var $42=$tr_addr;var $langopts38=(($42)&4294967295);var $tunes=(($langopts38+232)&4294967295);var $arrayidx39=(($tunes+$41)&4294967295);var $43=HEAPU8[($arrayidx39)];var $conv40=((($43))&255);$group_tone=$conv40;var $44=$tr_addr;var $langopts41=(($44)&4294967295);var $tunes42=(($langopts41+232)&4294967295);var $arrayidx43=(($tunes42+5)&4294967295);var $45=HEAPU8[($arrayidx43)];var $conv44=((($45))&255);$group_tone_emph=$conv44;var $46=$tr_addr;var $langopts45=(($46)&4294967295);var $tunes46=(($langopts45+232)&4294967295);var $arrayidx47=(($tunes46+1)&4294967295);var $47=HEAPU8[($arrayidx47)];var $conv48=((($47))&255);$group_tone_comma=$conv48;__label__=16;break $if_end35_thread$$if_end35$18;}}while(0);if(__label__==15){var $48=__lastLabel__==12?$40:($41);var $49=$option;var $50=$tr_addr;var $punct_to_tone=(($50+1000)&4294967295);var $arrayidx50=(($punct_to_tone+$49*6)&4294967295);var $arrayidx51=(($arrayidx50+$48)&4294967295);var $51=HEAPU8[($arrayidx51)];var $conv52=((($51))&255);$group_tone=$conv52;var $52=$option;var $53=$tr_addr;var $punct_to_tone53=(($53+1000)&4294967295);var $arrayidx54=(($punct_to_tone53+$52*6)&4294967295);var $arrayidx55=(($arrayidx54+5)&4294967295);var $54=HEAPU8[($arrayidx55)];var $conv56=((($54))&255);$group_tone_emph=$conv56;var $55=$option;var $56=$tr_addr;var $punct_to_tone57=(($56+1000)&4294967295);var $arrayidx58=(($punct_to_tone57+$55*6)&4294967295);var $arrayidx59=(($arrayidx58+1)&4294967295);var $57=HEAPU8[($arrayidx59)];var $conv60=((($57))&255);$group_tone_comma=$conv60;;}
65003 var $58=$clause_type_addr;var $cmp62=((($58))|0)==4;if($cmp62){__label__=17;;}else{__label__=18;;}
65004 if(__label__==17){HEAP8[(__ZL8no_tonic_b)]=1;;}
65005 else if(__label__==18){HEAP8[(__ZL8no_tonic_b)]=0;;}
65006 $st_start=0;$count_primary=0;$st_ix=0;var $59=$st_ix;var $60=$n_st;var $cmp673=((($59))|0)<((($60))|0);if($cmp673){__label__=20;;}else{__label__=54;;}
65007 $for_body68$$for_end177$29:do{if(__label__==20){$for_body68$30:while(1){var $61=$st_ix;var $62=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx69=(($62+6*$61)&4294967295);$syl=$arrayidx69;var $63=$syl;var $stress70=(($63)&4294967295);var $64=HEAP8[($stress70)];var $conv71=(tempInt=(($64)),(tempInt>=128?tempInt-256:tempInt));var $cmp72=((($conv71))|0)>=4;if($cmp72){__label__=21;;}else{__label__=22;;}
65008 if(__label__==21){var $65=$count_primary;var $inc74=((($65)+1)&4294967295);$count_primary=$inc74;;}
65009 var $66=$syl;var $stress76=(($66)&4294967295);var $67=HEAP8[($stress76)];var $conv77=(tempInt=(($67)),(tempInt>=128?tempInt-256:tempInt));var $cmp78=((($conv77))|0)==6;if($cmp78){__label__=23;;}else{__label__=36;;}
65010 $if_then79$$if_end124$35:do{if(__label__==23){var $68=$st_ix;var $sub80=((($68)-1)&4294967295);$ix=$sub80;;$for_cond81$37:while(1){var $69=$ix;var $70=$st_start;var $cmp82=((($69))|0)>=((($70))|0);if(!($cmp82)){__label__=30;break $for_cond81$37;}
65011 var $71=$ix;var $72=$st_ix;var $sub83=((($72)-3)&4294967295);var $cmp84=((($71))|0)>=((($sub83))|0);if(!($cmp84)){__label__=30;break $for_cond81$37;}
65012 var $73=$ix;var $74=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx86=(($74+6*$73)&4294967295);var $stress87=(($arrayidx86)&4294967295);var $75=HEAP8[($stress87)];var $conv88=(tempInt=(($75)),(tempInt>=128?tempInt-256:tempInt));var $cmp89=((($conv88))|0)==6;if($cmp89){__label__=30;break $for_cond81$37;}
65013 var $76=$ix;var $77=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx92=(($77+6*$76)&4294967295);var $stress93=(($arrayidx92)&4294967295);var $78=HEAP8[($stress93)];var $conv94=(tempInt=(($78)),(tempInt>=128?tempInt-256:tempInt));var $cmp95=((($conv94))|0)==4;var $79=$ix;if($cmp95){__label__=28;break $for_cond81$37;}
65014 var $dec=((($79)-1)&4294967295);$ix=$dec;__label__=24;continue $for_cond81$37;}
65015 if(__label__==28){var $80=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx97=(($80+6*$79)&4294967295);var $stress98=(($arrayidx97)&4294967295);HEAP8[($stress98)]=3;;}
65016 var $81=$st_ix;var $add102=((($81)+1)&4294967295);$ix=$add102;;while(1){var $82=$ix;var $83=$n_st;var $cmp104=((($82))|0)<((($83))|0);if(!($cmp104)){__label__=36;break $if_then79$$if_end124$35;}
65017 var $84=$ix;var $85=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx106=(($85+6*$84)&4294967295);var $stress107=(($arrayidx106)&4294967295);var $86=HEAP8[($stress107)];var $conv108=(tempInt=(($86)),(tempInt>=128?tempInt-256:tempInt));var $cmp109=((($conv108))|0)==4;if($cmp109){__label__=36;break $if_then79$$if_end124$35;}
65018 var $87=$ix;var $88=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx112=(($88+6*$87)&4294967295);var $stress113=(($arrayidx112)&4294967295);var $89=HEAP8[($stress113)];var $conv114=(tempInt=(($89)),(tempInt>=128?tempInt-256:tempInt));var $cmp115=((($conv114))|0)==6;if($cmp115){__label__=34;break;}
65019 var $93=$ix;var $inc122=((($93)+1)&4294967295);$ix=$inc122;__label__=31;continue;}
65020 var $90=$st_ix;var $91=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx117=(($91+6*$90)&4294967295);var $flags118=(($arrayidx117+2)&4294967295);HEAP8[($flags118)]=2;var $92=$syl;var $stress119=(($92)&4294967295);HEAP8[($stress119)]=5;;}}while(0);var $94=$syl;var $stress125=(($94)&4294967295);var $95=HEAP8[($stress125)];var $conv126=(tempInt=(($95)),(tempInt>=128?tempInt-256:tempInt));var $cmp127=((($conv126))|0)==6;if($cmp127){__label__=37;;}else{__label__=50;;}
65021 if(__label__==37){var $96=$st_ix;var $97=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx129=(($97+6*$96)&4294967295);var $flags130=(($arrayidx129+2)&4294967295);HEAP8[($flags130)]=2;$count=0;var $98=$n_primary;var $99=$count_primary;var $sub131=((($98)-($99))&4294967295);var $cmp132=((($sub131))|0)>1;if($cmp132){__label__=38;;}else{__label__=39;;}
65022 if(__label__==38){$count=1;;}
65023 var $100=$st_ix;var $add135=((($100)+1)&4294967295);$ix=$add135;;$for_cond136$58:while(1){var $101=$ix;var $102=$n_st;var $cmp137=((($101))|0)<((($102))|0);if(!($cmp137)){__label__=45;break $for_cond136$58;}
65024 var $103=$ix;var $104=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx139=(($104+6*$103)&4294967295);var $stress140=(($arrayidx139)&4294967295);var $105=HEAP8[($stress140)];var $conv141=(tempInt=(($105)),(tempInt>=128?tempInt-256:tempInt));var $cmp142=((($conv141))|0)>4;if($cmp142){__label__=45;break $for_cond136$58;}
65025 var $106=$ix;var $107=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx145=(($107+6*$106)&4294967295);var $stress146=(($arrayidx145)&4294967295);var $108=HEAP8[($stress146)];var $conv147=(tempInt=(($108)),(tempInt>=128?tempInt-256:tempInt));var $cmp148=((($conv147))|0)==4;if($cmp148){__label__=43;;}else{__label__=44;;}
65026 if(__label__==43){var $109=$count;var $inc150=((($109)+1)&4294967295);$count=$inc150;var $110=$count;var $cmp151=((($110))|0)>1;if($cmp151){__label__=45;break $for_cond136$58;}}
65027 var $111=$ix;var $inc156=((($111)+1)&4294967295);$ix=$inc156;__label__=40;continue $for_cond136$58;}
65028 var $112=$st_start;var $113=$ix;var $114=$n_st;__ZL18count_pitch_vowelsiii($112,$113,$114);var $115=$ix;var $116=$n_st;var $cmp158=((($115))|0)<((($116))|0);if($cmp158){__label__=47;;}else{__label__=46;;}
65029 $if_then160$$lor_lhs_false$66:do{if(__label__==46){var $117=$clause_type_addr;var $cmp159=((($117))|0)==0;if($cmp159){__label__=47;break $if_then160$$lor_lhs_false$66;}
65030 var $122=$option;var $123=$st_start;var $124=$ix;var $125=$group_tone;__ZL12calc_pitchesiiii($122,$123,$124,$125);__label__=49;break $if_then160$$lor_lhs_false$66;}}while(0);if(__label__==47){var $118=$option;var $119=$st_start;var $120=$ix;var $121=$group_tone_emph;__ZL12calc_pitchesiiii($118,$119,$120,$121);;}
65031 var $126=$ix;$st_start=$126;;}
65032 var $127=$st_start;var $128=$st_ix;var $cmp165=((($127))|0)<((($128))|0);if($cmp165){__label__=51;;}else{__label__=53;;}
65033 $land_lhs_true166$$for_inc175$73:do{if(__label__==51){var $129=$syl;var $flags167=(($129+2)&4294967295);var $130=HEAP8[($flags167)];var $conv168=(tempInt=(($130)),(tempInt>=128?tempInt-256:tempInt));var $and169=($conv168)&4;var $tobool170=((($and169))|0)!=0;if(!($tobool170)){__label__=53;break $land_lhs_true166$$for_inc175$73;}
65034 var $131=$st_ix;var $add172=((($131)+1)&4294967295);$st_clause_end=$add172;var $132=$st_start;var $133=$st_clause_end;var $134=$st_clause_end;__ZL18count_pitch_vowelsiii($132,$133,$134);var $135=$option;var $136=$st_start;var $137=$st_clause_end;var $138=$group_tone_comma;__ZL12calc_pitchesiiii($135,$136,$137,$138);var $139=$st_clause_end;$st_start=$139;;}}while(0);var $140=$st_ix;var $inc176=((($140)+1)&4294967295);$st_ix=$inc176;var $141=$st_ix;var $142=$n_st;var $cmp67=((($141))|0)<((($142))|0);if($cmp67){__label__=20;continue $for_body68$30;}else{__label__=54;break $for_body68$$for_end177$29;}}}}while(0);var $143=$st_start;var $144=$st_ix;var $cmp178=((($143))|0)<((($144))|0);if($cmp178){__label__=55;;}else{__label__=56;;}
65035 if(__label__==55){var $145=$st_start;var $146=$st_ix;var $147=$n_st;__ZL18count_pitch_vowelsiii($145,$146,$147);var $148=$option;var $149=$st_start;var $150=$st_ix;var $151=$group_tone;__ZL12calc_pitchesiiii($148,$149,$150,$151);;}
65036 $st_ix=0;var $152=$ph_start;$ix=$152;var $153=$ix;var $154=$ph_end;var $cmp1832=((($153))|0)<((($154))|0);if(!($cmp1832)){__label__=70;break $for_end258$$if_end28$13;}
65037 $for_body184$81:while(1){var $155=$ix;var $arrayidx185=((_phoneme_list+$155*24)&4294967295);$p=$arrayidx185;var $156=$st_ix;var $157=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx186=(($157+6*$156)&4294967295);var $stress187=(($arrayidx186)&4294967295);var $158=HEAP8[($stress187)];var $159=$p;var $stresslevel188=(($159+1)&4294967295);HEAP8[($stresslevel188)]=$158;var $160=$p;var $synthflags189=(($160+4)&4294967295);var $161=HEAPU16[(($synthflags189)>>1)];var $conv190=((($161))&65535);var $and191=($conv190)&4;var $tobool192=((($and191))|0)!=0;if($tobool192){__label__=58;;}else{__label__=69;;}
65038 if(__label__==58){var $162=$st_ix;var $163=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx194=(($163+6*$162)&4294967295);$syl=$arrayidx194;var $164=$syl;var $pitch1=(($164+4)&4294967295);var $165=HEAP8[($pitch1)];var $166=$p;var $pitch1195=(($166+20)&4294967295);HEAP8[($pitch1195)]=$165;var $167=$syl;var $pitch2=(($167+5)&4294967295);var $168=HEAP8[($pitch2)];var $169=$p;var $pitch2196=(($169+21)&4294967295);HEAP8[($pitch2196)]=$168;var $170=$p;var $env197=(($170+14)&4294967295);HEAP8[($env197)]=0;var $171=$syl;var $flags198=(($171+2)&4294967295);var $172=HEAP8[($flags198)];var $conv199=(tempInt=(($172)),(tempInt>=128?tempInt-256:tempInt));var $and200=($conv199)&1;var $tobool201=((($and200))|0)!=0;var $173=$p;if($tobool201){__label__=59;;}else{__label__=60;;}
65039 $if_then202$$if_else204$85:do{if(__label__==59){var $env203=(($173+14)&4294967295);HEAP8[($env203)]=2;;}
65040 else if(__label__==60){var $stresslevel205=(($173+1)&4294967295);var $174=HEAPU8[($stresslevel205)];var $conv206=((($174))&255);var $cmp207=((($conv206))|0)>5;if(!($cmp207)){__label__=62;break $if_then202$$if_else204$85;}
65041 var $175=$syl;var $env209=(($175+1)&4294967295);var $176=HEAP8[($env209)];var $177=$p;var $env210=(($177+14)&4294967295);HEAP8[($env210)]=$176;;}}while(0);var $178=$p;var $pitch1213=(($178+20)&4294967295);var $179=HEAPU8[($pitch1213)];var $conv214=((($179))&255);var $180=$p;var $pitch2215=(($180+21)&4294967295);var $181=HEAPU8[($pitch2215)];var $conv216=((($181))&255);var $cmp217=((($conv214))|0)>((($conv216))|0);if($cmp217){__label__=63;;}else{__label__=64;;}
65042 if(__label__==63){var $182=$p;var $pitch1219=(($182+20)&4294967295);var $183=HEAPU8[($pitch1219)];var $conv220=((($183))&255);$x=$conv220;var $184=$p;var $pitch2221=(($184+21)&4294967295);var $185=HEAP8[($pitch2221)];var $186=$p;var $pitch1222=(($186+20)&4294967295);HEAP8[($pitch1222)]=$185;var $187=$x;var $conv223=((($187))&255);var $188=$p;var $pitch2224=(($188+21)&4294967295);HEAP8[($pitch2224)]=$conv223;;}
65043 var $189=$p;var $tone_ph=(($189+3)&4294967295);var $190=HEAP8[($tone_ph)];var $tobool226=(tempInt=(($190)),(tempInt>=128?tempInt-256:tempInt))!=0;if($tobool226){__label__=65;;}else{__label__=66;;}
65044 if(__label__==65){var $191=$p;var $tone_ph228=(($191+3)&4294967295);var $192=HEAPU8[($tone_ph228)];var $idxprom=((($192))&255);var $arrayidx229=((_phoneme_tab+$idxprom*4)&4294967295);var $193=HEAP32[(($arrayidx229)>>2)];$ph=$193;var $194=$p;var $pitch1230=(($194+20)&4294967295);var $195=HEAPU8[($pitch1230)];var $conv231=((($195))&255);var $196=$p;var $pitch2232=(($196+21)&4294967295);var $197=HEAPU8[($pitch2232)];var $conv233=((($197))&255);var $add234=((($conv233)+($conv231))&4294967295);var $div=((((($add234))|0)/2)|0);$x=$div;var $198=$x;var $199=$ph;var $end_type=(($199+13)&4294967295);var $200=HEAPU8[($end_type)];var $conv235=((($200))&255);var $add236=((($conv235)+($198))&4294967295);var $conv237=((($add236))&255);var $201=$p;var $pitch2238=(($201+21)&4294967295);HEAP8[($pitch2238)]=$conv237;var $202=$x;var $203=$ph;var $start_type=(($203+12)&4294967295);var $204=HEAPU8[($start_type)];var $conv239=((($204))&255);var $add240=((($conv239)+($202))&4294967295);var $conv241=((($add240))&255);var $205=$p;var $pitch1242=(($205+20)&4294967295);HEAP8[($pitch1242)]=$conv241;;}
65045 var $206=$syl;var $flags244=(($206+2)&4294967295);var $207=HEAP8[($flags244)];var $conv245=(tempInt=(($207)),(tempInt>=128?tempInt-256:tempInt));var $and246=($conv245)&2;var $tobool247=((($and246))|0)!=0;if($tobool247){__label__=67;;}else{__label__=68;;}
65046 if(__label__==67){var $208=$p;var $stresslevel249=(($208+1)&4294967295);var $209=HEAPU8[($stresslevel249)];var $conv250=((($209))&255);var $or251=($conv250)|8;var $conv252=((($or251))&255);HEAP8[($stresslevel249)]=$conv252;;}
65047 var $210=$st_ix;var $inc254=((($210)+1)&4294967295);$st_ix=$inc254;;}
65048 var $211=$ix;var $inc257=((($211)+1)&4294967295);$ix=$inc257;var $212=$ix;var $213=$ph_end;var $cmp183=((($212))|0)<((($213))|0);if($cmp183){__label__=57;continue $for_body184$81;}else{__label__=70;break $for_end258$$if_end28$13;}}}}}while(0);STACKTOP=__stackBase__;return;return;}
65049 function __ZL16CalcPitches_ToneP10Translatori($tr,$clause_tone){;var __label__;var $tr_addr;var $clause_tone_addr;var $p;var $ix;var $count_stressed;var $final_stressed;var $tone_ph;var $pause;var $tone_promoted;var $tph;var $prev_tph;var $prevw_tph;var $prev2_tph;var $prev_p;var $pitch_adjust;var $pitch_decrement;var $pitch_low;var $pitch_high;$tr_addr=$tr;$clause_tone_addr=$clause_tone;$count_stressed=0;$final_stressed=0;$pitch_adjust=0;$pitch_decrement=0;$pitch_low=0;$pitch_high=0;$p=((_phoneme_list)&4294967295);$ix=0;var $0=$ix;var $1=HEAP32[((_n_phoneme_list)>>2)];var $cmp5=((($0))|0)<((($1))|0);if($cmp5){__label__=1;;}else{__label__=8;;}
65050 $for_body$$for_end$2:do{if(__label__==1){$for_body$3:while(1){var $2=$p;var $type=(($2+15)&4294967295);var $3=HEAPU8[($type)];var $conv=((($3))&255);var $cmp1=((($conv))|0)==2;if($cmp1){__label__=2;;}else{__label__=7;;}
65051 $land_lhs_true$$for_inc$5:do{if(__label__==2){var $4=$p;var $stresslevel=(($4+1)&4294967295);var $5=HEAPU8[($stresslevel)];var $conv2=((($5))&255);var $cmp3=((($conv2))|0)>=4;if(!($cmp3)){__label__=7;break $land_lhs_true$$for_inc$5;}
65052 var $6=$count_stressed;var $cmp4=((($6))|0)==0;if($cmp4){__label__=4;;}else{__label__=5;;}
65053 if(__label__==4){var $7=$ix;$final_stressed=$7;;}
65054 var $8=$p;var $stresslevel6=(($8+1)&4294967295);var $9=HEAPU8[($stresslevel6)];var $conv7=((($9))&255);var $cmp8=((($conv7))|0)>=4;if(!($cmp8)){__label__=7;break $land_lhs_true$$for_inc$5;}
65055 var $10=$ix;$final_stressed=$10;var $11=$count_stressed;var $inc=((($11)+1)&4294967295);$count_stressed=$inc;;}}while(0);var $12=$ix;var $inc12=((($12)+1)&4294967295);$ix=$inc12;var $13=$p;var $incdec_ptr=(($13+24)&4294967295);$p=$incdec_ptr;var $14=$ix;var $15=HEAP32[((_n_phoneme_list)>>2)];var $cmp=((($14))|0)<((($15))|0);if($cmp){__label__=1;continue $for_body$3;}else{__label__=8;break $for_body$$for_end$2;}}}}while(0);var $16=$final_stressed;var $arrayidx=((_phoneme_list+$16*24)&4294967295);var $stresslevel13=(($arrayidx+1)&4294967295);HEAP8[($stresslevel13)]=7;var $17=$tr_addr;var $translator_name=(($17+280)&4294967295);var $18=HEAP32[(($translator_name)>>2)];var $cmp14=((($18))|0)==30313;if($cmp14){__label__=9;;}else{__label__=11;;}
65056 $if_then15$$if_end24$14:do{if(__label__==9){var $19=$final_stressed;var $arrayidx16=((_phoneme_list+$19*24)&4294967295);$p=$arrayidx16;var $20=$p;var $tone_ph17=(($20+3)&4294967295);var $21=HEAPU8[($tone_ph17)];var $conv18=((($21))&255);var $cmp19=((($conv18))|0)==0;if(!($cmp19)){__label__=11;break $if_then15$$if_end24$14;}
65057 var $call=__Z11PhonemeCodej(55);var $conv21=((($call))&255);var $22=$p;var $tone_ph22=(($22+3)&4294967295);HEAP8[($tone_ph22)]=$conv21;;}}while(0);$pause=1;$tone_promoted=0;$p=((_phoneme_list)&4294967295);$prev_p=((_phoneme_list)&4294967295);var $23=HEAP32[((((_phoneme_tab+36)&4294967295))>>2)];$prevw_tph=$23;$prev_tph=$23;$ix=0;var $24=$ix;var $25=HEAP32[((_n_phoneme_list)>>2)];var $cmp262=((($24))|0)<((($25))|0);if($cmp262){__label__=12;;}else{__label__=47;;}
65058 $for_body27$$for_end127$18:do{if(__label__==12){$for_body27$19:while(1){var $26=$p;var $type28=(($26+15)&4294967295);var $27=HEAPU8[($type28)];var $conv29=((($27))&255);var $cmp30=((($conv29))|0)==0;if($cmp30){__label__=13;;}else{__label__=15;;}
65059 $land_lhs_true31$$if_end35$21:do{if(__label__==13){var $28=$p;var $ph=(($28+8)&4294967295);var $29=HEAP32[(($ph)>>2)];var $std_length=(($29+14)&4294967295);var $30=HEAPU8[($std_length)];var $conv32=((($30))&255);var $cmp33=((($conv32))|0)>50;if(!($cmp33)){__label__=15;break $land_lhs_true31$$if_end35$21;}
65060 $pause=1;var $31=HEAP32[((((_phoneme_tab+36)&4294967295))>>2)];$prevw_tph=$31;;}}while(0);var $32=$p;var $newword=(($32+19)&4294967295);var $33=HEAP8[($newword)];var $tobool=(tempInt=(($33)),(tempInt>=128?tempInt-256:tempInt))!=0;if($tobool){__label__=16;;}else{__label__=17;;}
65061 if(__label__==16){var $34=HEAP32[((((_phoneme_tab+36)&4294967295))>>2)];$prev_tph=$34;;}
65062 var $35=$p;var $synthflags=(($35+4)&4294967295);var $36=HEAPU16[(($synthflags)>>1)];var $conv38=((($36))&65535);var $and=($conv38)&4;var $tobool39=((($and))|0)!=0;if($tobool39){__label__=18;;}else{__label__=46;;}
65063 if(__label__==18){var $37=$p;var $tone_ph41=(($37+3)&4294967295);var $38=HEAPU8[($tone_ph41)];var $conv42=((($38))&255);$tone_ph=$conv42;var $39=$tone_ph;var $arrayidx43=((_phoneme_tab+$39*4)&4294967295);var $40=HEAP32[(($arrayidx43)>>2)];$tph=$40;var $41=$tr_addr;var $translator_name44=(($41+280)&4294967295);var $42=HEAP32[(($translator_name44)>>2)];var $cmp45=((($42))|0)==31336;if($cmp45){__label__=19;;}else{__label__=45;;}
65064 $if_then46$$if_end122$30:do{if(__label__==19){var $43=$tone_ph;var $cmp47=((($43))|0)==0;if($cmp47){__label__=20;;}else{__label__=25;;}
65065 if(__label__==20){var $44=$pause;var $tobool49=((($44))|0)!=0;if($tobool49){__label__=22;;}else{__label__=21;;}
65066 $if_then51$$lor_lhs_false$34:do{if(__label__==21){var $45=$tone_promoted;var $tobool50=((($45))|0)!=0;if($tobool50){__label__=22;break $if_then51$$lor_lhs_false$34;}
65067 var $call53=__Z11PhonemeCodej(12593);$tone_ph=$call53;__label__=24;break $if_then51$$lor_lhs_false$34;}}while(0);if(__label__==22){var $call52=__Z11PhonemeCodej(13621);$tone_ph=$call52;$tone_promoted=1;;}
65068 var $46=$tone_ph;var $conv55=((($46))&255);var $47=$p;var $tone_ph56=(($47+3)&4294967295);HEAP8[($tone_ph56)]=$conv55;var $48=$tone_ph;var $arrayidx57=((_phoneme_tab+$48*4)&4294967295);var $49=HEAP32[(($arrayidx57)>>2)];$tph=$49;;}
65069 else if(__label__==25){$tone_promoted=0;;}
65070 var $50=$ix;var $51=$final_stressed;var $cmp60=((($50))|0)==((($51))|0);if($cmp60){__label__=27;;}else{__label__=30;;}
65071 $if_then61$$if_end70$42:do{if(__label__==27){var $52=$tph;var $mnemonic=(($52)&4294967295);var $53=HEAP32[(($mnemonic)>>2)];var $cmp62=((($53))|0)==13621;if($cmp62){__label__=29;;}else{__label__=28;;}
65072 if(__label__==28){var $54=$tph;var $mnemonic64=(($54)&4294967295);var $55=HEAP32[(($mnemonic64)>>2)];var $cmp65=((($55))|0)==12597;if(!($cmp65)){__label__=30;break $if_then61$$if_end70$42;}}
65073 var $56=$final_stressed;var $arrayidx67=((_phoneme_list+$56*24)&4294967295);var $stresslevel68=(($arrayidx67+1)&4294967295);HEAP8[($stresslevel68)]=6;;}}while(0);var $57=$prevw_tph;var $mnemonic71=(($57)&4294967295);var $58=HEAP32[(($mnemonic71)>>2)];var $cmp72=((($58))|0)==3420466;if($cmp72){__label__=31;;}else{__label__=34;;}
65074 if(__label__==31){var $59=$tph;var $mnemonic74=(($59)&4294967295);var $60=HEAP32[(($mnemonic74)>>2)];var $cmp75=((($60))|0)==3420466;if($cmp75){__label__=32;;}else{__label__=33;;}
65075 if(__label__==32){var $call77=__Z11PhonemeCodej(13619);var $conv78=((($call77))&255);var $61=$prev_p;var $tone_ph79=(($61+3)&4294967295);HEAP8[($tone_ph79)]=$conv78;;}
65076 else if(__label__==33){var $call81=__Z11PhonemeCodej(12594);var $conv82=((($call81))&255);var $62=$prev_p;var $tone_ph83=(($62+3)&4294967295);HEAP8[($tone_ph83)]=$conv82;;}}
65077 var $63=$prev_tph;var $mnemonic86=(($63)&4294967295);var $64=HEAP32[(($mnemonic86)>>2)];var $cmp87=((($64))|0)==12597;if($cmp87){__label__=35;;}else{__label__=37;;}
65078 $land_lhs_true88$$if_end95$54:do{if(__label__==35){var $65=$tph;var $mnemonic89=(($65)&4294967295);var $66=HEAP32[(($mnemonic89)>>2)];var $cmp90=((($66))|0)==12597;if(!($cmp90)){__label__=37;break $land_lhs_true88$$if_end95$54;}
65079 var $call92=__Z11PhonemeCodej(13109);var $conv93=((($call92))&255);var $67=$prev_p;var $tone_ph94=(($67+3)&4294967295);HEAP8[($tone_ph94)]=$conv93;;}}while(0);var $68=$tph;var $mnemonic96=(($68)&4294967295);var $69=HEAP32[(($mnemonic96)>>2)];var $cmp97=((($69))|0)==12593;if(!($cmp97)){__label__=45;break $if_then46$$if_end122$30;}
65080 var $70=$prevw_tph;var $mnemonic99=(($70)&4294967295);var $71=HEAP32[(($mnemonic99)>>2)];var $cmp100=((($71))|0)==13621;if($cmp100){__label__=39;;}else{__label__=40;;}
65081 if(__label__==39){var $call102=__Z11PhonemeCodej(12850);var $conv103=((($call102))&255);var $72=$p;var $tone_ph104=(($72+3)&4294967295);HEAP8[($tone_ph104)]=$conv103;;}
65082 var $73=$prevw_tph;var $mnemonic106=(($73)&4294967295);var $74=HEAP32[(($mnemonic106)>>2)];var $cmp107=((($74))|0)==13619;if($cmp107){__label__=41;;}else{__label__=42;;}
65083 if(__label__==41){var $call109=__Z11PhonemeCodej(13107);var $conv110=((($call109))&255);var $75=$p;var $tone_ph111=(($75+3)&4294967295);HEAP8[($tone_ph111)]=$conv110;;}
65084 var $76=$prevw_tph;var $mnemonic113=(($76)&4294967295);var $77=HEAP32[(($mnemonic113)>>2)];var $cmp114=((($77))|0)==3420466;if($cmp114){__label__=43;;}else{__label__=44;;}
65085 if(__label__==43){var $call116=__Z11PhonemeCodej(13364);var $conv117=((($call116))&255);var $78=$p;var $tone_ph118=(($78+3)&4294967295);HEAP8[($tone_ph118)]=$conv117;;}
65086 var $79=$p;var $stresslevel120=(($79+1)&4294967295);HEAP8[($stresslevel120)]=0;;}}while(0);var $80=$p;$prev_p=$80;var $81=$prevw_tph;$prev2_tph=$81;var $82=$tph;$prev_tph=$82;$prevw_tph=$82;$pause=0;;}
65087 var $83=$ix;var $inc125=((($83)+1)&4294967295);$ix=$inc125;var $84=$p;var $incdec_ptr126=(($84+24)&4294967295);$p=$incdec_ptr126;var $85=$ix;var $86=HEAP32[((_n_phoneme_list)>>2)];var $cmp26=((($85))|0)<((($86))|0);if($cmp26){__label__=12;continue $for_body27$19;}else{__label__=47;break $for_body27$$for_end127$18;}}}}while(0);$p=((_phoneme_list)&4294967295);$ix=0;var $87=$ix;var $88=HEAP32[((_n_phoneme_list)>>2)];var $cmp1291=((($87))|0)<((($88))|0);if($cmp1291){__label__=48;;}else{__label__=58;;}
65088 $for_body130$$for_end166$71:do{if(__label__==48){$for_body130$72:while(1){var $89=$p;var $synthflags131=(($89+4)&4294967295);var $90=HEAPU16[(($synthflags131)>>1)];var $conv132=((($90))&65535);var $and133=($conv132)&4;var $tobool134=((($and133))|0)!=0;if($tobool134){__label__=49;;}else{__label__=57;;}
65089 if(__label__==49){var $91=$p;var $tone_ph136=(($91+3)&4294967295);var $92=HEAPU8[($tone_ph136)];var $conv137=((($92))&255);$tone_ph=$conv137;var $93=$p;var $stresslevel138=(($93+1)&4294967295);var $94=HEAPU8[($stresslevel138)];var $conv139=((($94))&255);var $cmp140=((($conv139))|0)!=0;if($cmp140){__label__=50;;}else{__label__=54;;}
65090 $if_then141$$if_end149$76:do{if(__label__==50){var $95=$ix;var $96=$final_stressed;var $cmp142=((($95))|0)==((($96))|0);if($cmp142){__label__=51;;}else{__label__=52;;}
65091 if(__label__==51){var $97=$pitch_low;$pitch_adjust=$97;;}
65092 else if(__label__==52){var $98=$pitch_decrement;var $99=$pitch_adjust;var $sub=((($99)-($98))&4294967295);$pitch_adjust=$sub;var $100=$pitch_adjust;var $101=$pitch_low;var $cmp145=((($100))|0)<=((($101))|0);if(!($cmp145)){__label__=54;break $if_then141$$if_end149$76;}
65093 var $102=$pitch_high;$pitch_adjust=$102;;}}}while(0);var $103=$tone_ph;var $cmp150=((($103))|0)==0;if($cmp150){__label__=55;;}else{__label__=56;;}
65094 if(__label__==55){$tone_ph=17;var $104=$tone_ph;var $conv152=((($104))&255);var $105=$p;var $tone_ph153=(($105+3)&4294967295);HEAP8[($tone_ph153)]=$conv152;;}
65095 var $106=$pitch_adjust;var $107=$tone_ph;var $arrayidx155=((_phoneme_tab+$107*4)&4294967295);var $108=HEAP32[(($arrayidx155)>>2)];var $start_type=(($108+12)&4294967295);var $109=HEAPU8[($start_type)];var $conv156=((($109))&255);var $add=((($conv156)+($106))&4294967295);var $conv157=((($add))&255);var $110=$p;var $pitch1=(($110+20)&4294967295);HEAP8[($pitch1)]=$conv157;var $111=$pitch_adjust;var $112=$tone_ph;var $arrayidx158=((_phoneme_tab+$112*4)&4294967295);var $113=HEAP32[(($arrayidx158)>>2)];var $end_type=(($113+13)&4294967295);var $114=HEAPU8[($end_type)];var $conv159=((($114))&255);var $add160=((($conv159)+($111))&4294967295);var $conv161=((($add160))&255);var $115=$p;var $pitch2=(($115+21)&4294967295);HEAP8[($pitch2)]=$conv161;;}
65096 var $116=$ix;var $inc164=((($116)+1)&4294967295);$ix=$inc164;var $117=$p;var $incdec_ptr165=(($117+24)&4294967295);$p=$incdec_ptr165;var $118=$ix;var $119=HEAP32[((_n_phoneme_list)>>2)];var $cmp129=((($118))|0)<((($119))|0);if($cmp129){__label__=48;continue $for_body130$72;}else{__label__=58;break $for_body130$$for_end166$71;}}}}while(0);;return;return;}
65097 function __ZL18count_pitch_vowelsiii($start,$end,$clause_end){;var __label__;var __lastLabel__=null;var $start_addr;var $end_addr;var $clause_end_addr;var $ix;var $stress;var $max_stress;var $max_stress_posn;var $max_stress_posn2;$start_addr=$start;$end_addr=$end;$clause_end_addr=$clause_end;$max_stress=0;$max_stress_posn=0;$max_stress_posn2=0;HEAP32[((__ZL10number_pre)>>2)]=-1;HEAP32[((__ZL11number_tail)>>2)]=0;HEAP32[((__ZL12last_primary)>>2)]=-1;var $0=$start_addr;$ix=$0;var $1=$ix;var $2=$end_addr;var $cmp1=((($1))|0)<((($2))|0);if($cmp1){__label__=1;;}else{__label__=11;;}
65098 $for_body$$for_end$2:do{if(__label__==1){while(1){var $3=$ix;var $4=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx=(($4+6*$3)&4294967295);var $stress1=(($arrayidx)&4294967295);var $5=HEAP8[($stress1)];var $conv=(tempInt=(($5)),(tempInt>=128?tempInt-256:tempInt));$stress=$conv;var $6=$stress;var $7=$max_stress;var $cmp2=((($6))|0)>=((($7))|0);if($cmp2){__lastLabel__=1;__label__=2;;}else{__lastLabel__=1;__label__=6;;}
65099 if(__label__==2){var $8=$stress;var $9=$max_stress;var $cmp3=((($8))|0)>((($9))|0);if($cmp3){__label__=3;;}else{__label__=4;;}
65100 if(__label__==3){var $10=$ix;$max_stress_posn2=$10;;}
65101 else if(__label__==4){var $11=$max_stress_posn;$max_stress_posn2=$11;;}
65102 var $12=$ix;$max_stress_posn=$12;var $13=$stress;$max_stress=$13;__lastLabel__=5;;}
65103 var $14=__lastLabel__==5?$13:($6);var $cmp6=((($14))|0)>=4;if($cmp6){__label__=7;;}else{__label__=10;;}
65104 if(__label__==7){var $15=HEAP32[((__ZL10number_pre)>>2)];var $cmp8=((($15))|0)<0;if($cmp8){__label__=8;;}else{__label__=9;;}
65105 if(__label__==8){var $16=$ix;var $17=$start_addr;var $sub=((($16)-($17))&4294967295);HEAP32[((__ZL10number_pre)>>2)]=$sub;;}
65106 var $18=$ix;HEAP32[((__ZL12last_primary)>>2)]=$18;;}
65107 var $19=$ix;var $inc=((($19)+1)&4294967295);$ix=$inc;var $20=$ix;var $21=$end_addr;var $cmp=((($20))|0)<((($21))|0);if($cmp){__label__=1;continue;}else{__label__=11;break $for_body$$for_end$2;}}}}while(0);var $22=HEAP32[((__ZL10number_pre)>>2)];var $cmp12=((($22))|0)<0;if($cmp12){__label__=12;;}else{__label__=13;;}
65108 if(__label__==12){var $23=$end_addr;HEAP32[((__ZL10number_pre)>>2)]=$23;;}
65109 var $24=$end_addr;var $25=$max_stress_posn;var $_neg=(((-($25)))&4294967295);var $sub15=((($24)-1)&4294967295);var $sub16=((($sub15)+($_neg))&4294967295);HEAP32[((__ZL11number_tail)>>2)]=$sub16;var $26=$max_stress_posn;HEAP32[((__ZL9tone_posn)>>2)]=$26;var $27=$max_stress_posn2;HEAP32[((__ZL10tone_posn2)>>2)]=$27;var $_b=HEAPU8[(__ZL8no_tonic_b)];var $28=((($_b))&1);var $tobool=((($28))|0)!=0;if($tobool){__label__=14;;}else{__label__=15;;}
65110 $if_then17$$if_else18$22:do{if(__label__==14){var $29=$end_addr;HEAP32[((__ZL10tone_posn2)>>2)]=$29;HEAP32[((__ZL9tone_posn)>>2)]=$29;;}
65111 else if(__label__==15){var $30=HEAP32[((__ZL12last_primary)>>2)];var $cmp19=((($30))|0)>=0;if($cmp19){__label__=16;;}else{__label__=18;;}
65112 if(__label__==16){var $31=$end_addr;var $32=$clause_end_addr;var $cmp21=((($31))|0)==((($32))|0);if(!($cmp21)){__label__=19;break $if_then17$$if_else18$22;}
65113 var $33=HEAP32[((__ZL12last_primary)>>2)];var $34=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx23=(($34+6*$33)&4294967295);var $stress24=(($arrayidx23)&4294967295);HEAP8[($stress24)]=7;;}
65114 else if(__label__==18){var $35=HEAP32[((__ZL9tone_posn)>>2)];var $36=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx27=(($36+6*$35)&4294967295);var $stress28=(($arrayidx27)&4294967295);HEAP8[($stress28)]=7;;}}}while(0);;return;return;}
65115 function __ZL12calc_pitchesiiii($control,$start,$end,$tune_number){;var __label__;var $retval;var $control_addr;var $start_addr;var $end_addr;var $tune_number_addr;var $ix;var $th;var $tn;var $drop;var $continuing;$control_addr=$control;$start_addr=$start;$end_addr=$end;$tune_number_addr=$tune_number;$continuing=0;var $0=$control_addr;var $cmp=((($0))|0)==0;var $1=$start_addr;if($cmp){__label__=1;;}else{__label__=2;;}
65116 if(__label__==1){var $2=$end_addr;var $3=$tune_number_addr;var $call=__ZL13calc_pitches2iii($1,$2,$3);$retval=$call;;}
65117 else if(__label__==2){var $cmp1=((($1))|0)>0;if($cmp1){__label__=3;;}else{__label__=4;;}
65118 if(__label__==3){$continuing=1;;}
65119 var $4=$tune_number_addr;var $arrayidx=((__ZL15tone_head_table+$4*16)&4294967295);$th=$arrayidx;var $5=$tune_number_addr;var $arrayidx4=((__ZL18tone_nucleus_table+$5*16)&4294967295);$tn=$arrayidx4;var $6=$start_addr;$ix=$6;var $7=$ix;var $8=$ix;var $9=HEAP32[((__ZL10number_pre)>>2)];var $add=((($9)+($8))&4294967295);var $10=$th;var $pre_start=(($10)&4294967295);var $11=HEAPU8[($pre_start)];var $conv=((($11))&255);var $12=$th;var $pre_end=(($12+1)&4294967295);var $13=HEAPU8[($pre_end)];var $conv5=((($13))&255);__ZL16SetPitchGradientiiii($7,$add,$conv,$conv5);var $14=HEAP32[((__ZL10number_pre)>>2)];var $15=$ix;var $add6=((($15)+($14))&4294967295);$ix=$add6;var $16=HEAP32[((_option_tone_flags)>>2)];var $and=($16)&512;var $tobool=((($and))|0)!=0;if($tobool){__label__=5;;}else{__label__=6;;}
65120 if(__label__==5){var $17=HEAP32[((__ZL10tone_posn2)>>2)];HEAP32[((__ZL9tone_posn)>>2)]=$17;;}
65121 var $18=$ix;var $19=HEAP32[((__ZL9tone_posn)>>2)];var $20=$th;var $21=$tn;var $22=$continuing;var $call9=__ZL18calc_pitch_segmentiiP9TONE_HEADP12TONE_NUCLEUSii($18,$19,$20,$21,$22);$ix=$call9;var $_b=HEAPU8[(__ZL8no_tonic_b)];var $23=((($_b))&1);var $tobool10=((($23))|0)!=0;if($tobool10){__label__=7;;}else{__label__=8;;}
65122 if(__label__==7){$retval=0;;}
65123 else if(__label__==8){var $24=$tn;var $flags=(($24+14)&4294967295);var $25=HEAPU8[($flags)];var $conv13=((($25))&255);var $and14=($conv13)&1;var $tobool15=((($and14))|0)!=0;if($tobool15){__label__=9;;}else{__label__=10;;}
65124 if(__label__==9){var $26=$ix;var $27=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx17=(($27+6*$26)&4294967295);var $flags18=(($arrayidx17+2)&4294967295);var $28=HEAP8[($flags18)];var $conv19=(tempInt=(($28)),(tempInt>=128?tempInt-256:tempInt));var $or=($conv19)|2;var $conv20=((($or))&255);HEAP8[($flags18)]=$conv20;;}
65125 var $29=HEAP32[((__ZL11number_tail)>>2)];var $cmp22=((($29))|0)==0;var $30=$tn;if($cmp22){__label__=11;;}else{__label__=12;;}
65126 if(__label__==11){var $pitch_env0=(($30)&4294967295);var $31=HEAPU8[($pitch_env0)];var $conv24=((($31))&255);HEAP32[((__ZL14tone_pitch_env)>>2)]=$conv24;var $32=$tn;var $tonic_max0=(($32+1)&4294967295);var $33=HEAPU8[($tonic_max0)];var $conv25=((($33))&255);var $34=$tn;var $tonic_min0=(($34+2)&4294967295);var $35=HEAPU8[($tonic_min0)];var $conv26=((($35))&255);var $sub=((($conv25)-($conv26))&4294967295);$drop=$sub;var $36=$ix;var $inc=((($36)+1)&4294967295);$ix=$inc;var $37=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx27=(($37+6*$36)&4294967295);var $38=$tn;var $tonic_min028=(($38+2)&4294967295);var $39=HEAPU8[($tonic_min028)];var $conv29=((($39))&255);var $40=$drop;__ZL9set_pitchP8SYLLABLEii($arrayidx27,$conv29,$40);;}
65127 else if(__label__==12){var $pitch_env1=(($30+3)&4294967295);var $41=HEAPU8[($pitch_env1)];var $conv30=((($41))&255);HEAP32[((__ZL14tone_pitch_env)>>2)]=$conv30;var $42=$tn;var $tonic_max1=(($42+4)&4294967295);var $43=HEAPU8[($tonic_max1)];var $conv31=((($43))&255);var $44=$tn;var $tonic_min1=(($44+5)&4294967295);var $45=HEAPU8[($tonic_min1)];var $conv32=((($45))&255);var $sub33=((($conv31)-($conv32))&4294967295);$drop=$sub33;var $46=$ix;var $inc34=((($46)+1)&4294967295);$ix=$inc34;var $47=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx35=(($47+6*$46)&4294967295);var $48=$tn;var $tonic_min136=(($48+5)&4294967295);var $49=HEAPU8[($tonic_min136)];var $conv37=((($49))&255);var $50=$drop;__ZL9set_pitchP8SYLLABLEii($arrayidx35,$conv37,$50);;}
65128 var $51=HEAP32[((__ZL14tone_pitch_env)>>2)];var $conv39=((($51))&255);var $52=HEAP32[((__ZL9tone_posn)>>2)];var $53=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx40=(($53+6*$52)&4294967295);var $env=(($arrayidx40+1)&4294967295);HEAP8[($env)]=$conv39;var $54=HEAP32[((__ZL9tone_posn)>>2)];var $55=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx41=(($55+6*$54)&4294967295);var $stress=(($arrayidx41)&4294967295);var $56=HEAP8[($stress)];var $conv42=(tempInt=(($56)),(tempInt>=128?tempInt-256:tempInt));var $cmp43=((($conv42))|0)==4;if($cmp43){__label__=14;;}else{__label__=15;;}
65129 if(__label__==14){var $57=HEAP32[((__ZL9tone_posn)>>2)];var $58=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx45=(($58+6*$57)&4294967295);var $stress46=(($arrayidx45)&4294967295);HEAP8[($stress46)]=6;;}
65130 var $59=$ix;var $60=$end_addr;var $61=$tn;var $tail_start=(($61+12)&4294967295);var $62=HEAPU8[($tail_start)];var $conv48=((($62))&255);var $63=$tn;var $tail_end=(($63+13)&4294967295);var $64=HEAPU8[($tail_end)];var $conv49=((($64))&255);__ZL16SetPitchGradientiiii($59,$60,$conv48,$conv49);var $65=HEAP32[((__ZL14tone_pitch_env)>>2)];$retval=$65;;}};return;return;}
65131 function __ZL13calc_pitches2iii($start,$end,$tune_number){;var __label__;var $retval;var $start_addr;var $end_addr;var $tune_number_addr;var $ix;var $tune;var $drop;var $continuing;$start_addr=$start;$end_addr=$end;$tune_number_addr=$tune_number;$continuing=0;var $0=$start_addr;var $cmp=((($0))|0)>0;if($cmp){__label__=1;;}else{__label__=2;;}
65132 if(__label__==1){$continuing=1;;}
65133 var $1=$tune_number_addr;var $2=HEAP32[((_tunes)>>2)];var $arrayidx=(($2+68*$1)&4294967295);$tune=$arrayidx;var $3=$start_addr;$ix=$3;var $4=$ix;var $5=$ix;var $6=HEAP32[((__ZL10number_pre)>>2)];var $add=((($6)+($5))&4294967295);var $7=$tune;var $prehead_start=(($7+24)&4294967295);var $8=HEAPU8[($prehead_start)];var $conv=((($8))&255);var $9=$tune;var $prehead_end=(($9+25)&4294967295);var $10=HEAPU8[($prehead_end)];var $conv1=((($10))&255);__ZL16SetPitchGradientiiii($4,$add,$conv,$conv1);var $11=HEAP32[((__ZL10number_pre)>>2)];var $12=$ix;var $add2=((($12)+($11))&4294967295);$ix=$add2;var $13=HEAP32[((_option_tone_flags)>>2)];var $and=($13)&512;var $tobool=((($and))|0)!=0;if($tobool){__label__=3;;}else{__label__=4;;}
65134 if(__label__==3){var $14=HEAP32[((__ZL10tone_posn2)>>2)];HEAP32[((__ZL9tone_posn)>>2)]=$14;;}
65135 var $15=$tune;var $16=$ix;var $17=HEAP32[((__ZL9tone_posn)>>2)];var $call=__ZL17SetHeadIntonationP4TUNEiii($15,$16,$17);$ix=$call;var $_b=HEAPU8[(__ZL8no_tonic_b)];var $18=((($_b))&1);var $tobool5=((($18))|0)!=0;if($tobool5){__label__=5;;}else{__label__=6;;}
65136 if(__label__==5){$retval=0;;}
65137 else if(__label__==6){var $19=HEAP32[((__ZL11number_tail)>>2)];var $cmp8=((($19))|0)==0;var $20=$tune;if($cmp8){__label__=7;;}else{__label__=8;;}
65138 if(__label__==7){var $nucleus0_env=(($20+42)&4294967295);var $21=HEAPU8[($nucleus0_env)];var $conv10=((($21))&255);HEAP32[((__ZL14tone_pitch_env)>>2)]=$conv10;var $22=$tune;var $nucleus0_max=(($22+43)&4294967295);var $23=HEAPU8[($nucleus0_max)];var $conv11=((($23))&255);var $24=$tune;var $nucleus0_min=(($24+44)&4294967295);var $25=HEAPU8[($nucleus0_min)];var $conv12=((($25))&255);var $sub=((($conv11)-($conv12))&4294967295);$drop=$sub;var $26=$ix;var $inc=((($26)+1)&4294967295);$ix=$inc;var $27=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx13=(($27+6*$26)&4294967295);var $28=$tune;var $nucleus0_min14=(($28+44)&4294967295);var $29=HEAPU8[($nucleus0_min14)];var $conv15=((($29))&255);var $30=$drop;__ZL9set_pitchP8SYLLABLEii($arrayidx13,$conv15,$30);;}
65139 else if(__label__==8){var $nucleus1_env=(($20+45)&4294967295);var $31=HEAPU8[($nucleus1_env)];var $conv16=((($31))&255);HEAP32[((__ZL14tone_pitch_env)>>2)]=$conv16;var $32=$tune;var $nucleus1_max=(($32+46)&4294967295);var $33=HEAPU8[($nucleus1_max)];var $conv17=((($33))&255);var $34=$tune;var $nucleus1_min=(($34+47)&4294967295);var $35=HEAPU8[($nucleus1_min)];var $conv18=((($35))&255);var $sub19=((($conv17)-($conv18))&4294967295);$drop=$sub19;var $36=$ix;var $inc20=((($36)+1)&4294967295);$ix=$inc20;var $37=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx21=(($37+6*$36)&4294967295);var $38=$tune;var $nucleus1_min22=(($38+47)&4294967295);var $39=HEAPU8[($nucleus1_min22)];var $conv23=((($39))&255);var $40=$drop;__ZL9set_pitchP8SYLLABLEii($arrayidx21,$conv23,$40);;}
65140 var $41=HEAP32[((__ZL14tone_pitch_env)>>2)];var $conv25=((($41))&255);var $42=HEAP32[((__ZL9tone_posn)>>2)];var $43=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx26=(($43+6*$42)&4294967295);var $env=(($arrayidx26+1)&4294967295);HEAP8[($env)]=$conv25;var $44=HEAP32[((__ZL9tone_posn)>>2)];var $45=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx27=(($45+6*$44)&4294967295);var $stress=(($arrayidx27)&4294967295);var $46=HEAP8[($stress)];var $conv28=(tempInt=(($46)),(tempInt>=128?tempInt-256:tempInt));var $cmp29=((($conv28))|0)==4;if($cmp29){__label__=10;;}else{__label__=11;;}
65141 if(__label__==10){var $47=HEAP32[((__ZL9tone_posn)>>2)];var $48=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx31=(($48+6*$47)&4294967295);var $stress32=(($arrayidx31)&4294967295);HEAP8[($stress32)]=6;;}
65142 var $49=$ix;var $50=$end_addr;var $51=$tune;var $tail_start=(($51+48)&4294967295);var $52=HEAPU8[($tail_start)];var $conv34=((($52))&255);var $53=$tune;var $tail_end=(($53+49)&4294967295);var $54=HEAPU8[($tail_end)];var $conv35=((($54))&255);__ZL16SetPitchGradientiiii($49,$50,$conv34,$conv35);var $55=HEAP32[((__ZL14tone_pitch_env)>>2)];$retval=$55;;}
65143 var $56=$retval;;return $56;return null;}
65144 function __ZL16SetPitchGradientiiii($start_ix,$end_ix,$start_pitch,$end_pitch){;var __label__;var __lastLabel__=null;var $start_ix_addr;var $end_ix_addr;var $start_pitch_addr;var $end_pitch_addr;var $ix;var $stress;var $pitch;var $increment;var $n_increments;var $drop;var $syl;$start_ix_addr=$start_ix;$end_ix_addr=$end_ix;$start_pitch_addr=$start_pitch;$end_pitch_addr=$end_pitch;var $0=$end_pitch_addr;var $1=$start_pitch_addr;var $sub=((($0)-($1))&4294967295);var $shl=($sub)<<8;$increment=$shl;var $2=$end_ix_addr;var $3=$start_ix_addr;var $sub1=((($2)-($3))&4294967295);$n_increments=$sub1;var $4=$n_increments;var $cmp=((($4))|0)<=0;if($cmp){__label__=12;;}else{__label__=1;;}
65145 $for_end$$if_end$2:do{if(__label__==1){var $5=$n_increments;var $cmp2=((($5))|0)>1;if($cmp2){__label__=2;;}else{__label__=3;;}
65146 if(__label__==2){var $6=$increment;var $7=$n_increments;var $div=((((($6))|0)/((($7))|0))|0);$increment=$div;;}
65147 var $8=$start_pitch_addr;var $shl5=($8)<<8;$pitch=$shl5;var $9=$start_ix_addr;$ix=$9;var $10=$ix;var $11=$end_ix_addr;var $cmp61=((($10))|0)<((($11))|0);if(!($cmp61)){__label__=12;break $for_end$$if_end$2;}
65148 while(1){var $12=$ix;var $13=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx=(($13+6*$12)&4294967295);$syl=$arrayidx;var $14=$syl;var $stress7=(($14)&4294967295);var $15=HEAP8[($stress7)];var $conv=(tempInt=(($15)),(tempInt>=128?tempInt-256:tempInt));$stress=$conv;var $16=$increment;var $cmp8=((($16))|0)>0;if($cmp8){__label__=5;;}else{__label__=6;;}
65149 if(__label__==5){var $17=$syl;var $18=$pitch;var $shr=($18)>>8;var $19=$increment;var $shr10=($19)>>8;var $sub11=(((-($shr10)))&4294967295);__ZL9set_pitchP8SYLLABLEii($17,$shr,$sub11);var $20=$increment;var $21=$pitch;var $add=((($21)+($20))&4294967295);$pitch=$add;;}
65150 else if(__label__==6){var $22=$increment;var $shr12=($22)>>8;var $sub13=(((-($shr12)))&4294967295);$drop=$sub13;var $23=$drop;var $24=$stress;var $arrayidx14=((__ZL8min_drop+$24*4)&4294967295);var $25=HEAP32[(($arrayidx14)>>2)];var $cmp15=((($23))|0)<((($25))|0);if($cmp15){__lastLabel__=6;__label__=7;;}else{__lastLabel__=6;__label__=8;;}
65151 if(__label__==7){var $26=$stress;var $arrayidx17=((__ZL8min_drop+$26*4)&4294967295);var $27=HEAP32[(($arrayidx17)>>2)];$drop=$27;__lastLabel__=7;;}
65152 var $28=__lastLabel__==7?$27:($23);var $29=$increment;var $30=$pitch;var $add19=((($30)+($29))&4294967295);$pitch=$add19;var $cmp20=((($28))|0)>18;if($cmp20){__label__=9;;}else{__label__=10;;}
65153 if(__label__==9){$drop=18;;}
65154 var $31=$syl;var $32=$pitch;var $shr23=($32)>>8;var $33=$drop;__ZL9set_pitchP8SYLLABLEii($31,$shr23,$33);;}
65155 var $34=$ix;var $inc=((($34)+1)&4294967295);$ix=$inc;var $35=$ix;var $36=$end_ix_addr;var $cmp6=((($35))|0)<((($36))|0);if($cmp6){__label__=4;continue;}else{__label__=12;break $for_end$$if_end$2;}}}}while(0);;return;return;}
65156 function __ZL18calc_pitch_segmentiiP9TONE_HEADP12TONE_NUCLEUSii($ix,$end_ix,$th,$tn,$continuing){;var __label__;var __lastLabel__=null;var $ix_addr;var $end_ix_addr;var $th_addr;var $tn_addr;var $min_stress_addr;var $continuing_addr;var $stress;var $pitch;var $increment;var $n_primary;var $n_steps;var $initial;var $overflow;var $n_overflow;var $pitch_range;var $pitch_range_abs;var $drops;var $overflow_tab;var $syl;$ix_addr=$ix;$end_ix_addr=$end_ix;$th_addr=$th;$tn_addr=$tn;$min_stress_addr=4;$continuing_addr=$continuing;$pitch=0;$increment=0;$n_primary=0;$n_steps=0;$overflow=0;var $0=$th_addr;var $body_drops=(($0+4)&4294967295);var $1=HEAP32[(($body_drops)>>2)];$drops=$1;var $2=$th_addr;var $body_end=(($2+3)&4294967295);var $3=HEAPU8[($body_end)];var $conv=((($3))&255);var $4=$th_addr;var $body_start=(($4+2)&4294967295);var $5=HEAPU8[($body_start)];var $conv1=((($5))&255);var $sub=((($conv)-($conv1))&4294967295);var $shl=($sub)<<8;$pitch_range=$shl;var $6=$pitch_range;var $ispos=((($6))|0)>-1;var $neg=(((-($6)))&4294967295);var $call=($ispos)?($6):($neg);$pitch_range_abs=$call;var $7=$continuing_addr;var $tobool=((($7))|0)!=0;if($tobool){__label__=1;;}else{__label__=2;;}
65157 if(__label__==1){$initial=0;$overflow=0;$n_overflow=5;$overflow_tab=((__ZZL18calc_pitch_segmentiiP9TONE_HEADP12TONE_NUCLEUSiiE12continue_tab)&4294967295);var $8=$pitch_range;var $9=$th_addr;var $body_max_steps=(($9+8)&4294967295);var $10=HEAPU8[($body_max_steps)];var $conv2=((($10))&255);var $sub3=((($conv2)-1)&4294967295);var $div=((((($8))|0)/((($sub3))|0))|0);$increment=$div;;}
65158 else if(__label__==2){var $11=$th_addr;var $n_overflow4=(($11+10)&4294967295);var $12=HEAPU8[($n_overflow4)];var $conv5=((($12))&255);$n_overflow=$conv5;var $13=$th_addr;var $overflow6=(($13+12)&4294967295);var $14=HEAP32[(($overflow6)>>2)];$overflow_tab=$14;$initial=1;;}
65159 var $15=$ix_addr;var $16=$end_ix_addr;var $cmp4=((($15))|0)<((($16))|0);var $17=$ix_addr;if($cmp4){__lastLabel__=3;__label__=4;;}else{__lastLabel__=3;__label__=31;;}
65160 $while_body$$while_end$6:do{if(__label__==4){$while_body$7:while(1){var $18=__lastLabel__==30?$90:($17);var $19=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx=(($19+6*$18)&4294967295);$syl=$arrayidx;var $20=$syl;var $stress7=(($20)&4294967295);var $21=HEAP8[($stress7)];var $conv8=(tempInt=(($21)),(tempInt>=128?tempInt-256:tempInt));$stress=$conv8;var $22=$initial;var $tobool9=((($22))|0)!=0;if($tobool9){__label__=8;;}else{__label__=5;;}
65161 $if_then15$$lor_lhs_false$9:do{if(__label__==5){var $23=$stress;var $24=$min_stress_addr;var $cmp10=((($23))|0)>=((($24))|0);if($cmp10){__lastLabel__=5;;}else{__lastLabel__=5;__label__=23;break $if_then15$$lor_lhs_false$9;}
65162 var $_pr=$initial;var $tobool12=((($_pr))|0)!=0;if($tobool12){__label__=8;break $if_then15$$lor_lhs_false$9;}
65163 var $25=$stress;var $cmp14=((($25))|0)==5;if($cmp14){__label__=8;break $if_then15$$lor_lhs_false$9;}
65164 var $39=$n_steps;var $cmp34=((($39))|0)>0;if($cmp34){__label__=16;;}else{__label__=17;;}
65165 if(__label__==16){var $40=$increment;var $41=$pitch;var $add=((($41)+($40))&4294967295);$pitch=$add;__label__=19;break $if_then15$$lor_lhs_false$9;}
65166 else if(__label__==17){var $42=$th_addr;var $body_end37=(($42+3)&4294967295);var $43=HEAPU8[($body_end37)];var $conv38=((($43))&255);var $shl39=((($conv38)*256)&4294967295);var $44=$pitch_range_abs;var $45=$overflow;var $inc=((($45)+1)&4294967295);$overflow=$inc;var $46=$overflow_tab;var $arrayidx40=(($46+$45)&4294967295);var $47=HEAP8[($arrayidx40)];var $conv41=(tempInt=(($47)),(tempInt>=128?tempInt-256:tempInt));var $mul=((($conv41)*($44))&4294967295);var $div42=((((($mul))|0)/64)|0);var $add43=((($div42)+($shl39))&4294967295);$pitch=$add43;var $48=$overflow;var $49=$n_overflow;var $cmp44=((($48))|0)>=((($49))|0);if(!($cmp44)){__label__=19;break $if_then15$$lor_lhs_false$9;}
65167 $overflow=0;var $50=$th_addr;var $overflow46=(($50+12)&4294967295);var $51=HEAP32[(($overflow46)>>2)];$overflow_tab=$51;__label__=19;break $if_then15$$lor_lhs_false$9;}}}while(0);$if_then15$$if_end49$$if_end59$18:do{if(__label__==8){$initial=0;$overflow=0;var $26=$ix_addr;var $27=$end_ix_addr;var $28=$min_stress_addr;var $call16=__ZL16count_incrementsiii($26,$27,$28);$n_primary=$call16;$n_steps=$call16;var $29=$n_steps;var $30=$th_addr;var $body_max_steps17=(($30+8)&4294967295);var $31=HEAPU8[($body_max_steps17)];var $conv18=((($31))&255);var $cmp19=((($29))|0)>((($conv18))|0);if($cmp19){__label__=9;;}else{__label__=10;;}
65168 if(__label__==9){var $32=$th_addr;var $body_max_steps21=(($32+8)&4294967295);var $33=HEAPU8[($body_max_steps21)];var $conv22=((($33))&255);$n_steps=$conv22;__lastLabel__=9;;}
65169 else if(__label__==10){var $_pr2=$n_steps;__lastLabel__=10;;}
65170 var $34=__lastLabel__==10?$_pr2:($conv22);var $cmp24=((($34))|0)>1;if($cmp24){__label__=12;;}else{__label__=13;;}
65171 if(__label__==12){var $35=$pitch_range;var $36=$n_steps;var $sub26=((($36)-1)&4294967295);var $div27=((((($35))|0)/((($sub26))|0))|0);$increment=$div27;;}
65172 else if(__label__==13){$increment=0;;}
65173 var $37=$th_addr;var $body_start30=(($37+2)&4294967295);var $38=HEAPU8[($body_start30)];var $conv31=((($38))&255);var $shl32=($conv31)<<8;$pitch=$shl32;__label__=19;break $if_then15$$if_end49$$if_end59$18;}}while(0);if(__label__==19){var $52=$n_steps;var $dec=((($52)-1)&4294967295);$n_steps=$dec;var $53=$n_primary;var $dec50=((($53)-1)&4294967295);$n_primary=$dec50;var $54=$tn_addr;var $backwards=(($54+8)&4294967295);var $55=HEAP32[(($backwards)>>2)];var $tobool51=((($55))|0)!=0;if($tobool51){__label__=20;;}else{__label__=22;;}
65174 $land_lhs_true$$if_end59thread_pre_split$30:do{if(__label__==20){var $56=$n_primary;var $cmp52=((($56))|0)<2;if(!($cmp52)){__label__=22;break $land_lhs_true$$if_end59thread_pre_split$30;}
65175 var $57=$n_primary;var $58=$tn_addr;var $backwards54=(($58+8)&4294967295);var $59=HEAP32[(($backwards54)>>2)];var $arrayidx55=(($59+2*$57)&4294967295);var $60=HEAP16[(($arrayidx55)>>1)];var $conv56=(tempInt=(($60)),(tempInt>=32768?tempInt-65536:tempInt));var $shl57=($conv56)<<8;$pitch=$shl57;;}}while(0);var $_pr3=$stress;__lastLabel__=22;;}
65176 var $61=__lastLabel__==22?$_pr3:($23);var $cmp60=((($61))|0)>=4;if($cmp60){__label__=24;;}else{__label__=25;;}
65177 if(__label__==24){var $62=$syl;var $stress62=(($62)&4294967295);HEAP8[($stress62)]=6;var $63=$syl;var $64=$pitch;var $shr=($64)>>8;var $65=$stress;var $66=$drops;var $arrayidx63=(($66+4*$65)&4294967295);var $67=HEAP32[(($arrayidx63)>>2)];__ZL9set_pitchP8SYLLABLEii($63,$shr,$67);;}
65178 else if(__label__==25){var $68=$stress;var $cmp65=((($68))|0)>=3;if($cmp65){__label__=26;;}else{__label__=27;;}
65179 if(__label__==26){var $69=$syl;var $70=$pitch;var $shr67=($70)>>8;var $71=$stress;var $72=$drops;var $arrayidx68=(($72+4*$71)&4294967295);var $73=HEAP32[(($arrayidx68)>>2)];__ZL9set_pitchP8SYLLABLEii($69,$shr67,$73);;}
65180 else if(__label__==27){var $74=$ix_addr;var $sub70=((($74)-1)&4294967295);var $75=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx71=(($75+6*$sub70)&4294967295);var $stress72=(($arrayidx71)&4294967295);var $76=HEAP8[($stress72)];var $conv73=(tempInt=(($76)),(tempInt>=128?tempInt-256:tempInt));var $and=($conv73)&63;var $cmp74=((($and))|0)>=3;var $77=$syl;var $78=$pitch;var $shr76=($78)>>8;if($cmp74){__label__=28;;}else{__label__=29;;}
65181 if(__label__==28){var $79=$th_addr;var $body_lower_u=(($79+9)&4294967295);var $80=HEAP8[($body_lower_u)];var $conv77=(tempInt=(($80)),(tempInt>=128?tempInt-256:tempInt));var $sub78=((($shr76)-($conv77))&4294967295);var $81=$stress;var $82=$drops;var $arrayidx79=(($82+4*$81)&4294967295);var $83=HEAP32[(($arrayidx79)>>2)];__ZL9set_pitchP8SYLLABLEii($77,$sub78,$83);;}
65182 else if(__label__==29){var $84=$stress;var $85=$drops;var $arrayidx82=(($85+4*$84)&4294967295);var $86=HEAP32[(($arrayidx82)>>2)];__ZL9set_pitchP8SYLLABLEii($77,$shr76,$86);;}}}
65183 var $87=$ix_addr;var $inc86=((($87)+1)&4294967295);$ix_addr=$inc86;var $88=$ix_addr;var $89=$end_ix_addr;var $cmp=((($88))|0)<((($89))|0);var $90=$ix_addr;if($cmp){__lastLabel__=30;__label__=4;continue $while_body$7;}else{__lastLabel__=30;__label__=31;break $while_body$$while_end$6;}}}}while(0);var $_lcssa=__lastLabel__==3?$17:($90);;return $_lcssa;return null;}
65184 function __ZL9set_pitchP8SYLLABLEii($syl,$base,$drop){;var __label__;var __lastLabel__=null;var $syl_addr;var $base_addr;var $drop_addr;var $pitch1;var $pitch2;var $flags;$syl_addr=$syl;$base_addr=$base;$drop_addr=$drop;$flags=0;var $0=$base_addr;var $cmp=((($0))|0)<0;if($cmp){__lastLabel__=0;__label__=1;;}else{__lastLabel__=0;__label__=2;;}
65185 if(__label__==1){$base_addr=0;var $_pr=$drop_addr;__lastLabel__=1;;}
65186 var $1=__lastLabel__==1?$_pr:($drop);var $2=$base_addr;$pitch2=$2;var $cmp1=((($1))|0)<0;if($cmp1){__label__=3;;}else{__label__=4;;}
65187 if(__label__==3){$flags=1;var $3=$drop_addr;var $sub=(((-($3)))&4294967295);$drop_addr=$sub;;}
65188 var $4=$pitch2;var $5=$drop_addr;var $add=((($5)+($4))&4294967295);$pitch1=$add;var $cmp4=((($add))|0)<0;if($cmp4){__label__=5;;}else{__label__=6;;}
65189 $if_end6_thread$$if_end6$8:do{if(__label__==5){$pitch1=0;;}
65190 else if(__label__==6){var $cmp7=((($add))|0)>254;if(!($cmp7)){__label__=8;break $if_end6_thread$$if_end6$8;}
65191 $pitch1=254;;}}while(0);var $6=$pitch2;var $cmp10=((($6))|0)>254;if($cmp10){__label__=9;;}else{__label__=10;;}
65192 if(__label__==9){$pitch2=254;;}
65193 var $7=$pitch1;var $conv=((($7))&255);var $8=$syl_addr;var $pitch113=(($8+4)&4294967295);HEAP8[($pitch113)]=$conv;var $9=$pitch2;var $conv14=((($9))&255);var $10=$syl_addr;var $pitch215=(($10+5)&4294967295);HEAP8[($pitch215)]=$conv14;var $11=$flags;var $12=$syl_addr;var $flags16=(($12+2)&4294967295);var $13=HEAP8[($flags16)];var $conv17=(tempInt=(($13)),(tempInt>=128?tempInt-256:tempInt));var $or=($conv17)|($11);var $conv18=((($or))&255);HEAP8[($flags16)]=$conv18;;return;return;}
65194 function __ZL16count_incrementsiii($ix,$end_ix,$min_stress){;var __label__;var $ix_addr;var $end_ix_addr;var $min_stress_addr;var $count;var $stress;$ix_addr=$ix;$end_ix_addr=$end_ix;$min_stress_addr=$min_stress;$count=0;;while(1){var $0=$ix_addr;var $1=$end_ix_addr;var $cmp=((($0))|0)<((($1))|0);if(!($cmp)){__label__=5;break;}
65195 var $2=$ix_addr;var $inc=((($2)+1)&4294967295);$ix_addr=$inc;var $3=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx=(($3+6*$2)&4294967295);var $stress1=(($arrayidx)&4294967295);var $4=HEAP8[($stress1)];var $conv=(tempInt=(($4)),(tempInt>=128?tempInt-256:tempInt));$stress=$conv;var $5=$stress;var $cmp2=((($5))|0)>=7;if($cmp2){__label__=5;break;}
65196 var $6=$stress;var $7=$min_stress_addr;var $cmp3=((($6))|0)>=((($7))|0);if(!($cmp3)){__label__=1;continue;}
65197 var $8=$count;var $inc5=((($8)+1)&4294967295);$count=$inc5;__label__=1;continue;}
65198 var $9=$count;;return $9;return null;}
65199 function __ZL17SetHeadIntonationP4TUNEiii($tune,$syl_ix,$end_ix){;var __label__;var __lastLabel__=null;var $tune_addr;var $syl_ix_addr;var $end_ix_addr;var $control_addr;var $stress;var $syl;var $ix;var $pitch;var $increment;var $n_steps;var $stage;var $initial;var $overflow_ix;var $pitch_range;var $pitch_range_abs;var $drops;var $n_unstressed;var $unstressed_ix;var $unstressed_inc;var $used_onset;var $head_final;var $secondary;$tune_addr=$tune;$syl_ix_addr=$syl_ix;$end_ix_addr=$end_ix;$control_addr=0;$pitch=0;$increment=0;$n_steps=0;$overflow_ix=0;$n_unstressed=0;$unstressed_ix=0;$used_onset=0;var $0=$end_ix_addr;$head_final=$0;$secondary=2;var $1=$tune_addr;var $head_end=(($1+32)&4294967295);var $2=HEAPU8[($head_end)];var $conv=((($2))&255);var $3=$tune_addr;var $head_start=(($3+31)&4294967295);var $4=HEAPU8[($head_start)];var $conv1=((($4))&255);var $sub=((($conv)-($conv1))&4294967295);var $shl=($sub)<<8;$pitch_range=$shl;var $5=$pitch_range;var $ispos=((($5))|0)>-1;var $neg=(((-($5)))&4294967295);var $call=($ispos)?($5):($neg);$pitch_range_abs=$call;$drops=((__ZL7drops_0)&4294967295);$initial=1;$stage=0;var $6=$tune_addr;var $onset=(($6+30)&4294967295);var $7=HEAPU8[($onset)];var $conv2=((($7))&255);var $cmp=((($conv2))|0)==255;if($cmp){__label__=1;;}else{__label__=2;;}
65200 if(__label__==1){$stage=1;;}
65201 var $8=$tune_addr;var $head_last=(($8+33)&4294967295);var $9=HEAPU8[($head_last)];var $conv3=((($9))&255);var $cmp4=((($conv3))|0)!=255;if($cmp4){__label__=4;;}else{__label__=3;;}
65202 $if_then5$$while_cond_preheader$5:do{if(__label__==4){var $13=$end_ix_addr;var $sub6=((($13)-1)&4294967295);$ix=$sub6;;while(1){var $14=$ix;var $15=$syl_ix_addr;var $cmp7=((($14))|0)>=((($15))|0);if(!($cmp7)){__label__=3;break $if_then5$$while_cond_preheader$5;}
65203 var $16=$ix;var $17=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx=(($17+6*$16)&4294967295);var $stress8=(($arrayidx)&4294967295);var $18=HEAP8[($stress8)];var $conv9=(tempInt=(($18)),(tempInt>=128?tempInt-256:tempInt));var $cmp10=((($conv9))|0)>=4;var $19=$ix;if($cmp10){__label__=7;break;}
65204 var $dec=((($19)-1)&4294967295);$ix=$dec;__label__=5;continue;}
65205 $head_final=$19;;}}while(0);var $10=$syl_ix_addr;var $11=$end_ix_addr;var $cmp145=((($10))|0)<((($11))|0);var $12=$syl_ix_addr;if($cmp145){__lastLabel__=3;__label__=9;;}else{__lastLabel__=3;__label__=39;;}
65206 $while_body$$while_end$13:do{if(__label__==9){$while_body$14:while(1){var $20=__lastLabel__==38?$108:($12);var $21=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx15=(($21+6*$20)&4294967295);$syl=$arrayidx15;var $22=$syl;var $stress16=(($22)&4294967295);var $23=HEAP8[($stress16)];var $conv17=(tempInt=(($23)),(tempInt>=128?tempInt-256:tempInt));$stress=$conv17;var $24=$initial;var $tobool=((($24))|0)!=0;if($tobool){__label__=13;;}else{__label__=10;;}
65207 $if_then23$$lor_lhs_false$16:do{if(__label__==10){var $25=$stress;var $cmp18=((($25))|0)>=4;if(!($cmp18)){__label__=32;break $if_then23$$lor_lhs_false$16;}
65208 var $_pr=$initial;var $tobool20=((($_pr))|0)!=0;if($tobool20){__label__=13;break $if_then23$$lor_lhs_false$16;}
65209 var $26=$stress;var $cmp22=((($26))|0)==5;if($cmp22){__label__=13;break $if_then23$$lor_lhs_false$16;}
65210 var $44=$syl_ix_addr;var $45=$head_final;var $cmp49=((($44))|0)==((($45))|0);if($cmp49){__label__=23;;}else{__label__=24;;}
65211 if(__label__==23){var $46=$tune_addr;var $head_last51=(($46+33)&4294967295);var $47=HEAPU8[($head_last51)];var $conv52=((($47))&255);var $shl53=($conv52)<<8;$pitch=$shl53;$stage=2;__label__=30;break $if_then23$$lor_lhs_false$16;}
65212 else if(__label__==24){var $48=$used_onset;var $tobool55=((($48))|0)!=0;if($tobool55){__label__=25;;}else{__label__=26;;}
65213 if(__label__==25){$stage=1;$used_onset=0;var $49=$tune_addr;var $head_start57=(($49+31)&4294967295);var $50=HEAPU8[($head_start57)];var $conv58=((($50))&255);var $shl59=($conv58)<<8;$pitch=$shl59;var $51=$n_steps;var $inc=((($51)+1)&4294967295);$n_steps=$inc;__label__=30;break $if_then23$$lor_lhs_false$16;}
65214 else if(__label__==26){var $52=$n_steps;var $cmp61=((($52))|0)>0;if($cmp61){__label__=27;;}else{__label__=28;;}
65215 if(__label__==27){var $53=$increment;var $54=$pitch;var $add63=((($54)+($53))&4294967295);$pitch=$add63;__label__=30;break $if_then23$$lor_lhs_false$16;}
65216 else if(__label__==28){var $55=$tune_addr;var $head_end65=(($55+32)&4294967295);var $56=HEAPU8[($head_end65)];var $conv66=((($56))&255);var $shl67=((($conv66)*256)&4294967295);var $57=$pitch_range_abs;var $58=$overflow_ix;var $inc68=((($58)+1)&4294967295);$overflow_ix=$inc68;var $59=$tune_addr;var $head_extend=(($59+16)&4294967295);var $arrayidx69=(($head_extend+$58)&4294967295);var $60=HEAP8[($arrayidx69)];var $conv70=(tempInt=(($60)),(tempInt>=128?tempInt-256:tempInt));var $mul=((($conv70)*($57))&4294967295);var $div71=((((($mul))|0)/64)|0);var $add72=((($div71)+($shl67))&4294967295);$pitch=$add72;var $61=$overflow_ix;var $62=$tune_addr;var $n_head_extend=(($62+35)&4294967295);var $63=HEAPU8[($n_head_extend)];var $conv73=((($63))&255);var $cmp74=((($61))|0)>=((($conv73))|0);if(!($cmp74)){__label__=30;break $if_then23$$lor_lhs_false$16;}
65217 $overflow_ix=0;__label__=30;break $if_then23$$lor_lhs_false$16;}}}}}while(0);$if_then23$$if_end82$$if_else89$31:do{if(__label__==13){$initial=0;$overflow_ix=0;var $27=$tune_addr;var $onset24=(($27+30)&4294967295);var $28=HEAPU8[($onset24)];var $conv25=((($28))&255);var $cmp26=((($conv25))|0)==255;var $29=$syl_ix_addr;if($cmp26){__label__=14;;}else{__label__=15;;}
65218 if(__label__==14){var $30=$head_final;var $call28=__ZL16count_incrementsiii($29,$30,4);$n_steps=$call28;var $31=$tune_addr;var $head_start29=(($31+31)&4294967295);var $32=HEAPU8[($head_start29)];var $conv30=((($32))&255);var $shl31=($conv30)<<8;$pitch=$shl31;;}
65219 else if(__label__==15){var $add=((($29)+1)&4294967295);var $33=$head_final;var $call32=__ZL16count_incrementsiii($add,$33,4);$n_steps=$call32;var $34=$tune_addr;var $onset33=(($34+30)&4294967295);var $35=HEAPU8[($onset33)];var $conv34=((($35))&255);var $shl35=($conv34)<<8;$pitch=$shl35;$used_onset=1;;}
65220 var $36=$n_steps;var $37=$tune_addr;var $head_max_steps=(($37+34)&4294967295);var $38=HEAPU8[($head_max_steps)];var $conv37=((($38))&255);var $cmp38=((($36))|0)>((($conv37))|0);if($cmp38){__label__=17;;}else{__label__=18;;}
65221 if(__label__==17){var $39=$tune_addr;var $head_max_steps40=(($39+34)&4294967295);var $40=HEAPU8[($head_max_steps40)];var $conv41=((($40))&255);$n_steps=$conv41;__lastLabel__=17;;}
65222 else if(__label__==18){var $_pr2=$n_steps;__lastLabel__=18;;}
65223 var $41=__lastLabel__==18?$_pr2:($conv41);var $cmp43=((($41))|0)>1;if($cmp43){__label__=20;;}else{__label__=21;;}
65224 if(__label__==20){var $42=$pitch_range;var $43=$n_steps;var $sub45=((($43)-1)&4294967295);var $div=((((($42))|0)/((($sub45))|0))|0);$increment=$div;__label__=30;break $if_then23$$if_end82$$if_else89$31;}
65225 else if(__label__==21){$increment=0;__label__=30;break $if_then23$$if_end82$$if_else89$31;}}}while(0);$if_end82$$if_else89$44:do{if(__label__==30){var $64=$n_steps;var $dec81=((($64)-1)&4294967295);$n_steps=$dec81;var $_pr3=$stress;var $cmp83=((($_pr3))|0)>=4;if(!($cmp83)){__label__=32;break $if_end82$$if_else89$44;}
65226 var $65=$syl_ix_addr;var $add85=((($65)+1)&4294967295);var $66=$end_ix_addr;var $67=$secondary;var $call86=__ZL15CountUnstressediii($add85,$66,$67);$n_unstressed=$call86;$unstressed_ix=0;var $68=$syl;var $stress87=(($68)&4294967295);HEAP8[($stress87)]=6;var $69=$tune_addr;var $stressed_env=(($69+26)&4294967295);var $70=HEAP8[($stressed_env)];var $71=$syl;var $env=(($71+1)&4294967295);HEAP8[($env)]=$70;var $72=$syl;var $73=$pitch;var $shr=($73)>>8;var $74=$tune_addr;var $stressed_drop=(($74+27)&4294967295);var $75=HEAPU8[($stressed_drop)];var $conv88=((($75))&255);__ZL9set_pitchP8SYLLABLEii($72,$shr,$conv88);__label__=38;break $if_end82$$if_else89$44;}}while(0);if(__label__==32){var $76=$stress;var $77=$secondary;var $cmp90=((($76))|0)>=((($77))|0);if($cmp90){__label__=33;;}else{__label__=34;;}
65227 if(__label__==33){var $78=$syl_ix_addr;var $add92=((($78)+1)&4294967295);var $79=$end_ix_addr;var $80=$secondary;var $call93=__ZL15CountUnstressediii($add92,$79,$80);$n_unstressed=$call93;$unstressed_ix=0;var $81=$syl;var $82=$pitch;var $shr94=($82)>>8;var $83=$stress;var $84=$drops;var $arrayidx95=(($84+4*$83)&4294967295);var $85=HEAP32[(($arrayidx95)>>2)];__ZL9set_pitchP8SYLLABLEii($81,$shr94,$85);;}
65228 else if(__label__==34){var $86=$n_unstressed;var $cmp97=((($86))|0)>1;if($cmp97){__label__=35;;}else{__label__=36;;}
65229 if(__label__==35){var $87=$stage;var $88=$tune_addr;var $unstr_end=(($88+39)&4294967295);var $arrayidx99=(($unstr_end+$87)&4294967295);var $89=HEAP8[($arrayidx99)];var $conv100=(tempInt=(($89)),(tempInt>=128?tempInt-256:tempInt));var $90=$stage;var $91=$tune_addr;var $unstr_start=(($91+36)&4294967295);var $arrayidx101=(($unstr_start+$90)&4294967295);var $92=HEAP8[($arrayidx101)];var $conv102=(tempInt=(($92)),(tempInt>=128?tempInt-256:tempInt));var $sub103=((($conv100)-($conv102))&4294967295);var $93=$n_unstressed;var $sub104=((($93)-1)&4294967295);var $div105=((((($sub103))|0)/((($sub104))|0))|0);$unstressed_inc=$div105;;}
65230 else if(__label__==36){$unstressed_inc=0;;}
65231 var $94=$syl;var $95=$pitch;var $shr108=($95)>>8;var $96=$stage;var $97=$tune_addr;var $unstr_start109=(($97+36)&4294967295);var $arrayidx110=(($unstr_start109+$96)&4294967295);var $98=HEAP8[($arrayidx110)];var $conv111=(tempInt=(($98)),(tempInt>=128?tempInt-256:tempInt));var $99=$unstressed_inc;var $100=$unstressed_ix;var $mul113=((($100)*($99))&4294967295);var $add112=((($conv111)+($shr108))&4294967295);var $add114=((($add112)+($mul113))&4294967295);var $101=$stress;var $102=$drops;var $arrayidx115=(($102+4*$101)&4294967295);var $103=HEAP32[(($arrayidx115)>>2)];__ZL9set_pitchP8SYLLABLEii($94,$add114,$103);var $104=$unstressed_ix;var $inc116=((($104)+1)&4294967295);$unstressed_ix=$inc116;;}}
65232 var $105=$syl_ix_addr;var $inc119=((($105)+1)&4294967295);$syl_ix_addr=$inc119;var $106=$syl_ix_addr;var $107=$end_ix_addr;var $cmp14=((($106))|0)<((($107))|0);var $108=$syl_ix_addr;if($cmp14){__lastLabel__=38;__label__=9;continue $while_body$14;}else{__lastLabel__=38;__label__=39;break $while_body$$while_end$13;}}}}while(0);var $_lcssa=__lastLabel__==3?$12:($108);;return $_lcssa;return null;}
65233 function __ZL15CountUnstressediii($start,$end,$limit){;var __label__;var $start_addr;var $end_addr;var $limit_addr;var $ix;$start_addr=$start;$end_addr=$end;$limit_addr=$limit;var $0=$start_addr;$ix=$0;;while(1){var $1=$ix;var $2=$end_addr;var $cmp=((($1))|0)<=((($2))|0);if(!($cmp)){__label__=4;break;}
65234 var $3=$ix;var $4=HEAP32[((__ZL12syllable_tab)>>2)];var $arrayidx=(($4+6*$3)&4294967295);var $stress=(($arrayidx)&4294967295);var $5=HEAP8[($stress)];var $conv=(tempInt=(($5)),(tempInt>=128?tempInt-256:tempInt));var $6=$limit_addr;var $cmp1=((($conv))|0)>=((($6))|0);if($cmp1){__label__=4;break;}
65235 var $7=$ix;var $inc=((($7)+1)&4294967295);$ix=$inc;__label__=1;continue;}
65236 var $8=$ix;var $9=$start_addr;var $sub=((($8)-($9))&4294967295);;return $sub;return null;}
65237 function _iswalpha($c){;var __label__;var $retval;var $c_addr;$c_addr=$c;var $0=$c_addr;var $cmp=((($0))>>>0)<256;var $1=$c_addr;if($cmp){__label__=1;;}else{__label__=2;;}
65238 if(__label__==1){var $call=_isalpha($1);$retval=$call;;}
65239 else if(__label__==2){var $cmp1=((($1))>>>0)>12352;var $2=$c_addr;var $cmp2=((($2))>>>0)<=42752;var $or_cond=($cmp1)&($cmp2);if($or_cond){__label__=3;;}else{__label__=4;;}
65240 if(__label__==3){$retval=1;;}
65241 else if(__label__==4){var $3=$c_addr;var $cmp5=((($3))>>>0)>563;if($cmp5){__label__=5;;}else{__label__=6;;}
65242 if(__label__==5){$retval=0;;}
65243 else if(__label__==6){var $4=$c_addr;var $sub=((($4)-256)&4294967295);var $arrayidx=((_walpha_tab+$sub)&4294967295);var $5=HEAPU8[($arrayidx)];var $conv=((($5))&255);$retval=$conv;;}}}
65244 var $6=$retval;;return $6;return null;}
65245 function _iswdigit($c){;var __label__;var $retval;var $c_addr;$c_addr=$c;var $0=$c_addr;var $cmp=((($0))>>>0)<256;if($cmp){__label__=1;;}else{__label__=2;;}
65246 if(__label__==1){var $1=$c_addr;var $isdigittmp=((($1)-48)&4294967295);var $isdigit=((($isdigittmp))>>>0)<10;var $call=((($isdigit))&1);$retval=$call;;}
65247 else if(__label__==2){$retval=0;;}
65248 var $2=$retval;;return $2;return null;}
65249 function _iswalnum($c){;var __label__;var $retval;var $c_addr;$c_addr=$c;var $0=$c_addr;var $call=_iswdigit($0);var $tobool=((($call))|0)!=0;if($tobool){__label__=1;;}else{__label__=2;;}
65250 if(__label__==1){$retval=1;;}
65251 else if(__label__==2){var $1=$c_addr;var $call1=_iswalpha($1);$retval=$call1;;}
65252 var $2=$retval;;return $2;return null;}
65253 function _towlower($c){;var __label__;var $retval;var $c_addr;var $x;$c_addr=$c;var $0=$c_addr;var $cmp=((($0))>>>0)<256;var $1=$c_addr;if($cmp){__label__=1;;}else{__label__=2;;}
65254 $if_then$$if_end$2:do{if(__label__==1){var $call=_tolower($1);$retval=$call;;}
65255 else if(__label__==2){var $cmp1=((($1))>>>0)>563;if($cmp1){__label__=4;;}else{__label__=3;;}
65256 $if_then3$$lor_lhs_false$5:do{if(__label__==3){var $2=$c_addr;var $sub=((($2)-256)&4294967295);var $arrayidx=((_walpha_tab+$sub)&4294967295);var $3=HEAPU8[($arrayidx)];var $conv=((($3))&255);$x=$conv;var $cmp2=((($conv))|0)==255;if($cmp2){__label__=4;break $if_then3$$lor_lhs_false$5;}
65257 var $5=$x;var $cmp5=((($5))|0)==254;if($cmp5){__label__=6;;}else{__label__=8;;}
65258 $if_then6$$if_end10$8:do{if(__label__==6){var $6=$c_addr;var $cmp7=((($6))|0)==304;if(!($cmp7)){__label__=8;break $if_then6$$if_end10$8;}
65259 $retval=105;__label__=9;break $if_then$$if_end$2;}}while(0);var $7=$c_addr;var $8=$x;var $add=((($8)+($7))&4294967295);$retval=$add;__label__=9;break $if_then$$if_end$2;}}while(0);var $4=$c_addr;$retval=$4;;}}while(0);var $9=$retval;;return $9;return null;}
65260 function _towupper($c){;var __label__;var $retval;var $c_addr;$c_addr=$c;var $0=$c_addr;var $sub=((($0)-1)&4294967295);var $call=_tolower($sub);var $1=$c_addr;var $cmp=((($call))|0)==((($1))|0);var $2=$c_addr;if($cmp){__label__=1;;}else{__label__=2;;}
65261 if(__label__==1){var $sub1=((($2)-1)&4294967295);$retval=$sub1;;}
65262 else if(__label__==2){$retval=$2;;}
65263 var $3=$retval;;return $3;return null;}
65264 function _iswupper($c){;var __label__;var $retval;var $c_addr;var $x;$c_addr=$c;var $0=$c_addr;var $cmp=((($0))>>>0)<256;var $1=$c_addr;if($cmp){__label__=1;;}else{__label__=2;;}
65265 $if_then$$if_end$2:do{if(__label__==1){var $call=_isupper($1);$retval=$call;;}
65266 else if(__label__==2){var $cmp1=((($1))>>>0)>563;if($cmp1){__label__=5;;}else{__label__=3;;}
65267 $if_then5$$lor_lhs_false$5:do{if(__label__==3){var $2=$c_addr;var $sub=((($2)-256)&4294967295);var $arrayidx=((_walpha_tab+$sub)&4294967295);var $3=HEAPU8[($arrayidx)];var $conv=((($3))&255);$x=$conv;var $cmp2=((($conv))|0)==0;if($cmp2){__label__=5;break $if_then5$$lor_lhs_false$5;}
65268 var $4=$x;var $cmp4=((($4))|0)==255;if($cmp4){__label__=5;break $if_then5$$lor_lhs_false$5;}
65269 $retval=1;__label__=7;break $if_then$$if_end$2;}}while(0);$retval=0;;}}while(0);var $5=$retval;;return $5;return null;}
65270 function _iswlower($c){;var __label__;var $retval;var $c_addr;$c_addr=$c;var $0=$c_addr;var $cmp=((($0))>>>0)<256;var $1=$c_addr;if($cmp){__label__=1;;}else{__label__=2;;}
65271 $if_then$$if_end$2:do{if(__label__==1){var $call=_islower($1);$retval=$call;;}
65272 else if(__label__==2){var $cmp1=((($1))>>>0)>563;if($cmp1){__label__=4;;}else{__label__=3;;}
65273 $if_then3$$lor_lhs_false$5:do{if(__label__==3){var $2=$c_addr;var $sub=((($2)-256)&4294967295);var $arrayidx=((_walpha_tab+$sub)&4294967295);var $3=HEAPU8[($arrayidx)];var $conv=((($3))&255);var $cmp2=((($conv))|0)!=255;if($cmp2){__label__=4;break $if_then3$$lor_lhs_false$5;}
65274 $retval=1;__label__=6;break $if_then$$if_end$2;}}while(0);$retval=0;;}}while(0);var $4=$retval;;return $4;return null;}
65275 function _iswspace($c){;var __label__;var $retval;var $c_addr;$c_addr=$c;var $0=$c_addr;var $cmp=((($0))>>>0)<256;if($cmp){__label__=1;;}else{__label__=2;;}
65276 if(__label__==1){var $1=$c_addr;var $call=_isspace($1);$retval=$call;;}
65277 else if(__label__==2){$retval=0;;}
65278 var $2=$retval;;return $2;return null;}
65279 function _iswpunct($c){;var __label__;var $retval;var $c_addr;$c_addr=$c;var $0=$c_addr;var $cmp=((($0))>>>0)<256;if($cmp){__label__=1;;}else{__label__=2;;}
65280 if(__label__==1){var $1=$c_addr;var $call=_ispunct($1);$retval=$call;;}
65281 else if(__label__==2){$retval=0;;}
65282 var $2=$retval;;return $2;return null;}
65283 function _wcschr($str,$c){;var __label__;var $retval;var $str_addr;var $c_addr;$str_addr=$str;$c_addr=$c;;while(1){var $0=$str_addr;var $1=HEAP32[(($0)>>2)];var $cmp=((($1))|0)!=0;if(!($cmp)){__label__=5;break;}
65284 var $2=$str_addr;var $3=HEAP32[(($2)>>2)];var $4=$c_addr;var $cmp1=((($3))|0)==((($4))|0);var $5=$str_addr;if($cmp1){__label__=3;break;}
65285 var $incdec_ptr=(($5+4)&4294967295);$str_addr=$incdec_ptr;__label__=1;continue;}
65286 if(__label__==5){$retval=0;;}
65287 else if(__label__==3){$retval=$5;;}
65288 var $6=$retval;;return $6;return null;}
65289 function _wcslen($str){;var __label__;var __lastLabel__=null;var $str_addr;var $ix;$str_addr=$str;$ix=0;var $0=$str_addr;var $1=HEAP32[(($0)>>2)];var $cmp1=((($1))|0)!=0;var $2=$ix;if($cmp1){__lastLabel__=0;__label__=1;;}else{__lastLabel__=0;__label__=2;;}
65290 $while_body$$while_end$2:do{if(__label__==1){while(1){var $3=__lastLabel__==1?$6:($2);var $inc=((($3)+1)&4294967295);$ix=$inc;var $4=$str_addr;var $5=HEAP32[(($4)>>2)];var $cmp=((($5))|0)!=0;var $6=$ix;if($cmp){__lastLabel__=1;__label__=1;continue;}else{__lastLabel__=1;__label__=2;break $while_body$$while_end$2;}}}}while(0);var $_lcssa=__lastLabel__==0?$2:($6);;return $_lcssa;return null;}
65291 function _wcstod($str,$tailptr){var __stackBase__=STACKTOP;STACKTOP+=80;_memset(__stackBase__,0,80);var __label__;var __lastLabel__=null;var $str_addr;var $tailptr_addr;var $ix;var $buf=__stackBase__;$str_addr=$str;$tailptr_addr=$tailptr;var $0=$str_addr;var $1=HEAP32[(($0)>>2)];var $call1=_isspace($1);var $tobool2=((($call1))|0)!=0;if($tobool2){__label__=1;;}else{__label__=2;;}
65292 $while_body$$while_end$2:do{if(__label__==1){while(1){var $2=$str_addr;var $incdec_ptr=(($2+4)&4294967295);$str_addr=$incdec_ptr;var $3=$str_addr;var $4=HEAP32[(($3)>>2)];var $call=_isspace($4);var $tobool=((($call))|0)!=0;if($tobool){__label__=1;continue;}else{__label__=2;break $while_body$$while_end$2;}}}}while(0);$ix=0;__lastLabel__=2;;while(1){var $5=__lastLabel__==5?$inc:(0);var $cmp=((($5))|0)<80;if(!($cmp)){__label__=6;break;}
65293 var $6=$ix;var $7=$str_addr;var $arrayidx=(($7+4*$6)&4294967295);var $8=HEAP32[(($arrayidx)>>2)];var $conv=((($8))&255);var $9=$ix;var $arrayidx1=(($buf+$9)&4294967295);HEAP8[($arrayidx1)]=$conv;var $10=$ix;var $arrayidx2=(($buf+$10)&4294967295);var $11=HEAP8[($arrayidx2)];var $conv3=(tempInt=(($11)),(tempInt>=128?tempInt-256:tempInt));var $call4=_isspace($conv3);var $tobool5=((($call4))|0)!=0;if($tobool5){__label__=6;break;}
65294 var $12=$ix;var $inc=((($12)+1)&4294967295);$ix=$inc;__lastLabel__=5;__label__=3;continue;}
65295 var $13=$ix;var $14=$str_addr;var $arrayidx6=(($14+4*$13)&4294967295);var $15=$tailptr_addr;HEAP32[(($15)>>2)]=$arrayidx6;var $arraydecay=(($buf)&4294967295);var $call7=_atof($arraydecay);var $conv8=($call7);STACKTOP=__stackBase__;return $conv8;return null;}
65296 function __Z9towlower2j($c){;var __label__;var $c_addr;$c_addr=$c;var $0=$c_addr;var $cmp=((($0))|0)==73;if($cmp){__label__=1;;}else{__label__=3;;}
65297 $if_then$$if_end3$2:do{if(__label__==1){var $1=HEAP32[((_translator)>>2)];var $translator_name=(($1+280)&4294967295);var $2=HEAP32[(($translator_name)>>2)];var $cmp1=((($2))|0)==29810;if(!($cmp1)){__label__=3;break $if_then$$if_end3$2;}
65298 $c_addr=305;;}}while(0);var $3=$c_addr;var $call=_towlower($3);;return $call;return null;}
65299 function __Z3Eofv(){;var __label__;var $retval;var $0=HEAP32[((__ZL10ungot_char)>>2)];var $cmp=((($0))|0)!=0;if($cmp){__label__=1;;}else{__label__=2;;}
65300 if(__label__==1){$retval=0;;}
65301 else if(__label__==2){var $1=HEAP32[((__ZL7f_input)>>2)];var $cmp1=((($1))|0)!=0;if($cmp1){__label__=3;;}else{__label__=4;;}
65302 if(__label__==3){var $2=HEAP32[((__ZL7f_input)>>2)];var $_flags=(($2+12)&4294967295);var $3=HEAP16[(($_flags)>>1)];var $conv=(tempInt=(($3)),(tempInt>=32768?tempInt-65536:tempInt));var $and=($conv)&32;var $cmp3=((($and))|0)!=0;var $conv4=((($cmp3))&1);$retval=$conv4;;}
65303 else if(__label__==4){var $_b=HEAPU8[(__ZL12end_of_input_b)];var $4=((($_b))&1);$retval=$4;;}}
65304 var $5=$retval;;return $5;return null;}
65305 function __Z10Read4BytesP7__sFILE($f){;var __label__;var $f_addr;var $ix;var $c;var $acc;$f_addr=$f;$acc=0;$ix=0;;while(1){var $0=$f_addr;var $call=_fgetc($0);var $and=($call)&255;var $conv=((($and))&255);$c=$conv;var $1=$c;var $conv1=((($1))&255);var $2=$ix;var $mul=((($2)*8)&4294967295);var $shl=($conv1)<<($mul);var $3=$acc;var $add=((($shl)+($3))&4294967295);$acc=$add;var $4=$ix;var $inc=((($4)+1)&4294967295);$ix=$inc;var $cmp=((($inc))|0)<4;if($cmp){__label__=1;continue;}else{__label__=2;break;}}
65306 var $5=$acc;;return $5;return null;}
65307 function __Z11AddNameDataPKci($name,$wide){;var __label__;var $retval;var $name_addr;var $wide_addr;var $ix;var $len;var $vp;$name_addr=$name;$wide_addr=$wide;var $0=$wide_addr;var $tobool=((($0))|0)!=0;var $1=$name_addr;if($tobool){__label__=1;;}else{__label__=2;;}
65308 if(__label__==1){var $2=$1;var $call=_wcslen($2);var $add=((($call)+1)&4294967295);var $mul=((($add)*4)&4294967295);$len=$mul;var $3=HEAP32[((__ZL10n_namedata)>>2)];var $sub=((($3)+3)&4294967295);var $rem=((($sub))>>>0)%4;HEAP32[((__ZL10n_namedata)>>2)]=$rem;;}
65309 else if(__label__==2){var $call2=_strlen($1);var $add3=((($call2)+1)&4294967295);$len=$add3;;}
65310 var $4=HEAP32[((__ZL11namedata_ix)>>2)];var $5=$len;var $add4=((($5)+($4))&4294967295);var $6=HEAP32[((__ZL10n_namedata)>>2)];var $cmp=((($add4))|0)>=((($6))|0);if($cmp){__label__=4;;}else{__label__=7;;}
65311 $if_then5$$if_end14$6:do{if(__label__==4){var $7=HEAP32[((_namedata)>>2)];var $8=HEAP32[((__ZL11namedata_ix)>>2)];var $9=$len;var $add6=((($8)+300)&4294967295);var $add7=((($add6)+($9))&4294967295);var $call8=_realloc($7,$add7);$vp=$call8;var $cmp9=((($call8))|0)==0;if($cmp9){__label__=5;;}else{__label__=6;;}
65312 if(__label__==5){$retval=-1;__label__=8;break $if_then5$$if_end14$6;}
65313 else if(__label__==6){var $10=$vp;HEAP32[((_namedata)>>2)]=$10;var $11=HEAP32[((__ZL11namedata_ix)>>2)];var $12=$len;var $add12=((($11)+300)&4294967295);var $add13=((($add12)+($12))&4294967295);HEAP32[((__ZL10n_namedata)>>2)]=$add13;__label__=7;break $if_then5$$if_end14$6;}}}while(0);if(__label__==7){var $13=HEAP32[((__ZL11namedata_ix)>>2)];$ix=$13;var $14=HEAP32[((_namedata)>>2)];var $arrayidx=(($14+$13)&4294967295);var $15=$name_addr;var $16=$len;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$15;$dest$=$arrayidx;$stop$=$src$+$16;if(($dest$%4)==($src$%4)&&$16>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
65314 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
65315 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $17=$len;var $18=HEAP32[((__ZL11namedata_ix)>>2)];var $add15=((($18)+($17))&4294967295);HEAP32[((__ZL11namedata_ix)>>2)]=$add15;var $19=$ix;$retval=$19;;}
65316 var $20=$retval;;return $20;return null;}
65317 function __Z13SetVoiceStackP12espeak_VOICE($v){;var __label__;var $v_addr;var $sp;$v_addr=$v;$sp=((__ZL10ssml_stack)&4294967295);var $0=$v_addr;var $cmp=((($0))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
65318 if(__label__==1){var $1=$sp;var $2=$1;var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=$2;$stop$=$dest$+76;$value4$=0;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=0;}
65319 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
65320 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=0;};;}
65321 else if(__label__==2){var $3=$v_addr;var $languages=(($3+4)&4294967295);var $4=HEAP32[(($languages)>>2)];var $cmp1=((($4))|0)!=0;if($cmp1){__label__=3;;}else{__label__=4;;}
65322 if(__label__==3){var $5=$sp;var $language=(($5+56)&4294967295);var $arraydecay=(($language)&4294967295);var $6=$v_addr;var $languages3=(($6+4)&4294967295);var $7=HEAP32[(($languages3)>>2)];var $call=_strcpy($arraydecay,$7);;}
65323 var $8=$v_addr;var $name=(($8)&4294967295);var $9=HEAP32[(($name)>>2)];var $cmp5=((($9))|0)!=0;if($cmp5){__label__=5;;}else{__label__=6;;}
65324 if(__label__==5){var $10=$sp;var $voice_name=(($10+16)&4294967295);var $arraydecay7=(($voice_name)&4294967295);var $11=$v_addr;var $name8=(($11)&4294967295);var $12=HEAP32[(($name8)>>2)];var $call9=_strcpy($arraydecay7,$12);;}
65325 var $13=$v_addr;var $variant=(($13+14)&4294967295);var $14=HEAPU8[($variant)];var $conv=((($14))&255);var $15=$sp;var $voice_variant=(($15+4)&4294967295);HEAP32[(($voice_variant)>>2)]=$conv;var $16=$v_addr;var $age=(($16+13)&4294967295);var $17=HEAPU8[($age)];var $conv11=((($17))&255);var $18=$sp;var $voice_age=(($18+12)&4294967295);HEAP32[(($voice_age)>>2)]=$conv11;var $19=$v_addr;var $gender=(($19+12)&4294967295);var $20=HEAPU8[($gender)];var $conv12=((($20))&255);var $21=$sp;var $voice_gender=(($21+8)&4294967295);HEAP32[(($voice_gender)>>2)]=$conv12;;};return;return;}
65326 function __Z10ReadClauseP10TranslatorP7__sFILEPcPsPiiS5_S3_($tr,$f_in,$buf,$charix,$charix_top,$n_buf,$tone_type,$voice_change){var __stackBase__=STACKTOP;STACKTOP+=1136;_memset(__stackBase__,0,1136);var __label__;var __lastLabel__=null;var $retval;var $tr_addr;var $f_in_addr;var $buf_addr;var $charix_addr;var $charix_top_addr;var $n_buf_addr;var $tone_type_addr;var $voice_change_addr;var $c1=__stackBase__;var $c2=__stackBase__+4;var $cprev;var $cprev2;var $c_next;var $parag;var $ix=__stackBase__+8;var $j;var $nl_count;var $linelength;var $phoneme_mode;var $n_xml_buf;var $terminator;var $punct;var $found;var $any_alnum;var $self_closing;var $punct_data;var $is_end_clause;var $announced_punctuation;var $prev_announced_punctuation;var $stressed_word;var $end_clause_after_tag;var $end_clause_index;var $xml_buf=__stackBase__+12;var $xml_buf2=__stackBase__+1040;var $p_word;var $text_buf=__stackBase__+1064;var $text_buf2=__stackBase__+1104;var $p2;$tr_addr=$tr;$f_in_addr=$f_in;$buf_addr=$buf;$charix_addr=$charix;$charix_top_addr=$charix_top;$n_buf_addr=$n_buf;$tone_type_addr=$tone_type;$voice_change_addr=$voice_change;HEAP32[(($c1)>>2)]=32;$cprev=32;$cprev2=32;HEAP32[(($ix)>>2)]=0;$linelength=0;$phoneme_mode=0;$any_alnum=0;$punct_data=0;$announced_punctuation=0;$stressed_word=0;$end_clause_after_tag=0;$end_clause_index=0;var $_b=HEAPU8[(__ZL19clear_skipping_text_b)];var $0=((($_b))&1);var $tobool=((($0))|0)!=0;if($tobool){__label__=1;;}else{__label__=2;;}
65327 if(__label__==1){HEAP32[((_skipping_text)>>2)]=0;HEAP8[(__ZL19clear_skipping_text_b)]=0;;}
65328 var $1=$tr_addr;var $phonemes_repeat_count=(($1+652)&4294967295);HEAP32[(($phonemes_repeat_count)>>2)]=0;var $2=$tr_addr;var $clause_upper_count=(($2+8304)&4294967295);HEAP32[(($clause_upper_count)>>2)]=0;var $3=$tr_addr;var $clause_lower_count=(($3+8308)&4294967295);HEAP32[(($clause_lower_count)>>2)]=0;HEAP8[(__ZL12end_of_input_b)]=0;var $4=$tone_type_addr;HEAP32[(($4)>>2)]=0;var $5=$voice_change_addr;HEAP8[($5)]=0;var $6=$f_in_addr;HEAP32[((__ZL7f_input)>>2)]=$6;var $7=HEAP32[((__ZL10ungot_word)>>2)];var $cmp=((($7))|0)!=0;if($cmp){__label__=3;;}else{__label__=4;;}
65329 if(__label__==3){var $8=$buf_addr;var $9=HEAP32[((__ZL10ungot_word)>>2)];var $call=_strcpy($8,$9);var $10=HEAP32[((__ZL10ungot_word)>>2)];var $call2=_strlen($10);var $11=HEAP32[(($ix)>>2)];var $add=((($11)+($call2))&4294967295);HEAP32[(($ix)>>2)]=$add;HEAP32[((__ZL10ungot_word)>>2)]=0;;}
65330 var $12=HEAP32[((__ZL11ungot_char2)>>2)];var $cmp4=((($12))|0)!=0;if($cmp4){__label__=5;;}else{__label__=6;;}
65331 if(__label__==5){var $13=HEAP32[((__ZL11ungot_char2)>>2)];HEAP32[(($c2)>>2)]=$13;;}
65332 else if(__label__==6){var $call6=__ZL4GetCv();HEAP32[(($c2)>>2)]=$call6;;}
65333 var $arrayidx82=(($xml_buf2)&4294967295);var $arrayidx86=(($xml_buf2)&4294967295);var $arrayidx90=(($xml_buf2+1)&4294967295);var $arrayidx94=(($xml_buf2+2)&4294967295);var $arrayidx97=(($xml_buf2+1)&4294967295);var $arraydecay=(($xml_buf2)&4294967295);var $arraydecay164=(($xml_buf)&4294967295);var $arraydecay324=(($text_buf2)&4294967295);var $arraydecay328=(($text_buf)&4294967295);var $arraydecay329=(($text_buf2)&4294967295);var $arraydecay331=(($text_buf)&4294967295);var $arraydecay337=(($text_buf)&4294967295);;$while_cond$12:while(1){var $call8=__Z3Eofv();var $tobool9=((($call8))|0)==0;var $14=HEAP32[((__ZL10ungot_char)>>2)];var $cmp10=((($14))|0)!=0;var $or_cond=($tobool9)|($cmp10);var $15=HEAP32[((__ZL11ungot_char2)>>2)];var $cmp12=((($15))|0)!=0;var $or_cond3=($or_cond)|($cmp12);var $16=HEAP32[((__ZZ10ReadClauseP10TranslatorP7__sFILEPcPsPiiS5_S3_E15ungot_string_ix)>>2)];var $cmp13=((($16))|0)>=0;var $or_cond19=($or_cond3)|($cmp13);if(!($or_cond19)){__label__=256;break $while_cond$12;}
65334 var $17=HEAP32[(($c1)>>2)];var $call14=_iswalnum($17);var $tobool15=((($call14))|0)!=0;if($tobool15){__label__=16;;}else{__label__=10;;}
65335 $if_end26$$if_then16$15:do{if(__label__==10){var $18=HEAP32[((_end_character_position)>>2)];var $cmp17=((($18))|0)>0;if($cmp17){__label__=11;;}else{__label__=13;;}
65336 if(__label__==11){var $19=HEAP32[((_count_characters)>>2)];var $20=HEAP32[((_end_character_position)>>2)];var $cmp18=((($19))|0)>((($20))|0);if($cmp18){__label__=12;break $while_cond$12;}}
65337 var $21=HEAP32[((_skip_characters)>>2)];var $cmp21=((($21))|0)>0;if(!($cmp21)){__label__=16;break $if_end26$$if_then16$15;}
65338 var $22=HEAP32[((_count_characters)>>2)];var $23=HEAP32[((_skip_characters)>>2)];var $cmp23=((($22))|0)>((($23))|0);if($cmp23){__label__=15;break $while_cond$12;}}}while(0);var $25=$cprev;$cprev2=$25;var $26=HEAP32[(($c1)>>2)];$cprev=$26;var $27=HEAP32[(($c2)>>2)];HEAP32[(($c1)>>2)]=$27;var $28=HEAP32[((__ZZ10ReadClauseP10TranslatorP7__sFILEPcPsPiiS5_S3_E15ungot_string_ix)>>2)];var $cmp27=((($28))|0)>=0;if($cmp27){__label__=17;;}else{__label__=19;;}
65339 $if_then28$$if_end32$22:do{if(__label__==17){var $29=HEAP32[((__ZZ10ReadClauseP10TranslatorP7__sFILEPcPsPiiS5_S3_E15ungot_string_ix)>>2)];var $arrayidx=((__ZZ10ReadClauseP10TranslatorP7__sFILEPcPsPiiS5_S3_E12ungot_string+$29)&4294967295);var $30=HEAP8[($arrayidx)];var $conv=(tempInt=(($30)),(tempInt>=128?tempInt-256:tempInt));var $cmp29=((($conv))|0)==0;if(!($cmp29)){__label__=19;break $if_then28$$if_end32$22;}
65340 HEAP32[((__ZZ10ReadClauseP10TranslatorP7__sFILEPcPsPiiS5_S3_E15ungot_string_ix)>>2)]=-1;;}}while(0);var $31=HEAP32[((__ZZ10ReadClauseP10TranslatorP7__sFILEPcPsPiiS5_S3_E15ungot_string_ix)>>2)];var $cmp33=((($31))|0)==0;var $32=HEAP32[((__ZL11ungot_char2)>>2)];var $cmp35=((($32))|0)==0;var $or_cond4=($cmp33)&($cmp35);if($or_cond4){__lastLabel__=19;__label__=20;;}else{__lastLabel__=19;__label__=21;;}
65341 if(__label__==20){var $33=HEAP32[((__ZZ10ReadClauseP10TranslatorP7__sFILEPcPsPiiS5_S3_E15ungot_string_ix)>>2)];var $inc=((($33)+1)&4294967295);HEAP32[((__ZZ10ReadClauseP10TranslatorP7__sFILEPcPsPiiS5_S3_E15ungot_string_ix)>>2)]=$inc;var $arrayidx37=((__ZZ10ReadClauseP10TranslatorP7__sFILEPcPsPiiS5_S3_E12ungot_string+$33)&4294967295);var $34=HEAP8[($arrayidx37)];var $conv38=(tempInt=(($34)),(tempInt>=128?tempInt-256:tempInt));HEAP32[(($c1)>>2)]=$conv38;__lastLabel__=20;;}
65342 var $35=__lastLabel__==20?$inc:($31);var $cmp40=((($35))|0)>=0;if($cmp40){__label__=22;;}else{__label__=23;;}
65343 $if_then41$$if_else45$29:do{if(__label__==22){var $36=HEAP32[((__ZZ10ReadClauseP10TranslatorP7__sFILEPcPsPiiS5_S3_E15ungot_string_ix)>>2)];var $inc42=((($36)+1)&4294967295);HEAP32[((__ZZ10ReadClauseP10TranslatorP7__sFILEPcPsPiiS5_S3_E15ungot_string_ix)>>2)]=$inc42;var $arrayidx43=((__ZZ10ReadClauseP10TranslatorP7__sFILEPcPsPiiS5_S3_E12ungot_string+$36)&4294967295);var $37=HEAP8[($arrayidx43)];var $conv44=(tempInt=(($37)),(tempInt>=128?tempInt-256:tempInt));HEAP32[(($c2)>>2)]=$conv44;;}
65344 else if(__label__==23){var $call46=__ZL4GetCv();HEAP32[(($c2)>>2)]=$call46;var $call47=__Z3Eofv();var $tobool48=((($call47))|0)!=0;if(!($tobool48)){__label__=25;break $if_then41$$if_else45$29;}
65345 HEAP32[(($c2)>>2)]=32;;}}while(0);HEAP32[((__ZL11ungot_char2)>>2)]=0;var $38=HEAP32[((_option_ssml)>>2)];var $tobool52=((($38))|0)!=0;if($tobool52){__label__=26;;}else{__label__=72;;}
65346 $land_lhs_true53$$if_end184$34:do{if(__label__==26){var $39=$phoneme_mode;var $cmp54=((($39))|0)==0;if(!($cmp54)){__label__=72;break $land_lhs_true53$$if_end184$34;}
65347 var $40=HEAP32[((__ZL19ssml_ignore_l_angle)>>2)];var $cmp56=((($40))|0)!=38;if($cmp56){__label__=28;;}else{__label__=50;;}
65348 $land_lhs_true57$$if_else122$37:do{if(__label__==28){var $41=HEAP32[(($c1)>>2)];var $cmp58=((($41))|0)==38;if(!($cmp58)){__label__=50;break $land_lhs_true57$$if_else122$37;}
65349 var $42=HEAP32[(($c2)>>2)];var $cmp60=((($42))|0)==35;if($cmp60){__label__=31;;}else{__label__=30;;}
65350 if(__label__==30){var $43=HEAP32[(($c2)>>2)];var $cmp62=((($43))|0)>=97;var $44=HEAP32[(($c2)>>2)];var $cmp64=((($44))|0)<=122;var $or_cond5=($cmp62)&($cmp64);if(!($or_cond5)){__label__=50;break $land_lhs_true57$$if_else122$37;}}
65351 $n_xml_buf=0;var $45=HEAP32[(($c2)>>2)];HEAP32[(($c1)>>2)]=$45;;$while_cond66$43:while(1){var $call67=__Z3Eofv();var $tobool68=((($call67))|0)!=0;if($tobool68){__label__=36;break $while_cond66$43;}
65352 var $46=HEAP32[(($c1)>>2)];var $call70=_iswalnum($46);var $tobool71=((($call70))|0)!=0;var $47=HEAP32[(($c1)>>2)];var $cmp73=((($47))|0)==35;var $or_cond6=($tobool71)|($cmp73);if(!($or_cond6)){__label__=36;break $while_cond66$43;}
65353 var $48=$n_xml_buf;var $cmp74=((($48))|0)<20;if(!($cmp74)){__label__=36;break $while_cond66$43;}
65354 var $49=HEAP32[(($c1)>>2)];var $conv76=((($49))&255);var $50=$n_xml_buf;var $inc77=((($50)+1)&4294967295);$n_xml_buf=$inc77;var $arrayidx78=(($xml_buf2+$50)&4294967295);HEAP8[($arrayidx78)]=$conv76;var $call79=__ZL4GetCv();HEAP32[(($c1)>>2)]=$call79;__label__=32;continue $while_cond66$43;}
65355 var $51=$n_xml_buf;var $arrayidx80=(($xml_buf2+$51)&4294967295);HEAP8[($arrayidx80)]=0;var $call81=__ZL4GetCv();HEAP32[(($c2)>>2)]=$call81;var $52=HEAP32[(($c1)>>2)];var $53=HEAP32[(($c2)>>2)];var $call83=_sprintf(((__ZZ10ReadClauseP10TranslatorP7__sFILEPcPsPiiS5_S3_E12ungot_string)&4294967295),((__str38205)&4294967295),allocate([$arrayidx82,0,0,0,$52,0,0,0,$53,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i32",0,0,0],ALLOC_STACK));var $54=HEAP32[(($c1)>>2)];var $cmp84=((($54))|0)==59;if($cmp84){__label__=37;;}else{__label__=44;;}
65356 $if_then85$$if_else109$49:do{if(__label__==37){var $55=HEAP8[($arrayidx86)];var $conv87=(tempInt=(($55)),(tempInt>=128?tempInt-256:tempInt));var $cmp88=((($conv87))|0)==35;if($cmp88){__label__=38;;}else{__label__=41;;}
65357 $if_then89$$if_else100$51:do{if(__label__==38){var $56=HEAP8[($arrayidx90)];var $conv91=(tempInt=(($56)),(tempInt>=128?tempInt-256:tempInt));var $cmp92=((($conv91))|0)==120;if($cmp92){__label__=39;;}else{__label__=40;;}
65358 if(__label__==39){var $call95=_sscanf($arrayidx94,((__str10307)&4294967295),allocate([$c1,0,0,0],["i32*",0,0,0],ALLOC_STACK));$found=$call95;__lastLabel__=39;;}
65359 else if(__label__==40){var $call98=_sscanf($arrayidx97,((__str63715)&4294967295),allocate([$c1,0,0,0],["i32*",0,0,0],ALLOC_STACK));$found=$call98;__lastLabel__=40;;}}
65360 else if(__label__==41){var $call101=__Z10LookupMnemP8MNEM_TABPKc(((__ZL18xml_char_mnemonics)&4294967295),$arraydecay);$found=$call101;var $cmp102=((($call101))|0)!=-1;if(!($cmp102)){__label__=46;break $if_then85$$if_else109$49;}
65361 var $57=$found;HEAP32[(($c1)>>2)]=$57;var $58=HEAP32[(($c2)>>2)];var $cmp104=((($58))|0)==0;if($cmp104){__lastLabel__=42;;}else{__lastLabel__=42;__label__=45;break $if_then89$$if_else100$51;}
65362 HEAP32[(($c2)>>2)]=32;var $_pr=$found;__lastLabel__=43;;}}while(0);var $59=__lastLabel__==40?$call98:(__lastLabel__==39?$call95:(__lastLabel__==42?$57:($_pr)));var $cmp111=((($59))|0)<=0;if($cmp111){__label__=46;break $if_then85$$if_else109$49;}
65363 var $_pr23=HEAP32[(($c1)>>2)];var $cmp114=((($_pr23))|0)<=32;if(!($cmp114)){__label__=72;break $land_lhs_true53$$if_end184$34;}
65364 var $60=HEAP32[((__ZL10sayas_mode)>>2)];var $cmp116=((($60))|0)==20;var $61=HEAP32[((__ZL10sayas_mode)>>2)];var $cmp118=((($61))|0)==36;var $or_cond8=($cmp116)|($cmp118);if(!($or_cond8)){__label__=72;break $land_lhs_true53$$if_end184$34;}
65365 var $62=HEAP32[(($c1)>>2)];var $add120=((($62)+57344)&4294967295);HEAP32[(($c1)>>2)]=$add120;__label__=72;break $land_lhs_true53$$if_end184$34;}
65366 else if(__label__==44){$found=-1;;}}while(0);HEAP32[((__ZZ10ReadClauseP10TranslatorP7__sFILEPcPsPiiS5_S3_E15ungot_string_ix)>>2)]=0;HEAP32[(($c1)>>2)]=38;HEAP32[(($c2)>>2)]=32;__label__=72;break $land_lhs_true53$$if_end184$34;}}while(0);var $63=HEAP32[(($c1)>>2)];var $cmp123=((($63))|0)==60;var $64=HEAP32[((__ZL19ssml_ignore_l_angle)>>2)];var $cmp125=((($64))|0)!=60;var $or_cond9=($cmp123)&($cmp125);if(!($or_cond9)){__label__=72;break $land_lhs_true53$$if_end184$34;}
65367 var $65=HEAP32[(($c2)>>2)];var $cmp127=((($65))|0)==33;if($cmp127){__label__=52;;}else{__label__=56;;}
65368 if(__label__==52){while(1){var $call130=__Z3Eofv();var $tobool131=((($call130))|0)!=0;if($tobool131){__label__=55;break;}
65369 var $66=HEAP32[(($c1)>>2)];var $cmp133=((($66))|0)!=62;if(!($cmp133)){__label__=55;break;}
65370 var $call136=__ZL4GetCv();HEAP32[(($c1)>>2)]=$call136;__label__=52;continue;}
65371 HEAP32[(($c2)>>2)]=32;;}
65372 else if(__label__==56){var $67=HEAP32[(($c2)>>2)];var $cmp139=((($67))|0)==47;if($cmp139){__label__=58;;}else{__label__=57;;}
65373 if(__label__==57){var $68=HEAP32[(($c2)>>2)];var $call141=_iswalpha($68);var $tobool142=((($call141))|0)!=0;if(!($tobool142)){__label__=72;break $land_lhs_true53$$if_end184$34;}}
65374 $n_xml_buf=0;var $69=HEAP32[(($c2)>>2)];HEAP32[(($c1)>>2)]=$69;;while(1){var $call145=__Z3Eofv();var $tobool146=((($call145))|0)!=0;if($tobool146){__label__=63;break;}
65375 var $70=HEAP32[(($c1)>>2)];var $cmp148=((($70))|0)!=62;if(!($cmp148)){__label__=63;break;}
65376 var $71=$n_xml_buf;var $cmp150=((($71))|0)<256;if(!($cmp150)){__label__=63;break;}
65377 var $72=HEAP32[(($c1)>>2)];var $73=$n_xml_buf;var $inc153=((($73)+1)&4294967295);$n_xml_buf=$inc153;var $arrayidx154=(($xml_buf+$73*4)&4294967295);HEAP32[(($arrayidx154)>>2)]=$72;var $call155=__ZL4GetCv();HEAP32[(($c1)>>2)]=$call155;__label__=59;continue;}
65378 var $74=$n_xml_buf;var $arrayidx157=(($xml_buf+$74*4)&4294967295);HEAP32[(($arrayidx157)>>2)]=0;HEAP32[(($c2)>>2)]=32;$self_closing=0;var $75=$n_xml_buf;var $sub=((($75)-1)&4294967295);var $arrayidx158=(($xml_buf+$sub*4)&4294967295);var $76=HEAP32[(($arrayidx158)>>2)];var $cmp159=((($76))|0)==47;if($cmp159){__label__=64;;}else{__label__=65;;}
65379 if(__label__==64){var $77=$n_xml_buf;var $sub161=((($77)-1)&4294967295);var $arrayidx162=(($xml_buf+$sub161*4)&4294967295);HEAP32[(($arrayidx162)>>2)]=32;$self_closing=1;;}
65380 var $78=$buf_addr;var $79=$n_buf_addr;var $80=$self_closing;var $call165=__ZL14ProcessSsmlTagPwPcRiii($arraydecay164,$78,$ix,$79,$80);$terminator=$call165;var $cmp166=((($call165))|0)!=0;if($cmp166){__label__=66;break $while_cond$12;}
65381 HEAP32[(($c1)>>2)]=32;var $call179=__ZL4GetCv();HEAP32[(($c2)>>2)]=$call179;__label__=8;continue $while_cond$12;}}}while(0);HEAP32[((__ZL19ssml_ignore_l_angle)>>2)]=0;var $_b1=HEAPU8[(__ZL11ignore_text_b)];var $90=((($_b1))&1);var $tobool185=((($90))|0)!=0;if($tobool185){__label__=8;continue $while_cond$12;}
65382 var $91=HEAP32[(($c2)>>2)];var $cmp188=((($91))|0)==10;var $92=HEAP32[((_option_linelength)>>2)];var $cmp190=((($92))|0)==-1;var $or_cond11=($cmp188)&($cmp190);var $93=HEAPU32[(($c1)>>2)];if($or_cond11){__label__=74;break $while_cond$12;}
65383 var $cmp208=((($93))|0)==1;if($cmp208){__label__=80;;}else{__label__=79;;}
65384 $if_then212$$lor_lhs_false209$90:do{if(__label__==79){var $111=HEAP32[(($c1)>>2)];var $112=HEAP8[(_ctrl_embedded)];var $conv210=(tempInt=(($112)),(tempInt>=128?tempInt-256:tempInt));var $cmp211=((($111))|0)==((($conv210))|0);if($cmp211){__label__=80;break $if_then212$$lor_lhs_false209$90;}else{__label__=97;break $if_then212$$lor_lhs_false209$90;}}}while(0);$if_then212$$if_end267$92:do{if(__label__==80){var $113=HEAP32[(($c2)>>2)];var $cmp213=((($113))|0)==86;if($cmp213){__label__=81;break $while_cond$12;}
65385 var $123=HEAP32[(($c2)>>2)];var $cmp236=((($123))|0)==66;if(!($cmp236)){__label__=97;break $if_then212$$if_end267$92;}
65386 var $124=HEAP32[(($ix)>>2)];var $125=$buf_addr;var $arrayidx238=(($125+$124)&4294967295);var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=((__str41208)&4294967295);$dest$=$arrayidx238;$stop$=$src$+4;if(($dest$%4)==($src$%4)&&4>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
65387 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
65388 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $126=HEAP32[(($ix)>>2)];var $add240=((($126)+3)&4294967295);HEAP32[(($ix)>>2)]=$add240;var $call241=__ZL4GetCv();HEAP32[(($c2)>>2)]=$call241;var $cmp242=((($call241))|0)==48;if($cmp242){__label__=89;;}else{__label__=90;;}
65389 $if_then243$$if_else244$96:do{if(__label__==89){HEAP32[((_option_punctuation)>>2)]=0;;}
65390 else if(__label__==90){HEAP32[((_option_punctuation)>>2)]=1;HEAP32[((((_option_punctlist)&4294967295))>>2)]=0;var $127=HEAP32[(($c2)>>2)];var $cmp245=((($127))|0)!=49;if(!($cmp245)){__label__=96;break $if_then243$$if_else244$96;}
65391 $j=0;;while(1){var $128=HEAP32[(($c2)>>2)];var $call248=_iswspace($128);var $tobool249=((($call248))|0)!=0;if($tobool249){__label__=95;break;}
65392 var $call251=__Z3Eofv();var $tobool252=((($call251))|0)!=0;var $lnot=($tobool252)^1;if(!($lnot)){__label__=95;break;}
65393 var $129=HEAP32[(($c2)>>2)];var $130=$j;var $inc255=((($130)+1)&4294967295);$j=$inc255;var $arrayidx256=((_option_punctlist+$130*4)&4294967295);HEAP32[(($arrayidx256)>>2)]=$129;var $call257=__ZL4GetCv();HEAP32[(($c2)>>2)]=$call257;var $131=HEAP32[(($ix)>>2)];var $inc258=((($131)+1)&4294967295);HEAP32[(($ix)>>2)]=$inc258;var $132=$buf_addr;var $arrayidx259=(($132+$131)&4294967295);HEAP8[($arrayidx259)]=32;__label__=92;continue;}
65394 var $133=$j;var $arrayidx261=((_option_punctlist+$133*4)&4294967295);HEAP32[(($arrayidx261)>>2)]=0;HEAP32[((_option_punctuation)>>2)]=2;;}}while(0);var $call264=__ZL4GetCv();HEAP32[(($c2)>>2)]=$call264;__label__=8;continue $while_cond$12;}}while(0);var $134=$linelength;var $inc268=((($134)+1)&4294967295);$linelength=$inc268;var $135=HEAP32[(($c1)>>2)];var $call269=_iswalnum($135);var $tobool270=((($call269))|0)!=0;if($tobool270){__label__=98;;}else{__label__=99;;}
65395 $if_then271$$if_else272$107:do{if(__label__==98){$any_alnum=1;;}
65396 else if(__label__==99){var $136=$stressed_word;var $tobool273=((($136))|0)!=0;if($tobool273){__label__=100;;}else{__label__=101;;}
65397 if(__label__==100){$stressed_word=0;HEAP32[(($c1)>>2)]=1328;var $137=HEAP32[(($c2)>>2)];__ZL6UngetCi($137);HEAP32[(($c2)>>2)]=32;;}
65398 var $138=HEAP32[(($c1)>>2)];var $call276=__Z11lookupwcharPKti(((__ZL12chars_ignore)&4294967295),$138);var $tobool277=((($call276))|0)!=0;if($tobool277){__label__=8;continue $while_cond$12;}
65399 var $139=HEAP32[(($c1)>>2)];var $call280=_iswspace($139);var $tobool281=((($call280))|0)!=0;if($tobool281){__label__=103;;}else{__label__=109;;}
65400 $if_then282$$if_end304$114:do{if(__label__==103){var $140=$tr_addr;var $translator_name=(($140+280)&4294967295);var $141=HEAP32[(($translator_name)>>2)];var $cmp283=((($141))|0)==6972015;if(!($cmp283)){__label__=109;break $if_then282$$if_end304$114;}
65401 var $142=HEAP32[(($ix)>>2)];var $sub285=((($142)-1)&4294967295);var $143=$buf_addr;var $arrayidx286=(($143+$sub285)&4294967295);$p_word=$arrayidx286;var $144=$p_word;var $arrayidx287=(($144)&4294967295);var $145=HEAP8[($arrayidx287)];var $conv288=(tempInt=(($145)),(tempInt>=128?tempInt-256:tempInt));var $cmp289=((($conv288))|0)==105;if(!($cmp289)){__label__=109;break $if_then282$$if_end304$114;}
65402 var $146=$p_word;var $arrayidx291=(($146+-1)&4294967295);var $147=HEAP8[($arrayidx291)];var $conv292=(tempInt=(($147)),(tempInt>=128?tempInt-256:tempInt));var $cmp293=((($conv292))|0)==46;if($cmp293){__label__=106;;}else{__label__=107;;}
65403 if(__label__==106){var $148=$p_word;var $incdec_ptr=(($148+-1)&4294967295);$p_word=$incdec_ptr;;}
65404 var $149=$p_word;var $arrayidx296=(($149+-1)&4294967295);var $150=HEAP8[($arrayidx296)];var $conv297=(tempInt=(($150)),(tempInt>=128?tempInt-256:tempInt));var $cmp298=((($conv297))|0)==32;if($cmp298){__label__=108;break $while_cond$12;}}}while(0);var $153=HEAP32[(($c1)>>2)];var $cmp305=((($153))|0)==3405;if(!($cmp305)){__label__=112;break $if_then271$$if_else272$107;}
65405 var $154=HEAP32[(($c2)>>2)];var $cmp307=((($154))|0)==8205;if(!($cmp307)){__label__=112;break $if_then271$$if_else272$107;}
65406 HEAP32[(($c1)>>2)]=3406;;}}while(0);var $155=HEAP32[(($c1)>>2)];var $call312=_iswupper($155);var $tobool313=((($call312))|0)!=0;if($tobool313){__label__=113;;}else{__label__=118;;}
65407 $if_then314$$if_else343$125:do{if(__label__==113){var $156=$tr_addr;var $clause_upper_count315=(($156+8304)&4294967295);var $157=HEAP32[(($clause_upper_count315)>>2)];var $inc316=((($157)+1)&4294967295);HEAP32[(($clause_upper_count315)>>2)]=$inc316;var $158=HEAP32[((_option_capitals)>>2)];var $cmp317=((($158))|0)==2;var $159=HEAP32[((__ZL10sayas_mode)>>2)];var $cmp319=((($159))|0)==0;var $or_cond13=($cmp317)&($cmp319);if(!($or_cond13)){__label__=120;break $if_then314$$if_else343$125;}
65408 var $160=$cprev;var $call321=_iswupper($160);var $tobool322=((($call321))|0)!=0;if($tobool322){__label__=120;break $if_then314$$if_else343$125;}
65409 var $161=$tr_addr;var $call325=__ZL13LookupSpecialP10TranslatorPKcPc($161,$arraydecay324);var $cmp326=((($call325))|0)!=0;if(!($cmp326)){__label__=120;break $if_then314$$if_else343$125;}
65410 var $strlen=_strlen($arraydecay329);var $leninc=((($strlen)+1)&4294967295);var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$arraydecay329;$dest$=$arraydecay328;$stop$=$src$+$leninc;if(($dest$%4)==($src$%4)&&$leninc>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
65411 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
65412 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $call332=_strlen($arraydecay331);$j=$call332;var $162=HEAP32[(($ix)>>2)];var $163=$j;var $add333=((($163)+($162))&4294967295);var $164=$n_buf_addr;var $cmp334=((($add333))|0)<((($164))|0);if(!($cmp334)){__label__=120;break $if_then314$$if_else343$125;}
65413 var $165=HEAP32[(($ix)>>2)];var $166=$buf_addr;var $arrayidx336=(($166+$165)&4294967295);var $call338=_strcpy($arrayidx336,$arraydecay337);var $167=$j;var $168=HEAP32[(($ix)>>2)];var $add339=((($168)+($167))&4294967295);HEAP32[(($ix)>>2)]=$add339;;}
65414 else if(__label__==118){var $169=HEAP32[(($c1)>>2)];var $call344=_iswalpha($169);var $tobool345=((($call344))|0)!=0;if(!($tobool345)){__label__=120;break $if_then314$$if_else343$125;}
65415 var $170=$tr_addr;var $clause_lower_count347=(($170+8308)&4294967295);var $171=HEAP32[(($clause_lower_count347)>>2)];var $inc348=((($171)+1)&4294967295);HEAP32[(($clause_lower_count347)>>2)]=$inc348;;}}while(0);var $172=HEAP32[((_option_phoneme_input)>>2)];var $tobool351=((($172))|0)!=0;if($tobool351){__label__=121;;}else{__label__=130;;}
65416 $if_then352$$if_end368$134:do{if(__label__==121){var $173=$phoneme_mode;var $cmp353=((($173))|0)>0;if($cmp353){__label__=122;;}else{__label__=123;;}
65417 if(__label__==122){var $174=$phoneme_mode;var $dec=((($174)-1)&4294967295);$phoneme_mode=$dec;;}
65418 else if(__label__==123){var $175=HEAP32[(($c1)>>2)];var $cmp356=((($175))|0)==91;if($cmp356){__lastLabel__=123;__label__=124;;}else{__lastLabel__=123;__label__=127;;}
65419 if(__label__==124){var $176=HEAP32[(($c2)>>2)];var $cmp358=((($176))|0)==91;if($cmp358){__label__=125;;}else{__label__=126;;}
65420 if(__label__==125){$phoneme_mode=-1;__label__=130;break $if_then352$$if_end368$134;}
65421 else if(__label__==126){var $_pr25=HEAP32[(($c1)>>2)];__lastLabel__=126;;}}
65422 var $177=__lastLabel__==126?$_pr25:($175);var $cmp361=((($177))|0)==93;if(!($cmp361)){__label__=130;break $if_then352$$if_end368$134;}
65423 var $178=HEAP32[(($c2)>>2)];var $cmp363=((($178))|0)==93;if(!($cmp363)){__label__=130;break $if_then352$$if_end368$134;}
65424 $phoneme_mode=2;;}}}while(0);var $179=HEAP32[(($c1)>>2)];var $cmp369=((($179))|0)==10;if($cmp369){__label__=131;;}else{__label__=148;;}
65425 if(__label__==131){$parag=0;;while(1){var $call372=__Z3Eofv();var $tobool373=((($call372))|0)!=0;if($tobool373){__label__=137;break;}
65426 var $180=HEAP32[(($c2)>>2)];var $call375=_iswspace($180);var $tobool376=((($call375))|0)!=0;if(!($tobool376)){__label__=137;break;}
65427 var $181=HEAP32[(($c2)>>2)];var $cmp379=((($181))|0)==10;if($cmp379){__label__=135;;}else{__label__=136;;}
65428 if(__label__==135){var $182=$parag;var $inc381=((($182)+1)&4294967295);$parag=$inc381;;}
65429 var $call383=__ZL4GetCv();HEAP32[(($c2)>>2)]=$call383;__label__=132;continue;}
65430 var $183=$parag;var $cmp385=((($183))|0)>0;if($cmp385){__label__=138;break $while_cond$12;}
65431 var $195=$linelength;var $196=HEAP32[((_option_linelength)>>2)];var $cmp402=((($195))|0)<=((($196))|0);if($cmp402){__label__=146;break $while_cond$12;}
65432 $linelength=0;;}
65433 var $202=$announced_punctuation;$prev_announced_punctuation=$202;$announced_punctuation=0;var $203=$phoneme_mode;var $cmp409=((($203))|0)==0;var $204=HEAP32[((__ZL10sayas_mode)>>2)];var $cmp411=((($204))|0)==0;var $or_cond14=($cmp409)&($cmp411);if($or_cond14){__label__=149;;}else{__label__=238;;}
65434 $if_then412$$if_end643$161:do{if(__label__==149){$is_end_clause=0;var $205=$end_clause_after_tag;var $tobool413=((($205))|0)!=0;if($tobool413){__label__=150;;}else{__label__=155;;}
65435 $if_then414$$if_end429$163:do{if(__label__==150){var $206=HEAP32[(($c1)>>2)];var $call415=_iswspace($206);var $tobool416=((($call415))|0)!=0;if($tobool416){__label__=155;break $if_then414$$if_end429$163;}
65436 var $207=HEAP32[(($c1)>>2)];var $call418=__Z7IsAlphaj($207);var $tobool419=((($call418))|0)!=0;if(!($tobool419)){__label__=153;break $while_cond$12;}
65437 var $208=HEAP32[(($c1)>>2)];var $call421=_iswlower($208);var $tobool422=((($call421))|0)!=0;if(!($tobool422)){__label__=153;break $while_cond$12;}
65438 $end_clause_after_tag=0;;}}while(0);var $216=HEAP32[(($c1)>>2)];var $cmp430=((($216))|0)==46;if($cmp430){__label__=156;;}else{__label__=162;;}
65439 $land_lhs_true431$$if_end443$169:do{if(__label__==156){var $217=HEAP32[(($c2)>>2)];var $cmp432=((($217))|0)==46;if(!($cmp432)){__label__=162;break $land_lhs_true431$$if_end443$169;}
65440 var $call43538=__ZL4GetCv();$c_next=$call43538;var $cmp43639=((($call43538))|0)==46;if($cmp43639){__label__=158;;}else{__label__=159;;}
65441 $while_body437$$while_end438$172:do{if(__label__==158){while(1){HEAP32[(($c1)>>2)]=8230;HEAP32[(($c2)>>2)]=32;var $call435=__ZL4GetCv();$c_next=$call435;var $cmp436=((($call435))|0)==46;if($cmp436){__label__=158;continue;}else{__label__=159;break $while_body437$$while_end438$172;}}}}while(0);var $218=HEAP32[(($c1)>>2)];var $cmp439=((($218))|0)==8230;var $219=$c_next;if($cmp439){__label__=160;;}else{__label__=161;;}
65442 if(__label__==160){HEAP32[(($c2)>>2)]=$219;;}
65443 else if(__label__==161){__ZL6UngetCi($219);;}}}while(0);$punct_data=0;var $220=HEAP32[(($c1)>>2)];var $call444=__Z11lookupwcharPKti(((__ZL11punct_chars)&4294967295),$220);$punct=$call444;var $cmp445=((($call444))|0)!=0;if($cmp445){__label__=163;;}else{__label__=171;;}
65444 $if_then446$$if_end471$180:do{if(__label__==163){var $221=$punct;var $arrayidx447=((__ZL16punct_attributes+$221*4)&4294967295);var $222=HEAP32[(($arrayidx447)>>2)];$punct_data=$222;var $223=$punct_data;var $and448=($223)&1048576;var $tobool449=((($and448))|0)!=0;if($tobool449){__label__=164;;}else{__label__=165;;}
65445 if(__label__==164){$stressed_word=1;var $224=$punct_data;var $shr=($224)>>12;var $and451=($shr)&15;var $225=$tone_type_addr;HEAP32[(($225)>>2)]=$and451;__label__=8;continue $while_cond$12;}
65446 else if(__label__==165){var $226=HEAP32[(($c2)>>2)];var $call453=_iswspace($226);var $tobool454=((($call453))|0)!=0;if($tobool454){__label__=170;;}else{__label__=166;;}
65447 $if_then469$$lor_lhs_false455$185:do{if(__label__==166){var $227=$punct_data;var $and456=($227)&32768;var $tobool457=((($and456))|0)!=0;if($tobool457){__label__=170;break $if_then469$$lor_lhs_false455$185;}
65448 var $228=HEAP32[(($c2)>>2)];var $call459=__Z9IsBracketi($228);var $tobool460=((($call459))|0)!=0;var $229=HEAP32[(($c2)>>2)];var $cmp462=((($229))|0)==63;var $or_cond15=($tobool460)|($cmp462);if($or_cond15){__label__=170;break $if_then469$$lor_lhs_false455$185;}
65449 var $call464=__Z3Eofv();var $tobool465=((($call464))|0)!=0;if($tobool465){__label__=170;break $if_then469$$lor_lhs_false455$185;}
65450 var $230=HEAP32[(($c2)>>2)];var $231=HEAP8[(_ctrl_embedded)];var $conv467=(tempInt=(($231)),(tempInt>=128?tempInt-256:tempInt));var $cmp468=((($230))|0)==((($conv467))|0);if(!($cmp468)){__label__=171;break $if_then446$$if_end471$180;}}}while(0);$is_end_clause=1;;}}}while(0);var $232=HEAP32[(($c1)>>2)];var $cmp472=((($232))|0)==57404;if($cmp472){__label__=172;;}else{__label__=173;;}
65451 if(__label__==172){HEAP32[(($c1)>>2)]=60;;}
65452 var $233=HEAP32[((_option_punctuation)>>2)];var $tobool475=((($233))|0)!=0;if($tobool475){__label__=174;;}else{__label__=181;;}
65453 $land_lhs_true476$$if_end493$195:do{if(__label__==174){var $234=HEAP32[(($c1)>>2)];var $call477=_iswpunct($234);var $tobool478=((($call477))|0)!=0;if(!($tobool478)){__label__=181;break $land_lhs_true476$$if_end493$195;}
65454 var $_b2=HEAPU8[(__ZL10audio_text_b)];var $235=((($_b2))&1);var $cmp480=((($235))|0)==0;if(!($cmp480)){__label__=181;break $land_lhs_true476$$if_end493$195;}
65455 var $236=HEAP32[((_option_punctuation)>>2)];var $cmp482=((($236))|0)==1;if($cmp482){__label__=178;;}else{__label__=177;;}
65456 if(__label__==177){var $237=HEAP32[(($c1)>>2)];var $call484=_wcschr(((_option_punctlist)&4294967295),$237);var $cmp485=((($call484))|0)!=0;if(!($cmp485)){__label__=181;break $land_lhs_true476$$if_end493$195;}}
65457 var $238=$tr_addr;var $phonemes_repeat_count487=(($238+652)&4294967295);HEAP32[(($phonemes_repeat_count487)>>2)]=0;var $239=$tr_addr;var $240=HEAP32[(($c1)>>2)];var $241=$buf_addr;var $242=$is_end_clause;var $call488=__ZL19AnnouncePunctuationP10TranslatoriPiPcS1_i($239,$240,$c2,$241,$ix,$242);$terminator=$call488;var $cmp489=((($call488))|0)>=0;if($cmp489){__label__=179;break $while_cond$12;}
65458 var $244=HEAP32[(($c1)>>2)];$announced_punctuation=$244;;}}while(0);var $245=$punct_data;var $and494=($245)&2097152;var $tobool495=((($and494))|0)!=0;if($tobool495){__label__=182;;}else{__label__=185;;}
65459 $land_lhs_true496$$if_end510$204:do{if(__label__==182){var $246=$announced_punctuation;var $cmp497=((($246))|0)==0;if(!($cmp497)){__label__=185;break $land_lhs_true496$$if_end510$204;}
65460 var $247=HEAP32[(($ix)>>2)];var $248=$buf_addr;var $arrayidx499=(($248+$247)&4294967295);$p2=$arrayidx499;var $249=$p2;var $250=$tr_addr;var $251=HEAP32[(($c1)>>2)];__ZL14LookupCharNameP10Translatorii($250,$251,1);var $strlen20=_strlen(((__ZZL14LookupCharNameP10TranslatoriiE3buf)&4294967295));var $leninc21=((($strlen20)+1)&4294967295);var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=((__ZZL14LookupCharNameP10TranslatoriiE3buf)&4294967295);$dest$=$249;$stop$=$src$+$leninc21;if(($dest$%4)==($src$%4)&&$leninc21>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
65461 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
65462 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $252=$p2;var $arrayidx502=(($252)&4294967295);var $253=HEAP8[($arrayidx502)];var $conv503=(tempInt=(($253)),(tempInt>=128?tempInt-256:tempInt));var $cmp504=((($conv503))|0)!=0;if(!($cmp504)){__label__=185;break $land_lhs_true496$$if_end510$204;}
65463 var $254=$p2;var $call506=_strlen($254);var $255=HEAP32[(($ix)>>2)];var $add507=((($255)+($call506))&4294967295);HEAP32[(($ix)>>2)]=$add507;var $256=HEAP32[(($c1)>>2)];$announced_punctuation=$256;var $257=$punct_data;var $and508=($257)&-28673;$punct_data=$and508;;}}while(0);var $258=$is_end_clause;var $tobool511=((($258))|0)!=0;if(!($tobool511)){__label__=238;break $if_then412$$if_end643$161;}
65464 $nl_count=0;var $259=HEAP32[(($c2)>>2)];$c_next=$259;var $260=$c_next;var $call513=_iswspace($260);var $tobool514=((($call513))|0)!=0;if($tobool514){__label__=187;;}else{__label__=192;;}
65465 $while_cond516$$if_end530$210:do{if(__label__==187){while(1){var $call517=__Z3Eofv();var $tobool518=((($call517))|0)!=0;if($tobool518){__label__=192;break $while_cond516$$if_end530$210;}
65466 var $261=$c_next;var $call520=_iswspace($261);var $tobool521=((($call520))|0)!=0;if(!($tobool521)){__label__=192;break $while_cond516$$if_end530$210;}
65467 var $262=$c_next;var $cmp524=((($262))|0)==10;if($cmp524){__label__=190;;}else{__label__=191;;}
65468 if(__label__==190){var $263=$nl_count;var $inc526=((($263)+1)&4294967295);$nl_count=$inc526;;}
65469 var $call528=__ZL4GetCv();$c_next=$call528;__label__=187;continue;}}}while(0);var $264=HEAP32[(($c1)>>2)];var $cmp531=((($264))|0)==46;if($cmp531){__label__=193;;}else{__label__=195;;}
65470 $land_lhs_true532$$if_end535$219:do{if(__label__==193){var $265=$nl_count;var $cmp533=((($265))|0)<2;if(!($cmp533)){__label__=226;break $land_lhs_true532$$if_end535$219;}
65471 var $266=$punct_data;var $or=($266)|4194304;$punct_data=$or;__label__=195;break $land_lhs_true532$$if_end535$219;}}while(0);$if_end535$$if_end609$222:do{if(__label__==195){var $_pr26=$nl_count;var $cmp536=((($_pr26))|0)==0;if(!($cmp536)){__label__=226;break $if_end535$$if_end609$222;}
65472 var $267=HEAP32[(($c1)>>2)];var $cmp538=((($267))|0)==44;if($cmp538){__lastLabel__=196;__label__=197;;}else{__lastLabel__=196;__label__=204;;}
65473 $land_lhs_true539$$if_end554$225:do{if(__label__==197){var $268=$cprev;var $cmp540=((($268))|0)==46;if($cmp540){__label__=198;;}else{__label__=203;;}
65474 $land_lhs_true541$$if_end554thread_pre_split$227:do{if(__label__==198){var $269=$tr_addr;var $translator_name542=(($269+280)&4294967295);var $270=HEAP32[(($translator_name542)>>2)];var $cmp543=((($270))|0)==26741;if(!($cmp543)){__label__=203;break $land_lhs_true541$$if_end554thread_pre_split$227;}
65475 var $271=$cprev2;var $call545=_iswdigit($271);var $tobool546=((($call545))|0)!=0;if(!($tobool546)){__label__=203;break $land_lhs_true541$$if_end554thread_pre_split$227;}
65476 var $272=$c_next;var $call548=_iswdigit($272);var $tobool549=((($call548))|0)!=0;if($tobool549){__label__=202;;}else{__label__=201;;}
65477 if(__label__==201){var $273=$c_next;var $call551=_iswlower($273);var $tobool552=((($call551))|0)!=0;if(!($tobool552)){__label__=203;break $land_lhs_true541$$if_end554thread_pre_split$227;}}
65478 HEAP32[(($c1)>>2)]=1367;$is_end_clause=0;__label__=220;break $land_lhs_true539$$if_end554$225;}}while(0);var $_pr28=HEAP32[(($c1)>>2)];__lastLabel__=203;__label__=204;break $land_lhs_true539$$if_end554$225;}}while(0);$if_else595$$if_end554$235:do{if(__label__==204){var $274=__lastLabel__==203?$_pr28:($267);var $cmp555=((($274))|0)==46;if(!($cmp555)){__label__=220;break $if_else595$$if_end554$235;}
65479 var $275=$tr_addr;var $langopts=(($275)&4294967295);var $numbers=(($langopts+184)&4294967295);var $276=HEAP32[(($numbers)>>2)];var $and557=($276)&65536;var $tobool558=((($and557))|0)!=0;if($tobool558){__label__=206;;}else{__label__=214;;}
65480 $land_lhs_true559$$if_else583$238:do{if(__label__==206){var $277=$cprev;var $call560=_iswdigit($277);var $tobool561=((($call560))|0)!=0;if($tobool561){__label__=210;;}else{__label__=207;;}
65481 $if_then571$$lor_lhs_false562$240:do{if(__label__==207){var $278=$cprev;var $call563=__ZL8IsRomanUj($278);var $tobool564=((($call563))|0)!=0;if(!($tobool564)){__label__=214;break $land_lhs_true559$$if_else583$238;}
65482 var $279=$cprev2;var $call566=__ZL8IsRomanUj($279);var $tobool567=((($call566))|0)!=0;if($tobool567){__label__=210;break $if_then571$$lor_lhs_false562$240;}
65483 var $280=$cprev2;var $call569=_iswspace($280);var $tobool570=((($call569))|0)!=0;if(!($tobool570)){__label__=214;break $land_lhs_true559$$if_else583$238;}}}while(0);var $281=$cprev;var $call572=_iswdigit($281);var $tobool573=((($call572))|0)!=0;if($tobool573){__label__=212;;}else{__label__=211;;}
65484 if(__label__==212){var $282=$c_next;var $call576=_iswlower($282);var $tobool577=((($call576))|0)!=0;var $283=$c_next;var $cmp579=((($283))|0)==45;var $or_cond16=($tobool577)|($cmp579);if(!($or_cond16)){__label__=216;break $land_lhs_true559$$if_else583$238;}
65485 $is_end_clause=0;__label__=216;break $land_lhs_true559$$if_else583$238;}
65486 else if(__label__==211){$is_end_clause=0;__label__=216;break $land_lhs_true559$$if_else583$238;}}}while(0);$if_end587$$if_else583$249:do{if(__label__==214){var $284=$c_next;var $cmp584=((($284))|0)==39;if(!($cmp584)){__label__=216;break $if_end587$$if_else583$249;}
65487 $is_end_clause=0;;}}while(0);var $285=$c_next;var $call588=_iswlower($285);var $tobool589=((($call588))|0)!=0;if($tobool589){__label__=217;;}else{__label__=218;;}
65488 if(__label__==217){$is_end_clause=0;;}
65489 var $286=$any_alnum;var $cmp592=((($286))|0)==0;if(!($cmp592)){__label__=222;break $if_else595$$if_end554$235;}
65490 HEAP32[(($c1)>>2)]=32;$is_end_clause=0;__label__=235;break $if_end535$$if_end609$222;}}while(0);$if_else595$$if_end599$257:do{if(__label__==220){var $287=$any_alnum;var $cmp596=((($287))|0)==0;if(!($cmp596)){__label__=222;break $if_else595$$if_end599$257;}
65491 $is_end_clause=0;__label__=235;break $if_end535$$if_end609$222;}}while(0);var $_pr30=$is_end_clause;var $tobool600=((($_pr30))|0)!=0;if(!($tobool600)){__label__=235;break $if_end535$$if_end609$222;}
65492 var $288=HEAP32[(($c1)>>2)];var $cmp602=((($288))|0)==46;if(!($cmp602)){__label__=226;break $if_end535$$if_end609$222;}
65493 var $289=$c_next;var $cmp604=((($289))|0)==60;var $290=HEAP32[((_option_ssml)>>2)];var $tobool606=((($290))|0)!=0;var $or_cond17=($cmp604)&($tobool606);if(!($or_cond17)){__label__=226;break $if_end535$$if_end609$222;}
65494 $is_end_clause=0;var $291=HEAP32[(($ix)>>2)];$end_clause_index=$291;var $292=$punct_data;$end_clause_after_tag=$292;__label__=235;break $if_end535$$if_end609$222;}}while(0);if(__label__==226){var $_pr32_pr=$is_end_clause;var $tobool610=((($_pr32_pr))|0)!=0;if($tobool610){__label__=227;break $while_cond$12;}}
65495 var $call633=__Z3Eofv();var $tobool634=((($call633))|0)!=0;if($tobool634){__label__=238;break $if_then412$$if_end643$161;}
65496 var $305=HEAP32[(($c2)>>2)];var $call636=_iswspace($305);var $tobool637=((($call636))|0)!=0;if(!($tobool637)){__label__=238;break $if_then412$$if_end643$161;}
65497 var $306=$c_next;__ZL6UngetCi($306);;}}while(0);var $307=HEAP32[((((__ZL17speech_parameters)&4294967295))>>2)];var $cmp644=((($307))|0)==1;if($cmp644){__label__=8;continue $while_cond$12;}
65498 var $308=HEAP32[(($c1)>>2)];var $309=$announced_punctuation;var $cmp647=((($308))|0)==((($309))|0);if($cmp647){__label__=240;;}else{__label__=245;;}
65499 $if_then648$$if_end657$271:do{if(__label__==240){var $310=HEAP32[(($c1)>>2)];var $call649=__Z9IsBracketi($310);var $tobool650=((($call649))|0)!=0;if($tobool650){__label__=241;;}else{__label__=242;;}
65500 $if_then651$$if_else652$273:do{if(__label__==241){HEAP32[(($c1)>>2)]=57384;;}
65501 else if(__label__==242){var $311=HEAP32[(($c1)>>2)];var $cmp653=((($311))|0)!=45;if(!($cmp653)){__label__=244;break $if_then651$$if_else652$273;}
65502 HEAP32[(($c1)>>2)]=32;;}}while(0);var $312=HEAP32[(($ix)>>2)];var $add65834=((($312)+1)&4294967295);$j=$add65834;;}
65503 else if(__label__==245){var $313=HEAP32[(($ix)>>2)];var $add658=((($313)+1)&4294967295);$j=$add658;var $cmp659=((($308))|0)==57404;if(!($cmp659)){__label__=247;break $if_then648$$if_end657$271;}
65504 HEAP32[(($c1)>>2)]=60;;}}while(0);var $314=HEAP32[(($c1)>>2)];var $315=HEAP32[(($ix)>>2)];var $316=$buf_addr;var $arrayidx662=(($316+$315)&4294967295);var $call663=__Z8utf8_outjPc($314,$arrayidx662);var $317=HEAP32[(($ix)>>2)];var $add664=((($317)+($call663))&4294967295);HEAP32[(($ix)>>2)]=$add664;var $318=HEAP32[(($c1)>>2)];var $call665=_iswspace($318);var $tobool666=((($call665))|0)!=0;if($tobool666){__label__=251;;}else{__label__=248;;}
65505 $if_end680$$land_lhs_true667$281:do{if(__label__==248){var $319=HEAP32[(($c1)>>2)];var $call668=__Z9IsBracketi($319);var $tobool669=((($call668))|0)!=0;if($tobool669){__label__=251;break $if_end680$$land_lhs_true667$281;}
65506 var $320=HEAP32[((_count_characters)>>2)];var $321=HEAP32[((_clause_start_char)>>2)];var $sub671=((($320)-($321))&4294967295);var $conv672=((($sub671))&65535);var $322=HEAP32[(($ix)>>2)];var $323=$charix_addr;var $arrayidx673=(($323+2*$322)&4294967295);HEAP16[(($arrayidx673)>>1)]=$conv672;var $324=$j;var $325=HEAP32[(($ix)>>2)];var $cmp67537=((($324))|0)<((($325))|0);if(!($cmp67537)){__label__=251;break $if_end680$$land_lhs_true667$281;}
65507 while(1){var $326=$j;var $inc677=((($326)+1)&4294967295);$j=$inc677;var $327=$charix_addr;var $arrayidx678=(($327+2*$326)&4294967295);HEAP16[(($arrayidx678)>>1)]=-1;var $328=$j;var $329=HEAP32[(($ix)>>2)];var $cmp675=((($328))|0)<((($329))|0);if($cmp675){__label__=250;continue;}else{__label__=251;break $if_end680$$land_lhs_true667$281;}}}}while(0);var $330=HEAP32[(($ix)>>2)];var $331=$charix_top_addr;HEAP32[(($331)>>2)]=$330;var $332=HEAP32[(($ix)>>2)];var $333=$n_buf_addr;var $sub681=((($333)-20)&4294967295);var $cmp682=((($332))|0)>((($sub681))|0);if($cmp682){__label__=252;;}else{__label__=254;;}
65508 $land_lhs_true683$$lor_lhs_false689$287:do{if(__label__==252){var $334=HEAP32[(($c1)>>2)];var $call684=__Z7IsAlphaj($334);var $tobool685=((($call684))|0)!=0;if($tobool685){__label__=254;break $land_lhs_true683$$lor_lhs_false689$287;}
65509 var $335=HEAP32[(($c1)>>2)];var $call687=_iswdigit($335);var $tobool688=((($call687))|0)!=0;if(!($tobool688)){__label__=255;break $while_cond$12;}}}while(0);var $336=HEAP32[(($ix)>>2)];var $337=$n_buf_addr;var $sub690=((($337)-2)&4294967295);var $cmp691=((($336))|0)>=((($sub690))|0);if($cmp691){__label__=255;break $while_cond$12;}else{__label__=8;continue $while_cond$12;}}
65510 if(__label__==256){var $343=$stressed_word;var $tobool698=((($343))|0)!=0;if($tobool698){__label__=257;;}else{__label__=258;;}
65511 if(__label__==257){var $344=HEAP32[(($ix)>>2)];var $345=$buf_addr;var $arrayidx700=(($345+$344)&4294967295);var $call701=__Z8utf8_outjPc(1328,$arrayidx700);var $346=HEAP32[(($ix)>>2)];var $add702=((($346)+($call701))&4294967295);HEAP32[(($ix)>>2)]=$add702;;}
65512 var $347=$end_clause_after_tag;var $tobool704=((($347))|0)!=0;if($tobool704){__label__=259;;}else{__label__=260;;}
65513 if(__label__==259){var $348=$end_clause_index;var $349=$buf_addr;var $arrayidx706=(($349+$348)&4294967295);__ZL10RemoveCharPc($arrayidx706);;}
65514 var $350=HEAP32[(($ix)>>2)];var $351=$buf_addr;var $arrayidx708=(($351+$350)&4294967295);HEAP8[($arrayidx708)]=32;var $352=HEAP32[(($ix)>>2)];var $add709=((($352)+1)&4294967295);var $353=$buf_addr;var $arrayidx710=(($353+$add709)&4294967295);HEAP8[($arrayidx710)]=0;$retval=589864;;}
65515 else if(__label__==12){HEAP8[(__ZL12end_of_input_b)]=1;$retval=589864;;}
65516 else if(__label__==15){HEAP8[(__ZL19clear_skipping_text_b)]=1;HEAP32[((_skip_characters)>>2)]=0;var $24=HEAP32[(($c2)>>2)];__ZL6UngetCi($24);$retval=16384;;}
65517 else if(__label__==66){var $81=$end_clause_after_tag;var $tobool168=((($81))|0)!=0;if($tobool168){__label__=67;;}else{__label__=68;;}
65518 if(__label__==67){var $82=$end_clause_index;HEAP32[(($ix)>>2)]=$82;;}
65519 var $83=HEAP32[(($ix)>>2)];var $84=$buf_addr;var $arrayidx171=(($84+$83)&4294967295);HEAP8[($arrayidx171)]=32;var $85=HEAP32[(($ix)>>2)];var $inc172=((($85)+1)&4294967295);HEAP32[(($ix)>>2)]=$inc172;var $86=$buf_addr;var $arrayidx173=(($86+$85)&4294967295);HEAP8[($arrayidx173)]=0;var $87=$terminator;var $and=($87)&131072;var $tobool174=((($and))|0)!=0;if($tobool174){__label__=69;;}else{__label__=70;;}
65520 if(__label__==69){var $88=$voice_change_addr;var $call176=_strcpy($88,((__ZL16current_voice_id)&4294967295));;}
65521 var $89=$terminator;$retval=$89;;}
65522 else if(__label__==74){var $call192=__Z11lookupwcharPKti(((__ZL11punct_chars)&4294967295),$93);$punct=$call192;var $cmp193=((($call192))|0)==0;if($cmp193){__label__=75;;}else{__label__=76;;}
65523 if(__label__==75){var $94=HEAP32[((_count_characters)>>2)];var $95=HEAP32[((_clause_start_char)>>2)];var $sub195=((($94)-($95))&4294967295);var $conv196=((($sub195))&65535);var $96=HEAP32[(($ix)>>2)];var $97=$charix_addr;var $arrayidx197=(($97+2*$96)&4294967295);HEAP16[(($arrayidx197)>>1)]=$conv196;var $98=HEAP32[(($ix)>>2)];var $99=$charix_top_addr;HEAP32[(($99)>>2)]=$98;var $100=HEAP32[(($c1)>>2)];var $101=HEAP32[(($ix)>>2)];var $102=$buf_addr;var $arrayidx198=(($102+$101)&4294967295);var $call199=__Z8utf8_outjPc($100,$arrayidx198);var $103=HEAP32[(($ix)>>2)];var $add200=((($103)+($call199))&4294967295);HEAP32[(($ix)>>2)]=$add200;$terminator=524328;;}
65524 else if(__label__==76){var $104=$punct;var $arrayidx202=((__ZL16punct_attributes+$104*4)&4294967295);var $105=HEAP32[(($arrayidx202)>>2)];$terminator=$105;;}
65525 var $106=HEAP32[(($ix)>>2)];var $107=$buf_addr;var $arrayidx204=(($107+$106)&4294967295);HEAP8[($arrayidx204)]=32;var $108=HEAP32[(($ix)>>2)];var $add205=((($108)+1)&4294967295);var $109=$buf_addr;var $arrayidx206=(($109+$add205)&4294967295);HEAP8[($arrayidx206)]=0;var $110=$terminator;$retval=$110;;}
65526 else if(__label__==81){var $114=HEAP32[(($ix)>>2)];var $inc215=((($114)+1)&4294967295);HEAP32[(($ix)>>2)]=$inc215;var $115=$buf_addr;var $arrayidx216=(($115+$114)&4294967295);HEAP8[($arrayidx216)]=0;;while(1){var $call218=__ZL4GetCv();HEAP32[(($c1)>>2)]=$call218;var $call219=_iswspace($call218);var $tobool220=((($call219))|0)!=0;if($tobool220){__label__=86;break;}
65527 var $call222=__Z3Eofv();var $tobool223=((($call222))|0)!=0;if($tobool223){__label__=86;break;}
65528 var $116=HEAP32[(($ix)>>2)];var $117=$n_buf_addr;var $sub225=((($117)-1)&4294967295);var $cmp226=((($116))|0)<((($sub225))|0);if(!($cmp226)){__label__=86;break;}
65529 var $118=HEAP32[(($c1)>>2)];var $conv229=((($118))&255);var $119=HEAP32[(($ix)>>2)];var $inc230=((($119)+1)&4294967295);HEAP32[(($ix)>>2)]=$inc230;var $120=$buf_addr;var $arrayidx231=(($120+$119)&4294967295);HEAP8[($arrayidx231)]=$conv229;__label__=82;continue;}
65530 var $121=HEAP32[(($ix)>>2)];var $inc233=((($121)+1)&4294967295);HEAP32[(($ix)>>2)]=$inc233;var $122=$buf_addr;var $arrayidx234=(($122+$121)&4294967295);HEAP8[($arrayidx234)]=0;$retval=147456;;}
65531 else if(__label__==108){HEAP32[((__ZL10ungot_word)>>2)]=((__str42209)&4294967295);var $151=HEAP32[(($c2)>>2)];__ZL6UngetCi($151);var $152=$p_word;var $arrayidx300=(($152)&4294967295);HEAP8[($arrayidx300)]=0;$retval=524328;;}
65532 else if(__label__==138){var $184=HEAP32[(($c2)>>2)];__ZL6UngetCi($184);var $185=$end_clause_after_tag;var $tobool387=((($185))|0)!=0;if($tobool387){__label__=139;;}else{__label__=140;;}
65533 if(__label__==139){var $186=$end_clause_index;var $187=$buf_addr;var $arrayidx389=(($187+$186)&4294967295);__ZL10RemoveCharPc($arrayidx389);;}
65534 var $188=HEAP32[(($ix)>>2)];var $189=$buf_addr;var $arrayidx391=(($189+$188)&4294967295);HEAP8[($arrayidx391)]=32;var $190=HEAP32[(($ix)>>2)];var $add392=((($190)+1)&4294967295);var $191=$buf_addr;var $arrayidx393=(($191+$add392)&4294967295);HEAP8[($arrayidx393)]=0;var $192=$parag;var $cmp394=((($192))|0)>3;if($cmp394){__label__=141;;}else{__label__=142;;}
65535 if(__label__==141){$parag=3;;}
65536 var $193=HEAP32[((_option_ssml)>>2)];var $tobool397=((($193))|0)!=0;if($tobool397){__label__=143;;}else{__label__=144;;}
65537 if(__label__==143){$parag=1;;}
65538 var $194=$parag;var $mul=((($194)*30)&4294967295);var $add400=((($mul)+524328)&4294967295);$retval=$add400;;}
65539 else if(__label__==146){var $197=HEAP32[(($c2)>>2)];__ZL6UngetCi($197);var $198=HEAP32[(($ix)>>2)];var $199=$buf_addr;var $arrayidx404=(($199+$198)&4294967295);HEAP8[($arrayidx404)]=32;var $200=HEAP32[(($ix)>>2)];var $add405=((($200)+1)&4294967295);var $201=$buf_addr;var $arrayidx406=(($201+$add405)&4294967295);HEAP8[($arrayidx406)]=0;$retval=262174;;}
65540 else if(__label__==153){var $209=HEAP32[(($c2)>>2)];__ZL6UngetCi($209);var $210=HEAP32[(($c1)>>2)];HEAP32[((__ZL11ungot_char2)>>2)]=$210;var $211=$end_clause_index;var $212=$buf_addr;var $arrayidx424=(($212+$211)&4294967295);HEAP8[($arrayidx424)]=32;var $213=$end_clause_index;var $add425=((($213)+1)&4294967295);var $214=$buf_addr;var $arrayidx426=(($214+$add425)&4294967295);HEAP8[($arrayidx426)]=0;var $215=$end_clause_after_tag;$retval=$215;;}
65541 else if(__label__==179){var $243=$terminator;$retval=$243;;}
65542 else if(__label__==227){var $293=$c_next;__ZL6UngetCi($293);var $294=HEAP32[(($ix)>>2)];var $295=$buf_addr;var $arrayidx612=(($295+$294)&4294967295);HEAP8[($arrayidx612)]=32;var $296=HEAP32[(($ix)>>2)];var $add613=((($296)+1)&4294967295);var $297=$buf_addr;var $arrayidx614=(($297+$add613)&4294967295);HEAP8[($arrayidx614)]=0;var $298=$cprev;var $call615=_iswdigit($298);var $tobool616=((($call615))|0)!=0;if($tobool616){__label__=228;;}else{__label__=230;;}
65543 $land_lhs_true617$$if_end622$335:do{if(__label__==228){var $299=$c_next;var $call618=__Z7IsAlphaj($299);var $tobool619=((($call618))|0)!=0;if($tobool619){__label__=230;break $land_lhs_true617$$if_end622$335;}
65544 var $300=$punct_data;var $and621=($300)&-4194305;$punct_data=$and621;;}}while(0);var $301=$nl_count;var $cmp623=((($301))|0)>1;var $302=$punct_data;if($cmp623){__label__=231;;}else{__label__=234;;}
65545 if(__label__==231){var $cmp625=((($302))|0)==532520;var $303=$punct_data;var $cmp627=((($303))|0)==536621;var $or_cond18=($cmp625)|($cmp627);if($or_cond18){__label__=232;;}else{__label__=233;;}
65546 if(__label__==232){var $304=$punct_data;var $add629=((($304)+35)&4294967295);$retval=$add629;;}
65547 else if(__label__==233){$retval=524358;;}}
65548 else if(__label__==234){$retval=$302;;}}
65549 else if(__label__==255){var $338=HEAP32[(($ix)>>2)];var $339=$buf_addr;var $arrayidx693=(($339+$338)&4294967295);HEAP8[($arrayidx693)]=32;var $340=HEAP32[(($ix)>>2)];var $add694=((($340)+1)&4294967295);var $341=$buf_addr;var $arrayidx695=(($341+$add694)&4294967295);HEAP8[($arrayidx695)]=0;var $342=HEAP32[(($c2)>>2)];__ZL6UngetCi($342);$retval=16384;;}
65550 var $354=$retval;STACKTOP=__stackBase__;return $354;return null;}
65551 function __ZL4GetCv(){var __stackBase__=STACKTOP;STACKTOP+=16;_memset(__stackBase__,0,16);var __label__;var __lastLabel__=null;var $retval;var $c;var $c1;var $c2;var $cbuf=__stackBase__;var $ix;var $n_bytes;var $m;var $0=HEAP32[((__ZL10ungot_char)>>2)];$c1=$0;var $cmp=((($0))|0)!=0;if($cmp){__label__=1;;}else{__label__=2;;}
65552 $if_then$$if_end$2:do{if(__label__==1){HEAP32[((__ZL10ungot_char)>>2)]=0;var $1=$c1;$retval=$1;;}
65553 else if(__label__==2){var $2=HEAP32[((__ZZL4GetCvE6ungot2)>>2)];var $cmp1=((($2))|0)!=0;if($cmp1){__label__=3;;}else{__label__=4;;}
65554 if(__label__==3){var $3=HEAP32[((__ZZL4GetCvE6ungot2)>>2)];$c1=$3;HEAP32[((__ZZL4GetCvE6ungot2)>>2)]=0;;}
65555 else if(__label__==4){var $call=__ZL8GetC_getv();$c1=$call;;}
65556 var $4=HEAP32[((_option_multibyte)>>2)];var $cmp4=((($4))|0)==3;var $5=HEAP32[((_option_multibyte)>>2)];var $cmp5=((($5))|0)==4;var $or_cond=($cmp4)|($cmp5);if($or_cond){__label__=6;;}else{__label__=7;;}
65557 if(__label__==6){var $6=HEAP32[((_count_characters)>>2)];var $inc=((($6)+1)&4294967295);HEAP32[((_count_characters)>>2)]=$inc;var $7=$c1;$retval=$7;;}
65558 else if(__label__==7){var $8=HEAP32[((_option_multibyte)>>2)];var $cmp8=((($8))|0)<2;if($cmp8){__label__=8;;}else{__label__=36;;}
65559 $land_lhs_true$$if_end65thread_pre_split$12:do{if(__label__==8){var $9=$c1;var $and=($9)&128;var $tobool=((($and))|0)!=0;if($tobool){__lastLabel__=8;;}else{__lastLabel__=8;__label__=37;break $land_lhs_true$$if_end65thread_pre_split$12;}
65560 $n_bytes=0;var $10=$c1;var $and10=($10)&224;var $cmp11=((($and10))|0)==192;if($cmp11){__label__=10;;}else{__label__=12;;}
65561 $land_lhs_true12$$if_else16$15:do{if(__label__==10){var $11=$c1;var $and13=($11)&30;var $cmp14=((($and13))|0)!=0;if(!($cmp14)){__label__=12;break $land_lhs_true12$$if_else16$15;}
65562 $n_bytes=1;__lastLabel__=11;__label__=17;break $land_lhs_true12$$if_else16$15;}}while(0);$if_end29_thread$$if_else16$18:do{if(__label__==12){var $12=$c1;var $and17=($12)&240;var $cmp18=((($and17))|0)==224;if($cmp18){__label__=13;;}else{__label__=14;;}
65563 if(__label__==13){$n_bytes=2;__lastLabel__=13;__label__=17;break $if_end29_thread$$if_else16$18;}
65564 else if(__label__==14){var $13=$c1;var $and21=($13)&248;var $cmp22=((($and21))|0)==240;if($cmp22){__label__=15;;}else{__label__=18;;}
65565 $land_lhs_true23$$if_end29$23:do{if(__label__==15){var $14=$c1;var $and24=($14)&15;var $cmp25=((($and24))|0)<=4;if(!($cmp25)){__label__=18;break $land_lhs_true23$$if_end29$23;}
65566 $n_bytes=3;__lastLabel__=16;__label__=17;break $if_end29_thread$$if_else16$18;}}while(0);var $_pr=$n_bytes;$ix=$_pr;var $cmp30=((($_pr))|0)>0;if($cmp30){__label__=19;break $if_end29_thread$$if_else16$18;}else{__label__=33;break $if_end29_thread$$if_else16$18;}}}}while(0);$if_end29_thread$$if_then31$$if_end58$27:do{if(__label__==17){var $_ph=__lastLabel__==13?2:(__lastLabel__==16?3:(1));$ix=$_ph;__label__=19;break $if_end29_thread$$if_then31$$if_end58$27;}}while(0);$if_then31$$if_end58$29:do{if(__label__==19){var $15=$c1;var $16=$ix;var $arrayidx=((__ZZ8utf8_in2PiPKciE4mask+$16)&4294967295);var $17=HEAPU8[($arrayidx)];var $conv=((($17))&255);var $and32=($conv)&($15);$c=$and32;var $18=$ix;var $arrayidx33=((__ZZL4GetCvE5mask2+$18)&4294967295);var $19=HEAP8[($arrayidx33)];$m=$19;__lastLabel__=19;;$while_cond$31:while(1){var $20=__lastLabel__==30?$dec:($18);var $cmp34=((($20))|0)>0;if(!($cmp34)){__label__=31;break $while_cond$31;}
65567 var $call35=__ZL8GetC_getv();var $21=$ix;var $arrayidx36=(($cbuf+$21*4)&4294967295);HEAP32[(($arrayidx36)>>2)]=$call35;$c2=$call35;var $cmp37=((($call35))|0)==0;if($cmp37){__label__=22;break $while_cond$31;}
65568 var $23=$c2;var $and43=($23)&192;var $cmp44=((($and43))|0)!=128;if($cmp44){__label__=26;break $while_cond$31;}
65569 $m=-128;var $28=$c;var $shl=((($28)*64)&4294967295);var $29=$c2;var $and53=($29)&63;var $add=((($and53)+($shl))&4294967295);$c=$add;var $30=$ix;var $dec=((($30)-1)&4294967295);$ix=$dec;__lastLabel__=30;__label__=20;continue $while_cond$31;}
65570 if(__label__==22){var $22=HEAP32[((_option_multibyte)>>2)];var $cmp39=((($22))|0)==0;if($cmp39){__label__=23;;}else{__label__=24;;}
65571 if(__label__==23){HEAP32[((_option_multibyte)>>2)]=2;;}
65572 __ZL10GetC_ungeti(32);;}
65573 else if(__label__==26){var $24=$n_bytes;var $cmp46=((($24))|0)==2;if($cmp46){__label__=27;;}else{__label__=29;;}
65574 $land_lhs_true47$$if_end51$42:do{if(__label__==27){var $25=$ix;var $cmp48=((($25))|0)==1;if(!($cmp48)){__label__=29;break $land_lhs_true47$$if_end51$42;}
65575 var $arrayidx50=(($cbuf+8)&4294967295);var $26=HEAP32[(($arrayidx50)>>2)];HEAP32[((__ZZL4GetCvE6ungot2)>>2)]=$26;;}}while(0);var $27=$c2;__ZL10GetC_ungeti($27);;}
65576 var $31=$ix;var $cmp54=((($31))|0)==0;if(!($cmp54)){__label__=33;break $if_then31$$if_end58$29;}
65577 var $32=HEAP32[((_count_characters)>>2)];var $inc56=((($32)+1)&4294967295);HEAP32[((_count_characters)>>2)]=$inc56;var $33=$c;$retval=$33;__label__=40;break $if_then$$if_end$2;}}while(0);var $34=HEAP32[((_option_multibyte)>>2)];var $cmp59=((($34))|0)==0;if(!($cmp59)){__label__=36;break $land_lhs_true$$if_end65thread_pre_split$12;}
65578 var $call61=__Z3Eofv();var $tobool62=((($call61))|0)!=0;if($tobool62){__label__=36;break $land_lhs_true$$if_end65thread_pre_split$12;}
65579 HEAP32[((_option_multibyte)>>2)]=2;__label__=36;break $land_lhs_true$$if_end65thread_pre_split$12;}}while(0);if(__label__==36){var $_pr2=$c1;__lastLabel__=36;;}
65580 var $35=__lastLabel__==36?$_pr2:($9);var $36=HEAP32[((_count_characters)>>2)];var $inc66=((($36)+1)&4294967295);HEAP32[((_count_characters)>>2)]=$inc66;var $cmp67=((($35))|0)>=160;var $37=$c1;if($cmp67){__label__=38;;}else{__label__=39;;}
65581 if(__label__==38){var $sub=((($37)-160)&4294967295);var $38=HEAP32[((_translator)>>2)];var $charset_a0=(($38+696)&4294967295);var $39=HEAP32[(($charset_a0)>>2)];var $arrayidx69=(($39+2*$sub)&4294967295);var $40=HEAPU16[(($arrayidx69)>>1)];var $conv70=((($40))&65535);$retval=$conv70;;}
65582 else if(__label__==39){$retval=$37;;}}}}while(0);var $41=$retval;STACKTOP=__stackBase__;return $41;return null;}
65583 function __ZL6UngetCi($c){;var __label__;var $c_addr;$c_addr=$c;var $0=$c_addr;HEAP32[((__ZL10ungot_char)>>2)]=$0;;return;return;}
65584 function __ZL14ProcessSsmlTagPwPcRiii($xml_buf,$outbuf,$outix,$n_outbuf,$self_closing){var __stackBase__=STACKTOP;STACKTOP+=376;_memset(__stackBase__,0,376);var __label__;var __lastLabel__=null;var $retval;var $xml_buf_addr;var $outbuf_addr;var $outix_addr;var $n_outbuf_addr;var $self_closing_addr;var $ix;var $index;var $c;var $tag_type;var $value;var $value2;var $value3;var $voice_change_flag;var $px;var $attr1;var $attr2;var $attr3;var $terminator;var $uri;var $param_type;var $tag_name=__stackBase__;var $buf=__stackBase__+40;var $sp;var $ssml_sp;var $fname=__stackBase__+120;$xml_buf_addr=$xml_buf;$outbuf_addr=$outbuf;$outix_addr=$outix;$n_outbuf_addr=$n_outbuf;$self_closing_addr=$self_closing;$ix=0;__lastLabel__=0;;$for_cond$2:while(1){var $0=__lastLabel__==4?$inc:(0);var $cmp=((($0))>>>0)<39;if(!($cmp)){__label__=5;break $for_cond$2;}
65585 var $1=$ix;var $2=$xml_buf_addr;var $arrayidx=(($2+4*$1)&4294967295);var $3=HEAP32[(($arrayidx)>>2)];$c=$3;var $cmp1=((($3))|0)==0;if($cmp1){__label__=5;break $for_cond$2;}
65586 var $4=$c;var $call=_iswspace($4);var $tobool=((($call))|0)!=0;if($tobool){__label__=5;break $for_cond$2;}
65587 var $5=$c;var $conv=((($5))&255);var $conv2=(tempInt=(($conv)),(tempInt>=128?tempInt-256:tempInt));var $call3=_tolower($conv2);var $conv4=((($call3))&255);var $6=$ix;var $arrayidx5=(($tag_name+$6)&4294967295);HEAP8[($arrayidx5)]=$conv4;var $7=$ix;var $inc=((($7)+1)&4294967295);$ix=$inc;__lastLabel__=4;__label__=1;continue $for_cond$2;}
65588 var $8=$ix;var $arrayidx6=(($tag_name+$8)&4294967295);HEAP8[($arrayidx6)]=0;var $9=$ix;var $10=$xml_buf_addr;var $arrayidx7=(($10+4*$9)&4294967295);$px=$arrayidx7;var $arrayidx8=(($tag_name)&4294967295);var $11=HEAP8[($arrayidx8)];var $conv9=(tempInt=(($11)),(tempInt>=128?tempInt-256:tempInt));var $cmp10=((($conv9))|0)==47;if($cmp10){__label__=6;;}else{__label__=9;;}
65589 $if_then11$$if_else$8:do{if(__label__==6){var $arrayidx12=(($tag_name+1)&4294967295);var $call13=__Z10LookupMnemP8MNEM_TABPKc(((__ZL8ssmltags)&4294967295),$arrayidx12);$tag_type=$call13;var $cmp14=((($call13))|0)!=16;if($cmp14){__label__=7;;}else{__label__=8;;}
65590 if(__label__==7){var $12=$outix_addr;var $13=HEAP32[(($12)>>2)];var $inc16=((($13)+1)&4294967295);HEAP32[(($12)>>2)]=$inc16;var $14=$outbuf_addr;var $arrayidx17=(($14+$13)&4294967295);HEAP8[($arrayidx17)]=32;;}
65591 var $15=$tag_type;var $add=((($15)+32)&4294967295);$tag_type=$add;__lastLabel__=8;__label__=14;break $if_then11$$if_else$8;}
65592 else if(__label__==9){var $arraydecay=(($tag_name)&4294967295);var $call19=__Z10LookupMnemP8MNEM_TABPKc(((__ZL8ssmltags)&4294967295),$arraydecay);$tag_type=$call19;var $cmp20=((($call19))|0)!=16;if($cmp20){__label__=10;;}else{__label__=11;;}
65593 if(__label__==10){var $16=$outix_addr;var $17=HEAP32[(($16)>>2)];var $inc22=((($17)+1)&4294967295);HEAP32[(($16)>>2)]=$inc22;var $18=$outbuf_addr;var $arrayidx23=(($18+$17)&4294967295);HEAP8[($arrayidx23)]=32;;}
65594 var $19=$self_closing_addr;var $tobool25=((($19))|0)!=0;var $20=$tag_type;if($tobool25){__lastLabel__=11;;}else{__lastLabel__=11;__label__=14;break $if_then11$$if_else$8;}
65595 var $arrayidx26=((__ZL22ignore_if_self_closing+$20)&4294967295);var $21=HEAP8[($arrayidx26)];var $tobool27=(tempInt=(($21)),(tempInt>=128?tempInt-256:tempInt))!=0;if($tobool27){__lastLabel__=12;;}else{__lastLabel__=12;__label__=14;break $if_then11$$if_else$8;}
65596 $retval=0;__label__=113;break $if_then11$$if_else$8;}}while(0);$if_end30$$return$19:do{if(__label__==14){var $22=__lastLabel__==12?$20:(__lastLabel__==8?$add:($20));$voice_change_flag=0;$terminator=16384;var $23=HEAPU32[((__ZL12n_ssml_stack)>>2)];var $sub=((($23)-1)&4294967295);var $arrayidx31=((__ZL10ssml_stack+$sub*76)&4294967295);$ssml_sp=$arrayidx31;if($22==10){__lastLabel__=14;__label__=15;;}
65597 else if($22==3){__lastLabel__=14;__label__=20;;}
65598 else if($22==12){__lastLabel__=14;__label__=25;;}
65599 else if($22==42){__lastLabel__=14;__label__=31;;}
65600 else if($22==35){__lastLabel__=14;__label__=31;;}
65601 else if($22==44){__lastLabel__=14;__label__=31;;}
65602 else if($22==4){__lastLabel__=14;__label__=32;;}
65603 else if($22==36){__lastLabel__=14;__label__=39;;}
65604 else if($22==9){__lastLabel__=14;__label__=42;;}
65605 else if($22==14){__lastLabel__=14;__label__=44;;}
65606 else if($22==41){__lastLabel__=14;__label__=45;;}
65607 else if($22==46){__lastLabel__=14;__label__=45;;}
65608 else if($22==5){__lastLabel__=14;__label__=46;;}
65609 else if($22==11){__lastLabel__=14;__label__=51;;}
65610 else if($22==43){__lastLabel__=14;__label__=66;;}
65611 else if($22==13){__lastLabel__=14;__label__=67;;}
65612 else if($22==1){__lastLabel__=14;__label__=79;;}
65613 else if($22==2){__lastLabel__=14;__label__=85;;}
65614 else if($22==33){__lastLabel__=14;__label__=88;;}
65615 else if($22==34){__lastLabel__=14;__label__=92;;}
65616 else if($22==15){__lastLabel__=14;__label__=96;;}
65617 else if($22==47){__lastLabel__=14;__label__=96;;}
65618 else if($22==6){__lastLabel__=14;__label__=97;;}
65619 else if($22==7){__lastLabel__=14;__label__=100;;}
65620 else if($22==38){__lastLabel__=14;__label__=105;;}
65621 else if($22==39){__lastLabel__=14;__label__=108;;}
65622 else{__lastLabel__=14;__label__=112;;}
65623 $sw_epilog$$sw_bb$$sw_bb49$$sw_bb62$$sw_bb83$$sw_bb84$$sw_bb110$$sw_bb120$$sw_bb129$$sw_bb130$$sw_bb131$$sw_bb156$$sw_bb220$$sw_bb221$$sw_bb249$$sw_bb266$$while_cond$$while_cond280$$sw_bb293$$sw_bb294$$sw_bb302$$sw_bb317$$sw_bb324$21:do{if(__label__==15){var $24=$tag_type;var $call32=__ZL14PushParamStacki($24);$sp=$call32;var $25=$px;var $call33=__ZL16GetSsmlAttributePwPKc($25,((__str83250)&4294967295));$attr1=$call33;var $26=$px;var $call34=__ZL16GetSsmlAttributePwPKc($26,((__str84251)&4294967295));$attr2=$call34;var $27=$attr1;var $call35=__ZL7attrcmpPKwPKc($27,((__str85252)&4294967295));var $cmp36=((($call35))|0)==0;if($cmp36){__label__=16;;}else{__label__=17;;}
65624 $if_then37$$if_else40$23:do{if(__label__==16){var $28=$attr2;var $call38=__ZL10attrlookupPKwPK8MNEM_TAB($28,((__ZZL14ProcessSsmlTagPwPcRiiiE10mnem_punct)&4294967295));$value=$call38;var $29=$value;var $30=$sp;var $parameter=(($30+4)&4294967295);var $arrayidx39=(($parameter+20)&4294967295);HEAP32[(($arrayidx39)>>2)]=$29;;}
65625 else if(__label__==17){var $31=$attr1;var $call41=__ZL7attrcmpPKwPKc($31,((__str86253)&4294967295));var $cmp42=((($call41))|0)==0;if(!($cmp42)){__label__=19;break $if_then37$$if_else40$23;}
65626 var $32=$attr2;var $call44=__ZL10attrlookupPKwPK8MNEM_TAB($32,((__ZZL14ProcessSsmlTagPwPcRiiiE13mnem_capitals)&4294967295));$value=$call44;var $33=$value;var $34=$sp;var $parameter45=(($34+4)&4294967295);var $arrayidx46=(($parameter45+24)&4294967295);HEAP32[(($arrayidx46)>>2)]=$33;;}}while(0);var $35=$outbuf_addr;var $36=$outix_addr;__ZL17ProcessParamStackPcRi($35,$36);;}
65627 else if(__label__==20){var $37=$tag_type;var $call50=__ZL14PushParamStacki($37);$sp=$call50;$param_type=1;;while(1){var $38=$px;var $39=$param_type;var $arrayidx54=((__ZZL14ProcessSsmlTagPwPcRiiiE12prosody_attr+$39*4)&4294967295);var $40=HEAP32[(($arrayidx54)>>2)];var $call55=__ZL16GetSsmlAttributePwPKc($38,$40);$attr1=$call55;var $cmp56=((($call55))|0)!=0;if($cmp56){__label__=22;;}else{__label__=23;;}
65628 if(__label__==22){var $41=$param_type;var $42=$attr1;var $43=$sp;__ZL19SetProsodyParameteriPwP11PARAM_STACK($41,$42,$43);;}
65629 var $44=$param_type;var $inc60=((($44)+1)&4294967295);$param_type=$inc60;var $cmp52=((($inc60))|0)<=4;if($cmp52){__label__=21;continue;}else{__label__=24;break;}}
65630 var $45=$outbuf_addr;var $46=$outix_addr;__ZL17ProcessParamStackPcRi($45,$46);;}
65631 else if(__label__==25){var $47=$tag_type;var $call63=__ZL14PushParamStacki($47);$sp=$call63;$value=3;var $48=$px;var $call64=__ZL16GetSsmlAttributePwPKc($48,((__str87254)&4294967295));$attr1=$call64;var $cmp65=((($call64))|0)!=0;if($cmp65){__label__=26;;}else{__label__=27;;}
65632 if(__label__==26){var $49=$attr1;var $call67=__ZL10attrlookupPKwPK8MNEM_TAB($49,((__ZZL14ProcessSsmlTagPwPcRiiiE13mnem_emphasis)&4294967295));$value=$call67;;}
65633 var $50=HEAP32[((_translator)>>2)];var $langopts=(($50)&4294967295);var $tone_language=(($langopts+224)&4294967295);var $51=HEAP32[(($tone_language)>>2)];var $cmp69=((($51))|0)==1;var $52=$value;if($cmp69){__label__=28;;}else{__label__=29;;}
65634 if(__label__==28){var $arrayidx71=((__ZZL14ProcessSsmlTagPwPcRiiiE23emphasis_to_pitch_range+$52)&4294967295);var $53=HEAPU8[($arrayidx71)];var $conv72=((($53))&255);var $54=$sp;var $parameter73=(($54+4)&4294967295);var $arrayidx74=(($parameter73+16)&4294967295);HEAP32[(($arrayidx74)>>2)]=$conv72;var $55=$value;var $arrayidx75=((__ZZL14ProcessSsmlTagPwPcRiiiE18emphasis_to_volume+$55)&4294967295);var $56=HEAPU8[($arrayidx75)];var $conv76=((($56))&255);var $57=$sp;var $parameter77=(($57+4)&4294967295);var $arrayidx78=(($parameter77+8)&4294967295);HEAP32[(($arrayidx78)>>2)]=$conv76;;}
65635 else if(__label__==29){var $58=$sp;var $parameter80=(($58+4)&4294967295);var $arrayidx81=(($parameter80+48)&4294967295);HEAP32[(($arrayidx81)>>2)]=$52;;}
65636 var $59=$outbuf_addr;var $60=$outix_addr;__ZL17ProcessParamStackPcRi($59,$60);;}
65637 else if(__label__==31){var $61=$tag_type;var $62=$outbuf_addr;var $63=$outix_addr;__ZL13PopParamStackiPcRi($61,$62,$63);;}
65638 else if(__label__==32){var $64=$px;var $call85=__ZL16GetSsmlAttributePwPKc($64,((__str88255)&4294967295));$attr1=$call85;var $65=$px;var $call86=__ZL16GetSsmlAttributePwPKc($65,((__str89256)&4294967295));$attr2=$call86;var $66=$px;var $call87=__ZL16GetSsmlAttributePwPKc($66,((__str90257)&4294967295));$attr3=$call87;var $67=$attr1;var $call88=__ZL10attrlookupPKwPK8MNEM_TAB($67,((__ZZL14ProcessSsmlTagPwPcRiiiE17mnem_interpret_as)&4294967295));$value=$call88;var $68=$attr2;var $call89=__ZL10attrlookupPKwPK8MNEM_TAB($68,((__ZZL14ProcessSsmlTagPwPcRiiiE17mnem_sayas_format)&4294967295));$value2=$call89;var $69=$value2;var $cmp90=((($69))|0)==1;if($cmp90){__label__=33;;}else{__label__=34;;}
65639 if(__label__==33){$value=19;;}
65640 var $70=$attr3;var $call93=__ZL10attrnumberPKwii($70,0,0);$value3=$call93;var $71=$value;var $cmp94=((($71))|0)==64;if($cmp94){__label__=35;;}else{__label__=38;;}
65641 if(__label__==35){var $72=$value3;var $cmp96=((($72))|0)<=1;if($cmp96){__label__=36;;}else{__label__=37;;}
65642 if(__label__==36){$value=193;;}
65643 else if(__label__==37){var $73=$value3;var $add99=((($73)+64)&4294967295);$value=$add99;;}}
65644 var $arraydecay102=(($buf)&4294967295);var $74=$value;var $call103=_sprintf($arraydecay102,((__str91258)&4294967295),allocate([1,0,0,0,$74,0,0,0],["i32",0,0,0,"i32",0,0,0],ALLOC_STACK));var $75=$outix_addr;var $76=HEAP32[(($75)>>2)];var $77=$outbuf_addr;var $arrayidx104=(($77+$76)&4294967295);var $arraydecay105=(($buf)&4294967295);var $call106=_strcpy($arrayidx104,$arraydecay105);var $arraydecay107=(($buf)&4294967295);var $call108=_strlen($arraydecay107);var $78=$outix_addr;var $79=HEAP32[(($78)>>2)];var $add109=((($79)+($call108))&4294967295);HEAP32[(($78)>>2)]=$add109;var $80=$outix_addr;var $81=HEAP32[(($80)>>2)];HEAP32[((__ZL11sayas_start)>>2)]=$81;var $82=$value;HEAP32[((__ZL10sayas_mode)>>2)]=$82;;}
65645 else if(__label__==39){var $83=HEAP32[((__ZL10sayas_mode)>>2)];var $cmp111=((($83))|0)==36;if($cmp111){__label__=40;;}else{__label__=41;;}
65646 if(__label__==40){var $84=$outix_addr;var $85=HEAP32[(($84)>>2)];var $86=$outbuf_addr;var $arrayidx113=(($86+$85)&4294967295);HEAP8[($arrayidx113)]=0;var $87=$outbuf_addr;var $88=HEAP32[((__ZL11sayas_start)>>2)];var $89=$outix_addr;__ZL14ReplaceKeyNamePciRi($87,$88,$89);;}
65647 var $90=$outix_addr;var $91=HEAP32[(($90)>>2)];var $inc116=((($91)+1)&4294967295);HEAP32[(($90)>>2)]=$inc116;var $92=$outbuf_addr;var $arrayidx117=(($92+$91)&4294967295);HEAP8[($arrayidx117)]=1;var $93=$outix_addr;var $94=HEAP32[(($93)>>2)];var $inc118=((($94)+1)&4294967295);HEAP32[(($93)>>2)]=$inc118;var $95=$outbuf_addr;var $arrayidx119=(($95+$94)&4294967295);HEAP8[($arrayidx119)]=89;HEAP32[((__ZL10sayas_mode)>>2)]=0;;}
65648 else if(__label__==42){var $96=$px;var $call121=__ZL16GetSsmlAttributePwPKc($96,((__str92259)&4294967295));$attr1=$call121;var $cmp122=((($call121))|0)!=0;if(!($cmp122)){__label__=112;break $sw_epilog$$sw_bb$$sw_bb49$$sw_bb62$$sw_bb83$$sw_bb84$$sw_bb110$$sw_bb120$$sw_bb129$$sw_bb130$$sw_bb131$$sw_bb156$$sw_bb220$$sw_bb221$$sw_bb249$$sw_bb266$$while_cond$$while_cond280$$sw_bb293$$sw_bb294$$sw_bb302$$sw_bb317$$sw_bb324$21;}
65649 HEAP8[(__ZL11ignore_text_b)]=1;var $97=$outix_addr;var $98=HEAP32[(($97)>>2)];var $99=$outbuf_addr;var $arrayidx124=(($99+$98)&4294967295);var $100=$attr1;var $101=$n_outbuf_addr;var $102=$outix_addr;var $103=HEAP32[(($102)>>2)];var $sub125=((($101)-($103))&4294967295);var $call126=__ZL13attrcopy_utf8PcPKwi($arrayidx124,$100,$sub125);var $104=$outix_addr;var $105=HEAP32[(($104)>>2)];var $add127=((($105)+($call126))&4294967295);HEAP32[(($104)>>2)]=$add127;;}
65650 else if(__label__==44){HEAP8[(__ZL11ignore_text_b)]=1;;}
65651 else if(__label__==45){HEAP8[(__ZL11ignore_text_b)]=0;;}
65652 else if(__label__==46){var $106=$px;var $call132=__ZL16GetSsmlAttributePwPKc($106,((__str5655)&4294967295));$attr1=$call132;var $cmp133=((($call132))|0)!=0;if(!($cmp133)){__label__=112;break $sw_epilog$$sw_bb$$sw_bb49$$sw_bb62$$sw_bb83$$sw_bb84$$sw_bb110$$sw_bb120$$sw_bb129$$sw_bb130$$sw_bb131$$sw_bb156$$sw_bb220$$sw_bb221$$sw_bb249$$sw_bb266$$while_cond$$while_cond280$$sw_bb293$$sw_bb294$$sw_bb302$$sw_bb317$$sw_bb324$21;}
65653 var $arraydecay135=(($buf)&4294967295);var $107=$attr1;var $call136=__ZL13attrcopy_utf8PcPKwi($arraydecay135,$107,80);var $arraydecay137=(($buf)&4294967295);var $call138=_strcmp(((_skip_marker)&4294967295),$arraydecay137);var $cmp139=((($call138))|0)==0;if($cmp139){__label__=48;;}else{__label__=49;;}
65654 if(__label__==48){HEAP8[(__ZL19clear_skipping_text_b)]=1;HEAP8[(((_skip_marker)&4294967295))]=0;$retval=16384;__label__=113;break $if_end30$$return$19;}
65655 else if(__label__==49){var $arraydecay142=(($buf)&4294967295);var $call143=__Z11AddNameDataPKci($arraydecay142,0);$index=$call143;var $cmp144=((($call143))|0)>=0;if(!($cmp144)){__label__=112;break $sw_epilog$$sw_bb$$sw_bb49$$sw_bb62$$sw_bb83$$sw_bb84$$sw_bb110$$sw_bb120$$sw_bb129$$sw_bb130$$sw_bb131$$sw_bb156$$sw_bb220$$sw_bb221$$sw_bb249$$sw_bb266$$while_cond$$while_cond280$$sw_bb293$$sw_bb294$$sw_bb302$$sw_bb317$$sw_bb324$21;}
65656 var $arraydecay146=(($buf)&4294967295);var $108=$index;var $call147=_sprintf($arraydecay146,((__str94261)&4294967295),allocate([1,0,0,0,$108,0,0,0],["i32",0,0,0,"i32",0,0,0],ALLOC_STACK));var $109=$outix_addr;var $110=HEAP32[(($109)>>2)];var $111=$outbuf_addr;var $arrayidx148=(($111+$110)&4294967295);var $arraydecay149=(($buf)&4294967295);var $call150=_strcpy($arrayidx148,$arraydecay149);var $arraydecay151=(($buf)&4294967295);var $call152=_strlen($arraydecay151);var $112=$outix_addr;var $113=HEAP32[(($112)>>2)];var $add153=((($113)+($call152))&4294967295);HEAP32[(($112)>>2)]=$add153;;}}
65657 else if(__label__==51){var $114=$tag_type;var $call157=__ZL14PushParamStacki($114);$sp=$call157;var $115=$px;var $call158=__ZL16GetSsmlAttributePwPKc($115,((__str95262)&4294967295));$attr1=$call158;var $cmp159=((($call158))|0)!=0;if($cmp159){__label__=52;;}else{__label__=62;;}
65658 $if_then160$$if_end215$69:do{if(__label__==52){var $arraydecay161=(($buf)&4294967295);var $116=$attr1;var $call162=__ZL13attrcopy_utf8PcPKwi($arraydecay161,$116,80);var $117=HEAP32[((_uri_callback)>>2)];var $cmp163=((($117))|0)==0;if($cmp163){__label__=53;;}else{__label__=59;;}
65659 if(__label__==53){var $118=HEAP32[((__ZL7xmlbase)>>2)];var $cmp165=((($118))|0)!=0;if($cmp165){__label__=54;;}else{__label__=56;;}
65660 $land_lhs_true166$$if_else176$73:do{if(__label__==54){var $arrayidx167=(($buf)&4294967295);var $119=HEAP8[($arrayidx167)];var $conv168=(tempInt=(($119)),(tempInt>=128?tempInt-256:tempInt));var $cmp169=((($conv168))|0)!=47;if(!($cmp169)){__label__=56;break $land_lhs_true166$$if_else176$73;}
65661 var $arraydecay171=(($fname)&4294967295);var $120=HEAP32[((__ZL7xmlbase)>>2)];var $arraydecay172=(($buf)&4294967295);var $call173=_sprintf($arraydecay171,((__str96263)&4294967295),allocate([$120,0,0,0,$arraydecay172,0,0,0],["i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));var $arraydecay174=(($fname)&4294967295);var $call175=__ZL14LoadSoundFile2PKc($arraydecay174);$index=$call175;__lastLabel__=55;__label__=57;break $land_lhs_true166$$if_else176$73;}}while(0);if(__label__==56){var $arraydecay177=(($buf)&4294967295);var $call178=__ZL14LoadSoundFile2PKc($arraydecay177);$index=$call178;__lastLabel__=56;;}
65662 var $121=__lastLabel__==56?$call178:($call175);var $cmp180=((($121))|0)>=0;if(!($cmp180)){__label__=62;break $if_then160$$if_end215$69;}
65663 var $arraydecay182=(($buf)&4294967295);var $122=$index;var $call183=_sprintf($arraydecay182,((__str97264)&4294967295),allocate([1,0,0,0,$122,0,0,0],["i32",0,0,0,"i32",0,0,0],ALLOC_STACK));var $123=$outix_addr;var $124=HEAP32[(($123)>>2)];var $125=$outbuf_addr;var $arrayidx184=(($125+$124)&4294967295);var $arraydecay185=(($buf)&4294967295);var $call186=_strcpy($arrayidx184,$arraydecay185);var $arraydecay187=(($buf)&4294967295);var $call188=_strlen($arraydecay187);var $126=$outix_addr;var $127=HEAP32[(($126)>>2)];var $add189=((($127)+($call188))&4294967295);HEAP32[(($126)>>2)]=$add189;var $128=$sp;var $parameter190=(($128+4)&4294967295);var $arrayidx191=(($parameter190)&4294967295);HEAP32[(($arrayidx191)>>2)]=1;;}
65664 else if(__label__==59){var $arraydecay194=(($buf)&4294967295);var $call195=__Z11AddNameDataPKci($arraydecay194,0);$index=$call195;var $cmp196=((($call195))|0)>=0;if(!($cmp196)){__label__=62;break $if_then160$$if_end215$69;}
65665 var $129=$index;var $130=HEAP32[((_namedata)>>2)];var $arrayidx198=(($130+$129)&4294967295);$uri=$arrayidx198;var $131=HEAP32[((_uri_callback)>>2)];var $132=$uri;var $133=HEAP32[((__ZL7xmlbase)>>2)];var $call199=FUNCTION_TABLE[$131](1,$132,$133);var $cmp200=((($call199))|0)==0;if(!($cmp200)){__label__=62;break $if_then160$$if_end215$69;}
65666 var $arraydecay202=(($buf)&4294967295);var $134=$index;var $call203=_sprintf($arraydecay202,((__str98265)&4294967295),allocate([1,0,0,0,$134,0,0,0],["i32",0,0,0,"i32",0,0,0],ALLOC_STACK));var $135=$outix_addr;var $136=HEAP32[(($135)>>2)];var $137=$outbuf_addr;var $arrayidx204=(($137+$136)&4294967295);var $arraydecay205=(($buf)&4294967295);var $call206=_strcpy($arrayidx204,$arraydecay205);var $arraydecay207=(($buf)&4294967295);var $call208=_strlen($arraydecay207);var $138=$outix_addr;var $139=HEAP32[(($138)>>2)];var $add209=((($139)+($call208))&4294967295);HEAP32[(($138)>>2)]=$add209;var $140=$sp;var $parameter210=(($140+4)&4294967295);var $arrayidx211=(($parameter210)&4294967295);HEAP32[(($arrayidx211)>>2)]=1;;}}}while(0);var $141=$outbuf_addr;var $142=$outix_addr;__ZL17ProcessParamStackPcRi($141,$142);var $143=$self_closing_addr;var $tobool216=((($143))|0)!=0;if($tobool216){__label__=63;;}else{__label__=64;;}
65667 if(__label__==63){var $144=$tag_type;var $145=$outbuf_addr;var $146=$outix_addr;__ZL13PopParamStackiPcRi($144,$145,$146);;}
65668 else if(__label__==64){HEAP8[(__ZL10audio_text_b)]=1;;}
65669 $retval=16384;__label__=113;break $if_end30$$return$19;}
65670 else if(__label__==66){var $147=$tag_type;var $148=$outbuf_addr;var $149=$outix_addr;__ZL13PopParamStackiPcRi($147,$148,$149);HEAP8[(__ZL10audio_text_b)]=0;$retval=16384;__label__=113;break $if_end30$$return$19;}
65671 else if(__label__==67){$value=21;$terminator=16384;var $150=$px;var $call222=__ZL16GetSsmlAttributePwPKc($150,((__str99266)&4294967295));$attr1=$call222;var $cmp223=((($call222))|0)!=0;if($cmp223){__label__=68;;}else{__label__=71;;}
65672 if(__label__==68){var $151=$attr1;var $call225=__ZL10attrlookupPKwPK8MNEM_TAB($151,((__ZZL14ProcessSsmlTagPwPcRiiiE10mnem_break)&4294967295));$value=$call225;var $152=$value;var $cmp226=((($152))|0)<3;if($cmp226){__label__=69;;}else{__label__=70;;}
65673 if(__label__==69){var $153=$outix_addr;var $154=HEAP32[(($153)>>2)];var $155=$outbuf_addr;var $arrayidx228=(($155+$154)&4294967295);var $156=$value;var $call229=_sprintf($arrayidx228,((__str100267)&4294967295),allocate([1,0,0,0,$156,0,0,0],["i32",0,0,0,"i32",0,0,0],ALLOC_STACK));var $157=$outix_addr;var $158=HEAP32[(($157)>>2)];var $add230=((($158)+3)&4294967295);HEAP32[(($157)>>2)]=$add230;$terminator=0;;}
65674 var $159=$value;var $arrayidx232=((__ZZL14ProcessSsmlTagPwPcRiiiE11break_value+$159*4)&4294967295);var $160=HEAP32[(($arrayidx232)>>2)];$value=$160;;}
65675 var $161=$px;var $call234=__ZL16GetSsmlAttributePwPKc($161,((__str101268)&4294967295));$attr2=$call234;var $cmp235=((($call234))|0)!=0;if($cmp235){__label__=72;;}else{__label__=74;;}
65676 $if_then236$$if_end241$96:do{if(__label__==72){var $162=$attr2;var $call237=__ZL10attrnumberPKwii($162,0,1);var $mul=((($call237)*25)&4294967295);var $163=HEAP32[((((_speed)&4294967295))>>2)];var $div=((((($mul))|0)/((($163))|0))|0);$value=$div;var $164=$terminator;var $cmp238=((($164))|0)==0;if($cmp238){__lastLabel__=72;;}else{__lastLabel__=72;__label__=76;break $if_then236$$if_end241$96;}
65677 $terminator=16384;__label__=75;break $if_then236$$if_end241$96;}
65678 else if(__label__==74){var $_pr1=$terminator;var $tobool242=((($_pr1))|0)!=0;if($tobool242){__label__=75;break $if_then236$$if_end241$96;}else{__label__=112;break $sw_epilog$$sw_bb$$sw_bb49$$sw_bb62$$sw_bb83$$sw_bb84$$sw_bb110$$sw_bb120$$sw_bb129$$sw_bb130$$sw_bb131$$sw_bb156$$sw_bb220$$sw_bb221$$sw_bb249$$sw_bb266$$while_cond$$while_cond280$$sw_bb293$$sw_bb294$$sw_bb302$$sw_bb317$$sw_bb324$21;}}}while(0);if(__label__==75){var $_pr3=$value;__lastLabel__=75;;}
65679 var $165=__lastLabel__==75?$_pr3:($div);var $cmp244=((($165))|0)>4095;if($cmp244){__label__=77;;}else{__label__=78;;}
65680 if(__label__==77){$value=4095;;}
65681 var $166=$terminator;var $167=$value;var $add247=((($167)+($166))&4294967295);$retval=$add247;__label__=113;break $if_end30$$return$19;}
65682 else if(__label__==79){var $168=$px;var $call250=__ZL16GetSsmlAttributePwPKc($168,((__str102269)&4294967295));$attr1=$call250;var $cmp251=((($call250))|0)!=0;if($cmp251){__label__=80;;}else{__label__=82;;}
65683 $if_then252$$if_end261$107:do{if(__label__==80){var $arraydecay253=(($buf)&4294967295);var $169=$attr1;var $call254=__ZL13attrcopy_utf8PcPKwi($arraydecay253,$169,80);var $arraydecay255=(($buf)&4294967295);var $call256=__Z11AddNameDataPKci($arraydecay255,0);$index=$call256;var $cmp257=((($call256))|0)>=0;if(!($cmp257)){__label__=82;break $if_then252$$if_end261$107;}
65684 var $170=$index;var $171=HEAP32[((_namedata)>>2)];var $arrayidx259=(($171+$170)&4294967295);HEAP32[((__ZL7xmlbase)>>2)]=$arrayidx259;;}}while(0);var $172=$px;var $173=$tag_type;var $call262=__ZL18GetVoiceAttributesPwi($172,$173);var $cmp263=((($call262))|0)==0;if($cmp263){__label__=83;;}else{__label__=84;;}
65685 if(__label__==83){$retval=0;__label__=113;break $if_end30$$return$19;}
65686 else if(__label__==84){$retval=147456;__label__=113;break $if_end30$$return$19;}}
65687 else if(__label__==85){var $174=$px;var $175=$tag_type;var $call267=__ZL18GetVoiceAttributesPwi($174,$175);var $cmp268=((($call267))|0)==0;if($cmp268){__label__=86;;}else{__label__=87;;}
65688 if(__label__==86){$retval=0;__label__=113;break $if_end30$$return$19;}
65689 else if(__label__==87){$retval=147456;__label__=113;break $if_end30$$return$19;}}
65690 else if(__label__==88){while(1){var $176=__lastLabel__==90?$dec:($23);var $cmp272=((($176))|0)>1;if(!($cmp272)){__label__=91;break;}
65691 var $177=HEAP32[((__ZL12n_ssml_stack)>>2)];var $sub273=((($177)-1)&4294967295);var $arrayidx274=((__ZL10ssml_stack+$sub273*76)&4294967295);var $tag_type275=(($arrayidx274)&4294967295);var $178=HEAP32[(($tag_type275)>>2)];var $cmp276=((($178))|0)!=1;if(!($cmp276)){__label__=91;break;}
65692 var $179=HEAP32[((__ZL12n_ssml_stack)>>2)];var $dec=((($179)-1)&4294967295);HEAP32[((__ZL12n_ssml_stack)>>2)]=$dec;__lastLabel__=90;__label__=88;continue;}
65693 var $180=$px;var $181=$tag_type;var $call277=__ZL18GetVoiceAttributesPwi($180,$181);var $add278=((($call277)+524328)&4294967295);$retval=$add278;__label__=113;break $if_end30$$return$19;}
65694 else if(__label__==92){while(1){var $182=__lastLabel__==94?$dec289:($23);var $cmp281=((($182))|0)>1;if(!($cmp281)){__label__=95;break;}
65695 var $183=HEAP32[((__ZL12n_ssml_stack)>>2)];var $sub283=((($183)-1)&4294967295);var $arrayidx284=((__ZL10ssml_stack+$sub283*76)&4294967295);var $tag_type285=(($arrayidx284)&4294967295);var $184=HEAP32[(($tag_type285)>>2)];var $cmp286=((($184))|0)!=2;if(!($cmp286)){__label__=95;break;}
65696 var $185=HEAP32[((__ZL12n_ssml_stack)>>2)];var $dec289=((($185)-1)&4294967295);HEAP32[((__ZL12n_ssml_stack)>>2)]=$dec289;__lastLabel__=94;__label__=92;continue;}
65697 $terminator=0;var $186=$terminator;var $187=$px;var $188=$tag_type;var $call291=__ZL18GetVoiceAttributesPwi($187,$188);var $add292=((($call291)+($186))&4294967295);$retval=$add292;__label__=113;break $if_end30$$return$19;}
65698 else if(__label__==96){$retval=262174;__label__=113;break $if_end30$$return$19;}
65699 else if(__label__==97){var $189=$ssml_sp;var $tag_type295=(($189)&4294967295);var $190=HEAP32[(($tag_type295)>>2)];var $cmp296=((($190))|0)==6;if($cmp296){__label__=98;;}else{__label__=99;;}
65700 if(__label__==98){var $191=$px;var $call298=__ZL18GetVoiceAttributesPwi($191,38);$voice_change_flag=$call298;;}
65701 var $192=$px;var $193=$tag_type;var $call300=__ZL18GetVoiceAttributesPwi($192,$193);var $194=$voice_change_flag;var $or=($194)|($call300);$voice_change_flag=$or;var $195=$voice_change_flag;var $add301=((($195)+524358)&4294967295);$retval=$add301;__label__=113;break $if_end30$$return$19;}
65702 else if(__label__==100){var $196=$ssml_sp;var $tag_type303=(($196)&4294967295);var $197=HEAP32[(($tag_type303)>>2)];var $cmp304=((($197))|0)==6;if($cmp304){__label__=101;;}else{__label__=102;;}
65703 if(__label__==101){var $198=$px;var $call306=__ZL18GetVoiceAttributesPwi($198,38);$voice_change_flag=$call306;;}
65704 var $199=$ssml_sp;var $tag_type308=(($199)&4294967295);var $200=HEAP32[(($tag_type308)>>2)];var $cmp309=((($200))|0)==7;if($cmp309){__label__=103;;}else{__label__=104;;}
65705 if(__label__==103){var $201=$px;var $call311=__ZL18GetVoiceAttributesPwi($201,39);var $202=$voice_change_flag;var $or312=($202)|($call311);$voice_change_flag=$or312;;}
65706 var $203=$px;var $204=$tag_type;var $call314=__ZL18GetVoiceAttributesPwi($203,$204);var $205=$voice_change_flag;var $or315=($205)|($call314);$voice_change_flag=$or315;var $206=$voice_change_flag;var $add316=((($206)+524358)&4294967295);$retval=$add316;__label__=113;break $if_end30$$return$19;}
65707 else if(__label__==105){var $207=$ssml_sp;var $tag_type318=(($207)&4294967295);var $208=HEAP32[(($tag_type318)>>2)];var $cmp319=((($208))|0)==6;if($cmp319){__label__=106;;}else{__label__=107;;}
65708 if(__label__==106){var $209=$px;var $210=$tag_type;var $call321=__ZL18GetVoiceAttributesPwi($209,$210);$voice_change_flag=$call321;;}
65709 var $211=$voice_change_flag;var $add323=((($211)+524328)&4294967295);$retval=$add323;__label__=113;break $if_end30$$return$19;}
65710 else if(__label__==108){var $212=$ssml_sp;var $tag_type325=(($212)&4294967295);var $213=HEAP32[(($tag_type325)>>2)];var $cmp326=((($213))|0)==6;if($cmp326){__label__=110;;}else{__label__=109;;}
65711 $if_then330$$lor_lhs_false327$145:do{if(__label__==109){var $214=$ssml_sp;var $tag_type328=(($214)&4294967295);var $215=HEAP32[(($tag_type328)>>2)];var $cmp329=((($215))|0)==7;if($cmp329){__label__=110;break $if_then330$$lor_lhs_false327$145;}
65712 $retval=524358;__label__=113;break $if_end30$$return$19;}}while(0);var $216=$px;var $217=$tag_type;var $call331=__ZL18GetVoiceAttributesPwi($216,$217);var $add332=((($call331)+524358)&4294967295);$retval=$add332;__label__=113;break $if_end30$$return$19;}}while(0);$retval=0;;}}while(0);var $218=$retval;STACKTOP=__stackBase__;return $218;return null;}
65713 function __ZL13LookupSpecialP10TranslatorPKcPc($tr,$text_out){var __stackBase__=STACKTOP;STACKTOP+=124;_memset(__stackBase__,0,124);var __label__;var $retval;var $tr_addr;var $string_addr;var $text_out_addr;var $flags=__stackBase__;var $phonemes=__stackBase__+8;var $phonemes2=__stackBase__+64;var $string1=__stackBase__+120;$tr_addr=$tr;$string_addr=((__str6303)&4294967295);$text_out_addr=$text_out;var $0=$string_addr;HEAP32[(($string1)>>2)]=$0;var $arrayidx=(($flags+4)&4294967295);HEAP32[(($arrayidx)>>2)]=0;var $arrayidx1=(($flags)&4294967295);HEAP32[(($arrayidx1)>>2)]=0;var $1=$tr_addr;var $arraydecay=(($phonemes)&4294967295);var $arraydecay2=(($flags)&4294967295);var $call=__Z14LookupDictListP10TranslatorPPcS1_PjiP8WORD_TAB($1,$string1,$arraydecay,$arraydecay2,0,0);var $tobool=((($call))|0)!=0;if($tobool){__label__=1;;}else{__label__=2;;}
65714 if(__label__==1){var $2=$tr_addr;var $arraydecay3=(($phonemes)&4294967295);var $arraydecay4=(($flags)&4294967295);__Z13SetWordStressP10TranslatorPcPjii($2,$arraydecay3,$arraydecay4,-1,0);var $arraydecay5=(($phonemes)&4294967295);var $arraydecay6=(($phonemes2)&4294967295);__Z14DecodePhonemesPKcPc($arraydecay5,$arraydecay6);var $3=$text_out_addr;var $arraydecay7=(($phonemes2)&4294967295);var $call8=_sprintf($3,((__str60227)&4294967295),allocate([$arraydecay7,0,0,0],["i8*",0,0,0],ALLOC_STACK));var $4=$text_out_addr;$retval=$4;;}
65715 else if(__label__==2){$retval=0;;}
65716 var $5=$retval;STACKTOP=__stackBase__;return $5;return null;}
65717 function __ZL10RemoveCharPc($p){var __stackBase__=STACKTOP;STACKTOP+=4;_memset(__stackBase__,0,4);var __label__;var $p_addr;var $c=__stackBase__;$p_addr=$p;var $0=$p_addr;var $1=$p_addr;var $call=__Z7utf8_inPiPKc($c,$1);var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=$0;$stop$=$dest$+$call;$value4$=32;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=32;}
65718 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
65719 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=32;};STACKTOP=__stackBase__;return;return;}
65720 function __ZL19AnnouncePunctuationP10TranslatoriPiPcS1_i($tr,$c1,$c2_ptr,$output,$bufix,$end_clause){var __stackBase__=STACKTOP;STACKTOP+=280;_memset(__stackBase__,0,280);var __label__;var $retval;var $tr_addr;var $c1_addr;var $c2_ptr_addr;var $output_addr;var $bufix_addr;var $end_clause_addr;var $punct_count;var $punctname;var $found;var $soundicon;var $attributes;var $short_pause;var $c2;var $len;var $bufix1;var $buf=__stackBase__;var $buf2=__stackBase__+200;$tr_addr=$tr;$c1_addr=$c1;$c2_ptr_addr=$c2_ptr;$output_addr=$output;$bufix_addr=$bufix;$end_clause_addr=$end_clause;$found=0;var $0=$c2_ptr_addr;var $1=HEAP32[(($0)>>2)];$c2=$1;var $arrayidx=(($buf)&4294967295);HEAP8[($arrayidx)]=0;var $2=$c1_addr;var $call=__ZL15LookupSoundiconi($2);$soundicon=$call;var $cmp=((($call))|0)>=0;if($cmp){__label__=1;;}else{__label__=2;;}
65721 $if_end63_thread$$if_else$2:do{if(__label__==1){var $arraydecay=(($buf)&4294967295);var $3=$soundicon;var $call1=_sprintf($arraydecay,((__str50217)&4294967295),allocate([$3,0,0,0],["i32",0,0,0],ALLOC_STACK));var $4=$c2;__ZL6UngetCi($4);$found=1;__label__=26;break $if_end63_thread$$if_else$2;}
65722 else if(__label__==2){var $5=$tr_addr;var $6=$c1_addr;__ZL14LookupCharNameP10Translatorii($5,$6,0);$punctname=((__ZZL14LookupCharNameP10TranslatoriiE3buf)&4294967295);$found=1;var $7=$bufix_addr;var $8=HEAP32[(($7)>>2)];var $cmp5=((($8))|0)==0;if($cmp5){__label__=5;;}else{__label__=3;;}
65723 $if_then9$$lor_lhs_false$5:do{if(__label__==3){var $9=$end_clause_addr;var $cmp6=((($9))|0)==0;if($cmp6){__label__=5;break $if_then9$$lor_lhs_false$5;}
65724 var $10=$tr_addr;var $langopts=(($10)&4294967295);var $param=(($langopts+24)&4294967295);var $arrayidx8=(($param+68)&4294967295);var $11=HEAP32[(($arrayidx8)>>2)];var $and=($11)&2;var $tobool=((($and))|0)!=0;if($tobool){__label__=5;break $if_then9$$lor_lhs_false$5;}
65725 var $34=$c2;__ZL6UngetCi($34);var $35=HEAP32[((_option_ssml)>>2)];var $tobool51=((($35))|0)!=0;if($tobool51){__label__=21;;}else{__label__=23;;}
65726 $if_then52$$if_end58$9:do{if(__label__==21){var $36=$c1_addr;var $cmp53=((($36))|0)==60;var $37=$c1_addr;var $cmp55=((($37))|0)==38;var $or_cond=($cmp53)|($cmp55);if(!($or_cond)){__label__=23;break $if_then52$$if_end58$9;}
65727 var $38=$c1_addr;HEAP32[((__ZL19ssml_ignore_l_angle)>>2)]=$38;;}}while(0);var $39=$c1_addr;HEAP32[((__ZL11ungot_char2)>>2)]=$39;var $arrayidx59=(($buf)&4294967295);HEAP8[($arrayidx59)]=32;var $arrayidx60=(($buf+1)&4294967295);HEAP8[($arrayidx60)]=0;__label__=24;break $if_then9$$lor_lhs_false$5;}}while(0);$if_then9$$if_end63$13:do{if(__label__==5){$punct_count=1;var $12=$c2;var $13=$c1_addr;var $cmp105=((($12))|0)==((($13))|0);var $14=$c1_addr;var $cmp116=((($14))|0)!=60;var $or_cond17=($cmp105)&($cmp116);if($or_cond17){__label__=6;;}else{__label__=7;;}
65728 $while_body$$while_end$15:do{if(__label__==6){while(1){var $15=$punct_count;var $inc=((($15)+1)&4294967295);$punct_count=$inc;var $call12=__ZL4GetCv();$c2=$call12;var $16=$c2;var $17=$c1_addr;var $cmp10=((($16))|0)==((($17))|0);var $18=$c1_addr;var $cmp11=((($18))|0)!=60;var $or_cond1=($cmp10)&($cmp11);if($or_cond1){__label__=6;continue;}else{__label__=7;break $while_body$$while_end$15;}}}}while(0);var $19=$c2;var $20=$c2_ptr_addr;HEAP32[(($20)>>2)]=$19;var $21=$end_clause_addr;var $tobool13=((($21))|0)!=0;if($tobool13){__label__=8;;}else{__label__=9;;}
65729 if(__label__==8){var $22=$c2;__ZL6UngetCi($22);;}
65730 var $23=$punct_count;var $cmp15=((($23))|0)==1;if($cmp15){__label__=10;;}else{__label__=11;;}
65731 if(__label__==10){var $arraydecay17=(($buf)&4294967295);var $24=$punctname;var $call18=_sprintf($arraydecay17,((__str51218)&4294967295),allocate([$24,0,0,0],["i8*",0,0,0],ALLOC_STACK));;}
65732 else if(__label__==11){var $25=$punct_count;var $cmp20=((($25))|0)<4;var $arrayidx22=(($buf)&4294967295);if($cmp20){__label__=12;;}else{__label__=19;;}
65733 if(__label__==12){HEAP8[($arrayidx22)]=0;var $26=HEAP32[((((_embedded_value+8)&4294967295))>>2)];var $cmp23=((($26))|0)<300;if($cmp23){__label__=13;;}else{__label__=14;;}
65734 if(__label__==13){var $arraydecay25=(($buf)&4294967295);var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=((__str52219)&4294967295);$dest$=$arraydecay25;$stop$=$src$+6;if(($dest$%4)==($src$%4)&&6>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
65735 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
65736 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};;}
65737 var $27=$punct_count;var $dec3=((($27)-1)&4294967295);$punct_count=$dec3;var $cmp294=((($27))|0)>0;if($cmp294){__label__=15;;}else{__label__=17;;}
65738 $while_body30_lr_ph$$while_end36$30:do{if(__label__==15){var $arraydecay31=(($buf2)&4294967295);var $arraydecay33=(($buf)&4294967295);var $arraydecay34=(($buf2)&4294967295);;while(1){var $28=$punctname;var $call32=_sprintf($arraydecay31,((__str51218)&4294967295),allocate([$28,0,0,0],["i8*",0,0,0],ALLOC_STACK));var $call35=_strcat($arraydecay33,$arraydecay34);var $29=$punct_count;var $dec=((($29)-1)&4294967295);$punct_count=$dec;var $cmp29=((($29))|0)>0;if($cmp29){__label__=16;continue;}else{__label__=17;break $while_body30_lr_ph$$while_end36$30;}}}}while(0);var $30=HEAP32[((((_embedded_value+8)&4294967295))>>2)];var $cmp37=((($30))|0)<300;if(!($cmp37)){__label__=24;break $if_then9$$if_end63$13;}
65739 var $arraydecay39=(($buf2)&4294967295);var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=((__str53220)&4294967295);$dest$=$arraydecay39;$stop$=$src$+7;if(($dest$%4)==($src$%4)&&7>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
65740 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
65741 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $arraydecay41=(($buf)&4294967295);var $arraydecay42=(($buf2)&4294967295);var $call43=_strcat($arraydecay41,$arraydecay42);;}
65742 else if(__label__==19){var $31=$punctname;var $32=$punct_count;var $33=$punctname;var $call47=_sprintf($arrayidx22,((__str54221)&4294967295),allocate([$31,0,0,0,$32,0,0,0,$33,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0],ALLOC_STACK));;}}}}while(0);var $_pr=$found;var $cmp64=((($_pr))|0)==0;if(!($cmp64)){__label__=26;break $if_end63_thread$$if_else$2;}
65743 $retval=-1;__label__=40;break $if_end63_thread$$if_else$2;}}while(0);$if_end66$$return$39:do{if(__label__==26){var $40=$bufix_addr;var $41=HEAP32[(($40)>>2)];$bufix1=$41;var $arraydecay67=(($buf)&4294967295);var $call68=_strlen($arraydecay67);$len=$call68;var $42=$bufix_addr;var $43=HEAP32[(($42)>>2)];var $44=$output_addr;var $arrayidx69=(($44+$43)&4294967295);var $arraydecay70=(($buf)&4294967295);var $call71=_strcpy($arrayidx69,$arraydecay70);var $45=$len;var $46=$bufix_addr;var $47=HEAP32[(($46)>>2)];var $add=((($47)+($45))&4294967295);HEAP32[(($46)>>2)]=$add;var $48=$end_clause_addr;var $cmp72=((($48))|0)==0;if($cmp72){__label__=27;;}else{__label__=28;;}
65744 if(__label__==27){$retval=-1;;}
65745 else if(__label__==28){var $49=$c1_addr;var $cmp75=((($49))|0)==45;if($cmp75){__label__=29;;}else{__label__=30;;}
65746 if(__label__==29){$retval=16384;;}
65747 else if(__label__==30){var $50=$c1_addr;var $call78=__Z11lookupwcharPKti(((__ZL11punct_chars)&4294967295),$50);var $arrayidx79=((__ZL16punct_attributes+$call78*4)&4294967295);var $51=HEAP32[(($arrayidx79)>>2)];$attributes=$51;$short_pause=262148;var $52=$attributes;var $and80=($52)&28672;var $cmp81=((($and80))|0)==4096;if($cmp81){__label__=31;;}else{__label__=32;;}
65748 if(__label__==31){$short_pause=266244;;}
65749 var $53=$bufix1;var $cmp84=((($53))|0)>0;if($cmp84){__label__=33;;}else{__label__=37;;}
65750 $land_lhs_true$$if_end95$50:do{if(__label__==33){var $54=$tr_addr;var $langopts85=(($54)&4294967295);var $param86=(($langopts85+24)&4294967295);var $arrayidx87=(($param86+68)&4294967295);var $55=HEAP32[(($arrayidx87)>>2)];var $and88=($55)&2;var $tobool89=((($and88))|0)!=0;if($tobool89){__label__=37;break $land_lhs_true$$if_end95$50;}
65751 var $56=$attributes;var $and91=($56)&-32769;var $cmp92=((($and91))|0)==266270;if($cmp92){__label__=35;;}else{__label__=36;;}
65752 if(__label__==35){$retval=262148;__label__=40;break $if_end66$$return$39;}
65753 else if(__label__==36){var $57=$short_pause;$retval=$57;__label__=40;break $if_end66$$return$39;}}}while(0);var $58=$attributes;var $and96=($58)&524288;var $tobool97=((($and96))|0)!=0;if($tobool97){__label__=38;;}else{__label__=39;;}
65754 if(__label__==38){var $59=$attributes;$retval=$59;;}
65755 else if(__label__==39){var $60=$short_pause;$retval=$60;;}}}}}while(0);var $61=$retval;STACKTOP=__stackBase__;return $61;return null;}
65756 function __ZL14LookupCharNameP10Translatorii($tr,$c,$only){var __stackBase__=STACKTOP;STACKTOP+=156;_memset(__stackBase__,0,156);var __label__;var $tr_addr;var $c_addr;var $only_addr;var $ix;var $flags=__stackBase__;var $single_letter=__stackBase__+8;var $phonemes=__stackBase__+32;var $phonemes2=__stackBase__+92;var $lang_name;var $string=__stackBase__+152;$tr_addr=$tr;$c_addr=$c;$only_addr=$only;$lang_name=0;HEAP8[(((__ZZL14LookupCharNameP10TranslatoriiE3buf)&4294967295))]=0;var $arrayidx=(($flags)&4294967295);HEAP32[(($arrayidx)>>2)]=0;var $arrayidx1=(($flags+4)&4294967295);HEAP32[(($arrayidx1)>>2)]=0;var $arrayidx2=(($single_letter)&4294967295);HEAP8[($arrayidx2)]=0;var $arrayidx3=(($single_letter+1)&4294967295);HEAP8[($arrayidx3)]=95;var $0=$c_addr;var $arrayidx4=(($single_letter+2)&4294967295);var $call=__Z8utf8_outjPc($0,$arrayidx4);$ix=$call;var $1=$ix;var $add=((($1)+2)&4294967295);var $arrayidx5=(($single_letter+$add)&4294967295);HEAP8[($arrayidx5)]=0;var $2=$only_addr;var $tobool=((($2))|0)!=0;if($tobool){__label__=1;;}else{__label__=2;;}
65757 $if_then$$if_else$2:do{if(__label__==1){var $arrayidx6=(($single_letter+2)&4294967295);HEAP32[(($string)>>2)]=$arrayidx6;var $3=$tr_addr;var $arraydecay=(($phonemes)&4294967295);var $arraydecay7=(($flags)&4294967295);var $call8=__Z14LookupDictListP10TranslatorPPcS1_PjiP8WORD_TAB($3,$string,$arraydecay,$arraydecay7,0,0);;}
65758 else if(__label__==2){var $arrayidx9=(($single_letter+1)&4294967295);HEAP32[(($string)>>2)]=$arrayidx9;var $4=$tr_addr;var $arraydecay10=(($phonemes)&4294967295);var $arraydecay11=(($flags)&4294967295);var $call12=__Z14LookupDictListP10TranslatorPPcS1_PjiP8WORD_TAB($4,$string,$arraydecay10,$arraydecay11,0,0);var $cmp=((($call12))|0)==0;if(!($cmp)){__label__=5;break $if_then$$if_else$2;}
65759 var $arrayidx14=(($single_letter+2)&4294967295);HEAP32[(($string)>>2)]=$arrayidx14;var $5=$tr_addr;var $arraydecay15=(($phonemes)&4294967295);var $arraydecay16=(($flags)&4294967295);var $call17=__Z14LookupDictListP10TranslatorPPcS1_PjiP8WORD_TAB($5,$string,$arraydecay15,$arraydecay16,0,0);var $cmp18=((($call17))|0)==0;if(!($cmp18)){__label__=5;break $if_then$$if_else$2;}
65760 var $arrayidx20=(($single_letter+1)&4294967295);HEAP8[($arrayidx20)]=32;var $6=$tr_addr;var $arrayidx21=(($single_letter+2)&4294967295);var $arraydecay22=(($phonemes)&4294967295);var $call23=__Z14TranslateRulesP10TranslatorPcS1_iS1_iPj($6,$arrayidx21,$arraydecay22,60,0,0,0);;}}while(0);var $7=$only_addr;var $cmp26=((($7))|0)==0;if($cmp26){__label__=6;;}else{__label__=13;;}
65761 $land_lhs_true$$if_end50$8:do{if(__label__==6){var $arrayidx27=(($phonemes)&4294967295);var $8=HEAP8[($arrayidx27)];var $conv=(tempInt=(($8)),(tempInt>=128?tempInt-256:tempInt));var $cmp28=((($conv))|0)==0;if(!($cmp28)){__label__=13;break $land_lhs_true$$if_end50$8;}
65762 var $9=$tr_addr;var $translator_name=(($9+280)&4294967295);var $10=HEAP32[(($translator_name)>>2)];var $cmp30=((($10))|0)!=25966;if(!($cmp30)){__label__=13;break $land_lhs_true$$if_end50$8;}
65763 var $call32=__Z14SetTranslator2PKc(((__str52704)&4294967295));var $arrayidx33=(($single_letter+1)&4294967295);HEAP32[(($string)>>2)]=$arrayidx33;var $arrayidx34=(($single_letter+1)&4294967295);HEAP8[($arrayidx34)]=95;var $11=HEAP32[((_translator2)>>2)];var $arraydecay35=(($phonemes)&4294967295);var $arraydecay36=(($flags)&4294967295);var $call37=__Z14LookupDictListP10TranslatorPPcS1_PjiP8WORD_TAB($11,$string,$arraydecay35,$arraydecay36,0,0);var $cmp38=((($call37))|0)==0;if($cmp38){__label__=9;;}else{__label__=10;;}
65764 if(__label__==9){var $arrayidx40=(($single_letter+2)&4294967295);HEAP32[(($string)>>2)]=$arrayidx40;var $12=HEAP32[((_translator2)>>2)];var $arraydecay41=(($phonemes)&4294967295);var $arraydecay42=(($flags)&4294967295);var $call43=__Z14LookupDictListP10TranslatorPPcS1_PjiP8WORD_TAB($12,$string,$arraydecay41,$arraydecay42,0,0);;}
65765 var $arrayidx45=(($phonemes)&4294967295);var $13=HEAP8[($arrayidx45)];var $tobool46=(tempInt=(($13)),(tempInt>=128?tempInt-256:tempInt))!=0;if($tobool46){__label__=11;;}else{__label__=12;;}
65766 if(__label__==11){$lang_name=((__str52704)&4294967295);;}
65767 else if(__label__==12){var $14=HEAP32[((_voice)>>2)];var $phoneme_tab_ix=(($14+40)&4294967295);var $15=HEAP32[(($phoneme_tab_ix)>>2)];__Z18SelectPhonemeTablei($15);;}}}while(0);var $arrayidx51=(($phonemes)&4294967295);var $16=HEAP8[($arrayidx51)];var $tobool52=(tempInt=(($16)),(tempInt>=128?tempInt-256:tempInt))!=0;if($tobool52){__label__=14;;}else{__label__=17;;}
65768 $if_then53$$if_else73$19:do{if(__label__==14){var $17=$lang_name;var $tobool54=((($17))|0)!=0;if($tobool54){__label__=15;;}else{__label__=16;;}
65769 if(__label__==15){var $18=HEAP32[((_translator2)>>2)];var $arraydecay56=(($phonemes)&4294967295);var $arraydecay57=(($flags)&4294967295);__Z13SetWordStressP10TranslatorPcPjii($18,$arraydecay56,$arraydecay57,-1,0);var $arraydecay58=(($phonemes)&4294967295);var $arraydecay59=(($phonemes2)&4294967295);__Z14DecodePhonemesPKcPc($arraydecay58,$arraydecay59);var $arraydecay60=(($phonemes2)&4294967295);var $19=$tr_addr;var $translator_name61=(($19+280)&4294967295);var $20=HEAP32[(($translator_name61)>>2)];__ZL13WordToString2j($20);var $call63=_sprintf(((__ZZL14LookupCharNameP10TranslatoriiE3buf)&4294967295),((__str47214)&4294967295),allocate([((__str52704)&4294967295),0,0,0,$arraydecay60,0,0,0,((__ZZL13WordToString2jE3buf)&4294967295),0,0,0],["i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));var $21=HEAP32[((_voice)>>2)];var $phoneme_tab_ix64=(($21+40)&4294967295);var $22=HEAP32[(($phoneme_tab_ix64)>>2)];__Z18SelectPhonemeTablei($22);;}
65770 else if(__label__==16){var $23=$tr_addr;var $arraydecay66=(($phonemes)&4294967295);var $arraydecay67=(($flags)&4294967295);__Z13SetWordStressP10TranslatorPcPjii($23,$arraydecay66,$arraydecay67,-1,0);var $arraydecay68=(($phonemes)&4294967295);var $arraydecay69=(($phonemes2)&4294967295);__Z14DecodePhonemesPKcPc($arraydecay68,$arraydecay69);var $arraydecay70=(($phonemes2)&4294967295);var $call71=_sprintf(((__ZZL14LookupCharNameP10TranslatoriiE3buf)&4294967295),((__str48215)&4294967295),allocate([$arraydecay70,0,0,0],["i8*",0,0,0],ALLOC_STACK));;}}
65771 else if(__label__==17){var $24=$only_addr;var $cmp74=((($24))|0)==0;if(!($cmp74)){__label__=19;break $if_then53$$if_else73$19;}
65772 var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=((__str49216)&4294967295);$dest$=((__ZZL14LookupCharNameP10TranslatoriiE3buf)&4294967295);$stop$=$src$+17;if(($dest$%4)==($src$%4)&&17>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
65773 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
65774 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};;}}while(0);STACKTOP=__stackBase__;return;return;}
65775 function __ZL8IsRomanUj($c){;var __label__;var $retval;var $c_addr;$c_addr=$c;var $0=$c_addr;var $cmp=((($0))|0)==73;var $1=$c_addr;var $cmp1=((($1))|0)==86;var $or_cond=($cmp)|($cmp1);var $2=$c_addr;var $cmp3=((($2))|0)==88;var $or_cond1=($or_cond)|($cmp3);var $3=$c_addr;var $cmp5=((($3))|0)==76;var $or_cond2=($or_cond1)|($cmp5);if($or_cond2){__label__=1;;}else{__label__=2;;}
65776 if(__label__==1){$retval=1;;}
65777 else if(__label__==2){$retval=0;;}
65778 var $4=$retval;;return $4;return null;}
65779 function __Z12InitNamedatav(){;var __label__;HEAP32[((__ZL11namedata_ix)>>2)]=0;var $0=HEAP32[((_namedata)>>2)];var $cmp=((($0))|0)!=0;if($cmp){__label__=1;;}else{__label__=2;;}
65780 if(__label__==1){var $1=HEAP32[((_namedata)>>2)];;HEAP32[((_namedata)>>2)]=0;HEAP32[((__ZL10n_namedata)>>2)]=0;;};return;return;}
65781 function __Z9InitText2v(){;var __label__;var $param;HEAP32[((__ZL10ungot_char)>>2)]=0;HEAP32[((__ZL11ungot_char2)>>2)]=0;HEAP32[((__ZL12n_ssml_stack)>>2)]=1;HEAP32[((__ZL13n_param_stack)>>2)]=1;HEAP32[((((__ZL10ssml_stack)&4294967295))>>2)]=0;$param=0;;while(1){var $0=$param;var $arrayidx=((((_param_stack+4)&4294967295)+$0*4)&4294967295);var $1=HEAP32[(($arrayidx)>>2)];var $2=$param;var $arrayidx1=((__ZL17speech_parameters+$2*4)&4294967295);HEAP32[(($arrayidx1)>>2)]=$1;var $3=$param;var $inc=((($3)+1)&4294967295);$param=$inc;var $cmp=((($inc))|0)<15;if($cmp){__label__=1;continue;}else{__label__=2;break;}}
65782 var $4=HEAP32[((((__ZL17speech_parameters+20)&4294967295))>>2)];HEAP32[((_option_punctuation)>>2)]=$4;var $5=HEAP32[((((__ZL17speech_parameters+24)&4294967295))>>2)];HEAP32[((_option_capitals)>>2)]=$5;HEAP8[(((__ZL16current_voice_id)&4294967295))]=0;HEAP8[(__ZL11ignore_text_b)]=0;HEAP8[(__ZL10audio_text_b)]=0;HEAP8[(__ZL19clear_skipping_text_b)]=0;HEAP32[((_count_characters)>>2)]=-1;HEAP32[((__ZL10sayas_mode)>>2)]=0;HEAP32[((__ZL7xmlbase)>>2)]=0;;return;return;}
65783 function __ZL13WordToString2j($word){;var __label__;var $word_addr;var $ix;var $p;$word_addr=$word;$p=((__ZZL13WordToString2jE3buf)&4294967295);$ix=3;;while(1){var $0=$word_addr;var $1=$ix;var $mul=((($1)*8)&4294967295);var $shr=($0)>>>((($mul))>>>0);var $conv=((($shr))&255);var $2=$p;HEAP8[($2)]=$conv;var $conv1=(tempInt=(($conv)),(tempInt>=128?tempInt-256:tempInt));var $cmp2=((($conv1))|0)!=0;if($cmp2){__label__=2;;}else{__label__=3;;}
65784 if(__label__==2){var $3=$p;var $incdec_ptr=(($3+1)&4294967295);$p=$incdec_ptr;;}
65785 var $4=$ix;var $dec=((($4)-1)&4294967295);$ix=$dec;var $cmp=((($dec))|0)>=0;if($cmp){__label__=1;continue;}else{__label__=4;break;}}
65786 var $5=$p;HEAP8[($5)]=0;;return;return;}
65787 function __ZL15LookupSoundiconi($c){;var __label__;var $retval;var $c_addr;var $ix;$c_addr=$c;$ix=4;;$for_cond$2:while(1){var $0=$ix;var $1=HEAP32[((_n_soundicon_tab)>>2)];var $cmp=((($0))|0)<((($1))|0);if(!($cmp)){__label__=8;break $for_cond$2;}
65788 var $2=$ix;var $arrayidx=((_soundicon_tab+$2*16)&4294967295);var $name=(($arrayidx)&4294967295);var $3=HEAP32[(($name)>>2)];var $4=$c_addr;var $cmp1=((($3))|0)==((($4))|0);var $5=$ix;if($cmp1){__label__=3;break $for_cond$2;}
65789 var $inc=((($5)+1)&4294967295);$ix=$inc;__label__=1;continue $for_cond$2;}
65790 $for_end$$if_then$6:do{if(__label__==8){$retval=-1;;}
65791 else if(__label__==3){var $arrayidx2=((_soundicon_tab+$5*16)&4294967295);var $length=(($arrayidx2+4)&4294967295);var $6=HEAP32[(($length)>>2)];var $cmp3=((($6))|0)==0;if($cmp3){__label__=4;;}else{__label__=6;;}
65792 $if_then4$$if_end7$9:do{if(__label__==4){var $7=$ix;var $call=__ZL13LoadSoundFilePKci(0,$7);var $cmp5=((($call))|0)!=0;if(!($cmp5)){__label__=6;break $if_then4$$if_end7$9;}
65793 $retval=-1;__label__=9;break $for_end$$if_then$6;}}while(0);var $8=$ix;$retval=$8;;}}while(0);var $9=$retval;;return $9;return null;}
65794 function __ZL13LoadSoundFilePKci($fname,$index){var __stackBase__=STACKTOP;STACKTOP+=764;_memset(__stackBase__,0,764);var __label__;var $retval;var $fname_addr;var $index_addr;var $f;var $p;var $ip;var $length;var $fname_temp=__stackBase__;var $fname2=__stackBase__+100;var $ix;var $fd_temp;var $resample;var $header=__stackBase__+304;var $command=__stackBase__+316;$fname_addr=$fname;$index_addr=$index;var $0=$fname_addr;var $cmp=((($0))|0)==0;if($cmp){__label__=1;;}else{__label__=3;;}
65795 $if_end$$if_end3$2:do{if(__label__==1){var $1=$index_addr;var $arrayidx=((_soundicon_tab+$1*16)&4294967295);var $filename=(($arrayidx+12)&4294967295);var $2=HEAP32[(($filename)>>2)];$fname_addr=$2;var $cmp1=((($2))|0)==0;if(!($cmp1)){__label__=3;break $if_end$$if_end3$2;}
65796 $retval=1;__label__=23;break $if_end$$if_end3$2;}}while(0);$return$$if_end3$5:do{if(__label__==3){var $3=$fname_addr;var $arrayidx4=(($3)&4294967295);var $4=HEAP8[($arrayidx4)];var $conv=(tempInt=(($4)),(tempInt>=128?tempInt-256:tempInt));var $cmp5=((($conv))|0)!=47;if($cmp5){__label__=4;;}else{__label__=5;;}
65797 if(__label__==4){var $arraydecay=(($fname2)&4294967295);var $5=$fname_addr;var $call=_sprintf($arraydecay,((__str55222)&4294967295),allocate([((_path_home)&4294967295),0,0,0,47,0,0,0,47,0,0,0,$5,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0],ALLOC_STACK));var $arraydecay7=(($fname2)&4294967295);$fname_addr=$arraydecay7;;}
65798 $f=0;var $6=$fname_addr;var $call9=_fopen($6,((__str18429)&4294967295));$f=$call9;var $cmp10=((($call9))|0)!=0;if($cmp10){__label__=6;;}else{__label__=18;;}
65799 $if_then11$$if_then49$10:do{if(__label__==6){var $7=$f;var $call12=_fseek($7,20,0);$ix=0;;$for_body$12:while(1){var $8=$f;var $call14=__Z10Read4BytesP7__sFILE($8);var $9=$ix;var $arrayidx15=(($header+$9*4)&4294967295);HEAP32[(($arrayidx15)>>2)]=$call14;var $10=$ix;var $inc=((($10)+1)&4294967295);$ix=$inc;var $cmp13=((($inc))|0)<3;if($cmp13){__label__=7;continue $for_body$12;}else{__label__=8;break $for_body$12;}}
65800 var $arrayidx16=(($header)&4294967295);var $11=HEAP32[(($arrayidx16)>>2)];var $cmp17=((($11))|0)!=65537;if($cmp17){__label__=11;;}else{__label__=9;;}
65801 $if_then23$$lor_lhs_false$15:do{if(__label__==9){var $arrayidx18=(($header+4)&4294967295);var $12=HEAP32[(($arrayidx18)>>2)];var $13=HEAP32[((_samplerate)>>2)];var $cmp19=((($12))|0)!=((($13))|0);if($cmp19){__label__=11;break $if_then23$$lor_lhs_false$15;}
65802 var $arrayidx21=(($header+8)&4294967295);var $14=HEAP32[(($arrayidx21)>>2)];var $15=HEAP32[((_samplerate)>>2)];var $mul=((($15)*2)&4294967295);var $cmp22=((($14))|0)!=((($mul))|0);if($cmp22){__label__=11;break $if_then23$$lor_lhs_false$15;}else{__label__=17;break $if_then23$$lor_lhs_false$15;}}}while(0);$if_then23$$if_end47$18:do{if(__label__==11){var $16=$f;var $call24=_fclose($16);$f=0;var $arrayidx25=(($header+8)&4294967295);var $17=HEAP32[(($arrayidx25)>>2)];var $18=HEAP32[((_samplerate)>>2)];var $cmp26=((($17))|0)==((($18))|0);if($cmp26){__label__=12;;}else{__label__=13;;}
65803 if(__label__==12){$resample=((__str13643)&4294967295);;}
65804 else if(__label__==13){$resample=((__str57224)&4294967295);;}
65805 var $arraydecay29=(($fname_temp)&4294967295);var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=((__str58225)&4294967295);$dest$=$arraydecay29;$stop$=$src$+18;if(($dest$%4)==($src$%4)&&18>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
65806 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
65807 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $arraydecay31=(($fname_temp)&4294967295);var $call32=_mkstemp($arraydecay31);$fd_temp=$call32;var $cmp33=((($call32))|0)>=0;if(!($cmp33)){__label__=17;break $if_then23$$if_end47$18;}
65808 var $19=$fd_temp;var $call35=_close($19);var $arraydecay36=(($command)&4294967295);var $20=$fname_addr;var $21=HEAP32[((_samplerate)>>2)];var $arraydecay37=(($fname_temp)&4294967295);var $22=$resample;var $call38=_sprintf($arraydecay36,((__str59226)&4294967295),allocate([$20,0,0,0,$21,0,0,0,$arraydecay37,0,0,0,$22,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));var $arraydecay39=(($command)&4294967295);var $call40=_system($arraydecay39);var $cmp41=((($call40))|0)==0;if(!($cmp41)){__label__=17;break $if_then23$$if_end47$18;}
65809 var $arraydecay43=(($fname_temp)&4294967295);$fname_addr=$arraydecay43;;}}while(0);var $_pr=$f;var $cmp48=((($_pr))|0)==0;if($cmp48){__label__=18;break $if_then11$$if_then49$10;}else{__label__=20;break $if_then11$$if_then49$10;}}}while(0);$if_then49$$if_end54$27:do{if(__label__==18){var $23=$fname_addr;var $call50=_fopen($23,((__str18429)&4294967295));$f=$call50;var $cmp51=((($call50))|0)==0;if(!($cmp51)){__label__=20;break $if_then49$$if_end54$27;}
65810 $retval=3;__label__=23;break $return$$if_end3$5;}}while(0);var $24=$fname_addr;var $call55=__Z13GetFileLengthPKc($24);$length=$call55;var $25=$f;var $call56=_fseek($25,0,0);var $26=$index_addr;var $arrayidx57=((_soundicon_tab+$26*16)&4294967295);var $data=(($arrayidx57+8)&4294967295);var $27=HEAP32[(($data)>>2)];var $28=$length;var $call58=_realloc($27,$28);$p=$call58;var $cmp59=((($call58))|0)==0;if($cmp59){__label__=21;;}else{__label__=22;;}
65811 if(__label__==21){var $29=$f;var $call61=_fclose($29);$retval=4;;}
65812 else if(__label__==22){var $30=$p;var $31=$length;var $32=$f;var $call63=_fread($30,1,$31,$32);$length=$call63;var $33=$f;var $call64=_fclose($33);var $arraydecay65=(($fname_temp)&4294967295);var $call66=_remove($arraydecay65);var $34=$p;var $arrayidx67=(($34+40)&4294967295);var $35=$arrayidx67;$ip=$35;var $36=$ip;var $37=HEAP32[(($36)>>2)];var $div=((((($37))|0)/2)|0);var $38=$index_addr;var $arrayidx68=((_soundicon_tab+$38*16)&4294967295);var $length69=(($arrayidx68+4)&4294967295);HEAP32[(($length69)>>2)]=$div;var $39=$p;var $40=$index_addr;var $arrayidx70=((_soundicon_tab+$40*16)&4294967295);var $data71=(($arrayidx70+8)&4294967295);HEAP32[(($data71)>>2)]=$39;$retval=0;;}}}while(0);var $41=$retval;STACKTOP=__stackBase__;return $41;return null;}
65813 function __ZL14PushParamStacki($tag_type){;var __label__;var $tag_type_addr;var $ix;var $sp;$tag_type_addr=$tag_type;var $0=HEAP32[((__ZL13n_param_stack)>>2)];var $arrayidx=((_param_stack+$0*64)&4294967295);$sp=$arrayidx;var $cmp=((($0))|0)<19;if($cmp){__label__=1;;}else{__label__=2;;}
65814 if(__label__==1){var $1=HEAP32[((__ZL13n_param_stack)>>2)];var $inc=((($1)+1)&4294967295);HEAP32[((__ZL13n_param_stack)>>2)]=$inc;;}
65815 var $2=$tag_type_addr;var $3=$sp;var $type=(($3)&4294967295);HEAP32[(($type)>>2)]=$2;$ix=0;;while(1){var $4=$ix;var $5=$sp;var $parameter=(($5+4)&4294967295);var $arrayidx2=(($parameter+$4*4)&4294967295);HEAP32[(($arrayidx2)>>2)]=-1;var $6=$ix;var $inc3=((($6)+1)&4294967295);$ix=$inc3;var $cmp1=((($inc3))|0)<15;if($cmp1){__label__=3;continue;}else{__label__=4;break;}}
65816 var $7=$sp;;return $7;return null;}
65817 function __ZL16GetSsmlAttributePwPKc($pw,$name){;var __label__;var __lastLabel__=null;var $retval;var $pw_addr;var $name_addr;var $ix;$pw_addr=$pw;$name_addr=$name;;$while_cond$2:while(1){var $0=$pw_addr;var $1=HEAP32[(($0)>>2)];var $cmp=((($1))|0)!=0;if(!($cmp)){__label__=17;break $while_cond$2;}
65818 var $2=$pw_addr;var $arrayidx=(($2+-4)&4294967295);var $3=HEAP32[(($arrayidx)>>2)];var $call=_iswspace($3);var $tobool=((($call))|0)!=0;if($tobool){__label__=3;;}else{__label__=16;;}
65819 if(__label__==3){$ix=0;var $4=$pw_addr;var $5=HEAP32[(($4)>>2)];var $6=$ix;var $7=$name_addr;var $arrayidx27=(($7+$6)&4294967295);var $8=HEAP8[($arrayidx27)];var $conv8=(tempInt=(($8)),(tempInt>=128?tempInt-256:tempInt));var $cmp39=((($5))|0)==((($conv8))|0);if($cmp39){__label__=4;;}else{__label__=5;;}
65820 $while_body4$$while_end$7:do{if(__label__==4){while(1){var $9=$pw_addr;var $incdec_ptr=(($9+4)&4294967295);$pw_addr=$incdec_ptr;var $10=$ix;var $inc=((($10)+1)&4294967295);$ix=$inc;var $11=$pw_addr;var $12=HEAP32[(($11)>>2)];var $13=$ix;var $14=$name_addr;var $arrayidx2=(($14+$13)&4294967295);var $15=HEAP8[($arrayidx2)];var $conv=(tempInt=(($15)),(tempInt>=128?tempInt-256:tempInt));var $cmp3=((($12))|0)==((($conv))|0);if($cmp3){__label__=4;continue;}else{__label__=5;break $while_body4$$while_end$7;}}}}while(0);var $16=$ix;var $17=$name_addr;var $arrayidx5=(($17+$16)&4294967295);var $18=HEAP8[($arrayidx5)];var $conv6=(tempInt=(($18)),(tempInt>=128?tempInt-256:tempInt));var $cmp7=((($conv6))|0)==0;if($cmp7){__label__=6;break $while_cond$2;}}
65821 var $39=$pw_addr;var $incdec_ptr29=(($39+4)&4294967295);$pw_addr=$incdec_ptr29;__label__=1;continue $while_cond$2;}
65822 $while_end30$$while_cond9_preheader$12:do{if(__label__==17){$retval=0;;}
65823 else if(__label__==6){var $19=$pw_addr;var $20=HEAP32[(($19)>>2)];var $call104=_iswspace($20);var $tobool115=((($call104))|0)!=0;var $21=$pw_addr;if($tobool115){__lastLabel__=6;__label__=7;;}else{__lastLabel__=6;__label__=8;;}
65824 $while_body12$$while_end14$15:do{if(__label__==7){while(1){var $22=__lastLabel__==7?$25:($21);var $incdec_ptr13=(($22+4)&4294967295);$pw_addr=$incdec_ptr13;var $23=$pw_addr;var $24=HEAP32[(($23)>>2)];var $call10=_iswspace($24);var $tobool11=((($call10))|0)!=0;var $25=$pw_addr;if($tobool11){__lastLabel__=7;__label__=7;continue;}else{__lastLabel__=7;__label__=8;break $while_body12$$while_end14$15;}}}}while(0);var $_lcssa3=__lastLabel__==6?$21:($25);var $26=HEAP32[(($_lcssa3)>>2)];var $cmp15=((($26))|0)==61;if($cmp15){__label__=9;;}else{__label__=10;;}
65825 if(__label__==9){var $27=$pw_addr;var $incdec_ptr17=(($27+4)&4294967295);$pw_addr=$incdec_ptr17;;}
65826 var $28=$pw_addr;var $29=HEAP32[(($28)>>2)];var $call191=_iswspace($29);var $tobool202=((($call191))|0)!=0;var $30=$pw_addr;if($tobool202){__lastLabel__=10;__label__=11;;}else{__lastLabel__=10;__label__=12;;}
65827 $while_body21$$while_end23$22:do{if(__label__==11){while(1){var $31=__lastLabel__==11?$34:($30);var $incdec_ptr22=(($31+4)&4294967295);$pw_addr=$incdec_ptr22;var $32=$pw_addr;var $33=HEAP32[(($32)>>2)];var $call19=_iswspace($33);var $tobool20=((($call19))|0)!=0;var $34=$pw_addr;if($tobool20){__lastLabel__=11;__label__=11;continue;}else{__lastLabel__=11;__label__=12;break $while_body21$$while_end23$22;}}}}while(0);var $_lcssa=__lastLabel__==10?$30:($34);var $35=HEAP32[(($_lcssa)>>2)];var $cmp24=((($35))|0)==34;if($cmp24){__label__=14;;}else{__label__=13;;}
65828 $if_then26$$lor_lhs_false$26:do{if(__label__==13){var $36=$pw_addr;var $37=HEAP32[(($36)>>2)];var $cmp25=((($37))|0)==39;if($cmp25){__label__=14;break $if_then26$$lor_lhs_false$26;}
65829 $retval=((__ZZL16GetSsmlAttributePwPKcE5empty)&4294967295);__label__=18;break $while_end30$$while_cond9_preheader$12;}}while(0);var $38=$pw_addr;var $add_ptr=(($38+4)&4294967295);$retval=$add_ptr;;}}while(0);var $40=$retval;;return $40;return null;}
65830 function __ZL7attrcmpPKwPKc($string1,$string2){;var __label__;var $retval;var $string1_addr;var $string2_addr;var $ix;$string1_addr=$string1;$string2_addr=$string2;var $0=$string1_addr;var $cmp=((($0))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
65831 $if_then$$if_end$2:do{if(__label__==1){$retval=1;;}
65832 else if(__label__==2){$ix=0;;$for_cond$5:while(1){var $1=$ix;var $2=$string1_addr;var $arrayidx=(($2+4*$1)&4294967295);var $3=HEAP32[(($arrayidx)>>2)];var $4=$ix;var $5=$string2_addr;var $arrayidx1=(($5+$4)&4294967295);var $6=HEAP8[($arrayidx1)];var $conv=(tempInt=(($6)),(tempInt>=128?tempInt-256:tempInt));var $cmp2=((($3))|0)==((($conv))|0);if(!($cmp2)){__label__=6;break $for_cond$5;}
65833 var $7=$ix;var $8=$string1_addr;var $arrayidx3=(($8+4*$7)&4294967295);var $9=HEAP32[(($arrayidx3)>>2)];var $cmp4=((($9))|0)!=0;if(!($cmp4)){__label__=6;break $for_cond$5;}
65834 var $10=$ix;var $inc=((($10)+1)&4294967295);$ix=$inc;__label__=3;continue $for_cond$5;}
65835 var $11=$ix;var $12=$string1_addr;var $arrayidx5=(($12+4*$11)&4294967295);var $13=HEAP32[(($arrayidx5)>>2)];var $cmp6=((($13))|0)==34;if($cmp6){__label__=8;;}else{__label__=7;;}
65836 $land_lhs_true$$lor_lhs_false$10:do{if(__label__==7){var $14=$ix;var $15=$string1_addr;var $arrayidx7=(($15+4*$14)&4294967295);var $16=HEAP32[(($arrayidx7)>>2)];var $cmp8=((($16))|0)==39;if($cmp8){__label__=8;break $land_lhs_true$$lor_lhs_false$10;}else{__label__=10;break $land_lhs_true$$lor_lhs_false$10;}}}while(0);$land_lhs_true$$if_end13$12:do{if(__label__==8){var $17=$ix;var $18=$string2_addr;var $arrayidx9=(($18+$17)&4294967295);var $19=HEAP8[($arrayidx9)];var $conv10=(tempInt=(($19)),(tempInt>=128?tempInt-256:tempInt));var $cmp11=((($conv10))|0)==0;if(!($cmp11)){__label__=10;break $land_lhs_true$$if_end13$12;}
65837 $retval=0;__label__=11;break $if_then$$if_end$2;}}while(0);$retval=1;;}}while(0);var $20=$retval;;return $20;return null;}
65838 function __ZL10attrlookupPKwPK8MNEM_TAB($string1,$mtab){;var __label__;var $retval;var $string1_addr;var $mtab_addr;var $ix;$string1_addr=$string1;$mtab_addr=$mtab;$ix=0;;while(1){var $0=$ix;var $1=$mtab_addr;var $arrayidx=(($1+8*$0)&4294967295);var $mnem=(($arrayidx)&4294967295);var $2=HEAP32[(($mnem)>>2)];var $cmp=((($2))|0)!=0;if(!($cmp)){__label__=5;break;}
65839 var $3=$string1_addr;var $4=$ix;var $5=$mtab_addr;var $arrayidx1=(($5+8*$4)&4294967295);var $mnem2=(($arrayidx1)&4294967295);var $6=HEAP32[(($mnem2)>>2)];var $call=__ZL7attrcmpPKwPKc($3,$6);var $cmp3=((($call))|0)==0;var $7=$ix;if($cmp3){__label__=3;break;}
65840 var $inc=((($7)+1)&4294967295);$ix=$inc;__label__=1;continue;}
65841 if(__label__==5){var $10=$ix;var $11=$mtab_addr;var $arrayidx5=(($11+8*$10)&4294967295);var $value6=(($arrayidx5+4)&4294967295);var $12=HEAP32[(($value6)>>2)];$retval=$12;;}
65842 else if(__label__==3){var $8=$mtab_addr;var $arrayidx4=(($8+8*$7)&4294967295);var $value=(($arrayidx4+4)&4294967295);var $9=HEAP32[(($value)>>2)];$retval=$9;;}
65843 var $13=$retval;;return $13;return null;}
65844 function __ZL17ProcessParamStackPcRi($outbuf,$outix){var __stackBase__=STACKTOP;STACKTOP+=80;_memset(__stackBase__,0,80);var __label__;var $outbuf_addr;var $outix_addr;var $param;var $ix;var $value;var $buf=__stackBase__;var $new_parameters=__stackBase__+20;$outbuf_addr=$outbuf;$outix_addr=$outix;$param=0;;$for_body$2:while(1){var $0=$param;var $arrayidx=(($new_parameters+$0*4)&4294967295);HEAP32[(($arrayidx)>>2)]=-1;var $1=$param;var $inc=((($1)+1)&4294967295);$param=$inc;var $cmp=((($inc))|0)<15;if($cmp){__label__=1;continue $for_body$2;}else{__label__=2;break $for_body$2;}}
65845 $ix=0;var $2=$ix;var $3=HEAP32[((__ZL13n_param_stack)>>2)];var $cmp22=((($2))|0)<((($3))|0);$param=0;if($cmp22){__label__=4;;}else{__label__=3;;}
65846 $for_body6$$for_cond20_preheader$5:do{if(__label__==4){while(1){var $4=$param;var $5=$ix;var $arrayidx7=((_param_stack+$5*64)&4294967295);var $parameter=(($arrayidx7+4)&4294967295);var $arrayidx8=(($parameter+$4*4)&4294967295);var $6=HEAP32[(($arrayidx8)>>2)];var $cmp9=((($6))|0)>=0;if($cmp9){__label__=5;;}else{__label__=6;;}
65847 if(__label__==5){var $7=$param;var $8=$ix;var $arrayidx10=((_param_stack+$8*64)&4294967295);var $parameter11=(($arrayidx10+4)&4294967295);var $arrayidx12=(($parameter11+$7*4)&4294967295);var $9=HEAP32[(($arrayidx12)>>2)];var $10=$param;var $arrayidx13=(($new_parameters+$10*4)&4294967295);HEAP32[(($arrayidx13)>>2)]=$9;;}
65848 var $11=$param;var $inc15=((($11)+1)&4294967295);$param=$inc15;var $cmp5=((($inc15))|0)<15;if($cmp5){__label__=4;continue;}
65849 var $12=$ix;var $inc18=((($12)+1)&4294967295);$ix=$inc18;var $13=$ix;var $14=HEAP32[((__ZL13n_param_stack)>>2)];var $cmp2=((($13))|0)<((($14))|0);$param=0;if($cmp2){__label__=4;continue;}else{__label__=3;break $for_body6$$for_cond20_preheader$5;}}}}while(0);var $arrayidx27=(($buf)&4294967295);var $arraydecay34=(($buf)&4294967295);var $arraydecay36=(($buf)&4294967295);var $arraydecay=(($buf)&4294967295);;while(1){var $15=$param;var $arrayidx23=(($new_parameters+$15*4)&4294967295);var $16=HEAP32[(($arrayidx23)>>2)];$value=$16;var $17=$param;var $arrayidx24=((__ZL17speech_parameters+$17*4)&4294967295);var $18=HEAP32[(($arrayidx24)>>2)];var $cmp25=((($16))|0)!=((($18))|0);if($cmp25){__label__=9;;}else{__label__=14;;}
65850 if(__label__==9){HEAP8[($arrayidx27)]=0;var $19=$param;if($19==5){__label__=10;;}
65851 else if($19==6){__label__=11;;}
65852 else if($19==1){__label__=12;;}
65853 else if($19==2){__label__=12;;}
65854 else if($19==3){__label__=12;;}
65855 else if($19==4){__label__=12;;}
65856 else if($19==12){__label__=12;;}
65857 else{__label__=13;;}
65858 if(__label__==10){var $20=$value;var $sub=((($20)-1)&4294967295);HEAP32[((_option_punctuation)>>2)]=$sub;;}
65859 else if(__label__==11){var $21=$value;HEAP32[((_option_capitals)>>2)]=$21;;}
65860 else if(__label__==12){var $22=$value;var $23=$param;var $arrayidx30=((__ZZL17ProcessParamStackPcRiE10cmd_letter+$23)&4294967295);var $24=HEAP8[($arrayidx30)];var $conv=(tempInt=(($24)),(tempInt>=128?tempInt-256:tempInt));var $call=_sprintf($arraydecay,((__str128)&4294967295),allocate([1,0,0,0,$22,0,0,0,$conv,0,0,0],["i32",0,0,0,"i32",0,0,0,"i32",0,0,0],ALLOC_STACK));;}
65861 var $25=$param;var $arrayidx31=(($new_parameters+$25*4)&4294967295);var $26=HEAP32[(($arrayidx31)>>2)];var $27=$param;var $arrayidx32=((__ZL17speech_parameters+$27*4)&4294967295);HEAP32[(($arrayidx32)>>2)]=$26;var $28=$outix_addr;var $29=HEAP32[(($28)>>2)];var $30=$outbuf_addr;var $arrayidx33=(($30+$29)&4294967295);var $call35=_strcpy($arrayidx33,$arraydecay34);var $call37=_strlen($arraydecay36);var $31=$outix_addr;var $32=HEAP32[(($31)>>2)];var $add=((($32)+($call37))&4294967295);HEAP32[(($31)>>2)]=$add;;}
65862 var $33=$param;var $inc40=((($33)+1)&4294967295);$param=$inc40;var $cmp21=((($inc40))|0)<15;if($cmp21){__label__=8;continue;}else{__label__=15;break;}}
65863 STACKTOP=__stackBase__;return;return;}
65864 function __ZL19SetProsodyParameteriPwP11PARAM_STACK($param_type,$attr1,$sp){var __stackBase__=STACKTOP;STACKTOP+=4;_memset(__stackBase__,0,4);var __label__;var $param_type_addr;var $attr1_addr;var $sp_addr;var $value=__stackBase__;var $sign;$param_type_addr=$param_type;$attr1_addr=$attr1;$sp_addr=$sp;var $0=$attr1_addr;var $1=$param_type_addr;var $arrayidx=((__ZZL19SetProsodyParameteriPwP11PARAM_STACKE9mnem_tabs+$1*4)&4294967295);var $2=HEAP32[(($arrayidx)>>2)];var $call=__ZL10attrlookupPKwPK8MNEM_TAB($0,$2);HEAP32[(($value)>>2)]=$call;var $cmp=((($call))|0)>=0;var $3=$param_type_addr;if($cmp){__label__=1;;}else{__label__=2;;}
65865 if(__label__==1){var $arrayidx1=((((_param_stack+4)&4294967295)+$3*4)&4294967295);var $4=HEAP32[(($arrayidx1)>>2)];var $5=HEAP32[(($value)>>2)];var $mul=((($5)*($4))&4294967295);var $div=((((($mul))|0)/100)|0);var $6=$param_type_addr;var $7=$sp_addr;var $parameter=(($7+4)&4294967295);var $arrayidx2=(($parameter+$6*4)&4294967295);HEAP32[(($arrayidx2)>>2)]=$div;;}
65866 else if(__label__==2){var $8=$attr1_addr;var $call3=__ZL18attr_prosody_valueiPKwPi($3,$8,$value);$sign=$call3;var $9=$sign;var $cmp4=((($9))|0)==0;if($cmp4){__label__=3;;}else{__label__=4;;}
65867 if(__label__==3){var $10=HEAP32[(($value)>>2)];var $11=$param_type_addr;var $12=$sp_addr;var $parameter6=(($12+4)&4294967295);var $arrayidx7=(($parameter6+$11*4)&4294967295);HEAP32[(($arrayidx7)>>2)]=$10;;}
65868 else if(__label__==4){var $13=$sign;var $cmp9=((($13))|0)==2;var $14=$param_type_addr;var $arrayidx11=((__ZL17speech_parameters+$14*4)&4294967295);var $15=HEAP32[(($arrayidx11)>>2)];var $16=HEAP32[(($value)>>2)];if($cmp9){__label__=5;;}else{__label__=6;;}
65869 if(__label__==5){var $mul12=((($16)*($15))&4294967295);var $div13=((((($mul12))|0)/100)|0);var $17=$param_type_addr;var $18=$sp_addr;var $parameter14=(($18+4)&4294967295);var $arrayidx15=(($parameter14+$17*4)&4294967295);HEAP32[(($arrayidx15)>>2)]=$div13;;}
65870 else if(__label__==6){var $19=$sign;var $mul18=((($19)*($16))&4294967295);var $add=((($mul18)+($15))&4294967295);var $20=$param_type_addr;var $21=$sp_addr;var $parameter19=(($21+4)&4294967295);var $arrayidx20=(($parameter19+$20*4)&4294967295);HEAP32[(($arrayidx20)>>2)]=$add;;}}}
65871 STACKTOP=__stackBase__;return;return;}
65872 function __ZL13PopParamStackiPcRi($tag_type,$outbuf,$outix){;var __label__;var $tag_type_addr;var $outbuf_addr;var $outix_addr;var $ix;var $top;$tag_type_addr=$tag_type;$outbuf_addr=$outbuf;$outix_addr=$outix;$top=0;var $0=$tag_type_addr;var $cmp=((($0))|0)>=32;if($cmp){__label__=1;;}else{__label__=2;;}
65873 if(__label__==1){var $1=$tag_type_addr;var $sub=((($1)-32)&4294967295);$tag_type_addr=$sub;;}
65874 $ix=0;var $2=$ix;var $3=HEAP32[((__ZL13n_param_stack)>>2)];var $cmp11=((($2))|0)<((($3))|0);if($cmp11){__label__=3;;}else{__label__=6;;}
65875 $for_body$$for_end$5:do{if(__label__==3){while(1){var $4=$ix;var $arrayidx=((_param_stack+$4*64)&4294967295);var $type=(($arrayidx)&4294967295);var $5=HEAP32[(($type)>>2)];var $6=$tag_type_addr;var $cmp2=((($5))|0)==((($6))|0);if($cmp2){__label__=4;;}else{__label__=5;;}
65876 if(__label__==4){var $7=$ix;$top=$7;;}
65877 var $8=$ix;var $inc=((($8)+1)&4294967295);$ix=$inc;var $9=$ix;var $10=HEAP32[((__ZL13n_param_stack)>>2)];var $cmp1=((($9))|0)<((($10))|0);if($cmp1){__label__=3;continue;}else{__label__=6;break $for_body$$for_end$5;}}}}while(0);var $11=$top;var $cmp5=((($11))|0)>0;if($cmp5){__label__=7;;}else{__label__=8;;}
65878 if(__label__==7){var $12=$top;HEAP32[((__ZL13n_param_stack)>>2)]=$12;;}
65879 var $13=$outbuf_addr;var $14=$outix_addr;__ZL17ProcessParamStackPcRi($13,$14);;return;return;}
65880 function __ZL10attrnumberPKwii($pw,$default_value,$type){;var __label__;var $retval;var $pw_addr;var $default_value_addr;var $type_addr;var $value;$pw_addr=$pw;$default_value_addr=$default_value;$type_addr=$type;$value=0;var $0=$pw_addr;var $cmp=((($0))|0)==0;if($cmp){__label__=3;;}else{__label__=1;;}
65881 $if_then$$lor_lhs_false$2:do{if(__label__==1){var $1=$pw_addr;var $2=HEAP32[(($1)>>2)];var $isdigittmp=((($2)-48)&4294967295);var $isdigit=((($isdigittmp))>>>0)<10;var $call=((($isdigit))&1);var $tobool=((($call))|0)!=0;if(!($tobool)){__label__=3;break $if_then$$lor_lhs_false$2;}
65882 var $3=$pw_addr;var $4=HEAP32[(($3)>>2)];var $isdigittmp13=((($4)-48)&4294967295);var $isdigit24=((($isdigittmp13))>>>0)<10;if($isdigit24){__label__=4;;}else{__label__=5;;}
65883 $while_body$$while_end$5:do{if(__label__==4){while(1){var $6=$value;var $mul=((($6)*10)&4294967295);var $7=$pw_addr;var $incdec_ptr=(($7+4)&4294967295);$pw_addr=$incdec_ptr;var $8=HEAP32[(($7)>>2)];var $add=((($mul)-48)&4294967295);var $sub=((($add)+($8))&4294967295);$value=$sub;var $9=$pw_addr;var $10=HEAP32[(($9)>>2)];var $isdigittmp1=((($10)-48)&4294967295);var $isdigit2=((($isdigittmp1))>>>0)<10;var $call1=((($isdigit2))&1);var $tobool2=((($call1))|0)!=0;if($tobool2){__label__=4;continue;}else{__label__=5;break $while_body$$while_end$5;}}}}while(0);var $11=$type_addr;var $cmp3=((($11))|0)==1;if($cmp3){__label__=6;;}else{__label__=8;;}
65884 $land_lhs_true$$if_end8$9:do{if(__label__==6){var $12=$pw_addr;var $13=HEAP32[(($12)>>2)];var $call4=_towlower($13);var $cmp5=((($call4))|0)==115;if(!($cmp5)){__label__=8;break $land_lhs_true$$if_end8$9;}
65885 var $14=$value;var $mul7=((($14)*1000)&4294967295);$value=$mul7;;}}while(0);var $15=$value;$retval=$15;__label__=9;break $if_then$$lor_lhs_false$2;}}while(0);if(__label__==3){var $5=$default_value_addr;$retval=$5;;}
65886 var $16=$retval;;return $16;return null;}
65887 function __ZL14ReplaceKeyNamePciRi($outbuf,$index,$outix){var __stackBase__=STACKTOP;STACKTOP+=40;_memset(__stackBase__,0,40);var __label__;var $retval;var $outbuf_addr;var $index_addr;var $outix_addr;var $keynames=__stackBase__;var $ix;var $letter;var $p;$outbuf_addr=$outbuf;$index_addr=$index;$outix_addr=$outix;var $0=$keynames;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=__ZZL14ReplaceKeyNamePciRiE8keynames;$dest$=$0;$stop$=$src$+40;if(($dest$%4)==($src$%4)&&40>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
65888 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
65889 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $1=$index_addr;var $2=$outbuf_addr;var $arrayidx=(($2+$1)&4294967295);$p=$arrayidx;var $arraydecay=(($keynames)&4294967295);var $3=$p;var $call=__Z10LookupMnemP8MNEM_TABPKc($arraydecay,$3);$letter=$call;var $cmp=((($call))|0)!=0;if($cmp){__label__=1;;}else{__label__=2;;}
65890 if(__label__==1){var $4=$letter;var $5=$p;var $call1=__Z8utf8_outjPc($4,$5);$ix=$call1;var $6=$index_addr;var $7=$ix;var $add=((($7)+($6))&4294967295);var $8=$outix_addr;HEAP32[(($8)>>2)]=$add;var $9=$letter;$retval=$9;;}
65891 else if(__label__==2){$retval=0;;}
65892 STACKTOP=__stackBase__;return;return;}
65893 function __ZL13attrcopy_utf8PcPKwi($buf,$pw,$len){;var __label__;var $buf_addr;var $pw_addr;var $len_addr;var $c;var $ix;var $n;var $prev_c;$buf_addr=$buf;$pw_addr=$pw;$len_addr=$len;$ix=0;$prev_c=0;var $0=$pw_addr;var $cmp=((($0))|0)!=0;if($cmp){__label__=1;;}else{__label__=6;;}
65894 $while_cond$$if_end6$2:do{if(__label__==1){while(1){var $1=$ix;var $2=$len_addr;var $sub=((($2)-4)&4294967295);var $cmp1=((($1))|0)<((($sub))|0);if(!($cmp1)){__label__=6;break $while_cond$$if_end6$2;}
65895 var $3=$pw_addr;var $incdec_ptr=(($3+4)&4294967295);$pw_addr=$incdec_ptr;var $4=HEAP32[(($3)>>2)];$c=$4;var $cmp2=((($4))|0)!=0;if(!($cmp2)){__label__=6;break $while_cond$$if_end6$2;}
65896 var $5=$c;var $cmp3=((($5))|0)==34;if($cmp3){__label__=4;;}else{__label__=5;;}
65897 if(__label__==4){var $6=$prev_c;var $cmp4=((($6))|0)!=92;if($cmp4){__label__=6;break $while_cond$$if_end6$2;}}
65898 var $7=$c;var $8=$ix;var $9=$buf_addr;var $arrayidx=(($9+$8)&4294967295);var $call=__Z8utf8_outjPc($7,$arrayidx);$n=$call;var $10=$n;var $11=$ix;var $add=((($11)+($10))&4294967295);$ix=$add;var $12=$c;$prev_c=$12;__label__=1;continue;}}}while(0);var $13=$ix;var $14=$buf_addr;var $arrayidx7=(($14+$13)&4294967295);HEAP8[($arrayidx7)]=0;var $15=$ix;;return $15;return null;}
65899 function __ZL14LoadSoundFile2PKc($fname){;var __label__;var $retval;var $fname_addr;var $ix;$fname_addr=$fname;$ix=0;;while(1){var $0=$ix;var $1=HEAP32[((_n_soundicon_tab)>>2)];var $cmp=((($0))|0)<((($1))|0);if(!($cmp)){__label__=6;break;}
65900 var $2=$ix;var $arrayidx=((_soundicon_tab+$2*16)&4294967295);var $filename=(($arrayidx+12)&4294967295);var $3=HEAP32[(($filename)>>2)];var $cmp1=((($3))|0)!=0;if($cmp1){__label__=3;;}else{__label__=5;;}
65901 if(__label__==3){var $4=$fname_addr;var $5=$ix;var $arrayidx2=((_soundicon_tab+$5*16)&4294967295);var $filename3=(($arrayidx2+12)&4294967295);var $6=HEAP32[(($filename3)>>2)];var $call=_strcmp($4,$6);var $cmp4=((($call))|0)==0;if($cmp4){__label__=4;break;}}
65902 var $8=$ix;var $inc=((($8)+1)&4294967295);$ix=$inc;__label__=1;continue;}
65903 if(__label__==6){var $9=HEAP32[((__ZZL14LoadSoundFile2PKcE4slot)>>2)];var $inc5=((($9)+1)&4294967295);HEAP32[((__ZZL14LoadSoundFile2PKcE4slot)>>2)]=$inc5;var $10=HEAP32[((__ZZL14LoadSoundFile2PKcE4slot)>>2)];var $cmp6=((($10))|0)>=4;if($cmp6){__label__=7;;}else{__label__=8;;}
65904 if(__label__==7){HEAP32[((__ZZL14LoadSoundFile2PKcE4slot)>>2)]=0;;}
65905 var $11=$fname_addr;var $12=HEAP32[((__ZZL14LoadSoundFile2PKcE4slot)>>2)];var $call9=__ZL13LoadSoundFilePKci($11,$12);var $cmp10=((($call9))|0)!=0;if($cmp10){__label__=9;;}else{__label__=10;;}
65906 if(__label__==9){$retval=-1;;}
65907 else if(__label__==10){var $13=$ix;var $arrayidx13=((_soundicon_tab+$13*16)&4294967295);var $filename14=(($arrayidx13+12)&4294967295);var $14=HEAP32[(($filename14)>>2)];var $15=$fname_addr;var $call15=_strlen($15);var $add=((($call15)+1)&4294967295);var $call16=_realloc($14,$add);var $16=HEAP32[((__ZZL14LoadSoundFile2PKcE4slot)>>2)];var $arrayidx17=((_soundicon_tab+$16*16)&4294967295);var $filename18=(($arrayidx17+12)&4294967295);HEAP32[(($filename18)>>2)]=$call16;var $17=HEAP32[((__ZZL14LoadSoundFile2PKcE4slot)>>2)];var $arrayidx19=((_soundicon_tab+$17*16)&4294967295);var $filename20=(($arrayidx19+12)&4294967295);var $18=HEAP32[(($filename20)>>2)];var $19=$fname_addr;var $call21=_strcpy($18,$19);var $20=HEAP32[((__ZZL14LoadSoundFile2PKcE4slot)>>2)];$retval=$20;;}}
65908 else if(__label__==4){var $7=$ix;$retval=$7;;}
65909 var $21=$retval;;return $21;return null;}
65910 function __ZL18GetVoiceAttributesPwi($pw,$tag_type){;var __label__;var $retval;var $pw_addr;var $tag_type_addr;var $lang;var $gender;var $name;var $age;var $variant;var $new_voice_id;var $ssml_sp;$pw_addr=$pw;$tag_type_addr=$tag_type;var $0=$tag_type_addr;var $and=($0)&32;var $tobool=((($and))|0)!=0;if($tobool){__label__=1;;}else{__label__=3;;}
65911 $if_then$$if_else$2:do{if(__label__==1){var $1=HEAP32[((__ZL12n_ssml_stack)>>2)];var $cmp=((($1))|0)>1;if(!($cmp)){__label__=10;break $if_then$$if_else$2;}
65912 var $2=HEAP32[((__ZL12n_ssml_stack)>>2)];var $dec=((($2)-1)&4294967295);HEAP32[((__ZL12n_ssml_stack)>>2)]=$dec;__label__=10;break $if_then$$if_else$2;}
65913 else if(__label__==3){var $3=$pw_addr;var $call=__ZL16GetSsmlAttributePwPKc($3,((__str106273)&4294967295));$lang=$call;var $4=$tag_type_addr;var $cmp2=((($4))|0)!=2;if($cmp2){__label__=4;;}else{__label__=5;;}
65914 if(__label__==4){$name=0;$variant=0;$age=0;$gender=0;;}
65915 else if(__label__==5){var $5=$pw_addr;var $call5=__ZL16GetSsmlAttributePwPKc($5,((__str5655)&4294967295));$name=$call5;var $6=$pw_addr;var $call6=__ZL16GetSsmlAttributePwPKc($6,((__str55707)&4294967295));$variant=$call6;var $7=$pw_addr;var $call7=__ZL16GetSsmlAttributePwPKc($7,((__str108275)&4294967295));$age=$call7;var $8=$pw_addr;var $call8=__ZL16GetSsmlAttributePwPKc($8,((__str7657)&4294967295));$gender=$call8;;}
65916 var $9=$tag_type_addr;var $cmp10=((($9))|0)!=2;if($cmp10){__label__=7;;}else{__label__=9;;}
65917 $land_lhs_true$$if_end13$10:do{if(__label__==7){var $10=$lang;var $cmp11=((($10))|0)==0;if(!($cmp11)){__label__=9;break $land_lhs_true$$if_end13$10;}
65918 $retval=0;__label__=13;break $if_then$$if_else$2;}}while(0);var $11=HEAP32[((__ZL12n_ssml_stack)>>2)];var $inc=((($11)+1)&4294967295);HEAP32[((__ZL12n_ssml_stack)>>2)]=$inc;var $arrayidx=((__ZL10ssml_stack+$11*76)&4294967295);$ssml_sp=$arrayidx;var $12=$ssml_sp;var $language=(($12+56)&4294967295);var $arraydecay=(($language)&4294967295);var $13=$lang;var $call14=__ZL13attrcopy_utf8PcPKwi($arraydecay,$13,20);var $14=$ssml_sp;var $voice_name=(($14+16)&4294967295);var $arraydecay15=(($voice_name)&4294967295);var $15=$name;var $call16=__ZL13attrcopy_utf8PcPKwi($arraydecay15,$15,40);var $16=$variant;var $call17=__ZL10attrnumberPKwii($16,1,0);var $sub=((($call17)-1)&4294967295);var $17=$ssml_sp;var $voice_variant=(($17+4)&4294967295);HEAP32[(($voice_variant)>>2)]=$sub;var $18=$age;var $call18=__ZL10attrnumberPKwii($18,0,0);var $19=$ssml_sp;var $voice_age=(($19+12)&4294967295);HEAP32[(($voice_age)>>2)]=$call18;var $20=$gender;var $call19=__ZL10attrlookupPKwPK8MNEM_TAB($20,((__ZZL18GetVoiceAttributesPwiE11mnem_gender)&4294967295));var $21=$ssml_sp;var $voice_gender=(($21+8)&4294967295);HEAP32[(($voice_gender)>>2)]=$call19;var $22=$tag_type_addr;var $23=$ssml_sp;var $tag_type20=(($23)&4294967295);HEAP32[(($tag_type20)>>2)]=$22;__label__=10;break $if_then$$if_else$2;}}while(0);if(__label__==10){var $call22=__ZL14VoiceFromStackv();$new_voice_id=$call22;var $24=$new_voice_id;var $call23=_strcmp($24,((__ZL16current_voice_id)&4294967295));var $cmp24=((($call23))|0)!=0;if($cmp24){__label__=11;;}else{__label__=12;;}
65919 if(__label__==11){var $25=$new_voice_id;var $call26=_strcpy(((__ZL16current_voice_id)&4294967295),$25);$retval=131072;;}
65920 else if(__label__==12){$retval=0;;}}
65921 var $26=$retval;;return $26;return null;}
65922 function __ZL14VoiceFromStackv(){var __stackBase__=STACKTOP;STACKTOP+=108;_memset(__stackBase__,0,108);var __label__;var $retval;var $ix;var $sp;var $v_id;var $voice_name_specified;var $voice_found=__stackBase__;var $voice_select=__stackBase__+4;var $voice_name=__stackBase__+28;var $language=__stackBase__+68;var $arraydecay=(($voice_name)&4294967295);var $call=_strcpy($arraydecay,((__ZL10ssml_stack+16)&4294967295));var $arraydecay1=(($language)&4294967295);var $call2=_strcpy($arraydecay1,((__ZL10ssml_stack+56)&4294967295));var $0=HEAP32[((((__ZL10ssml_stack+12)&4294967295))>>2)];var $conv=((($0))&255);var $age=(($voice_select+13)&4294967295);HEAP8[($age)]=$conv;var $1=HEAP32[((((__ZL10ssml_stack+8)&4294967295))>>2)];var $conv3=((($1))&255);var $gender=(($voice_select+12)&4294967295);HEAP8[($gender)]=$conv3;var $2=HEAP32[((((__ZL10ssml_stack+4)&4294967295))>>2)];var $conv4=((($2))&255);var $variant=(($voice_select+14)&4294967295);HEAP8[($variant)]=$conv4;var $identifier=(($voice_select+8)&4294967295);HEAP32[(($identifier)>>2)]=0;$ix=0;var $3=$ix;var $4=HEAP32[((__ZL12n_ssml_stack)>>2)];var $cmp1=((($3))|0)<((($4))|0);if($cmp1){__label__=1;;}else{__label__=15;;}
65923 $for_body_lr_ph$$for_end$2:do{if(__label__==1){var $arraydecay13=(($voice_name)&4294967295);var $arrayidx17=(($language)&4294967295);var $gender18=(($voice_select+12)&4294967295);var $age19=(($voice_select+13)&4294967295);var $variant20=(($voice_select+14)&4294967295);var $arraydecay26=(($language)&4294967295);var $arrayidx32=(($voice_name)&4294967295);var $gender39=(($voice_select+12)&4294967295);var $age45=(($voice_select+13)&4294967295);var $variant51=(($voice_select+14)&4294967295);;$for_body$4:while(1){var $5=$ix;var $arrayidx=((__ZL10ssml_stack+$5*76)&4294967295);$sp=$arrayidx;$voice_name_specified=0;var $6=$sp;var $voice_name5=(($6+16)&4294967295);var $arrayidx6=(($voice_name5)&4294967295);var $7=HEAP8[($arrayidx6)];var $conv7=(tempInt=(($7)),(tempInt>=128?tempInt-256:tempInt));var $cmp8=((($conv7))|0)!=0;if($cmp8){__label__=3;;}else{__label__=5;;}
65924 $land_lhs_true$$if_end$6:do{if(__label__==3){var $8=$sp;var $voice_name9=(($8+16)&4294967295);var $arraydecay10=(($voice_name9)&4294967295);var $call11=__Z17SelectVoiceByNamePP12espeak_VOICEPKc(0,$arraydecay10);var $cmp12=((($call11))|0)!=0;if(!($cmp12)){__label__=5;break $land_lhs_true$$if_end$6;}
65925 $voice_name_specified=1;var $9=$sp;var $voice_name14=(($9+16)&4294967295);var $arraydecay15=(($voice_name14)&4294967295);var $call16=_strcpy($arraydecay13,$arraydecay15);HEAP8[($arrayidx17)]=0;HEAP8[($gender18)]=0;HEAP8[($age19)]=0;HEAP8[($variant20)]=0;;}}while(0);var $10=$sp;var $language21=(($10+56)&4294967295);var $arrayidx22=(($language21)&4294967295);var $11=HEAP8[($arrayidx22)];var $conv23=(tempInt=(($11)),(tempInt>=128?tempInt-256:tempInt));var $cmp24=((($conv23))|0)!=0;if($cmp24){__label__=6;;}else{__label__=8;;}
65926 $if_then25$$if_end34$10:do{if(__label__==6){var $12=$sp;var $language27=(($12+56)&4294967295);var $arraydecay28=(($language27)&4294967295);var $call29=_strcpy($arraydecay26,$arraydecay28);var $13=$voice_name_specified;var $cmp30=((($13))|0)==0;if(!($cmp30)){__label__=8;break $if_then25$$if_end34$10;}
65927 HEAP8[($arrayidx32)]=0;;}}while(0);var $14=$sp;var $voice_gender=(($14+8)&4294967295);var $15=HEAP32[(($voice_gender)>>2)];var $cmp35=((($15))|0)!=0;if($cmp35){__label__=9;;}else{__label__=10;;}
65928 if(__label__==9){var $16=$sp;var $voice_gender37=(($16+8)&4294967295);var $17=HEAP32[(($voice_gender37)>>2)];var $conv38=((($17))&255);HEAP8[($gender39)]=$conv38;;}
65929 var $18=$sp;var $voice_age=(($18+12)&4294967295);var $19=HEAP32[(($voice_age)>>2)];var $cmp41=((($19))|0)!=0;if($cmp41){__label__=11;;}else{__label__=12;;}
65930 if(__label__==11){var $20=$sp;var $voice_age43=(($20+12)&4294967295);var $21=HEAP32[(($voice_age43)>>2)];var $conv44=((($21))&255);HEAP8[($age45)]=$conv44;;}
65931 var $22=$sp;var $voice_variant=(($22+4)&4294967295);var $23=HEAP32[(($voice_variant)>>2)];var $cmp47=((($23))|0)!=0;if($cmp47){__label__=13;;}else{__label__=14;;}
65932 if(__label__==13){var $24=$sp;var $voice_variant49=(($24+4)&4294967295);var $25=HEAP32[(($voice_variant49)>>2)];var $conv50=((($25))&255);HEAP8[($variant51)]=$conv50;;}
65933 var $26=$ix;var $inc=((($26)+1)&4294967295);$ix=$inc;var $27=$ix;var $28=HEAP32[((__ZL12n_ssml_stack)>>2)];var $cmp=((($27))|0)<((($28))|0);if($cmp){__label__=2;continue $for_body$4;}else{__label__=15;break $for_body_lr_ph$$for_end$2;}}}}while(0);var $arraydecay53=(($voice_name)&4294967295);var $name=(($voice_select)&4294967295);HEAP32[(($name)>>2)]=$arraydecay53;var $arraydecay54=(($language)&4294967295);var $languages=(($voice_select+4)&4294967295);HEAP32[(($languages)>>2)]=$arraydecay54;var $call55=__Z11SelectVoiceP12espeak_VOICEPi($voice_select,$voice_found);$v_id=$call55;var $cmp56=((($call55))|0)==0;if($cmp56){__label__=16;;}else{__label__=17;;}
65934 if(__label__==16){$retval=((__str45697)&4294967295);;}
65935 else if(__label__==17){var $29=$v_id;$retval=$29;;}
65936 var $30=$retval;STACKTOP=__stackBase__;return $30;return null;}
65937 function __ZL18attr_prosody_valueiPKwPi($param_type,$pw,$value_out){var __stackBase__=STACKTOP;STACKTOP+=4;_memset(__stackBase__,0,4);var __label__;var __lastLabel__=null;var $retval;var $param_type_addr;var $pw_addr;var $value_out_addr;var $sign;var $tail=__stackBase__;var $value;var $x;$param_type_addr=$param_type;$pw_addr=$pw;$value_out_addr=$value_out;$sign=0;var $0=$pw_addr;var $1=HEAP32[(($0)>>2)];var $call1=_iswspace($1);var $tobool2=((($call1))|0)!=0;var $2=$pw_addr;if($tobool2){__lastLabel__=0;__label__=1;;}else{__lastLabel__=0;__label__=2;;}
65938 $while_body$$while_end$2:do{if(__label__==1){while(1){var $3=__lastLabel__==1?$6:($2);var $incdec_ptr=(($3+4)&4294967295);$pw_addr=$incdec_ptr;var $4=$pw_addr;var $5=HEAP32[(($4)>>2)];var $call=_iswspace($5);var $tobool=((($call))|0)!=0;var $6=$pw_addr;if($tobool){__lastLabel__=1;__label__=1;continue;}else{__lastLabel__=1;__label__=2;break $while_body$$while_end$2;}}}}while(0);var $_lcssa=__lastLabel__==0?$2:($6);var $7=HEAP32[(($_lcssa)>>2)];var $cmp=((($7))|0)==43;if($cmp){__label__=3;;}else{__label__=4;;}
65939 if(__label__==3){var $8=$pw_addr;var $incdec_ptr1=(($8+4)&4294967295);$pw_addr=$incdec_ptr1;$sign=1;;}
65940 var $9=$pw_addr;var $10=HEAP32[(($9)>>2)];var $cmp2=((($10))|0)==45;if($cmp2){__label__=5;;}else{__label__=6;;}
65941 if(__label__==5){var $11=$pw_addr;var $incdec_ptr4=(($11+4)&4294967295);$pw_addr=$incdec_ptr4;$sign=-1;;}
65942 var $12=$pw_addr;var $call6=_wcstod($12,$tail);var $conv=($call6);$value=$conv;var $13=HEAP32[(($tail)>>2)];var $14=$pw_addr;var $cmp7=((($13))|0)==((($14))|0);if($cmp7){__label__=7;;}else{__label__=8;;}
65943 $if_then8$$if_end9$12:do{if(__label__==7){var $15=$value_out_addr;HEAP32[(($15)>>2)]=100;$retval=2;;}
65944 else if(__label__==8){var $16=HEAP32[(($tail)>>2)];var $17=HEAP32[(($16)>>2)];var $cmp10=((($17))|0)==37;if($cmp10){__label__=9;;}else{__label__=12;;}
65945 if(__label__==9){var $18=$sign;var $cmp12=((($18))|0)!=0;if($cmp12){__label__=10;;}else{__label__=11;;}
65946 if(__label__==10){var $19=$sign;var $conv14=((($19))|0);var $20=$value;var $mul=($conv14)*($20);var $add=100+($mul);$value=$add;;}
65947 var $21=$value;var $conv16=((($21))|0);var $22=$value_out_addr;HEAP32[(($22)>>2)]=$conv16;$retval=2;;}
65948 else if(__label__==12){var $23=HEAP32[(($tail)>>2)];var $arrayidx=(($23)&4294967295);var $24=HEAP32[(($arrayidx)>>2)];var $cmp18=((($24))|0)==115;if($cmp18){__label__=13;;}else{__label__=15;;}
65949 $land_lhs_true$$if_end26$21:do{if(__label__==13){var $25=HEAP32[(($tail)>>2)];var $arrayidx19=(($25+4)&4294967295);var $26=HEAP32[(($arrayidx19)>>2)];var $cmp20=((($26))|0)==116;if(!($cmp20)){__label__=15;break $land_lhs_true$$if_end26$21;}
65950 var $27=$value;var $28=$sign;var $conv22=((($28))|0);var $mul23=($27)*($conv22);var $div=($mul23)/12;var $exp2=_exp2($div);var $mul24=($exp2)*100;$x=$mul24;var $29=$x;var $conv25=((($29))|0);var $30=$value_out_addr;HEAP32[(($30)>>2)]=$conv25;$retval=2;__label__=21;break $if_then8$$if_end9$12;}}while(0);var $31=$param_type_addr;var $cmp27=((($31))|0)==1;if($cmp27){__label__=16;;}else{__label__=20;;}
65951 if(__label__==16){var $32=$sign;var $cmp29=((($32))|0)==0;if($cmp29){__label__=17;;}else{__label__=18;;}
65952 if(__label__==17){var $33=$value;var $mul31=($33)*100;var $conv32=((($mul31))|0);var $34=$value_out_addr;HEAP32[(($34)>>2)]=$conv32;;}
65953 else if(__label__==18){var $35=$sign;var $conv33=((($35))|0);var $36=$value;var $mul34=($conv33)*($36);var $mul35=($mul34)*100;var $conv36=((($mul35))|0);var $add37=((($conv36)+100)&4294967295);var $37=$value_out_addr;HEAP32[(($37)>>2)]=$add37;;}
65954 $retval=2;;}
65955 else if(__label__==20){var $38=$value;var $conv40=((($38))|0);var $39=$value_out_addr;HEAP32[(($39)>>2)]=$conv40;var $40=$sign;$retval=$40;;}}}}while(0);var $41=$retval;STACKTOP=__stackBase__;return $41;return null;}
65956 function __ZL8GetC_getv(){;var __label__;var $retval;var $c;var $c2;var $0=HEAP32[((__ZL7f_input)>>2)];var $cmp=((($0))|0)!=0;if($cmp){__label__=1;;}else{__label__=8;;}
65957 $if_then$$if_end13$2:do{if(__label__==1){var $1=HEAP32[((__ZL7f_input)>>2)];var $call=_fgetc($1);$c=$call;var $2=HEAP32[((__ZL7f_input)>>2)];var $_flags=(($2+12)&4294967295);var $3=HEAP16[(($_flags)>>1)];var $conv=(tempInt=(($3)),(tempInt>=32768?tempInt-65536:tempInt));var $and=($conv)&32;var $cmp1=((($and))|0)!=0;if($cmp1){__label__=2;;}else{__label__=3;;}
65958 if(__label__==2){$c=32;;}
65959 var $4=HEAP32[((_option_multibyte)>>2)];var $cmp3=((($4))|0)==4;if($cmp3){__label__=4;;}else{__label__=7;;}
65960 if(__label__==4){var $5=HEAP32[((__ZL7f_input)>>2)];var $call5=_fgetc($5);$c2=$call5;var $6=HEAP32[((__ZL7f_input)>>2)];var $_flags6=(($6+12)&4294967295);var $7=HEAP16[(($_flags6)>>1)];var $conv7=(tempInt=(($7)),(tempInt>=32768?tempInt-65536:tempInt));var $and8=($conv7)&32;var $cmp9=((($and8))|0)!=0;if($cmp9){__label__=5;;}else{__label__=6;;}
65961 if(__label__==5){$c2=0;;}
65962 var $8=$c;var $9=$c2;var $shl=((($9)*256)&4294967295);var $add=((($shl)+($8))&4294967295);$c=$add;;}
65963 var $10=$c;$retval=$10;;}
65964 else if(__label__==8){var $11=HEAP32[((_option_multibyte)>>2)];var $cmp14=((($11))|0)==3;if($cmp14){__label__=9;;}else{__label__=13;;}
65965 $if_then15$$if_else$14:do{if(__label__==9){var $12=HEAP32[((_p_wchar_input)>>2)];var $13=HEAP32[(($12)>>2)];var $cmp16=((($13))|0)==0;if($cmp16){__label__=10;;}else{__label__=11;;}
65966 if(__label__==10){HEAP8[(__ZL12end_of_input_b)]=1;$retval=0;__label__=20;break $if_then$$if_end13$2;}
65967 else if(__label__==11){var $_b1=HEAPU8[(__ZL12end_of_input_b)];var $14=((($_b1))&1);var $tobool=((($14))|0)!=0;if($tobool){__label__=19;break $if_then15$$if_else$14;}
65968 var $15=HEAP32[((_p_wchar_input)>>2)];var $incdec_ptr=(($15+4)&4294967295);HEAP32[((_p_wchar_input)>>2)]=$incdec_ptr;var $16=HEAP32[(($15)>>2)];$retval=$16;__label__=20;break $if_then$$if_end13$2;}}
65969 else if(__label__==13){var $17=HEAP32[((_p_textinput)>>2)];var $18=HEAPU8[($17)];var $conv21=((($18))&255);var $cmp22=((($conv21))|0)==0;if($cmp22){__label__=14;;}else{__label__=15;;}
65970 if(__label__==14){HEAP8[(__ZL12end_of_input_b)]=1;$retval=0;__label__=20;break $if_then$$if_end13$2;}
65971 else if(__label__==15){var $_b=HEAPU8[(__ZL12end_of_input_b)];var $19=((($_b))&1);var $tobool25=((($19))|0)!=0;if($tobool25){__label__=19;break $if_then15$$if_else$14;}
65972 var $20=HEAP32[((_option_multibyte)>>2)];var $cmp27=((($20))|0)==4;var $21=HEAPU32[((_p_textinput)>>2)];if($cmp27){__label__=17;;}else{__label__=18;;}
65973 if(__label__==17){var $arrayidx=(($21)&4294967295);var $22=HEAPU8[($arrayidx)];var $conv29=((($22))&255);var $23=HEAP32[((_p_textinput)>>2)];var $arrayidx30=(($23+1)&4294967295);var $24=HEAPU8[($arrayidx30)];var $conv31=((($24))&255);var $shl32=((($conv31)*256)&4294967295);var $add33=((($shl32)+($conv29))&4294967295);$c=$add33;var $25=HEAP32[((_p_textinput)>>2)];var $add_ptr=(($25+2)&4294967295);HEAP32[((_p_textinput)>>2)]=$add_ptr;var $26=$c;$retval=$26;__label__=20;break $if_then$$if_end13$2;}
65974 else if(__label__==18){var $incdec_ptr35=(($21+1)&4294967295);HEAP32[((_p_textinput)>>2)]=$incdec_ptr35;var $27=HEAPU8[($21)];var $conv36=((($27))&255);var $and37=($conv36)&255;$retval=$and37;__label__=20;break $if_then$$if_end13$2;}}}}while(0);$retval=0;;}}while(0);var $28=$retval;;return $28;return null;}
65975 function __ZL10GetC_ungeti($c){;var __label__;var $c_addr;$c_addr=$c;var $0=HEAP32[((__ZL7f_input)>>2)];var $cmp=((($0))|0)!=0;if($cmp){__label__=1;;}else{__label__=2;;}
65976 if(__label__==1){var $1=$c_addr;var $2=HEAP32[((__ZL7f_input)>>2)];var $call=_ungetc($1,$2);;}
65977 else if(__label__==2){var $3=HEAP32[((_p_textinput)>>2)];var $incdec_ptr=(($3+-1)&4294967295);HEAP32[((_p_textinput)>>2)]=$incdec_ptr;var $4=$c_addr;var $conv=((($4))&255);var $5=HEAP32[((_p_textinput)>>2)];HEAP8[($5)]=$conv;HEAP8[(__ZL12end_of_input_b)]=0;;};return;return;}
65978 function __Z8SetSpeedi($control){;var __label__;var __lastLabel__=null;var $control_addr;var $x;var $s1;var $wpm;var $wpm2;var $wpm_value;var $sonic;$control_addr=$control;HEAP32[((((_speed+28)&4294967295))>>2)]=0;HEAP32[((((_speed+24)&4294967295))>>2)]=450;HEAP32[((((_speed+16)&4294967295))>>2)]=110;HEAP32[((((_speed+20)&4294967295))>>2)]=100;HEAP32[((((_speed+8)&4294967295))>>2)]=5;var $0=HEAP32[((((_embedded_value+8)&4294967295))>>2)];$wpm=$0;var $1=$control_addr;var $cmp=((($1))|0)==2;if($cmp){__label__=1;;}else{__label__=2;;}
65979 if(__label__==1){var $2=HEAP32[((((_embedded_value+32)&4294967295))>>2)];$wpm=$2;;}
65980 var $3=$wpm;$wpm_value=$3;var $4=HEAP32[((_voice)>>2)];var $speed_percent=(($4+64)&4294967295);var $5=HEAP32[(($speed_percent)>>2)];var $cmp1=((($5))|0)>0;if($cmp1){__label__=3;;}else{__label__=4;;}
65981 if(__label__==3){var $6=$wpm;var $7=HEAP32[((_voice)>>2)];var $speed_percent3=(($7+64)&4294967295);var $8=HEAP32[(($speed_percent3)>>2)];var $mul=((($8)*($6))&4294967295);var $div=((((($mul))|0)/100)|0);$wpm=$div;;}
65982 var $9=$control_addr;var $and=($9)&2;var $tobool=((($and))|0)!=0;if($tobool){__label__=5;;}else{__label__=6;;}
65983 if(__label__==5){__Z12DoSonicSpeedi(1024);;}
65984 var $10=$wpm_value;var $cmp7=((($10))|0)>450;if($cmp7){__label__=10;;}else{__label__=7;;}
65985 $if_then10$$lor_lhs_false$11:do{if(__label__==7){var $11=$wpm_value;var $12=HEAP32[((((_speed+32)&4294967295))>>2)];var $cmp8=((($11))|0)>((($12))|0);var $13=$wpm;if($cmp8){__label__=8;;}else{__label__=14;;}
65986 $land_lhs_true$$if_end29$13:do{if(__label__==8){var $cmp9=((($13))|0)>350;if($cmp9){__label__=10;break $if_then10$$lor_lhs_false$11;}
65987 var $_pr2=$wpm;__lastLabel__=9;__label__=16;break $land_lhs_true$$if_end29$13;}
65988 else if(__label__==14){var $cmp30=((($13))|0)>450;if($cmp30){__lastLabel__=14;;}else{__lastLabel__=14;__label__=16;break $land_lhs_true$$if_end29$13;}
65989 $wpm=450;__label__=17;break $land_lhs_true$$if_end29$13;}}while(0);$if_end32$$if_then34$18:do{if(__label__==16){var $29=__lastLabel__==9?$_pr2:($13);var $cmp33=((($29))|0)>360;if($cmp33){__label__=17;break $if_end32$$if_then34$18;}else{__label__=18;break $if_end32$$if_then34$18;}}}while(0);if(__label__==17){var $30=$wpm;var $sub=((($30)-360)&4294967295);var $div35=((((($sub))|0)/8)|0);HEAP32[((((_speed+28)&4294967295))>>2)]=$div35;;}
65990 var $31=$wpm;$wpm2=$31;var $cmp37=((($31))|0)>359;if($cmp37){__lastLabel__=18;__label__=19;;}else{__lastLabel__=18;__label__=20;;}
65991 if(__label__==19){$wpm2=359;var $_pr4=$wpm;__lastLabel__=19;;}
65992 var $32=__lastLabel__==19?$_pr4:($31);var $cmp40=((($32))|0)<80;if($cmp40){__label__=21;;}else{__label__=22;;}
65993 if(__label__==21){$wpm2=80;;}
65994 var $33=$wpm2;var $sub43=((($33)-80)&4294967295);var $arrayidx=((__ZL12speed_lookup+$sub43)&4294967295);var $34=HEAPU8[($arrayidx)];var $conv44=((($34))&255);$x=$conv44;var $35=$wpm;var $cmp45=((($35))|0)>=380;if($cmp45){__label__=23;;}else{__label__=25;;}
65995 $if_end47$$if_end50$29:do{if(__label__==23){$x=7;var $_pr5=$wpm;var $cmp48=((($_pr5))|0)>=400;if(!($cmp48)){__label__=25;break $if_end47$$if_end50$29;}
65996 $x=6;;}}while(0);var $36=$control_addr;var $and51=($36)&1;var $tobool52=((($and51))|0)!=0;if($tobool52){__label__=26;;}else{__label__=28;;}
65997 $if_then53$$if_end67$33:do{if(__label__==26){var $37=$x;var $38=HEAP32[((_voice)>>2)];var $speedf154=(($38+52)&4294967295);var $39=HEAP32[(($speedf154)>>2)];var $mul55=((($39)*($37))&4294967295);var $div56=((((($mul55))|0)/256)|0);HEAP32[((__ZL6speed1)>>2)]=$div56;var $40=$x;var $41=HEAP32[((_voice)>>2)];var $speedf257=(($41+56)&4294967295);var $42=HEAP32[(($speedf257)>>2)];var $mul58=((($42)*($40))&4294967295);var $div59=((((($mul58))|0)/256)|0);HEAP32[((__ZL6speed2)>>2)]=$div59;var $43=$x;var $44=HEAP32[((_voice)>>2)];var $speedf360=(($44+60)&4294967295);var $45=HEAP32[(($speedf360)>>2)];var $mul61=((($45)*($43))&4294967295);var $div62=((((($mul61))|0)/256)|0);HEAP32[((__ZL6speed3)>>2)]=$div62;var $46=$x;var $cmp63=((($46))|0)<=7;if(!($cmp63)){__label__=28;break $if_then53$$if_end67$33;}
65998 var $47=$x;HEAP32[((__ZL6speed1)>>2)]=$47;var $48=$x;var $sub65=((($48)-1)&4294967295);HEAP32[((__ZL6speed3)>>2)]=$sub65;HEAP32[((__ZL6speed2)>>2)]=$sub65;;}}while(0);var $49=$control_addr;var $and68=($49)&2;var $tobool69=((($and68))|0)!=0;if(!($tobool69)){__label__=51;break $if_then10$$lor_lhs_false$11;}
65999 var $50=$wpm;var $cmp71=((($50))|0)>350;var $51=$wpm;if($cmp71){__label__=30;;}else{__label__=31;;}
66000 $if_then72$$if_else$38:do{if(__label__==30){var $sub73=((($51)-350)&4294967295);var $div74=((((($sub73))|0)/3)|0);var $sub75=((85-($div74))&4294967295);HEAP32[((((_speed+16)&4294967295))>>2)]=$sub75;var $52=$wpm;var $sub76=((($52)-350)&4294967295);var $div77=((((($sub76))|0)/8)|0);var $sub78=((60-($div77))&4294967295);HEAP32[((((_speed+20)&4294967295))>>2)]=$sub78;;}
66001 else if(__label__==31){var $cmp79=((($51))|0)>250;if(!($cmp79)){__label__=33;break $if_then72$$if_else$38;}
66002 var $53=$wpm;var $sub81=((($53)-250)&4294967295);var $div82=((((($sub81))|0)/4)|0);var $sub83=((110-($div82))&4294967295);HEAP32[((((_speed+16)&4294967295))>>2)]=$sub83;var $54=$wpm;var $sub84=((($54)-250)&4294967295);var $div85=((((($sub84))|0)/2)|0);var $sub86=((110-($div85))&4294967295);HEAP32[((((_speed+20)&4294967295))>>2)]=$sub86;;}}while(0);var $55=$x;var $56=HEAP32[((_voice)>>2)];var $speedf189=(($56+52)&4294967295);var $57=HEAP32[(($speedf189)>>2)];var $mul90=((($57)*($55))&4294967295);var $div91=((((($mul90))|0)/256)|0);$s1=$div91;var $58=$wpm;var $cmp92=((($58))|0)>=170;var $59=$s1;if($cmp92){__label__=34;;}else{__label__=35;;}
66003 if(__label__==34){var $mul94=((($59)*150)&4294967295);var $div95=((((($mul94))|0)/128)|0);var $add=((($div95)+110)&4294967295);HEAP32[((((_speed+12)&4294967295))>>2)]=$add;;}
66004 else if(__label__==35){var $mul97=((($59)*128)&4294967295);var $div98=((((($mul97))|0)/130)|0);var $add99=((($div98)+128)&4294967295);HEAP32[((((_speed+12)&4294967295))>>2)]=$add99;;}
66005 var $60=$wpm;var $cmp101=((($60))|0)>=350;if($cmp101){__label__=37;;}else{__label__=40;;}
66006 $if_end106$$if_end117$47:do{if(__label__==37){var $61=$wpm;var $sub103=((($61)-350)&4294967295);var $arrayidx104=((__ZL14wav_factor_350+$sub103)&4294967295);var $62=HEAPU8[($arrayidx104)];var $conv105=((($62))&255);HEAP32[((((_speed+12)&4294967295))>>2)]=$conv105;var $_pr7=$wpm;var $cmp107=((($_pr7))|0)>=390;if(!($cmp107)){__label__=40;break $if_end106$$if_end117$47;}
66007 var $63=$wpm;var $sub109=((($63)-400)&4294967295);var $div110=((((($sub109))|0)/2)|0);var $sub111=((450-($div110))&4294967295);HEAP32[((((_speed+24)&4294967295))>>2)]=$sub111;var $64=$wpm;var $cmp112=((($64))|0)>440;if(!($cmp112)){__label__=40;break $if_end106$$if_end117$47;}
66008 var $65=$wpm;var $_neg=(((-($65)))&4294967295);var $sub115=((($_neg)+860)&4294967295);HEAP32[((((_speed+24)&4294967295))>>2)]=$sub115;;}}while(0);var $66=$s1;var $mul118=((($66)*256)&4294967295);var $div119=((((($mul118))|0)/115)|0);HEAP32[((((_speed)&4294967295))>>2)]=$div119;HEAP32[((((_speed+4)&4294967295))>>2)]=0;var $67=$wpm;var $cmp120=((($67))|0)>430;if($cmp120){__label__=41;;}else{__label__=42;;}
66009 $if_then121$$if_else122$52:do{if(__label__==41){HEAP32[((((_speed)&4294967295))>>2)]=12;;}
66010 else if(__label__==42){var $68=$wpm;var $cmp123=((($68))|0)>400;if($cmp123){__label__=43;;}else{__label__=44;;}
66011 if(__label__==43){HEAP32[((((_speed)&4294967295))>>2)]=13;;}
66012 else if(__label__==44){var $69=$wpm;var $cmp126=((($69))|0)>374;if($cmp126){__label__=45;;}else{__label__=46;;}
66013 if(__label__==45){HEAP32[((((_speed)&4294967295))>>2)]=14;;}
66014 else if(__label__==46){var $70=$wpm;var $cmp129=((($70))|0)>350;if(!($cmp129)){__label__=48;break $if_then121$$if_else122$52;}
66015 var $71=$wpm;var $sub131=((($71)-350)&4294967295);var $arrayidx132=((__ZL16pause_factor_350+$sub131)&4294967295);var $72=HEAPU8[($arrayidx132)];var $conv133=((($72))&255);HEAP32[((((_speed)&4294967295))>>2)]=$conv133;;}}}}while(0);var $73=HEAP32[((((_speed+4)&4294967295))>>2)];var $cmp138=((($73))|0)==0;if(!($cmp138)){__label__=51;break $if_then10$$lor_lhs_false$11;}
66016 var $74=HEAP32[((((_speed)&4294967295))>>2)];HEAP32[((((_speed+4)&4294967295))>>2)]=$74;var $cmp140=((($74))|0)<16;if(!($cmp140)){__label__=51;break $if_then10$$lor_lhs_false$11;}
66017 HEAP32[((((_speed+4)&4294967295))>>2)]=16;__label__=51;break $if_then10$$lor_lhs_false$11;}}while(0);$if_then10$$if_end144$65:do{if(__label__==10){var $14=$wpm;$wpm2=$14;$wpm=175;$x=73;var $15=$control_addr;var $and11=($15)&1;var $tobool12=((($and11))|0)!=0;if($tobool12){__label__=11;;}else{__label__=12;;}
66018 if(__label__==11){var $16=$x;var $17=HEAP32[((_voice)>>2)];var $speedf1=(($17+52)&4294967295);var $18=HEAP32[(($speedf1)>>2)];var $mul14=((($18)*($16))&4294967295);var $div15=((((($mul14))|0)/256)|0);HEAP32[((__ZL6speed1)>>2)]=$div15;var $19=$x;var $20=HEAP32[((_voice)>>2)];var $speedf2=(($20+56)&4294967295);var $21=HEAP32[(($speedf2)>>2)];var $mul16=((($21)*($19))&4294967295);var $div17=((((($mul16))|0)/256)|0);HEAP32[((__ZL6speed2)>>2)]=$div17;var $22=$x;var $23=HEAP32[((_voice)>>2)];var $speedf3=(($23+60)&4294967295);var $24=HEAP32[(($speedf3)>>2)];var $mul18=((($24)*($22))&4294967295);var $div19=((((($mul18))|0)/256)|0);HEAP32[((__ZL6speed3)>>2)]=$div19;;}
66019 var $25=$control_addr;var $and21=($25)&2;var $tobool22=((($and21))|0)!=0;if(!($tobool22)){__label__=51;break $if_then10$$if_end144$65;}
66020 var $26=$wpm2;var $conv=((($26))|0);var $27=$wpm;var $conv24=((($27))|0);var $div25=($conv)/($conv24);$sonic=$div25;var $28=$sonic;var $mul26=($28)*1024;var $conv27=((($mul26))|0);__Z12DoSonicSpeedi($conv27);HEAP32[((((_speed)&4294967295))>>2)]=85;HEAP32[((((_speed+4)&4294967295))>>2)]=80;HEAP32[((((_speed+8)&4294967295))>>2)]=22;HEAP32[((((_speed+24)&4294967295))>>2)]=900;HEAP32[((((_speed+12)&4294967295))>>2)]=211;HEAP32[((((_speed+16)&4294967295))>>2)]=210;HEAP32[((((_speed+20)&4294967295))>>2)]=170;;}}while(0);;return;return;}
66021 function __Z12SetParameteriii($parameter,$value,$relative){;var __label__;var $parameter_addr;var $value_addr;var $relative_addr;var $new_value;var $default_value;$parameter_addr=$parameter;$value_addr=$value;$relative_addr=$relative;var $0=$value_addr;$new_value=$0;var $1=$relative_addr;var $tobool=((($1))|0)!=0;if($tobool){__label__=1;;}else{__label__=3;;}
66022 $if_then$$if_end2$2:do{if(__label__==1){var $2=$parameter_addr;var $cmp=((($2))|0)<5;if(!($cmp)){__label__=3;break $if_then$$if_end2$2;}
66023 var $3=$parameter_addr;var $arrayidx=((_param_defaults+$3*4)&4294967295);var $4=HEAP32[(($arrayidx)>>2)];$default_value=$4;var $5=$default_value;var $6=$default_value;var $7=$value_addr;var $mul=((($7)*($6))&4294967295);var $div=((((($mul))|0)/100)|0);var $add=((($div)+($5))&4294967295);$new_value=$add;;}}while(0);var $8=$new_value;var $9=$parameter_addr;var $arrayidx3=((((_param_stack+4)&4294967295)+$9*4)&4294967295);HEAP32[(($arrayidx3)>>2)]=$8;var $10=$parameter_addr;if($10==1){__label__=4;;}
66024 else if($10==2){__label__=5;;}
66025 else if($10==3){__label__=6;;}
66026 else if($10==4){__label__=11;;}
66027 else if($10==13){__label__=14;;}
66028 else if($10==7){__label__=15;;}
66029 else if($10==9){__label__=16;;}
66030 else{__label__=19;;}
66031 if(__label__==4){var $11=$new_value;HEAP32[((((_embedded_value+8)&4294967295))>>2)]=$11;var $12=$new_value;HEAP32[((((_embedded_value+32)&4294967295))>>2)]=$12;__Z8SetSpeedi(3);;}
66032 else if(__label__==5){var $13=$new_value;HEAP32[((((_embedded_value+12)&4294967295))>>2)]=$13;var $call=__Z12GetAmplitudev();;}
66033 else if(__label__==6){var $14=$new_value;var $cmp6=((($14))|0)>99;if($cmp6){__label__=7;;}else{__label__=8;;}
66034 $if_end8_thread$$if_end8$10:do{if(__label__==7){$new_value=99;;}
66035 else if(__label__==8){var $cmp9=((($14))|0)<0;if(!($cmp9)){__label__=10;break $if_end8_thread$$if_end8$10;}
66036 $new_value=0;;}}while(0);var $15=$new_value;HEAP32[((((_embedded_value+4)&4294967295))>>2)]=$15;;}
66037 else if(__label__==11){var $16=$new_value;var $cmp13=((($16))|0)>99;if($cmp13){__label__=12;;}else{__label__=13;;}
66038 if(__label__==12){$new_value=99;;}
66039 var $17=$new_value;HEAP32[((((_embedded_value+16)&4294967295))>>2)]=$17;;}
66040 else if(__label__==14){var $18=$new_value;HEAP32[((_option_linelength)>>2)]=$18;;}
66041 else if(__label__==15){var $19=$new_value;HEAP32[((_option_wordgap)>>2)]=$19;;}
66042 else if(__label__==16){var $20=$new_value;var $and=($20)&255;var $cmp19=((($and))|0)!=0;if($cmp19){__label__=17;;}else{__label__=18;;}
66043 if(__label__==17){var $21=$new_value;var $and21=($21)&255;var $22=HEAP32[((_translator)>>2)];var $langopts=(($22)&4294967295);var $intonation_group=(($langopts+228)&4294967295);HEAP32[(($intonation_group)>>2)]=$and21;;}
66044 var $23=$new_value;HEAP32[((_option_tone_flags)>>2)]=$23;;};return;return;}
66045 function __Z11CalcLengthsP10Translator($tr){var __stackBase__=STACKTOP;STACKTOP+=156;_memset(__stackBase__,0,156);var __label__;var __lastLabel__=null;var $tr_addr;var $ix;var $ix2;var $prev;var $next;var $next2;var $next3;var $p;var $p2;var $stress;var $type;var $pre_sonorant;var $pre_voiced;var $last_pitch;var $pitch_start;var $length_mod;var $len;var $env2;var $end_of_clause;var $embedded_ix=__stackBase__;var $min_drop;var $pitch1;var $emphasized;var $tone_mod;var $pitch_env;var $phdata_tone=__stackBase__+4;$tr_addr=$tr;$pre_sonorant=0;$pre_voiced=0;$last_pitch=0;HEAP32[(($embedded_ix)>>2)]=0;$pitch_env=0;$ix=1;var $0=$ix;var $1=HEAP32[((_n_phoneme_list)>>2)];var $cmp7=((($0))|0)<((($1))|0);if($cmp7){__label__=1;;}else{__label__=193;;}
66046 $for_body_lr_ph$$for_end733$2:do{if(__label__==1){var $pitch_env595=(($phdata_tone+124)&4294967295);;$for_body$4:while(1){var $2=$ix;var $sub=((($2)-1)&4294967295);var $arrayidx=((_phoneme_list+$sub*24)&4294967295);$prev=$arrayidx;var $3=$ix;var $arrayidx1=((_phoneme_list+$3*24)&4294967295);$p=$arrayidx1;var $4=$p;var $stresslevel=(($4+1)&4294967295);var $5=HEAPU8[($stresslevel)];var $conv=((($5))&255);var $and=($conv)&7;$stress=$and;var $6=$p;var $stresslevel2=(($6+1)&4294967295);var $7=HEAPU8[($stresslevel2)];var $conv3=((($7))&255);var $and4=($conv3)&8;$emphasized=$and4;var $8=$ix;var $add=((($8)+1)&4294967295);var $arrayidx5=((_phoneme_list+$add*24)&4294967295);$next=$arrayidx5;var $9=$p;var $synthflags=(($9+4)&4294967295);var $10=HEAPU16[(($synthflags)>>1)];var $conv6=((($10))&65535);var $and7=($conv6)&2;var $tobool=((($and7))|0)!=0;if($tobool){__label__=3;;}else{__label__=4;;}
66047 if(__label__==3){__ZL11DoEmbedded2Pi($embedded_ix);;}
66048 var $11=$p;var $type8=(($11+15)&4294967295);var $12=HEAPU8[($type8)];var $conv9=((($12))&255);$type=$conv9;var $13=$p;var $synthflags10=(($13+4)&4294967295);var $14=HEAPU16[(($synthflags10)>>1)];var $conv11=((($14))&65535);var $and12=($conv11)&4;var $tobool13=((($and12))|0)!=0;if($tobool13){__label__=5;;}else{__label__=6;;}
66049 $if_end15_thread$$if_end15$9:do{if(__label__==5){$type=2;__label__=98;break $if_end15_thread$$if_end15$9;}
66050 else if(__label__==6){var $_pr=$type;if($_pr==0){__label__=7;;}
66051 else if($_pr==4){__label__=8;;}
66052 else if($_pr==7){__label__=23;;}
66053 else if($_pr==6){__label__=23;;}
66054 else if($_pr==5){__label__=49;;}
66055 else if($_pr==3){__label__=74;;}
66056 else if($_pr==8){__label__=74;;}
66057 else if($_pr==2){__label__=98;break $if_end15_thread$$if_end15$9;}
66058 else{__label__=192;break $if_end15_thread$$if_end15$9;}
66059 if(__label__==7){$last_pitch=0;__label__=192;break $if_end15_thread$$if_end15$9;}
66060 else if(__label__==8){$last_pitch=0;var $15=$prev;var $type17=(($15+15)&4294967295);var $16=HEAPU8[($type17)];var $conv18=((($16))&255);var $cmp19=((($conv18))|0)==6;if($cmp19){__label__=9;;}else{__label__=10;;}
66061 $if_then20$$if_else$15:do{if(__label__==9){var $17=$p;var $prepause=(($17+16)&4294967295);HEAP8[($prepause)]=25;;}
66062 else if(__label__==10){var $18=HEAP32[((__ZZ11CalcLengthsP10TranslatorE14more_syllables)>>2)];var $cmp21=((($18))|0)>0;if($cmp21){__label__=12;;}else{__label__=11;;}
66063 $if_then23$$lor_lhs_false$18:do{if(__label__==11){var $19=$stress;var $cmp22=((($19))|0)<4;if($cmp22){__label__=12;break $if_then23$$lor_lhs_false$18;}
66064 var $21=$p;var $prepause26=(($21+16)&4294967295);HEAP8[($prepause26)]=60;__label__=14;break $if_then20$$if_else$15;}}while(0);var $20=$p;var $prepause24=(($20+16)&4294967295);HEAP8[($prepause24)]=48;;}}while(0);var $22=$prev;var $type29=(($22+15)&4294967295);var $23=HEAPU8[($type29)];var $conv30=((($23))&255);var $cmp31=((($conv30))|0)==4;if($cmp31){__label__=15;;}else{__label__=16;;}
66065 if(__label__==15){var $24=$p;var $prepause33=(($24+16)&4294967295);HEAP8[($prepause33)]=60;;}
66066 var $25=$tr_addr;var $langopts=(($25)&4294967295);var $word_gap=(($langopts)&4294967295);var $26=HEAP32[(($word_gap)>>2)];var $and35=($26)&16;var $tobool36=((($and35))|0)!=0;if($tobool36){__label__=17;;}else{__label__=19;;}
66067 $land_lhs_true$$if_end40$26:do{if(__label__==17){var $27=$p;var $newword=(($27+19)&4294967295);var $28=HEAP8[($newword)];var $tobool37=(tempInt=(($28)),(tempInt>=128?tempInt-256:tempInt))!=0;if(!($tobool37)){__label__=19;break $land_lhs_true$$if_end40$26;}
66068 var $29=$p;var $prepause39=(($29+16)&4294967295);HEAP8[($prepause39)]=60;;}}while(0);var $30=$p;var $ph=(($30+8)&4294967295);var $31=HEAP32[(($ph)>>2)];var $phflags=(($31+4)&4294967295);var $32=HEAP32[(($phflags)>>2)];var $and41=($32)&4194304;var $tobool42=((($and41))|0)!=0;if($tobool42){__label__=20;;}else{__label__=21;;}
66069 if(__label__==20){var $33=$p;var $prepause44=(($33+16)&4294967295);var $34=HEAPU8[($prepause44)];var $conv45=((($34))&255);var $add46=((($conv45)+30)&4294967295);var $conv47=((($add46))&255);HEAP8[($prepause44)]=$conv47;;}
66070 var $35=$p;var $synthflags49=(($35+4)&4294967295);var $36=HEAPU16[(($synthflags49)>>1)];var $conv50=((($36))&65535);var $and51=($conv50)&8;var $tobool52=((($and51))|0)!=0;if(!($tobool52)){__label__=192;break $if_end15_thread$$if_end15$9;}
66071 var $37=$tr_addr;var $langopts54=(($37)&4294967295);var $long_stop=(($langopts54+240)&4294967295);var $38=HEAP32[(($long_stop)>>2)];var $39=$p;var $prepause55=(($39+16)&4294967295);var $40=HEAPU8[($prepause55)];var $conv56=((($40))&255);var $add57=((($conv56)+($38))&4294967295);var $conv58=((($add57))&255);HEAP8[($prepause55)]=$conv58;__label__=192;break $if_end15_thread$$if_end15$9;}
66072 else if(__label__==23){var $41=$p;var $newword61=(($41+19)&4294967295);var $42=HEAP8[($newword61)];var $tobool62=(tempInt=(($42)),(tempInt>=128?tempInt-256:tempInt))!=0;if($tobool62){__label__=24;;}else{__label__=27;;}
66073 $if_then63$$if_end76$35:do{if(__label__==24){var $43=$prev;var $type64=(($43+15)&4294967295);var $44=HEAPU8[($type64)];var $conv65=((($44))&255);var $cmp66=((($conv65))|0)==2;if($cmp66){__label__=25;;}else{__label__=26;;}
66074 if(__label__==25){var $45=$p;var $ph68=(($45+8)&4294967295);var $46=HEAP32[(($ph68)>>2)];var $phflags69=(($46+4)&4294967295);var $47=HEAP32[(($phflags69)>>2)];var $and70=($47)&16777216;var $tobool71=((($and70))|0)!=0;if($tobool71){__label__=27;break $if_then63$$if_end76$35;}}
66075 var $48=$p;var $prepause74=(($48+16)&4294967295);HEAP8[($prepause74)]=15;;}}while(0);var $49=$next;var $type77=(($49+15)&4294967295);var $50=HEAPU8[($type77)];var $conv78=((($50))&255);var $cmp79=((($conv78))|0)==0;if($cmp79){__label__=28;;}else{__label__=31;;}
66076 $land_lhs_true80$$if_end91$41:do{if(__label__==28){var $51=$prev;var $type81=(($51+15)&4294967295);var $52=HEAPU8[($type81)];var $conv82=((($52))&255);var $cmp83=((($conv82))|0)==8;if(!($cmp83)){__label__=31;break $land_lhs_true80$$if_end91$41;}
66077 var $53=$p;var $ph85=(($53+8)&4294967295);var $54=HEAP32[(($ph85)>>2)];var $phflags86=(($54+4)&4294967295);var $55=HEAP32[(($phflags86)>>2)];var $and87=($55)&8;var $tobool88=((($and87))|0)!=0;if($tobool88){__label__=31;break $land_lhs_true80$$if_end91$41;}
66078 var $56=$p;var $prepause90=(($56+16)&4294967295);HEAP8[($prepause90)]=25;;}}while(0);var $57=$prev;var $ph92=(($57+8)&4294967295);var $58=HEAP32[(($ph92)>>2)];var $phflags93=(($58+4)&4294967295);var $59=HEAP32[(($phflags93)>>2)];var $and94=($59)&16384;var $tobool95=((($and94))|0)!=0;if($tobool95){__label__=32;;}else{__label__=33;;}
66079 if(__label__==32){var $60=$p;var $prepause97=(($60+16)&4294967295);HEAP8[($prepause97)]=30;;}
66080 var $61=$tr_addr;var $langopts99=(($61)&4294967295);var $word_gap100=(($langopts99)&4294967295);var $62=HEAP32[(($word_gap100)>>2)];var $and101=($62)&16;var $tobool102=((($and101))|0)!=0;if($tobool102){__label__=34;;}else{__label__=36;;}
66081 $land_lhs_true103$$if_end108$49:do{if(__label__==34){var $63=$p;var $newword104=(($63+19)&4294967295);var $64=HEAP8[($newword104)];var $tobool105=(tempInt=(($64)),(tempInt>=128?tempInt-256:tempInt))!=0;if(!($tobool105)){__label__=36;break $land_lhs_true103$$if_end108$49;}
66082 var $65=$p;var $prepause107=(($65+16)&4294967295);HEAP8[($prepause107)]=30;;}}while(0);var $66=$p;var $ph109=(($66+8)&4294967295);var $67=HEAP32[(($ph109)>>2)];var $phflags110=(($67+4)&4294967295);var $68=HEAP32[(($phflags110)>>2)];var $and111=($68)&32;var $tobool112=((($and111))|0)!=0;if($tobool112){__label__=37;;}else{__label__=42;;}
66083 $land_lhs_true113$$if_else128$53:do{if(__label__==37){var $69=$next;var $type114=(($69+15)&4294967295);var $70=HEAPU8[($type114)];var $conv115=((($70))&255);var $cmp116=((($conv115))|0)==4;if(!($cmp116)){__label__=42;break $land_lhs_true113$$if_else128$53;}
66084 var $71=$next;var $newword118=(($71+19)&4294967295);var $72=HEAP8[($newword118)];var $tobool119=(tempInt=(($72)),(tempInt>=128?tempInt-256:tempInt))!=0;if($tobool119){__label__=42;break $land_lhs_true113$$if_else128$53;}
66085 var $73=$prev;var $type121=(($73+15)&4294967295);var $74=HEAPU8[($type121)];var $conv122=((($74))&255);var $cmp123=((($conv122))|0)==2;var $75=$p;var $length=(($75+12)&4294967295);if($cmp123){__label__=40;;}else{__label__=41;;}
66086 if(__label__==40){HEAP16[(($length)>>1)]=200;__label__=43;break $land_lhs_true113$$if_else128$53;}
66087 else if(__label__==41){HEAP16[(($length)>>1)]=150;__label__=43;break $land_lhs_true113$$if_else128$53;}}}while(0);if(__label__==42){var $76=$p;var $length129=(($76+12)&4294967295);HEAP16[(($length129)>>1)]=256;;}
66088 var $77=$type;var $cmp131=((($77))|0)==7;if(!($cmp131)){__label__=192;break $if_end15_thread$$if_end15$9;}
66089 var $78=$next;var $type133=(($78+15)&4294967295);var $79=HEAPU8[($type133)];var $conv134=((($79))&255);var $cmp135=((($conv134))|0)==2;if($cmp135){__label__=45;;}else{__label__=46;;}
66090 if(__label__==45){$pre_voiced=1;;}
66091 var $80=$prev;var $type138=(($80+15)&4294967295);var $81=HEAPU8[($type138)];var $conv139=((($81))&255);var $cmp140=((($conv139))|0)==2;if($cmp140){__label__=48;;}else{__label__=47;;}
66092 if(__label__==47){var $82=$prev;var $type142=(($82+15)&4294967295);var $83=HEAPU8[($type142)];var $conv143=((($83))&255);var $cmp144=((($conv143))|0)==3;if(!($cmp144)){__label__=192;break $if_end15_thread$$if_end15$9;}}
66093 var $84=$prev;var $length146=(($84+12)&4294967295);var $85=HEAP16[(($length146)>>1)];var $conv147=(tempInt=(($85)),(tempInt>=32768?tempInt-65536:tempInt));var $add148=((($conv147)+255)&4294967295);var $div=((((($add148))|0)/2)|0);var $conv149=((($div))&65535);var $86=$p;var $length150=(($86+12)&4294967295);HEAP16[(($length150)>>1)]=$conv149;__label__=192;break $if_end15_thread$$if_end15$9;}
66094 else if(__label__==49){var $87=$prev;var $type154=(($87+15)&4294967295);var $88=HEAPU8[($type154)];var $conv155=((($88))&255);var $cmp156=((($conv155))|0)==7;if($cmp156){__label__=53;;}else{__label__=50;;}
66095 $if_then170$$lor_lhs_false157$71:do{if(__label__==50){var $89=$prev;var $type158=(($89+15)&4294967295);var $90=HEAPU8[($type158)];var $conv159=((($90))&255);var $cmp160=((($conv159))|0)==6;if($cmp160){__label__=53;break $if_then170$$lor_lhs_false157$71;}
66096 var $91=$prev;var $ph162=(($91+8)&4294967295);var $92=HEAP32[(($ph162)>>2)];var $phflags163=(($92+4)&4294967295);var $93=HEAP32[(($phflags163)>>2)];var $and164=($93)&32;var $tobool165=((($and164))|0)!=0;if($tobool165){__label__=53;break $if_then170$$lor_lhs_false157$71;}
66097 var $94=$prev;var $type167=(($94+15)&4294967295);var $95=HEAPU8[($type167)];var $conv168=((($95))&255);var $cmp169=((($conv168))|0)==3;if($cmp169){__label__=53;break $if_then170$$lor_lhs_false157$71;}else{__label__=54;break $if_then170$$lor_lhs_false157$71;}}}while(0);if(__label__==53){var $96=$p;var $prepause171=(($96+16)&4294967295);HEAP8[($prepause171)]=30;;}
66098 var $97=$next;var $type173=(($97+15)&4294967295);var $98=HEAPU8[($type173)];var $conv174=((($98))&255);var $cmp175=((($conv174))|0)==2;if($cmp175){__label__=56;;}else{__label__=55;;}
66099 $if_then180$$lor_lhs_false176$78:do{if(__label__==55){var $99=$next;var $type177=(($99+15)&4294967295);var $100=HEAPU8[($type177)];var $conv178=((($100))&255);var $cmp179=((($conv178))|0)==3;if($cmp179){__label__=56;break $if_then180$$lor_lhs_false176$78;}else{__label__=70;break $if_then180$$lor_lhs_false176$78;}}}while(0);$if_then180$$if_end229$80:do{if(__label__==56){var $101=$next;var $type181=(($101+15)&4294967295);var $102=HEAPU8[($type181)];var $conv182=((($102))&255);var $cmp183=((($conv182))|0)==2;if($cmp183){__label__=58;;}else{__label__=57;;}
66100 $if_then187$$lor_lhs_false184$82:do{if(__label__==57){var $103=$next;var $newword185=(($103+19)&4294967295);var $104=HEAP8[($newword185)];var $tobool186=(tempInt=(($104)),(tempInt>=128?tempInt-256:tempInt))!=0;if($tobool186){__label__=59;break $if_then187$$lor_lhs_false184$82;}else{__label__=58;break $if_then187$$lor_lhs_false184$82;}}}while(0);if(__label__==58){$pre_voiced=1;;}
66101 var $105=$p;var $prepause189=(($105+16)&4294967295);HEAP8[($prepause189)]=40;var $106=$prev;var $type190=(($106+15)&4294967295);var $107=HEAPU8[($type190)];var $conv191=((($107))&255);var $cmp192=((($conv191))|0)==0;if($cmp192){__label__=61;;}else{__label__=60;;}
66102 $if_then197$$lor_lhs_false193$87:do{if(__label__==60){var $108=$prev;var $type194=(($108+15)&4294967295);var $109=HEAPU8[($type194)];var $conv195=((($109))&255);var $cmp196=((($conv195))|0)==2;if($cmp196){__label__=61;break $if_then197$$lor_lhs_false193$87;}
66103 var $111=$p;var $newword200=(($111+19)&4294967295);var $112=HEAPU8[($newword200)];var $conv201=((($112))&255);var $cmp202=((($conv201))|0)==0;if(!($cmp202)){__label__=70;break $if_then180$$if_end229$80;}
66104 var $113=$prev;var $type204=(($113+15)&4294967295);var $114=HEAPU8[($type204)];var $conv205=((($114))&255);var $cmp206=((($conv205))|0)==3;if($cmp206){__label__=64;;}else{__label__=65;;}
66105 if(__label__==64){var $115=$p;var $prepause208=(($115+16)&4294967295);HEAP8[($prepause208)]=20;;}
66106 var $116=$prev;var $type210=(($116+15)&4294967295);var $117=HEAPU8[($type210)];var $conv211=((($117))&255);var $cmp212=((($conv211))|0)==8;if($cmp212){__label__=66;;}else{__label__=67;;}
66107 if(__label__==66){var $118=$p;var $prepause214=(($118+16)&4294967295);HEAP8[($prepause214)]=12;;}
66108 var $119=$prev;var $type216=(($119+15)&4294967295);var $120=HEAPU8[($type216)];var $conv217=((($120))&255);var $cmp218=((($conv217))|0)==4;if(!($cmp218)){__label__=70;break $if_then180$$if_end229$80;}
66109 var $121=$prev;var $ph220=(($121+8)&4294967295);var $122=HEAP32[(($ph220)>>2)];var $phflags221=(($122+4)&4294967295);var $123=HEAP32[(($phflags221)>>2)];var $and222=($123)&8;var $tobool223=((($and222))|0)!=0;if($tobool223){__label__=70;break $if_then180$$if_end229$80;}
66110 var $124=$p;var $prepause225=(($124+16)&4294967295);HEAP8[($prepause225)]=0;__label__=70;break $if_then180$$if_end229$80;}}while(0);var $110=$p;var $prepause198=(($110+16)&4294967295);HEAP8[($prepause198)]=0;;}}while(0);var $125=$tr_addr;var $langopts230=(($125)&4294967295);var $word_gap231=(($langopts230)&4294967295);var $126=HEAP32[(($word_gap231)>>2)];var $and232=($126)&16;var $tobool233=((($and232))|0)!=0;if(!($tobool233)){__label__=192;break $if_end15_thread$$if_end15$9;}
66111 var $127=$p;var $newword235=(($127+19)&4294967295);var $128=HEAP8[($newword235)];var $tobool236=(tempInt=(($128)),(tempInt>=128?tempInt-256:tempInt))!=0;if(!($tobool236)){__label__=192;break $if_end15_thread$$if_end15$9;}
66112 var $129=$p;var $prepause238=(($129+16)&4294967295);var $130=HEAPU8[($prepause238)];var $conv239=((($130))&255);var $cmp240=((($conv239))|0)<20;if(!($cmp240)){__label__=192;break $if_end15_thread$$if_end15$9;}
66113 var $131=$p;var $prepause242=(($131+16)&4294967295);HEAP8[($prepause242)]=20;__label__=192;break $if_end15_thread$$if_end15$9;}
66114 else if(__label__==74){var $132=$tr_addr;var $stress_amps=(($132+660)&4294967295);var $arrayidx245=(($stress_amps)&4294967295);var $133=HEAP8[($arrayidx245)];var $134=$p;var $amp=(($134+18)&4294967295);HEAP8[($amp)]=$133;var $135=$p;var $length246=(($135+12)&4294967295);HEAP16[(($length246)>>1)]=256;$min_drop=0;var $136=$p;var $newword247=(($136+19)&4294967295);var $137=HEAP8[($newword247)];var $tobool248=(tempInt=(($137)),(tempInt>=128?tempInt-256:tempInt))!=0;if($tobool248){__label__=75;;}else{__label__=80;;}
66115 $if_then249$$if_end268$105:do{if(__label__==75){var $138=$prev;var $type250=(($138+15)&4294967295);var $139=HEAPU8[($type250)];var $conv251=((($139))&255);var $cmp252=((($conv251))|0)==3;if($cmp252){__label__=76;;}else{__label__=77;;}
66116 if(__label__==76){var $140=$p;var $prepause254=(($140+16)&4294967295);HEAP8[($prepause254)]=25;;}
66117 var $141=$prev;var $type256=(($141+15)&4294967295);var $142=HEAPU8[($type256)];var $conv257=((($142))&255);var $cmp258=((($conv257))|0)==2;if(!($cmp258)){__label__=80;break $if_then249$$if_end268$105;}
66118 var $143=$p;var $ph260=(($143+8)&4294967295);var $144=HEAP32[(($ph260)>>2)];var $phflags261=(($144+4)&4294967295);var $145=HEAP32[(($phflags261)>>2)];var $and262=($145)&16777216;var $tobool263=((($and262))|0)!=0;if($tobool263){__label__=80;break $if_then249$$if_end268$105;}
66119 var $146=$p;var $prepause265=(($146+16)&4294967295);HEAP8[($prepause265)]=12;;}}while(0);var $147=$next;var $type269=(($147+15)&4294967295);var $148=HEAPU8[($type269)];var $conv270=((($148))&255);var $cmp271=((($conv270))|0)==2;if($cmp271){__label__=81;;}else{__label__=82;;}
66120 if(__label__==81){$pre_sonorant=1;__label__=192;break $if_end15_thread$$if_end15$9;}
66121 else if(__label__==82){var $149=$last_pitch;var $conv274=((($149))&255);var $150=$p;var $pitch2=(($150+21)&4294967295);HEAP8[($pitch2)]=$conv274;var $151=$prev;var $type275=(($151+15)&4294967295);var $152=HEAPU8[($type275)];var $conv276=((($152))&255);var $cmp277=((($conv276))|0)==2;if($cmp277){__label__=84;;}else{__label__=83;;}
66122 $if_then282$$lor_lhs_false278$116:do{if(__label__==83){var $153=$prev;var $type279=(($153+15)&4294967295);var $154=HEAPU8[($type279)];var $conv280=((($154))&255);var $cmp281=((($conv280))|0)==3;if($cmp281){__label__=84;break $if_then282$$lor_lhs_false278$116;}
66123 var $172=$ix;$ix2=$172;;while(1){var $173=$ix2;var $174=HEAP32[((_n_phoneme_list)>>2)];var $cmp315=((($173))|0)<((($174))|0);if(!($cmp315)){__label__=95;break $if_then282$$lor_lhs_false278$116;}
66124 var $175=$ix2;var $arrayidx317=((_phoneme_list+$175*24)&4294967295);var $type318=(($arrayidx317+15)&4294967295);var $176=HEAPU8[($type318)];var $conv319=((($176))&255);var $cmp320=((($conv319))|0)==2;var $177=$ix2;if($cmp320){__label__=93;break;}
66125 var $inc=((($177)+1)&4294967295);$ix2=$inc;__label__=91;continue;}
66126 var $arrayidx322=((_phoneme_list+$177*24)&4294967295);var $pitch2323=(($arrayidx322+21)&4294967295);var $178=HEAP8[($pitch2323)];var $179=$p;var $pitch2324=(($179+21)&4294967295);HEAP8[($pitch2324)]=$178;__label__=95;break $if_then282$$lor_lhs_false278$116;}}while(0);$if_then282$$if_end326$124:do{if(__label__==84){var $155=$prev;var $length283=(($155+12)&4294967295);var $156=HEAP16[(($length283)>>1)];var $157=$p;var $length284=(($157+12)&4294967295);HEAP16[(($length284)>>1)]=$156;var $158=$p;var $type285=(($158+15)&4294967295);var $159=HEAPU8[($type285)];var $conv286=((($159))&255);var $cmp287=((($conv286))|0)==3;if($cmp287){__label__=85;;}else{__label__=86;;}
66127 if(__label__==85){var $160=HEAP32[((__ZL6speed1)>>2)];var $conv289=((($160))&65535);var $161=$p;var $length290=(($161+12)&4294967295);HEAP16[(($length290)>>1)]=$conv289;;}
66128 var $162=$next;var $type292=(($162+15)&4294967295);var $163=HEAPU8[($type292)];var $conv293=((($163))&255);var $cmp294=((($conv293))|0)==5;if($cmp294){__label__=87;;}else{__label__=88;;}
66129 if(__label__==87){var $164=$p;var $length296=(($164+12)&4294967295);var $165=HEAP16[(($length296)>>1)];var $conv297=(tempInt=(($165)),(tempInt>=32768?tempInt-65536:tempInt));var $mul=((($conv297)*160)&4294967295);var $div298=((((($mul))|0)/100)|0);var $conv299=((($div298))&65535);var $166=$p;var $length300=(($166+12)&4294967295);HEAP16[(($length300)>>1)]=$conv299;;}
66130 var $167=$next;var $type302=(($167+15)&4294967295);var $168=HEAPU8[($type302)];var $conv303=((($168))&255);var $cmp304=((($conv303))|0)==7;if(!($cmp304)){__label__=95;break $if_then282$$if_end326$124;}
66131 var $169=$p;var $length306=(($169+12)&4294967295);var $170=HEAP16[(($length306)>>1)];var $conv307=(tempInt=(($170)),(tempInt>=32768?tempInt-65536:tempInt));var $mul308=((($conv307)*120)&4294967295);var $div309=((((($mul308))|0)/100)|0);var $conv310=((($div309))&65535);var $171=$p;var $length311=(($171+12)&4294967295);HEAP16[(($length311)>>1)]=$conv310;;}}while(0);var $180=$p;var $pitch2327=(($180+21)&4294967295);var $181=HEAPU8[($pitch2327)];var $conv328=((($181))&255);var $sub329=((($conv328)-16)&4294967295);var $conv330=((($sub329))&255);var $182=$p;var $pitch1331=(($182+20)&4294967295);HEAP8[($pitch1331)]=$conv330;var $183=$p;var $pitch2332=(($183+21)&4294967295);var $184=HEAPU8[($pitch2332)];var $conv333=((($184))&255);var $cmp334=((($conv333))|0)<16;if($cmp334){__label__=96;;}else{__label__=97;;}
66132 if(__label__==96){var $185=$p;var $pitch1336=(($185+20)&4294967295);HEAP8[($pitch1336)]=0;;}
66133 var $186=$p;var $env=(($186+14)&4294967295);HEAP8[($env)]=0;$pre_voiced=0;__label__=192;break $if_end15_thread$$if_end15$9;}}}}while(0);if(__label__==98){$min_drop=0;var $187=$ix;var $add340=((($187)+2)&4294967295);var $arrayidx341=((_phoneme_list+$add340*24)&4294967295);$next2=$arrayidx341;var $188=$ix;var $add342=((($188)+3)&4294967295);var $arrayidx343=((_phoneme_list+$add342*24)&4294967295);$next3=$arrayidx343;var $189=$stress;var $cmp344=((($189))|0)>7;if($cmp344){__label__=99;;}else{__label__=100;;}
66134 $if_end346_thread$$if_end346$139:do{if(__label__==99){$stress=7;;}
66135 else if(__label__==100){var $cmp347=((($189))|0)<=1;if(!($cmp347)){__label__=102;break $if_end346_thread$$if_end346$139;}
66136 var $190=$stress;var $xor=($190)^1;$stress=$xor;;}}while(0);var $191=$pre_sonorant;var $tobool350=((($191))|0)!=0;var $192=$stress;var $193=$tr_addr;var $stress_amps352=(($193+660)&4294967295);var $arrayidx353=(($stress_amps352+$192)&4294967295);var $194=HEAPU8[($arrayidx353)];if($tobool350){__label__=103;;}else{__label__=104;;}
66137 if(__label__==103){var $conv354=((($194))&255);var $sub355=((($conv354)-1)&4294967295);var $conv356=((($sub355))&255);var $195=$p;var $amp357=(($195+18)&4294967295);HEAP8[($amp357)]=$conv356;;}
66138 else if(__label__==104){var $196=$p;var $amp361=(($196+18)&4294967295);HEAP8[($amp361)]=$194;;}
66139 var $197=$emphasized;var $tobool363=((($197))|0)!=0;if($tobool363){__label__=106;;}else{__label__=107;;}
66140 if(__label__==106){var $198=$p;var $amp365=(($198+18)&4294967295);HEAP8[($amp365)]=25;;}
66141 var $199=$ix;var $200=HEAP32[((_n_phoneme_list)>>2)];var $sub367=((($200)-3)&4294967295);var $cmp368=((($199))|0)>=((($sub367))|0);if($cmp368){__label__=108;;}else{__label__=110;;}
66142 $if_then369$$if_end382$151:do{if(__label__==108){var $201=$p;var $amp370=(($201+18)&4294967295);var $202=HEAPU8[($amp370)];var $conv371=((($202))&255);var $203=$tr_addr;var $langopts372=(($203)&4294967295);var $param=(($langopts372+24)&4294967295);var $arrayidx373=(($param+36)&4294967295);var $204=HEAP32[(($arrayidx373)>>2)];var $cmp374=((($conv371))|0)>((($204))|0);if(!($cmp374)){__label__=110;break $if_then369$$if_end382$151;}
66143 var $205=$tr_addr;var $langopts376=(($205)&4294967295);var $param377=(($langopts376+24)&4294967295);var $arrayidx378=(($param377+36)&4294967295);var $206=HEAP32[(($arrayidx378)>>2)];var $conv379=((($206))&255);var $207=$p;var $amp380=(($207+18)&4294967295);HEAP8[($amp380)]=$conv379;;}}while(0);HEAP32[((__ZZ11CalcLengthsP10TranslatorE14more_syllables)>>2)]=0;$end_of_clause=0;var $208=$p;var $add_ptr=(($208+24)&4294967295);$p2=$add_ptr;var $209=$p2;var $newword3843=(($209+19)&4294967295);var $210=HEAPU8[($newword3843)];var $conv3854=((($210))&255);var $cmp3865=((($conv3854))|0)==0;var $211=$p2;if($cmp3865){__lastLabel__=110;__label__=111;;}else{__lastLabel__=110;__label__=117;;}
66144 $for_body387$$for_end405$155:do{if(__label__==111){$for_body387$156:while(1){var $212=__lastLabel__==116?$224:($211);var $type388=(($212+15)&4294967295);var $213=HEAPU8[($type388)];var $conv389=((($213))&255);var $cmp390=((($conv389))|0)==2;if($cmp390){__label__=112;;}else{__label__=114;;}
66145 $land_lhs_true391$$if_end398$158:do{if(__label__==112){var $214=$p2;var $ph392=(($214+8)&4294967295);var $215=HEAP32[(($ph392)>>2)];var $phflags393=(($215+4)&4294967295);var $216=HEAP32[(($phflags393)>>2)];var $and394=($216)&1048576;var $tobool395=((($and394))|0)!=0;if($tobool395){__label__=114;break $land_lhs_true391$$if_end398$158;}
66146 var $217=HEAP32[((__ZZ11CalcLengthsP10TranslatorE14more_syllables)>>2)];var $inc397=((($217)+1)&4294967295);HEAP32[((__ZZ11CalcLengthsP10TranslatorE14more_syllables)>>2)]=$inc397;;}}while(0);var $218=$p2;var $ph399=(($218+8)&4294967295);var $219=HEAP32[(($ph399)>>2)];var $code=(($219+10)&4294967295);var $220=HEAPU8[($code)];var $conv400=((($220))&255);var $cmp401=((($conv400))|0)==27;if($cmp401){__label__=115;;}else{__label__=116;;}
66147 if(__label__==115){$end_of_clause=2;;}
66148 var $221=$p2;var $incdec_ptr=(($221+24)&4294967295);$p2=$incdec_ptr;var $222=$p2;var $newword384=(($222+19)&4294967295);var $223=HEAPU8[($newword384)];var $conv385=((($223))&255);var $cmp386=((($conv385))|0)==0;var $224=$p2;if($cmp386){__lastLabel__=116;__label__=111;continue $for_body387$156;}else{__lastLabel__=116;__label__=117;break $for_body387$$for_end405$155;}}}}while(0);var $_lcssa=__lastLabel__==110?$211:($224);var $ph406=(($_lcssa+8)&4294967295);var $225=HEAP32[(($ph406)>>2)];var $code407=(($225+10)&4294967295);var $226=HEAPU8[($code407)];var $conv408=((($226))&255);var $cmp409=((($conv408))|0)==27;if($cmp409){__label__=118;;}else{__label__=119;;}
66149 if(__label__==118){$end_of_clause=2;;}
66150 var $227=$p2;var $newword412=(($227+19)&4294967295);var $228=HEAPU8[($newword412)];var $conv413=((($228))&255);var $and414=($conv413)&2;var $tobool415=((($and414))|0)!=0;var $229=HEAP32[((__ZZ11CalcLengthsP10TranslatorE14more_syllables)>>2)];var $cmp417=((($229))|0)==0;var $or_cond=($tobool415)&($cmp417);if($or_cond){__label__=120;;}else{__label__=121;;}
66151 if(__label__==120){$end_of_clause=2;;}
66152 var $230=$next;var $ph420=(($230+8)&4294967295);var $231=HEAP32[(($ph420)>>2)];var $code421=(($231+10)&4294967295);var $232=HEAPU8[($code421)];var $conv422=((($232))&255);var $cmp423=((($conv422))|0)==23;if($cmp423){__label__=122;;}else{__label__=124;;}
66153 $land_lhs_true424$$if_end431$172:do{if(__label__==122){var $233=$next2;var $type425=(($233+15)&4294967295);var $234=HEAPU8[($type425)];var $conv426=((($234))&255);var $cmp427=((($conv426))|0)==0;if(!($cmp427)){__label__=124;break $land_lhs_true424$$if_end431$172;}
66154 var $235=$next2;$next=$235;var $236=$next3;$next2=$236;var $237=$ix;var $add429=((($237)+4)&4294967295);var $arrayidx430=((_phoneme_list+$add429*24)&4294967295);$next3=$arrayidx430;;}}while(0);var $238=HEAP32[((__ZZ11CalcLengthsP10TranslatorE14more_syllables)>>2)];var $cmp432=((($238))|0)==0;var $239=$next2;var $ph434=(($239+8)&4294967295);var $240=HEAP32[(($ph434)>>2)];var $length_mod435=(($240+15)&4294967295);var $241=HEAPU8[($length_mod435)];var $conv436=((($241))&255);var $mul437=((($conv436)*10)&4294967295);var $242=$next;var $ph438=(($242+8)&4294967295);var $243=HEAP32[(($ph438)>>2)];var $length_mod439=(($243+15)&4294967295);var $244=HEAPU8[($length_mod439)];var $conv440=((($244))&255);var $add441=((($conv440)+($mul437))&4294967295);var $245=$tr_addr;var $langopts442=(($245)&4294967295);if($cmp432){__label__=125;;}else{__label__=129;;}
66155 $if_then433$$if_else466$176:do{if(__label__==125){var $length_mods0=(($langopts442+180)&4294967295);var $246=HEAP32[(($length_mods0)>>2)];var $arrayidx443=(($246+$add441)&4294967295);var $247=HEAPU8[($arrayidx443)];var $conv444=((($247))&255);$len=$conv444;var $248=$next;var $newword445=(($248+19)&4294967295);var $249=HEAP8[($newword445)];var $tobool446=(tempInt=(($249)),(tempInt>=128?tempInt-256:tempInt))!=0;if($tobool446){__label__=126;;}else{__label__=128;;}
66156 $land_lhs_true447$$if_else464$178:do{if(__label__==126){var $250=$tr_addr;var $langopts448=(($250)&4294967295);var $word_gap449=(($langopts448)&4294967295);var $251=HEAP32[(($word_gap449)>>2)];var $and450=($251)&32;var $tobool451=((($and450))|0)!=0;if(!($tobool451)){__label__=128;break $land_lhs_true447$$if_else464$178;}
66157 var $252=$len;var $253=$next;var $ph453=(($253+8)&4294967295);var $254=HEAP32[(($ph453)>>2)];var $length_mod454=(($254+15)&4294967295);var $255=HEAPU8[($length_mod454)];var $conv455=((($255))&255);var $mul456=((($conv455)*10)&4294967295);var $add457=((($mul456)+1)&4294967295);var $256=$tr_addr;var $langopts458=(($256)&4294967295);var $length_mods0459=(($langopts458+180)&4294967295);var $257=HEAP32[(($length_mods0459)>>2)];var $arrayidx460=(($257+$add457)&4294967295);var $258=HEAPU8[($arrayidx460)];var $conv461=((($258))&255);var $add462=((($conv461)+($252))&4294967295);var $div463=((((($add462))|0)/2)|0);$length_mod=$div463;__label__=134;break $if_then433$$if_else466$176;}}while(0);var $259=$len;$length_mod=$259;;}
66158 else if(__label__==129){var $length_mods=(($langopts442+176)&4294967295);var $260=HEAP32[(($length_mods)>>2)];var $arrayidx476=(($260+$add441)&4294967295);var $261=HEAPU8[($arrayidx476)];var $conv477=((($261))&255);$length_mod=$conv477;var $262=$next;var $type478=(($262+15)&4294967295);var $263=HEAPU8[($type478)];var $conv479=((($263))&255);var $cmp480=((($conv479))|0)==8;if(!($cmp480)){__label__=134;break $if_then433$$if_else466$176;}
66159 var $264=$next2;var $type482=(($264+15)&4294967295);var $265=HEAPU8[($type482)];var $conv483=((($265))&255);var $cmp484=((($conv483))|0)==4;if($cmp484){__label__=132;;}else{__label__=131;;}
66160 if(__label__==131){var $266=$next2;var $type486=(($266+15)&4294967295);var $267=HEAPU8[($type486)];var $conv487=((($267))&255);var $cmp488=((($conv487))|0)==5;if(!($cmp488)){__label__=134;break $if_then433$$if_else466$176;}}
66161 var $268=$next3;var $ph490=(($268+8)&4294967295);var $269=HEAP32[(($ph490)>>2)];var $phflags491=(($269+4)&4294967295);var $270=HEAP32[(($phflags491)>>2)];var $and492=($270)&8;var $tobool493=((($and492))|0)!=0;if(!($tobool493)){__label__=134;break $if_then433$$if_else466$176;}
66162 var $271=$length_mod;var $sub495=((($271)-15)&4294967295);$length_mod=$sub495;;}}while(0);var $272=HEAP32[((__ZZ11CalcLengthsP10TranslatorE14more_syllables)>>2)];var $cmp498=((($272))|0)==0;if($cmp498){__label__=135;;}else{__label__=136;;}
66163 if(__label__==135){var $273=HEAP32[((__ZL6speed1)>>2)];var $274=$length_mod;var $mul500=((($274)*($273))&4294967295);$length_mod=$mul500;;}
66164 else if(__label__==136){var $275=HEAP32[((__ZZ11CalcLengthsP10TranslatorE14more_syllables)>>2)];var $cmp502=((($275))|0)==1;if($cmp502){__label__=137;;}else{__label__=138;;}
66165 if(__label__==137){var $276=HEAP32[((__ZL6speed2)>>2)];var $277=$length_mod;var $mul504=((($277)*($276))&4294967295);$length_mod=$mul504;;}
66166 else if(__label__==138){var $278=HEAP32[((__ZL6speed3)>>2)];var $279=$length_mod;var $mul506=((($279)*($278))&4294967295);$length_mod=$mul506;;}}
66167 var $280=$length_mod;var $div509=((((($280))|0)/128)|0);$length_mod=$div509;var $cmp510=((($div509))|0)<8;if($cmp510){__label__=140;;}else{__label__=141;;}
66168 if(__label__==140){$length_mod=8;;}
66169 var $281=$stress;var $cmp513=((($281))|0)>=7;if($cmp513){__label__=142;;}else{__label__=144;;}
66170 $if_then514$$if_else520$199:do{if(__label__==142){var $282=$length_mod;var $add515=((($282)+20)&4294967295);$length_mod=$add515;var $283=$emphasized;var $tobool516=((($283))|0)!=0;if(!($tobool516)){__label__=146;break $if_then514$$if_else520$199;}
66171 var $284=$length_mod;var $add518=((($284)+10)&4294967295);$length_mod=$add518;;}
66172 else if(__label__==144){var $285=$emphasized;var $tobool521=((($285))|0)!=0;if(!($tobool521)){__label__=146;break $if_then514$$if_else520$199;}
66173 var $286=$length_mod;var $add523=((($286)+20)&4294967295);$length_mod=$add523;;}}while(0);var $287=$stress;var $288=$tr_addr;var $stress_lengths=(($288+676)&4294967295);var $arrayidx526=(($stress_lengths+$287*2)&4294967295);var $289=HEAP16[(($arrayidx526)>>1)];var $conv527=(tempInt=(($289)),(tempInt>=32768?tempInt-65536:tempInt));$len=$conv527;var $cmp528=((($conv527))|0)==0;if($cmp528){__label__=147;;}else{__label__=148;;}
66174 if(__label__==147){var $290=$tr_addr;var $stress_lengths530=(($290+676)&4294967295);var $arrayidx531=(($stress_lengths530+12)&4294967295);var $291=HEAP16[(($arrayidx531)>>1)];var $conv532=(tempInt=(($291)),(tempInt>=32768?tempInt-65536:tempInt));$len=$conv532;;}
66175 var $292=$length_mod;var $293=$len;var $mul534=((($293)*($292))&4294967295);$length_mod=$mul534;var $294=$p;var $tone_ph=(($294+3)&4294967295);var $295=HEAPU8[($tone_ph)];var $conv535=((($295))&255);var $cmp536=((($conv535))|0)!=0;if($cmp536){__label__=149;;}else{__label__=151;;}
66176 $if_then537$$if_end546$208:do{if(__label__==149){var $296=$p;var $tone_ph538=(($296+3)&4294967295);var $297=HEAPU8[($tone_ph538)];var $idxprom=((($297))&255);var $arrayidx539=((_phoneme_tab+$idxprom*4)&4294967295);var $298=HEAP32[(($arrayidx539)>>2)];var $std_length=(($298+14)&4294967295);var $299=HEAPU8[($std_length)];var $conv540=((($299))&255);$tone_mod=$conv540;var $cmp541=((($conv540))|0)>0;if(!($cmp541)){__label__=151;break $if_then537$$if_end546$208;}
66177 var $300=$length_mod;var $301=$tone_mod;var $mul543=((($301)*($300))&4294967295);var $div544=((((($mul543))|0)/100)|0);$length_mod=$div544;;}}while(0);var $302=$end_of_clause;var $cmp547=((($302))|0)==2;if($cmp547){__label__=152;;}else{__label__=155;;}
66178 if(__label__==152){var $303=$p;var $ph549=(($303+8)&4294967295);var $304=HEAP32[(($ph549)>>2)];var $std_length550=(($304+14)&4294967295);var $305=HEAPU8[($std_length550)];var $conv551=((($305))&255);var $mul552=((($conv551)*2)&4294967295);$len=$mul552;var $306=$tr_addr;var $langopts553=(($306)&4294967295);var $stress_flags=(($langopts553+12)&4294967295);var $307=HEAP32[(($stress_flags)>>2)];var $and554=($307)&262144;var $tobool555=((($and554))|0)!=0;if($tobool555){__label__=153;;}else{__label__=154;;}
66179 if(__label__==153){$len=200;;}
66180 var $308=$length_mod;var $309=$len;var $sub558=((280-($309))&4294967295);var $div559=((((($sub558))|0)/3)|0);var $add560=((($div559)+256)&4294967295);var $mul561=((($add560)*($308))&4294967295);var $div562=((((($mul561))|0)/256)|0);$length_mod=$div562;;}
66181 var $310=$length_mod;var $311=$tr_addr;var $langopts564=(($311)&4294967295);var $max_lengthmod=(($langopts564+272)&4294967295);var $312=HEAP32[(($max_lengthmod)>>2)];var $313=HEAP32[((__ZL6speed1)>>2)];var $mul565=((($313)*($312))&4294967295);var $cmp566=((($310))|0)>((($mul565))|0);if($cmp566){__label__=156;;}else{__label__=157;;}
66182 if(__label__==156){var $314=$tr_addr;var $langopts568=(($314)&4294967295);var $max_lengthmod569=(($langopts568+272)&4294967295);var $315=HEAP32[(($max_lengthmod569)>>2)];var $316=HEAP32[((__ZL6speed1)>>2)];var $mul570=((($316)*($315))&4294967295);$length_mod=$mul570;;}
66183 var $317=$length_mod;var $div572=((((($317))|0)/128)|0);$length_mod=$div572;var $318=$p;var $type573=(($318+15)&4294967295);var $319=HEAPU8[($type573)];var $conv574=((($319))&255);var $cmp575=((($conv574))|0)!=2;if($cmp575){__label__=158;;}else{__label__=159;;}
66184 if(__label__==158){$length_mod=256;$min_drop=16;;}
66185 var $320=$length_mod;var $conv578=((($320))&65535);var $321=$p;var $length579=(($321+12)&4294967295);HEAP16[(($length579)>>1)]=$conv578;var $322=$p;var $env580=(($322+14)&4294967295);var $323=HEAPU8[($env580)];var $conv581=((($323))&255);var $cmp582=((($conv581))|0)>=19;if($cmp582){__label__=160;;}else{__label__=161;;}
66186 if(__label__==160){var $324=HEAP32[((__impure_ptr)>>2)];var $_stderr=(($324+12)&4294967295);var $325=HEAP32[(($_stderr)>>2)];var $326=_fwrite(((__str294)&4294967295),28,1,$325);var $327=$p;var $env584=(($327+14)&4294967295);HEAP8[($env584)]=0;;}
66187 var $328=$p;var $env586=(($328+14)&4294967295);var $329=HEAPU8[($env586)];var $conv587=((($329))&255);var $add588=((($conv587)+1)&4294967295);$env2=$add588;var $330=$p;var $tone_ph589=(($330+3)&4294967295);var $331=HEAPU8[($tone_ph589)];var $conv590=((($331))&255);var $cmp591=((($conv590))|0)!=0;if($cmp591){__label__=162;;}else{__label__=163;;}
66188 if(__label__==162){var $332=$p;var $tone_ph593=(($332+3)&4294967295);var $333=HEAPU8[($tone_ph593)];var $conv594=((($333))&255);__Z17InterpretPhoneme2iP12PHONEME_DATA($conv594,$phdata_tone);var $334=HEAP32[(($pitch_env595)>>2)];var $call596=__Z11GetEnvelopei($334);$pitch_env=$call596;;}
66189 else if(__label__==163){var $335=$env2;var $arrayidx598=((_envelope_data+$335*4)&4294967295);var $336=HEAP32[(($arrayidx598)>>2)];$pitch_env=$336;;}
66190 var $337=$p;var $pitch1600=(($337+20)&4294967295);var $338=HEAPU8[($pitch1600)];var $conv601=((($338))&255);var $339=$p;var $pitch2602=(($339+21)&4294967295);var $340=HEAPU8[($pitch2602)];var $conv603=((($340))&255);var $341=$p;var $pitch1604=(($341+20)&4294967295);var $342=HEAPU8[($pitch1604)];var $conv605=((($342))&255);var $sub606=((($conv603)-($conv605))&4294967295);var $343=$pitch_env;var $arrayidx607=(($343)&4294967295);var $344=HEAPU8[($arrayidx607)];var $conv608=((($344))&255);var $mul609=((($conv608)*($sub606))&4294967295);var $div610=((((($mul609))|0)/256)|0);var $add611=((($div610)+($conv601))&4294967295);$pitch_start=$add611;var $345=$pre_sonorant;var $tobool612=((($345))|0)!=0;if($tobool612){__lastLabel__=164;__label__=167;;}else{__lastLabel__=164;__label__=165;;}
66191 $if_then615$$lor_lhs_false613$231:do{if(__label__==165){var $346=$pre_voiced;var $tobool614=((($346))|0)!=0;if(!($tobool614)){__label__=177;break $if_then615$$lor_lhs_false613$231;}
66192 var $_pr2=$pitch_start;__lastLabel__=166;__label__=167;break $if_then615$$lor_lhs_false613$231;}}while(0);$if_then615$$if_end650$234:do{if(__label__==167){var $347=__lastLabel__==166?$_pr2:($add611);var $cmp616=((($347))|0)==255;if($cmp616){__label__=168;;}else{__label__=169;;}
66193 if(__label__==168){var $348=$pitch_start;$last_pitch=$348;;}
66194 var $349=$pitch_start;var $350=$last_pitch;var $sub619=((($349)-($350))&4294967295);var $cmp620=((($sub619))|0)>16;if($cmp620){__label__=170;;}else{__label__=171;;}
66195 if(__label__==170){var $351=$pitch_start;var $sub622=((($351)-16)&4294967295);$last_pitch=$sub622;;}
66196 var $352=$last_pitch;var $conv624=((($352))&255);var $353=$prev;var $pitch1625=(($353+20)&4294967295);HEAP8[($pitch1625)]=$conv624;var $354=$pitch_start;var $conv626=((($354))&255);var $355=$prev;var $pitch2627=(($355+21)&4294967295);HEAP8[($pitch2627)]=$conv626;var $356=$last_pitch;var $357=$pitch_start;var $cmp628=((($356))|0)<((($357))|0);var $358=$prev;var $env630=(($358+14)&4294967295);if($cmp628){__label__=172;;}else{__label__=173;;}
66197 if(__label__==172){HEAP8[($env630)]=2;var $359=$env2;var $conv631=((($359))&255);var $360=$p;var $env632=(($360+14)&4294967295);HEAP8[($env632)]=$conv631;;}
66198 else if(__label__==173){HEAP8[($env630)]=0;;}
66199 var $361=$length_mod;var $conv636=((($361))&65535);var $362=$prev;var $length637=(($362+12)&4294967295);HEAP16[(($length637)>>1)]=$conv636;var $363=$p;var $amp638=(($363+18)&4294967295);var $364=HEAP8[($amp638)];var $365=$prev;var $amp639=(($365+18)&4294967295);HEAP8[($amp639)]=$364;var $366=$prev;var $type640=(($366+15)&4294967295);var $367=HEAPU8[($type640)];var $conv641=((($367))&255);var $cmp642=((($conv641))|0)!=3;if(!($cmp642)){__label__=177;break $if_then615$$if_end650$234;}
66200 var $368=$prev;var $amp644=(($368+18)&4294967295);var $369=HEAPU8[($amp644)];var $conv645=((($369))&255);var $cmp646=((($conv645))|0)>18;if(!($cmp646)){__label__=177;break $if_then615$$if_end650$234;}
66201 var $370=$prev;var $amp648=(($370+18)&4294967295);HEAP8[($amp648)]=18;;}}while(0);var $371=$next;var $synthflags651=(($371+4)&4294967295);var $372=HEAPU16[(($synthflags651)>>1)];var $conv652=((($372))&65535);var $and653=($conv652)&-2;var $conv654=((($and653))&65535);HEAP16[(($synthflags651)>>1)]=$conv654;var $373=$next;var $type655=(($373+15)&4294967295);var $374=HEAPU8[($type655)];var $conv656=((($374))&255);var $cmp657=((($conv656))|0)==8;if($cmp657){__label__=178;;}else{__label__=180;;}
66202 $land_lhs_true658$$if_end666$249:do{if(__label__==178){var $375=$next2;var $type659=(($375+15)&4294967295);var $376=HEAPU8[($type659)];var $conv660=((($376))&255);var $cmp661=((($conv660))|0)!=2;if(!($cmp661)){__label__=180;break $land_lhs_true658$$if_end666$249;}
66203 var $377=$next;var $synthflags663=(($377+4)&4294967295);var $378=HEAPU16[(($synthflags663)>>1)];var $conv664=((($378))&65535);var $or=($conv664)|1;var $conv665=((($or))&65535);HEAP16[(($synthflags663)>>1)]=$conv665;;}}while(0);var $379=$next;var $type667=(($379+15)&4294967295);var $380=HEAPU8[($type667)];var $conv668=((($380))&255);var $cmp669=((($conv668))|0)==3;if($cmp669){__label__=181;;}else{__label__=186;;}
66204 $if_then670$$if_end697$253:do{if(__label__==181){var $381=$next;var $synthflags671=(($381+4)&4294967295);var $382=HEAPU16[(($synthflags671)>>1)];var $conv672=((($382))&65535);var $or673=($conv672)|1;var $conv674=((($or673))&65535);HEAP16[(($synthflags671)>>1)]=$conv674;var $383=$next2;var $type675=(($383+15)&4294967295);var $384=HEAPU8[($type675)];var $conv676=((($384))&255);var $cmp677=((($conv676))|0)==2;if($cmp677){__label__=182;;}else{__label__=183;;}
66205 if(__label__==182){var $385=$next;var $synthflags679=(($385+4)&4294967295);var $386=HEAPU16[(($synthflags679)>>1)];var $conv680=((($386))&65535);var $and681=($conv680)&-2;var $conv682=((($and681))&65535);HEAP16[(($synthflags679)>>1)]=$conv682;;}
66206 var $387=$next2;var $type684=(($387+15)&4294967295);var $388=HEAPU8[($type684)];var $conv685=((($388))&255);var $cmp686=((($conv685))|0)!=2;if(!($cmp686)){__label__=186;break $if_then670$$if_end697$253;}
66207 var $389=$next;var $ph688=(($389+8)&4294967295);var $390=HEAP32[(($ph688)>>2)];var $mnemonic=(($390)&4294967295);var $391=HEAP32[(($mnemonic)>>2)];var $cmp689=((($391))|0)==12146;if(!($cmp689)){__label__=186;break $if_then670$$if_end697$253;}
66208 var $392=$next;var $synthflags691=(($392+4)&4294967295);var $393=HEAPU16[(($synthflags691)>>1)];var $conv692=((($393))&65535);var $and693=($conv692)&-2;var $conv694=((($and693))&65535);HEAP16[(($synthflags691)>>1)]=$conv694;;}}while(0);var $394=$min_drop;var $cmp698=((($394))|0)>0;if($cmp698){__label__=187;;}else{__label__=191;;}
66209 $land_lhs_true699$$if_end715$261:do{if(__label__==187){var $395=$p;var $pitch2700=(($395+21)&4294967295);var $396=HEAPU8[($pitch2700)];var $conv701=((($396))&255);var $397=$p;var $pitch1702=(($397+20)&4294967295);var $398=HEAPU8[($pitch1702)];var $conv703=((($398))&255);var $sub704=((($conv701)-($conv703))&4294967295);var $399=$min_drop;var $cmp705=((($sub704))|0)<((($399))|0);if(!($cmp705)){__label__=191;break $land_lhs_true699$$if_end715$261;}
66210 var $400=$p;var $pitch2707=(($400+21)&4294967295);var $401=HEAPU8[($pitch2707)];var $conv708=((($401))&255);var $402=$min_drop;var $sub709=((($conv708)-($402))&4294967295);$pitch1=$sub709;var $403=$pitch1;var $cmp710=((($403))|0)<0;if($cmp710){__label__=189;;}else{__label__=190;;}
66211 if(__label__==189){$pitch1=0;;}
66212 var $404=$pitch1;var $conv713=((($404))&255);var $405=$p;var $pitch1714=(($405+20)&4294967295);HEAP8[($pitch1714)]=$conv713;;}}while(0);var $406=$p;var $pitch1716=(($406+20)&4294967295);var $407=HEAPU8[($pitch1716)];var $conv717=((($407))&255);var $408=$p;var $pitch2718=(($408+21)&4294967295);var $409=HEAPU8[($pitch2718)];var $conv719=((($409))&255);var $410=$p;var $pitch1720=(($410+20)&4294967295);var $411=HEAPU8[($pitch1720)];var $conv721=((($411))&255);var $sub722=((($conv719)-($conv721))&4294967295);var $412=$p;var $env723=(($412+14)&4294967295);var $413=HEAPU8[($env723)];var $idxprom724=((($413))&255);var $arrayidx725=((_envelope_data+$idxprom724*4)&4294967295);var $414=HEAP32[(($arrayidx725)>>2)];var $arrayidx726=(($414+127)&4294967295);var $415=HEAPU8[($arrayidx726)];var $conv727=((($415))&255);var $mul728=((($conv727)*($sub722))&4294967295);var $div729=((((($mul728))|0)/256)|0);var $add730=((($div729)+($conv717))&4294967295);$last_pitch=$add730;$pre_sonorant=0;$pre_voiced=0;;}
66213 var $416=$ix;var $inc732=((($416)+1)&4294967295);$ix=$inc732;var $417=$ix;var $418=HEAP32[((_n_phoneme_list)>>2)];var $cmp=((($417))|0)<((($418))|0);if($cmp){__label__=2;continue $for_body$4;}else{__label__=193;break $for_body_lr_ph$$for_end733$2;}}}}while(0);STACKTOP=__stackBase__;return;return;}
66214 function __ZL11DoEmbedded2Pi($embix){;var __label__;var $embix_addr;var $word;$embix_addr=$embix;;while(1){var $0=$embix_addr;var $1=HEAP32[(($0)>>2)];var $inc=((($1)+1)&4294967295);HEAP32[(($0)>>2)]=$inc;var $arrayidx=((_embedded_list+$1*4)&4294967295);var $2=HEAP32[(($arrayidx)>>2)];$word=$2;var $3=$word;var $and=($3)&31;var $cmp=((($and))|0)==2;if($cmp){__label__=2;;}else{__label__=3;;}
66215 if(__label__==2){var $4=$word;var $and1=($4)&127;var $5=$word;var $shr=($5)>>>8;__Z11SetEmbeddedii($and1,$shr);__Z8SetSpeedi(1);;}
66216 var $6=$word;var $and2=($6)&128;var $cmp3=((($and2))|0)==0;if($cmp3){__label__=1;continue;}else{__label__=4;break;}};return;return;}
66217 function __Z20LookupAccentedLetterP10TranslatorjPc($tr,$letter,$ph_buf){var __stackBase__=STACKTOP;STACKTOP+=128;_memset(__stackBase__,0,128);var __label__;var __lastLabel__=null;var $tr_addr;var $letter_addr;var $ph_buf_addr;var $accent_data;var $accent1;var $accent2;var $basic_letter;var $letter2;var $ph_letter1=__stackBase__;var $ph_letter2=__stackBase__+32;var $ph_accent1=__stackBase__+64;var $ph_accent2=__stackBase__+96;$tr_addr=$tr;$letter_addr=$letter;$ph_buf_addr=$ph_buf;$accent_data=0;$accent1=0;$accent2=0;$letter2=0;var $arrayidx=(($ph_accent2)&4294967295);HEAP8[($arrayidx)]=0;var $0=$letter_addr;var $cmp=((($0))>>>0)>=224;var $1=$letter_addr;var $cmp1=((($1))>>>0)<383;var $or_cond=($cmp)&($cmp1);var $2=$letter_addr;if($or_cond){__label__=1;;}else{__label__=2;;}
66218 if(__label__==1){var $sub=((($2)-224)&4294967295);var $arrayidx2=((__ZL18letter_accents_0e0+$sub*2)&4294967295);var $3=HEAPU16[(($arrayidx2)>>1)];var $conv=((($3))&65535);$accent_data=$conv;__lastLabel__=1;;}
66219 else if(__label__==2){var $cmp3=((($2))>>>0)>=592;var $4=$letter_addr;var $cmp5=((($4))>>>0)<=680;var $or_cond1=($cmp3)&($cmp5);if($or_cond1){__label__=3;;}else{__label__=4;;}
66220 if(__label__==3){var $5=$letter_addr;var $sub7=((($5)-592)&4294967295);var $arrayidx8=((__ZL18letter_accents_250+$sub7*2)&4294967295);var $6=HEAPU16[(($arrayidx8)>>1)];var $conv9=((($6))&65535);$accent_data=$conv9;__lastLabel__=3;;}
66221 else if(__label__==4){var $_pr=$accent_data;__lastLabel__=4;;}}
66222 var $7=__lastLabel__==4?$_pr:(__lastLabel__==3?$conv9:($conv));var $cmp11=((($7))|0)!=0;if($cmp11){__label__=6;;}else{__label__=24;;}
66223 $if_then12$$if_end91$9:do{if(__label__==6){var $8=$accent_data;var $and=($8)&63;var $add=((($and)+59)&4294967295);$basic_letter=$add;var $9=$basic_letter;var $cmp13=((($9))|0)<97;if($cmp13){__label__=7;;}else{__label__=8;;}
66224 if(__label__==7){var $10=$basic_letter;var $sub15=((($10)-59)&4294967295);var $arrayidx16=((__ZL13non_ascii_tab+$sub15*2)&4294967295);var $11=HEAP16[(($arrayidx16)>>1)];var $conv17=(tempInt=(($11)),(tempInt>=32768?tempInt-65536:tempInt));$basic_letter=$conv17;;}
66225 var $12=$accent_data;var $and19=($12)&32768;var $tobool=((($and19))|0)!=0;var $13=$accent_data;var $shr=($13)>>6;if($tobool){__label__=9;;}else{__label__=10;;}
66226 if(__label__==9){var $and21=($shr)&63;$letter2=$and21;var $14=$letter2;var $add22=((($14)+59)&4294967295);$letter2=$add22;var $15=$accent_data;var $shr23=($15)>>12;var $and24=($shr23)&7;$accent2=$and24;;}
66227 else if(__label__==10){var $and27=($shr)&31;$accent1=$and27;var $16=$accent_data;var $shr28=($16)>>11;var $and29=($shr28)&15;$accent2=$and29;;}
66228 var $17=$tr_addr;var $18=$accent1;var $arrayidx31=((__ZL11accents_tab+$18*8)&4294967295);var $name=(($arrayidx31)&4294967295);var $19=HEAP32[(($name)>>2)];var $arraydecay=(($ph_accent1)&4294967295);var $call=__Z6LookupP10TranslatorPKcPc($17,$19,$arraydecay);var $cmp32=((($call))|0)!=0;if(!($cmp32)){__label__=24;break $if_then12$$if_end91$9;}
66229 var $20=$tr_addr;var $21=$basic_letter;var $arraydecay34=(($ph_letter1)&4294967295);var $call35=__ZL13LookupLetter2P10TranslatorjPc($20,$21,$arraydecay34);var $cmp36=((($call35))|0)!=0;if(!($cmp36)){__label__=24;break $if_then12$$if_end91$9;}
66230 var $22=$accent2;var $cmp38=((($22))|0)!=0;if($cmp38){__label__=14;;}else{__label__=16;;}
66231 $if_then39$$if_end56$20:do{if(__label__==14){var $23=$tr_addr;var $24=$accent2;var $arrayidx40=((__ZL11accents_tab+$24*8)&4294967295);var $name41=(($arrayidx40)&4294967295);var $25=HEAP32[(($name41)>>2)];var $arraydecay42=(($ph_accent2)&4294967295);var $call43=__Z6LookupP10TranslatorPKcPc($23,$25,$arraydecay42);var $26=$accent2;var $arrayidx47=((__ZL11accents_tab+$26*8)&4294967295);var $flags=(($arrayidx47+4)&4294967295);var $27=HEAP32[(($flags)>>2)];var $and48=($27)&1;var $tobool49=((($and48))|0)!=0;if(!($tobool49)){__label__=16;break $if_then39$$if_end56$20;}
66232 var $28=$ph_buf_addr;var $arraydecay51=(($ph_accent2)&4294967295);var $call52=_strcpy($28,$arraydecay51);var $29=$ph_buf_addr;var $call53=_strlen($29);var $30=$ph_buf_addr;var $add_ptr=(($30+$call53)&4294967295);$ph_buf_addr=$add_ptr;var $arrayidx54=(($ph_accent2)&4294967295);HEAP8[($arrayidx54)]=0;;}}while(0);var $31=$letter2;var $cmp57=((($31))|0)!=0;if($cmp57){__label__=17;;}else{__label__=18;;}
66233 if(__label__==17){var $32=$tr_addr;var $33=$letter2;var $arraydecay59=(($ph_letter2)&4294967295);var $call60=__ZL13LookupLetter2P10TranslatorjPc($32,$33,$arraydecay59);var $34=$ph_buf_addr;var $arraydecay61=(($ph_accent1)&4294967295);var $arraydecay62=(($ph_letter1)&4294967295);var $arraydecay63=(($ph_letter2)&4294967295);var $arraydecay64=(($ph_accent2)&4294967295);var $call65=_sprintf($34,((__str297)&4294967295),allocate([$arraydecay61,0,0,0,23,0,0,0,$arraydecay62,0,0,0,6,0,0,0,$arraydecay63,0,0,0,$arraydecay64,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));;}
66234 else if(__label__==18){var $35=$accent1;var $cmp67=((($35))|0)==0;if($cmp67){__label__=19;;}else{__label__=20;;}
66235 if(__label__==19){var $36=$ph_buf_addr;var $arraydecay69=(($ph_letter1)&4294967295);var $call70=_strcpy($36,$arraydecay69);;}
66236 else if(__label__==20){var $37=$tr_addr;var $langopts=(($37)&4294967295);var $accents=(($langopts+220)&4294967295);var $38=HEAP32[(($accents)>>2)];var $and72=($38)&1;var $tobool73=((($and72))|0)!=0;if($tobool73){__label__=22;;}else{__label__=21;;}
66237 $if_then78$$lor_lhs_false$30:do{if(__label__==21){var $39=$accent1;var $arrayidx74=((__ZL11accents_tab+$39*8)&4294967295);var $flags75=(($arrayidx74+4)&4294967295);var $40=HEAP32[(($flags75)>>2)];var $and76=($40)&1;var $tobool77=((($and76))|0)!=0;if($tobool77){__label__=22;break $if_then78$$lor_lhs_false$30;}
66238 var $42=$ph_buf_addr;var $arraydecay83=(($ph_letter1)&4294967295);var $arraydecay84=(($ph_accent1)&4294967295);var $call85=_sprintf($42,((__str2299)&4294967295),allocate([4,0,0,0,$arraydecay83,0,0,0,23,0,0,0,$arraydecay84,0,0,0,23,0,0,0],["i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0],ALLOC_STACK));__label__=24;break $if_then12$$if_end91$9;}}while(0);var $41=$ph_buf_addr;var $arraydecay79=(($ph_accent1)&4294967295);var $arraydecay80=(($ph_letter1)&4294967295);var $call81=_sprintf($41,((__str1298)&4294967295),allocate([$arraydecay79,0,0,0,23,0,0,0,6,0,0,0,$arraydecay80,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0],ALLOC_STACK));;}}}}while(0);STACKTOP=__stackBase__;return;return;}
66239 function __ZL13LookupLetter2P10TranslatorjPc($tr,$letter,$ph_buf){var __stackBase__=STACKTOP;STACKTOP+=12;_memset(__stackBase__,0,12);var __label__;var $tr_addr;var $letter_addr;var $ph_buf_addr;var $len;var $single_letter=__stackBase__;$tr_addr=$tr;$letter_addr=$letter;$ph_buf_addr=$ph_buf;var $arrayidx=(($single_letter)&4294967295);HEAP8[($arrayidx)]=0;var $arrayidx1=(($single_letter+1)&4294967295);HEAP8[($arrayidx1)]=95;var $0=$letter_addr;var $arrayidx2=(($single_letter+2)&4294967295);var $call=__Z8utf8_outjPc($0,$arrayidx2);$len=$call;var $1=$len;var $add=((($1)+2)&4294967295);var $arrayidx3=(($single_letter+$add)&4294967295);HEAP8[($arrayidx3)]=32;var $2=$len;var $add4=((($2)+3)&4294967295);var $arrayidx5=(($single_letter+$add4)&4294967295);HEAP8[($arrayidx5)]=0;var $3=$tr_addr;var $arrayidx6=(($single_letter+1)&4294967295);var $4=$ph_buf_addr;var $call7=__Z6LookupP10TranslatorPKcPc($3,$arrayidx6,$4);var $cmp=((($call7))|0)==0;if($cmp){__label__=1;;}else{__label__=3;;}
66240 $if_then$$if_end15$2:do{if(__label__==1){var $arrayidx8=(($single_letter+1)&4294967295);HEAP8[($arrayidx8)]=32;var $5=$tr_addr;var $arrayidx9=(($single_letter+2)&4294967295);var $6=$ph_buf_addr;var $call10=__Z6LookupP10TranslatorPKcPc($5,$arrayidx9,$6);var $cmp11=((($call10))|0)==0;if(!($cmp11)){__label__=3;break $if_then$$if_end15$2;}
66241 var $7=$tr_addr;var $arrayidx13=(($single_letter+2)&4294967295);var $8=$ph_buf_addr;var $call14=__Z14TranslateRulesP10TranslatorPcS1_iS1_iPj($7,$arrayidx13,$8,20,0,0,0);;}}while(0);var $9=$ph_buf_addr;var $arrayidx16=(($9)&4294967295);var $10=HEAP8[($arrayidx16)];var $conv=(tempInt=(($10)),(tempInt>=128?tempInt-256:tempInt));STACKTOP=__stackBase__;return $conv;return null;}
66242 function __Z12LookupLetterP10TranslatorjiPci($tr,$letter,$next_byte,$ph_buf1,$control){var __stackBase__=STACKTOP;STACKTOP+=48;_memset(__stackBase__,0,48);var __label__;var $tr_addr;var $letter_addr;var $next_byte_addr;var $ph_buf1_addr;var $control_addr;var $len;var $dict_flags=__stackBase__;var $ph_buf3=__stackBase__+8;var $ptr;$tr_addr=$tr;$letter_addr=$letter;$next_byte_addr=$next_byte;$ph_buf1_addr=$ph_buf1;$control_addr=$control;var $0=$ph_buf1_addr;var $arrayidx=(($0)&4294967295);HEAP8[($arrayidx)]=0;var $1=$letter_addr;var $call=__Z8utf8_outjPc($1,((__ZZ12LookupLetterP10TranslatorjiPciE13single_letter+2)&4294967295));$len=$call;var $2=$len;var $add=((($2)+2)&4294967295);var $arrayidx1=((__ZZ12LookupLetterP10TranslatorjiPciE13single_letter+$add)&4294967295);HEAP8[($arrayidx1)]=32;var $3=$next_byte_addr;var $cmp=((($3))|0)==-1;if($cmp){__label__=1;;}else{__label__=7;;}
66243 $if_then$$if_end19$2:do{if(__label__==1){var $4=$tr_addr;var $5=$ph_buf1_addr;var $call2=__Z6LookupP10TranslatorPKcPc($4,((__ZZ12LookupLetterP10TranslatorjiPciE13single_letter+2)&4294967295),$5);var $cmp3=((($call2))|0)!=0;if($cmp3){__label__=20;break $if_then$$if_end19$2;}
66244 HEAP8[(((__ZZ12LookupLetterP10TranslatorjiPciE13single_letter+1)&4294967295))]=95;var $6=$tr_addr;var $arraydecay=(($ph_buf3)&4294967295);var $call5=__Z6LookupP10TranslatorPKcPc($6,((__ZZ12LookupLetterP10TranslatorjiPciE13single_letter+1)&4294967295),$arraydecay);var $cmp6=((($call5))|0)!=0;if($cmp6){__label__=20;break $if_then$$if_end19$2;}
66245 var $7=$tr_addr;var $translator_name=(($7+280)&4294967295);var $8=HEAP32[(($translator_name)>>2)];var $cmp9=((($8))|0)==25966;if($cmp9){__label__=20;break $if_then$$if_end19$2;}
66246 var $call12=__Z14SetTranslator2PKc(((__str52704)&4294967295));var $9=HEAP32[((_translator2)>>2)];var $arraydecay13=(($ph_buf3)&4294967295);var $call14=__Z6LookupP10TranslatorPKcPc($9,((__ZZ12LookupLetterP10TranslatorjiPciE13single_letter+2)&4294967295),$arraydecay13);var $cmp15=((($call14))|0)!=0;if($cmp15){__label__=5;;}else{__label__=6;;}
66247 if(__label__==5){var $10=$ph_buf1_addr;HEAP8[($10)]=21;var $nul=(($10+1)&4294967295);HEAP8[($nul)]=0;;}
66248 var $11=HEAP32[((_voice)>>2)];var $phoneme_tab_ix=(($11+40)&4294967295);var $12=HEAP32[(($phoneme_tab_ix)>>2)];__Z18SelectPhonemeTablei($12);;}
66249 else if(__label__==7){var $13=$letter_addr;var $cmp20=((($13))>>>0)<=32;if($cmp20){__label__=9;;}else{__label__=8;;}
66250 $if_then22$$lor_lhs_false$11:do{if(__label__==8){var $14=$letter_addr;var $call21=_iswspace($14);var $tobool=((($call21))|0)!=0;if($tobool){__label__=9;break $if_then22$$lor_lhs_false$11;}
66251 var $18=$next_byte_addr;var $cmp26=((($18))|0)!=32;if($cmp26){__label__=11;;}else{__label__=12;;}
66252 if(__label__==11){$next_byte_addr=31;;}
66253 var $19=$next_byte_addr;var $conv=((($19))&255);var $20=$len;var $add29=((($20)+3)&4294967295);var $arrayidx30=((__ZZ12LookupLetterP10TranslatorjiPciE13single_letter+$add29)&4294967295);HEAP8[($arrayidx30)]=$conv;HEAP8[(((__ZZ12LookupLetterP10TranslatorjiPciE13single_letter+1)&4294967295))]=95;var $arrayidx31=(($dict_flags+4)&4294967295);HEAP32[(($arrayidx31)>>2)]=0;$ptr=((__ZZ12LookupLetterP10TranslatorjiPciE13single_letter+1)&4294967295);var $21=$tr_addr;var $arraydecay32=(($ph_buf3)&4294967295);var $call33=__Z6LookupP10TranslatorPKcPc($21,((__ZZ12LookupLetterP10TranslatorjiPciE13single_letter+1)&4294967295),$arraydecay32);var $cmp34=((($call33))|0)==0;if($cmp34){__label__=13;;}else{__label__=15;;}
66254 $if_then35$$if_end43$17:do{if(__label__==13){HEAP8[(((__ZZ12LookupLetterP10TranslatorjiPciE13single_letter+1)&4294967295))]=32;var $22=$tr_addr;var $arraydecay36=(($ph_buf3)&4294967295);var $call37=__Z6LookupP10TranslatorPKcPc($22,((__ZZ12LookupLetterP10TranslatorjiPciE13single_letter+2)&4294967295),$arraydecay36);var $cmp38=((($call37))|0)==0;if(!($cmp38)){__label__=15;break $if_then35$$if_end43$17;}
66255 var $23=$tr_addr;var $arraydecay40=(($ph_buf3)&4294967295);var $call41=__Z14TranslateRulesP10TranslatorPcS1_iS1_iPj($23,((__ZZ12LookupLetterP10TranslatorjiPciE13single_letter+2)&4294967295),$arraydecay40,40,0,268435456,0);;}}while(0);var $arrayidx44=(($ph_buf3)&4294967295);var $24=HEAP8[($arrayidx44)];var $conv45=(tempInt=(($24)),(tempInt>=128?tempInt-256:tempInt));var $cmp46=((($conv45))|0)==0;if($cmp46){__label__=16;;}else{__label__=17;;}
66256 if(__label__==16){var $25=$tr_addr;var $26=$letter_addr;var $arraydecay48=(($ph_buf3)&4294967295);__Z20LookupAccentedLetterP10TranslatorjPc($25,$26,$arraydecay48);;}
66257 var $27=$ph_buf1_addr;var $arraydecay50=(($ph_buf3)&4294967295);var $call51=_strcpy($27,$arraydecay50);var $28=$ph_buf1_addr;var $arrayidx52=(($28)&4294967295);var $29=HEAP8[($arrayidx52)];var $conv53=(tempInt=(($29)),(tempInt>=128?tempInt-256:tempInt));var $cmp54=((($conv53))|0)==0;if($cmp54){__label__=20;break $if_then$$if_end19$2;}
66258 var $30=$ph_buf1_addr;var $arrayidx56=(($30)&4294967295);var $31=HEAP8[($arrayidx56)];var $conv57=(tempInt=(($31)),(tempInt>=128?tempInt-256:tempInt));var $cmp58=((($conv57))|0)==21;if($cmp58){__label__=20;break $if_then$$if_end19$2;}
66259 var $arrayidx61=(($dict_flags)&4294967295);HEAP32[(($arrayidx61)>>2)]=0;var $arrayidx62=(($dict_flags+4)&4294967295);HEAP32[(($arrayidx62)>>2)]=0;var $32=$tr_addr;var $33=$ph_buf1_addr;var $arraydecay63=(($dict_flags)&4294967295);var $34=$control_addr;var $and=($34)&1;__Z13SetWordStressP10TranslatorPcPjii($32,$33,$arraydecay63,-1,$and);__label__=20;break $if_then$$if_end19$2;}}while(0);var $15=$letter_addr;var $call23=_sprintf(((__ZZ12LookupLetterP10TranslatorjiPciE13single_letter+1)&4294967295),((__str5302)&4294967295),allocate([$15,0,0,0],["i32",0,0,0],ALLOC_STACK));var $16=$tr_addr;var $17=$ph_buf1_addr;var $call24=__Z6LookupP10TranslatorPKcPc($16,((__ZZ12LookupLetterP10TranslatorjiPciE13single_letter+1)&4294967295),$17);;}}while(0);STACKTOP=__stackBase__;return;return;}
66260 function __Z15TranslateLetterP10TranslatorPcS1_i($tr,$word,$phonemes,$control){var __stackBase__=STACKTOP;STACKTOP+=152;_memset(__stackBase__,0,152);var __label__;var $retval;var $tr_addr;var $word_addr;var $phonemes_addr;var $control_addr;var $n_bytes;var $letter=__stackBase__;var $len;var $save_option_phonemes;var $p2;var $pbuf;var $capital=__stackBase__+4;var $ph_buf=__stackBase__+24;var $ph_buf2=__stackBase__+84;var $hexbuf=__stackBase__+144;$tr_addr=$tr;$word_addr=$word;$phonemes_addr=$phonemes;$control_addr=$control;var $arrayidx=(($ph_buf)&4294967295);HEAP8[($arrayidx)]=0;var $arrayidx1=(($capital)&4294967295);HEAP8[($arrayidx1)]=0;var $0=$word_addr;var $call=__Z7utf8_inPiPKc($letter,$0);$n_bytes=$call;var $1=HEAP32[(($letter)>>2)];var $and=($1)&1048320;var $cmp=((($and))|0)==57344;if($cmp){__label__=1;;}else{__label__=2;;}
66261 if(__label__==1){var $2=HEAP32[(($letter)>>2)];var $and2=($2)&255;HEAP32[(($letter)>>2)]=$and2;;}
66262 var $3=$control_addr;var $and3=($3)&2;var $tobool=((($and3))|0)!=0;if($tobool){__label__=3;;}else{__label__=5;;}
66263 $if_then4$$if_end10$5:do{if(__label__==3){var $4=HEAP32[(($letter)>>2)];var $call5=_iswupper($4);var $tobool6=((($call5))|0)!=0;if(!($tobool6)){__label__=5;break $if_then4$$if_end10$5;}
66264 var $5=$tr_addr;var $arraydecay=(($capital)&4294967295);var $call8=__Z6LookupP10TranslatorPKcPc($5,((__str6303)&4294967295),$arraydecay);;}}while(0);var $6=HEAP32[(($letter)>>2)];var $call11=__Z9towlower2j($6);HEAP32[(($letter)>>2)]=$call11;var $7=$tr_addr;var $8=HEAP32[(($letter)>>2)];var $9=$n_bytes;var $10=$word_addr;var $arrayidx12=(($10+$9)&4294967295);var $11=HEAP8[($arrayidx12)];var $conv=(tempInt=(($11)),(tempInt>=128?tempInt-256:tempInt));var $arraydecay13=(($ph_buf)&4294967295);var $12=$control_addr;var $and14=($12)&1;__Z12LookupLetterP10TranslatorjiPci($7,$8,$conv,$arraydecay13,$and14);var $arrayidx15=(($ph_buf)&4294967295);var $13=HEAP8[($arrayidx15)];var $conv16=(tempInt=(($13)),(tempInt>=128?tempInt-256:tempInt));var $cmp17=((($conv16))|0)==21;if($cmp17){__label__=6;;}else{__label__=7;;}
66265 $if_then18$$if_end21$9:do{if(__label__==6){var $14=$phonemes_addr;var $arraydecay19=(($ph_buf)&4294967295);var $call20=_strcpy($14,$arraydecay19);$retval=0;;}
66266 else if(__label__==7){var $arrayidx22=(($ph_buf)&4294967295);var $15=HEAP8[($arrayidx22)];var $conv23=(tempInt=(($15)),(tempInt>=128?tempInt-256:tempInt));var $cmp24=((($conv23))|0)==0;if($cmp24){__label__=8;;}else{__label__=11;;}
66267 $land_lhs_true$$if_end38$12:do{if(__label__==8){var $16=$tr_addr;var $translator_name=(($16+280)&4294967295);var $17=HEAP32[(($translator_name)>>2)];var $cmp25=((($17))|0)!=25966;if(!($cmp25)){__label__=11;break $land_lhs_true$$if_end38$12;}
66268 var $call27=__Z14SetTranslator2PKc(((__str52704)&4294967295));var $18=HEAP32[((_option_phonemes)>>2)];$save_option_phonemes=$18;HEAP32[((_option_phonemes)>>2)]=0;var $19=HEAP32[((_translator2)>>2)];var $20=HEAP32[(($letter)>>2)];var $21=$n_bytes;var $22=$word_addr;var $arrayidx28=(($22+$21)&4294967295);var $23=HEAP8[($arrayidx28)];var $conv29=(tempInt=(($23)),(tempInt>=128?tempInt-256:tempInt));var $arraydecay30=(($ph_buf)&4294967295);var $24=$control_addr;var $and31=($24)&1;__Z12LookupLetterP10TranslatorjiPci($19,$20,$conv29,$arraydecay30,$and31);var $25=HEAP32[((_voice)>>2)];var $phoneme_tab_ix=(($25+40)&4294967295);var $26=HEAP32[(($phoneme_tab_ix)>>2)];__Z18SelectPhonemeTablei($26);var $27=$save_option_phonemes;HEAP32[((_option_phonemes)>>2)]=$27;var $arrayidx32=(($ph_buf)&4294967295);var $28=HEAP8[($arrayidx32)];var $conv33=(tempInt=(($28)),(tempInt>=128?tempInt-256:tempInt));var $cmp34=((($conv33))|0)!=0;if(!($cmp34)){__label__=11;break $land_lhs_true$$if_end38$12;}
66269 var $29=$phonemes_addr;var $call36=_sprintf($29,((__str7304)&4294967295),allocate([21,0,0,0],["i32",0,0,0],ALLOC_STACK));$retval=0;__label__=26;break $if_then18$$if_end21$9;}}while(0);var $arrayidx39=(($ph_buf)&4294967295);var $30=HEAP8[($arrayidx39)];var $conv40=(tempInt=(($30)),(tempInt>=128?tempInt-256:tempInt));var $cmp41=((($conv40))|0)==0;if($cmp41){__label__=12;;}else{__label__=20;;}
66270 $if_then42$$if_end73$17:do{if(__label__==12){var $31=HEAP32[(($letter)>>2)];var $call43=_iswalpha($31);var $tobool44=((($call43))|0)!=0;if($tobool44){__label__=13;;}else{__label__=14;;}
66271 if(__label__==13){var $32=$tr_addr;var $arraydecay46=(($ph_buf)&4294967295);var $call47=__Z6LookupP10TranslatorPKcPc($32,((__str8305)&4294967295),$arraydecay46);;}
66272 var $arrayidx49=(($ph_buf)&4294967295);var $33=HEAP8[($arrayidx49)];var $conv50=(tempInt=(($33)),(tempInt>=128?tempInt-256:tempInt));var $cmp51=((($conv50))|0)==0;if($cmp51){__label__=15;;}else{__label__=17;;}
66273 $land_lhs_true52$$if_end58$22:do{if(__label__==15){var $34=HEAP32[(($letter)>>2)];var $call53=_iswspace($34);var $tobool54=((($call53))|0)!=0;if($tobool54){__label__=17;break $land_lhs_true52$$if_end58$22;}
66274 var $35=$tr_addr;var $arraydecay56=(($ph_buf)&4294967295);var $call57=__Z6LookupP10TranslatorPKcPc($35,((__str9306)&4294967295),$arraydecay56);;}}while(0);var $arrayidx59=(($ph_buf)&4294967295);var $36=HEAP8[($arrayidx59)];var $conv60=(tempInt=(($36)),(tempInt>=128?tempInt-256:tempInt));var $cmp61=((($conv60))|0)!=0;if(!($cmp61)){__label__=20;break $if_then42$$if_end73$17;}
66275 var $arraydecay63=(($hexbuf)&4294967295);var $37=HEAP32[(($letter)>>2)];var $call64=_sprintf($arraydecay63,((__str10307)&4294967295),allocate([$37,0,0,0],["i32",0,0,0],ALLOC_STACK));var $arraydecay65=(($ph_buf)&4294967295);$pbuf=$arraydecay65;var $arraydecay66=(($hexbuf)&4294967295);$p2=$arraydecay66;var $38=$p2;var $39=HEAP8[($38)];var $conv671=(tempInt=(($39)),(tempInt>=128?tempInt-256:tempInt));var $cmp682=((($conv671))|0)!=0;if(!($cmp682)){__label__=20;break $if_then42$$if_end73$17;}
66276 while(1){var $40=$pbuf;var $call69=_strlen($40);var $41=$pbuf;var $add_ptr=(($41+$call69)&4294967295);$pbuf=$add_ptr;var $42=$pbuf;var $incdec_ptr=(($42+1)&4294967295);$pbuf=$incdec_ptr;HEAP8[($42)]=23;var $43=$tr_addr;var $44=$p2;var $45=HEAP8[($44)];var $conv70=(tempInt=(($45)),(tempInt>=128?tempInt-256:tempInt));var $46=$pbuf;__Z12LookupLetterP10TranslatorjiPci($43,$conv70,0,$46,1);var $47=$p2;var $incdec_ptr71=(($47+1)&4294967295);$p2=$incdec_ptr71;var $48=$p2;var $49=HEAP8[($48)];var $conv67=(tempInt=(($49)),(tempInt>=128?tempInt-256:tempInt));var $cmp68=((($conv67))|0)!=0;if($cmp68){__label__=19;continue;}else{__label__=20;break $if_then42$$if_end73$17;}}}}while(0);var $50=$phonemes_addr;var $call74=_strlen($50);$len=$call74;var $51=$tr_addr;var $langopts=(($51)&4294967295);var $accents=(($langopts+220)&4294967295);var $52=HEAP32[(($accents)>>2)];var $and75=($52)&2;var $tobool76=((($and75))|0)!=0;var $arraydecay78=(($ph_buf2)&4294967295);if($tobool76){__label__=21;;}else{__label__=22;;}
66277 if(__label__==21){var $arraydecay79=(($ph_buf)&4294967295);var $arraydecay80=(($capital)&4294967295);var $call81=_sprintf($arraydecay78,((__str11308)&4294967295),allocate([255,0,0,0,$arraydecay79,0,0,0,$arraydecay80,0,0,0],["i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));;}
66278 else if(__label__==22){var $arraydecay83=(($capital)&4294967295);var $arraydecay84=(($ph_buf)&4294967295);var $call85=_sprintf($arraydecay78,((__str11308)&4294967295),allocate([255,0,0,0,$arraydecay83,0,0,0,$arraydecay84,0,0,0],["i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));;}
66279 var $53=$len;var $arraydecay87=(($ph_buf2)&4294967295);var $call88=_strlen($arraydecay87);var $add=((($call88)+($53))&4294967295);var $cmp89=((($add))>>>0)<160;if($cmp89){__label__=24;;}else{__label__=25;;}
66280 if(__label__==24){var $54=$len;var $55=$phonemes_addr;var $arrayidx91=(($55+$54)&4294967295);var $arraydecay92=(($ph_buf2)&4294967295);var $call93=_strcpy($arrayidx91,$arraydecay92);;}
66281 var $56=$n_bytes;$retval=$56;;}}while(0);var $57=$retval;STACKTOP=__stackBase__;return $57;return null;}
66282 function __Z17SetSpellingStressP10TranslatorPcii($tr,$phonemes,$control,$n_chars){var __stackBase__=STACKTOP;STACKTOP+=160;_memset(__stackBase__,0,160);var __label__;var __lastLabel__=null;var $tr_addr;var $phonemes_addr;var $control_addr;var $n_chars_addr;var $ix;var $c;var $n_stress;var $count;var $buf=__stackBase__;$tr_addr=$tr;$phonemes_addr=$phonemes;$control_addr=$control;$n_chars_addr=$n_chars;$n_stress=0;$ix=0;var $0=$ix;var $1=$phonemes_addr;var $arrayidx4=(($1+$0)&4294967295);var $2=HEAP8[($arrayidx4)];var $conv5=(tempInt=(($2)),(tempInt>=128?tempInt-256:tempInt));$c=$conv5;var $cmp6=((($conv5))|0)!=0;if($cmp6){__lastLabel__=0;__label__=1;;}else{__lastLabel__=0;__label__=4;;}
66283 $for_body$$for_end$2:do{if(__label__==1){while(1){var $3=__lastLabel__==0?$conv5:($conv);var $cmp1=((($3))|0)==6;if($cmp1){__label__=2;;}else{__label__=3;;}
66284 if(__label__==2){var $4=$n_stress;var $inc=((($4)+1)&4294967295);$n_stress=$inc;;}
66285 var $5=$c;var $conv2=((($5))&255);var $6=$ix;var $arrayidx3=(($buf+$6)&4294967295);HEAP8[($arrayidx3)]=$conv2;var $7=$ix;var $inc4=((($7)+1)&4294967295);$ix=$inc4;var $8=$ix;var $9=$phonemes_addr;var $arrayidx=(($9+$8)&4294967295);var $10=HEAP8[($arrayidx)];var $conv=(tempInt=(($10)),(tempInt>=128?tempInt-256:tempInt));$c=$conv;var $cmp=((($conv))|0)!=0;if($cmp){__lastLabel__=3;__label__=1;continue;}else{__lastLabel__=3;__label__=4;break $for_body$$for_end$2;}}}}while(0);var $11=$ix;var $arrayidx5=(($buf+$11)&4294967295);HEAP8[($arrayidx5)]=0;$count=0;$ix=0;var $12=$ix;var $arrayidx71=(($buf+$12)&4294967295);var $13=HEAPU8[($arrayidx71)];var $conv82=((($13))&255);$c=$conv82;var $cmp93=((($conv82))|0)!=0;if($cmp93){__lastLabel__=4;__label__=5;;}else{__lastLabel__=4;__label__=26;;}
66286 $for_body10$$for_end52$9:do{if(__label__==5){$for_body10$10:while(1){var $14=__lastLabel__==4?$conv82:($conv8);var $cmp11=((($14))|0)==6;if($cmp11){__lastLabel__=5;__label__=6;;}else{__lastLabel__=5;__label__=15;;}
66287 $land_lhs_true$$if_else29$12:do{if(__label__==6){var $15=$n_chars_addr;var $cmp12=((($15))|0)>1;if($cmp12){__label__=7;;}else{__label__=14;;}
66288 if(__label__==7){var $16=$count;var $inc14=((($16)+1)&4294967295);$count=$inc14;var $17=$tr_addr;var $langopts=(($17)&4294967295);var $spelling_stress=(($langopts+249)&4294967295);var $18=HEAP8[($spelling_stress)];var $conv15=(tempInt=(($18)),(tempInt>=128?tempInt-256:tempInt));var $cmp16=((($conv15))|0)==1;var $19=$count;if($cmp16){__label__=8;;}else{__label__=10;;}
66289 if(__label__==8){var $cmp18=((($19))|0)>1;if(!($cmp18)){__label__=24;break $land_lhs_true$$if_else29$12;}
66290 $c=5;__label__=24;break $land_lhs_true$$if_else29$12;}
66291 else if(__label__==10){var $20=$n_stress;var $cmp21=((($19))|0)!=((($20))|0);if(!($cmp21)){__label__=24;break $land_lhs_true$$if_else29$12;}
66292 var $21=$count;var $rem=((($21))|0)%3;var $cmp23=((($rem))|0)!=0;if($cmp23){__label__=13;;}else{__label__=12;;}
66293 if(__label__==12){var $22=$count;var $23=$n_stress;var $sub=((($23)-1)&4294967295);var $cmp24=((($22))|0)==((($sub))|0);if(!($cmp24)){__label__=24;break $land_lhs_true$$if_else29$12;}}
66294 $c=5;__label__=24;break $land_lhs_true$$if_else29$12;}}
66295 else if(__label__==14){var $_pr=$c;__lastLabel__=14;__label__=15;break $land_lhs_true$$if_else29$12;}}}while(0);$if_end48$$if_else29$25:do{if(__label__==15){var $24=__lastLabel__==14?$_pr:($14);var $cmp30=((($24))|0)==255;if(!($cmp30)){__label__=24;break $if_end48$$if_else29$25;}
66296 var $25=$control_addr;var $cmp32=((($25))|0)<2;if($cmp32){__label__=25;break $if_end48$$if_else29$25;}
66297 var $26=$ix;var $cmp34=((($26))|0)==0;if($cmp34){__label__=25;break $if_end48$$if_else29$25;}
66298 var $27=$control_addr;var $cmp37=((($27))|0)==4;if($cmp37){__label__=19;;}else{__label__=20;;}
66299 if(__label__==19){$c=9;;}
66300 var $28=$count;var $rem40=((($28))|0)%3;var $cmp41=((($rem40))|0)==0;if($cmp41){__label__=22;;}else{__label__=21;;}
66301 $if_then44$$lor_lhs_false42$33:do{if(__label__==21){var $29=$control_addr;var $cmp43=((($29))|0)>2;if($cmp43){__label__=22;break $if_then44$$lor_lhs_false42$33;}
66302 $c=23;__label__=24;break $if_end48$$if_else29$25;}}while(0);$c=11;__label__=24;break $if_end48$$if_else29$25;}}while(0);if(__label__==24){var $30=$c;var $conv49=((($30))&255);var $31=$phonemes_addr;var $incdec_ptr=(($31+1)&4294967295);$phonemes_addr=$incdec_ptr;HEAP8[($31)]=$conv49;;}
66303 var $32=$ix;var $inc51=((($32)+1)&4294967295);$ix=$inc51;var $33=$ix;var $arrayidx7=(($buf+$33)&4294967295);var $34=HEAPU8[($arrayidx7)];var $conv8=((($34))&255);$c=$conv8;var $cmp9=((($conv8))|0)!=0;if($cmp9){__lastLabel__=25;__label__=5;continue $for_body10$10;}else{__lastLabel__=25;__label__=26;break $for_body10$$for_end52$9;}}}}while(0);var $35=$control_addr;var $cmp53=((($35))|0)>=2;if($cmp53){__label__=27;;}else{__label__=28;;}
66304 if(__label__==27){var $36=$phonemes_addr;var $incdec_ptr55=(($36+1)&4294967295);$phonemes_addr=$incdec_ptr55;HEAP8[($36)]=11;;}
66305 var $37=$phonemes_addr;HEAP8[($37)]=0;STACKTOP=__stackBase__;return;return;}
66306 function __Z14TranslateRomanP10TranslatorPcS1_P8WORD_TAB($tr,$word,$ph_out,$wtab){var __stackBase__=STACKTOP;STACKTOP+=200;_memset(__stackBase__,0,200);var __label__;var __lastLabel__=null;var $retval;var $tr_addr;var $word_addr;var $ph_out_addr;var $wtab_addr;var $c;var $p;var $p2;var $acc;var $prev;var $value;var $subtract;var $repeat;var $n_digits;var $word_start;var $num_control;var $flags=__stackBase__;var $ph_roman=__stackBase__+8;var $number_chars=__stackBase__+40;$tr_addr=$tr;$word_addr=$word;$ph_out_addr=$ph_out;$wtab_addr=$wtab;$repeat=0;$n_digits=0;$num_control=0;$acc=0;$prev=0;$subtract=32767;var $0=$ph_out_addr;var $arrayidx=(($0)&4294967295);HEAP8[($arrayidx)]=0;var $arrayidx1=(($flags)&4294967295);HEAP32[(($arrayidx1)>>2)]=0;var $arrayidx2=(($flags+4)&4294967295);HEAP32[(($arrayidx2)>>2)]=0;var $1=$tr_addr;var $langopts=(($1)&4294967295);var $numbers=(($langopts+184)&4294967295);var $2=HEAP32[(($numbers)>>2)];var $and=($2)&33554432;var $tobool=((($and))|0)!=0;if($tobool){__label__=1;;}else{__label__=2;;}
66307 $land_lhs_true$$lor_lhs_false$2:do{if(__label__==1){var $3=$wtab_addr;var $arrayidx3=(($3)&4294967295);var $flags4=(($arrayidx3)&4294967295);var $4=HEAP32[(($flags4)>>2)];var $and5=($4)&1;var $tobool6=((($and5))|0)!=0;if($tobool6){__label__=2;break $land_lhs_true$$lor_lhs_false$2;}else{__label__=3;break $land_lhs_true$$lor_lhs_false$2;}}}while(0);$lor_lhs_false$$if_then$4:do{if(__label__==2){var $5=$word_addr;var $arrayidx7=(($5+-2)&4294967295);var $6=HEAP8[($arrayidx7)];var $conv=(tempInt=(($6)),(tempInt>=128?tempInt-256:tempInt));var $isdigittmp=((($conv)-48)&4294967295);var $isdigit=((($isdigittmp))>>>0)<10;var $call=((($isdigit))&1);var $tobool8=((($call))|0)!=0;if($tobool8){__label__=3;break $lor_lhs_false$$if_then$4;}
66308 var $7=$word_addr;$word_start=$7;;$while_cond$7:while(1){var $8=$word_addr;var $incdec_ptr=(($8+1)&4294967295);$word_addr=$incdec_ptr;var $9=HEAP8[($8)];var $conv9=(tempInt=(($9)),(tempInt>=128?tempInt-256:tempInt));$c=$conv9;var $cmp=((($conv9))|0)!=32;if(!($cmp)){__label__=25;break $while_cond$7;}
66309 var $10=$c;var $memchr=_memchr(((__str12309)&4294967295),$10,8);$p2=$memchr;var $cmp11=((($memchr))|0)==0;if($cmp11){__label__=7;break $while_cond$7;}
66310 var $11=$p2;var $sub_ptr_lhs_cast=($11);var $sub_ptr_sub=((($sub_ptr_lhs_cast)-(__str12309))&4294967295);var $arrayidx14=((__ZZ14TranslateRomanP10TranslatorPcS1_P8WORD_TABE12roman_values+$sub_ptr_sub*4)&4294967295);var $12=HEAP32[(($arrayidx14)>>2)];$value=$12;var $13=$value;var $14=$prev;var $cmp15=((($13))|0)==((($14))|0);if($cmp15){__label__=9;;}else{__label__=11;;}
66311 if(__label__==9){var $15=$repeat;var $inc=((($15)+1)&4294967295);$repeat=$inc;var $16=$repeat;var $cmp17=((($16))|0)>=3;if($cmp17){__label__=10;break $while_cond$7;}}
66312 else if(__label__==11){$repeat=0;;}
66313 var $17=$prev;var $cmp21=((($17))|0)>1;var $18=$prev;var $cmp23=((($18))|0)!=10;var $or_cond=($cmp21)&($cmp23);var $19=$prev;var $cmp25=((($19))|0)!=100;var $or_cond1=($or_cond)&($cmp25);if($or_cond1){__lastLabel__=12;__label__=13;;}else{__lastLabel__=12;__label__=15;;}
66314 if(__label__==13){var $20=$value;var $21=$prev;var $cmp27=((($20))|0)>=((($21))|0);if($cmp27){__lastLabel__=13;__label__=14;break $while_cond$7;}else{__lastLabel__=13;;}}
66315 var $22=__lastLabel__==13?$21:($19);var $cmp31=((($22))|0)!=0;if($cmp31){__label__=16;;}else{__label__=21;;}
66316 $land_lhs_true32$$if_else40$18:do{if(__label__==16){var $23=$prev;var $24=$value;var $cmp33=((($23))|0)<((($24))|0);if(!($cmp33)){__label__=21;break $land_lhs_true32$$if_else40$18;}
66317 var $25=$acc;var $rem=((($25))|0)%10;var $cmp35=((($rem))|0)!=0;if($cmp35){__label__=19;break $while_cond$7;}
66318 var $26=$prev;var $mul=((($26)*10)&4294967295);var $27=$value;var $cmp37=((($mul))|0)<((($27))|0);if($cmp37){__label__=19;break $while_cond$7;}
66319 var $28=$prev;$subtract=$28;var $29=$subtract;var $30=$value;var $sub=((($30)-($29))&4294967295);$value=$sub;__label__=24;break $land_lhs_true32$$if_else40$18;}}while(0);if(__label__==21){var $31=$value;var $32=$subtract;var $cmp41=((($31))|0)>=((($32))|0);if($cmp41){__label__=22;break $while_cond$7;}
66320 var $33=$prev;var $34=$acc;var $add=((($34)+($33))&4294967295);$acc=$add;;}
66321 var $35=$value;$prev=$35;var $36=$n_digits;var $inc46=((($36)+1)&4294967295);$n_digits=$inc46;__label__=5;continue $while_cond$7;}
66322 if(__label__==25){var $37=$word_addr;var $arrayidx47=(($37)&4294967295);var $38=HEAP8[($arrayidx47)];var $conv48=(tempInt=(($38)),(tempInt>=128?tempInt-256:tempInt));var $isdigittmp2=((($conv48)-48)&4294967295);var $isdigit3=((($isdigittmp2))>>>0)<10;var $call49=((($isdigit3))&1);var $tobool50=((($call49))|0)!=0;if($tobool50){__label__=26;;}else{__label__=27;;}
66323 if(__label__==26){$retval=0;__label__=48;break $lor_lhs_false$$if_then$4;}
66324 else if(__label__==27){var $39=$prev;var $40=$acc;var $add53=((($40)+($39))&4294967295);$acc=$add53;var $41=$acc;var $42=$tr_addr;var $langopts54=(($42)&4294967295);var $min_roman=(($langopts54+200)&4294967295);var $43=HEAP32[(($min_roman)>>2)];var $cmp55=((($41))|0)<((($43))|0);if($cmp55){__label__=28;;}else{__label__=29;;}
66325 if(__label__==28){$retval=0;__label__=48;break $lor_lhs_false$$if_then$4;}
66326 else if(__label__==29){var $44=$acc;var $45=$tr_addr;var $langopts58=(($45)&4294967295);var $max_roman=(($langopts58+196)&4294967295);var $46=HEAP32[(($max_roman)>>2)];var $cmp59=((($44))|0)>((($46))|0);if($cmp59){__label__=30;;}else{__label__=31;;}
66327 if(__label__==30){$retval=0;__label__=48;break $lor_lhs_false$$if_then$4;}
66328 else if(__label__==31){var $47=$tr_addr;var $arraydecay=(($ph_roman)&4294967295);var $call62=__Z6LookupP10TranslatorPKcPc($47,((__str13310)&4294967295),$arraydecay);var $48=$ph_out_addr;var $arrayidx63=(($48)&4294967295);$p=$arrayidx63;var $49=$tr_addr;var $langopts64=(($49)&4294967295);var $numbers65=(($langopts64+184)&4294967295);var $50=HEAP32[(($numbers65)>>2)];var $and66=($50)&67108864;var $cmp67=((($and66))|0)==0;if($cmp67){__label__=32;;}else{__label__=33;;}
66329 if(__label__==32){var $51=$ph_out_addr;var $arraydecay69=(($ph_roman)&4294967295);var $call70=_strcpy($51,$arraydecay69);var $arraydecay71=(($ph_roman)&4294967295);var $call72=_strlen($arraydecay71);var $52=$ph_out_addr;var $arrayidx73=(($52+$call72)&4294967295);$p=$arrayidx73;;}
66330 var $arraydecay75=(($number_chars)&4294967295);var $53=$acc;var $call76=_sprintf($arraydecay75,((__str14311)&4294967295),allocate([$53,0,0,0],["i32",0,0,0],ALLOC_STACK));var $54=$word_addr;var $arrayidx77=(($54)&4294967295);var $55=HEAP8[($arrayidx77)];var $conv78=(tempInt=(($55)),(tempInt>=128?tempInt-256:tempInt));var $cmp79=((($conv78))|0)==46;if($cmp79){__label__=34;;}else{__label__=35;;}
66331 if(__label__==34){$retval=0;__label__=48;break $lor_lhs_false$$if_then$4;}
66332 else if(__label__==35){var $56=$tr_addr;var $57=$word_start;var $58=$word_addr;var $59=$wtab_addr;var $call82=__ZL15CheckDotOrdinalP10TranslatorPcS1_P8WORD_TABi($56,$57,$58,$59,1);var $tobool83=((($call82))|0)!=0;if($tobool83){__label__=36;;}else{__label__=37;;}
66333 if(__label__==36){var $60=$wtab_addr;var $arrayidx85=(($60)&4294967295);var $flags86=(($arrayidx85)&4294967295);var $61=HEAP32[(($flags86)>>2)];var $or=($61)|32768;HEAP32[(($flags86)>>2)]=$or;;}
66334 var $62=$tr_addr;var $langopts88=(($62)&4294967295);var $numbers89=(($langopts88+184)&4294967295);var $63=HEAP32[(($numbers89)>>2)];var $and90=($63)&134217728;var $tobool91=((($and90))|0)!=0;if($tobool91){__label__=38;;}else{__label__=45;;}
66335 $if_then92$$if_end117$47:do{if(__label__==38){var $64=$tr_addr;var $translator_name=(($64+280)&4294967295);var $65=HEAP32[(($translator_name)>>2)];var $cmp93=((($65))|0)==26741;var $66=$wtab_addr;var $arrayidx95=(($66)&4294967295);var $flags96=(($arrayidx95)&4294967295);var $67=HEAP32[(($flags96)>>2)];if($cmp93){__label__=39;;}else{__label__=44;;}
66336 if(__label__==39){var $and97=($67)&32768;var $tobool98=((($and97))|0)!=0;if($tobool98){__label__=45;break $if_then92$$if_end117$47;}
66337 var $68=$wtab_addr;var $arrayidx100=(($68)&4294967295);var $flags101=(($arrayidx100)&4294967295);var $69=HEAP32[(($flags101)>>2)];var $and102=($69)&16384;var $tobool103=((($and102))|0)!=0;if($tobool103){__label__=41;;}else{__label__=43;;}
66338 $land_lhs_true104$$if_else109$52:do{if(__label__==41){var $70=$word_addr;var $71=$acc;var $call105=__ZL11hu_number_ePKcii($70,0,$71);var $tobool106=((($call105))|0)!=0;if(!($tobool106)){__label__=43;break $land_lhs_true104$$if_else109$52;}
66339 var $72=$num_control;var $or108=($72)|1;$num_control=$or108;__label__=45;break $if_then92$$if_end117$47;}}while(0);$retval=0;__label__=48;break $lor_lhs_false$$if_then$4;}
66340 else if(__label__==44){var $or115=($67)|32768;HEAP32[(($flags96)>>2)]=$or115;;}}}while(0);var $73=$tr_addr;var $prev_dict_flags=(($73+8320)&4294967295);HEAP32[(($prev_dict_flags)>>2)]=0;var $74=$tr_addr;var $arrayidx118=(($number_chars+2)&4294967295);var $75=$p;var $arraydecay119=(($flags)&4294967295);var $76=$wtab_addr;var $77=$num_control;var $call120=__Z15TranslateNumberP10TranslatorPcS1_PjP8WORD_TABi($74,$arrayidx118,$75,$arraydecay119,$76,$77);var $78=$tr_addr;var $langopts121=(($78)&4294967295);var $numbers122=(($langopts121+184)&4294967295);var $79=HEAP32[(($numbers122)>>2)];var $and123=($79)&67108864;var $tobool124=((($and123))|0)!=0;if($tobool124){__label__=46;;}else{__label__=47;;}
66341 if(__label__==46){var $80=$ph_out_addr;var $arraydecay126=(($ph_roman)&4294967295);var $call127=_strcat($80,$arraydecay126);;}
66342 $retval=1;__label__=48;break $lor_lhs_false$$if_then$4;}}}}}
66343 else if(__label__==7){$retval=0;__label__=48;break $lor_lhs_false$$if_then$4;}
66344 else if(__label__==10){$retval=0;__label__=48;break $lor_lhs_false$$if_then$4;}
66345 else if(__label__==14){$retval=0;__label__=48;break $lor_lhs_false$$if_then$4;}
66346 else if(__label__==19){$retval=0;__label__=48;break $lor_lhs_false$$if_then$4;}
66347 else if(__label__==22){$retval=0;__label__=48;break $lor_lhs_false$$if_then$4;}}}while(0);if(__label__==3){$retval=0;;}
66348 var $81=$retval;STACKTOP=__stackBase__;return $81;return null;}
66349 function __ZL15CheckDotOrdinalP10TranslatorPcS1_P8WORD_TABi($tr,$word,$word_end,$wtab,$roman){var __stackBase__=STACKTOP;STACKTOP+=4;_memset(__stackBase__,0,4);var __label__;var $tr_addr;var $word_addr;var $word_end_addr;var $wtab_addr;var $roman_addr;var $ordinal;var $c2=__stackBase__;var $nextflags;$tr_addr=$tr;$word_addr=$word;$word_end_addr=$word_end;$wtab_addr=$wtab;$roman_addr=$roman;$ordinal=0;var $0=$tr_addr;var $langopts=(($0)&4294967295);var $numbers=(($langopts+184)&4294967295);var $1=HEAP32[(($numbers)>>2)];var $and=($1)&65536;var $tobool=((($and))|0)!=0;if($tobool){__label__=1;;}else{__label__=32;;}
66350 $land_lhs_true$$if_end92$2:do{if(__label__==1){var $2=$word_end_addr;var $arrayidx=(($2)&4294967295);var $3=HEAP8[($arrayidx)];var $conv=(tempInt=(($3)),(tempInt>=128?tempInt-256:tempInt));var $cmp=((($conv))|0)==46;if($cmp){__label__=3;;}else{__label__=2;;}
66351 if(__label__==2){var $4=$wtab_addr;var $arrayidx1=(($4)&4294967295);var $flags=(($arrayidx1)&4294967295);var $5=HEAP32[(($flags)>>2)];var $and2=($5)&65536;var $tobool3=((($and2))|0)!=0;if(!($tobool3)){__label__=32;break $land_lhs_true$$if_end92$2;}}
66352 var $6=$wtab_addr;var $arrayidx5=(($6+12)&4294967295);var $flags6=(($arrayidx5)&4294967295);var $7=HEAP32[(($flags6)>>2)];var $and7=($7)&256;var $tobool8=((($and7))|0)!=0;if($tobool8){__label__=32;break $land_lhs_true$$if_end92$2;}
66353 var $8=$roman_addr;var $tobool9=((($8))|0)!=0;if($tobool9){__label__=6;;}else{__label__=5;;}
66354 if(__label__==5){var $9=$wtab_addr;var $arrayidx11=(($9+12)&4294967295);var $flags12=(($arrayidx11)&4294967295);var $10=HEAP32[(($flags12)>>2)];var $and13=($10)&2;var $tobool14=((($and13))|0)!=0;if($tobool14){__label__=32;break $land_lhs_true$$if_end92$2;}}
66355 var $11=$word_end_addr;var $arrayidx16=(($11)&4294967295);var $12=HEAP8[($arrayidx16)];var $conv17=(tempInt=(($12)),(tempInt>=128?tempInt-256:tempInt));var $cmp18=((($conv17))|0)==46;var $13=$word_end_addr;if($cmp18){__label__=7;;}else{__label__=8;;}
66356 if(__label__==7){var $arrayidx20=(($13+2)&4294967295);var $call=__Z7utf8_inPiPKc($c2,$arrayidx20);;}
66357 else if(__label__==8){var $arrayidx21=(($13)&4294967295);var $call22=__Z7utf8_inPiPKc($c2,$arrayidx21);;}
66358 var $14=$word_end_addr;var $arrayidx23=(($14)&4294967295);var $15=HEAP8[($arrayidx23)];var $conv24=(tempInt=(($15)),(tempInt>=128?tempInt-256:tempInt));var $cmp25=((($conv24))|0)!=0;if(!($cmp25)){__label__=32;break $land_lhs_true$$if_end92$2;}
66359 var $16=$word_end_addr;var $arrayidx27=(($16+1)&4294967295);var $17=HEAP8[($arrayidx27)];var $conv28=(tempInt=(($17)),(tempInt>=128?tempInt-256:tempInt));var $cmp29=((($conv28))|0)!=0;if(!($cmp29)){__label__=32;break $land_lhs_true$$if_end92$2;}
66360 var $18=HEAP32[(($c2)>>2)];var $cmp31=((($18))|0)==0;if($cmp31){__label__=14;;}else{__label__=12;;}
66361 $if_then40$$lor_lhs_false32$17:do{if(__label__==12){var $19=$wtab_addr;var $arrayidx33=(($19)&4294967295);var $flags34=(($arrayidx33)&4294967295);var $20=HEAP32[(($flags34)>>2)];var $and35=($20)&131072;var $tobool36=((($and35))|0)!=0;if($tobool36){__label__=14;break $if_then40$$lor_lhs_false32$17;}
66362 var $21=HEAP32[(($c2)>>2)];var $call38=__Z7IsAlphaj($21);var $tobool39=((($call38))|0)!=0;if(!($tobool39)){__label__=32;break $land_lhs_true$$if_end92$2;}}}while(0);$ordinal=2;var $22=$word_end_addr;var $arrayidx41=(($22)&4294967295);var $23=HEAP8[($arrayidx41)];var $conv42=(tempInt=(($23)),(tempInt>=128?tempInt-256:tempInt));var $cmp43=((($conv42))|0)==46;if($cmp43){__label__=15;;}else{__label__=16;;}
66363 if(__label__==15){var $24=$word_end_addr;var $arrayidx45=(($24)&4294967295);HEAP8[($arrayidx45)]=32;;}
66364 var $25=$roman_addr;var $cmp47=((($25))|0)==0;if(!($cmp47)){__label__=32;break $land_lhs_true$$if_end92$2;}
66365 var $26=$tr_addr;var $translator_name=(($26+280)&4294967295);var $27=HEAP32[(($translator_name)>>2)];var $cmp49=((($27))|0)==26741;if(!($cmp49)){__label__=32;break $land_lhs_true$$if_end92$2;}
66366 $nextflags=0;var $28=HEAP32[(($c2)>>2)];var $call51=__Z7IsAlphaj($28);var $tobool52=((($call51))|0)!=0;if($tobool52){__label__=19;;}else{__label__=20;;}
66367 if(__label__==19){var $29=$tr_addr;var $30=$word_end_addr;var $arrayidx54=(($30+2)&4294967295);var $call55=__Z13TranslateWordP10TranslatorPciP8WORD_TAB($29,$arrayidx54,0,0);$nextflags=$call55;;}
66368 var $31=$tr_addr;var $prev_dict_flags=(($31+8320)&4294967295);var $32=HEAP32[(($prev_dict_flags)>>2)];var $and57=($32)&1048576;var $tobool58=((($and57))|0)!=0;if($tobool58){__label__=21;;}else{__label__=25;;}
66369 $land_lhs_true59$$if_end70$29:do{if(__label__==21){var $33=HEAP32[(($c2)>>2)];var $cmp60=((($33))|0)==0;if($cmp60){__label__=24;;}else{__label__=22;;}
66370 $if_then69$$lor_lhs_false61$31:do{if(__label__==22){var $34=$wtab_addr;var $arrayidx62=(($34)&4294967295);var $flags63=(($arrayidx62)&4294967295);var $35=HEAP32[(($flags63)>>2)];var $and64=($35)&131072;var $tobool65=((($and64))|0)!=0;if($tobool65){__label__=24;break $if_then69$$lor_lhs_false61$31;}
66371 var $36=HEAP32[(($c2)>>2)];var $call67=_iswdigit($36);var $tobool68=((($call67))|0)!=0;if(!($tobool68)){__label__=25;break $land_lhs_true59$$if_end70$29;}}}while(0);$ordinal=0;;}}while(0);var $37=$nextflags;var $and71=($37)&1048576;var $tobool72=((($and71))|0)!=0;if($tobool72){__label__=26;;}else{__label__=27;;}
66372 if(__label__==26){$ordinal=0;;}
66373 var $38=$nextflags;var $and75=($38)&4194304;var $tobool76=((($and75))|0)!=0;if(!($tobool76)){__label__=32;break $land_lhs_true$$if_end92$2;}
66374 var $39=$word_addr;var $arrayidx78=(($39+-2)&4294967295);var $40=HEAP8[($arrayidx78)];var $conv79=(tempInt=(($40)),(tempInt>=128?tempInt-256:tempInt));var $cmp80=((($conv79))|0)==45;if($cmp80){__label__=29;;}else{__label__=30;;}
66375 if(__label__==29){$ordinal=0;;}
66376 var $41=$tr_addr;var $prev_dict_flags83=(($41+8320)&4294967295);var $42=HEAP32[(($prev_dict_flags83)>>2)];var $and84=($42)&5242880;var $tobool85=((($and84))|0)!=0;if(!($tobool85)){__label__=32;break $land_lhs_true$$if_end92$2;}
66377 $ordinal=34;;}}while(0);var $43=$ordinal;STACKTOP=__stackBase__;return $43;return null;}
66378 function __ZL11hu_number_ePKcii($word,$thousandplex,$value){;var __label__;var $retval;var $word_addr;var $thousandplex_addr;var $value_addr;$word_addr=$word;$thousandplex_addr=$thousandplex;$value_addr=$value;var $0=$word_addr;var $arrayidx=(($0)&4294967295);var $1=HEAP8[($arrayidx)];var $conv=(tempInt=(($1)),(tempInt>=128?tempInt-256:tempInt));var $cmp=((($conv))|0)==97;if($cmp){__label__=2;;}else{__label__=1;;}
66379 $if_then$$lor_lhs_false$2:do{if(__label__==1){var $2=$word_addr;var $arrayidx1=(($2)&4294967295);var $3=HEAP8[($arrayidx1)];var $conv2=(tempInt=(($3)),(tempInt>=128?tempInt-256:tempInt));var $cmp3=((($conv2))|0)==101;if($cmp3){__label__=2;break $if_then$$lor_lhs_false$2;}
66380 $retval=0;__label__=13;break $if_then$$lor_lhs_false$2;}}while(0);$if_then$$return$5:do{if(__label__==2){var $4=$word_addr;var $arrayidx4=(($4+1)&4294967295);var $5=HEAP8[($arrayidx4)];var $conv5=(tempInt=(($5)),(tempInt>=128?tempInt-256:tempInt));var $cmp6=((($conv5))|0)==32;if($cmp6){__label__=6;;}else{__label__=3;;}
66381 $if_then18$$lor_lhs_false7$7:do{if(__label__==3){var $6=$word_addr;var $arrayidx8=(($6+1)&4294967295);var $7=HEAP8[($arrayidx8)];var $conv9=(tempInt=(($7)),(tempInt>=128?tempInt-256:tempInt));var $cmp10=((($conv9))|0)==122;if($cmp10){__label__=6;break $if_then18$$lor_lhs_false7$7;}
66382 var $8=$word_addr;var $arrayidx12=(($8+1)&4294967295);var $9=HEAP8[($arrayidx12)];var $conv13=(tempInt=(($9)),(tempInt>=128?tempInt-256:tempInt));var $cmp14=((($conv13))|0)==116;if($cmp14){__label__=5;;}else{__label__=7;;}
66383 if(__label__==5){var $10=$word_addr;var $arrayidx15=(($10+2)&4294967295);var $11=HEAP8[($arrayidx15)];var $conv16=(tempInt=(($11)),(tempInt>=128?tempInt-256:tempInt));var $cmp17=((($conv16))|0)==116;if($cmp17){__label__=6;break $if_then18$$lor_lhs_false7$7;}}
66384 var $12=$thousandplex_addr;var $cmp19=((($12))|0)==1;if($cmp19){__label__=9;;}else{__label__=8;;}
66385 $land_lhs_true22$$lor_lhs_false20$13:do{if(__label__==8){var $13=$value_addr;var $rem=((($13))|0)%1000;var $cmp21=((($rem))|0)==0;if($cmp21){__label__=9;break $land_lhs_true22$$lor_lhs_false20$13;}else{__label__=11;break $land_lhs_true22$$lor_lhs_false20$13;}}}while(0);$land_lhs_true22$$if_end27$15:do{if(__label__==9){var $14=$word_addr;var $arrayidx23=(($14+1)&4294967295);var $15=HEAP8[($arrayidx23)];var $conv24=(tempInt=(($15)),(tempInt>=128?tempInt-256:tempInt));var $cmp25=((($conv24))|0)==108;if(!($cmp25)){__label__=11;break $land_lhs_true22$$if_end27$15;}
66386 $retval=0;__label__=13;break $if_then$$return$5;}}while(0);$retval=1;__label__=13;break $if_then$$return$5;}}while(0);$retval=0;;}}while(0);var $16=$retval;;return $16;return null;}
66387 function __Z15TranslateNumberP10TranslatorPcS1_PjP8WORD_TABi($tr,$word1,$ph_out,$flags,$wtab,$control){;var __label__;var $retval;var $tr_addr;var $word1_addr;var $ph_out_addr;var $flags_addr;var $wtab_addr;var $control_addr;$tr_addr=$tr;$word1_addr=$word1;$ph_out_addr=$ph_out;$flags_addr=$flags;$wtab_addr=$wtab;$control_addr=$control;var $0=HEAP32[((_option_sayas)>>2)];var $cmp=((($0))|0)==193;if($cmp){__label__=2;;}else{__label__=1;;}
66388 $if_then$$lor_lhs_false$2:do{if(__label__==1){var $1=$wtab_addr;var $arrayidx=(($1)&4294967295);var $flags1=(($arrayidx)&4294967295);var $2=HEAP32[(($flags1)>>2)];var $and=($2)&524288;var $tobool=((($and))|0)!=0;if($tobool){__label__=2;break $if_then$$lor_lhs_false$2;}
66389 var $3=$tr_addr;var $langopts=(($3)&4294967295);var $numbers=(($langopts+184)&4294967295);var $4=HEAP32[(($numbers)>>2)];var $cmp2=((($4))|0)!=0;if($cmp2){__label__=4;;}else{__label__=5;;}
66390 if(__label__==4){var $5=$tr_addr;var $6=$word1_addr;var $7=$ph_out_addr;var $8=$flags_addr;var $9=$wtab_addr;var $10=$control_addr;var $call=__ZL17TranslateNumber_1P10TranslatorPcS1_PjP8WORD_TABi($5,$6,$7,$8,$9,$10);$retval=$call;__label__=6;break $if_then$$lor_lhs_false$2;}
66391 else if(__label__==5){$retval=0;__label__=6;break $if_then$$lor_lhs_false$2;}}}while(0);if(__label__==2){$retval=0;;}
66392 var $11=$retval;;return $11;return null;}
66393 function __ZL17TranslateNumber_1P10TranslatorPcS1_PjP8WORD_TABi($tr,$word,$ph_out,$flags,$wtab,$control){var __stackBase__=STACKTOP;STACKTOP+=560;_memset(__stackBase__,0,560);var __label__;var __lastLabel__=null;var $retval;var $tr_addr;var $word_addr;var $ph_out_addr;var $flags_addr;var $wtab_addr;var $control_addr;var $n_digits;var $value;var $ix;var $digix;var $c;var $suppress_null;var $decimal_point;var $thousandplex;var $thousands_exact;var $thousands_inc;var $prev_thousands;var $ordinal;var $dot_ordinal;var $this_value;var $decimal_count;var $max_decimal_count;var $decimal_mode;var $hyphen;var $suffix_ix;var $skipwords;var $p=__stackBase__;var $string=__stackBase__+4;var $buf1=__stackBase__+24;var $ph_append=__stackBase__+124;var $ph_buf=__stackBase__+176;var $ph_buf2=__stackBase__+376;var $ph_zeros=__stackBase__+428;var $suffix=__stackBase__+480;var $buf_digit_lookup=__stackBase__+500;var $p2=__stackBase__+552;var $next_char=__stackBase__+556;var $p562;$tr_addr=$tr;$word_addr=$word;$ph_out_addr=$ph_out;$flags_addr=$flags;$wtab_addr=$wtab;$control_addr=$control;$suppress_null=0;$decimal_point=0;$thousandplex=0;$thousands_exact=1;$thousands_inc=0;$prev_thousands=0;$ordinal=0;$skipwords=0;var $0=$flags_addr;HEAP32[(($0)>>2)]=0;HEAP32[((__ZL14n_digit_lookup)>>2)]=0;var $arrayidx=(($buf_digit_lookup)&4294967295);HEAP8[($arrayidx)]=0;var $arraydecay=(($buf_digit_lookup)&4294967295);HEAP32[((__ZL12digit_lookup)>>2)]=$arraydecay;var $1=$control_addr;HEAP32[((__ZL14number_control)>>2)]=$1;$ix=0;var $2=$ix;var $3=$word_addr;var $arrayidx167=(($3+$2)&4294967295);var $4=HEAP8[($arrayidx167)];var $conv68=(tempInt=(($4)),(tempInt>=128?tempInt-256:tempInt));var $isdigittmp69=((($conv68)-48)&4294967295);var $isdigit70=((($isdigittmp69))>>>0)<10;var $5=$ix;if($isdigit70){__lastLabel__=0;__label__=1;;}else{__lastLabel__=0;__label__=2;;}
66394 $for_inc$$for_end$2:do{if(__label__==1){while(1){var $6=__lastLabel__==1?$10:($5);var $inc=((($6)+1)&4294967295);$ix=$inc;var $7=$ix;var $8=$word_addr;var $arrayidx1=(($8+$7)&4294967295);var $9=HEAP8[($arrayidx1)];var $conv=(tempInt=(($9)),(tempInt>=128?tempInt-256:tempInt));var $isdigittmp=((($conv)-48)&4294967295);var $isdigit=((($isdigittmp))>>>0)<10;var $call=((($isdigit))&1);var $tobool=((($call))|0)!=0;var $10=$ix;if($tobool){__lastLabel__=1;__label__=1;continue;}else{__lastLabel__=1;__label__=2;break $for_inc$$for_end$2;}}}}while(0);var $_lcssa65=__lastLabel__==0?$5:($10);$n_digits=$_lcssa65;var $11=$word_addr;var $call2=_atoi($11);$this_value=$call2;$value=$call2;var $cmp=((($_lcssa65))|0)==3;if($cmp){__label__=3;;}else{__label__=6;;}
66395 $land_lhs_true$$if_else$6:do{if(__label__==3){var $12=$word_addr;var $arrayidx3=(($12+-2)&4294967295);var $13=HEAP8[($arrayidx3)];var $conv4=(tempInt=(($13)),(tempInt>=128?tempInt-256:tempInt));var $14=$tr_addr;var $langopts=(($14)&4294967295);var $thousands_sep=(($langopts+204)&4294967295);var $15=HEAP32[(($thousands_sep)>>2)];var $cmp5=((($conv4))|0)==((($15))|0);if(!($cmp5)){__label__=6;break $land_lhs_true$$if_else$6;}
66396 var $16=$word_addr;var $arrayidx7=(($16+-3)&4294967295);var $17=HEAP8[($arrayidx7)];var $conv8=(tempInt=(($17)),(tempInt>=128?tempInt-256:tempInt));var $isdigittmp6=((($conv8)-48)&4294967295);var $isdigit7=((($isdigittmp6))>>>0)<10;var $call9=((($isdigit7))&1);var $tobool10=((($call9))|0)!=0;if(!($tobool10)){__label__=6;break $land_lhs_true$$if_else$6;}
66397 $prev_thousands=1;__label__=14;break $land_lhs_true$$if_else$6;}}while(0);$if_end32$$if_else$10:do{if(__label__==6){var $18=$tr_addr;var $langopts11=(($18)&4294967295);var $thousands_sep12=(($langopts11+204)&4294967295);var $19=HEAP32[(($thousands_sep12)>>2)];var $cmp13=((($19))|0)==32;if($cmp13){__label__=8;;}else{__label__=7;;}
66398 $if_then16$$lor_lhs_false$12:do{if(__label__==7){var $20=$tr_addr;var $langopts14=(($20)&4294967295);var $numbers=(($langopts14+184)&4294967295);var $21=HEAP32[(($numbers)>>2)];var $and=($21)&4096;var $tobool15=((($and))|0)!=0;if($tobool15){__label__=8;break $if_then16$$lor_lhs_false$12;}else{__label__=12;break $if_then16$$lor_lhs_false$12;}}}while(0);$if_then16$$if_end29$14:do{if(__label__==8){var $22=$n_digits;var $cmp17=((($22))|0)==3;if(!($cmp17)){__label__=12;break $if_then16$$if_end29$14;}
66399 var $23=$wtab_addr;var $flags19=(($23)&4294967295);var $24=HEAP32[(($flags19)>>2)];var $and20=($24)&262144;var $tobool21=((($and20))|0)!=0;if($tobool21){__label__=12;break $if_then16$$if_end29$14;}
66400 var $25=$word_addr;var $arrayidx23=(($25+-2)&4294967295);var $26=HEAP8[($arrayidx23)];var $conv24=(tempInt=(($26)),(tempInt>=128?tempInt-256:tempInt));var $isdigittmp8=((($conv24)-48)&4294967295);var $isdigit9=((($isdigittmp8))>>>0)<10;var $call25=((($isdigit9))&1);var $tobool26=((($call25))|0)!=0;if(!($tobool26)){__label__=12;break $if_then16$$if_end29$14;}
66401 $prev_thousands=1;__label__=14;break $if_end32$$if_else$10;}}while(0);var $_pr=$prev_thousands;var $cmp30=((($_pr))|0)==0;if(!($cmp30)){__label__=14;break $if_end32$$if_else$10;}
66402 HEAP32[((__ZL23speak_missing_thousands)>>2)]=0;;}}while(0);HEAP8[(((__ZL11ph_ordinal2)&4294967295))]=0;var $arrayidx33=(($ph_zeros)&4294967295);HEAP8[($arrayidx33)]=0;var $27=$prev_thousands;var $tobool34=((($27))|0)!=0;if($tobool34){__label__=16;;}else{__label__=15;;}
66403 $if_then39$$lor_lhs_false35$22:do{if(__label__==15){var $28=$word_addr;var $arrayidx36=(($28)&4294967295);var $29=HEAP8[($arrayidx36)];var $conv37=(tempInt=(($29)),(tempInt>=128?tempInt-256:tempInt));var $cmp38=((($conv37))|0)!=48;if($cmp38){__label__=16;break $if_then39$$lor_lhs_false35$22;}else{__label__=18;break $if_then39$$lor_lhs_false35$22;}}}while(0);$if_then39$$if_end45$24:do{if(__label__==16){var $30=$tr_addr;var $31=$word_addr;var $32=$ix;var $33=$word_addr;var $arrayidx40=(($33+$32)&4294967295);var $34=$wtab_addr;var $call41=__ZL15CheckDotOrdinalP10TranslatorPcS1_P8WORD_TABi($30,$31,$arrayidx40,$34,0);$ordinal=$call41;var $cmp42=((($call41))|0)!=0;if(!($cmp42)){__label__=18;break $if_then39$$if_end45$24;}
66404 $dot_ordinal=1;;}}while(0);var $35=$ix;var $36=$word_addr;var $arrayidx46=(($36+$35)&4294967295);var $37=HEAP8[($arrayidx46)];var $conv47=(tempInt=(($37)),(tempInt>=128?tempInt-256:tempInt));var $cmp48=((($conv47))|0)==46;if($cmp48){__label__=19;;}else{__label__=23;;}
66405 $land_lhs_true49$$if_end67$28:do{if(__label__==19){var $38=$ix;var $add=((($38)+1)&4294967295);var $39=$word_addr;var $arrayidx50=(($39+$add)&4294967295);var $40=HEAP8[($arrayidx50)];var $conv51=(tempInt=(($40)),(tempInt>=128?tempInt-256:tempInt));var $isdigittmp10=((($conv51)-48)&4294967295);var $isdigit11=((($isdigittmp10))>>>0)<10;var $call52=((($isdigit11))&1);var $tobool53=((($call52))|0)!=0;if($tobool53){__label__=23;break $land_lhs_true49$$if_end67$28;}
66406 var $41=$ix;var $add55=((($41)+2)&4294967295);var $42=$word_addr;var $arrayidx56=(($42+$add55)&4294967295);var $43=HEAP8[($arrayidx56)];var $conv57=(tempInt=(($43)),(tempInt>=128?tempInt-256:tempInt));var $isdigittmp12=((($conv57)-48)&4294967295);var $isdigit13=((($isdigittmp12))>>>0)<10;var $call58=((($isdigit13))&1);var $tobool59=((($call58))|0)!=0;if($tobool59){__label__=23;break $land_lhs_true49$$if_end67$28;}
66407 var $44=$wtab_addr;var $arrayidx61=(($44+12)&4294967295);var $flags62=(($arrayidx61)&4294967295);var $45=HEAP32[(($flags62)>>2)];var $and63=($45)&256;var $tobool64=((($and63))|0)!=0;if($tobool64){__label__=23;break $land_lhs_true49$$if_end67$28;}
66408 var $46=$ix;var $47=$word_addr;var $arrayidx66=(($47+$46)&4294967295);HEAP8[($arrayidx66)]=0;;}}while(0);var $48=$ordinal;var $cmp68=((($48))|0)==0;if($cmp68){__label__=25;;}else{__label__=24;;}
66409 $if_then71$$lor_lhs_false69$34:do{if(__label__==24){var $49=$tr_addr;var $translator_name=(($49+280)&4294967295);var $50=HEAP32[(($translator_name)>>2)];var $cmp70=((($50))|0)==26741;if($cmp70){__label__=25;break $if_then71$$lor_lhs_false69$34;}else{__label__=38;break $if_then71$$lor_lhs_false69$34;}}}while(0);$if_then71$$if_end123$36:do{if(__label__==25){var $51=$ix;var $inc72=((($51)+1)&4294967295);$ix=$inc72;$hyphen=0;var $arraydecay73=(($suffix)&4294967295);HEAP32[(($p)>>2)]=$arraydecay73;var $52=$wtab_addr;var $arrayidx74=(($52)&4294967295);var $flags75=(($arrayidx74)&4294967295);var $53=HEAP32[(($flags75)>>2)];var $and76=($53)&16384;var $tobool77=((($and76))|0)!=0;if($tobool77){__label__=26;;}else{__label__=27;;}
66410 if(__label__==26){var $54=HEAP32[(($p)>>2)];var $incdec_ptr=(($54+1)&4294967295);HEAP32[(($p)>>2)]=$incdec_ptr;HEAP8[($54)]=45;$hyphen=1;var $55=$ix;var $inc79=((($55)+1)&4294967295);$ix=$inc79;;}
66411 $while_cond$40:while(1){var $56=$ix;var $57=$word_addr;var $arrayidx81=(($57+$56)&4294967295);var $58=HEAP8[($arrayidx81)];var $conv82=(tempInt=(($58)),(tempInt>=128?tempInt-256:tempInt));var $cmp83=((($conv82))|0)!=0;if(!($cmp83)){__label__=31;break $while_cond$40;}
66412 var $59=$ix;var $60=$word_addr;var $arrayidx85=(($60+$59)&4294967295);var $61=HEAP8[($arrayidx85)];var $conv86=(tempInt=(($61)),(tempInt>=128?tempInt-256:tempInt));var $cmp87=((($conv86))|0)!=32;if(!($cmp87)){__label__=31;break $while_cond$40;}
66413 var $62=$ix;var $cmp88=((($62))|0)<19;if(!($cmp88)){__label__=31;break $while_cond$40;}
66414 var $63=$ix;var $inc89=((($63)+1)&4294967295);$ix=$inc89;var $64=$word_addr;var $arrayidx90=(($64+$63)&4294967295);var $65=HEAP8[($arrayidx90)];var $66=HEAP32[(($p)>>2)];var $incdec_ptr91=(($66+1)&4294967295);HEAP32[(($p)>>2)]=$incdec_ptr91;HEAP8[($66)]=$65;__label__=27;continue $while_cond$40;}
66415 var $67=HEAP32[(($p)>>2)];HEAP8[($67)]=0;var $arrayidx92=(($suffix)&4294967295);var $68=HEAP8[($arrayidx92)];var $conv93=(tempInt=(($68)),(tempInt>=128?tempInt-256:tempInt));var $cmp94=((($conv93))|0)!=0;if(!($cmp94)){__label__=38;break $if_then71$$if_end123$36;}
66416 var $69=$tr_addr;var $langopts96=(($69)&4294967295);var $ordinal_indicator=(($langopts96+216)&4294967295);var $70=HEAP32[(($ordinal_indicator)>>2)];var $cmp97=((($70))|0)!=0;if($cmp97){__label__=33;;}else{__label__=35;;}
66417 $land_lhs_true98$$if_else105$47:do{if(__label__==33){var $arraydecay99=(($suffix)&4294967295);var $71=$tr_addr;var $langopts100=(($71)&4294967295);var $ordinal_indicator101=(($langopts100+216)&4294967295);var $72=HEAP32[(($ordinal_indicator101)>>2)];var $call102=_strcmp($arraydecay99,$72);var $cmp103=((($call102))|0)==0;if(!($cmp103)){__label__=35;break $land_lhs_true98$$if_else105$47;}
66418 $ordinal=2;__label__=38;break $if_then71$$if_end123$36;}}while(0);var $arrayidx106=(($suffix)&4294967295);var $73=HEAP8[($arrayidx106)];var $conv107=(tempInt=(($73)),(tempInt>=128?tempInt-256:tempInt));var $isdigittmp14=((($conv107)-48)&4294967295);var $isdigit15=((($isdigittmp14))>>>0)<10;var $call108=((($isdigit15))&1);var $tobool109=((($call108))|0)!=0;if($tobool109){__label__=38;break $if_then71$$if_end123$36;}
66419 var $arraydecay111=(($string)&4294967295);var $arraydecay112=(($suffix)&4294967295);var $call113=_sprintf($arraydecay111,((__str15312)&4294967295),allocate([$arraydecay112,0,0,0],["i8*",0,0,0],ALLOC_STACK));var $74=$tr_addr;var $arraydecay114=(($string)&4294967295);var $call115=__Z6LookupP10TranslatorPKcPc($74,$arraydecay114,((__ZL11ph_ordinal2)&4294967295));var $tobool116=((($call115))|0)!=0;if(!($tobool116)){__label__=38;break $if_then71$$if_end123$36;}
66420 $ordinal=2;var $75=$flags_addr;var $arrayidx118=(($75)&4294967295);var $76=HEAP32[(($arrayidx118)>>2)];var $or=($76)|128;HEAP32[(($arrayidx118)>>2)]=$or;$skipwords=1;;}}while(0);var $77=$wtab_addr;var $arrayidx124=(($77)&4294967295);var $flags125=(($arrayidx124)&4294967295);var $78=HEAP32[(($flags125)>>2)];var $and126=($78)&32768;var $tobool127=((($and126))|0)!=0;if($tobool127){__label__=39;;}else{__label__=40;;}
66421 if(__label__==39){$ordinal=2;;}
66422 var $arrayidx130=(($ph_append)&4294967295);HEAP8[($arrayidx130)]=0;var $arrayidx131=(($ph_buf2)&4294967295);HEAP8[($arrayidx131)]=0;var $79=$word_addr;var $arrayidx132=(($79)&4294967295);var $80=HEAP8[($arrayidx132)];var $conv133=(tempInt=(($80)),(tempInt>=128?tempInt-256:tempInt));var $cmp134=((($conv133))|0)==48;if($cmp134){__label__=41;;}else{__label__=55;;}
66423 $land_lhs_true135$$if_end185$57:do{if(__label__==41){var $81=$prev_thousands;var $cmp136=((($81))|0)==0;if(!($cmp136)){__label__=55;break $land_lhs_true135$$if_end185$57;}
66424 var $82=$word_addr;var $arrayidx138=(($82+1)&4294967295);var $83=HEAP8[($arrayidx138)];var $conv139=(tempInt=(($83)),(tempInt>=128?tempInt-256:tempInt));var $cmp140=((($conv139))|0)!=32;if(!($cmp140)){__label__=55;break $land_lhs_true135$$if_end185$57;}
66425 var $84=$word_addr;var $arrayidx142=(($84+1)&4294967295);var $85=HEAP8[($arrayidx142)];var $conv143=(tempInt=(($85)),(tempInt>=128?tempInt-256:tempInt));var $86=$tr_addr;var $langopts144=(($86)&4294967295);var $decimal_sep=(($langopts144+208)&4294967295);var $87=HEAP32[(($decimal_sep)>>2)];var $cmp145=((($conv143))|0)!=((($87))|0);if(!($cmp145)){__label__=55;break $land_lhs_true135$$if_end185$57;}
66426 var $88=$n_digits;var $cmp147=((($88))|0)==2;if($cmp147){__lastLabel__=44;__label__=45;;}else{__lastLabel__=44;__label__=49;;}
66427 if(__label__==45){var $89=$word_addr;var $arrayidx149=(($89+3)&4294967295);var $90=HEAP8[($arrayidx149)];var $conv150=(tempInt=(($90)),(tempInt>=128?tempInt-256:tempInt));var $cmp151=((($conv150))|0)==58;if($cmp151){__label__=46;;}else{__label__=48;;}
66428 $land_lhs_true152$$if_else163thread_pre_split$64:do{if(__label__==46){var $91=$word_addr;var $arrayidx153=(($91+5)&4294967295);var $92=HEAP8[($arrayidx153)];var $conv154=(tempInt=(($92)),(tempInt>=128?tempInt-256:tempInt));var $isdigittmp16=((($conv154)-48)&4294967295);var $isdigit17=((($isdigittmp16))>>>0)<10;var $call155=((($isdigit17))&1);var $tobool156=((($call155))|0)!=0;if(!($tobool156)){__label__=48;break $land_lhs_true152$$if_else163thread_pre_split$64;}
66429 var $93=$word_addr;var $arrayidx158=(($93+7)&4294967295);var $94=HEAP8[($arrayidx158)];var $conv159=(tempInt=(($94)),(tempInt>=128?tempInt-256:tempInt));var $call160=_isspace($conv159);var $tobool161=((($call160))|0)!=0;if($tobool161){__label__=55;break $land_lhs_true135$$if_end185$57;}}}while(0);var $_pr43=$n_digits;__lastLabel__=48;;}
66430 var $95=__lastLabel__==48?$_pr43:($88);var $cmp164=((($95))|0)>3;if($cmp164){__label__=50;;}else{__label__=51;;}
66431 if(__label__==50){var $96=$flags_addr;var $arrayidx166=(($96)&4294967295);var $97=HEAP32[(($arrayidx166)>>2)];var $and167=($97)&-129;HEAP32[(($arrayidx166)>>2)]=$and167;$retval=0;__label__=157;break $land_lhs_true135$$if_end185$57;}
66432 else if(__label__==51){$ix=0;var $arraydecay177=(($ph_zeros)&4294967295);;while(1){var $98=$ix;var $99=$word_addr;var $arrayidx170=(($99+$98)&4294967295);var $100=HEAP8[($arrayidx170)];var $conv171=(tempInt=(($100)),(tempInt>=128?tempInt-256:tempInt));var $cmp172=((($conv171))|0)==48;if(!($cmp172)){__label__=55;break $land_lhs_true135$$if_end185$57;}
66433 var $101=$ix;var $102=$n_digits;var $sub=((($102)-1)&4294967295);var $cmp174=((($101))|0)<((($sub))|0);if(!($cmp174)){__label__=55;break $land_lhs_true135$$if_end185$57;}
66434 var $103=$tr_addr;var $call178=_strlen($arraydecay177);var $arrayidx179=(($ph_zeros+$call178)&4294967295);var $call180=__Z6LookupP10TranslatorPKcPc($103,((__str16313)&4294967295),$arrayidx179);var $104=$ix;var $inc182=((($104)+1)&4294967295);$ix=$inc182;__label__=52;continue;}}}}while(0);if(__label__==55){var $105=$tr_addr;var $langopts186=(($105)&4294967295);var $numbers187=(($langopts186+184)&4294967295);var $106=HEAP32[(($numbers187)>>2)];var $and188=($106)&4096;var $tobool189=((($and188))|0)!=0;if($tobool189){__label__=56;;}else{__label__=58;;}
66435 $land_lhs_true190$$if_else195$78:do{if(__label__==56){var $107=$n_digits;var $108=$word_addr;var $arrayidx191=(($108+$107)&4294967295);var $109=HEAP8[($arrayidx191)];var $conv192=(tempInt=(($109)),(tempInt>=128?tempInt-256:tempInt));var $cmp193=((($conv192))|0)==32;if(!($cmp193)){__label__=58;break $land_lhs_true190$$if_else195$78;}
66436 $thousands_inc=1;__label__=60;break $land_lhs_true190$$if_else195$78;}}while(0);$if_end203_thread$$if_else195$81:do{if(__label__==58){var $110=$n_digits;var $111=$word_addr;var $arrayidx196=(($111+$110)&4294967295);var $112=HEAP8[($arrayidx196)];var $conv197=(tempInt=(($112)),(tempInt>=128?tempInt-256:tempInt));var $113=$tr_addr;var $langopts198=(($113)&4294967295);var $thousands_sep199=(($langopts198+204)&4294967295);var $114=HEAP32[(($thousands_sep199)>>2)];var $cmp200=((($conv197))|0)==((($114))|0);if($cmp200){__label__=59;;}else{__label__=61;;}
66437 if(__label__==59){$thousands_inc=2;__label__=60;break $if_end203_thread$$if_else195$81;}
66438 else if(__label__==61){var $_pr44=$thousands_inc;var $116=$n_digits;var $add204=((($116)+2)&4294967295);$suffix_ix=$add204;var $cmp205=((($_pr44))|0)>0;if($cmp205){__label__=62;break $if_end203_thread$$if_else195$81;}else{__label__=77;break $if_end203_thread$$if_else195$81;}}}}while(0);$if_end203_thread$$if_then206$$if_end282$86:do{if(__label__==60){var $115=$n_digits;var $add20445=((($115)+2)&4294967295);$suffix_ix=$add20445;__label__=62;break $if_end203_thread$$if_then206$$if_end282$86;}}while(0);$if_then206$$if_end282$88:do{if(__label__==62){var $117=$n_digits;var $118=$thousands_inc;var $add207=((($118)+($117))&4294967295);$digix=$add207;;$while_cond208$90:while(1){var $119=$thousandplex;var $add209=((($119)+1)&4294967295);var $120=$wtab_addr;var $arrayidx210=(($120+12*$add209)&4294967295);var $flags211=(($arrayidx210)&4294967295);var $121=HEAP32[(($flags211)>>2)];var $and212=($121)&262144;var $cmp213=((($and212))|0)==0;if(!($cmp213)){__label__=77;break $if_then206$$if_end282$88;}
66439 var $122=$digix;var $123=$word_addr;var $arrayidx215=(($123+$122)&4294967295);var $124=HEAP8[($arrayidx215)];var $conv216=(tempInt=(($124)),(tempInt>=128?tempInt-256:tempInt));var $isdigittmp18=((($conv216)-48)&4294967295);var $isdigit19=((($isdigittmp18))>>>0)<10;var $call217=((($isdigit19))&1);var $tobool218=((($call217))|0)!=0;if(!($tobool218)){__label__=77;break $if_then206$$if_end282$88;}
66440 var $125=$digix;var $add220=((($125)+1)&4294967295);var $126=$word_addr;var $arrayidx221=(($126+$add220)&4294967295);var $127=HEAP8[($arrayidx221)];var $conv222=(tempInt=(($127)),(tempInt>=128?tempInt-256:tempInt));var $isdigittmp20=((($conv222)-48)&4294967295);var $isdigit21=((($isdigittmp20))>>>0)<10;var $call223=((($isdigit21))&1);var $tobool224=((($call223))|0)!=0;if(!($tobool224)){__label__=77;break $if_then206$$if_end282$88;}
66441 var $128=$digix;var $add226=((($128)+2)&4294967295);var $129=$word_addr;var $arrayidx227=(($129+$add226)&4294967295);var $130=HEAP8[($arrayidx227)];var $conv228=(tempInt=(($130)),(tempInt>=128?tempInt-256:tempInt));var $isdigittmp22=((($conv228)-48)&4294967295);var $isdigit23=((($isdigittmp22))>>>0)<10;var $call229=((($isdigit23))&1);var $tobool230=((($call229))|0)!=0;if(!($tobool230)){__label__=77;break $if_then206$$if_end282$88;}
66442 var $131=$digix;var $add232=((($131)+3)&4294967295);var $132=$word_addr;var $arrayidx233=(($132+$add232)&4294967295);var $133=HEAP8[($arrayidx233)];var $conv234=(tempInt=(($133)),(tempInt>=128?tempInt-256:tempInt));var $isdigittmp24=((($conv234)-48)&4294967295);var $isdigit25=((($isdigittmp24))>>>0)<10;var $call235=((($isdigit25))&1);var $tobool236=((($call235))|0)!=0;if($tobool236){__label__=77;break $if_then206$$if_end282$88;}
66443 var $134=$digix;var $sub238=((($134)-1)&4294967295);var $135=$word_addr;var $arrayidx239=(($135+$sub238)&4294967295);var $136=HEAP8[($arrayidx239)];var $conv240=(tempInt=(($136)),(tempInt>=128?tempInt-256:tempInt));var $isdigittmp26=((($conv240)-48)&4294967295);var $isdigit27=((($isdigittmp26))>>>0)<10;var $call241=((($isdigit27))&1);var $tobool242=((($call241))|0)!=0;var $lnot=($tobool242)^1;if(!($lnot)){__label__=77;break $if_then206$$if_end282$88;}
66444 var $137=$digix;var $138=$word_addr;var $arrayidx245=(($138+$137)&4294967295);var $139=HEAP8[($arrayidx245)];var $conv246=(tempInt=(($139)),(tempInt>=128?tempInt-256:tempInt));var $cmp247=((($conv246))|0)!=48;if($cmp247){__label__=72;;}else{__label__=70;;}
66445 $if_then258$$lor_lhs_false248$98:do{if(__label__==70){var $140=$digix;var $add249=((($140)+1)&4294967295);var $141=$word_addr;var $arrayidx250=(($141+$add249)&4294967295);var $142=HEAP8[($arrayidx250)];var $conv251=(tempInt=(($142)),(tempInt>=128?tempInt-256:tempInt));var $cmp252=((($conv251))|0)!=48;if($cmp252){__label__=72;break $if_then258$$lor_lhs_false248$98;}
66446 var $143=$digix;var $add254=((($143)+2)&4294967295);var $144=$word_addr;var $arrayidx255=(($144+$add254)&4294967295);var $145=HEAP8[($arrayidx255)];var $conv256=(tempInt=(($145)),(tempInt>=128?tempInt-256:tempInt));var $cmp257=((($conv256))|0)!=48;if($cmp257){__label__=72;break $if_then258$$lor_lhs_false248$98;}else{__label__=73;break $if_then258$$lor_lhs_false248$98;}}}while(0);if(__label__==72){$thousands_exact=0;;}
66447 var $146=$thousandplex;var $inc260=((($146)+1)&4294967295);$thousandplex=$inc260;var $147=$digix;var $add261=((($147)+3)&4294967295);$digix=$add261;var $148=$digix;var $149=$word_addr;var $arrayidx262=(($149+$148)&4294967295);var $150=HEAP8[($arrayidx262)];var $conv263=(tempInt=(($150)),(tempInt>=128?tempInt-256:tempInt));var $151=$tr_addr;var $langopts264=(($151)&4294967295);var $thousands_sep265=(($langopts264+204)&4294967295);var $152=HEAP32[(($thousands_sep265)>>2)];var $cmp266=((($conv263))|0)==((($152))|0);if($cmp266){__label__=76;;}else{__label__=74;;}
66448 if(__label__==74){var $153=$tr_addr;var $langopts268=(($153)&4294967295);var $numbers269=(($langopts268+184)&4294967295);var $154=HEAP32[(($numbers269)>>2)];var $and270=($154)&4096;var $tobool271=((($and270))|0)!=0;if(!($tobool271)){__label__=77;break $if_then206$$if_end282$88;}
66449 var $155=$digix;var $156=$word_addr;var $arrayidx273=(($156+$155)&4294967295);var $157=HEAP8[($arrayidx273)];var $conv274=(tempInt=(($157)),(tempInt>=128?tempInt-256:tempInt));var $cmp275=((($conv274))|0)==32;if(!($cmp275)){__label__=77;break $if_then206$$if_end282$88;}}
66450 var $158=$digix;var $add277=((($158)+2)&4294967295);$suffix_ix=$add277;var $159=$thousands_inc;var $160=$digix;var $add278=((($160)+($159))&4294967295);$digix=$add278;__label__=63;continue $while_cond208$90;}}}while(0);var $161=$value;var $cmp283=((($161))|0)==0;if($cmp283){__label__=78;;}else{__label__=80;;}
66451 $land_lhs_true284$$if_end287$109:do{if(__label__==78){var $162=$prev_thousands;var $tobool285=((($162))|0)!=0;if(!($tobool285)){__label__=80;break $land_lhs_true284$$if_end287$109;}
66452 $suppress_null=1;;}}while(0);var $163=$tr_addr;var $translator_name288=(($163+280)&4294967295);var $164=HEAP32[(($translator_name288)>>2)];var $cmp289=((($164))|0)==26741;if($cmp289){__label__=81;;}else{__label__=85;;}
66453 $if_then290$$if_end304$113:do{if(__label__==81){var $165=$thousandplex;var $166=$wtab_addr;var $arrayidx291=(($166+12*$165)&4294967295);var $flags292=(($arrayidx291)&4294967295);var $167=HEAP32[(($flags292)>>2)];var $and293=($167)&16384;var $tobool294=((($and293))|0)!=0;if(!($tobool294)){__label__=85;break $if_then290$$if_end304$113;}
66454 var $168=$thousands_exact;var $cmp296=((($168))|0)==1;if(!($cmp296)){__label__=85;break $if_then290$$if_end304$113;}
66455 var $169=$suffix_ix;var $170=$word_addr;var $arrayidx298=(($170+$169)&4294967295);var $171=$thousandplex;var $172=$value;var $call299=__ZL11hu_number_ePKcii($arrayidx298,$171,$172);var $tobool300=((($call299))|0)!=0;if(!($tobool300)){__label__=85;break $if_then290$$if_end304$113;}
66456 var $173=HEAP32[((__ZL14number_control)>>2)];var $or302=($173)|1;HEAP32[((__ZL14number_control)>>2)]=$or302;;}}while(0);var $174=$n_digits;var $175=$word_addr;var $arrayidx305=(($175+$174)&4294967295);var $176=HEAP8[($arrayidx305)];var $conv306=(tempInt=(($176)),(tempInt>=128?tempInt-256:tempInt));var $177=$tr_addr;var $langopts307=(($177)&4294967295);var $decimal_sep308=(($langopts307+208)&4294967295);var $178=HEAP32[(($decimal_sep308)>>2)];var $cmp309=((($conv306))|0)==((($178))|0);if($cmp309){__label__=86;;}else{__label__=88;;}
66457 $land_lhs_true310$$if_else319$119:do{if(__label__==86){var $179=$n_digits;var $add311=((($179)+1)&4294967295);var $180=$word_addr;var $arrayidx312=(($180+$add311)&4294967295);var $181=HEAP8[($arrayidx312)];var $conv313=(tempInt=(($181)),(tempInt>=128?tempInt-256:tempInt));var $isdigittmp28=((($conv313)-48)&4294967295);var $isdigit29=((($isdigittmp28))>>>0)<10;var $call314=((($isdigit29))&1);var $tobool315=((($call314))|0)!=0;if(!($tobool315)){__label__=88;break $land_lhs_true310$$if_else319$119;}
66458 var $182=$tr_addr;var $arraydecay317=(($ph_append)&4294967295);var $call318=__Z6LookupP10TranslatorPKcPc($182,((__str17314)&4294967295),$arraydecay317);$decimal_point=1;__label__=98;break $land_lhs_true310$$if_else319$119;}}while(0);$if_end356$$if_else319$122:do{if(__label__==88){var $183=$suppress_null;var $cmp320=((($183))|0)==0;if($cmp320){__label__=89;;}else{__label__=95;;}
66459 if(__label__==89){var $184=$thousands_inc;var $cmp322=((($184))|0)>0;if(!($cmp322)){__label__=98;break $if_end356$$if_else319$122;}
66460 var $185=$thousandplex;var $cmp324=((($185))|0)>0;if(!($cmp324)){__label__=98;break $if_end356$$if_else319$122;}
66461 var $186=$value;var $cmp326=((($186))|0)<1000;if(!($cmp326)){__label__=98;break $if_end356$$if_else319$122;}
66462 var $187=$suppress_null;var $cmp328=((($187))|0)==0;if(!($cmp328)){__label__=98;break $if_end356$$if_else319$122;}
66463 var $188=$tr_addr;var $189=$value;var $190=$thousandplex;var $191=$thousands_exact;var $arraydecay330=(($ph_append)&4294967295);var $call331=__ZL15LookupThousandsP10TranslatoriiiPc($188,$189,$190,$191,$arraydecay330);var $tobool332=((($call331))|0)!=0;if(!($tobool332)){__label__=98;break $if_end356$$if_else319$122;}
66464 $value=0;$suppress_null=1;;}
66465 else if(__label__==95){var $192=HEAP32[((__ZL23speak_missing_thousands)>>2)];var $cmp338=((($192))|0)==1;if(!($cmp338)){__label__=98;break $if_end356$$if_else319$122;}
66466 var $arraydecay340=(($string)&4294967295);var $193=$thousandplex;var $add341=((($193)+1)&4294967295);var $call342=_sprintf($arraydecay340,((__str18315)&4294967295),allocate([$add341,0,0,0],["i32",0,0,0],ALLOC_STACK));var $194=$tr_addr;var $arraydecay343=(($string)&4294967295);var $arraydecay344=(($buf1)&4294967295);var $call345=__Z6LookupP10TranslatorPKcPc($194,$arraydecay343,$arraydecay344);var $cmp346=((($call345))|0)==0;if(!($cmp346)){__label__=98;break $if_end356$$if_else319$122;}
66467 var $arraydecay348=(($string)&4294967295);var $195=$thousandplex;var $call349=_sprintf($arraydecay348,((__str18315)&4294967295),allocate([$195,0,0,0],["i32",0,0,0],ALLOC_STACK));var $196=$tr_addr;var $arraydecay350=(($string)&4294967295);var $arraydecay351=(($ph_append)&4294967295);var $call352=__Z6LookupP10TranslatorPKcPc($196,$arraydecay350,$arraydecay351);;}}}while(0);var $arrayidx357=(($ph_append)&4294967295);var $197=HEAP8[($arrayidx357)];var $conv358=(tempInt=(($197)),(tempInt>=128?tempInt-256:tempInt));var $cmp359=((($conv358))|0)==0;if($cmp359){__label__=99;;}else{__label__=102;;}
66468 $land_lhs_true360$$if_end369$135:do{if(__label__==99){var $198=$n_digits;var $199=$word_addr;var $arrayidx361=(($199+$198)&4294967295);var $200=HEAP8[($arrayidx361)];var $conv362=(tempInt=(($200)),(tempInt>=128?tempInt-256:tempInt));var $cmp363=((($conv362))|0)==46;if(!($cmp363)){__label__=102;break $land_lhs_true360$$if_end369$135;}
66469 var $201=$thousandplex;var $cmp365=((($201))|0)==0;if(!($cmp365)){__label__=112;break $land_lhs_true360$$if_end369$135;}
66470 var $202=$tr_addr;var $arraydecay367=(($ph_append)&4294967295);var $call368=__Z6LookupP10TranslatorPKcPc($202,((__str19316)&4294967295),$arraydecay367);__label__=102;break $land_lhs_true360$$if_end369$135;}}while(0);$if_end369$$if_end404$139:do{if(__label__==102){var $_pr47=$thousandplex;var $cmp370=((($_pr47))|0)==0;if(!($cmp370)){__label__=112;break $if_end369$$if_end404$139;}
66471 var $203=$word_addr;HEAP32[(($p)>>2)]=$203;var $204=HEAP32[(($p)>>2)];var $arrayidx37360=(($204+1)&4294967295);var $205=HEAP8[($arrayidx37360)];var $conv37461=(tempInt=(($205)),(tempInt>=128?tempInt-256:tempInt));var $isdigittmp3062=((($conv37461)-48)&4294967295);var $isdigit3163=((($isdigittmp3062))>>>0)<10;var $206=HEAPU32[(($p)>>2)];if($isdigit3163){__lastLabel__=103;__label__=104;;}else{__lastLabel__=103;__label__=105;;}
66472 $while_body377$$while_end379$142:do{if(__label__==104){while(1){var $207=__lastLabel__==104?$210:($206);var $incdec_ptr378=(($207+1)&4294967295);HEAP32[(($p)>>2)]=$incdec_ptr378;var $208=HEAP32[(($p)>>2)];var $arrayidx373=(($208+1)&4294967295);var $209=HEAP8[($arrayidx373)];var $conv374=(tempInt=(($209)),(tempInt>=128?tempInt-256:tempInt));var $isdigittmp30=((($conv374)-48)&4294967295);var $isdigit31=((($isdigittmp30))>>>0)<10;var $call375=((($isdigit31))&1);var $tobool376=((($call375))|0)!=0;var $210=HEAPU32[(($p)>>2)];if($tobool376){__lastLabel__=104;__label__=104;continue;}else{__lastLabel__=104;__label__=105;break $while_body377$$while_end379$142;}}}}while(0);var $_lcssa=__lastLabel__==103?$206:($210);var $arrayidx380=(($_lcssa+-1)&4294967295);var $211=HEAP8[($arrayidx380)];var $conv381=(tempInt=(($211)),(tempInt>=128?tempInt-256:tempInt));var $isdigittmp32=((($conv381)-48)&4294967295);var $isdigit33=((($isdigittmp32))>>>0)<10;var $call382=((($isdigit33))&1);var $tobool383=((($call382))|0)!=0;if($tobool383){__label__=106;;}else{__label__=108;;}
66473 $if_then384$$if_end390$146:do{if(__label__==106){var $212=HEAP32[(($p)>>2)];var $add_ptr=(($212+-1)&4294967295);HEAP32[(($p2)>>2)]=$add_ptr;var $213=$tr_addr;var $arraydecay385=(($buf_digit_lookup)&4294967295);var $214=$flags_addr;var $215=$wtab_addr;var $call386=__Z14LookupDictListP10TranslatorPPcS1_PjiP8WORD_TAB($213,$p2,$arraydecay385,$214,4,$215);var $tobool387=((($call386))|0)!=0;if(!($tobool387)){__label__=108;break $if_then384$$if_end390$146;}
66474 HEAP32[((__ZL14n_digit_lookup)>>2)]=2;;}}while(0);var $arrayidx391=(($buf_digit_lookup)&4294967295);var $216=HEAP8[($arrayidx391)];var $conv392=(tempInt=(($216)),(tempInt>=128?tempInt-256:tempInt));var $cmp393=((($conv392))|0)==0;if(!($cmp393)){__label__=112;break $if_end369$$if_end404$139;}
66475 var $217=HEAP32[(($p)>>2)];var $218=HEAP8[($217)];var $conv395=(tempInt=(($218)),(tempInt>=128?tempInt-256:tempInt));var $cmp396=((($conv395))|0)!=48;if(!($cmp396)){__label__=112;break $if_end369$$if_end404$139;}
66476 var $219=$tr_addr;var $arraydecay398=(($buf_digit_lookup)&4294967295);var $220=$flags_addr;var $221=$wtab_addr;var $call399=__Z14LookupDictListP10TranslatorPPcS1_PjiP8WORD_TAB($219,$p,$arraydecay398,$220,4,$221);var $tobool400=((($call399))|0)!=0;if(!($tobool400)){__label__=112;break $if_end369$$if_end404$139;}
66477 HEAP32[((__ZL14n_digit_lookup)>>2)]=1;;}}while(0);var $222=$tr_addr;var $223=$value;var $arraydecay405=(($ph_buf)&4294967295);var $224=$suppress_null;var $225=$thousandplex;var $226=$prev_thousands;var $227=$ordinal;var $or406=($227)|($226);__ZL10LookupNum3P10TranslatoriPciii($222,$223,$arraydecay405,$224,$225,$or406);var $228=$thousandplex;var $cmp408=((($228))|0)>0;if($cmp408){__label__=113;;}else{__label__=115;;}
66478 $land_lhs_true409$$if_else419$154:do{if(__label__==113){var $229=$tr_addr;var $langopts410=(($229)&4294967295);var $numbers2=(($langopts410+188)&4294967295);var $230=HEAP32[(($numbers2)>>2)];var $and411=($230)&512;var $tobool412=((($and411))|0)!=0;if(!($tobool412)){__label__=115;break $land_lhs_true409$$if_else419$154;}
66479 var $231=$ph_out_addr;var $arraydecay414=(($ph_zeros)&4294967295);var $arraydecay415=(($ph_append)&4294967295);var $arraydecay416=(($ph_buf2)&4294967295);var $arraydecay417=(($ph_buf)&4294967295);var $call418=_sprintf($231,((__str20317)&4294967295),allocate([$arraydecay414,0,0,0,$arraydecay415,0,0,0,$arraydecay416,0,0,0,$arraydecay417,0,0,0],["i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));__label__=116;break $land_lhs_true409$$if_else419$154;}}while(0);if(__label__==115){var $232=$ph_out_addr;var $arraydecay420=(($ph_zeros)&4294967295);var $arraydecay421=(($ph_buf2)&4294967295);var $arraydecay422=(($ph_buf)&4294967295);var $arraydecay423=(($ph_append)&4294967295);var $call424=_sprintf($232,((__str20317)&4294967295),allocate([$arraydecay420,0,0,0,$arraydecay421,0,0,0,$arraydecay422,0,0,0,$arraydecay423,0,0,0],["i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));;}
66480 var $arraydecay472=(($ph_buf)&4294967295);var $arraydecay480=(($string)&4294967295);var $arraydecay482=(($string)&4294967295);var $arraydecay483=(($buf1)&4294967295);var $arraydecay488=(($ph_buf)&4294967295);var $arraydecay489=(($buf1)&4294967295);var $arraydecay492=(($ph_buf)&4294967295);var $arraydecay504=(($buf1)&4294967295);var $arraydecay506=(($buf1)&4294967295);var $arraydecay463=(($buf1)&4294967295);var $arraydecay465=(($buf1)&4294967295);var $arraydecay448=(($buf1)&4294967295);var $arraydecay450=(($buf1)&4294967295);var $arraydecay524=(($buf1)&4294967295);var $arraydecay526=(($buf1)&4294967295);var $arraydecay529=(($buf1)&4294967295);var $arraydecay533=(($buf1)&4294967295);var $arraydecay547=(($buf1)&4294967295);var $arraydecay549=(($buf1)&4294967295);;$while_cond426thread_pre_split$160:while(1){var $_pr49=$decimal_point;__lastLabel__=117;;$while_cond426$162:while(1){var $233=__lastLabel__==117?$_pr49:(0);var $tobool427=((($233))|0)!=0;if(!($tobool427)){__label__=145;break $while_cond426thread_pre_split$160;}
66481 var $234=$n_digits;var $inc429=((($234)+1)&4294967295);$n_digits=$inc429;$decimal_count=0;var $235=$n_digits;var $236=$decimal_count;var $add43153=((($236)+($235))&4294967295);var $237=$word_addr;var $arrayidx43254=(($237+$add43153)&4294967295);var $238=HEAP8[($arrayidx43254)];var $conv43355=(tempInt=(($238)),(tempInt>=128?tempInt-256:tempInt));var $isdigittmp3456=((($conv43355)-48)&4294967295);var $isdigit3557=((($isdigittmp3456))>>>0)<10;var $call43458=((($isdigit3557))&1);var $tobool43559=((($call43458))|0)!=0;if($tobool43559){__label__=120;;}else{__label__=121;;}
66482 $while_body436$$while_end438$165:do{if(__label__==120){while(1){var $239=$decimal_count;var $inc437=((($239)+1)&4294967295);$decimal_count=$inc437;var $240=$n_digits;var $241=$decimal_count;var $add431=((($241)+($240))&4294967295);var $242=$word_addr;var $arrayidx432=(($242+$add431)&4294967295);var $243=HEAP8[($arrayidx432)];var $conv433=(tempInt=(($243)),(tempInt>=128?tempInt-256:tempInt));var $isdigittmp34=((($conv433)-48)&4294967295);var $isdigit35=((($isdigittmp34))>>>0)<10;var $call434=((($isdigit35))&1);var $tobool435=((($call434))|0)!=0;if($tobool435){__label__=120;continue;}else{__label__=121;break $while_body436$$while_end438$165;}}}}while(0);$max_decimal_count=2;var $244=$tr_addr;var $langopts439=(($244)&4294967295);var $numbers440=(($langopts439+184)&4294967295);var $245=HEAP32[(($numbers440)>>2)];var $and441=($245)&57344;$decimal_mode=$and441;if($and441==32768){__label__=122;;}
66483 else if($and441==16384){__label__=123;;}
66484 else if($and441==8192){__label__=128;;}
66485 else if($and441==40960){__label__=128;;}
66486 else if($and441==24576){__label__=133;;}
66487 else{__label__=136;;}
66488 $while_cond510$$sw_bb$$while_cond443_preheader$$sw_bb469$$sw_bb495$169:do{if(__label__==122){$max_decimal_count=5;__label__=123;break $while_cond510$$sw_bb$$while_cond443_preheader$$sw_bb469$$sw_bb495$169;}
66489 else if(__label__==128){var $267=$tr_addr;var $268=$n_digits;var $269=$word_addr;var $arrayidx470=(($269+$268)&4294967295);var $call471=_atoi($arrayidx470);__ZL10LookupNum3P10TranslatoriPciii($267,$call471,$arraydecay472,0,0,0);var $270=$n_digits;var $271=$word_addr;var $arrayidx474=(($271+$270)&4294967295);var $272=HEAP8[($arrayidx474)];var $conv475=(tempInt=(($272)),(tempInt>=128?tempInt-256:tempInt));var $cmp476=((($conv475))|0)==48;if($cmp476){__label__=130;;}else{__label__=129;;}
66490 $if_then479$$lor_lhs_false477$172:do{if(__label__==129){var $273=$decimal_mode;var $cmp478=((($273))|0)==40960;if($cmp478){__label__=130;break $if_then479$$lor_lhs_false477$172;}else{__label__=132;break $if_then479$$lor_lhs_false477$172;}}}while(0);if(__label__==130){var $274=$decimal_count;var $call481=_sprintf($arraydecay480,((__str21318)&4294967295),allocate([$274,0,0,0],["i32",0,0,0],ALLOC_STACK));var $275=$tr_addr;var $call484=__Z6LookupP10TranslatorPKcPc($275,$arraydecay482,$arraydecay483);var $cmp485=((($call484))|0)==0;if($cmp485){__label__=136;break $while_cond510$$sw_bb$$while_cond443_preheader$$sw_bb469$$sw_bb495$169;}
66491 var $call490=_strcat($arraydecay488,$arraydecay489);;}
66492 var $276=$ph_out_addr;var $call493=_strcat($276,$arraydecay492);var $277=$decimal_count;var $278=$n_digits;var $add494=((($278)+($277))&4294967295);$n_digits=$add494;__label__=136;break $while_cond510$$sw_bb$$while_cond443_preheader$$sw_bb469$$sw_bb495$169;}
66493 else if(__label__==133){var $279=$decimal_count;var $cmp496=((($279))|0)<=4;if(!($cmp496)){__label__=136;break $while_cond510$$sw_bb$$while_cond443_preheader$$sw_bb469$$sw_bb495$169;}
66494 var $280=$n_digits;var $281=$word_addr;var $arrayidx498=(($281+$280)&4294967295);var $282=HEAP8[($arrayidx498)];var $conv499=(tempInt=(($282)),(tempInt>=128?tempInt-256:tempInt));var $cmp500=((($conv499))|0)!=48;if(!($cmp500)){__label__=136;break $while_cond510$$sw_bb$$while_cond443_preheader$$sw_bb469$$sw_bb495$169;}
66495 var $283=$tr_addr;var $284=$n_digits;var $285=$word_addr;var $arrayidx502=(($285+$284)&4294967295);var $call503=_atoi($arrayidx502);__ZL10LookupNum3P10TranslatoriPciii($283,$call503,$arraydecay504,0,0,0);var $286=$ph_out_addr;var $call507=_strcat($286,$arraydecay506);var $287=$decimal_count;var $288=$n_digits;var $add508=((($288)+($287))&4294967295);$n_digits=$add508;__label__=136;break $while_cond510$$sw_bb$$while_cond443_preheader$$sw_bb469$$sw_bb495$169;}}while(0);$while_cond510$$while_cond443_preheader$181:do{if(__label__==123){var $246=$n_digits;var $247=$word_addr;var $arrayidx44450=(($247+$246)&4294967295);var $248=HEAP8[($arrayidx44450)];var $conv44551=(tempInt=(($248)),(tempInt>=128?tempInt-256:tempInt));var $cmp44652=((($conv44551))|0)==48;if($cmp44652){__label__=124;;}else{__label__=125;;}
66496 $while_body447$$while_end453$183:do{if(__label__==124){while(1){var $249=$tr_addr;var $call449=__Z6LookupP10TranslatorPKcPc($249,((__str16313)&4294967295),$arraydecay448);var $250=$ph_out_addr;var $call451=_strcat($250,$arraydecay450);var $251=$decimal_count;var $dec=((($251)-1)&4294967295);$decimal_count=$dec;var $252=$n_digits;var $inc452=((($252)+1)&4294967295);$n_digits=$inc452;var $253=$n_digits;var $254=$word_addr;var $arrayidx444=(($254+$253)&4294967295);var $255=HEAP8[($arrayidx444)];var $conv445=(tempInt=(($255)),(tempInt>=128?tempInt-256:tempInt));var $cmp446=((($conv445))|0)==48;if($cmp446){__label__=124;continue;}else{__label__=125;break $while_body447$$while_end453$183;}}}}while(0);var $256=$decimal_count;var $257=$max_decimal_count;var $cmp454=((($256))|0)<=((($257))|0);if(!($cmp454)){__label__=136;break $while_cond510$$while_cond443_preheader$181;}
66497 var $258=$n_digits;var $259=$word_addr;var $arrayidx456=(($259+$258)&4294967295);var $260=HEAP8[($arrayidx456)];var $conv457=(tempInt=(($260)),(tempInt>=128?tempInt-256:tempInt));var $isdigittmp36=((($conv457)-48)&4294967295);var $isdigit37=((($isdigittmp36))>>>0)<10;var $call458=((($isdigit37))&1);var $tobool459=((($call458))|0)!=0;if(!($tobool459)){__label__=136;break $while_cond510$$while_cond443_preheader$181;}
66498 var $261=$tr_addr;var $262=$n_digits;var $263=$word_addr;var $arrayidx461=(($263+$262)&4294967295);var $call462=_atoi($arrayidx461);__ZL10LookupNum3P10TranslatoriPciii($261,$call462,$arraydecay463,0,0,0);var $264=$ph_out_addr;var $call466=_strcat($264,$arraydecay465);var $265=$decimal_count;var $266=$n_digits;var $add467=((($266)+($265))&4294967295);$n_digits=$add467;;}}while(0);while(1){var $289=$n_digits;var $290=$word_addr;var $arrayidx511=(($290+$289)&4294967295);var $291=HEAPU8[($arrayidx511)];$c=$291;var $conv512=((($291))&255);var $isdigittmp38=((($conv512)-48)&4294967295);var $isdigit39=((($isdigittmp38))>>>0)<10;var $call513=((($isdigit39))&1);var $tobool514=((($call513))|0)!=0;if(!($tobool514)){__label__=139;break;}
66499 var $292=$ph_out_addr;var $call516=_strlen($292);var $cmp517=((($call516))>>>0)<150;if(!($cmp517)){__label__=139;break;}
66500 var $293=$n_digits;var $inc520=((($293)+1)&4294967295);$n_digits=$inc520;var $294=$word_addr;var $arrayidx521=(($294+$293)&4294967295);var $295=HEAP8[($arrayidx521)];var $conv522=(tempInt=(($295)),(tempInt>=128?tempInt-256:tempInt));var $sub523=((($conv522)-48)&4294967295);$value=$sub523;var $296=$tr_addr;var $297=$value;var $call525=__ZL10LookupNum2P10TranslatoriiPc($296,$297,2,$arraydecay524);var $298=$ph_out_addr;var $call527=_strcat($298,$arraydecay526);__label__=136;continue;}
66501 var $299=$tr_addr;var $call530=__Z6LookupP10TranslatorPKcPc($299,((__str22319)&4294967295),$arraydecay529);var $tobool531=((($call530))|0)!=0;if($tobool531){__label__=140;;}else{__label__=141;;}
66502 if(__label__==140){var $300=$ph_out_addr;var $call534=_strcat($300,$arraydecay533);;}
66503 var $301=$c;var $conv536=((($301))&255);var $302=$tr_addr;var $langopts537=(($302)&4294967295);var $decimal_sep538=(($langopts537+208)&4294967295);var $303=HEAP32[(($decimal_sep538)>>2)];var $cmp539=((($conv536))|0)==((($303))|0);if($cmp539){__label__=142;;}else{__label__=144;;}
66504 if(__label__==142){var $304=$n_digits;var $add541=((($304)+1)&4294967295);var $305=$word_addr;var $arrayidx542=(($305+$add541)&4294967295);var $306=HEAP8[($arrayidx542)];var $conv543=(tempInt=(($306)),(tempInt>=128?tempInt-256:tempInt));var $isdigittmp40=((($conv543)-48)&4294967295);var $isdigit41=((($isdigittmp40))>>>0)<10;var $call544=((($isdigit41))&1);var $tobool545=((($call544))|0)!=0;if($tobool545){__label__=143;break $while_cond426$162;}}
66505 $decimal_point=0;__lastLabel__=144;__label__=118;continue $while_cond426$162;}
66506 var $307=$tr_addr;var $call548=__Z6LookupP10TranslatorPKcPc($307,((__str17314)&4294967295),$arraydecay547);var $308=$ph_out_addr;var $call550=_strcat($308,$arraydecay549);__label__=117;continue $while_cond426thread_pre_split$160;}
66507 var $309=$ph_out_addr;var $arrayidx554=(($309)&4294967295);var $310=HEAP8[($arrayidx554)];var $conv555=(tempInt=(($310)),(tempInt>=128?tempInt-256:tempInt));var $cmp556=((($conv555))|0)!=0;if($cmp556){__label__=146;;}else{__label__=154;;}
66508 $land_lhs_true557$$if_end588$202:do{if(__label__==146){var $311=$ph_out_addr;var $arrayidx558=(($311)&4294967295);var $312=HEAP8[($arrayidx558)];var $conv559=(tempInt=(($312)),(tempInt>=128?tempInt-256:tempInt));var $cmp560=((($conv559))|0)!=21;if(!($cmp560)){__label__=154;break $land_lhs_true557$$if_end588$202;}
66509 var $313=$n_digits;var $add563=((($313)+1)&4294967295);var $314=$word_addr;var $arrayidx564=(($314+$add563)&4294967295);$p562=$arrayidx564;var $315=$p562;var $call565=__Z7utf8_inPiPKc($next_char,$315);var $316=$p562;var $add_ptr566=(($316+$call565)&4294967295);$p562=$add_ptr566;var $317=$tr_addr;var $langopts567=(($317)&4294967295);var $numbers568=(($langopts567+184)&4294967295);var $318=HEAP32[(($numbers568)>>2)];var $and569=($318)&131072;var $tobool570=((($and569))|0)!=0;if($tobool570){__label__=148;;}else{__label__=150;;}
66510 $land_lhs_true571$$if_end575$205:do{if(__label__==148){var $319=HEAP32[(($next_char)>>2)];var $cmp572=((($319))|0)==32;if(!($cmp572)){__label__=150;break $land_lhs_true571$$if_end575$205;}
66511 var $320=$p562;var $call574=__Z7utf8_inPiPKc($next_char,$320);;}}while(0);var $321=HEAP32[(($next_char)>>2)];var $call576=_iswalpha($321);var $tobool577=((($call576))|0)!=0;if($tobool577){__label__=154;break $land_lhs_true557$$if_end588$202;}
66512 var $322=$thousandplex;var $323=$wtab_addr;var $arrayidx579=(($323+12*$322)&4294967295);var $flags580=(($arrayidx579)&4294967295);var $324=HEAP32[(($flags580)>>2)];var $and581=($324)&16384;var $tobool582=((($and581))|0)!=0;if($tobool582){__label__=152;;}else{__label__=153;;}
66513 if(__label__==152){var $325=$thousands_exact;var $cmp584=((($325))|0)!=0;if($cmp584){__label__=154;break $land_lhs_true557$$if_end588$202;}}
66514 var $326=$ph_out_addr;var $strlen=_strlen($326);var $endptr=(($326+$strlen)&4294967295);var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=((__ZZL17TranslateNumber_1P10TranslatorPcS1_PjP8WORD_TABiE9str_pause)&4294967295);$dest$=$endptr;$stop$=$src$+2;if(($dest$%4)==($src$%4)&&2>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
66515 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
66516 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};;}}while(0);var $327=$flags_addr;var $328=HEAP32[(($327)>>2)];var $or589=($328)|-2147483648;HEAP32[(($327)>>2)]=$or589;var $329=HEAP32[((__ZL23speak_missing_thousands)>>2)];var $dec590=((($329)-1)&4294967295);HEAP32[((__ZL23speak_missing_thousands)>>2)]=$dec590;var $330=$skipwords;var $tobool591=((($330))|0)!=0;if($tobool591){__label__=155;;}else{__label__=156;;}
66517 if(__label__==155){var $331=$skipwords;HEAP32[((_dictionary_skipwords)>>2)]=$331;;}
66518 $retval=1;;}
66519 var $332=$retval;STACKTOP=__stackBase__;return $332;return null;}
66520 function __ZL15LookupThousandsP10TranslatoriiiPc($tr,$value,$thousandplex,$thousands_exact,$ph_out){var __stackBase__=STACKTOP;STACKTOP+=104;_memset(__stackBase__,0,104);var __label__;var __lastLabel__=null;var $retval;var $tr_addr;var $value_addr;var $thousandplex_addr;var $thousands_exact_addr;var $ph_out_addr;var $found;var $found_value;var $string=__stackBase__;var $ph_of=__stackBase__+12;var $ph_thousands=__stackBase__+24;var $ph_buf=__stackBase__+64;$tr_addr=$tr;$value_addr=$value;$thousandplex_addr=$thousandplex;$thousands_exact_addr=$thousands_exact;$ph_out_addr=$ph_out;$found_value=0;var $arrayidx=(($ph_of)&4294967295);HEAP8[($arrayidx)]=0;var $0=$value_addr;var $cmp=((($0))|0)>0;if($cmp){__label__=1;;}else{__label__=12;;}
66521 $if_then$$if_end36thread_pre_split$2:do{if(__label__==1){var $1=$thousands_exact_addr;var $and=($1)&1;var $tobool=((($and))|0)!=0;if($tobool){__label__=2;;}else{__label__=9;;}
66522 $if_then1$$if_end27thread_pre_split$4:do{if(__label__==2){var $2=$thousands_exact_addr;var $and2=($2)&2;var $tobool3=((($and2))|0)!=0;if($tobool3){__label__=3;;}else{__label__=4;;}
66523 if(__label__==3){var $arraydecay=(($string)&4294967295);var $3=$value_addr;var $4=$thousandplex_addr;var $call=_sprintf($arraydecay,((__str42339)&4294967295),allocate([$3,0,0,0,$4,0,0,0],["i32",0,0,0,"i32",0,0,0],ALLOC_STACK));var $5=$tr_addr;var $arraydecay5=(($string)&4294967295);var $arraydecay6=(($ph_thousands)&4294967295);var $call7=__Z6LookupP10TranslatorPKcPc($5,$arraydecay5,$arraydecay6);$found_value=$call7;;}
66524 var $6=$found_value;var $tobool8=((($6))|0)!=0;var $lnot=($tobool8)^1;var $conv=((($lnot))&1);var $7=HEAP32[((__ZL14number_control)>>2)];var $and9=($7)&1;var $and10=($and9)&($conv);var $tobool11=((($and10))|0)!=0;if($tobool11){__label__=5;;}else{__label__=6;;}
66525 if(__label__==5){var $arraydecay13=(($string)&4294967295);var $8=$value_addr;var $9=$thousandplex_addr;var $call14=_sprintf($arraydecay13,((__str43340)&4294967295),allocate([$8,0,0,0,$9,0,0,0],["i32",0,0,0,"i32",0,0,0],ALLOC_STACK));var $10=$tr_addr;var $arraydecay15=(($string)&4294967295);var $arraydecay16=(($ph_thousands)&4294967295);var $call17=__Z6LookupP10TranslatorPKcPc($10,$arraydecay15,$arraydecay16);$found_value=$call17;__lastLabel__=5;;}
66526 else if(__label__==6){var $_pr=$found_value;__lastLabel__=6;;}
66527 var $11=__lastLabel__==6?$_pr:($call17);var $tobool19=((($11))|0)!=0;if($tobool19){__label__=9;break $if_then1$$if_end27thread_pre_split$4;}
66528 var $arraydecay21=(($string)&4294967295);var $12=$value_addr;var $13=$thousandplex_addr;var $call22=_sprintf($arraydecay21,((__str44341)&4294967295),allocate([$12,0,0,0,$13,0,0,0],["i32",0,0,0,"i32",0,0,0],ALLOC_STACK));var $14=$tr_addr;var $arraydecay23=(($string)&4294967295);var $arraydecay24=(($ph_thousands)&4294967295);var $call25=__Z6LookupP10TranslatorPKcPc($14,$arraydecay23,$arraydecay24);$found_value=$call25;__lastLabel__=8;__label__=10;break $if_then1$$if_end27thread_pre_split$4;}}while(0);if(__label__==9){var $_pr1=$found_value;__lastLabel__=9;;}
66529 var $15=__lastLabel__==9?$_pr1:($call25);var $cmp28=((($15))|0)==0;if(!($cmp28)){__label__=12;break $if_then$$if_end36thread_pre_split$2;}
66530 var $arraydecay30=(($string)&4294967295);var $16=$value_addr;var $17=$thousandplex_addr;var $call31=_sprintf($arraydecay30,((__str45342)&4294967295),allocate([$16,0,0,0,$17,0,0,0],["i32",0,0,0,"i32",0,0,0],ALLOC_STACK));var $18=$tr_addr;var $arraydecay32=(($string)&4294967295);var $arraydecay33=(($ph_thousands)&4294967295);var $call34=__Z6LookupP10TranslatorPKcPc($18,$arraydecay32,$arraydecay33);$found_value=$call34;__lastLabel__=11;__label__=13;break $if_then$$if_end36thread_pre_split$2;}}while(0);if(__label__==12){var $_pr2=$found_value;__lastLabel__=12;;}
66531 var $19=__lastLabel__==12?$_pr2:($call34);var $cmp37=((($19))|0)==0;if($cmp37){__label__=14;;}else{__label__=36;;}
66532 $if_then38$$if_end118$21:do{if(__label__==14){var $20=$value_addr;var $rem=((($20))|0)%100;var $cmp39=((($rem))|0)>=20;if($cmp39){__label__=15;;}else{__label__=16;;}
66533 if(__label__==15){var $21=$tr_addr;var $arraydecay41=(($ph_of)&4294967295);var $call42=__Z6LookupP10TranslatorPKcPc($21,((__str46343)&4294967295),$arraydecay41);;}
66534 $found=0;var $22=$thousands_exact_addr;var $and44=($22)&1;var $tobool45=((($and44))|0)!=0;if($tobool45){__label__=17;;}else{__label__=28;;}
66535 if(__label__==17){var $23=$thousands_exact_addr;var $and47=($23)&2;var $tobool48=((($and47))|0)!=0;if($tobool48){__label__=18;;}else{__label__=19;;}
66536 if(__label__==18){var $arraydecay50=(($string)&4294967295);var $24=$value_addr;var $call51=__ZL9M_Varianti($24);var $25=$thousandplex_addr;var $call52=_sprintf($arraydecay50,((__str47344)&4294967295),allocate([$call51,0,0,0,$25,0,0,0],["i8*",0,0,0,"i32",0,0,0],ALLOC_STACK));var $26=$tr_addr;var $arraydecay53=(($string)&4294967295);var $arraydecay54=(($ph_thousands)&4294967295);var $call55=__Z6LookupP10TranslatorPKcPc($26,$arraydecay53,$arraydecay54);$found=$call55;__lastLabel__=18;;}
66537 else if(__label__==19){var $_pr3=$found;__lastLabel__=19;;}
66538 var $27=__lastLabel__==19?$_pr3:($call55);var $tobool57=((($27))|0)!=0;if($tobool57){__label__=23;;}else{__label__=21;;}
66539 $if_end67thread_pre_split$$land_lhs_true$32:do{if(__label__==21){var $28=HEAP32[((__ZL14number_control)>>2)];var $and58=($28)&1;var $tobool59=((($and58))|0)!=0;if(!($tobool59)){__label__=23;break $if_end67thread_pre_split$$land_lhs_true$32;}
66540 var $arraydecay61=(($string)&4294967295);var $29=$value_addr;var $call62=__ZL9M_Varianti($29);var $30=$thousandplex_addr;var $call63=_sprintf($arraydecay61,((__str48345)&4294967295),allocate([$call62,0,0,0,$30,0,0,0],["i8*",0,0,0,"i32",0,0,0],ALLOC_STACK));var $31=$tr_addr;var $arraydecay64=(($string)&4294967295);var $arraydecay65=(($ph_thousands)&4294967295);var $call66=__Z6LookupP10TranslatorPKcPc($31,$arraydecay64,$arraydecay65);$found=$call66;__lastLabel__=22;__label__=24;break $if_end67thread_pre_split$$land_lhs_true$32;}}while(0);if(__label__==23){var $_pr4=$found;__lastLabel__=23;;}
66541 var $32=__lastLabel__==23?$_pr4:($call66);var $tobool68=((($32))|0)!=0;if($tobool68){__label__=26;;}else{__label__=25;;}
66542 if(__label__==26){var $_pr5=$found;__lastLabel__=26;;}
66543 else if(__label__==25){var $arraydecay70=(($string)&4294967295);var $33=$value_addr;var $call71=__ZL9M_Varianti($33);var $34=$thousandplex_addr;var $call72=_sprintf($arraydecay70,((__str49346)&4294967295),allocate([$call71,0,0,0,$34,0,0,0],["i8*",0,0,0,"i32",0,0,0],ALLOC_STACK));var $35=$tr_addr;var $arraydecay73=(($string)&4294967295);var $arraydecay74=(($ph_thousands)&4294967295);var $call75=__Z6LookupP10TranslatorPKcPc($35,$arraydecay73,$arraydecay74);$found=$call75;__lastLabel__=25;;}
66544 var $36=__lastLabel__==26?$_pr5:($call75);var $cmp78=((($36))|0)==0;if(!($cmp78)){__label__=36;break $if_then38$$if_end118$21;}}
66545 var $arraydecay80=(($string)&4294967295);var $37=$value_addr;var $call81=__ZL9M_Varianti($37);var $38=$thousandplex_addr;var $call82=_sprintf($arraydecay80,((__str50347)&4294967295),allocate([$call81,0,0,0,$38,0,0,0],["i8*",0,0,0,"i32",0,0,0],ALLOC_STACK));var $39=$tr_addr;var $arraydecay83=(($string)&4294967295);var $arraydecay84=(($ph_thousands)&4294967295);var $call85=__Z6LookupP10TranslatorPKcPc($39,$arraydecay83,$arraydecay84);var $cmp86=((($call85))|0)==0;if(!($cmp86)){__label__=36;break $if_then38$$if_end118$21;}
66546 var $40=$thousandplex_addr;var $cmp88=((($40))|0)>3;if($cmp88){__label__=30;;}else{__label__=32;;}
66547 $if_then89$$if_end100$44:do{if(__label__==30){var $arraydecay90=(($string)&4294967295);var $41=$thousandplex_addr;var $sub=((($41)-1)&4294967295);var $call91=_sprintf($arraydecay90,((__str18315)&4294967295),allocate([$sub,0,0,0],["i32",0,0,0],ALLOC_STACK));var $42=$tr_addr;var $arraydecay92=(($string)&4294967295);var $arraydecay93=(($ph_buf)&4294967295);var $call94=__Z6LookupP10TranslatorPKcPc($42,$arraydecay92,$arraydecay93);var $cmp95=((($call94))|0)==0;if(!($cmp95)){__label__=32;break $if_then89$$if_end100$44;}
66548 var $43=$tr_addr;var $arraydecay97=(($ph_thousands)&4294967295);var $call98=__Z6LookupP10TranslatorPKcPc($43,((__str51348)&4294967295),$arraydecay97);HEAP32[((__ZL23speak_missing_thousands)>>2)]=3;;}}while(0);var $arrayidx101=(($ph_thousands)&4294967295);var $44=HEAP8[($arrayidx101)];var $conv102=(tempInt=(($44)),(tempInt>=128?tempInt-256:tempInt));var $cmp103=((($conv102))|0)==0;if(!($cmp103)){__label__=36;break $if_then38$$if_end118$21;}
66549 var $arraydecay105=(($string)&4294967295);var $45=$value_addr;var $call106=_sprintf($arraydecay105,((__str52349)&4294967295),allocate([$45,0,0,0],["i32",0,0,0],ALLOC_STACK));var $46=$tr_addr;var $arraydecay107=(($string)&4294967295);var $arraydecay108=(($ph_thousands)&4294967295);var $call109=__Z6LookupP10TranslatorPKcPc($46,$arraydecay107,$arraydecay108);$found_value=$call109;var $cmp110=((($call109))|0)==0;if($cmp110){__label__=34;;}else{__label__=35;;}
66550 if(__label__==34){var $47=$tr_addr;var $arraydecay112=(($ph_thousands)&4294967295);var $call113=__Z6LookupP10TranslatorPKcPc($47,((__str53350)&4294967295),$arraydecay112);;}
66551 HEAP32[((__ZL23speak_missing_thousands)>>2)]=2;;}}while(0);var $48=$ph_out_addr;var $arraydecay119=(($ph_of)&4294967295);var $arraydecay120=(($ph_thousands)&4294967295);var $call121=_sprintf($48,((__str47699)&4294967295),allocate([$arraydecay119,0,0,0,$arraydecay120,0,0,0],["i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));var $49=$value_addr;var $cmp122=((($49))|0)==1;if($cmp122){__label__=37;;}else{__label__=40;;}
66552 $land_lhs_true123$$if_end129$53:do{if(__label__==37){var $50=$thousandplex_addr;var $cmp124=((($50))|0)==1;if(!($cmp124)){__label__=40;break $land_lhs_true123$$if_end129$53;}
66553 var $51=$tr_addr;var $langopts=(($51)&4294967295);var $numbers=(($langopts+184)&4294967295);var $52=HEAP32[(($numbers)>>2)];var $and126=($52)&2097152;var $tobool127=((($and126))|0)!=0;if(!($tobool127)){__label__=40;break $land_lhs_true123$$if_end129$53;}
66554 $retval=1;__label__=41;break $land_lhs_true123$$if_end129$53;}}while(0);if(__label__==40){var $53=$found_value;$retval=$53;;}
66555 var $54=$retval;STACKTOP=__stackBase__;return $54;return null;}
66556 function __ZL10LookupNum3P10TranslatoriPciii($tr,$value,$ph_out,$suppress_null,$thousandplex,$control){var __stackBase__=STACKTOP;STACKTOP+=380;_memset(__stackBase__,0,380);var __label__;var __lastLabel__=null;var $tr_addr;var $value_addr;var $ph_out_addr;var $suppress_null_addr;var $thousandplex_addr;var $control_addr;var $found;var $hundreds;var $tensunits;var $x;var $ix;var $exact;var $ordinal;var $say_zero_hundred;var $string=__stackBase__;var $buf1=__stackBase__+12;var $buf2=__stackBase__+112;var $ph_100=__stackBase__+212;var $ph_10T=__stackBase__+232;var $ph_digits=__stackBase__+252;var $ph_thousands=__stackBase__+304;var $ph_hundred_and=__stackBase__+356;var $ph_thousand_and=__stackBase__+368;$tr_addr=$tr;$value_addr=$value;$ph_out_addr=$ph_out;$suppress_null_addr=$suppress_null;$thousandplex_addr=$thousandplex;$control_addr=$control;$say_zero_hundred=0;var $0=$control_addr;var $and=($0)&34;$ordinal=$and;var $1=$value_addr;var $div=((((($1))|0)/100)|0);$hundreds=$div;var $2=$value_addr;var $rem=((($2))|0)%100;$tensunits=$rem;var $arrayidx=(($buf1)&4294967295);HEAP8[($arrayidx)]=0;var $arrayidx1=(($ph_thousands)&4294967295);HEAP8[($arrayidx1)]=0;var $arrayidx2=(($ph_thousand_and)&4294967295);HEAP8[($arrayidx2)]=0;var $3=$tr_addr;var $langopts=(($3)&4294967295);var $numbers=(($langopts+184)&4294967295);var $4=HEAP32[(($numbers)>>2)];var $and3=($4)&4194304;var $tobool=((($and3))|0)!=0;if($tobool){__label__=1;;}else{__label__=4;;}
66557 $land_lhs_true$$if_endthread_pre_split$2:do{if(__label__==1){var $5=$control_addr;var $and4=($5)&1;var $tobool5=((($and4))|0)!=0;if($tobool5){__label__=3;;}else{__label__=2;;}
66558 if(__label__==2){var $6=$hundreds;var $cmp=((($6))|0)>=10;if($cmp){__lastLabel__=2;;}else{__lastLabel__=2;__label__=5;break $land_lhs_true$$if_endthread_pre_split$2;}}
66559 $say_zero_hundred=1;__label__=4;break $land_lhs_true$$if_endthread_pre_split$2;}}while(0);if(__label__==4){var $_pr=$hundreds;__lastLabel__=4;;}
66560 var $7=__lastLabel__==4?$_pr:($6);var $cmp6=((($7))|0)>0;if($cmp6){__label__=7;;}else{__label__=6;;}
66561 $if_then9$$lor_lhs_false7$10:do{if(__label__==6){var $8=$say_zero_hundred;var $tobool8=((($8))|0)!=0;if($tobool8){__label__=7;break $if_then9$$lor_lhs_false7$10;}else{__label__=61;break $if_then9$$lor_lhs_false7$10;}}}while(0);if(__label__==7){$found=0;var $9=$ordinal;var $tobool10=((($9))|0)!=0;if($tobool10){__label__=8;;}else{__label__=12;;}
66562 $land_lhs_true11$$if_then16$14:do{if(__label__==8){var $10=$tensunits;var $cmp12=((($10))|0)==0;if($cmp12){__label__=9;;}else{__label__=10;;}
66563 if(__label__==9){var $11=$tr_addr;var $arraydecay=(($ph_100)&4294967295);var $call=__Z6LookupP10TranslatorPKcPc($11,((__str35332)&4294967295),$arraydecay);$found=$call;__lastLabel__=9;;}
66564 else if(__label__==10){var $_pr1=$found;__lastLabel__=10;;}
66565 var $12=__lastLabel__==10?$_pr1:($call);var $cmp15=((($12))|0)==0;if($cmp15){__label__=12;break $land_lhs_true11$$if_then16$14;}else{__label__=17;break $land_lhs_true11$$if_then16$14;}}}while(0);$if_then16$$if_end27$20:do{if(__label__==12){var $13=$tensunits;var $cmp17=((($13))|0)==0;if($cmp17){__label__=13;;}else{__label__=14;;}
66566 if(__label__==13){var $14=$tr_addr;var $arraydecay19=(($ph_100)&4294967295);var $call20=__Z6LookupP10TranslatorPKcPc($14,((__str36333)&4294967295),$arraydecay19);$found=$call20;__lastLabel__=13;;}
66567 else if(__label__==14){var $_pr3=$found;__lastLabel__=14;;}
66568 var $15=__lastLabel__==14?$_pr3:($call20);var $tobool22=((($15))|0)!=0;if($tobool22){__label__=17;break $if_then16$$if_end27$20;}
66569 var $16=$tr_addr;var $arraydecay24=(($ph_100)&4294967295);var $call25=__Z6LookupP10TranslatorPKcPc($16,((__str37334)&4294967295),$arraydecay24);;}}while(0);var $17=$tr_addr;var $langopts28=(($17)&4294967295);var $numbers29=(($langopts28+184)&4294967295);var $18=HEAP32[(($numbers29)>>2)];var $and30=($18)&2048;var $cmp31=((($and30))|0)!=0;var $19=$hundreds;if($cmp31){__label__=18;;}else{__label__=19;;}
66570 $land_lhs_true32$$if_else$28:do{if(__label__==18){var $cmp33=((($19))|0)!=19;var $20=$hundreds;var $cmp35=((($20))|0)>=10;var $or_cond=($cmp33)&($cmp35);if($or_cond){__label__=20;break $land_lhs_true32$$if_else$28;}else{__label__=33;break $land_lhs_true32$$if_else$28;}}
66571 else if(__label__==19){var $cmp35_old=((($19))|0)>=10;if($cmp35_old){__label__=20;break $land_lhs_true32$$if_else$28;}else{__label__=33;break $land_lhs_true32$$if_else$28;}}}while(0);if(__label__==20){var $arrayidx37=(($ph_digits)&4294967295);HEAP8[($arrayidx37)]=0;$exact=0;var $21=$value_addr;var $rem38=((($21))|0)%1000;var $cmp39=((($rem38))|0)==0;if($cmp39){__label__=21;;}else{__label__=22;;}
66572 if(__label__==21){$exact=1;;}
66573 var $22=$tr_addr;var $23=$hundreds;var $div42=((((($23))|0)/10)|0);var $24=$thousandplex_addr;var $add=((($24)+1)&4294967295);var $25=$exact;var $26=$ordinal;var $or=($26)|($25);var $arraydecay43=(($ph_10T)&4294967295);var $call44=__ZL15LookupThousandsP10TranslatoriiiPc($22,$div42,$add,$or,$arraydecay43);var $cmp45=((($call44))|0)==0;if($cmp45){__label__=23;;}else{__label__=26;;}
66574 if(__label__==23){$x=0;var $27=$tr_addr;var $langopts47=(($27)&4294967295);var $numbers2=(($langopts47+188)&4294967295);var $28=HEAP32[(($numbers2)>>2)];var $29=$thousandplex_addr;var $add48=((($29)+1)&4294967295);var $shl=1<<($add48);var $and49=($shl)&($28);var $tobool50=((($and49))|0)!=0;if($tobool50){__label__=24;;}else{__label__=25;;}
66575 if(__label__==24){$x=8;;}
66576 var $30=$tr_addr;var $31=$hundreds;var $div53=((((($31))|0)/10)|0);var $32=$x;var $arraydecay54=(($ph_digits)&4294967295);var $call55=__ZL10LookupNum2P10TranslatoriiPc($30,$div53,$32,$arraydecay54);;}
66577 var $33=$tr_addr;var $langopts57=(($33)&4294967295);var $numbers258=(($langopts57+188)&4294967295);var $34=HEAP32[(($numbers258)>>2)];var $and59=($34)&512;var $tobool60=((($and59))|0)!=0;var $arraydecay62=(($ph_thousands)&4294967295);if($tobool60){__label__=27;;}else{__label__=28;;}
66578 if(__label__==27){var $arraydecay63=(($ph_10T)&4294967295);var $arraydecay64=(($ph_digits)&4294967295);var $call65=_sprintf($arraydecay62,((__str47699)&4294967295),allocate([$arraydecay63,0,0,0,$arraydecay64,0,0,0],["i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));;}
66579 else if(__label__==28){var $arraydecay68=(($ph_digits)&4294967295);var $arraydecay69=(($ph_10T)&4294967295);var $call70=_sprintf($arraydecay62,((__str47699)&4294967295),allocate([$arraydecay68,0,0,0,$arraydecay69,0,0,0],["i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));;}
66580 var $35=$hundreds;var $rem72=((($35))|0)%10;$hundreds=$rem72;var $cmp73=((($rem72))|0)==0;if($cmp73){__label__=30;;}else{__label__=32;;}
66581 $land_lhs_true74$$if_end78$46:do{if(__label__==30){var $36=$say_zero_hundred;var $cmp75=((($36))|0)==0;if(!($cmp75)){__label__=32;break $land_lhs_true74$$if_end78$46;}
66582 var $arrayidx77=(($ph_100)&4294967295);HEAP8[($arrayidx77)]=0;;}}while(0);$suppress_null_addr=1;;}
66583 var $arrayidx81=(($ph_digits)&4294967295);HEAP8[($arrayidx81)]=0;var $37=$hundreds;var $cmp82=((($37))|0)>0;if($cmp82){__label__=35;;}else{__label__=34;;}
66584 $if_then85$$lor_lhs_false83$51:do{if(__label__==34){var $38=$say_zero_hundred;var $tobool84=((($38))|0)!=0;if($tobool84){__label__=35;break $if_then85$$lor_lhs_false83$51;}else{__label__=60;break $if_then85$$lor_lhs_false83$51;}}}while(0);$if_then85$$if_end166$53:do{if(__label__==35){var $39=$tr_addr;var $langopts86=(($39)&4294967295);var $numbers87=(($langopts86+184)&4294967295);var $40=HEAP32[(($numbers87)>>2)];var $and88=($40)&262144;var $tobool89=((($and88))|0)!=0;if($tobool89){__label__=36;;}else{__label__=39;;}
66585 $land_lhs_true90$$if_end99$55:do{if(__label__==36){var $41=$control_addr;var $and91=($41)&1;var $tobool92=((($and91))|0)!=0;if($tobool92){__label__=38;;}else{__label__=37;;}
66586 if(__label__==37){var $arrayidx94=(($ph_thousands)&4294967295);var $42=HEAP8[($arrayidx94)];var $conv=(tempInt=(($42)),(tempInt>=128?tempInt-256:tempInt));var $cmp95=((($conv))|0)!=0;if(!($cmp95)){__label__=39;break $land_lhs_true90$$if_end99$55;}}
66587 var $43=$tr_addr;var $arraydecay97=(($ph_thousand_and)&4294967295);var $call98=__Z6LookupP10TranslatorPKcPc($43,((__str33330)&4294967295),$arraydecay97);;}}while(0);$suppress_null_addr=1;$found=0;var $44=$ordinal;var $tobool100=((($44))|0)!=0;if($tobool100){__label__=40;;}else{__label__=45;;}
66588 $land_lhs_true101$$if_end124$61:do{if(__label__==40){var $45=$tensunits;var $cmp102=((($45))|0)==0;if($cmp102){__label__=42;;}else{__label__=41;;}
66589 if(__label__==41){var $46=$tr_addr;var $langopts104=(($46)&4294967295);var $numbers2105=(($langopts104+188)&4294967295);var $47=HEAP32[(($numbers2105)>>2)];var $and106=($47)&4096;var $tobool107=((($and106))|0)!=0;if(!($tobool107)){__label__=45;break $land_lhs_true101$$if_end124$61;}}
66590 var $arraydecay109=(($string)&4294967295);var $48=$hundreds;var $call110=_sprintf($arraydecay109,((__str39336)&4294967295),allocate([$48,0,0,0],["i32",0,0,0],ALLOC_STACK));var $49=$tr_addr;var $arraydecay111=(($string)&4294967295);var $arraydecay112=(($ph_digits)&4294967295);var $call113=__Z6LookupP10TranslatorPKcPc($49,$arraydecay111,$arraydecay112);$found=$call113;var $50=$tr_addr;var $langopts114=(($50)&4294967295);var $numbers2115=(($langopts114+188)&4294967295);var $51=HEAP32[(($numbers2115)>>2)];var $and116=($51)&4096;var $tobool117=((($and116))|0)!=0;if(!($tobool117)){__label__=45;break $land_lhs_true101$$if_end124$61;}
66591 var $52=$tensunits;var $cmp119=((($52))|0)>0;if(!($cmp119)){__label__=45;break $land_lhs_true101$$if_end124$61;}
66592 var $arraydecay121=(($ph_digits)&4294967295);var $call122=_strcat($arraydecay121,((__ZL11ph_ordinal2)&4294967295));;}}while(0);var $53=$hundreds;var $cmp125=((($53))|0)==0;if($cmp125){__label__=46;;}else{__label__=48;;}
66593 $land_lhs_true126$$if_else131$69:do{if(__label__==46){var $54=$say_zero_hundred;var $tobool127=((($54))|0)!=0;if(!($tobool127)){__label__=48;break $land_lhs_true126$$if_else131$69;}
66594 var $55=$tr_addr;var $arraydecay129=(($ph_digits)&4294967295);var $call130=__Z6LookupP10TranslatorPKcPc($55,((__str16313)&4294967295),$arraydecay129);__label__=60;break $if_then85$$if_end166$53;}}while(0);var $56=$found;var $tobool132=((($56))|0)!=0;if($tobool132){__label__=54;;}else{__label__=49;;}
66595 $if_end149thread_pre_split$$land_lhs_true133$73:do{if(__label__==49){var $57=$tensunits;var $cmp134=((($57))|0)==0;if($cmp134){__label__=50;;}else{__label__=51;;}
66596 if(__label__==50){var $arraydecay136=(($string)&4294967295);var $58=$hundreds;var $call137=_sprintf($arraydecay136,((__str40337)&4294967295),allocate([$58,0,0,0],["i32",0,0,0],ALLOC_STACK));var $59=$tr_addr;var $arraydecay138=(($string)&4294967295);var $arraydecay139=(($ph_digits)&4294967295);var $call140=__Z6LookupP10TranslatorPKcPc($59,$arraydecay138,$arraydecay139);$found=$call140;__lastLabel__=50;;}
66597 else if(__label__==51){var $_pr4=$found;__lastLabel__=51;;}
66598 var $60=__lastLabel__==51?$_pr4:($call140);var $tobool142=((($60))|0)!=0;if($tobool142){__label__=54;break $if_end149thread_pre_split$$land_lhs_true133$73;}
66599 var $arraydecay144=(($string)&4294967295);var $61=$hundreds;var $call145=_sprintf($arraydecay144,((__str41338)&4294967295),allocate([$61,0,0,0],["i32",0,0,0],ALLOC_STACK));var $62=$tr_addr;var $arraydecay146=(($string)&4294967295);var $arraydecay147=(($ph_digits)&4294967295);var $call148=__Z6LookupP10TranslatorPKcPc($62,$arraydecay146,$arraydecay147);$found=$call148;__lastLabel__=53;__label__=55;break $if_end149thread_pre_split$$land_lhs_true133$73;}}while(0);if(__label__==54){var $_pr6=$found;__lastLabel__=54;;}
66600 var $63=__lastLabel__==54?$_pr6:($call148);var $tobool150=((($63))|0)!=0;if($tobool150){__label__=56;;}else{__label__=57;;}
66601 if(__label__==56){var $arrayidx152=(($ph_100)&4294967295);HEAP8[($arrayidx152)]=0;;}
66602 else if(__label__==57){var $64=$hundreds;var $cmp154=((($64))|0)>1;if($cmp154){__label__=59;;}else{__label__=58;;}
66603 if(__label__==58){var $65=$tr_addr;var $langopts156=(($65)&4294967295);var $numbers157=(($langopts156+184)&4294967295);var $66=HEAP32[(($numbers157)>>2)];var $and158=($66)&1024;var $cmp159=((($and158))|0)==0;if(!($cmp159)){__label__=60;break $if_then85$$if_end166$53;}}
66604 var $67=$tr_addr;var $68=$hundreds;var $arraydecay161=(($ph_digits)&4294967295);var $call162=__ZL10LookupNum2P10TranslatoriiPc($67,$68,0,$arraydecay161);;}}}while(0);var $arraydecay167=(($buf1)&4294967295);var $arraydecay168=(($ph_thousands)&4294967295);var $arraydecay169=(($ph_thousand_and)&4294967295);var $arraydecay170=(($ph_digits)&4294967295);var $arraydecay171=(($ph_100)&4294967295);var $call172=_sprintf($arraydecay167,((__str20317)&4294967295),allocate([$arraydecay168,0,0,0,$arraydecay169,0,0,0,$arraydecay170,0,0,0,$arraydecay171,0,0,0],["i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));;}
66605 var $arrayidx174=(($ph_hundred_and)&4294967295);HEAP8[($arrayidx174)]=0;var $69=$tensunits;var $cmp175=((($69))|0)>0;if($cmp175){__label__=62;;}else{__label__=74;;}
66606 $if_then176$$if_end217$91:do{if(__label__==62){var $70=$value_addr;var $cmp177=((($70))|0)>100;if($cmp177){__label__=65;;}else{__label__=63;;}
66607 $if_then183$$lor_lhs_false178$93:do{if(__label__==63){var $71=$control_addr;var $and179=($71)&1;var $tobool180=((($and179))|0)!=0;if(!($tobool180)){__label__=69;break $if_then183$$lor_lhs_false178$93;}
66608 var $72=$thousandplex_addr;var $cmp182=((($72))|0)==0;if($cmp182){__label__=65;break $if_then183$$lor_lhs_false178$93;}else{__label__=69;break $if_then183$$lor_lhs_false178$93;}}}while(0);$if_then183$$if_end199$96:do{if(__label__==65){var $73=$tr_addr;var $langopts184=(($73)&4294967295);var $numbers185=(($langopts184+184)&4294967295);var $74=HEAP32[(($numbers185)>>2)];var $and186=($74)&64;var $tobool187=((($and186))|0)!=0;if($tobool187){__label__=68;;}else{__label__=66;;}
66609 if(__label__==66){var $75=$tr_addr;var $langopts189=(($75)&4294967295);var $numbers190=(($langopts189+184)&4294967295);var $76=HEAP32[(($numbers190)>>2)];var $and191=($76)&8388608;var $tobool192=((($and191))|0)!=0;if(!($tobool192)){__label__=69;break $if_then183$$if_end199$96;}
66610 var $77=$tensunits;var $cmp194=((($77))|0)<10;if(!($cmp194)){__label__=69;break $if_then183$$if_end199$96;}}
66611 var $78=$tr_addr;var $arraydecay196=(($ph_hundred_and)&4294967295);var $call197=__Z6LookupP10TranslatorPKcPc($78,((__str33330)&4294967295),$arraydecay196);;}}while(0);var $79=$tr_addr;var $langopts200=(($79)&4294967295);var $numbers201=(($langopts200+184)&4294967295);var $80=HEAP32[(($numbers201)>>2)];var $and202=($80)&524288;var $tobool203=((($and202))|0)!=0;if(!($tobool203)){__label__=74;break $if_then176$$if_end217$91;}
66612 var $81=$hundreds;var $cmp205=((($81))|0)==0;if(!($cmp205)){__label__=74;break $if_then176$$if_end217$91;}
66613 var $82=$control_addr;var $and207=($82)&1;var $tobool208=((($and207))|0)!=0;if($tobool208){__label__=73;;}else{__label__=72;;}
66614 if(__label__==72){var $arrayidx210=(($ph_thousands)&4294967295);var $83=HEAP8[($arrayidx210)];var $conv211=(tempInt=(($83)),(tempInt>=128?tempInt-256:tempInt));var $cmp212=((($conv211))|0)!=0;if(!($cmp212)){__label__=74;break $if_then176$$if_end217$91;}}
66615 var $84=$tr_addr;var $arraydecay214=(($ph_hundred_and)&4294967295);var $call215=__Z6LookupP10TranslatorPKcPc($84,((__str33330)&4294967295),$arraydecay214);;}}while(0);var $arrayidx218=(($buf2)&4294967295);HEAP8[($arrayidx218)]=0;var $85=$tensunits;var $cmp219=((($85))|0)!=0;if($cmp219){__label__=76;;}else{__label__=75;;}
66616 $if_then222$$lor_lhs_false220$109:do{if(__label__==75){var $86=$suppress_null_addr;var $cmp221=((($86))|0)==0;if($cmp221){__label__=76;break $if_then222$$lor_lhs_false220$109;}
66617 var $102=HEAP8[(((__ZL11ph_ordinal2)&4294967295))];var $conv262=(tempInt=(($102)),(tempInt>=128?tempInt-256:tempInt));var $cmp263=((($conv262))|0)!=0;if(!($cmp263)){__label__=94;break $if_then222$$lor_lhs_false220$109;}
66618 var $arraydecay265=(($buf1)&4294967295);var $call266=_strlen($arraydecay265);$ix=$call266;var $103=$ix;var $cmp267=((($103))|0)>0;if($cmp267){__label__=91;;}else{__label__=93;;}
66619 $land_lhs_true268$$if_end275$113:do{if(__label__==91){var $104=$ix;var $sub=((($104)-1)&4294967295);var $arrayidx269=(($buf1+$sub)&4294967295);var $105=HEAP8[($arrayidx269)];var $conv270=(tempInt=(($105)),(tempInt>=128?tempInt-256:tempInt));var $cmp271=((($conv270))|0)==10;if(!($cmp271)){__label__=93;break $land_lhs_true268$$if_end275$113;}
66620 var $106=$ix;var $sub273=((($106)-1)&4294967295);var $arrayidx274=(($buf1+$sub273)&4294967295);HEAP8[($arrayidx274)]=0;;}}while(0);var $arraydecay276=(($buf2)&4294967295);var $call277=_strcpy($arraydecay276,((__ZL11ph_ordinal2)&4294967295));__label__=94;break $if_then222$$lor_lhs_false220$109;}}while(0);$if_then222$$if_end279$117:do{if(__label__==76){$x=0;var $87=$thousandplex_addr;var $cmp223=((($87))|0)==0;if($cmp223){__label__=77;;}else{__label__=84;;}
66621 $if_then224$$if_else240$119:do{if(__label__==77){$x=2;var $88=$ordinal;var $tobool225=((($88))|0)!=0;if($tobool225){__label__=78;;}else{__label__=79;;}
66622 if(__label__==78){$x=3;;}
66623 var $89=$value_addr;var $cmp228=((($89))|0)<100;if($cmp228){__label__=80;;}else{__label__=82;;}
66624 $land_lhs_true229$$if_end234$124:do{if(__label__==80){var $90=$control_addr;var $and230=($90)&1;var $tobool231=((($and230))|0)!=0;if($tobool231){__label__=82;break $land_lhs_true229$$if_end234$124;}
66625 var $91=$x;var $or233=($91)|4;$x=$or233;;}}while(0);var $92=$ordinal;var $and235=($92)&32;var $tobool236=((($and235))|0)!=0;if(!($tobool236)){__label__=86;break $if_then224$$if_else240$119;}
66626 var $93=$x;var $or238=($93)|32;$x=$or238;;}
66627 else if(__label__==84){var $94=$tr_addr;var $langopts241=(($94)&4294967295);var $numbers2242=(($langopts241+188)&4294967295);var $95=HEAP32[(($numbers2242)>>2)];var $96=$thousandplex_addr;var $shl243=1<<($96);var $and244=($shl243)&($95);var $tobool245=((($and244))|0)!=0;if(!($tobool245)){__label__=86;break $if_then224$$if_else240$119;}
66628 $x=8;;}}while(0);var $97=$tr_addr;var $98=$tensunits;var $99=$x;var $arraydecay249=(($buf2)&4294967295);var $call250=__ZL10LookupNum2P10TranslatoriiPc($97,$98,$99,$arraydecay249);var $cmp251=((($call250))|0)!=0;if(!($cmp251)){__label__=94;break $if_then222$$if_end279$117;}
66629 var $100=$tr_addr;var $langopts253=(($100)&4294967295);var $numbers254=(($langopts253+184)&4294967295);var $101=HEAP32[(($numbers254)>>2)];var $and255=($101)&128;var $tobool256=((($and255))|0)!=0;if(!($tobool256)){__label__=94;break $if_then222$$if_end279$117;}
66630 var $arrayidx258=(($ph_hundred_and)&4294967295);HEAP8[($arrayidx258)]=0;;}}while(0);var $107=$ph_out_addr;var $arraydecay280=(($buf1)&4294967295);var $arraydecay281=(($ph_hundred_and)&4294967295);var $arraydecay282=(($buf2)&4294967295);var $call283=_sprintf($107,((__str6549)&4294967295),allocate([$arraydecay280,0,0,0,$arraydecay281,0,0,0,$arraydecay282,0,0,0],["i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));STACKTOP=__stackBase__;return;return;}
66631 function __ZL10LookupNum2P10TranslatoriiPc($tr,$value,$control,$ph_out){var __stackBase__=STACKTOP;STACKTOP+=148;_memset(__stackBase__,0,148);var __label__;var __lastLabel__=null;var $tr_addr;var $value_addr;var $control_addr;var $ph_out_addr;var $found;var $ix;var $units;var $tens;var $used_and;var $found_ordinal;var $next_phtype;var $ord_type;var $string=__stackBase__;var $ph_ordinal=__stackBase__+12;var $ph_tens=__stackBase__+32;var $ph_digits=__stackBase__+84;var $ph_and=__stackBase__+136;$tr_addr=$tr;$value_addr=$value;$control_addr=$control;$ph_out_addr=$ph_out;$used_and=0;$found_ordinal=0;$ord_type=111;var $0=$value_addr;var $rem=((($0))|0)%10;$units=$rem;var $1=$value_addr;var $div=((((($1))|0)/10)|0);$tens=$div;$found=0;var $arrayidx=(($ph_ordinal)&4294967295);HEAP8[($arrayidx)]=0;var $arrayidx1=(($ph_tens)&4294967295);HEAP8[($arrayidx1)]=0;var $arrayidx2=(($ph_digits)&4294967295);HEAP8[($arrayidx2)]=0;var $arrayidx3=(($ph_and)&4294967295);HEAP8[($arrayidx3)]=0;var $2=$control_addr;var $and=($2)&32;var $tobool=((($and))|0)!=0;if($tobool){__label__=1;;}else{__label__=2;;}
66632 if(__label__==1){$ord_type=113;;}
66633 var $3=$control_addr;var $and4=($3)&2;var $tobool5=((($and4))|0)!=0;var $4=HEAP32[((__ZL14n_digit_lookup)>>2)];var $cmp=((($4))|0)==2;var $or_cond=($tobool5)&($cmp);if($or_cond){__label__=3;;}else{__label__=4;;}
66634 $if_then6$$if_else$5:do{if(__label__==3){var $5=$ph_out_addr;var $6=HEAP32[((__ZL12digit_lookup)>>2)];var $call=_strcpy($5,$6);;}
66635 else if(__label__==4){var $7=HEAP32[((__ZL12digit_lookup)>>2)];var $arrayidx7=(($7)&4294967295);var $8=HEAP8[($arrayidx7)];var $conv=(tempInt=(($8)),(tempInt>=128?tempInt-256:tempInt));var $cmp8=((($conv))|0)==0;if($cmp8){__label__=5;;}else{__label__=23;;}
66636 $if_then9$$if_end72$8:do{if(__label__==5){var $9=$control_addr;var $and10=($9)&8;var $tobool11=((($and10))|0)!=0;if($tobool11){__label__=6;;}else{__label__=7;;}
66637 if(__label__==6){var $arraydecay=(($string)&4294967295);var $10=$value_addr;var $call13=_sprintf($arraydecay,((__str23320)&4294967295),allocate([$10,0,0,0],["i32",0,0,0],ALLOC_STACK));var $11=$tr_addr;var $arraydecay14=(($string)&4294967295);var $arraydecay15=(($ph_digits)&4294967295);var $call16=__Z6LookupP10TranslatorPKcPc($11,$arraydecay14,$arraydecay15);$found=$call16;__lastLabel__=6;;}
66638 else if(__label__==7){var $12=$control_addr;var $and18=($12)&1;var $tobool19=((($and18))|0)!=0;if($tobool19){__label__=8;;}else{__label__=14;;}
66639 if(__label__==8){var $arraydecay21=(($ph_ordinal)&4294967295);var $call22=_strcpy($arraydecay21,((__ZL11ph_ordinal2)&4294967295));var $13=$control_addr;var $and23=($13)&4;var $tobool24=((($and23))|0)!=0;if($tobool24){__label__=9;;}else{__label__=10;;}
66640 if(__label__==9){var $arraydecay26=(($string)&4294967295);var $14=$value_addr;var $15=$ord_type;var $call27=_sprintf($arraydecay26,((__str24321)&4294967295),allocate([$14,0,0,0,$15,0,0,0],["i32",0,0,0,"i32",0,0,0],ALLOC_STACK));var $16=$tr_addr;var $arraydecay28=(($string)&4294967295);var $arraydecay29=(($ph_digits)&4294967295);var $call30=__Z6LookupP10TranslatorPKcPc($16,$arraydecay28,$arraydecay29);$found=$call30;__lastLabel__=9;;}
66641 else if(__label__==10){var $_pr=$found;__lastLabel__=10;;}
66642 var $17=__lastLabel__==10?$_pr:($call30);var $cmp32=((($17))|0)==0;if($cmp32){__label__=12;;}else{__label__=13;;}
66643 if(__label__==12){var $arraydecay34=(($string)&4294967295);var $18=$value_addr;var $19=$ord_type;var $call35=_sprintf($arraydecay34,((__str25322)&4294967295),allocate([$18,0,0,0,$19,0,0,0],["i32",0,0,0,"i32",0,0,0],ALLOC_STACK));var $20=$tr_addr;var $arraydecay36=(($string)&4294967295);var $arraydecay37=(($ph_digits)&4294967295);var $call38=__Z6LookupP10TranslatorPKcPc($20,$arraydecay36,$arraydecay37);$found=$call38;;}
66644 var $21=$found;$found_ordinal=$21;__lastLabel__=13;;}
66645 else if(__label__==14){var $_pr1=$found;__lastLabel__=14;;}}
66646 var $22=__lastLabel__==14?$_pr1:(__lastLabel__==13?$21:($call16));var $cmp42=((($22))|0)==0;if(!($cmp42)){__label__=23;break $if_then9$$if_end72$8;}
66647 var $23=$control_addr;var $and44=($23)&2;var $tobool45=((($and44))|0)!=0;if($tobool45){__label__=17;;}else{__label__=19;;}
66648 if(__label__==17){var $24=HEAP32[((__ZL14number_control)>>2)];var $and47=($24)&1;var $tobool48=((($and47))|0)!=0;if($tobool48){__label__=18;;}else{__label__=20;;}
66649 if(__label__==18){var $arraydecay50=(($string)&4294967295);var $25=$value_addr;var $call51=_sprintf($arraydecay50,((__str26323)&4294967295),allocate([$25,0,0,0],["i32",0,0,0],ALLOC_STACK));var $26=$tr_addr;var $arraydecay52=(($string)&4294967295);var $arraydecay53=(($ph_digits)&4294967295);var $call54=__Z6LookupP10TranslatorPKcPc($26,$arraydecay52,$arraydecay53);$found=$call54;__lastLabel__=18;;}
66650 else if(__label__==20){var $_pr2=$found;__lastLabel__=20;;}}
66651 else if(__label__==19){var $arraydecay57=(($string)&4294967295);var $27=$value_addr;var $call58=_sprintf($arraydecay57,((__str27324)&4294967295),allocate([$27,0,0,0],["i32",0,0,0],ALLOC_STACK));var $28=$tr_addr;var $arraydecay59=(($string)&4294967295);var $arraydecay60=(($ph_digits)&4294967295);var $call61=__Z6LookupP10TranslatorPKcPc($28,$arraydecay59,$arraydecay60);$found=$call61;__lastLabel__=19;;}
66652 var $29=__lastLabel__==20?$_pr2:(__lastLabel__==18?$call54:($call61));var $tobool63=((($29))|0)!=0;if($tobool63){__label__=23;break $if_then9$$if_end72$8;}
66653 var $arraydecay65=(($string)&4294967295);var $30=$value_addr;var $call66=_sprintf($arraydecay65,((__str28325)&4294967295),allocate([$30,0,0,0],["i32",0,0,0],ALLOC_STACK));var $31=$tr_addr;var $arraydecay67=(($string)&4294967295);var $arraydecay68=(($ph_digits)&4294967295);var $call69=__Z6LookupP10TranslatorPKcPc($31,$arraydecay67,$arraydecay68);$found=$call69;;}}while(0);var $32=$control_addr;var $and73=($32)&16;var $tobool74=((($and73))|0)!=0;if($tobool74){__label__=24;;}else{__label__=26;;}
66654 $land_lhs_true75$$if_else80$34:do{if(__label__==24){var $33=$value_addr;var $cmp76=((($33))|0)<10;if(!($cmp76)){__label__=26;break $land_lhs_true75$$if_else80$34;}
66655 var $34=$tr_addr;var $arraydecay78=(($ph_tens)&4294967295);var $call79=__Z6LookupP10TranslatorPKcPc($34,((__str16313)&4294967295),$arraydecay78);__label__=61;break $land_lhs_true75$$if_else80$34;}}while(0);$if_end221$$if_else80$37:do{if(__label__==26){var $35=$found;var $tobool81=((($35))|0)!=0;if($tobool81){__label__=27;;}else{__label__=28;;}
66656 if(__label__==27){var $arrayidx83=(($ph_tens)&4294967295);HEAP8[($arrayidx83)]=0;;}
66657 else if(__label__==28){var $36=$control_addr;var $and85=($36)&1;var $tobool86=((($and85))|0)!=0;if($tobool86){__label__=29;;}else{__label__=36;;}
66658 $land_lhs_true87$$if_end114$42:do{if(__label__==29){var $37=$units;var $cmp88=((($37))|0)==0;if($cmp88){__label__=32;;}else{__label__=30;;}
66659 $if_then95$$lor_lhs_false$44:do{if(__label__==30){var $38=$tr_addr;var $langopts=(($38)&4294967295);var $numbers=(($langopts+184)&4294967295);var $39=HEAP32[(($numbers)>>2)];var $and89=($39)&16;var $tobool90=((($and89))|0)!=0;if($tobool90){__label__=32;break $if_then95$$lor_lhs_false$44;}
66660 var $40=$tr_addr;var $langopts92=(($40)&4294967295);var $numbers2=(($langopts92+188)&4294967295);var $41=HEAP32[(($numbers2)>>2)];var $and93=($41)&4096;var $tobool94=((($and93))|0)!=0;if(!($tobool94)){__label__=36;break $land_lhs_true87$$if_end114$42;}}}while(0);var $arraydecay96=(($string)&4294967295);var $42=$tens;var $43=$ord_type;var $call97=_sprintf($arraydecay96,((__str29326)&4294967295),allocate([$42,0,0,0,$43,0,0,0],["i32",0,0,0,"i32",0,0,0],ALLOC_STACK));var $44=$tr_addr;var $arraydecay98=(($string)&4294967295);var $arraydecay99=(($ph_tens)&4294967295);var $call100=__Z6LookupP10TranslatorPKcPc($44,$arraydecay98,$arraydecay99);var $cmp101=((($call100))|0)!=0;if(!($cmp101)){__label__=36;break $land_lhs_true87$$if_end114$42;}
66661 $found_ordinal=1;var $45=$units;var $cmp103=((($45))|0)!=0;if(!($cmp103)){__label__=38;break $land_lhs_true87$$if_end114$42;}
66662 var $46=$tr_addr;var $langopts105=(($46)&4294967295);var $numbers2106=(($langopts105+188)&4294967295);var $47=HEAP32[(($numbers2106)>>2)];var $and107=($47)&4096;var $tobool108=((($and107))|0)!=0;if(!($tobool108)){__label__=36;break $land_lhs_true87$$if_end114$42;}
66663 var $arraydecay110=(($ph_tens)&4294967295);var $call111=_strcat($arraydecay110,((__ZL11ph_ordinal2)&4294967295));__label__=36;break $land_lhs_true87$$if_end114$42;}}while(0);$if_end114$$if_end122$51:do{if(__label__==36){var $_pr3=$found_ordinal;var $cmp115=((($_pr3))|0)==0;if(!($cmp115)){__label__=38;break $if_end114$$if_end122$51;}
66664 var $arraydecay117=(($string)&4294967295);var $48=$tens;var $call118=_sprintf($arraydecay117,((__str30327)&4294967295),allocate([$48,0,0,0],["i32",0,0,0],ALLOC_STACK));var $49=$tr_addr;var $arraydecay119=(($string)&4294967295);var $arraydecay120=(($ph_tens)&4294967295);var $call121=__Z6LookupP10TranslatorPKcPc($49,$arraydecay119,$arraydecay120);;}}while(0);var $arrayidx123=(($ph_tens)&4294967295);var $50=HEAP8[($arrayidx123)];var $conv124=(tempInt=(($50)),(tempInt>=128?tempInt-256:tempInt));var $cmp125=((($conv124))|0)==0;if($cmp125){__label__=39;;}else{__label__=41;;}
66665 $land_lhs_true126$$if_end139$55:do{if(__label__==39){var $51=$tr_addr;var $langopts127=(($51)&4294967295);var $numbers128=(($langopts127+184)&4294967295);var $52=HEAP32[(($numbers128)>>2)];var $and129=($52)&1048576;var $tobool130=((($and129))|0)!=0;if(!($tobool130)){__label__=41;break $land_lhs_true126$$if_end139$55;}
66666 var $53=$value_addr;var $rem132=((($53))|0)%20;$units=$rem132;var $arraydecay133=(($string)&4294967295);var $54=$tens;var $and134=($54)&254;var $call135=_sprintf($arraydecay133,((__str30327)&4294967295),allocate([$and134,0,0,0],["i32",0,0,0],ALLOC_STACK));var $55=$tr_addr;var $arraydecay136=(($string)&4294967295);var $arraydecay137=(($ph_tens)&4294967295);var $call138=__Z6LookupP10TranslatorPKcPc($55,$arraydecay136,$arraydecay137);;}}while(0);var $arrayidx140=(($ph_digits)&4294967295);HEAP8[($arrayidx140)]=0;var $56=$units;var $cmp141=((($56))|0)>0;if(!($cmp141)){__label__=61;break $if_end221$$if_else80$37;}
66667 $found=0;var $57=$control_addr;var $and143=($57)&2;var $tobool144=((($and143))|0)!=0;if($tobool144){__label__=43;;}else{__label__=45;;}
66668 $land_lhs_true145$$if_else153$60:do{if(__label__==43){var $58=HEAP32[((__ZL12digit_lookup)>>2)];var $arrayidx146=(($58)&4294967295);var $59=HEAP8[($arrayidx146)];var $conv147=(tempInt=(($59)),(tempInt>=128?tempInt-256:tempInt));var $cmp148=((($conv147))|0)!=0;if(!($cmp148)){__label__=45;break $land_lhs_true145$$if_else153$60;}
66669 var $arraydecay150=(($ph_digits)&4294967295);var $60=HEAP32[((__ZL12digit_lookup)>>2)];var $call151=_strcpy($arraydecay150,$60);$found_ordinal=1;var $arrayidx152=(($ph_ordinal)&4294967295);HEAP8[($arrayidx152)]=0;__label__=61;break $if_end221$$if_else80$37;}}while(0);var $61=$control_addr;var $and154=($61)&8;var $tobool155=((($and154))|0)!=0;if($tobool155){__label__=46;;}else{__label__=47;;}
66670 if(__label__==46){var $arraydecay157=(($string)&4294967295);var $62=$units;var $call158=_sprintf($arraydecay157,((__str23320)&4294967295),allocate([$62,0,0,0],["i32",0,0,0],ALLOC_STACK));var $63=$tr_addr;var $arraydecay159=(($string)&4294967295);var $arraydecay160=(($ph_digits)&4294967295);var $call161=__Z6LookupP10TranslatorPKcPc($63,$arraydecay159,$arraydecay160);$found=$call161;;}
66671 var $64=$control_addr;var $and163=($64)&1;var $tobool164=((($and163))|0)!=0;if($tobool164){__label__=48;;}else{__label__=51;;}
66672 $land_lhs_true165$$if_end179$67:do{if(__label__==48){var $65=$tr_addr;var $langopts166=(($65)&4294967295);var $numbers167=(($langopts166+184)&4294967295);var $66=HEAP32[(($numbers167)>>2)];var $and168=($66)&16;var $cmp169=((($and168))|0)==0;if(!($cmp169)){__label__=51;break $land_lhs_true165$$if_end179$67;}
66673 var $arraydecay171=(($string)&4294967295);var $67=$units;var $68=$ord_type;var $call172=_sprintf($arraydecay171,((__str25322)&4294967295),allocate([$67,0,0,0,$68,0,0,0],["i32",0,0,0,"i32",0,0,0],ALLOC_STACK));var $69=$tr_addr;var $arraydecay173=(($string)&4294967295);var $arraydecay174=(($ph_digits)&4294967295);var $call175=__Z6LookupP10TranslatorPKcPc($69,$arraydecay173,$arraydecay174);$found=$call175;var $cmp176=((($call175))|0)!=0;if(!($cmp176)){__label__=52;break $land_lhs_true165$$if_end179$67;}
66674 $found_ordinal=1;__label__=51;break $land_lhs_true165$$if_end179$67;}}while(0);if(__label__==51){var $_pr5=$found;var $cmp180=((($_pr5))|0)==0;if(!($cmp180)){__label__=61;break $if_end221$$if_else80$37;}}
66675 var $70=HEAP32[((__ZL14number_control)>>2)];var $and182=($70)&1;var $tobool183=((($and182))|0)!=0;if($tobool183){__label__=53;;}else{__label__=55;;}
66676 $land_lhs_true184$$if_else193$74:do{if(__label__==53){var $71=$control_addr;var $and185=($71)&2;var $tobool186=((($and185))|0)!=0;if(!($tobool186)){__label__=55;break $land_lhs_true184$$if_else193$74;}
66677 var $arraydecay188=(($string)&4294967295);var $72=$units;var $call189=_sprintf($arraydecay188,((__str26323)&4294967295),allocate([$72,0,0,0],["i32",0,0,0],ALLOC_STACK));var $73=$tr_addr;var $arraydecay190=(($string)&4294967295);var $arraydecay191=(($ph_digits)&4294967295);var $call192=__Z6LookupP10TranslatorPKcPc($73,$arraydecay190,$arraydecay191);$found=$call192;__lastLabel__=54;__label__=59;break $land_lhs_true184$$if_else193$74;}}while(0);$if_end209$$if_else193$77:do{if(__label__==55){var $74=$control_addr;var $and194=($74)&2;var $cmp195=((($and194))|0)==0;if($cmp195){__label__=57;;}else{__label__=56;;}
66678 $if_then201$$lor_lhs_false196$79:do{if(__label__==56){var $75=$tr_addr;var $langopts197=(($75)&4294967295);var $numbers198=(($langopts197+184)&4294967295);var $76=HEAP32[(($numbers198)>>2)];var $and199=($76)&16;var $cmp200=((($and199))|0)!=0;if($cmp200){__label__=57;break $if_then201$$lor_lhs_false196$79;}
66679 var $_pr7=$found;__lastLabel__=58;__label__=59;break $if_end209$$if_else193$77;}}while(0);var $arraydecay202=(($string)&4294967295);var $77=$units;var $call203=_sprintf($arraydecay202,((__str27324)&4294967295),allocate([$77,0,0,0],["i32",0,0,0],ALLOC_STACK));var $78=$tr_addr;var $arraydecay204=(($string)&4294967295);var $arraydecay205=(($ph_digits)&4294967295);var $call206=__Z6LookupP10TranslatorPKcPc($78,$arraydecay204,$arraydecay205);$found=$call206;__lastLabel__=57;;}}while(0);var $79=__lastLabel__==58?$_pr7:(__lastLabel__==54?$call192:($call206));var $cmp210=((($79))|0)==0;if(!($cmp210)){__label__=61;break $if_end221$$if_else80$37;}
66680 var $arraydecay212=(($string)&4294967295);var $80=$units;var $call213=_sprintf($arraydecay212,((__str28325)&4294967295),allocate([$80,0,0,0],["i32",0,0,0],ALLOC_STACK));var $81=$tr_addr;var $arraydecay214=(($string)&4294967295);var $arraydecay215=(($ph_digits)&4294967295);var $call216=__Z6LookupP10TranslatorPKcPc($81,$arraydecay214,$arraydecay215);;}}}while(0);var $82=$control_addr;var $and222=($82)&1;var $tobool223=((($and222))|0)!=0;if($tobool223){__label__=62;;}else{__label__=70;;}
66681 $land_lhs_true224$$if_end251$86:do{if(__label__==62){var $83=$found_ordinal;var $cmp225=((($83))|0)==0;if(!($cmp225)){__label__=70;break $land_lhs_true224$$if_end251$86;}
66682 var $arrayidx227=(($ph_ordinal)&4294967295);var $84=HEAP8[($arrayidx227)];var $conv228=(tempInt=(($84)),(tempInt>=128?tempInt-256:tempInt));var $cmp229=((($conv228))|0)==0;if(!($cmp229)){__label__=70;break $land_lhs_true224$$if_end251$86;}
66683 var $85=$value_addr;var $cmp231=((($85))|0)>=20;if($cmp231){__label__=65;;}else{__label__=68;;}
66684 $land_lhs_true232$$if_end243$90:do{if(__label__==65){var $86=$value_addr;var $rem233=((($86))|0)%10;var $cmp234=((($rem233))|0)==0;if($cmp234){__label__=67;;}else{__label__=66;;}
66685 if(__label__==66){var $87=$tr_addr;var $langopts236=(($87)&4294967295);var $numbers237=(($langopts236+184)&4294967295);var $88=HEAP32[(($numbers237)>>2)];var $and238=($88)&16;var $tobool239=((($and238))|0)!=0;if(!($tobool239)){__label__=68;break $land_lhs_true232$$if_end243$90;}}
66686 var $89=$tr_addr;var $arraydecay241=(($ph_ordinal)&4294967295);var $call242=__Z6LookupP10TranslatorPKcPc($89,((__str31328)&4294967295),$arraydecay241);;}}while(0);var $arrayidx244=(($ph_ordinal)&4294967295);var $90=HEAP8[($arrayidx244)];var $conv245=(tempInt=(($90)),(tempInt>=128?tempInt-256:tempInt));var $cmp246=((($conv245))|0)==0;if(!($cmp246)){__label__=70;break $land_lhs_true224$$if_end251$86;}
66687 var $91=$tr_addr;var $arraydecay248=(($ph_ordinal)&4294967295);var $call249=__Z6LookupP10TranslatorPKcPc($91,((__str32329)&4294967295),$arraydecay248);;}}while(0);var $92=$tr_addr;var $langopts252=(($92)&4294967295);var $numbers253=(($langopts252+184)&4294967295);var $93=HEAP32[(($numbers253)>>2)];var $and254=($93)&48;var $tobool255=((($and254))|0)!=0;if($tobool255){__label__=71;;}else{__label__=79;;}
66688 $land_lhs_true256$$if_else291$98:do{if(__label__==71){var $arrayidx257=(($ph_tens)&4294967295);var $94=HEAP8[($arrayidx257)];var $conv258=(tempInt=(($94)),(tempInt>=128?tempInt-256:tempInt));var $cmp259=((($conv258))|0)!=0;if(!($cmp259)){__label__=79;break $land_lhs_true256$$if_else291$98;}
66689 var $arrayidx261=(($ph_digits)&4294967295);var $95=HEAP8[($arrayidx261)];var $conv262=(tempInt=(($95)),(tempInt>=128?tempInt-256:tempInt));var $cmp263=((($conv262))|0)!=0;if(!($cmp263)){__label__=79;break $land_lhs_true256$$if_else291$98;}
66690 var $96=$tr_addr;var $arraydecay265=(($ph_and)&4294967295);var $call266=__Z6LookupP10TranslatorPKcPc($96,((__str33330)&4294967295),$arraydecay265);var $97=$tr_addr;var $langopts267=(($97)&4294967295);var $numbers2268=(($langopts267+188)&4294967295);var $98=HEAP32[(($numbers2268)>>2)];var $and269=($98)&4096;var $tobool270=((($and269))|0)!=0;if($tobool270){__label__=74;;}else{__label__=75;;}
66691 if(__label__==74){var $arrayidx272=(($ph_and)&4294967295);HEAP8[($arrayidx272)]=0;;}
66692 var $99=$tr_addr;var $langopts274=(($99)&4294967295);var $numbers275=(($langopts274+184)&4294967295);var $100=HEAP32[(($numbers275)>>2)];var $and276=($100)&16;var $tobool277=((($and276))|0)!=0;var $101=$ph_out_addr;if($tobool277){__label__=76;;}else{__label__=77;;}
66693 if(__label__==76){var $arraydecay279=(($ph_digits)&4294967295);var $arraydecay280=(($ph_and)&4294967295);var $arraydecay281=(($ph_tens)&4294967295);var $arraydecay282=(($ph_ordinal)&4294967295);var $call283=_sprintf($101,((__str20317)&4294967295),allocate([$arraydecay279,0,0,0,$arraydecay280,0,0,0,$arraydecay281,0,0,0,$arraydecay282,0,0,0],["i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));;}
66694 else if(__label__==77){var $arraydecay285=(($ph_tens)&4294967295);var $arraydecay286=(($ph_and)&4294967295);var $arraydecay287=(($ph_digits)&4294967295);var $arraydecay288=(($ph_ordinal)&4294967295);var $call289=_sprintf($101,((__str20317)&4294967295),allocate([$arraydecay285,0,0,0,$arraydecay286,0,0,0,$arraydecay287,0,0,0,$arraydecay288,0,0,0],["i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));;}
66695 $used_and=1;__label__=88;break $if_then6$$if_else$5;}}while(0);var $102=$tr_addr;var $langopts292=(($102)&4294967295);var $numbers293=(($langopts292+184)&4294967295);var $103=HEAP32[(($numbers293)>>2)];var $and294=($103)&512;var $tobool295=((($and294))|0)!=0;if($tobool295){__label__=80;;}else{__label__=87;;}
66696 $if_then296$$if_end329$110:do{if(__label__==80){var $arraydecay297=(($ph_tens)&4294967295);var $call298=_strlen($arraydecay297);var $sub=((($call298)-1)&4294967295);$ix=$sub;var $cmp299=((($sub))|0)>=0;if(!($cmp299)){__label__=87;break $if_then296$$if_end329$110;}
66697 var $arrayidx301=(($ph_digits)&4294967295);var $104=HEAP8[($arrayidx301)];var $conv302=(tempInt=(($104)),(tempInt>=128?tempInt-256:tempInt));var $cmp303=((($conv302))|0)!=0;if(!($cmp303)){__label__=87;break $if_then296$$if_end329$110;}
66698 var $arrayidx305=(($ph_digits)&4294967295);var $105=HEAP8[($arrayidx305)];var $conv306=(tempInt=(($105)),(tempInt>=128?tempInt-256:tempInt));var $arrayidx307=((_phoneme_tab+$conv306*4)&4294967295);var $106=HEAP32[(($arrayidx307)>>2)];var $type=(($106+11)&4294967295);var $107=HEAPU8[($type)];var $conv308=((($107))&255);$next_phtype=$conv308;var $cmp309=((($conv308))|0)==1;if($cmp309){__label__=83;;}else{__label__=84;;}
66699 if(__label__==83){var $arrayidx311=(($ph_digits+1)&4294967295);var $108=HEAP8[($arrayidx311)];var $conv312=(tempInt=(($108)),(tempInt>=128?tempInt-256:tempInt));var $arrayidx313=((_phoneme_tab+$conv312*4)&4294967295);var $109=HEAP32[(($arrayidx313)>>2)];var $type314=(($109+11)&4294967295);var $110=HEAPU8[($type314)];var $conv315=((($110))&255);$next_phtype=$conv315;;}
66700 var $111=$ix;var $arrayidx317=(($ph_tens+$111)&4294967295);var $112=HEAP8[($arrayidx317)];var $conv318=(tempInt=(($112)),(tempInt>=128?tempInt-256:tempInt));var $arrayidx319=((_phoneme_tab+$conv318*4)&4294967295);var $113=HEAP32[(($arrayidx319)>>2)];var $type320=(($113+11)&4294967295);var $114=HEAPU8[($type320)];var $conv321=((($114))&255);var $cmp322=((($conv321))|0)==2;if(!($cmp322)){__label__=87;break $if_then296$$if_end329$110;}
66701 var $115=$next_phtype;var $cmp324=((($115))|0)==2;if(!($cmp324)){__label__=87;break $if_then296$$if_end329$110;}
66702 var $116=$ix;var $arrayidx326=(($ph_tens+$116)&4294967295);HEAP8[($arrayidx326)]=0;;}}while(0);var $117=$ph_out_addr;var $arraydecay330=(($ph_tens)&4294967295);var $arraydecay331=(($ph_digits)&4294967295);var $arraydecay332=(($ph_ordinal)&4294967295);var $call333=_sprintf($117,((__str6549)&4294967295),allocate([$arraydecay330,0,0,0,$arraydecay331,0,0,0,$arraydecay332,0,0,0],["i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));;}}while(0);var $118=$tr_addr;var $langopts336=(($118)&4294967295);var $numbers337=(($langopts336+184)&4294967295);var $119=HEAP32[(($numbers337)>>2)];var $and338=($119)&256;var $tobool339=((($and338))|0)!=0;if($tobool339){__label__=89;;}else{__label__=95;;}
66703 $if_then340$$if_end354$121:do{if(__label__==89){$found=0;var $120=$ph_out_addr;var $call341=_strlen($120);var $sub342=((($call341)-1)&4294967295);$ix=$sub342;var $cmp3439=((($sub342))|0)>=0;if(!($cmp3439)){__label__=95;break $if_then340$$if_end354$121;}
66704 while(1){var $121=$ix;var $122=$ph_out_addr;var $arrayidx344=(($122+$121)&4294967295);var $123=HEAP8[($arrayidx344)];var $conv345=(tempInt=(($123)),(tempInt>=128?tempInt-256:tempInt));var $cmp346=((($conv345))|0)==6;if($cmp346){__label__=91;;}else{__label__=94;;}
66705 if(__label__==91){var $124=$found;var $tobool348=((($124))|0)!=0;if($tobool348){__label__=92;;}else{__label__=93;;}
66706 if(__label__==92){var $125=$ix;var $126=$ph_out_addr;var $arrayidx350=(($126+$125)&4294967295);HEAP8[($arrayidx350)]=5;;}
66707 else if(__label__==93){$found=1;;}}
66708 var $127=$ix;var $dec=((($127)-1)&4294967295);$ix=$dec;var $cmp343=((($dec))|0)>=0;if($cmp343){__label__=90;continue;}else{__label__=95;break $if_then340$$if_end354$121;}}}}while(0);var $128=$used_and;STACKTOP=__stackBase__;return $128;return null;}
66709 function __ZL9M_Varianti($value){;var __label__;var $retval;var $value_addr;$value_addr=$value;var $0=HEAP32[((_translator)>>2)];var $langopts=(($0)&4294967295);var $numbers2=(($langopts+188)&4294967295);var $1=HEAP32[(($numbers2)>>2)];var $and=($1)&256;var $tobool=((($and))|0)!=0;if($tobool){__label__=1;;}else{__label__=3;;}
66710 $land_lhs_true$$if_else$2:do{if(__label__==1){var $2=$value_addr;var $cmp=((($2))|0)>=2;var $3=$value_addr;var $cmp2=((($3))|0)<=4;var $or_cond=($cmp)&($cmp2);if(!($or_cond)){__label__=3;break $land_lhs_true$$if_else$2;}
66711 $retval=((__str54351)&4294967295);__label__=13;break $land_lhs_true$$if_else$2;}}while(0);$return$$if_else$5:do{if(__label__==3){var $4=$value_addr;var $rem=((($4))|0)%100;var $cmp3=((($rem))|0)<10;if($cmp3){__label__=5;;}else{__label__=4;;}
66712 $if_then6$$lor_lhs_false$7:do{if(__label__==4){var $5=$value_addr;var $rem4=((($5))|0)%100;var $cmp5=((($rem4))|0)>20;if($cmp5){__label__=5;break $if_then6$$lor_lhs_false$7;}else{__label__=12;break $if_then6$$lor_lhs_false$7;}}}while(0);$if_then6$$if_end28$9:do{if(__label__==5){var $6=HEAP32[((_translator)>>2)];var $langopts7=(($6)&4294967295);var $numbers28=(($langopts7+188)&4294967295);var $7=HEAP32[(($numbers28)>>2)];var $and9=($7)&64;var $tobool10=((($and9))|0)!=0;if($tobool10){__label__=6;;}else{__label__=9;;}
66713 $land_lhs_true11$$if_end$11:do{if(__label__==6){var $8=$value_addr;var $rem12=((($8))|0)%10;var $cmp13=((($rem12))|0)>=2;if(!($cmp13)){__label__=9;break $land_lhs_true11$$if_end$11;}
66714 var $9=$value_addr;var $rem15=((($9))|0)%10;var $cmp16=((($rem15))|0)<=4;if(!($cmp16)){__label__=9;break $land_lhs_true11$$if_end$11;}
66715 $retval=((__str54351)&4294967295);__label__=13;break $return$$if_else$5;}}while(0);var $10=HEAP32[((_translator)>>2)];var $langopts18=(($10)&4294967295);var $numbers219=(($langopts18+188)&4294967295);var $11=HEAP32[(($numbers219)>>2)];var $and20=($11)&128;var $tobool21=((($and20))|0)!=0;if(!($tobool21)){__label__=12;break $if_then6$$if_end28$9;}
66716 var $12=$value_addr;var $rem23=((($12))|0)%10;var $cmp24=((($rem23))|0)==1;if(!($cmp24)){__label__=12;break $if_then6$$if_end28$9;}
66717 $retval=((__str55352)&4294967295);__label__=13;break $return$$if_else$5;}}while(0);$retval=((__str56353)&4294967295);;}}while(0);var $13=$retval;;return $13;return null;}
66718 function __Z15LoadMbrolaTablePKcS0_i($mbrola_voice,$phtrans,$srate){var __stackBase__=STACKTOP;STACKTOP+=168;_memset(__stackBase__,0,168);var __label__;var $retval;var $mbrola_voice_addr;var $phtrans_addr;var $srate_addr;var $size;var $ix;var $pw;var $f_in;var $path=__stackBase__;$mbrola_voice_addr=$mbrola_voice;$phtrans_addr=$phtrans;$srate_addr=$srate;HEAP8[(((_mbrola_name)&4294967295))]=0;HEAP32[((_mbrola_delay)>>2)]=0;HEAP32[((__ZL15mbr_name_prefix)>>2)]=0;var $0=$mbrola_voice_addr;var $cmp=((($0))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
66719 if(__label__==1){var $1=HEAP32[((_samplerate_native)>>2)];HEAP32[((_samplerate)>>2)]=$1;__Z12SetParameteriii(14,0,0);$retval=0;;}
66720 else if(__label__==2){var $arraydecay=(($path)&4294967295);var $2=$mbrola_voice_addr;var $call=_sprintf($arraydecay,((__str382)&4294967295),allocate([((_path_home)&4294967295),0,0,0,$2,0,0,0],["i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));var $arraydecay1=(($path)&4294967295);var $call2=__Z13GetFileLengthPKc($arraydecay1);var $cmp3=((($call2))|0)<=0;if($cmp3){__label__=3;;}else{__label__=4;;}
66721 if(__label__==3){var $arraydecay5=(($path)&4294967295);var $3=$mbrola_voice_addr;var $call6=_sprintf($arraydecay5,((__str1383)&4294967295),allocate([$3,0,0,0],["i8*",0,0,0],ALLOC_STACK));;}
66722 var $arraydecay8=(($path)&4294967295);var $call9=__Z13GetFileLengthPKc($arraydecay8);var $cmp10=((($call9))|0)<=0;if($cmp10){__label__=5;;}else{__label__=6;;}
66723 if(__label__==5){var $arraydecay12=(($path)&4294967295);var $4=$mbrola_voice_addr;var $5=$mbrola_voice_addr;var $call13=_sprintf($arraydecay12,((__str2384)&4294967295),allocate([$4,0,0,0,$5,0,0,0],["i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));;}
66724 var $arraydecay15=(($path)&4294967295);var $call16=__Z13GetFileLengthPKc($arraydecay15);var $cmp17=((($call16))|0)<=0;if($cmp17){__label__=7;;}else{__label__=8;;}
66725 if(__label__==7){var $arraydecay19=(($path)&4294967295);var $6=$mbrola_voice_addr;var $call20=_sprintf($arraydecay19,((__str3385)&4294967295),allocate([$6,0,0,0],["i8*",0,0,0],ALLOC_STACK));;}
66726 var $arraydecay22=(($path)&4294967295);var $call23=_init_MBR($arraydecay22);var $cmp24=((($call23))|0)!=0;if($cmp24){__label__=9;;}else{__label__=10;;}
66727 if(__label__==9){$retval=2;;}
66728 else if(__label__==10){_setNoError_MBR();var $arraydecay27=(($path)&4294967295);var $7=$phtrans_addr;var $call28=_sprintf($arraydecay27,((__str4386)&4294967295),allocate([((_path_home)&4294967295),0,0,0,$7,0,0,0],["i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));var $arraydecay29=(($path)&4294967295);var $call30=__Z13GetFileLengthPKc($arraydecay29);$size=$call30;var $arraydecay31=(($path)&4294967295);var $call32=_fopen($arraydecay31,((__str18429)&4294967295));$f_in=$call32;var $cmp33=((($call32))|0)==0;if($cmp33){__label__=11;;}else{__label__=12;;}
66729 if(__label__==11){_close_MBR();$retval=2;;}
66730 else if(__label__==12){var $8=HEAP32[((__ZL10mbrola_tab)>>2)];var $9=$8;var $10=$size;var $call36=_realloc($9,$10);var $11=$call36;HEAP32[((__ZL10mbrola_tab)>>2)]=$11;var $cmp37=((($11))|0)==0;var $12=$f_in;if($cmp37){__label__=13;;}else{__label__=14;;}
66731 if(__label__==13){var $call39=_fclose($12);_close_MBR();$retval=-1;;}
66732 else if(__label__==14){var $call41=__Z10Read4BytesP7__sFILE($12);HEAP32[((__ZL14mbrola_control)>>2)]=$call41;var $13=HEAP32[((__ZL10mbrola_tab)>>2)];var $14=$13;$pw=$14;$ix=4;var $15=$ix;var $16=$size;var $cmp421=((($15))|0)<((($16))|0);if($cmp421){__label__=15;;}else{__label__=16;;}
66733 $for_body$$for_end$23:do{if(__label__==15){while(1){var $17=$f_in;var $call43=__Z10Read4BytesP7__sFILE($17);var $18=$pw;var $incdec_ptr=(($18+4)&4294967295);$pw=$incdec_ptr;HEAP32[(($18)>>2)]=$call43;var $19=$ix;var $add=((($19)+4)&4294967295);$ix=$add;var $20=$ix;var $21=$size;var $cmp42=((($20))|0)<((($21))|0);if($cmp42){__label__=15;continue;}else{__label__=16;break $for_body$$for_end$23;}}}}while(0);var $22=HEAP32[((__ZL10mbrola_tab)>>2)];var $23=$22;var $24=$size;var $25=$f_in;var $call44=_fread($23,1,$24,$25);$size=$call44;var $26=$f_in;var $call45=_fclose($26);var $27=HEAP32[((__ZL14mbrola_control)>>2)];var $and=($27)&255;var $conv=((($and))|0);var $div=($conv)/16;_setVolumeRatio_MBR($div);var $28=$srate_addr;HEAP32[((_samplerate)>>2)]=$28;var $cmp46=((($28))|0)==22050;if($cmp46){__label__=17;;}else{__label__=18;;}
66734 if(__label__==17){__Z12SetParameteriii(14,0,0);;}
66735 else if(__label__==18){__Z12SetParameteriii(14,1,0);;}
66736 var $29=$mbrola_voice_addr;var $call49=_strcpy(((_mbrola_name)&4294967295),$29);HEAP32[((_mbrola_delay)>>2)]=1000;$retval=0;;}}}}
66737 var $30=$retval;STACKTOP=__stackBase__;return $30;return null;}
66738 function _setNoError_MBR(){;var __label__;;return;return;}
66739 function __Z15MbrolaTranslateP12PHONEME_LISTiiP7__sFILE($plist,$n_phonemes,$resume,$f_mbrola){var __stackBase__=STACKTOP;STACKTOP+=332;_memset(__stackBase__,0,332);var __label__;var __lastLabel__=null;var $retval;var $plist_addr;var $n_phonemes_addr;var $resume_addr;var $f_mbrola_addr;var $name;var $len;var $len1;var $ph;var $ph_next;var $ph_prev;var $p;var $next;var $prev;var $phdata=__stackBase__;var $fmtp=__stackBase__+152;var $pause;var $released;var $name2=__stackBase__+200;var $control=__stackBase__+204;var $done;var $len_percent=__stackBase__+208;var $final_pitch;var $ptr;var $mbr_buf=__stackBase__+212;var $pitch;var $pitch101;var $res;$plist_addr=$plist;$n_phonemes_addr=$n_phonemes;$resume_addr=$resume;$f_mbrola_addr=$f_mbrola;$pause=0;var $0=$resume_addr;var $tobool=((($0))|0)!=0;if($tobool){__label__=2;;}else{__label__=1;;}
66740 if(__label__==1){HEAP32[((__ZZ15MbrolaTranslateP12PHONEME_LISTiiP7__sFILEE4phix)>>2)]=1;HEAP32[((__ZZ15MbrolaTranslateP12PHONEME_LISTiiP7__sFILEE11embedded_ix)>>2)]=0;HEAP32[((__ZZ15MbrolaTranslateP12PHONEME_LISTiiP7__sFILEE10word_count)>>2)]=0;;}
66741 var $arraydecay=(($mbr_buf)&4294967295);var $arraydecay233=(($mbr_buf)&4294967295);var $arraydecay234=(($mbr_buf)&4294967295);var $sub_ptr_rhs_cast=($arraydecay234);var $1=$fmtp;var $sound_addr=(($phdata+68)&4294967295);var $arrayidx176=(($sound_addr)&4294967295);var $fmt_addr=(($fmtp+8)&4294967295);;$while_cond$5:while(1){var $2=HEAP32[((__ZZ15MbrolaTranslateP12PHONEME_LISTiiP7__sFILEE4phix)>>2)];var $3=$n_phonemes_addr;var $cmp=((($2))|0)<((($3))|0);if(!($cmp)){__label__=64;break $while_cond$5;}
66742 var $call=__Z9WcmdqFreev();var $cmp1=((($call))|0)<22;if($cmp1){__label__=5;break $while_cond$5;}
66743 $ptr=$arraydecay;var $4=HEAP32[((__ZZ15MbrolaTranslateP12PHONEME_LISTiiP7__sFILEE4phix)>>2)];var $5=$plist_addr;var $arrayidx=(($5+24*$4)&4294967295);$p=$arrayidx;var $6=HEAP32[((__ZZ15MbrolaTranslateP12PHONEME_LISTiiP7__sFILEE4phix)>>2)];var $add=((($6)+1)&4294967295);var $7=$plist_addr;var $arrayidx4=(($7+24*$add)&4294967295);$next=$arrayidx4;var $8=HEAP32[((__ZZ15MbrolaTranslateP12PHONEME_LISTiiP7__sFILEE4phix)>>2)];var $sub=((($8)-1)&4294967295);var $9=$plist_addr;var $arrayidx5=(($9+24*$sub)&4294967295);$prev=$arrayidx5;var $10=$p;var $ph6=(($10+8)&4294967295);var $11=HEAP32[(($ph6)>>2)];$ph=$11;var $12=HEAP32[((__ZZ15MbrolaTranslateP12PHONEME_LISTiiP7__sFILEE4phix)>>2)];var $sub7=((($12)-1)&4294967295);var $13=$plist_addr;var $arrayidx8=(($13+24*$sub7)&4294967295);var $ph9=(($arrayidx8+8)&4294967295);var $14=HEAP32[(($ph9)>>2)];$ph_prev=$14;var $15=HEAP32[((__ZZ15MbrolaTranslateP12PHONEME_LISTiiP7__sFILEE4phix)>>2)];var $add10=((($15)+1)&4294967295);var $16=$plist_addr;var $arrayidx11=(($16+24*$add10)&4294967295);var $ph12=(($arrayidx11+8)&4294967295);var $17=HEAP32[(($ph12)>>2)];$ph_next=$17;var $18=$p;var $synthflags=(($18+4)&4294967295);var $19=HEAPU16[(($synthflags)>>1)];var $conv=((($19))&65535);var $and=($conv)&2;var $tobool13=((($and))|0)!=0;if($tobool13){__label__=7;;}else{__label__=8;;}
66744 if(__label__==7){var $20=$p;var $sourceix=(($20+6)&4294967295);var $21=HEAPU16[(($sourceix)>>1)];var $conv15=((($21))&65535);__Z10DoEmbeddedPii(__ZZ15MbrolaTranslateP12PHONEME_LISTiiP7__sFILEE11embedded_ix,$conv15);;}
66745 var $22=$p;var $newword=(($22+19)&4294967295);var $23=HEAPU8[($newword)];var $conv17=((($23))&255);var $and18=($conv17)&4;var $tobool19=((($and18))|0)!=0;if($tobool19){__label__=9;;}else{__label__=10;;}
66746 if(__label__==9){var $24=$p;var $sourceix21=(($24+6)&4294967295);var $25=HEAPU16[(($sourceix21)>>1)];var $conv22=((($25))&65535);var $and23=($conv22)&2047;var $26=HEAP32[((_clause_start_char)>>2)];var $add24=((($and23)+($26))&4294967295);var $27=HEAP32[((_count_sentences)>>2)];__Z8DoMarkeriiii(2,$add24,0,$27);;}
66747 var $28=$p;var $newword26=(($28+19)&4294967295);var $29=HEAPU8[($newword26)];var $conv27=((($29))&255);var $and28=($conv27)&1;var $tobool29=((($and28))|0)!=0;if($tobool29){__label__=11;;}else{__label__=12;;}
66748 if(__label__==11){var $30=$p;var $sourceix31=(($30+6)&4294967295);var $31=HEAPU16[(($sourceix31)>>1)];var $conv32=((($31))&65535);var $and33=($conv32)&2047;var $32=HEAP32[((_clause_start_char)>>2)];var $add34=((($and33)+($32))&4294967295);var $33=$p;var $sourceix35=(($33+6)&4294967295);var $34=HEAPU16[(($sourceix35)>>1)];var $conv36=((($34))&65535);var $shr=($conv36)>>11;var $35=HEAP32[((_clause_start_word)>>2)];var $36=HEAPU32[((__ZZ15MbrolaTranslateP12PHONEME_LISTiiP7__sFILEE10word_count)>>2)];var $inc=((($36)+1)&4294967295);HEAP32[((__ZZ15MbrolaTranslateP12PHONEME_LISTiiP7__sFILEE10word_count)>>2)]=$inc;var $add37=((($36)+($35))&4294967295);__Z8DoMarkeriiii(1,$add34,$shr,$add37);;}
66749 var $37=$p;var $38=$ph;var $39=$ph_prev;var $40=$ph_next;var $call39=__ZL10GetMbrNameP12PHONEME_LISTP11PHONEME_TABS2_S2_PiS3_S3_($37,$38,$39,$40,$name2,$len_percent,$control);$name=$call39;var $41=HEAP32[(($control)>>2)];var $and40=($41)&1;var $tobool41=((($and40))|0)!=0;if($tobool41){__lastLabel__=12;__label__=13;;}else{__lastLabel__=12;__label__=14;;}
66750 if(__label__==13){var $42=HEAP32[((__ZZ15MbrolaTranslateP12PHONEME_LISTiiP7__sFILEE4phix)>>2)];var $inc43=((($42)+1)&4294967295);HEAP32[((__ZZ15MbrolaTranslateP12PHONEME_LISTiiP7__sFILEE4phix)>>2)]=$inc43;var $_pr=$name;__lastLabel__=13;;}
66751 var $43=__lastLabel__==13?$_pr:($call39);var $cmp45=((($43))|0)==0;if($cmp45){__label__=15;;}else{__label__=16;;}
66752 if(__label__==15){var $44=HEAP32[((__ZZ15MbrolaTranslateP12PHONEME_LISTiiP7__sFILEE4phix)>>2)];var $inc47=((($44)+1)&4294967295);HEAP32[((__ZZ15MbrolaTranslateP12PHONEME_LISTiiP7__sFILEE4phix)>>2)]=$inc47;__label__=3;continue $while_cond$5;}
66753 else if(__label__==16){var $45=$ph;var $type=(($45+11)&4294967295);var $46=HEAPU8[($type)];var $conv49=((($46))&255);var $cmp50=((($conv49))|0)==0;if($cmp50){__label__=17;;}else{__label__=20;;}
66754 $land_lhs_true$$if_else$24:do{if(__label__==17){var $47=$name;var $48=$ph;var $mnemonic=(($48)&4294967295);var $49=HEAP32[(($mnemonic)>>2)];var $cmp51=((($47))|0)==((($49))|0);if(!($cmp51)){__label__=20;break $land_lhs_true$$if_else$24;}
66755 $name=95;var $50=$p;var $length=(($50+12)&4294967295);var $51=HEAP16[(($length)>>1)];var $conv53=(tempInt=(($51)),(tempInt>=32768?tempInt-65536:tempInt));var $52=HEAP32[((((_speed)&4294967295))>>2)];var $mul=((($conv53)*($52))&4294967295);var $div=((((($mul))|0)/256)|0);$len=$div;var $53=$len;var $cmp54=((($53))|0)==0;if(!($cmp54)){__label__=21;break $land_lhs_true$$if_else$24;}
66756 $len=1;__label__=21;break $land_lhs_true$$if_else$24;}}while(0);if(__label__==20){var $54=HEAP32[((((_speed+12)&4294967295))>>2)];var $mul57=((($54)*80)&4294967295);var $div58=((((($mul57))|0)/256)|0);$len=$div58;;}
66757 var $55=$p;var $sourceix60=(($55+6)&4294967295);var $56=HEAPU16[(($sourceix60)>>1)];var $conv61=((($56))&65535);var $and62=($conv61)&2047;var $57=HEAP32[((_clause_start_char)>>2)];var $add63=((($and62)+($57))&4294967295);var $58=$ph;var $mnemonic64=(($58)&4294967295);var $59=HEAP32[(($mnemonic64)>>2)];__Z8DoMarkeriiii(7,$add63,0,$59);var $60=$ptr;var $61=$name;var $call65=__Z12WordToStringj($61);var $call66=_sprintf($60,((__str6388)&4294967295),allocate([((__ZZ12WordToStringjE3buf)&4294967295),0,0,0],["i8*",0,0,0],ALLOC_STACK));var $62=$ptr;var $add_ptr=(($62+$call66)&4294967295);$ptr=$add_ptr;var $63=HEAP32[(($name2)>>2)];var $cmp67=((($63))|0)==95;if($cmp67){__label__=22;;}else{__label__=23;;}
66758 if(__label__==22){var $64=HEAP32[(($len_percent)>>2)];$pause=$64;HEAP32[(($name2)>>2)]=0;;}
66759 $done=0;$final_pitch=((__str13643)&4294967295);var $65=$ph;var $type70=(($65+11)&4294967295);var $66=HEAPU8[($type70)];var $conv71=((($66))&255);if($conv71==2){__label__=24;;}
66760 else if($conv71==4){__label__=32;;}
66761 else if($conv71==5){__label__=40;;}
66762 else if($conv71==6){__label__=41;;}
66763 else if($conv71==8){__label__=44;;}
66764 else if($conv71==3){__label__=48;;}
66765 else{__label__=50;;}
66766 $sw_epilog$$sw_bb$$sw_bb126$$sw_bb152$$sw_bb155$$sw_bb171$$sw_bb195$34:do{if(__label__==24){var $67=$ph;var $std_length=(($67+14)&4294967295);var $68=HEAPU8[($std_length)];var $conv72=((($68))&255);$len=$conv72;var $69=$p;var $synthflags73=(($69+4)&4294967295);var $70=HEAPU16[(($synthflags73)>>1)];var $conv74=((($70))&65535);var $and75=($conv74)&8;var $tobool76=((($and75))|0)!=0;if($tobool76){__label__=25;;}else{__label__=26;;}
66767 if(__label__==25){var $71=HEAP32[((((_phoneme_tab+48)&4294967295))>>2)];var $std_length78=(($71+14)&4294967295);var $72=HEAPU8[($std_length78)];var $conv79=((($72))&255);var $73=$len;var $add80=((($73)+($conv79))&4294967295);$len=$add80;;}
66768 var $74=$ph_next;var $type82=(($74+11)&4294967295);var $75=HEAPU8[($type82)];var $conv83=((($75))&255);var $cmp84=((($conv83))|0)==0;if($cmp84){__label__=27;;}else{__label__=28;;}
66769 if(__label__==27){var $76=$len;var $add86=((($76)+50)&4294967295);$len=$add86;;}
66770 var $77=$len;var $78=$p;var $length88=(($78+12)&4294967295);var $79=HEAP16[(($length88)>>1)];var $conv89=(tempInt=(($79)),(tempInt>=32768?tempInt-65536:tempInt));var $mul90=((($conv89)*($77))&4294967295);var $div91=((((($mul90))|0)/256)|0);$len=$div91;var $80=HEAP32[(($name2)>>2)];var $cmp92=((($80))|0)==0;var $81=$p;var $env=(($81+14)&4294967295);var $82=HEAPU8[($env)];var $conv94=((($82))&255);var $83=$p;var $pitch1=(($83+20)&4294967295);var $84=HEAPU8[($pitch1)];var $conv95=((($84))&255);var $85=$p;var $pitch2=(($85+21)&4294967295);var $86=HEAPU8[($pitch2)];var $conv96=((($86))&255);if($cmp92){__label__=29;;}else{__label__=30;;}
66771 if(__label__==29){__ZL10WritePitchiiiii($conv94,$conv95,$conv96,0,0);$pitch=((__ZZL10WritePitchiiiiiE6output)&4294967295);var $87=$ptr;var $88=$len;var $89=$pitch;var $call98=_sprintf($87,((__str8390)&4294967295),allocate([$88,0,0,0,$89,0,0,0],["i32",0,0,0,"i8*",0,0,0],ALLOC_STACK));var $90=$ptr;var $add_ptr99=(($90+$call98)&4294967295);$ptr=$add_ptr99;;}
66772 else if(__label__==30){var $91=HEAP32[(($len_percent)>>2)];__ZL10WritePitchiiiii($conv94,$conv95,$conv96,$91,0);$pitch101=((__ZZL10WritePitchiiiiiE6output)&4294967295);var $92=$len;var $93=HEAP32[(($len_percent)>>2)];var $mul109=((($93)*($92))&4294967295);var $div110=((((($mul109))|0)/100)|0);$len1=$div110;var $94=$ptr;var $95=$len1;var $96=$pitch101;var $call111=_sprintf($94,((__str8390)&4294967295),allocate([$95,0,0,0,$96,0,0,0],["i32",0,0,0,"i8*",0,0,0],ALLOC_STACK));var $97=$ptr;var $add_ptr112=(($97+$call111)&4294967295);$ptr=$add_ptr112;var $98=$p;var $env113=(($98+14)&4294967295);var $99=HEAPU8[($env113)];var $conv114=((($99))&255);var $100=$p;var $pitch1115=(($100+20)&4294967295);var $101=HEAPU8[($pitch1115)];var $conv116=((($101))&255);var $102=$p;var $pitch2117=(($102+21)&4294967295);var $103=HEAPU8[($pitch2117)];var $conv118=((($103))&255);var $104=HEAP32[(($len_percent)>>2)];var $sub119=(((-($104)))&4294967295);__ZL10WritePitchiiiii($conv114,$conv116,$conv118,$sub119,0);$pitch101=((__ZZL10WritePitchiiiiiE6output)&4294967295);var $105=$ptr;var $106=HEAP32[(($name2)>>2)];var $call121=__Z12WordToStringj($106);var $107=$len;var $108=$len1;var $sub122=((($107)-($108))&4294967295);var $109=$pitch101;var $call123=_sprintf($105,((__str9391)&4294967295),allocate([((__ZZ12WordToStringjE3buf)&4294967295),0,0,0,$sub122,0,0,0,$109,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0],ALLOC_STACK));var $110=$ptr;var $add_ptr124=(($110+$call123)&4294967295);$ptr=$add_ptr124;;}
66773 $done=1;__label__=54;break $sw_epilog$$sw_bb$$sw_bb126$$sw_bb152$$sw_bb155$$sw_bb171$$sw_bb195$34;}
66774 else if(__label__==32){$released=0;var $111=$next;var $type127=(($111+15)&4294967295);var $112=HEAPU8[($type127)];var $conv128=((($112))&255);var $cmp129=((($conv128))|0)==2;if($cmp129){__label__=33;;}else{__label__=34;;}
66775 if(__label__==33){$released=1;;}
66776 var $113=$next;var $type132=(($113+15)&4294967295);var $114=HEAPU8[($type132)];var $conv133=((($114))&255);var $cmp134=((($conv133))|0)==3;if($cmp134){__label__=35;;}else{__label__=37;;}
66777 $land_lhs_true135$$if_end139$50:do{if(__label__==35){var $115=$next;var $newword136=(($115+19)&4294967295);var $116=HEAP8[($newword136)];var $tobool137=(tempInt=(($116)),(tempInt>=128?tempInt-256:tempInt))!=0;if($tobool137){__label__=37;break $land_lhs_true135$$if_end139$50;}
66778 $released=1;__label__=39;break $land_lhs_true135$$if_end139$50;}}while(0);$if_end139$$if_end145$53:do{if(__label__==37){var $_pr1=$released;var $cmp140=((($_pr1))|0)==0;if(!($cmp140)){__label__=39;break $if_end139$$if_end145$53;}
66779 var $117=$p;var $synthflags142=(($117+4)&4294967295);var $118=HEAPU16[(($synthflags142)>>1)];var $conv143=((($118))&65535);var $or=($conv143)|8192;var $conv144=((($or))&65535);HEAP16[(($synthflags142)>>1)]=$conv144;;}}while(0);var $119=$p;__Z16InterpretPhonemeP10TranslatoriP12PHONEME_LISTP12PHONEME_DATA(0,0,$119,$phdata);var $call146=__Z9DoSample3P12PHONEME_DATAii($phdata,0,-1);$len=$call146;var $120=$len;var $mul147=((($120)*1000)&4294967295);var $121=HEAP32[((_samplerate)>>2)];var $div148=((((($mul147))|0)/((($121))|0))|0);$len=$div148;var $122=$p;var $prepause=(($122+16)&4294967295);var $123=HEAPU8[($prepause)];var $conv149=((($123))&255);var $call150=__Z11PauseLengthii($conv149,1);var $124=$len;var $add151=((($124)+($call150))&4294967295);$len=$add151;__label__=50;break $sw_epilog$$sw_bb$$sw_bb126$$sw_bb152$$sw_bb155$$sw_bb171$$sw_bb195$34;}
66780 else if(__label__==40){var $125=HEAP32[((((_speed+12)&4294967295))>>2)];var $mul153=((($125)*80)&4294967295);var $div154=((((($mul153))|0)/256)|0);$len=$div154;__label__=50;break $sw_epilog$$sw_bb$$sw_bb126$$sw_bb152$$sw_bb155$$sw_bb171$$sw_bb195$34;}
66781 else if(__label__==41){$len=0;var $126=$p;__Z16InterpretPhonemeP10TranslatoriP12PHONEME_LISTP12PHONEME_DATA(0,0,$126,$phdata);var $127=$p;var $synthflags156=(($127+4)&4294967295);var $128=HEAPU16[(($synthflags156)>>1)];var $conv157=((($128))&65535);var $and158=($conv157)&8;var $tobool159=((($and158))|0)!=0;if($tobool159){__label__=42;;}else{__label__=43;;}
66782 if(__label__==42){var $129=$p;var $length161=(($129+12)&4294967295);var $130=HEAP16[(($length161)>>1)];var $conv162=(tempInt=(($130)),(tempInt>=32768?tempInt-65536:tempInt));var $call163=__Z9DoSample3P12PHONEME_DATAii($phdata,$conv162,-1);$len=$call163;;}
66783 var $131=$p;var $length165=(($131+12)&4294967295);var $132=HEAP16[(($length165)>>1)];var $conv166=(tempInt=(($132)),(tempInt>=32768?tempInt-65536:tempInt));var $call167=__Z9DoSample3P12PHONEME_DATAii($phdata,$conv166,-1);var $133=$len;var $add168=((($133)+($call167))&4294967295);$len=$add168;var $134=$len;var $mul169=((($134)*1000)&4294967295);var $135=HEAP32[((_samplerate)>>2)];var $div170=((((($mul169))|0)/((($135))|0))|0);$len=$div170;__label__=50;break $sw_epilog$$sw_bb$$sw_bb126$$sw_bb152$$sw_bb155$$sw_bb171$$sw_bb195$34;}
66784 else if(__label__==44){var $136=$next;var $type172=(($136+15)&4294967295);var $137=HEAPU8[($type172)];var $conv173=((($137))&255);var $cmp174=((($conv173))|0)!=2;if(!($cmp174)){__label__=50;break $sw_epilog$$sw_bb$$sw_bb126$$sw_bb152$$sw_bb155$$sw_bb171$$sw_bb195$34;}
66785 var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=$1;$stop$=$dest$+48;$value4$=0;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=0;}
66786 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
66787 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=0;};var $138=$p;__Z16InterpretPhonemeP10TranslatoriP12PHONEME_LISTP12PHONEME_DATA(0,0,$138,$phdata);var $139=HEAP32[(($arrayidx176)>>2)];HEAP32[(($fmt_addr)>>2)]=$139;var $140=$p;var $ph177=(($140+8)&4294967295);var $141=HEAP32[(($ph177)>>2)];var $142=$p;var $call178=__Z8DoSpect2P11PHONEME_TABiP10FMT_PARAMSP12PHONEME_LISTi($141,0,$fmtp,$142,-1);$len=$call178;var $143=$len;var $mul179=((($143)*1000)&4294967295);var $144=HEAP32[((_samplerate)>>2)];var $div180=((((($mul179))|0)/((($144))|0))|0);$len=$div180;var $145=$next;var $type181=(($145+15)&4294967295);var $146=HEAPU8[($type181)];var $conv182=((($146))&255);var $cmp183=((($conv182))|0)==0;if($cmp183){__label__=46;;}else{__label__=47;;}
66788 if(__label__==46){var $147=$len;var $add185=((($147)+50)&4294967295);$len=$add185;;}
66789 var $148=$p;var $env187=(($148+14)&4294967295);var $149=HEAPU8[($env187)];var $conv188=((($149))&255);var $150=$p;var $pitch1189=(($150+20)&4294967295);var $151=HEAPU8[($pitch1189)];var $conv190=((($151))&255);var $152=$p;var $pitch2191=(($152+21)&4294967295);var $153=HEAPU8[($pitch2191)];var $conv192=((($153))&255);__ZL10WritePitchiiiii($conv188,$conv190,$conv192,0,1);$final_pitch=((__ZZL10WritePitchiiiiiE6output)&4294967295);__label__=50;break $sw_epilog$$sw_bb$$sw_bb126$$sw_bb152$$sw_bb155$$sw_bb171$$sw_bb195$34;}
66790 else if(__label__==48){var $154=$next;var $type196=(($154+15)&4294967295);var $155=HEAPU8[($type196)];var $conv197=((($155))&255);var $cmp198=((($conv197))|0)==0;if(!($cmp198)){__label__=50;break $sw_epilog$$sw_bb$$sw_bb126$$sw_bb152$$sw_bb155$$sw_bb171$$sw_bb195$34;}
66791 var $156=$len;var $add200=((($156)+50)&4294967295);$len=$add200;var $157=$p;var $env201=(($157+14)&4294967295);var $158=HEAPU8[($env201)];var $conv202=((($158))&255);var $159=$p;var $pitch1203=(($159+20)&4294967295);var $160=HEAPU8[($pitch1203)];var $conv204=((($160))&255);var $161=$p;var $pitch2205=(($161+21)&4294967295);var $162=HEAPU8[($pitch2205)];var $conv206=((($162))&255);__ZL10WritePitchiiiii($conv202,$conv204,$conv206,0,1);$final_pitch=((__ZZL10WritePitchiiiiiE6output)&4294967295);__label__=50;break $sw_epilog$$sw_bb$$sw_bb126$$sw_bb152$$sw_bb155$$sw_bb171$$sw_bb195$34;}}while(0);$sw_epilog$$if_end222$69:do{if(__label__==50){var $_pr3=$done;var $tobool209=((($_pr3))|0)!=0;if($tobool209){__label__=54;break $sw_epilog$$if_end222$69;}
66792 var $163=HEAP32[(($name2)>>2)];var $cmp211=((($163))|0)!=0;if($cmp211){__label__=52;;}else{__label__=53;;}
66793 if(__label__==52){var $164=$len;var $165=HEAP32[(($len_percent)>>2)];var $mul213=((($165)*($164))&4294967295);var $div214=((((($mul213))|0)/100)|0);$len1=$div214;var $166=$ptr;var $167=$len1;var $168=HEAP32[(($name2)>>2)];var $call215=__Z12WordToStringj($168);var $call216=_sprintf($166,((__str10392)&4294967295),allocate([$167,0,0,0,((__ZZ12WordToStringjE3buf)&4294967295),0,0,0],["i32",0,0,0,"i8*",0,0,0],ALLOC_STACK));var $169=$ptr;var $add_ptr217=(($169+$call216)&4294967295);$ptr=$add_ptr217;var $170=$len1;var $171=$len;var $sub218=((($171)-($170))&4294967295);$len=$sub218;;}
66794 var $172=$ptr;var $173=$len;var $174=$final_pitch;var $call220=_sprintf($172,((__str11393)&4294967295),allocate([$173,0,0,0,$174,0,0,0],["i32",0,0,0,"i8*",0,0,0],ALLOC_STACK));var $175=$ptr;var $add_ptr221=(($175+$call220)&4294967295);$ptr=$add_ptr221;;}}while(0);var $176=$pause;var $tobool223=((($176))|0)!=0;if($tobool223){__label__=55;;}else{__label__=56;;}
66795 if(__label__==55){var $177=$pause;var $call225=__Z11PauseLengthii($177,0);var $178=$len;var $add226=((($178)+($call225))&4294967295);$len=$add226;var $179=$ptr;var $180=$pause;var $call227=__Z11PauseLengthii($180,0);var $call228=_sprintf($179,((__str12394)&4294967295),allocate([$call227,0,0,0],["i32",0,0,0],ALLOC_STACK));var $181=$ptr;var $add_ptr229=(($181+$call228)&4294967295);$ptr=$add_ptr229;$pause=0;;}
66796 var $182=$f_mbrola_addr;var $tobool231=((($182))|0)!=0;if($tobool231){__label__=57;;}else{__label__=58;;}
66797 if(__label__==57){var $183=$ptr;var $sub_ptr_lhs_cast=($183);var $sub_ptr_sub=((($sub_ptr_lhs_cast)-($sub_ptr_rhs_cast))&4294967295);var $184=$f_mbrola_addr;var $call235=_fwrite($arraydecay233,1,$sub_ptr_sub,$184);;}
66798 else if(__label__==58){var $call238=_write_MBR($arraydecay233);$res=$call238;var $185=$res;var $cmp239=((($185))|0)<0;if($cmp239){__label__=59;break $while_cond$5;}
66799 var $186=$res;var $cmp242=((($186))|0)==0;if($cmp242){__label__=61;break $while_cond$5;}
66800 var $187=HEAP32[((_wcmdq_tail)>>2)];var $arrayidx245=((_wcmdq+$187*16)&4294967295);var $arrayidx246=(($arrayidx245)&4294967295);HEAP32[(($arrayidx246)>>2)]=13;var $188=$len;var $189=HEAP32[((_wcmdq_tail)>>2)];var $arrayidx247=((_wcmdq+$189*16)&4294967295);var $arrayidx248=(($arrayidx247+4)&4294967295);HEAP32[(($arrayidx248)>>2)]=$188;__Z8WcmdqIncv();;}
66801 var $190=HEAP32[((__ZZ15MbrolaTranslateP12PHONEME_LISTiiP7__sFILEE4phix)>>2)];var $inc250=((($190)+1)&4294967295);HEAP32[((__ZZ15MbrolaTranslateP12PHONEME_LISTiiP7__sFILEE4phix)>>2)]=$inc250;__label__=3;continue $while_cond$5;}}
66802 if(__label__==64){var $191=$f_mbrola_addr;var $tobool251=((($191))|0)!=0;if($tobool251){__label__=66;;}else{__label__=65;;}
66803 if(__label__==65){var $call253=_flush_MBR();var $192=HEAP32[((_wcmdq_tail)>>2)];var $arrayidx254=((_wcmdq+$192*16)&4294967295);var $arrayidx255=(($arrayidx254)&4294967295);HEAP32[(($arrayidx255)>>2)]=13;var $193=HEAP32[((_wcmdq_tail)>>2)];var $arrayidx256=((_wcmdq+$193*16)&4294967295);var $arrayidx257=(($arrayidx256+4)&4294967295);HEAP32[(($arrayidx257)>>2)]=500;__Z8WcmdqIncv();;}
66804 $retval=0;;}
66805 else if(__label__==5){$retval=1;;}
66806 else if(__label__==59){$retval=0;;}
66807 else if(__label__==61){$retval=1;;}
66808 var $194=$retval;STACKTOP=__stackBase__;return $194;return null;}
66809 function __ZL10GetMbrNameP12PHONEME_LISTP11PHONEME_TABS2_S2_PiS3_S3_($plist,$ph,$ph_prev,$ph_next,$name2,$split,$control){;var __label__;var $retval;var $plist_addr;var $ph_addr;var $ph_prev_addr;var $ph_next_addr;var $name2_addr;var $split_addr;var $control_addr;var $pr;var $other_ph;var $found;$plist_addr=$plist;$ph_addr=$ph;$ph_prev_addr=$ph_prev;$ph_next_addr=$ph_next;$name2_addr=$name2;$split_addr=$split;$control_addr=$control;$found=0;var $0=$name2_addr;HEAP32[(($0)>>2)]=0;var $1=$split_addr;HEAP32[(($1)>>2)]=0;var $2=$control_addr;HEAP32[(($2)>>2)]=0;var $3=$ph_addr;var $mnemonic=(($3)&4294967295);var $4=HEAP32[(($mnemonic)>>2)];HEAP32[((__ZZL10GetMbrNameP12PHONEME_LISTP11PHONEME_TABS2_S2_PiS3_S3_E4mnem)>>2)]=$4;var $5=HEAP32[((__ZL10mbrola_tab)>>2)];$pr=$5;;$while_cond$2:while(1){var $6=$pr;var $name=(($6)&4294967295);var $7=HEAP32[(($name)>>2)];var $cmp=((($7))|0)!=0;if(!($cmp)){__label__=28;break $while_cond$2;}
66810 var $8=HEAP32[((__ZZL10GetMbrNameP12PHONEME_LISTP11PHONEME_TABS2_S2_PiS3_S3_E4mnem)>>2)];var $9=$pr;var $name1=(($9)&4294967295);var $10=HEAP32[(($name1)>>2)];var $cmp2=((($8))|0)==((($10))|0);if($cmp2){__label__=3;;}else{__label__=27;;}
66811 $if_then$$if_end60$5:do{if(__label__==3){var $11=$pr;var $next_phoneme=(($11+4)&4294967295);var $12=HEAP32[(($next_phoneme)>>2)];var $cmp3=((($12))|0)==0;if($cmp3){__label__=4;;}else{__label__=5;;}
66812 $if_then4$$if_else$7:do{if(__label__==4){$found=1;;}
66813 else if(__label__==5){var $13=$pr;var $next_phoneme5=(($13+4)&4294967295);var $14=HEAP32[(($next_phoneme5)>>2)];var $cmp6=((($14))|0)==58;if($cmp6){__label__=6;;}else{__label__=8;;}
66814 $land_lhs_true$$if_else8$10:do{if(__label__==6){var $15=$plist_addr;var $synthflags=(($15+4)&4294967295);var $16=HEAPU16[(($synthflags)>>1)];var $conv=((($16))&65535);var $and=($conv)&8;var $tobool=((($and))|0)!=0;if(!($tobool)){__label__=8;break $land_lhs_true$$if_else8$10;}
66815 $found=1;__label__=20;break $if_then4$$if_else$7;}}while(0);var $17=$pr;var $control9=(($17+20)&4294967295);var $18=HEAP32[(($control9)>>2)];var $and10=($18)&2;var $tobool11=((($and10))|0)!=0;if($tobool11){__label__=9;;}else{__label__=10;;}
66816 $if_then12$$if_else13$14:do{if(__label__==9){var $19=$ph_prev_addr;$other_ph=$19;;}
66817 else if(__label__==10){var $20=$pr;var $control14=(($20+20)&4294967295);var $21=HEAP32[(($control14)>>2)];var $and15=($21)&8;var $tobool16=((($and15))|0)!=0;if($tobool16){__label__=11;;}else{__label__=13;;}
66818 $land_lhs_true17$$if_else20$17:do{if(__label__==11){var $22=$plist_addr;var $add_ptr=(($22+24)&4294967295);var $newword=(($add_ptr+19)&4294967295);var $23=HEAP8[($newword)];var $tobool18=(tempInt=(($23)),(tempInt>=128?tempInt-256:tempInt))!=0;if(!($tobool18)){__label__=13;break $land_lhs_true17$$if_else20$17;}
66819 var $24=HEAP32[((((_phoneme_tab)&4294967295))>>2)];$other_ph=$24;__label__=14;break $if_then12$$if_else13$14;}}while(0);var $25=$ph_next_addr;$other_ph=$25;;}}while(0);var $26=$pr;var $next_phoneme22=(($26+4)&4294967295);var $27=HEAP32[(($next_phoneme22)>>2)];var $28=$other_ph;var $mnemonic23=(($28)&4294967295);var $29=HEAP32[(($mnemonic23)>>2)];var $cmp24=((($27))|0)==((($29))|0);if($cmp24){__label__=19;;}else{__label__=15;;}
66820 $if_then37$$lor_lhs_false$22:do{if(__label__==15){var $30=$pr;var $next_phoneme25=(($30+4)&4294967295);var $31=HEAP32[(($next_phoneme25)>>2)];var $cmp26=((($31))|0)==2;if($cmp26){__label__=16;;}else{__label__=17;;}
66821 if(__label__==16){var $32=$other_ph;var $type=(($32+11)&4294967295);var $33=HEAPU8[($type)];var $conv28=((($33))&255);var $cmp29=((($conv28))|0)==2;if($cmp29){__label__=19;break $if_then37$$lor_lhs_false$22;}}
66822 var $34=$pr;var $next_phoneme31=(($34+4)&4294967295);var $35=HEAP32[(($next_phoneme31)>>2)];var $cmp32=((($35))|0)==95;if(!($cmp32)){__label__=20;break $if_then4$$if_else$7;}
66823 var $36=$other_ph;var $type34=(($36+11)&4294967295);var $37=HEAPU8[($type34)];var $conv35=((($37))&255);var $cmp36=((($conv35))|0)==0;if(!($cmp36)){__label__=20;break $if_then4$$if_else$7;}}}while(0);$found=1;;}}while(0);var $38=$pr;var $control41=(($38+20)&4294967295);var $39=HEAP32[(($control41)>>2)];var $and42=($39)&4;var $tobool43=((($and42))|0)!=0;if($tobool43){__label__=21;;}else{__label__=23;;}
66824 $land_lhs_true44$$if_end49$30:do{if(__label__==21){var $40=$plist_addr;var $newword45=(($40+19)&4294967295);var $41=HEAPU8[($newword45)];var $conv46=((($41))&255);var $cmp47=((($conv46))|0)==0;if(!($cmp47)){__label__=23;break $land_lhs_true44$$if_end49$30;}
66825 $found=0;__label__=27;break $if_then$$if_end60$5;}}while(0);var $_pr=$found;var $tobool50=((($_pr))|0)!=0;if($tobool50){__label__=24;break $while_cond$2;}}}while(0);var $55=$pr;var $incdec_ptr=(($55+24)&4294967295);$pr=$incdec_ptr;__label__=1;continue $while_cond$2;}
66826 $while_end$$if_then51$35:do{if(__label__==24){var $42=$pr;var $mbr_name2=(($42+12)&4294967295);var $43=HEAP32[(($mbr_name2)>>2)];var $44=$name2_addr;HEAP32[(($44)>>2)]=$43;var $45=$pr;var $percent=(($45+16)&4294967295);var $46=HEAP32[(($percent)>>2)];var $47=$split_addr;HEAP32[(($47)>>2)]=$46;var $48=$pr;var $control52=(($48+20)&4294967295);var $49=HEAP32[(($control52)>>2)];var $50=$control_addr;HEAP32[(($50)>>2)]=$49;var $51=$pr;var $control53=(($51+20)&4294967295);var $52=HEAP32[(($control53)>>2)];var $and54=($52)&16;var $tobool55=((($and54))|0)!=0;var $53=$pr;var $mbr_name=(($53+8)&4294967295);var $54=HEAP32[(($mbr_name)>>2)];if($tobool55){__label__=25;;}else{__label__=26;;}
66827 if(__label__==25){HEAP32[((__ZL15mbr_name_prefix)>>2)]=$54;$retval=0;__label__=31;break $while_end$$if_then51$35;}
66828 else if(__label__==26){HEAP32[((__ZZL10GetMbrNameP12PHONEME_LISTP11PHONEME_TABS2_S2_PiS3_S3_E4mnem)>>2)]=$54;__label__=28;break $while_end$$if_then51$35;}}}while(0);if(__label__==28){var $56=HEAP32[((__ZL15mbr_name_prefix)>>2)];var $cmp61=((($56))|0)!=0;if($cmp61){__label__=29;;}else{__label__=30;;}
66829 if(__label__==29){var $57=HEAP32[((__ZZL10GetMbrNameP12PHONEME_LISTP11PHONEME_TABS2_S2_PiS3_S3_E4mnem)>>2)];var $shl=($57)<<8;var $58=HEAP32[((__ZL15mbr_name_prefix)>>2)];var $and63=($58)&255;var $or=($and63)|($shl);HEAP32[((__ZZL10GetMbrNameP12PHONEME_LISTP11PHONEME_TABS2_S2_PiS3_S3_E4mnem)>>2)]=$or;;}
66830 HEAP32[((__ZL15mbr_name_prefix)>>2)]=0;var $59=HEAP32[((__ZZL10GetMbrNameP12PHONEME_LISTP11PHONEME_TABS2_S2_PiS3_S3_E4mnem)>>2)];$retval=$59;;}
66831 var $60=$retval;;return $60;return null;}
66832 function __ZL10WritePitchiiiii($env,$pitch1,$pitch2,$split,$final){var __stackBase__=STACKTOP;STACKTOP+=76;_memset(__stackBase__,0,76);var __label__;var __lastLabel__=null;var $env_addr;var $pitch1_addr;var $pitch2_addr;var $split_addr;var $final_addr;var $x;var $ix;var $pitch_base=__stackBase__;var $pitch_range=__stackBase__+4;var $p1;var $p2;var $p_end;var $pitch_env;var $max;var $min;var $y_max;var $y_min;var $env100;var $y2;var $y=__stackBase__+8;var $env_split;var $buf=__stackBase__+24;$env_addr=$env;$pitch1_addr=$pitch1;$pitch2_addr=$pitch2;$split_addr=$split;$final_addr=$final;$max=-1;$min=999;$y_max=0;$y_min=0;$env100=80;HEAP8[(((__ZZL10WritePitchiiiiiE6output)&4294967295))]=0;var $0=$env_addr;var $arrayidx=((_envelope_data+$0*4)&4294967295);var $1=HEAP32[(($arrayidx)>>2)];$pitch_env=$1;var $2=HEAP32[((_voice)>>2)];var $3=$pitch1_addr;var $4=$pitch2_addr;__Z9SetPitch2P7voice_tiiPiS1_($2,$3,$4,$pitch_base,$pitch_range);var $5=$split_addr;var $mul=((($5)*128)&4294967295);var $div=((((($mul))|0)/100)|0);$env_split=$div;var $6=$env_split;var $cmp=((($6))|0)<0;if($cmp){__label__=1;;}else{__label__=2;;}
66833 if(__label__==1){var $7=$env_split;var $sub=(((-($7)))&4294967295);$env_split=$sub;;}
66834 $x=0;;$for_body$5:while(1){var $8=$x;var $9=$pitch_env;var $arrayidx2=(($9+$8)&4294967295);var $10=HEAPU8[($arrayidx2)];var $conv=((($10))&255);var $11=$max;var $cmp3=((($conv))|0)>((($11))|0);if($cmp3){__label__=4;;}else{__label__=5;;}
66835 if(__label__==4){var $12=$x;var $13=$pitch_env;var $arrayidx5=(($13+$12)&4294967295);var $14=HEAPU8[($arrayidx5)];var $conv6=((($14))&255);$max=$conv6;var $15=$x;$y_max=$15;;}
66836 var $16=$x;var $17=$pitch_env;var $arrayidx8=(($17+$16)&4294967295);var $18=HEAPU8[($arrayidx8)];var $conv9=((($18))&255);var $19=$min;var $cmp10=((($conv9))|0)<((($19))|0);if($cmp10){__label__=6;;}else{__label__=7;;}
66837 if(__label__==6){var $20=$x;var $21=$pitch_env;var $arrayidx12=(($21+$20)&4294967295);var $22=HEAPU8[($arrayidx12)];var $conv13=((($22))&255);$min=$conv13;var $23=$x;$y_min=$23;;}
66838 var $24=$x;var $inc=((($24)+1)&4294967295);$x=$inc;var $cmp1=((($inc))|0)<128;if($cmp1){__label__=3;continue $for_body$5;}else{__label__=8;break $for_body$5;}}
66839 var $arrayidx15=(($y+8)&4294967295);HEAP32[(($arrayidx15)>>2)]=64;var $25=$y_max;var $cmp16=((($25))|0)>0;var $26=$y_max;var $cmp17=((($26))|0)<127;var $or_cond=($cmp16)&($cmp17);if($or_cond){__label__=9;;}else{__label__=10;;}
66840 if(__label__==9){var $27=$y_max;var $arrayidx19=(($y+8)&4294967295);HEAP32[(($arrayidx19)>>2)]=$27;;}
66841 var $28=$y_min;var $cmp21=((($28))|0)>0;var $29=$y_min;var $cmp23=((($29))|0)<127;var $or_cond1=($cmp21)&($cmp23);if($or_cond1){__label__=11;;}else{__label__=12;;}
66842 if(__label__==11){var $30=$y_min;var $arrayidx25=(($y+8)&4294967295);HEAP32[(($arrayidx25)>>2)]=$30;;}
66843 var $arrayidx27=(($y+8)&4294967295);var $31=HEAP32[(($arrayidx27)>>2)];var $div28=((((($31))|0)/2)|0);var $arrayidx29=(($y+4)&4294967295);HEAP32[(($arrayidx29)>>2)]=$div28;var $arrayidx30=(($y+8)&4294967295);var $32=HEAP32[(($arrayidx30)>>2)];var $arrayidx31=(($y+8)&4294967295);var $33=HEAP32[(($arrayidx31)>>2)];var $sub32=((127-($33))&4294967295);var $div33=((((($sub32))|0)/2)|0);var $add=((($div33)+($32))&4294967295);var $arrayidx34=(($y+12)&4294967295);HEAP32[(($arrayidx34)>>2)]=$add;var $34=$pitch_env;var $arrayidx35=(($34)&4294967295);var $35=HEAPU8[($arrayidx35)];var $conv36=((($35))&255);var $36=HEAP32[(($pitch_range)>>2)];var $mul37=((($conv36)*($36))&4294967295);var $shr=($mul37)>>8;var $37=HEAP32[(($pitch_base)>>2)];var $add38=((($shr)+($37))&4294967295);$p1=$add38;var $38=$pitch_env;var $arrayidx39=(($38+127)&4294967295);var $39=HEAPU8[($arrayidx39)];var $conv40=((($39))&255);var $40=HEAP32[(($pitch_range)>>2)];var $mul41=((($conv40)*($40))&4294967295);var $shr42=($mul41)>>8;var $41=HEAP32[(($pitch_base)>>2)];var $add43=((($shr42)+($41))&4294967295);$p_end=$add43;var $42=$split_addr;var $cmp44=((($42))|0)>=0;if($cmp44){__label__=13;;}else{__label__=14;;}
66844 if(__label__==13){var $arraydecay=(($buf)&4294967295);var $43=$p1;var $div46=((((($43))|0)/4096)|0);var $call=_sprintf($arraydecay,((__str13395)&4294967295),allocate([$div46,0,0,0],["i32",0,0,0],ALLOC_STACK));var $arraydecay47=(($buf)&4294967295);var $call48=_strcat(((__ZZL10WritePitchiiiiiE6output)&4294967295),$arraydecay47);;}
66845 var $44=$env_addr;var $cmp50=((($44))|0)>1;if($cmp50){__label__=15;;}else{__label__=25;;}
66846 $if_then51$$if_end91$23:do{if(__label__==15){$ix=1;var $arraydecay82=(($buf)&4294967295);var $arraydecay85=(($buf)&4294967295);;$for_body54$25:while(1){var $45=$ix;var $arrayidx55=(($y+$45*4)&4294967295);var $46=HEAP32[(($arrayidx55)>>2)];var $47=$pitch_env;var $arrayidx56=(($47+$46)&4294967295);var $48=HEAPU8[($arrayidx56)];var $conv57=((($48))&255);var $49=HEAP32[(($pitch_range)>>2)];var $mul58=((($conv57)*($49))&4294967295);var $shr59=($mul58)>>8;var $50=HEAP32[(($pitch_base)>>2)];var $add60=((($shr59)+($50))&4294967295);$p2=$add60;var $51=$split_addr;var $cmp61=((($51))|0)>0;if($cmp61){__label__=17;;}else{__label__=18;;}
66847 if(__label__==17){var $52=$ix;var $arrayidx63=(($y+$52*4)&4294967295);var $53=HEAP32[(($arrayidx63)>>2)];var $54=$env100;var $mul64=((($54)*($53))&4294967295);var $55=$env_split;var $div65=((((($mul64))|0)/((($55))|0))|0);$y2=$div65;__lastLabel__=17;;}
66848 else if(__label__==18){var $56=$split_addr;var $cmp66=((($56))|0)<0;var $57=$ix;var $arrayidx68=(($y+$57*4)&4294967295);var $58=HEAP32[(($arrayidx68)>>2)];if($cmp66){__label__=19;;}else{__label__=20;;}
66849 if(__label__==19){var $59=$env_split;var $sub69=((($58)-($59))&4294967295);var $60=$env100;var $mul70=((($sub69)*($60))&4294967295);var $61=$env_split;var $div71=((((($mul70))|0)/((($61))|0))|0);$y2=$div71;__lastLabel__=19;;}
66850 else if(__label__==20){var $62=$env100;var $mul74=((($62)*($58))&4294967295);var $div75=((((($mul74))|0)/128)|0);$y2=$div75;__lastLabel__=20;;}}
66851 var $63=__lastLabel__==19?$div71:(__lastLabel__==20?$div75:($div65));var $cmp78=((($63))|0)>0;if($cmp78){__label__=22;;}else{__label__=24;;}
66852 $land_lhs_true79$$for_inc88$34:do{if(__label__==22){var $64=$y2;var $65=$env100;var $cmp80=((($64))|0)<=((($65))|0);if(!($cmp80)){__label__=24;break $land_lhs_true79$$for_inc88$34;}
66853 var $66=$y2;var $67=$p2;var $div83=((((($67))|0)/4096)|0);var $call84=_sprintf($arraydecay82,((__str14396)&4294967295),allocate([$66,0,0,0,$div83,0,0,0],["i32",0,0,0,"i32",0,0,0],ALLOC_STACK));var $call86=_strcat(((__ZZL10WritePitchiiiiiE6output)&4294967295),$arraydecay85);;}}while(0);var $68=$ix;var $inc89=((($68)+1)&4294967295);$ix=$inc89;var $cmp53=((($inc89))|0)<4;if($cmp53){__label__=16;continue $for_body54$25;}else{__label__=25;break $if_then51$$if_end91$23;}}}}while(0);var $69=$p_end;var $div92=((((($69))|0)/4096)|0);$p_end=$div92;var $70=$split_addr;var $cmp93=((($70))|0)<=0;if($cmp93){__label__=26;;}else{__label__=27;;}
66854 if(__label__==26){var $arraydecay95=(($buf)&4294967295);var $71=$env100;var $72=$p_end;var $call96=_sprintf($arraydecay95,((__str14396)&4294967295),allocate([$71,0,0,0,$72,0,0,0],["i32",0,0,0,"i32",0,0,0],ALLOC_STACK));var $arraydecay97=(($buf)&4294967295);var $call98=_strcat(((__ZZL10WritePitchiiiiiE6output)&4294967295),$arraydecay97);;}
66855 var $73=$env100;var $cmp100=((($73))|0)<100;if($cmp100){__label__=28;;}else{__label__=29;;}
66856 if(__label__==28){var $arraydecay102=(($buf)&4294967295);var $74=$p_end;var $call103=_sprintf($arraydecay102,((__str14396)&4294967295),allocate([100,0,0,0,$74,0,0,0],["i32",0,0,0,"i32",0,0,0],ALLOC_STACK));var $arraydecay104=(($buf)&4294967295);var $call105=_strcat(((__ZZL10WritePitchiiiiiE6output)&4294967295),$arraydecay104);;}
66857 var $strlen=_strlen(((__ZZL10WritePitchiiiiiE6output)&4294967295));var $endptr=((((__ZZL10WritePitchiiiiiE6output)&4294967295)+$strlen)&4294967295);var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=((__str15397)&4294967295);$dest$=$endptr;$stop$=$src$+2;if(($dest$%4)==($src$%4)&&2>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
66858 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
66859 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $75=$final_addr;var $tobool=((($75))|0)!=0;if($tobool){__label__=30;;}else{__label__=31;;}
66860 if(__label__==30){var $76=$p_end;var $call109=_sprintf(((__ZZL10WritePitchiiiiiE6output)&4294967295),((__str16398)&4294967295),allocate([$76,0,0,0],["i32",0,0,0],ALLOC_STACK));;}
66861 STACKTOP=__stackBase__;return;return;}
66862 function __Z14MbrolaGenerateP12PHONEME_LISTPii($phoneme_list,$n_ph,$resume){;var __label__;var $retval;var $phoneme_list_addr;var $n_ph_addr;var $resume_addr;var $f_mbrola;var $again;$phoneme_list_addr=$phoneme_list;$n_ph_addr=$n_ph;$resume_addr=$resume;$f_mbrola=0;var $0=$n_ph_addr;var $1=HEAP32[(($0)>>2)];var $cmp=((($1))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
66863 if(__label__==1){$retval=0;;}
66864 else if(__label__==2){var $2=HEAP32[((_option_mbrola_phonemes)>>2)];var $tobool=((($2))|0)!=0;if($tobool){__label__=3;;}else{__label__=4;;}
66865 if(__label__==3){var $3=HEAP32[((_f_trans)>>2)];$f_mbrola=$3;;}
66866 var $4=$phoneme_list_addr;var $5=$n_ph_addr;var $6=HEAP32[(($5)>>2)];var $7=$resume_addr;var $8=$f_mbrola;var $call=__Z15MbrolaTranslateP12PHONEME_LISTiiP7__sFILE($4,$6,$7,$8);$again=$call;var $tobool3=((($call))|0)!=0;if($tobool3){__label__=6;;}else{__label__=5;;}
66867 if(__label__==5){var $9=$n_ph_addr;HEAP32[(($9)>>2)]=0;;}
66868 var $10=$again;$retval=$10;;}
66869 var $11=$retval;;return $11;return null;}
66870 function __Z10MbrolaFillii($length,$resume){;var __label__;var $retval;var $length_addr;var $resume_addr;var $req_samples;var $result;$length_addr=$length;$resume_addr=$resume;var $0=$resume_addr;var $tobool=((($0))|0)!=0;if($tobool){__label__=2;;}else{__label__=1;;}
66871 if(__label__==1){var $1=HEAP32[((_samplerate)>>2)];var $2=$length_addr;var $mul=((($2)*($1))&4294967295);var $div=((((($mul))|0)/1000)|0);HEAP32[((__ZZ10MbrolaFilliiE9n_samples)>>2)]=$div;;}
66872 var $3=HEAP32[((_out_end)>>2)];var $4=HEAP32[((_out_ptr)>>2)];var $sub_ptr_lhs_cast=($3);var $sub_ptr_rhs_cast=($4);var $sub_ptr_sub=((($sub_ptr_lhs_cast)-($sub_ptr_rhs_cast))&4294967295);var $div1=((((($sub_ptr_sub))|0)/2)|0);$req_samples=$div1;var $5=$req_samples;var $6=HEAP32[((__ZZ10MbrolaFilliiE9n_samples)>>2)];var $cmp=((($5))|0)>((($6))|0);if($cmp){__label__=3;;}else{__label__=4;;}
66873 if(__label__==3){var $7=HEAP32[((__ZZ10MbrolaFilliiE9n_samples)>>2)];$req_samples=$7;;}
66874 var $8=HEAP32[((_out_ptr)>>2)];var $9=$8;var $10=$9;var $11=$req_samples;var $call=_read_MBR($10,$11);$result=$call;var $cmp4=((($call))|0)<=0;if($cmp4){__label__=5;;}else{__label__=6;;}
66875 if(__label__==5){$retval=0;;}
66876 else if(__label__==6){var $12=$result;var $mul7=((($12)*2)&4294967295);var $13=HEAP32[((_out_ptr)>>2)];var $add_ptr=(($13+$mul7)&4294967295);HEAP32[((_out_ptr)>>2)]=$add_ptr;var $14=$result;var $15=HEAP32[((__ZZ10MbrolaFilliiE9n_samples)>>2)];var $sub=((($15)-($14))&4294967295);HEAP32[((__ZZ10MbrolaFilliiE9n_samples)>>2)]=$sub;var $16=HEAP32[((__ZZ10MbrolaFilliiE9n_samples)>>2)];var $tobool8=((($16))|0)!=0;var $cond=($tobool8)?1:0;$retval=$cond;;}
66877 var $17=$retval;;return $17;return null;}
66878 function __Z11MbrolaResetv(){;var __label__;var $call=_reset_MBR();;return;return;}
66879 function __Z10LoadPhDatav(){var __stackBase__=STACKTOP;STACKTOP+=4;_memset(__stackBase__,0,4);var __label__;var $retval;var $ix;var $n_phonemes;var $version;var $result;var $length=__stackBase__;var $p;var $pw;$result=1;var $0=HEAP32[((__ZL16phoneme_tab_data)>>2)];var $call=__ZL10ReadPhFilePvPKcPi($0,((__str1412)&4294967295),0);HEAP32[((__ZL16phoneme_tab_data)>>2)]=$call;var $cmp=((($call))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
66880 if(__label__==1){$retval=-1;;}
66881 else if(__label__==2){var $1=HEAP32[((_phoneme_index)>>2)];var $2=$1;var $call1=__ZL10ReadPhFilePvPKcPi($2,((__str2413)&4294967295),0);var $3=$call1;HEAP32[((_phoneme_index)>>2)]=$3;var $cmp2=((($3))|0)==0;if($cmp2){__label__=3;;}else{__label__=4;;}
66882 if(__label__==3){$retval=-1;;}
66883 else if(__label__==4){var $4=HEAP32[((_phondata_ptr)>>2)];var $call5=__ZL10ReadPhFilePvPKcPi($4,((__str3414)&4294967295),0);HEAP32[((_phondata_ptr)>>2)]=$call5;var $cmp6=((($call5))|0)==0;if($cmp6){__label__=5;;}else{__label__=6;;}
66884 if(__label__==5){$retval=-1;;}
66885 else if(__label__==6){var $5=HEAP32[((_tunes)>>2)];var $6=$5;var $call9=__ZL10ReadPhFilePvPKcPi($6,((__str4415)&4294967295),$length);var $7=$call9;HEAP32[((_tunes)>>2)]=$7;var $cmp10=((($7))|0)==0;if($cmp10){__label__=7;;}else{__label__=8;;}
66886 if(__label__==7){$retval=-1;;}
66887 else if(__label__==8){var $8=HEAP32[((_phondata_ptr)>>2)];HEAP32[((_wavefile_data)>>2)]=$8;var $9=HEAPU32[(($length)>>2)];var $div=Math.floor(((($9))>>>0)/68);HEAP32[((_n_tunes)>>2)]=$div;$version=0;$ix=0;;$for_body$14:while(1){var $10=$ix;var $11=HEAP32[((_wavefile_data)>>2)];var $arrayidx=(($11+$10)&4294967295);var $12=HEAPU8[($arrayidx)];var $conv=((($12))&255);var $13=$ix;var $mul=((($13)*8)&4294967295);var $shl=($conv)<<($mul);var $14=$version;var $add=((($shl)+($14))&4294967295);$version=$add;var $15=$ix;var $inc=((($15)+1)&4294967295);$ix=$inc;var $cmp13=((($inc))|0)<4;if($cmp13){__label__=9;continue $for_body$14;}else{__label__=10;break $for_body$14;}}
66888 var $16=$version;var $cmp14=((($16))|0)!=83200;if($cmp14){__label__=11;;}else{__label__=12;;}
66889 if(__label__==11){var $17=$version;$result=$17;;}
66890 var $18=HEAP32[((__ZL16phoneme_tab_data)>>2)];$p=$18;var $19=$p;var $arrayidx17=(($19)&4294967295);var $20=HEAPU8[($arrayidx17)];var $conv18=((($20))&255);HEAP32[((_n_phoneme_tables)>>2)]=$conv18;var $21=$p;var $add_ptr=(($21+4)&4294967295);$p=$add_ptr;$ix=0;var $22=$ix;var $23=HEAP32[((_n_phoneme_tables)>>2)];var $cmp201=((($22))|0)<((($23))|0);if($cmp201){__label__=13;;}else{__label__=14;;}
66891 $for_body21$$for_end42$20:do{if(__label__==13){while(1){var $24=$p;var $arrayidx22=(($24)&4294967295);var $25=HEAPU8[($arrayidx22)];var $conv23=((($25))&255);$n_phonemes=$conv23;var $26=$p;var $arrayidx24=(($26)&4294967295);var $27=HEAPU8[($arrayidx24)];var $conv25=((($27))&255);var $28=$ix;var $arrayidx26=((_phoneme_tab_list+$28*48)&4294967295);var $n_phonemes27=(($arrayidx26+36)&4294967295);HEAP32[(($n_phonemes27)>>2)]=$conv25;var $29=$p;var $arrayidx28=(($29+1)&4294967295);var $30=HEAPU8[($arrayidx28)];var $conv29=((($30))&255);var $31=$ix;var $arrayidx30=((_phoneme_tab_list+$31*48)&4294967295);var $includes=(($arrayidx30+40)&4294967295);HEAP32[(($includes)>>2)]=$conv29;var $32=$p;var $33=$32;$pw=$33;var $34=$pw;var $arrayidx31=(($34+4)&4294967295);var $35=HEAP32[(($arrayidx31)>>2)];var $call32=__Z13Reverse4Bytesi($35);var $36=$ix;var $arrayidx33=((_phoneme_tab_list+$36*48)&4294967295);var $equivalence_tables=(($arrayidx33+44)&4294967295);HEAP32[(($equivalence_tables)>>2)]=$call32;var $37=$p;var $add_ptr34=(($37+8)&4294967295);$p=$add_ptr34;var $38=$ix;var $arrayidx35=((_phoneme_tab_list+$38*48)&4294967295);var $name=(($arrayidx35)&4294967295);var $arraydecay=(($name)&4294967295);var $39=$p;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$39;$dest$=$arraydecay;$stop$=$src$+32;if(($dest$%4)==($src$%4)&&32>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
66892 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
66893 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $40=$p;var $add_ptr36=(($40+32)&4294967295);$p=$add_ptr36;var $41=$p;var $42=$41;var $43=$ix;var $arrayidx37=((_phoneme_tab_list+$43*48)&4294967295);var $phoneme_tab_ptr=(($arrayidx37+32)&4294967295);HEAP32[(($phoneme_tab_ptr)>>2)]=$42;var $44=$n_phonemes;var $mul38=((($44)*16)&4294967295);var $45=$p;var $add_ptr39=(($45+$mul38)&4294967295);$p=$add_ptr39;var $46=$ix;var $inc41=((($46)+1)&4294967295);$ix=$inc41;var $47=$ix;var $48=HEAP32[((_n_phoneme_tables)>>2)];var $cmp20=((($47))|0)<((($48))|0);if($cmp20){__label__=13;continue;}else{__label__=14;break $for_body21$$for_end42$20;}}}}while(0);var $49=HEAP32[((_phoneme_tab_number)>>2)];var $50=HEAP32[((_n_phoneme_tables)>>2)];var $cmp43=((($49))|0)>=((($50))|0);if($cmp43){__label__=15;;}else{__label__=16;;}
66894 if(__label__==15){HEAP32[((_phoneme_tab_number)>>2)]=0;;}
66895 var $51=$result;$retval=$51;;}}}}
66896 var $52=$retval;STACKTOP=__stackBase__;return $52;return null;}
66897 function __ZL10ReadPhFilePvPKcPi($ptr,$fname,$size){var __stackBase__=STACKTOP;STACKTOP+=192;_memset(__stackBase__,0,192);var __label__;var $retval;var $ptr_addr;var $fname_addr;var $size_addr;var $f_in;var $p;var $length;var $buf=__stackBase__;$ptr_addr=$ptr;$fname_addr=$fname;$size_addr=$size;var $arraydecay=(($buf)&4294967295);var $0=$fname_addr;var $call=_sprintf($arraydecay,((__str74726)&4294967295),allocate([((_path_home)&4294967295),0,0,0,47,0,0,0,$0,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0],ALLOC_STACK));var $arraydecay1=(($buf)&4294967295);var $call2=__Z13GetFileLengthPKc($arraydecay1);$length=$call2;var $arraydecay3=(($buf)&4294967295);var $call4=_fopen($arraydecay3,((__str18429)&4294967295));$f_in=$call4;var $cmp=((($call4))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
66898 if(__label__==1){var $1=HEAP32[((__impure_ptr)>>2)];var $_stderr=(($1+12)&4294967295);var $2=HEAP32[(($_stderr)>>2)];var $arraydecay5=(($buf)&4294967295);var $call6=_fprintf($2,((__str19430)&4294967295),allocate([$arraydecay5,0,0,0],["i8*",0,0,0],ALLOC_STACK));$retval=0;;}
66899 else if(__label__==2){var $3=$ptr_addr;var $cmp7=((($3))|0)!=0;if($cmp7){__label__=3;;}else{__label__=4;;}
66900 if(__label__==3){var $4=$ptr_addr;__Z4FreePv($4);;}
66901 var $5=$length;var $call10=__Z5Alloci($5);$p=$call10;var $cmp11=((($call10))|0)==0;if($cmp11){__label__=5;;}else{__label__=6;;}
66902 if(__label__==5){var $6=$f_in;var $call13=_fclose($6);$retval=0;;}
66903 else if(__label__==6){var $7=$p;var $8=$length;var $9=$f_in;var $call15=_fread($7,1,$8,$9);var $10=$length;var $cmp16=((($call15))|0)!=((($10))|0);var $11=$f_in;var $call18=_fclose($11);if($cmp16){__label__=7;;}else{__label__=8;;}
66904 if(__label__==7){$retval=0;;}
66905 else if(__label__==8){var $12=$size_addr;var $cmp21=((($12))|0)!=0;if($cmp21){__label__=9;;}else{__label__=10;;}
66906 if(__label__==9){var $13=$length;var $14=$size_addr;HEAP32[(($14)>>2)]=$13;;}
66907 var $15=$p;$retval=$15;;}}}
66908 var $16=$retval;STACKTOP=__stackBase__;return $16;return null;}
66909 function __Z10FreePhDatav(){;var __label__;var $0=HEAP32[((__ZL16phoneme_tab_data)>>2)];__Z4FreePv($0);var $1=HEAP32[((_phoneme_index)>>2)];var $2=$1;__Z4FreePv($2);var $3=HEAP32[((_phondata_ptr)>>2)];__Z4FreePv($3);HEAP32[((__ZL16phoneme_tab_data)>>2)]=0;HEAP32[((_phoneme_index)>>2)]=0;HEAP32[((_phondata_ptr)>>2)]=0;;return;return;}
66910 function __Z11PhonemeCodej($mnem){;var __label__;var $retval;var $mnem_addr;var $ix;$mnem_addr=$mnem;$ix=0;;while(1){var $0=$ix;var $1=HEAP32[((_n_phoneme_tab)>>2)];var $cmp=((($0))|0)<((($1))|0);if(!($cmp)){__label__=6;break;}
66911 var $2=$ix;var $arrayidx=((_phoneme_tab+$2*4)&4294967295);var $3=HEAP32[(($arrayidx)>>2)];var $cmp1=((($3))|0)==0;if($cmp1){__label__=5;;}else{__label__=3;;}
66912 if(__label__==3){var $4=$ix;var $arrayidx2=((_phoneme_tab+$4*4)&4294967295);var $5=HEAP32[(($arrayidx2)>>2)];var $mnemonic=(($5)&4294967295);var $6=HEAP32[(($mnemonic)>>2)];var $7=$mnem_addr;var $cmp3=((($6))|0)==((($7))|0);if($cmp3){__label__=4;break;}}
66913 var $11=$ix;var $inc=((($11)+1)&4294967295);$ix=$inc;__label__=1;continue;}
66914 if(__label__==6){$retval=0;;}
66915 else if(__label__==4){var $8=$ix;var $arrayidx5=((_phoneme_tab+$8*4)&4294967295);var $9=HEAP32[(($arrayidx5)>>2)];var $code=(($9+10)&4294967295);var $10=HEAPU8[($code)];var $conv=((($10))&255);$retval=$conv;;}
66916 var $12=$retval;;return $12;return null;}
66917 function __Z19LookupPhonemeStringPKc($string){;var __label__;var __lastLabel__=null;var $string_addr;var $ix;var $c;var $mnem;$string_addr=$string;$mnem=0;$ix=0;__lastLabel__=0;;while(1){var $0=__lastLabel__==3?$inc:(0);var $cmp=((($0))|0)<4;if(!($cmp)){__label__=4;break;}
66918 var $1=$ix;var $2=$string_addr;var $arrayidx=(($2+$1)&4294967295);var $3=HEAP8[($arrayidx)];var $conv=(tempInt=(($3)),(tempInt>=128?tempInt-256:tempInt));var $cmp1=((($conv))|0)==0;if($cmp1){__label__=4;break;}
66919 var $4=$ix;var $5=$string_addr;var $arrayidx2=(($5+$4)&4294967295);var $6=HEAP8[($arrayidx2)];$c=$6;var $7=$c;var $conv3=((($7))&255);var $8=$ix;var $mul=((($8)*8)&4294967295);var $shl=($conv3)<<($mul);var $9=$mnem;var $or=($shl)|($9);$mnem=$or;var $10=$ix;var $inc=((($10)+1)&4294967295);$ix=$inc;__lastLabel__=3;__label__=1;continue;}
66920 var $11=$mnem;var $call=__Z11PhonemeCodej($11);;return $call;return null;}
66921 function __Z11LookupSpectP11PHONEME_TABiP10FMT_PARAMSPiP12PHONEME_LIST($this_ph,$which,$fmt_params,$n_frames,$plist){var __stackBase__=STACKTOP;STACKTOP+=4;_memset(__stackBase__,0,4);var __label__;var __lastLabel__=null;var $this_ph_addr;var $which_addr;var $fmt_params_addr;var $n_frames_addr;var $plist_addr;var $ix;var $nf=__stackBase__;var $nf1;var $seq_break;var $frames;var $length1;var $length_std;var $length_factor;var $seq;var $seq2;var $seqk;var $seqk2;var $frame;$this_ph_addr=$this_ph;$which_addr=$which;$fmt_params_addr=$fmt_params;$n_frames_addr=$n_frames;$plist_addr=$plist;var $0=$fmt_params_addr;var $fmt_addr=(($0+8)&4294967295);var $1=HEAP32[(($fmt_addr)>>2)];var $2=HEAP32[((_phondata_ptr)>>2)];var $arrayidx=(($2+$1)&4294967295);var $3=$arrayidx;$seq=$3;var $4=$seq;var $5=$4;$seqk=$5;var $6=$seq;var $n_frames1=(($6+2)&4294967295);var $7=HEAPU8[($n_frames1)];var $conv=((($7))&255);HEAP32[(($nf)>>2)]=$conv;var $8=HEAP32[(($nf)>>2)];var $cmp=((($8))|0)>=25;if($cmp){__label__=1;;}else{__label__=2;;}
66922 if(__label__==1){HEAP32[(($nf)>>2)]=24;;}
66923 var $9=$fmt_params_addr;var $fmt2_lenadj=(($9+24)&4294967295);var $10=HEAP32[(($fmt2_lenadj)>>2)];var $11=$fmt_params_addr;var $fmt_length=(($11+12)&4294967295);var $12=HEAP32[(($fmt_length)>>2)];var $add=((($12)+($10))&4294967295);HEAP32[((_seq_len_adjust)>>2)]=$add;$seq_break=0;$ix=0;var $13=$ix;var $14=HEAP32[(($nf)>>2)];var $cmp29=((($13))|0)<((($14))|0);if($cmp29){__label__=4;;}else{__label__=3;;}
66924 $for_body$$for_end_thread$5:do{if(__label__==4){while(1){var $15=$seq;var $frame3=(($15+4)&4294967295);var $arrayidx4=(($frame3)&4294967295);var $frflags=(($arrayidx4)&4294967295);var $16=HEAP16[(($frflags)>>1)];var $conv5=(tempInt=(($16)),(tempInt>=32768?tempInt-65536:tempInt));var $and=($conv5)&1;var $tobool=((($and))|0)!=0;var $17=$ix;if($tobool){__label__=5;;}else{__label__=6;;}
66925 if(__label__==5){var $18=$seqk;var $frame7=(($18+4)&4294967295);var $arrayidx8=(($frame7+$17*64)&4294967295);$frame=$arrayidx8;;}
66926 else if(__label__==6){var $19=$seq;var $frame9=(($19+4)&4294967295);var $arrayidx10=(($frame9+$17*44)&4294967295);var $20=$arrayidx10;$frame=$20;;}
66927 var $21=$frame;var $22=$ix;var $arrayidx12=((__ZZ11LookupSpectP11PHONEME_TABiP10FMT_PARAMSPiP12PHONEME_LISTE10frames_buf+$22*8)&4294967295);var $frame13=(($arrayidx12+4)&4294967295);HEAP32[(($frame13)>>2)]=$21;var $23=$frame;var $frflags14=(($23)&4294967295);var $24=HEAP16[(($frflags14)>>1)];var $25=$ix;var $arrayidx15=((__ZZ11LookupSpectP11PHONEME_TABiP10FMT_PARAMSPiP12PHONEME_LISTE10frames_buf+$25*8)&4294967295);var $frflags16=(($arrayidx15+2)&4294967295);HEAP16[(($frflags16)>>1)]=$24;var $26=$frame;var $length=(($26+16)&4294967295);var $27=HEAPU8[($length)];var $conv17=((($27))&255);var $28=$ix;var $arrayidx18=((__ZZ11LookupSpectP11PHONEME_TABiP10FMT_PARAMSPiP12PHONEME_LISTE10frames_buf+$28*8)&4294967295);var $length19=(($arrayidx18)&4294967295);HEAP16[(($length19)>>1)]=$conv17;var $29=$frame;var $frflags20=(($29)&4294967295);var $30=HEAP16[(($frflags20)>>1)];var $conv21=(tempInt=(($30)),(tempInt>=32768?tempInt-65536:tempInt));var $and22=($conv21)&2;var $tobool23=((($and22))|0)!=0;if($tobool23){__label__=8;;}else{__label__=9;;}
66928 if(__label__==8){var $31=$ix;$seq_break=$31;;}
66929 var $32=$ix;var $inc=((($32)+1)&4294967295);$ix=$inc;var $33=$ix;var $34=HEAP32[(($nf)>>2)];var $cmp2=((($33))|0)<((($34))|0);if($cmp2){__label__=4;continue;}else{__label__=10;break;}}
66930 var $_pr10=$seq_break;$frames=((__ZZ11LookupSpectP11PHONEME_TABiP10FMT_PARAMSPiP12PHONEME_LISTE10frames_buf)&4294967295);var $cmp26=((($_pr10))|0)>0;if(!($cmp26)){__label__=14;break $for_body$$for_end_thread$5;}
66931 var $35=$which_addr;var $cmp28=((($35))|0)==1;var $36=$seq_break;if($cmp28){__label__=12;;}else{__label__=13;;}
66932 if(__label__==12){var $add30=((($36)+1)&4294967295);HEAP32[(($nf)>>2)]=$add30;;}
66933 else if(__label__==13){var $arrayidx32=((__ZZ11LookupSpectP11PHONEME_TABiP10FMT_PARAMSPiP12PHONEME_LISTE10frames_buf+$36*8)&4294967295);$frames=$arrayidx32;var $37=$seq_break;var $38=HEAP32[(($nf)>>2)];var $sub=((($38)-($37))&4294967295);HEAP32[(($nf)>>2)]=$sub;;}}
66934 else if(__label__==3){$frames=((__ZZ11LookupSpectP11PHONEME_TABiP10FMT_PARAMSPiP12PHONEME_LISTE10frames_buf)&4294967295);;}}while(0);var $39=$this_ph_addr;var $type=(($39+11)&4294967295);var $40=HEAPU8[($type)];var $conv35=((($40))&255);var $cmp36=((($conv35))|0)==2;if($cmp36){__label__=15;;}else{__label__=18;;}
66935 $land_lhs_true$$if_end42$22:do{if(__label__==15){var $41=$fmt_params_addr;var $fmt2_addr=(($41+20)&4294967295);var $42=HEAP32[(($fmt2_addr)>>2)];var $cmp37=((($42))|0)==0;if(!($cmp37)){__label__=18;break $land_lhs_true$$if_end42$22;}
66936 var $43=$fmt_params_addr;var $use_vowelin=(($43+4)&4294967295);var $44=HEAP32[(($use_vowelin)>>2)];var $tobool39=((($44))|0)!=0;if(!($tobool39)){__label__=18;break $land_lhs_true$$if_end42$22;}
66937 var $45=$frames;var $46=$fmt_params_addr;var $transition0=(($46+36)&4294967295);var $47=HEAP32[(($transition0)>>2)];var $48=$fmt_params_addr;var $transition1=(($48+40)&4294967295);var $49=HEAP32[(($transition1)>>2)];var $50=$which_addr;var $call=__Z18FormantTransition2P10frameref_tRijjP11PHONEME_TABi($45,$nf,$47,$49,0,$50);var $51=HEAP32[((_seq_len_adjust)>>2)];var $add41=((($51)+($call))&4294967295);HEAP32[((_seq_len_adjust)>>2)]=$add41;;}}while(0);$length1=0;var $52=HEAP32[(($nf)>>2)];var $sub43=((($52)-1)&4294967295);$nf1=$sub43;$ix=0;var $53=$ix;var $54=$nf1;var $cmp457=((($53))|0)<((($54))|0);if($cmp457){__label__=19;;}else{__label__=20;;}
66938 $for_body46$$for_end53$27:do{if(__label__==19){while(1){var $55=$ix;var $56=$frames;var $arrayidx47=(($56+8*$55)&4294967295);var $length48=(($arrayidx47)&4294967295);var $57=HEAP16[(($length48)>>1)];var $conv49=(tempInt=(($57)),(tempInt>=32768?tempInt-65536:tempInt));var $58=$length1;var $add50=((($58)+($conv49))&4294967295);$length1=$add50;var $59=$ix;var $inc52=((($59)+1)&4294967295);$ix=$inc52;var $60=$ix;var $61=$nf1;var $cmp45=((($60))|0)<((($61))|0);if($cmp45){__label__=19;continue;}else{__label__=20;break $for_body46$$for_end53$27;}}}}while(0);var $62=$fmt_params_addr;var $fmt2_addr54=(($62+20)&4294967295);var $63=HEAP32[(($fmt2_addr54)>>2)];var $cmp55=((($63))|0)!=0;if($cmp55){__label__=21;;}else{__label__=29;;}
66939 if(__label__==21){var $64=$fmt_params_addr;var $fmt2_addr57=(($64+20)&4294967295);var $65=HEAP32[(($fmt2_addr57)>>2)];var $66=HEAP32[((_phondata_ptr)>>2)];var $arrayidx58=(($66+$65)&4294967295);var $67=$arrayidx58;$seq2=$67;var $68=$seq2;var $69=$68;$seqk2=$69;var $70=HEAP32[(($nf)>>2)];var $dec=((($70)-1)&4294967295);HEAP32[(($nf)>>2)]=$dec;$ix=0;var $71=$ix;var $72=$seq2;var $n_frames604=(($72+2)&4294967295);var $73=HEAPU8[($n_frames604)];var $conv615=((($73))&255);var $cmp626=((($71))|0)<((($conv615))|0);if($cmp626){__label__=22;;}else{__label__=28;;}
66940 $for_body63$$for_end92$33:do{if(__label__==22){while(1){var $74=$seq2;var $frame64=(($74+4)&4294967295);var $arrayidx65=(($frame64)&4294967295);var $frflags66=(($arrayidx65)&4294967295);var $75=HEAP16[(($frflags66)>>1)];var $conv67=(tempInt=(($75)),(tempInt>=32768?tempInt-65536:tempInt));var $and68=($conv67)&1;var $tobool69=((($and68))|0)!=0;var $76=$ix;if($tobool69){__label__=23;;}else{__label__=24;;}
66941 if(__label__==23){var $77=$seqk2;var $frame71=(($77+4)&4294967295);var $arrayidx72=(($frame71+$76*64)&4294967295);$frame=$arrayidx72;;}
66942 else if(__label__==24){var $78=$seq2;var $frame74=(($78+4)&4294967295);var $arrayidx75=(($frame74+$76*44)&4294967295);var $79=$arrayidx75;$frame=$79;;}
66943 var $80=$frame;var $length77=(($80+16)&4294967295);var $81=HEAPU8[($length77)];var $conv78=((($81))&255);var $82=HEAP32[(($nf)>>2)];var $83=$frames;var $arrayidx79=(($83+8*$82)&4294967295);var $length80=(($arrayidx79)&4294967295);HEAP16[(($length80)>>1)]=$conv78;var $84=$ix;var $cmp81=((($84))|0)>0;if($cmp81){__label__=26;;}else{__label__=27;;}
66944 if(__label__==26){var $85=$frame;var $86=HEAP32[(($nf)>>2)];var $87=$frames;var $arrayidx83=(($87+8*$86)&4294967295);var $frame84=(($arrayidx83+4)&4294967295);HEAP32[(($frame84)>>2)]=$85;var $88=$frame;var $frflags85=(($88)&4294967295);var $89=HEAP16[(($frflags85)>>1)];var $90=HEAP32[(($nf)>>2)];var $91=$frames;var $arrayidx86=(($91+8*$90)&4294967295);var $frflags87=(($arrayidx86+2)&4294967295);HEAP16[(($frflags87)>>1)]=$89;;}
66945 var $92=HEAP32[(($nf)>>2)];var $inc89=((($92)+1)&4294967295);HEAP32[(($nf)>>2)]=$inc89;var $93=$ix;var $inc91=((($93)+1)&4294967295);$ix=$inc91;var $94=$ix;var $95=$seq2;var $n_frames60=(($95+2)&4294967295);var $96=HEAPU8[($n_frames60)];var $conv61=((($96))&255);var $cmp62=((($94))|0)<((($conv61))|0);if($cmp62){__label__=22;continue;}else{__label__=28;break $for_body63$$for_end92$33;}}}}while(0);HEAP32[((_wavefile_ix)>>2)]=0;;}
66946 var $97=$length1;var $cmp94=((($97))|0)>0;if($cmp94){__label__=30;;}else{__label__=47;;}
66947 $if_then95$$if_end175$45:do{if(__label__==30){var $98=$which_addr;var $cmp96=((($98))|0)==2;if($cmp96){__label__=31;;}else{__label__=37;;}
66948 if(__label__==31){var $99=$fmt_params_addr;var $std_length=(($99+44)&4294967295);var $100=HEAP32[(($std_length)>>2)];var $101=HEAP32[((_seq_len_adjust)>>2)];var $add98=((($100)-45)&4294967295);var $sub99=((($add98)+($101))&4294967295);$length_std=$sub99;var $102=$length_std;var $cmp100=((($102))|0)<10;if($cmp100){__label__=32;;}else{__label__=33;;}
66949 if(__label__==32){$length_std=10;;}
66950 var $103=$plist_addr;var $synthflags=(($103+4)&4294967295);var $104=HEAPU16[(($synthflags)>>1)];var $conv103=((($104))&65535);var $and104=($conv103)&8;var $tobool105=((($and104))|0)!=0;if($tobool105){__label__=34;;}else{__label__=35;;}
66951 if(__label__==34){var $105=HEAP32[((((_phoneme_tab+48)&4294967295))>>2)];var $std_length107=(($105+14)&4294967295);var $106=HEAPU8[($std_length107)];var $conv108=((($106))&255);var $mul=((($conv108)*2)&4294967295);var $107=$length_std;var $add109=((($mul)+($107))&4294967295);$length_std=$add109;;}
66952 var $108=$length_std;var $mul111=((($108)*256)&4294967295);var $109=$length1;var $div=((((($mul111))|0)/((($109))|0))|0);$length_factor=$div;$ix=0;var $110=$ix;var $111=$nf1;var $cmp1133=((($110))|0)<((($111))|0);if(!($cmp1133)){__label__=47;break $if_then95$$if_end175$45;}
66953 while(1){var $112=$ix;var $113=$frames;var $arrayidx115=(($113+8*$112)&4294967295);var $length116=(($arrayidx115)&4294967295);var $114=HEAP16[(($length116)>>1)];var $conv117=(tempInt=(($114)),(tempInt>=32768?tempInt-65536:tempInt));var $115=$length_factor;var $mul118=((($conv117)*($115))&4294967295);var $div119=((((($mul118))|0)/256)|0);var $conv120=((($div119))&65535);var $116=$ix;var $117=$frames;var $arrayidx121=(($117+8*$116)&4294967295);var $length122=(($arrayidx121)&4294967295);HEAP16[(($length122)>>1)]=$conv120;var $118=$ix;var $inc124=((($118)+1)&4294967295);$ix=$inc124;var $119=$ix;var $120=$nf1;var $cmp113=((($119))|0)<((($120))|0);if($cmp113){__label__=36;continue;}else{__label__=47;break $if_then95$$if_end175$45;}}}
66954 else if(__label__==37){var $121=$which_addr;var $cmp127=((($121))|0)==1;var $122=$fmt_params_addr;if($cmp127){__label__=38;;}else{__label__=41;;}
66955 $if_then128$$if_else145$58:do{if(__label__==38){var $fmt_control=(($122)&4294967295);var $123=HEAP32[(($fmt_control)>>2)];var $cmp129=((($123))|0)==1;if(!($cmp129)){__label__=43;break $if_then128$$if_else145$58;}
66956 var $124=$fmt_params_addr;var $std_length131=(($124+44)&4294967295);var $125=HEAP32[(($std_length131)>>2)];var $cmp132=((($125))|0)<130;if(!($cmp132)){__label__=43;break $if_then128$$if_else145$58;}
66957 var $126=$frames;var $arrayidx134=(($126)&4294967295);var $length135=(($arrayidx134)&4294967295);var $127=HEAP16[(($length135)>>1)];var $conv136=(tempInt=(($127)),(tempInt>=32768?tempInt-65536:tempInt));var $128=$fmt_params_addr;var $std_length137=(($128+44)&4294967295);var $129=HEAP32[(($std_length137)>>2)];var $mul138=((($129)*($conv136))&4294967295);var $div139=((((($mul138))|0)/130)|0);var $conv140=((($div139))&65535);var $130=$frames;var $arrayidx141=(($130)&4294967295);var $length142=(($arrayidx141)&4294967295);HEAP16[(($length142)>>1)]=$conv140;__label__=43;break $if_then128$$if_else145$58;}
66958 else if(__label__==41){var $std_length146=(($122+44)&4294967295);var $131=HEAP32[(($std_length146)>>2)];var $cmp147=((($131))|0)>0;if(!($cmp147)){__label__=43;break $if_then128$$if_else145$58;}
66959 var $132=$fmt_params_addr;var $std_length149=(($132+44)&4294967295);var $133=HEAP32[(($std_length149)>>2)];var $134=$length1;var $sub150=((($133)-($134))&4294967295);var $135=HEAP32[((_seq_len_adjust)>>2)];var $add151=((($135)+($sub150))&4294967295);HEAP32[((_seq_len_adjust)>>2)]=$add151;__lastLabel__=42;__label__=44;break $if_then128$$if_else145$58;}}while(0);if(__label__==43){var $_pr=HEAP32[((_seq_len_adjust)>>2)];__lastLabel__=43;;}
66960 var $136=__lastLabel__==43?$_pr:($add151);var $cmp154=((($136))|0)!=0;if(!($cmp154)){__label__=47;break $if_then95$$if_end175$45;}
66961 var $137=$length1;var $138=HEAP32[((_seq_len_adjust)>>2)];var $add156=((($138)+($137))&4294967295);var $mul157=((($add156)*256)&4294967295);var $139=$length1;var $div158=((((($mul157))|0)/((($139))|0))|0);$length_factor=$div158;$ix=0;var $140=$ix;var $141=$nf1;var $cmp1601=((($140))|0)<((($141))|0);if(!($cmp1601)){__label__=47;break $if_then95$$if_end175$45;}
66962 while(1){var $142=$ix;var $143=$frames;var $arrayidx162=(($143+8*$142)&4294967295);var $length163=(($arrayidx162)&4294967295);var $144=HEAP16[(($length163)>>1)];var $conv164=(tempInt=(($144)),(tempInt>=32768?tempInt-65536:tempInt));var $145=$length_factor;var $mul165=((($conv164)*($145))&4294967295);var $div166=((((($mul165))|0)/256)|0);var $conv167=((($div166))&65535);var $146=$ix;var $147=$frames;var $arrayidx168=(($147+8*$146)&4294967295);var $length169=(($arrayidx168)&4294967295);HEAP16[(($length169)>>1)]=$conv167;var $148=$ix;var $inc171=((($148)+1)&4294967295);$ix=$inc171;var $149=$ix;var $150=$nf1;var $cmp160=((($149))|0)<((($150))|0);if($cmp160){__label__=46;continue;}else{__label__=47;break $if_then95$$if_end175$45;}}}}}while(0);var $151=HEAP32[(($nf)>>2)];var $152=$n_frames_addr;HEAP32[(($152)>>2)]=$151;var $153=$frames;STACKTOP=__stackBase__;return $153;return null;}
66963 function __Z11GetEnvelopei($index){;var __label__;var $retval;var $index_addr;$index_addr=$index;var $0=$index_addr;var $cmp=((($0))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
66964 if(__label__==1){var $1=HEAP32[((__impure_ptr)>>2)];var $_stderr=(($1+12)&4294967295);var $2=HEAP32[(($_stderr)>>2)];var $3=_fwrite(((__str5416)&4294967295),20,1,$2);var $4=HEAP32[((((_envelope_data)&4294967295))>>2)];$retval=$4;;}
66965 else if(__label__==2){var $5=$index_addr;var $6=HEAP32[((_phondata_ptr)>>2)];var $arrayidx=(($6+$5)&4294967295);$retval=$arrayidx;;}
66966 var $7=$retval;;return $7;return null;}
66967 function __Z18SelectPhonemeTablei($number){;var __label__;var $number_addr;$number_addr=$number;HEAP32[((_n_phoneme_tab)>>2)]=0;var $0=$number_addr;__ZL17SetUpPhonemeTableii($0,0);var $1=HEAP32[((_n_phoneme_tab)>>2)];var $inc=((($1)+1)&4294967295);HEAP32[((_n_phoneme_tab)>>2)]=$inc;var $2=$number_addr;HEAP32[((_current_phoneme_table)>>2)]=$2;;return;return;}
66968 function __ZL17SetUpPhonemeTableii($number,$recursing){;var __label__;var $number_addr;var $recursing_addr;var $ix;var $includes;var $ph_code;var $phtab;$number_addr=$number;$recursing_addr=$recursing;var $0=$recursing_addr;var $cmp=((($0))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
66969 if(__label__==1){var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=((_phoneme_tab_flags)&4294967295);$stop$=$dest$+256;$value4$=0;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=0;}
66970 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
66971 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=0;};;}
66972 var $1=$number_addr;var $arrayidx=((_phoneme_tab_list+$1*48)&4294967295);var $includes1=(($arrayidx+40)&4294967295);var $2=HEAP32[(($includes1)>>2)];$includes=$2;var $cmp2=((($2))|0)>0;if($cmp2){__label__=3;;}else{__label__=4;;}
66973 if(__label__==3){var $3=$includes;var $sub=((($3)-1)&4294967295);__ZL17SetUpPhonemeTableii($sub,1);;}
66974 var $4=$number_addr;var $arrayidx5=((_phoneme_tab_list+$4*48)&4294967295);var $phoneme_tab_ptr=(($arrayidx5+32)&4294967295);var $5=HEAP32[(($phoneme_tab_ptr)>>2)];$phtab=$5;$ix=0;var $6=$ix;var $7=$number_addr;var $arrayidx61=((_phoneme_tab_list+$7*48)&4294967295);var $n_phonemes2=(($arrayidx61+36)&4294967295);var $8=HEAP32[(($n_phonemes2)>>2)];var $cmp73=((($6))|0)<((($8))|0);if($cmp73){__label__=5;;}else{__label__=10;;}
66975 $for_body$$for_end$8:do{if(__label__==5){while(1){var $9=$ix;var $10=$phtab;var $arrayidx8=(($10+16*$9)&4294967295);var $code=(($arrayidx8+10)&4294967295);var $11=HEAPU8[($code)];var $conv=((($11))&255);$ph_code=$conv;var $12=$ix;var $13=$phtab;var $arrayidx9=(($13+16*$12)&4294967295);var $14=$ph_code;var $arrayidx10=((_phoneme_tab+$14*4)&4294967295);HEAP32[(($arrayidx10)>>2)]=$arrayidx9;var $15=$ph_code;var $16=HEAP32[((_n_phoneme_tab)>>2)];var $cmp11=((($15))|0)>((($16))|0);if($cmp11){__label__=6;;}else{__label__=7;;}
66976 if(__label__==6){var $17=$ph_code;HEAP32[((_n_phoneme_tab)>>2)]=$17;;}
66977 var $18=$recursing_addr;var $cmp14=((($18))|0)==0;if($cmp14){__label__=8;;}else{__label__=9;;}
66978 if(__label__==8){var $19=$ph_code;var $arrayidx16=((_phoneme_tab_flags+$19)&4294967295);var $20=HEAPU8[($arrayidx16)];var $conv17=((($20))&255);var $or=($conv17)|1;var $conv18=((($or))&255);HEAP8[($arrayidx16)]=$conv18;;}
66979 var $21=$ix;var $inc=((($21)+1)&4294967295);$ix=$inc;var $22=$ix;var $23=$number_addr;var $arrayidx6=((_phoneme_tab_list+$23*48)&4294967295);var $n_phonemes=(($arrayidx6+36)&4294967295);var $24=HEAP32[(($n_phonemes)>>2)];var $cmp7=((($22))|0)<((($24))|0);if($cmp7){__label__=5;continue;}else{__label__=10;break $for_body$$for_end$8;}}}}while(0);;return;return;}
66980 function __Z18LookupPhonemeTablePKc($name){;var __label__;var $retval;var $name_addr;var $ix;$name_addr=$name;$ix=0;;while(1){var $0=$ix;var $1=HEAP32[((_n_phoneme_tables)>>2)];var $cmp=((($0))|0)<((($1))|0);if(!($cmp)){__label__=5;break;}
66981 var $2=$name_addr;var $3=$ix;var $arrayidx=((_phoneme_tab_list+$3*48)&4294967295);var $name1=(($arrayidx)&4294967295);var $arraydecay=(($name1)&4294967295);var $call=_strcmp($2,$arraydecay);var $cmp2=((($call))|0)==0;var $4=$ix;if($cmp2){__label__=3;break;}
66982 var $inc=((($4)+1)&4294967295);$ix=$inc;__label__=1;continue;}
66983 if(__label__==3){HEAP32[((_phoneme_tab_number)>>2)]=$4;;}
66984 var $5=$ix;var $6=HEAP32[((_n_phoneme_tables)>>2)];var $cmp3=((($5))|0)==((($6))|0);if($cmp3){__label__=6;;}else{__label__=7;;}
66985 if(__label__==6){$retval=-1;;}
66986 else if(__label__==7){var $7=$ix;$retval=$7;;}
66987 var $8=$retval;;return $8;return null;}
66988 function __Z22SelectPhonemeTableNamePKc($name){;var __label__;var $retval;var $name_addr;var $ix;$name_addr=$name;var $0=$name_addr;var $call=__Z18LookupPhonemeTablePKc($0);$ix=$call;var $cmp=((($call))|0)==-1;if($cmp){__label__=1;;}else{__label__=2;;}
66989 if(__label__==1){$retval=-1;;}
66990 else if(__label__==2){var $1=$ix;__Z18SelectPhonemeTablei($1);var $2=$ix;$retval=$2;;}
66991 var $3=$retval;;return $3;return null;}
66992 function __Z10LoadConfigv(){var __stackBase__=STACKTOP;STACKTOP+=364;_memset(__stackBase__,0,364);var __label__;var $buf=__stackBase__;var $f;var $ix;var $c1=__stackBase__+160;var $p;var $string=__stackBase__+164;HEAP32[((_logging_type)>>2)]=0;$ix=0;;$for_body$2:while(1){var $0=$ix;var $arrayidx=((_soundicon_tab+$0*16)&4294967295);var $filename=(($arrayidx+12)&4294967295);HEAP32[(($filename)>>2)]=0;var $1=$ix;var $arrayidx1=((_soundicon_tab+$1*16)&4294967295);var $data=(($arrayidx1+8)&4294967295);HEAP32[(($data)>>2)]=0;var $2=$ix;var $inc=((($2)+1)&4294967295);$ix=$inc;var $cmp=((($inc))|0)<4;if($cmp){__label__=1;continue $for_body$2;}else{__label__=2;break $for_body$2;}}
66993 var $arraydecay=(($buf)&4294967295);var $call=_sprintf($arraydecay,((__str74726)&4294967295),allocate([((_path_home)&4294967295),0,0,0,47,0,0,0,((__str7418)&4294967295),0,0,0],["i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0],ALLOC_STACK));var $arraydecay2=(($buf)&4294967295);var $call3=_fopen($arraydecay2,((__str51703)&4294967295));$f=$call3;var $cmp4=((($call3))|0)==0;if($cmp4){__label__=17;;}else{__label__=3;;}
66994 $while_end$$while_cond_preheader$5:do{if(__label__==3){var $arraydecay5=(($buf)&4294967295);var $3=$f;var $call61=_fgets($arraydecay5,160,$3);var $cmp72=((($call61))|0)!=0;if(!($cmp72)){__label__=17;break $while_end$$while_cond_preheader$5;}
66995 var $arrayidx8=(($buf)&4294967295);var $arraydecay12=(($buf)&4294967295);var $arrayidx16=(($buf+4)&4294967295);var $arraydecay17=(($string)&4294967295);var $arraydecay21=(($string)&4294967295);var $arraydecay24=(($buf)&4294967295);var $arrayidx28=(($buf+5)&4294967295);var $arraydecay30=(($buf)&4294967295);var $arrayidx34=(($buf+10)&4294967295);var $arraydecay37=(($buf)&4294967295);var $arrayidx41=(($buf+10)&4294967295);var $arraydecay42=(($string)&4294967295);var $arraydecay48=(($string)&4294967295);var $arraydecay51=(($string)&4294967295);;$while_body$8:while(1){var $4=HEAP8[($arrayidx8)];var $conv=(tempInt=(($4)),(tempInt>=128?tempInt-256:tempInt));var $cmp9=((($conv))|0)==47;if($cmp9){__label__=6;;}else{__label__=7;;}
66996 $while_cond_backedge$$if_end11$10:do{if(__label__==7){var $call13=_memcmp($arraydecay12,((__str9420)&4294967295),3);var $cmp14=((($call13))|0)==0;if($cmp14){__label__=8;;}else{__label__=10;;}
66997 if(__label__==8){var $call18=_sscanf($arrayidx16,((__str10421)&4294967295),allocate([_logging_type,0,0,0,$arraydecay17,0,0,0],["i32*",0,0,0,"i8*",0,0,0],ALLOC_STACK));var $cmp19=((($call18))|0)==2;if(!($cmp19)){__label__=6;break $while_cond_backedge$$if_end11$10;}
66998 var $call22=_fopen($arraydecay21,((__str11422)&4294967295));HEAP32[((_f_logespeak)>>2)]=$call22;;}
66999 else if(__label__==10){var $call25=_memcmp($arraydecay24,((__str27677)&4294967295),4);var $cmp26=((($call25))|0)==0;if($cmp26){__label__=11;;}else{__label__=12;;}
67000 if(__label__==11){__Z14ReadTonePointsPcPi($arrayidx28,((_tone_points)&4294967295));;}
67001 else if(__label__==12){var $call31=_memcmp($arraydecay30,((__str13424)&4294967295),9);var $cmp32=((($call31))|0)==0;if($cmp32){__label__=13;;}else{__label__=14;;}
67002 if(__label__==13){var $call35=_sscanf($arrayidx34,((__str63715)&4294967295),allocate([_option_device_number,0,0,0],["i32*",0,0,0],ALLOC_STACK));;}
67003 else if(__label__==14){var $call38=_memcmp($arraydecay37,((__str15426)&4294967295),9);var $cmp39=((($call38))|0)==0;if(!($cmp39)){__label__=6;break $while_cond_backedge$$if_end11$10;}
67004 var $call43=_sscanf($arrayidx41,((__str16427)&4294967295),allocate([$c1,0,0,0,$arraydecay42,0,0,0],["i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));$ix=$call43;var $6=$ix;var $cmp44=((($6))|0)==2;if(!($cmp44)){__label__=6;break $while_cond_backedge$$if_end11$10;}
67005 var $7=HEAP8[($c1)];var $conv46=(tempInt=(($7)),(tempInt>=128?tempInt-256:tempInt));var $8=HEAP32[((_n_soundicon_tab)>>2)];var $arrayidx47=((_soundicon_tab+$8*16)&4294967295);var $name=(($arrayidx47)&4294967295);HEAP32[(($name)>>2)]=$conv46;var $call49=_strlen($arraydecay48);var $add=((($call49)+1)&4294967295);var $call50=__Z5Alloci($add);$p=$call50;var $9=$p;var $call52=_strcpy($9,$arraydecay51);var $10=$p;var $11=HEAP32[((_n_soundicon_tab)>>2)];var $arrayidx53=((_soundicon_tab+$11*16)&4294967295);var $filename54=(($arrayidx53+12)&4294967295);HEAP32[(($filename54)>>2)]=$10;var $12=HEAP32[((_n_soundicon_tab)>>2)];var $inc55=((($12)+1)&4294967295);HEAP32[((_n_soundicon_tab)>>2)]=$inc55;var $arrayidx56=((_soundicon_tab+$12*16)&4294967295);var $length=(($arrayidx56+4)&4294967295);HEAP32[(($length)>>2)]=0;;}}}}}while(0);var $5=$f;var $call6=_fgets($arraydecay5,160,$5);var $cmp7=((($call6))|0)!=0;if($cmp7){__label__=5;continue $while_body$8;}else{__label__=17;break $while_end$$while_cond_preheader$5;}}}}while(0);STACKTOP=__stackBase__;return;return;}
67006 function __Z16InterpretPhonemeP10TranslatoriP12PHONEME_LISTP12PHONEME_DATA($tr,$control,$plist,$phdata){var __stackBase__=STACKTOP;STACKTOP+=44;_memset(__stackBase__,0,44);var __label__;var __lastLabel__=null;var $tr_addr;var $control_addr;var $plist_addr;var $phdata_addr;var $ph;var $prog=__stackBase__;var $instn;var $instn2;var $or_flag;var $truth;var $data;var $end_flag;var $ix;var $param_sc;var $n_return;var $return_addr=__stackBase__+4;$tr_addr=$tr;$control_addr=$control;$plist_addr=$plist;$phdata_addr=$phdata;$n_return=0;var $0=$plist_addr;var $ph1=(($0+8)&4294967295);var $1=HEAP32[(($ph1)>>2)];$ph=$1;var $2=$phdata_addr;var $3=$2;var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=$3;$stop$=$dest$+152;$value4$=0;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=0;}
67007 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
67008 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=0;};var $4=$ph;var $std_length=(($4+14)&4294967295);var $5=HEAPU8[($std_length)];var $conv=((($5))&255);var $6=$phdata_addr;var $pd_param=(($6+4)&4294967295);var $arrayidx=(($pd_param+40)&4294967295);HEAP32[(($arrayidx)>>2)]=$conv;var $7=$ph;var $length_mod=(($7+15)&4294967295);var $8=HEAPU8[($length_mod)];var $conv2=((($8))&255);var $9=$phdata_addr;var $pd_param3=(($9+4)&4294967295);var $arrayidx4=(($pd_param3+36)&4294967295);HEAP32[(($arrayidx4)>>2)]=$conv2;var $10=$ph;var $program=(($10+8)&4294967295);var $11=HEAPU16[(($program)>>1)];var $conv5=((($11))&65535);var $cmp=((($conv5))|0)==0;if($cmp){__label__=69;;}else{__label__=1;;}
67009 $for_end237$$if_end$2:do{if(__label__==1){$end_flag=0;var $12=$ph;var $program6=(($12+8)&4294967295);var $13=HEAPU16[(($program6)>>1)];var $idxprom=((($13))&65535);var $14=HEAP32[((_phoneme_index)>>2)];var $arrayidx7=(($14+2*$idxprom)&4294967295);HEAP32[(($prog)>>2)]=$arrayidx7;var $15=$end_flag;var $cmp89=((($15))|0)!=1;if(!($cmp89)){__label__=69;break $for_end237$$if_end$2;}
67010 $for_body$4:while(1){var $16=HEAP32[(($prog)>>2)];var $17=HEAP16[(($16)>>1)];$instn=$17;var $18=$instn;var $conv9=((($18))&65535);var $shr=($conv9)>>8;var $and=($shr)&15;$instn2=$and;$or_flag=0;var $19=$instn;var $conv10=((($19))&65535);var $shr11=($conv10)>>12;if($shr11==0){__label__=3;;}
67011 else if($shr11==1){__label__=21;;}
67012 else if($shr11==2){__label__=25;;}
67013 else if($shr11==3){__label__=25;;}
67014 else if($shr11==6){__label__=40;;}
67015 else if($shr11==9){__label__=44;;}
67016 else if($shr11==10){__label__=49;;}
67017 else if($shr11==11){__label__=53;;}
67018 else if($shr11==12){__label__=53;;}
67019 else if($shr11==13){__label__=53;;}
67020 else if($shr11==14){__label__=53;;}
67021 else if($shr11==15){__label__=53;;}
67022 else{__label__=61;;}
67023 $sw_default221$$sw_bb$$sw_bb70$$sw_bb84$$sw_bb129$$sw_bb138$$sw_bb155$$sw_bb178$6:do{if(__label__==61){var $153=$ph;var $154=$instn;var $conv222=((($154))&65535);__ZL12InvalidInstnP11PHONEME_TABi($153,$conv222);;}
67024 else if(__label__==3){var $20=$instn;var $conv12=((($20))&65535);var $and13=($conv12)&255;$data=$and13;var $21=$instn2;var $cmp14=((($21))|0)==0;if($cmp14){__label__=4;;}else{__label__=7;;}
67025 if(__label__==4){var $22=$data;if($22==1){__label__=5;;}
67026 else if($22==2){__label__=62;break $sw_default221$$sw_bb$$sw_bb70$$sw_bb84$$sw_bb129$$sw_bb138$$sw_bb155$$sw_bb178$6;}
67027 else{__label__=6;;}
67028 if(__label__==6){var $23=$ph;var $24=$instn;var $conv17=((($24))&65535);__ZL12InvalidInstnP11PHONEME_TABi($23,$conv17);;}
67029 else if(__label__==5){$end_flag=1;;}}
67030 else if(__label__==7){var $25=$instn2;var $cmp18=((($25))|0)==5;if($cmp18){__label__=8;;}else{__label__=10;;}
67031 if(__label__==8){var $26=$plist_addr;var $arrayidx20=(($26+24)&4294967295);var $phcode=(($arrayidx20)&4294967295);var $27=HEAPU8[($phcode)];var $idxprom21=((($27))&255);var $arrayidx22=((_phoneme_tab+$idxprom21*4)&4294967295);var $28=HEAP32[(($arrayidx22)>>2)];var $type=(($28+11)&4294967295);var $29=HEAPU8[($type)];var $conv23=((($29))&255);var $cmp24=((($conv23))|0)==2;if(!($cmp24)){__label__=62;break $sw_default221$$sw_bb$$sw_bb70$$sw_bb84$$sw_bb129$$sw_bb138$$sw_bb155$$sw_bb178$6;}
67032 var $30=$data;var $31=$phdata_addr;var $pd_param26=(($31+4)&4294967295);var $arrayidx27=(($pd_param26+16)&4294967295);HEAP32[(($arrayidx27)>>2)]=$30;;}
67033 else if(__label__==10){var $32=$instn2;var $cmp30=((($32))|0)==13;if($cmp30){__label__=11;;}else{__label__=14;;}
67034 if(__label__==11){$ix=0;var $33=$ix;var $34=$data;var $cmp333=((($33))|0)<((($34))|0);var $35=$ix;var $cmp344=((($35))|0)<16;var $or_cond15=($cmp333)&($cmp344);if($or_cond15){__label__=12;;}else{__label__=13;;}
67035 $for_body35$$for_end$21:do{if(__label__==12){while(1){var $36=HEAP32[(($prog)>>2)];var $incdec_ptr=(($36+2)&4294967295);HEAP32[(($prog)>>2)]=$incdec_ptr;var $37=HEAP32[(($prog)>>2)];var $arrayidx36=(($37)&4294967295);var $38=HEAPU16[(($arrayidx36)>>1)];var $conv37=((($38))&65535);var $shr38=($conv37)>>8;var $conv39=((($shr38))&255);var $39=$ix;var $40=$phdata_addr;var $ipa_string=(($40+132)&4294967295);var $arrayidx40=(($ipa_string+$39)&4294967295);HEAP8[($arrayidx40)]=$conv39;var $41=HEAP32[(($prog)>>2)];var $arrayidx41=(($41)&4294967295);var $42=HEAPU16[(($arrayidx41)>>1)];var $conv42=((($42))&65535);var $and43=($conv42)&255;var $conv44=((($and43))&255);var $43=$ix;var $add=((($43)+1)&4294967295);var $44=$phdata_addr;var $ipa_string45=(($44+132)&4294967295);var $arrayidx46=(($ipa_string45+$add)&4294967295);HEAP8[($arrayidx46)]=$conv44;var $45=$ix;var $add47=((($45)+2)&4294967295);$ix=$add47;var $46=$ix;var $47=$data;var $cmp33=((($46))|0)<((($47))|0);var $48=$ix;var $cmp34=((($48))|0)<16;var $or_cond1=($cmp33)&($cmp34);if($or_cond1){__label__=12;continue;}else{__label__=13;break $for_body35$$for_end$21;}}}}while(0);var $49=$ix;var $50=$phdata_addr;var $ipa_string48=(($50+132)&4294967295);var $arrayidx49=(($ipa_string48+$49)&4294967295);HEAP8[($arrayidx49)]=0;;}
67036 else if(__label__==14){var $51=$instn2;var $cmp51=((($51))|0)<16;if($cmp51){__label__=15;;}else{__label__=20;;}
67037 if(__label__==15){var $52=$instn2;var $cmp53=((($52))|0)==12;if($cmp53){__label__=16;;}else{__label__=17;;}
67038 if(__label__==16){var $53=$data;var $54=$phdata_addr;var $pd_param55=(($54+4)&4294967295);var $arrayidx56=(($pd_param55+4)&4294967295);HEAP32[(($arrayidx56)>>2)]=$53;;}
67039 var $55=$data;var $56=$instn2;var $57=$phdata_addr;var $pd_param58=(($57+4)&4294967295);var $arrayidx59=(($pd_param58+$56*4)&4294967295);HEAP32[(($arrayidx59)>>2)]=$55;var $58=$instn2;var $cmp60=((($58))|0)==1;if(!($cmp60)){__label__=62;break $sw_default221$$sw_bb$$sw_bb70$$sw_bb84$$sw_bb129$$sw_bb138$$sw_bb155$$sw_bb178$6;}
67040 var $59=$control_addr;var $and61=($59)&256;var $tobool=((($and61))|0)!=0;if(!($tobool)){__label__=62;break $sw_default221$$sw_bb$$sw_bb70$$sw_bb84$$sw_bb129$$sw_bb138$$sw_bb155$$sw_bb178$6;}
67041 $end_flag=1;;}
67042 else if(__label__==20){var $60=$ph;var $61=$instn;var $conv65=((($61))&65535);__ZL12InvalidInstnP11PHONEME_TABi($60,$conv65);;}}}}}
67043 else if(__label__==21){var $62=$tr_addr;var $cmp71=((($62))|0)==0;if($cmp71){__label__=62;break $sw_default221$$sw_bb$$sw_bb70$$sw_bb84$$sw_bb129$$sw_bb138$$sw_bb155$$sw_bb178$6;}
67044 var $63=$instn2;var $cmp74=((($63))|0)<8;if(!($cmp74)){__label__=62;break $sw_default221$$sw_bb$$sw_bb70$$sw_bb84$$sw_bb129$$sw_bb138$$sw_bb155$$sw_bb178$6;}
67045 var $64=$tr_addr;var $65=$plist_addr;var $66=$instn2;var $and76=($66)&7;var $call=__ZL15StressConditionP10TranslatorP12PHONEME_LISTii($64,$65,$and76,1);if(!($call)){__label__=62;break $sw_default221$$sw_bb$$sw_bb70$$sw_bb84$$sw_bb129$$sw_bb138$$sw_bb155$$sw_bb178$6;}
67046 var $67=$instn;var $conv78=((($67))&65535);var $and79=($conv78)&255;var $68=$phdata_addr;var $pd_param80=(($68+4)&4294967295);var $arrayidx81=(($pd_param80+4)&4294967295);HEAP32[(($arrayidx81)>>2)]=$and79;$end_flag=1;;}
67047 else if(__label__==25){$or_flag=0;$truth=1;var $69=$instn;var $conv856=((($69))&65535);var $and867=($conv856)&57344;var $cmp878=((($and867))|0)==8192;if($cmp878){__label__=26;;}else{__label__=34;;}
67048 $while_body$$while_end$39:do{if(__label__==26){while(1){var $70=$or_flag;var $tobool88=((($70))|0)!=0;var $71=$truth;var $tobool90=((($71))&1);if($tobool88){__label__=27;;}else{__label__=30;;}
67049 if(__label__==27){if($tobool90){__lastLabel__=27;__label__=29;;}else{__lastLabel__=27;__label__=28;;}
67050 if(__label__==28){var $72=$tr_addr;var $73=$control_addr;var $74=$plist_addr;var $75=$instn;var $conv91=((($75))&65535);var $and92=($conv91)&4095;var $call93=__ZL18InterpretConditionP10TranslatoriP12PHONEME_LISTi($72,$73,$74,$and92);__lastLabel__=28;;}
67051 var $76=__lastLabel__==27?1:($call93);var $frombool=((($76))&1);$truth=$frombool;;}
67052 else if(__label__==30){if($tobool90){__lastLabel__=30;__label__=31;;}else{__lastLabel__=30;__label__=32;;}
67053 if(__label__==31){var $77=$tr_addr;var $78=$control_addr;var $79=$plist_addr;var $80=$instn;var $conv97=((($80))&65535);var $and98=($conv97)&4095;var $call99=__ZL18InterpretConditionP10TranslatoriP12PHONEME_LISTi($77,$78,$79,$and98);__lastLabel__=31;;}
67054 var $81=__lastLabel__==30?0:($call99);var $frombool101=((($81))&1);$truth=$frombool101;;}
67055 var $82=$instn;var $conv103=((($82))&65535);var $and104=($conv103)&4096;$or_flag=$and104;var $83=HEAP32[(($prog)>>2)];var $incdec_ptr105=(($83+2)&4294967295);HEAP32[(($prog)>>2)]=$incdec_ptr105;var $84=HEAP16[(($incdec_ptr105)>>1)];$instn=$84;var $85=$instn;var $conv85=((($85))&65535);var $and86=($conv85)&57344;var $cmp87=((($and86))|0)==8192;if($cmp87){__label__=26;continue;}else{__label__=34;break $while_body$$while_end$39;}}}}while(0);var $86=$truth;var $tobool106=((($86))&1);var $conv107=((($tobool106))&1);var $cmp108=((($conv107))|0)==0;if($cmp108){__label__=35;;}else{__label__=39;;}
67056 $if_then109$$if_end127$53:do{if(__label__==35){var $87=$instn;var $conv110=((($87))&65535);var $and111=($conv110)&63488;var $cmp112=((($and111))|0)==26624;if($cmp112){__label__=36;;}else{__label__=37;;}
67057 if(__label__==36){var $88=$instn;var $conv114=((($88))&65535);var $and115=($conv114)&255;var $89=HEAP32[(($prog)>>2)];var $add_ptr=(($89+2*$and115)&4294967295);HEAP32[(($prog)>>2)]=$add_ptr;;}
67058 else if(__label__==37){var $90=HEAP32[(($prog)>>2)];var $call117=__ZL13NumInstnWordsPt($90);var $91=HEAP32[(($prog)>>2)];var $add_ptr118=(($91+2*$call117)&4294967295);HEAP32[(($prog)>>2)]=$add_ptr118;var $92=HEAP32[(($prog)>>2)];var $arrayidx119=(($92)&4294967295);var $93=HEAPU16[(($arrayidx119)>>1)];var $conv120=((($93))&65535);var $and121=($conv120)&65024;var $cmp122=((($and121))|0)==24576;if(!($cmp122)){__label__=39;break $if_then109$$if_end127$53;}
67059 var $94=HEAP32[(($prog)>>2)];var $incdec_ptr124=(($94+2)&4294967295);HEAP32[(($prog)>>2)]=$incdec_ptr124;;}}}while(0);var $95=HEAP32[(($prog)>>2)];var $incdec_ptr128=(($95+-2)&4294967295);HEAP32[(($prog)>>2)]=$incdec_ptr128;;}
67060 else if(__label__==40){var $96=$instn2;var $shr130=($96)>>1;if($shr130==0){__label__=41;;}
67061 else if($shr130==6){__label__=43;;}
67062 else if($shr130==5){__label__=42;;}
67063 else{__label__=62;break $sw_default221$$sw_bb$$sw_bb70$$sw_bb84$$sw_bb129$$sw_bb138$$sw_bb155$$sw_bb178$6;}
67064 if(__label__==41){var $97=$instn;var $conv132=((($97))&65535);var $and133=($conv132)&255;var $sub=((($and133)-1)&4294967295);var $98=HEAP32[(($prog)>>2)];var $add_ptr134=(($98+2*$sub)&4294967295);HEAP32[(($prog)>>2)]=$add_ptr134;;}
67065 else if(__label__==43){var $101=$plist_addr;var $102=$phdata_addr;__ZL15SwitchVowelTypeP12PHONEME_LISTP12PHONEME_DATAPPti($101,$102,$prog,3);;}
67066 else if(__label__==42){var $99=$plist_addr;var $100=$phdata_addr;__ZL15SwitchVowelTypeP12PHONEME_LISTP12PHONEME_DATAPPti($99,$100,$prog,2);;}}
67067 else if(__label__==44){var $103=$instn;var $conv139=((($103))&65535);var $and140=($conv139)&15;var $shl=((($and140)*65536)&4294967295);var $104=HEAP32[(($prog)>>2)];var $arrayidx141=(($104+2)&4294967295);var $105=HEAPU16[(($arrayidx141)>>1)];var $conv142=((($105))&65535);var $add143=((($shl)+($conv142))&4294967295);$data=$add143;var $106=HEAP32[(($prog)>>2)];var $incdec_ptr144=(($106+2)&4294967295);HEAP32[(($prog)>>2)]=$incdec_ptr144;var $107=$instn2;if($107==1){__label__=45;;}
67068 else if($107==2){__label__=47;;}
67069 else if($107==3){__label__=48;;}
67070 else{__label__=62;break $sw_default221$$sw_bb$$sw_bb70$$sw_bb84$$sw_bb129$$sw_bb138$$sw_bb155$$sw_bb178$6;}
67071 if(__label__==45){var $108=$n_return;var $cmp146=((($108))|0)<10;if(!($cmp146)){__label__=62;break $sw_default221$$sw_bb$$sw_bb70$$sw_bb84$$sw_bb129$$sw_bb138$$sw_bb155$$sw_bb178$6;}
67072 var $109=HEAP32[(($prog)>>2)];var $110=$n_return;var $inc=((($110)+1)&4294967295);$n_return=$inc;var $arrayidx148=(($return_addr+$110*4)&4294967295);HEAP32[(($arrayidx148)>>2)]=$109;var $111=$data;var $112=HEAP32[((_phoneme_index)>>2)];var $arrayidx149=(($112+2*$111)&4294967295);var $add_ptr150=(($arrayidx149+-2)&4294967295);HEAP32[(($prog)>>2)]=$add_ptr150;;}
67073 else if(__label__==47){var $113=$data;var $114=$phdata_addr;var $pitch_env=(($114+124)&4294967295);HEAP32[(($pitch_env)>>2)]=$113;;}
67074 else if(__label__==48){var $115=$data;var $116=$phdata_addr;var $amp_env=(($116+128)&4294967295);HEAP32[(($amp_env)>>2)]=$115;;}}
67075 else if(__label__==49){var $117=$instn2;var $cmp156=((($117))|0)==1;if($cmp156){__label__=50;;}else{__label__=51;;}
67076 if(__label__==50){$ix=0;;}
67077 else if(__label__==51){$ix=2;;}
67078 var $118=HEAP32[(($prog)>>2)];var $arrayidx160=(($118)&4294967295);var $119=HEAPU16[(($arrayidx160)>>1)];var $conv161=((($119))&65535);var $and162=($conv161)&255;var $shl163=((($and162)*65536)&4294967295);var $120=HEAP32[(($prog)>>2)];var $arrayidx164=(($120+2)&4294967295);var $121=HEAPU16[(($arrayidx164)>>1)];var $conv165=((($121))&65535);var $add166=((($shl163)+($conv165))&4294967295);var $122=$ix;var $123=$phdata_addr;var $vowel_transition=(($123+108)&4294967295);var $arrayidx167=(($vowel_transition+$122*4)&4294967295);HEAP32[(($arrayidx167)>>2)]=$add166;var $124=HEAP32[(($prog)>>2)];var $arrayidx168=(($124+4)&4294967295);var $125=HEAPU16[(($arrayidx168)>>1)];var $conv169=((($125))&65535);var $shl170=((($conv169)*65536)&4294967295);var $126=HEAP32[(($prog)>>2)];var $arrayidx171=(($126+6)&4294967295);var $127=HEAPU16[(($arrayidx171)>>1)];var $conv172=((($127))&65535);var $add173=((($conv172)+($shl170))&4294967295);var $128=$ix;var $add174=((($128)+1)&4294967295);var $129=$phdata_addr;var $vowel_transition175=(($129+108)&4294967295);var $arrayidx176=(($vowel_transition175+$add174*4)&4294967295);HEAP32[(($arrayidx176)>>2)]=$add173;var $130=HEAP32[(($prog)>>2)];var $add_ptr177=(($130+6)&4294967295);HEAP32[(($prog)>>2)]=$add_ptr177;;}
67079 else if(__label__==53){var $131=$instn;var $conv179=((($131))&65535);var $shr180=($conv179)>>12;var $sub181=((($shr180)-11)&4294967295);$instn2=$sub181;var $132=$instn;var $conv182=((($132))&65535);var $and183=($conv182)&15;var $shl184=((($and183)*262144)&4294967295);var $133=HEAP32[(($prog)>>2)];var $arrayidx185=(($133+2)&4294967295);var $134=HEAPU16[(($arrayidx185)>>1)];var $conv186=((($134))&65535);var $shl187=((($conv186)*4)&4294967295);var $add188=((($shl187)+($shl184))&4294967295);var $135=$instn2;var $136=$phdata_addr;var $sound_addr=(($136+68)&4294967295);var $arrayidx189=(($sound_addr+$135*4)&4294967295);HEAP32[(($arrayidx189)>>2)]=$add188;var $137=$instn;var $conv190=((($137))&65535);var $shr191=($conv190)>>4;var $and192=($shr191)&255;var $138=$instn2;var $139=$phdata_addr;var $sound_param=(($139+88)&4294967295);var $arrayidx193=(($sound_param+$138*4)&4294967295);HEAP32[(($arrayidx193)>>2)]=$and192;var $conv194=((($and192))&255);$param_sc=$conv194;var $140=HEAP32[(($prog)>>2)];var $incdec_ptr195=(($140+2)&4294967295);HEAP32[(($prog)>>2)]=$incdec_ptr195;var $141=HEAP32[(($prog)>>2)];var $arrayidx196=(($141+2)&4294967295);var $142=HEAPU16[(($arrayidx196)>>1)];var $conv197=((($142))&65535);var $cmp198=((($conv197))|0)!=2;if(!($cmp198)){__label__=62;break $sw_default221$$sw_bb$$sw_bb70$$sw_bb84$$sw_bb129$$sw_bb138$$sw_bb155$$sw_bb178$6;}
67080 var $143=$instn2;var $cmp200=((($143))|0)<2;if($cmp200){__label__=55;;}else{__label__=57;;}
67081 $if_then201$$if_else208$78:do{if(__label__==55){$end_flag=1;var $144=HEAP32[(($prog)>>2)];var $arrayidx202=(($144+2)&4294967295);var $145=HEAPU16[(($arrayidx202)>>1)];var $conv203=((($145))&65535);var $shr204=($conv203)>>12;var $cmp205=((($shr204))|0)==15;if(!($cmp205)){__label__=59;break $if_then201$$if_else208$78;}
67082 $end_flag=2;;}
67083 else if(__label__==57){var $146=$instn2;var $cmp209=((($146))|0)==4;if(!($cmp209)){__label__=59;break $if_then201$$if_else208$78;}
67084 var $147=$end_flag;var $dec=((($147)-1)&4294967295);$end_flag=$dec;;}}while(0);var $148=$instn2;var $cmp213=((($148))|0)==2;var $149=$instn2;var $cmp214=((($149))|0)==3;var $or_cond=($cmp213)|($cmp214);if(!($or_cond)){__label__=62;break $sw_default221$$sw_bb$$sw_bb70$$sw_bb84$$sw_bb129$$sw_bb138$$sw_bb155$$sw_bb178$6;}
67085 var $150=$param_sc;var $conv216=(tempInt=(($150)),(tempInt>=128?tempInt-256:tempInt));var $151=$instn2;var $152=$phdata_addr;var $sound_param217=(($152+88)&4294967295);var $arrayidx218=(($sound_param217+$151*4)&4294967295);HEAP32[(($arrayidx218)>>2)]=$conv216;;}}while(0);var $155=$ph;var $phflags=(($155+4)&4294967295);var $156=HEAP32[(($phflags)>>2)];var $and224=($156)&4096;var $tobool225=((($and224))|0)!=0;if($tobool225){__label__=63;;}else{__label__=64;;}
67086 $if_end227_thread$$if_end227$86:do{if(__label__==63){$end_flag=1;;}
67087 else if(__label__==64){var $_pr=$end_flag;var $cmp228=((($_pr))|0)==1;if($cmp228){__label__=66;break $if_end227_thread$$if_end227$86;}
67088 var $157=HEAP32[(($prog)>>2)];var $incdec_ptr23611=(($157+2)&4294967295);HEAP32[(($prog)>>2)]=$incdec_ptr23611;__label__=2;continue $for_body$4;}}while(0);var $158=$n_return;var $cmp230=((($158))|0)>0;if($cmp230){__label__=67;;}else{__label__=68;;}
67089 if(__label__==67){$end_flag=0;var $159=$n_return;var $dec232=((($159)-1)&4294967295);$n_return=$dec232;var $arrayidx233=(($return_addr+$dec232*4)&4294967295);var $160=HEAP32[(($arrayidx233)>>2)];HEAP32[(($prog)>>2)]=$160;;}
67090 var $_pr10=$end_flag;var $161=HEAP32[(($prog)>>2)];var $incdec_ptr236=(($161+2)&4294967295);HEAP32[(($prog)>>2)]=$incdec_ptr236;var $cmp8=((($_pr10))|0)!=1;if($cmp8){__label__=2;continue $for_body$4;}else{__label__=69;break $for_end237$$if_end$2;}}}}while(0);STACKTOP=__stackBase__;return;return;}
67091 function __ZL12InvalidInstnP11PHONEME_TABi($ph,$instn){;var __label__;var $ph_addr;var $instn_addr;$ph_addr=$ph;$instn_addr=$instn;var $0=HEAP32[((__impure_ptr)>>2)];var $_stderr=(($0+12)&4294967295);var $1=HEAP32[(($_stderr)>>2)];var $2=$instn_addr;var $3=$ph_addr;var $mnemonic=(($3)&4294967295);var $4=HEAP32[(($mnemonic)>>2)];var $call=__Z12WordToStringj($4);var $call1=_fprintf($1,((__str17428)&4294967295),allocate([$2,0,0,0,((__ZZ12WordToStringjE3buf)&4294967295),0,0,0],["i32",0,0,0,"i8*",0,0,0],ALLOC_STACK));;return;return;}
67092 function __ZL15StressConditionP10TranslatorP12PHONEME_LISTii($tr,$plist,$condition,$control){;var __label__;var $retval;var $tr_addr;var $plist_addr;var $condition_addr;var $control_addr;var $stress_level;var $pl;$tr_addr=$tr;$plist_addr=$plist;$condition_addr=$condition;$control_addr=$control;var $0=$plist_addr;var $arrayidx=(($0)&4294967295);var $phcode=(($arrayidx)&4294967295);var $1=HEAPU8[($phcode)];var $idxprom=((($1))&255);var $arrayidx1=((_phoneme_tab+$idxprom*4)&4294967295);var $2=HEAP32[(($arrayidx1)>>2)];var $type=(($2+11)&4294967295);var $3=HEAPU8[($type)];var $conv=((($3))&255);var $cmp=((($conv))|0)==2;var $4=$plist_addr;if($cmp){__label__=1;;}else{__label__=2;;}
67093 $if_then$$if_else$2:do{if(__label__==1){$pl=$4;__label__=5;break $if_then$$if_else$2;}
67094 else if(__label__==2){var $arrayidx2=(($4+24)&4294967295);var $phcode3=(($arrayidx2)&4294967295);var $5=HEAPU8[($phcode3)];var $idxprom4=((($5))&255);var $arrayidx5=((_phoneme_tab+$idxprom4*4)&4294967295);var $6=HEAP32[(($arrayidx5)>>2)];var $type6=(($6+11)&4294967295);var $7=HEAPU8[($type6)];var $conv7=((($7))&255);var $cmp8=((($conv7))|0)==2;if($cmp8){__label__=3;;}else{__label__=4;;}
67095 if(__label__==3){var $8=$plist_addr;var $arrayidx10=(($8+24)&4294967295);$pl=$arrayidx10;__label__=5;break $if_then$$if_else$2;}
67096 else if(__label__==4){$retval=0;__label__=21;break $if_then$$if_else$2;}}}while(0);$if_end12$$return$8:do{if(__label__==5){var $9=$pl;var $stresslevel=(($9+1)&4294967295);var $10=HEAPU8[($stresslevel)];var $conv13=((($10))&255);var $and=($conv13)&15;$stress_level=$and;var $11=$tr_addr;var $cmp14=((($11))|0)!=0;if($cmp14){__label__=6;;}else{__label__=13;;}
67097 $if_then15$$if_end36$10:do{if(__label__==6){var $12=$control_addr;var $and16=($12)&1;var $tobool=((($and16))|0)!=0;if($tobool){__label__=7;;}else{__label__=10;;}
67098 $land_lhs_true$$if_end25$12:do{if(__label__==7){var $13=$plist_addr;var $synthflags=(($13+4)&4294967295);var $14=HEAPU16[(($synthflags)>>1)];var $conv17=((($14))&65535);var $and18=($conv17)&16;var $tobool19=((($and18))|0)!=0;if(!($tobool19)){__label__=10;break $land_lhs_true$$if_end25$12;}
67099 var $15=$tr_addr;var $langopts=(($15)&4294967295);var $param=(($langopts+24)&4294967295);var $arrayidx21=(($param+40)&4294967295);var $16=HEAP32[(($arrayidx21)>>2)];var $and22=($16)&1;var $cmp23=((($and22))|0)==0;if(!($cmp23)){__label__=10;break $land_lhs_true$$if_end25$12;}
67100 $retval=0;__label__=21;break $if_end12$$return$8;}}while(0);var $17=$tr_addr;var $langopts26=(($17)&4294967295);var $param27=(($langopts26+24)&4294967295);var $arrayidx28=(($param27+40)&4294967295);var $18=HEAP32[(($arrayidx28)>>2)];var $and29=($18)&2;var $tobool30=((($and29))|0)!=0;if(!($tobool30)){__label__=13;break $if_then15$$if_end36$10;}
67101 var $19=$stress_level;var $20=$pl;var $wordstress=(($20+2)&4294967295);var $21=HEAPU8[($wordstress)];var $conv32=((($21))&255);var $cmp33=((($19))|0)>=((($conv32))|0);if(!($cmp33)){__label__=13;break $if_then15$$if_end36$10;}
67102 $stress_level=4;;}}while(0);var $22=$condition_addr;var $cmp37=((($22))|0)==4;if($cmp37){__label__=14;;}else{__label__=15;;}
67103 if(__label__==14){var $23=$stress_level;var $24=$pl;var $wordstress39=(($24+2)&4294967295);var $25=HEAPU8[($wordstress39)];var $conv40=((($25))&255);var $cmp41=((($23))|0)>=((($conv40))|0);$retval=$cmp41;;}
67104 else if(__label__==15){var $26=$condition_addr;var $cmp43=((($26))|0)==3;var $27=$stress_level;if($cmp43){__label__=16;;}else{__label__=18;;}
67105 $if_then44$$if_else48$23:do{if(__label__==16){var $cmp45=((($27))|0)>3;if(!($cmp45)){__label__=20;break $if_then44$$if_else48$23;}
67106 $retval=1;__label__=21;break $if_end12$$return$8;}
67107 else if(__label__==18){var $28=$condition_addr;var $arrayidx49=((__ZZL15StressConditionP10TranslatorP12PHONEME_LISTiiE15condition_level+$28*4)&4294967295);var $29=HEAP32[(($arrayidx49)>>2)];var $cmp50=((($27))|0)<((($29))|0);if(!($cmp50)){__label__=20;break $if_then44$$if_else48$23;}
67108 $retval=1;__label__=21;break $if_end12$$return$8;}}while(0);$retval=0;;}}}while(0);var $30=$retval;;return $30;return null;}
67109 function __ZL18InterpretConditionP10TranslatoriP12PHONEME_LISTi($tr,$control,$plist,$instn){;var __label__;var __lastLabel__=null;var $retval;var $tr_addr;var $control_addr;var $plist_addr;var $instn_addr;var $which;var $data;var $instn2;var $count;var $ph;var $plist_this;$tr_addr=$tr;$control_addr=$control;$plist_addr=$plist;$instn_addr=$instn;var $0=$instn_addr;var $and=($0)&255;$data=$and;var $1=$instn_addr;var $shr=($1)>>8;$instn2=$shr;var $2=$instn2;var $cmp=((($2))|0)<14;var $3=$instn2;if($cmp){__label__=1;;}else{__label__=67;;}
67110 $if_then$$if_else187$2:do{if(__label__==1){var $rem=((($3))|0)%7;$which=$rem;var $4=$which;var $cmp1=((($4))|0)==4;if($cmp1){__lastLabel__=1;__label__=2;;}else{__lastLabel__=1;__label__=5;;}
67111 if(__label__==2){var $5=$plist_addr;var $arrayidx=(($5+24)&4294967295);var $sourceix=(($arrayidx+6)&4294967295);var $6=HEAP16[(($sourceix)>>1)];var $tobool=(tempInt=(($6)),(tempInt>=32768?tempInt-65536:tempInt))!=0;if($tobool){__label__=3;;}else{__label__=4;;}
67112 if(__label__==3){$retval=0;__label__=73;break $if_then$$if_else187$2;}
67113 else if(__label__==4){var $_pr=$which;__lastLabel__=4;;}}
67114 var $7=__lastLabel__==4?$_pr:($4);var $cmp5=((($7))|0)==5;if($cmp5){__label__=6;;}else{__label__=8;;}
67115 $if_then6$$if_end12$10:do{if(__label__==6){var $8=$plist_addr;var $arrayidx7=(($8)&4294967295);var $sourceix8=(($arrayidx7+6)&4294967295);var $9=HEAP16[(($sourceix8)>>1)];var $tobool9=(tempInt=(($9)),(tempInt>=32768?tempInt-65536:tempInt))!=0;if(!($tobool9)){__label__=8;break $if_then6$$if_end12$10;}
67116 $retval=0;__label__=73;break $if_then$$if_else187$2;}}while(0);var $10=$which;var $cmp13=((($10))|0)==7;if($cmp13){__lastLabel__=8;__label__=9;;}else{__lastLabel__=8;__label__=13;;}
67117 $if_then14$$if_end23$14:do{if(__label__==9){var $11=$plist_addr;var $arrayidx15=(($11+24)&4294967295);var $sourceix16=(($arrayidx15+6)&4294967295);var $12=HEAP16[(($sourceix16)>>1)];var $tobool17=(tempInt=(($12)),(tempInt>=32768?tempInt-65536:tempInt))!=0;if($tobool17){__label__=11;;}else{__label__=10;;}
67118 $if_then21$$lor_lhs_false$16:do{if(__label__==10){var $13=$plist_addr;var $arrayidx18=(($13+48)&4294967295);var $sourceix19=(($arrayidx18+6)&4294967295);var $14=HEAP16[(($sourceix19)>>1)];var $tobool20=(tempInt=(($14)),(tempInt>=32768?tempInt-65536:tempInt))!=0;if($tobool20){__label__=11;break $if_then21$$lor_lhs_false$16;}
67119 var $_pr1=$which;__lastLabel__=12;__label__=13;break $if_then14$$if_end23$14;}}while(0);$retval=0;__label__=73;break $if_then$$if_else187$2;}}while(0);var $15=__lastLabel__==12?$_pr1:($10);var $cmp24=((($15))|0)==6;if($cmp24){__label__=14;;}else{__label__=19;;}
67120 $if_then25$$if_else$21:do{if(__label__==14){$which=2;;while(1){var $16=$which;var $sub=((($16)-1)&4294967295);var $17=$plist_addr;var $arrayidx26=(($17+24*$sub)&4294967295);var $sourceix27=(($arrayidx26+6)&4294967295);var $18=HEAP16[(($sourceix27)>>1)];var $tobool28=(tempInt=(($18)),(tempInt>=32768?tempInt-65536:tempInt))!=0;if($tobool28){__label__=16;break;}
67121 var $19=$which;var $sub31=((($19)-1)&4294967295);var $20=$plist_addr;var $arrayidx32=(($20+24*$sub31)&4294967295);var $phcode=(($arrayidx32)&4294967295);var $21=HEAPU8[($phcode)];var $idxprom=((($21))&255);var $arrayidx33=((_phoneme_tab+$idxprom*4)&4294967295);var $22=HEAP32[(($arrayidx33)>>2)];var $type=(($22+11)&4294967295);var $23=HEAPU8[($type)];var $conv=((($23))&255);var $cmp34=((($conv))|0)==2;var $_pr2=$which;if($cmp34){__lastLabel__=17;__label__=20;break $if_then25$$if_else$21;}else{__lastLabel__=17;;}
67122 var $inc=((($_pr2)+1)&4294967295);$which=$inc;__label__=15;continue;}
67123 $retval=0;__label__=73;break $if_then$$if_else187$2;}
67124 else if(__label__==19){var $24=$which;var $arrayidx37=((__ZZL18InterpretConditionP10TranslatoriP12PHONEME_LISTiE11ph_position+$24*4)&4294967295);var $25=HEAP32[(($arrayidx37)>>2)];$which=$25;__lastLabel__=19;;}}while(0);var $26=__lastLabel__==19?$25:($_pr2);var $27=$plist_addr;$plist_this=$27;var $sub39=((($26)-1)&4294967295);var $28=$plist_addr;var $arrayidx40=(($28+24*$sub39)&4294967295);$plist_addr=$arrayidx40;var $cmp41=((($26))|0)==0;if($cmp41){__label__=21;;}else{__label__=23;;}
67125 $if_then42$$if_end49$30:do{if(__label__==21){var $29=$plist_addr;var $phcode43=(($29)&4294967295);var $30=HEAPU8[($phcode43)];var $conv44=((($30))&255);var $cmp45=((($conv44))|0)==1;if(!($cmp45)){__label__=23;break $if_then42$$if_end49$30;}
67126 var $31=$plist_addr;var $arrayidx47=(($31+-24)&4294967295);$plist_addr=$arrayidx47;;}}while(0);var $32=$control_addr;var $and50=($32)&256;var $tobool51=((($and50))|0)!=0;if($tobool51){__label__=24;;}else{__label__=25;;}
67127 if(__label__==24){var $33=$plist_addr;var $phcode53=(($33)&4294967295);var $34=HEAPU8[($phcode53)];var $idxprom54=((($34))&255);var $arrayidx55=((_phoneme_tab+$idxprom54*4)&4294967295);var $35=HEAP32[(($arrayidx55)>>2)];var $36=$plist_addr;var $ph56=(($36+8)&4294967295);HEAP32[(($ph56)>>2)]=$35;;}
67128 var $37=$plist_addr;var $ph58=(($37+8)&4294967295);var $38=HEAP32[(($ph58)>>2)];$ph=$38;var $39=$instn2;var $cmp59=((($39))|0)<7;if($cmp59){__label__=26;;}else{__label__=32;;}
67129 if(__label__==26){var $40=$data;var $arrayidx61=((_phoneme_tab+$40*4)&4294967295);var $41=HEAP32[(($arrayidx61)>>2)];var $mnemonic=(($41)&4294967295);var $42=HEAP32[(($mnemonic)>>2)];var $43=$ph;var $mnemonic62=(($43)&4294967295);var $44=HEAP32[(($mnemonic62)>>2)];var $cmp63=((($42))|0)==((($44))|0);var $conv64=((($cmp63))&1);var $cmp65=((($conv64))|0)==1;if($cmp65){__label__=27;;}else{__label__=28;;}
67130 if(__label__==27){$retval=1;;}
67131 else if(__label__==28){var $45=$which;var $cmp68=((($45))|0)==0;if($cmp68){__label__=29;;}else{__label__=31;;}
67132 $land_lhs_true$$if_end75$42:do{if(__label__==29){var $46=$ph;var $type69=(($46+11)&4294967295);var $47=HEAPU8[($type69)];var $conv70=((($47))&255);var $cmp71=((($conv70))|0)==2;if(!($cmp71)){__label__=31;break $land_lhs_true$$if_end75$42;}
67133 var $48=$data;var $49=$ph;var $end_type=(($49+13)&4294967295);var $50=HEAPU8[($end_type)];var $conv73=((($50))&255);var $cmp74=((($48))|0)==((($conv73))|0);$retval=$cmp74;__label__=73;break $if_then$$if_else187$2;}}while(0);var $51=$data;var $52=$ph;var $start_type=(($52+12)&4294967295);var $53=HEAPU8[($start_type)];var $conv76=((($53))&255);var $cmp77=((($51))|0)==((($conv76))|0);$retval=$cmp77;;}}
67134 else if(__label__==32){var $54=$instn_addr;var $and79=($54)&31;$data=$and79;var $55=$instn_addr;var $and80=($55)&224;if($and80==0){__label__=33;;}
67135 else if($and80==32){__label__=34;;}
67136 else if($and80==64){__label__=35;;}
67137 else if($and80==128){__label__=36;;}
67138 else{__label__=66;;}
67139 if(__label__==66){$retval=0;;}
67140 else if(__label__==33){var $56=$ph;var $type81=(($56+11)&4294967295);var $57=HEAPU8[($type81)];var $conv82=((($57))&255);var $58=$data;var $cmp83=((($conv82))|0)==((($58))|0);$retval=$cmp83;;}
67141 else if(__label__==34){var $59=$ph;var $phflags=(($59+4)&4294967295);var $60=HEAPU32[(($phflags)>>2)];var $shr85=($60)>>>16;var $and86=($shr85)&15;var $61=$data;var $cmp87=((($and86))|0)==((($61))|0);$retval=$cmp87;;}
67142 else if(__label__==35){var $62=$ph;var $phflags89=(($62+4)&4294967295);var $63=HEAP32[(($phflags89)>>2)];var $64=$data;var $shl=1<<($64);var $and90=($shl)&($63);var $cmp91=((($and90))|0)!=0;$retval=$cmp91;;}
67143 else if(__label__==36){var $65=$data;if($65==0){__label__=37;;}
67144 else if($65==1){__label__=37;;}
67145 else if($65==2){__label__=37;;}
67146 else if($65==3){__label__=37;;}
67147 else if($65==4){__label__=37;;}
67148 else if($65==5){__label__=38;;}
67149 else if($65==6){__label__=41;;}
67150 else if($65==7){__label__=42;;}
67151 else if($65==8){__label__=43;;}
67152 else if($65==9){__label__=46;;}
67153 else if($65==10){__label__=51;;}
67154 else if($65==11){__label__=52;;}
67155 else if($65==12){__label__=56;;}
67156 else{__label__=60;;}
67157 $sw_bb169$$sw_bb93$$sw_bb94$$sw_bb101$$sw_bb105$$sw_bb109$$sw_bb120$$sw_bb134$$for_cond139$$sw_bb156$53:do{if(__label__==37){var $66=$tr_addr;var $67=$plist_addr;var $68=$data;var $call=__ZL15StressConditionP10TranslatorP12PHONEME_LISTii($66,$67,$68,0);$retval=$call;__label__=73;break $if_then$$if_else187$2;}
67158 else if(__label__==38){var $69=$ph;var $type95=(($69+11)&4294967295);var $70=HEAPU8[($type95)];var $conv96=((($70))&255);var $cmp97=((($conv96))|0)==0;if($cmp97){__lastLabel__=38;__label__=40;;}else{__lastLabel__=38;__label__=39;;}
67159 if(__label__==39){var $71=$plist_this;var $synthflags=(($71+4)&4294967295);var $72=HEAPU16[(($synthflags)>>1)];var $conv98=((($72))&65535);var $and99=($conv98)&8192;var $tobool100=((($and99))|0)!=0;__lastLabel__=39;;}
67160 var $73=__lastLabel__==38?1:($tobool100);$retval=$73;__label__=73;break $if_then$$if_else187$2;}
67161 else if(__label__==41){var $74=$plist_addr;var $sourceix102=(($74+6)&4294967295);var $75=HEAPU16[(($sourceix102)>>1)];var $conv103=((($75))&65535);var $cmp104=((($conv103))|0)!=0;$retval=$cmp104;__label__=73;break $if_then$$if_else187$2;}
67162 else if(__label__==42){var $76=$plist_addr;var $sourceix106=(($76+6)&4294967295);var $77=HEAPU16[(($sourceix106)>>1)];var $conv107=((($77))&65535);var $cmp108=((($conv107))|0)==0;$retval=$cmp108;__label__=73;break $if_then$$if_else187$2;}
67163 else if(__label__==43){var $78=$plist_addr;var $arrayidx110=(($78+24)&4294967295);var $sourceix111=(($arrayidx110+6)&4294967295);var $79=HEAP16[(($sourceix111)>>1)];var $tobool112=(tempInt=(($79)),(tempInt>=32768?tempInt-65536:tempInt))!=0;if($tobool112){__lastLabel__=43;__label__=45;;}else{__lastLabel__=43;__label__=44;;}
67164 if(__label__==44){var $80=$plist_addr;var $arrayidx114=(($80+24)&4294967295);var $ph115=(($arrayidx114+8)&4294967295);var $81=HEAP32[(($ph115)>>2)];var $type116=(($81+11)&4294967295);var $82=HEAPU8[($type116)];var $conv117=((($82))&255);var $cmp118=((($conv117))|0)==0;__lastLabel__=44;;}
67165 var $83=__lastLabel__==43?1:($cmp118);$retval=$83;__label__=73;break $if_then$$if_else187$2;}
67166 else if(__label__==46){var $84=$plist_addr;var $sourceix121=(($84+6)&4294967295);var $85=HEAPU16[(($sourceix121)>>1)];var $conv122=((($85))&65535);var $cmp123=((($conv122))|0)!=0;if($cmp123){__label__=47;;}else{__label__=48;;}
67167 if(__label__==47){$retval=0;__label__=73;break $if_then$$if_else187$2;}
67168 else if(__label__==48){while(1){var $86=$plist_addr;var $incdec_ptr=(($86+-24)&4294967295);$plist_addr=$incdec_ptr;var $87=$plist_addr;var $stresslevel=(($87+1)&4294967295);var $88=HEAPU8[($stresslevel)];var $conv126=((($88))&255);var $and127=($conv126)&15;var $cmp128=((($and127))|0)>=4;if($cmp128){__label__=49;break;}
67169 var $89=$plist_addr;var $sourceix131=(($89+6)&4294967295);var $90=HEAPU16[(($sourceix131)>>1)];var $conv132=((($90))&65535);var $cmp133=((($conv132))|0)==0;if($cmp133){__label__=48;continue;}else{__label__=60;break $sw_bb169$$sw_bb93$$sw_bb94$$sw_bb101$$sw_bb105$$sw_bb109$$sw_bb120$$sw_bb134$$for_cond139$$sw_bb156$53;}}
67170 $retval=1;__label__=73;break $if_then$$if_else187$2;}}
67171 else if(__label__==51){var $91=$ph;var $type135=(($91+11)&4294967295);var $92=HEAPU8[($type135)];var $conv136=((($92))&255);var $cmp137=((($conv136))|0)!=2;$retval=$cmp137;__label__=73;break $if_then$$if_else187$2;}
67172 else if(__label__==52){while(1){var $93=$plist_addr;var $incdec_ptr140=(($93+24)&4294967295);$plist_addr=$incdec_ptr140;var $94=$plist_addr;var $phcode141=(($94)&4294967295);var $95=HEAPU8[($phcode141)];var $idxprom142=((($95))&255);var $arrayidx143=((_phoneme_tab+$idxprom142*4)&4294967295);var $96=HEAP32[(($arrayidx143)>>2)];var $97=$plist_addr;var $ph144=(($97+8)&4294967295);HEAP32[(($ph144)>>2)]=$96;var $98=$plist_addr;var $sourceix145=(($98+6)&4294967295);var $99=HEAPU16[(($sourceix145)>>1)];var $conv146=((($99))&65535);var $cmp147=((($conv146))|0)!=0;if($cmp147){__label__=53;break;}
67173 var $100=$plist_addr;var $ph150=(($100+8)&4294967295);var $101=HEAP32[(($ph150)>>2)];var $type151=(($101+11)&4294967295);var $102=HEAPU8[($type151)];var $conv152=((($102))&255);var $cmp153=((($conv152))|0)==2;if($cmp153){__label__=55;break;}else{__label__=52;continue;}}
67174 if(__label__==53){$retval=1;__label__=73;break $if_then$$if_else187$2;}
67175 else if(__label__==55){$retval=0;__label__=73;break $if_then$$if_else187$2;}}
67176 else if(__label__==56){var $103=$ph;var $type157=(($103+11)&4294967295);var $104=HEAPU8[($type157)];var $conv158=((($104))&255);var $cmp159=((($conv158))|0)==2;if($cmp159){__lastLabel__=56;__label__=59;;}else{__lastLabel__=56;__label__=57;;}
67177 $lor_end168$$lor_lhs_false160$80:do{if(__label__==57){var $105=$ph;var $type161=(($105+11)&4294967295);var $106=HEAPU8[($type161)];var $conv162=((($106))&255);var $cmp163=((($conv162))|0)==3;if($cmp163){__lastLabel__=57;__label__=59;break $lor_end168$$lor_lhs_false160$80;}else{__lastLabel__=57;;}
67178 var $107=$ph;var $phflags165=(($107+4)&4294967295);var $108=HEAP32[(($phflags165)>>2)];var $and166=($108)&16;var $tobool167=((($and166))|0)!=0;__lastLabel__=58;;}}while(0);var $109=__lastLabel__==57?1:(__lastLabel__==56?1:($tobool167));$retval=$109;__label__=73;break $if_then$$if_else187$2;}}while(0);$count=0;;while(1){var $110=$plist_addr;var $ph171=(($110+8)&4294967295);var $111=HEAP32[(($ph171)>>2)];var $type172=(($111+11)&4294967295);var $112=HEAPU8[($type172)];var $conv173=((($112))&255);var $cmp174=((($conv173))|0)==2;if($cmp174){__label__=62;;}else{__label__=63;;}
67179 if(__label__==62){var $113=$count;var $inc176=((($113)+1)&4294967295);$count=$inc176;;}
67180 var $114=$plist_addr;var $sourceix178=(($114+6)&4294967295);var $115=HEAPU16[(($sourceix178)>>1)];var $conv179=((($115))&65535);var $cmp180=((($conv179))|0)!=0;if($cmp180){__label__=65;break;}
67181 var $116=$plist_addr;var $incdec_ptr183=(($116+-24)&4294967295);$plist_addr=$incdec_ptr183;__label__=61;continue;}
67182 var $117=$count;var $cmp185=((($117))|0)==1;$retval=$cmp185;;}}}
67183 else if(__label__==67){var $cmp188=((($3))|0)==15;if($cmp188){__label__=68;;}else{__label__=72;;}
67184 $if_then189$$if_end201$93:do{if(__label__==68){var $118=$data;if($118==1){__label__=69;;}
67185 else if($118==2){__label__=70;;}
67186 else if($118==3){__label__=71;;}
67187 else{__label__=72;break $if_then189$$if_end201$93;}
67188 if(__label__==69){var $119=$control_addr;var $and191=($119)&1;var $tobool192=((($and191))|0)!=0;$retval=$tobool192;__label__=73;break $if_then$$if_else187$2;}
67189 else if(__label__==70){var $120=HEAP32[((_voice)>>2)];var $klattv=(($120+112)&4294967295);var $arrayidx194=(($klattv)&4294967295);var $121=HEAP32[(($arrayidx194)>>2)];var $cmp195=((($121))|0)!=0;$retval=$cmp195;__label__=73;break $if_then$$if_else187$2;}
67190 else if(__label__==71){var $122=HEAP8[(((_mbrola_name)&4294967295))];var $conv197=(tempInt=(($122)),(tempInt>=128?tempInt-256:tempInt));var $cmp198=((($conv197))|0)!=0;$retval=$cmp198;__label__=73;break $if_then$$if_else187$2;}}}while(0);$retval=0;;}}while(0);var $123=$retval;;return $123;return null;}
67191 function __ZL13NumInstnWordsPt($prog){;var __label__;var $retval;var $prog_addr;var $instn;var $instn2;var $instn_type;$prog_addr=$prog;var $0=$prog_addr;var $1=HEAPU16[(($0)>>1)];var $conv=((($1))&65535);$instn=$conv;var $2=$instn;var $shr=($2)>>12;$instn_type=$shr;var $3=$instn_type;var $cmp=((($3))|0)<11;if($cmp){__label__=1;;}else{__label__=2;;}
67192 if(__label__==1){var $4=$instn_type;var $arrayidx=((__ZZL13NumInstnWordsPtE7n_words+$4)&4294967295);var $5=HEAP8[($arrayidx)];var $conv1=(tempInt=(($5)),(tempInt>=128?tempInt-256:tempInt));$retval=$conv1;;}
67193 else if(__label__==2){var $6=$prog_addr;var $arrayidx2=(($6+4)&4294967295);var $7=HEAPU16[(($arrayidx2)>>1)];var $conv3=((($7))&65535);$instn2=$conv3;var $8=$instn2;var $shr4=($8)>>12;var $cmp5=((($shr4))|0)==15;if($cmp5){__label__=3;;}else{__label__=4;;}
67194 if(__label__==3){$retval=4;;}
67195 else if(__label__==4){var $9=$instn2;var $cmp8=((($9))|0)==2;if($cmp8){__label__=5;;}else{__label__=6;;}
67196 if(__label__==5){$retval=3;;}
67197 else if(__label__==6){$retval=2;;}}}
67198 var $10=$retval;;return $10;return null;}
67199 function __ZL15SwitchVowelTypeP12PHONEME_LISTP12PHONEME_DATAPPti($plist,$phdata,$p_prog,$instn_type){;var __label__;var $plist_addr;var $phdata_addr;var $p_prog_addr;var $instn_type_addr;var $prog;var $voweltype;var $x;$plist_addr=$plist;$phdata_addr=$phdata;$p_prog_addr=$p_prog;$instn_type_addr=$instn_type;var $0=$instn_type_addr;var $cmp=((($0))|0)==2;if($cmp){__label__=1;;}else{__label__=2;;}
67200 if(__label__==1){var $1=$phdata_addr;var $pd_control=(($1)&4294967295);var $2=HEAP32[(($pd_control)>>2)];var $or=($2)|2;HEAP32[(($pd_control)>>2)]=$or;var $3=$plist_addr;var $arrayidx=(($3+24)&4294967295);var $ph=(($arrayidx+8)&4294967295);var $4=HEAP32[(($ph)>>2)];var $start_type=(($4+12)&4294967295);var $5=HEAPU8[($start_type)];var $conv=((($5))&255);$voweltype=$conv;;}
67201 else if(__label__==2){var $6=$plist_addr;var $arrayidx1=(($6+-24)&4294967295);var $ph2=(($arrayidx1+8)&4294967295);var $7=HEAP32[(($ph2)>>2)];var $end_type=(($7+13)&4294967295);var $8=HEAPU8[($end_type)];var $conv3=((($8))&255);$voweltype=$conv3;;}
67202 var $9=$voweltype;var $sub=((($9)-28)&4294967295);$voweltype=$sub;var $10=$voweltype;var $cmp4=((($10))|0)>=0;var $11=$voweltype;var $cmp5=((($11))|0)<6;var $or_cond=($cmp4)&($cmp5);if($or_cond){__label__=4;;}else{__label__=5;;}
67203 if(__label__==4){var $12=$p_prog_addr;var $13=HEAP32[(($12)>>2)];var $14=$voweltype;var $mul=((($14)*2)&4294967295);var $add_ptr=(($13+2*$mul)&4294967295);$prog=$add_ptr;var $15=$prog;var $arrayidx7=(($15+2)&4294967295);var $16=HEAPU16[(($arrayidx7)>>1)];var $conv8=((($16))&65535);var $and=($conv8)&15;var $shl=((($and)*65536)&4294967295);var $17=$prog;var $arrayidx9=(($17+4)&4294967295);var $18=HEAPU16[(($arrayidx9)>>1)];var $conv10=((($18))&65535);var $add=((($shl)+($conv10))&4294967295);var $mul11=((($add)*4)&4294967295);var $19=$instn_type_addr;var $20=$phdata_addr;var $sound_addr=(($20+68)&4294967295);var $arrayidx12=(($sound_addr+$19*4)&4294967295);HEAP32[(($arrayidx12)>>2)]=$mul11;var $21=$prog;var $arrayidx13=(($21+2)&4294967295);var $22=HEAPU16[(($arrayidx13)>>1)];var $conv14=((($22))&65535);var $shr=($conv14)>>4;var $and15=($shr)&255;var $conv16=((($and15))&255);$x=$conv16;var $23=$x;var $conv17=(tempInt=(($23)),(tempInt>=128?tempInt-256:tempInt));var $24=$instn_type_addr;var $25=$phdata_addr;var $sound_param=(($25+88)&4294967295);var $arrayidx18=(($sound_param+$24*4)&4294967295);HEAP32[(($arrayidx18)>>2)]=$conv17;;}
67204 var $26=$p_prog_addr;var $27=HEAP32[(($26)>>2)];var $add_ptr20=(($27+24)&4294967295);HEAP32[(($26)>>2)]=$add_ptr20;;return;return;}
67205 function __Z17InterpretPhoneme2iP12PHONEME_DATA($phcode,$phdata){var __stackBase__=STACKTOP;STACKTOP+=96;_memset(__stackBase__,0,96);var __label__;var $phcode_addr;var $phdata_addr;var $ix;var $plist=__stackBase__;$phcode_addr=$phcode;$phdata_addr=$phdata;var $arraydecay=(($plist)&4294967295);var $0=$arraydecay;var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=$0;$stop$=$dest$+96;$value4$=0;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=0;}
67206 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
67207 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=0;};$ix=0;;while(1){var $1=$ix;var $arrayidx=(($plist+$1*24)&4294967295);var $phcode1=(($arrayidx)&4294967295);HEAP8[($phcode1)]=9;var $2=HEAP32[((((_phoneme_tab+36)&4294967295))>>2)];var $3=$ix;var $arrayidx2=(($plist+$3*24)&4294967295);var $ph=(($arrayidx2+8)&4294967295);HEAP32[(($ph)>>2)]=$2;var $4=$ix;var $inc=((($4)+1)&4294967295);$ix=$inc;var $cmp=((($inc))|0)<4;if($cmp){__label__=1;continue;}else{__label__=2;break;}}
67208 var $5=$phcode_addr;var $conv=((($5))&255);var $arrayidx3=(($plist+24)&4294967295);var $phcode4=(($arrayidx3)&4294967295);HEAP8[($phcode4)]=$conv;var $6=$phcode_addr;var $arrayidx5=((_phoneme_tab+$6*4)&4294967295);var $7=HEAP32[(($arrayidx5)>>2)];var $arrayidx6=(($plist+24)&4294967295);var $ph7=(($arrayidx6+8)&4294967295);HEAP32[(($ph7)>>2)]=$7;var $arrayidx8=(($plist+48)&4294967295);var $sourceix=(($arrayidx8+6)&4294967295);HEAP16[(($sourceix)>>1)]=1;var $arrayidx9=(($plist+24)&4294967295);var $8=$phdata_addr;__Z16InterpretPhonemeP10TranslatoriP12PHONEME_LISTP12PHONEME_DATA(0,0,$arrayidx9,$8);STACKTOP=__stackBase__;return;return;}
67209 function __Z12WordToStringj($word){;var __label__;var $word_addr;var $ix;$word_addr=$word;$ix=0;;while(1){var $0=$word_addr;var $1=$ix;var $mul=((($1)*8)&4294967295);var $shr=($0)>>>((($mul))>>>0);var $conv=((($shr))&255);var $2=$ix;var $arrayidx=((__ZZ12WordToStringjE3buf+$2)&4294967295);HEAP8[($arrayidx)]=$conv;var $3=$ix;var $inc=((($3)+1)&4294967295);$ix=$inc;var $cmp=((($inc))|0)<3;if($cmp){__label__=1;continue;}else{__label__=2;break;}}
67210 HEAP8[(((__ZZ12WordToStringjE3buf+4)&4294967295))]=0;;return((__ZZ12WordToStringjE3buf)&4294967295);return null;}
67211 function __Z14SynthesizeInitv(){;var __label__;HEAP32[((__ZL14last_pitch_cmd)>>2)]=0;HEAP32[((__ZL12last_amp_cmd)>>2)]=0;HEAP32[((__ZL10last_frame)>>2)]=0;HEAP32[((__ZL15syllable_centre)>>2)]=-1;;return;return;}
67212 function __Z11PauseLengthii($pause,$control){;var __label__;var $pause_addr;var $control_addr;var $len;$pause_addr=$pause;$control_addr=$control;var $0=$control_addr;var $cmp=((($0))|0)==0;var $1=$pause_addr;if($cmp){__label__=1;;}else{__label__=4;;}
67213 if(__label__==1){var $cmp1=((($1))|0)>=200;var $2=$pause_addr;if($cmp1){__label__=2;;}else{__label__=3;;}
67214 if(__label__==2){var $3=HEAP32[((((_speed+4)&4294967295))>>2)];var $mul=((($3)*($2))&4294967295);var $div=((((($mul))|0)/256)|0);$len=$div;;}
67215 else if(__label__==3){var $4=HEAP32[((((_speed)&4294967295))>>2)];var $mul3=((($4)*($2))&4294967295);var $div4=((((($mul3))|0)/256)|0);$len=$div4;;}}
67216 else if(__label__==4){var $5=HEAP32[((((_speed+12)&4294967295))>>2)];var $mul6=((($5)*($1))&4294967295);var $div7=((((($mul6))|0)/256)|0);$len=$div7;;}
67217 var $6=$len;var $7=HEAP32[((((_speed+8)&4294967295))>>2)];var $cmp9=((($6))|0)<((($7))|0);if($cmp9){__label__=6;;}else{__label__=7;;}
67218 if(__label__==6){var $8=HEAP32[((((_speed+8)&4294967295))>>2)];$len=$8;;}
67219 var $9=$len;;return $9;return null;}
67220 function __Z9DoSample3P12PHONEME_DATAii($phdata,$length_mod,$amp){;var __label__;var $phdata_addr;var $length_mod_addr;var $amp_addr;var $amp2;var $len;$phdata_addr=$phdata;$length_mod_addr=$length_mod;$amp_addr=$amp;__ZL8EndPitchi(1);var $0=$amp_addr;var $cmp=((($0))|0)==-1;if($cmp){__label__=1;;}else{__label__=2;;}
67221 if(__label__==1){var $1=$amp_addr;$amp2=$1;;}
67222 else if(__label__==2){var $2=$phdata_addr;var $sound_param=(($2+88)&4294967295);var $arrayidx=(($sound_param+4)&4294967295);var $3=HEAP32[(($arrayidx)>>2)];$amp2=$3;var $4=$amp2;var $cmp1=((($4))|0)==0;if($cmp1){__label__=3;;}else{__label__=4;;}
67223 if(__label__==3){$amp2=100;;}
67224 var $5=$amp2;var $mul=((($5)*32)&4294967295);var $div=((((($mul))|0)/100)|0);$amp2=$div;;}
67225 HEAP32[((_seq_len_adjust)>>2)]=0;var $6=$phdata_addr;var $sound_addr=(($6+68)&4294967295);var $arrayidx4=(($sound_addr+4)&4294967295);var $7=HEAP32[(($arrayidx4)>>2)];var $cmp5=((($7))|0)==0;if($cmp5){__label__=6;;}else{__label__=7;;}
67226 if(__label__==6){$len=0;;}
67227 else if(__label__==7){var $8=$phdata_addr;var $sound_addr8=(($8+68)&4294967295);var $arrayidx9=(($sound_addr8+4)&4294967295);var $9=HEAP32[(($arrayidx9)>>2)];var $10=$phdata_addr;var $pd_param=(($10+4)&4294967295);var $arrayidx10=(($pd_param+40)&4294967295);var $11=HEAP32[(($arrayidx10)>>2)];var $mul11=((($11)*2)&4294967295);var $12=$phdata_addr;var $pd_control=(($12)&4294967295);var $13=HEAP32[(($pd_control)>>2)];var $14=$length_mod_addr;var $15=$amp2;var $call=__ZL9DoSample2iiiiii($9,2,$mul11,$13,$14,$15);$len=$call;;}
67228 HEAP32[((__ZL10last_frame)>>2)]=0;var $16=$len;;return $16;return null;}
67229 function __ZL8EndPitchi($voice_break){;var __label__;var $voice_break_addr;$voice_break_addr=$voice_break;var $0=HEAP32[((__ZL12pitch_length)>>2)];var $cmp=((($0))|0)>0;var $1=HEAP32[((__ZL14last_pitch_cmd)>>2)];var $cmp1=((($1))|0)>=0;var $or_cond=($cmp)&($cmp1);if($or_cond){__label__=1;;}else{__label__=4;;}
67230 if(__label__==1){var $2=HEAP32[((__ZL14last_pitch_cmd)>>2)];var $arrayidx=((_wcmdq+$2*16)&4294967295);var $arrayidx2=(($arrayidx+4)&4294967295);var $3=HEAP32[(($arrayidx2)>>2)];var $cmp3=((($3))|0)==0;if($cmp3){__label__=2;;}else{__label__=3;;}
67231 if(__label__==2){var $4=HEAP32[((__ZL12pitch_length)>>2)];var $5=HEAP32[((__ZL14last_pitch_cmd)>>2)];var $arrayidx5=((_wcmdq+$5*16)&4294967295);var $arrayidx6=(($arrayidx5+4)&4294967295);HEAP32[(($arrayidx6)>>2)]=$4;;}
67232 HEAP32[((__ZL12pitch_length)>>2)]=0;;}
67233 var $6=$voice_break_addr;var $tobool=((($6))|0)!=0;if($tobool){__label__=5;;}else{__label__=6;;}
67234 if(__label__==5){HEAP32[((__ZL10last_wcmdq)>>2)]=-1;HEAP32[((__ZL10last_frame)>>2)]=0;var $7=HEAP32[((_wcmdq_tail)>>2)];HEAP32[((__ZL12syllable_end)>>2)]=$7;__ZL11SmoothSpectv();HEAP32[((__ZL15syllable_centre)>>2)]=-1;var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=_vowel_transition;$stop$=$dest$+16;$value4$=0;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=0;}
67235 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
67236 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=0;};;};return;return;}
67237 function __ZL9DoSample2iiiiii($index,$which,$std_length,$control,$length_mod,$amp){;var __label__;var __lastLabel__=null;var $retval;var $index_addr;var $which_addr;var $std_length_addr;var $control_addr;var $length_mod_addr;var $amp_addr;var $length;var $wav_length;var $wav_scale;var $min_length;var $x;var $len4;var $q;var $p;$index_addr=$index;$which_addr=$which;$std_length_addr=$std_length;$control_addr=$control;$length_mod_addr=$length_mod;$amp_addr=$amp;var $0=$index_addr;var $and=($0)&8388607;$index_addr=$and;var $1=$index_addr;var $2=HEAP32[((_wavefile_data)>>2)];var $arrayidx=(($2+$1)&4294967295);$p=$arrayidx;var $3=$p;var $arrayidx1=(($3+2)&4294967295);var $4=HEAPU8[($arrayidx1)];var $conv=((($4))&255);$wav_scale=$conv;var $5=$p;var $arrayidx2=(($5+1)&4294967295);var $6=HEAPU8[($arrayidx2)];var $conv3=((($6))&255);var $mul=((($conv3)*256)&4294967295);$wav_length=$mul;var $7=$p;var $arrayidx4=(($7)&4294967295);var $8=HEAPU8[($arrayidx4)];var $conv5=((($8))&255);var $9=$wav_length;var $add=((($9)+($conv5))&4294967295);$wav_length=$add;var $10=$wav_length;var $cmp=((($10))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
67238 if(__label__==1){$retval=0;;}
67239 else if(__label__==2){var $11=HEAP32[((((_speed+24)&4294967295))>>2)];$min_length=$11;var $12=$wav_scale;var $cmp6=((($12))|0)==0;if($cmp6){__label__=3;;}else{__label__=4;;}
67240 if(__label__==3){var $13=$min_length;var $mul8=((($13)*2)&4294967295);$min_length=$mul8;;}
67241 var $14=$std_length_addr;var $cmp10=((($14))|0)>0;if($cmp10){__label__=5;;}else{__label__=9;;}
67242 $if_then11$$if_else22$8:do{if(__label__==5){var $15=$std_length_addr;var $16=HEAP32[((_samplerate)>>2)];var $mul12=((($16)*($15))&4294967295);var $div=((((($mul12))|0)/1000)|0);$std_length_addr=$div;var $17=$wav_scale;var $cmp13=((($17))|0)==0;if($cmp13){__label__=6;;}else{__label__=7;;}
67243 if(__label__==6){var $18=$std_length_addr;var $mul15=((($18)*2)&4294967295);$std_length_addr=$mul15;;}
67244 var $19=$min_length;var $20=$std_length_addr;var $mul17=((($20)*($19))&4294967295);var $21=$wav_length;var $div18=((((($mul17))|0)/((($21))|0))|0);$x=$div18;var $22=$x;var $23=$min_length;var $cmp19=((($22))|0)>((($23))|0);if(!($cmp19)){__label__=10;break $if_then11$$if_else22$8;}
67245 var $24=$x;$min_length=$24;;}
67246 else if(__label__==9){var $25=$wav_length;$std_length_addr=$25;;}}while(0);var $26=$length_mod_addr;var $cmp24=((($26))|0)>0;if($cmp24){__label__=11;;}else{__label__=12;;}
67247 if(__label__==11){var $27=$std_length_addr;var $28=$length_mod_addr;var $mul26=((($28)*($27))&4294967295);var $div27=((((($mul26))|0)/256)|0);$std_length_addr=$div27;;}
67248 var $29=$std_length_addr;var $30=HEAP32[((((_speed+12)&4294967295))>>2)];var $mul29=((($30)*($29))&4294967295);var $div30=((((($mul29))|0)/256)|0);$length=$div30;var $31=$control_addr;var $and31=($31)&4;var $tobool=((($and31))|0)!=0;if($tobool){__label__=13;;}else{__label__=15;;}
67249 $if_then32$$if_end37$19:do{if(__label__==13){var $32=$length;var $33=$std_length_addr;var $cmp33=((($32))|0)>((($33))|0);if(!($cmp33)){__label__=15;break $if_then32$$if_end37$19;}
67250 var $34=$std_length_addr;$length=$34;;}}while(0);var $35=$length;var $36=$min_length;var $cmp38=((($35))|0)<((($36))|0);if($cmp38){__label__=16;;}else{__label__=17;;}
67251 if(__label__==16){var $37=$min_length;$length=$37;;}
67252 var $38=$wav_scale;var $cmp41=((($38))|0)==0;if($cmp41){__label__=18;;}else{__label__=19;;}
67253 if(__label__==18){var $39=$length;var $div43=((((($39))|0)/2)|0);$length=$div43;var $40=$wav_length;var $div44=((((($40))|0)/2)|0);$wav_length=$div44;;}
67254 var $41=$amp_addr;var $cmp46=((($41))|0)<0;if($cmp46){__label__=20;;}else{__label__=21;;}
67255 if(__label__==20){var $42=$length;$retval=$42;;}
67256 else if(__label__==21){var $43=$wav_length;var $div49=((((($43))|0)/4)|0);$len4=$div49;var $44=$index_addr;var $add50=((($44)+4)&4294967295);$index_addr=$add50;var $45=$which_addr;var $and51=($45)&256;var $tobool52=((($and51))|0)!=0;if($tobool52){__label__=22;;}else{__label__=23;;}
67257 if(__label__==22){var $46=HEAP32[((_wcmdq_tail)>>2)];HEAP32[((__ZL10last_wcmdq)>>2)]=$46;var $47=HEAP32[((_wcmdq_tail)>>2)];var $arrayidx54=((_wcmdq+$47*16)&4294967295);var $arraydecay=(($arrayidx54)&4294967295);$q=$arraydecay;var $48=$q;var $arrayidx55=(($48)&4294967295);HEAP32[(($arrayidx55)>>2)]=7;var $49=$length;var $50=$wav_length;var $shl=($50)<<16;var $or=($shl)|($49);var $51=$q;var $arrayidx56=(($51+4)&4294967295);HEAP32[(($arrayidx56)>>2)]=$or;var $52=$index_addr;var $53=HEAP32[((_wavefile_data)>>2)];var $arrayidx57=(($53+$52)&4294967295);var $54=($arrayidx57);var $55=$q;var $arrayidx58=(($55+8)&4294967295);HEAP32[(($arrayidx58)>>2)]=$54;var $56=$wav_scale;var $57=$amp_addr;var $shl59=((($57)*256)&4294967295);var $add60=((($shl59)+($56))&4294967295);var $58=$q;var $arrayidx61=(($58+12)&4294967295);HEAP32[(($arrayidx61)>>2)]=$add60;__Z8WcmdqIncv();var $59=$length;$retval=$59;;}
67258 else if(__label__==23){var $60=$length;var $61=$wav_length;var $cmp63=((($60))|0)>((($61))|0);if($cmp63){__label__=24;;}else{__label__=25;;}
67259 if(__label__==24){var $62=$len4;var $mul65=((($62)*3)&4294967295);$x=$mul65;var $63=$x;var $64=$length;var $sub=((($64)-($63))&4294967295);$length=$sub;;}
67260 else if(__label__==25){var $65=$length;$x=$65;$length=0;;}
67261 var $66=HEAP32[((_wcmdq_tail)>>2)];HEAP32[((__ZL10last_wcmdq)>>2)]=$66;var $67=HEAP32[((_wcmdq_tail)>>2)];var $arrayidx68=((_wcmdq+$67*16)&4294967295);var $arraydecay69=(($arrayidx68)&4294967295);$q=$arraydecay69;var $68=$q;var $arrayidx70=(($68)&4294967295);HEAP32[(($arrayidx70)>>2)]=6;var $69=$x;var $70=$q;var $arrayidx71=(($70+4)&4294967295);HEAP32[(($arrayidx71)>>2)]=$69;var $71=$index_addr;var $72=HEAP32[((_wavefile_data)>>2)];var $arrayidx72=(($72+$71)&4294967295);var $73=($arrayidx72);var $74=$q;var $arrayidx73=(($74+8)&4294967295);HEAP32[(($arrayidx73)>>2)]=$73;var $75=$wav_scale;var $76=$amp_addr;var $shl74=((($76)*256)&4294967295);var $add75=((($shl74)+($75))&4294967295);var $77=$q;var $arrayidx76=(($77+12)&4294967295);HEAP32[(($arrayidx76)>>2)]=$add75;__Z8WcmdqIncv();var $78=$length;var $79=$len4;var $mul771=((($79)*3)&4294967295);var $cmp782=((($78))|0)>((($mul771))|0);if($cmp782){__lastLabel__=26;__label__=27;;}else{__lastLabel__=26;__label__=30;;}
67262 $while_body$$while_end$39:do{if(__label__==27){while(1){var $80=$len4;$x=$80;var $81=$wav_scale;var $cmp79=((($81))|0)==0;if($cmp79){__label__=28;;}else{__label__=29;;}
67263 if(__label__==28){var $82=$x;var $mul81=((($82)*2)&4294967295);$x=$mul81;;}
67264 var $83=HEAP32[((_wcmdq_tail)>>2)];HEAP32[((__ZL10last_wcmdq)>>2)]=$83;var $84=HEAP32[((_wcmdq_tail)>>2)];var $arrayidx83=((_wcmdq+$84*16)&4294967295);var $arraydecay84=(($arrayidx83)&4294967295);$q=$arraydecay84;var $85=$q;var $arrayidx85=(($85)&4294967295);HEAP32[(($arrayidx85)>>2)]=6;var $86=$len4;var $mul86=((($86)*2)&4294967295);var $87=$q;var $arrayidx87=(($87+4)&4294967295);HEAP32[(($arrayidx87)>>2)]=$mul86;var $88=$index_addr;var $89=$x;var $add88=((($89)+($88))&4294967295);var $90=HEAP32[((_wavefile_data)>>2)];var $arrayidx89=(($90+$add88)&4294967295);var $91=($arrayidx89);var $92=$q;var $arrayidx90=(($92+8)&4294967295);HEAP32[(($arrayidx90)>>2)]=$91;var $93=$wav_scale;var $94=$amp_addr;var $shl91=((($94)*256)&4294967295);var $add92=((($shl91)+($93))&4294967295);var $95=$q;var $arrayidx93=(($95+12)&4294967295);HEAP32[(($arrayidx93)>>2)]=$add92;__Z8WcmdqIncv();var $96=$len4;var $mul94=((($96)*2)&4294967295);var $97=$length;var $sub95=((($97)-($mul94))&4294967295);$length=$sub95;var $98=$length;var $99=$len4;var $mul77=((($99)*3)&4294967295);var $cmp78=((($98))|0)>((($mul77))|0);if($cmp78){__lastLabel__=29;__label__=27;continue;}else{__lastLabel__=29;__label__=30;break $while_body$$while_end$39;}}}}while(0);var $100=__lastLabel__==29?$98:($78);var $cmp96=((($100))|0)>0;if($cmp96){__label__=31;;}else{__label__=34;;}
67265 if(__label__==31){var $101=$wav_length;var $102=$length;var $sub98=((($101)-($102))&4294967295);$x=$sub98;var $103=$wav_scale;var $cmp99=((($103))|0)==0;if($cmp99){__label__=32;;}else{__label__=33;;}
67266 if(__label__==32){var $104=$x;var $mul101=((($104)*2)&4294967295);$x=$mul101;;}
67267 var $105=HEAP32[((_wcmdq_tail)>>2)];HEAP32[((__ZL10last_wcmdq)>>2)]=$105;var $106=HEAP32[((_wcmdq_tail)>>2)];var $arrayidx103=((_wcmdq+$106*16)&4294967295);var $arraydecay104=(($arrayidx103)&4294967295);$q=$arraydecay104;var $107=$q;var $arrayidx105=(($107)&4294967295);HEAP32[(($arrayidx105)>>2)]=6;var $108=$length;var $109=$q;var $arrayidx106=(($109+4)&4294967295);HEAP32[(($arrayidx106)>>2)]=$108;var $110=$index_addr;var $111=$x;var $add107=((($111)+($110))&4294967295);var $112=HEAP32[((_wavefile_data)>>2)];var $arrayidx108=(($112+$add107)&4294967295);var $113=($arrayidx108);var $114=$q;var $arrayidx109=(($114+8)&4294967295);HEAP32[(($arrayidx109)>>2)]=$113;var $115=$wav_scale;var $116=$amp_addr;var $shl110=((($116)*256)&4294967295);var $add111=((($shl110)+($115))&4294967295);var $117=$q;var $arrayidx112=(($117+12)&4294967295);HEAP32[(($arrayidx112)>>2)]=$add111;__Z8WcmdqIncv();;}
67268 var $118=$length;$retval=$118;;}}}
67269 var $119=$retval;;return $119;return null;}
67270 function __Z18FormantTransition2P10frameref_tRijjP11PHONEME_TABi($seq,$n_frames,$data1,$data2,$other_ph,$which){;var __label__;var $retval;var $seq_addr;var $n_frames_addr;var $data1_addr;var $data2_addr;var $other_ph_addr;var $which_addr;var $ix;var $formant;var $next_rms;var $len;var $rms;var $f1;var $f2;var $f2_min;var $f2_max;var $f3_adj;var $f3_amp;var $flags;var $vcolour;var $fr;var $x;$seq_addr=$seq;$n_frames_addr=$n_frames;$data1_addr=$data1;$data2_addr=$data2;$other_ph_addr=$other_ph;$which_addr=$which;$fr=0;var $0=$n_frames_addr;var $1=HEAP32[(($0)>>2)];var $cmp=((($1))|0)<2;if($cmp){__label__=1;;}else{__label__=2;;}
67271 if(__label__==1){$retval=0;;}
67272 else if(__label__==2){var $2=$data1_addr;var $and=($2)&63;var $mul=((($and)*2)&4294967295);$len=$mul;var $3=$data1_addr;var $shr=($3)>>>6;var $and1=($shr)&63;$rms=$and1;var $4=$data1_addr;var $shr2=($4)>>>12;$flags=$shr2;var $5=$data2_addr;var $and3=($5)&63;var $mul4=((($and3)*50)&4294967295);$f2=$mul4;var $6=$data2_addr;var $shr5=($6)>>>6;var $and6=($shr5)&31;var $sub=((($and6)-15)&4294967295);var $mul7=((($sub)*50)&4294967295);$f2_min=$mul7;var $7=$data2_addr;var $shr8=($7)>>>11;var $and9=($shr8)&31;var $sub10=((($and9)-15)&4294967295);var $mul11=((($sub10)*50)&4294967295);$f2_max=$mul11;var $8=$data2_addr;var $shr12=($8)>>>16;var $and13=($shr12)&31;var $sub14=((($and13)-15)&4294967295);var $mul15=((($sub14)*50)&4294967295);$f3_adj=$mul15;var $9=$data2_addr;var $shr16=($9)>>>21;var $and17=($shr16)&31;var $mul18=((($and17)*8)&4294967295);$f3_amp=$mul18;var $10=$data2_addr;var $shr19=($10)>>>26;var $and20=($shr19)&7;$f1=$and20;var $11=$data2_addr;var $shr21=($11)>>>29;$vcolour=$shr21;var $12=$other_ph_addr;var $cmp22=((($12))|0)!=0;if($cmp22){__label__=3;;}else{__label__=5;;}
67273 $land_lhs_true$$if_end25$5:do{if(__label__==3){var $13=$other_ph_addr;var $mnemonic=(($13)&4294967295);var $14=HEAP32[(($mnemonic)>>2)];var $cmp23=((($14))|0)==63;if(!($cmp23)){__label__=5;break $land_lhs_true$$if_end25$5;}
67274 var $15=$flags;var $or=($15)|8;$flags=$or;;}}while(0);var $16=$which_addr;var $cmp26=((($16))|0)==1;if($cmp26){__label__=6;;}else{__label__=20;;}
67275 $if_then27$$if_else85$9:do{if(__label__==6){var $17=$seq_addr;var $arrayidx=(($17)&4294967295);var $frame=(($arrayidx+4)&4294967295);var $18=HEAP32[(($frame)>>2)];var $call=__ZL9CopyFrameP7frame_ti($18,0);$fr=$call;var $19=$fr;var $20=$seq_addr;var $arrayidx28=(($20)&4294967295);var $frame29=(($arrayidx28+4)&4294967295);HEAP32[(($frame29)>>2)]=$19;var $21=$seq_addr;var $arrayidx30=(($21)&4294967295);var $length=(($arrayidx30)&4294967295);HEAP16[(($length)>>1)]=50;var $22=$len;var $cmp31=((($22))|0)>0;if($cmp31){__label__=7;;}else{__label__=8;;}
67276 if(__label__==7){var $23=$len;var $conv=((($23))&65535);var $24=$seq_addr;var $arrayidx33=(($24)&4294967295);var $length34=(($arrayidx33)&4294967295);HEAP16[(($length34)>>1)]=$conv;;}
67277 var $25=$seq_addr;var $arrayidx36=(($25)&4294967295);var $frflags=(($arrayidx36+2)&4294967295);var $26=HEAP16[(($frflags)>>1)];var $conv37=(tempInt=(($26)),(tempInt>=32768?tempInt-65536:tempInt));var $or38=($conv37)|16384;var $conv39=((($or38))&65535);HEAP16[(($frflags)>>1)]=$conv39;var $27=$fr;var $frflags40=(($27)&4294967295);var $28=HEAP16[(($frflags40)>>1)];var $conv41=(tempInt=(($28)),(tempInt>=32768?tempInt-65536:tempInt));var $or42=($conv41)|16384;var $conv43=((($or42))&65535);HEAP16[(($frflags40)>>1)]=$conv43;var $29=$seq_addr;var $arrayidx44=(($29+8)&4294967295);var $frame45=(($arrayidx44+4)&4294967295);var $30=HEAP32[(($frame45)>>2)];var $rms46=(($30+17)&4294967295);var $31=HEAPU8[($rms46)];var $conv47=((($31))&255);$next_rms=$conv47;var $32=HEAP32[((_voice)>>2)];var $klattv=(($32+112)&4294967295);var $arrayidx48=(($klattv)&4294967295);var $33=HEAP32[(($arrayidx48)>>2)];var $tobool=((($33))|0)!=0;if($tobool){__label__=9;;}else{__label__=10;;}
67278 if(__label__==9){var $34=$seq_addr;var $arrayidx50=(($34+8)&4294967295);var $frame51=(($arrayidx50+4)&4294967295);var $35=HEAP32[(($frame51)>>2)];var $klattp=(($35+39)&4294967295);var $arrayidx52=(($klattp)&4294967295);var $36=HEAPU8[($arrayidx52)];var $conv53=((($36))&255);var $sub54=((($conv53)-4)&4294967295);var $conv55=((($sub54))&255);var $37=$fr;var $klattp56=(($37+39)&4294967295);var $arrayidx57=(($klattp56)&4294967295);HEAP8[($arrayidx57)]=$conv55;;}
67279 var $38=$f2;var $cmp59=((($38))|0)!=0;if($cmp59){__label__=11;;}else{__label__=15;;}
67280 $if_then60$$if_else$17:do{if(__label__==11){var $39=$rms;var $and61=($39)&32;var $tobool62=((($and61))|0)!=0;if($tobool62){__label__=12;;}else{__label__=13;;}
67281 if(__label__==12){var $40=$fr;var $41=$next_rms;var $42=$rms;var $and64=($42)&31;var $mul65=((($and64)*($41))&4294967295);var $div=((((($mul65))|0)/30)|0);__ZL13set_frame_rmsP7frame_ti($40,$div);;}
67282 var $43=$fr;var $44=$f2;var $45=$f2_min;var $46=$f2_max;var $47=$f1;var $48=$f3_adj;var $49=$f3_amp;var $50=$flags;__ZL14AdjustFormantsP7frame_tiiiiiii($43,$44,$45,$46,$47,$48,$49,$50);var $51=$rms;var $and67=($51)&32;var $cmp68=((($and67))|0)==0;if(!($cmp68)){__label__=18;break $if_then60$$if_else$17;}
67283 var $52=$fr;var $53=$rms;var $mul70=((($53)*2)&4294967295);__ZL13set_frame_rmsP7frame_ti($52,$mul70);;}
67284 else if(__label__==15){var $54=$flags;var $and72=($54)&8;var $tobool73=((($and72))|0)!=0;var $55=$fr;if($tobool73){__label__=16;;}else{__label__=17;;}
67285 if(__label__==16){var $56=$next_rms;var $mul75=((($56)*24)&4294967295);var $div76=((((($mul75))|0)/32)|0);__ZL13set_frame_rmsP7frame_ti($55,$div76);;}
67286 else if(__label__==17){__ZL13set_frame_rmsP7frame_ti($55,28);;}}}while(0);var $57=$flags;var $and80=($57)&8;var $tobool81=((($and80))|0)!=0;if(!($tobool81)){__label__=33;break $if_then27$$if_else85$9;}
67287 var $58=$fr;var $call83=__ZL14VowelClosenessP7frame_t($58);var $shl=((($call83)*256)&4294967295);var $add=((($shl)+2048)&4294967295);HEAP32[((__ZL10modn_flags)>>2)]=$add;;}
67288 else if(__label__==20){var $59=$rms;var $mul86=((($59)*2)&4294967295);$rms=$mul86;var $60=$f2;var $cmp87=((($60))|0)!=0;if($cmp87){__label__=22;;}else{__label__=21;;}
67289 if(__label__==21){var $61=$flags;var $cmp88=((($61))|0)!=0;if(!($cmp88)){__label__=33;break $if_then27$$if_else85$9;}}
67290 var $62=$flags;var $and90=($62)&8;var $tobool91=((($and90))|0)!=0;if($tobool91){__label__=23;;}else{__label__=24;;}
67291 $if_then92$$if_else103$33:do{if(__label__==23){var $63=$n_frames_addr;var $64=HEAP32[(($63)>>2)];var $sub93=((($64)-1)&4294967295);var $65=$seq_addr;var $arrayidx94=(($65+8*$sub93)&4294967295);var $frame95=(($arrayidx94+4)&4294967295);var $66=HEAP32[(($frame95)>>2)];var $call96=__ZL9CopyFrameP7frame_ti($66,0);$fr=$call96;var $67=$fr;var $68=$n_frames_addr;var $69=HEAP32[(($68)>>2)];var $sub97=((($69)-1)&4294967295);var $70=$seq_addr;var $arrayidx98=(($70+8*$sub97)&4294967295);var $frame99=(($arrayidx98+4)&4294967295);HEAP32[(($frame99)>>2)]=$67;$rms=35;var $71=$fr;var $call100=__ZL14VowelClosenessP7frame_t($71);var $shl101=((($call100)*256)&4294967295);var $add102=((($shl101)+1024)&4294967295);HEAP32[((__ZL10modn_flags)>>2)]=$add102;;}
67292 else if(__label__==24){var $72=$seq_addr;var $73=$n_frames_addr;var $74=HEAP32[(($73)>>2)];var $inc=((($74)+1)&4294967295);HEAP32[(($73)>>2)]=$inc;var $75=$len;var $call104=__ZL18DuplicateLastFrameP10frameref_tii($72,$74,$75);$fr=$call104;var $76=$len;var $cmp105=((($76))|0)>36;if($cmp105){__label__=25;;}else{__label__=26;;}
67293 if(__label__==25){var $77=$len;var $78=HEAP32[((_seq_len_adjust)>>2)];var $sub107=((($77)-36)&4294967295);var $add108=((($sub107)+($78))&4294967295);HEAP32[((_seq_len_adjust)>>2)]=$add108;;}
67294 var $79=$f2;var $cmp110=((($79))|0)!=0;if(!($cmp110)){__label__=28;break $if_then92$$if_else103$33;}
67295 var $80=$fr;var $81=$f2;var $82=$f2_min;var $83=$f2_max;var $84=$f1;var $85=$f3_adj;var $86=$f3_amp;var $87=$flags;__ZL14AdjustFormantsP7frame_tiiiiiii($80,$81,$82,$83,$84,$85,$86,$87);;}}while(0);var $88=$fr;var $89=$rms;__ZL13set_frame_rmsP7frame_ti($88,$89);var $90=$vcolour;var $cmp114=((($90))|0)>0;var $91=$vcolour;var $cmp116=((($91))|0)<=2;var $or_cond=($cmp114)&($cmp116);if(!($or_cond)){__label__=33;break $if_then27$$if_else85$9;}
67296 $ix=0;var $92=$ix;var $93=$n_frames_addr;var $94=HEAP32[(($93)>>2)];var $cmp1181=((($92))|0)<((($94))|0);if(!($cmp1181)){__label__=33;break $if_then27$$if_else85$9;}
67297 $for_body$42:while(1){var $95=$ix;var $96=$seq_addr;var $arrayidx119=(($96+8*$95)&4294967295);var $frame120=(($arrayidx119+4)&4294967295);var $97=HEAP32[(($frame120)>>2)];var $call121=__ZL9CopyFrameP7frame_ti($97,0);$fr=$call121;var $98=$fr;var $99=$ix;var $100=$seq_addr;var $arrayidx122=(($100+8*$99)&4294967295);var $frame123=(($arrayidx122+4)&4294967295);HEAP32[(($frame123)>>2)]=$98;$formant=1;;while(1){var $101=$formant;var $102=$fr;var $ffreq=(($102+2)&4294967295);var $arrayidx127=(($ffreq+$101*2)&4294967295);var $103=HEAP16[(($arrayidx127)>>1)];var $conv128=(tempInt=(($103)),(tempInt>=32768?tempInt-65536:tempInt));var $104=$formant;var $sub129=((($104)-1)&4294967295);var $105=$vcolour;var $sub130=((($105)-1)&4294967295);var $arrayidx131=((__ZZ18FormantTransition2P10frameref_tRijjP11PHONEME_TABiE10vcolouring+$sub130*10)&4294967295);var $arrayidx132=(($arrayidx131+$sub129*2)&4294967295);var $106=HEAP16[(($arrayidx132)>>1)];var $conv133=(tempInt=(($106)),(tempInt>=32768?tempInt-65536:tempInt));var $mul134=((($conv133)*($conv128))&4294967295);$x=$mul134;var $107=$x;var $div135=((((($107))|0)/256)|0);var $conv136=((($div135))&65535);var $108=$formant;var $109=$fr;var $ffreq137=(($109+2)&4294967295);var $arrayidx138=(($ffreq137+$108*2)&4294967295);HEAP16[(($arrayidx138)>>1)]=$conv136;var $110=$formant;var $inc139=((($110)+1)&4294967295);$formant=$inc139;var $cmp125=((($inc139))|0)<=5;if($cmp125){__label__=31;continue;}else{__label__=32;break;}}
67298 var $111=$ix;var $inc141=((($111)+1)&4294967295);$ix=$inc141;var $112=$ix;var $113=$n_frames_addr;var $114=HEAP32[(($113)>>2)];var $cmp118=((($112))|0)<((($114))|0);if($cmp118){__label__=30;continue $for_body$42;}else{__label__=33;break $if_then27$$if_else85$9;}}}}while(0);var $115=$fr;var $cmp146=((($115))|0)!=0;if($cmp146){__label__=34;;}else{__label__=38;;}
67299 $if_then147$$if_end164$48:do{if(__label__==34){var $116=$flags;var $and148=($116)&4;var $tobool149=((($and148))|0)!=0;if($tobool149){__label__=35;;}else{__label__=36;;}
67300 if(__label__==35){var $117=$fr;var $frflags151=(($117)&4294967295);var $118=HEAP16[(($frflags151)>>1)];var $conv152=(tempInt=(($118)),(tempInt>=32768?tempInt-65536:tempInt));var $or153=($conv152)|32;var $conv154=((($or153))&65535);HEAP16[(($frflags151)>>1)]=$conv154;;}
67301 var $119=$flags;var $and156=($119)&2;var $tobool157=((($and156))|0)!=0;if(!($tobool157)){__label__=38;break $if_then147$$if_end164$48;}
67302 var $120=$fr;var $frflags159=(($120)&4294967295);var $121=HEAP16[(($frflags159)>>1)];var $conv160=(tempInt=(($121)),(tempInt>=32768?tempInt-65536:tempInt));var $or161=($conv160)|16;var $conv162=((($or161))&65535);HEAP16[(($frflags159)>>1)]=$conv162;;}}while(0);var $122=$flags;var $and165=($122)&64;var $tobool166=((($and165))|0)!=0;if($tobool166){__label__=39;;}else{__label__=40;;}
67303 if(__label__==39){__ZL7DoPauseii(12,0);;}
67304 var $123=$flags;var $and169=($123)&16;var $tobool170=((($and169))|0)!=0;if($tobool170){__label__=41;;}else{__label__=42;;}
67305 if(__label__==41){var $124=$len;$retval=$124;;}
67306 else if(__label__==42){$retval=0;;}}
67307 var $125=$retval;;return $125;return null;}
67308 function __ZL9CopyFrameP7frame_ti($frame1,$copy){;var __label__;var $retval;var $frame1_addr;var $copy_addr;var $frame2;$frame1_addr=$frame1;$copy_addr=$copy;var $0=$copy_addr;var $cmp=((($0))|0)==0;if($cmp){__label__=1;;}else{__label__=3;;}
67309 $land_lhs_true$$if_end$2:do{if(__label__==1){var $1=$frame1_addr;var $frflags=(($1)&4294967295);var $2=HEAP16[(($frflags)>>1)];var $conv=(tempInt=(($2)),(tempInt>=32768?tempInt-65536:tempInt));var $and=($conv)&32768;var $tobool=((($and))|0)!=0;if(!($tobool)){__label__=3;break $land_lhs_true$$if_end$2;}
67310 var $3=$frame1_addr;$retval=$3;__label__=6;break $land_lhs_true$$if_end$2;}}while(0);if(__label__==3){var $call=__ZL10AllocFramev();$frame2=$call;var $cmp1=((($call))|0)!=0;if($cmp1){__label__=4;;}else{__label__=5;;}
67311 if(__label__==4){var $4=$frame2;var $5=$4;var $6=$frame1_addr;var $7=$6;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$7;$dest$=$5;$stop$=$src$+64;if(($dest$%4)==($src$%4)&&64>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
67312 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
67313 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $8=$frame2;var $length=(($8+16)&4294967295);HEAP8[($length)]=0;var $9=$frame2;var $frflags3=(($9)&4294967295);var $10=HEAP16[(($frflags3)>>1)];var $conv4=(tempInt=(($10)),(tempInt>=32768?tempInt-65536:tempInt));var $or=($conv4)|32768;var $conv5=((($or))&65535);HEAP16[(($frflags3)>>1)]=$conv5;;}
67314 var $11=$frame2;$retval=$11;;}
67315 var $12=$retval;;return $12;return null;}
67316 function __ZL13set_frame_rmsP7frame_ti($fr,$new_rms){;var __label__;var $fr_addr;var $new_rms_addr;var $x;var $h;var $ix;$fr_addr=$fr;$new_rms_addr=$new_rms;var $0=HEAP32[((_voice)>>2)];var $klattv=(($0+112)&4294967295);var $arrayidx=(($klattv)&4294967295);var $1=HEAP32[(($arrayidx)>>2)];var $tobool=((($1))|0)!=0;if($tobool){__label__=1;;}else{__label__=3;;}
67317 $if_then$$if_end3$2:do{if(__label__==1){var $2=$new_rms_addr;var $cmp=((($2))|0)==-1;if(!($cmp)){__label__=8;break $if_then$$if_end3$2;}
67318 var $3=$fr_addr;var $klattp=(($3+39)&4294967295);var $arrayidx2=(($klattp)&4294967295);HEAP8[($arrayidx2)]=50;;}
67319 else if(__label__==3){var $4=$fr_addr;var $rms=(($4+17)&4294967295);var $5=HEAPU8[($rms)];var $conv=((($5))&255);var $cmp4=((($conv))|0)==0;if($cmp4){__label__=8;break $if_then$$if_end3$2;}
67320 var $6=$new_rms_addr;var $mul=((($6)*64)&4294967295);var $7=$fr_addr;var $rms7=(($7+17)&4294967295);var $8=HEAPU8[($rms7)];var $conv8=((($8))&255);var $div=((((($mul))|0)/((($conv8))|0))|0);$x=$div;var $9=$x;var $cmp9=((($9))|0)>=200;if($cmp9){__label__=5;;}else{__label__=6;;}
67321 if(__label__==5){$x=199;;}
67322 var $10=$x;var $arrayidx12=((__ZZL13set_frame_rmsP7frame_tiE8sqrt_tab+$10*2)&4294967295);var $11=HEAP16[(($arrayidx12)>>1)];var $conv13=(tempInt=(($11)),(tempInt>=32768?tempInt-65536:tempInt));$x=$conv13;$ix=0;;while(1){var $12=$ix;var $13=$fr_addr;var $fheight=(($13+18)&4294967295);var $arrayidx15=(($fheight+$12)&4294967295);var $14=HEAPU8[($arrayidx15)];var $conv16=((($14))&255);var $15=$x;var $mul17=((($conv16)*($15))&4294967295);$h=$mul17;var $16=$h;var $div18=((((($16))|0)/512)|0);var $conv19=((($div18))&255);var $17=$ix;var $18=$fr_addr;var $fheight20=(($18+18)&4294967295);var $arrayidx21=(($fheight20+$17)&4294967295);HEAP8[($arrayidx21)]=$conv19;var $19=$ix;var $inc=((($19)+1)&4294967295);$ix=$inc;var $cmp14=((($inc))|0)<8;if($cmp14){__label__=7;continue;}else{__label__=8;break $if_then$$if_end3$2;}}}}while(0);;return;return;}
67323 function __ZL14AdjustFormantsP7frame_tiiiiiii($fr,$target,$min,$max,$f1_adj,$f3_adj,$hf_reduce,$flags){;var __label__;var __lastLabel__=null;var $fr_addr;var $target_addr;var $min_addr;var $max_addr;var $f1_adj_addr;var $f3_adj_addr;var $hf_reduce_addr;var $flags_addr;var $x;$fr_addr=$fr;$target_addr=$target;$min_addr=$min;$max_addr=$max;$f1_adj_addr=$f1_adj;$f3_adj_addr=$f3_adj;$hf_reduce_addr=$hf_reduce;$flags_addr=$flags;var $0=$target_addr;var $1=HEAP32[((_voice)>>2)];var $formant_factor=(($1+96)&4294967295);var $2=HEAP32[(($formant_factor)>>2)];var $mul=((($2)*($0))&4294967295);var $div=((((($mul))|0)/256)|0);$target_addr=$div;var $3=$target_addr;var $4=$fr_addr;var $ffreq=(($4+2)&4294967295);var $arrayidx=(($ffreq+4)&4294967295);var $5=HEAP16[(($arrayidx)>>1)];var $conv=(tempInt=(($5)),(tempInt>=32768?tempInt-65536:tempInt));var $sub=((($3)-($conv))&4294967295);var $div1=((((($sub))|0)/2)|0);$x=$div1;var $6=$x;var $7=$max_addr;var $cmp=((($6))|0)>((($7))|0);if($cmp){__label__=1;;}else{__label__=2;;}
67324 if(__label__==1){var $8=$max_addr;$x=$8;;}
67325 var $9=$x;var $10=$min_addr;var $cmp2=((($9))|0)<((($10))|0);if($cmp2){__label__=3;;}else{__label__=4;;}
67326 if(__label__==3){var $11=$min_addr;$x=$11;;}
67327 var $12=$x;var $13=$fr_addr;var $ffreq5=(($13+2)&4294967295);var $arrayidx6=(($ffreq5+4)&4294967295);var $14=HEAP16[(($arrayidx6)>>1)];var $conv7=(tempInt=(($14)),(tempInt>=32768?tempInt-65536:tempInt));var $add=((($conv7)+($12))&4294967295);var $conv8=((($add))&65535);HEAP16[(($arrayidx6)>>1)]=$conv8;var $15=$f3_adj_addr;var $16=$fr_addr;var $ffreq9=(($16+2)&4294967295);var $arrayidx10=(($ffreq9+6)&4294967295);var $17=HEAP16[(($arrayidx10)>>1)];var $conv11=(tempInt=(($17)),(tempInt>=32768?tempInt-65536:tempInt));var $add12=((($conv11)+($15))&4294967295);var $conv13=((($add12))&65535);HEAP16[(($arrayidx10)>>1)]=$conv13;var $18=$flags_addr;var $and=($18)&32;var $tobool=((($and))|0)!=0;if($tobool){__label__=5;;}else{__label__=6;;}
67328 if(__label__==5){var $19=$f3_adj_addr;var $sub15=(((-($19)))&4294967295);$f3_adj_addr=$sub15;;}
67329 var $20=$f3_adj_addr;var $21=$fr_addr;var $ffreq17=(($21+2)&4294967295);var $arrayidx18=(($ffreq17+8)&4294967295);var $22=HEAP16[(($arrayidx18)>>1)];var $conv19=(tempInt=(($22)),(tempInt>=32768?tempInt-65536:tempInt));var $add20=((($conv19)+($20))&4294967295);var $conv21=((($add20))&65535);HEAP16[(($arrayidx18)>>1)]=$conv21;var $23=$f3_adj_addr;var $24=$fr_addr;var $ffreq22=(($24+2)&4294967295);var $arrayidx23=(($ffreq22+10)&4294967295);var $25=HEAP16[(($arrayidx23)>>1)];var $conv24=(tempInt=(($25)),(tempInt>=32768?tempInt-65536:tempInt));var $add25=((($conv24)+($23))&4294967295);var $conv26=((($add25))&65535);HEAP16[(($arrayidx23)>>1)]=$conv26;var $26=$f1_adj_addr;var $cmp27=((($26))|0)==1;if($cmp27){__lastLabel__=6;__label__=7;;}else{__lastLabel__=6;__label__=12;;}
67330 if(__label__==7){var $27=$fr_addr;var $ffreq29=(($27+2)&4294967295);var $arrayidx30=(($ffreq29+2)&4294967295);var $28=HEAP16[(($arrayidx30)>>1)];var $conv31=(tempInt=(($28)),(tempInt>=32768?tempInt-65536:tempInt));var $sub32=((235-($conv31))&4294967295);$x=$sub32;var $29=$x;var $cmp33=((($29))|0)<-100;if($cmp33){__label__=8;;}else{__label__=9;;}
67331 $if_end35_thread$$if_end35$13:do{if(__label__==8){$x=-100;;}
67332 else if(__label__==9){var $cmp36=((($29))|0)>-60;if(!($cmp36)){__label__=11;break $if_end35_thread$$if_end35$13;}
67333 $x=-60;;}}while(0);var $30=$x;var $31=$fr_addr;var $ffreq39=(($31+2)&4294967295);var $arrayidx40=(($ffreq39+2)&4294967295);var $32=HEAP16[(($arrayidx40)>>1)];var $conv41=(tempInt=(($32)),(tempInt>=32768?tempInt-65536:tempInt));var $add42=((($conv41)+($30))&4294967295);var $conv43=((($add42))&65535);HEAP16[(($arrayidx40)>>1)]=$conv43;var $_pr=$f1_adj_addr;__lastLabel__=11;;}
67334 var $33=__lastLabel__==11?$_pr:($26);var $cmp45=((($33))|0)==2;if($cmp45){__label__=13;;}else{__label__=18;;}
67335 if(__label__==13){var $34=$fr_addr;var $ffreq47=(($34+2)&4294967295);var $arrayidx48=(($ffreq47+2)&4294967295);var $35=HEAP16[(($arrayidx48)>>1)];var $conv49=(tempInt=(($35)),(tempInt>=32768?tempInt-65536:tempInt));var $sub50=((235-($conv49))&4294967295);$x=$sub50;var $36=$x;var $cmp51=((($36))|0)<-300;if($cmp51){__label__=14;;}else{__label__=15;;}
67336 $if_end53_thread$$if_end53$21:do{if(__label__==14){$x=-300;;}
67337 else if(__label__==15){var $cmp54=((($36))|0)>-150;if(!($cmp54)){__label__=17;break $if_end53_thread$$if_end53$21;}
67338 $x=-150;;}}while(0);var $37=$x;var $38=$fr_addr;var $ffreq57=(($38+2)&4294967295);var $arrayidx58=(($ffreq57+2)&4294967295);var $39=HEAP16[(($arrayidx58)>>1)];var $conv59=(tempInt=(($39)),(tempInt>=32768?tempInt-65536:tempInt));var $add60=((($conv59)+($37))&4294967295);var $conv61=((($add60))&65535);HEAP16[(($arrayidx58)>>1)]=$conv61;var $40=$x;var $41=$fr_addr;var $ffreq62=(($41+2)&4294967295);var $arrayidx63=(($ffreq62)&4294967295);var $42=HEAP16[(($arrayidx63)>>1)];var $conv64=(tempInt=(($42)),(tempInt>=32768?tempInt-65536:tempInt));var $add65=((($conv64)+($40))&4294967295);var $conv66=((($add65))&65535);HEAP16[(($arrayidx63)>>1)]=$conv66;;}
67339 var $43=$f1_adj_addr;var $cmp68=((($43))|0)==3;if($cmp68){__label__=19;;}else{__label__=24;;}
67340 if(__label__==19){var $44=$fr_addr;var $ffreq70=(($44+2)&4294967295);var $arrayidx71=(($ffreq70+2)&4294967295);var $45=HEAP16[(($arrayidx71)>>1)];var $conv72=(tempInt=(($45)),(tempInt>=32768?tempInt-65536:tempInt));var $sub73=((100-($conv72))&4294967295);$x=$sub73;var $46=$x;var $cmp74=((($46))|0)<-400;if($cmp74){__label__=20;;}else{__label__=21;;}
67341 $if_end76_thread$$if_end76$29:do{if(__label__==20){$x=-400;;}
67342 else if(__label__==21){var $cmp77=((($46))|0)>-300;if(!($cmp77)){__label__=23;break $if_end76_thread$$if_end76$29;}
67343 $x=-400;;}}while(0);var $47=$x;var $48=$fr_addr;var $ffreq80=(($48+2)&4294967295);var $arrayidx81=(($ffreq80+2)&4294967295);var $49=HEAP16[(($arrayidx81)>>1)];var $conv82=(tempInt=(($49)),(tempInt>=32768?tempInt-65536:tempInt));var $add83=((($conv82)+($47))&4294967295);var $conv84=((($add83))&65535);HEAP16[(($arrayidx81)>>1)]=$conv84;var $50=$x;var $51=$fr_addr;var $ffreq85=(($51+2)&4294967295);var $arrayidx86=(($ffreq85)&4294967295);var $52=HEAP16[(($arrayidx86)>>1)];var $conv87=(tempInt=(($52)),(tempInt>=32768?tempInt-65536:tempInt));var $add88=((($conv87)+($50))&4294967295);var $conv89=((($add88))&65535);HEAP16[(($arrayidx86)>>1)]=$conv89;;}
67344 var $53=$fr_addr;var $54=$hf_reduce_addr;__ZL18formants_reduce_hfP7frame_ti($53,$54);;return;return;}
67345 function __ZL14VowelClosenessP7frame_t($fr){;var __label__;var $retval;var $fr_addr;var $f1;$fr_addr=$fr;var $0=$fr_addr;var $ffreq=(($0+2)&4294967295);var $arrayidx=(($ffreq+2)&4294967295);var $1=HEAP16[(($arrayidx)>>1)];var $conv=(tempInt=(($1)),(tempInt>=32768?tempInt-65536:tempInt));$f1=$conv;var $cmp=((($conv))|0)<300;if($cmp){__label__=1;;}else{__label__=2;;}
67346 if(__label__==1){$retval=3;;}
67347 else if(__label__==2){var $2=$f1;var $cmp1=((($2))|0)<400;if($cmp1){__label__=3;;}else{__label__=4;;}
67348 if(__label__==3){$retval=2;;}
67349 else if(__label__==4){var $3=$f1;var $cmp4=((($3))|0)<500;if($cmp4){__label__=5;;}else{__label__=6;;}
67350 if(__label__==5){$retval=1;;}
67351 else if(__label__==6){$retval=0;;}}}
67352 var $4=$retval;;return $4;return null;}
67353 function __ZL18DuplicateLastFrameP10frameref_tii($seq,$n_frames,$length){;var __label__;var $seq_addr;var $n_frames_addr;var $length_addr;var $fr;$seq_addr=$seq;$n_frames_addr=$n_frames;$length_addr=$length;var $0=$length_addr;var $conv=((($0))&65535);var $1=$n_frames_addr;var $sub=((($1)-1)&4294967295);var $2=$seq_addr;var $arrayidx=(($2+8*$sub)&4294967295);var $length1=(($arrayidx)&4294967295);HEAP16[(($length1)>>1)]=$conv;var $3=$n_frames_addr;var $sub2=((($3)-1)&4294967295);var $4=$seq_addr;var $arrayidx3=(($4+8*$sub2)&4294967295);var $frame=(($arrayidx3+4)&4294967295);var $5=HEAP32[(($frame)>>2)];var $call=__ZL9CopyFrameP7frame_ti($5,1);$fr=$call;var $6=$fr;var $7=$n_frames_addr;var $8=$seq_addr;var $arrayidx4=(($8+8*$7)&4294967295);var $frame5=(($arrayidx4+4)&4294967295);HEAP32[(($frame5)>>2)]=$6;var $9=$n_frames_addr;var $10=$seq_addr;var $arrayidx6=(($10+8*$9)&4294967295);var $length7=(($arrayidx6)&4294967295);HEAP16[(($length7)>>1)]=0;var $11=$fr;;return $11;return null;}
67354 function __ZL7DoPauseii($length,$control){;var __label__;var $length_addr;var $control_addr;var $len;$length_addr=$length;$control_addr=$control;var $0=$length_addr;var $cmp=((($0))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
67355 if(__label__==1){$len=0;;}
67356 else if(__label__==2){var $1=$length_addr;var $2=$control_addr;var $call=__Z11PauseLengthii($1,$2);$len=$call;var $3=$len;var $4=HEAP32[((_samplerate)>>2)];var $mul=((($4)*($3))&4294967295);var $div=((((($mul))|0)/1000)|0);$len=$div;;}
67357 __ZL8EndPitchi(1);var $5=HEAP32[((_wcmdq_tail)>>2)];var $arrayidx=((_wcmdq+$5*16)&4294967295);var $arrayidx1=(($arrayidx)&4294967295);HEAP32[(($arrayidx1)>>2)]=5;var $6=$len;var $7=HEAP32[((_wcmdq_tail)>>2)];var $arrayidx2=((_wcmdq+$7*16)&4294967295);var $arrayidx3=(($arrayidx2+4)&4294967295);HEAP32[(($arrayidx3)>>2)]=$6;__Z8WcmdqIncv();HEAP32[((__ZL10last_frame)>>2)]=0;var $8=HEAP32[((__ZL13fmt_amplitude)>>2)];var $cmp4=((($8))|0)!=0;if($cmp4){__label__=4;;}else{__label__=5;;}
67358 if(__label__==4){var $9=HEAP32[((_wcmdq_tail)>>2)];var $arrayidx6=((_wcmdq+$9*16)&4294967295);var $arrayidx7=(($arrayidx6)&4294967295);HEAP32[(($arrayidx7)>>2)]=14;HEAP32[((__ZL13fmt_amplitude)>>2)]=0;var $10=HEAP32[((_wcmdq_tail)>>2)];var $arrayidx8=((_wcmdq+$10*16)&4294967295);var $arrayidx9=(($arrayidx8+4)&4294967295);HEAP32[(($arrayidx9)>>2)]=0;__Z8WcmdqIncv();;};return;return;}
67359 function __Z8DoSpect2P11PHONEME_TABiP10FMT_PARAMSP12PHONEME_LISTi($this_ph,$which,$fmt_params,$plist,$modulation){var __stackBase__=STACKTOP;STACKTOP+=104;_memset(__stackBase__,0,104);var __label__;var __lastLabel__=null;var $retval;var $this_ph_addr;var $which_addr;var $fmt_params_addr;var $plist_addr;var $modulation_addr;var $n_frames=__stackBase__;var $frames;var $frameix;var $frame1;var $frame2;var $fr;var $ix;var $q;var $len;var $frame_length;var $length_factor;var $length_mod;var $length_sum;var $length_min;var $total_len;var $wcmd_spect;var $frame_lengths=__stackBase__+4;$this_ph_addr=$this_ph;$which_addr=$which;$fmt_params_addr=$fmt_params;$plist_addr=$plist;$modulation_addr=$modulation;$total_len=0;$wcmd_spect=3;var $0=$fmt_params_addr;var $fmt_addr=(($0+8)&4294967295);var $1=HEAP32[(($fmt_addr)>>2)];var $cmp=((($1))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
67360 if(__label__==1){$retval=0;;}
67361 else if(__label__==2){var $2=$plist_addr;var $length=(($2+12)&4294967295);var $3=HEAP16[(($length)>>1)];var $conv=(tempInt=(($3)),(tempInt>=32768?tempInt-65536:tempInt));$length_mod=$conv;var $4=$length_mod;var $cmp1=((($4))|0)==0;if($cmp1){__label__=3;;}else{__label__=4;;}
67362 if(__label__==3){$length_mod=256;;}
67363 var $5=HEAP32[((_samplerate)>>2)];var $div=((((($5))|0)/70)|0);$length_min=$div;var $6=$which_addr;var $cmp4=((($6))|0)==2;if($cmp4){__lastLabel__=4;__label__=5;;}else{__lastLabel__=4;__label__=11;;}
67364 if(__label__==5){var $7=HEAP32[((_translator)>>2)];var $langopts=(($7)&4294967295);var $param=(($langopts+24)&4294967295);var $arrayidx=(($param+72)&4294967295);var $8=HEAP32[(($arrayidx)>>2)];var $cmp6=((($8))|0)>0;if($cmp6){__label__=6;;}else{__label__=10;;}
67365 $land_lhs_true$$if_end18thread_pre_split$10:do{if(__label__==6){var $9=$this_ph_addr;var $std_length=(($9+14)&4294967295);var $10=HEAPU8[($std_length)];var $conv7=((($10))&255);var $11=HEAP32[((_translator)>>2)];var $langopts8=(($11)&4294967295);var $param9=(($langopts8+24)&4294967295);var $arrayidx10=(($param9+72)&4294967295);var $12=HEAP32[(($arrayidx10)>>2)];var $cmp11=((($conv7))|0)>=((($12))|0);if($cmp11){__label__=9;;}else{__label__=7;;}
67366 $if_then16$$lor_lhs_false$12:do{if(__label__==7){var $13=$plist_addr;var $synthflags=(($13+4)&4294967295);var $14=HEAPU16[(($synthflags)>>1)];var $conv12=((($14))&65535);var $and=($conv12)&8;var $tobool=((($and))|0)!=0;if($tobool){__label__=9;break $if_then16$$lor_lhs_false$12;}
67367 var $15=$this_ph_addr;var $phflags=(($15+4)&4294967295);var $16=HEAP32[(($phflags)>>2)];var $and14=($16)&2097152;var $tobool15=((($and14))|0)!=0;if(!($tobool15)){__label__=10;break $land_lhs_true$$if_end18thread_pre_split$10;}}}while(0);var $17=$length_min;var $mul=((($17)*2)&4294967295);$length_min=$mul;;}}while(0);var $_pr=$which_addr;__lastLabel__=10;;}
67368 var $18=__lastLabel__==10?$_pr:($6);var $cmp19=((($18))|0)==1;if($cmp19){__label__=12;;}else{__label__=17;;}
67369 $if_then20$$if_end41$18:do{if(__label__==12){var $19=$this_ph_addr;var $type=(($19+11)&4294967295);var $20=HEAPU8[($type)];var $conv21=((($20))&255);var $cmp22=((($conv21))|0)==3;if($cmp22){__label__=15;;}else{__label__=13;;}
67370 $if_then33$$lor_lhs_false23$20:do{if(__label__==13){var $21=$plist_addr;var $arrayidx24=(($21+-24)&4294967295);var $type25=(($arrayidx24+15)&4294967295);var $22=HEAPU8[($type25)];var $conv26=((($22))&255);var $cmp27=((($conv26))|0)==3;if($cmp27){__label__=15;break $if_then33$$lor_lhs_false23$20;}
67371 var $23=$plist_addr;var $arrayidx29=(($23+-24)&4294967295);var $type30=(($arrayidx29+15)&4294967295);var $24=HEAPU8[($type30)];var $conv31=((($24))&255);var $cmp32=((($conv31))|0)==8;if(!($cmp32)){__label__=17;break $if_then20$$if_end41$18;}}}while(0);var $25=$length_mod;var $26=HEAP32[((_translator)>>2)];var $langopts34=(($26)&4294967295);var $param35=(($langopts34+24)&4294967295);var $arrayidx36=(($param35+28)&4294967295);var $27=HEAP32[(($arrayidx36)>>2)];$len=$27;var $cmp37=((($25))|0)<((($27))|0);if(!($cmp37)){__label__=17;break $if_then20$$if_end41$18;}
67372 var $28=$len;$length_mod=$28;;}}while(0);HEAP32[((__ZL10modn_flags)>>2)]=0;var $29=$this_ph_addr;var $30=$which_addr;var $31=$fmt_params_addr;var $32=$plist_addr;var $call=__Z11LookupSpectP11PHONEME_TABiP10FMT_PARAMSPiP12PHONEME_LIST($29,$30,$31,$n_frames,$32);$frames=$call;var $cmp42=((($call))|0)==0;if($cmp42){__label__=18;;}else{__label__=19;;}
67373 if(__label__==18){$retval=0;;}
67374 else if(__label__==19){var $33=$fmt_params_addr;var $fmt_amp=(($33+16)&4294967295);var $34=HEAP32[(($fmt_amp)>>2)];var $35=HEAP32[((__ZL13fmt_amplitude)>>2)];var $cmp45=((($34))|0)!=((($35))|0);if($cmp45){__label__=20;;}else{__label__=21;;}
67375 if(__label__==20){var $36=HEAP32[((_wcmdq_tail)>>2)];var $arrayidx47=((_wcmdq+$36*16)&4294967295);var $arraydecay=(($arrayidx47)&4294967295);$q=$arraydecay;var $37=$q;var $arrayidx48=(($37)&4294967295);HEAP32[(($arrayidx48)>>2)]=14;var $38=$fmt_params_addr;var $fmt_amp49=(($38+16)&4294967295);var $39=HEAP32[(($fmt_amp49)>>2)];HEAP32[((__ZL13fmt_amplitude)>>2)]=$39;var $40=$q;var $arrayidx50=(($40+4)&4294967295);HEAP32[(($arrayidx50)>>2)]=$39;__Z8WcmdqIncv();;}
67376 var $41=$frames;var $arrayidx52=(($41)&4294967295);var $frame=(($arrayidx52+4)&4294967295);var $42=HEAP32[(($frame)>>2)];$frame1=$42;var $43=HEAP32[((_voice)>>2)];var $klattv=(($43+112)&4294967295);var $arrayidx53=(($klattv)&4294967295);var $44=HEAP32[(($arrayidx53)>>2)];var $tobool54=((($44))|0)!=0;if($tobool54){__label__=22;;}else{__label__=23;;}
67377 if(__label__==22){$wcmd_spect=1;;}
67378 var $45=$fmt_params_addr;var $wav_addr=(($45+28)&4294967295);var $46=HEAP32[(($wav_addr)>>2)];HEAP32[((_wavefile_ix)>>2)]=$46;var $47=$fmt_params_addr;var $wav_amp=(($47+32)&4294967295);var $48=HEAP32[(($wav_amp)>>2)];var $cmp57=((($48))|0)==0;if($cmp57){__label__=24;;}else{__label__=25;;}
67379 if(__label__==24){HEAP32[((_wavefile_amp)>>2)]=32;;}
67380 else if(__label__==25){var $49=$fmt_params_addr;var $wav_amp59=(($49+32)&4294967295);var $50=HEAP32[(($wav_amp59)>>2)];var $mul60=((($50)*32)&4294967295);var $div61=((((($mul60))|0)/100)|0);HEAP32[((_wavefile_amp)>>2)]=$div61;;}
67381 var $51=HEAP32[((_wavefile_ix)>>2)];var $cmp63=((($51))|0)==0;if($cmp63){__label__=27;;}else{__label__=33;;}
67382 $if_then64$$if_end79$39:do{if(__label__==27){var $_b=HEAPU8[(__ZZ8DoSpect2P11PHONEME_TABiP10FMT_PARAMSP12PHONEME_LISTiE9wave_flag_b)];var $52=((($_b))&1);var $tobool65=((($52))|0)!=0;if($tobool65){__label__=28;;}else{__label__=31;;}
67383 if(__label__==28){$wcmd_spect=4;var $53=HEAP32[((_voice)>>2)];var $klattv67=(($53+112)&4294967295);var $arrayidx68=(($klattv67)&4294967295);var $54=HEAP32[(($arrayidx68)>>2)];var $tobool69=((($54))|0)!=0;if($tobool69){__label__=29;;}else{__label__=30;;}
67384 if(__label__==29){$wcmd_spect=2;;}
67385 HEAP8[(__ZZ8DoSpect2P11PHONEME_TABiP10FMT_PARAMSP12PHONEME_LISTiE9wave_flag_b)]=0;;}
67386 else if(__label__==31){$wcmd_spect=3;var $55=HEAP32[((_voice)>>2)];var $klattv73=(($55+112)&4294967295);var $arrayidx74=(($klattv73)&4294967295);var $56=HEAP32[(($arrayidx74)>>2)];var $tobool75=((($56))|0)!=0;if(!($tobool75)){__label__=33;break $if_then64$$if_end79$39;}
67387 $wcmd_spect=1;;}}}while(0);var $57=HEAP32[((__ZL10last_frame)>>2)];var $cmp80=((($57))|0)!=0;if($cmp80){__label__=34;;}else{__label__=43;;}
67388 $if_then81$$if_end117$49:do{if(__label__==34){var $58=HEAP32[((__ZL10last_frame)>>2)];var $length82=(($58+16)&4294967295);var $59=HEAPU8[($length82)];var $conv83=((($59))&255);var $cmp84=((($conv83))|0)<2;if($cmp84){__label__=36;;}else{__label__=35;;}
67389 if(__label__==35){var $60=HEAP32[((__ZL10last_frame)>>2)];var $frflags=(($60)&4294967295);var $61=HEAP16[(($frflags)>>1)];var $conv86=(tempInt=(($61)),(tempInt>=32768?tempInt-65536:tempInt));var $and87=($conv86)&2;var $tobool88=((($and87))|0)!=0;if(!($tobool88)){__label__=43;break $if_then81$$if_end117$49;}}
67390 var $62=HEAP32[((__ZL10last_frame)>>2)];var $frflags90=(($62)&4294967295);var $63=HEAP16[(($frflags90)>>1)];var $conv91=(tempInt=(($63)),(tempInt>=32768?tempInt-65536:tempInt));var $and92=($conv91)&16;var $tobool93=((($and92))|0)!=0;if($tobool93){__label__=43;break $if_then81$$if_end117$49;}
67391 var $64=$frame1;var $65=($64);var $66=HEAP32[((__ZL10last_wcmdq)>>2)];var $arrayidx95=((_wcmdq+$66*16)&4294967295);var $arrayidx96=(($arrayidx95+12)&4294967295);HEAP32[(($arrayidx96)>>2)]=$65;var $67=HEAP32[((__ZL10last_frame)>>2)];var $frflags97=(($67)&4294967295);var $68=HEAP16[(($frflags97)>>1)];var $conv98=(tempInt=(($68)),(tempInt>=32768?tempInt-65536:tempInt));var $and99=($conv98)&8;var $tobool100=((($and99))|0)!=0;if(!($tobool100)){__label__=43;break $if_then81$$if_end117$49;}
67392 var $69=$frame1;var $call102=__ZL9CopyFrameP7frame_ti($69,1);$fr=$call102;$ix=3;__lastLabel__=38;;while(1){var $70=__lastLabel__==38?3:($inc);var $cmp104=((($70))|0)<7;if($cmp104){__label__=40;;}else{__label__=41;;}
67393 if(__label__==40){var $71=$ix;var $72=HEAP32[((__ZL10last_frame)>>2)];var $ffreq=(($72+2)&4294967295);var $arrayidx106=(($ffreq+$71*2)&4294967295);var $73=HEAP16[(($arrayidx106)>>1)];var $74=$ix;var $75=$fr;var $ffreq107=(($75+2)&4294967295);var $arrayidx108=(($ffreq107+$74*2)&4294967295);HEAP16[(($arrayidx108)>>1)]=$73;;}
67394 var $76=$ix;var $77=HEAP32[((__ZL10last_frame)>>2)];var $fheight=(($77+18)&4294967295);var $arrayidx110=(($fheight+$76)&4294967295);var $78=HEAP8[($arrayidx110)];var $79=$ix;var $80=$fr;var $fheight111=(($80+18)&4294967295);var $arrayidx112=(($fheight111+$79)&4294967295);HEAP8[($arrayidx112)]=$78;var $81=$ix;var $inc=((($81)+1)&4294967295);$ix=$inc;var $cmp103=((($inc))|0)<8;if($cmp103){__lastLabel__=41;__label__=39;continue;}else{__lastLabel__=41;__label__=42;break;}}
67395 var $82=$fr;var $83=($82);var $84=HEAP32[((__ZL10last_wcmdq)>>2)];var $arrayidx113=((_wcmdq+$84*16)&4294967295);var $arrayidx114=(($arrayidx113+12)&4294967295);HEAP32[(($arrayidx114)>>2)]=$83;;}}while(0);var $85=$this_ph_addr;var $type118=(($85+11)&4294967295);var $86=HEAPU8[($type118)];var $conv119=((($86))&255);var $cmp120=((($conv119))|0)==2;if($cmp120){__label__=44;;}else{__label__=46;;}
67396 $land_lhs_true121$$if_end124$63:do{if(__label__==44){var $87=$which_addr;var $cmp122=((($87))|0)==2;if(!($cmp122)){__label__=46;break $land_lhs_true121$$if_end124$63;}
67397 __ZL11SmoothSpectv();var $88=HEAP32[((_wcmdq_tail)>>2)];HEAP32[((__ZL15syllable_centre)>>2)]=$88;;}}while(0);$length_sum=0;$frameix=1;var $89=$frameix;var $90=HEAP32[(($n_frames)>>2)];var $cmp1263=((($89))|0)<((($90))|0);if($cmp1263){__label__=47;;}else{__label__=56;;}
67398 $for_body127$$if_end180$67:do{if(__label__==47){$for_body127$68:while(1){var $91=$length_mod;$length_factor=$91;var $92=$frameix;var $sub=((($92)-1)&4294967295);var $93=$frames;var $arrayidx128=(($93+8*$sub)&4294967295);var $frflags129=(($arrayidx128+2)&4294967295);var $94=HEAP16[(($frflags129)>>1)];var $conv130=(tempInt=(($94)),(tempInt>=32768?tempInt-65536:tempInt));var $and131=($conv130)&4;var $tobool132=((($and131))|0)!=0;if($tobool132){__label__=48;;}else{__label__=49;;}
67399 $if_then133$$if_else138$70:do{if(__label__==48){var $95=$length_mod;var $96=HEAP32[((((_speed+16)&4294967295))>>2)];var $sub134=((256-($96))&4294967295);var $mul135=((($sub134)*($95))&4294967295);var $97=HEAP32[((((_speed+16)&4294967295))>>2)];var $mul136=((($97)*256)&4294967295);var $add=((($mul135)+($mul136))&4294967295);var $div137=((((($add))|0)/256)|0);$length_factor=$div137;;}
67400 else if(__label__==49){var $98=$frameix;var $sub139=((($98)-1)&4294967295);var $99=$frames;var $arrayidx140=(($99+8*$sub139)&4294967295);var $frflags141=(($arrayidx140+2)&4294967295);var $100=HEAP16[(($frflags141)>>1)];var $conv142=(tempInt=(($100)),(tempInt>=32768?tempInt-65536:tempInt));var $and143=($conv142)&16384;var $tobool144=((($and143))|0)!=0;if(!($tobool144)){__label__=51;break $if_then133$$if_else138$70;}
67401 var $101=$length_mod;var $102=HEAP32[((((_speed+20)&4294967295))>>2)];var $sub146=((256-($102))&4294967295);var $mul147=((($sub146)*($101))&4294967295);var $103=HEAP32[((((_speed+20)&4294967295))>>2)];var $mul148=((($103)*256)&4294967295);var $add149=((($mul147)+($mul148))&4294967295);var $div150=((((($add149))|0)/256)|0);$length_factor=$div150;;}}while(0);var $104=$frameix;var $sub153=((($104)-1)&4294967295);var $105=$frames;var $arrayidx154=(($105+8*$sub153)&4294967295);var $length155=(($arrayidx154)&4294967295);var $106=HEAP16[(($length155)>>1)];var $conv156=(tempInt=(($106)),(tempInt>=32768?tempInt-65536:tempInt));$frame_length=$conv156;var $107=$frame_length;var $108=HEAP32[((_samplerate)>>2)];var $mul157=((($108)*($107))&4294967295);var $div158=((((($mul157))|0)/1000)|0);$len=$div158;var $109=$len;var $110=$length_factor;var $mul159=((($110)*($109))&4294967295);var $div160=((((($mul159))|0)/256)|0);$len=$div160;var $111=$len;var $112=$length_sum;var $add161=((($112)+($111))&4294967295);$length_sum=$add161;var $113=$len;var $114=$frameix;var $arrayidx162=(($frame_lengths+$114*4)&4294967295);HEAP32[(($arrayidx162)>>2)]=$113;var $115=$frameix;var $inc164=((($115)+1)&4294967295);$frameix=$inc164;var $116=$frameix;var $117=HEAP32[(($n_frames)>>2)];var $cmp126=((($116))|0)<((($117))|0);if($cmp126){__label__=47;continue $for_body127$68;}else{__label__=52;break $for_body127$68;}}
67402 var $_pr4=$length_sum;var $cmp166=((($_pr4))|0)>0;if(!($cmp166)){__label__=56;break $for_body127$$if_end180$67;}
67403 var $118=$length_sum;var $119=$length_min;var $cmp168=((($118))|0)<((($119))|0);if(!($cmp168)){__label__=56;break $for_body127$$if_end180$67;}
67404 $frameix=1;var $120=$frameix;var $121=HEAP32[(($n_frames)>>2)];var $cmp1712=((($120))|0)<((($121))|0);if(!($cmp1712)){__label__=56;break $for_body127$$if_end180$67;}
67405 while(1){var $122=$frameix;var $arrayidx173=(($frame_lengths+$122*4)&4294967295);var $123=HEAP32[(($arrayidx173)>>2)];var $124=$length_min;var $mul174=((($124)*($123))&4294967295);var $125=$length_sum;var $div175=((((($mul174))|0)/((($125))|0))|0);var $126=$frameix;var $arrayidx176=(($frame_lengths+$126*4)&4294967295);HEAP32[(($arrayidx176)>>2)]=$div175;var $127=$frameix;var $inc178=((($127)+1)&4294967295);$frameix=$inc178;var $128=$frameix;var $129=HEAP32[(($n_frames)>>2)];var $cmp171=((($128))|0)<((($129))|0);if($cmp171){__label__=55;continue;}else{__label__=56;break $for_body127$$if_end180$67;}}}}while(0);$frameix=1;var $130=$frameix;var $131=HEAP32[(($n_frames)>>2)];var $cmp1821=((($130))|0)<((($131))|0);if($cmp1821){__label__=57;;}else{__label__=72;;}
67406 $for_body183$$for_end235$81:do{if(__label__==57){$for_body183$82:while(1){var $132=$frameix;var $133=$frames;var $arrayidx184=(($133+8*$132)&4294967295);var $frame185=(($arrayidx184+4)&4294967295);var $134=HEAP32[(($frame185)>>2)];$frame2=$134;var $135=$fmt_params_addr;var $wav_addr186=(($135+28)&4294967295);var $136=HEAP32[(($wav_addr186)>>2)];var $cmp187=((($136))|0)!=0;if($cmp187){__label__=58;;}else{__label__=60;;}
67407 $land_lhs_true188$$if_end198$84:do{if(__label__==58){var $137=$frame1;var $frflags189=(($137)&4294967295);var $138=HEAP16[(($frflags189)>>1)];var $conv190=(tempInt=(($138)),(tempInt>=32768?tempInt-65536:tempInt));var $and191=($conv190)&128;var $cmp192=((($and191))|0)==0;if(!($cmp192)){__label__=60;break $land_lhs_true188$$if_end198$84;}
67408 HEAP32[((_seq_len_adjust)>>2)]=0;var $139=$fmt_params_addr;var $wav_addr194=(($139+28)&4294967295);var $140=HEAP32[(($wav_addr194)>>2)];var $141=$which_addr;var $add195=((($141)+256)&4294967295);var $142=$fmt_params_addr;var $fmt_control=(($142)&4294967295);var $143=HEAP32[(($fmt_control)>>2)];var $144=HEAP32[((_wavefile_amp)>>2)];var $call196=__ZL9DoSample2iiiiii($140,$add195,0,$143,0,$144);HEAP8[(__ZZ8DoSpect2P11PHONEME_TABiP10FMT_PARAMSP12PHONEME_LISTiE9wave_flag_b)]=1;HEAP32[((_wavefile_ix)>>2)]=0;var $145=$fmt_params_addr;var $wav_addr197=(($145+28)&4294967295);HEAP32[(($wav_addr197)>>2)]=0;;}}while(0);var $146=$modulation_addr;var $cmp199=((($146))|0)>=0;if($cmp199){__label__=61;;}else{__label__=66;;}
67409 $if_then200$$if_end214$88:do{if(__label__==61){var $147=$frame1;var $frflags201=(($147)&4294967295);var $148=HEAP16[(($frflags201)>>1)];var $conv202=(tempInt=(($148)),(tempInt>=32768?tempInt-65536:tempInt));var $and203=($conv202)&64;var $tobool204=((($and203))|0)!=0;if($tobool204){__label__=62;;}else{__label__=63;;}
67410 if(__label__==62){$modulation_addr=6;;}
67411 var $149=$frameix;var $150=HEAP32[(($n_frames)>>2)];var $sub207=((($150)-1)&4294967295);var $cmp208=((($149))|0)==((($sub207))|0);if(!($cmp208)){__label__=66;break $if_then200$$if_end214$88;}
67412 var $151=HEAP32[((__ZL10modn_flags)>>2)];var $and210=($151)&3840;var $tobool211=((($and210))|0)!=0;if(!($tobool211)){__label__=66;break $if_then200$$if_end214$88;}
67413 var $152=HEAP32[((__ZL10modn_flags)>>2)];var $153=$modulation_addr;var $or=($153)|($152);$modulation_addr=$or;;}}while(0);var $154=$frameix;var $arrayidx215=(($frame_lengths+$154*4)&4294967295);var $155=HEAP32[(($arrayidx215)>>2)];$len=$155;var $156=HEAP32[((__ZL12pitch_length)>>2)];var $add216=((($156)+($155))&4294967295);HEAP32[((__ZL12pitch_length)>>2)]=$add216;var $157=HEAP32[((__ZL10amp_length)>>2)];var $add217=((($157)+($155))&4294967295);HEAP32[((__ZL10amp_length)>>2)]=$add217;var $cmp218=((($155))|0)==0;if($cmp218){__label__=67;;}else{__label__=68;;}
67414 if(__label__==67){HEAP32[((__ZL10last_frame)>>2)]=0;var $158=$frame2;$frame1=$158;;}
67415 else if(__label__==68){var $159=HEAP32[((_wcmdq_tail)>>2)];HEAP32[((__ZL10last_wcmdq)>>2)]=$159;var $160=$modulation_addr;var $cmp221=((($160))|0)>=0;if($cmp221){__label__=69;;}else{__label__=70;;}
67416 if(__label__==69){var $161=HEAP32[((_wcmdq_tail)>>2)];var $arrayidx223=((_wcmdq+$161*16)&4294967295);var $arraydecay224=(($arrayidx223)&4294967295);$q=$arraydecay224;var $162=$wcmd_spect;var $163=$q;var $arrayidx225=(($163)&4294967295);HEAP32[(($arrayidx225)>>2)]=$162;var $164=$len;var $165=$modulation_addr;var $shl=((($165)*65536)&4294967295);var $add226=((($shl)+($164))&4294967295);var $166=$q;var $arrayidx227=(($166+4)&4294967295);HEAP32[(($arrayidx227)>>2)]=$add226;var $167=$frame1;var $168=($167);var $169=$q;var $arrayidx228=(($169+8)&4294967295);HEAP32[(($arrayidx228)>>2)]=$168;var $170=$frame2;var $171=($170);var $172=$q;var $arrayidx229=(($172+12)&4294967295);HEAP32[(($arrayidx229)>>2)]=$171;__Z8WcmdqIncv();;}
67417 var $173=$frame2;$frame1=$173;HEAP32[((__ZL10last_frame)>>2)]=$173;var $174=$len;var $175=$total_len;var $add231=((($175)+($174))&4294967295);$total_len=$add231;;}
67418 var $176=$frameix;var $inc234=((($176)+1)&4294967295);$frameix=$inc234;var $177=$frameix;var $178=HEAP32[(($n_frames)>>2)];var $cmp182=((($177))|0)<((($178))|0);if($cmp182){__label__=57;continue $for_body183$82;}else{__label__=72;break $for_body183$$for_end235$81;}}}}while(0);var $179=$which_addr;var $cmp236=((($179))|0)!=1;var $180=HEAP32[((__ZL13fmt_amplitude)>>2)];var $cmp238=((($180))|0)!=0;var $or_cond=($cmp236)&($cmp238);if($or_cond){__label__=73;;}else{__label__=74;;}
67419 if(__label__==73){var $181=HEAP32[((_wcmdq_tail)>>2)];var $arrayidx240=((_wcmdq+$181*16)&4294967295);var $arraydecay241=(($arrayidx240)&4294967295);$q=$arraydecay241;var $182=$q;var $arrayidx242=(($182)&4294967295);HEAP32[(($arrayidx242)>>2)]=14;HEAP32[((__ZL13fmt_amplitude)>>2)]=0;var $183=$q;var $arrayidx243=(($183+4)&4294967295);HEAP32[(($arrayidx243)>>2)]=0;__Z8WcmdqIncv();;}
67420 var $184=$total_len;$retval=$184;;}}
67421 var $185=$retval;STACKTOP=__stackBase__;return $185;return null;}
67422 function __ZL11SmoothSpectv(){;var __label__;var __lastLabel__=null;var $q;var $frame;var $frame2;var $frame1;var $frame_centre;var $ix;var $len;var $pk;var $modified;var $allowed;var $diff;var $f1;var $f2;var $f1142;var $f2143;var $0=HEAP32[((__ZL14syllable_start)>>2)];var $1=HEAP32[((__ZL12syllable_end)>>2)];var $cmp=((($0))|0)==((($1))|0);if($cmp){__label__=58;;}else{__label__=1;;}
67423 $return$$if_end$2:do{if(__label__==1){var $2=HEAP32[((__ZL15syllable_centre)>>2)];var $cmp1=((($2))|0)<0;if($cmp1){__label__=3;;}else{__label__=2;;}
67424 $if_then3$$lor_lhs_false$4:do{if(__label__==2){var $3=HEAP32[((__ZL15syllable_centre)>>2)];var $4=HEAP32[((__ZL14syllable_start)>>2)];var $cmp2=((($3))|0)==((($4))|0);if($cmp2){__label__=3;break $if_then3$$lor_lhs_false$4;}
67425 var $6=HEAP32[((__ZL15syllable_centre)>>2)];var $arrayidx=((_wcmdq+$6*16)&4294967295);var $arraydecay=(($arrayidx)&4294967295);$q=$arraydecay;var $7=$q;var $arrayidx5=(($7+8)&4294967295);var $8=HEAP32[(($arrayidx5)>>2)];var $9=($8);$frame_centre=$9;var $10=HEAP32[((__ZL15syllable_centre)>>2)];var $sub=((($10)-1)&4294967295);$ix=$sub;var $11=$frame_centre;$frame2=$11;$frame=$11;__lastLabel__=4;;$for_cond$7:while(1){var $12=__lastLabel__==30?$dec:($sub);var $cmp6=((($12))|0)<0;if($cmp6){__label__=6;;}else{__label__=7;;}
67426 if(__label__==6){$ix=159;;}
67427 var $13=$ix;var $arrayidx9=((_wcmdq+$13*16)&4294967295);var $arraydecay10=(($arrayidx9)&4294967295);$q=$arraydecay10;var $14=$q;var $arrayidx11=(($14)&4294967295);var $15=HEAP32[(($arrayidx11)>>2)];var $cmp12=((($15))|0)==5;if($cmp12){__label__=31;break $for_cond$7;}
67428 var $16=$q;var $arrayidx14=(($16)&4294967295);var $17=HEAP32[(($arrayidx14)>>2)];var $cmp15=((($17))|0)==6;if($cmp15){__label__=31;break $for_cond$7;}
67429 var $18=$q;var $arrayidx18=(($18)&4294967295);var $19=HEAP32[(($arrayidx18)>>2)];var $cmp19=((($19))|0)<=4;if($cmp19){__label__=10;;}else{__label__=29;;}
67430 $if_then20$$if_end95$14:do{if(__label__==10){var $20=$q;var $arrayidx21=(($20+4)&4294967295);var $21=HEAP32[(($arrayidx21)>>2)];var $and=($21)&65535;$len=$and;var $22=$q;var $arrayidx22=(($22+12)&4294967295);var $23=HEAP32[(($arrayidx22)>>2)];var $24=($23);$frame1=$24;var $25=$frame1;var $26=$frame;var $cmp23=((($25))|0)==((($26))|0);if(!($cmp23)){__label__=31;break $for_cond$7;}
67431 var $27=$frame2;var $28=($27);var $29=$q;var $arrayidx25=(($29+12)&4294967295);HEAP32[(($arrayidx25)>>2)]=$28;var $30=$frame2;$frame1=$30;var $31=$q;var $arrayidx27=(($31+8)&4294967295);var $32=HEAP32[(($arrayidx27)>>2)];var $33=($32);$frame2=$33;$frame=$33;$modified=0;var $34=$frame;var $frflags=(($34)&4294967295);var $35=HEAP16[(($frflags)>>1)];var $conv=(tempInt=(($35)),(tempInt>=32768?tempInt-65536:tempInt));var $and28=($conv)&16;var $tobool=((($and28))|0)!=0;if($tobool){__label__=31;break $for_cond$7;}
67432 var $36=$frame;var $frflags31=(($36)&4294967295);var $37=HEAP16[(($frflags31)>>1)];var $conv32=(tempInt=(($37)),(tempInt>=32768?tempInt-65536:tempInt));var $and33=($conv32)&32;var $tobool34=((($and33))|0)!=0;if($tobool34){__label__=13;;}else{__label__=14;;}
67433 if(__label__==13){var $38=$len;var $mul=((($38)*12)&4294967295);var $div=((((($mul))|0)/10)|0);$len=$div;;}
67434 $pk=0;;$for_body$21:while(1){var $39=$frame;var $frflags39=(($39)&4294967295);var $40=HEAP16[(($frflags39)>>1)];var $conv40=(tempInt=(($40)),(tempInt>=32768?tempInt-65536:tempInt));var $and41=($conv40)&8;var $tobool42=((($and41))|0)!=0;if($tobool42){__label__=16;;}else{__label__=17;;}
67435 $land_lhs_true$$if_end45$23:do{if(__label__==16){var $41=$pk;var $cmp43=((($41))|0)<3;if($cmp43){__label__=28;break $land_lhs_true$$if_end45$23;}else{__label__=17;break $land_lhs_true$$if_end45$23;}}}while(0);$for_inc$$if_end45$25:do{if(__label__==17){var $42=$pk;var $43=$frame1;var $ffreq=(($43+2)&4294967295);var $arrayidx46=(($ffreq+$42*2)&4294967295);var $44=HEAP16[(($arrayidx46)>>1)];var $conv47=(tempInt=(($44)),(tempInt>=32768?tempInt-65536:tempInt));$f1=$conv47;var $45=$pk;var $46=$frame;var $ffreq48=(($46+2)&4294967295);var $arrayidx49=(($ffreq48+$45*2)&4294967295);var $47=HEAP16[(($arrayidx49)>>1)];var $conv50=(tempInt=(($47)),(tempInt>=32768?tempInt-65536:tempInt));$f2=$conv50;var $48=$f2;var $49=$f1;var $sub51=((($48)-($49))&4294967295);$diff=$sub51;var $cmp52=((($sub51))|0)>0;var $50=$f1;if($cmp52){__label__=18;;}else{__label__=19;;}
67436 if(__label__==18){var $mul54=((($50)*2)&4294967295);var $51=$f2;var $add=((($51)+($mul54))&4294967295);$allowed=$add;;}
67437 else if(__label__==19){var $52=$f2;var $mul56=((($52)*2)&4294967295);var $add57=((($mul56)+($50))&4294967295);$allowed=$add57;;}
67438 var $53=$allowed;var $54=$pk;var $arrayidx59=((_formant_rate+$54*4)&4294967295);var $55=HEAP32[(($arrayidx59)>>2)];var $mul60=((($55)*($53))&4294967295);var $div61=((((($mul60))|0)/3000)|0);$allowed=$div61;var $56=$allowed;var $57=$len;var $mul62=((($57)*($56))&4294967295);var $div63=((((($mul62))|0)/256)|0);$allowed=$div63;var $58=$diff;var $59=$allowed;var $cmp64=((($58))|0)>((($59))|0);if($cmp64){__label__=21;;}else{__label__=24;;}
67439 if(__label__==21){var $60=$modified;var $cmp66=((($60))|0)==0;if($cmp66){__label__=22;;}else{__label__=23;;}
67440 if(__label__==22){var $61=$frame;var $call=__ZL9CopyFrameP7frame_ti($61,0);$frame2=$call;$modified=1;;}
67441 var $62=$pk;var $63=$frame1;var $ffreq69=(($63+2)&4294967295);var $arrayidx70=(($ffreq69+$62*2)&4294967295);var $64=HEAP16[(($arrayidx70)>>1)];var $conv71=(tempInt=(($64)),(tempInt>=32768?tempInt-65536:tempInt));var $65=$allowed;var $add72=((($conv71)+($65))&4294967295);var $conv73=((($add72))&65535);var $66=$pk;var $67=$frame2;var $ffreq74=(($67+2)&4294967295);var $arrayidx75=(($ffreq74+$66*2)&4294967295);HEAP16[(($arrayidx75)>>1)]=$conv73;var $68=$frame2;var $69=($68);var $70=$q;var $arrayidx76=(($70+8)&4294967295);HEAP32[(($arrayidx76)>>2)]=$69;;}
67442 else if(__label__==24){var $71=$diff;var $72=$allowed;var $sub78=(((-($72)))&4294967295);var $cmp79=((($71))|0)<((($sub78))|0);if(!($cmp79)){__label__=28;break $for_inc$$if_end45$25;}
67443 var $73=$modified;var $cmp81=((($73))|0)==0;if($cmp81){__label__=26;;}else{__label__=27;;}
67444 if(__label__==26){var $74=$frame;var $call83=__ZL9CopyFrameP7frame_ti($74,0);$frame2=$call83;$modified=1;;}
67445 var $75=$pk;var $76=$frame1;var $ffreq85=(($76+2)&4294967295);var $arrayidx86=(($ffreq85+$75*2)&4294967295);var $77=HEAP16[(($arrayidx86)>>1)];var $conv87=(tempInt=(($77)),(tempInt>=32768?tempInt-65536:tempInt));var $78=$allowed;var $sub88=((($conv87)-($78))&4294967295);var $conv89=((($sub88))&65535);var $79=$pk;var $80=$frame2;var $ffreq90=(($80+2)&4294967295);var $arrayidx91=(($ffreq90+$79*2)&4294967295);HEAP16[(($arrayidx91)>>1)]=$conv89;var $81=$frame2;var $82=($81);var $83=$q;var $arrayidx92=(($83+8)&4294967295);HEAP32[(($arrayidx92)>>2)]=$82;;}}}while(0);var $84=$pk;var $inc=((($84)+1)&4294967295);$pk=$inc;var $cmp38=((($inc))|0)<6;if($cmp38){__label__=15;continue $for_body$21;}else{__label__=29;break $if_then20$$if_end95$14;}}}}while(0);var $85=$ix;var $86=HEAP32[((__ZL14syllable_start)>>2)];var $cmp96=((($85))|0)==((($86))|0);if($cmp96){__label__=31;break $for_cond$7;}
67446 var $87=$ix;var $dec=((($87)-1)&4294967295);$ix=$dec;__lastLabel__=30;__label__=5;continue $for_cond$7;}
67447 var $88=HEAP32[((__ZL15syllable_centre)>>2)];$ix=$88;$frame=0;;$for_cond100$45:while(1){var $89=$ix;var $arrayidx101=((_wcmdq+$89*16)&4294967295);var $arraydecay102=(($arrayidx101)&4294967295);$q=$arraydecay102;var $90=$q;var $arrayidx103=(($90)&4294967295);var $91=HEAP32[(($arrayidx103)>>2)];var $cmp104=((($91))|0)==5;if($cmp104){__label__=57;break $for_cond100$45;}
67448 var $92=$q;var $arrayidx106=(($92)&4294967295);var $93=HEAP32[(($arrayidx106)>>2)];var $cmp107=((($93))|0)==6;if($cmp107){__label__=57;break $for_cond100$45;}
67449 var $94=$q;var $arrayidx110=(($94)&4294967295);var $95=HEAP32[(($arrayidx110)>>2)];var $cmp111=((($95))|0)<=4;if($cmp111){__label__=35;;}else{__label__=54;;}
67450 $if_then112$$if_end199$49:do{if(__label__==35){var $96=$q;var $arrayidx113=(($96+4)&4294967295);var $97=HEAP32[(($arrayidx113)>>2)];var $and114=($97)&65535;$len=$and114;var $98=$q;var $arrayidx115=(($98+8)&4294967295);var $99=HEAP32[(($arrayidx115)>>2)];var $100=($99);$frame1=$100;var $101=$frame;var $cmp116=((($101))|0)!=0;if($cmp116){__label__=36;;}else{__label__=38;;}
67451 if(__label__==36){var $102=$frame1;var $103=$frame;var $cmp118=((($102))|0)==((($103))|0);if(!($cmp118)){__label__=57;break $for_cond100$45;}
67452 var $104=$frame2;var $105=($104);var $106=$q;var $arrayidx120=(($106+8)&4294967295);HEAP32[(($arrayidx120)>>2)]=$105;var $107=$frame2;$frame1=$107;;}
67453 var $108=$q;var $arrayidx124=(($108+12)&4294967295);var $109=HEAP32[(($arrayidx124)>>2)];var $110=($109);$frame2=$110;$frame=$110;$modified=0;var $111=$frame1;var $frflags125=(($111)&4294967295);var $112=HEAP16[(($frflags125)>>1)];var $conv126=(tempInt=(($112)),(tempInt>=32768?tempInt-65536:tempInt));var $and127=($conv126)&16;var $tobool128=((($and127))|0)!=0;if($tobool128){__label__=57;break $for_cond100$45;}
67454 var $113=$frame1;var $frflags131=(($113)&4294967295);var $114=HEAP16[(($frflags131)>>1)];var $conv132=(tempInt=(($114)),(tempInt>=32768?tempInt-65536:tempInt));var $and133=($conv132)&32;var $tobool134=((($and133))|0)!=0;if($tobool134){__label__=40;;}else{__label__=41;;}
67455 if(__label__==40){var $115=$len;var $mul136=((($115)*6)&4294967295);var $div137=((((($mul136))|0)/5)|0);$len=$div137;;}
67456 $pk=0;;$for_body141$59:while(1){var $116=$pk;var $117=$frame1;var $ffreq144=(($117+2)&4294967295);var $arrayidx145=(($ffreq144+$116*2)&4294967295);var $118=HEAP16[(($arrayidx145)>>1)];var $conv146=(tempInt=(($118)),(tempInt>=32768?tempInt-65536:tempInt));$f1142=$conv146;var $119=$pk;var $120=$frame;var $ffreq147=(($120+2)&4294967295);var $arrayidx148=(($ffreq147+$119*2)&4294967295);var $121=HEAP16[(($arrayidx148)>>1)];var $conv149=(tempInt=(($121)),(tempInt>=32768?tempInt-65536:tempInt));$f2143=$conv149;var $122=$f2143;var $123=$f1142;var $sub150=((($122)-($123))&4294967295);$diff=$sub150;var $cmp151=((($sub150))|0)>0;var $124=$f1142;if($cmp151){__label__=43;;}else{__label__=44;;}
67457 if(__label__==43){var $mul153=((($124)*2)&4294967295);var $125=$f2143;var $add154=((($125)+($mul153))&4294967295);$allowed=$add154;;}
67458 else if(__label__==44){var $126=$f2143;var $mul156=((($126)*2)&4294967295);var $add157=((($mul156)+($124))&4294967295);$allowed=$add157;;}
67459 var $127=$allowed;var $128=$pk;var $arrayidx159=((_formant_rate+$128*4)&4294967295);var $129=HEAP32[(($arrayidx159)>>2)];var $mul160=((($129)*($127))&4294967295);var $div161=((((($mul160))|0)/3000)|0);$allowed=$div161;var $130=$allowed;var $131=$len;var $mul162=((($131)*($130))&4294967295);var $div163=((((($mul162))|0)/256)|0);$allowed=$div163;var $132=$diff;var $133=$allowed;var $cmp164=((($132))|0)>((($133))|0);if($cmp164){__label__=46;;}else{__label__=49;;}
67460 $if_then165$$if_else178$65:do{if(__label__==46){var $134=$modified;var $cmp166=((($134))|0)==0;if($cmp166){__label__=47;;}else{__label__=48;;}
67461 if(__label__==47){var $135=$frame;var $call168=__ZL9CopyFrameP7frame_ti($135,0);$frame2=$call168;$modified=1;;}
67462 var $136=$pk;var $137=$frame1;var $ffreq170=(($137+2)&4294967295);var $arrayidx171=(($ffreq170+$136*2)&4294967295);var $138=HEAP16[(($arrayidx171)>>1)];var $conv172=(tempInt=(($138)),(tempInt>=32768?tempInt-65536:tempInt));var $139=$allowed;var $add173=((($conv172)+($139))&4294967295);var $conv174=((($add173))&65535);var $140=$pk;var $141=$frame2;var $ffreq175=(($141+2)&4294967295);var $arrayidx176=(($ffreq175+$140*2)&4294967295);HEAP16[(($arrayidx176)>>1)]=$conv174;var $142=$frame2;var $143=($142);var $144=$q;var $arrayidx177=(($144+12)&4294967295);HEAP32[(($arrayidx177)>>2)]=$143;;}
67463 else if(__label__==49){var $145=$diff;var $146=$allowed;var $sub179=(((-($146)))&4294967295);var $cmp180=((($145))|0)<((($sub179))|0);if(!($cmp180)){__label__=53;break $if_then165$$if_else178$65;}
67464 var $147=$modified;var $cmp182=((($147))|0)==0;if($cmp182){__label__=51;;}else{__label__=52;;}
67465 if(__label__==51){var $148=$frame;var $call184=__ZL9CopyFrameP7frame_ti($148,0);$frame2=$call184;$modified=1;;}
67466 var $149=$pk;var $150=$frame1;var $ffreq186=(($150+2)&4294967295);var $arrayidx187=(($ffreq186+$149*2)&4294967295);var $151=HEAP16[(($arrayidx187)>>1)];var $conv188=(tempInt=(($151)),(tempInt>=32768?tempInt-65536:tempInt));var $152=$allowed;var $sub189=((($conv188)-($152))&4294967295);var $conv190=((($sub189))&65535);var $153=$pk;var $154=$frame2;var $ffreq191=(($154+2)&4294967295);var $arrayidx192=(($ffreq191+$153*2)&4294967295);HEAP16[(($arrayidx192)>>1)]=$conv190;var $155=$frame2;var $156=($155);var $157=$q;var $arrayidx193=(($157+12)&4294967295);HEAP32[(($arrayidx193)>>2)]=$156;;}}while(0);var $158=$pk;var $inc197=((($158)+1)&4294967295);$pk=$inc197;var $cmp140=((($inc197))|0)<6;if($cmp140){__label__=42;continue $for_body141$59;}else{__label__=54;break $if_then112$$if_end199$49;}}}}while(0);var $159=$ix;var $inc200=((($159)+1)&4294967295);$ix=$inc200;var $cmp201=((($inc200))|0)>=160;if($cmp201){__label__=55;;}else{__label__=56;;}
67467 if(__label__==55){$ix=0;;}
67468 var $160=$ix;var $161=HEAP32[((__ZL12syllable_end)>>2)];var $cmp204=((($160))|0)==((($161))|0);if($cmp204){__label__=57;break $for_cond100$45;}else{__label__=32;continue $for_cond100$45;}}
67469 var $162=HEAP32[((__ZL12syllable_end)>>2)];HEAP32[((__ZL14syllable_start)>>2)]=$162;__label__=58;break $return$$if_end$2;}}while(0);var $5=HEAP32[((__ZL12syllable_end)>>2)];HEAP32[((__ZL14syllable_start)>>2)]=$5;;}}while(0);;return;return;}
67470 function __Z8DoMarkeriiii($type,$char_posn,$length,$value){;var __label__;var $type_addr;var $char_posn_addr;var $length_addr;var $value_addr;$type_addr=$type;$char_posn_addr=$char_posn;$length_addr=$length;$value_addr=$value;var $0=HEAP32[((_wcmdq_tail)>>2)];var $arrayidx=((_wcmdq+$0*16)&4294967295);var $arrayidx1=(($arrayidx)&4294967295);HEAP32[(($arrayidx1)>>2)]=10;var $1=$type_addr;var $2=HEAP32[((_wcmdq_tail)>>2)];var $arrayidx2=((_wcmdq+$2*16)&4294967295);var $arrayidx3=(($arrayidx2+4)&4294967295);HEAP32[(($arrayidx3)>>2)]=$1;var $3=$char_posn_addr;var $and=($3)&16777215;var $4=$length_addr;var $shl=($4)<<24;var $or=($shl)|($and);var $5=HEAP32[((_wcmdq_tail)>>2)];var $arrayidx4=((_wcmdq+$5*16)&4294967295);var $arrayidx5=(($arrayidx4+8)&4294967295);HEAP32[(($arrayidx5)>>2)]=$or;var $6=$value_addr;var $7=HEAP32[((_wcmdq_tail)>>2)];var $arrayidx6=((_wcmdq+$7*16)&4294967295);var $arrayidx7=(($arrayidx6+12)&4294967295);HEAP32[(($arrayidx7)>>2)]=$6;__Z8WcmdqIncv();;return;return;}
67471 function __Z12DoSonicSpeedi($value){;var __label__;var $value_addr;$value_addr=$value;var $0=HEAP32[((_wcmdq_tail)>>2)];var $arrayidx=((_wcmdq+$0*16)&4294967295);var $arrayidx1=(($arrayidx)&4294967295);HEAP32[(($arrayidx1)>>2)]=15;var $1=$value_addr;var $2=HEAP32[((_wcmdq_tail)>>2)];var $arrayidx2=((_wcmdq+$2*16)&4294967295);var $arrayidx3=(($arrayidx2+4)&4294967295);HEAP32[(($arrayidx3)>>2)]=$1;__Z8WcmdqIncv();;return;return;}
67472 function __Z13DoVoiceChangeP7voice_t($v){;var __label__;var $v_addr;var $v2;$v_addr=$v;var $call=_malloc(1344);var $0=$call;$v2=$0;var $1=$v2;var $2=$1;var $3=$v_addr;var $4=$3;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$4;$dest$=$2;$stop$=$src$+1344;if(($dest$%4)==($src$%4)&&1344>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
67473 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
67474 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $5=HEAP32[((_wcmdq_tail)>>2)];var $arrayidx=((_wcmdq+$5*16)&4294967295);var $arrayidx1=(($arrayidx)&4294967295);HEAP32[(($arrayidx1)>>2)]=11;var $6=$v2;var $7=($6);var $8=HEAP32[((_wcmdq_tail)>>2)];var $arrayidx2=((_wcmdq+$8*16)&4294967295);var $arrayidx3=(($arrayidx2+4)&4294967295);HEAP32[(($arrayidx3)>>2)]=$7;__Z8WcmdqIncv();;return;return;}
67475 function __Z10DoEmbeddedPii($embix,$sourceix){;var __label__;var $embix_addr;var $sourceix_addr;var $word;var $value;var $command;$embix_addr=$embix;$sourceix_addr=$sourceix;;$do_body$2:while(1){var $0=$embix_addr;var $1=HEAP32[(($0)>>2)];var $arrayidx=((_embedded_list+$1*4)&4294967295);var $2=HEAP32[(($arrayidx)>>2)];$word=$2;var $3=$word;var $shr=($3)>>>8;$value=$shr;var $4=$word;var $and=($4)&127;$command=$and;var $cmp=((($and))|0)==0;if($cmp){__label__=11;break $do_body$2;}
67476 var $5=$embix_addr;var $6=HEAP32[(($5)>>2)];var $inc=((($6)+1)&4294967295);HEAP32[(($5)>>2)]=$inc;var $7=$command;var $and1=($7)&31;if($and1==2){__label__=3;;}
67477 else if($and1==7){__label__=4;;}
67478 else if($and1==10){__label__=7;;}
67479 else if($and1==11){__label__=8;;}
67480 else{__label__=9;;}
67481 $sw_default$$sw_bb$$sw_bb3$$sw_bb23$$sw_bb26$5:do{if(__label__==9){__ZL7DoPauseii(10,0);var $28=HEAP32[((_wcmdq_tail)>>2)];var $arrayidx28=((_wcmdq+$28*16)&4294967295);var $arrayidx29=(($arrayidx28)&4294967295);HEAP32[(($arrayidx29)>>2)]=12;var $29=$command;var $30=HEAP32[((_wcmdq_tail)>>2)];var $arrayidx30=((_wcmdq+$30*16)&4294967295);var $arrayidx31=(($arrayidx30+4)&4294967295);HEAP32[(($arrayidx31)>>2)]=$29;var $31=$value;var $32=HEAP32[((_wcmdq_tail)>>2)];var $arrayidx32=((_wcmdq+$32*16)&4294967295);var $arrayidx33=(($arrayidx32+8)&4294967295);HEAP32[(($arrayidx33)>>2)]=$31;__Z8WcmdqIncv();;}
67482 else if(__label__==3){var $8=$command;var $and2=($8)&96;var $add=((($and2)+8)&4294967295);var $9=$value;__Z11SetEmbeddedii($add,$9);__Z8SetSpeedi(2);;}
67483 else if(__label__==4){var $10=$value;var $11=HEAP32[((_n_soundicon_tab)>>2)];var $cmp4=((($10))|0)<((($11))|0);if(!($cmp4)){__label__=10;break $sw_default$$sw_bb$$sw_bb3$$sw_bb23$$sw_bb26$5;}
67484 var $12=$value;var $arrayidx6=((_soundicon_tab+$12*16)&4294967295);var $length=(($arrayidx6+4)&4294967295);var $13=HEAP32[(($length)>>2)];var $cmp7=((($13))|0)!=0;if(!($cmp7)){__label__=10;break $sw_default$$sw_bb$$sw_bb3$$sw_bb23$$sw_bb26$5;}
67485 __ZL7DoPauseii(10,0);var $14=HEAP32[((_wcmdq_tail)>>2)];var $arrayidx9=((_wcmdq+$14*16)&4294967295);var $arrayidx10=(($arrayidx9)&4294967295);HEAP32[(($arrayidx10)>>2)]=6;var $15=$value;var $arrayidx11=((_soundicon_tab+$15*16)&4294967295);var $length12=(($arrayidx11+4)&4294967295);var $16=HEAP32[(($length12)>>2)];var $17=HEAP32[((_wcmdq_tail)>>2)];var $arrayidx13=((_wcmdq+$17*16)&4294967295);var $arrayidx14=(($arrayidx13+4)&4294967295);HEAP32[(($arrayidx14)>>2)]=$16;var $18=$value;var $arrayidx15=((_soundicon_tab+$18*16)&4294967295);var $data=(($arrayidx15+8)&4294967295);var $19=HEAP32[(($data)>>2)];var $20=($19);var $add16=((($20)+44)&4294967295);var $21=HEAP32[((_wcmdq_tail)>>2)];var $arrayidx17=((_wcmdq+$21*16)&4294967295);var $arrayidx18=(($arrayidx17+8)&4294967295);HEAP32[(($arrayidx18)>>2)]=$add16;var $22=HEAP32[((_wcmdq_tail)>>2)];var $arrayidx19=((_wcmdq+$22*16)&4294967295);var $arrayidx20=(($arrayidx19+12)&4294967295);HEAP32[(($arrayidx20)>>2)]=5376;__Z8WcmdqIncv();;}
67486 else if(__label__==7){var $23=$sourceix_addr;var $and24=($23)&2047;var $24=HEAP32[((_clause_start_char)>>2)];var $add25=((($and24)+($24))&4294967295);var $25=$value;__Z8DoMarkeriiii(3,$add25,0,$25);;}
67487 else if(__label__==8){var $26=HEAP32[((_count_characters)>>2)];var $add27=((($26)+1)&4294967295);var $27=$value;__Z8DoMarkeriiii(4,$add27,0,$27);;}}while(0);var $33=$word;var $and34=($33)&128;var $cmp35=((($and34))|0)==0;if($cmp35){__label__=1;continue $do_body$2;}else{__label__=11;break $do_body$2;}};return;return;}
67488 function __Z8GenerateP12PHONEME_LISTPii($phoneme_list,$n_ph,$resume){var __stackBase__=STACKTOP;STACKTOP+=656;_memset(__stackBase__,0,656);var __label__;var $retval;var $phoneme_list_addr;var $n_ph_addr;var $resume_addr;var $prev;var $next;var $next2;var $p;var $released;var $stress;var $modulation;var $pre_voiced;var $free_min;var $pitch_env;var $amp_env;var $ph;var $prev_ph;var $phdata=__stackBase__;var $phdata_prev=__stackBase__+152;var $phdata_next=__stackBase__+304;var $phdata_tone=__stackBase__+456;var $fmtp=__stackBase__+608;$phoneme_list_addr=$phoneme_list;$n_ph_addr=$n_ph;$resume_addr=$resume;$pitch_env=0;var $0=HEAP32[((_option_quiet)>>2)];var $tobool=((($0))|0)!=0;if($tobool){__label__=1;;}else{__label__=2;;}
67489 if(__label__==1){$retval=0;;}
67490 else if(__label__==2){var $1=HEAP8[(((_mbrola_name)&4294967295))];var $conv=(tempInt=(($1)),(tempInt>=128?tempInt-256:tempInt));var $cmp=((($conv))|0)!=0;if($cmp){__label__=3;;}else{__label__=4;;}
67491 if(__label__==3){var $2=$phoneme_list_addr;var $3=$n_ph_addr;var $4=$resume_addr;var $call=__Z14MbrolaGenerateP12PHONEME_LISTPii($2,$3,$4);$retval=$call;;}
67492 else if(__label__==4){var $5=$resume_addr;var $cmp3=((($5))|0)==0;if($cmp3){__label__=5;;}else{__label__=6;;}
67493 if(__label__==5){HEAP32[((__ZZ8GenerateP12PHONEME_LISTPiiE2ix)>>2)]=1;HEAP32[((__ZZ8GenerateP12PHONEME_LISTPiiE11embedded_ix)>>2)]=0;HEAP32[((__ZZ8GenerateP12PHONEME_LISTPiiE10word_count)>>2)]=0;HEAP32[((__ZL12pitch_length)>>2)]=0;HEAP32[((__ZL10amp_length)>>2)]=0;HEAP32[((__ZL10last_frame)>>2)]=0;HEAP32[((__ZL10last_wcmdq)>>2)]=-1;var $6=HEAP32[((_wcmdq_tail)>>2)];HEAP32[((__ZL14syllable_start)>>2)]=$6;var $7=HEAP32[((_wcmdq_tail)>>2)];HEAP32[((__ZL12syllable_end)>>2)]=$7;HEAP32[((__ZL15syllable_centre)>>2)]=-1;HEAP32[((__ZL14last_pitch_cmd)>>2)]=-1;var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=_vowel_transition;$stop$=$dest$+16;$value4$=0;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=0;}
67494 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
67495 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=0;};__ZL7DoPauseii(0,0);;}
67496 var $pd_control=(($phdata)&4294967295);var $8=$fmtp;var $fmt_control=(($fmtp)&4294967295);var $sound_addr=(($phdata+68)&4294967295);var $arrayidx173=(($sound_addr)&4294967295);var $fmt_addr=(($fmtp+8)&4294967295);var $sound_param=(($phdata+88)&4294967295);var $arrayidx174=(($sound_param)&4294967295);var $fmt_amp=(($fmtp+16)&4294967295);var $sound_addr199=(($phdata+68)&4294967295);var $arrayidx200=(($sound_addr199)&4294967295);var $fmt_addr201=(($fmtp+8)&4294967295);var $sound_param202=(($phdata+88)&4294967295);var $arrayidx203=(($sound_param202)&4294967295);var $fmt_amp204=(($fmtp+16)&4294967295);var $sound_addr205=(($phdata+68)&4294967295);var $arrayidx206=(($sound_addr205+16)&4294967295);var $wav_addr=(($fmtp+28)&4294967295);var $sound_param207=(($phdata+88)&4294967295);var $arrayidx208=(($sound_param207+16)&4294967295);var $wav_amp=(($fmtp+32)&4294967295);var $9=$fmtp;var $pd_param=(($phdata+4)&4294967295);var $arrayidx290=(($pd_param+40)&4294967295);var $std_length=(($fmtp+44)&4294967295);var $sound_addr291=(($phdata+68)&4294967295);var $arrayidx292=(($sound_addr291)&4294967295);var $fmt_addr293=(($fmtp+8)&4294967295);var $sound_param294=(($phdata+88)&4294967295);var $arrayidx295=(($sound_param294)&4294967295);var $fmt_amp296=(($fmtp+16)&4294967295);var $sound_addr297=(($phdata+68)&4294967295);var $arrayidx298=(($sound_addr297+16)&4294967295);var $wav_addr299=(($fmtp+28)&4294967295);var $sound_param300=(($phdata+88)&4294967295);var $arrayidx301=(($sound_param300+16)&4294967295);var $wav_amp302=(($fmtp+32)&4294967295);var $10=$fmtp;var $pd_param334=(($phdata+4)&4294967295);var $arrayidx335=(($pd_param334+40)&4294967295);var $std_length337=(($fmtp+44)&4294967295);var $sound_addr338=(($phdata+68)&4294967295);var $arrayidx339=(($sound_addr338)&4294967295);var $fmt_addr340=(($fmtp+8)&4294967295);var $sound_param341=(($phdata+88)&4294967295);var $arrayidx342=(($sound_param341)&4294967295);var $fmt_amp343=(($fmtp+16)&4294967295);var $11=$fmtp;var $pd_param400=(($phdata+4)&4294967295);var $arrayidx401=(($pd_param400+40)&4294967295);var $std_length403=(($fmtp+44)&4294967295);var $sound_addr404=(($phdata+68)&4294967295);var $arrayidx405=(($sound_addr404)&4294967295);var $fmt_addr406=(($fmtp+8)&4294967295);var $sound_param407=(($phdata+88)&4294967295);var $arrayidx408=(($sound_param407)&4294967295);var $fmt_amp409=(($fmtp+16)&4294967295);var $sound_addr410=(($phdata+68)&4294967295);var $arrayidx411=(($sound_addr410+16)&4294967295);var $wav_addr412=(($fmtp+28)&4294967295);var $sound_param413=(($phdata+88)&4294967295);var $arrayidx414=(($sound_param413+16)&4294967295);var $wav_amp415=(($fmtp+32)&4294967295);var $12=$fmtp;var $pd_param422=(($phdata+4)&4294967295);var $arrayidx423=(($pd_param422+40)&4294967295);var $std_length425=(($fmtp+44)&4294967295);var $sound_addr426=(($phdata+68)&4294967295);var $arrayidx427=(($sound_addr426+8)&4294967295);var $fmt_addr428=(($fmtp+8)&4294967295);var $pd_control431=(($phdata)&4294967295);var $sound_param435=(($phdata+88)&4294967295);var $arrayidx436=(($sound_param435+8)&4294967295);var $fmt_length=(($fmtp+12)&4294967295);var $fmt_addr455=(($fmtp+8)&4294967295);var $use_vowelin=(($fmtp+4)&4294967295);var $fmt_control458=(($fmtp)&4294967295);var $sound_addr459=(($phdata+68)&4294967295);var $arrayidx460=(($sound_addr459)&4294967295);var $fmt_addr461=(($fmtp+8)&4294967295);var $sound_param463=(($phdata+88)&4294967295);var $arrayidx464=(($sound_param463)&4294967295);var $fmt_amp465=(($fmtp+16)&4294967295);var $pitch_env474=(($phdata_tone+124)&4294967295);var $amp_env476=(($phdata_tone+128)&4294967295);var $amp_env479=(($phdata_tone+128)&4294967295);var $sound_addr542=(($phdata+68)&4294967295);var $arrayidx543=(($sound_addr542)&4294967295);var $fmt_addr544=(($fmtp+8)&4294967295);var $sound_param545=(($phdata+88)&4294967295);var $arrayidx546=(($sound_param545)&4294967295);var $fmt_amp547=(($fmtp+16)&4294967295);var $transition0548=(($fmtp+36)&4294967295);var $transition1549=(($fmtp+40)&4294967295);var $sound_addr550=(($phdata+68)&4294967295);var $arrayidx551=(($sound_addr550+12)&4294967295);var $fmt2_addr=(($fmtp+20)&4294967295);var $sound_param554=(($phdata+88)&4294967295);var $arrayidx555=(($sound_param554+12)&4294967295);var $fmt2_lenadj556=(($fmtp+24)&4294967295);var $fmt2_lenadj562=(($fmtp+24)&4294967295);var $use_vowelin563=(($fmtp+4)&4294967295);var $vowel_transition564=(($phdata_next+108)&4294967295);var $arrayidx565=(($vowel_transition564+8)&4294967295);var $transition0566=(($fmtp+36)&4294967295);var $vowel_transition567=(($phdata_next+108)&4294967295);var $arrayidx568=(($vowel_transition567+12)&4294967295);var $transition1569=(($fmtp+40)&4294967295);var $sound_addr570=(($phdata_next+68)&4294967295);var $arrayidx571=(($sound_addr570+12)&4294967295);var $fmt2_addr572=(($fmtp+20)&4294967295);var $sound_param575=(($phdata_next+88)&4294967295);var $arrayidx576=(($sound_param575+12)&4294967295);var $fmt2_lenadj577=(($fmtp+24)&4294967295);var $sound_addr442=(($phdata_prev+68)&4294967295);var $arrayidx443=(($sound_addr442+8)&4294967295);var $fmt_addr444=(($fmtp+8)&4294967295);var $sound_param447=(($phdata_prev+88)&4294967295);var $arrayidx448=(($sound_param447+8)&4294967295);var $fmt2_lenadj=(($fmtp+24)&4294967295);var $vowel_transition=(($phdata_prev+108)&4294967295);var $arrayidx450=(($vowel_transition)&4294967295);var $transition0=(($fmtp+36)&4294967295);var $vowel_transition451=(($phdata_prev+108)&4294967295);var $arrayidx452=(($vowel_transition451+4)&4294967295);var $transition1=(($fmtp+40)&4294967295);;$while_cond$11:while(1){var $13=HEAP32[((__ZZ8GenerateP12PHONEME_LISTPiiE2ix)>>2)];var $14=$n_ph_addr;var $15=HEAP32[(($14)>>2)];var $cmp6=((($13))|0)<((($15))|0);if(!($cmp6)){__label__=134;break $while_cond$11;}
67497 var $16=HEAP32[((__ZZ8GenerateP12PHONEME_LISTPiiE2ix)>>2)];var $17=$phoneme_list_addr;var $arrayidx=(($17+24*$16)&4294967295);$p=$arrayidx;var $18=$p;var $type=(($18+15)&4294967295);var $19=HEAPU8[($type)];var $conv7=((($19))&255);var $cmp8=((($conv7))|0)==0;if($cmp8){__label__=9;;}else{__label__=10;;}
67498 if(__label__==9){$free_min=5;;}
67499 else if(__label__==10){var $20=$p;var $type10=(($20+15)&4294967295);var $21=HEAPU8[($type10)];var $conv11=((($21))&255);var $cmp12=((($conv11))|0)!=2;if($cmp12){__label__=11;;}else{__label__=12;;}
67500 if(__label__==11){$free_min=10;;}
67501 else if(__label__==12){$free_min=22;;}}
67502 var $call17=__Z9WcmdqFreev();var $22=$free_min;var $cmp18=((($call17))|0)<=((($22))|0);if($cmp18){__label__=14;break $while_cond$11;}
67503 var $23=HEAP32[((__ZZ8GenerateP12PHONEME_LISTPiiE2ix)>>2)];var $sub=((($23)-1)&4294967295);var $24=$phoneme_list_addr;var $arrayidx21=(($24+24*$sub)&4294967295);$prev=$arrayidx21;var $25=HEAP32[((__ZZ8GenerateP12PHONEME_LISTPiiE2ix)>>2)];var $add=((($25)+1)&4294967295);var $26=$phoneme_list_addr;var $arrayidx22=(($26+24*$add)&4294967295);$next=$arrayidx22;var $27=HEAP32[((__ZZ8GenerateP12PHONEME_LISTPiiE2ix)>>2)];var $add23=((($27)+2)&4294967295);var $28=$phoneme_list_addr;var $arrayidx24=(($28+24*$add23)&4294967295);$next2=$arrayidx24;var $29=$p;var $synthflags=(($29+4)&4294967295);var $30=HEAPU16[(($synthflags)>>1)];var $conv25=((($30))&65535);var $and=($conv25)&2;var $tobool26=((($and))|0)!=0;if($tobool26){__label__=16;;}else{__label__=17;;}
67504 if(__label__==16){var $31=$p;var $sourceix=(($31+6)&4294967295);var $32=HEAPU16[(($sourceix)>>1)];var $conv28=((($32))&65535);__Z10DoEmbeddedPii(__ZZ8GenerateP12PHONEME_LISTPiiE11embedded_ix,$conv28);;}
67505 var $33=$p;var $newword=(($33+19)&4294967295);var $34=HEAP8[($newword)];var $tobool30=(tempInt=(($34)),(tempInt>=128?tempInt-256:tempInt))!=0;if($tobool30){__label__=18;;}else{__label__=26;;}
67506 $if_then31$$if_end63$25:do{if(__label__==18){var $35=$p;var $type32=(($35+15)&4294967295);var $36=HEAPU8[($type32)];var $conv33=((($36))&255);var $cmp34=((($conv33))|0)==2;if($cmp34){__label__=19;;}else{__label__=20;;}
67507 $land_lhs_true$$lor_lhs_false$27:do{if(__label__==19){var $37=HEAP32[((_translator)>>2)];var $langopts=(($37)&4294967295);var $param=(($langopts+24)&4294967295);var $arrayidx35=(($param+32)&4294967295);var $38=HEAP32[(($arrayidx35)>>2)];var $and36=($38)&1;var $tobool37=((($and36))|0)!=0;if($tobool37){__label__=22;break $land_lhs_true$$lor_lhs_false$27;}else{__label__=20;break $land_lhs_true$$lor_lhs_false$27;}}}while(0);$if_end43$$lor_lhs_false$29:do{if(__label__==20){var $39=$p;var $ph38=(($39+8)&4294967295);var $40=HEAP32[(($ph38)>>2)];var $phflags=(($40+4)&4294967295);var $41=HEAP32[(($phflags)>>2)];var $and39=($41)&16777216;var $tobool40=((($and39))|0)!=0;if($tobool40){__label__=22;break $if_end43$$lor_lhs_false$29;}
67508 HEAP32[((__ZL10last_frame)>>2)]=0;;}}while(0);var $42=$p;var $sourceix44=(($42+6)&4294967295);var $43=HEAPU16[(($sourceix44)>>1)];var $conv45=((($43))&65535);var $and46=($conv45)&2047;var $44=HEAP32[((_clause_start_char)>>2)];var $add47=((($and46)+($44))&4294967295);HEAP32[((__ZZ8GenerateP12PHONEME_LISTPiiE8sourceix)>>2)]=$add47;var $45=$p;var $newword48=(($45+19)&4294967295);var $46=HEAPU8[($newword48)];var $conv49=((($46))&255);var $and50=($conv49)&4;var $tobool51=((($and50))|0)!=0;if($tobool51){__label__=23;;}else{__label__=24;;}
67509 if(__label__==23){var $47=HEAP32[((__ZZ8GenerateP12PHONEME_LISTPiiE8sourceix)>>2)];var $48=HEAP32[((_count_sentences)>>2)];__Z8DoMarkeriiii(2,$47,0,$48);;}
67510 var $49=$p;var $newword54=(($49+19)&4294967295);var $50=HEAPU8[($newword54)];var $conv55=((($50))&255);var $and56=($conv55)&1;var $tobool57=((($and56))|0)!=0;if(!($tobool57)){__label__=26;break $if_then31$$if_end63$25;}
67511 var $51=HEAP32[((__ZZ8GenerateP12PHONEME_LISTPiiE8sourceix)>>2)];var $52=$p;var $sourceix59=(($52+6)&4294967295);var $53=HEAPU16[(($sourceix59)>>1)];var $conv60=((($53))&65535);var $shr=($conv60)>>11;var $54=HEAP32[((_clause_start_word)>>2)];var $55=HEAPU32[((__ZZ8GenerateP12PHONEME_LISTPiiE10word_count)>>2)];var $inc=((($55)+1)&4294967295);HEAP32[((__ZZ8GenerateP12PHONEME_LISTPiiE10word_count)>>2)]=$inc;var $add61=((($55)+($54))&4294967295);__Z8DoMarkeriiii(1,$51,$shr,$add61);;}}while(0);__ZL12EndAmplitudev();var $56=$p;var $prepause=(($56+16)&4294967295);var $57=HEAPU8[($prepause)];var $conv64=((($57))&255);var $cmp65=((($conv64))|0)>0;if($cmp65){__label__=27;;}else{__label__=28;;}
67512 if(__label__==27){var $58=$p;var $prepause67=(($58+16)&4294967295);var $59=HEAPU8[($prepause67)];var $conv68=((($59))&255);__ZL7DoPauseii($conv68,1);;}
67513 var $60=HEAP32[((_option_phoneme_events)>>2)];var $tobool70=((($60))|0)!=0;if($tobool70){__label__=29;;}else{__label__=31;;}
67514 $land_lhs_true71$$if_end77$41:do{if(__label__==29){var $61=$p;var $type72=(($61+15)&4294967295);var $62=HEAPU8[($type72)];var $conv73=((($62))&255);var $cmp74=((($conv73))|0)!=2;if(!($cmp74)){__label__=31;break $land_lhs_true71$$if_end77$41;}
67515 var $63=HEAP32[((__ZZ8GenerateP12PHONEME_LISTPiiE8sourceix)>>2)];var $64=$p;var $ph76=(($64+8)&4294967295);var $65=HEAP32[(($ph76)>>2)];var $mnemonic=(($65)&4294967295);var $66=HEAP32[(($mnemonic)>>2)];__Z8DoMarkeriiii(7,$63,0,$66);;}}while(0);var $67=$p;var $type78=(($67+15)&4294967295);var $68=HEAPU8[($type78)];var $conv79=((($68))&255);if($conv79==0){__label__=32;;}
67516 else if($conv79==4){__label__=33;;}
67517 else if($conv79==6){__label__=41;;}
67518 else if($conv79==5){__label__=44;;}
67519 else if($conv79==7){__label__=67;;}
67520 else if($conv79==8){__label__=81;;}
67521 else if($conv79==3){__label__=91;;}
67522 else if($conv79==2){__label__=100;;}
67523 else{__label__=133;;}
67524 $sw_epilog$$sw_bb$$sw_bb81$$sw_bb105$$sw_bb118$$sw_bb229$$sw_bb313$$sw_bb367$$sw_bb418$45:do{if(__label__==32){var $69=$p;var $length=(($69+12)&4294967295);var $70=HEAP16[(($length)>>1)];var $conv80=(tempInt=(($70)),(tempInt>=32768?tempInt-65536:tempInt));__ZL7DoPauseii($conv80,0);;}
67525 else if(__label__==33){$released=0;var $71=$next;var $type82=(($71+15)&4294967295);var $72=HEAPU8[($type82)];var $conv83=((($72))&255);var $cmp84=((($conv83))|0)==2;if($cmp84){__label__=34;;}else{__label__=35;;}
67526 $if_then85$$if_else86$48:do{if(__label__==34){$released=1;;}
67527 else if(__label__==35){var $73=$next;var $newword87=(($73+19)&4294967295);var $74=HEAP8[($newword87)];var $tobool88=(tempInt=(($74)),(tempInt>=128?tempInt-256:tempInt))!=0;if($tobool88){__label__=38;;}else{__label__=36;;}
67528 $if_end96$$if_then89$51:do{if(__label__==36){var $75=$next;var $type90=(($75+15)&4294967295);var $76=HEAPU8[($type90)];var $conv91=((($76))&255);var $cmp92=((($conv91))|0)==3;if(!($cmp92)){__label__=38;break $if_end96$$if_then89$51;}
67529 $released=1;__label__=40;break $if_then85$$if_else86$48;}}while(0);var $_pr=$released;var $cmp97=((($_pr))|0)==0;if(!($cmp97)){__label__=40;break $if_then85$$if_else86$48;}
67530 var $77=$p;var $synthflags99=(($77+4)&4294967295);var $78=HEAPU16[(($synthflags99)>>1)];var $conv100=((($78))&65535);var $or=($conv100)|8192;var $conv101=((($or))&65535);HEAP16[(($synthflags99)>>1)]=$conv101;;}}while(0);var $79=$p;__Z16InterpretPhonemeP10TranslatoriP12PHONEME_LISTP12PHONEME_DATA(0,0,$79,$phdata);var $80=HEAP32[(($pd_control)>>2)];var $or103=($80)|4;HEAP32[(($pd_control)>>2)]=$or103;var $call104=__Z9DoSample3P12PHONEME_DATAii($phdata,0,0);;}
67531 else if(__label__==41){var $81=$p;__Z16InterpretPhonemeP10TranslatoriP12PHONEME_LISTP12PHONEME_DATA(0,0,$81,$phdata);var $82=$p;var $synthflags106=(($82+4)&4294967295);var $83=HEAPU16[(($synthflags106)>>1)];var $conv107=((($83))&65535);var $and108=($conv107)&8;var $tobool109=((($and108))|0)!=0;if($tobool109){__label__=42;;}else{__label__=43;;}
67532 if(__label__==42){var $84=$p;var $length111=(($84+12)&4294967295);var $85=HEAP16[(($length111)>>1)];var $conv112=(tempInt=(($85)),(tempInt>=32768?tempInt-65536:tempInt));var $call113=__Z9DoSample3P12PHONEME_DATAii($phdata,$conv112,0);;}
67533 var $86=$p;var $length115=(($86+12)&4294967295);var $87=HEAP16[(($length115)>>1)];var $conv116=(tempInt=(($87)),(tempInt>=32768?tempInt-65536:tempInt));var $call117=__Z9DoSample3P12PHONEME_DATAii($phdata,$conv116,0);;}
67534 else if(__label__==44){var $88=$p;var $ph119=(($88+8)&4294967295);var $89=HEAP32[(($ph119)>>2)];$ph=$89;var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=$8;$stop$=$dest$+48;$value4$=0;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=0;}
67535 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
67536 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=0;};HEAP32[(($fmt_control)>>2)]=4;$pre_voiced=0;var $90=$next;var $type120=(($90+15)&4294967295);var $91=HEAPU8[($type120)];var $conv121=((($91))&255);var $cmp122=((($conv121))|0)==2;if($cmp122){__label__=45;;}else{__label__=46;;}
67537 $if_then123$$if_else128$62:do{if(__label__==45){var $92=$p;var $amp=(($92+18)&4294967295);var $93=HEAPU8[($amp)];var $conv124=((($93))&255);__ZL11DoAmplitudeiPh($conv124,0);var $94=$p;var $env=(($94+14)&4294967295);var $95=HEAPU8[($env)];var $idxprom=((($95))&255);var $arrayidx125=((_envelope_data+$idxprom*4)&4294967295);var $96=HEAP32[(($arrayidx125)>>2)];var $97=$p;var $pitch1=(($97+20)&4294967295);var $98=HEAPU8[($pitch1)];var $conv126=((($98))&255);var $99=$p;var $pitch2=(($99+21)&4294967295);var $100=HEAPU8[($pitch2)];var $conv127=((($100))&255);__ZL7DoPitchPhii($96,$conv126,$conv127);$pre_voiced=1;;}
67538 else if(__label__==46){var $101=$next;var $type129=(($101+15)&4294967295);var $102=HEAPU8[($type129)];var $conv130=((($102))&255);var $cmp131=((($conv130))|0)==3;if($cmp131){__label__=47;;}else{__label__=49;;}
67539 $land_lhs_true132$$if_else145$65:do{if(__label__==47){var $103=$next;var $newword133=(($103+19)&4294967295);var $104=HEAP8[($newword133)];var $tobool134=(tempInt=(($104)),(tempInt>=128?tempInt-256:tempInt))!=0;if($tobool134){__label__=49;break $land_lhs_true132$$if_else145$65;}
67540 var $105=$next;var $amp136=(($105+18)&4294967295);var $106=HEAPU8[($amp136)];var $conv137=((($106))&255);__ZL11DoAmplitudeiPh($conv137,0);var $107=$next;var $env138=(($107+14)&4294967295);var $108=HEAPU8[($env138)];var $idxprom139=((($108))&255);var $arrayidx140=((_envelope_data+$idxprom139*4)&4294967295);var $109=HEAP32[(($arrayidx140)>>2)];var $110=$next;var $pitch1141=(($110+20)&4294967295);var $111=HEAPU8[($pitch1141)];var $conv142=((($111))&255);var $112=$next;var $pitch2143=(($112+21)&4294967295);var $113=HEAPU8[($pitch2143)];var $conv144=((($113))&255);__ZL7DoPitchPhii($109,$conv142,$conv144);$pre_voiced=1;__label__=51;break $if_then123$$if_else128$62;}}while(0);var $114=HEAP32[((__ZL14last_pitch_cmd)>>2)];var $cmp146=((($114))|0)<0;if(!($cmp146)){__label__=51;break $if_then123$$if_else128$62;}
67541 var $115=$next;var $amp148=(($115+18)&4294967295);var $116=HEAPU8[($amp148)];var $conv149=((($116))&255);__ZL11DoAmplitudeiPh($conv149,0);var $117=$p;var $env150=(($117+14)&4294967295);var $118=HEAPU8[($env150)];var $idxprom151=((($118))&255);var $arrayidx152=((_envelope_data+$idxprom151*4)&4294967295);var $119=HEAP32[(($arrayidx152)>>2)];var $120=$p;var $pitch1153=(($120+20)&4294967295);var $121=HEAPU8[($pitch1153)];var $conv154=((($121))&255);var $122=$p;var $pitch2155=(($122+21)&4294967295);var $123=HEAPU8[($pitch2155)];var $conv156=((($123))&255);__ZL7DoPitchPhii($119,$conv154,$conv156);;}}while(0);var $124=$prev;var $type160=(($124+15)&4294967295);var $125=HEAPU8[($type160)];var $conv161=((($125))&255);var $cmp162=((($conv161))|0)==2;if($cmp162){__label__=54;;}else{__label__=52;;}
67542 $if_then172$$lor_lhs_false163$71:do{if(__label__==52){var $126=$prev;var $ph164=(($126+8)&4294967295);var $127=HEAP32[(($ph164)>>2)];var $phflags165=(($127+4)&4294967295);var $128=HEAP32[(($phflags165)>>2)];var $and166=($128)&256;var $tobool167=((($and166))|0)!=0;if($tobool167){__label__=54;break $if_then172$$lor_lhs_false163$71;}
67543 var $129=$ph;var $phflags169=(($129+4)&4294967295);var $130=HEAP32[(($phflags169)>>2)];var $and170=($130)&33554432;var $tobool171=((($and170))|0)!=0;if($tobool171){__label__=54;break $if_then172$$lor_lhs_false163$71;}
67544 var $140=$p;var $synthflags184=(($140+4)&4294967295);var $141=HEAPU16[(($synthflags184)>>1)];var $conv185=((($141))&65535);var $and186=($conv185)&8;var $tobool187=((($and186))|0)!=0;if(!($tobool187)){__label__=58;break $if_then172$$lor_lhs_false163$71;}
67545 __ZL7DoPauseii(50,0);__label__=58;break $if_then172$$lor_lhs_false163$71;}}while(0);$if_then172$$if_end190$76:do{if(__label__==54){var $131=$p;__Z16InterpretPhonemeP10TranslatoriP12PHONEME_LISTP12PHONEME_DATA(0,1,$131,$phdata);var $132=HEAP32[(($arrayidx173)>>2)];HEAP32[(($fmt_addr)>>2)]=$132;var $133=HEAP32[(($arrayidx174)>>2)];HEAP32[(($fmt_amp)>>2)]=$133;var $134=$ph;var $135=$p;var $call175=__Z8DoSpect2P11PHONEME_TABiP10FMT_PARAMSP12PHONEME_LISTi($134,0,$fmtp,$135,0);var $136=$p;var $synthflags176=(($136+4)&4294967295);var $137=HEAPU16[(($synthflags176)>>1)];var $conv177=((($137))&65535);var $and178=($conv177)&8;var $tobool179=((($and178))|0)!=0;if(!($tobool179)){__label__=58;break $if_then172$$if_end190$76;}
67546 __ZL7DoPauseii(25,1);var $138=$ph;var $139=$p;var $call181=__Z8DoSpect2P11PHONEME_TABiP10FMT_PARAMSP12PHONEME_LISTi($138,0,$fmtp,$139,0);;}}while(0);var $142=$pre_voiced;var $tobool191=((($142))|0)!=0;if($tobool191){__label__=59;;}else{__label__=60;;}
67547 if(__label__==59){__ZL13StartSyllablev();;}
67548 else if(__label__==60){var $143=$p;var $synthflags194=(($143+4)&4294967295);var $144=HEAPU16[(($synthflags194)>>1)];var $conv195=((($144))&65535);var $or196=($conv195)|8192;var $conv197=((($or196))&65535);HEAP16[(($synthflags194)>>1)]=$conv197;;}
67549 var $145=$p;__Z16InterpretPhonemeP10TranslatoriP12PHONEME_LISTP12PHONEME_DATA(0,0,$145,$phdata);var $146=HEAP32[(($arrayidx200)>>2)];HEAP32[(($fmt_addr201)>>2)]=$146;var $147=HEAP32[(($arrayidx203)>>2)];HEAP32[(($fmt_amp204)>>2)]=$147;var $148=HEAP32[(($arrayidx206)>>2)];HEAP32[(($wav_addr)>>2)]=$148;var $149=HEAP32[(($arrayidx208)>>2)];HEAP32[(($wav_amp)>>2)]=$149;var $150=$ph;var $151=$p;var $call209=__Z8DoSpect2P11PHONEME_TABiP10FMT_PARAMSP12PHONEME_LISTi($150,0,$fmtp,$151,0);var $152=$p;var $newword210=(($152+19)&4294967295);var $153=HEAPU8[($newword210)];var $conv211=((($153))&255);var $cmp212=((($conv211))|0)==0;if(!($cmp212)){__label__=133;break $sw_epilog$$sw_bb$$sw_bb81$$sw_bb105$$sw_bb118$$sw_bb229$$sw_bb313$$sw_bb367$$sw_bb418$45;}
67550 var $154=$next2;var $newword214=(($154+19)&4294967295);var $155=HEAPU8[($newword214)];var $conv215=((($155))&255);var $cmp216=((($conv215))|0)==0;if(!($cmp216)){__label__=133;break $sw_epilog$$sw_bb$$sw_bb81$$sw_bb105$$sw_bb118$$sw_bb229$$sw_bb313$$sw_bb367$$sw_bb418$45;}
67551 var $156=$next;var $type218=(($156+15)&4294967295);var $157=HEAPU8[($type218)];var $conv219=((($157))&255);var $cmp220=((($conv219))|0)==7;if($cmp220){__label__=64;;}else{__label__=65;;}
67552 if(__label__==64){__ZL7DoPauseii(20,0);;}
67553 var $158=$next;var $type223=(($158+15)&4294967295);var $159=HEAPU8[($type223)];var $conv224=((($159))&255);var $cmp225=((($conv224))|0)==6;if(!($cmp225)){__label__=133;break $sw_epilog$$sw_bb$$sw_bb81$$sw_bb105$$sw_bb118$$sw_bb229$$sw_bb313$$sw_bb367$$sw_bb418$45;}
67554 __ZL7DoPauseii(12,0);;}
67555 else if(__label__==67){var $160=$next;var $type230=(($160+15)&4294967295);var $161=HEAPU8[($type230)];var $conv231=((($161))&255);var $cmp232=((($conv231))|0)==2;if($cmp232){__label__=68;;}else{__label__=69;;}
67556 $if_then233$$if_else243$91:do{if(__label__==68){var $162=$p;var $amp234=(($162+18)&4294967295);var $163=HEAPU8[($amp234)];var $conv235=((($163))&255);__ZL11DoAmplitudeiPh($conv235,0);var $164=$p;var $env236=(($164+14)&4294967295);var $165=HEAPU8[($env236)];var $idxprom237=((($165))&255);var $arrayidx238=((_envelope_data+$idxprom237*4)&4294967295);var $166=HEAP32[(($arrayidx238)>>2)];var $167=$p;var $pitch1239=(($167+20)&4294967295);var $168=HEAPU8[($pitch1239)];var $conv240=((($168))&255);var $169=$p;var $pitch2241=(($169+21)&4294967295);var $170=HEAPU8[($pitch2241)];var $conv242=((($170))&255);__ZL7DoPitchPhii($166,$conv240,$conv242);;}
67557 else if(__label__==69){var $171=$next;var $type244=(($171+15)&4294967295);var $172=HEAPU8[($type244)];var $conv245=((($172))&255);var $cmp246=((($conv245))|0)==3;if($cmp246){__label__=70;;}else{__label__=71;;}
67558 if(__label__==70){var $173=$next;var $amp248=(($173+18)&4294967295);var $174=HEAPU8[($amp248)];var $conv249=((($174))&255);__ZL11DoAmplitudeiPh($conv249,0);var $175=$next;var $env250=(($175+14)&4294967295);var $176=HEAPU8[($env250)];var $idxprom251=((($176))&255);var $arrayidx252=((_envelope_data+$idxprom251*4)&4294967295);var $177=HEAP32[(($arrayidx252)>>2)];var $178=$next;var $pitch1253=(($178+20)&4294967295);var $179=HEAPU8[($pitch1253)];var $conv254=((($179))&255);var $180=$next;var $pitch2255=(($180+21)&4294967295);var $181=HEAPU8[($pitch2255)];var $conv256=((($181))&255);__ZL7DoPitchPhii($177,$conv254,$conv256);;}
67559 else if(__label__==71){var $182=HEAP32[((__ZL14last_pitch_cmd)>>2)];var $cmp258=((($182))|0)<0;if(!($cmp258)){__label__=73;break $if_then233$$if_else243$91;}
67560 var $183=$p;var $amp260=(($183+18)&4294967295);var $184=HEAPU8[($amp260)];var $conv261=((($184))&255);__ZL11DoAmplitudeiPh($conv261,0);var $185=$p;var $env262=(($185+14)&4294967295);var $186=HEAPU8[($env262)];var $idxprom263=((($186))&255);var $arrayidx264=((_envelope_data+$idxprom263*4)&4294967295);var $187=HEAP32[(($arrayidx264)>>2)];var $188=$p;var $pitch1265=(($188+20)&4294967295);var $189=HEAPU8[($pitch1265)];var $conv266=((($189))&255);var $190=$p;var $pitch2267=(($190+21)&4294967295);var $191=HEAPU8[($pitch2267)];var $conv268=((($191))&255);__ZL7DoPitchPhii($187,$conv266,$conv268);;}}}while(0);var $192=$next;var $type272=(($192+15)&4294967295);var $193=HEAPU8[($type272)];var $conv273=((($193))&255);var $cmp274=((($conv273))|0)==2;if($cmp274){__label__=76;;}else{__label__=74;;}
67561 $if_then283$$lor_lhs_false275$99:do{if(__label__==74){var $194=$next;var $type276=(($194+15)&4294967295);var $195=HEAPU8[($type276)];var $conv277=((($195))&255);var $cmp278=((($conv277))|0)==3;if($cmp278){__label__=75;;}else{__label__=77;;}
67562 if(__label__==75){var $196=$next;var $newword280=(($196+19)&4294967295);var $197=HEAPU8[($newword280)];var $conv281=((($197))&255);var $cmp282=((($conv281))|0)==0;if($cmp282){__label__=76;break $if_then283$$lor_lhs_false275$99;}}
67563 var $198=$p;var $synthflags285=(($198+4)&4294967295);var $199=HEAPU16[(($synthflags285)>>1)];var $conv286=((($199))&65535);var $or287=($conv286)|8192;var $conv288=((($or287))&65535);HEAP16[(($synthflags285)>>1)]=$conv288;__label__=78;break $if_then283$$lor_lhs_false275$99;}}while(0);if(__label__==76){__ZL13StartSyllablev();;}
67564 var $200=$p;__Z16InterpretPhonemeP10TranslatoriP12PHONEME_LISTP12PHONEME_DATA(0,0,$200,$phdata);var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=$9;$stop$=$dest$+48;$value4$=0;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=0;}
67565 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
67566 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=0;};var $201=HEAP32[(($arrayidx290)>>2)];var $mul=((($201)*2)&4294967295);HEAP32[(($std_length)>>2)]=$mul;var $202=HEAP32[(($arrayidx292)>>2)];HEAP32[(($fmt_addr293)>>2)]=$202;var $203=HEAP32[(($arrayidx295)>>2)];HEAP32[(($fmt_amp296)>>2)]=$203;var $204=HEAP32[(($arrayidx298)>>2)];HEAP32[(($wav_addr299)>>2)]=$204;var $205=HEAP32[(($arrayidx301)>>2)];HEAP32[(($wav_amp302)>>2)]=$205;var $206=$p;var $synthflags303=(($206+4)&4294967295);var $207=HEAPU16[(($synthflags303)>>1)];var $conv304=((($207))&65535);var $and305=($conv304)&8;var $tobool306=((($and305))|0)!=0;if($tobool306){__label__=79;;}else{__label__=80;;}
67567 if(__label__==79){var $208=$p;var $ph308=(($208+8)&4294967295);var $209=HEAP32[(($ph308)>>2)];var $210=$p;var $call309=__Z8DoSpect2P11PHONEME_TABiP10FMT_PARAMSP12PHONEME_LISTi($209,0,$fmtp,$210,0);;}
67568 var $211=$p;var $ph311=(($211+8)&4294967295);var $212=HEAP32[(($ph311)>>2)];var $213=$p;var $call312=__Z8DoSpect2P11PHONEME_TABiP10FMT_PARAMSP12PHONEME_LISTi($212,0,$fmtp,$213,0);;}
67569 else if(__label__==81){var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=$10;$stop$=$dest$+48;$value4$=0;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=0;}
67570 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
67571 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=0;};var $214=$p;var $synthflags314=(($214+4)&4294967295);var $215=HEAPU16[(($synthflags314)>>1)];var $conv315=((($215))&65535);var $and316=($conv315)&1;var $tobool317=((($and316))|0)!=0;if($tobool317){__label__=83;;}else{__label__=82;;}
67572 if(__label__==82){var $216=$p;var $amp319=(($216+18)&4294967295);var $217=HEAPU8[($amp319)];var $conv320=((($217))&255);__ZL11DoAmplitudeiPh($conv320,0);var $218=$p;var $env321=(($218+14)&4294967295);var $219=HEAPU8[($env321)];var $idxprom322=((($219))&255);var $arrayidx323=((_envelope_data+$idxprom322*4)&4294967295);var $220=HEAP32[(($arrayidx323)>>2)];var $221=$p;var $pitch1324=(($221+20)&4294967295);var $222=HEAPU8[($pitch1324)];var $conv325=((($222))&255);var $223=$p;var $pitch2326=(($223+21)&4294967295);var $224=HEAPU8[($pitch2326)];var $conv327=((($224))&255);__ZL7DoPitchPhii($220,$conv325,$conv327);;}
67573 var $225=$prev;var $type329=(($225+15)&4294967295);var $226=HEAPU8[($type329)];var $conv330=((($226))&255);var $cmp331=((($conv330))|0)==8;if($cmp331){__label__=84;;}else{__label__=85;;}
67574 if(__label__==84){HEAP32[((__ZL10last_frame)>>2)]=0;;}
67575 var $227=$p;__Z16InterpretPhonemeP10TranslatoriP12PHONEME_LISTP12PHONEME_DATA(0,0,$227,$phdata);var $228=HEAP32[(($arrayidx335)>>2)];var $mul336=((($228)*2)&4294967295);HEAP32[(($std_length337)>>2)]=$mul336;var $229=HEAP32[(($arrayidx339)>>2)];HEAP32[(($fmt_addr340)>>2)]=$229;var $230=HEAP32[(($arrayidx342)>>2)];HEAP32[(($fmt_amp343)>>2)]=$230;var $231=$next;var $type344=(($231+15)&4294967295);var $232=HEAPU8[($type344)];var $conv345=((($232))&255);var $cmp346=((($conv345))|0)==2;if($cmp346){__label__=86;;}else{__label__=87;;}
67576 if(__label__==86){__ZL13StartSyllablev();var $233=$p;var $ph348=(($233+8)&4294967295);var $234=HEAP32[(($ph348)>>2)];var $235=$p;var $call349=__Z8DoSpect2P11PHONEME_TABiP10FMT_PARAMSP12PHONEME_LISTi($234,0,$fmtp,$235,0);;}
67577 else if(__label__==87){var $236=$prev;var $type351=(($236+15)&4294967295);var $237=HEAPU8[($type351)];var $conv352=((($237))&255);var $cmp353=((($conv352))|0)==2;if($cmp353){__label__=88;;}else{__label__=90;;}
67578 $land_lhs_true354$$if_else362$120:do{if(__label__==88){var $238=$p;var $synthflags355=(($238+4)&4294967295);var $239=HEAPU16[(($synthflags355)>>1)];var $conv356=((($239))&65535);var $and357=($conv356)&1;var $tobool358=((($and357))|0)!=0;if(!($tobool358)){__label__=90;break $land_lhs_true354$$if_else362$120;}
67579 var $240=$p;var $ph360=(($240+8)&4294967295);var $241=HEAP32[(($ph360)>>2)];var $242=$p;var $call361=__Z8DoSpect2P11PHONEME_TABiP10FMT_PARAMSP12PHONEME_LISTi($241,0,$fmtp,$242,0);__label__=133;break $sw_epilog$$sw_bb$$sw_bb81$$sw_bb105$$sw_bb118$$sw_bb229$$sw_bb313$$sw_bb367$$sw_bb418$45;}}while(0);HEAP32[((__ZL10last_frame)>>2)]=0;var $243=$p;var $ph363=(($243+8)&4294967295);var $244=HEAP32[(($ph363)>>2)];var $245=$p;var $call364=__Z8DoSpect2P11PHONEME_TABiP10FMT_PARAMSP12PHONEME_LISTi($244,0,$fmtp,$245,0);HEAP32[((__ZL10last_frame)>>2)]=0;;}}
67580 else if(__label__==91){var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=$11;$stop$=$dest$+48;$value4$=0;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=0;}
67581 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
67582 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=0;};$modulation=0;var $246=$p;var $ph368=(($246+8)&4294967295);var $247=HEAP32[(($ph368)>>2)];var $phflags369=(($247+4)&4294967295);var $248=HEAP32[(($phflags369)>>2)];var $and370=($248)&128;var $tobool371=((($and370))|0)!=0;if($tobool371){__label__=92;;}else{__label__=93;;}
67583 if(__label__==92){$modulation=5;;}
67584 var $249=$prev;var $ph374=(($249+8)&4294967295);var $250=HEAP32[(($ph374)>>2)];$prev_ph=$250;var $251=$p;var $synthflags375=(($251+4)&4294967295);var $252=HEAPU16[(($synthflags375)>>1)];var $conv376=((($252))&65535);var $and377=($conv376)&1;var $tobool378=((($and377))|0)!=0;if($tobool378){__label__=95;;}else{__label__=94;;}
67585 if(__label__==94){var $253=$p;var $amp380=(($253+18)&4294967295);var $254=HEAPU8[($amp380)];var $conv381=((($254))&255);__ZL11DoAmplitudeiPh($conv381,0);var $255=$p;var $env382=(($255+14)&4294967295);var $256=HEAPU8[($env382)];var $idxprom383=((($256))&255);var $arrayidx384=((_envelope_data+$idxprom383*4)&4294967295);var $257=HEAP32[(($arrayidx384)>>2)];var $258=$p;var $pitch1385=(($258+20)&4294967295);var $259=HEAPU8[($pitch1385)];var $conv386=((($259))&255);var $260=$p;var $pitch2387=(($260+21)&4294967295);var $261=HEAPU8[($pitch2387)];var $conv388=((($261))&255);__ZL7DoPitchPhii($257,$conv386,$conv388);;}
67586 var $262=$prev;var $type390=(($262+15)&4294967295);var $263=HEAPU8[($type390)];var $conv391=((($263))&255);var $cmp392=((($conv391))|0)==8;if($cmp392){__label__=96;;}else{__label__=97;;}
67587 if(__label__==96){HEAP32[((__ZL10last_frame)>>2)]=0;;}
67588 var $264=$next;var $type395=(($264+15)&4294967295);var $265=HEAPU8[($type395)];var $conv396=((($265))&255);var $cmp397=((($conv396))|0)==2;if($cmp397){__label__=98;;}else{__label__=99;;}
67589 if(__label__==98){__ZL13StartSyllablev();;}
67590 var $266=$p;__Z16InterpretPhonemeP10TranslatoriP12PHONEME_LISTP12PHONEME_DATA(0,0,$266,$phdata);var $267=HEAP32[(($arrayidx401)>>2)];var $mul402=((($267)*2)&4294967295);HEAP32[(($std_length403)>>2)]=$mul402;var $268=HEAP32[(($arrayidx405)>>2)];HEAP32[(($fmt_addr406)>>2)]=$268;var $269=HEAP32[(($arrayidx408)>>2)];HEAP32[(($fmt_amp409)>>2)]=$269;var $270=HEAP32[(($arrayidx411)>>2)];HEAP32[(($wav_addr412)>>2)]=$270;var $271=HEAP32[(($arrayidx414)>>2)];HEAP32[(($wav_amp415)>>2)]=$271;var $272=$p;var $ph416=(($272+8)&4294967295);var $273=HEAP32[(($ph416)>>2)];var $274=$p;var $275=$modulation;var $call417=__Z8DoSpect2P11PHONEME_TABiP10FMT_PARAMSP12PHONEME_LISTi($273,0,$fmtp,$274,$275);;}
67591 else if(__label__==100){var $276=$p;var $ph419=(($276+8)&4294967295);var $277=HEAP32[(($ph419)>>2)];$ph=$277;var $278=$p;var $stresslevel=(($278+1)&4294967295);var $279=HEAPU8[($stresslevel)];var $conv420=((($279))&255);var $and421=($conv420)&15;$stress=$and421;var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=$12;$stop$=$dest$+48;$value4$=0;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=0;}
67592 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
67593 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=0;};var $280=$p;__Z16InterpretPhonemeP10TranslatoriP12PHONEME_LISTP12PHONEME_DATA(0,0,$280,$phdata);var $281=HEAP32[(($arrayidx423)>>2)];var $mul424=((($281)*2)&4294967295);HEAP32[(($std_length425)>>2)]=$mul424;var $282=HEAP32[(($arrayidx427)>>2)];HEAP32[(($fmt_addr428)>>2)]=$282;var $cmp429=((($282))|0)!=0;if($cmp429){__label__=101;;}else{__label__=103;;}
67594 $land_lhs_true430$$if_else437$138:do{if(__label__==101){var $283=HEAP32[(($pd_control431)>>2)];var $and432=($283)&2;var $cmp433=((($and432))|0)==0;if(!($cmp433)){__label__=103;break $land_lhs_true430$$if_else437$138;}
67595 var $284=HEAP32[(($arrayidx436)>>2)];HEAP32[(($fmt_length)>>2)]=$284;__label__=107;break $land_lhs_true430$$if_else437$138;}}while(0);$if_end454$$if_else437$141:do{if(__label__==103){var $285=$prev;var $type438=(($285+15)&4294967295);var $286=HEAPU8[($type438)];var $conv439=((($286))&255);var $cmp440=((($conv439))|0)!=0;if(!($cmp440)){__label__=107;break $if_end454$$if_else437$141;}
67596 var $287=$prev;__Z16InterpretPhonemeP10TranslatoriP12PHONEME_LISTP12PHONEME_DATA(0,0,$287,$phdata_prev);var $288=HEAP32[(($arrayidx443)>>2)];HEAP32[(($fmt_addr444)>>2)]=$288;var $cmp445=((($288))|0)!=0;if($cmp445){__label__=105;;}else{__label__=106;;}
67597 if(__label__==105){var $289=HEAP32[(($arrayidx448)>>2)];HEAP32[(($fmt2_lenadj)>>2)]=$289;;}
67598 var $290=HEAP32[(($arrayidx450)>>2)];HEAP32[(($transition0)>>2)]=$290;var $291=HEAP32[(($arrayidx452)>>2)];HEAP32[(($transition1)>>2)]=$291;;}}while(0);var $292=HEAP32[(($fmt_addr455)>>2)];var $cmp456=((($292))|0)==0;if($cmp456){__label__=108;;}else{__label__=109;;}
67599 if(__label__==108){HEAP32[(($use_vowelin)>>2)]=1;HEAP32[(($fmt_control458)>>2)]=1;var $293=HEAP32[(($arrayidx460)>>2)];HEAP32[(($fmt_addr461)>>2)]=$293;;}
67600 var $294=HEAP32[(($arrayidx464)>>2)];HEAP32[(($fmt_amp465)>>2)]=$294;var $295=$p;var $env466=(($295+14)&4294967295);var $296=HEAPU8[($env466)];var $idxprom467=((($296))&255);var $arrayidx468=((_envelope_data+$idxprom467*4)&4294967295);var $297=HEAP32[(($arrayidx468)>>2)];$pitch_env=$297;$amp_env=0;var $298=$p;var $tone_ph=(($298+3)&4294967295);var $299=HEAPU8[($tone_ph)];var $conv469=((($299))&255);var $cmp470=((($conv469))|0)!=0;if($cmp470){__label__=110;;}else{__label__=112;;}
67601 $if_then471$$if_end482$151:do{if(__label__==110){var $300=$p;var $tone_ph472=(($300+3)&4294967295);var $301=HEAPU8[($tone_ph472)];var $conv473=((($301))&255);__Z17InterpretPhoneme2iP12PHONEME_DATA($conv473,$phdata_tone);var $302=HEAP32[(($pitch_env474)>>2)];var $call475=__Z11GetEnvelopei($302);$pitch_env=$call475;var $303=HEAP32[(($amp_env476)>>2)];var $cmp477=((($303))|0)>0;if(!($cmp477)){__label__=112;break $if_then471$$if_end482$151;}
67602 var $304=HEAP32[(($amp_env479)>>2)];var $call480=__Z11GetEnvelopei($304);$amp_env=$call480;;}}while(0);__ZL13StartSyllablev();$modulation=2;var $305=$stress;var $cmp483=((($305))|0)<=1;if($cmp483){__label__=113;;}else{__label__=114;;}
67603 $if_then484$$if_else485$155:do{if(__label__==113){$modulation=1;;}
67604 else if(__label__==114){var $306=$stress;var $cmp486=((($306))|0)>=7;if(!($cmp486)){__label__=116;break $if_then484$$if_else485$155;}
67605 $modulation=3;;}}while(0);var $307=$prev;var $type490=(($307+15)&4294967295);var $308=HEAPU8[($type490)];var $conv491=((($308))&255);var $cmp492=((($conv491))|0)==5;if($cmp492){__label__=118;;}else{__label__=117;;}
67606 $if_then497$$lor_lhs_false493$160:do{if(__label__==117){var $309=$prev;var $type494=(($309+15)&4294967295);var $310=HEAPU8[($type494)];var $conv495=((($310))&255);var $cmp496=((($conv495))|0)==7;if($cmp496){__label__=118;break $if_then497$$lor_lhs_false493$160;}
67607 var $322=$prev;var $type506=(($322+15)&4294967295);var $323=HEAPU8[($type506)];var $conv507=((($323))&255);var $cmp508=((($conv507))|0)==3;if($cmp508){__label__=121;;}else{__label__=120;;}
67608 $if_then513$$lor_lhs_false509$163:do{if(__label__==120){var $324=$prev;var $type510=(($324+15)&4294967295);var $325=HEAPU8[($type510)];var $conv511=((($325))&255);var $cmp512=((($conv511))|0)==8;if($cmp512){__label__=121;break $if_then513$$lor_lhs_false509$163;}
67609 var $337=$p;var $synthflags522=(($337+4)&4294967295);var $338=HEAPU16[(($synthflags522)>>1)];var $conv523=((($338))&65535);var $and524=($conv523)&1;var $tobool525=((($and524))|0)!=0;if($tobool525){__label__=124;;}else{__label__=123;;}
67610 if(__label__==123){var $339=$p;var $amp527=(($339+18)&4294967295);var $340=HEAPU8[($amp527)];var $conv528=((($340))&255);var $341=$amp_env;__ZL11DoAmplitudeiPh($conv528,$341);var $342=$pitch_env;var $343=$p;var $pitch1529=(($343+20)&4294967295);var $344=HEAPU8[($pitch1529)];var $conv530=((($344))&255);var $345=$p;var $pitch2531=(($345+21)&4294967295);var $346=HEAPU8[($pitch2531)];var $conv532=((($346))&255);__ZL7DoPitchPhii($342,$conv530,$conv532);;}
67611 var $347=$ph;var $348=$p;var $349=$modulation;var $call534=__Z8DoSpect2P11PHONEME_TABiP10FMT_PARAMSP12PHONEME_LISTi($347,1,$fmtp,$348,$349);__label__=125;break $if_then497$$lor_lhs_false493$160;}}while(0);var $326=$p;var $amp514=(($326+18)&4294967295);var $327=HEAPU8[($amp514)];var $conv515=((($327))&255);var $328=$amp_env;__ZL11DoAmplitudeiPh($conv515,$328);var $329=$ph;var $330=$p;var $331=$modulation;var $call516=__Z8DoSpect2P11PHONEME_TABiP10FMT_PARAMSP12PHONEME_LISTi($329,1,$fmtp,$330,$331);var $332=$pitch_env;var $333=$p;var $pitch1517=(($333+20)&4294967295);var $334=HEAPU8[($pitch1517)];var $conv518=((($334))&255);var $335=$p;var $pitch2519=(($335+21)&4294967295);var $336=HEAPU8[($pitch2519)];var $conv520=((($336))&255);__ZL7DoPitchPhii($332,$conv518,$conv520);__label__=125;break $if_then497$$lor_lhs_false493$160;}}while(0);if(__label__==118){var $311=$p;var $amp498=(($311+18)&4294967295);var $312=HEAPU8[($amp498)];var $conv499=((($312))&255);var $313=$amp_env;__ZL11DoAmplitudeiPh($conv499,$313);var $314=$pitch_env;var $315=$p;var $pitch1500=(($315+20)&4294967295);var $316=HEAPU8[($pitch1500)];var $conv501=((($316))&255);var $317=$p;var $pitch2502=(($317+21)&4294967295);var $318=HEAPU8[($pitch2502)];var $conv503=((($318))&255);__ZL7DoPitchPhii($314,$conv501,$conv503);var $319=$ph;var $320=$p;var $321=$modulation;var $call504=__Z8DoSpect2P11PHONEME_TABiP10FMT_PARAMSP12PHONEME_LISTi($319,1,$fmtp,$320,$321);;}
67612 var $350=HEAP32[((_option_phoneme_events)>>2)];var $tobool537=((($350))|0)!=0;if($tobool537){__label__=126;;}else{__label__=127;;}
67613 if(__label__==126){var $351=HEAP32[((__ZZ8GenerateP12PHONEME_LISTPiiE8sourceix)>>2)];var $352=$p;var $ph539=(($352+8)&4294967295);var $353=HEAP32[(($ph539)>>2)];var $mnemonic540=(($353)&4294967295);var $354=HEAP32[(($mnemonic540)>>2)];__Z8DoMarkeriiii(7,$351,0,$354);;}
67614 var $355=HEAP32[(($arrayidx543)>>2)];HEAP32[(($fmt_addr544)>>2)]=$355;var $356=HEAP32[(($arrayidx546)>>2)];HEAP32[(($fmt_amp547)>>2)]=$356;HEAP32[(($transition0548)>>2)]=0;HEAP32[(($transition1549)>>2)]=0;var $357=HEAP32[(($arrayidx551)>>2)];HEAP32[(($fmt2_addr)>>2)]=$357;var $cmp552=((($357))|0)!=0;if($cmp552){__label__=128;;}else{__label__=129;;}
67615 $if_then553$$if_else557$176:do{if(__label__==128){var $358=HEAP32[(($arrayidx555)>>2)];HEAP32[(($fmt2_lenadj556)>>2)]=$358;;}
67616 else if(__label__==129){var $359=$next;var $type558=(($359+15)&4294967295);var $360=HEAPU8[($type558)];var $conv559=((($360))&255);var $cmp560=((($conv559))|0)!=0;if(!($cmp560)){__label__=132;break $if_then553$$if_else557$176;}
67617 HEAP32[(($fmt2_lenadj562)>>2)]=0;var $361=$next;__Z16InterpretPhonemeP10TranslatoriP12PHONEME_LISTP12PHONEME_DATA(0,0,$361,$phdata_next);HEAP32[(($use_vowelin563)>>2)]=1;var $362=HEAP32[(($arrayidx565)>>2)];HEAP32[(($transition0566)>>2)]=$362;var $363=HEAP32[(($arrayidx568)>>2)];HEAP32[(($transition1569)>>2)]=$363;var $364=HEAP32[(($arrayidx571)>>2)];HEAP32[(($fmt2_addr572)>>2)]=$364;var $cmp573=((($364))|0)!=0;if(!($cmp573)){__label__=132;break $if_then553$$if_else557$176;}
67618 var $365=HEAP32[(($arrayidx576)>>2)];HEAP32[(($fmt2_lenadj577)>>2)]=$365;;}}while(0);var $366=$ph;var $367=$p;var $368=$modulation;var $call581=__Z8DoSpect2P11PHONEME_TABiP10FMT_PARAMSP12PHONEME_LISTi($366,2,$fmtp,$367,$368);;}}while(0);var $369=HEAP32[((__ZZ8GenerateP12PHONEME_LISTPiiE2ix)>>2)];var $inc582=((($369)+1)&4294967295);HEAP32[((__ZZ8GenerateP12PHONEME_LISTPiiE2ix)>>2)]=$inc582;__label__=7;continue $while_cond$11;}
67619 if(__label__==134){__ZL8EndPitchi(1);var $370=$n_ph_addr;var $371=HEAP32[(($370)>>2)];var $cmp583=((($371))|0)>0;if($cmp583){__label__=135;;}else{__label__=136;;}
67620 if(__label__==135){var $372=HEAP32[((_count_characters)>>2)];var $373=HEAP32[((_count_sentences)>>2)];__Z8DoMarkeriiii(5,$372,0,$373);var $374=$n_ph_addr;HEAP32[(($374)>>2)]=0;;}
67621 $retval=0;;}
67622 else if(__label__==14){$retval=1;;}}}
67623 var $375=$retval;STACKTOP=__stackBase__;return $375;return null;}
67624 function __ZL12EndAmplitudev(){;var __label__;var $0=HEAP32[((__ZL10amp_length)>>2)];var $cmp=((($0))|0)>0;if($cmp){__label__=1;;}else{__label__=4;;}
67625 if(__label__==1){var $1=HEAP32[((__ZL12last_amp_cmd)>>2)];var $arrayidx=((_wcmdq+$1*16)&4294967295);var $arrayidx1=(($arrayidx+4)&4294967295);var $2=HEAP32[(($arrayidx1)>>2)];var $cmp2=((($2))|0)==0;if($cmp2){__label__=2;;}else{__label__=3;;}
67626 if(__label__==2){var $3=HEAP32[((__ZL10amp_length)>>2)];var $4=HEAP32[((__ZL12last_amp_cmd)>>2)];var $arrayidx4=((_wcmdq+$4*16)&4294967295);var $arrayidx5=(($arrayidx4+4)&4294967295);HEAP32[(($arrayidx5)>>2)]=$3;;}
67627 HEAP32[((__ZL10amp_length)>>2)]=0;;};return;return;}
67628 function __ZL11DoAmplitudeiPh($amp,$amp_env){;var __label__;var $amp_addr;var $amp_env_addr;var $q;$amp_addr=$amp;$amp_env_addr=$amp_env;var $0=HEAP32[((_wcmdq_tail)>>2)];HEAP32[((__ZL12last_amp_cmd)>>2)]=$0;HEAP32[((__ZL10amp_length)>>2)]=0;var $1=HEAP32[((_wcmdq_tail)>>2)];var $arrayidx=((_wcmdq+$1*16)&4294967295);var $arraydecay=(($arrayidx)&4294967295);$q=$arraydecay;var $2=$q;var $arrayidx1=(($2)&4294967295);HEAP32[(($arrayidx1)>>2)]=8;var $3=$q;var $arrayidx2=(($3+4)&4294967295);HEAP32[(($arrayidx2)>>2)]=0;var $4=$amp_env_addr;var $5=($4);var $6=$q;var $arrayidx3=(($6+8)&4294967295);HEAP32[(($arrayidx3)>>2)]=$5;var $7=$amp_addr;var $8=$q;var $arrayidx4=(($8+12)&4294967295);HEAP32[(($arrayidx4)>>2)]=$7;__Z8WcmdqIncv();;return;return;}
67629 function __ZL7DoPitchPhii($env,$pitch1,$pitch2){;var __label__;var $env_addr;var $pitch1_addr;var $pitch2_addr;var $q;$env_addr=$env;$pitch1_addr=$pitch1;$pitch2_addr=$pitch2;__ZL8EndPitchi(0);var $0=$pitch1_addr;var $cmp=((($0))|0)==255;if($cmp){__label__=1;;}else{__label__=2;;}
67630 $if_end_thread$$if_end$2:do{if(__label__==1){$pitch1_addr=55;$pitch2_addr=76;var $1=HEAP32[((((_envelope_data)&4294967295))>>2)];$env_addr=$1;var $2=HEAP32[((_wcmdq_tail)>>2)];HEAP32[((__ZL14last_pitch_cmd)>>2)]=$2;HEAP32[((__ZL12pitch_length)>>2)]=0;;}
67631 else if(__label__==2){var $_pr=$pitch2_addr;var $3=HEAP32[((_wcmdq_tail)>>2)];HEAP32[((__ZL14last_pitch_cmd)>>2)]=$3;HEAP32[((__ZL12pitch_length)>>2)]=0;var $cmp1=((($_pr))|0)<0;if(!($cmp1)){__label__=4;break $if_end_thread$$if_end$2;}
67632 $pitch2_addr=0;;}}while(0);var $4=HEAP32[((_wcmdq_tail)>>2)];var $arrayidx=((_wcmdq+$4*16)&4294967295);var $arraydecay=(($arrayidx)&4294967295);$q=$arraydecay;var $5=$q;var $arrayidx4=(($5)&4294967295);HEAP32[(($arrayidx4)>>2)]=9;var $6=$q;var $arrayidx5=(($6+4)&4294967295);HEAP32[(($arrayidx5)>>2)]=0;var $7=$env_addr;var $8=($7);var $9=$q;var $arrayidx6=(($9+8)&4294967295);HEAP32[(($arrayidx6)>>2)]=$8;var $10=$pitch1_addr;var $shl=((($10)*65536)&4294967295);var $11=$pitch2_addr;var $add=((($shl)+($11))&4294967295);var $12=$q;var $arrayidx7=(($12+12)&4294967295);HEAP32[(($arrayidx7)>>2)]=$add;__Z8WcmdqIncv();;return;return;}
67633 function __ZL13StartSyllablev(){;var __label__;var $0=HEAP32[((__ZL12syllable_end)>>2)];var $1=HEAP32[((__ZL14syllable_start)>>2)];var $cmp=((($0))|0)==((($1))|0);if($cmp){__label__=1;;}else{__label__=2;;}
67634 if(__label__==1){var $2=HEAP32[((_wcmdq_tail)>>2)];HEAP32[((__ZL12syllable_end)>>2)]=$2;;};return;return;}
67635 function __Z12SynthOnTimerv(){;var __label__;var $retval;var $_b=HEAPU8[(__ZL8timer_on_b)];var $0=((($_b))&1);var $tobool=((($0))|0)!=0;if($tobool){__label__=2;;}else{__label__=1;;}
67636 if(__label__==2){while(1){var $call1=__Z9WcmdqUsedv();var $call5=__Z8GenerateP12PHONEME_LISTPii(((_phoneme_list)&4294967295),_n_phoneme_list,1);var $cmp6=((($call5))|0)==0;if($cmp6){__label__=3;;}else{__label__=4;;}
67637 if(__label__==3){var $call8=__Z15SpeakNextClauseP7__sFILEPKvi(0,0,1);;}
67638 var $1=HEAP32[((_skipping_text)>>2)];var $tobool10=((($1))|0)!=0;if($tobool10){__label__=2;continue;}else{__label__=5;break;}}
67639 $retval=0;;}
67640 else if(__label__==1){$retval=0;;}
67641 var $2=$retval;;return $2;return null;}
67642 function __Z15SpeakNextClauseP7__sFILEPKvi($f_in,$text_in,$control){var __stackBase__=STACKTOP;STACKTOP+=8;_memset(__stackBase__,0,8);var __label__;var __lastLabel__=null;var $retval;var $f_in_addr;var $text_in_addr;var $control_addr;var $clause_tone=__stackBase__;var $voice_change=__stackBase__+4;$f_in_addr=$f_in;$text_in_addr=$text_in;$control_addr=$control;var $0=$control_addr;var $cmp=((($0))|0)==4;if($cmp){__label__=1;;}else{__label__=4;;}
67643 $if_then$$if_end$2:do{if(__label__==1){var $1=HEAP32[((__ZZ15SpeakNextClauseP7__sFILEPKviE6f_text)>>2)];var $cmp1=((($1))|0)==0;var $2=HEAP32[((__ZZ15SpeakNextClauseP7__sFILEPKviE6p_text)>>2)];var $cmp2=((($2))|0)==0;var $or_cond=($cmp1)&($cmp2);if($or_cond){__label__=2;;}else{__label__=3;;}
67644 if(__label__==2){$retval=0;;}
67645 else if(__label__==3){$retval=1;;}}
67646 else if(__label__==4){var $3=$control_addr;var $cmp4=((($3))|0)==2;if($cmp4){__label__=5;;}else{__label__=8;;}
67647 if(__label__==5){HEAP8[(__ZL8timer_on_b)]=0;HEAP32[((__ZZ15SpeakNextClauseP7__sFILEPKviE6p_text)>>2)]=0;var $4=HEAP32[((__ZZ15SpeakNextClauseP7__sFILEPKviE6f_text)>>2)];var $cmp6=((($4))|0)!=0;if($cmp6){__label__=6;;}else{__label__=7;;}
67648 if(__label__==6){var $5=HEAP32[((__ZZ15SpeakNextClauseP7__sFILEPKviE6f_text)>>2)];var $call=_fclose($5);HEAP32[((__ZZ15SpeakNextClauseP7__sFILEPKviE6f_text)>>2)]=0;;}
67649 HEAP32[((_n_phoneme_list)>>2)]=0;__Z9WcmdqStopv();HEAP32[((((_embedded_value+24)&4294967295))>>2)]=0;$retval=0;;}
67650 else if(__label__==8){var $6=$control_addr;var $cmp10=((($6))|0)==3;if($cmp10){__label__=9;;}else{__label__=13;;}
67651 if(__label__==9){var $_b=HEAPU8[(__ZL6paused_b)];var $7=($_b)?2:0;var $cmp12=((($7))|0)==0;if($cmp12){__label__=10;;}else{__label__=11;;}
67652 if(__label__==10){HEAP8[(__ZL8timer_on_b)]=0;HEAP8[(__ZL6paused_b)]=1;;}
67653 else if(__label__==11){HEAP8[(__ZL8timer_on_b)]=1;HEAP8[(__ZL6paused_b)]=0;var $call16=__Z8GenerateP12PHONEME_LISTPii(((_phoneme_list)&4294967295),_n_phoneme_list,0);;}
67654 $retval=0;;}
67655 else if(__label__==13){var $8=$control_addr;var $cmp19=((($8))|0)==5;if($cmp19){__label__=14;;}else{__label__=15;;}
67656 if(__label__==14){HEAP32[((_n_phoneme_list)>>2)]=0;__Z9WcmdqStopv();$retval=0;;}
67657 else if(__label__==15){var $9=$f_in_addr;var $cmp22=((($9))|0)!=0;if($cmp22){__label__=17;;}else{__label__=16;;}
67658 $if_then24$$lor_lhs_false$24:do{if(__label__==16){var $10=$text_in_addr;var $cmp23=((($10))|0)!=0;if($cmp23){__label__=17;break $if_then24$$lor_lhs_false$24;}else{__label__=18;break $if_then24$$lor_lhs_false$24;}}}while(0);if(__label__==17){var $11=$f_in_addr;HEAP32[((__ZZ15SpeakNextClauseP7__sFILEPKviE6f_text)>>2)]=$11;var $12=$text_in_addr;HEAP32[((__ZZ15SpeakNextClauseP7__sFILEPKviE6p_text)>>2)]=$12;HEAP8[(__ZL8timer_on_b)]=1;HEAP8[(__ZL6paused_b)]=0;;}
67659 var $13=HEAP32[((__ZZ15SpeakNextClauseP7__sFILEPKviE6f_text)>>2)];var $cmp26=((($13))|0)==0;var $14=HEAP32[((__ZZ15SpeakNextClauseP7__sFILEPKviE6p_text)>>2)];var $cmp28=((($14))|0)==0;var $or_cond1=($cmp26)&($cmp28);if($or_cond1){__label__=19;;}else{__label__=20;;}
67660 if(__label__==19){HEAP32[((_skipping_text)>>2)]=0;HEAP8[(__ZL8timer_on_b)]=0;$retval=0;;}
67661 else if(__label__==20){var $15=HEAP32[((__ZZ15SpeakNextClauseP7__sFILEPKviE6f_text)>>2)];var $cmp31=((($15))|0)!=0;if($cmp31){__label__=21;;}else{__label__=23;;}
67662 $land_lhs_true32$$if_end36$32:do{if(__label__==21){var $16=HEAP32[((__ZZ15SpeakNextClauseP7__sFILEPKviE6f_text)>>2)];var $_flags=(($16+12)&4294967295);var $17=HEAP16[(($_flags)>>1)];var $conv=(tempInt=(($17)),(tempInt>=32768?tempInt-65536:tempInt));var $and=($conv)&32;var $cmp33=((($and))|0)!=0;if(!($cmp33)){__label__=23;break $land_lhs_true32$$if_end36$32;}
67663 HEAP8[(__ZL8timer_on_b)]=0;var $18=HEAP32[((__ZZ15SpeakNextClauseP7__sFILEPKviE6f_text)>>2)];var $call35=_fclose($18);HEAP32[((__ZZ15SpeakNextClauseP7__sFILEPKviE6f_text)>>2)]=0;$retval=0;__label__=39;break $if_then$$if_end$2;}}while(0);var $19=HEAP32[((_current_phoneme_table)>>2)];var $20=HEAP32[((_voice)>>2)];var $phoneme_tab_ix=(($20+40)&4294967295);var $21=HEAP32[(($phoneme_tab_ix)>>2)];var $cmp37=((($19))|0)!=((($21))|0);if($cmp37){__label__=24;;}else{__label__=25;;}
67664 if(__label__==24){var $22=HEAP32[((_voice)>>2)];var $phoneme_tab_ix39=(($22+40)&4294967295);var $23=HEAP32[(($phoneme_tab_ix39)>>2)];__Z18SelectPhonemeTablei($23);;}
67665 var $24=HEAP32[((_translator)>>2)];var $25=HEAP32[((__ZZ15SpeakNextClauseP7__sFILEPKviE6f_text)>>2)];var $26=HEAP32[((__ZZ15SpeakNextClauseP7__sFILEPKviE6p_text)>>2)];var $call41=__Z15TranslateClauseP10TranslatorP7__sFILEPKvPiPPc($24,$25,$26,$clause_tone,$voice_change);HEAP32[((__ZZ15SpeakNextClauseP7__sFILEPKviE6p_text)>>2)]=$call41;var $27=HEAP32[((_translator)>>2)];var $28=HEAP32[(($clause_tone)>>2)];__Z11CalcPitchesP10Translatori($27,$28);var $29=HEAP32[((_translator)>>2)];__Z11CalcLengthsP10Translator($29);var $30=HEAP32[((_option_phonemes)>>2)];var $cmp42=((($30))|0)>0;var $31=HEAP32[((_phoneme_callback)>>2)];var $cmp44=((($31))|0)!=0;var $or_cond2=($cmp42)|($cmp44);if($or_cond2){__label__=26;;}else{__label__=31;;}
67666 $if_then45$$if_end62$39:do{if(__label__==26){var $32=HEAP32[((_translator)>>2)];var $phon_out=(($32+332)&4294967295);var $arraydecay=(($phon_out)&4294967295);__Z26GetTranslatedPhonemeStringPci($arraydecay,300);var $33=HEAP32[((_option_phonemes)>>2)];var $cmp46=((($33))|0)>0;if($cmp46){__label__=27;;}else{__label__=29;;}
67667 $if_then47$$if_end55$41:do{if(__label__==27){var $34=HEAP32[((_f_trans)>>2)];var $35=HEAP32[((_translator)>>2)];var $phon_out48=(($35+332)&4294967295);var $arraydecay49=(($phon_out48)&4294967295);var $call50=_fprintf($34,((__str459)&4294967295),allocate([$arraydecay49,0,0,0],["i8*",0,0,0],ALLOC_STACK));var $call51=_iswalpha(269);var $tobool=((($call51))|0)!=0;if($tobool){__label__=29;break $if_then47$$if_end55$41;}
67668 var $36=HEAP32[((__impure_ptr)>>2)];var $_stderr=(($36+12)&4294967295);var $37=HEAP32[(($_stderr)>>2)];var $38=_fwrite(((__str1460)&4294967295),88,1,$37);;}}while(0);var $39=HEAP32[((_phoneme_callback)>>2)];var $cmp56=((($39))|0)!=0;if(!($cmp56)){__label__=31;break $if_then45$$if_end62$39;}
67669 var $40=HEAP32[((_phoneme_callback)>>2)];var $41=HEAP32[((_translator)>>2)];var $phon_out58=(($41+332)&4294967295);var $arraydecay59=(($phon_out58)&4294967295);var $call60=FUNCTION_TABLE[$40]($arraydecay59);;}}while(0);var $42=HEAP32[((_skipping_text)>>2)];var $tobool63=((($42))|0)!=0;if($tobool63){__label__=32;;}else{__label__=33;;}
67670 if(__label__==32){HEAP32[((_n_phoneme_list)>>2)]=0;$retval=1;;}
67671 else if(__label__==33){var $call66=__Z8GenerateP12PHONEME_LISTPii(((_phoneme_list)&4294967295),_n_phoneme_list,0);var $43=HEAP32[(($voice_change)>>2)];var $cmp68=((($43))|0)!=0;if($cmp68){__label__=34;;}else{__label__=35;;}
67672 if(__label__==34){var $44=HEAP32[(($voice_change)>>2)];var $call70=__Z16LoadVoiceVariantPKci($44,0);HEAP32[((__ZL9new_voice)>>2)]=$call70;__lastLabel__=34;;}
67673 else if(__label__==35){var $_pr=HEAP32[((__ZL9new_voice)>>2)];__lastLabel__=35;;}
67674 var $45=__lastLabel__==35?$_pr:($call70);var $tobool72=((($45))|0)!=0;if($tobool72){__label__=37;;}else{__label__=38;;}
67675 if(__label__==37){var $46=HEAP32[((_voice)>>2)];__Z13DoVoiceChangeP7voice_t($46);HEAP32[((__ZL9new_voice)>>2)]=0;;}
67676 $retval=1;;}}}}}}}while(0);var $47=$retval;STACKTOP=__stackBase__;return $47;return null;}
67677 function __Z11SynthStatusv(){;var __label__;var $_b=HEAPU8[(__ZL8timer_on_b)];var $0=((($_b))&1);var $_b1=HEAPU8[(__ZL6paused_b)];var $1=($_b1)?2:0;var $or=($1)|($0);;return $or;return null;}
67678 function __ZL18formants_reduce_hfP7frame_ti($fr,$level){;var __label__;var $fr_addr;var $level_addr;var $ix;var $x;$fr_addr=$fr;$level_addr=$level;var $0=HEAP32[((_voice)>>2)];var $klattv=(($0+112)&4294967295);var $arrayidx=(($klattv)&4294967295);var $1=HEAP32[(($arrayidx)>>2)];var $tobool=((($1))|0)!=0;if($tobool){__label__=3;;}else{__label__=1;;}
67679 $for_end$$if_end$2:do{if(__label__==1){$ix=2;;while(1){var $2=$ix;var $3=$fr_addr;var $fheight=(($3+18)&4294967295);var $arrayidx1=(($fheight+$2)&4294967295);var $4=HEAPU8[($arrayidx1)];var $conv=((($4))&255);var $5=$level_addr;var $mul=((($conv)*($5))&4294967295);$x=$mul;var $6=$x;var $div=((((($6))|0)/100)|0);var $conv2=((($div))&255);var $7=$ix;var $8=$fr_addr;var $fheight3=(($8+18)&4294967295);var $arrayidx4=(($fheight3+$7)&4294967295);HEAP8[($arrayidx4)]=$conv2;var $9=$ix;var $inc=((($9)+1)&4294967295);$ix=$inc;var $cmp=((($inc))|0)<8;if($cmp){__label__=2;continue;}else{__label__=3;break $for_end$$if_end$2;}}}}while(0);;return;return;}
67680 function __ZL10AllocFramev(){;var __label__;var $0=HEAP32[((__ZZL10AllocFramevE2ix)>>2)];var $inc=((($0)+1)&4294967295);HEAP32[((__ZZL10AllocFramevE2ix)>>2)]=$inc;var $cmp=((($inc))|0)>=160;if($cmp){__label__=1;;}else{__label__=2;;}
67681 if(__label__==1){HEAP32[((__ZZL10AllocFramevE2ix)>>2)]=0;;}
67682 var $1=HEAP32[((__ZZL10AllocFramevE2ix)>>2)];var $arrayidx=((__ZZL10AllocFramevE10frame_pool+$1*64)&4294967295);;return $arrayidx;return null;}
67683 function __Z13SetLengthModsP10Translatori($tr,$value){;var __label__;var $tr_addr;var $value_addr;var $value2;$tr_addr=$tr;$value_addr=$value;var $0=$value_addr;var $rem=((($0))|0)%100;var $arrayidx=((__ZL15length_mod_tabs+$rem*4)&4294967295);var $1=HEAP32[(($arrayidx)>>2)];var $2=$tr_addr;var $langopts=(($2)&4294967295);var $length_mods=(($langopts+176)&4294967295);HEAP32[(($length_mods)>>2)]=$1;var $3=$tr_addr;var $langopts1=(($3)&4294967295);var $length_mods0=(($langopts1+180)&4294967295);HEAP32[(($length_mods0)>>2)]=$1;var $4=$value_addr;var $div=((((($4))|0)/100)|0);$value2=$div;var $cmp=((($div))|0)!=0;if($cmp){__label__=1;;}else{__label__=2;;}
67684 if(__label__==1){var $5=$value2;var $arrayidx2=((__ZL15length_mod_tabs+$5*4)&4294967295);var $6=HEAP32[(($arrayidx2)>>2)];var $7=$tr_addr;var $langopts3=(($7)&4294967295);var $length_mods04=(($langopts3+180)&4294967295);HEAP32[(($length_mods04)>>2)]=$6;;};return;return;}
67685 function __Z7IsAlphaj($c){;var __label__;var $retval;var $c_addr;$c_addr=$c;var $0=$c_addr;var $call=_iswalpha($0);var $tobool=((($call))|0)!=0;if($tobool){__label__=1;;}else{__label__=2;;}
67686 if(__label__==1){$retval=1;;}
67687 else if(__label__==2){var $1=$c_addr;var $cmp=((($1))>>>0)>=2305;var $2=$c_addr;var $cmp1=((($2))>>>0)<=3575;var $or_cond=($cmp)&($cmp1);var $3=$c_addr;if($or_cond){__label__=3;;}else{__label__=10;;}
67688 if(__label__==3){var $and=($3)&127;var $cmp3=((($and))>>>0)<100;if($cmp3){__label__=4;;}else{__label__=5;;}
67689 if(__label__==4){$retval=1;;}
67690 else if(__label__==5){var $4=$c_addr;var $call6=__Z11lookupwcharPKti(((__ZZ7IsAlphajE18extra_indic_alphas)&4294967295),$4);var $cmp7=((($call6))|0)!=0;if($cmp7){__label__=6;;}else{__label__=7;;}
67691 if(__label__==6){$retval=1;;}
67692 else if(__label__==7){var $5=$c_addr;var $cmp10=((($5))>>>0)>=3450;var $6=$c_addr;var $cmp12=((($6))>>>0)<=3455;var $or_cond1=($cmp10)&($cmp12);if($or_cond1){__label__=8;;}else{__label__=9;;}
67693 if(__label__==8){$retval=1;;}
67694 else if(__label__==9){$retval=0;;}}}}
67695 else if(__label__==10){var $cmp16=((($3))>>>0)>=1611;var $7=$c_addr;var $cmp18=((($7))>>>0)<=1630;var $or_cond2=($cmp16)&($cmp18);if($or_cond2){__label__=11;;}else{__label__=12;;}
67696 if(__label__==11){$retval=1;;}
67697 else if(__label__==12){var $8=$c_addr;var $cmp21=((($8))>>>0)>=768;var $9=$c_addr;var $cmp23=((($9))>>>0)<=879;var $or_cond3=($cmp21)&($cmp23);if($or_cond3){__label__=13;;}else{__label__=14;;}
67698 if(__label__==13){$retval=1;;}
67699 else if(__label__==14){var $10=$c_addr;var $cmp26=((($10))>>>0)>=1920;var $11=$c_addr;var $cmp28=((($11))>>>0)<=1969;var $or_cond4=($cmp26)&($cmp28);if($or_cond4){__label__=15;;}else{__label__=16;;}
67700 if(__label__==15){$retval=1;;}
67701 else if(__label__==16){var $12=$c_addr;var $cmp31=((($12))>>>0)>=4352;var $13=$c_addr;var $cmp33=((($13))>>>0)<=4607;var $or_cond5=($cmp31)&($cmp33);if($or_cond5){__label__=17;;}else{__label__=18;;}
67702 if(__label__==17){$retval=1;;}
67703 else if(__label__==18){var $14=$c_addr;var $cmp36=((($14))>>>0)>12352;var $15=$c_addr;var $cmp38=((($15))>>>0)<=42752;var $or_cond6=($cmp36)&($cmp38);if($or_cond6){__label__=19;;}else{__label__=20;;}
67704 if(__label__==19){$retval=1;;}
67705 else if(__label__==20){$retval=0;;}}}}}}}
67706 var $16=$retval;;return $16;return null;}
67707 function __Z11lookupwcharPKti($list,$c){;var __label__;var $retval;var $list_addr;var $c_addr;var $ix;$list_addr=$list;$c_addr=$c;$ix=0;;while(1){var $0=$ix;var $1=$list_addr;var $arrayidx=(($1+2*$0)&4294967295);var $2=HEAPU16[(($arrayidx)>>1)];var $conv=((($2))&65535);var $cmp=((($conv))|0)!=0;if(!($cmp)){__label__=5;break;}
67708 var $3=$ix;var $4=$list_addr;var $arrayidx1=(($4+2*$3)&4294967295);var $5=HEAPU16[(($arrayidx1)>>1)];var $conv2=((($5))&65535);var $6=$c_addr;var $cmp3=((($conv2))|0)==((($6))|0);var $7=$ix;var $add=((($7)+1)&4294967295);if($cmp3){__label__=3;break;}
67709 $ix=$add;__label__=1;continue;}
67710 if(__label__==5){$retval=0;;}
67711 else if(__label__==3){$retval=$add;;}
67712 var $8=$retval;;return $8;return null;}
67713 function __Z7IsDigitj($c){;var __label__;var $retval;var $c_addr;$c_addr=$c;var $0=$c_addr;var $call=_iswdigit($0);var $tobool=((($call))|0)!=0;if($tobool){__label__=1;;}else{__label__=2;;}
67714 if(__label__==1){$retval=1;;}
67715 else if(__label__==2){var $1=$c_addr;var $cmp=((($1))>>>0)>=2406;var $2=$c_addr;var $cmp1=((($2))>>>0)<=2415;var $or_cond=($cmp)&($cmp1);if($or_cond){__label__=3;;}else{__label__=4;;}
67716 if(__label__==3){$retval=1;;}
67717 else if(__label__==4){$retval=0;;}}
67718 var $3=$retval;;return $3;return null;}
67719 function __Z7IsSpacej($c){;var __label__;var $retval;var $c_addr;$c_addr=$c;var $0=$c_addr;var $cmp=((($0))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
67720 if(__label__==1){$retval=0;;}
67721 else if(__label__==2){var $1=$c_addr;var $cmp1=((($1))>>>0)>=9472;var $2=$c_addr;var $cmp2=((($2))>>>0)<9632;var $or_cond=($cmp1)&($cmp2);if($or_cond){__label__=3;;}else{__label__=4;;}
67722 if(__label__==3){$retval=1;;}
67723 else if(__label__==4){var $3=$c_addr;var $call=_iswspace($3);$retval=$call;;}}
67724 var $4=$retval;;return $4;return null;}
67725 function __Z16DeleteTranslatorP10Translator($tr){;var __label__;var $tr_addr;$tr_addr=$tr;var $0=$tr_addr;var $data_dictlist=(($0+1052)&4294967295);var $1=HEAP32[(($data_dictlist)>>2)];var $cmp=((($1))|0)!=0;if($cmp){__label__=1;;}else{__label__=2;;}
67726 if(__label__==1){var $2=$tr_addr;var $data_dictlist1=(($2+1052)&4294967295);var $3=HEAP32[(($data_dictlist1)>>2)];__Z4FreePv($3);;}
67727 var $4=$tr_addr;var $5=$4;__Z4FreePv($5);;return;return;}
67728 function __Z9IsBracketi($c){;var __label__;var $retval;var $c_addr;$c_addr=$c;var $0=$c_addr;var $cmp=((($0))|0)>=8212;var $1=$c_addr;var $cmp1=((($1))|0)<=8223;var $or_cond=($cmp)&($cmp1);if($or_cond){__label__=1;;}else{__label__=2;;}
67729 if(__label__==1){$retval=1;;}
67730 else if(__label__==2){var $2=$c_addr;var $call=__Z11lookupwcharPKti(((__ZL8brackets)&4294967295),$2);$retval=$call;;}
67731 var $3=$retval;;return $3;return null;}
67732 function __Z8utf8_outjPc($c,$buf){;var __label__;var $retval;var $c_addr;var $buf_addr;var $n_bytes;var $j;var $shift;$c_addr=$c;$buf_addr=$buf;var $0=$c_addr;var $cmp=((($0))>>>0)<128;var $1=$c_addr;if($cmp){__label__=1;;}else{__label__=2;;}
67733 if(__label__==1){var $conv=((($1))&255);var $2=$buf_addr;var $arrayidx=(($2)&4294967295);HEAP8[($arrayidx)]=$conv;$retval=1;;}
67734 else if(__label__==2){var $cmp1=((($1))>>>0)>=1114112;if($cmp1){__label__=3;;}else{__label__=4;;}
67735 if(__label__==3){var $3=$buf_addr;var $arrayidx3=(($3)&4294967295);HEAP8[($arrayidx3)]=32;$retval=1;;}
67736 else if(__label__==4){var $4=$c_addr;var $cmp5=((($4))>>>0)<2048;if($cmp5){__label__=5;;}else{__label__=6;;}
67737 if(__label__==5){$n_bytes=1;;}
67738 else if(__label__==6){var $5=$c_addr;var $cmp7=((($5))>>>0)<65536;if($cmp7){__label__=7;;}else{__label__=8;;}
67739 if(__label__==7){$n_bytes=2;;}
67740 else if(__label__==8){$n_bytes=3;;}}
67741 var $6=$n_bytes;var $mul=((($6)*6)&4294967295);$shift=$mul;var $7=$n_bytes;var $arrayidx12=((__ZZ8utf8_outjPcE4code+$7)&4294967295);var $8=HEAPU8[($arrayidx12)];var $conv13=((($8))&255);var $9=$c_addr;var $10=$shift;var $shr=($9)>>>((($10))>>>0);var $or=($shr)|($conv13);var $conv14=((($or))&255);var $11=$buf_addr;var $arrayidx15=(($11)&4294967295);HEAP8[($arrayidx15)]=$conv14;$j=0;var $12=$j;var $13=$n_bytes;var $cmp161=((($12))|0)<((($13))|0);if($cmp161){__label__=10;;}else{__label__=11;;}
67742 $for_body$$for_end$15:do{if(__label__==10){while(1){var $14=$shift;var $sub=((($14)-6)&4294967295);$shift=$sub;var $15=$c_addr;var $16=$shift;var $shr17=($15)>>>((($16))>>>0);var $and=($shr17)&63;var $add=((($and)+128)&4294967295);var $conv18=((($add))&255);var $17=$j;var $add19=((($17)+1)&4294967295);var $18=$buf_addr;var $arrayidx20=(($18+$add19)&4294967295);HEAP8[($arrayidx20)]=$conv18;var $19=$j;var $inc=((($19)+1)&4294967295);$j=$inc;var $20=$j;var $21=$n_bytes;var $cmp16=((($20))|0)<((($21))|0);if($cmp16){__label__=10;continue;}else{__label__=11;break $for_body$$for_end$15;}}}}while(0);var $22=$n_bytes;var $add21=((($22)+1)&4294967295);$retval=$add21;;}}
67743 var $23=$retval;;return $23;return null;}
67744 function __Z11utf8_nbytesPKc($buf){;var __label__;var $retval;var $buf_addr;var $c;$buf_addr=$buf;var $0=$buf_addr;var $arrayidx=(($0)&4294967295);var $1=HEAP8[($arrayidx)];$c=$1;var $2=$c;var $conv=((($2))&255);var $cmp=((($conv))|0)<128;if($cmp){__label__=1;;}else{__label__=2;;}
67745 if(__label__==1){$retval=1;;}
67746 else if(__label__==2){var $3=$c;var $conv1=((($3))&255);var $cmp2=((($conv1))|0)<224;if($cmp2){__label__=3;;}else{__label__=4;;}
67747 if(__label__==3){$retval=2;;}
67748 else if(__label__==4){var $4=$c;var $conv5=((($4))&255);var $cmp6=((($conv5))|0)<240;if($cmp6){__label__=5;;}else{__label__=6;;}
67749 if(__label__==5){$retval=3;;}
67750 else if(__label__==6){$retval=4;;}}}
67751 var $5=$retval;;return $5;return null;}
67752 function __Z8utf8_in2PiPKci($c,$buf,$backwards){;var __label__;var $c_addr;var $buf_addr;var $backwards_addr;var $c1;var $n_bytes;var $ix;$c_addr=$c;$buf_addr=$buf;$backwards_addr=$backwards;var $0=$buf_addr;var $1=HEAP8[($0)];var $conv2=(tempInt=(($1)),(tempInt>=128?tempInt-256:tempInt));var $and3=($conv2)&192;var $cmp4=((($and3))|0)==128;if($cmp4){__label__=1;;}else{__label__=5;;}
67753 $while_body$$while_end$2:do{if(__label__==1){while(1){var $2=$backwards_addr;var $tobool=((($2))|0)!=0;var $3=$buf_addr;if($tobool){__label__=2;;}else{__label__=3;;}
67754 if(__label__==2){var $incdec_ptr=(($3+-1)&4294967295);$buf_addr=$incdec_ptr;;}
67755 else if(__label__==3){var $incdec_ptr1=(($3+1)&4294967295);$buf_addr=$incdec_ptr1;;}
67756 var $4=$buf_addr;var $5=HEAP8[($4)];var $conv=(tempInt=(($5)),(tempInt>=128?tempInt-256:tempInt));var $and=($conv)&192;var $cmp=((($and))|0)==128;if($cmp){__label__=1;continue;}else{__label__=5;break $while_body$$while_end$2;}}}}while(0);$n_bytes=0;var $6=$buf_addr;var $incdec_ptr2=(($6+1)&4294967295);$buf_addr=$incdec_ptr2;var $7=HEAP8[($6)];var $conv3=(tempInt=(($7)),(tempInt>=128?tempInt-256:tempInt));$c1=$conv3;var $and4=($conv3)&128;var $tobool5=((($and4))|0)!=0;if($tobool5){__label__=6;;}else{__label__=14;;}
67757 $if_then6$$if_end27$10:do{if(__label__==6){var $8=$c1;var $and7=($8)&224;var $cmp8=((($and7))|0)==192;if($cmp8){__label__=7;;}else{__label__=8;;}
67758 $if_then9$$if_else10$12:do{if(__label__==7){$n_bytes=1;;}
67759 else if(__label__==8){var $9=$c1;var $and11=($9)&240;var $cmp12=((($and11))|0)==224;if($cmp12){__label__=9;;}else{__label__=10;;}
67760 if(__label__==9){$n_bytes=2;;}
67761 else if(__label__==10){var $10=$c1;var $and15=($10)&248;var $cmp16=((($and15))|0)==240;if(!($cmp16)){__label__=12;break $if_then9$$if_else10$12;}
67762 $n_bytes=3;;}}}while(0);var $11=$n_bytes;var $arrayidx=((__ZZ8utf8_in2PiPKciE4mask+$11)&4294967295);var $12=HEAPU8[($arrayidx)];var $conv21=((($12))&255);var $13=$c1;var $and22=($13)&($conv21);$c1=$and22;$ix=0;var $14=$ix;var $15=$n_bytes;var $cmp231=((($14))|0)<((($15))|0);if(!($cmp231)){__label__=14;break $if_then6$$if_end27$10;}
67763 while(1){var $16=$c1;var $shl=((($16)*64)&4294967295);var $17=$buf_addr;var $incdec_ptr24=(($17+1)&4294967295);$buf_addr=$incdec_ptr24;var $18=HEAP8[($17)];var $conv25=(tempInt=(($18)),(tempInt>=128?tempInt-256:tempInt));var $and26=($conv25)&63;var $add=((($and26)+($shl))&4294967295);$c1=$add;var $19=$ix;var $inc=((($19)+1)&4294967295);$ix=$inc;var $20=$ix;var $21=$n_bytes;var $cmp23=((($20))|0)<((($21))|0);if($cmp23){__label__=13;continue;}else{__label__=14;break $if_then6$$if_end27$10;}}}}while(0);var $22=$c1;var $23=$c_addr;HEAP32[(($23)>>2)]=$22;var $24=$n_bytes;var $add28=((($24)+1)&4294967295);;return $add28;return null;}
67764 function __Z7utf8_inPiPKc($c,$buf){;var __label__;var $c_addr;var $buf_addr;$c_addr=$c;$buf_addr=$buf;var $0=$c_addr;var $1=$buf_addr;var $call=__Z8utf8_in2PiPKci($0,$1,0);;return $call;return null;}
67765 function __Z8strchr_wPKci($s,$c){;var __label__;var $retval;var $s_addr;var $c_addr;$s_addr=$s;$c_addr=$c;var $0=$c_addr;var $cmp=((($0))|0)>=128;if($cmp){__label__=1;;}else{__label__=2;;}
67766 if(__label__==1){$retval=0;;}
67767 else if(__label__==2){var $1=$s_addr;var $2=$c_addr;var $call=_strchr($1,$2);$retval=$call;;}
67768 var $3=$retval;;return $3;return null;}
67769 function __Z10IsAllUpperPKc($word){var __stackBase__=STACKTOP;STACKTOP+=4;_memset(__stackBase__,0,4);var __label__;var $retval;var $word_addr;var $c=__stackBase__;$word_addr=$word;;while(1){var $0=$word_addr;var $1=HEAP8[($0)];var $conv=(tempInt=(($1)),(tempInt>=128?tempInt-256:tempInt));var $cmp=((($conv))|0)!=0;if(!($cmp)){__label__=5;break;}
67770 var $2=$word_addr;var $3=HEAP8[($2)];var $conv1=(tempInt=(($3)),(tempInt>=128?tempInt-256:tempInt));var $call=__Z8isspace2j($conv1);var $tobool=((($call))|0)!=0;var $lnot=($tobool)^1;if(!($lnot)){__label__=5;break;}
67771 var $4=$word_addr;var $call2=__Z7utf8_inPiPKc($c,$4);var $5=$word_addr;var $add_ptr=(($5+$call2)&4294967295);$word_addr=$add_ptr;var $6=HEAP32[(($c)>>2)];var $call3=_iswupper($6);var $tobool4=((($call3))|0)!=0;if($tobool4){__label__=1;continue;}else{__label__=4;break;}}
67772 if(__label__==5){$retval=1;;}
67773 else if(__label__==4){$retval=0;;}
67774 var $7=$retval;STACKTOP=__stackBase__;return $7;return null;}
67775 function __Z24ChangeEquivalentPhonemesP10TranslatoriPc($tr,$lang2,$phonemes){var __stackBase__=STACKTOP;STACKTOP+=160;_memset(__stackBase__,0,160);var __label__;var $retval;var $tr_addr;var $lang2_addr;var $phonemes_addr;var $ix;var $len;var $phon;var $p;var $pb;var $eqlist;var $p_out;var $p_in;var $remove_stress;var $phonbuf=__stackBase__;$tr_addr=$tr;$lang2_addr=$lang2;$phonemes_addr=$phonemes;$remove_stress=0;var $0=$tr_addr;var $phoneme_tab_ix=(($0+656)&4294967295);var $1=HEAP32[(($phoneme_tab_ix)>>2)];var $arrayidx=((_phoneme_tab_list+$1*48)&4294967295);var $equivalence_tables=(($arrayidx+44)&4294967295);var $2=HEAP32[(($equivalence_tables)>>2)];$ix=$2;var $cmp=((($2))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
67776 if(__label__==1){$retval=0;;}
67777 else if(__label__==2){var $3=$ix;var $4=HEAP32[((_phondata_ptr)>>2)];var $arrayidx1=(($4+$3)&4294967295);$pb=$arrayidx1;;$for_cond$5:while(1){var $5=$pb;var $arrayidx2=(($5)&4294967295);var $6=HEAPU8[($arrayidx2)];var $conv=((($6))&255);var $cmp3=((($conv))|0)==0;if($cmp3){__label__=4;break $for_cond$5;}
67778 var $7=$pb;var $arrayidx6=(($7)&4294967295);var $8=HEAPU8[($arrayidx6)];var $conv7=((($8))&255);var $9=$lang2_addr;var $cmp8=((($conv7))|0)==((($9))|0);var $10=$pb;if($cmp8){__label__=7;break $for_cond$5;}
67779 var $arrayidx11=(($10+2)&4294967295);var $11=HEAPU8[($arrayidx11)];var $conv12=((($11))&255);var $shl=((($conv12)*256)&4294967295);var $12=$pb;var $arrayidx13=(($12+3)&4294967295);var $13=HEAPU8[($arrayidx13)];var $conv14=((($13))&255);var $add=((($conv14)+($shl))&4294967295);$len=$add;var $14=$len;var $mul=((($14)*4)&4294967295);var $15=$pb;var $add_ptr=(($15+$mul)&4294967295);$pb=$add_ptr;__label__=3;continue $for_cond$5;}
67780 if(__label__==4){$retval=0;;}
67781 else if(__label__==7){var $arrayidx15=(($10+1)&4294967295);var $16=HEAPU8[($arrayidx15)];var $conv16=((($16))&255);$remove_stress=$conv16;var $17=HEAP32[((_option_phonemes)>>2)];var $cmp17=((($17))|0)==2;if($cmp17){__label__=8;;}else{__label__=9;;}
67782 if(__label__==8){var $18=$phonemes_addr;var $arraydecay=(($phonbuf)&4294967295);__Z14DecodePhonemesPKcPc($18,$arraydecay);var $19=HEAP32[((_f_trans)>>2)];var $20=$lang2_addr;var $arrayidx19=((_phoneme_tab_list+$20*48)&4294967295);var $name=(($arrayidx19)&4294967295);var $arraydecay20=(($name)&4294967295);var $arraydecay21=(($phonbuf)&4294967295);var $21=$tr_addr;var $phoneme_tab_ix22=(($21+656)&4294967295);var $22=HEAP32[(($phoneme_tab_ix22)>>2)];var $arrayidx23=((_phoneme_tab_list+$22*48)&4294967295);var $name24=(($arrayidx23)&4294967295);var $arraydecay25=(($name24)&4294967295);var $call=_fprintf($19,((__str543)&4294967295),allocate([$arraydecay20,0,0,0,$arraydecay21,0,0,0,$arraydecay25,0,0,0],["i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));;}
67783 var $23=$phonemes_addr;$p_in=$23;var $24=$pb;var $arrayidx27=(($24+8)&4294967295);$eqlist=$arrayidx27;var $arraydecay28=(($phonbuf)&4294967295);$p_out=$arraydecay28;var $25=$p_in;var $incdec_ptr1=(($25+1)&4294967295);$p_in=$incdec_ptr1;var $26=HEAP8[($25)];$phon=$26;var $conv292=(tempInt=(($26)),(tempInt>=128?tempInt-256:tempInt));var $cmp303=((($conv292))|0)!=0;if($cmp303){__label__=10;;}else{__label__=20;;}
67784 $while_body$$while_end56$15:do{if(__label__==10){$while_body$16:while(1){var $27=$remove_stress;var $tobool=((($27))|0)!=0;if($tobool){__label__=11;;}else{__label__=13;;}
67785 $land_lhs_true$$if_end34$18:do{if(__label__==11){var $28=$phon;var $conv31=(tempInt=(($28)),(tempInt>=128?tempInt-256:tempInt));var $and=($conv31)&255;var $cmp32=((($and))|0)<8;if($cmp32){__label__=12;break $land_lhs_true$$if_end34$18;}else{__label__=13;break $land_lhs_true$$if_end34$18;}}}while(0);$while_cond_backedge$$if_end34$20:do{if(__label__==13){var $31=$eqlist;$p=$31;;while(1){var $32=$p;var $33=HEAP8[($32)];var $conv36=(tempInt=(($33)),(tempInt>=128?tempInt-256:tempInt));var $cmp37=((($conv36))|0)!=0;if(!($cmp37)){__label__=18;break;}
67786 var $34=$p;var $arrayidx39=(($34+1)&4294967295);var $call40=_strlen($arrayidx39);$len=$call40;var $35=$p;var $36=HEAP8[($35)];var $conv41=(tempInt=(($36)),(tempInt>=128?tempInt-256:tempInt));var $37=$phon;var $conv42=(tempInt=(($37)),(tempInt>=128?tempInt-256:tempInt));var $cmp43=((($conv41))|0)==((($conv42))|0);if($cmp43){__label__=16;break;}
67787 var $42=$len;var $add49=((($42)+2)&4294967295);var $43=$p;var $add_ptr50=(($43+$add49)&4294967295);$p=$add_ptr50;__label__=14;continue;}
67788 if(__label__==16){var $38=$p_out;var $39=$p;var $arrayidx45=(($39+1)&4294967295);var $call46=_strcpy($38,$arrayidx45);var $40=$len;var $41=$p_out;var $add_ptr47=(($41+$40)&4294967295);$p_out=$add_ptr47;;}
67789 var $44=$p;var $45=HEAP8[($44)];var $conv51=(tempInt=(($45)),(tempInt>=128?tempInt-256:tempInt));var $cmp52=((($conv51))|0)==0;if(!($cmp52)){__label__=12;break $while_cond_backedge$$if_end34$20;}
67790 var $46=$phon;var $47=$p_out;var $incdec_ptr54=(($47+1)&4294967295);$p_out=$incdec_ptr54;HEAP8[($47)]=$46;;}}while(0);var $29=$p_in;var $incdec_ptr=(($29+1)&4294967295);$p_in=$incdec_ptr;var $30=HEAP8[($29)];$phon=$30;var $conv29=(tempInt=(($30)),(tempInt>=128?tempInt-256:tempInt));var $cmp30=((($conv29))|0)!=0;if($cmp30){__label__=10;continue $while_body$16;}else{__label__=20;break $while_body$$while_end56$15;}}}}while(0);var $48=$p_out;HEAP8[($48)]=0;var $49=$remove_stress;var $tobool57=((($49))|0)!=0;if($tobool57){__label__=21;;}else{__label__=22;;}
67791 if(__label__==21){var $50=$tr_addr;var $arraydecay59=(($phonbuf)&4294967295);__Z13SetWordStressP10TranslatorPcPjii($50,$arraydecay59,0,-1,0);;}
67792 var $51=$phonemes_addr;var $arraydecay61=(($phonbuf)&4294967295);var $call62=_strcpy($51,$arraydecay61);var $52=HEAP32[((_option_phonemes)>>2)];var $cmp63=((($52))|0)==2;if($cmp63){__label__=23;;}else{__label__=24;;}
67793 if(__label__==23){var $53=$tr_addr;var $phoneme_tab_ix65=(($53+656)&4294967295);var $54=HEAP32[(($phoneme_tab_ix65)>>2)];__Z18SelectPhonemeTablei($54);var $55=$phonemes_addr;var $arraydecay66=(($phonbuf)&4294967295);__Z14DecodePhonemesPKcPc($55,$arraydecay66);var $56=HEAP32[((_f_trans)>>2)];var $arraydecay67=(($phonbuf)&4294967295);var $call68=_fprintf($56,((__str1544)&4294967295),allocate([$arraydecay67,0,0,0],["i8*",0,0,0],ALLOC_STACK));;}
67794 $retval=1;;}}
67795 var $57=$retval;STACKTOP=__stackBase__;return $57;return null;}
67796 function __Z13TranslateWordP10TranslatorPciP8WORD_TAB($tr,$word_start,$next_pause,$wtab){var __stackBase__=STACKTOP;STACKTOP+=1656;_memset(__stackBase__,0,1656);var __label__;var __lastLabel__=null;var $retval;var $tr_addr;var $word_start_addr;var $next_pause_addr;var $wtab_addr;var $word1=__stackBase__;var $word_length;var $ix;var $p;var $pfix;var $n_chars;var $dictionary_flags=__stackBase__+4;var $dictionary_flags2=__stackBase__+12;var $end_type;var $prefix_type;var $prefix_stress;var $wordx=__stackBase__+20;var $phonemes=__stackBase__+24;var $ph_limit;var $prefix_phonemes=__stackBase__+184;var $unpron_phonemes=__stackBase__+344;var $end_phonemes=__stackBase__+504;var $word_copy=__stackBase__+664;var $word_copy2=__stackBase__+824;var $word_copy_length;var $prefix_chars=__stackBase__+984;var $found;var $end_flags;var $c_temp;var $first_char=__stackBase__+1052;var $last_char=__stackBase__+1056;var $add_plural_suffix;var $prefix_flags;var $confirm_prefix;var $spell_word;var $stress_bits;var $emphasize_allcaps;var $wflags;var $wmark;var $was_unpronouncable;var $wtab_null=__stackBase__+1060;var $posn;var $non_initial;var $length;var $wc=__stackBase__+1156;var $loopcount;var $end2;var $phonemes2=__stackBase__+1160;var $end_phonemes2=__stackBase__+1320;var $wordpf=__stackBase__+1480;var $prefix_phonemes2=__stackBase__+1484;var $phonemes2482=__stackBase__+1496;var $p659;$tr_addr=$tr;$word_start_addr=$word_start;$next_pause_addr=$next_pause;$wtab_addr=$wtab;$end_type=0;$prefix_type=0;$found=0;HEAP32[(($last_char)>>2)]=0;$add_plural_suffix=0;$prefix_flags=0;$emphasize_allcaps=0;$was_unpronouncable=0;var $0=$wtab_addr;var $cmp=((($0))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
67797 if(__label__==1){var $arraydecay=(($wtab_null)&4294967295);var $1=$arraydecay;var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=$1;$stop$=$dest$+96;$value4$=0;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=0;}
67798 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
67799 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=0;};var $arraydecay1=(($wtab_null)&4294967295);$wtab_addr=$arraydecay1;;}
67800 var $2=$wtab_addr;var $flags=(($2)&4294967295);var $3=HEAP32[(($flags)>>2)];$wflags=$3;var $4=$wtab_addr;var $wmark2=(($4+9)&4294967295);var $5=HEAPU8[($wmark2)];var $conv=((($5))&255);$wmark=$conv;var $arrayidx=(($dictionary_flags)&4294967295);HEAP32[(($arrayidx)>>2)]=0;var $arrayidx3=(($dictionary_flags+4)&4294967295);HEAP32[(($arrayidx3)>>2)]=0;var $arrayidx4=(($dictionary_flags2)&4294967295);HEAP32[(($arrayidx4)>>2)]=0;var $arrayidx5=(($dictionary_flags2+4)&4294967295);HEAP32[(($arrayidx5)>>2)]=0;HEAP32[((_dictionary_skipwords)>>2)]=0;var $arrayidx6=(($phonemes)&4294967295);HEAP8[($arrayidx6)]=0;var $arrayidx7=(($unpron_phonemes)&4294967295);HEAP8[($arrayidx7)]=0;var $arrayidx8=(($prefix_phonemes)&4294967295);HEAP8[($arrayidx8)]=0;var $arrayidx9=(($end_phonemes)&4294967295);HEAP8[($arrayidx9)]=0;var $arrayidx10=(($phonemes+160)&4294967295);$ph_limit=$arrayidx10;var $6=$tr_addr;var $data_dictlist=(($6+1052)&4294967295);var $7=HEAP32[(($data_dictlist)>>2)];var $cmp11=((($7))|0)==0;if($cmp11){__label__=3;;}else{__label__=4;;}
67801 $if_then12$$if_end13$5:do{if(__label__==3){HEAP8[(((_word_phonemes)&4294967295))]=0;$retval=0;;}
67802 else if(__label__==4){var $8=$word_start_addr;HEAP32[(($word1)>>2)]=$8;var $9=HEAP32[(($word1)>>2)];var $10=HEAP8[($9)];var $conv14=(tempInt=(($10)),(tempInt>=128?tempInt-256:tempInt));var $cmp15=((($conv14))|0)==32;if($cmp15){__label__=5;;}else{__label__=6;;}
67803 if(__label__==5){var $11=HEAP32[(($word1)>>2)];var $incdec_ptr=(($11+1)&4294967295);HEAP32[(($word1)>>2)]=$incdec_ptr;;}
67804 var $12=HEAP32[(($word1)>>2)];HEAP32[(($wordx)>>2)]=$12;var $13=HEAP32[(($wordx)>>2)];var $call=__Z7utf8_inPiPKc($first_char,$13);$word_length=0;;$while_cond$11:while(1){var $14=HEAP32[(($wordx)>>2)];var $15=HEAP8[($14)];var $conv18=(tempInt=(($15)),(tempInt>=128?tempInt-256:tempInt));var $cmp19=((($conv18))|0)!=0;var $16=HEAP32[(($wordx)>>2)];if($cmp19){__lastLabel__=7;;}else{__lastLabel__=7;__label__=10;break $while_cond$11;}
67805 var $17=HEAP8[($16)];var $conv20=(tempInt=(($17)),(tempInt>=128?tempInt-256:tempInt));var $cmp21=((($conv20))|0)!=32;var $18=HEAP32[(($wordx)>>2)];if($cmp21){__lastLabel__=8;;}else{__lastLabel__=8;__label__=10;break $while_cond$11;}
67806 var $call22=__Z7utf8_inPiPKc($last_char,$18);var $19=HEAP32[(($wordx)>>2)];var $add_ptr=(($19+$call22)&4294967295);HEAP32[(($wordx)>>2)]=$add_ptr;var $20=$word_length;var $inc=((($20)+1)&4294967295);$word_length=$inc;__label__=7;continue $while_cond$11;}
67807 var $21=__lastLabel__==8?$18:($16);var $22=$word_start_addr;var $sub_ptr_lhs_cast=($21);var $sub_ptr_rhs_cast=($22);var $sub_ptr_sub=((($sub_ptr_lhs_cast)-($sub_ptr_rhs_cast))&4294967295);$word_copy_length=$sub_ptr_sub;var $cmp23=((($sub_ptr_sub))|0)>=160;if($cmp23){__label__=11;;}else{__label__=12;;}
67808 if(__label__==11){$word_copy_length=159;;}
67809 var $arraydecay26=(($word_copy2)&4294967295);var $23=$word_start_addr;var $24=$word_copy_length;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$23;$dest$=$arraydecay26;$stop$=$src$+$24;if(($dest$%4)==($src$%4)&&$24>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
67810 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
67811 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};$spell_word=0;var $25=HEAP32[((_option_sayas)>>2)];var $cmp27=((($25))|0)==36;if($cmp27){__label__=13;;}else{__label__=16;;}
67812 if(__label__==13){var $26=$word_length;var $cmp29=((($26))|0)==1;if($cmp29){__label__=14;;}else{__label__=15;;}
67813 if(__label__==14){$spell_word=4;;}
67814 else if(__label__==15){var $27=HEAP32[(($word1)>>2)];var $incdec_ptr31=(($27+-1)&4294967295);HEAP32[(($word1)>>2)]=$incdec_ptr31;var $28=HEAP32[(($word1)>>2)];HEAP8[($28)]=95;var $29=$tr_addr;var $arraydecay32=(($phonemes)&4294967295);var $arraydecay33=(($dictionary_flags)&4294967295);var $30=$wtab_addr;var $call34=__Z14LookupDictListP10TranslatorPPcS1_PjiP8WORD_TAB($29,$word1,$arraydecay32,$arraydecay33,0,$30);$found=$call34;;}}
67815 var $31=HEAP32[((_option_sayas)>>2)];var $and=($31)&16;var $tobool=((($and))|0)!=0;if($tobool){__label__=17;;}else{__label__=18;;}
67816 $if_then37$$if_else39$25:do{if(__label__==17){var $32=HEAP32[((_option_sayas)>>2)];var $and38=($32)&15;$spell_word=$and38;__lastLabel__=17;__label__=70;break $if_then37$$if_else39$25;}
67817 else if(__label__==18){var $33=$found;var $tobool40=((($33))|0)!=0;if($tobool40){__label__=20;;}else{__label__=19;;}
67818 if(__label__==19){var $34=$tr_addr;var $arraydecay42=(($phonemes)&4294967295);var $arraydecay43=(($dictionary_flags)&4294967295);var $35=$wtab_addr;var $call44=__Z14LookupDictListP10TranslatorPPcS1_PjiP8WORD_TAB($34,$word1,$arraydecay42,$arraydecay43,2,$35);$found=$call44;;}
67819 var $arrayidx46=(($dictionary_flags)&4294967295);var $36=HEAP32[(($arrayidx46)>>2)];var $and47=($36)&1;var $tobool48=((($and47))|0)!=0;if($tobool48){__label__=21;;}else{__label__=23;;}
67820 $land_lhs_true$$if_end54$31:do{if(__label__==21){var $37=HEAP32[(($wordx)>>2)];var $arrayidx49=(($37+1)&4294967295);var $38=HEAP8[($arrayidx49)];var $conv50=(tempInt=(($38)),(tempInt>=128?tempInt-256:tempInt));var $cmp51=((($conv50))|0)==46;if(!($cmp51)){__label__=23;break $land_lhs_true$$if_end54$31;}
67821 var $39=HEAP32[(($wordx)>>2)];var $arrayidx53=(($39+1)&4294967295);HEAP8[($arrayidx53)]=32;;}}while(0);var $arrayidx55=(($dictionary_flags)&4294967295);var $40=HEAP32[(($arrayidx55)>>2)];var $and56=($40)&536870912;var $tobool57=((($and56))|0)!=0;if($tobool57){__label__=24;;}else{__label__=27;;}
67822 $if_then58$$if_else80$35:do{if(__label__==24){var $41=HEAP32[(($word1)>>2)];var $arrayidx59=(($41)&4294967295);var $42=HEAP8[($arrayidx59)];var $conv60=(tempInt=(($42)),(tempInt>=128?tempInt-256:tempInt));HEAP32[(($first_char)>>2)]=$conv60;var $arrayidx61=(($dictionary_flags)&4294967295);var $43=HEAP32[(($arrayidx61)>>2)];var $and62=($43)&127;$stress_bits=$and62;var $44=$tr_addr;var $arraydecay63=(($phonemes)&4294967295);var $arraydecay64=(($dictionary_flags2)&4294967295);var $45=$wtab_addr;var $call65=__Z14LookupDictListP10TranslatorPPcS1_PjiP8WORD_TAB($44,$word1,$arraydecay63,$arraydecay64,0,$45);$found=$call65;var $arrayidx66=(($dictionary_flags2)&4294967295);var $46=HEAP32[(($arrayidx66)>>2)];var $cmp67=((($46))|0)!=0;if(!($cmp67)){__label__=33;break $if_then58$$if_else80$35;}
67823 var $arrayidx69=(($dictionary_flags2)&4294967295);var $47=HEAP32[(($arrayidx69)>>2)];var $arrayidx70=(($dictionary_flags)&4294967295);HEAP32[(($arrayidx70)>>2)]=$47;var $arrayidx71=(($dictionary_flags2+4)&4294967295);var $48=HEAP32[(($arrayidx71)>>2)];var $arrayidx72=(($dictionary_flags+4)&4294967295);HEAP32[(($arrayidx72)>>2)]=$48;var $49=$stress_bits;var $cmp73=((($49))|0)!=0;if(!($cmp73)){__label__=33;break $if_then58$$if_else80$35;}
67824 var $arrayidx75=(($dictionary_flags)&4294967295);var $50=HEAP32[(($arrayidx75)>>2)];var $and76=($50)&-128;var $51=$stress_bits;var $or=($and76)|($51);var $arrayidx77=(($dictionary_flags)&4294967295);HEAP32[(($arrayidx77)>>2)]=$or;;}
67825 else if(__label__==27){var $52=$found;var $cmp81=((($52))|0)==0;if(!($cmp81)){__label__=33;break $if_then58$$if_else80$35;}
67826 var $arrayidx83=(($dictionary_flags)&4294967295);var $53=HEAP32[(($arrayidx83)>>2)];var $and84=($53)&128;var $tobool85=((($and84))|0)!=0;if(!($tobool85)){__label__=33;break $if_then58$$if_else80$35;}
67827 var $54=HEAP32[(($word1)>>2)];HEAP32[(($wordx)>>2)]=$54;$ix=0;var $55=$ix;var $56=HEAP32[((_dictionary_skipwords)>>2)];var $cmp8815=((($55))|0)<((($56))|0);if(!($cmp8815)){__label__=33;break $if_then58$$if_else80$35;}
67828 while(1){var $57=HEAP32[(($wordx)>>2)];var $58=HEAP8[($57)];var $conv90=(tempInt=(($58)),(tempInt>=128?tempInt-256:tempInt));var $cmp91=((($conv90))|0)==32;if($cmp91){__label__=31;;}else{__label__=32;;}
67829 if(__label__==31){var $59=HEAP32[(($wordx)>>2)];HEAP8[($59)]=45;var $60=$ix;var $inc93=((($60)+1)&4294967295);$ix=$inc93;;}
67830 var $61=HEAP32[(($wordx)>>2)];var $incdec_ptr95=(($61+1)&4294967295);HEAP32[(($wordx)>>2)]=$incdec_ptr95;var $62=$ix;var $63=HEAP32[((_dictionary_skipwords)>>2)];var $cmp88=((($62))|0)<((($63))|0);if($cmp88){__label__=30;continue;}else{__label__=33;break $if_then58$$if_else80$35;}}}}while(0);var $64=$word_length;var $cmp99=((($64))|0)==1;var $65=HEAP32[((_dictionary_skipwords)>>2)];var $cmp101=((($65))|0)==0;var $or_cond=($cmp99)&($cmp101);if($or_cond){__label__=34;;}else{__label__=37;;}
67831 $if_then102$$if_end113$48:do{if(__label__==34){var $66=HEAP32[(($word1)>>2)];var $67=$wtab_addr;var $call103=__ZL17CheckDottedAbbrevPcP8WORD_TAB($66,$67);var $tobool104=((($call103))|0)!=0;if(!($tobool104)){__label__=37;break $if_then102$$if_end113$48;}
67832 var $arrayidx106=(($dictionary_flags)&4294967295);HEAP32[(($arrayidx106)>>2)]=0;var $arrayidx107=(($dictionary_flags+4)&4294967295);HEAP32[(($arrayidx107)>>2)]=0;$spell_word=1;var $68=HEAP32[((_dictionary_skipwords)>>2)];var $tobool108=((($68))|0)!=0;if(!($tobool108)){__label__=37;break $if_then102$$if_end113$48;}
67833 var $arrayidx110=(($dictionary_flags)&4294967295);HEAP32[(($arrayidx110)>>2)]=128;;}}while(0);var $arrayidx114=(($phonemes)&4294967295);var $69=HEAP8[($arrayidx114)];var $conv115=(tempInt=(($69)),(tempInt>=128?tempInt-256:tempInt));var $cmp116=((($conv115))|0)==21;if($cmp116){__label__=38;;}else{__label__=39;;}
67834 if(__label__==38){var $arraydecay118=(($phonemes)&4294967295);var $call119=_strcpy(((_word_phonemes)&4294967295),$arraydecay118);$retval=0;__label__=236;break $if_then12$$if_end13$5;}
67835 else if(__label__==39){var $70=$wmark;var $cmp121=((($70))|0)>0;var $71=$wmark;var $cmp123=((($71))|0)<8;var $or_cond1=($cmp121)&($cmp123);if($or_cond1){__label__=40;;}else{__label__=41;;}
67836 if(__label__==40){var $arrayidx125=(($dictionary_flags)&4294967295);var $72=HEAP32[(($arrayidx125)>>2)];var $and126=($72)&-16;var $73=$wmark;var $or127=($and126)|($73);var $arrayidx128=(($dictionary_flags)&4294967295);HEAP32[(($arrayidx128)>>2)]=$or127;;}
67837 var $74=$found;var $tobool130=((($74))|0)!=0;if($tobool130){__label__=49;;}else{__label__=42;;}
67838 $if_end150$$land_lhs_true131$59:do{if(__label__==42){var $arrayidx132=(($dictionary_flags)&4294967295);var $75=HEAP32[(($arrayidx132)>>2)];var $and133=($75)&131072;var $tobool134=((($and133))|0)!=0;if($tobool134){__label__=43;;}else{__label__=44;;}
67839 if(__label__==43){$spell_word=1;;}
67840 var $_pr=$found;var $tobool137=((($_pr))|0)!=0;if($tobool137){__label__=49;break $if_end150$$land_lhs_true131$59;}
67841 var $76=HEAP32[(($first_char)>>2)];var $call139=_iswdigit($76);var $tobool140=((($call139))|0)!=0;if(!($tobool140)){__label__=49;break $if_end150$$land_lhs_true131$59;}
67842 var $77=$tr_addr;var $call142=__Z6LookupP10TranslatorPKcPc($77,((__str2545)&4294967295),((_word_phonemes)&4294967295));var $78=HEAP8[(((_word_phonemes)&4294967295))];var $conv143=(tempInt=(($78)),(tempInt>=128?tempInt-256:tempInt));var $cmp144=((($conv143))|0)==21;if($cmp144){__label__=47;;}else{__label__=48;;}
67843 if(__label__==47){$retval=0;__label__=236;break $if_then12$$if_end13$5;}
67844 else if(__label__==48){var $79=$tr_addr;var $80=HEAP32[(($word1)>>2)];var $arraydecay147=(($phonemes)&4294967295);var $arraydecay148=(($dictionary_flags)&4294967295);var $81=$wtab_addr;var $call149=__Z15TranslateNumberP10TranslatorPcS1_PjP8WORD_TABi($79,$80,$arraydecay147,$arraydecay148,$81,0);$found=$call149;;}}}while(0);var $82=$found;var $tobool151=((($82))|0)!=0;var $lnot=($tobool151)^1;var $conv152=((($lnot))&1);var $83=$wflags;var $and153=($83)&3;var $cmp154=((($and153))|0)!=2;var $conv155=((($cmp154))&1);var $and156=($conv155)&($conv152);var $tobool157=((($and156))|0)!=0;if($tobool157){__label__=50;;}else{__label__=57;;}
67845 $if_then158$$if_end186$70:do{if(__label__==50){var $84=$tr_addr;var $langopts=(($84)&4294967295);var $numbers=(($langopts+184)&4294967295);var $85=HEAP32[(($numbers)>>2)];var $and159=($85)&16777216;var $tobool160=((($and159))|0)!=0;if($tobool160){__label__=53;;}else{__label__=51;;}
67846 if(__label__==51){var $86=$tr_addr;var $langopts161=(($86)&4294967295);var $numbers162=(($langopts161+184)&4294967295);var $87=HEAP32[(($numbers162)>>2)];var $and163=($87)&33554432;var $tobool164=((($and163))|0)!=0;if(!($tobool164)){__label__=57;break $if_then158$$if_end186$70;}
67847 var $88=$wflags;var $and166=($88)&1;var $tobool167=((($and166))|0)!=0;if(!($tobool167)){__label__=57;break $if_then158$$if_end186$70;}}
67848 var $89=$wflags;var $and169=($89)&16;var $tobool170=((($and169))|0)!=0;if($tobool170){__label__=55;;}else{__label__=54;;}
67849 if(__label__==54){var $90=$wtab_addr;var $arrayidx172=(($90+12)&4294967295);var $flags173=(($arrayidx172)&4294967295);var $91=HEAP32[(($flags173)>>2)];var $and174=($91)&256;var $tobool175=((($and174))|0)!=0;if($tobool175){__label__=57;break $if_then158$$if_end186$70;}}
67850 var $92=$tr_addr;var $93=HEAP32[(($word1)>>2)];var $arraydecay177=(($phonemes)&4294967295);var $94=$wtab_addr;var $call178=__Z14TranslateRomanP10TranslatorPcS1_P8WORD_TAB($92,$93,$arraydecay177,$94);$found=$call178;var $cmp179=((($call178))|0)!=0;if(!($cmp179)){__label__=57;break $if_then158$$if_end186$70;}
67851 var $arrayidx181=(($dictionary_flags)&4294967295);var $95=HEAP32[(($arrayidx181)>>2)];var $or182=($95)|131072;HEAP32[(($arrayidx181)>>2)]=$or182;;}}while(0);var $96=$wflags;var $and187=($96)&1;var $tobool188=((($and187))|0)!=0;if($tobool188){__label__=58;;}else{__label__=69;;}
67852 $land_lhs_true189$$if_end219thread_pre_split$81:do{if(__label__==58){var $97=$word_length;var $cmp190=((($97))|0)>1;if(!($cmp190)){__label__=69;break $land_lhs_true189$$if_end219thread_pre_split$81;}
67853 var $98=HEAP32[(($first_char)>>2)];var $call192=_iswalpha($98);var $tobool193=((($call192))|0)!=0;if(!($tobool193)){__label__=69;break $land_lhs_true189$$if_end219thread_pre_split$81;}
67854 var $99=HEAP32[((_option_tone_flags)>>2)];var $and195=($99)&256;var $tobool196=((($and195))|0)!=0;if($tobool196){__label__=61;;}else{__label__=63;;}
67855 $land_lhs_true197$$if_else202$85:do{if(__label__==61){var $arrayidx198=(($dictionary_flags)&4294967295);var $100=HEAP32[(($arrayidx198)>>2)];var $and199=($100)&131072;var $tobool200=((($and199))|0)!=0;if($tobool200){__label__=63;break $land_lhs_true197$$if_else202$85;}
67856 $emphasize_allcaps=2048;__label__=69;break $land_lhs_true189$$if_end219thread_pre_split$81;}}while(0);var $101=$found;var $tobool203=((($101))|0)!=0;if($tobool203){__label__=69;break $land_lhs_true189$$if_end219thread_pre_split$81;}
67857 var $arrayidx205=(($dictionary_flags)&4294967295);var $102=HEAP32[(($arrayidx205)>>2)];var $and206=($102)&128;var $tobool207=((($and206))|0)!=0;if($tobool207){__label__=69;break $land_lhs_true189$$if_end219thread_pre_split$81;}
67858 var $103=$word_length;var $cmp209=((($103))|0)<4;if(!($cmp209)){__label__=69;break $land_lhs_true189$$if_end219thread_pre_split$81;}
67859 var $104=$tr_addr;var $clause_lower_count=(($104+8308)&4294967295);var $105=HEAP32[(($clause_lower_count)>>2)];var $cmp211=((($105))|0)>3;if(!($cmp211)){__label__=69;break $land_lhs_true189$$if_end219thread_pre_split$81;}
67860 var $106=$tr_addr;var $clause_upper_count=(($106+8304)&4294967295);var $107=HEAP32[(($clause_upper_count)>>2)];var $108=$tr_addr;var $clause_lower_count213=(($108+8308)&4294967295);var $109=HEAP32[(($clause_lower_count213)>>2)];var $cmp214=((($107))|0)<=((($109))|0);if(!($cmp214)){__label__=69;break $land_lhs_true189$$if_end219thread_pre_split$81;}
67861 $spell_word=1;__label__=71;break $if_then37$$if_else39$25;}}while(0);var $_pr5=$spell_word;__lastLabel__=69;__label__=70;break $if_then37$$if_else39$25;}}}while(0);$if_end219$$if_then221$95:do{if(__label__==70){var $110=__lastLabel__==69?$_pr5:($and38);var $cmp220=((($110))|0)>0;if($cmp220){__label__=71;break $if_end219$$if_then221$95;}
67862 var $115=$found;var $cmp232=((($115))|0)==0;if(!($cmp232)){__label__=166;break $if_end219$$if_then221$95;}
67863 $posn=0;$non_initial=0;$length=999;var $116=HEAP32[(($word1)>>2)];HEAP32[(($wordx)>>2)]=$116;var $arraydecay252=(($unpron_phonemes)&4294967295);var $arrayidx256=(($unpron_phonemes)&4294967295);;$while_cond234$99:while(1){var $117=$length;var $cmp235=((($117))|0)<3;var $118=$length;var $cmp237=((($118))|0)>0;var $or_cond2=($cmp235)&($cmp237);if($or_cond2){__label__=80;;}else{__label__=78;;}
67864 if(__label__==78){var $119=$word_length;var $cmp238=((($119))|0)>1;if(!($cmp238)){__label__=89;break $while_cond234$99;}
67865 var $120=$tr_addr;var $121=HEAP32[(($wordx)>>2)];var $122=$posn;var $call240=__Z14UnpronouncableP10TranslatorPci($120,$121,$122);var $tobool241=((($call240))|0)!=0;if(!($tobool241)){__label__=89;break $while_cond234$99;}}
67866 $was_unpronouncable=67108864;$emphasize_allcaps=0;var $123=HEAP32[(($wordx)>>2)];var $arrayidx244=(($123)&4294967295);var $124=HEAP8[($arrayidx244)];var $conv245=(tempInt=(($124)),(tempInt>=128?tempInt-256:tempInt));var $cmp246=((($conv245))|0)==39;if($cmp246){__label__=89;break $while_cond234$99;}
67867 var $125=$posn;var $cmp249=((($125))|0)>0;if($cmp249){__label__=82;;}else{__label__=83;;}
67868 if(__label__==82){$non_initial=1;;}
67869 var $126=$tr_addr;var $127=HEAP32[(($wordx)>>2)];var $128=$non_initial;var $call253=__Z15TranslateLetterP10TranslatorPcS1_i($126,$127,$arraydecay252,$128);var $129=HEAP32[(($wordx)>>2)];var $add_ptr254=(($129+$call253)&4294967295);HEAP32[(($wordx)>>2)]=$add_ptr254;var $130=$posn;var $inc255=((($130)+1)&4294967295);$posn=$inc255;var $131=HEAP8[($arrayidx256)];var $conv257=(tempInt=(($131)),(tempInt>=128?tempInt-256:tempInt));var $cmp258=((($conv257))|0)==21;if($cmp258){__label__=84;break $while_cond234$99;}
67870 $length=0;var $132=$length;var $133=HEAP32[(($wordx)>>2)];var $arrayidx26921=(($133+$132)&4294967295);var $134=HEAP8[($arrayidx26921)];var $conv27022=(tempInt=(($134)),(tempInt>=128?tempInt-256:tempInt));var $cmp27123=((($conv27022))|0)!=32;if(!($cmp27123)){__label__=77;continue $while_cond234$99;}
67871 while(1){var $135=$length;var $inc273=((($135)+1)&4294967295);$length=$inc273;var $136=$length;var $137=HEAP32[(($wordx)>>2)];var $arrayidx269=(($137+$136)&4294967295);var $138=HEAP8[($arrayidx269)];var $conv270=(tempInt=(($138)),(tempInt>=128?tempInt-256:tempInt));var $cmp271=((($conv270))|0)!=32;if($cmp271){__label__=88;continue;}else{__label__=77;continue $while_cond234$99;}}}
67872 if(__label__==89){var $139=$tr_addr;var $arraydecay276=(($unpron_phonemes)&4294967295);var $140=$posn;__Z17SetSpellingStressP10TranslatorPcii($139,$arraydecay276,0,$140);var $141=HEAP32[(($wordx)>>2)];var $142=HEAP8[($141)];var $conv277=(tempInt=(($142)),(tempInt>=128?tempInt-256:tempInt));var $cmp278=((($conv277))|0)!=32;if(!($cmp278)){__label__=166;break $if_end219$$if_then221$95;}
67873 var $arrayidx280=(($unpron_phonemes)&4294967295);var $143=HEAP8[($arrayidx280)];var $conv281=(tempInt=(($143)),(tempInt>=128?tempInt-256:tempInt));var $cmp282=((($conv281))|0)!=0;if($cmp282){__label__=91;;}else{__label__=93;;}
67874 $land_lhs_true283$$if_end289$115:do{if(__label__==91){var $144=HEAP32[(($wordx)>>2)];var $arrayidx284=(($144)&4294967295);var $145=HEAP8[($arrayidx284)];var $conv285=(tempInt=(($145)),(tempInt>=128?tempInt-256:tempInt));var $cmp286=((($conv285))|0)!=39;if(!($cmp286)){__label__=93;break $land_lhs_true283$$if_end289$115;}
67875 var $146=HEAP32[(($wordx)>>2)];var $arrayidx288=(($146+-1)&4294967295);HEAP8[($arrayidx288)]=32;;}}while(0);var $147=$tr_addr;var $148=HEAP32[(($wordx)>>2)];var $arraydecay290=(($phonemes)&4294967295);var $arraydecay291=(($end_phonemes)&4294967295);var $149=$wflags;var $arraydecay292=(($dictionary_flags)&4294967295);var $call293=__Z14TranslateRulesP10TranslatorPcS1_iS1_iPj($147,$148,$arraydecay290,160,$arraydecay291,$149,$arraydecay292);$end_type=$call293;var $arrayidx294=(($phonemes)&4294967295);var $150=HEAP8[($arrayidx294)];var $conv295=(tempInt=(($150)),(tempInt>=128?tempInt-256:tempInt));var $cmp296=((($conv295))|0)==21;var $arraydecay298=(($phonemes)&4294967295);if($cmp296){__label__=94;;}else{__label__=95;;}
67876 if(__label__==94){var $call299=_strcpy(((_word_phonemes)&4294967295),$arraydecay298);$retval=0;__label__=236;break $if_then12$$if_end13$5;}
67877 else if(__label__==95){var $151=HEAP8[($arraydecay298)];var $conv302=(tempInt=(($151)),(tempInt>=128?tempInt-256:tempInt));var $cmp303=((($conv302))|0)==0;if($cmp303){__label__=96;;}else{__label__=101;;}
67878 $land_lhs_true304$$if_end321$122:do{if(__label__==96){var $arrayidx305=(($end_phonemes)&4294967295);var $152=HEAP8[($arrayidx305)];var $conv306=(tempInt=(($152)),(tempInt>=128?tempInt-256:tempInt));var $cmp307=((($conv306))|0)==0;if(!($cmp307)){__label__=101;break $land_lhs_true304$$if_end321$122;}
67879 var $153=HEAP32[(($wordx)>>2)];var $call309=__Z7utf8_inPiPKc($wc,$153);var $154=$word_length;var $cmp310=((($154))|0)==1;if(!($cmp310)){__label__=101;break $land_lhs_true304$$if_end321$122;}
67880 var $155=HEAP32[(($wc)>>2)];var $call312=__Z7IsAlphaj($155);var $tobool313=((($call312))|0)!=0;if(!($tobool313)){__label__=101;break $land_lhs_true304$$if_end321$122;}
67881 var $156=$tr_addr;var $157=HEAP32[(($wordx)>>2)];var $arraydecay315=(($phonemes)&4294967295);var $158=$spell_word;var $call316=__ZL22SpeakIndividualLettersP10TranslatorPcS1_i($156,$157,$arraydecay315,$158);HEAP32[(($wordx)>>2)]=$call316;var $cmp317=((($call316))|0)==0;if(!($cmp317)){__label__=101;break $land_lhs_true304$$if_end321$122;}
67882 $retval=0;__label__=236;break $if_then12$$if_end13$5;}}while(0);var $159=HEAP32[(($wordx)>>2)];var $arrayidx322=(($159+-1)&4294967295);var $160=HEAP8[($arrayidx322)];$c_temp=$160;$found=0;$confirm_prefix=1;$loopcount=0;var $arrayidx333=(($phonemes2)&4294967295);var $arraydecay334=(($phonemes2)&4294967295);var $arraydecay335=(($end_phonemes2)&4294967295);var $arraydecay338=(($dictionary_flags)&4294967295);var $arraydecay342=(($word_copy)&4294967295);var $arraydecay344=(($phonemes)&4294967295);var $arraydecay345=(($end_phonemes)&4294967295);var $arraydecay347=(($dictionary_flags)&4294967295);var $arraydecay349=(($word_copy)&4294967295);var $arraydecay350=(($word_copy)&4294967295);var $arraydecay355=(($phonemes)&4294967295);var $arraydecay356=(($phonemes2)&4294967295);var $arraydecay358=(($end_phonemes)&4294967295);var $arraydecay359=(($end_phonemes2)&4294967295);var $arraydecay363=(($end_phonemes)&4294967295);var $arraydecay364=(($end_phonemes2)&4294967295);var $arraydecay365=(($end_phonemes2)&4294967295);var $arraydecay418=(($prefix_phonemes2)&4294967295);var $arraydecay419=(($end_phonemes)&4294967295);var $arrayidx420=(($prefix_chars+1)&4294967295);var $arraydecay421=(($prefix_phonemes)&4294967295);var $arraydecay422=(($phonemes)&4294967295);var $arraydecay424=(($phonemes)&4294967295);var $arraydecay425=(($dictionary_flags)&4294967295);var $arraydecay429=(($prefix_phonemes)&4294967295);var $arraydecay430=(($phonemes)&4294967295);var $arrayidx433=(($dictionary_flags)&4294967295);var $arrayidx437=(($prefix_phonemes)&4294967295);var $arraydecay438=(($prefix_phonemes)&4294967295);var $arrayidx446=(($end_phonemes)&4294967295);var $arraydecay447=(($phonemes)&4294967295);var $arraydecay448=(($dictionary_flags2)&4294967295);var $arrayidx450=(($dictionary_flags)&4294967295);var $arrayidx453=(($dictionary_flags2)&4294967295);var $arrayidx454=(($dictionary_flags)&4294967295);var $arrayidx455=(($dictionary_flags2+4)&4294967295);var $arrayidx456=(($dictionary_flags+4)&4294967295);var $arraydecay461=(($phonemes)&4294967295);var $arraydecay462=(($end_phonemes)&4294967295);var $arraydecay463=(($dictionary_flags)&4294967295);var $arrayidx465=(($phonemes)&4294967295);var $arraydecay442=(($prefix_phonemes)&4294967295);var $arraydecay443=(($end_phonemes)&4294967295);var $arrayidx392=(($prefix_chars)&4294967295);__lastLabel__=101;;$for_cond$129:while(1){var $161=__lastLabel__==136?$inc475:(0);var $cmp323=((($161))|0)<50;var $162=$end_type;if(!($cmp323)){__label__=137;break $for_cond$129;}
67883 var $and325=($162)&1024;var $tobool326=((($and325))|0)!=0;if(!($tobool326)){__label__=137;break $for_cond$129;}
67884 var $163=$confirm_prefix;var $tobool328=((($163))|0)!=0;if($tobool328){__label__=105;;}else{__label__=111;;}
67885 $land_lhs_true329$$if_end370$133:do{if(__label__==105){var $164=$end_type;var $and330=($164)&131072;var $tobool331=((($and330))|0)!=0;if($tobool331){__label__=111;break $land_lhs_true329$$if_end370$133;}
67886 HEAP8[($arrayidx333)]=0;var $165=$tr_addr;var $166=HEAP32[(($wordx)>>2)];var $167=$wflags;var $or337=($167)|805306368;var $call339=__Z14TranslateRulesP10TranslatorPcS1_iS1_iPj($165,$166,$arraydecay334,160,$arraydecay335,$or337,$arraydecay338);$end2=$call339;var $168=$end2;var $tobool340=((($168))|0)!=0;if(!($tobool340)){__label__=111;break $land_lhs_true329$$if_end370$133;}
67887 var $169=$tr_addr;var $170=HEAP32[(($wordx)>>2)];var $171=$end2;var $call343=__Z12RemoveEndingP10TranslatorPciS1_($169,$170,$171,$arraydecay342);var $172=$tr_addr;var $173=HEAP32[(($wordx)>>2)];var $174=$wflags;var $or346=($174)|268435456;var $call348=__Z14TranslateRulesP10TranslatorPcS1_iS1_iPj($172,$173,$arraydecay344,160,$arraydecay345,$or346,$arraydecay347);$end_type=$call348;var $175=HEAP32[(($wordx)>>2)];var $call351=_strlen($arraydecay350);var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$arraydecay349;$dest$=$175;$stop$=$src$+$call351;if(($dest$%4)==($src$%4)&&$call351>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
67888 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
67889 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $176=$end_type;var $and352=($176)&1024;var $cmp353=((($and352))|0)==0;if($cmp353){__label__=108;;}else{__label__=110;;}
67890 $if_then354$$if_end368$137:do{if(__label__==108){var $177=$end2;$end_type=$177;var $call357=_strcpy($arraydecay355,$arraydecay356);var $call360=_strcpy($arraydecay358,$arraydecay359);var $178=HEAP32[((_option_phonemes)>>2)];var $cmp361=((($178))|0)==2;if(!($cmp361)){__label__=110;break $if_then354$$if_end368$137;}
67891 __Z14DecodePhonemesPKcPc($arraydecay363,$arraydecay364);var $179=HEAP32[((_f_trans)>>2)];var $call366=_fprintf($179,((__str4547)&4294967295),allocate([$arraydecay365,0,0,0],["i8*",0,0,0],ALLOC_STACK));;}}while(0);$confirm_prefix=0;__label__=136;break $land_lhs_true329$$if_end370$133;}}while(0);$if_end370$$for_inc474$141:do{if(__label__==111){var $180=$end_type;$prefix_type=$180;var $181=$prefix_type;var $and371=($181)&2048;var $tobool372=((($and371))|0)!=0;if($tobool372){__label__=112;;}else{__label__=113;;}
67892 if(__label__==112){var $182=$tr_addr;var $expect_verb=(($182+8272)&4294967295);HEAP32[(($expect_verb)>>2)]=1;;}
67893 var $183=$c_temp;var $184=HEAP32[(($wordx)>>2)];var $arrayidx375=(($184+-1)&4294967295);HEAP8[($arrayidx375)]=$183;var $185=$prefix_type;var $and376=($185)&131072;var $cmp377=((($and376))|0)==0;if($cmp377){__label__=114;;}else{__label__=118;;}
67894 $if_then378$$if_else391$146:do{if(__label__==114){var $186=$prefix_type;var $and379=($186)&15;$ix=$and379;var $cmp38119=((($and379))|0)>0;if(!($cmp38119)){__label__=124;break $if_then378$$if_else391$146;}
67895 $for_body382$148:while(1){var $187=HEAP32[(($wordx)>>2)];var $incdec_ptr383=(($187+1)&4294967295);HEAP32[(($wordx)>>2)]=$incdec_ptr383;var $188=HEAP32[(($wordx)>>2)];var $189=HEAP8[($188)];var $conv38516=(tempInt=(($189)),(tempInt>=128?tempInt-256:tempInt));var $and38617=($conv38516)&192;var $cmp38718=((($and38617))|0)==128;if($cmp38718){__label__=116;;}else{__label__=117;;}
67896 $while_body388$$for_inc$150:do{if(__label__==116){while(1){var $190=HEAP32[(($wordx)>>2)];var $incdec_ptr389=(($190+1)&4294967295);HEAP32[(($wordx)>>2)]=$incdec_ptr389;var $191=HEAP32[(($wordx)>>2)];var $192=HEAP8[($191)];var $conv385=(tempInt=(($192)),(tempInt>=128?tempInt-256:tempInt));var $and386=($conv385)&192;var $cmp387=((($and386))|0)==128;if($cmp387){__label__=116;continue;}else{__label__=117;break $while_body388$$for_inc$150;}}}}while(0);var $193=$ix;var $dec=((($193)-1)&4294967295);$ix=$dec;var $cmp381=((($dec))|0)>0;if($cmp381){__label__=115;continue $for_body382$148;}else{__label__=124;break $if_then378$$if_else391$146;}}}
67897 else if(__label__==118){$pfix=1;HEAP8[($arrayidx392)]=0;var $194=$prefix_type;var $and393=($194)&63;$n_chars=$and393;$ix=0;var $195=$ix;var $196=$n_chars;var $cmp39520=((($195))|0)<((($196))|0);if($cmp39520){__label__=119;;}else{__label__=123;;}
67898 $for_body396$$for_end410$155:do{if(__label__==119){$for_body396$156:while(1){var $197=HEAP32[(($wordx)>>2)];var $incdec_ptr397=(($197+1)&4294967295);HEAP32[(($wordx)>>2)]=$incdec_ptr397;var $198=HEAP8[($197)];var $199=$pfix;var $inc398=((($199)+1)&4294967295);$pfix=$inc398;var $arrayidx399=(($prefix_chars+$199)&4294967295);HEAP8[($arrayidx399)]=$198;var $200=$prefix_type;var $and400=($200)&131072;var $tobool401=((($and400))|0)!=0;if($tobool401){__label__=120;;}else{__label__=122;;}
67899 $land_lhs_true402$$for_inc408$158:do{if(__label__==120){var $201=$ix;var $202=$n_chars;var $sub=((($202)-1)&4294967295);var $cmp403=((($201))|0)==((($sub))|0);if(!($cmp403)){__label__=122;break $land_lhs_true402$$for_inc408$158;}
67900 var $203=$pfix;var $sub405=((($203)-1)&4294967295);var $arrayidx406=(($prefix_chars+$sub405)&4294967295);HEAP8[($arrayidx406)]=0;;}}while(0);var $204=$ix;var $inc409=((($204)+1)&4294967295);$ix=$inc409;var $205=$ix;var $206=$n_chars;var $cmp395=((($205))|0)<((($206))|0);if($cmp395){__label__=119;continue $for_body396$156;}else{__label__=123;break $for_body396$$for_end410$155;}}}}while(0);var $207=$pfix;var $arrayidx411=(($prefix_chars+$207)&4294967295);HEAP8[($arrayidx411)]=0;;}}while(0);var $208=HEAP32[(($wordx)>>2)];var $arrayidx413=(($208+-1)&4294967295);var $209=HEAP8[($arrayidx413)];$c_temp=$209;var $210=HEAP32[(($wordx)>>2)];var $arrayidx414=(($210+-1)&4294967295);HEAP8[($arrayidx414)]=32;$confirm_prefix=1;var $211=$prefix_type;var $and415=($211)&131072;var $tobool416=((($and415))|0)!=0;if($tobool416){__label__=125;;}else{__label__=129;;}
67901 $if_then417$$if_else441$164:do{if(__label__==125){__Z8strncpy0PcPKci($arraydecay418,$arraydecay419,12);HEAP32[(($wordpf)>>2)]=$arrayidx420;var $call423=_strcpy($arraydecay421,$arraydecay422);var $212=$tr_addr;var $213=$wtab_addr;var $call426=__Z14LookupDictListP10TranslatorPPcS1_PjiP8WORD_TAB($212,$wordpf,$arraydecay424,$arraydecay425,0,$213);$found=$call426;var $214=$found;var $tobool427=((($214))|0)!=0;if($tobool427){__label__=126;;}else{__label__=127;;}
67902 if(__label__==126){var $call431=_strcpy($arraydecay429,$arraydecay430);;}
67903 var $215=HEAP32[(($arrayidx433)>>2)];var $and434=($215)&131072;var $tobool435=((($and434))|0)!=0;if(!($tobool435)){__label__=130;break $if_then417$$if_else441$164;}
67904 HEAP8[($arrayidx437)]=0;var $216=$tr_addr;var $217=HEAP32[(($wordpf)>>2)];var $call439=__ZL22SpeakIndividualLettersP10TranslatorPcS1_i($216,$217,$arraydecay438,1);;}
67905 else if(__label__==129){var $call444=_strcat($arraydecay442,$arraydecay443);;}}while(0);HEAP8[($arrayidx446)]=0;$end_type=0;var $218=$tr_addr;var $219=$wtab_addr;var $call449=__Z14LookupDictListP10TranslatorPPcS1_PjiP8WORD_TAB($218,$wordx,$arraydecay447,$arraydecay448,1024,$219);$found=$call449;var $220=HEAP32[(($arrayidx450)>>2)];var $cmp451=((($220))|0)==0;if($cmp451){__label__=131;;}else{__label__=132;;}
67906 if(__label__==131){var $221=HEAP32[(($arrayidx453)>>2)];HEAP32[(($arrayidx454)>>2)]=$221;var $222=HEAP32[(($arrayidx455)>>2)];HEAP32[(($arrayidx456)>>2)]=$222;;}
67907 else if(__label__==132){$prefix_flags=1;;}
67908 var $223=$found;var $cmp459=((($223))|0)==0;if(!($cmp459)){__label__=136;break $if_end370$$for_inc474$141;}
67909 var $224=$tr_addr;var $225=HEAP32[(($wordx)>>2)];var $call464=__Z14TranslateRulesP10TranslatorPcS1_iS1_iPj($224,$225,$arraydecay461,160,$arraydecay462,0,$arraydecay463);$end_type=$call464;var $226=HEAP8[($arrayidx465)];var $conv466=(tempInt=(($226)),(tempInt>=128?tempInt-256:tempInt));var $cmp467=((($conv466))|0)==21;if($cmp467){__label__=135;break $for_cond$129;}}}while(0);var $229=$loopcount;var $inc475=((($229)+1)&4294967295);$loopcount=$inc475;__lastLabel__=136;__label__=102;continue $for_cond$129;}
67910 if(__label__==137){var $cmp477=((($162))|0)!=0;if($cmp477){__label__=138;;}else{__label__=165;;}
67911 $land_lhs_true478$$if_end603$180:do{if(__label__==138){var $230=$end_type;var $and479=($230)&1024;var $tobool480=((($and479))|0)!=0;if($tobool480){__label__=165;break $land_lhs_true478$$if_end603$180;}
67912 var $arraydecay483=(($phonemes2482)&4294967295);var $arraydecay484=(($phonemes)&4294967295);var $call485=_strcpy($arraydecay483,$arraydecay484);var $231=$tr_addr;var $232=HEAP32[(($wordx)>>2)];var $233=$end_type;var $arraydecay486=(($word_copy)&4294967295);var $call487=__Z12RemoveEndingP10TranslatorPciS1_($231,$232,$233,$arraydecay486);$end_flags=$call487;var $arrayidx488=(($phonemes)&4294967295);HEAP8[($arrayidx488)]=0;var $arrayidx489=(($prefix_phonemes)&4294967295);var $234=HEAP8[($arrayidx489)];var $conv490=(tempInt=(($234)),(tempInt>=128?tempInt-256:tempInt));var $cmp491=((($conv490))|0)!=0;if($cmp491){__label__=140;;}else{__label__=148;;}
67913 $if_then492$$if_end526$183:do{if(__label__==140){var $235=$c_temp;var $236=HEAP32[(($wordx)>>2)];var $arrayidx493=(($236+-1)&4294967295);HEAP8[($arrayidx493)]=$235;var $237=$tr_addr;var $arraydecay494=(($phonemes)&4294967295);var $arraydecay495=(($dictionary_flags2)&4294967295);var $238=$end_flags;var $239=$wtab_addr;var $call496=__Z14LookupDictListP10TranslatorPPcS1_PjiP8WORD_TAB($237,$word1,$arraydecay494,$arraydecay495,$238,$239);$found=$call496;var $240=HEAP32[(($wordx)>>2)];var $arrayidx497=(($240+-1)&4294967295);HEAP8[($arrayidx497)]=32;var $arrayidx498=(($phonemes)&4294967295);var $241=HEAP8[($arrayidx498)];var $conv499=(tempInt=(($241)),(tempInt>=128?tempInt-256:tempInt));var $cmp500=((($conv499))|0)==21;if($cmp500){__label__=141;;}else{__label__=142;;}
67914 if(__label__==141){var $242=HEAP32[(($wordx)>>2)];var $arraydecay502=(($word_copy)&4294967295);var $arraydecay503=(($word_copy)&4294967295);var $call504=_strlen($arraydecay503);var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$arraydecay502;$dest$=$242;$stop$=$src$+$call504;if(($dest$%4)==($src$%4)&&$call504>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
67915 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
67916 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $arraydecay505=(($phonemes)&4294967295);var $call506=_strcpy(((_word_phonemes)&4294967295),$arraydecay505);$retval=0;__label__=236;break $if_then12$$if_end13$5;}
67917 else if(__label__==142){var $arrayidx508=(($dictionary_flags)&4294967295);var $243=HEAP32[(($arrayidx508)>>2)];var $cmp509=((($243))|0)==0;if($cmp509){__label__=143;;}else{__label__=144;;}
67918 if(__label__==143){var $arrayidx511=(($dictionary_flags2)&4294967295);var $244=HEAP32[(($arrayidx511)>>2)];var $arrayidx512=(($dictionary_flags)&4294967295);HEAP32[(($arrayidx512)>>2)]=$244;var $arrayidx513=(($dictionary_flags2+4)&4294967295);var $245=HEAP32[(($arrayidx513)>>2)];var $arrayidx514=(($dictionary_flags+4)&4294967295);HEAP32[(($arrayidx514)>>2)]=$245;;}
67919 var $246=$found;var $tobool516=((($246))|0)!=0;if($tobool516){__label__=145;;}else{__label__=146;;}
67920 if(__label__==145){var $arrayidx518=(($prefix_phonemes)&4294967295);HEAP8[($arrayidx518)]=0;var $_pr8=$found;var $cmp520=((($_pr8))|0)==0;if(!($cmp520)){__label__=162;break $if_then492$$if_end526$183;}}
67921 var $arrayidx522=(($dictionary_flags2)&4294967295);var $247=HEAP32[(($arrayidx522)>>2)];var $cmp523=((($247))|0)!=0;if(!($cmp523)){__label__=148;break $if_then492$$if_end526$183;}
67922 $prefix_flags=1;__label__=148;break $if_then492$$if_end526$183;}}}while(0);$if_end526$$if_end592$195:do{if(__label__==148){var $_pr10=$found;var $cmp527=((($_pr10))|0)==0;if(!($cmp527)){__label__=162;break $if_end526$$if_end592$195;}
67923 var $248=$tr_addr;var $arraydecay529=(($phonemes)&4294967295);var $arraydecay530=(($dictionary_flags2)&4294967295);var $249=$end_flags;var $250=$wtab_addr;var $call531=__Z14LookupDictListP10TranslatorPPcS1_PjiP8WORD_TAB($248,$wordx,$arraydecay529,$arraydecay530,$249,$250);$found=$call531;var $arrayidx532=(($phonemes)&4294967295);var $251=HEAP8[($arrayidx532)];var $conv533=(tempInt=(($251)),(tempInt>=128?tempInt-256:tempInt));var $cmp534=((($conv533))|0)==21;if($cmp534){__label__=150;;}else{__label__=151;;}
67924 if(__label__==150){var $252=HEAP32[(($wordx)>>2)];var $arraydecay536=(($word_copy)&4294967295);var $arraydecay537=(($word_copy)&4294967295);var $call538=_strlen($arraydecay537);var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$arraydecay536;$dest$=$252;$stop$=$src$+$call538;if(($dest$%4)==($src$%4)&&$call538>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
67925 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
67926 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $arraydecay539=(($phonemes)&4294967295);var $call540=_strcpy(((_word_phonemes)&4294967295),$arraydecay539);$retval=0;__label__=236;break $if_then12$$if_end13$5;}
67927 else if(__label__==151){var $arrayidx547=(($dictionary_flags)&4294967295);var $253=HEAP32[(($arrayidx547)>>2)];var $cmp548=((($253))|0)==0;if($cmp548){__label__=152;;}else{__label__=153;;}
67928 if(__label__==152){var $arrayidx550=(($dictionary_flags2)&4294967295);var $254=HEAP32[(($arrayidx550)>>2)];var $arrayidx551=(($dictionary_flags)&4294967295);HEAP32[(($arrayidx551)>>2)]=$254;var $arrayidx552=(($dictionary_flags2+4)&4294967295);var $255=HEAP32[(($arrayidx552)>>2)];var $arrayidx553=(($dictionary_flags+4)&4294967295);HEAP32[(($arrayidx553)>>2)]=$255;;}
67929 var $_pr12_pr=$found;var $cmp556=((($_pr12_pr))|0)==0;if(!($cmp556)){__label__=162;break $if_end526$$if_end592$195;}
67930 var $256=$end_type;var $and558=($256)&16384;var $tobool559=((($and558))|0)!=0;if($tobool559){__label__=155;;}else{__label__=156;;}
67931 if(__label__==155){var $arraydecay561=(($phonemes)&4294967295);var $arraydecay562=(($phonemes2482)&4294967295);var $call563=_strcpy($arraydecay561,$arraydecay562);var $257=$tr_addr;var $arraydecay564=(($phonemes)&4294967295);var $arrayidx565=(($dictionary_flags)&4294967295);var $258=HEAP32[(($arrayidx565)>>2)];__Z21ApplySpecialAttributeP10TranslatorPci($257,$arraydecay564,$258);;}
67932 else if(__label__==156){var $259=$end_flags;var $and567=($259)&4;var $tobool568=((($and567))|0)!=0;if($tobool568){__label__=157;;}else{__label__=158;;}
67933 if(__label__==157){var $260=$wflags;var $or570=($260)|8192;$wflags=$or570;;}
67934 var $261=$end_type;var $and572=($261)&262144;var $tobool573=((($and572))|0)!=0;if($tobool573){__label__=159;;}else{__label__=160;;}
67935 if(__label__==159){var $262=$wflags;var $or575=($262)|134217728;$wflags=$or575;;}
67936 var $263=$tr_addr;var $264=HEAP32[(($wordx)>>2)];var $arraydecay577=(($phonemes)&4294967295);var $265=$wflags;var $arraydecay578=(($dictionary_flags)&4294967295);var $call579=__Z14TranslateRulesP10TranslatorPcS1_iS1_iPj($263,$264,$arraydecay577,160,0,$265,$arraydecay578);var $arrayidx580=(($phonemes)&4294967295);var $266=HEAP8[($arrayidx580)];var $conv581=(tempInt=(($266)),(tempInt>=128?tempInt-256:tempInt));var $cmp582=((($conv581))|0)==21;if(!($cmp582)){__label__=162;break $if_end526$$if_end592$195;}
67937 var $arraydecay584=(($phonemes)&4294967295);var $call585=_strcpy(((_word_phonemes)&4294967295),$arraydecay584);var $267=HEAP32[(($wordx)>>2)];var $arraydecay586=(($word_copy)&4294967295);var $arraydecay587=(($word_copy)&4294967295);var $call588=_strlen($arraydecay587);var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$arraydecay586;$dest$=$267;$stop$=$src$+$call588;if(($dest$%4)==($src$%4)&&$call588>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
67938 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
67939 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $268=$c_temp;var $269=HEAP32[(($wordx)>>2)];var $arrayidx589=(($269+-1)&4294967295);HEAP8[($arrayidx589)]=$268;$retval=0;__label__=236;break $if_then12$$if_end13$5;}}}}while(0);var $270=$end_type;var $and593=($270)&65536;var $cmp594=((($and593))|0)==0;if($cmp594){__label__=163;;}else{__label__=164;;}
67940 if(__label__==163){var $271=$tr_addr;var $arraydecay596=(($phonemes)&4294967295);var $arraydecay597=(($end_phonemes)&4294967295);__Z14AppendPhonemesP10TranslatorPciPKc($271,$arraydecay596,160,$arraydecay597);var $arrayidx598=(($end_phonemes)&4294967295);HEAP8[($arrayidx598)]=0;;}
67941 var $272=HEAP32[(($wordx)>>2)];var $arraydecay600=(($word_copy)&4294967295);var $arraydecay601=(($word_copy)&4294967295);var $call602=_strlen($arraydecay601);var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$arraydecay600;$dest$=$272;$stop$=$src$+$call602;if(($dest$%4)==($src$%4)&&$call602>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
67942 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
67943 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};;}}while(0);var $273=$c_temp;var $274=HEAP32[(($wordx)>>2)];var $arrayidx604=(($274+-1)&4294967295);HEAP8[($arrayidx604)]=$273;__label__=166;break $if_end219$$if_then221$95;}
67944 else if(__label__==135){var $227=$c_temp;var $228=HEAP32[(($wordx)>>2)];var $arrayidx469=(($228+-1)&4294967295);HEAP8[($arrayidx469)]=$227;var $arraydecay470=(($phonemes)&4294967295);var $call471=_strcpy(((_word_phonemes)&4294967295),$arraydecay470);$retval=0;__label__=236;break $if_then12$$if_end13$5;}}}
67945 else if(__label__==84){var $arraydecay260=(($unpron_phonemes)&4294967295);var $call261=_strcpy(((_word_phonemes)&4294967295),$arraydecay260);var $arrayidx262=(($unpron_phonemes+1)&4294967295);var $call263=_strcmp($arrayidx262,((__str52704)&4294967295));var $cmp264=((($call263))|0)==0;if($cmp264){__label__=85;;}else{__label__=86;;}
67946 if(__label__==85){$retval=65536;__label__=236;break $if_then12$$if_end13$5;}
67947 else if(__label__==86){$retval=0;__label__=236;break $if_then12$$if_end13$5;}}}}while(0);$if_then221$$if_end607$225:do{if(__label__==71){var $arrayidx222=(($phonemes)&4294967295);HEAP8[($arrayidx222)]=0;$end_type=0;var $111=$tr_addr;var $112=HEAP32[(($word1)>>2)];var $arraydecay223=(($phonemes)&4294967295);var $113=$spell_word;var $call224=__ZL22SpeakIndividualLettersP10TranslatorPcS1_i($111,$112,$arraydecay223,$113);var $cmp225=((($call224))|0)==0;if(!($cmp225)){__label__=166;break $if_then221$$if_end607$225;}
67948 var $114=$word_length;var $cmp227=((($114))|0)>1;if($cmp227){__label__=73;;}else{__label__=74;;}
67949 if(__label__==73){$retval=65536;__label__=236;break $if_then12$$if_end13$5;}
67950 else if(__label__==74){$retval=0;__label__=236;break $if_then12$$if_end13$5;}}}while(0);var $275=$add_plural_suffix;var $tobool608=((($275))|0)!=0;if($tobool608){__label__=168;;}else{__label__=167;;}
67951 $if_then612$$lor_lhs_false609$232:do{if(__label__==167){var $276=$wflags;var $and610=($276)&4;var $tobool611=((($and610))|0)!=0;if($tobool611){__label__=168;break $if_then612$$lor_lhs_false609$232;}else{__label__=174;break $if_then612$$lor_lhs_false609$232;}}}while(0);$if_then612$$if_end630$234:do{if(__label__==168){var $277=HEAP32[(($last_char)>>2)];var $cmp613=((($277))|0)==102;if($cmp613){__label__=169;;}else{__label__=170;;}
67952 if(__label__==169){var $278=$tr_addr;var $arraydecay615=(($phonemes)&4294967295);var $call616=__Z14TranslateRulesP10TranslatorPcS1_iS1_iPj($278,((__ZZ13TranslateWordP10TranslatorPciP8WORD_TABE7word_ss+1)&4294967295),$arraydecay615,160,0,0,0);;}
67953 else if(__label__==170){var $279=HEAP32[(($last_char)>>2)];var $cmp618=((($279))|0)==0;if($cmp618){__label__=172;;}else{__label__=171;;}
67954 $if_then622$$lor_lhs_false619$239:do{if(__label__==171){var $280=HEAP32[(($last_char)>>2)];var $call620=__Z8strchr_wPKci(((__str5548)&4294967295),$280);var $cmp621=((($call620))|0)==0;if($cmp621){__label__=172;break $if_then622$$lor_lhs_false619$239;}
67955 var $282=$tr_addr;var $arraydecay626=(($phonemes)&4294967295);var $call627=__Z14TranslateRulesP10TranslatorPcS1_iS1_iPj($282,((__ZZ13TranslateWordP10TranslatorPciP8WORD_TABE7word_iz+1)&4294967295),$arraydecay626,160,0,0,0);__label__=174;break $if_then612$$if_end630$234;}}while(0);var $281=$tr_addr;var $arraydecay623=(($phonemes)&4294967295);var $call624=__Z14TranslateRulesP10TranslatorPcS1_iS1_iPj($281,((__ZZ13TranslateWordP10TranslatorPciP8WORD_TABE7word_zz+1)&4294967295),$arraydecay623,160,0,0,0);;}}}while(0);var $283=$emphasize_allcaps;var $284=$wflags;var $or631=($284)|($283);$wflags=$or631;$prefix_stress=0;var $arraydecay632=(($prefix_phonemes)&4294967295);$p=$arraydecay632;var $285=$p;var $286=HEAP8[($285)];var $conv63426=(tempInt=(($286)),(tempInt>=128?tempInt-256:tempInt));var $cmp63527=((($conv63426))|0)!=0;if($cmp63527){__label__=175;;}else{__label__=179;;}
67956 $for_body636$$for_end647$244:do{if(__label__==175){$for_body636$245:while(1){var $287=$p;var $288=HEAP8[($287)];var $conv637=(tempInt=(($288)),(tempInt>=128?tempInt-256:tempInt));var $cmp638=((($conv637))|0)==6;if($cmp638){__label__=177;;}else{__label__=176;;}
67957 $if_then642$$lor_lhs_false639$247:do{if(__label__==176){var $289=$p;var $290=HEAP8[($289)];var $conv640=(tempInt=(($290)),(tempInt>=128?tempInt-256:tempInt));var $cmp641=((($conv640))|0)==7;if($cmp641){__label__=177;break $if_then642$$lor_lhs_false639$247;}else{__label__=178;break $if_then642$$lor_lhs_false639$247;}}}while(0);if(__label__==177){var $291=$p;var $292=HEAP8[($291)];var $conv643=(tempInt=(($292)),(tempInt>=128?tempInt-256:tempInt));$prefix_stress=$conv643;;}
67958 var $293=$p;var $incdec_ptr646=(($293+1)&4294967295);$p=$incdec_ptr646;var $294=$p;var $295=HEAP8[($294)];var $conv634=(tempInt=(($295)),(tempInt>=128?tempInt-256:tempInt));var $cmp635=((($conv634))|0)!=0;if($cmp635){__label__=175;continue $for_body636$245;}else{__label__=179;break $for_body636$$for_end647$244;}}}}while(0);var $296=$prefix_flags;var $tobool648=((($296))|0)!=0;if($tobool648){__label__=181;;}else{__label__=180;;}
67959 $if_then651$$lor_lhs_false649$253:do{if(__label__==180){var $297=$prefix_stress;var $cmp650=((($297))|0)!=0;if($cmp650){__label__=181;break $if_then651$$lor_lhs_false649$253;}
67960 var $313=$tr_addr;var $arraydecay695=(($phonemes)&4294967295);var $arraydecay696=(($dictionary_flags)&4294967295);__Z13SetWordStressP10TranslatorPcPjii($313,$arraydecay695,$arraydecay696,-1,0);var $arraydecay701=(($unpron_phonemes)&4294967295);var $arraydecay702=(($prefix_phonemes)&4294967295);var $arraydecay703=(($phonemes)&4294967295);var $call704=_snprintf(((_word_phonemes)&4294967295),160,((__str6549)&4294967295),allocate([$arraydecay701,0,0,0,$arraydecay702,0,0,0,$arraydecay703,0,0,0],["i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));HEAP8[(((_word_phonemes+159)&4294967295))]=0;__label__=192;break $if_then651$$lor_lhs_false649$253;}}while(0);$if_then651$$if_end705$256:do{if(__label__==181){var $298=$tr_addr;var $langopts652=(($298)&4294967295);var $param=(($langopts652+24)&4294967295);var $arrayidx653=(($param+12)&4294967295);var $299=HEAP32[(($arrayidx653)>>2)];var $tobool654=((($299))|0)!=0;if($tobool654){__label__=183;;}else{__label__=182;;}
67961 $if_then658$$lor_lhs_false655$258:do{if(__label__==182){var $300=$prefix_type;var $and656=($300)&65536;var $tobool657=((($and656))|0)!=0;if($tobool657){__label__=183;break $if_then658$$lor_lhs_false655$258;}
67962 var $arraydecay684=(($unpron_phonemes)&4294967295);var $arraydecay685=(($prefix_phonemes)&4294967295);var $arraydecay686=(($phonemes)&4294967295);var $call687=_snprintf(((_word_phonemes)&4294967295),160,((__str6549)&4294967295),allocate([$arraydecay684,0,0,0,$arraydecay685,0,0,0,$arraydecay686,0,0,0],["i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));HEAP8[(((_word_phonemes+159)&4294967295))]=0;var $312=$tr_addr;var $arraydecay688=(($dictionary_flags)&4294967295);__Z13SetWordStressP10TranslatorPcPjii($312,((_word_phonemes)&4294967295),$arraydecay688,-1,0);__label__=192;break $if_then651$$if_end705$256;}}while(0);var $301=$tr_addr;var $arraydecay660=(($phonemes)&4294967295);var $arraydecay661=(($dictionary_flags)&4294967295);__Z13SetWordStressP10TranslatorPcPjii($301,$arraydecay660,$arraydecay661,3,0);$ix=0;var $arraydecay662=(($prefix_phonemes)&4294967295);$p659=$arraydecay662;var $302=$p659;var $303=HEAP8[($302)];var $conv66424=(tempInt=(($303)),(tempInt>=128?tempInt-256:tempInt));var $cmp66525=((($conv66424))|0)!=0;if($cmp66525){__label__=184;;}else{__label__=189;;}
67963 $for_body666$$for_end677$262:do{if(__label__==184){while(1){var $304=$p659;var $305=HEAP8[($304)];var $conv667=(tempInt=(($305)),(tempInt>=128?tempInt-256:tempInt));var $cmp668=((($conv667))|0)==6;if($cmp668){__label__=185;;}else{__label__=188;;}
67964 if(__label__==185){var $306=$ix;var $cmp670=((($306))|0)==0;if($cmp670){__label__=186;;}else{__label__=187;;}
67965 if(__label__==186){$ix=1;;}
67966 else if(__label__==187){var $307=$p659;HEAP8[($307)]=5;;}}
67967 var $308=$p659;var $incdec_ptr676=(($308+1)&4294967295);$p659=$incdec_ptr676;var $309=$p659;var $310=HEAP8[($309)];var $conv664=(tempInt=(($310)),(tempInt>=128?tempInt-256:tempInt));var $cmp665=((($conv664))|0)!=0;if($cmp665){__label__=184;continue;}else{__label__=189;break $for_body666$$for_end677$262;}}}}while(0);var $arraydecay678=(($unpron_phonemes)&4294967295);var $arraydecay679=(($prefix_phonemes)&4294967295);var $arraydecay680=(($phonemes)&4294967295);var $call681=_snprintf(((_word_phonemes)&4294967295),160,((__str6549)&4294967295),allocate([$arraydecay678,0,0,0,$arraydecay679,0,0,0,$arraydecay680,0,0,0],["i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));HEAP8[(((_word_phonemes+159)&4294967295))]=0;var $311=$tr_addr;var $arraydecay682=(($dictionary_flags)&4294967295);__Z13SetWordStressP10TranslatorPcPjii($311,((_word_phonemes)&4294967295),$arraydecay682,-1,0);;}}while(0);var $arrayidx706=(($end_phonemes)&4294967295);var $314=HEAP8[($arrayidx706)];var $conv707=(tempInt=(($314)),(tempInt>=128?tempInt-256:tempInt));var $cmp708=((($conv707))|0)!=0;if($cmp708){__label__=193;;}else{__label__=194;;}
67968 if(__label__==193){var $call710=_strlen(((_word_phonemes)&4294967295));$ix=$call710;var $315=$ix;var $sub711=((159-($315))&4294967295);var $arrayidx712=(($end_phonemes+$sub711)&4294967295);HEAP8[($arrayidx712)]=0;var $316=$ix;var $arrayidx713=((_word_phonemes+$316)&4294967295);var $arraydecay714=(($end_phonemes)&4294967295);var $call715=_strcpy($arrayidx713,$arraydecay714);;}
67969 var $317=$wflags;var $and717=($317)&16;var $tobool718=((($and717))|0)!=0;if($tobool718){__label__=195;;}else{__label__=196;;}
67970 if(__label__==195){var $arrayidx720=(($dictionary_flags)&4294967295);var $318=HEAP32[(($arrayidx720)>>2)];var $and721=($318)&-268435457;HEAP32[(($arrayidx720)>>2)]=$and721;;}
67971 var $319=$wflags;var $and723=($319)&128;var $tobool724=((($and723))|0)!=0;if($tobool724){__label__=197;;}else{__label__=199;;}
67972 $land_lhs_true725$$if_else730$279:do{if(__label__==197){var $320=$tr_addr;var $langopts726=(($320)&4294967295);var $stress_flags=(($langopts726+12)&4294967295);var $321=HEAP32[(($stress_flags)>>2)];var $and727=($321)&1048576;var $tobool728=((($and727))|0)!=0;if(!($tobool728)){__label__=199;break $land_lhs_true725$$if_else730$279;}
67973 var $322=$tr_addr;__Z16ChangeWordStressP10TranslatorPci($322,((_word_phonemes)&4294967295),3);__label__=208;break $land_lhs_true725$$if_else730$279;}}while(0);$if_end761$$if_else730$282:do{if(__label__==199){var $323=$wflags;var $and731=($323)&3072;var $tobool732=((($and731))|0)!=0;if($tobool732){__label__=200;;}else{__label__=202;;}
67974 if(__label__==200){var $324=$tr_addr;__Z16ChangeWordStressP10TranslatorPci($324,((_word_phonemes)&4294967295),6);var $325=$wflags;var $and734=($325)&2048;var $tobool735=((($and734))|0)!=0;if(!($tobool735)){__label__=208;break $if_end761$$if_else730$282;}
67975 var $arrayidx737=(($dictionary_flags)&4294967295);var $326=HEAP32[(($arrayidx737)>>2)];var $or738=($326)|268435456;HEAP32[(($arrayidx737)>>2)]=$or738;;}
67976 else if(__label__==202){var $327=HEAP32[((_dictionary_skipwords)>>2)];var $328=$wtab_addr;var $arrayidx741=(($328+12*$327)&4294967295);var $flags742=(($arrayidx741)&4294967295);var $329=HEAP32[(($flags742)>>2)];var $and743=($329)&16;var $tobool744=((($and743))|0)!=0;if(!($tobool744)){__label__=208;break $if_end761$$if_else730$282;}
67977 var $arrayidx746=(($dictionary_flags)&4294967295);var $330=HEAP32[(($arrayidx746)>>2)];var $and747=($330)&6144;var $tobool748=((($and747))|0)!=0;if($tobool748){__label__=204;;}else{__label__=205;;}
67978 if(__label__==204){var $331=$tr_addr;__Z16ChangeWordStressP10TranslatorPci($331,((_word_phonemes)&4294967295),4);;}
67979 else if(__label__==205){var $arrayidx751=(($dictionary_flags)&4294967295);var $332=HEAP32[(($arrayidx751)>>2)];var $and752=($332)&8192;var $tobool753=((($and752))|0)!=0;if(!($tobool753)){__label__=208;break $if_end761$$if_else730$282;}
67980 var $_b=HEAPU8[(__ZL18any_stressed_words_b)];var $333=((($_b))&1);var $tobool755=((($333))|0)!=0;if(!($tobool755)){__label__=208;break $if_end761$$if_else730$282;}
67981 var $334=$tr_addr;__Z16ChangeWordStressP10TranslatorPci($334,((_word_phonemes)&4294967295),3);;}}}}while(0);var $335=$end_type;var $and762=($335)&8192;var $tobool763=((($and762))|0)!=0;if($tobool763){__label__=209;;}else{__label__=210;;}
67982 if(__label__==209){var $336=$tr_addr;var $expect_verb765=(($336+8272)&4294967295);HEAP32[(($expect_verb765)>>2)]=2;var $337=$tr_addr;var $expect_verb_s=(($337+8280)&4294967295);HEAP32[(($expect_verb_s)>>2)]=2;;}
67983 var $arrayidx767=(($dictionary_flags+4)&4294967295);var $338=HEAP32[(($arrayidx767)>>2)];var $and768=($338)&8;var $tobool769=((($and768))|0)!=0;if($tobool769){__label__=211;;}else{__label__=212;;}
67984 $if_then770$$if_else772$298:do{if(__label__==211){var $339=$tr_addr;var $expect_past=(($339+8276)&4294967295);HEAP32[(($expect_past)>>2)]=3;var $340=$tr_addr;var $expect_verb771=(($340+8272)&4294967295);HEAP32[(($expect_verb771)>>2)]=0;var $341=$tr_addr;var $expect_noun=(($341+8284)&4294967295);HEAP32[(($expect_noun)>>2)]=0;;}
67985 else if(__label__==212){var $arrayidx773=(($dictionary_flags+4)&4294967295);var $342=HEAP32[(($arrayidx773)>>2)];var $and774=($342)&1;var $tobool775=((($and774))|0)!=0;if($tobool775){__label__=213;;}else{__label__=214;;}
67986 if(__label__==213){var $343=$tr_addr;var $expect_verb777=(($343+8272)&4294967295);HEAP32[(($expect_verb777)>>2)]=2;var $344=$tr_addr;var $expect_verb_s778=(($344+8280)&4294967295);HEAP32[(($expect_verb_s778)>>2)]=0;var $345=$tr_addr;var $expect_noun779=(($345+8284)&4294967295);HEAP32[(($expect_noun779)>>2)]=0;;}
67987 else if(__label__==214){var $arrayidx781=(($dictionary_flags+4)&4294967295);var $346=HEAP32[(($arrayidx781)>>2)];var $and782=($346)&2;var $tobool783=((($and782))|0)!=0;if($tobool783){__label__=215;;}else{__label__=216;;}
67988 if(__label__==215){var $347=$tr_addr;var $expect_verb785=(($347+8272)&4294967295);HEAP32[(($expect_verb785)>>2)]=0;var $348=$tr_addr;var $expect_verb_s786=(($348+8280)&4294967295);HEAP32[(($expect_verb_s786)>>2)]=2;var $349=$tr_addr;var $expect_past787=(($349+8276)&4294967295);HEAP32[(($expect_past787)>>2)]=0;var $350=$tr_addr;var $expect_noun788=(($350+8284)&4294967295);HEAP32[(($expect_noun788)>>2)]=0;;}
67989 else if(__label__==216){var $arrayidx790=(($dictionary_flags+4)&4294967295);var $351=HEAP32[(($arrayidx790)>>2)];var $and791=($351)&4;var $tobool792=((($and791))|0)!=0;if(!($tobool792)){__label__=218;break $if_then770$$if_else772$298;}
67990 var $352=$tr_addr;var $expect_noun794=(($352+8284)&4294967295);HEAP32[(($expect_noun794)>>2)]=2;var $353=$tr_addr;var $expect_verb795=(($353+8272)&4294967295);HEAP32[(($expect_verb795)>>2)]=0;var $354=$tr_addr;var $expect_verb_s796=(($354+8280)&4294967295);HEAP32[(($expect_verb_s796)>>2)]=0;var $355=$tr_addr;var $expect_past797=(($355+8276)&4294967295);HEAP32[(($expect_past797)>>2)]=0;;}}}}while(0);var $356=HEAP32[(($wordx)>>2)];var $arrayidx802=(($356)&4294967295);var $357=HEAP8[($arrayidx802)];var $conv803=(tempInt=(($357)),(tempInt>=128?tempInt-256:tempInt));var $cmp804=((($conv803))|0)!=0;if($cmp804){__label__=219;;}else{__label__=228;;}
67991 $land_lhs_true805$$if_end834$309:do{if(__label__==219){var $arrayidx806=(($dictionary_flags+4)&4294967295);var $358=HEAP32[(($arrayidx806)>>2)];var $and807=($358)&256;var $tobool808=((($and807))|0)!=0;if($tobool808){__label__=228;break $land_lhs_true805$$if_end834$309;}
67992 var $359=$tr_addr;var $expect_verb810=(($359+8272)&4294967295);var $360=HEAP32[(($expect_verb810)>>2)];var $cmp811=((($360))|0)>0;if($cmp811){__label__=221;;}else{__label__=222;;}
67993 if(__label__==221){var $361=$tr_addr;var $expect_verb813=(($361+8272)&4294967295);var $362=HEAP32[(($expect_verb813)>>2)];var $dec814=((($362)-1)&4294967295);HEAP32[(($expect_verb813)>>2)]=$dec814;;}
67994 var $363=$tr_addr;var $expect_verb_s816=(($363+8280)&4294967295);var $364=HEAP32[(($expect_verb_s816)>>2)];var $cmp817=((($364))|0)>0;if($cmp817){__label__=223;;}else{__label__=224;;}
67995 if(__label__==223){var $365=$tr_addr;var $expect_verb_s819=(($365+8280)&4294967295);var $366=HEAP32[(($expect_verb_s819)>>2)];var $dec820=((($366)-1)&4294967295);HEAP32[(($expect_verb_s819)>>2)]=$dec820;;}
67996 var $367=$tr_addr;var $expect_noun822=(($367+8284)&4294967295);var $368=HEAP32[(($expect_noun822)>>2)];var $cmp823=((($368))|0)>0;if($cmp823){__label__=225;;}else{__label__=226;;}
67997 if(__label__==225){var $369=$tr_addr;var $expect_noun825=(($369+8284)&4294967295);var $370=HEAP32[(($expect_noun825)>>2)];var $dec826=((($370)-1)&4294967295);HEAP32[(($expect_noun825)>>2)]=$dec826;;}
67998 var $371=$tr_addr;var $expect_past828=(($371+8276)&4294967295);var $372=HEAP32[(($expect_past828)>>2)];var $cmp829=((($372))|0)>0;if(!($cmp829)){__label__=228;break $land_lhs_true805$$if_end834$309;}
67999 var $373=$tr_addr;var $expect_past831=(($373+8276)&4294967295);var $374=HEAP32[(($expect_past831)>>2)];var $dec832=((($374)-1)&4294967295);HEAP32[(($expect_past831)>>2)]=$dec832;;}}while(0);var $375=$word_length;var $cmp835=((($375))|0)==1;if($cmp835){__label__=229;;}else{__label__=232;;}
68000 $land_lhs_true836$$if_end846$323:do{if(__label__==229){var $376=$tr_addr;var $translator_name=(($376+280)&4294967295);var $377=HEAP32[(($translator_name)>>2)];var $cmp837=((($377))|0)==25966;if(!($cmp837)){__label__=232;break $land_lhs_true836$$if_end846$323;}
68001 var $378=HEAP32[(($first_char)>>2)];var $call839=_iswalpha($378);var $tobool840=((($call839))|0)!=0;var $379=HEAP32[(($first_char)>>2)];var $cmp842=((($379))|0)!=105;var $or_cond3=($tobool840)&($cmp842);if(!($or_cond3)){__label__=232;break $land_lhs_true836$$if_end846$323;}
68002 var $arrayidx844=(($dictionary_flags)&4294967295);var $380=HEAP32[(($arrayidx844)>>2)];var $or845=($380)|16777216;HEAP32[(($arrayidx844)>>2)]=$or845;;}}while(0);var $381=$tr_addr;var $langopts847=(($381)&4294967295);var $param848=(($langopts847+24)&4294967295);var $arrayidx849=(($param848+60)&4294967295);var $382=HEAP32[(($arrayidx849)>>2)];var $and850=($382)&2;var $tobool851=((($and850))|0)!=0;if($tobool851){__label__=233;;}else{__label__=235;;}
68003 $land_lhs_true852$$if_end858$328:do{if(__label__==233){var $arrayidx853=(($dictionary_flags)&4294967295);var $383=HEAP32[(($arrayidx853)>>2)];var $and854=($383)&3145728;var $cmp855=((($and854))|0)!=0;if(!($cmp855)){__label__=235;break $land_lhs_true852$$if_end858$328;}
68004 var $384=$tr_addr;var $arrayidx857=(($dictionary_flags)&4294967295);var $385=HEAP32[(($arrayidx857)>>2)];__Z22ApplySpecialAttribute2P10TranslatorPci($384,((_word_phonemes)&4294967295),$385);;}}while(0);var $386=$was_unpronouncable;var $arrayidx859=(($dictionary_flags)&4294967295);var $387=HEAP32[(($arrayidx859)>>2)];var $or860=($387)|($386);HEAP32[(($arrayidx859)>>2)]=$or860;var $388=$word_start_addr;var $arraydecay861=(($word_copy2)&4294967295);var $389=$word_copy_length;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$arraydecay861;$dest$=$388;$stop$=$src$+$389;if(($dest$%4)==($src$%4)&&$389>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
68005 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
68006 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $arrayidx862=(($dictionary_flags)&4294967295);var $390=HEAP32[(($arrayidx862)>>2)];$retval=$390;;}}while(0);var $391=$retval;STACKTOP=__stackBase__;return $391;return null;}
68007 function __ZL17CheckDottedAbbrevPcP8WORD_TAB($word1,$wtab){var __stackBase__=STACKTOP;STACKTOP+=84;_memset(__stackBase__,0,84);var __label__;var $word1_addr;var $wtab_addr;var $wc=__stackBase__;var $count;var $nbytes;var $ok;var $ix;var $word;var $wbuf;var $word_buf=__stackBase__+4;$word1_addr=$word1;$wtab_addr=$wtab;$count=0;var $0=$word1_addr;$word=$0;var $arraydecay=(($word_buf)&4294967295);$wbuf=$arraydecay;$ix=0;;$for_cond$2:while(1){$ok=0;var $1=$word;var $call=__Z7utf8_inPiPKc($wc,$1);$nbytes=$call;var $2=$nbytes;var $3=$word;var $arrayidx=(($3+$2)&4294967295);var $4=HEAP8[($arrayidx)];var $conv=(tempInt=(($4)),(tempInt>=128?tempInt-256:tempInt));var $cmp=((($conv))|0)==32;if($cmp){__label__=2;;}else{__label__=11;;}
68008 $land_lhs_true$$if_end27$4:do{if(__label__==2){var $5=HEAP32[(($wc)>>2)];var $call1=__Z7IsAlphaj($5);var $tobool=((($call1))|0)!=0;if(!($tobool)){__label__=11;break $land_lhs_true$$if_end27$4;}
68009 var $6=$nbytes;var $add=((($6)+1)&4294967295);var $7=$word;var $arrayidx2=(($7+$add)&4294967295);var $8=HEAP8[($arrayidx2)];var $conv3=(tempInt=(($8)),(tempInt>=128?tempInt-256:tempInt));var $cmp4=((($conv3))|0)==46;if($cmp4){__label__=4;;}else{__label__=8;;}
68010 if(__label__==4){var $9=$nbytes;var $add6=((($9)+2)&4294967295);var $10=$word;var $arrayidx7=(($10+$add6)&4294967295);var $11=HEAP8[($arrayidx7)];var $conv8=(tempInt=(($11)),(tempInt>=128?tempInt-256:tempInt));var $cmp9=((($conv8))|0)==32;if($cmp9){__label__=5;;}else{__label__=6;;}
68011 if(__label__==5){$ok=1;__label__=12;break $land_lhs_true$$if_end27$4;}
68012 else if(__label__==6){var $12=$nbytes;var $add11=((($12)+2)&4294967295);var $13=$word;var $arrayidx12=(($13+$add11)&4294967295);var $14=HEAP8[($arrayidx12)];var $conv13=(tempInt=(($14)),(tempInt>=128?tempInt-256:tempInt));var $cmp14=((($conv13))|0)==39;if(!($cmp14)){__label__=11;break $land_lhs_true$$if_end27$4;}
68013 var $15=$nbytes;var $add16=((($15)+2)&4294967295);$nbytes=$add16;$ok=2;__label__=12;break $land_lhs_true$$if_end27$4;}}
68014 else if(__label__==8){var $16=$count;var $cmp19=((($16))|0)>0;if(!($cmp19)){__label__=11;break $land_lhs_true$$if_end27$4;}
68015 var $17=$nbytes;var $18=$word;var $arrayidx21=(($18+$17)&4294967295);var $19=HEAP8[($arrayidx21)];var $conv22=(tempInt=(($19)),(tempInt>=128?tempInt-256:tempInt));var $cmp23=((($conv22))|0)==32;if(!($cmp23)){__label__=11;break $land_lhs_true$$if_end27$4;}
68016 $ok=2;__label__=12;break $land_lhs_true$$if_end27$4;}}}while(0);if(__label__==11){var $_pr=$ok;var $cmp28=((($_pr))|0)==0;if($cmp28){__label__=17;break $for_cond$2;}}
68017 $ix=0;var $20=$ix;var $21=$nbytes;var $cmp324=((($20))|0)<((($21))|0);if($cmp324){__label__=13;;}else{__label__=14;;}
68018 $for_body$$for_end$19:do{if(__label__==13){while(1){var $22=$ix;var $23=$word;var $arrayidx33=(($23+$22)&4294967295);var $24=HEAP8[($arrayidx33)];var $25=$wbuf;var $incdec_ptr=(($25+1)&4294967295);$wbuf=$incdec_ptr;HEAP8[($25)]=$24;var $26=$ix;var $inc=((($26)+1)&4294967295);$ix=$inc;var $27=$ix;var $28=$nbytes;var $cmp32=((($27))|0)<((($28))|0);if($cmp32){__label__=13;continue;}else{__label__=14;break $for_body$$for_end$19;}}}}while(0);var $29=$count;var $inc34=((($29)+1)&4294967295);$count=$inc34;var $30=$ok;var $cmp35=((($30))|0)==2;var $31=$nbytes;if($cmp35){__label__=15;break $for_cond$2;}
68019 var $add38=((($31)+3)&4294967295);var $33=$word;var $add_ptr39=(($33+$add38)&4294967295);$word=$add_ptr39;__label__=1;continue $for_cond$2;}
68020 if(__label__==15){var $32=$word;var $add_ptr=(($32+$31)&4294967295);$word=$add_ptr;;}
68021 var $34=$count;var $cmp41=((($34))|0)>1;if($cmp41){__label__=18;;}else{__label__=21;;}
68022 if(__label__==18){var $35=$wbuf;var $arraydecay43=(($word_buf)&4294967295);var $sub_ptr_lhs_cast=($35);var $sub_ptr_rhs_cast=($arraydecay43);var $sub_ptr_sub=((($sub_ptr_lhs_cast)-($sub_ptr_rhs_cast))&4294967295);$ix=$sub_ptr_sub;var $36=$word1_addr;var $arraydecay44=(($word_buf)&4294967295);var $37=$ix;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$arraydecay44;$dest$=$36;$stop$=$src$+$37;if(($dest$%4)==($src$%4)&&$37>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
68023 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
68024 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $38=$ix;var $39=$word1_addr;var $arrayidx452=(($39+$38)&4294967295);var $40=$word;var $cmp463=((($arrayidx452))>>>0)<((($40))>>>0);if($cmp463){__label__=19;;}else{__label__=20;;}
68025 $while_body$$while_end$29:do{if(__label__==19){while(1){var $41=$ix;var $inc47=((($41)+1)&4294967295);$ix=$inc47;var $42=$word1_addr;var $arrayidx48=(($42+$41)&4294967295);HEAP8[($arrayidx48)]=32;var $43=$ix;var $44=$word1_addr;var $arrayidx45=(($44+$43)&4294967295);var $45=$word;var $cmp46=((($arrayidx45))>>>0)<((($45))>>>0);if($cmp46){__label__=19;continue;}else{__label__=20;break $while_body$$while_end$29;}}}}while(0);var $46=$count;var $sub=((($46)-1)&4294967295);var $mul=((($sub)*2)&4294967295);HEAP32[((_dictionary_skipwords)>>2)]=$mul;;}
68026 var $47=$count;STACKTOP=__stackBase__;return $47;return null;}
68027 function __ZL22SpeakIndividualLettersP10TranslatorPcS1_i($tr,$word,$phonemes,$spell_word){;var __label__;var __lastLabel__=null;var $retval;var $tr_addr;var $word_addr;var $phonemes_addr;var $spell_word_addr;var $posn;var $capitals;var $non_initial;$tr_addr=$tr;$word_addr=$word;$phonemes_addr=$phonemes;$spell_word_addr=$spell_word;$posn=0;$capitals=0;$non_initial=0;var $0=$spell_word_addr;var $cmp=((($0))|0)>2;if($cmp){__label__=1;;}else{__label__=2;;}
68028 if(__label__==1){$capitals=2;;}
68029 $while_cond$4:while(1){var $1=$word_addr;var $2=HEAP8[($1)];var $conv=(tempInt=(($2)),(tempInt>=128?tempInt-256:tempInt));var $cmp1=((($conv))|0)!=32;if(!($cmp1)){__label__=3;break $while_cond$4;}
68030 var $4=$word_addr;var $5=HEAP8[($4)];var $conv2=(tempInt=(($5)),(tempInt>=128?tempInt-256:tempInt));var $cmp3=((($conv2))|0)!=0;var $6=$tr_addr;if($cmp3){__lastLabel__=4;;}else{__lastLabel__=4;__label__=7;break $while_cond$4;}
68031 var $7=$word_addr;var $8=$phonemes_addr;var $9=$capitals;var $10=$non_initial;var $or=($10)|($9);var $call=__Z15TranslateLetterP10TranslatorPcS1_i($6,$7,$8,$or);var $11=$word_addr;var $add_ptr=(($11+$call)&4294967295);$word_addr=$add_ptr;var $12=$posn;var $inc=((($12)+1)&4294967295);$posn=$inc;$non_initial=1;var $13=$phonemes_addr;var $arrayidx=(($13)&4294967295);var $14=HEAP8[($arrayidx)];var $conv4=(tempInt=(($14)),(tempInt>=128?tempInt-256:tempInt));var $cmp5=((($conv4))|0)==21;if($cmp5){__label__=6;break $while_cond$4;}else{__label__=2;continue $while_cond$4;}}
68032 $land_end_thread$$while_end$$if_then6$8:do{if(__label__==3){var $3=$tr_addr;__lastLabel__=3;__label__=7;break $land_end_thread$$while_end$$if_then6$8;}
68033 else if(__label__==6){var $15=$phonemes_addr;var $call7=_strcpy(((_word_phonemes)&4294967295),$15);$retval=0;__label__=8;break $land_end_thread$$while_end$$if_then6$8;}}while(0);if(__label__==7){var $16=__lastLabel__==3?$3:($6);var $17=$phonemes_addr;var $18=$spell_word_addr;var $19=$posn;__Z17SetSpellingStressP10TranslatorPcii($16,$17,$18,$19);var $20=$word_addr;$retval=$20;;}
68034 var $21=$retval;;return $21;return null;}
68035 function __Z14SetTranslator2PKc($new_language){;var __label__;var $new_language_addr;var $new_phoneme_tab;$new_language_addr=$new_language;var $0=$new_language_addr;var $call=__Z22SelectPhonemeTableNamePKc($0);$new_phoneme_tab=$call;var $cmp=((($call))|0)>=0;if($cmp){__label__=1;;}else{__label__=7;;}
68036 $if_then$$if_end14$2:do{if(__label__==1){var $1=HEAP32[((_translator2)>>2)];var $cmp1=((($1))|0)!=0;if($cmp1){__label__=2;;}else{__label__=5;;}
68037 if(__label__==2){var $2=$new_language_addr;var $call2=_strcmp($2,((__ZL20translator2_language)&4294967295));var $cmp3=((($call2))|0)!=0;var $3=HEAP32[((_translator2)>>2)];if($cmp3){__label__=3;;}else{__label__=4;;}
68038 if(__label__==3){__Z16DeleteTranslatorP10Translator($3);HEAP32[((_translator2)>>2)]=0;;}
68039 else if(__label__==4){var $cmp5=((($3))|0)==0;if(!($cmp5)){__label__=7;break $if_then$$if_end14$2;}}}
68040 var $4=$new_language_addr;var $call7=__Z16SelectTranslatorPKc($4);HEAP32[((_translator2)>>2)]=$call7;var $5=$new_language_addr;var $call8=_strcpy(((__ZL20translator2_language)&4294967295),$5);var $6=HEAP32[((_translator2)>>2)];var $7=$new_language_addr;var $call9=__Z14LoadDictionaryP10TranslatorPKci($6,$7,0);var $cmp10=((($call9))|0)!=0;if(!($cmp10)){__label__=7;break $if_then$$if_end14$2;}
68041 var $8=HEAP32[((_voice)>>2)];var $phoneme_tab_ix=(($8+40)&4294967295);var $9=HEAP32[(($phoneme_tab_ix)>>2)];__Z18SelectPhonemeTablei($9);$new_phoneme_tab=-1;HEAP8[(((__ZL20translator2_language)&4294967295))]=0;;}}while(0);var $10=$new_phoneme_tab;;return $10;return null;}
68042 function __Z15TranslateClauseP10TranslatorP7__sFILEPKvPiPPc($tr,$f_text,$vp_input,$tone_out,$voice_change){var __stackBase__=STACKTOP;STACKTOP+=6500;_memset(__stackBase__,0,6500);var __label__;var __lastLabel__=null;var $retval;var $tr_addr;var $f_text_addr;var $vp_input_addr;var $tone_out_addr;var $voice_change_addr;var $ix;var $c;var $cc=__stackBase__;var $source_index=__stackBase__+4;var $prev_source_index;var $source_index_word;var $prev_in=__stackBase__+8;var $prev_out=__stackBase__+12;var $prev_out2;var $prev_in2;var $prev_in_save;var $next_in=__stackBase__+16;var $next_in_nbytes;var $char_inserted=__stackBase__+20;var $clause_pause;var $pre_pause_add;var $word_mark;var $all_upper_case;var $finished;var $single_quoted;var $phoneme_mode;var $dict_flags;var $word_flags;var $next_word_flags;var $embedded_count;var $letter_count;var $space_inserted;var $syllable_marked;var $decimal_sep_count;var $word;var $p;var $j;var $k;var $n_digits;var $individual_digits;var $charix_top=__stackBase__+24;var $charix=__stackBase__+28;var $words=__stackBase__+1436;var $word_count;var $sbuf=__stackBase__+5036;var $terminator;var $tone;var $tone2=__stackBase__+5736;var $srcix;var $next2_in=__stackBase__+5740;var $nx;var $c_temp=__stackBase__+5744;var $pn;var $pw;var $nw;var $number_buf=__stackBase__+5748;var $num_wtab=__stackBase__+5900;var $p2;$tr_addr=$tr;$f_text_addr=$f_text;$vp_input_addr=$vp_input;$tone_out_addr=$tone_out;$voice_change_addr=$voice_change;HEAP32[(($source_index)>>2)]=0;$prev_source_index=0;$source_index_word=0;HEAP32[(($prev_out)>>2)]=32;$prev_in2=0;$prev_in_save=0;HEAP32[(($char_inserted)>>2)]=0;$pre_pause_add=0;$word_mark=0;$all_upper_case=1;$phoneme_mode=0;$dict_flags=0;$embedded_count=0;$letter_count=0;$space_inserted=0;$syllable_marked=0;$decimal_sep_count=0;HEAP32[(($charix_top)>>2)]=0;$word_count=0;var $0=$tr_addr;var $cmp=((($0))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
68043 $if_then$$if_end$2:do{if(__label__==1){$retval=0;;}
68044 else if(__label__==2){var $1=$vp_input_addr;HEAP32[((_p_textinput)>>2)]=$1;var $2=$vp_input_addr;var $3=$2;HEAP32[((_p_wchar_input)>>2)]=$3;HEAP32[((__ZL11embedded_ix)>>2)]=0;HEAP32[((__ZL13embedded_read)>>2)]=0;HEAP32[((_pre_pause)>>2)]=0;HEAP8[(__ZL18any_stressed_words_b)]=0;var $4=HEAP32[((_count_characters)>>2)];HEAP32[((_clause_start_char)>>2)]=$4;var $cmp1=((($4))|0)<0;if($cmp1){__label__=3;;}else{__label__=4;;}
68045 if(__label__==3){HEAP32[((_clause_start_char)>>2)]=0;;}
68046 var $5=HEAP32[((_count_words)>>2)];var $add=((($5)+1)&4294967295);HEAP32[((_clause_start_word)>>2)]=$add;$ix=0;;$for_body$8:while(1){var $6=$ix;var $arrayidx=(($charix+$6*2)&4294967295);HEAP16[(($arrayidx)>>1)]=0;var $7=$ix;var $inc=((($7)+1)&4294967295);$ix=$inc;var $cmp4=((($inc))|0)<700;if($cmp4){__label__=5;continue $for_body$8;}else{__label__=6;break $for_body$8;}}
68047 var $8=$tr_addr;var $9=$f_text_addr;var $arraydecay=(($charix)&4294967295);var $call=__Z10ReadClauseP10TranslatorP7__sFILEPcPsPiiS5_S3_($8,$9,((__ZL6source)&4294967295),$arraydecay,$charix_top,700,$tone2,((__ZZ15TranslateClauseP10TranslatorP7__sFILEPKvPiPPcE17voice_change_name)&4294967295));$terminator=$call;var $10=HEAP32[((_f_logespeak)>>2)];var $cmp5=((($10))|0)!=0;if($cmp5){__label__=7;;}else{__label__=11;;}
68048 $land_lhs_true$$if_end17$11:do{if(__label__==7){var $11=HEAP32[((_logging_type)>>2)];var $and=($11)&4;var $tobool=((($and))|0)!=0;if(!($tobool)){__label__=11;break $land_lhs_true$$if_end17$11;}
68049 var $12=HEAP32[((_f_logespeak)>>2)];var $13=$terminator;var $call7=_fprintf($12,((__str7550)&4294967295),allocate([$13,0,0,0],["i32",0,0,0],ALLOC_STACK));$p=((__ZL6source)&4294967295);var $14=$p;var $15=HEAP8[($14)];var $conv59=(tempInt=(($15)),(tempInt>=128?tempInt-256:tempInt));var $cmp960=((($conv59))|0)!=0;if($cmp960){__label__=9;;}else{__label__=10;;}
68050 $for_body10$$for_end14$14:do{if(__label__==9){while(1){var $16=$p;var $17=HEAP8[($16)];var $conv11=(tempInt=(($17)),(tempInt>=128?tempInt-256:tempInt));var $18=HEAP32[((_f_logespeak)>>2)];var $call12=_fputc($conv11,$18);var $19=$p;var $incdec_ptr=(($19+1)&4294967295);$p=$incdec_ptr;var $20=$p;var $21=HEAP8[($20)];var $conv=(tempInt=(($21)),(tempInt>=128?tempInt-256:tempInt));var $cmp9=((($conv))|0)!=0;if($cmp9){__label__=9;continue;}else{__label__=10;break $for_body10$$for_end14$14;}}}}while(0);var $22=HEAP32[((_f_logespeak)>>2)];var $23=_fwrite(((__str8551)&4294967295),10,1,$22);var $24=HEAP32[((_f_logespeak)>>2)];var $call16=_fflush($24);;}}while(0);$p=((__ZL6source)&4294967295);var $25=HEAP32[(($charix_top)>>2)];var $add18=((($25)+1)&4294967295);var $arrayidx19=(($charix+$add18*2)&4294967295);HEAP16[(($arrayidx19)>>1)]=0;var $26=HEAP32[(($charix_top)>>2)];var $add20=((($26)+2)&4294967295);var $arrayidx21=(($charix+$add20*2)&4294967295);HEAP16[(($arrayidx21)>>1)]=32767;var $27=HEAP32[(($charix_top)>>2)];var $add22=((($27)+3)&4294967295);var $arrayidx23=(($charix+$add22*2)&4294967295);HEAP16[(($arrayidx23)>>1)]=0;var $28=$terminator;var $and24=($28)&4095;var $mul=((($and24)*10)&4294967295);$clause_pause=$mul;var $29=$terminator;var $shr=($29)>>12;var $and25=($shr)&7;$tone=$and25;var $30=HEAP32[(($tone2)>>2)];var $cmp26=((($30))|0)!=0;if($cmp26){__label__=12;;}else{__label__=13;;}
68051 if(__label__==12){var $31=HEAP32[(($tone2)>>2)];$tone=$31;;}
68052 $p=((__ZL6source)&4294967295);;$for_cond29$22:while(1){var $32=$p;var $33=HEAP8[($32)];var $conv30=(tempInt=(($33)),(tempInt>=128?tempInt-256:tempInt));var $cmp31=((($conv30))|0)!=0;if(!($cmp31)){__label__=17;break $for_cond29$22;}
68053 var $34=$p;var $35=HEAP8[($34)];var $conv33=(tempInt=(($35)),(tempInt>=128?tempInt-256:tempInt));var $call34=__Z8isspace2j($conv33);var $tobool35=((($call34))|0)!=0;if(!($tobool35)){__label__=17;break $for_cond29$22;}
68054 var $36=$p;var $incdec_ptr39=(($36+1)&4294967295);$p=$incdec_ptr39;__label__=14;continue $for_cond29$22;}
68055 var $37=$p;var $38=HEAP8[($37)];var $conv41=(tempInt=(($38)),(tempInt>=128?tempInt-256:tempInt));var $cmp42=((($conv41))|0)==0;if($cmp42){__label__=18;;}else{__label__=21;;}
68056 if(__label__==18){var $39=HEAP32[((__ZL16max_clause_pause)>>2)];var $40=$clause_pause;var $sub=((($40)-($39))&4294967295);$clause_pause=$sub;var $41=$clause_pause;var $cmp44=((($41))|0)<0;if($cmp44){__label__=19;;}else{__label__=20;;}
68057 if(__label__==19){$clause_pause=0;;}
68058 var $42=$terminator;var $and47=($42)&-524289;$terminator=$and47;var $43=$clause_pause;var $44=HEAP32[((__ZL16max_clause_pause)>>2)];var $add48=((($44)+($43))&4294967295);HEAP32[((__ZL16max_clause_pause)>>2)]=$add48;;}
68059 else if(__label__==21){var $45=$clause_pause;HEAP32[((__ZL16max_clause_pause)>>2)]=$45;;}
68060 var $46=$terminator;var $47=$tr_addr;var $clause_terminator=(($47+8324)&4294967295);HEAP32[(($clause_terminator)>>2)]=$46;var $48=HEAP32[((_new_sentence)>>2)];var $tobool50=((($48))|0)!=0;if($tobool50){__label__=23;;}else{__label__=26;;}
68061 $if_then51$$if_end59$34:do{if(__label__==23){var $49=HEAP32[((_count_sentences)>>2)];var $inc52=((($49)+1)&4294967295);HEAP32[((_count_sentences)>>2)]=$inc52;var $50=HEAP32[((_skip_sentences)>>2)];var $cmp53=((($50))|0)>0;if(!($cmp53)){__label__=26;break $if_then51$$if_end59$34;}
68062 var $51=HEAP32[((_skip_sentences)>>2)];var $dec=((($51)-1)&4294967295);HEAP32[((_skip_sentences)>>2)]=$dec;var $52=HEAP32[((_skip_sentences)>>2)];var $cmp55=((($52))|0)==0;if(!($cmp55)){__label__=26;break $if_then51$$if_end59$34;}
68063 HEAP32[((_skipping_text)>>2)]=0;;}}while(0);var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=((_ph_list2)&4294967295);$stop$=$dest$+8;$value4$=0;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=0;}
68064 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
68065 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=0;};HEAP8[(((_ph_list2)&4294967295))]=10;HEAP32[((_n_ph_list2)>>2)]=1;var $53=$tr_addr;var $prev_last_stress=(($53+8288)&4294967295);HEAP32[(($prev_last_stress)>>2)]=0;var $54=$tr_addr;var $prepause_timeout=(($54+8312)&4294967295);HEAP32[(($prepause_timeout)>>2)]=0;var $55=$tr_addr;var $expect_verb=(($55+8272)&4294967295);HEAP32[(($expect_verb)>>2)]=0;var $56=$tr_addr;var $expect_noun=(($56+8284)&4294967295);HEAP32[(($expect_noun)>>2)]=0;var $57=$tr_addr;var $expect_past=(($57+8276)&4294967295);HEAP32[(($expect_past)>>2)]=0;var $58=$tr_addr;var $expect_verb_s=(($58+8280)&4294967295);HEAP32[(($expect_verb_s)>>2)]=0;var $59=$tr_addr;var $phonemes_repeat_count=(($59+652)&4294967295);HEAP32[(($phonemes_repeat_count)>>2)]=0;var $60=$tr_addr;var $end_stressed_vowel=(($60+8316)&4294967295);HEAP32[(($end_stressed_vowel)>>2)]=0;var $61=$tr_addr;var $prev_dict_flags=(($61+8320)&4294967295);HEAP32[(($prev_dict_flags)>>2)]=0;$word_count=0;$single_quoted=0;$word_flags=0;$next_word_flags=0;var $arrayidx60=(($sbuf)&4294967295);HEAP8[($arrayidx60)]=0;var $arrayidx61=(($sbuf+1)&4294967295);HEAP8[($arrayidx61)]=32;var $arrayidx62=(($sbuf+2)&4294967295);HEAP8[($arrayidx62)]=32;$ix=3;HEAP32[(($prev_in)>>2)]=32;var $62=$ix;var $conv63=((($62))&65535);var $arrayidx64=(($words)&4294967295);var $start=(($arrayidx64+4)&4294967295);HEAP16[(($start)>>1)]=$conv63;var $arrayidx65=(($words)&4294967295);var $flags=(($arrayidx65)&4294967295);HEAP32[(($flags)>>2)]=0;$finished=0;$j=0;var $63=$j;var $arrayidx6755=(($charix+$63*2)&4294967295);var $64=HEAP16[(($arrayidx6755)>>1)];var $conv6856=(tempInt=(($64)),(tempInt>=32768?tempInt-65536:tempInt));var $cmp6957=((($conv6856))|0)<=0;var $65=$j;if($cmp6957){__lastLabel__=26;__label__=27;;}else{__lastLabel__=26;__label__=28;;}
68066 $for_inc71$$for_end73$39:do{if(__label__==27){while(1){var $66=__lastLabel__==27?$69:($65);var $inc72=((($66)+1)&4294967295);$j=$inc72;var $67=$j;var $arrayidx67=(($charix+$67*2)&4294967295);var $68=HEAP16[(($arrayidx67)>>1)];var $conv68=(tempInt=(($68)),(tempInt>=32768?tempInt-65536:tempInt));var $cmp69=((($conv68))|0)<=0;var $69=$j;if($cmp69){__lastLabel__=27;__label__=27;continue;}else{__lastLabel__=27;__label__=28;break $for_inc71$$for_end73$39;}}}}while(0);var $_lcssa54=__lastLabel__==26?$65:($69);var $arrayidx74=(($charix+$_lcssa54*2)&4294967295);var $70=HEAP16[(($arrayidx74)>>1)];var $arrayidx75=(($words)&4294967295);var $sourceix=(($arrayidx75+6)&4294967295);HEAP16[(($sourceix)>>1)]=$70;$k=0;var $71=$j;var $arrayidx7651=(($charix+$71*2)&4294967295);var $72=HEAP16[(($arrayidx7651)>>1)];var $conv7752=(tempInt=(($72)),(tempInt>=32768?tempInt-65536:tempInt));var $cmp7853=((($conv7752))|0)!=0;if($cmp7853){__label__=29;;}else{__label__=32;;}
68067 $while_body$$while_end$43:do{if(__label__==29){while(1){var $73=$j;var $inc79=((($73)+1)&4294967295);$j=$inc79;var $arrayidx80=(($charix+$73*2)&4294967295);var $74=HEAP16[(($arrayidx80)>>1)];var $conv81=(tempInt=(($74)),(tempInt>=32768?tempInt-65536:tempInt));var $cmp82=((($conv81))|0)!=-1;if($cmp82){__label__=30;;}else{__label__=31;;}
68068 if(__label__==30){var $75=$k;var $inc84=((($75)+1)&4294967295);$k=$inc84;;}
68069 var $76=$j;var $arrayidx76=(($charix+$76*2)&4294967295);var $77=HEAP16[(($arrayidx76)>>1)];var $conv77=(tempInt=(($77)),(tempInt>=32768?tempInt-65536:tempInt));var $cmp78=((($conv77))|0)!=0;if($cmp78){__label__=29;continue;}else{__label__=32;break $while_body$$while_end$43;}}}}while(0);var $78=$k;var $conv86=((($78))&255);var $arrayidx87=(($words)&4294967295);var $length=(($arrayidx87+10)&4294967295);HEAP8[($length)]=$conv86;;$while_cond88$50:while(1){var $79=$finished;var $tobool89=((($79))|0)!=0;if($tobool89){__label__=230;break $while_cond88$50;}
68070 var $80=$ix;var $cmp91=((($80))|0)<700;var $81=HEAP32[((_n_ph_list2)>>2)];var $cmp92=((($81))|0)<996;var $or_cond12=($cmp91)&($cmp92);if(!($or_cond12)){__label__=230;break $while_cond88$50;}
68071 var $82=HEAP32[(($prev_out)>>2)];$prev_out2=$82;var $83=$ix;var $sub94=((($83)-1)&4294967295);var $arrayidx95=(($sbuf+$sub94)&4294967295);var $call96=__Z8utf8_in2PiPKci($prev_out,$arrayidx95,1);var $84=$tr_addr;var $langopts=(($84)&4294967295);var $tone_numbers=(($langopts+250)&4294967295);var $85=HEAP8[($tone_numbers)];var $tobool97=(tempInt=(($85)),(tempInt>=128?tempInt-256:tempInt))!=0;if($tobool97){__label__=36;;}else{__label__=39;;}
68072 $land_lhs_true98$$if_end105$54:do{if(__label__==36){var $86=HEAP32[(($prev_out)>>2)];var $call99=__ZL9IsDigit09j($86);var $tobool100=((($call99))|0)!=0;if(!($tobool100)){__label__=39;break $land_lhs_true98$$if_end105$54;}
68073 var $87=$prev_out2;var $call102=__Z7IsAlphaj($87);var $tobool103=((($call102))|0)!=0;if(!($tobool103)){__label__=39;break $land_lhs_true98$$if_end105$54;}
68074 HEAP32[(($prev_out)>>2)]=97;;}}while(0);var $88=$prev_in_save;var $cmp106=((($88))|0)!=0;if($cmp106){__label__=40;;}else{__label__=41;;}
68075 $if_then107$$if_else108$59:do{if(__label__==40){var $89=$prev_in_save;HEAP32[(($prev_in)>>2)]=$89;$prev_in_save=0;;}
68076 else if(__label__==41){var $90=HEAPU32[(($source_index)>>2)];var $cmp109=((($90))>>>0)>0;if(!($cmp109)){__label__=43;break $if_then107$$if_else108$59;}
68077 var $91=HEAP32[(($prev_in)>>2)];$prev_in2=$91;var $92=HEAP32[(($source_index)>>2)];var $sub111=((($92)-1)&4294967295);var $arrayidx112=((__ZL6source+$sub111)&4294967295);var $call113=__Z8utf8_in2PiPKci($prev_in,$arrayidx112,1);;}}while(0);var $93=HEAP32[(($source_index)>>2)];$prev_source_index=$93;var $94=HEAP32[(($char_inserted)>>2)];var $tobool116=((($94))|0)!=0;if($tobool116){__label__=44;;}else{__label__=45;;}
68078 if(__label__==44){var $95=HEAP32[(($char_inserted)>>2)];$c=$95;HEAP32[(($char_inserted)>>2)]=0;;}
68079 else if(__label__==45){var $96=HEAP32[(($source_index)>>2)];var $arrayidx119=((__ZL6source+$96)&4294967295);var $call120=__Z7utf8_inPiPKc($cc,$arrayidx119);var $97=HEAP32[(($source_index)>>2)];var $add121=((($97)+($call120))&4294967295);HEAP32[(($source_index)>>2)]=$add121;var $98=HEAP32[(($cc)>>2)];$c=$98;;}
68080 var $99=HEAP32[(($source_index)>>2)];var $arrayidx123=((__ZL6source+$99)&4294967295);var $call124=__Z7utf8_inPiPKc($next_in,$arrayidx123);$next_in_nbytes=$call124;var $100=$c;if($100==0){__label__=47;;}
68081 else if($100==1){__label__=49;;}
68082 else{__label__=48;;}
68083 $lor_lhs_false$$if_end127_thread$$if_then131$68:do{if(__label__==47){$finished=1;$c=32;__label__=48;break $lor_lhs_false$$if_end127_thread$$if_then131$68;}}while(0);$lor_lhs_false$$if_then131$70:do{if(__label__==48){var $101=$c;var $102=HEAP8[(_ctrl_embedded)];var $conv129=(tempInt=(($102)),(tempInt>=128?tempInt-256:tempInt));var $cmp130=((($101))|0)==((($conv129))|0);if($cmp130){__label__=49;break $lor_lhs_false$$if_then131$70;}else{__label__=52;break $lor_lhs_false$$if_then131$70;}}}while(0);if(__label__==49){var $103=HEAP32[(($source_index)>>2)];var $sub132=((($103)-1)&4294967295);$srcix=$sub132;var $104=HEAP32[(($prev_in)>>2)];var $cmp133=((($104))|0)!=32;if($cmp133){__label__=50;;}else{__label__=51;;}
68084 if(__label__==50){$c=32;var $105=$c;$prev_in_save=$105;var $106=HEAP32[(($source_index)>>2)];var $dec135=((($106)-1)&4294967295);HEAP32[(($source_index)>>2)]=$dec135;;}
68085 else if(__label__==51){var $call137=__ZL15EmbeddedCommandRj($source_index);var $107=$embedded_count;var $add138=((($107)+($call137))&4294967295);$embedded_count=$add138;var $108=HEAP32[(($prev_in)>>2)];$prev_in_save=$108;var $109=$srcix;var $arrayidx139=((__ZL6source+$109)&4294967295);var $110=HEAP32[(($source_index)>>2)];var $111=$srcix;var $sub140=((($110)-($111))&4294967295);var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=$arrayidx139;$stop$=$dest$+$sub140;$value4$=32;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=32;}
68086 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
68087 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=32;};var $112=$srcix;HEAP32[(($source_index)>>2)]=$112;__label__=33;continue $while_cond88$50;}}
68088 var $113=HEAP32[((__ZL13option_sayas2)>>2)];var $cmp143=((($113))|0)==36;if($cmp143){__label__=53;;}else{__label__=58;;}
68089 $land_lhs_true144$$if_end153$78:do{if(__label__==53){var $114=$c;var $cmp145=((($114))|0)!=32;if(!($cmp145)){__label__=58;break $land_lhs_true144$$if_end153$78;}
68090 var $115=HEAP32[(($prev_in)>>2)];var $cmp147=((($115))|0)==32;if($cmp147){__label__=55;;}else{__label__=57;;}
68091 $land_lhs_true148$$if_end151$81:do{if(__label__==55){var $116=HEAP32[(($next_in)>>2)];var $cmp149=((($116))|0)==32;if(!($cmp149)){__label__=57;break $land_lhs_true148$$if_end151$81;}
68092 HEAP32[((__ZL13option_sayas2)>>2)]=20;;}}while(0);var $117=$c;var $call152=__Z9towlower2j($117);$c=$call152;;}}while(0);var $118=$phoneme_mode;var $tobool154=((($118))|0)!=0;if($tobool154){__label__=59;;}else{__label__=62;;}
68093 $if_then155$$if_else162$86:do{if(__label__==59){$all_upper_case=8;var $119=$c;var $cmp156=((($119))|0)==93;if(!($cmp156)){__label__=195;break $if_then155$$if_else162$86;}
68094 var $120=HEAP32[(($next_in)>>2)];var $cmp158=((($120))|0)==93;if(!($cmp158)){__label__=195;break $if_then155$$if_else162$86;}
68095 $phoneme_mode=0;var $121=HEAP32[(($source_index)>>2)];var $inc160=((($121)+1)&4294967295);HEAP32[(($source_index)>>2)]=$inc160;$c=32;;}
68096 else if(__label__==62){var $122=HEAP32[((__ZL13option_sayas2)>>2)];var $and163=($122)&240;var $cmp164=((($and163))|0)==64;if($cmp164){__label__=63;;}else{__label__=68;;}
68097 if(__label__==63){var $123=$c;var $call166=_iswdigit($123);var $tobool167=((($call166))|0)!=0;if($tobool167){__label__=64;;}else{__label__=66;;}
68098 if(__label__==64){var $124=HEAP32[((__ZL18count_sayas_digits)>>2)];var $inc169=((($124)+1)&4294967295);HEAP32[((__ZL18count_sayas_digits)>>2)]=$inc169;var $125=HEAP32[((__ZL18count_sayas_digits)>>2)];var $126=HEAP32[((__ZL13option_sayas2)>>2)];var $and170=($126)&15;var $cmp171=((($125))|0)>((($and170))|0);if(!($cmp171)){__label__=195;break $if_then155$$if_else162$86;}
68099 $c=32;$space_inserted=1;HEAP32[((__ZL18count_sayas_digits)>>2)]=0;;}
68100 else if(__label__==66){HEAP32[((__ZL18count_sayas_digits)>>2)]=0;var $127=HEAP32[(($prev_out)>>2)];var $call175=_iswdigit($127);var $tobool176=((($call175))|0)!=0;if(!($tobool176)){__label__=195;break $if_then155$$if_else162$86;}
68101 $c=32;$space_inserted=1;;}}
68102 else if(__label__==68){var $128=HEAP32[((__ZL13option_sayas2)>>2)];var $and181=($128)&16;var $cmp182=((($and181))|0)==0;if(!($cmp182)){__label__=195;break $if_then155$$if_else162$86;}
68103 var $129=$c;var $cmp184=((($129))|0)==146;var $130=$c;var $cmp186=((($130))|0)==180;var $or_cond=($cmp184)|($cmp186);var $131=$c;var $cmp188=((($131))|0)==8217;var $or_cond2=($or_cond)|($cmp188);var $132=$c;var $cmp190=((($132))|0)==8242;var $or_cond3=($or_cond2)|($cmp190);if($or_cond3){__label__=70;;}else{__label__=71;;}
68104 if(__label__==70){$c=39;;}
68105 var $133=$c;var $cmp193=((($133))|0)==8216;var $134=$c;var $cmp195=((($134))|0)==63;var $or_cond4=($cmp193)|($cmp195);if($or_cond4){__lastLabel__=71;__label__=72;;}else{__lastLabel__=71;__label__=76;;}
68106 $land_lhs_true196$$if_end203$103:do{if(__label__==72){var $135=HEAP32[(($prev_out)>>2)];var $call197=__Z7IsAlphaj($135);var $tobool198=((($call197))|0)!=0;if($tobool198){__label__=73;;}else{__label__=75;;}
68107 $land_lhs_true199$$if_end203thread_pre_split$105:do{if(__label__==73){var $136=HEAP32[(($next_in)>>2)];var $call200=__Z7IsAlphaj($136);var $tobool201=((($call200))|0)!=0;if(!($tobool201)){__label__=75;break $land_lhs_true199$$if_end203thread_pre_split$105;}
68108 $c=39;__label__=80;break $land_lhs_true196$$if_end203$103;}}while(0);var $_pr=$c;__lastLabel__=75;__label__=76;break $land_lhs_true196$$if_end203$103;}}while(0);$if_end210$$if_end203$109:do{if(__label__==76){var $137=__lastLabel__==75?$_pr:($134);var $cmp204=((($137))|0)==1328;if($cmp204){__label__=77;;}else{__label__=78;;}
68109 if(__label__==77){$c=32;var $138=$word_flags;var $or=($138)|1024;$word_flags=$or;;}
68110 else if(__label__==78){var $_pr15_pr=$c;var $cmp207=((($_pr15_pr))|0)==1367;if(!($cmp207)){__label__=80;break $if_end210$$if_end203$109;}
68111 $c=32;var $139=$word_flags;var $or209=($139)|131072;$word_flags=$or209;;}}}while(0);var $140=$tr_addr;var $141=HEAP32[(($source_index)>>2)];var $arrayidx211=((__ZL6source+$141)&4294967295);var $142=HEAP32[(($prev_in)>>2)];var $143=$c;var $144=HEAP32[(($next_in)>>2)];var $call212=__ZL13TranslateCharP10TranslatorPcijjPi($140,$arrayidx211,$142,$143,$144,$char_inserted);$c=$call212;var $cmp213=((($call212))|0)==8;if($cmp213){__label__=33;continue $while_cond88$50;}
68112 var $145=HEAP32[(($char_inserted)>>2)];var $tobool216=((($145))|0)!=0;if($tobool216){__label__=82;;}else{__label__=83;;}
68113 if(__label__==82){var $146=HEAP32[(($char_inserted)>>2)];HEAP32[(($next_in)>>2)]=$146;;}
68114 var $147=$c;var $call219=__Z7IsAlphaj($147);var $tobool220=((($call219))|0)!=0;if($tobool220){__label__=91;;}else{__label__=84;;}
68115 $if_end244$$land_lhs_true221$120:do{if(__label__==84){var $148=$c;var $call222=__Z7IsSpacej($148);var $tobool223=((($call222))|0)!=0;if($tobool223){__label__=91;break $if_end244$$land_lhs_true221$120;}
68116 var $149=$tr_addr;var $punct_within_word=(($149+704)&4294967295);var $150=HEAP32[(($punct_within_word)>>2)];var $151=$c;var $call225=_wcschr($150,$151);var $cmp226=((($call225))|0)==0;if(!($cmp226)){__label__=91;break $if_end244$$land_lhs_true221$120;}
68117 var $152=HEAP32[(($prev_out)>>2)];var $call228=__Z7IsAlphaj($152);var $tobool229=((($call228))|0)!=0;if(!($tobool229)){__label__=91;break $if_end244$$land_lhs_true221$120;}
68118 var $153=$tr_addr;var $langopts231=(($153)&4294967295);var $tone_numbers232=(($langopts231+250)&4294967295);var $154=HEAP8[($tone_numbers232)];var $tobool233=(tempInt=(($154)),(tempInt>=128?tempInt-256:tempInt))!=0;if($tobool233){__label__=88;;}else{__label__=90;;}
68119 $land_lhs_true234$$if_else241$125:do{if(__label__==88){var $155=$c;var $call235=__ZL9IsDigit09j($155);var $tobool236=((($call235))|0)!=0;if(!($tobool236)){__label__=90;break $land_lhs_true234$$if_else241$125;}
68120 var $156=HEAP32[(($next_in)>>2)];var $call238=__ZL9IsDigit09j($156);var $tobool239=((($call238))|0)!=0;if(!($tobool239)){__label__=91;break $if_end244$$land_lhs_true221$120;}}}while(0);$c=32;$space_inserted=1;;}}while(0);var $157=HEAP32[(($prev_out)>>2)];var $call245=_iswdigit($157);var $tobool246=((($call245))|0)!=0;if($tobool246){__label__=92;;}else{__label__=94;;}
68121 $if_then247$$if_else258$130:do{if(__label__==92){var $158=$c;var $call248=_iswdigit($158);var $tobool249=((($call248))|0)==0;var $159=$c;var $cmp251=((($159))|0)!=46;var $or_cond5=($tobool249)&($cmp251);var $160=$c;var $cmp253=((($160))|0)!=44;var $or_cond6=($or_cond5)&($cmp253);var $161=$c;var $cmp255=((($161))|0)!=32;var $or_cond7=($or_cond6)&($cmp255);if($or_cond7){__lastLabel__=92;;}else{__lastLabel__=92;__label__=97;break $if_then247$$if_else258$130;}
68122 $c=32;$space_inserted=1;__label__=101;break $if_then247$$if_else258$130;}
68123 else if(__label__==94){var $162=HEAP32[(($prev_in)>>2)];var $cmp259=((($162))|0)!=44;if($cmp259){__label__=95;;}else{__label__=96;;}
68124 if(__label__==95){$decimal_sep_count=0;;}
68125 var $_pr17=$c;__lastLabel__=96;__label__=97;break $if_then247$$if_else258$130;}}while(0);$if_end273$$if_end262$137:do{if(__label__==97){var $163=__lastLabel__==96?$_pr17:($161);var $cmp263=((($163))|0)==91;if(!($cmp263)){__label__=101;break $if_end273$$if_end262$137;}
68126 var $164=HEAP32[(($next_in)>>2)];var $cmp265=((($164))|0)==2;if($cmp265){__label__=100;;}else{__label__=99;;}
68127 if(__label__==99){var $165=HEAP32[(($next_in)>>2)];var $cmp267=((($165))|0)==91;var $166=HEAP32[((_option_phoneme_input)>>2)];var $tobool269=((($166))|0)!=0;var $or_cond8=($cmp267)&($tobool269);if(!($or_cond8)){__label__=101;break $if_end273$$if_end262$137;}}
68128 $phoneme_mode=8;var $167=HEAP32[(($source_index)>>2)];var $inc271=((($167)+1)&4294967295);HEAP32[(($source_index)>>2)]=$inc271;__label__=33;continue $while_cond88$50;}}while(0);var $168=$c;var $call274=__Z7IsAlphaj($168);var $tobool275=((($call274))|0)!=0;if($tobool275){__label__=102;;}else{__label__=138;;}
68129 if(__label__==102){var $169=HEAP32[(($prev_out)>>2)];var $call277=__Z7IsAlphaj($169);var $tobool278=((($call277))|0)!=0;if($tobool278){__label__=103;;}else{__label__=106;;}
68130 $lor_lhs_false279$$if_then286$146:do{if(__label__==103){var $170=$tr_addr;var $langopts280=(($170)&4294967295);var $ideographs=(($langopts280+251)&4294967295);var $171=HEAP8[($ideographs)];var $tobool281=(tempInt=(($171)),(tempInt>=128?tempInt-256:tempInt))!=0;if(!($tobool281)){__label__=118;break $lor_lhs_false279$$if_then286$146;}
68131 var $172=$c;var $cmp283=((($172))|0)>12352;if($cmp283){__label__=106;break $lor_lhs_false279$$if_then286$146;}
68132 var $173=HEAP32[(($prev_out)>>2)];var $cmp285=((($173))|0)>12352;if($cmp285){__label__=106;break $lor_lhs_false279$$if_then286$146;}else{__label__=118;break $lor_lhs_false279$$if_then286$146;}}}while(0);$if_then286$$if_end327$150:do{if(__label__==106){var $174=$tr_addr;var $punct_within_word287=(($174+704)&4294967295);var $175=HEAP32[(($punct_within_word287)>>2)];var $176=HEAP32[(($prev_out)>>2)];var $call288=_wcschr($175,$176);var $cmp289=((($call288))|0)==0;if($cmp289){__label__=107;;}else{__label__=108;;}
68133 if(__label__==107){$letter_count=0;;}
68134 var $177=HEAP32[(($prev_out)>>2)];var $cmp292=((($177))|0)!=32;if($cmp292){__label__=109;;}else{__label__=112;;}
68135 $land_lhs_true293$$if_else303$155:do{if(__label__==109){var $178=$tr_addr;var $punct_within_word294=(($178+704)&4294967295);var $179=HEAP32[(($punct_within_word294)>>2)];var $180=HEAP32[(($prev_out)>>2)];var $call295=_wcschr($179,$180);var $cmp296=((($call295))|0)==0;if(!($cmp296)){__label__=112;break $land_lhs_true293$$if_else303$155;}
68136 $c=32;$space_inserted=1;var $181=HEAP32[(($prev_out)>>2)];var $call298=__Z9IsBracketi($181);var $tobool299=((($call298))|0)!=0;if($tobool299){__label__=118;break $if_then286$$if_end327$150;}
68137 var $182=$next_word_flags;var $or301=($182)|256;$next_word_flags=$or301;__label__=118;break $if_then286$$if_end327$150;}}while(0);var $183=$c;var $call304=_iswupper($183);var $tobool305=((($call304))|0)!=0;if($tobool305){__label__=113;;}else{__label__=114;;}
68138 if(__label__==113){var $184=$word_flags;var $or307=($184)|2;$word_flags=$or307;;}
68139 var $185=HEAP32[(($prev_out)>>2)];var $cmp309=((($185))|0)==32;if(!($cmp309)){__label__=118;break $if_then286$$if_end327$150;}
68140 var $186=$ix;var $sub311=((($186)-2)&4294967295);var $arrayidx312=(($sbuf+$sub311)&4294967295);var $187=HEAP8[($arrayidx312)];var $conv313=(tempInt=(($187)),(tempInt>=128?tempInt-256:tempInt));var $call314=_iswdigit($conv313);var $tobool315=((($call314))|0)!=0;if(!($tobool315)){__label__=118;break $if_then286$$if_end327$150;}
68141 var $188=HEAP32[(($prev_in)>>2)];var $call317=_iswdigit($188);var $tobool318=((($call317))|0)!=0;if($tobool318){__label__=118;break $if_then286$$if_end327$150;}
68142 var $189=$ix;var $inc320=((($189)+1)&4294967295);$ix=$inc320;var $arrayidx321=(($sbuf+$189)&4294967295);HEAP8[($arrayidx321)]=32;var $190=$word_count;var $arrayidx322=(($words+$190*12)&4294967295);var $start323=(($arrayidx322+4)&4294967295);var $191=HEAP16[(($start323)>>1)];var $inc324=((($191)+1)&65535);HEAP16[(($start323)>>1)]=$inc324;;}}while(0);var $192=$letter_count;var $inc328=((($192)+1)&4294967295);$letter_count=$inc328;var $193=$c;var $call329=_iswupper($193);var $tobool330=((($call329))|0)!=0;if($tobool330){__label__=119;;}else{__label__=130;;}
68143 if(__label__==119){var $194=$c;var $call332=__Z9towlower2j($194);$c=$call332;var $195=$tr_addr;var $langopts333=(($195)&4294967295);var $param=(($langopts333+24)&4294967295);var $arrayidx334=(($param+52)&4294967295);var $196=HEAP32[(($arrayidx334)>>2)];$j=$196;var $cmp335=((($196))|0)>0;if($cmp335){__label__=120;;}else{__label__=123;;}
68144 if(__label__==120){var $197=$j;var $cmp337=((($197))|0)==2;if(!($cmp337)){__label__=195;break $if_then155$$if_else162$86;}
68145 var $198=$syllable_marked;var $cmp339=((($198))|0)==0;if(!($cmp339)){__label__=195;break $if_then155$$if_else162$86;}
68146 var $199=$c;HEAP32[(($char_inserted)>>2)]=$199;$c=712;$syllable_marked=1;;}
68147 else if(__label__==123){var $200=HEAP32[(($prev_in)>>2)];var $call343=_iswlower($200);var $tobool344=((($call343))|0)!=0;if($tobool344){__label__=124;;}else{__label__=125;;}
68148 if(__label__==124){$c=32;$space_inserted=1;var $201=$c;$prev_in_save=$201;;}
68149 else if(__label__==125){var $202=$c;var $cmp347=((($202))|0)!=32;if(!($cmp347)){__label__=195;break $if_then155$$if_else162$86;}
68150 var $203=HEAP32[(($prev_in)>>2)];var $call349=_iswupper($203);var $tobool350=((($call349))|0)!=0;if(!($tobool350)){__label__=195;break $if_then155$$if_else162$86;}
68151 var $204=HEAP32[(($next_in)>>2)];var $call352=_iswlower($204);var $tobool353=((($call352))|0)!=0;if(!($tobool353)){__label__=195;break $if_then155$$if_else162$86;}
68152 var $205=HEAP32[(($source_index)>>2)];var $206=$next_in_nbytes;var $add355=((($206)+($205))&4294967295);var $arrayidx356=((__ZL6source+$add355)&4294967295);var $call357=__Z7utf8_inPiPKc($next2_in,$arrayidx356);var $207=HEAP32[(($next2_in)>>2)];var $call358=__Z7IsAlphaj($207);var $tobool359=((($call358))|0)!=0;if(!($tobool359)){__label__=195;break $if_then155$$if_else162$86;}
68153 $c=32;$space_inserted=1;var $208=$c;$prev_in_save=$208;var $209=$next_word_flags;var $or361=($209)|256;$next_word_flags=$or361;;}}}
68154 else if(__label__==130){var $210=$all_upper_case;var $tobool367=((($210))|0)!=0;if($tobool367){__label__=131;;}else{__label__=137;;}
68155 $land_lhs_true368$$if_else386$182:do{if(__label__==131){var $211=$letter_count;var $cmp369=((($211))|0)>2;if(!($cmp369)){__label__=137;break $land_lhs_true368$$if_else386$182;}
68156 var $212=$c;var $cmp371=((($212))|0)==115;if($cmp371){__label__=133;;}else{__label__=136;;}
68157 $land_lhs_true372$$if_else384$185:do{if(__label__==133){var $213=HEAP32[(($next_in)>>2)];var $cmp373=((($213))|0)==32;if(!($cmp373)){__label__=136;break $land_lhs_true372$$if_else384$185;}
68158 $c=32;var $214=$all_upper_case;var $or375=($214)|4;$all_upper_case=$or375;var $215=$ix;var $sub376=((($215)-1)&4294967295);var $arrayidx377=(($sbuf+$sub376)&4294967295);var $216=HEAP8[($arrayidx377)];var $conv378=(tempInt=(($216)),(tempInt>=128?tempInt-256:tempInt));var $cmp379=((($conv378))|0)==39;if(!($cmp379)){__label__=195;break $if_then155$$if_else162$86;}
68159 var $217=$ix;var $sub381=((($217)-1)&4294967295);var $arrayidx382=(($sbuf+$sub381)&4294967295);HEAP8[($arrayidx382)]=32;__label__=195;break $if_then155$$if_else162$86;}}while(0);$all_upper_case=0;__label__=195;break $if_then155$$if_else162$86;}}while(0);$all_upper_case=0;;}}
68160 else if(__label__==138){var $218=$c;var $cmp390=((($218))|0)==45;if($cmp390){__label__=139;;}else{__label__=154;;}
68161 if(__label__==139){var $219=HEAP32[(($prev_in)>>2)];var $call392=__Z7IsSpacej($219);var $tobool393=((($call392))|0)!=0;if($tobool393){__label__=146;;}else{__label__=140;;}
68162 $if_else410$$land_lhs_true394$194:do{if(__label__==140){var $220=HEAP32[(($next_in)>>2)];var $call395=__Z7IsAlphaj($220);var $tobool396=((($call395))|0)!=0;if(!($tobool396)){__label__=146;break $if_else410$$land_lhs_true394$194;}
68163 var $221=HEAP32[(($prev_out)>>2)];var $cmp398=((($221))|0)!=32;if($cmp398){__label__=142;;}else{__label__=143;;}
68164 if(__label__==142){$c=32;$space_inserted=1;__label__=195;break $if_then155$$if_else162$86;}
68165 else if(__label__==143){var $222=$word_flags;var $or401=($222)|128;$word_flags=$or401;var $223=$word_count;var $cmp402=((($223))|0)>0;if($cmp402){__label__=144;;}else{__label__=145;;}
68166 if(__label__==144){var $224=$word_count;var $sub404=((($224)-1)&4294967295);var $arrayidx405=(($words+$sub404*12)&4294967295);var $flags406=(($arrayidx405)&4294967295);var $225=HEAP32[(($flags406)>>2)];var $or407=($225)|16384;HEAP32[(($flags406)>>2)]=$or407;;}
68167 $c=32;__label__=195;break $if_then155$$if_else162$86;}}}while(0);var $226=HEAP32[(($prev_in)>>2)];var $cmp411=((($226))|0)==32;var $227=HEAP32[(($next_in)>>2)];var $cmp413=((($227))|0)==32;var $or_cond26=($cmp411)&($cmp413);if($or_cond26){__label__=147;;}else{__label__=148;;}
68168 if(__label__==147){$c=32;$pre_pause_add=4;;}
68169 else if(__label__==148){var $cmp416=((($227))|0)==45;if($cmp416){__label__=149;;}else{__label__=150;;}
68170 if(__label__==149){var $228=HEAP32[(($source_index)>>2)];var $inc418=((($228)+1)&4294967295);HEAP32[(($source_index)>>2)]=$inc418;$c=32;$pre_pause_add=4;;}
68171 else if(__label__==150){var $229=HEAP32[(($prev_out)>>2)];var $cmp420=((($229))|0)==32;if(!($cmp420)){__label__=195;break $if_then155$$if_else162$86;}
68172 var $230=$ix;var $sub422=((($230)-2)&4294967295);var $arrayidx423=(($sbuf+$sub422)&4294967295);var $231=HEAP8[($arrayidx423)];var $conv424=(tempInt=(($231)),(tempInt>=128?tempInt-256:tempInt));var $call425=__Z7IsAlphaj($conv424);var $tobool426=((($call425))|0)!=0;if(!($tobool426)){__label__=195;break $if_then155$$if_else162$86;}
68173 var $232=HEAP32[(($prev_in)>>2)];var $call428=__Z7IsAlphaj($232);var $tobool429=((($call428))|0)!=0;if($tobool429){__label__=195;break $if_then155$$if_else162$86;}
68174 var $233=$ix;var $inc431=((($233)+1)&4294967295);$ix=$inc431;var $arrayidx432=(($sbuf+$233)&4294967295);HEAP8[($arrayidx432)]=32;var $234=$word_count;var $arrayidx433=(($words+$234*12)&4294967295);var $start434=(($arrayidx433+4)&4294967295);var $235=HEAP16[(($start434)>>1)];var $inc435=((($235)+1)&65535);HEAP16[(($start434)>>1)]=$inc435;;}}}
68175 else if(__label__==154){var $236=$c;var $cmp441=((($236))|0)==46;if($cmp441){__label__=155;;}else{__label__=162;;}
68176 if(__label__==155){var $237=HEAP32[(($prev_out)>>2)];var $cmp443=((($237))|0)==46;if($cmp443){__label__=156;;}else{__label__=157;;}
68177 if(__label__==156){$c=32;$space_inserted=1;;}
68178 else if(__label__==157){var $238=$word_count;var $cmp446=((($238))|0)>0;if(!($cmp446)){__label__=195;break $if_then155$$if_else162$86;}
68179 var $239=$word_count;var $sub448=((($239)-1)&4294967295);var $arrayidx449=(($words+$sub448*12)&4294967295);var $flags450=(($arrayidx449)&4294967295);var $240=HEAP32[(($flags450)>>2)];var $and451=($240)&256;var $tobool452=((($and451))|0)!=0;if($tobool452){__label__=195;break $if_then155$$if_else162$86;}
68180 var $241=HEAP32[(($prev_in)>>2)];var $call454=__Z7IsAlphaj($241);var $tobool455=((($call454))|0)!=0;if(!($tobool455)){__label__=195;break $if_then155$$if_else162$86;}
68181 var $242=$word_count;var $sub457=((($242)-1)&4294967295);var $arrayidx458=(($words+$sub457*12)&4294967295);var $flags459=(($arrayidx458)&4294967295);var $243=HEAP32[(($flags459)>>2)];var $or460=($243)|65536;HEAP32[(($flags459)>>2)]=$or460;var $244=HEAP32[(($next_in)>>2)];var $call461=__Z7IsSpacej($244);var $tobool462=((($call461))|0)!=0;var $245=HEAP32[(($next_in)>>2)];var $cmp464=((($245))|0)==45;var $or_cond9=($tobool462)|($cmp464);if(!($or_cond9)){__label__=195;break $if_then155$$if_else162$86;}
68182 $c=32;;}}
68183 else if(__label__==162){var $246=$c;var $cmp470=((($246))|0)==39;if($cmp470){__label__=163;;}else{__label__=178;;}
68184 if(__label__==163){var $247=HEAP32[(($prev_in)>>2)];var $cmp472=((($247))|0)==46;if($cmp472){__label__=165;;}else{__label__=164;;}
68185 $land_lhs_true476$$lor_lhs_false473$226:do{if(__label__==164){var $248=HEAP32[(($prev_in)>>2)];var $call474=_iswalnum($248);var $tobool475=((($call474))|0)!=0;if($tobool475){__label__=165;break $land_lhs_true476$$lor_lhs_false473$226;}else{__label__=167;break $land_lhs_true476$$lor_lhs_false473$226;}}}while(0);$land_lhs_true476$$if_else480$228:do{if(__label__==165){var $249=HEAP32[(($next_in)>>2)];var $call477=__Z7IsAlphaj($249);var $tobool478=((($call477))|0)!=0;if(!($tobool478)){__label__=167;break $land_lhs_true476$$if_else480$228;}
68186 $single_quoted=0;__label__=195;break $if_then155$$if_else162$86;}}while(0);var $250=$tr_addr;var $char_plus_apostrophe=(($250+700)&4294967295);var $251=HEAP32[(($char_plus_apostrophe)>>2)];var $252=HEAP32[(($prev_in)>>2)];var $call481=_wcschr($251,$252);var $cmp482=((($call481))|0)!=0;if($cmp482){__label__=168;;}else{__label__=171;;}
68187 $land_lhs_true483$$if_else490$232:do{if(__label__==168){var $253=$prev_out2;var $cmp484=((($253))|0)==32;if(!($cmp484)){__label__=171;break $land_lhs_true483$$if_else490$232;}
68188 $single_quoted=0;var $254=HEAP32[(($next_in)>>2)];var $cmp486=((($254))|0)==32;if(!($cmp486)){__label__=195;break $if_then155$$if_else162$86;}
68189 var $255=HEAP32[(($source_index)>>2)];var $inc488=((($255)+1)&4294967295);HEAP32[(($source_index)>>2)]=$inc488;__label__=195;break $if_then155$$if_else162$86;}}while(0);var $256=HEAP32[(($prev_out)>>2)];var $cmp491=((($256))|0)==115;if($cmp491){__label__=172;;}else{__label__=174;;}
68190 $land_lhs_true492$$if_else495$237:do{if(__label__==172){var $257=$single_quoted;var $cmp493=((($257))|0)==0;if(!($cmp493)){__label__=174;break $land_lhs_true492$$if_else495$237;}
68191 $c=32;__label__=195;break $if_then155$$if_else162$86;}}while(0);var $258=HEAP32[(($prev_out)>>2)];var $call496=__Z7IsSpacej($258);var $tobool497=((($call496))|0)!=0;if($tobool497){__label__=175;;}else{__label__=176;;}
68192 if(__label__==175){$single_quoted=1;;}
68193 else if(__label__==176){$single_quoted=0;;}
68194 $pre_pause_add=4;$c=32;;}
68195 else if(__label__==178){var $259=$c;var $call505=__Z11lookupwcharPKti(((__ZL6breaks)&4294967295),$259);var $cmp506=((($call505))|0)!=0;if($cmp506){__label__=179;;}else{__label__=180;;}
68196 if(__label__==179){$c=32;;}
68197 else if(__label__==180){var $260=$c;var $call509=_iswdigit($260);var $tobool510=((($call509))|0)!=0;if(!($tobool510)){__label__=195;break $if_then155$$if_else162$86;}
68198 var $261=$tr_addr;var $langopts512=(($261)&4294967295);var $tone_numbers513=(($langopts512+250)&4294967295);var $262=HEAP8[($tone_numbers513)];var $tobool514=(tempInt=(($262)),(tempInt>=128?tempInt-256:tempInt))!=0;if($tobool514){__label__=182;;}else{__label__=184;;}
68199 $land_lhs_true515$$if_else522$250:do{if(__label__==182){var $263=HEAP32[(($prev_out)>>2)];var $call516=__Z7IsAlphaj($263);var $tobool517=((($call516))|0)!=0;if(!($tobool517)){__label__=184;break $land_lhs_true515$$if_else522$250;}
68200 var $264=HEAP32[(($next_in)>>2)];var $call519=__Z7IsDigitj($264);var $tobool520=((($call519))|0)!=0;if(!($tobool520)){__label__=195;break $if_then155$$if_else162$86;}}}while(0);var $265=HEAP32[(($prev_out)>>2)];var $cmp523=((($265))|0)!=32;if($cmp523){__label__=185;;}else{__label__=192;;}
68201 if(__label__==185){var $266=HEAP32[(($prev_out)>>2)];var $call525=_iswdigit($266);var $tobool526=((($call525))|0)!=0;var $_pr20=HEAP32[(($prev_out)>>2)];if($tobool526){__label__=191;;}else{__label__=186;;}
68202 if(__label__==191){var $cmp540=((($_pr20))|0)==32;if(!($cmp540)){__label__=195;break $if_then155$$if_else162$86;}}
68203 else if(__label__==186){var $267=$tr_addr;var $langopts528=(($267)&4294967295);var $decimal_sep=(($langopts528+208)&4294967295);var $268=HEAP32[(($decimal_sep)>>2)];var $cmp529=((($_pr20))|0)!=((($268))|0);if($cmp529){__label__=189;;}else{__label__=187;;}
68204 $if_then536$$lor_lhs_false530$259:do{if(__label__==187){var $269=$decimal_sep_count;var $cmp531=((($269))|0)>0;if($cmp531){__label__=188;;}else{__label__=190;;}
68205 if(__label__==188){var $270=$tr_addr;var $langopts533=(($270)&4294967295);var $decimal_sep534=(($langopts533+208)&4294967295);var $271=HEAP32[(($decimal_sep534)>>2)];var $cmp535=((($271))|0)==44;if($cmp535){__label__=189;break $if_then536$$lor_lhs_false530$259;}}
68206 $decimal_sep_count=1;__label__=195;break $if_then155$$if_else162$86;}}while(0);$c=32;$space_inserted=1;__label__=195;break $if_then155$$if_else162$86;}}
68207 var $272=$ix;var $sub542=((($272)-2)&4294967295);var $arrayidx543=(($sbuf+$sub542)&4294967295);var $273=HEAP8[($arrayidx543)];var $conv544=(tempInt=(($273)),(tempInt>=128?tempInt-256:tempInt));var $call545=__Z7IsAlphaj($conv544);var $tobool546=((($call545))|0)!=0;if(!($tobool546)){__label__=195;break $if_then155$$if_else162$86;}
68208 var $274=HEAP32[(($prev_in)>>2)];var $call548=__Z7IsAlphaj($274);var $tobool549=((($call548))|0)!=0;if($tobool549){__label__=195;break $if_then155$$if_else162$86;}
68209 var $275=$ix;var $inc551=((($275)+1)&4294967295);$ix=$inc551;var $arrayidx552=(($sbuf+$275)&4294967295);HEAP8[($arrayidx552)]=32;var $276=$word_count;var $arrayidx553=(($words+$276*12)&4294967295);var $start554=(($arrayidx553+4)&4294967295);var $277=HEAP16[(($start554)>>1)];var $inc555=((($277)+1)&65535);HEAP16[(($start554)>>1)]=$inc555;;}}}}}}}}while(0);var $278=$c;var $call568=__Z7IsSpacej($278);var $tobool569=((($call568))|0)!=0;if($tobool569){__label__=196;;}else{__label__=225;;}
68210 $if_then570$$if_else688$269:do{if(__label__==196){var $279=HEAP32[(($prev_out)>>2)];var $cmp571=((($279))|0)==32;if($cmp571){__label__=197;;}else{__label__=198;;}
68211 if(__label__==197){var $280=$word_flags;var $or573=($280)|262144;$word_flags=$or573;__label__=33;continue $while_cond88$50;}
68212 else if(__label__==198){var $281=HEAP32[(($cc)>>2)];var $cmp575=((($281))|0)==9;var $282=HEAP32[(($cc)>>2)];var $cmp577=((($282))|0)==10;var $or_cond10=($cmp575)|($cmp577);if($or_cond10){__label__=199;;}else{__label__=200;;}
68213 if(__label__==199){var $283=$next_word_flags;var $or579=($283)|262144;$next_word_flags=$or579;;}
68214 var $284=$space_inserted;var $tobool581=((($284))|0)!=0;if($tobool581){__label__=201;;}else{__label__=208;;}
68215 if(__label__==201){$j=0;var $285=HEAP32[(($source_index)>>2)];var $sub583=((($285)-1)&4294967295);$k=$sub583;;while(1){var $286=$k;var $287=$source_index_word;var $cmp585=((($286))|0)>=((($287))|0);if(!($cmp585)){__label__=207;break;}
68216 var $288=$k;var $arrayidx587=(($charix+$288*2)&4294967295);var $289=HEAP16[(($arrayidx587)>>1)];var $conv588=(tempInt=(($289)),(tempInt>=32768?tempInt-65536:tempInt));var $cmp589=((($conv588))|0)!=0;if(!($cmp589)){__label__=207;break;}
68217 var $290=$k;var $arrayidx592=(($charix+$290*2)&4294967295);var $291=HEAP16[(($arrayidx592)>>1)];var $conv593=(tempInt=(($291)),(tempInt>=32768?tempInt-65536:tempInt));var $cmp594=((($conv593))|0)>0;if($cmp594){__label__=205;;}else{__label__=206;;}
68218 if(__label__==205){var $292=$j;var $inc596=((($292)+1)&4294967295);$j=$inc596;;}
68219 var $293=$k;var $dec598=((($293)-1)&4294967295);$k=$dec598;__label__=202;continue;}
68220 var $294=$j;var $conv600=((($294))&255);var $295=$word_count;var $arrayidx601=(($words+$295*12)&4294967295);var $length602=(($arrayidx601+10)&4294967295);HEAP8[($length602)]=$conv600;;}
68221 var $296=HEAP32[(($source_index)>>2)];$source_index_word=$296;var $297=$ix;var $inc604=((($297)+1)&4294967295);$ix=$inc604;var $arrayidx605=(($sbuf+$297)&4294967295);HEAP8[($arrayidx605)]=32;var $298=$word_count;var $cmp606=((($298))|0)<299;if($cmp606){__label__=209;;}else{__label__=223;;}
68222 $land_lhs_true607$$if_end684$288:do{if(__label__==209){var $299=$ix;var $300=$word_count;var $arrayidx608=(($words+$300*12)&4294967295);var $start609=(($arrayidx608+4)&4294967295);var $301=HEAPU16[(($start609)>>1)];var $conv610=((($301))&65535);var $cmp611=((($299))|0)>((($conv610))|0);if(!($cmp611)){__label__=223;break $land_lhs_true607$$if_end684$288;}
68223 var $302=$embedded_count;var $cmp613=((($302))|0)>0;if($cmp613){__label__=211;;}else{__label__=212;;}
68224 if(__label__==211){var $303=HEAP32[((__ZL11embedded_ix)>>2)];var $sub615=((($303)-1)&4294967295);var $arrayidx616=((_embedded_list+$sub615*4)&4294967295);var $304=HEAP32[(($arrayidx616)>>2)];var $or617=($304)|128;HEAP32[(($arrayidx616)>>2)]=$or617;var $305=$word_count;var $arrayidx618=(($words+$305*12)&4294967295);var $flags619=(($arrayidx618)&4294967295);var $306=HEAP32[(($flags619)>>2)];var $or620=($306)|64;HEAP32[(($flags619)>>2)]=$or620;$embedded_count=0;;}
68225 var $307=HEAP32[((_pre_pause)>>2)];var $conv622=((($307))&255);var $308=$word_count;var $arrayidx623=(($words+$308*12)&4294967295);var $pre_pause=(($arrayidx623+8)&4294967295);HEAP8[($pre_pause)]=$conv622;var $309=$all_upper_case;var $310=$word_flags;var $_b=HEAPU8[(__ZL13word_emphasis_b)];var $311=($_b)?2048:0;var $312=$word_count;var $arrayidx626=(($words+$312*12)&4294967295);var $flags627=(($arrayidx626)&4294967295);var $313=HEAP32[(($flags627)>>2)];var $or624=($310)|($309);var $or625=($or624)|($311);var $or628=($or625)|($313);HEAP32[(($flags627)>>2)]=$or628;var $314=$word_mark;var $conv629=((($314))&255);var $315=$word_count;var $arrayidx630=(($words+$315*12)&4294967295);var $wmark=(($arrayidx630+9)&4294967295);HEAP8[($wmark)]=$conv629;var $316=HEAP32[((_pre_pause)>>2)];var $cmp631=((($316))|0)>0;if($cmp631){__label__=213;;}else{__label__=216;;}
68226 if(__label__==213){var $317=$ix;$j=$317;var $318=$j;var $319=$word_count;var $arrayidx63438=(($words+$319*12)&4294967295);var $start63539=(($arrayidx63438+4)&4294967295);var $320=HEAPU16[(($start63539)>>1)];var $conv63640=((($320))&65535);var $cmp63741=((($318))|0)>((($conv63640))|0);var $321=$j;if($cmp63741){__lastLabel__=213;__label__=214;;}else{__lastLabel__=213;__label__=215;;}
68227 $for_body638$$for_end644$296:do{if(__label__==214){while(1){var $322=__lastLabel__==214?$329:($321);var $sub639=((($322)-1)&4294967295);var $arrayidx640=(($sbuf+$sub639)&4294967295);var $323=HEAP8[($arrayidx640)];var $324=$j;var $arrayidx641=(($sbuf+$324)&4294967295);HEAP8[($arrayidx641)]=$323;var $325=$j;var $dec643=((($325)-1)&4294967295);$j=$dec643;var $326=$j;var $327=$word_count;var $arrayidx634=(($words+$327*12)&4294967295);var $start635=(($arrayidx634+4)&4294967295);var $328=HEAPU16[(($start635)>>1)];var $conv636=((($328))&65535);var $cmp637=((($326))|0)>((($conv636))|0);var $329=$j;if($cmp637){__lastLabel__=214;__label__=214;continue;}else{__lastLabel__=214;__label__=215;break $for_body638$$for_end644$296;}}}}while(0);var $_lcssa37=__lastLabel__==213?$321:($329);var $arrayidx645=(($sbuf+$_lcssa37)&4294967295);HEAP8[($arrayidx645)]=32;var $330=$word_count;var $arrayidx646=(($words+$330*12)&4294967295);var $start647=(($arrayidx646+4)&4294967295);var $331=HEAP16[(($start647)>>1)];var $inc648=((($331)+1)&65535);HEAP16[(($start647)>>1)]=$inc648;var $332=$ix;var $inc649=((($332)+1)&4294967295);$ix=$inc649;;}
68228 var $333=$word_count;var $inc651=((($333)+1)&4294967295);$word_count=$inc651;var $334=$ix;var $conv652=((($334))&65535);var $335=$word_count;var $arrayidx653=(($words+$335*12)&4294967295);var $start654=(($arrayidx653+4)&4294967295);HEAP16[(($start654)>>1)]=$conv652;var $336=$word_count;var $arrayidx655=(($words+$336*12)&4294967295);var $flags656=(($arrayidx655)&4294967295);HEAP32[(($flags656)>>2)]=0;var $337=HEAP32[(($source_index)>>2)];$j=$337;var $338=$j;var $arrayidx65844=(($charix+$338*2)&4294967295);var $339=HEAP16[(($arrayidx65844)>>1)];var $conv65945=(tempInt=(($339)),(tempInt>=32768?tempInt-65536:tempInt));var $cmp66046=((($conv65945))|0)<=0;var $340=$j;if($cmp66046){__lastLabel__=216;__label__=217;;}else{__lastLabel__=216;__label__=218;;}
68229 $for_inc662$$for_end664$301:do{if(__label__==217){while(1){var $341=__lastLabel__==217?$344:($340);var $inc663=((($341)+1)&4294967295);$j=$inc663;var $342=$j;var $arrayidx658=(($charix+$342*2)&4294967295);var $343=HEAP16[(($arrayidx658)>>1)];var $conv659=(tempInt=(($343)),(tempInt>=32768?tempInt-65536:tempInt));var $cmp660=((($conv659))|0)<=0;var $344=$j;if($cmp660){__lastLabel__=217;__label__=217;continue;}else{__lastLabel__=217;__label__=218;break $for_inc662$$for_end664$301;}}}}while(0);var $_lcssa43=__lastLabel__==216?$340:($344);var $arrayidx665=(($charix+$_lcssa43*2)&4294967295);var $345=HEAP16[(($arrayidx665)>>1)];var $346=$word_count;var $arrayidx666=(($words+$346*12)&4294967295);var $sourceix667=(($arrayidx666+6)&4294967295);HEAP16[(($sourceix667)>>1)]=$345;$k=0;var $347=$j;var $arrayidx66948=(($charix+$347*2)&4294967295);var $348=HEAP16[(($arrayidx66948)>>1)];var $conv67049=(tempInt=(($348)),(tempInt>=32768?tempInt-65536:tempInt));var $cmp67150=((($conv67049))|0)!=0;if($cmp67150){__label__=219;;}else{__label__=222;;}
68230 $while_body672$$while_end680$305:do{if(__label__==219){while(1){var $349=$j;var $inc673=((($349)+1)&4294967295);$j=$inc673;var $arrayidx674=(($charix+$349*2)&4294967295);var $350=HEAP16[(($arrayidx674)>>1)];var $conv675=(tempInt=(($350)),(tempInt>=32768?tempInt-65536:tempInt));var $cmp676=((($conv675))|0)!=-1;if($cmp676){__label__=220;;}else{__label__=221;;}
68231 if(__label__==220){var $351=$k;var $inc678=((($351)+1)&4294967295);$k=$inc678;;}
68232 var $352=$j;var $arrayidx669=(($charix+$352*2)&4294967295);var $353=HEAP16[(($arrayidx669)>>1)];var $conv670=(tempInt=(($353)),(tempInt>=32768?tempInt-65536:tempInt));var $cmp671=((($conv670))|0)!=0;if($cmp671){__label__=219;continue;}else{__label__=222;break $while_body672$$while_end680$305;}}}}while(0);var $354=$k;var $conv681=((($354))&255);var $355=$word_count;var $arrayidx682=(($words+$355*12)&4294967295);var $length683=(($arrayidx682+10)&4294967295);HEAP8[($length683)]=$conv681;var $356=$next_word_flags;$word_flags=$356;$next_word_flags=0;HEAP32[((_pre_pause)>>2)]=0;$word_mark=0;$all_upper_case=1;$syllable_marked=0;;}}while(0);var $357=$space_inserted;var $tobool685=((($357))|0)!=0;if(!($tobool685)){__label__=227;break $if_then570$$if_else688$269;}
68233 var $358=$prev_source_index;HEAP32[(($source_index)>>2)]=$358;HEAP32[(($char_inserted)>>2)]=0;$space_inserted=0;;}}
68234 else if(__label__==225){var $359=$ix;var $cmp689=((($359))|0)<696;if(!($cmp689)){__label__=227;break $if_then570$$if_else688$269;}
68235 var $360=$c;var $361=$ix;var $arrayidx691=(($sbuf+$361)&4294967295);var $call692=__Z8utf8_outjPc($360,$arrayidx691);var $362=$ix;var $add693=((($362)+($call692))&4294967295);$ix=$add693;;}}while(0);var $363=$pre_pause_add;var $364=HEAP32[((_pre_pause)>>2)];var $cmp696=((($363))|0)>((($364))|0);if($cmp696){__label__=228;;}else{__label__=229;;}
68236 if(__label__==228){var $365=$pre_pause_add;HEAP32[((_pre_pause)>>2)]=$365;;}
68237 $pre_pause_add=0;__label__=33;continue $while_cond88$50;}
68238 var $366=$word_count;var $cmp700=((($366))|0)==0;if($cmp700){__label__=231;;}else{__label__=233;;}
68239 $land_lhs_true701$$if_end710$321:do{if(__label__==231){var $367=$embedded_count;var $cmp702=((($367))|0)>0;if(!($cmp702)){__label__=233;break $land_lhs_true701$$if_end710$321;}
68240 var $368=HEAP32[((__ZL11embedded_ix)>>2)];var $sub704=((($368)-1)&4294967295);var $arrayidx705=((_embedded_list+$sub704*4)&4294967295);var $369=HEAP32[(($arrayidx705)>>2)];var $or706=($369)|128;HEAP32[(($arrayidx705)>>2)]=$or706;var $370=$word_count;var $arrayidx707=(($words+$370*12)&4294967295);var $flags708=(($arrayidx707)&4294967295);var $371=HEAP32[(($flags708)>>2)];var $or709=($371)|64;HEAP32[(($flags708)>>2)]=$or709;$word_count=1;;}}while(0);var $372=$ix;var $sub711=((($372)-1)&4294967295);var $arrayidx712=(($sbuf+$sub711)&4294967295);var $373=$tr_addr;var $clause_end=(($373+8292)&4294967295);HEAP32[(($clause_end)>>2)]=$arrayidx712;var $374=$ix;var $arrayidx713=(($sbuf+$374)&4294967295);HEAP8[($arrayidx713)]=0;var $arrayidx714=(($words)&4294967295);var $pre_pause715=(($arrayidx714+8)&4294967295);HEAP8[($pre_pause715)]=0;var $375=$word_count;var $arrayidx716=(($words+$375*12)&4294967295);var $pre_pause717=(($arrayidx716+8)&4294967295);HEAP8[($pre_pause717)]=8;var $376=$word_count;var $cmp718=((($376))|0)>0;if($cmp718){__label__=234;;}else{__label__=241;;}
68241 $if_then719$$if_end751$325:do{if(__label__==234){var $377=$word_count;var $sub720=((($377)-1)&4294967295);$ix=$sub720;__lastLabel__=234;;while(1){var $378=__lastLabel__==237?$dec732:($sub720);var $cmp722=((($378))|0)>0;var $379=$ix;if($cmp722){__lastLabel__=235;;}else{__lastLabel__=235;__label__=238;break;}
68242 var $arrayidx724=(($words+$379*12)&4294967295);var $start725=(($arrayidx724+4)&4294967295);var $380=HEAPU16[(($start725)>>1)];var $idxprom=((($380))&65535);var $arrayidx726=(($sbuf+$idxprom)&4294967295);var $381=HEAP8[($arrayidx726)];var $conv727=(tempInt=(($381)),(tempInt>=128?tempInt-256:tempInt));var $call728=__Z9IsBracketi($conv727);var $tobool729=((($call728))|0)!=0;var $382=$ix;if($tobool729){__lastLabel__=236;;}else{__lastLabel__=236;__label__=238;break;}
68243 var $dec732=((($382)-1)&4294967295);$ix=$dec732;__lastLabel__=237;__label__=235;continue;}
68244 var $383=__lastLabel__==236?$382:($379);var $arrayidx734=(($words+$383*12)&4294967295);var $flags735=(($arrayidx734)&4294967295);var $384=HEAP32[(($flags735)>>2)];var $or736=($384)|16;HEAP32[(($flags735)>>2)]=$or736;var $385=$terminator;var $and737=($385)&4194304;var $tobool738=((($and737))|0)!=0;if(!($tobool738)){__label__=241;break $if_then719$$if_end751$325;}
68245 var $386=$word_count;var $sub740=((($386)-1)&4294967295);var $arrayidx741=(($words+$sub740*12)&4294967295);var $flags742=(($arrayidx741)&4294967295);var $387=HEAP32[(($flags742)>>2)];var $and743=($387)&256;var $tobool744=((($and743))|0)!=0;if($tobool744){__label__=241;break $if_then719$$if_end751$325;}
68246 var $388=$word_count;var $sub746=((($388)-1)&4294967295);var $arrayidx747=(($words+$sub746*12)&4294967295);var $flags748=(($arrayidx747)&4294967295);var $389=HEAP32[(($flags748)>>2)];var $or749=($389)|65536;HEAP32[(($flags748)>>2)]=$or749;;}}while(0);var $arrayidx752=(($words)&4294967295);var $flags753=(($arrayidx752)&4294967295);var $390=HEAP32[(($flags753)>>2)];var $or754=($390)|512;HEAP32[(($flags753)>>2)]=$or754;$ix=0;var $391=$ix;var $392=$word_count;var $cmp75636=((($391))|0)<((($392))|0);if($cmp75636){__label__=242;;}else{__label__=296;;}
68247 $for_body757_lr_ph$$for_end994$335:do{if(__label__==242){var $arraydecay781=(($number_buf)&4294967295);var $arrayidx783=(($number_buf+130)&4294967295);var $arraydecay816=(($number_buf)&4294967295);var $sub_ptr_rhs_cast818=($arraydecay816);var $arraydecay820=(($number_buf)&4294967295);var $arrayidx836=(($number_buf)&4294967295);var $arrayidx837=(($number_buf+1)&4294967295);var $arrayidx850=(($number_buf+130)&4294967295);var $arrayidx920=(($number_buf+1)&4294967295);var $arraydecay967=(($number_buf)&4294967295);var $arrayidx969=(($number_buf+2)&4294967295);var $arrayidx970=(($number_buf+2)&4294967295);;$for_body757$337:while(1){var $393=HEAP32[((_count_words)>>2)];var $inc758=((($393)+1)&4294967295);HEAP32[((_count_words)>>2)]=$inc758;var $394=HEAP32[((_skip_words)>>2)];var $cmp759=((($394))|0)>0;if($cmp759){__label__=244;;}else{__label__=246;;}
68248 $if_then760$$if_end765$339:do{if(__label__==244){var $395=HEAP32[((_skip_words)>>2)];var $dec761=((($395)-1)&4294967295);HEAP32[((_skip_words)>>2)]=$dec761;var $396=HEAP32[((_skip_words)>>2)];var $cmp762=((($396))|0)==0;if(!($cmp762)){__label__=246;break $if_then760$$if_end765$339;}
68249 HEAP32[((_skipping_text)>>2)]=0;__label__=247;break $if_then760$$if_end765$339;}}while(0);$if_end768$$if_end765$342:do{if(__label__==246){var $_pr22=HEAP32[((_skipping_text)>>2)];var $tobool766=((($_pr22))|0)!=0;if($tobool766){__label__=295;break $if_end768$$if_end765$342;}else{__label__=247;break $if_end768$$if_end765$342;}}}while(0);$if_end768$$for_inc992$344:do{if(__label__==247){var $397=$ix;var $arrayidx769=(($words+$397*12)&4294967295);var $start770=(($arrayidx769+4)&4294967295);var $398=HEAPU16[(($start770)>>1)];var $idxprom771=((($398))&65535);var $arrayidx772=(($sbuf+$idxprom771)&4294967295);$pw=$arrayidx772;$word=$arrayidx772;var $399=$word;var $arrayidx773=(($399)&4294967295);var $400=HEAP8[($arrayidx773)];var $conv774=(tempInt=(($400)),(tempInt>=128?tempInt-256:tempInt));var $call775=_iswdigit($conv774);var $tobool776=((($call775))|0)!=0;if($tobool776){__label__=248;;}else{__label__=261;;}
68250 $land_lhs_true777$$if_end824$346:do{if(__label__==248){var $401=$tr_addr;var $langopts778=(($401)&4294967295);var $break_numbers=(($langopts778+192)&4294967295);var $402=HEAP32[(($break_numbers)>>2)];var $cmp779=((($402))|0)!=1227133512;if(!($cmp779)){__label__=261;break $land_lhs_true777$$if_end824$346;}
68251 $pn=$arraydecay781;;while(1){var $403=$pn;var $cmp784=((($403))>>>0)<((($arrayidx783))>>>0);if(!($cmp784)){__label__=260;break;}
68252 var $404=$pw;var $405=HEAP8[($404)];var $conv786=(tempInt=(($405)),(tempInt>=128?tempInt-256:tempInt));var $call787=_iswdigit($conv786);var $tobool788=((($call787))|0)!=0;var $406=$pw;if($tobool788){__label__=252;;}else{__label__=253;;}
68253 if(__label__==252){var $incdec_ptr790=(($406+1)&4294967295);$pw=$incdec_ptr790;var $407=HEAP8[($406)];var $408=$pn;var $incdec_ptr791=(($408+1)&4294967295);$pn=$incdec_ptr791;HEAP8[($408)]=$407;__label__=250;continue;}
68254 else if(__label__==253){var $409=HEAP8[($406)];var $conv793=(tempInt=(($409)),(tempInt>=128?tempInt-256:tempInt));var $410=$tr_addr;var $langopts794=(($410)&4294967295);var $thousands_sep=(($langopts794+204)&4294967295);var $411=HEAP32[(($thousands_sep)>>2)];var $cmp795=((($conv793))|0)==((($411))|0);if(!($cmp795)){__label__=259;break;}
68255 var $412=$pw;var $arrayidx797=(($412+1)&4294967295);var $413=HEAP8[($arrayidx797)];var $conv798=(tempInt=(($413)),(tempInt>=128?tempInt-256:tempInt));var $cmp799=((($conv798))|0)==32;if(!($cmp799)){__label__=259;break;}
68256 var $414=$pw;var $arrayidx801=(($414+2)&4294967295);var $415=HEAP8[($arrayidx801)];var $conv802=(tempInt=(($415)),(tempInt>=128?tempInt-256:tempInt));var $call803=_iswdigit($conv802);var $tobool804=((($call803))|0)!=0;if(!($tobool804)){__label__=259;break;}
68257 var $416=$pw;var $arrayidx806=(($416+3)&4294967295);var $417=HEAP8[($arrayidx806)];var $conv807=(tempInt=(($417)),(tempInt>=128?tempInt-256:tempInt));var $cmp808=((($conv807))|0)!=32;if(!($cmp808)){__label__=259;break;}
68258 var $418=$pw;var $arrayidx810=(($418+4)&4294967295);var $419=HEAP8[($arrayidx810)];var $conv811=(tempInt=(($419)),(tempInt>=128?tempInt-256:tempInt));var $cmp812=((($conv811))|0)!=32;if(!($cmp812)){__label__=259;break;}
68259 var $420=$pw;var $add_ptr=(($420+2)&4294967295);$pw=$add_ptr;var $421=$ix;var $inc814=((($421)+1)&4294967295);$ix=$inc814;__label__=250;continue;}}
68260 if(__label__==259){var $422=$pw;var $423=$word;var $sub_ptr_lhs_cast=($422);var $sub_ptr_rhs_cast=($423);var $sub_ptr_sub=((($sub_ptr_lhs_cast)-($sub_ptr_rhs_cast))&4294967295);$nx=$sub_ptr_sub;var $424=$word;var $425=$nx;var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=$424;$stop$=$dest$+$425;$value4$=32;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=32;}
68261 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
68262 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=32;};var $426=$pn;var $sub_ptr_lhs_cast817=($426);var $sub_ptr_sub819=((($sub_ptr_lhs_cast817)-($sub_ptr_rhs_cast818))&4294967295);$nx=$sub_ptr_sub819;var $427=$word;var $428=$nx;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$arraydecay820;$dest$=$427;$stop$=$src$+$428;if(($dest$%4)==($src$%4)&&$428>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
68263 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
68264 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};;}
68265 var $429=$word;$pw=$429;;}}while(0);$n_digits=0;var $430=$n_digits;var $431=$word;var $arrayidx82630=(($431+$430)&4294967295);var $432=HEAP8[($arrayidx82630)];var $conv82731=(tempInt=(($432)),(tempInt>=128?tempInt-256:tempInt));var $call82832=_iswdigit($conv82731);var $tobool82933=((($call82832))|0)!=0;var $433=$n_digits;if($tobool82933){__lastLabel__=261;__label__=262;;}else{__lastLabel__=261;__label__=263;;}
68266 $for_inc831$$for_end833$364:do{if(__label__==262){while(1){var $434=__lastLabel__==262?$438:($433);var $inc832=((($434)+1)&4294967295);$n_digits=$inc832;var $435=$n_digits;var $436=$word;var $arrayidx826=(($436+$435)&4294967295);var $437=HEAP8[($arrayidx826)];var $conv827=(tempInt=(($437)),(tempInt>=128?tempInt-256:tempInt));var $call828=_iswdigit($conv827);var $tobool829=((($call828))|0)!=0;var $438=$n_digits;if($tobool829){__lastLabel__=262;__label__=262;continue;}else{__lastLabel__=262;__label__=263;break $for_inc831$$for_end833$364;}}}}while(0);var $_lcssa29=__lastLabel__==261?$433:($438);var $cmp834=((($_lcssa29))|0)>4;if($cmp834){__label__=264;;}else{__label__=284;;}
68267 $if_then835$$if_else939$368:do{if(__label__==264){HEAP8[($arrayidx836)]=32;$pn=$arrayidx837;var $439=$n_digits;$nx=$439;$nw=0;$individual_digits=0;var $440=$n_digits;var $441=$tr_addr;var $langopts838=(($441)&4294967295);var $max_digits=(($langopts838+212)&4294967295);var $442=HEAP32[(($max_digits)>>2)];var $cmp839=((($440))|0)>((($442))|0);if($cmp839){__label__=266;;}else{__label__=265;;}
68268 $if_then844$$lor_lhs_false840$370:do{if(__label__==265){var $443=$word;var $arrayidx841=(($443)&4294967295);var $444=HEAP8[($arrayidx841)];var $conv842=(tempInt=(($444)),(tempInt>=128?tempInt-256:tempInt));var $cmp843=((($conv842))|0)==48;if($cmp843){__label__=266;break $if_then844$$lor_lhs_false840$370;}else{__label__=267;break $if_then844$$lor_lhs_false840$370;}}}while(0);if(__label__==266){var $445=$ix;var $arrayidx845=(($words+$445*12)&4294967295);var $flags846=(($arrayidx845)&4294967295);var $446=HEAP32[(($flags846)>>2)];var $or847=($446)|524288;HEAP32[(($flags846)>>2)]=$or847;;}
68269 $while_cond849$374:while(1){var $447=$pn;var $cmp851=((($447))>>>0)<((($arrayidx850))>>>0);if(!($cmp851)){__label__=278;break $while_cond849$374;}
68270 var $448=$pw;var $incdec_ptr853=(($448+1)&4294967295);$pw=$incdec_ptr853;var $449=HEAP8[($448)];var $conv854=(tempInt=(($449)),(tempInt>=128?tempInt-256:tempInt));$c=$conv854;var $isdigittmp=((($conv854)-48)&4294967295);var $isdigit=((($isdigittmp))>>>0)<10;var $call855=((($isdigit))&1);var $tobool856=((($call855))|0)!=0;if($tobool856){__label__=270;;}else{__label__=269;;}
68271 if(__label__==269){var $450=$c;var $451=$tr_addr;var $langopts858=(($451)&4294967295);var $decimal_sep859=(($langopts858+208)&4294967295);var $452=HEAP32[(($decimal_sep859)>>2)];var $cmp860=((($450))|0)!=((($452))|0);if($cmp860){__label__=278;break $while_cond849$374;}}
68272 var $453=$c;var $conv863=((($453))&255);var $454=$pn;var $incdec_ptr864=(($454+1)&4294967295);$pn=$incdec_ptr864;HEAP8[($454)]=$conv863;var $455=$nx;var $dec865=((($455)-1)&4294967295);$nx=$dec865;var $cmp866=((($dec865))|0)>0;if(!($cmp866)){__label__=267;continue $while_cond849$374;}
68273 var $456=$tr_addr;var $langopts868=(($456)&4294967295);var $break_numbers869=(($langopts868+192)&4294967295);var $457=HEAP32[(($break_numbers869)>>2)];var $458=$nx;var $shl=1<<($458);var $and870=($shl)&($457);var $tobool871=((($and870))|0)!=0;if(!($tobool871)){__label__=267;continue $while_cond849$374;}
68274 var $459=$nw;var $inc873=((($459)+1)&4294967295);$nw=$inc873;var $arrayidx874=(($num_wtab+$459*12)&4294967295);var $460=$arrayidx874;var $461=$ix;var $arrayidx875=(($words+$461*12)&4294967295);var $462=$arrayidx875;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$462;$dest$=$460;$stop$=$src$+12;if(($dest$%4)==($src$%4)&&12>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
68275 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
68276 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $463=$tr_addr;var $langopts876=(($463)&4294967295);var $thousands_sep877=(($langopts876+204)&4294967295);var $464=HEAP32[(($thousands_sep877)>>2)];var $cmp878=((($464))|0)!=32;if($cmp878){__label__=273;;}else{__label__=274;;}
68277 if(__label__==273){var $465=$tr_addr;var $langopts880=(($465)&4294967295);var $thousands_sep881=(($langopts880+204)&4294967295);var $466=HEAP32[(($thousands_sep881)>>2)];var $conv882=((($466))&255);var $467=$pn;var $incdec_ptr883=(($467+1)&4294967295);$pn=$incdec_ptr883;HEAP8[($467)]=$conv882;;}
68278 var $468=$pn;var $incdec_ptr885=(($468+1)&4294967295);$pn=$incdec_ptr885;HEAP8[($468)]=32;var $469=$tr_addr;var $langopts886=(($469)&4294967295);var $break_numbers887=(($langopts886+192)&4294967295);var $470=HEAP32[(($break_numbers887)>>2)];var $471=$nx;var $sub888=((($471)-1)&4294967295);var $shl889=1<<($sub888);var $and890=($shl889)&($470);var $tobool891=((($and890))|0)!=0;if($tobool891){__label__=275;;}else{__label__=276;;}
68279 if(__label__==275){var $472=$pn;var $incdec_ptr893=(($472+1)&4294967295);$pn=$incdec_ptr893;HEAP8[($472)]=48;var $473=$pn;var $incdec_ptr894=(($473+1)&4294967295);$pn=$incdec_ptr894;HEAP8[($473)]=48;;}
68280 var $474=$tr_addr;var $langopts896=(($474)&4294967295);var $break_numbers897=(($langopts896+192)&4294967295);var $475=HEAP32[(($break_numbers897)>>2)];var $476=$nx;var $sub898=((($476)-2)&4294967295);var $shl899=1<<($sub898);var $and900=($shl899)&($475);var $tobool901=((($and900))|0)!=0;if(!($tobool901)){__label__=267;continue $while_cond849$374;}
68281 var $477=$pn;var $incdec_ptr903=(($477+1)&4294967295);$pn=$incdec_ptr903;HEAP8[($477)]=48;__label__=267;continue $while_cond849$374;}
68282 var $478=$pw;var $incdec_ptr907=(($478+-1)&4294967295);$pw=$incdec_ptr907;var $479=$nw;var $arrayidx908=(($num_wtab+$479*12)&4294967295);var $480=$arrayidx908;var $481=$ix;var $arrayidx909=(($words+$481*12)&4294967295);var $482=$arrayidx909;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$482;$dest$=$480;$stop$=$src$+24;if(($dest$%4)==($src$%4)&&24>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
68283 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
68284 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};$j=1;var $483=$j;var $484=$nw;var $cmp91134=((($483))|0)<=((($484))|0);if($cmp91134){__label__=279;;}else{__label__=280;;}
68285 $for_body912$$for_end918$390:do{if(__label__==279){while(1){var $485=$j;var $arrayidx913=(($num_wtab+$485*12)&4294967295);var $flags914=(($arrayidx913)&4294967295);var $486=HEAP32[(($flags914)>>2)];var $and915=($486)&-262209;HEAP32[(($flags914)>>2)]=$and915;var $487=$j;var $inc917=((($487)+1)&4294967295);$j=$inc917;var $488=$j;var $489=$nw;var $cmp911=((($488))|0)<=((($489))|0);if($cmp911){__label__=279;continue;}else{__label__=280;break $for_body912$$for_end918$390;}}}}while(0);var $490=$pn;var $491=$pw;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$491;$dest$=$490;$stop$=$src$+16;if(($dest$%4)==($src$%4)&&16>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
68286 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
68287 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $492=$pn;var $arrayidx919=(($492+16)&4294967295);HEAP8[($arrayidx919)]=0;$nw=0;$pw=$arrayidx920;var $493=$pw;var $494=$pn;var $cmp92235=((($493))>>>0)<((($494))>>>0);if(!($cmp92235)){__label__=293;break $if_then835$$if_else939$368;}
68288 $for_body923$394:while(1){var $495=$tr_addr;var $496=$pw;var $497=$nw;var $inc924=((($497)+1)&4294967295);$nw=$inc924;var $arrayidx925=(($num_wtab+$497*12)&4294967295);var $498=$ix;var $arrayidx926=(($words+$498*12)&4294967295);var $pre_pause927=(($arrayidx926+8)&4294967295);var $499=HEAPU8[($pre_pause927)];var $conv928=((($499))&255);var $call929=__ZL14TranslateWord2P10TranslatorPcP8WORD_TABii($495,$496,$arrayidx925,$conv928,0);$dict_flags=$call929;;while(1){var $500=$pw;var $incdec_ptr931=(($500+1)&4294967295);$pw=$incdec_ptr931;var $501=HEAP8[($500)];var $conv932=(tempInt=(($501)),(tempInt>=128?tempInt-256:tempInt));var $cmp933=((($conv932))|0)!=32;if($cmp933){__label__=282;continue;}else{__label__=283;break;}}
68289 var $502=$ix;var $arrayidx936=(($words+$502*12)&4294967295);var $pre_pause937=(($arrayidx936+8)&4294967295);HEAP8[($pre_pause937)]=0;var $503=$pw;var $504=$pn;var $cmp922=((($503))>>>0)<((($504))>>>0);if($cmp922){__label__=281;continue $for_body923$394;}else{__label__=293;break $if_then835$$if_else939$368;}}}
68290 else if(__label__==284){HEAP32[((_pre_pause)>>2)]=0;var $505=$tr_addr;var $506=$word;var $507=$ix;var $arrayidx940=(($words+$507*12)&4294967295);var $508=$ix;var $arrayidx941=(($words+$508*12)&4294967295);var $pre_pause942=(($arrayidx941+8)&4294967295);var $509=HEAPU8[($pre_pause942)];var $conv943=((($509))&255);var $510=$ix;var $add944=((($510)+1)&4294967295);var $arrayidx945=(($words+$add944*12)&4294967295);var $pre_pause946=(($arrayidx945+8)&4294967295);var $511=HEAPU8[($pre_pause946)];var $conv947=((($511))&255);var $call948=__ZL14TranslateWord2P10TranslatorPcP8WORD_TABii($505,$506,$arrayidx940,$conv943,$conv947);$dict_flags=$call948;var $512=HEAP32[((_pre_pause)>>2)];var $513=$ix;var $add949=((($513)+1)&4294967295);var $arrayidx950=(($words+$add949*12)&4294967295);var $pre_pause951=(($arrayidx950+8)&4294967295);var $514=HEAPU8[($pre_pause951)];var $conv952=((($514))&255);var $cmp953=((($512))|0)>((($conv952))|0);if($cmp953){__label__=285;;}else{__label__=286;;}
68291 if(__label__==285){var $515=HEAP32[((_pre_pause)>>2)];var $conv955=((($515))&255);var $516=$ix;var $add956=((($516)+1)&4294967295);var $arrayidx957=(($words+$add956*12)&4294967295);var $pre_pause958=(($arrayidx957+8)&4294967295);HEAP8[($pre_pause958)]=$conv955;HEAP32[((_pre_pause)>>2)]=0;;}
68292 var $517=$dict_flags;var $and960=($517)&65536;var $tobool961=((($and960))|0)!=0;if($tobool961){__label__=287;;}else{__label__=289;;}
68293 $if_then962$$if_end975$403:do{if(__label__==287){var $518=$word;$pw=$518;var $519=$pw;var $520=HEAP8[($519)];var $conv96427=(tempInt=(($520)),(tempInt>=128?tempInt-256:tempInt));var $cmp96528=((($conv96427))|0)!=32;if(!($cmp96528)){__label__=289;break $if_then962$$if_end975$403;}
68294 while(1){var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=$arraydecay967;$stop$=$dest$+9;$value4$=32;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=32;}
68295 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
68296 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=32;};var $521=$pw;var $call968=__Z7utf8_inPiPKc($c_temp,$521);$nx=$call968;var $522=$pw;var $523=$nx;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$522;$dest$=$arrayidx969;$stop$=$src$+$523;if(($dest$%4)==($src$%4)&&$523>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
68297 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
68298 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $524=$tr_addr;var $525=$ix;var $arrayidx971=(($words+$525*12)&4294967295);var $call972=__ZL14TranslateWord2P10TranslatorPcP8WORD_TABii($524,$arrayidx970,$arrayidx971,0,0);var $526=$nx;var $527=$pw;var $add_ptr973=(($527+$526)&4294967295);$pw=$add_ptr973;var $528=$pw;var $529=HEAP8[($528)];var $conv964=(tempInt=(($529)),(tempInt>=128?tempInt-256:tempInt));var $cmp965=((($conv964))|0)!=32;if($cmp965){__label__=288;continue;}else{__label__=289;break $if_then962$$if_end975$403;}}}}while(0);var $530=$dict_flags;var $and976=($530)&50331648;var $tobool977=((($and976))|0)!=0;if(!($tobool977)){__label__=293;break $if_then835$$if_else939$368;}
68299 var $531=$ix;var $532=$word_count;var $sub979=((($532)-1)&4294967295);var $cmp980=((($531))|0)==((($sub979))|0);if(!($cmp980)){__label__=293;break $if_then835$$if_else939$368;}
68300 var $533=$terminator;var $and982=($533)&4194304;var $tobool983=((($and982))|0)!=0;if(!($tobool983)){__label__=293;break $if_then835$$if_else939$368;}
68301 $clause_pause=10;$tone=4;;}}while(0);var $534=$dict_flags;var $and987=($534)&128;var $tobool988=((($and987))|0)!=0;if(!($tobool988)){__label__=295;break $if_end768$$for_inc992$344;}
68302 var $535=HEAP32[((_dictionary_skipwords)>>2)];var $536=$ix;var $add990=((($536)+($535))&4294967295);$ix=$add990;;}}while(0);var $537=$ix;var $inc993=((($537)+1)&4294967295);$ix=$inc993;var $538=$ix;var $539=$word_count;var $cmp756=((($538))|0)<((($539))|0);if($cmp756){__label__=243;continue $for_body757$337;}else{__label__=296;break $for_body757_lr_ph$$for_end994$335;}}}}while(0);$ix=0;var $540=HEAP32[((_n_ph_list2)>>2)];__lastLabel__=296;;$for_body997$415:while(1){var $541=__lastLabel__==296?$540:($549);var $542=$ix;var $add998=((($542)+($541))&4294967295);var $arrayidx999=((_ph_list2+$add998*8)&4294967295);$p2=$arrayidx999;var $543=$p2;var $phcode=(($543)&4294967295);HEAP8[($phcode)]=9;var $544=$p2;var $stresslevel=(($544+1)&4294967295);HEAP8[($stresslevel)]=0;var $545=HEAP32[(($source_index)>>2)];var $conv1000=((($545))&65535);var $546=$p2;var $sourceix1001=(($546+6)&4294967295);HEAP16[(($sourceix1001)>>1)]=$conv1000;var $547=$p2;var $synthflags=(($547+4)&4294967295);HEAP16[(($synthflags)>>1)]=0;var $548=$ix;var $inc1003=((($548)+1)&4294967295);$ix=$inc1003;var $cmp996=((($inc1003))|0)<2;var $549=HEAP32[((_n_ph_list2)>>2)];if($cmp996){__lastLabel__=297;__label__=297;continue $for_body997$415;}else{__lastLabel__=297;__label__=298;break $for_body997$415;}}
68303 var $add1005=((($549)+2)&4294967295);HEAP32[((_n_ph_list2)>>2)]=$add1005;var $550=HEAP32[((_count_words)>>2)];var $cmp1006=((($550))|0)==0;if($cmp1006){__label__=299;;}else{__label__=300;;}
68304 if(__label__==299){$clause_pause=0;;}
68305 var $call1009=__Z3Eofv();var $tobool1010=((($call1009))|0)!=0;if($tobool1010){__label__=301;;}else{__label__=303;;}
68306 $land_lhs_true1011$$if_end1016$421:do{if(__label__==301){var $551=$word_count;var $cmp1012=((($551))|0)==0;var $552=HEAP32[((_option_endpause)>>2)];var $cmp1014=((($552))|0)==0;var $or_cond11=($cmp1012)|($cmp1014);if(!($or_cond11)){__label__=303;break $land_lhs_true1011$$if_end1016$421;}
68307 $clause_pause=10;;}}while(0);var $553=$tr_addr;var $554=$clause_pause;var $555=HEAP32[((_new_sentence)>>2)];__Z15MakePhonemeListP10Translatorii($553,$554,$555);var $556=$embedded_count;var $tobool1017=((($556))|0)!=0;if($tobool1017){__label__=304;;}else{__label__=305;;}
68308 if(__label__==304){var $557=HEAP32[((_n_phoneme_list)>>2)];var $sub1019=((($557)-2)&4294967295);var $arrayidx1020=((_phoneme_list+$sub1019*24)&4294967295);var $synthflags1021=(($arrayidx1020+4)&4294967295);HEAP16[(($synthflags1021)>>1)]=2;var $558=HEAP32[((__ZL11embedded_ix)>>2)];var $sub1022=((($558)-1)&4294967295);var $arrayidx1023=((_embedded_list+$sub1022*4)&4294967295);var $559=HEAP32[(($arrayidx1023)>>2)];var $or1024=($559)|128;HEAP32[(($arrayidx1023)>>2)]=$or1024;;}
68309 var $560=$tone;var $561=$tone_out_addr;HEAP32[(($561)>>2)]=$560;HEAP32[((_new_sentence)>>2)]=0;var $562=$terminator;var $and1026=($562)&524288;var $tobool1027=((($and1026))|0)!=0;if($tobool1027){__label__=306;;}else{__label__=307;;}
68310 if(__label__==306){HEAP32[((_new_sentence)>>2)]=1;;}
68311 var $563=$voice_change_addr;var $cmp1030=((($563))|0)!=0;if($cmp1030){__label__=308;;}else{__label__=311;;}
68312 if(__label__==308){var $564=$terminator;var $and1032=($564)&131072;var $tobool1033=((($and1032))|0)!=0;var $565=$voice_change_addr;if($tobool1033){__label__=309;;}else{__label__=310;;}
68313 if(__label__==309){HEAP32[(($565)>>2)]=((__ZZ15TranslateClauseP10TranslatorP7__sFILEPKvPiPPcE17voice_change_name)&4294967295);;}
68314 else if(__label__==310){HEAP32[(($565)>>2)]=0;;}}
68315 var $call1038=__Z3Eofv();var $tobool1039=((($call1038))|0)!=0;if($tobool1039){__label__=313;;}else{__label__=312;;}
68316 $if_then1042$$lor_lhs_false1040$437:do{if(__label__==312){var $566=$vp_input_addr;var $cmp1041=((($566))|0)==0;if($cmp1041){__label__=313;break $if_then1042$$lor_lhs_false1040$437;}
68317 var $567=HEAP32[((_option_multibyte)>>2)];var $cmp1044=((($567))|0)==3;if($cmp1044){__label__=315;;}else{__label__=316;;}
68318 if(__label__==315){var $568=HEAP32[((_p_wchar_input)>>2)];var $569=$568;$retval=$569;__label__=317;break $if_then$$if_end$2;}
68319 else if(__label__==316){var $570=HEAP32[((_p_textinput)>>2)];$retval=$570;__label__=317;break $if_then$$if_end$2;}}}while(0);$retval=0;;}}while(0);var $571=$retval;STACKTOP=__stackBase__;return $571;return null;}
68320 function __ZL9IsDigit09j($c){;var __label__;var $retval;var $c_addr;$c_addr=$c;var $0=$c_addr;var $cmp=((($0))>>>0)>=48;var $1=$c_addr;var $cmp1=((($1))>>>0)<=57;var $or_cond=($cmp)&($cmp1);if($or_cond){__label__=1;;}else{__label__=2;;}
68321 if(__label__==1){$retval=1;;}
68322 else if(__label__==2){$retval=0;;}
68323 var $2=$retval;;return $2;return null;}
68324 function __ZL15EmbeddedCommandRj($source_index){;var __label__;var __lastLabel__=null;var $retval;var $source_index_addr;var $commands;var $value;var $sign;var $c;var $p;var $cmd;$source_index_addr=$source_index;$commands=((__str12555)&4294967295);$value=-1;$sign=0;var $0=$source_index_addr;var $1=HEAP32[(($0)>>2)];var $arrayidx=((__ZL6source+$1)&4294967295);var $2=HEAP8[($arrayidx)];$c=$2;var $3=$c;var $conv=((($3))&255);var $cmp=((($conv))|0)==43;if($cmp){__label__=1;;}else{__label__=2;;}
68325 $if_then$$if_else$2:do{if(__label__==1){$sign=64;var $4=$source_index_addr;var $5=HEAP32[(($4)>>2)];var $inc=((($5)+1)&4294967295);HEAP32[(($4)>>2)]=$inc;;}
68326 else if(__label__==2){var $6=$c;var $conv1=((($6))&255);var $cmp2=((($conv1))|0)==45;if(!($cmp2)){__label__=4;break $if_then$$if_else$2;}
68327 $sign=96;var $7=$source_index_addr;var $8=HEAP32[(($7)>>2)];var $inc4=((($8)+1)&4294967295);HEAP32[(($7)>>2)]=$inc4;;}}while(0);var $9=$source_index_addr;var $10=HEAP32[(($9)>>2)];var $arrayidx6=((__ZL6source+$10)&4294967295);var $11=HEAP8[($arrayidx6)];var $conv7=(tempInt=(($11)),(tempInt>=128?tempInt-256:tempInt));var $isdigittmp=((($conv7)-48)&4294967295);var $isdigit=((($isdigittmp))>>>0)<10;var $call=((($isdigit))&1);var $tobool=((($call))|0)!=0;if($tobool){__label__=5;;}else{__label__=7;;}
68328 $if_then8$$if_end16$7:do{if(__label__==5){var $12=$source_index_addr;var $13=HEAP32[(($12)>>2)];var $arrayidx9=((__ZL6source+$13)&4294967295);var $call10=_atoi($arrayidx9);$value=$call10;var $14=$source_index_addr;var $15=HEAP32[(($14)>>2)];var $arrayidx113=((__ZL6source+$15)&4294967295);var $16=HEAP8[($arrayidx113)];var $conv124=(tempInt=(($16)),(tempInt>=128?tempInt-256:tempInt));var $isdigittmp15=((($conv124)-48)&4294967295);var $isdigit26=((($isdigittmp15))>>>0)<10;if(!($isdigit26)){__label__=7;break $if_then8$$if_end16$7;}
68329 while(1){var $17=$source_index_addr;var $18=HEAP32[(($17)>>2)];var $inc15=((($18)+1)&4294967295);HEAP32[(($17)>>2)]=$inc15;var $19=$source_index_addr;var $20=HEAP32[(($19)>>2)];var $arrayidx11=((__ZL6source+$20)&4294967295);var $21=HEAP8[($arrayidx11)];var $conv12=(tempInt=(($21)),(tempInt>=128?tempInt-256:tempInt));var $isdigittmp1=((($conv12)-48)&4294967295);var $isdigit2=((($isdigittmp1))>>>0)<10;var $call13=((($isdigit2))&1);var $tobool14=((($call13))|0)!=0;if($tobool14){__label__=6;continue;}else{__label__=7;break $if_then8$$if_end16$7;}}}}while(0);var $22=$source_index_addr;var $23=HEAP32[(($22)>>2)];var $inc17=((($23)+1)&4294967295);HEAP32[(($22)>>2)]=$inc17;var $arrayidx18=((__ZL6source+$23)&4294967295);var $24=HEAP8[($arrayidx18)];$c=$24;var $25=HEAP32[((__ZL11embedded_ix)>>2)];var $cmp19=((($25))|0)>=248;if($cmp19){__label__=8;;}else{__label__=9;;}
68330 if(__label__==8){$retval=0;;}
68331 else if(__label__==9){var $26=$commands;var $27=$c;var $conv22=((($27))&255);var $call23=__Z8strchr_wPKci($26,$conv22);$p=$call23;var $cmp24=((($call23))|0)==0;if($cmp24){__label__=10;;}else{__label__=11;;}
68332 if(__label__==10){$retval=0;;}
68333 else if(__label__==11){var $28=$p;var $29=$commands;var $sub_ptr_lhs_cast=($28);var $sub_ptr_rhs_cast=($29);var $sub_ptr_sub=((($sub_ptr_lhs_cast)-($sub_ptr_rhs_cast))&4294967295);var $add=((($sub_ptr_sub)+1)&4294967295);$cmd=$add;var $30=$value;var $cmp27=((($30))|0)==-1;if($cmp27){__lastLabel__=11;__label__=12;;}else{__lastLabel__=11;__label__=13;;}
68334 if(__label__==12){var $31=$cmd;var $arrayidx29=((_embedded_default+$31*4)&4294967295);var $32=HEAP32[(($arrayidx29)>>2)];$value=$32;$sign=0;__lastLabel__=12;;}
68335 var $33=__lastLabel__==12?$31:($add);var $cmp31=((($33))|0)==9;if($cmp31){__label__=14;;}else{__label__=15;;}
68336 if(__label__==14){var $34=$value;HEAP32[((__ZL13option_sayas2)>>2)]=$34;HEAP32[((__ZL18count_sayas_digits)>>2)]=0;;}
68337 var $35=$cmd;var $cmp34=((($35))|0)==13;if($cmp34){__label__=16;;}else{__label__=19;;}
68338 if(__label__==16){var $36=$value;var $cmp36=((($36))|0)>=3;if($cmp36){__label__=17;;}else{__label__=18;;}
68339 if(__label__==17){HEAP8[(__ZL13word_emphasis_b)]=1;;}
68340 else if(__label__==18){HEAP8[(__ZL13word_emphasis_b)]=0;;}}
68341 var $37=$cmd;var $38=$sign;var $39=$value;var $shl=((($39)*256)&4294967295);var $add41=((($38)+($37))&4294967295);var $add42=((($add41)+($shl))&4294967295);var $40=HEAP32[((__ZL11embedded_ix)>>2)];var $inc43=((($40)+1)&4294967295);HEAP32[((__ZL11embedded_ix)>>2)]=$inc43;var $arrayidx44=((_embedded_list+$40*4)&4294967295);HEAP32[(($arrayidx44)>>2)]=$add42;$retval=1;;}}
68342 var $41=$retval;;return $41;return null;}
68343 function __ZL13TranslateCharP10TranslatorPcijjPi($tr,$ptr,$prev_in,$c,$next_in,$insert){var __stackBase__=STACKTOP;STACKTOP+=4;_memset(__stackBase__,0,4);var __label__;var $retval;var $tr_addr;var $ptr_addr;var $prev_in_addr;var $c_addr;var $next_in_addr;var $insert_addr;var $code;var $initial;var $medial;var $final;var $next2=__stackBase__;$tr_addr=$tr;$ptr_addr=$ptr;$prev_in_addr=$prev_in;$c_addr=$c;$next_in_addr=$next_in;$insert_addr=$insert;var $0=$tr_addr;var $translator_name=(($0+280)&4294967295);var $1=HEAP32[(($translator_name)>>2)];if($1==24934){__label__=1;;}
68344 else if($1==28268){__label__=1;;}
68345 else if($1==27503){__label__=9;;}
68346 else{__label__=18;;}
68347 $sw_epilog$$sw_bb$$sw_bb17$2:do{if(__label__==1){var $2=$prev_in_addr;var $call=_iswalpha($2);var $tobool=((($call))|0)!=0;if($tobool){__label__=18;break $sw_epilog$$sw_bb$$sw_bb17$2;}
68348 var $3=$ptr_addr;var $arrayidx=(($3+1)&4294967295);var $call1=__Z7utf8_inPiPKc($next2,$arrayidx);var $4=$c_addr;var $cmp=((($4))|0)==39;if(!($cmp)){__label__=18;break $sw_epilog$$sw_bb$$sw_bb17$2;}
68349 var $5=HEAP32[(($next2)>>2)];var $call2=__Z7IsSpacej($5);var $tobool3=((($call2))|0)!=0;if(!($tobool3)){__label__=18;break $sw_epilog$$sw_bb$$sw_bb17$2;}
68350 var $6=$next_in_addr;var $cmp5=((($6))|0)==110;if($cmp5){__label__=5;;}else{__label__=7;;}
68351 $land_lhs_true6$$if_end$7:do{if(__label__==5){var $7=$tr_addr;var $translator_name7=(($7+280)&4294967295);var $8=HEAP32[(($translator_name7)>>2)];var $cmp8=((($8))|0)==24934;if(!($cmp8)){__label__=7;break $land_lhs_true6$$if_end$7;}
68352 var $9=$ptr_addr;var $arrayidx10=(($9)&4294967295);HEAP8[($arrayidx10)]=32;$retval=601;__label__=19;break $sw_epilog$$sw_bb$$sw_bb17$2;}}while(0);var $10=$next_in_addr;var $cmp11=((($10))|0)==110;var $11=$next_in_addr;var $cmp12=((($11))|0)==116;var $or_cond=($cmp11)|($cmp12);if(!($or_cond)){__label__=18;break $sw_epilog$$sw_bb$$sw_bb17$2;}
68353 $retval=601;__label__=19;break $sw_epilog$$sw_bb$$sw_bb17$2;}
68354 else if(__label__==9){var $12=$c_addr;var $sub=((($12)-44032)&4294967295);$code=$sub;var $cmp18=((($sub))|0)>=0;var $13=$c_addr;var $cmp20=((($13))>>>0)<=55215;var $or_cond1=($cmp18)&($cmp20);if($or_cond1){__label__=10;;}else{__label__=15;;}
68355 if(__label__==10){var $14=$code;var $div=((((($14))|0)/28)|0);var $div22=((((($div))|0)/21)|0);$initial=$div22;var $15=$code;var $div23=((((($15))|0)/28)|0);var $rem=((($div23))|0)%21;$medial=$rem;var $16=$code;var $rem24=((($16))|0)%28;$final=$rem24;var $17=$initial;var $cmp25=((($17))|0)==11;if($cmp25){__label__=11;;}else{__label__=13;;}
68356 $if_then26$$if_else$15:do{if(__label__==11){var $18=$medial;var $add=((($18)+4449)&4294967295);$c_addr=$add;var $19=$final;var $cmp27=((($19))|0)>0;if(!($cmp27)){__label__=14;break $if_then26$$if_else$15;}
68357 var $20=$final;var $add29=((($20)+4519)&4294967295);var $21=$insert_addr;HEAP32[(($21)>>2)]=$add29;;}
68358 else if(__label__==13){var $22=$initial;var $add31=((($22)+4352)&4294967295);$c_addr=$add31;var $23=$medial;var $mul=((($23)*28)&4294967295);var $24=$final;var $add33=((($24)+50500)&4294967295);var $add34=((($add33)+($mul))&4294967295);var $25=$insert_addr;HEAP32[(($25)>>2)]=$add34;;}}while(0);var $26=$c_addr;$retval=$26;__label__=19;break $sw_epilog$$sw_bb$$sw_bb17$2;}
68359 else if(__label__==15){var $27=$c_addr;var $sub37=((($27)-12592)&4294967295);$code=$sub37;var $cmp38=((($sub37))|0)>=0;if(!($cmp38)){__label__=18;break $sw_epilog$$sw_bb$$sw_bb17$2;}
68360 var $28=$code;var $cmp40=((($28))|0)<52;if(!($cmp40)){__label__=18;break $sw_epilog$$sw_bb$$sw_bb17$2;}
68361 var $29=$code;var $arrayidx42=((__ZZL13TranslateCharP10TranslatorPcijjPiE20hangul_compatibility+$29)&4294967295);var $30=HEAPU8[($arrayidx42)];var $conv=((($30))&255);var $add43=((($conv)+4352)&4294967295);$retval=$add43;__label__=19;break $sw_epilog$$sw_bb$$sw_bb17$2;}}}while(0);if(__label__==18){var $31=$tr_addr;var $32=$c_addr;var $33=$next_in_addr;var $34=$insert_addr;var $call46=__ZL14SubstituteCharP10TranslatorjjPi($31,$32,$33,$34);$retval=$call46;;}
68362 var $35=$retval;STACKTOP=__stackBase__;return $35;return null;}
68363 function __ZL14TranslateWord2P10TranslatorPcP8WORD_TABii($tr,$word,$wtab,$pre_pause,$next_pause){var __stackBase__=STACKTOP;STACKTOP+=392;_memset(__stackBase__,0,392);var __label__;var __lastLabel__=null;var $retval;var $tr_addr;var $word_addr;var $wtab_addr;var $pre_pause_addr;var $next_pause_addr;var $flags;var $stress;var $next_stress;var $next_tone;var $p;var $srcix;var $embedded_cmd;var $value;var $found_dict_flag;var $ph_code;var $plist2;var $ph;var $max_stress;var $max_stress_ix;var $prev_vowel;var $pitch_raised;var $switch_phonemes;var $first_phoneme;var $source_ix;var $len;var $ix;var $sylimit;var $new_language;var $bad_phoneme=__stackBase__;var $word_flags;var $word_copy_len;var $word_copy=__stackBase__+4;var $old_dictionary_name=__stackBase__+168;var $c1;var $lang_name=__stackBase__+208;var $c2;var $p2;var $ok;var $flags2=__stackBase__+220;var $c_word2=__stackBase__+228;var $ph_buf=__stackBase__+232;$tr_addr=$tr;$word_addr=$word;$wtab_addr=$wtab;$pre_pause_addr=$pre_pause;$next_pause_addr=$next_pause;$flags=0;$next_tone=0;$max_stress_ix=0;$prev_vowel=-1;$pitch_raised=0;$switch_phonemes=-1;$first_phoneme=1;var $0=HEAP32[((_f_logespeak)>>2)];var $cmp=((($0))|0)!=0;if($cmp){__label__=1;;}else{__label__=7;;}
68364 $land_lhs_true$$if_end10$2:do{if(__label__==1){var $1=HEAP32[((_logging_type)>>2)];var $and=($1)&8;var $tobool=((($and))|0)!=0;if(!($tobool)){__label__=7;break $land_lhs_true$$if_end10$2;}
68365 var $2=HEAP32[((_f_logespeak)>>2)];var $3=$wtab_addr;var $flags1=(($3)&4294967295);var $4=HEAP32[(($flags1)>>2)];var $5=$wtab_addr;var $length=(($5+10)&4294967295);var $6=HEAPU8[($length)];var $conv=((($6))&255);var $call=_fprintf($2,((__str9552)&4294967295),allocate([$4,0,0,0,$conv,0,0,0],["i32",0,0,0,"i32",0,0,0],ALLOC_STACK));$ix=0;__lastLabel__=2;;while(1){var $7=__lastLabel__==5?$inc:(0);var $cmp2=((($7))|0)<40;if(!($cmp2)){__label__=6;break;}
68366 var $8=$ix;var $9=$word_addr;var $arrayidx=(($9+$8)&4294967295);var $10=HEAP8[($arrayidx)];var $conv3=(tempInt=(($10)),(tempInt>=128?tempInt-256:tempInt));var $cmp4=((($conv3))|0)==0;if($cmp4){__label__=6;break;}
68367 var $11=$ix;var $12=$word_addr;var $arrayidx6=(($12+$11)&4294967295);var $13=HEAP8[($arrayidx6)];var $conv7=(tempInt=(($13)),(tempInt>=128?tempInt-256:tempInt));var $14=HEAP32[((_f_logespeak)>>2)];var $call8=_fputc($conv7,$14);var $15=$ix;var $inc=((($15)+1)&4294967295);$ix=$inc;__lastLabel__=5;__label__=3;continue;}
68368 var $16=HEAP32[((_f_logespeak)>>2)];var $17=_fwrite(((__str10553)&4294967295),2,1,$16);;}}while(0);var $18=$wtab_addr;var $length11=(($18+10)&4294967295);var $19=HEAPU8[($length11)];var $conv12=((($19))&255);$len=$conv12;var $cmp13=((($conv12))|0)>31;if($cmp13){__label__=8;;}else{__label__=9;;}
68369 if(__label__==8){$len=31;;}
68370 var $20=$wtab_addr;var $sourceix=(($20+6)&4294967295);var $21=HEAPU16[(($sourceix)>>1)];var $conv16=((($21))&65535);var $and17=($conv16)&2047;var $22=$len;var $shl=($22)<<11;var $or=($and17)|($shl);$source_ix=$or;var $23=$wtab_addr;var $arrayidx18=(($23)&4294967295);var $flags19=(($arrayidx18)&4294967295);var $24=HEAP32[(($flags19)>>2)];$word_flags=$24;var $25=$word_flags;var $and20=($25)&64;var $tobool21=((($and20))|0)!=0;if($tobool21){__label__=10;;}else{__label__=18;;}
68371 $if_then22$$if_end33$14:do{if(__label__==10){HEAP8[(__ZL13embedded_flag_b)]=1;;while(1){var $26=HEAP32[((__ZL13embedded_read)>>2)];var $inc23=((($26)+1)&4294967295);HEAP32[((__ZL13embedded_read)>>2)]=$inc23;var $arrayidx24=((_embedded_list+$26*4)&4294967295);var $27=HEAP32[(($arrayidx24)>>2)];$embedded_cmd=$27;var $28=$embedded_cmd;var $shr=($28)>>8;$value=$shr;var $29=$embedded_cmd;var $and25=($29)&31;if($and25==9){__label__=12;;}
68372 else if($and25==13){__label__=13;;}
68373 else if($and25==12){__label__=14;;}
68374 else{__label__=17;;}
68375 if(__label__==12){var $30=$value;HEAP32[((_option_sayas)>>2)]=$30;;}
68376 else if(__label__==13){var $31=$value;HEAP32[((__ZL15option_emphasis)>>2)]=$31;;}
68377 else if(__label__==14){var $32=$value;var $cmp28=((($32))|0)==0;if($cmp28){__label__=15;;}else{__label__=16;;}
68378 if(__label__==15){$pre_pause_addr=0;;}
68379 else if(__label__==16){var $33=$value;var $34=$pre_pause_addr;var $add=((($34)+($33))&4294967295);$pre_pause_addr=$add;;}}
68380 var $35=$embedded_cmd;var $and31=($35)&128;var $cmp32=((($and31))|0)==0;if($cmp32){__label__=11;continue;}else{__label__=18;break $if_then22$$if_end33$14;}}}}while(0);var $36=$word_addr;var $arrayidx34=(($36)&4294967295);var $37=HEAP8[($arrayidx34)];var $conv35=(tempInt=(($37)),(tempInt>=128?tempInt-256:tempInt));var $cmp36=((($conv35))|0)==0;if($cmp36){__label__=19;;}else{__label__=20;;}
68381 $if_then37$$if_end38$27:do{if(__label__==19){HEAP8[(((_word_phonemes)&4294967295))]=0;$retval=0;;}
68382 else if(__label__==20){var $38=$tr_addr;var $prepause_timeout=(($38+8312)&4294967295);var $39=HEAP32[(($prepause_timeout)>>2)];var $cmp39=((($39))|0)>0;if($cmp39){__label__=21;;}else{__label__=22;;}
68383 if(__label__==21){var $40=$tr_addr;var $prepause_timeout41=(($40+8312)&4294967295);var $41=HEAP32[(($prepause_timeout41)>>2)];var $dec=((($41)-1)&4294967295);HEAP32[(($prepause_timeout41)>>2)]=$dec;;}
68384 var $42=HEAP32[((_option_sayas)>>2)];var $and43=($42)&240;var $cmp44=((($and43))|0)==16;if($cmp44){__label__=23;;}else{__label__=25;;}
68385 $if_then45$$if_end51$33:do{if(__label__==23){var $43=$word_flags;var $and46=($43)&512;var $tobool47=((($and46))|0)!=0;if($tobool47){__label__=25;break $if_then45$$if_end51$33;}
68386 var $44=$pre_pause_addr;var $add49=((($44)+4)&4294967295);$pre_pause_addr=$add49;;}}while(0);var $45=$word_flags;var $and52=($45)&2;var $tobool53=((($and52))|0)!=0;if($tobool53){__label__=26;;}else{__label__=32;;}
68387 $if_then54$$if_end72$37:do{if(__label__==26){var $46=HEAP32[((_option_capitals)>>2)];var $cmp55=((($46))|0)>2;var $47=HEAP32[((__ZL11embedded_ix)>>2)];var $cmp57=((($47))|0)<244;var $or_cond=($cmp55)&($cmp57);if(!($or_cond)){__label__=32;break $if_then54$$if_end72$37;}
68388 var $_b3=HEAPU8[(__ZL13embedded_flag_b)];var $48=($_b3)?2:0;var $tobool59=((($48))|0)!=0;if($tobool59){__label__=28;;}else{__label__=29;;}
68389 if(__label__==28){var $49=HEAP32[((__ZL11embedded_ix)>>2)];var $sub=((($49)-1)&4294967295);var $arrayidx61=((_embedded_list+$sub*4)&4294967295);var $50=HEAP32[(($arrayidx61)>>2)];var $and62=($50)&-129;HEAP32[(($arrayidx61)>>2)]=$and62;;}
68390 var $51=HEAP32[((_option_capitals)>>2)];$pitch_raised=$51;var $cmp64=((($51))|0)==3;if($cmp64){__label__=30;;}else{__label__=31;;}
68391 if(__label__==30){$pitch_raised=20;;}
68392 var $52=$pitch_raised;var $shl67=((($52)*256)&4294967295);var $add68=((($shl67)+193)&4294967295);var $53=HEAP32[((__ZL11embedded_ix)>>2)];var $inc69=((($53)+1)&4294967295);HEAP32[((__ZL11embedded_ix)>>2)]=$inc69;var $arrayidx70=((_embedded_list+$53*4)&4294967295);HEAP32[(($arrayidx70)>>2)]=$add68;HEAP8[(__ZL13embedded_flag_b)]=1;;}}while(0);$p=((_word_phonemes)&4294967295);var $54=$word_flags;var $and73=($54)&8;var $tobool74=((($and73))|0)!=0;if($tobool74){__label__=33;;}else{__label__=40;;}
68393 $if_then75$$if_else100$47:do{if(__label__==33){var $55=$word_addr;var $call76=_memcmp($55,((__str11554)&4294967295),3);var $cmp77=((($call76))|0)==0;var $56=$word_addr;if($cmp77){__label__=34;;}else{__label__=38;;}
68394 $if_then78$$if_else96$49:do{if(__label__==34){var $add_ptr=(($56+3)&4294967295);$word_addr=$add_ptr;$ix=0;var $57=$word_addr;var $incdec_ptr32=(($57+1)&4294967295);$word_addr=$incdec_ptr32;var $58=HEAP8[($57)];var $conv8033=(tempInt=(($58)),(tempInt>=128?tempInt-256:tempInt));$c1=$conv8033;var $59=$c1;var $cmp8134=((($59))|0)==32;var $60=$c1;var $cmp8235=((($60))|0)==0;var $or_cond436=($cmp8134)|($cmp8235);if($or_cond436){__label__=36;;}else{__label__=35;;}
68395 $for_end89$$if_end84$51:do{if(__label__==35){while(1){var $61=$c1;var $call85=_tolower($61);var $conv86=((($call85))&255);var $62=$ix;var $inc87=((($62)+1)&4294967295);$ix=$inc87;var $arrayidx88=(($lang_name+$62)&4294967295);HEAP8[($arrayidx88)]=$conv86;var $63=$word_addr;var $incdec_ptr=(($63+1)&4294967295);$word_addr=$incdec_ptr;var $64=HEAP8[($63)];var $conv80=(tempInt=(($64)),(tempInt>=128?tempInt-256:tempInt));$c1=$conv80;var $65=$c1;var $cmp81=((($65))|0)==32;var $66=$c1;var $cmp82=((($66))|0)==0;var $or_cond4=($cmp81)|($cmp82);if($or_cond4){__label__=36;break $for_end89$$if_end84$51;}else{__label__=35;continue;}}}}while(0);var $67=$ix;var $arrayidx90=(($lang_name+$67)&4294967295);HEAP8[($arrayidx90)]=0;var $arraydecay=(($lang_name)&4294967295);var $call91=__Z18LookupPhonemeTablePKc($arraydecay);$ix=$call91;var $cmp92=((($call91))|0)>0;if(!($cmp92)){__label__=39;break $if_then78$$if_else96$49;}
68396 var $68=$ix;__Z18SelectPhonemeTablei($68);HEAP8[(((_word_phonemes)&4294967295))]=21;var $69=$ix;var $conv94=((($69))&255);HEAP8[(((_word_phonemes+1)&4294967295))]=$conv94;HEAP8[(((_word_phonemes+2)&4294967295))]=0;;}
68397 else if(__label__==38){var $arraydecay97=(($bad_phoneme)&4294967295);var $call98=__Z14EncodePhonemesPcS_Ph($56,((_word_phonemes)&4294967295),$arraydecay97);;}}while(0);$flags=-2147483648;;}
68398 else if(__label__==40){$ix=0;;$while_cond$59:while(1){var $70=$ix;var $71=$word_addr;var $arrayidx101=(($71+$70)&4294967295);var $72=HEAP8[($arrayidx101)];var $73=$ix;var $arrayidx102=(($word_copy+$73)&4294967295);HEAP8[($arrayidx102)]=$72;var $conv103=(tempInt=(($72)),(tempInt>=128?tempInt-256:tempInt));$c2=$conv103;var $cmp104=((($conv103))|0)!=32;if(!($cmp104)){__label__=43;break $while_cond$59;}
68399 var $74=$c2;var $cmp106=((($74))|0)!=0;if(!($cmp106)){__label__=43;break $while_cond$59;}
68400 var $76=$ix;var $cmp107=((($76))|0)<160;var $77=$ix;if($cmp107){__lastLabel__=44;;}else{__lastLabel__=44;__label__=46;break $while_cond$59;}
68401 var $inc108=((($77)+1)&4294967295);$ix=$inc108;__label__=41;continue $while_cond$59;}
68402 if(__label__==43){var $75=$ix;__lastLabel__=43;;}
68403 var $78=__lastLabel__==43?$75:($77);$word_copy_len=$78;var $79=HEAP32[((_translator)>>2)];var $80=$word_addr;var $81=$next_pause_addr;var $82=$wtab_addr;var $call109=__Z13TranslateWordP10TranslatorPciP8WORD_TAB($79,$80,$81,$82);$flags=$call109;var $83=$flags;var $and110=($83)&65536;var $tobool111=((($and110))|0)!=0;if($tobool111){__label__=47;;}else{__label__=48;;}
68404 if(__label__==47){var $84=$word_addr;var $arraydecay113=(($word_copy)&4294967295);var $85=$word_copy_len;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$arraydecay113;$dest$=$84;$stop$=$src$+$85;if(($dest$%4)==($src$%4)&&$85>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
68405 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
68406 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $86=$flags;$retval=$86;__label__=171;break $if_then37$$if_end38$27;}
68407 else if(__label__==48){var $87=$flags;var $and115=($87)&8388608;var $tobool116=((($and115))|0)!=0;if($tobool116){__label__=49;;}else{__label__=72;;}
68408 $land_lhs_true117$$if_end192$70:do{if(__label__==49){var $88=$wtab_addr;var $arrayidx118=(($88+12)&4294967295);var $flags119=(($arrayidx118)&4294967295);var $89=HEAP32[(($flags119)>>2)];var $and120=($89)&8;var $tobool121=((($and120))|0)!=0;if($tobool121){__label__=72;break $land_lhs_true117$$if_end192$70;}
68409 $ok=1;var $arrayidx123=(($flags2)&4294967295);HEAP32[(($arrayidx123)>>2)]=0;var $90=$tr_addr;var $langopts=(($90)&4294967295);var $param=(($langopts+24)&4294967295);var $arrayidx124=(($param+44)&4294967295);var $91=HEAP32[(($arrayidx124)>>2)];$sylimit=$91;var $92=$word_addr;$p2=$92;var $93=$p2;var $94=HEAP8[($93)];var $conv12620=(tempInt=(($94)),(tempInt>=128?tempInt-256:tempInt));var $cmp12721=((($conv12620))|0)!=32;var $95=$p2;var $incdec_ptr12922=(($95+1)&4294967295);if($cmp12721){__lastLabel__=50;__label__=51;;}else{__lastLabel__=50;__label__=52;;}
68410 $while_body128$$while_end130$73:do{if(__label__==51){while(1){var $incdec_ptr12923=__lastLabel__==51?$incdec_ptr129:($incdec_ptr12922);$p2=$incdec_ptr12923;var $96=$p2;var $97=HEAP8[($96)];var $conv126=(tempInt=(($97)),(tempInt>=128?tempInt-256:tempInt));var $cmp127=((($conv126))|0)!=32;var $98=$p2;var $incdec_ptr129=(($98+1)&4294967295);if($cmp127){__lastLabel__=51;__label__=51;continue;}else{__lastLabel__=51;__label__=52;break $while_body128$$while_end130$73;}}}}while(0);var $incdec_ptr129_lcssa=__lastLabel__==50?$incdec_ptr12922:($incdec_ptr129);var $call132=__Z7utf8_inPiPKc($c_word2,$incdec_ptr129_lcssa);var $99=HEAP32[(($c_word2)>>2)];var $call133=_iswalpha($99);var $tobool134=((($call133))|0)!=0;if($tobool134){__label__=54;;}else{__label__=53;;}
68411 if(__label__==54){var $_pr=$ok;var $cmp137=((($_pr))|0)!=0;if(!($cmp137)){__label__=72;break $land_lhs_true117$$if_end192$70;}
68412 var $arraydecay139=(($ph_buf)&4294967295);var $call140=_strcpy($arraydecay139,((_word_phonemes)&4294967295));var $100=HEAP32[((_translator)>>2)];var $101=$p2;var $add_ptr141=(($101+1)&4294967295);var $102=$wtab_addr;var $add_ptr142=(($102+12)&4294967295);var $call143=__Z13TranslateWordP10TranslatorPciP8WORD_TAB($100,$add_ptr141,0,$add_ptr142);var $arrayidx144=(($flags2)&4294967295);HEAP32[(($arrayidx144)>>2)]=$call143;var $arrayidx145=(($flags2)&4294967295);var $103=HEAP32[(($arrayidx145)>>2)];var $and146=($103)&67108864;var $tobool147=((($and146))|0)!=0;if($tobool147){__label__=56;;}else{__label__=57;;}
68413 if(__label__==56){$ok=0;;}
68414 var $104=$sylimit;var $and150=($104)&256;var $tobool151=((($and150))|0)!=0;if($tobool151){__label__=58;;}else{__label__=60;;}
68415 $if_then152$$if_end158$83:do{if(__label__==58){var $arrayidx153=(($flags2)&4294967295);var $105=HEAP32[(($arrayidx153)>>2)];var $and154=($105)&1048576;var $cmp155=((($and154))|0)==0;if(!($cmp155)){__label__=60;break $if_then152$$if_end158$83;}
68416 $ok=0;;}}while(0);var $106=$sylimit;var $and159=($106)&512;var $tobool160=((($and159))|0)!=0;if($tobool160){__label__=61;;}else{__label__=63;;}
68417 $land_lhs_true161$$if_end167$87:do{if(__label__==61){var $107=$wtab_addr;var $add_ptr162=(($107+12)&4294967295);var $flags163=(($add_ptr162)&4294967295);var $108=HEAP32[(($flags163)>>2)];var $and164=($108)&16;var $tobool165=((($and164))|0)!=0;if(!($tobool165)){__label__=63;break $land_lhs_true161$$if_end167$87;}
68418 $ok=0;__label__=64;break $land_lhs_true161$$if_end167$87;}}while(0);$if_end173$$if_end167$90:do{if(__label__==63){var $_pr8=$ok;var $cmp168=((($_pr8))|0)==0;if($cmp168){__label__=64;break $if_end173$$if_end167$90;}else{__label__=65;break $if_end173$$if_end167$90;}}}while(0);if(__label__==64){var $arraydecay170=(($ph_buf)&4294967295);var $call171=_strcpy(((_word_phonemes)&4294967295),$arraydecay170);var $_pr10_pr=$ok;var $tobool174=((($_pr10_pr))|0)!=0;if(!($tobool174)){__label__=72;break $land_lhs_true117$$if_end192$70;}}
68419 var $109=$p2;HEAP8[($109)]=45;var $110=HEAP32[((_translator)>>2)];var $111=$word_addr;var $112=$next_pause_addr;var $113=$wtab_addr;var $call176=__Z13TranslateWordP10TranslatorPciP8WORD_TAB($110,$111,$112,$113);$flags=$call176;var $114=$sylimit;var $cmp177=((($114))|0)>0;if($cmp177){__lastLabel__=65;__label__=66;;}else{__lastLabel__=65;__label__=69;;}
68420 if(__label__==66){var $115=$p;var $call179=__ZL14CountSyllablesPh($115);var $116=$sylimit;var $and180=($116)&31;var $cmp181=((($call179))|0)>((($and180))|0);if($cmp181){__label__=67;;}else{__label__=68;;}
68421 if(__label__==67){var $117=$p2;HEAP8[($117)]=32;var $118=HEAP32[((_translator)>>2)];var $119=$word_addr;var $120=$next_pause_addr;var $121=$wtab_addr;var $call183=__Z13TranslateWordP10TranslatorPciP8WORD_TAB($118,$119,$120,$121);$flags=$call183;__label__=72;break $land_lhs_true117$$if_end192$70;}
68422 else if(__label__==68){var $_pr14=$flags;__lastLabel__=68;;}}
68423 var $122=__lastLabel__==68?$_pr14:($call176);var $cmp185=((($122))|0)==0;if($cmp185){__label__=70;;}else{__label__=71;;}
68424 if(__label__==70){var $arrayidx187=(($flags2)&4294967295);var $123=HEAP32[(($arrayidx187)>>2)];$flags=$123;;}
68425 var $124=$flags;var $or189=($124)|128;$flags=$or189;HEAP32[((_dictionary_skipwords)>>2)]=1;;}
68426 else if(__label__==53){$ok=0;;}}}while(0);var $125=$p;var $arrayidx193=(($125)&4294967295);var $126=HEAPU8[($arrayidx193)];var $conv194=((($126))&255);var $cmp195=((($conv194))|0)==21;if($cmp195){__label__=73;;}else{__label__=84;;}
68427 $if_then196$$if_end232$106:do{if(__label__==73){var $127=$word_addr;var $arraydecay197=(($word_copy)&4294967295);var $128=$word_copy_len;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$arraydecay197;$dest$=$127;$stop$=$src$+$128;if(($dest$%4)==($src$%4)&&$128>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
68428 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
68429 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $129=$p;var $arrayidx198=(($129+1)&4294967295);$new_language=$arrayidx198;var $130=$new_language;var $arrayidx199=(($130)&4294967295);var $131=HEAP8[($arrayidx199)];var $conv200=(tempInt=(($131)),(tempInt>=128?tempInt-256:tempInt));var $cmp201=((($conv200))|0)==0;if($cmp201){__label__=74;;}else{__label__=75;;}
68430 if(__label__==74){$new_language=((__str52704)&4294967295);;}
68431 var $arraydecay204=(($old_dictionary_name)&4294967295);var $call205=_strcpy($arraydecay204,((_dictionary_name)&4294967295));var $132=$new_language;var $call206=__Z14SetTranslator2PKc($132);$switch_phonemes=$call206;var $cmp207=((($call206))|0)>=0;if($cmp207){__label__=76;;}else{__label__=79;;}
68432 $if_then208$$if_then217$111:do{if(__label__==76){var $133=HEAP32[((_translator2)>>2)];var $134=$word_addr;var $135=$next_pause_addr;var $136=$wtab_addr;var $call209=__Z13TranslateWordP10TranslatorPciP8WORD_TAB($133,$134,$135,$136);$flags=$call209;var $137=$p;var $arrayidx210=(($137)&4294967295);var $138=HEAPU8[($arrayidx210)];var $conv211=((($138))&255);var $cmp212=((($conv211))|0)==21;if($cmp212){__label__=77;;}else{__label__=78;;}
68433 if(__label__==77){$switch_phonemes=-1;__label__=79;break $if_then208$$if_then217$111;}
68434 else if(__label__==78){var $_pr15=$switch_phonemes;var $cmp216=((($_pr15))|0)<0;if($cmp216){__label__=79;break $if_then208$$if_then217$111;}else{__label__=80;break $if_then208$$if_then217$111;}}}}while(0);if(__label__==79){var $139=$p;var $arrayidx218=(($139)&4294967295);HEAP8[($arrayidx218)]=13;var $140=$p;var $arrayidx219=(($140+1)&4294967295);HEAP8[($arrayidx219)]=13;var $141=$p;var $arrayidx220=(($141+2)&4294967295);HEAP8[($arrayidx220)]=0;;}
68435 var $142=$tr_addr;var $143=$switch_phonemes;var $144=$p;var $call222=__Z24ChangeEquivalentPhonemesP10TranslatoriPc($142,$143,$144);var $tobool223=((($call222))|0)!=0;if($tobool223){__label__=81;;}else{__label__=82;;}
68436 if(__label__==81){$switch_phonemes=-1;;}
68437 else if(__label__==82){var $_pr17=$switch_phonemes;var $cmp226=((($_pr17))|0)==-1;if(!($cmp226)){__label__=84;break $if_then196$$if_end232$106;}}
68438 var $arraydecay228=(($old_dictionary_name)&4294967295);var $call229=_strcpy(((_dictionary_name)&4294967295),$arraydecay228);var $145=HEAP32[((_voice)>>2)];var $phoneme_tab_ix=(($145+40)&4294967295);var $146=HEAP32[(($phoneme_tab_ix)>>2)];__Z18SelectPhonemeTablei($146);var $147=HEAP32[((_voice)>>2)];var $phoneme_tab_ix230=(($147+40)&4294967295);var $148=HEAP32[(($phoneme_tab_ix230)>>2)];$switch_phonemes=$148;;}}while(0);var $149=$word_flags;var $and233=($149)&128;var $tobool234=((($and233))|0)!=0;if($tobool234){__label__=95;;}else{__label__=85;;}
68439 $if_end261$$if_then235$124:do{if(__label__==85){var $150=$flags;var $and236=($150)&268435456;var $tobool237=((($and236))|0)!=0;if($tobool237){__label__=86;;}else{__label__=88;;}
68440 $if_then238$$if_end242$126:do{if(__label__==86){var $151=$pre_pause_addr;var $cmp239=((($151))|0)<1;if(!($cmp239)){__label__=88;break $if_then238$$if_end242$126;}
68441 $pre_pause_addr=1;;}}while(0);var $152=$flags;var $and243=($152)&256;var $tobool244=((($and243))|0)!=0;if(!($tobool244)){__label__=95;break $if_end261$$if_then235$124;}
68442 var $153=$word_flags;var $tobool246=((($153))|0)!=0;if($tobool246){__label__=95;break $if_end261$$if_then235$124;}
68443 var $154=$wtab_addr;var $arrayidx248=(($154+-12)&4294967295);var $flags249=(($arrayidx248)&4294967295);var $155=HEAP32[(($flags249)>>2)];var $and250=($155)&512;var $tobool251=((($and250))|0)!=0;if($tobool251){__label__=95;break $if_end261$$if_then235$124;}
68444 var $156=$tr_addr;var $prepause_timeout253=(($156+8312)&4294967295);var $157=HEAP32[(($prepause_timeout253)>>2)];var $cmp254=((($157))|0)==0;if(!($cmp254)){__label__=95;break $if_end261$$if_then235$124;}
68445 var $158=$pre_pause_addr;var $cmp256=((($158))|0)<4;if($cmp256){__label__=93;;}else{__label__=94;;}
68446 if(__label__==93){$pre_pause_addr=4;;}
68447 var $159=$tr_addr;var $prepause_timeout259=(($159+8312)&4294967295);HEAP32[(($prepause_timeout259)>>2)]=3;;}}while(0);var $160=HEAP32[((__ZL15option_emphasis)>>2)];var $cmp262=((($160))|0)>=3;if(!($cmp262)){__label__=98;break $if_then75$$if_else100$47;}
68448 var $161=$pre_pause_addr;var $cmp264=((($161))|0)<1;if(!($cmp264)){__label__=98;break $if_then75$$if_else100$47;}
68449 $pre_pause_addr=1;;}}}while(0);var $162=HEAP32[((_n_ph_list2)>>2)];var $arrayidx268=((_ph_list2+$162*8)&4294967295);$plist2=$arrayidx268;$stress=0;$next_stress=1;$srcix=0;$max_stress=-1;$found_dict_flag=0;var $163=$flags;var $and269=($163)&-2147483648;var $tobool270=((($and269))|0)!=0;if($tobool270){__label__=99;;}else{__label__=101;;}
68450 $land_lhs_true271$$while_cond276_preheader$141:do{if(__label__==99){var $164=$flags;var $and272=($164)&536870912;var $tobool273=((($and272))|0)!=0;if($tobool273){__label__=101;break $land_lhs_true271$$while_cond276_preheader$141;}
68451 $found_dict_flag=16;;}}while(0);var $165=$pre_pause_addr;var $cmp27729=((($165))|0)>0;var $166=HEAP32[((_n_ph_list2)>>2)];var $cmp27930=((($166))|0)<996;var $or_cond531=($cmp27729)&($cmp27930);if($or_cond531){__lastLabel__=101;__label__=102;;}else{__lastLabel__=101;__label__=106;;}
68452 $while_body281$$while_end292$145:do{if(__label__==102){while(1){var $167=__lastLabel__==101?$165:($173);var $cmp282=((($167))|0)>1;var $168=HEAP32[((_n_ph_list2)>>2)];var $inc284=((($168)+1)&4294967295);HEAP32[((_n_ph_list2)>>2)]=$inc284;var $arrayidx285=((_ph_list2+$168*8)&4294967295);if($cmp282){__label__=103;;}else{__label__=104;;}
68453 if(__label__==103){__ZL9SetPlist2P13PHONEME_LIST2h($arrayidx285,9);var $169=$pre_pause_addr;var $sub286=((($169)-2)&4294967295);$pre_pause_addr=$sub286;;}
68454 else if(__label__==104){__ZL9SetPlist2P13PHONEME_LIST2h($arrayidx285,11);var $170=$pre_pause_addr;var $dec290=((($170)-1)&4294967295);$pre_pause_addr=$dec290;;}
68455 var $171=$tr_addr;var $end_stressed_vowel=(($171+8316)&4294967295);HEAP32[(($end_stressed_vowel)>>2)]=0;var $172=$tr_addr;var $prev_dict_flags=(($172+8320)&4294967295);HEAP32[(($prev_dict_flags)>>2)]=0;var $173=$pre_pause_addr;var $cmp277=((($173))|0)>0;var $174=HEAP32[((_n_ph_list2)>>2)];var $cmp279=((($174))|0)<996;var $or_cond5=($cmp277)&($cmp279);if($or_cond5){__lastLabel__=105;__label__=102;continue;}else{__lastLabel__=105;__label__=106;break $while_body281$$while_end292$145;}}}}while(0);var $175=HEAP32[((_option_capitals)>>2)];var $cmp293=((($175))|0)==1;if($cmp293){__label__=107;;}else{__label__=111;;}
68456 $land_lhs_true294$$if_end315$153:do{if(__label__==107){var $176=$word_flags;var $and295=($176)&2;var $tobool296=((($and295))|0)!=0;if(!($tobool296)){__label__=111;break $land_lhs_true294$$if_end315$153;}
68457 var $177=HEAP32[((_n_ph_list2)>>2)];var $inc298=((($177)+1)&4294967295);HEAP32[((_n_ph_list2)>>2)]=$inc298;var $arrayidx299=((_ph_list2+$177*8)&4294967295);__ZL9SetPlist2P13PHONEME_LIST2h($arrayidx299,10);var $178=HEAP32[((_n_ph_list2)>>2)];var $inc300=((($178)+1)&4294967295);HEAP32[((_n_ph_list2)>>2)]=$inc300;var $arrayidx301=((_ph_list2+$178*8)&4294967295);__ZL9SetPlist2P13PHONEME_LIST2h($arrayidx301,18);var $179=$word_flags;var $and302=($179)&1;var $tobool303=((($and302))|0)!=0;if(!($tobool303)){__label__=111;break $land_lhs_true294$$if_end315$153;}
68458 var $180=$word_addr;var $arrayidx305=(($180+1)&4294967295);var $181=HEAP8[($arrayidx305)];var $conv306=(tempInt=(($181)),(tempInt>=128?tempInt-256:tempInt));var $call307=__Z7IsAlphaj($conv306);var $tobool308=((($call307))|0)!=0;if(!($tobool308)){__label__=111;break $land_lhs_true294$$if_end315$153;}
68459 var $182=HEAP32[((_n_ph_list2)>>2)];var $inc310=((($182)+1)&4294967295);HEAP32[((_n_ph_list2)>>2)]=$inc310;var $arrayidx311=((_ph_list2+$182*8)&4294967295);__ZL9SetPlist2P13PHONEME_LIST2h($arrayidx311,10);var $183=HEAP32[((_n_ph_list2)>>2)];var $inc312=((($183)+1)&4294967295);HEAP32[((_n_ph_list2)>>2)]=$inc312;var $arrayidx313=((_ph_list2+$183*8)&4294967295);__ZL9SetPlist2P13PHONEME_LIST2h($arrayidx313,18);;}}while(0);var $184=$switch_phonemes;var $cmp316=((($184))|0)>=0;if($cmp316){__label__=112;;}else{__label__=113;;}
68460 if(__label__==112){var $185=HEAP32[((_n_ph_list2)>>2)];var $arrayidx318=((_ph_list2+$185*8)&4294967295);__ZL9SetPlist2P13PHONEME_LIST2h($arrayidx318,21);var $186=$switch_phonemes;var $conv319=((($186))&255);var $187=HEAP32[((_n_ph_list2)>>2)];var $inc320=((($187)+1)&4294967295);HEAP32[((_n_ph_list2)>>2)]=$inc320;var $arrayidx321=((_ph_list2+$187*8)&4294967295);var $tone_ph=(($arrayidx321+3)&4294967295);HEAP8[($tone_ph)]=$conv319;;}
68461 var $188=$word_flags;var $and323=($188)&128;var $tobool324=((($and323))|0)!=0;if($tobool324){__label__=114;;}else{__label__=116;;}
68462 $land_lhs_true325$$if_end331$162:do{if(__label__==114){var $189=$p;var $190=HEAPU8[($189)];var $idxprom=((($190))&255);var $arrayidx326=((_phoneme_tab+$idxprom*4)&4294967295);var $191=HEAP32[(($arrayidx326)>>2)];var $type=(($191+11)&4294967295);var $192=HEAPU8[($type)];var $conv327=((($192))&255);var $cmp328=((($conv327))|0)==0;if(!($cmp328)){__label__=116;break $land_lhs_true325$$if_end331$162;}
68463 var $193=$p;var $incdec_ptr330=(($193+1)&4294967295);$p=$incdec_ptr330;;}}while(0);var $194=$p;var $arrayidx332=(($194)&4294967295);var $195=HEAPU8[($arrayidx332)];var $conv333=((($195))&255);var $cmp334=((($conv333))|0)==0;if($cmp334){__label__=117;;}else{__label__=119;;}
68464 $land_lhs_true335$$while_cond341_preheader$166:do{if(__label__==117){var $_b2=HEAPU8[(__ZL13embedded_flag_b)];var $196=($_b2)?2:0;var $tobool336=((($196))|0)!=0;if(!($tobool336)){__label__=119;break $land_lhs_true335$$while_cond341_preheader$166;}
68465 var $197=$p;var $arrayidx338=(($197)&4294967295);HEAP8[($arrayidx338)]=23;var $198=$p;var $arrayidx339=(($198+1)&4294967295);HEAP8[($arrayidx339)]=0;;}}while(0);var $199=$p;var $incdec_ptr34224=(($199+1)&4294967295);$p=$incdec_ptr34224;var $200=HEAPU8[($199)];$ph_code=$200;var $conv34325=((($200))&255);var $cmp34426=((($conv34325))|0)!=0;var $201=HEAP32[((_n_ph_list2)>>2)];var $cmp34627=((($201))|0)<996;var $or_cond628=($cmp34426)&($cmp34627);if($or_cond628){__label__=120;;}else{__label__=157;;}
68466 $while_body348$$while_end511$170:do{if(__label__==120){$while_body348$171:while(1){var $202=$ph_code;var $conv349=((($202))&255);var $cmp350=((($conv349))|0)==255;if($cmp350){__label__=121;;}else{__label__=122;;}
68467 $while_cond341_backedge$$if_end352$173:do{if(__label__==122){var $206=$ph_code;var $idxprom353=((($206))&255);var $arrayidx354=((_phoneme_tab+$idxprom353*4)&4294967295);var $207=HEAP32[(($arrayidx354)>>2)];$ph=$207;var $208=$ph_code;var $conv355=((($208))&255);var $cmp356=((($conv355))|0)==21;if($cmp356){__label__=123;;}else{__label__=124;;}
68468 if(__label__==123){var $209=$ph_code;var $210=HEAP32[((_n_ph_list2)>>2)];var $arrayidx358=((_ph_list2+$210*8)&4294967295);var $phcode=(($arrayidx358)&4294967295);HEAP8[($phcode)]=$209;var $211=HEAP32[((_n_ph_list2)>>2)];var $arrayidx359=((_ph_list2+$211*8)&4294967295);var $sourceix360=(($arrayidx359+6)&4294967295);HEAP16[(($sourceix360)>>1)]=0;var $_b1=HEAPU8[(__ZL13embedded_flag_b)];var $212=($_b1)?2:0;var $conv361=((($212))&65535);var $213=HEAP32[((_n_ph_list2)>>2)];var $arrayidx362=((_ph_list2+$213*8)&4294967295);var $synthflags=(($arrayidx362+4)&4294967295);HEAP16[(($synthflags)>>1)]=$conv361;var $214=$p;var $incdec_ptr363=(($214+1)&4294967295);$p=$incdec_ptr363;var $215=HEAP8[($214)];var $216=HEAP32[((_n_ph_list2)>>2)];var $inc364=((($216)+1)&4294967295);HEAP32[((_n_ph_list2)>>2)]=$inc364;var $arrayidx365=((_ph_list2+$216*8)&4294967295);var $tone_ph366=(($arrayidx365+3)&4294967295);HEAP8[($tone_ph366)]=$215;;}
68469 else if(__label__==124){var $217=$ph;var $type368=(($217+11)&4294967295);var $218=HEAPU8[($type368)];var $conv369=((($218))&255);var $cmp370=((($conv369))|0)==1;if($cmp370){__label__=125;;}else{__label__=130;;}
68470 if(__label__==125){var $219=$ph;var $program=(($219+8)&4294967295);var $220=HEAPU16[(($program)>>1)];var $conv372=((($220))&65535);var $cmp373=((($conv372))|0)==0;if($cmp373){__label__=126;;}else{__label__=127;;}
68471 if(__label__==126){var $221=$ph;var $std_length=(($221+14)&4294967295);var $222=HEAPU8[($std_length)];var $conv375=((($222))&255);$next_stress=$conv375;;}
68472 else if(__label__==127){var $223=$prev_vowel;var $cmp377=((($223))|0)>=0;var $224=$ph_code;if($cmp377){__label__=128;;}else{__label__=129;;}
68473 if(__label__==128){var $225=$prev_vowel;var $arrayidx379=((_ph_list2+$225*8)&4294967295);var $tone_ph380=(($arrayidx379+3)&4294967295);HEAP8[($tone_ph380)]=$224;;}
68474 else if(__label__==129){var $conv382=((($224))&255);$next_tone=$conv382;;}}}
68475 else if(__label__==130){var $226=$ph_code;var $conv386=((($226))&255);var $cmp387=((($conv386))|0)==20;if($cmp387){__label__=131;;}else{__label__=132;;}
68476 if(__label__==131){var $227=HEAP32[((_n_ph_list2)>>2)];var $sub389=((($227)-1)&4294967295);$prev_vowel=$sub389;var $228=$prev_vowel;var $arrayidx390=((_ph_list2+$228*8)&4294967295);var $synthflags391=(($arrayidx390+4)&4294967295);var $229=HEAPU16[(($synthflags391)>>1)];var $conv392=((($229))&65535);var $or393=($conv392)|4;var $conv394=((($or393))&65535);HEAP16[(($synthflags391)>>1)]=$conv394;var $230=$next_stress;var $conv395=((($230))&255);var $231=$prev_vowel;var $arrayidx396=((_ph_list2+$231*8)&4294967295);var $stresslevel=(($arrayidx396+1)&4294967295);HEAP8[($stresslevel)]=$conv395;;}
68477 else if(__label__==132){var $232=$ph_code;var $conv398=((($232))&255);var $cmp399=((($conv398))|0)==12;if($cmp399){__label__=133;;}else{__label__=134;;}
68478 if(__label__==133){var $233=HEAP32[((_n_ph_list2)>>2)];var $sub401=((($233)-1)&4294967295);var $arrayidx402=((_ph_list2+$sub401*8)&4294967295);var $synthflags403=(($arrayidx402+4)&4294967295);var $234=HEAPU16[(($synthflags403)>>1)];var $conv404=((($234))&65535);var $or405=($conv404)|8;var $conv406=((($or405))&65535);HEAP16[(($synthflags403)>>1)]=$conv406;;}
68479 else if(__label__==134){var $235=$ph_code;var $conv408=((($235))&255);var $cmp409=((($conv408))|0)==15;if($cmp409){__label__=135;;}else{__label__=136;;}
68480 if(__label__==135){var $236=$source_ix;var $add411=((($236)+1)&4294967295);$srcix=$add411;;}
68481 else if(__label__==136){var $237=$ph_code;var $conv413=((($237))&255);var $cmp414=((($conv413))|0)==22;if($cmp414){__label__=137;;}else{__label__=139;;}
68482 if(__label__==137){var $238=$tr_addr;var $langopts416=(($238)&4294967295);var $param417=(($langopts416+24)&4294967295);var $arrayidx418=(($param417+56)&4294967295);var $239=HEAP32[(($arrayidx418)>>2)];var $tobool419=((($239))|0)!=0;if(!($tobool419)){__label__=121;break $while_cond341_backedge$$if_end352$173;}
68483 var $240=$flags;var $or421=($240)|524288;$flags=$or421;;}
68484 else if(__label__==139){var $241=$ph_code;var $242=HEAP32[((_n_ph_list2)>>2)];var $arrayidx424=((_ph_list2+$242*8)&4294967295);var $phcode425=(($arrayidx424)&4294967295);HEAP8[($phcode425)]=$241;var $243=HEAP32[((_n_ph_list2)>>2)];var $arrayidx426=((_ph_list2+$243*8)&4294967295);var $tone_ph427=(($arrayidx426+3)&4294967295);HEAP8[($tone_ph427)]=0;var $_b=HEAPU8[(__ZL13embedded_flag_b)];var $244=($_b)?2:0;var $245=$found_dict_flag;var $or428=($244)|($245);var $conv429=((($or428))&65535);var $246=HEAP32[((_n_ph_list2)>>2)];var $arrayidx430=((_ph_list2+$246*8)&4294967295);var $synthflags431=(($arrayidx430+4)&4294967295);HEAP16[(($synthflags431)>>1)]=$conv429;HEAP8[(__ZL13embedded_flag_b)]=0;var $247=$srcix;var $conv432=((($247))&65535);var $248=HEAP32[((_n_ph_list2)>>2)];var $arrayidx433=((_ph_list2+$248*8)&4294967295);var $sourceix434=(($arrayidx433+6)&4294967295);HEAP16[(($sourceix434)>>1)]=$conv432;$srcix=0;var $249=$ph;var $type435=(($249+11)&4294967295);var $250=HEAPU8[($type435)];var $conv436=((($250))&255);var $cmp437=((($conv436))|0)==2;if($cmp437){__label__=140;;}else{__label__=149;;}
68485 $if_then438$$if_else466$200:do{if(__label__==140){var $251=$next_stress;$stress=$251;$next_stress=1;var $252=$stress;var $cmp439=((($252))|0)>=4;if($cmp439){__label__=141;;}else{__label__=142;;}
68486 if(__label__==141){HEAP8[(__ZL18any_stressed_words_b)]=1;;}
68487 var $253=$prev_vowel;var $cmp442=((($253))|0)>=0;if($cmp442){__label__=143;;}else{__label__=145;;}
68488 $land_lhs_true443$$if_end451$205:do{if(__label__==143){var $254=HEAP32[((_n_ph_list2)>>2)];var $sub444=((($254)-1)&4294967295);var $255=$prev_vowel;var $cmp445=((($sub444))|0)!=((($255))|0);if(!($cmp445)){__label__=145;break $land_lhs_true443$$if_end451$205;}
68489 var $256=$stress;var $conv447=((($256))&255);var $257=HEAP32[((_n_ph_list2)>>2)];var $sub448=((($257)-1)&4294967295);var $arrayidx449=((_ph_list2+$sub448*8)&4294967295);var $stresslevel450=(($arrayidx449+1)&4294967295);HEAP8[($stresslevel450)]=$conv447;;}}while(0);var $258=HEAP32[((_n_ph_list2)>>2)];var $arrayidx452=((_ph_list2+$258*8)&4294967295);var $synthflags453=(($arrayidx452+4)&4294967295);var $259=HEAPU16[(($synthflags453)>>1)];var $conv454=((($259))&65535);var $or455=($conv454)|4;var $conv456=((($or455))&65535);HEAP16[(($synthflags453)>>1)]=$conv456;var $260=HEAP32[((_n_ph_list2)>>2)];$prev_vowel=$260;var $261=$stress;var $262=$max_stress;var $cmp457=((($261))|0)>((($262))|0);if($cmp457){__label__=146;;}else{__label__=147;;}
68490 if(__label__==146){var $263=$stress;$max_stress=$263;var $264=HEAP32[((_n_ph_list2)>>2)];$max_stress_ix=$264;;}
68491 var $265=$next_tone;var $cmp460=((($265))|0)!=0;if(!($cmp460)){__label__=156;break $if_then438$$if_else466$200;}
68492 var $266=$next_tone;var $conv462=((($266))&255);var $267=HEAP32[((_n_ph_list2)>>2)];var $arrayidx463=((_ph_list2+$267*8)&4294967295);var $tone_ph464=(($arrayidx463+3)&4294967295);HEAP8[($tone_ph464)]=$conv462;$next_tone=0;;}
68493 else if(__label__==149){var $268=$first_phoneme;var $tobool467=((($268))|0)!=0;if(!($tobool467)){__label__=156;break $if_then438$$if_else466$200;}
68494 var $269=$tr_addr;var $langopts469=(($269)&4294967295);var $param470=(($langopts469+24)&4294967295);var $arrayidx471=(($param470+56)&4294967295);var $270=HEAP32[(($arrayidx471)>>2)];var $tobool472=((($270))|0)!=0;if(!($tobool472)){__label__=156;break $if_then438$$if_else466$200;}
68495 var $271=$tr_addr;var $prev_dict_flags474=(($271+8320)&4294967295);var $272=HEAP32[(($prev_dict_flags474)>>2)];var $and475=($272)&524288;var $tobool476=((($and475))|0)!=0;if($tobool476){__label__=152;;}else{__label__=153;;}
68496 $land_lhs_true477$$lor_lhs_false483$216:do{if(__label__==152){var $273=$tr_addr;var $langopts478=(($273)&4294967295);var $param479=(($langopts478+24)&4294967295);var $arrayidx480=(($param479+56)&4294967295);var $274=HEAP32[(($arrayidx480)>>2)];var $and481=($274)&1;var $tobool482=((($and481))|0)!=0;if($tobool482){__label__=155;break $land_lhs_true477$$lor_lhs_false483$216;}else{__label__=153;break $land_lhs_true477$$lor_lhs_false483$216;}}}while(0);if(__label__==153){var $275=$tr_addr;var $end_stressed_vowel484=(($275+8316)&4294967295);var $276=HEAP32[(($end_stressed_vowel484)>>2)];var $tobool485=((($276))|0)!=0;if(!($tobool485)){__label__=156;break $if_then438$$if_else466$200;}
68497 var $277=$tr_addr;var $langopts487=(($277)&4294967295);var $param488=(($langopts487+24)&4294967295);var $arrayidx489=(($param488+56)&4294967295);var $278=HEAP32[(($arrayidx489)>>2)];var $and490=($278)&2;var $tobool491=((($and490))|0)!=0;if(!($tobool491)){__label__=156;break $if_then438$$if_else466$200;}}
68498 var $279=HEAP32[((_n_ph_list2)>>2)];var $arrayidx493=((_ph_list2+$279*8)&4294967295);var $synthflags494=(($arrayidx493+4)&4294967295);var $280=HEAPU16[(($synthflags494)>>1)];var $conv495=((($280))&65535);var $or496=($conv495)|8;var $conv497=((($or496))&65535);HEAP16[(($synthflags494)>>1)]=$conv497;;}}while(0);var $281=$stress;var $conv501=((($281))&255);var $282=HEAP32[((_n_ph_list2)>>2)];var $arrayidx502=((_ph_list2+$282*8)&4294967295);var $stresslevel503=(($arrayidx502+1)&4294967295);HEAP8[($stresslevel503)]=$conv501;var $283=HEAP32[((_n_ph_list2)>>2)];var $inc504=((($283)+1)&4294967295);HEAP32[((_n_ph_list2)>>2)]=$inc504;$first_phoneme=0;;}}}}}}}}while(0);var $203=$p;var $incdec_ptr342=(($203+1)&4294967295);$p=$incdec_ptr342;var $204=HEAPU8[($203)];$ph_code=$204;var $conv343=((($204))&255);var $cmp344=((($conv343))|0)!=0;var $205=HEAP32[((_n_ph_list2)>>2)];var $cmp346=((($205))|0)<996;var $or_cond6=($cmp344)&($cmp346);if($or_cond6){__label__=120;continue $while_body348$171;}else{__label__=157;break $while_body348$$while_end511$170;}}}}while(0);var $284=$word_flags;var $and512=($284)&131072;var $tobool513=((($and512))|0)!=0;if($tobool513){__label__=158;;}else{__label__=159;;}
68499 if(__label__==158){var $285=HEAP32[((_n_ph_list2)>>2)];var $inc515=((($285)+1)&4294967295);HEAP32[((_n_ph_list2)>>2)]=$inc515;var $arrayidx516=((_ph_list2+$285*8)&4294967295);__ZL9SetPlist2P13PHONEME_LIST2h($arrayidx516,27);;}
68500 var $286=$word_flags;var $and518=($286)&128;var $cmp519=((($and518))|0)==0;if($cmp519){__label__=160;;}else{__label__=161;;}
68501 if(__label__==160){var $287=$source_ix;var $conv521=((($287))&65535);var $288=$plist2;var $sourceix522=(($288+6)&4294967295);HEAP16[(($sourceix522)>>1)]=$conv521;;}
68502 var $289=$tr_addr;var $end_stressed_vowel524=(($289+8316)&4294967295);HEAP32[(($end_stressed_vowel524)>>2)]=0;var $290=$stress;var $cmp525=((($290))|0)>=4;if($cmp525){__label__=162;;}else{__label__=164;;}
68503 $land_lhs_true526$$if_end537$231:do{if(__label__==162){var $291=HEAP32[((_n_ph_list2)>>2)];var $sub527=((($291)-1)&4294967295);var $arrayidx528=((_ph_list2+$sub527*8)&4294967295);var $phcode529=(($arrayidx528)&4294967295);var $292=HEAPU8[($phcode529)];var $idxprom530=((($292))&255);var $arrayidx531=((_phoneme_tab+$idxprom530*4)&4294967295);var $293=HEAP32[(($arrayidx531)>>2)];var $type532=(($293+11)&4294967295);var $294=HEAPU8[($type532)];var $conv533=((($294))&255);var $cmp534=((($conv533))|0)==2;if(!($cmp534)){__label__=164;break $land_lhs_true526$$if_end537$231;}
68504 var $295=$tr_addr;var $end_stressed_vowel536=(($295+8316)&4294967295);HEAP32[(($end_stressed_vowel536)>>2)]=1;;}}while(0);var $296=$switch_phonemes;var $cmp538=((($296))|0)>=0;if($cmp538){__label__=165;;}else{__label__=166;;}
68505 if(__label__==165){var $arraydecay540=(($old_dictionary_name)&4294967295);var $call541=_strcpy(((_dictionary_name)&4294967295),$arraydecay540);var $297=HEAP32[((_voice)>>2)];var $phoneme_tab_ix542=(($297+40)&4294967295);var $298=HEAP32[(($phoneme_tab_ix542)>>2)];__Z18SelectPhonemeTablei($298);var $299=HEAP32[((_n_ph_list2)>>2)];var $arrayidx543=((_ph_list2+$299*8)&4294967295);__ZL9SetPlist2P13PHONEME_LIST2h($arrayidx543,21);var $300=HEAP32[((_voice)>>2)];var $phoneme_tab_ix544=(($300+40)&4294967295);var $301=HEAP32[(($phoneme_tab_ix544)>>2)];var $conv545=((($301))&255);var $302=HEAP32[((_n_ph_list2)>>2)];var $inc546=((($302)+1)&4294967295);HEAP32[((_n_ph_list2)>>2)]=$inc546;var $arrayidx547=((_ph_list2+$302*8)&4294967295);var $tone_ph548=(($arrayidx547+3)&4294967295);HEAP8[($tone_ph548)]=$conv545;;}
68506 var $303=$pitch_raised;var $cmp550=((($303))|0)>0;if($cmp550){__label__=167;;}else{__label__=168;;}
68507 if(__label__==167){var $304=$pitch_raised;var $shl552=((($304)*256)&4294967295);var $add553=((($shl552)+225)&4294967295);var $305=HEAP32[((__ZL11embedded_ix)>>2)];var $inc554=((($305)+1)&4294967295);HEAP32[((__ZL11embedded_ix)>>2)]=$inc554;var $arrayidx555=((_embedded_list+$305*4)&4294967295);HEAP32[(($arrayidx555)>>2)]=$add553;var $306=HEAP32[((_n_ph_list2)>>2)];var $arrayidx556=((_ph_list2+$306*8)&4294967295);__ZL9SetPlist2P13PHONEME_LIST2h($arrayidx556,10);var $307=HEAP32[((_n_ph_list2)>>2)];var $inc557=((($307)+1)&4294967295);HEAP32[((_n_ph_list2)>>2)]=$inc557;var $arrayidx558=((_ph_list2+$307*8)&4294967295);var $synthflags559=(($arrayidx558+4)&4294967295);HEAP16[(($synthflags559)>>1)]=2;;}
68508 var $308=$flags;var $and561=($308)&4096;var $tobool562=((($and561))|0)!=0;if($tobool562){__label__=169;;}else{__label__=170;;}
68509 if(__label__==169){var $309=$max_stress_ix;var $arrayidx564=((_ph_list2+$309*8)&4294967295);var $synthflags565=(($arrayidx564+4)&4294967295);var $310=HEAPU16[(($synthflags565)>>1)];var $conv566=((($310))&65535);var $or567=($conv566)|64;var $conv568=((($or567))&65535);HEAP16[(($synthflags565)>>1)]=$conv568;;}
68510 var $311=$flags;var $312=$tr_addr;var $prev_dict_flags570=(($312+8320)&4294967295);HEAP32[(($prev_dict_flags570)>>2)]=$311;var $313=$flags;$retval=$313;;}}while(0);var $314=$retval;STACKTOP=__stackBase__;return $314;return null;}
68511 function __Z8InitTexti($control){;var __label__;var $control_addr;$control_addr=$control;HEAP32[((_count_sentences)>>2)]=0;HEAP32[((_count_words)>>2)]=0;HEAP32[((_end_character_position)>>2)]=0;HEAP32[((_skip_sentences)>>2)]=0;HEAP8[(((_skip_marker)&4294967295))]=0;HEAP32[((_skip_words)>>2)]=0;HEAP32[((_skip_characters)>>2)]=0;HEAP32[((_skipping_text)>>2)]=0;HEAP32[((_new_sentence)>>2)]=1;HEAP32[((_option_sayas)>>2)]=0;HEAP32[((__ZL13option_sayas2)>>2)]=0;HEAP32[((__ZL15option_emphasis)>>2)]=0;HEAP8[(__ZL13word_emphasis_b)]=0;HEAP8[(__ZL13embedded_flag_b)]=0;__Z9InitText2v();var $0=$control_addr;var $and=($0)&8192;var $cmp=((($and))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
68512 if(__label__==1){__Z12InitNamedatav();;};return;return;}
68513 function __ZL14CountSyllablesPh($phonemes){;var __label__;var $phonemes_addr;var $count;var $phon;$phonemes_addr=$phonemes;$count=0;var $0=$phonemes_addr;var $incdec_ptr1=(($0+1)&4294967295);$phonemes_addr=$incdec_ptr1;var $1=HEAPU8[($0)];var $conv2=((($1))&255);$phon=$conv2;var $cmp3=((($conv2))|0)!=0;if($cmp3){__label__=1;;}else{__label__=4;;}
68514 $while_body$$while_end$2:do{if(__label__==1){while(1){var $2=$phon;var $arrayidx=((_phoneme_tab+$2*4)&4294967295);var $3=HEAP32[(($arrayidx)>>2)];var $type=(($3+11)&4294967295);var $4=HEAPU8[($type)];var $conv1=((($4))&255);var $cmp2=((($conv1))|0)==2;if($cmp2){__label__=2;;}else{__label__=3;;}
68515 if(__label__==2){var $5=$count;var $inc=((($5)+1)&4294967295);$count=$inc;;}
68516 var $6=$phonemes_addr;var $incdec_ptr=(($6+1)&4294967295);$phonemes_addr=$incdec_ptr;var $7=HEAPU8[($6)];var $conv=((($7))&255);$phon=$conv;var $cmp=((($conv))|0)!=0;if($cmp){__label__=1;continue;}else{__label__=4;break $while_body$$while_end$2;}}}}while(0);var $8=$count;;return $8;return null;}
68517 function __ZL9SetPlist2P13PHONEME_LIST2h($p,$phcode){;var __label__;var $p_addr;var $phcode_addr;$p_addr=$p;$phcode_addr=$phcode;var $0=$phcode_addr;var $1=$p_addr;var $phcode1=(($1)&4294967295);HEAP8[($phcode1)]=$0;var $2=$p_addr;var $stresslevel=(($2+1)&4294967295);HEAP8[($stresslevel)]=0;var $3=$p_addr;var $tone_ph=(($3+3)&4294967295);HEAP8[($tone_ph)]=0;var $_b=HEAPU8[(__ZL13embedded_flag_b)];var $4=($_b)?2:0;var $conv=((($4))&65535);var $5=$p_addr;var $synthflags=(($5+4)&4294967295);HEAP16[(($synthflags)>>1)]=$conv;var $6=$p_addr;var $sourceix=(($6+6)&4294967295);HEAP16[(($sourceix)>>1)]=0;HEAP8[(__ZL13embedded_flag_b)]=0;;return;return;}
68518 function __ZL14SubstituteCharP10TranslatorjjPi($tr,$c,$next_in,$insert){;var __label__;var __lastLabel__=null;var $retval;var $tr_addr;var $c_addr;var $next_in_addr;var $insert_addr;var $ix;var $word;var $new_c;var $c2;var $c_lower;var $upper_case;var $replace_chars;$tr_addr=$tr;$c_addr=$c;$next_in_addr=$next_in;$insert_addr=$insert;$upper_case=0;var $_b=HEAPU8[(__ZZL14SubstituteCharP10TranslatorjjPiE11ignore_next_b)];var $0=((($_b))&1);var $tobool=((($0))|0)!=0;if($tobool){__label__=1;;}else{__label__=2;;}
68519 if(__label__==1){HEAP8[(__ZZL14SubstituteCharP10TranslatorjjPiE11ignore_next_b)]=0;$retval=8;;}
68520 else if(__label__==2){var $1=$c_addr;var $cmp=((($1))|0)==0;if($cmp){__label__=3;;}else{__label__=4;;}
68521 if(__label__==3){$retval=0;;}
68522 else if(__label__==4){var $2=$tr_addr;var $langopts=(($2)&4294967295);var $replace_chars3=(($langopts+264)&4294967295);var $3=HEAP32[(($replace_chars3)>>2)];$replace_chars=$3;var $cmp4=((($3))|0)==0;var $4=$c_addr;if($cmp4){__label__=5;;}else{__label__=6;;}
68523 if(__label__==5){$retval=$4;;}
68524 else if(__label__==6){$c_lower=$4;var $call=_iswupper($4);var $tobool7=((($call))|0)!=0;if($tobool7){__label__=7;;}else{__label__=8;;}
68525 if(__label__==7){var $5=$c_addr;var $call9=_towlower($5);$c_lower=$call9;$upper_case=1;;}
68526 $new_c=0;$ix=0;;$for_cond$14:while(1){var $6=$ix;var $7=$replace_chars;var $arrayidx=(($7+4*$6)&4294967295);var $8=HEAP32[(($arrayidx)>>2)];$word=$8;var $cmp11=((($8))|0)!=0;if(!($cmp11)){__label__=16;break $for_cond$14;}
68527 var $9=$c_lower;var $10=$word;var $and=($10)&65535;var $cmp12=((($9))|0)==((($and))|0);if($cmp12){__label__=11;;}else{__label__=15;;}
68528 if(__label__==11){var $11=$word;var $shr=($11)>>>16;var $cmp14=((($shr))|0)==0;if($cmp14){__label__=12;break $for_cond$14;}
68529 var $15=$word;var $shr18=($15)>>>16;var $16=$next_in_addr;var $call19=_towlower($16);var $cmp20=((($shr18))|0)==((($call19))|0);if($cmp20){__label__=14;break $for_cond$14;}}
68530 var $20=$ix;var $add26=((($20)+2)&4294967295);$ix=$add26;__label__=9;continue $for_cond$14;}
68531 if(__label__==16){var $_pr=$new_c;__lastLabel__=16;;}
68532 else if(__label__==12){var $12=$ix;var $add=((($12)+1)&4294967295);var $13=$replace_chars;var $arrayidx16=(($13+4*$add)&4294967295);var $14=HEAPU32[(($arrayidx16)>>2)];$new_c=$14;__lastLabel__=12;;}
68533 else if(__label__==14){var $17=$ix;var $add22=((($17)+1)&4294967295);var $18=$replace_chars;var $arrayidx23=(($18+4*$add22)&4294967295);var $19=HEAPU32[(($arrayidx23)>>2)];$new_c=$19;HEAP8[(__ZZL14SubstituteCharP10TranslatorjjPiE11ignore_next_b)]=1;__lastLabel__=14;;}
68534 var $21=__lastLabel__==16?$_pr:(__lastLabel__==14?$19:($14));var $cmp27=((($21))|0)==0;if($cmp27){__label__=18;;}else{__label__=19;;}
68535 if(__label__==18){var $22=$c_addr;$retval=$22;;}
68536 else if(__label__==19){var $23=$new_c;var $and30=($23)&-2097152;var $tobool31=((($and30))|0)!=0;if($tobool31){__label__=20;;}else{__label__=24;;}
68537 if(__label__==20){var $24=$new_c;var $shr33=($24)>>>16;$c2=$shr33;var $25=$upper_case;var $tobool34=((($25))|0)!=0;if($tobool34){__label__=21;;}else{__label__=23;;}
68538 $land_lhs_true$$if_end39$31:do{if(__label__==21){var $26=$next_in_addr;var $call35=_iswupper($26);var $tobool36=((($call35))|0)!=0;if(!($tobool36)){__label__=23;break $land_lhs_true$$if_end39$31;}
68539 var $27=$c2;var $call38=_towupper($27);$c2=$call38;;}}while(0);var $28=$c2;var $29=$insert_addr;HEAP32[(($29)>>2)]=$28;var $30=$new_c;var $and40=($30)&65535;$new_c=$and40;;}
68540 var $31=$upper_case;var $tobool42=((($31))|0)!=0;if($tobool42){__label__=25;;}else{__label__=26;;}
68541 if(__label__==25){var $32=$new_c;var $call44=_towupper($32);$new_c=$call44;;}
68542 var $33=$new_c;$retval=$33;;}}}}
68543 var $34=$retval;;return $34;return null;}
68544 function _init_MBR($voice_path){var __stackBase__=STACKTOP;STACKTOP+=48;_memset(__stackBase__,0,48);var __label__;var $retval;var $voice_path_addr;var $error;var $result;var $wavhdr=__stackBase__;$voice_path_addr=$voice_path;var $0=$voice_path_addr;var $call=__ZL12start_mbrolaPKc($0);$error=$call;var $1=$error;var $tobool=((($1))|0)!=0;if($tobool){__label__=1;;}else{__label__=2;;}
68545 $if_then$$if_end$2:do{if(__label__==1){$retval=-1;;}
68546 else if(__label__==2){var $call1=__ZL14send_to_mbrolaPKc(((__str580)&4294967295));$result=$call1;var $2=$result;var $cmp=((($2))|0)!=2;if($cmp){__label__=3;;}else{__label__=4;;}
68547 if(__label__==3){__ZL11stop_mbrolav();$retval=-1;;}
68548 else if(__label__==4){var $arraydecay=(($wavhdr)&4294967295);var $call4=__ZL19receive_from_mbrolaPvj($arraydecay,45);$result=$call4;var $3=$result;var $cmp5=((($3))|0)!=44;if($cmp5){__label__=5;;}else{__label__=8;;}
68549 if(__label__==5){var $4=$result;var $cmp7=((($4))|0)>=0;if($cmp7){__label__=6;;}else{__label__=7;;}
68550 if(__label__==6){__ZL3errPKcz(((__str1581)&4294967295),allocate(1,"i32",ALLOC_STACK));;}
68551 __ZL11stop_mbrolav();$retval=-1;;}
68552 else if(__label__==8){var $arraydecay11=(($wavhdr)&4294967295);var $call12=_memcmp($arraydecay11,((__str2582)&4294967295),4);var $cmp13=((($call12))|0)!=0;if($cmp13){__label__=10;;}else{__label__=9;;}
68553 $if_then17$$lor_lhs_false$14:do{if(__label__==9){var $arraydecay14=(($wavhdr)&4294967295);var $add_ptr=(($arraydecay14+8)&4294967295);var $call15=_memcmp($add_ptr,((__str3583)&4294967295),8);var $cmp16=((($call15))|0)!=0;if($cmp16){__label__=10;break $if_then17$$lor_lhs_false$14;}
68554 var $arrayidx=(($wavhdr+24)&4294967295);var $5=HEAPU8[($arrayidx)];var $conv=((($5))&255);var $arrayidx19=(($wavhdr+25)&4294967295);var $6=HEAPU8[($arrayidx19)];var $conv20=((($6))&255);var $shl=((($conv20)*256)&4294967295);var $arrayidx21=(($wavhdr+26)&4294967295);var $7=HEAPU8[($arrayidx21)];var $conv22=((($7))&255);var $shl23=((($conv22)*65536)&4294967295);var $arrayidx25=(($wavhdr+27)&4294967295);var $8=HEAPU8[($arrayidx25)];var $conv26=((($8))&255);var $shl27=((($conv26)*16777216)&4294967295);var $add=((($shl)+($conv))&4294967295);var $add24=((($add)+($shl23))&4294967295);var $add28=((($add24)+($shl27))&4294967295);HEAP32[((__ZL14mbr_samplerate)>>2)]=$add28;var $9=HEAP32[((__ZL14mbr_voice_path)>>2)];var $10=$voice_path_addr;var $cmp29=((($9))|0)!=((($10))|0);if($cmp29){__label__=12;;}else{__label__=13;;}
68555 if(__label__==12){var $11=HEAP32[((__ZL14mbr_voice_path)>>2)];;var $12=$voice_path_addr;var $call31=_strdup($12);HEAP32[((__ZL14mbr_voice_path)>>2)]=$call31;;}
68556 $retval=0;__label__=14;break $if_then$$if_end$2;}}while(0);__ZL3errPKcz(((__str4584)&4294967295),allocate(1,"i32",ALLOC_STACK));__ZL11stop_mbrolav();$retval=-1;;}}}}while(0);var $13=$retval;STACKTOP=__stackBase__;return $13;return null;}
68557 function __ZL12start_mbrolaPKc($voice_path){var __stackBase__=STACKTOP;STACKTOP+=44;_memset(__stackBase__,0,44);var __label__;var $retval;var $voice_path_addr;var $error;var $p_stdin=__stackBase__;var $p_stdout=__stackBase__+8;var $p_stderr=__stackBase__+16;var $charbuf=__stackBase__+24;var $i;$voice_path_addr=$voice_path;var $0=HEAP32[((__ZL9mbr_state)>>2)];var $cmp=((($0))|0)!=0;if($cmp){__label__=1;;}else{__label__=2;;}
68558 $if_then$$if_end$2:do{if(__label__==1){__ZL3errPKcz(((__str22602)&4294967295),allocate(1,"i32",ALLOC_STACK));$retval=-1;;}
68559 else if(__label__==2){var $arraydecay=(($p_stdin)&4294967295);var $arraydecay1=(($p_stdout)&4294967295);var $arraydecay2=(($p_stderr)&4294967295);var $call=__ZL12create_pipesPiS_S_($arraydecay,$arraydecay1,$arraydecay2);$error=$call;var $1=$error;var $tobool=((($1))|0)!=0;if($tobool){__label__=3;;}else{__label__=4;;}
68560 if(__label__==3){$retval=-1;;}
68561 else if(__label__==4){var $call5=_fork();HEAP32[((__ZL7mbr_pid)>>2)]=$call5;var $2=HEAP32[((__ZL7mbr_pid)>>2)];var $cmp6=((($2))|0)==-1;if($cmp6){__label__=5;;}else{__label__=6;;}
68562 if(__label__==5){var $call8=___errno();var $3=HEAP32[(($call8)>>2)];$error=$3;var $arraydecay9=(($p_stdin)&4294967295);var $arraydecay10=(($p_stdout)&4294967295);var $arraydecay11=(($p_stderr)&4294967295);__ZL11close_pipesPiS_S_($arraydecay9,$arraydecay10,$arraydecay11);var $4=$error;var $call12=_strerror($4);__ZL3errPKcz(((__str23603)&4294967295),allocate([$call12,0,0,0],["i8*",0,0,0],ALLOC_STACK));$retval=-1;;}
68563 else if(__label__==6){var $5=HEAP32[((__ZL7mbr_pid)>>2)];var $cmp14=((($5))|0)==0;if($cmp14){__label__=7;;}else{__label__=14;;}
68564 if(__label__==7){var $arrayidx=(($p_stdin)&4294967295);var $6=HEAP32[(($arrayidx)>>2)];var $call16=_dup2($6,0);var $cmp17=((($call16))|0)==-1;if($cmp17){__label__=10;;}else{__label__=8;;}
68565 $if_then25$$lor_lhs_false$13:do{if(__label__==8){var $arrayidx18=(($p_stdout+4)&4294967295);var $7=HEAP32[(($arrayidx18)>>2)];var $call19=_dup2($7,1);var $cmp20=((($call19))|0)==-1;if($cmp20){__label__=10;break $if_then25$$lor_lhs_false$13;}
68566 var $arrayidx22=(($p_stderr+4)&4294967295);var $8=HEAP32[(($arrayidx22)>>2)];var $call23=_dup2($8,2);var $cmp24=((($call23))|0)==-1;if($cmp24){__label__=10;break $if_then25$$lor_lhs_false$13;}else{__label__=11;break $if_then25$$lor_lhs_false$13;}}}while(0);if(__label__==10){var $call26=___errno();var $9=HEAP32[(($call26)>>2)];var $call27=_strerror($9);var $call28=_snprintf(((__ZL12mbr_errorbuf)&4294967295),160,((__str24604)&4294967295),allocate([$call27,0,0,0],["i8*",0,0,0],ALLOC_STACK));var $arrayidx29=(($p_stderr+4)&4294967295);var $10=HEAP32[(($arrayidx29)>>2)];var $call30=_strlen(((__ZL12mbr_errorbuf)&4294967295));var $call31=_write($10,((__ZL12mbr_errorbuf)&4294967295),$call30);__exit(1);;}
68567 var $arrayidx33=(($p_stderr+4)&4294967295);var $11=HEAP32[(($arrayidx33)>>2)];$i=$11;var $cmp341=((($11))|0)>2;if($cmp341){__label__=12;;}else{__label__=13;;}
68568 $for_body$$for_end$19:do{if(__label__==12){while(1){var $12=$i;var $call35=_close($12);var $13=$i;var $dec=((($13)-1)&4294967295);$i=$dec;var $cmp34=((($dec))|0)>2;if($cmp34){__label__=12;continue;}else{__label__=13;break $for_body$$for_end$19;}}}}while(0);var $call36=_signal(1,1);var $call37=_signal(2,1);var $call38=_signal(3,1);var $call39=_signal(15,1);var $arraydecay40=(($charbuf)&4294967295);var $14=HEAPF32[((__ZL10mbr_volume)>>2)];var $conv=($14);var $call41=_snprintf($arraydecay40,20,((__str25605)&4294967295),allocate([$conv,0,0,0,0,0,0,0],["double",0,0,0,0,0,0,0],ALLOC_STACK));var $arraydecay42=(($charbuf)&4294967295);var $15=$voice_path_addr;var $call43=_execlp(((__str33683)&4294967295),((__str33683)&4294967295),allocate([((__str27607)&4294967295),0,0,0,((__str28608)&4294967295),0,0,0,$arraydecay42,0,0,0,$15,0,0,0,((__str56708)&4294967295),0,0,0,((__str30610)&4294967295),0,0,0,0,0,0,0],["i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));var $call44=___errno();var $16=HEAP32[(($call44)>>2)];var $call45=_strerror($16);var $call46=_snprintf(((__ZL12mbr_errorbuf)&4294967295),160,((__str31611)&4294967295),allocate([$call45,0,0,0],["i8*",0,0,0],ALLOC_STACK));var $call47=_strlen(((__ZL12mbr_errorbuf)&4294967295));var $call48=_write(2,((__ZL12mbr_errorbuf)&4294967295),$call47);__exit(1);;}
68569 var $arraydecay50=(($charbuf)&4294967295);var $17=HEAP32[((__ZL7mbr_pid)>>2)];var $call51=_snprintf($arraydecay50,20,((__str32612)&4294967295),allocate([$17,0,0,0],["i32",0,0,0],ALLOC_STACK));var $arraydecay52=(($charbuf)&4294967295);var $call53=_open($arraydecay52,0,allocate(1,"i32",ALLOC_STACK));HEAP32[((__ZL13mbr_proc_stat)>>2)]=$call53;var $cmp54=((($call53))|0)==-1;if($cmp54){__label__=15;;}else{__label__=16;;}
68570 if(__label__==15){var $call56=___errno();var $18=HEAP32[(($call56)>>2)];$error=$18;var $arraydecay57=(($p_stdin)&4294967295);var $arraydecay58=(($p_stdout)&4294967295);var $arraydecay59=(($p_stderr)&4294967295);__ZL11close_pipesPiS_S_($arraydecay57,$arraydecay58,$arraydecay59);var $19=HEAP32[((__ZL7mbr_pid)>>2)];var $call60=_waitpid($19,0,0);HEAP32[((__ZL7mbr_pid)>>2)]=0;var $20=$error;var $call61=_strerror($20);__ZL3errPKcz(((__str33613)&4294967295),allocate([$call61,0,0,0],["i8*",0,0,0],ALLOC_STACK));$retval=-1;;}
68571 else if(__label__==16){var $call63=_signal(13,1);var $arrayidx64=(($p_stdin+4)&4294967295);var $21=HEAP32[(($arrayidx64)>>2)];var $call65=_fcntl($21,4,allocate([16384,0,0,0],["i32",0,0,0],ALLOC_STACK));var $cmp66=((($call65))|0)==-1;if($cmp66){__label__=19;;}else{__label__=17;;}
68572 $if_then75$$lor_lhs_false67$27:do{if(__label__==17){var $arrayidx68=(($p_stdout)&4294967295);var $22=HEAP32[(($arrayidx68)>>2)];var $call69=_fcntl($22,4,allocate([16384,0,0,0],["i32",0,0,0],ALLOC_STACK));var $cmp70=((($call69))|0)==-1;if($cmp70){__label__=19;break $if_then75$$lor_lhs_false67$27;}
68573 var $arrayidx72=(($p_stderr)&4294967295);var $23=HEAP32[(($arrayidx72)>>2)];var $call73=_fcntl($23,4,allocate([16384,0,0,0],["i32",0,0,0],ALLOC_STACK));var $cmp74=((($call73))|0)==-1;if($cmp74){__label__=19;break $if_then75$$lor_lhs_false67$27;}
68574 var $arrayidx83=(($p_stdin+4)&4294967295);var $27=HEAP32[(($arrayidx83)>>2)];HEAP32[((__ZL10mbr_cmd_fd)>>2)]=$27;var $arrayidx84=(($p_stdout)&4294967295);var $28=HEAP32[(($arrayidx84)>>2)];HEAP32[((__ZL12mbr_audio_fd)>>2)]=$28;var $arrayidx85=(($p_stderr)&4294967295);var $29=HEAP32[(($arrayidx85)>>2)];HEAP32[((__ZL12mbr_error_fd)>>2)]=$29;var $arrayidx86=(($p_stdin)&4294967295);var $30=HEAP32[(($arrayidx86)>>2)];var $call87=_close($30);var $arrayidx88=(($p_stdout+4)&4294967295);var $31=HEAP32[(($arrayidx88)>>2)];var $call89=_close($31);var $arrayidx90=(($p_stderr+4)&4294967295);var $32=HEAP32[(($arrayidx90)>>2)];var $call91=_close($32);HEAP32[((__ZL9mbr_state)>>2)]=1;$retval=0;__label__=21;break $if_then$$if_end$2;}}while(0);var $call76=___errno();var $24=HEAP32[(($call76)>>2)];$error=$24;var $arraydecay77=(($p_stdin)&4294967295);var $arraydecay78=(($p_stdout)&4294967295);var $arraydecay79=(($p_stderr)&4294967295);__ZL11close_pipesPiS_S_($arraydecay77,$arraydecay78,$arraydecay79);var $25=HEAP32[((__ZL7mbr_pid)>>2)];var $call80=_waitpid($25,0,0);HEAP32[((__ZL7mbr_pid)>>2)]=0;var $26=$error;var $call81=_strerror($26);__ZL3errPKcz(((__str34614)&4294967295),allocate([$call81,0,0,0],["i8*",0,0,0],ALLOC_STACK));$retval=-1;;}}}}}while(0);var $33=$retval;STACKTOP=__stackBase__;return $33;return null;}
68575 function __ZL14send_to_mbrolaPKc($cmd){;var __label__;var __lastLabel__=null;var $retval;var $cmd_addr;var $result;var $len;var $error;var $data;$cmd_addr=$cmd;var $0=HEAP32[((__ZL7mbr_pid)>>2)];var $tobool=((($0))|0)!=0;if($tobool){__label__=2;;}else{__label__=1;;}
68576 $if_end$$if_then$2:do{if(__label__==2){var $1=$cmd_addr;var $call=_strlen($1);$len=$call;var $2=HEAP32[((__ZL10mbr_cmd_fd)>>2)];var $3=$cmd_addr;var $4=$len;var $call1=_write($2,$3,$4);$result=$call1;var $5=$result;var $cmp=((($5))|0)==-1;if($cmp){__label__=3;;}else{__label__=10;;}
68577 if(__label__==3){var $call3=___errno();var $6=HEAP32[(($call3)>>2)];$error=$6;var $7=$error;var $cmp4=((($7))|0)==32;if($cmp4){__lastLabel__=3;__label__=4;;}else{__lastLabel__=3;__label__=7;;}
68578 if(__label__==4){var $call5=__ZL17mbrola_has_errorsv();var $tobool6=((($call5))|0)!=0;if($tobool6){__label__=5;;}else{__label__=6;;}
68579 if(__label__==5){$retval=-1;__label__=17;break $if_end$$if_then$2;}
68580 else if(__label__==6){var $_pr=$error;__lastLabel__=6;;}}
68581 var $8=__lastLabel__==6?$_pr:($7);var $cmp8=((($8))|0)==11;if($cmp8){__label__=8;;}else{__label__=9;;}
68582 if(__label__==8){$result=0;;}
68583 else if(__label__==9){var $9=$error;var $call11=_strerror($9);__ZL3errPKcz(((__str20600)&4294967295),allocate([$call11,0,0,0],["i8*",0,0,0],ALLOC_STACK));$retval=-1;__label__=17;break $if_end$$if_then$2;}}
68584 var $10=$result;var $11=$len;var $cmp15=((($10))|0)!=((($11))|0);if($cmp15){__label__=11;;}else{__label__=16;;}
68585 $if_then16$$if_end28$16:do{if(__label__==11){var $12=$len;var $13=$result;var $_neg=(((-($13)))&4294967295);var $add=((($12)+16)&4294967295);var $sub=((($add)+($_neg))&4294967295);var $call17=_malloc($sub);var $14=$call17;$data=$14;var $15=$data;var $tobool18=((($15))|0)!=0;if(!($tobool18)){__label__=16;break $if_then16$$if_end28$16;}
68586 var $16=$data;var $next=(($16)&4294967295);HEAP32[(($next)>>2)]=0;var $17=$data;var $done=(($17+4)&4294967295);HEAP32[(($done)>>2)]=0;var $18=$len;var $19=$result;var $sub20=((($18)-($19))&4294967295);var $20=$data;var $size=(($20+8)&4294967295);HEAP32[(($size)>>2)]=$sub20;var $21=$data;var $buffer=(($21+12)&4294967295);var $arraydecay=(($buffer)&4294967295);var $22=$cmd_addr;var $23=$result;var $add_ptr=(($22+$23)&4294967295);var $24=$len;var $25=$result;var $sub21=((($24)-($25))&4294967295);var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$add_ptr;$dest$=$arraydecay;$stop$=$src$+$sub21;if(($dest$%4)==($src$%4)&&$sub21>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
68587 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
68588 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $26=$len;$result=$26;var $27=HEAP32[((__ZL21mbr_pending_data_head)>>2)];var $tobool22=((($27))|0)!=0;var $28=$data;if($tobool22){__label__=14;;}else{__label__=13;;}
68589 if(__label__==14){var $29=HEAP32[((__ZL21mbr_pending_data_tail)>>2)];var $next25=(($29)&4294967295);HEAP32[(($next25)>>2)]=$28;;}
68590 else if(__label__==13){HEAP32[((__ZL21mbr_pending_data_head)>>2)]=$28;;}
68591 var $30=$data;HEAP32[((__ZL21mbr_pending_data_tail)>>2)]=$30;;}}while(0);var $31=$result;$retval=$31;;}
68592 else if(__label__==1){$retval=-1;;}}while(0);var $32=$retval;;return $32;return null;}
68593 function __ZL11stop_mbrolav(){;var __label__;var $0=HEAP32[((__ZL9mbr_state)>>2)];var $cmp=((($0))|0)==0;if($cmp){__label__=4;;}else{__label__=1;;}
68594 if(__label__==1){var $1=HEAP32[((__ZL13mbr_proc_stat)>>2)];var $call=_close($1);var $2=HEAP32[((__ZL10mbr_cmd_fd)>>2)];var $call1=_close($2);var $3=HEAP32[((__ZL12mbr_audio_fd)>>2)];var $call2=_close($3);var $4=HEAP32[((__ZL12mbr_error_fd)>>2)];var $call3=_close($4);var $5=HEAP32[((__ZL7mbr_pid)>>2)];var $tobool=((($5))|0)!=0;if($tobool){__label__=2;;}else{__label__=3;;}
68595 if(__label__==2){var $6=HEAP32[((__ZL7mbr_pid)>>2)];var $call5=_kill($6,15);var $7=HEAP32[((__ZL7mbr_pid)>>2)];var $call6=_waitpid($7,0,0);HEAP32[((__ZL7mbr_pid)>>2)]=0;;}
68596 HEAP32[((__ZL9mbr_state)>>2)]=0;;};return;return;}
68597 function __ZL19receive_from_mbrolaPvj($buffer,$bufsize){var __stackBase__=STACKTOP;STACKTOP+=24;_memset(__stackBase__,0,24);var __label__;var $retval;var $buffer_addr;var $bufsize_addr;var $result;var $wait;var $cursize;var $pollfd=__stackBase__;var $nfds;var $idle;var $head;var $data;var $left;var $error;var $curpos;var $space;var $obtained;$buffer_addr=$buffer;$bufsize_addr=$bufsize;$wait=1;$cursize=0;var $0=HEAP32[((__ZL7mbr_pid)>>2)];var $tobool=((($0))|0)!=0;if($tobool){__label__=1;;}else{__label__=2;;}
68598 $do_body_preheader$$if_then$2:do{if(__label__==1){var $arrayidx=(($pollfd)&4294967295);var $fd=(($arrayidx)&4294967295);var $arrayidx1=(($pollfd)&4294967295);var $events=(($arrayidx1+4)&4294967295);var $arrayidx2=(($pollfd+8)&4294967295);var $fd3=(($arrayidx2)&4294967295);var $arrayidx4=(($pollfd+8)&4294967295);var $events5=(($arrayidx4+4)&4294967295);var $arrayidx9=(($pollfd+16)&4294967295);var $fd10=(($arrayidx9)&4294967295);var $arrayidx11=(($pollfd+16)&4294967295);var $events12=(($arrayidx11+4)&4294967295);var $arraydecay=(($pollfd)&4294967295);var $arrayidx29=(($pollfd+8)&4294967295);var $revents=(($arrayidx29+6)&4294967295);var $arrayidx37=(($pollfd+16)&4294967295);var $revents38=(($arrayidx37+6)&4294967295);var $arrayidx66=(($pollfd)&4294967295);var $revents67=(($arrayidx66+6)&4294967295);;$do_body$4:while(1){$nfds=0;var $1=HEAP32[((__ZL12mbr_audio_fd)>>2)];HEAP32[(($fd)>>2)]=$1;HEAP16[(($events)>>1)]=1;var $2=$nfds;var $inc=((($2)+1)&4294967295);$nfds=$inc;var $3=HEAP32[((__ZL12mbr_error_fd)>>2)];HEAP32[(($fd3)>>2)]=$3;HEAP16[(($events5)>>1)]=1;var $4=$nfds;var $inc6=((($4)+1)&4294967295);$nfds=$inc6;var $5=HEAP32[((__ZL21mbr_pending_data_head)>>2)];var $tobool7=((($5))|0)!=0;if($tobool7){__label__=4;;}else{__label__=5;;}
68599 if(__label__==4){var $6=HEAP32[((__ZL10mbr_cmd_fd)>>2)];HEAP32[(($fd10)>>2)]=$6;HEAP16[(($events12)>>1)]=2;var $7=$nfds;var $inc13=((($7)+1)&4294967295);$nfds=$inc13;;}
68600 var $call=__ZL14mbrola_is_idlev();$idle=$call;var $8=$nfds;var $9=$idle;var $tobool15=((($9))|0)!=0;var $10=$wait;var $cond=($tobool15)?0:($10);var $call16=_poll($arraydecay,$8,$cond);$result=$call16;var $cmp=((($call16))|0)==-1;if($cmp){__label__=6;break $do_body$4;}
68601 var $12=$result;var $cmp21=((($12))|0)==0;if($cmp21){__label__=8;;}else{__label__=13;;}
68602 $if_then22$$if_end28$10:do{if(__label__==8){var $13=$idle;var $tobool23=((($13))|0)!=0;if($tobool23){__label__=9;break $do_body$4;}
68603 var $14=$wait;var $cmp25=((($14))|0)>=3750;if($cmp25){__label__=11;break $do_body$4;}
68604 var $15=$wait;var $mul=((($15)*4)&4294967295);$wait=$mul;;}
68605 else if(__label__==13){$wait=1;var $16=HEAP16[(($revents)>>1)];var $tobool30=(tempInt=(($16)),(tempInt>=32768?tempInt-65536:tempInt))!=0;if($tobool30){__label__=14;;}else{__label__=16;;}
68606 if(__label__==14){var $call31=__ZL17mbrola_has_errorsv();var $tobool32=((($call31))|0)!=0;if($tobool32){__label__=15;break $do_body$4;}}
68607 var $17=HEAP32[((__ZL21mbr_pending_data_head)>>2)];var $tobool35=((($17))|0)!=0;if($tobool35){__label__=17;;}else{__label__=27;;}
68608 $land_lhs_true36$$if_end65$18:do{if(__label__==17){var $18=HEAP16[(($revents38)>>1)];var $tobool39=(tempInt=(($18)),(tempInt>=32768?tempInt-65536:tempInt))!=0;if(!($tobool39)){__label__=27;break $land_lhs_true36$$if_end65$18;}
68609 var $19=HEAP32[((__ZL21mbr_pending_data_head)>>2)];$head=$19;var $20=$head;var $buffer41=(($20+12)&4294967295);var $arraydecay42=(($buffer41)&4294967295);var $21=$head;var $done=(($21+4)&4294967295);var $22=HEAP32[(($done)>>2)];var $add_ptr=(($arraydecay42+$22)&4294967295);$data=$add_ptr;var $23=$head;var $size=(($23+8)&4294967295);var $24=HEAP32[(($size)>>2)];var $25=$head;var $done43=(($25+4)&4294967295);var $26=HEAP32[(($done43)>>2)];var $sub=((($24)-($26))&4294967295);$left=$sub;var $27=HEAP32[((__ZL10mbr_cmd_fd)>>2)];var $28=$data;var $29=$left;var $call44=_write($27,$28,$29);$result=$call44;var $30=$result;var $cmp45=((($30))|0)==-1;if($cmp45){__label__=19;break $do_body$4;}
68610 var $34=$result;var $35=$left;var $cmp56=((($34))|0)!=((($35))|0);if($cmp56){__label__=24;;}else{__label__=25;;}
68611 if(__label__==24){var $36=$result;var $37=$head;var $done58=(($37+4)&4294967295);var $38=HEAP32[(($done58)>>2)];var $add=((($38)+($36))&4294967295);HEAP32[(($done58)>>2)]=$add;;}
68612 else if(__label__==25){var $39=$head;var $next=(($39)&4294967295);var $40=HEAP32[(($next)>>2)];HEAP32[((__ZL21mbr_pending_data_head)>>2)]=$40;var $41=$head;var $42=$41;;var $43=HEAP32[((__ZL21mbr_pending_data_head)>>2)];var $tobool60=((($43))|0)!=0;if($tobool60){__label__=31;break $if_then22$$if_end28$10;}
68613 HEAP32[((__ZL21mbr_pending_data_tail)>>2)]=0;;}}}while(0);var $44=HEAP16[(($revents67)>>1)];var $tobool68=(tempInt=(($44)),(tempInt>=32768?tempInt-65536:tempInt))!=0;if(!($tobool68)){__label__=31;break $if_then22$$if_end28$10;}
68614 var $45=$buffer_addr;var $46=$cursize;var $add_ptr70=(($45+$46)&4294967295);$curpos=$add_ptr70;var $47=$bufsize_addr;var $48=$cursize;var $sub71=((($47)-($48))&4294967295);$space=$sub71;var $49=HEAP32[((__ZL12mbr_audio_fd)>>2)];var $50=$curpos;var $51=$space;var $call72=_read($49,$50,$51);$obtained=$call72;var $52=$obtained;var $cmp73=((($52))|0)==-1;if($cmp73){__label__=29;break $do_body$4;}
68615 var $54=$obtained;var $55=$cursize;var $add78=((($55)+($54))&4294967295);$cursize=$add78;HEAP32[((__ZL9mbr_state)>>2)]=3;;}}while(0);var $56=$cursize;var $57=$bufsize_addr;var $cmp80=((($56))>>>0)<((($57))>>>0);if($cmp80){__label__=3;continue $do_body$4;}else{__label__=32;break $do_body$4;}}
68616 if(__label__==6){var $call18=___errno();var $11=HEAP32[(($call18)>>2)];var $call19=_strerror($11);__ZL3errPKcz(((__str18598)&4294967295),allocate([$call19,0,0,0],["i8*",0,0,0],ALLOC_STACK));$retval=-1;__label__=33;break $do_body_preheader$$if_then$2;}
68617 else if(__label__==9){HEAP32[((__ZL9mbr_state)>>2)]=1;;}
68618 else if(__label__==11){HEAP32[((__ZL9mbr_state)>>2)]=4;__ZL3errPKcz(((__str19599)&4294967295),allocate(1,"i32",ALLOC_STACK));;}
68619 else if(__label__==15){$retval=-1;__label__=33;break $do_body_preheader$$if_then$2;}
68620 else if(__label__==19){var $call47=___errno();var $31=HEAP32[(($call47)>>2)];$error=$31;var $32=$error;var $cmp48=((($32))|0)==32;if($cmp48){__label__=20;;}else{__label__=22;;}
68621 $land_lhs_true49$$if_end53$36:do{if(__label__==20){var $call50=__ZL17mbrola_has_errorsv();var $tobool51=((($call50))|0)!=0;if(!($tobool51)){__label__=22;break $land_lhs_true49$$if_end53$36;}
68622 $retval=-1;__label__=33;break $do_body_preheader$$if_then$2;}}while(0);var $33=$error;var $call54=_strerror($33);__ZL3errPKcz(((__str20600)&4294967295),allocate([$call54,0,0,0],["i8*",0,0,0],ALLOC_STACK));$retval=-1;__label__=33;break $do_body_preheader$$if_then$2;}
68623 else if(__label__==29){var $call75=___errno();var $53=HEAP32[(($call75)>>2)];var $call76=_strerror($53);__ZL3errPKcz(((__str21601)&4294967295),allocate([$call76,0,0,0],["i8*",0,0,0],ALLOC_STACK));$retval=-1;__label__=33;break $do_body_preheader$$if_then$2;}
68624 var $58=$cursize;$retval=$58;;}
68625 else if(__label__==2){$retval=-1;;}}while(0);var $59=$retval;STACKTOP=__stackBase__;return $59;return null;}
68626 function __ZL3errPKcz($errmsg){var __stackBase__=STACKTOP;STACKTOP+=4;_memset(__stackBase__,0,4);var __label__;var $errmsg_addr;var $params=__stackBase__;$errmsg_addr=$errmsg;var $params1=$params;HEAP32[(($params1)>>2)]=arguments[__ZL3errPKcz.length];;var $0=$errmsg_addr;var $1=HEAP32[(($params)>>2)];var $call=_vsnprintf(((__ZL12mbr_errorbuf)&4294967295),160,$0,$1);var $params2=$params;;__ZL3logPKcz(((__str16596)&4294967295),allocate([((__ZL12mbr_errorbuf)&4294967295),0,0,0],["i8*",0,0,0],ALLOC_STACK));STACKTOP=__stackBase__;return;return;}
68627 function _close_MBR(){;var __label__;__ZL11stop_mbrolav();__ZL17free_pending_datav();var $0=HEAP32[((__ZL14mbr_voice_path)>>2)];;HEAP32[((__ZL14mbr_voice_path)>>2)]=0;HEAPF32[((__ZL10mbr_volume)>>2)]=1;;return;return;}
68628 function __ZL17free_pending_datav(){;var __label__;var $p;var $head;var $0=HEAP32[((__ZL21mbr_pending_data_head)>>2)];$head=$0;var $tobool1=((($0))|0)!=0;if($tobool1){__label__=1;;}else{__label__=2;;}
68629 $while_body$$while_end$2:do{if(__label__==1){while(1){var $1=$head;$p=$1;var $2=$head;var $next=(($2)&4294967295);var $3=HEAP32[(($next)>>2)];$head=$3;var $4=$p;var $5=$4;;var $_pr=$head;var $tobool=((($_pr))|0)!=0;if($tobool){__label__=1;continue;}else{__label__=2;break $while_body$$while_end$2;}}}}while(0);HEAP32[((__ZL21mbr_pending_data_head)>>2)]=0;HEAP32[((__ZL21mbr_pending_data_tail)>>2)]=0;;return;return;}
68630 function _reset_MBR(){var __stackBase__=STACKTOP;STACKTOP+=4096;_memset(__stackBase__,0,4096);var __label__;var $retval;var $result;var $success;var $dummybuf=__stackBase__;$success=1;var $0=HEAP32[((__ZL9mbr_state)>>2)];var $cmp=((($0))|0)==1;if($cmp){__label__=1;;}else{__label__=2;;}
68631 if(__label__==1){$retval=1;;}
68632 else if(__label__==2){var $1=HEAP32[((__ZL7mbr_pid)>>2)];var $tobool=((($1))|0)!=0;if($tobool){__label__=4;;}else{__label__=3;;}
68633 if(__label__==4){var $2=HEAP32[((__ZL7mbr_pid)>>2)];var $call=_kill($2,30);var $cmp3=((($call))|0)==-1;if($cmp3){__label__=5;;}else{__label__=6;;}
68634 if(__label__==5){$success=0;;}
68635 __ZL17free_pending_datav();var $3=HEAP32[((__ZL10mbr_cmd_fd)>>2)];var $call6=_write($3,((__str5585)&4294967295),3);$result=$call6;var $cmp7=((($call6))|0)!=3;if($cmp7){__label__=7;;}else{__label__=8;;}
68636 if(__label__==7){$success=0;;}
68637 var $arraydecay=(($dummybuf)&4294967295);;$do_body$13:while(1){var $4=HEAP32[((__ZL12mbr_audio_fd)>>2)];var $call10=_read($4,$arraydecay,4096);$result=$call10;var $cmp11=((($call10))|0)>0;if($cmp11){__label__=9;continue $do_body$13;}else{__label__=10;break $do_body$13;}}
68638 var $5=$result;var $cmp12=((($5))|0)!=-1;if($cmp12){__label__=12;;}else{__label__=11;;}
68639 $if_then15$$lor_lhs_false$16:do{if(__label__==11){var $call13=___errno();var $6=HEAP32[(($call13)>>2)];var $cmp14=((($6))|0)!=11;if($cmp14){__label__=12;break $if_then15$$lor_lhs_false$16;}else{__label__=13;break $if_then15$$lor_lhs_false$16;}}}while(0);if(__label__==12){$success=0;;}
68640 var $call17=__ZL17mbrola_has_errorsv();var $tobool18=((($call17))|0)!=0;if($tobool18){__label__=16;;}else{__label__=14;;}
68641 $if_end21$$land_lhs_true$21:do{if(__label__==14){var $7=$success;var $tobool19=((($7))|0)!=0;if(!($tobool19)){__label__=16;break $if_end21$$land_lhs_true$21;}
68642 HEAP32[((__ZL9mbr_state)>>2)]=1;;}}while(0);var $8=$success;$retval=$8;;}
68643 else if(__label__==3){$retval=0;;}}
68644 var $9=$retval;STACKTOP=__stackBase__;return $9;return null;}
68645 function __ZL17mbrola_has_errorsv(){var __stackBase__=STACKTOP;STACKTOP+=256;_memset(__stackBase__,0,256);var __label__;var $retval;var $result;var $buffer=__stackBase__;var $buf_ptr;var $lf;var $arraydecay=(($buffer)&4294967295);$buf_ptr=$arraydecay;var $arraydecay1=(($buffer)&4294967295);var $sub_ptr_rhs_cast=($arraydecay1);var $sub_ptr_rhs_cast_neg=(((-($sub_ptr_rhs_cast)))&4294967295);var $sub_ptr_rhs_cast_neg_neg=(((-($sub_ptr_rhs_cast_neg)))&4294967295);var $sub=((($sub_ptr_rhs_cast_neg_neg)+255)&4294967295);var $arraydecay27=(($buffer)&4294967295);var $arraydecay28=(($buffer)&4294967295);;$for_cond$2:while(1){var $0=HEAP32[((__ZL12mbr_error_fd)>>2)];var $1=$buf_ptr;var $2=$buf_ptr;var $sub_ptr_lhs_cast=($2);var $sub_ptr_lhs_cast_neg=(((-($sub_ptr_lhs_cast)))&4294967295);var $sub2=((($sub)+($sub_ptr_lhs_cast_neg))&4294967295);var $call=_read($0,$1,$sub2);$result=$call;var $cmp=((($call))|0)==-1;if($cmp){__label__=2;break $for_cond$2;}
68646 var $5=$result;var $cmp9=((($5))|0)==0;if($cmp9){__label__=6;break $for_cond$2;}
68647 var $6=$result;var $7=$buf_ptr;var $arrayidx=(($7+$6)&4294967295);HEAP8[($arrayidx)]=0;;$for_cond13$6:while(1){var $8=$buf_ptr;var $call14=_strchr($8,10);$lf=$call14;var $tobool=((($call14))|0)!=0;var $9=$buf_ptr;if(!($tobool)){__label__=14;break $for_cond13$6;}
68648 var $call15=_strncmp($9,((__str8588)&4294967295),18);var $cmp16=((($call15))|0)==0;if($cmp16){__label__=13;;}else{__label__=10;;}
68649 $for_inc$$lor_lhs_false$9:do{if(__label__==10){var $10=$buf_ptr;var $call17=_strncmp($10,((__str9589)&4294967295),18);var $cmp18=((($call17))|0)==0;if($cmp18){__label__=13;break $for_inc$$lor_lhs_false$9;}
68650 var $11=$lf;HEAP8[($11)]=0;var $12=$buf_ptr;__ZL3logPKcz(((__str10590)&4294967295),allocate([$12,0,0,0],["i8*",0,0,0],ALLOC_STACK));var $13=$lf;var $14=$result;var $sub21=((($14)-1)&4294967295);var $15=$buf_ptr;var $arrayidx22=(($15+$sub21)&4294967295);var $cmp23=((($13))|0)==((($arrayidx22))|0);if($cmp23){__label__=12;break $for_cond$2;}}}while(0);var $17=$lf;var $add_ptr=(($17+1)&4294967295);$buf_ptr=$add_ptr;__label__=8;continue $for_cond13$6;}
68651 var $18=$result;_llvm_memmove_p0i8_p0i8_i32($arraydecay27,$9,$18,1,0);var $19=$result;var $add_ptr29=(($arraydecay28+$19)&4294967295);$buf_ptr=$add_ptr29;__label__=1;continue $for_cond$2;}
68652 if(__label__==2){var $call3=___errno();var $3=HEAP32[(($call3)>>2)];var $cmp4=((($3))|0)==11;if($cmp4){__label__=3;;}else{__label__=4;;}
68653 if(__label__==3){$retval=0;;}
68654 else if(__label__==4){var $call6=___errno();var $4=HEAP32[(($call6)>>2)];var $call7=_strerror($4);__ZL3errPKcz(((__str7587)&4294967295),allocate([$call7,0,0,0],["i8*",0,0,0],ALLOC_STACK));$retval=-1;;}}
68655 else if(__label__==6){__ZL11mbrola_diedv();$retval=-1;;}
68656 else if(__label__==12){var $16=$buf_ptr;var $call25=_snprintf(((__ZL12mbr_errorbuf)&4294967295),160,((__str57709)&4294967295),allocate([$16,0,0,0],["i8*",0,0,0],ALLOC_STACK));$retval=0;;}
68657 var $20=$retval;STACKTOP=__stackBase__;return $20;return null;}
68658 function _read_MBR($buffer,$nb_samples){;var __label__;var $buffer_addr;var $nb_samples_addr;var $result;$buffer_addr=$buffer;$nb_samples_addr=$nb_samples;var $0=$buffer_addr;var $1=$nb_samples_addr;var $mul=((($1)*2)&4294967295);var $call=__ZL19receive_from_mbrolaPvj($0,$mul);$result=$call;var $2=$result;var $cmp=((($2))|0)>0;if($cmp){__label__=1;;}else{__label__=2;;}
68659 if(__label__==1){var $3=$result;var $div=((((($3))|0)/2)|0);$result=$div;;}
68660 var $4=$result;;return $4;return null;}
68661 function _write_MBR($data){;var __label__;var $data_addr;$data_addr=$data;HEAP32[((__ZL9mbr_state)>>2)]=2;var $0=$data_addr;var $call=__ZL14send_to_mbrolaPKc($0);;return $call;return null;}
68662 function _flush_MBR(){;var __label__;var $call=__ZL14send_to_mbrolaPKc(((__str5585)&4294967295));var $cmp=((($call))|0)==3;var $conv=((($cmp))&1);;return $conv;return null;}
68663 function _getFreq_MBR(){;var __label__;var $0=HEAP32[((__ZL14mbr_samplerate)>>2)];;return $0;return null;}
68664 function _setVolumeRatio_MBR($value){;var __label__;var $value_addr;$value_addr=$value;var $0=$value_addr;var $1=HEAPF32[((__ZL10mbr_volume)>>2)];var $cmp=($0)==($1);if($cmp){__label__=3;;}else{__label__=1;;}
68665 $return$$if_end$2:do{if(__label__==1){var $2=$value_addr;HEAPF32[((__ZL10mbr_volume)>>2)]=$2;var $3=HEAP32[((__ZL9mbr_state)>>2)];var $cmp1=((($3))|0)!=1;if($cmp1){__label__=3;break $return$$if_end$2;}
68666 __ZL11stop_mbrolav();var $4=HEAP32[((__ZL14mbr_voice_path)>>2)];var $call=_init_MBR($4);;}}while(0);;return;return;}
68667 function _lastErrorStr_MBR($buffer,$bufsize){;var __label__;var __lastLabel__=null;var $buffer_addr;var $bufsize_addr;var $result;$buffer_addr=$buffer;$bufsize_addr=$bufsize;var $0=HEAP32[((__ZL7mbr_pid)>>2)];var $tobool=((($0))|0)!=0;if($tobool){__label__=1;;}else{__label__=2;;}
68668 if(__label__==1){var $call=__ZL17mbrola_has_errorsv();;}
68669 var $1=$buffer_addr;var $2=$bufsize_addr;var $call1=_snprintf($1,$2,((__str57709)&4294967295),allocate([((__ZL12mbr_errorbuf)&4294967295),0,0,0],["i8*",0,0,0],ALLOC_STACK));$result=$call1;var $3=$result;var $4=$bufsize_addr;var $cmp=((($3))|0)>=((($4))|0);if($cmp){__label__=3;;}else{__label__=4;;}
68670 if(__label__==3){var $5=$bufsize_addr;var $sub=((($5)-1)&4294967295);__lastLabel__=3;;}
68671 else if(__label__==4){var $6=$result;__lastLabel__=4;;}
68672 var $cond=__lastLabel__==3?$sub:($6);;return $cond;return null;}
68673 function _resetError_MBR(){;var __label__;HEAP8[(((__ZL12mbr_errorbuf)&4294967295))]=0;;return;return;}
68674 function __ZL11mbrola_diedv(){var __stackBase__=STACKTOP;STACKTOP+=84;_memset(__stackBase__,0,84);var __label__;var $pid;var $status=__stackBase__;var $len;var $msg;var $msgbuf=__stackBase__+4;var $sig;var $exst;var $0=HEAP32[((__ZL7mbr_pid)>>2)];var $call=_waitpid($0,$status,1);$pid=$call;var $1=$pid;var $tobool=((($1))|0)!=0;if($tobool){__label__=2;;}else{__label__=1;;}
68675 $if_else$$if_then$2:do{if(__label__==2){var $2=$pid;var $3=HEAP32[((__ZL7mbr_pid)>>2)];var $cmp=((($2))|0)!=((($3))|0);if($cmp){__label__=3;;}else{__label__=4;;}
68676 if(__label__==3){$msg=((__str12592)&4294967295);;}
68677 else if(__label__==4){HEAP32[((__ZL7mbr_pid)>>2)]=0;var $4=HEAP32[(($status)>>2)];var $and=($4)&127;var $cmp3=((($and))|0)>0;if($cmp3){__label__=5;;}else{__label__=7;;}
68678 $land_lhs_true$$if_else10$7:do{if(__label__==5){var $5=HEAP32[(($status)>>2)];var $and4=($5)&127;var $cmp5=((($and4))|0)<127;if(!($cmp5)){__label__=7;break $land_lhs_true$$if_else10$7;}
68679 var $6=HEAP32[(($status)>>2)];var $and7=($6)&127;$sig=$and7;var $arraydecay=(($msgbuf)&4294967295);var $7=$sig;var $call8=_snprintf($arraydecay,80,((__str13593)&4294967295),allocate([$7,0,0,0],["i32",0,0,0],ALLOC_STACK));var $arraydecay9=(($msgbuf)&4294967295);$msg=$arraydecay9;__label__=10;break $if_else$$if_then$2;}}while(0);var $8=HEAP32[(($status)>>2)];var $and11=($8)&255;var $cmp12=((($and11))|0)==0;if($cmp12){__label__=8;;}else{__label__=9;;}
68680 if(__label__==8){var $9=HEAP32[(($status)>>2)];var $shr=($9)>>8;var $and14=($shr)&255;$exst=$and14;var $arraydecay15=(($msgbuf)&4294967295);var $10=$exst;var $call16=_snprintf($arraydecay15,80,((__str14594)&4294967295),allocate([$10,0,0,0],["i32",0,0,0],ALLOC_STACK));var $arraydecay17=(($msgbuf)&4294967295);$msg=$arraydecay17;;}
68681 else if(__label__==9){$msg=((__str15595)&4294967295);;}}}
68682 else if(__label__==1){$msg=((__str11591)&4294967295);;}}while(0);var $11=$msg;__ZL3logPKcz(((__str16596)&4294967295),allocate([$11,0,0,0],["i8*",0,0,0],ALLOC_STACK));var $call22=_strlen(((__ZL12mbr_errorbuf)&4294967295));$len=$call22;var $tobool23=((($call22))|0)!=0;if($tobool23){__label__=12;;}else{__label__=11;;}
68683 if(__label__==12){var $13=$len;var $add_ptr=((((__ZL12mbr_errorbuf)&4294967295)+$13)&4294967295);var $14=$len;var $sub=((160-($14))&4294967295);var $15=$msg;var $call27=_snprintf($add_ptr,$sub,((__str17597)&4294967295),allocate([$15,0,0,0],["i8*",0,0,0],ALLOC_STACK));;}
68684 else if(__label__==11){var $12=$msg;var $call25=_snprintf(((__ZL12mbr_errorbuf)&4294967295),160,((__str57709)&4294967295),allocate([$12,0,0,0],["i8*",0,0,0],ALLOC_STACK));;}
68685 STACKTOP=__stackBase__;return;return;}
68686 function __ZL3logPKcz($msg){var __stackBase__=STACKTOP;STACKTOP+=4;_memset(__stackBase__,0,4);var __label__;var $msg_addr;var $params=__stackBase__;$msg_addr=$msg;var $params1=$params;HEAP32[(($params1)>>2)]=arguments[__ZL3logPKcz.length];;var $0=HEAP32[((__impure_ptr)>>2)];var $_stderr=(($0+12)&4294967295);var $1=HEAP32[(($_stderr)>>2)];var $2=$msg_addr;var $3=HEAP32[(($params)>>2)];var $call=_vfprintf($1,$2,$3);var $4=HEAP32[((__impure_ptr)>>2)];var $_stderr2=(($4+12)&4294967295);var $5=HEAP32[(($_stderr2)>>2)];var $call3=_fputc(10,$5);var $params4=$params;;STACKTOP=__stackBase__;return;return;}
68687 function __ZL14mbrola_is_idlev(){var __stackBase__=STACKTOP;STACKTOP+=20;_memset(__stackBase__,0,20);var __label__;var __lastLabel__=null;var $retval;var $p;var $buffer=__stackBase__;var $0=HEAP32[((__ZL13mbr_proc_stat)>>2)];var $call=_lseek($0,0,0);var $cmp=((($call))|0)!=0;if($cmp){__label__=1;;}else{__label__=2;;}
68688 $if_then$$if_end$2:do{if(__label__==1){$retval=0;;}
68689 else if(__label__==2){var $1=HEAP32[((__ZL13mbr_proc_stat)>>2)];var $arraydecay=(($buffer)&4294967295);var $call1=_read($1,$arraydecay,20);var $cmp2=((($call1))|0)!=20;if($cmp2){__label__=3;;}else{__label__=4;;}
68690 if(__label__==3){$retval=0;;}
68691 else if(__label__==4){var $arraydecay5=(($buffer)&4294967295);var $call6=_memchr($arraydecay5,41,20);$p=$call6;var $2=$p;var $tobool=((($2))|0)!=0;if($tobool){__label__=5;;}else{__label__=6;;}
68692 $lor_lhs_false$$if_then9$8:do{if(__label__==5){var $3=$p;var $arraydecay7=(($buffer)&4294967295);var $sub_ptr_lhs_cast=($3);var $sub_ptr_rhs_cast=($arraydecay7);var $sub_ptr_sub=((($sub_ptr_lhs_cast)-($sub_ptr_rhs_cast))&4294967295);var $cmp8=((($sub_ptr_sub))>>>0)>=18;if($cmp8){__label__=6;break $lor_lhs_false$$if_then9$8;}
68693 var $4=$p;var $arrayidx=(($4+1)&4294967295);var $5=HEAP8[($arrayidx)];var $conv=(tempInt=(($5)),(tempInt>=128?tempInt-256:tempInt));var $cmp11=((($conv))|0)==32;if($cmp11){__lastLabel__=7;__label__=8;;}else{__lastLabel__=7;__label__=9;;}
68694 if(__label__==8){var $6=$p;var $arrayidx12=(($6+2)&4294967295);var $7=HEAP8[($arrayidx12)];var $conv13=(tempInt=(($7)),(tempInt>=128?tempInt-256:tempInt));var $cmp14=((($conv13))|0)==83;__lastLabel__=8;;}
68695 var $8=__lastLabel__==7?0:($cmp14);var $conv15=((($8))&1);$retval=$conv15;__label__=10;break $if_then$$if_end$2;}}while(0);$retval=0;;}}}while(0);var $9=$retval;STACKTOP=__stackBase__;return $9;return null;}
68696 function __ZL12create_pipesPiS_S_($p1,$p2,$p3){;var __label__;var $retval;var $p1_addr;var $p2_addr;var $p3_addr;var $error;$p1_addr=$p1;$p2_addr=$p2;$p3_addr=$p3;var $0=$p1_addr;var $call=_pipe($0);var $cmp=((($call))|0)!=-1;if($cmp){__label__=1;;}else{__label__=7;;}
68697 $if_then$$if_else18$2:do{if(__label__==1){var $1=$p2_addr;var $call1=_pipe($1);var $cmp2=((($call1))|0)!=-1;if($cmp2){__label__=2;;}else{__label__=5;;}
68698 if(__label__==2){var $2=$p3_addr;var $call4=_pipe($2);var $cmp5=((($call4))|0)!=-1;if($cmp5){__label__=3;;}else{__label__=4;;}
68699 if(__label__==3){$retval=0;__label__=9;break $if_then$$if_else18$2;}
68700 else if(__label__==4){var $call7=___errno();var $3=HEAP32[(($call7)>>2)];$error=$3;var $4=$p2_addr;var $arrayidx=(($4)&4294967295);var $5=HEAP32[(($arrayidx)>>2)];var $call8=_close($5);var $6=$p2_addr;var $arrayidx9=(($6+4)&4294967295);var $7=HEAP32[(($arrayidx9)>>2)];var $call10=_close($7);;}}
68701 else if(__label__==5){var $call12=___errno();var $8=HEAP32[(($call12)>>2)];$error=$8;;}
68702 var $9=$p1_addr;var $arrayidx14=(($9)&4294967295);var $10=HEAP32[(($arrayidx14)>>2)];var $call15=_close($10);var $11=$p1_addr;var $arrayidx16=(($11+4)&4294967295);var $12=HEAP32[(($arrayidx16)>>2)];var $call17=_close($12);__label__=8;break $if_then$$if_else18$2;}
68703 else if(__label__==7){var $call19=___errno();var $13=HEAP32[(($call19)>>2)];$error=$13;__label__=8;break $if_then$$if_else18$2;}}while(0);if(__label__==8){var $14=$error;var $call21=_strerror($14);__ZL3errPKcz(((__str35615)&4294967295),allocate([$call21,0,0,0],["i8*",0,0,0],ALLOC_STACK));$retval=-1;;}
68704 var $15=$retval;;return $15;return null;}
68705 function __ZL11close_pipesPiS_S_($p1,$p2,$p3){;var __label__;var $p1_addr;var $p2_addr;var $p3_addr;$p1_addr=$p1;$p2_addr=$p2;$p3_addr=$p3;var $0=$p1_addr;var $arrayidx=(($0)&4294967295);var $1=HEAP32[(($arrayidx)>>2)];var $call=_close($1);var $2=$p1_addr;var $arrayidx1=(($2+4)&4294967295);var $3=HEAP32[(($arrayidx1)>>2)];var $call2=_close($3);var $4=$p2_addr;var $arrayidx3=(($4)&4294967295);var $5=HEAP32[(($arrayidx3)>>2)];var $call4=_close($5);var $6=$p2_addr;var $arrayidx5=(($6+4)&4294967295);var $7=HEAP32[(($arrayidx5)>>2)];var $call6=_close($7);var $8=$p3_addr;var $arrayidx7=(($8)&4294967295);var $9=HEAP32[(($arrayidx7)>>2)];var $call8=_close($9);var $10=$p3_addr;var $arrayidx9=(($10+4)&4294967295);var $11=HEAP32[(($arrayidx9)>>2)];var $call10=_close($11);;return;return;}
68706 function __Z15SetIndicLettersP10Translator($tr){;var __label__;var $tr_addr;$tr_addr=$tr;var $0=$tr_addr;var $letter_bits=(($0+708)&4294967295);var $arraydecay=(($letter_bits)&4294967295);var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=$arraydecay;$stop$=$dest$+256;$value4$=0;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=0;}
68707 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
68708 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=0;};var $1=$tr_addr;__ZL18SetLetterBitsRangeP10Translatoriii($1,0,4,20);var $2=$tr_addr;__ZL18SetLetterBitsRangeP10Translatoriii($2,0,62,77);var $3=$tr_addr;__ZL18SetLetterBitsRangeP10Translatoriii($3,0,85,87);var $4=$tr_addr;__ZL18SetLetterBitsRangeP10Translatoriii($4,1,62,77);var $5=$tr_addr;__ZL18SetLetterBitsRangeP10Translatoriii($5,1,85,87);var $6=$tr_addr;__ZL18SetLetterBitsRangeP10Translatoriii($6,2,21,57);var $7=$tr_addr;__ZL13SetLetterBitsP10TranslatoriPKc($7,2,((__ZZ15SetIndicLettersP10TranslatorE15dev_consonants2)&4294967295));var $8=$tr_addr;__ZL18SetLetterBitsRangeP10Translatoriii($8,6,4,20);var $9=$tr_addr;__ZL18SetLetterBitsRangeP10Translatoriii($9,6,62,76);var $10=$tr_addr;__ZL18SetLetterBitsRangeP10Translatoriii($10,6,85,87);var $11=$tr_addr;var $langopts=(($11)&4294967295);var $param=(($langopts+24)&4294967295);var $arrayidx=(($param+20)&4294967295);HEAP32[(($arrayidx)>>2)]=1;var $12=$tr_addr;var $letter_bits_offset=(($12+964)&4294967295);var $13=HEAP32[(($letter_bits_offset)>>2)];var $add=((($13)+77)&4294967295);var $14=$tr_addr;var $langopts1=(($14)&4294967295);var $suffix_add_e=(($langopts1+276)&4294967295);HEAP32[(($suffix_add_e)>>2)]=$add;;return;return;}
68709 function __ZL18SetLetterBitsRangeP10Translatoriii($tr,$group,$first,$last){;var __label__;var $tr_addr;var $group_addr;var $first_addr;var $last_addr;var $bits;var $ix;$tr_addr=$tr;$group_addr=$group;$first_addr=$first;$last_addr=$last;var $0=$group_addr;var $shl=1<<($0);$bits=$shl;var $1=$first_addr;$ix=$1;var $2=$ix;var $3=$last_addr;var $cmp1=((($2))|0)<=((($3))|0);if($cmp1){__label__=1;;}else{__label__=2;;}
68710 $for_body$$for_end$2:do{if(__label__==1){while(1){var $4=$bits;var $5=$ix;var $6=$tr_addr;var $letter_bits=(($6+708)&4294967295);var $arrayidx=(($letter_bits+$5)&4294967295);var $7=HEAPU8[($arrayidx)];var $conv=((($7))&255);var $or=($conv)|($4);var $conv1=((($or))&255);HEAP8[($arrayidx)]=$conv1;var $8=$ix;var $inc=((($8)+1)&4294967295);$ix=$inc;var $9=$ix;var $10=$last_addr;var $cmp=((($9))|0)<=((($10))|0);if($cmp){__label__=1;continue;}else{__label__=2;break $for_body$$for_end$2;}}}}while(0);;return;return;}
68711 function __ZL13SetLetterBitsP10TranslatoriPKc($tr,$group,$string){;var __label__;var $tr_addr;var $group_addr;var $string_addr;var $bits;var $c;$tr_addr=$tr;$group_addr=$group;$string_addr=$string;var $0=$group_addr;var $shl=1<<($0);$bits=$shl;var $1=$string_addr;var $incdec_ptr1=(($1+1)&4294967295);$string_addr=$incdec_ptr1;var $2=HEAPU8[($1)];$c=$2;var $conv3=((($2))&255);var $cmp4=((($conv3))|0)!=0;if($cmp4){__label__=1;;}else{__label__=2;;}
68712 $while_body$$while_end$2:do{if(__label__==1){while(1){var $3=$bits;var $4=$c;var $idxprom=((($4))&255);var $5=$tr_addr;var $letter_bits=(($5+708)&4294967295);var $arrayidx=(($letter_bits+$idxprom)&4294967295);var $6=HEAPU8[($arrayidx)];var $conv1=((($6))&255);var $or=($conv1)|($3);var $conv2=((($or))&255);HEAP8[($arrayidx)]=$conv2;var $7=$string_addr;var $incdec_ptr=(($7+1)&4294967295);$string_addr=$incdec_ptr;var $8=HEAPU8[($7)];$c=$8;var $conv=((($8))&255);var $cmp=((($conv))|0)!=0;if($cmp){__label__=1;continue;}else{__label__=2;break $while_body$$while_end$2;}}}}while(0);;return;return;}
68713 function __Z15SetupTranslatorP10TranslatorPKsPKh($tr,$lengths,$amps){;var __label__;var __lastLabel__=null;var $tr_addr;var $lengths_addr;var $amps_addr;$tr_addr=$tr;$lengths_addr=$lengths;$amps_addr=$amps;var $0=$lengths_addr;var $cmp=((($0))|0)!=0;if($cmp){__lastLabel__=0;__label__=1;;}else{__lastLabel__=0;__label__=2;;}
68714 if(__label__==1){var $1=$tr_addr;var $stress_lengths=(($1+676)&4294967295);var $arraydecay=(($stress_lengths)&4294967295);var $2=$arraydecay;var $3=$lengths_addr;var $4=$3;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$4;$dest$=$2;$stop$=$src$+16;if(($dest$%4)==($src$%4)&&16>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
68715 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
68716 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $_pr=$amps_addr;__lastLabel__=1;;}
68717 var $5=__lastLabel__==1?$_pr:($amps);var $cmp1=((($5))|0)!=0;if($cmp1){__label__=3;;}else{__label__=4;;}
68718 if(__label__==3){var $6=$tr_addr;var $stress_amps=(($6+660)&4294967295);var $arraydecay3=(($stress_amps)&4294967295);var $7=$amps_addr;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$7;$dest$=$arraydecay3;$stop$=$src$+8;if(($dest$%4)==($src$%4)&&8>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
68719 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
68720 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};;};return;return;}
68721 function __Z16SelectTranslatorPKc($name){;var __label__;var __lastLabel__=null;var $name_addr;var $name2;var $tr;$name_addr=$name;$name2=0;var $0=$name_addr;var $1=HEAP8[($0)];var $conv2=(tempInt=(($1)),(tempInt>=128?tempInt-256:tempInt));var $cmp3=((($conv2))|0)!=0;if($cmp3){__label__=1;;}else{__label__=2;;}
68722 $while_body$$while_end$2:do{if(__label__==1){while(1){var $2=$name2;var $shl=((($2)*256)&4294967295);var $3=$name_addr;var $incdec_ptr=(($3+1)&4294967295);$name_addr=$incdec_ptr;var $4=HEAP8[($3)];var $conv1=(tempInt=(($4)),(tempInt>=128?tempInt-256:tempInt));var $add=((($conv1)+($shl))&4294967295);$name2=$add;var $5=$name_addr;var $6=HEAP8[($5)];var $conv=(tempInt=(($6)),(tempInt>=128?tempInt-256:tempInt));var $cmp=((($conv))|0)!=0;if($cmp){__label__=1;continue;}else{__label__=2;break $while_body$$while_end$2;}}}}while(0);var $call=__ZL13NewTranslatorv();$tr=$call;var $7=$name2;if($7==24934){__label__=3;;}
68723 else if($7==24941){__label__=4;;}
68724 else if($7==24946){__label__=5;;}
68725 else if($7==25191){__label__=6;;}
68726 else if($7==25198){__label__=7;;}
68727 else if($7==25465){__label__=8;;}
68728 else if($7==25697){__label__=9;;}
68729 else if($7==25701){__label__=10;;}
68730 else if($7==25718){__label__=11;;}
68731 else if($7==25966){__label__=12;;}
68732 else if($7==25964){__label__=13;;}
68733 else if($7==6779491){__label__=13;;}
68734 else if($7==25967){__label__=15;;}
68735 else if($7==25971){__label__=16;;}
68736 else if($7==25441){__label__=16;;}
68737 else if($7==7364976){__label__=16;;}
68738 else if($7==25973){__label__=21;;}
68739 else if($7==26209){__label__=22;;}
68740 else if($7==25972){__label__=23;;}
68741 else if($7==26217){__label__=24;;}
68742 else if($7==26226){__label__=25;;}
68743 else if($7==26729){__label__=26;;}
68744 else if($7==28261){__label__=26;;}
68745 else if($7==28769){__label__=26;;}
68746 else if($7==26738){__label__=29;;}
68747 else if($7==25203){__label__=29;;}
68748 else if($7==29554){__label__=29;;}
68749 else if($7==26740){__label__=33;;}
68750 else if($7==26741){__label__=34;;}
68751 else if($7==26745){__label__=35;;}
68752 else if($7==26980){__label__=36;;}
68753 else if($7==26995){__label__=37;;}
68754 else if($7==26996){__label__=38;;}
68755 else if($7==6972015){__label__=39;;}
68756 else if($7==27489){__label__=40;;}
68757 else if($7==27503){__label__=41;;}
68758 else if($7==27509){__label__=42;;}
68759 else if($7==27745){__label__=43;;}
68760 else if($7==27766){__label__=44;;}
68761 else if($7==28011){__label__=45;;}
68762 else if($7==28268){__label__=46;;}
68763 else if($7==28271){__label__=47;;}
68764 else if($7==28525){__label__=48;;}
68765 else if($7==28780){__label__=49;;}
68766 else if($7==28788){__label__=50;;}
68767 else if($7==29295){__label__=51;;}
68768 else if($7==29301){__label__=52;;}
68769 else if($7==29303){__label__=53;;}
68770 else if($7==29547){__label__=54;;}
68771 else if($7==25459){__label__=54;;}
68772 else if($7==29545){__label__=57;;}
68773 else if($7==29548){__label__=58;;}
68774 else if($7==29553){__label__=59;;}
68775 else if($7==29558){__label__=60;;}
68776 else if($7==29559){__label__=61;;}
68777 else if($7==29806){__label__=61;;}
68778 else if($7==29793){__label__=62;;}
68779 else if($7==28012){__label__=62;;}
68780 else if($7==27502){__label__=62;;}
68781 else if($7==28018){__label__=62;;}
68782 else if($7==29797){__label__=62;;}
68783 else if($7==29810){__label__=73;;}
68784 else if($7==30066){__label__=74;;}
68785 else if($7==30313){__label__=75;;}
68786 else if($7==30575){__label__=76;;}
68787 else if($7==31336){__label__=77;;}
68788 else if($7==8022137){__label__=77;;}
68789 else{__label__=79;;}
68790 $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6:do{if(__label__==79){var $495=$tr;var $langopts756=(($495)&4294967295);var $param757=(($langopts756+24)&4294967295);var $arrayidx758=(($param757+20)&4294967295);HEAP32[(($arrayidx758)>>2)]=1;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68791 else if(__label__==3){var $8=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($8,((__ZZ16SelectTranslatorPKcE17stress_lengths_af)&4294967295),0);var $9=$tr;var $langopts=(($9)&4294967295);var $stress_rule=(($langopts+8)&4294967295);HEAP32[(($stress_rule)>>2)]=0;var $10=$tr;var $langopts2=(($10)&4294967295);var $vowel_pause=(($langopts2+4)&4294967295);HEAP32[(($vowel_pause)>>2)]=48;var $11=$tr;var $langopts3=(($11)&4294967295);var $param=(($langopts3+24)&4294967295);var $arrayidx=(($param+4)&4294967295);HEAP32[(($arrayidx)>>2)]=1;var $12=$tr;var $langopts4=(($12)&4294967295);var $param5=(($langopts4+24)&4294967295);var $arrayidx6=(($param5+12)&4294967295);HEAP32[(($arrayidx6)>>2)]=1;var $13=$tr;__ZL14SetLetterVowelP10Translatori($13,121);var $14=$tr;var $langopts7=(($14)&4294967295);var $numbers=(($langopts7+184)&4294967295);HEAP32[(($numbers)>>2)]=16779472;var $15=$tr;var $langopts8=(($15)&4294967295);var $accents=(($langopts8+220)&4294967295);HEAP32[(($accents)>>2)]=1;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68792 else if(__label__==4){var $16=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($16,((__ZZ16SelectTranslatorPKcE17stress_lengths_fr)&4294967295),((__ZZ16SelectTranslatorPKcE14stress_amps_fr)&4294967295));var $17=$tr;var $langopts10=(($17)&4294967295);var $stress_rule11=(($langopts10+8)&4294967295);HEAP32[(($stress_rule11)>>2)]=0;var $18=$tr;var $langopts12=(($18)&4294967295);var $stress_flags=(($langopts12+12)&4294967295);HEAP32[(($stress_flags)>>2)]=36;var $19=$tr;var $langopts13=(($19)&4294967295);var $length_mods=(($langopts13+176)&4294967295);var $20=HEAP32[(($length_mods)>>2)];var $21=$tr;var $langopts14=(($21)&4294967295);var $length_mods0=(($langopts14+180)&4294967295);HEAP32[(($length_mods0)>>2)]=$20;var $22=$tr;var $langopts15=(($22)&4294967295);var $param16=(($langopts15+24)&4294967295);var $arrayidx17=(($param16+20)&4294967295);HEAP32[(($arrayidx17)>>2)]=1;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68793 else if(__label__==5){var $23=$tr;var $letter_bits_offset=(($23+964)&4294967295);HEAP32[(($letter_bits_offset)>>2)]=1536;var $24=$tr;var $langopts19=(($24)&4294967295);var $numbers20=(($langopts19+184)&4294967295);HEAP32[(($numbers20)>>2)]=2884720;var $25=$tr;var $langopts21=(($25)&4294967295);var $param22=(($langopts21+24)&4294967295);var $arrayidx23=(($param22+20)&4294967295);HEAP32[(($arrayidx23)>>2)]=1;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68794 else if(__label__==6){var $26=$tr;__ZL18SetCyrillicLettersP10Translator($26);var $27=$tr;__ZL14SetLetterVowelP10Translatori($27,42);var $28=$tr;var $langopts25=(($28)&4294967295);var $param26=(($langopts25+24)&4294967295);var $arrayidx27=(($param26+20)&4294967295);HEAP32[(($arrayidx27)>>2)]=1074;var $29=$tr;var $langopts28=(($29)&4294967295);var $param29=(($langopts28+24)&4294967295);var $arrayidx30=(($param29+16)&4294967295);HEAP32[(($arrayidx30)>>2)]=23;var $30=$tr;var $langopts31=(($30)&4294967295);var $param32=(($langopts31+24)&4294967295);var $arrayidx33=(($param32+40)&4294967295);HEAP32[(($arrayidx33)>>2)]=2;var $31=$tr;var $langopts34=(($31)&4294967295);var $stress_rule35=(($langopts34+8)&4294967295);HEAP32[(($stress_rule35)>>2)]=2;var $32=$tr;var $langopts36=(($32)&4294967295);var $numbers37=(($langopts36+184)&4294967295);HEAP32[(($numbers37)>>2)]=184554728;var $33=$tr;var $langopts38=(($33)&4294967295);var $thousands_sep=(($langopts38+204)&4294967295);HEAP32[(($thousands_sep)>>2)]=32;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68795 else if(__label__==7){var $34=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($34,((__ZZ16SelectTranslatorPKcE17stress_lengths_bn)&4294967295),((__ZZ16SelectTranslatorPKcE14stress_amps_bn)&4294967295));var $35=$tr;var $langopts40=(($35)&4294967295);var $length_mods41=(($langopts40+176)&4294967295);var $36=HEAP32[(($length_mods41)>>2)];var $37=$tr;var $langopts42=(($37)&4294967295);var $length_mods043=(($langopts42+180)&4294967295);HEAP32[(($length_mods043)>>2)]=$36;var $38=$tr;var $langopts44=(($38)&4294967295);var $stress_rule45=(($langopts44+8)&4294967295);HEAP32[(($stress_rule45)>>2)]=0;var $39=$tr;var $langopts46=(($39)&4294967295);var $stress_flags47=(($langopts46+12)&4294967295);HEAP32[(($stress_flags47)>>2)]=65540;var $40=$tr;var $letter_bits_offset48=(($40+964)&4294967295);HEAP32[(($letter_bits_offset48)>>2)]=2432;var $41=$tr;__Z15SetIndicLettersP10Translator($41);var $42=$tr;__ZL18SetLetterBitsRangeP10Translatoriii($42,4,62,76);var $43=$tr;var $langopts49=(($43)&4294967295);var $numbers50=(($langopts49+184)&4294967295);HEAP32[(($numbers50)>>2)]=1;var $44=$tr;var $langopts51=(($44)&4294967295);var $break_numbers=(($langopts51+192)&4294967295);HEAP32[(($break_numbers)>>2)]=613567144;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68796 else if(__label__==8){var $45=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($45,((__ZZ16SelectTranslatorPKcE17stress_lengths_cy)&4294967295),((__ZZ16SelectTranslatorPKcE14stress_amps_cy)&4294967295));var $46=HEAP32[((((_charsets+56)&4294967295))>>2)];var $47=$tr;var $charset_a0=(($47+696)&4294967295);HEAP32[(($charset_a0)>>2)]=$46;var $48=$tr;var $langopts53=(($48)&4294967295);var $stress_rule54=(($langopts53+8)&4294967295);HEAP32[(($stress_rule54)>>2)]=2;var $49=$tr;var $langopts55=(($49)&4294967295);var $stress_flags56=(($langopts55+12)&4294967295);HEAP32[(($stress_flags56)>>2)]=22;var $50=$tr;var $langopts57=(($50)&4294967295);var $unstressed_wd1=(($langopts57+16)&4294967295);HEAP32[(($unstressed_wd1)>>2)]=0;var $51=$tr;var $langopts58=(($51)&4294967295);var $unstressed_wd2=(($langopts58+20)&4294967295);HEAP32[(($unstressed_wd2)>>2)]=2;var $52=$tr;var $langopts59=(($52)&4294967295);var $param60=(($langopts59+24)&4294967295);var $arrayidx61=(($param60+28)&4294967295);HEAP32[(($arrayidx61)>>2)]=120;var $53=$tr;var $langopts62=(($53)&4294967295);var $numbers63=(($langopts62+184)&4294967295);HEAP32[(($numbers63)>>2)]=1024;var $54=$tr;__ZL14SetLetterVowelP10Translatori($54,119);var $55=$tr;__ZL14SetLetterVowelP10Translatori($55,121);__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68797 else if(__label__==9){var $56=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($56,((__ZZ16SelectTranslatorPKcE17stress_lengths_da)&4294967295),0);var $57=$tr;var $langopts65=(($57)&4294967295);var $stress_rule66=(($langopts65+8)&4294967295);HEAP32[(($stress_rule66)>>2)]=0;var $58=$tr;var $langopts67=(($58)&4294967295);var $param68=(($langopts67+24)&4294967295);var $arrayidx69=(($param68+12)&4294967295);HEAP32[(($arrayidx69)>>2)]=1;var $59=$tr;__ZL14SetLetterVowelP10Translatori($59,121);var $60=$tr;var $langopts70=(($60)&4294967295);var $numbers71=(($langopts70+184)&4294967295);HEAP32[(($numbers71)>>2)]=184618072;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68798 else if(__label__==10){var $61=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($61,((__ZZ16SelectTranslatorPKcE17stress_lengths_de)&4294967295),((__ZZ16SelectTranslatorPKcE14stress_amps_de)&4294967295));var $62=$tr;var $langopts73=(($62)&4294967295);var $stress_rule74=(($langopts73+8)&4294967295);HEAP32[(($stress_rule74)>>2)]=0;var $63=$tr;var $langopts75=(($63)&4294967295);var $word_gap=(($langopts75)&4294967295);HEAP32[(($word_gap)>>2)]=8;var $64=$tr;var $langopts76=(($64)&4294967295);var $vowel_pause77=(($langopts76+4)&4294967295);HEAP32[(($vowel_pause77)>>2)]=48;var $65=$tr;var $langopts78=(($65)&4294967295);var $param79=(($langopts78+24)&4294967295);var $arrayidx80=(($param79+12)&4294967295);HEAP32[(($arrayidx80)>>2)]=1;var $66=$tr;var $langopts81=(($66)&4294967295);var $param82=(($langopts81+24)&4294967295);var $arrayidx83=(($param82+16)&4294967295);HEAP32[(($arrayidx83)>>2)]=16;var $67=$tr;var $langopts84=(($67)&4294967295);var $param85=(($langopts84+24)&4294967295);var $arrayidx86=(($param85+72)&4294967295);HEAP32[(($arrayidx86)>>2)]=87;var $68=$tr;var $langopts87=(($68)&4294967295);var $numbers88=(($langopts87+184)&4294967295);HEAP32[(($numbers88)>>2)]=16846872;var $69=$tr;__ZL14SetLetterVowelP10Translatori($69,121);var $70=$tr;var $langopts89=(($70)&4294967295);var $param90=(($langopts89+24)&4294967295);var $arrayidx91=(($param90+20)&4294967295);HEAP32[(($arrayidx91)>>2)]=2;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68799 else if(__label__==11){var $71=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($71,((__ZZ16SelectTranslatorPKcE17stress_lengths_ta)&4294967295),((__ZZ16SelectTranslatorPKcE14stress_amps_ta)&4294967295));var $72=$tr;var $langopts93=(($72)&4294967295);var $param94=(($langopts93+24)&4294967295);var $arrayidx95=(($param94+20)&4294967295);HEAP32[(($arrayidx95)>>2)]=1;var $73=$tr;var $langopts96=(($73)&4294967295);var $length_mods97=(($langopts96+176)&4294967295);var $74=HEAP32[(($length_mods97)>>2)];var $75=$tr;var $langopts98=(($75)&4294967295);var $length_mods099=(($langopts98+180)&4294967295);HEAP32[(($length_mods099)>>2)]=$74;var $76=$tr;var $letter_bits_offset100=(($76+964)&4294967295);HEAP32[(($letter_bits_offset100)>>2)]=1920;var $77=$tr;var $langopts101=(($77)&4294967295);var $stress_rule102=(($langopts101+8)&4294967295);HEAP32[(($stress_rule102)>>2)]=0;var $78=$tr;var $langopts103=(($78)&4294967295);var $stress_flags104=(($langopts103+12)&4294967295);HEAP32[(($stress_flags104)>>2)]=65540;var $79=$tr;__ZL18SetLetterBitsRangeP10Translatoriii($79,1,38,48);var $80=$tr;var $langopts105=(($80)&4294967295);var $break_numbers106=(($langopts105+192)&4294967295);HEAP32[(($break_numbers106)>>2)]=5288;var $81=$tr;var $langopts107=(($81)&4294967295);var $numbers108=(($langopts107+184)&4294967295);HEAP32[(($numbers108)>>2)]=1;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68800 else if(__label__==12){var $82=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($82,((__ZZ16SelectTranslatorPKcE17stress_lengths_en)&4294967295),0);var $83=$tr;var $langopts110=(($83)&4294967295);var $stress_rule111=(($langopts110+8)&4294967295);HEAP32[(($stress_rule111)>>2)]=0;var $84=$tr;var $langopts112=(($84)&4294967295);var $stress_flags113=(($langopts112+12)&4294967295);HEAP32[(($stress_flags113)>>2)]=8;var $85=$tr;var $langopts114=(($85)&4294967295);var $numbers115=(($langopts114+184)&4294967295);HEAP32[(($numbers115)>>2)]=16779328;var $86=$tr;var $langopts116=(($86)&4294967295);var $param117=(($langopts116+24)&4294967295);var $arrayidx118=(($param117+44)&4294967295);HEAP32[(($arrayidx118)>>2)]=2;var $87=$tr;var $langopts119=(($87)&4294967295);var $suffix_add_e=(($langopts119+276)&4294967295);HEAP32[(($suffix_add_e)>>2)]=101;var $88=$tr;var $langopts120=(($88)&4294967295);var $param121=(($langopts120+24)&4294967295);var $arrayidx122=(($param121+20)&4294967295);HEAP32[(($arrayidx122)>>2)]=2;var $89=$tr;__ZL13SetLetterBitsP10TranslatoriPKc($89,6,((__str630)&4294967295));__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68801 else if(__label__==13){var $90=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($90,((__ZZ16SelectTranslatorPKcE17stress_lengths_el)&4294967295),((__ZZ16SelectTranslatorPKcE14stress_amps_el)&4294967295));var $91=HEAP32[((((_charsets+28)&4294967295))>>2)];var $92=$tr;var $charset_a0124=(($92+696)&4294967295);HEAP32[(($charset_a0124)>>2)]=$91;var $93=$tr;var $char_plus_apostrophe=(($93+700)&4294967295);HEAP32[(($char_plus_apostrophe)>>2)]=((__ZZ16SelectTranslatorPKcE18el_char_apostrophe)&4294967295);var $94=$tr;var $letter_bits_offset125=(($94+964)&4294967295);HEAP32[(($letter_bits_offset125)>>2)]=896;var $95=$tr;var $letter_bits=(($95+708)&4294967295);var $arraydecay=(($letter_bits)&4294967295);var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=$arraydecay;$stop$=$dest$+256;$value4$=0;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=0;}
68802 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
68803 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=0;};var $96=$tr;__ZL13SetLetterBitsP10TranslatoriPKc($96,0,((__ZZ16SelectTranslatorPKcE9el_vowels)&4294967295));var $97=$tr;__ZL13SetLetterBitsP10TranslatoriPKc($97,7,((__ZZ16SelectTranslatorPKcE9el_vowels)&4294967295));var $98=$tr;__ZL13SetLetterBitsP10TranslatoriPKc($98,1,((__ZZ16SelectTranslatorPKcE12el_voiceless)&4294967295));var $99=$tr;__ZL13SetLetterBitsP10TranslatoriPKc($99,2,((__ZZ16SelectTranslatorPKcE13el_consonants)&4294967295));var $100=$tr;__ZL13SetLetterBitsP10TranslatoriPKc($100,6,((__ZZ16SelectTranslatorPKcE10el_fvowels)&4294967295));var $101=$tr;var $langopts126=(($101)&4294967295);var $length_mods127=(($langopts126+176)&4294967295);var $102=HEAP32[(($length_mods127)>>2)];var $103=$tr;var $langopts128=(($103)&4294967295);var $length_mods0129=(($langopts128+180)&4294967295);HEAP32[(($length_mods0129)>>2)]=$102;var $104=$tr;var $langopts130=(($104)&4294967295);var $stress_rule131=(($langopts130+8)&4294967295);HEAP32[(($stress_rule131)>>2)]=2;var $105=$tr;var $langopts132=(($105)&4294967295);var $stress_flags133=(($langopts132+12)&4294967295);HEAP32[(($stress_flags133)>>2)]=6;var $106=$tr;var $langopts134=(($106)&4294967295);var $unstressed_wd1135=(($langopts134+16)&4294967295);HEAP32[(($unstressed_wd1135)>>2)]=0;var $107=$tr;var $langopts136=(($107)&4294967295);var $unstressed_wd2137=(($langopts136+20)&4294967295);HEAP32[(($unstressed_wd2137)>>2)]=2;var $108=$tr;var $langopts138=(($108)&4294967295);var $param139=(($langopts138+24)&4294967295);var $arrayidx140=(($param139+28)&4294967295);HEAP32[(($arrayidx140)>>2)]=130;var $109=$tr;var $langopts141=(($109)&4294967295);var $numbers142=(($langopts141+184)&4294967295);HEAP32[(($numbers142)>>2)]=264;var $110=$tr;var $langopts143=(($110)&4294967295);var $numbers2=(($langopts143+188)&4294967295);HEAP32[(($numbers2)>>2)]=4098;var $111=$name2;var $cmp144=((($111))|0)==6779491;if(!($cmp144)){__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68804 var $112=$tr;var $langopts145=(($112)&4294967295);var $param146=(($langopts145+24)&4294967295);var $arrayidx147=(($param146+20)&4294967295);HEAP32[(($arrayidx147)>>2)]=1;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68805 else if(__label__==15){var $113=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($113,((__ZZ16SelectTranslatorPKcE17stress_lengths_eo)&4294967295),((__ZZ16SelectTranslatorPKcE14stress_amps_eo)&4294967295));var $114=HEAP32[((((_charsets+12)&4294967295))>>2)];var $115=$tr;var $charset_a0149=(($115+696)&4294967295);HEAP32[(($charset_a0149)>>2)]=$114;var $116=$tr;var $char_plus_apostrophe150=(($116+700)&4294967295);HEAP32[(($char_plus_apostrophe150)>>2)]=((__ZZ16SelectTranslatorPKcE18eo_char_apostrophe)&4294967295);var $117=$tr;var $langopts151=(($117)&4294967295);var $vowel_pause152=(($langopts151+4)&4294967295);HEAP32[(($vowel_pause152)>>2)]=2;var $118=$tr;var $langopts153=(($118)&4294967295);var $stress_rule154=(($langopts153+8)&4294967295);HEAP32[(($stress_rule154)>>2)]=2;var $119=$tr;var $langopts155=(($119)&4294967295);var $stress_flags156=(($langopts155+12)&4294967295);HEAP32[(($stress_flags156)>>2)]=22;var $120=$tr;var $langopts157=(($120)&4294967295);var $unstressed_wd2158=(($langopts157+20)&4294967295);HEAP32[(($unstressed_wd2158)>>2)]=2;var $121=$tr;var $langopts159=(($121)&4294967295);var $numbers160=(($langopts159+184)&4294967295);HEAP32[(($numbers160)>>2)]=16782344;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68806 else if(__label__==16){var $122=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($122,((__ZZ16SelectTranslatorPKcE17stress_lengths_es)&4294967295),((__ZZ16SelectTranslatorPKcE14stress_amps_es)&4294967295));var $123=$tr;var $langopts162=(($123)&4294967295);var $length_mods163=(($langopts162+176)&4294967295);var $124=HEAP32[(($length_mods163)>>2)];var $125=$tr;var $langopts164=(($125)&4294967295);var $length_mods0165=(($langopts164+180)&4294967295);HEAP32[(($length_mods0165)>>2)]=$124;var $126=$tr;var $langopts166=(($126)&4294967295);var $stress_rule167=(($langopts166+8)&4294967295);HEAP32[(($stress_rule167)>>2)]=2;var $127=$tr;var $langopts168=(($127)&4294967295);var $stress_flags169=(($langopts168+12)&4294967295);HEAP32[(($stress_flags169)>>2)]=534;var $128=$tr;var $langopts170=(($128)&4294967295);var $unstressed_wd1171=(($langopts170+16)&4294967295);HEAP32[(($unstressed_wd1171)>>2)]=0;var $129=$tr;var $langopts172=(($129)&4294967295);var $unstressed_wd2173=(($langopts172+20)&4294967295);HEAP32[(($unstressed_wd2173)>>2)]=2;var $130=$tr;var $langopts174=(($130)&4294967295);var $param175=(($langopts174+24)&4294967295);var $arrayidx176=(($param175+28)&4294967295);HEAP32[(($arrayidx176)>>2)]=120;var $131=$tr;var $langopts177=(($131)&4294967295);var $numbers178=(($langopts177+184)&4294967295);HEAP32[(($numbers178)>>2)]=85984552;var $132=$tr;var $langopts179=(($132)&4294967295);var $numbers2180=(($langopts179+188)&4294967295);HEAP32[(($numbers2180)>>2)]=4096;var $133=$name2;var $cmp181=((($133))|0)==25441;if($cmp181){__label__=17;;}else{__label__=18;;}
68807 if(__label__==17){var $134=$tr;var $punct_within_word=(($134+704)&4294967295);HEAP32[(($punct_within_word)>>2)]=((__ZZ16SelectTranslatorPKcE20ca_punct_within_word)&4294967295);var $135=$tr;var $langopts183=(($135)&4294967295);var $stress_flags184=(($langopts183+12)&4294967295);HEAP32[(($stress_flags184)>>2)]=566;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68808 else if(__label__==18){var $136=$name2;var $cmp185=((($136))|0)==7364976;var $137=$tr;var $langopts187=(($137)&4294967295);if($cmp185){__label__=19;;}else{__label__=20;;}
68809 if(__label__==19){var $stress_flags188=(($langopts187+12)&4294967295);HEAP32[(($stress_flags188)>>2)]=310;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68810 else if(__label__==20){var $param191=(($langopts187+24)&4294967295);var $arrayidx192=(($param191+20)&4294967295);HEAP32[(($arrayidx192)>>2)]=2;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}}}
68811 else if(__label__==21){var $138=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($138,((__ZZ16SelectTranslatorPKcE17stress_lengths_eu)&4294967295),((__ZZ16SelectTranslatorPKcE14stress_amps_eu)&4294967295));var $139=$tr;var $langopts196=(($139)&4294967295);var $stress_rule197=(($langopts196+8)&4294967295);HEAP32[(($stress_rule197)>>2)]=1;var $140=$tr;var $langopts198=(($140)&4294967295);var $numbers199=(($langopts198+184)&4294967295);HEAP32[(($numbers199)>>2)]=1049960;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68812 else if(__label__==22){var $141=$tr;var $letter_bits_offset201=(($141+964)&4294967295);HEAP32[(($letter_bits_offset201)>>2)]=1536;var $142=$tr;var $langopts202=(($142)&4294967295);var $numbers203=(($langopts202+184)&4294967295);HEAP32[(($numbers203)>>2)]=96;var $143=$tr;var $langopts204=(($143)&4294967295);var $param205=(($langopts204+24)&4294967295);var $arrayidx206=(($param205+20)&4294967295);HEAP32[(($arrayidx206)>>2)]=1;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68813 else if(__label__==23){var $144=HEAP32[((((_charsets+16)&4294967295))>>2)];var $145=$tr;var $charset_a0208=(($145+696)&4294967295);HEAP32[(($charset_a0208)>>2)]=$144;__label__=24;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68814 else if(__label__==25){var $155=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($155,((__ZZ16SelectTranslatorPKcE17stress_lengths_fr)&4294967295),((__ZZ16SelectTranslatorPKcE14stress_amps_fr)&4294967295));var $156=$tr;var $langopts223=(($156)&4294967295);var $stress_rule224=(($langopts223+8)&4294967295);HEAP32[(($stress_rule224)>>2)]=3;var $157=$tr;var $langopts225=(($157)&4294967295);var $stress_flags226=(($langopts225+12)&4294967295);HEAP32[(($stress_flags226)>>2)]=36;var $158=$tr;var $langopts227=(($158)&4294967295);var $param228=(($langopts227+24)&4294967295);var $arrayidx229=(($param228+8)&4294967295);HEAP32[(($arrayidx229)>>2)]=1;var $159=$tr;var $langopts230=(($159)&4294967295);var $length_mods231=(($langopts230+176)&4294967295);var $160=HEAP32[(($length_mods231)>>2)];var $161=$tr;var $langopts232=(($161)&4294967295);var $length_mods0233=(($langopts232+180)&4294967295);HEAP32[(($length_mods0233)>>2)]=$160;var $162=$tr;var $langopts234=(($162)&4294967295);var $accents235=(($langopts234+220)&4294967295);HEAP32[(($accents235)>>2)]=2;var $163=$tr;var $langopts236=(($163)&4294967295);var $numbers237=(($langopts236+184)&4294967295);HEAP32[(($numbers237)>>2)]=118658312;var $164=$tr;__ZL14SetLetterVowelP10Translatori($164,121);__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68815 else if(__label__==26){var $165=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($165,((__ZZ16SelectTranslatorPKcE17stress_lengths_hi)&4294967295),((__ZZ16SelectTranslatorPKcE14stress_amps_hi)&4294967295));var $166=HEAP32[((((_charsets+76)&4294967295))>>2)];var $167=$tr;var $charset_a0239=(($167+696)&4294967295);HEAP32[(($charset_a0239)>>2)]=$166;var $168=$tr;var $langopts240=(($168)&4294967295);var $length_mods241=(($langopts240+176)&4294967295);var $169=HEAP32[(($length_mods241)>>2)];var $170=$tr;var $langopts242=(($170)&4294967295);var $length_mods0243=(($langopts242+180)&4294967295);HEAP32[(($length_mods0243)>>2)]=$169;var $171=$tr;var $langopts244=(($171)&4294967295);var $stress_rule245=(($langopts244+8)&4294967295);HEAP32[(($stress_rule245)>>2)]=6;var $172=$tr;var $langopts246=(($172)&4294967295);var $stress_flags247=(($langopts246+12)&4294967295);HEAP32[(($stress_flags247)>>2)]=65540;var $173=$tr;var $langopts248=(($173)&4294967295);var $numbers249=(($langopts248+184)&4294967295);HEAP32[(($numbers249)>>2)]=16;var $174=$tr;var $langopts250=(($174)&4294967295);var $break_numbers251=(($langopts250+192)&4294967295);HEAP32[(($break_numbers251)>>2)]=84648;var $175=$tr;var $letter_bits_offset252=(($175+964)&4294967295);HEAP32[(($letter_bits_offset252)>>2)]=2304;var $176=$name2;var $cmp253=((($176))|0)==28769;if($cmp253){__label__=27;;}else{__label__=28;;}
68816 if(__label__==27){var $177=$tr;var $letter_bits_offset255=(($177+964)&4294967295);HEAP32[(($letter_bits_offset255)>>2)]=2560;;}
68817 var $178=$tr;__Z15SetIndicLettersP10Translator($178);__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68818 else if(__label__==29){var $cmp258=((($7))|0)==29554;var $179=$tr;if($cmp258){__label__=30;;}else{__label__=31;;}
68819 if(__label__==30){__Z15SetupTranslatorP10TranslatorPKsPKh($179,((__ZZ16SelectTranslatorPKcE17stress_lengths_sr)&4294967295),((__ZZ16SelectTranslatorPKcE14stress_amps_hr)&4294967295));;}
68820 else if(__label__==31){__Z15SetupTranslatorP10TranslatorPKsPKh($179,((__ZZ16SelectTranslatorPKcE17stress_lengths_hr)&4294967295),((__ZZ16SelectTranslatorPKcE14stress_amps_hr)&4294967295));;}
68821 var $180=HEAP32[((((_charsets+8)&4294967295))>>2)];var $181=$tr;var $charset_a0262=(($181+696)&4294967295);HEAP32[(($charset_a0262)>>2)]=$180;var $182=$tr;var $langopts263=(($182)&4294967295);var $stress_rule264=(($langopts263+8)&4294967295);HEAP32[(($stress_rule264)>>2)]=0;var $183=$tr;var $langopts265=(($183)&4294967295);var $stress_flags266=(($langopts265+12)&4294967295);HEAP32[(($stress_flags266)>>2)]=16;var $184=$tr;var $langopts267=(($184)&4294967295);var $param268=(($langopts267+24)&4294967295);var $arrayidx269=(($param268+16)&4294967295);HEAP32[(($arrayidx269)>>2)]=3;var $185=$tr;var $langopts270=(($185)&4294967295);var $max_initial_consonants=(($langopts270+248)&4294967295);HEAP8[($max_initial_consonants)]=5;var $186=$tr;var $langopts271=(($186)&4294967295);var $spelling_stress272=(($langopts271+249)&4294967295);HEAP8[($spelling_stress272)]=1;var $187=$tr;var $langopts273=(($187)&4294967295);var $accents274=(($langopts273+220)&4294967295);HEAP32[(($accents274)>>2)]=1;var $188=$tr;var $langopts275=(($188)&4294967295);var $numbers276=(($langopts275+184)&4294967295);HEAP32[(($numbers276)>>2)]=33572172;var $189=$tr;var $langopts277=(($189)&4294967295);var $numbers2278=(($langopts277+188)&4294967295);HEAP32[(($numbers2278)>>2)]=74;var $190=$tr;var $langopts279=(($190)&4294967295);var $replace_chars=(($langopts279+264)&4294967295);HEAP32[(($replace_chars)>>2)]=((__ZL22replace_cyrillic_latin)&4294967295);var $191=$tr;__ZL14SetLetterVowelP10Translatori($191,121);var $192=$tr;__ZL14SetLetterVowelP10Translatori($192,114);__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68822 else if(__label__==33){var $193=$tr;var $langopts281=(($193)&4294967295);var $stress_rule282=(($langopts281+8)&4294967295);HEAP32[(($stress_rule282)>>2)]=3;var $194=$tr;var $langopts283=(($194)&4294967295);var $stress_flags284=(($langopts283+12)&4294967295);HEAP32[(($stress_flags284)>>2)]=36;var $195=$tr;var $langopts285=(($195)&4294967295);var $numbers286=(($langopts285+184)&4294967295);HEAP32[(($numbers286)>>2)]=17990912;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68823 else if(__label__==34){var $196=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($196,((__ZZ16SelectTranslatorPKcE17stress_lengths_hu)&4294967295),((__ZZ16SelectTranslatorPKcE14stress_amps_hu)&4294967295));var $197=HEAP32[((((_charsets+8)&4294967295))>>2)];var $198=$tr;var $charset_a0288=(($198+696)&4294967295);HEAP32[(($charset_a0288)>>2)]=$197;var $199=$tr;var $langopts289=(($199)&4294967295);var $vowel_pause290=(($langopts289+4)&4294967295);HEAP32[(($vowel_pause290)>>2)]=32;var $200=$tr;var $langopts291=(($200)&4294967295);var $stress_rule292=(($langopts291+8)&4294967295);HEAP32[(($stress_rule292)>>2)]=0;var $201=$tr;var $langopts293=(($201)&4294967295);var $stress_flags294=(($langopts293+12)&4294967295);HEAP32[(($stress_flags294)>>2)]=1081398;var $202=$tr;var $langopts295=(($202)&4294967295);var $unstressed_wd1296=(($langopts295+16)&4294967295);HEAP32[(($unstressed_wd1296)>>2)]=2;var $203=$tr;var $langopts297=(($203)&4294967295);var $param298=(($langopts297+24)&4294967295);var $arrayidx299=(($param298+56)&4294967295);HEAP32[(($arrayidx299)>>2)]=1;var $204=$tr;var $langopts300=(($204)&4294967295);var $param301=(($langopts300+24)&4294967295);var $arrayidx302=(($param301+68)&4294967295);HEAP32[(($arrayidx302)>>2)]=2;var $205=$tr;var $langopts303=(($205)&4294967295);var $numbers304=(($langopts303+184)&4294967295);HEAP32[(($numbers304)>>2)]=186758144;var $206=$tr;var $langopts305=(($206)&4294967295);var $thousands_sep306=(($langopts305+204)&4294967295);HEAP32[(($thousands_sep306)>>2)]=32;var $207=$tr;var $langopts307=(($207)&4294967295);var $decimal_sep=(($langopts307+208)&4294967295);HEAP32[(($decimal_sep)>>2)]=44;var $208=$tr;var $langopts308=(($208)&4294967295);var $max_roman=(($langopts308+196)&4294967295);HEAP32[(($max_roman)>>2)]=899;var $209=$tr;var $langopts309=(($209)&4294967295);var $min_roman=(($langopts309+200)&4294967295);HEAP32[(($min_roman)>>2)]=1;var $210=$tr;__ZL14SetLetterVowelP10Translatori($210,121);var $211=$tr;var $langopts310=(($211)&4294967295);var $spelling_stress311=(($langopts310+249)&4294967295);HEAP8[($spelling_stress311)]=1;var $212=$tr;__Z13SetLengthModsP10Translatori($212,3);__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68824 else if(__label__==35){var $213=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($213,((__ZZ16SelectTranslatorPKcE17stress_lengths_hy)&4294967295),0);var $214=$tr;var $langopts313=(($214)&4294967295);var $stress_rule314=(($langopts313+8)&4294967295);HEAP32[(($stress_rule314)>>2)]=3;var $215=$tr;var $letter_bits_offset315=(($215+964)&4294967295);HEAP32[(($letter_bits_offset315)>>2)]=1328;var $216=$tr;var $letter_bits316=(($216+708)&4294967295);var $arraydecay317=(($letter_bits316)&4294967295);var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=$arraydecay317;$stop$=$dest$+256;$value4$=0;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=0;}
68825 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
68826 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=0;};var $217=$tr;__ZL13SetLetterBitsP10TranslatoriPKc($217,0,((__ZZ16SelectTranslatorPKcE9hy_vowels)&4294967295));var $218=$tr;__ZL13SetLetterBitsP10TranslatoriPKc($218,7,((__ZZ16SelectTranslatorPKcE9hy_vowels)&4294967295));var $219=$tr;__ZL13SetLetterBitsP10TranslatoriPKc($219,2,((__ZZ16SelectTranslatorPKcE13hy_consonants)&4294967295));var $220=$tr;var $langopts318=(($220)&4294967295);var $max_initial_consonants319=(($langopts318+248)&4294967295);HEAP8[($max_initial_consonants319)]=6;var $221=$tr;var $langopts320=(($221)&4294967295);var $numbers321=(($langopts320+184)&4294967295);HEAP32[(($numbers321)>>2)]=1032;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68827 else if(__label__==36){var $222=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($222,((__ZZ16SelectTranslatorPKcE17stress_lengths_id)&4294967295),((__ZZ16SelectTranslatorPKcE14stress_amps_id)&4294967295));var $223=$tr;var $langopts323=(($223)&4294967295);var $stress_rule324=(($langopts323+8)&4294967295);HEAP32[(($stress_rule324)>>2)]=2;var $224=$tr;var $langopts325=(($224)&4294967295);var $numbers326=(($langopts325+184)&4294967295);HEAP32[(($numbers326)>>2)]=16781320;var $225=$tr;var $langopts327=(($225)&4294967295);var $stress_flags328=(($langopts327+12)&4294967295);HEAP32[(($stress_flags328)>>2)]=22;var $226=$tr;var $langopts329=(($226)&4294967295);var $accents330=(($langopts329+220)&4294967295);HEAP32[(($accents330)>>2)]=2;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68828 else if(__label__==37){var $227=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($227,((__ZZ16SelectTranslatorPKcE17stress_lengths_is)&4294967295),0);var $228=$tr;var $langopts332=(($228)&4294967295);var $stress_rule333=(($langopts332+8)&4294967295);HEAP32[(($stress_rule333)>>2)]=0;var $229=$tr;var $langopts334=(($229)&4294967295);var $stress_flags335=(($langopts334+12)&4294967295);HEAP32[(($stress_flags335)>>2)]=16;var $230=$tr;var $langopts336=(($230)&4294967295);var $param337=(($langopts336+24)&4294967295);var $arrayidx338=(($param337+8)&4294967295);HEAP32[(($arrayidx338)>>2)]=17;var $231=$tr;var $langopts339=(($231)&4294967295);var $param340=(($langopts339+24)&4294967295);var $arrayidx341=(($param340+40)&4294967295);HEAP32[(($arrayidx341)>>2)]=2;var $232=$tr;__ZL15ResetLetterBitsP10Translatori($232,24);var $233=$tr;__ZL13SetLetterBitsP10TranslatoriPKc($233,4,((__str1631)&4294967295));var $234=$tr;__ZL13SetLetterBitsP10TranslatoriPKc($234,3,((__str2632)&4294967295));var $235=$tr;var $letter_groups=(($235+968)&4294967295);var $arrayidx342=(($letter_groups+4)&4294967295);HEAP32[(($arrayidx342)>>2)]=((__ZZ16SelectTranslatorPKcE16is_lettergroup_B)&4294967295);var $236=$tr;__ZL14SetLetterVowelP10Translatori($236,121);var $237=$tr;var $langopts343=(($237)&4294967295);var $numbers344=(($langopts343+184)&4294967295);HEAP32[(($numbers344)>>2)]=2280;var $238=$tr;var $langopts345=(($238)&4294967295);var $numbers2346=(($langopts345+188)&4294967295);HEAP32[(($numbers2346)>>2)]=2;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68829 else if(__label__==38){var $239=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($239,((__ZZ16SelectTranslatorPKcE17stress_lengths_it)&4294967295),((__ZZ16SelectTranslatorPKcE14stress_amps_it)&4294967295));var $240=$tr;var $langopts348=(($240)&4294967295);var $length_mods349=(($langopts348+176)&4294967295);var $241=HEAP32[(($length_mods349)>>2)];var $242=$tr;var $langopts350=(($242)&4294967295);var $length_mods0351=(($langopts350+180)&4294967295);HEAP32[(($length_mods0351)>>2)]=$241;var $243=$tr;var $langopts352=(($243)&4294967295);var $stress_rule353=(($langopts352+8)&4294967295);HEAP32[(($stress_rule353)>>2)]=2;var $244=$tr;var $langopts354=(($244)&4294967295);var $stress_flags355=(($langopts354+12)&4294967295);HEAP32[(($stress_flags355)>>2)]=131088;var $245=$tr;var $langopts356=(($245)&4294967295);var $vowel_pause357=(($langopts356+4)&4294967295);HEAP32[(($vowel_pause357)>>2)]=1;var $246=$tr;var $langopts358=(($246)&4294967295);var $unstressed_wd1359=(($langopts358+16)&4294967295);HEAP32[(($unstressed_wd1359)>>2)]=2;var $247=$tr;var $langopts360=(($247)&4294967295);var $unstressed_wd2361=(($langopts360+20)&4294967295);HEAP32[(($unstressed_wd2361)>>2)]=2;var $248=$tr;var $langopts362=(($248)&4294967295);var $param363=(($langopts362+24)&4294967295);var $arrayidx364=(($param363+8)&4294967295);HEAP32[(($arrayidx364)>>2)]=2;var $249=$tr;var $langopts365=(($249)&4294967295);var $param366=(($langopts365+24)&4294967295);var $arrayidx367=(($param366+56)&4294967295);HEAP32[(($arrayidx367)>>2)]=2;var $250=$tr;var $langopts368=(($250)&4294967295);var $param369=(($langopts368+24)&4294967295);var $arrayidx370=(($param369+28)&4294967295);HEAP32[(($arrayidx370)>>2)]=130;var $251=$tr;var $langopts371=(($251)&4294967295);var $param372=(($langopts371+24)&4294967295);var $arrayidx373=(($param372+40)&4294967295);HEAP32[(($arrayidx373)>>2)]=1;var $252=$tr;var $langopts374=(($252)&4294967295);var $param375=(($langopts374+24)&4294967295);var $arrayidx376=(($param375+60)&4294967295);HEAP32[(($arrayidx376)>>2)]=2;var $253=$tr;var $langopts377=(($253)&4294967295);var $numbers378=(($langopts377+184)&4294967295);HEAP32[(($numbers378)>>2)]=16786952;var $254=$tr;var $langopts379=(($254)&4294967295);var $accents380=(($langopts379+220)&4294967295);HEAP32[(($accents380)>>2)]=2;var $255=$tr;__ZL14SetLetterVowelP10Translatori($255,121);__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68830 else if(__label__==39){var $256=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($256,((__ZZ16SelectTranslatorPKcE18stress_lengths_jbo)&4294967295),0);var $257=$tr;var $langopts382=(($257)&4294967295);var $stress_rule383=(($langopts382+8)&4294967295);HEAP32[(($stress_rule383)>>2)]=2;var $258=$tr;var $langopts384=(($258)&4294967295);var $vowel_pause385=(($langopts384+4)&4294967295);HEAP32[(($vowel_pause385)>>2)]=524;var $259=$tr;var $punct_within_word386=(($259+704)&4294967295);HEAP32[(($punct_within_word386)>>2)]=((__ZZ16SelectTranslatorPKcE21jbo_punct_within_word)&4294967295);var $260=$tr;var $langopts387=(($260)&4294967295);var $param388=(($langopts387+24)&4294967295);var $arrayidx389=(($param388+52)&4294967295);HEAP32[(($arrayidx389)>>2)]=2;var $261=$tr;__ZL14SetLetterVowelP10Translatori($261,121);var $262=$tr;var $langopts390=(($262)&4294967295);var $max_lengthmod=(($langopts390+272)&4294967295);HEAP32[(($max_lengthmod)>>2)]=368;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68831 else if(__label__==40){var $263=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($263,((__ZZ16SelectTranslatorPKcE17stress_lengths_ta)&4294967295),((__ZZ16SelectTranslatorPKcE14stress_amps_ta)&4294967295));var $264=$tr;var $letter_bits392=(($264+708)&4294967295);var $arraydecay393=(($letter_bits392)&4294967295);var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=$arraydecay393;$stop$=$dest$+256;$value4$=0;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=0;}
68832 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
68833 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=0;};var $265=$tr;__ZL13SetLetterBitsP10TranslatoriPKc($265,0,((__ZZ16SelectTranslatorPKcE9ka_vowels)&4294967295));var $266=$tr;__ZL13SetLetterBitsP10TranslatoriPKc($266,2,((__ZZ16SelectTranslatorPKcE13ka_consonants)&4294967295));var $267=$tr;__ZL13SetLetterBitsP10TranslatoriPKc($267,7,((__ZZ16SelectTranslatorPKcE9ka_vowels)&4294967295));var $268=$tr;var $langopts394=(($268)&4294967295);var $stress_rule395=(($langopts394+8)&4294967295);HEAP32[(($stress_rule395)>>2)]=0;var $269=$tr;var $langopts396=(($269)&4294967295);var $stress_flags397=(($langopts396+12)&4294967295);HEAP32[(($stress_flags397)>>2)]=16;var $270=$tr;var $letter_bits_offset398=(($270+964)&4294967295);HEAP32[(($letter_bits_offset398)>>2)]=4224;var $271=$tr;var $langopts399=(($271)&4294967295);var $max_initial_consonants400=(($langopts399+248)&4294967295);HEAP8[($max_initial_consonants400)]=7;var $272=$tr;var $langopts401=(($272)&4294967295);var $numbers402=(($langopts401+184)&4294967295);HEAP32[(($numbers402)>>2)]=3187744;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68834 else if(__label__==41){var $273=$tr;var $letter_bits_offset404=(($273+964)&4294967295);HEAP32[(($letter_bits_offset404)>>2)]=4352;var $274=$tr;var $letter_bits405=(($274+708)&4294967295);var $arraydecay406=(($letter_bits405)&4294967295);var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=$arraydecay406;$stop$=$dest$+256;$value4$=0;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=0;}
68835 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
68836 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=0;};var $275=$tr;__ZL18SetLetterBitsRangeP10Translatoriii($275,0,97,117);var $276=$tr;__ZL13SetLetterBitsP10TranslatoriPKc($276,6,((__ZZ16SelectTranslatorPKcE10ko_ivowels)&4294967295));var $277=$tr;__ZL13SetLetterBitsP10TranslatoriPKc($277,5,((__ZZ16SelectTranslatorPKcE9ko_voiced)&4294967295));var $278=$tr;var $langopts407=(($278)&4294967295);var $stress_rule408=(($langopts407+8)&4294967295);HEAP32[(($stress_rule408)>>2)]=8;var $279=$tr;var $langopts409=(($279)&4294967295);var $param410=(($langopts409+24)&4294967295);var $arrayidx411=(($param410+20)&4294967295);HEAP32[(($arrayidx411)>>2)]=1;var $280=$tr;var $langopts412=(($280)&4294967295);var $numbers413=(($langopts412+184)&4294967295);HEAP32[(($numbers413)>>2)]=1024;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68837 else if(__label__==42){var $281=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($281,((__ZZ16SelectTranslatorPKcE17stress_lengths_ku)&4294967295),((__ZZ16SelectTranslatorPKcE14stress_amps_ku)&4294967295));var $282=HEAP32[((((_charsets+36)&4294967295))>>2)];var $283=$tr;var $charset_a0415=(($283+696)&4294967295);HEAP32[(($charset_a0415)>>2)]=$282;var $284=$tr;var $langopts416=(($284)&4294967295);var $stress_rule417=(($langopts416+8)&4294967295);HEAP32[(($stress_rule417)>>2)]=7;var $285=$tr;var $langopts418=(($285)&4294967295);var $numbers419=(($langopts418+184)&4294967295);HEAP32[(($numbers419)>>2)]=263264;var $286=$tr;var $langopts420=(($286)&4294967295);var $max_initial_consonants421=(($langopts420+248)&4294967295);HEAP8[($max_initial_consonants421)]=2;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68838 else if(__label__==43){var $287=HEAP32[((((_charsets+16)&4294967295))>>2)];var $288=$tr;var $charset_a0423=(($288+696)&4294967295);HEAP32[(($charset_a0423)>>2)]=$287;var $289=$tr;var $langopts424=(($289)&4294967295);var $stress_rule425=(($langopts424+8)&4294967295);HEAP32[(($stress_rule425)>>2)]=2;var $290=$tr;var $langopts426=(($290)&4294967295);var $stress_flags427=(($langopts426+12)&4294967295);HEAP32[(($stress_flags427)>>2)]=32;var $291=$tr;var $langopts428=(($291)&4294967295);var $unstressed_wd1429=(($langopts428+16)&4294967295);HEAP32[(($unstressed_wd1429)>>2)]=0;var $292=$tr;var $langopts430=(($292)&4294967295);var $unstressed_wd2431=(($langopts430+20)&4294967295);HEAP32[(($unstressed_wd2431)>>2)]=2;var $293=$tr;var $langopts432=(($293)&4294967295);var $param433=(($langopts432+24)&4294967295);var $arrayidx434=(($param433+4)&4294967295);HEAP32[(($arrayidx434)>>2)]=1;var $294=$tr;var $langopts435=(($294)&4294967295);var $numbers436=(($langopts435+184)&4294967295);HEAP32[(($numbers436)>>2)]=16777216;var $295=$tr;var $langopts437=(($295)&4294967295);var $max_roman438=(($langopts437+196)&4294967295);HEAP32[(($max_roman438)>>2)]=5000;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68839 else if(__label__==44){var $296=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($296,((__ZZ16SelectTranslatorPKcE17stress_lengths_lv)&4294967295),((__ZZ16SelectTranslatorPKcE14stress_amps_lv)&4294967295));var $297=$tr;var $langopts440=(($297)&4294967295);var $stress_rule441=(($langopts440+8)&4294967295);HEAP32[(($stress_rule441)>>2)]=0;var $298=$tr;var $langopts442=(($298)&4294967295);var $spelling_stress443=(($langopts442+249)&4294967295);HEAP8[($spelling_stress443)]=1;var $299=HEAP32[((((_charsets+16)&4294967295))>>2)];var $300=$tr;var $charset_a0444=(($300+696)&4294967295);HEAP32[(($charset_a0444)>>2)]=$299;var $301=$tr;var $langopts445=(($301)&4294967295);var $numbers446=(($langopts445+184)&4294967295);HEAP32[(($numbers446)>>2)]=99336;var $302=$tr;var $langopts447=(($302)&4294967295);var $stress_flags448=(($langopts447+12)&4294967295);HEAP32[(($stress_flags448)>>2)]=262166;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68840 else if(__label__==45){var $303=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($303,((__ZZ16SelectTranslatorPKcE17stress_lengths_mk)&4294967295),((__ZZ16SelectTranslatorPKcE14stress_amps_mk)&4294967295));var $304=HEAP32[((((_charsets+20)&4294967295))>>2)];var $305=$tr;var $charset_a0450=(($305+696)&4294967295);HEAP32[(($charset_a0450)>>2)]=$304;var $306=$tr;var $letter_groups451=(($306+968)&4294967295);var $arrayidx452=(($letter_groups451+28)&4294967295);HEAP32[(($arrayidx452)>>2)]=((__ZZ16SelectTranslatorPKcE15vowels_cyrillic)&4294967295);var $307=$tr;var $letter_groups453=(($307+968)&4294967295);var $arrayidx454=(($letter_groups453)&4294967295);HEAP32[(($arrayidx454)>>2)]=((__ZZ16SelectTranslatorPKcE15vowels_cyrillic)&4294967295);var $308=$tr;var $langopts455=(($308)&4294967295);var $stress_rule456=(($langopts455+8)&4294967295);HEAP32[(($stress_rule456)>>2)]=4;var $309=$tr;var $langopts457=(($309)&4294967295);var $numbers458=(($langopts457+184)&4294967295);HEAP32[(($numbers458)>>2)]=2114600;var $310=$tr;var $langopts459=(($310)&4294967295);var $numbers2460=(($langopts459+188)&4294967295);HEAP32[(($numbers2460)>>2)]=138;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68841 else if(__label__==46){var $311=$tr;var $langopts462=(($311)&4294967295);var $stress_rule463=(($langopts462+8)&4294967295);HEAP32[(($stress_rule463)>>2)]=0;var $312=$tr;var $langopts464=(($312)&4294967295);var $vowel_pause465=(($langopts464+4)&4294967295);HEAP32[(($vowel_pause465)>>2)]=48;var $313=$tr;var $langopts466=(($313)&4294967295);var $param467=(($langopts466+24)&4294967295);var $arrayidx468=(($param467+4)&4294967295);HEAP32[(($arrayidx468)>>2)]=1;var $314=$tr;var $langopts469=(($314)&4294967295);var $param470=(($langopts469+24)&4294967295);var $arrayidx471=(($param470+12)&4294967295);HEAP32[(($arrayidx471)>>2)]=1;var $315=$tr;var $langopts472=(($315)&4294967295);var $param473=(($langopts472+24)&4294967295);var $arrayidx474=(($param473+16)&4294967295);HEAP32[(($arrayidx474)>>2)]=16;var $316=$tr;__ZL14SetLetterVowelP10Translatori($316,121);var $317=$tr;var $langopts475=(($317)&4294967295);var $numbers476=(($langopts475+184)&4294967295);HEAP32[(($numbers476)>>2)]=2169880;var $318=$tr;var $langopts477=(($318)&4294967295);var $ordinal_indicator=(($langopts477+216)&4294967295);HEAP32[(($ordinal_indicator)>>2)]=((__str3633)&4294967295);var $319=$tr;var $langopts478=(($319)&4294967295);var $stress_flags479=(($langopts478+12)&4294967295);HEAP32[(($stress_flags479)>>2)]=128;var $320=$tr;var $stress_lengths=(($320+676)&4294967295);var $arraydecay480=(($stress_lengths)&4294967295);var $321=$arraydecay480;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=__ZZ16SelectTranslatorPKcE17stress_lengths_nl;$dest$=$321;$stop$=$src$+16;if(($dest$%4)==($src$%4)&&16>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
68842 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
68843 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68844 else if(__label__==47){var $322=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($322,((__ZZ16SelectTranslatorPKcE17stress_lengths_no)&4294967295),0);var $323=$tr;var $langopts482=(($323)&4294967295);var $stress_rule483=(($langopts482+8)&4294967295);HEAP32[(($stress_rule483)>>2)]=0;var $324=$tr;__ZL14SetLetterVowelP10Translatori($324,121);var $325=$tr;var $langopts484=(($325)&4294967295);var $numbers485=(($langopts484+184)&4294967295);HEAP32[(($numbers485)>>2)]=71752;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68845 else if(__label__==48){var $326=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($326,((__ZZ16SelectTranslatorPKcE17stress_lengths_om)&4294967295),((__ZZ16SelectTranslatorPKcE14stress_amps_om)&4294967295));var $327=$tr;var $langopts487=(($327)&4294967295);var $stress_rule488=(($langopts487+8)&4294967295);HEAP32[(($stress_rule488)>>2)]=2;var $328=$tr;var $langopts489=(($328)&4294967295);var $stress_flags490=(($langopts489+12)&4294967295);HEAP32[(($stress_flags490)>>2)]=524310;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68846 else if(__label__==49){var $329=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($329,((__ZZ16SelectTranslatorPKcE17stress_lengths_pl)&4294967295),((__ZZ16SelectTranslatorPKcE14stress_amps_pl)&4294967295));var $330=HEAP32[((((_charsets+8)&4294967295))>>2)];var $331=$tr;var $charset_a0492=(($331+696)&4294967295);HEAP32[(($charset_a0492)>>2)]=$330;var $332=$tr;var $langopts493=(($332)&4294967295);var $stress_rule494=(($langopts493+8)&4294967295);HEAP32[(($stress_rule494)>>2)]=2;var $333=$tr;var $langopts495=(($333)&4294967295);var $stress_flags496=(($langopts495+12)&4294967295);HEAP32[(($stress_flags496)>>2)]=6;var $334=$tr;var $langopts497=(($334)&4294967295);var $param498=(($langopts497+24)&4294967295);var $arrayidx499=(($param498+16)&4294967295);HEAP32[(($arrayidx499)>>2)]=8;var $335=$tr;var $langopts500=(($335)&4294967295);var $max_initial_consonants501=(($langopts500+248)&4294967295);HEAP8[($max_initial_consonants501)]=7;var $336=$tr;var $langopts502=(($336)&4294967295);var $numbers503=(($langopts502+184)&4294967295);HEAP32[(($numbers503)>>2)]=20488;var $337=$tr;var $langopts504=(($337)&4294967295);var $numbers2505=(($langopts504+188)&4294967295);HEAP32[(($numbers2505)>>2)]=64;var $338=$tr;var $langopts506=(($338)&4294967295);var $param507=(($langopts506+24)&4294967295);var $arrayidx508=(($param507+44)&4294967295);HEAP32[(($arrayidx508)>>2)]=260;var $339=$tr;__ZL14SetLetterVowelP10Translatori($339,121);__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68847 else if(__label__==50){var $340=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($340,((__ZZ16SelectTranslatorPKcE17stress_lengths_pt)&4294967295),((__ZZ16SelectTranslatorPKcE14stress_amps_pt)&4294967295));var $341=$tr;var $langopts510=(($341)&4294967295);var $length_mods511=(($langopts510+176)&4294967295);var $342=HEAP32[(($length_mods511)>>2)];var $343=$tr;var $langopts512=(($343)&4294967295);var $length_mods0513=(($langopts512+180)&4294967295);HEAP32[(($length_mods0513)>>2)]=$342;var $344=$tr;var $langopts514=(($344)&4294967295);var $stress_rule515=(($langopts514+8)&4294967295);HEAP32[(($stress_rule515)>>2)]=3;var $345=$tr;var $langopts516=(($345)&4294967295);var $stress_flags517=(($langopts516+12)&4294967295);HEAP32[(($stress_flags517)>>2)]=139286;var $346=$tr;var $langopts518=(($346)&4294967295);var $numbers519=(($langopts518+184)&4294967295);HEAP32[(($numbers519)>>2)]=16793704;var $347=$tr;__ZL14SetLetterVowelP10Translatori($347,121);var $348=$tr;__ZL15ResetLetterBitsP10Translatori($348,2);var $349=$tr;__ZL13SetLetterBitsP10TranslatoriPKc($349,1,((__str4634)&4294967295));var $350=$tr;var $langopts520=(($350)&4294967295);var $param521=(($langopts520+24)&4294967295);var $arrayidx522=(($param521+60)&4294967295);HEAP32[(($arrayidx522)>>2)]=2;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68848 else if(__label__==51){var $351=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($351,((__ZZ16SelectTranslatorPKcE17stress_lengths_ro)&4294967295),((__ZZ16SelectTranslatorPKcE14stress_amps_ro)&4294967295));var $352=$tr;var $langopts524=(($352)&4294967295);var $stress_rule525=(($langopts524+8)&4294967295);HEAP32[(($stress_rule525)>>2)]=2;var $353=$tr;var $langopts526=(($353)&4294967295);var $stress_flags527=(($langopts526+12)&4294967295);HEAP32[(($stress_flags527)>>2)]=262;var $354=HEAP32[((((_charsets+8)&4294967295))>>2)];var $355=$tr;var $charset_a0528=(($355+696)&4294967295);HEAP32[(($charset_a0528)>>2)]=$354;var $356=$tr;var $langopts529=(($356)&4294967295);var $numbers530=(($langopts529+184)&4294967295);HEAP32[(($numbers530)>>2)]=16805928;var $357=$tr;var $langopts531=(($357)&4294967295);var $numbers2532=(($langopts531+188)&4294967295);HEAP32[(($numbers2532)>>2)]=30;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68849 else if(__label__==52){var $358=$tr;__ZL18Translator_RussianP10Translator($358);__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68850 else if(__label__==53){var $359=$tr;var $langopts535=(($359)&4294967295);var $stress_rule536=(($langopts535+8)&4294967295);HEAP32[(($stress_rule536)>>2)]=2;var $360=$tr;var $langopts537=(($360)&4294967295);var $stress_flags538=(($langopts537+12)&4294967295);HEAP32[(($stress_flags538)>>2)]=22;var $361=$tr;var $langopts539=(($361)&4294967295);var $length_mods540=(($langopts539+176)&4294967295);var $362=HEAP32[(($length_mods540)>>2)];var $363=$tr;var $langopts541=(($363)&4294967295);var $length_mods0542=(($langopts541+180)&4294967295);HEAP32[(($length_mods0542)>>2)]=$362;var $364=$tr;var $langopts543=(($364)&4294967295);var $numbers544=(($langopts543+184)&4294967295);HEAP32[(($numbers544)>>2)]=278624;var $365=$tr;var $langopts545=(($365)&4294967295);var $numbers2546=(($langopts545+188)&4294967295);HEAP32[(($numbers2546)>>2)]=512;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68851 else if(__label__==54){var $366=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($366,((__ZZ16SelectTranslatorPKcE17stress_lengths_sk)&4294967295),((__ZZ16SelectTranslatorPKcE14stress_amps_sk)&4294967295));var $367=HEAP32[((((_charsets+8)&4294967295))>>2)];var $368=$tr;var $charset_a0548=(($368+696)&4294967295);HEAP32[(($charset_a0548)>>2)]=$367;var $369=$tr;var $langopts549=(($369)&4294967295);var $stress_rule550=(($langopts549+8)&4294967295);HEAP32[(($stress_rule550)>>2)]=0;var $370=$tr;var $langopts551=(($370)&4294967295);var $stress_flags552=(($langopts551+12)&4294967295);HEAP32[(($stress_flags552)>>2)]=22;var $371=$tr;var $langopts553=(($371)&4294967295);var $param554=(($langopts553+24)&4294967295);var $arrayidx555=(($param554+16)&4294967295);HEAP32[(($arrayidx555)>>2)]=3;var $372=$tr;var $langopts556=(($372)&4294967295);var $max_initial_consonants557=(($langopts556+248)&4294967295);HEAP8[($max_initial_consonants557)]=5;var $373=$tr;var $langopts558=(($373)&4294967295);var $spelling_stress559=(($langopts558+249)&4294967295);HEAP8[($spelling_stress559)]=1;var $374=$tr;var $langopts560=(($374)&4294967295);var $param561=(($langopts560+24)&4294967295);var $arrayidx562=(($param561+44)&4294967295);HEAP32[(($arrayidx562)>>2)]=4;var $375=$tr;var $langopts563=(($375)&4294967295);var $numbers564=(($langopts563+184)&4294967295);HEAP32[(($numbers564)>>2)]=16794624;var $376=$tr;var $langopts565=(($376)&4294967295);var $numbers2566=(($langopts565+188)&4294967295);HEAP32[(($numbers2566)>>2)]=256;var $377=$tr;var $langopts567=(($377)&4294967295);var $thousands_sep568=(($langopts567+204)&4294967295);HEAP32[(($thousands_sep568)>>2)]=0;var $378=$tr;var $langopts569=(($378)&4294967295);var $decimal_sep570=(($langopts569+208)&4294967295);HEAP32[(($decimal_sep570)>>2)]=44;var $379=$name2;var $cmp571=((($379))|0)==25459;if($cmp571){__label__=55;;}else{__label__=56;;}
68852 if(__label__==55){var $380=$tr;var $langopts573=(($380)&4294967295);var $numbers2574=(($langopts573+188)&4294967295);HEAP32[(($numbers2574)>>2)]=264;;}
68853 var $381=$tr;__ZL14SetLetterVowelP10Translatori($381,121);var $382=$tr;__ZL14SetLetterVowelP10Translatori($382,114);var $383=$tr;__ZL15ResetLetterBitsP10Translatori($383,32);var $384=$tr;__ZL13SetLetterBitsP10TranslatoriPKc($384,5,((__str5635)&4294967295));__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68854 else if(__label__==57){var $385=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($385,((__ZZ16SelectTranslatorPKcE17stress_lengths_ta)&4294967295),((__ZZ16SelectTranslatorPKcE14stress_amps_ta)&4294967295));var $386=$tr;var $langopts577=(($386)&4294967295);var $length_mods578=(($langopts577+176)&4294967295);var $387=HEAP32[(($length_mods578)>>2)];var $388=$tr;var $langopts579=(($388)&4294967295);var $length_mods0580=(($langopts579+180)&4294967295);HEAP32[(($length_mods0580)>>2)]=$387;var $389=$tr;var $langopts581=(($389)&4294967295);var $stress_rule582=(($langopts581+8)&4294967295);HEAP32[(($stress_rule582)>>2)]=0;var $390=$tr;var $langopts583=(($390)&4294967295);var $stress_flags584=(($langopts583+12)&4294967295);HEAP32[(($stress_flags584)>>2)]=65556;var $391=$tr;var $langopts585=(($391)&4294967295);var $spelling_stress586=(($langopts585+249)&4294967295);HEAP8[($spelling_stress586)]=1;var $392=$tr;var $letter_bits_offset587=(($392+964)&4294967295);HEAP32[(($letter_bits_offset587)>>2)]=3456;var $393=$tr;var $letter_bits588=(($393+708)&4294967295);var $arraydecay589=(($letter_bits588)&4294967295);var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=$arraydecay589;$stop$=$dest$+256;$value4$=0;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=0;}
68855 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
68856 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=0;};var $394=$tr;__ZL18SetLetterBitsRangeP10Translatoriii($394,0,5,22);var $395=$tr;__ZL18SetLetterBitsRangeP10Translatoriii($395,0,74,115);var $396=$tr;__ZL18SetLetterBitsRangeP10Translatoriii($396,1,74,115);var $397=$tr;__ZL18SetLetterBitsRangeP10Translatoriii($397,2,26,70);var $398=$tr;var $langopts590=(($398)&4294967295);var $param591=(($langopts590+24)&4294967295);var $arrayidx592=(($param591+20)&4294967295);HEAP32[(($arrayidx592)>>2)]=1;var $399=$tr;var $letter_bits_offset593=(($399+964)&4294967295);var $400=HEAP32[(($letter_bits_offset593)>>2)];var $add594=((($400)+74)&4294967295);var $401=$tr;var $langopts595=(($401)&4294967295);var $suffix_add_e596=(($langopts595+276)&4294967295);HEAP32[(($suffix_add_e596)>>2)]=$add594;var $402=$tr;var $langopts597=(($402)&4294967295);var $numbers598=(($langopts597+184)&4294967295);HEAP32[(($numbers598)>>2)]=2097152;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68857 else if(__label__==58){var $403=HEAP32[((((_charsets+8)&4294967295))>>2)];var $404=$tr;var $charset_a0600=(($404+696)&4294967295);HEAP32[(($charset_a0600)>>2)]=$403;var $405=$tr;var $langopts601=(($405)&4294967295);var $stress_rule602=(($langopts601+8)&4294967295);HEAP32[(($stress_rule602)>>2)]=2;var $406=$tr;var $langopts603=(($406)&4294967295);var $stress_flags604=(($langopts603+12)&4294967295);HEAP32[(($stress_flags604)>>2)]=32;var $407=$tr;var $langopts605=(($407)&4294967295);var $param606=(($langopts605+24)&4294967295);var $arrayidx607=(($param606+16)&4294967295);HEAP32[(($arrayidx607)>>2)]=19;var $408=$tr;var $langopts608=(($408)&4294967295);var $numbers609=(($langopts608+184)&4294967295);HEAP32[(($numbers609)>>2)]=16864280;var $409=$tr;var $langopts610=(($409)&4294967295);var $numbers2611=(($langopts610+188)&4294967295);HEAP32[(($numbers2611)>>2)]=256;var $410=$tr;var $langopts612=(($410)&4294967295);var $thousands_sep613=(($langopts612+204)&4294967295);HEAP32[(($thousands_sep613)>>2)]=32;var $411=$tr;__ZL14SetLetterVowelP10Translatori($411,114);__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68858 else if(__label__==59){var $412=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($412,((__ZZ16SelectTranslatorPKcE17stress_lengths_sq)&4294967295),((__ZZ16SelectTranslatorPKcE14stress_amps_sq)&4294967295));var $413=$tr;var $langopts615=(($413)&4294967295);var $stress_rule616=(($langopts615+8)&4294967295);HEAP32[(($stress_rule616)>>2)]=2;var $414=$tr;var $langopts617=(($414)&4294967295);var $stress_flags618=(($langopts617+12)&4294967295);HEAP32[(($stress_flags618)>>2)]=278;var $415=$tr;__ZL14SetLetterVowelP10Translatori($415,121);var $416=$tr;var $langopts619=(($416)&4294967295);var $numbers620=(($langopts619+184)&4294967295);HEAP32[(($numbers620)>>2)]=32872;var $417=$tr;var $langopts621=(($417)&4294967295);var $accents622=(($langopts621+220)&4294967295);HEAP32[(($accents622)>>2)]=2;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68859 else if(__label__==60){var $418=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($418,((__ZZ16SelectTranslatorPKcE17stress_lengths_sv)&4294967295),((__ZZ16SelectTranslatorPKcE14stress_amps_sv)&4294967295));var $419=$tr;var $langopts624=(($419)&4294967295);var $stress_rule625=(($langopts624+8)&4294967295);HEAP32[(($stress_rule625)>>2)]=0;var $420=$tr;__ZL14SetLetterVowelP10Translatori($420,121);var $421=$tr;var $langopts626=(($421)&4294967295);var $numbers627=(($langopts626+184)&4294967295);HEAP32[(($numbers627)>>2)]=6408;var $422=$tr;var $langopts628=(($422)&4294967295);var $accents629=(($langopts628+220)&4294967295);HEAP32[(($accents629)>>2)]=1;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68860 else if(__label__==61){var $423=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($423,((__ZZ16SelectTranslatorPKcE17stress_lengths_sw)&4294967295),((__ZZ16SelectTranslatorPKcE14stress_amps_sw)&4294967295));var $424=$tr;var $langopts631=(($424)&4294967295);var $length_mods632=(($langopts631+176)&4294967295);var $425=HEAP32[(($length_mods632)>>2)];var $426=$tr;var $langopts633=(($426)&4294967295);var $length_mods0634=(($langopts633+180)&4294967295);HEAP32[(($length_mods0634)>>2)]=$425;var $427=$tr;var $langopts635=(($427)&4294967295);var $vowel_pause636=(($langopts635+4)&4294967295);HEAP32[(($vowel_pause636)>>2)]=1;var $428=$tr;var $langopts637=(($428)&4294967295);var $stress_rule638=(($langopts637+8)&4294967295);HEAP32[(($stress_rule638)>>2)]=2;var $429=$tr;var $langopts639=(($429)&4294967295);var $stress_flags640=(($langopts639+12)&4294967295);HEAP32[(($stress_flags640)>>2)]=22;var $430=$tr;var $langopts641=(($430)&4294967295);var $numbers642=(($langopts641+184)&4294967295);HEAP32[(($numbers642)>>2)]=1248;var $431=$tr;var $langopts643=(($431)&4294967295);var $break_numbers644=(($langopts643+192)&4294967295);HEAP32[(($break_numbers644)>>2)]=1227133544;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68861 else if(__label__==62){var $432=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($432,((__ZZ16SelectTranslatorPKcE17stress_lengths_ta)&4294967295),((__ZZ16SelectTranslatorPKcE14stress_amps_ta)&4294967295));var $433=$tr;var $langopts646=(($433)&4294967295);var $length_mods647=(($langopts646+176)&4294967295);var $434=HEAP32[(($length_mods647)>>2)];var $435=$tr;var $langopts648=(($435)&4294967295);var $length_mods0649=(($langopts648+180)&4294967295);HEAP32[(($length_mods0649)>>2)]=$434;var $436=$tr;var $langopts650=(($436)&4294967295);var $stress_rule651=(($langopts650+8)&4294967295);HEAP32[(($stress_rule651)>>2)]=0;var $437=$tr;var $langopts652=(($437)&4294967295);var $stress_flags653=(($langopts652+12)&4294967295);HEAP32[(($stress_flags653)>>2)]=65540;var $438=$tr;var $langopts654=(($438)&4294967295);var $spelling_stress655=(($langopts654+249)&4294967295);HEAP8[($spelling_stress655)]=1;var $439=$tr;var $langopts656=(($439)&4294967295);var $break_numbers657=(($langopts656+192)&4294967295);HEAP32[(($break_numbers657)>>2)]=5288;var $440=$name2;var $cmp658=((($440))|0)==29793;if($cmp658){__lastLabel__=62;__label__=63;;}else{__lastLabel__=62;__label__=64;;}
68862 if(__label__==63){var $441=$tr;var $letter_bits_offset660=(($441+964)&4294967295);HEAP32[(($letter_bits_offset660)>>2)]=2944;var $442=$tr;var $langopts661=(($442)&4294967295);var $numbers662=(($langopts661+184)&4294967295);HEAP32[(($numbers662)>>2)]=2097152;var $_pr=$name2;__lastLabel__=63;;}
68863 var $443=__lastLabel__==63?$_pr:($440);var $cmp664=((($443))|0)==28018;if($cmp664){__label__=65;;}else{__label__=66;;}
68864 $if_then665$$if_else667$75:do{if(__label__==65){var $444=$tr;var $letter_bits_offset666=(($444+964)&4294967295);HEAP32[(($letter_bits_offset666)>>2)]=2304;;}
68865 else if(__label__==66){var $445=$name2;var $cmp668=((($445))|0)==28012;if($cmp668){__label__=67;;}else{__label__=68;;}
68866 if(__label__==67){var $446=$tr;var $letter_bits_offset670=(($446+964)&4294967295);HEAP32[(($letter_bits_offset670)>>2)]=3328;var $447=$tr;var $langopts671=(($447)&4294967295);var $numbers672=(($langopts671+184)&4294967295);HEAP32[(($numbers672)>>2)]=2097152;;}
68867 else if(__label__==68){var $448=$name2;var $cmp674=((($448))|0)==27502;if($cmp674){__label__=69;;}else{__label__=70;;}
68868 if(__label__==69){var $449=$tr;var $letter_bits_offset676=(($449+964)&4294967295);HEAP32[(($letter_bits_offset676)>>2)]=3200;var $450=$tr;var $langopts677=(($450)&4294967295);var $numbers678=(($langopts677+184)&4294967295);HEAP32[(($numbers678)>>2)]=1;;}
68869 else if(__label__==70){var $451=$name2;var $cmp680=((($451))|0)==29797;if(!($cmp680)){__label__=72;break $if_then665$$if_else667$75;}
68870 var $452=$tr;var $letter_bits_offset682=(($452+964)&4294967295);HEAP32[(($letter_bits_offset682)>>2)]=3072;var $453=$tr;var $langopts683=(($453)&4294967295);var $numbers684=(($langopts683+184)&4294967295);HEAP32[(($numbers684)>>2)]=1;;}}}}while(0);var $454=$tr;var $langopts689=(($454)&4294967295);var $param690=(($langopts689+24)&4294967295);var $arrayidx691=(($param690+32)&4294967295);HEAP32[(($arrayidx691)>>2)]=1;var $455=$tr;__Z15SetIndicLettersP10Translator($455);var $456=$tr;__ZL18SetLetterBitsRangeP10Translatoriii($456,1,78,78);__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68871 else if(__label__==73){var $457=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($457,((__ZZ16SelectTranslatorPKcE17stress_lengths_tr)&4294967295),((__ZZ16SelectTranslatorPKcE14stress_amps_tr)&4294967295));var $458=HEAP32[((((_charsets+36)&4294967295))>>2)];var $459=$tr;var $charset_a0693=(($459+696)&4294967295);HEAP32[(($charset_a0693)>>2)]=$458;var $460=$tr;var $langopts694=(($460)&4294967295);var $stress_rule695=(($langopts694+8)&4294967295);HEAP32[(($stress_rule695)>>2)]=7;var $461=$tr;var $langopts696=(($461)&4294967295);var $stress_flags697=(($langopts696+12)&4294967295);HEAP32[(($stress_flags697)>>2)]=32;var $462=$tr;var $langopts698=(($462)&4294967295);var $numbers699=(($langopts698+184)&4294967295);HEAP32[(($numbers699)>>2)]=2114824;var $463=$tr;var $langopts700=(($463)&4294967295);var $max_initial_consonants701=(($langopts700+248)&4294967295);HEAP8[($max_initial_consonants701)]=2;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68872 else if(__label__==74){var $464=$tr;var $letter_bits_offset703=(($464+964)&4294967295);HEAP32[(($letter_bits_offset703)>>2)]=1536;var $465=$tr;var $langopts704=(($465)&4294967295);var $param705=(($langopts704+24)&4294967295);var $arrayidx706=(($param705+20)&4294967295);HEAP32[(($arrayidx706)>>2)]=1;var $466=$tr;var $langopts707=(($466)&4294967295);var $numbers708=(($langopts707+184)&4294967295);HEAP32[(($numbers708)>>2)]=16;var $467=$tr;var $langopts709=(($467)&4294967295);var $break_numbers710=(($langopts709+192)&4294967295);HEAP32[(($break_numbers710)>>2)]=21160;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68873 else if(__label__==75){var $468=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($468,((__ZZ16SelectTranslatorPKcE17stress_lengths_vi)&4294967295),((__ZZ16SelectTranslatorPKcE14stress_amps_vi)&4294967295));var $469=$tr;var $langopts712=(($469)&4294967295);var $length_mods713=(($langopts712+176)&4294967295);var $470=HEAP32[(($length_mods713)>>2)];var $471=$tr;var $langopts714=(($471)&4294967295);var $length_mods0715=(($langopts714+180)&4294967295);HEAP32[(($length_mods0715)>>2)]=$470;var $472=$tr;var $langopts716=(($472)&4294967295);var $stress_rule717=(($langopts716+8)&4294967295);HEAP32[(($stress_rule717)>>2)]=0;var $473=$tr;var $langopts718=(($473)&4294967295);var $word_gap719=(($langopts718)&4294967295);HEAP32[(($word_gap719)>>2)]=33;var $474=$tr;var $letter_groups720=(($474+968)&4294967295);var $arrayidx721=(($letter_groups720+28)&4294967295);HEAP32[(($arrayidx721)>>2)]=((__ZZ16SelectTranslatorPKcE9vowels_vi)&4294967295);var $475=$tr;var $letter_groups722=(($475+968)&4294967295);var $arrayidx723=(($letter_groups722)&4294967295);HEAP32[(($arrayidx723)>>2)]=((__ZZ16SelectTranslatorPKcE9vowels_vi)&4294967295);var $476=$tr;var $langopts724=(($476)&4294967295);var $tone_language=(($langopts724+224)&4294967295);HEAP32[(($tone_language)>>2)]=1;var $477=$tr;var $langopts725=(($477)&4294967295);var $unstressed_wd1726=(($langopts725+16)&4294967295);HEAP32[(($unstressed_wd1726)>>2)]=2;var $478=$tr;var $langopts727=(($478)&4294967295);var $numbers728=(($langopts727+184)&4294967295);HEAP32[(($numbers728)>>2)]=12615688;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68874 else if(__label__==76){var $479=$tr;var $langopts730=(($479)&4294967295);var $stress_rule731=(($langopts730+8)&4294967295);HEAP32[(($stress_rule731)>>2)]=0;var $480=$tr;var $langopts732=(($480)&4294967295);var $numbers733=(($langopts732+184)&4294967295);HEAP32[(($numbers733)>>2)]=2098528;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68875 else if(__label__==77){var $481=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($481,((__ZZ16SelectTranslatorPKcE17stress_lengths_zh)&4294967295),((__ZZ16SelectTranslatorPKcE14stress_amps_zh)&4294967295));var $482=$tr;var $langopts735=(($482)&4294967295);var $stress_rule736=(($langopts735+8)&4294967295);HEAP32[(($stress_rule736)>>2)]=3;var $483=$tr;var $langopts737=(($483)&4294967295);var $stress_flags738=(($langopts737+12)&4294967295);HEAP32[(($stress_flags738)>>2)]=2;var $484=$tr;var $langopts739=(($484)&4294967295);var $vowel_pause740=(($langopts739+4)&4294967295);HEAP32[(($vowel_pause740)>>2)]=0;var $485=$tr;var $langopts741=(($485)&4294967295);var $tone_language742=(($langopts741+224)&4294967295);HEAP32[(($tone_language742)>>2)]=1;var $486=$tr;var $langopts743=(($486)&4294967295);var $length_mods744=(($langopts743+176)&4294967295);var $487=HEAP32[(($length_mods744)>>2)];var $488=$tr;var $langopts745=(($488)&4294967295);var $length_mods0746=(($langopts745+180)&4294967295);HEAP32[(($length_mods0746)>>2)]=$487;var $489=$tr;var $langopts747=(($489)&4294967295);var $tone_numbers=(($langopts747+250)&4294967295);HEAP8[($tone_numbers)]=1;var $490=$tr;var $langopts748=(($490)&4294967295);var $ideographs=(($langopts748+251)&4294967295);HEAP8[($ideographs)]=1;var $491=$tr;var $langopts749=(($491)&4294967295);var $word_gap750=(($langopts749)&4294967295);HEAP32[(($word_gap750)>>2)]=33;var $492=$name2;var $cmp751=((($492))|0)==31336;if(!($cmp751)){__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}
68876 var $493=$tr;var $langopts753=(($493)&4294967295);var $textmode=(($langopts753+252)&4294967295);HEAP8[($textmode)]=1;var $494=$tr;var $langopts754=(($494)&4294967295);var $listx=(($langopts754+260)&4294967295);HEAP32[(($listx)>>2)]=1;__label__=80;break $sw_default$$sw_bb$$sw_bb9$$sw_bb18$$sw_bb24$$sw_bb39$$sw_bb52$$sw_bb64$$sw_bb72$$sw_bb92$$sw_bb109$$sw_bb123$$sw_bb148$$sw_bb161$$sw_bb195$$sw_bb200$$sw_bb207$$sw_bb209$$sw_bb222$$sw_bb238$$sw_bb257$$sw_bb280$$sw_bb287$$sw_bb312$$sw_bb322$$sw_bb331$$sw_bb347$$sw_bb381$$sw_bb391$$sw_bb403$$sw_bb414$$sw_bb422$$sw_bb439$$sw_bb449$$sw_bb461$$sw_bb481$$sw_bb486$$sw_bb491$$sw_bb509$$sw_bb523$$sw_bb533$$sw_bb534$$sw_bb547$$sw_bb576$$sw_bb599$$sw_bb614$$sw_bb623$$sw_bb630$$sw_bb645$$sw_bb692$$sw_bb702$$sw_bb711$$sw_bb729$$sw_bb734$6;}}while(0);if(__label__==24){var $146=$tr;__Z15SetupTranslatorP10TranslatorPKsPKh($146,((__ZZ16SelectTranslatorPKcE17stress_lengths_fi)&4294967295),((__ZZ16SelectTranslatorPKcE14stress_amps_fi)&4294967295));var $147=$tr;var $langopts210=(($147)&4294967295);var $stress_rule211=(($langopts210+8)&4294967295);HEAP32[(($stress_rule211)>>2)]=0;var $148=$tr;var $langopts212=(($148)&4294967295);var $stress_flags213=(($langopts212+12)&4294967295);HEAP32[(($stress_flags213)>>2)]=86;var $149=$tr;var $langopts214=(($149)&4294967295);var $param215=(($langopts214+24)&4294967295);var $arrayidx216=(($param215+56)&4294967295);HEAP32[(($arrayidx216)>>2)]=1;var $150=$tr;var $langopts217=(($150)&4294967295);var $long_stop=(($langopts217+240)&4294967295);HEAP32[(($long_stop)>>2)]=130;var $151=$tr;var $langopts218=(($151)&4294967295);var $numbers219=(($langopts218+184)&4294967295);HEAP32[(($numbers219)>>2)]=4104;var $152=$tr;__ZL14SetLetterVowelP10Translatori($152,121);var $153=$tr;var $langopts220=(($153)&4294967295);var $spelling_stress=(($langopts220+249)&4294967295);HEAP8[($spelling_stress)]=1;var $154=$tr;var $langopts221=(($154)&4294967295);var $intonation_group=(($langopts221+228)&4294967295);HEAP32[(($intonation_group)>>2)]=3;;}
68877 var $496=$name2;var $497=$tr;var $translator_name=(($497+280)&4294967295);HEAP32[(($translator_name)>>2)]=$496;var $498=$tr;var $langopts759=(($498)&4294967295);var $numbers760=(($langopts759+184)&4294967295);var $499=HEAP32[(($numbers760)>>2)];var $and=($499)&8;var $tobool=((($and))|0)!=0;if($tobool){__label__=81;;}else{__label__=82;;}
68878 if(__label__==81){var $500=$tr;var $langopts762=(($500)&4294967295);var $thousands_sep763=(($langopts762+204)&4294967295);HEAP32[(($thousands_sep763)>>2)]=46;var $501=$tr;var $langopts764=(($501)&4294967295);var $decimal_sep765=(($langopts764+208)&4294967295);HEAP32[(($decimal_sep765)>>2)]=44;;}
68879 var $502=$tr;var $langopts767=(($502)&4294967295);var $numbers768=(($langopts767+184)&4294967295);var $503=HEAP32[(($numbers768)>>2)];var $and769=($503)&4;var $tobool770=((($and769))|0)!=0;if($tobool770){__label__=83;;}else{__label__=84;;}
68880 if(__label__==83){var $504=$tr;var $langopts772=(($504)&4294967295);var $thousands_sep773=(($langopts772+204)&4294967295);HEAP32[(($thousands_sep773)>>2)]=0;;}
68881 var $505=$tr;;return $505;return null;}
68882 function __ZL13NewTranslatorv(){;var __label__;var $retval;var $tr;var $ix;var $call=__Z5Alloci(8328);var $0=$call;$tr=$0;var $1=$tr;var $cmp=((($1))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
68883 if(__label__==1){$retval=0;;}
68884 else if(__label__==2){var $2=HEAP32[((((_charsets+4)&4294967295))>>2)];var $3=$tr;var $charset_a0=(($3+696)&4294967295);HEAP32[(($charset_a0)>>2)]=$2;HEAP8[(((_dictionary_name)&4294967295))]=0;var $4=$tr;var $dict_condition=(($4+692)&4294967295);HEAP32[(($dict_condition)>>2)]=0;var $5=$tr;var $data_dictrules=(($5+1048)&4294967295);HEAP32[(($data_dictrules)>>2)]=0;var $6=$tr;var $data_dictlist=(($6+1052)&4294967295);HEAP32[(($data_dictlist)>>2)]=0;var $7=$tr;var $transpose_min=(($7+288)&4294967295);HEAP32[(($transpose_min)>>2)]=97;var $8=$tr;var $transpose_max=(($8+284)&4294967295);HEAP32[(($transpose_max)>>2)]=122;var $9=$tr;var $frequent_pairs=(($9+8268)&4294967295);HEAP32[(($frequent_pairs)>>2)]=0;var $10=$tr;var $letter_bits_offset=(($10+964)&4294967295);HEAP32[(($letter_bits_offset)>>2)]=0;var $11=$tr;var $letter_bits=(($11+708)&4294967295);var $arraydecay=(($letter_bits)&4294967295);var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=$arraydecay;$stop$=$dest$+256;$value4$=0;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=0;}
68885 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
68886 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=0;};var $12=$tr;var $letter_groups=(($12+968)&4294967295);var $arraydecay1=(($letter_groups)&4294967295);var $13=$arraydecay1;var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=$13;$stop$=$dest$+32;$value4$=0;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=0;}
68887 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
68888 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=0;};var $14=$tr;__ZL13SetLetterBitsP10TranslatoriPKc($14,0,((__str6636)&4294967295));var $15=$tr;__ZL13SetLetterBitsP10TranslatoriPKc($15,1,((__str7637)&4294967295));var $16=$tr;__ZL13SetLetterBitsP10TranslatoriPKc($16,2,((__str8638)&4294967295));var $17=$tr;__ZL13SetLetterBitsP10TranslatoriPKc($17,3,((__str9639)&4294967295));var $18=$tr;__ZL13SetLetterBitsP10TranslatoriPKc($18,4,((__str10640)&4294967295));var $19=$tr;__ZL13SetLetterBitsP10TranslatoriPKc($19,5,((__str11641)&4294967295));var $20=$tr;__ZL13SetLetterBitsP10TranslatoriPKc($20,6,((__str12642)&4294967295));var $21=$tr;__ZL13SetLetterBitsP10TranslatoriPKc($21,7,((__str630)&4294967295));var $22=$tr;var $char_plus_apostrophe=(($22+700)&4294967295);HEAP32[(($char_plus_apostrophe)>>2)]=((__ZZL13NewTranslatorvE13empty_wstring)&4294967295);var $23=$tr;var $punct_within_word=(($23+704)&4294967295);HEAP32[(($punct_within_word)>>2)]=((__ZZL13NewTranslatorvE13punct_in_word)&4294967295);$ix=0;;while(1){var $24=$ix;var $arrayidx=((__ZZL13NewTranslatorvE12stress_amps2+$24)&4294967295);var $25=HEAP8[($arrayidx)];var $26=$ix;var $27=$tr;var $stress_amps=(($27+660)&4294967295);var $arrayidx3=(($stress_amps+$26)&4294967295);HEAP8[($arrayidx3)]=$25;var $28=$ix;var $arrayidx4=((__ZZL13NewTranslatorvE12stress_amps2+$28)&4294967295);var $29=HEAPU8[($arrayidx4)];var $conv=((($29))&255);var $sub=((($conv)-1)&4294967295);var $conv5=((($sub))&255);var $30=$ix;var $31=$tr;var $stress_amps_r=(($31+668)&4294967295);var $arrayidx6=(($stress_amps_r+$30)&4294967295);HEAP8[($arrayidx6)]=$conv5;var $32=$ix;var $arrayidx7=((__ZZL13NewTranslatorvE15stress_lengths2+$32*2)&4294967295);var $33=HEAP16[(($arrayidx7)>>1)];var $34=$ix;var $35=$tr;var $stress_lengths=(($35+676)&4294967295);var $arrayidx8=(($stress_lengths+$34*2)&4294967295);HEAP16[(($arrayidx8)>>1)]=$33;var $36=$ix;var $inc=((($36)+1)&4294967295);$ix=$inc;var $cmp2=((($inc))|0)<8;if($cmp2){__label__=3;continue;}else{__label__=4;break;}}
68889 var $37=$tr;var $langopts=(($37)&4294967295);var $38=$langopts;var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=$38;$stop$=$dest$+280;$value4$=0;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=0;}
68890 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
68891 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=0;};var $39=$tr;var $langopts9=(($39)&4294967295);var $max_lengthmod=(($langopts9+272)&4294967295);HEAP32[(($max_lengthmod)>>2)]=500;var $40=$tr;var $langopts10=(($40)&4294967295);var $stress_rule=(($langopts10+8)&4294967295);HEAP32[(($stress_rule)>>2)]=2;var $41=$tr;var $langopts11=(($41)&4294967295);var $unstressed_wd1=(($langopts11+16)&4294967295);HEAP32[(($unstressed_wd1)>>2)]=1;var $42=$tr;var $langopts12=(($42)&4294967295);var $unstressed_wd2=(($langopts12+20)&4294967295);HEAP32[(($unstressed_wd2)>>2)]=3;var $43=$tr;var $langopts13=(($43)&4294967295);var $param=(($langopts13+24)&4294967295);var $arrayidx14=(($param+28)&4294967295);HEAP32[(($arrayidx14)>>2)]=95;var $44=$tr;var $langopts15=(($44)&4294967295);var $param16=(($langopts15+24)&4294967295);var $arrayidx17=(($param16+72)&4294967295);HEAP32[(($arrayidx17)>>2)]=95;var $45=$tr;var $langopts18=(($45)&4294967295);var $param19=(($langopts18+24)&4294967295);var $arrayidx20=(($param19+36)&4294967295);HEAP32[(($arrayidx20)>>2)]=19;var $46=$tr;var $langopts21=(($46)&4294967295);var $param22=(($langopts21+24)&4294967295);var $arrayidx23=(($param22+20)&4294967295);HEAP32[(($arrayidx23)>>2)]=115;var $47=$tr;var $langopts24=(($47)&4294967295);var $param25=(($langopts24+24)&4294967295);var $arrayidx26=(($param25+64)&4294967295);HEAP32[(($arrayidx26)>>2)]=4;var $48=$tr;var $langopts27=(($48)&4294967295);var $param2=(($langopts27+100)&4294967295);var $arrayidx28=(($param2+64)&4294967295);HEAP32[(($arrayidx28)>>2)]=2;var $49=$tr;var $langopts29=(($49)&4294967295);var $max_initial_consonants=(($langopts29+248)&4294967295);HEAP8[($max_initial_consonants)]=3;var $50=$tr;var $langopts30=(($50)&4294967295);var $replace_chars=(($langopts30+264)&4294967295);HEAP32[(($replace_chars)>>2)]=0;var $51=$tr;var $langopts31=(($51)&4294967295);var $ascii_language=(($langopts31+268)&4294967295);HEAP32[(($ascii_language)>>2)]=((__str13643)&4294967295);var $52=$tr;__Z13SetLengthModsP10Translatori($52,201);var $53=$tr;var $langopts32=(($53)&4294967295);var $long_stop=(($langopts32+240)&4294967295);HEAP32[(($long_stop)>>2)]=100;var $54=$tr;var $langopts33=(($54)&4294967295);var $max_roman=(($langopts33+196)&4294967295);HEAP32[(($max_roman)>>2)]=49;var $55=$tr;var $langopts34=(($55)&4294967295);var $min_roman=(($langopts34+200)&4294967295);HEAP32[(($min_roman)>>2)]=2;var $56=$tr;var $langopts35=(($56)&4294967295);var $thousands_sep=(($langopts35+204)&4294967295);HEAP32[(($thousands_sep)>>2)]=44;var $57=$tr;var $langopts36=(($57)&4294967295);var $decimal_sep=(($langopts36+208)&4294967295);HEAP32[(($decimal_sep)>>2)]=46;var $58=$tr;var $langopts37=(($58)&4294967295);var $break_numbers=(($langopts37+192)&4294967295);HEAP32[(($break_numbers)>>2)]=1227133512;var $59=$tr;var $langopts38=(($59)&4294967295);var $max_digits=(($langopts38+212)&4294967295);HEAP32[(($max_digits)>>2)]=14;var $60=$tr;var $punct_to_tone=(($60+1000)&4294967295);var $arraydecay39=(($punct_to_tone)&4294967295);var $61=$arraydecay39;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=((_punctuation_to_tone)&4294967295);$dest$=$61;$stop$=$src$+48;if(($dest$%4)==($src$%4)&&48>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
68892 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
68893 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $62=$tr;var $langopts40=(($62)&4294967295);var $tunes=(($langopts40+232)&4294967295);var $arraydecay41=(($tunes)&4294967295);var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=((__ZZL13NewTranslatorvE13default_tunes)&4294967295);$dest$=$arraydecay41;$stop$=$src$+6;if(($dest$%4)==($src$%4)&&6>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
68894 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
68895 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $63=$tr;$retval=$63;;}
68896 var $64=$retval;;return $64;return null;}
68897 function __ZL14SetLetterVowelP10Translatori($tr,$c){;var __label__;var $tr_addr;var $c_addr;$tr_addr=$tr;$c_addr=$c;var $0=$c_addr;var $1=$tr_addr;var $letter_bits=(($1+708)&4294967295);var $arrayidx=(($letter_bits+$0)&4294967295);var $2=HEAPU8[($arrayidx)];var $conv=((($2))&255);var $and=($conv)&64;var $or=($and)|129;var $conv1=((($or))&255);var $3=$c_addr;var $4=$tr_addr;var $letter_bits2=(($4+708)&4294967295);var $arrayidx3=(($letter_bits2+$3)&4294967295);HEAP8[($arrayidx3)]=$conv1;;return;return;}
68898 function __ZL18SetCyrillicLettersP10Translator($tr){;var __label__;var $tr_addr;$tr_addr=$tr;var $0=HEAP32[((((_charsets+72)&4294967295))>>2)];var $1=$tr_addr;var $charset_a0=(($1+696)&4294967295);HEAP32[(($charset_a0)>>2)]=$0;var $2=$tr_addr;var $transpose_min=(($2+288)&4294967295);HEAP32[(($transpose_min)>>2)]=1072;var $3=$tr_addr;var $transpose_max=(($3+284)&4294967295);HEAP32[(($transpose_max)>>2)]=1105;var $4=$tr_addr;var $frequent_pairs=(($4+8268)&4294967295);HEAP32[(($frequent_pairs)>>2)]=((__ZL8pairs_ru)&4294967295);var $5=$tr_addr;var $letter_bits_offset=(($5+964)&4294967295);HEAP32[(($letter_bits_offset)>>2)]=1056;var $6=$tr_addr;var $letter_bits=(($6+708)&4294967295);var $arraydecay=(($letter_bits)&4294967295);var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=$arraydecay;$stop$=$dest$+256;$value4$=0;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=0;}
68899 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
68900 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=0;};var $7=$tr_addr;__ZL13SetLetterBitsP10TranslatoriPKc($7,0,((__ZZL18SetCyrillicLettersP10TranslatorE9ru_vowels)&4294967295));var $8=$tr_addr;__ZL13SetLetterBitsP10TranslatoriPKc($8,1,((__ZZL18SetCyrillicLettersP10TranslatorE7ru_soft)&4294967295));var $9=$tr_addr;__ZL13SetLetterBitsP10TranslatoriPKc($9,2,((__ZZL18SetCyrillicLettersP10TranslatorE13ru_consonants)&4294967295));var $10=$tr_addr;__ZL13SetLetterBitsP10TranslatoriPKc($10,3,((__ZZL18SetCyrillicLettersP10TranslatorE7ru_hard)&4294967295));var $11=$tr_addr;__ZL13SetLetterBitsP10TranslatoriPKc($11,4,((__ZZL18SetCyrillicLettersP10TranslatorE10ru_nothard)&4294967295));var $12=$tr_addr;__ZL13SetLetterBitsP10TranslatoriPKc($12,5,((__ZZL18SetCyrillicLettersP10TranslatorE9ru_voiced)&4294967295));var $13=$tr_addr;__ZL13SetLetterBitsP10TranslatoriPKc($13,6,((__ZZL18SetCyrillicLettersP10TranslatorE10ru_ivowels)&4294967295));var $14=$tr_addr;__ZL13SetLetterBitsP10TranslatoriPKc($14,7,((__ZZL18SetCyrillicLettersP10TranslatorE9ru_vowels)&4294967295));;return;return;}
68901 function __ZL15ResetLetterBitsP10Translatori($tr,$groups){;var __label__;var $tr_addr;var $groups_addr;var $ix;var $mask;$tr_addr=$tr;$groups_addr=$groups;var $0=$groups_addr;var $neg=($0)^-1;$mask=$neg;$ix=0;;while(1){var $1=$mask;var $2=$ix;var $3=$tr_addr;var $letter_bits=(($3+708)&4294967295);var $arrayidx=(($letter_bits+$2)&4294967295);var $4=HEAPU8[($arrayidx)];var $conv=((($4))&255);var $and=($conv)&($1);var $conv1=((($and))&255);HEAP8[($arrayidx)]=$conv1;var $5=$ix;var $inc=((($5)+1)&4294967295);$ix=$inc;var $cmp=((($inc))>>>0)<256;if($cmp){__label__=1;continue;}else{__label__=2;break;}};return;return;}
68902 function __ZL18Translator_RussianP10Translator($tr){;var __label__;var $tr_addr;$tr_addr=$tr;var $0=$tr_addr;__Z15SetupTranslatorP10TranslatorPKsPKh($0,((__ZZL18Translator_RussianP10TranslatorE17stress_lengths_ru)&4294967295),((__ZZL18Translator_RussianP10TranslatorE14stress_amps_ru)&4294967295));var $1=$tr_addr;__ZL18SetCyrillicLettersP10Translator($1);var $2=$tr_addr;__ZL13SetLetterBitsP10TranslatoriPKc($2,6,((__ZZL18Translator_RussianP10TranslatorE11ru_ivowels2)&4294967295));var $3=$tr_addr;var $langopts=(($3)&4294967295);var $param=(($langopts+24)&4294967295);var $arrayidx=(($param+20)&4294967295);HEAP32[(($arrayidx)>>2)]=1074;var $4=$tr_addr;var $langopts1=(($4)&4294967295);var $param2=(($langopts1+24)&4294967295);var $arrayidx3=(($param2+16)&4294967295);HEAP32[(($arrayidx3)>>2)]=1;var $5=$tr_addr;var $langopts4=(($5)&4294967295);var $param5=(($langopts4+24)&4294967295);var $arrayidx6=(($param5+40)&4294967295);HEAP32[(($arrayidx6)>>2)]=2;var $6=$tr_addr;var $langopts7=(($6)&4294967295);var $stress_rule=(($langopts7+8)&4294967295);HEAP32[(($stress_rule)>>2)]=5;var $7=$tr_addr;var $langopts8=(($7)&4294967295);var $stress_flags=(($langopts8+12)&4294967295);HEAP32[(($stress_flags)>>2)]=32;var $8=$tr_addr;var $langopts9=(($8)&4294967295);var $numbers=(($langopts9+184)&4294967295);HEAP32[(($numbers)>>2)]=1032;var $9=$tr_addr;var $langopts10=(($9)&4294967295);var $numbers2=(($langopts10+188)&4294967295);HEAP32[(($numbers2)>>2)]=194;var $10=$tr_addr;var $langopts11=(($10)&4294967295);var $phoneme_change=(($langopts11+244)&4294967295);HEAP32[(($phoneme_change)>>2)]=1;var $11=$tr_addr;var $langopts12=(($11)&4294967295);var $testing=(($langopts12+256)&4294967295);HEAP32[(($testing)>>2)]=2;;return;return;}
68903 function __Z14ReadTonePointsPcPi($string,$tone_pts){;var __label__;var $string_addr;var $tone_pts_addr;var $ix;$string_addr=$string;$tone_pts_addr=$tone_pts;$ix=0;;while(1){var $0=$ix;var $1=$tone_pts_addr;var $arrayidx=(($1+4*$0)&4294967295);HEAP32[(($arrayidx)>>2)]=-1;var $2=$ix;var $inc=((($2)+1)&4294967295);$ix=$inc;var $cmp=((($inc))|0)<12;if($cmp){__label__=1;continue;}else{__label__=2;break;}}
68904 var $3=$string_addr;var $4=$tone_pts_addr;var $arrayidx1=(($4)&4294967295);var $5=$tone_pts_addr;var $arrayidx2=(($5+4)&4294967295);var $6=$tone_pts_addr;var $arrayidx3=(($6+8)&4294967295);var $7=$tone_pts_addr;var $arrayidx4=(($7+12)&4294967295);var $8=$tone_pts_addr;var $arrayidx5=(($8+16)&4294967295);var $9=$tone_pts_addr;var $arrayidx6=(($9+20)&4294967295);var $10=$tone_pts_addr;var $arrayidx7=(($10+24)&4294967295);var $11=$tone_pts_addr;var $arrayidx8=(($11+28)&4294967295);var $12=$tone_pts_addr;var $arrayidx9=(($12+32)&4294967295);var $13=$tone_pts_addr;var $arrayidx10=(($13+36)&4294967295);var $call=_sscanf($3,((__str44696)&4294967295),allocate([$arrayidx1,0,0,0,$arrayidx2,0,0,0,$arrayidx3,0,0,0,$arrayidx4,0,0,0,$arrayidx5,0,0,0,$arrayidx6,0,0,0,$arrayidx7,0,0,0,$arrayidx8,0,0,0,$arrayidx9,0,0,0,$arrayidx10,0,0,0],["i32*",0,0,0,"i32*",0,0,0,"i32*",0,0,0,"i32*",0,0,0,"i32*",0,0,0,"i32*",0,0,0,"i32*",0,0,0,"i32*",0,0,0,"i32*",0,0,0,"i32*",0,0,0],ALLOC_STACK));;return;return;}
68905 function __Z10VoiceReseti($tone_only){;var __label__;var $tone_only_addr;var $pk;$tone_only_addr=$tone_only;var $0=HEAP32[((_voice)>>2)];var $pitch_base=(($0+44)&4294967295);HEAP32[(($pitch_base)>>2)]=290816;var $1=HEAP32[((_voice)>>2)];var $pitch_range=(($1+48)&4294967295);HEAP32[(($pitch_range)>>2)]=4104;var $2=HEAP32[((_voice)>>2)];var $formant_factor=(($2+96)&4294967295);HEAP32[(($formant_factor)>>2)]=256;var $3=HEAP32[((_voice)>>2)];var $speed_percent=(($3+64)&4294967295);HEAP32[(($speed_percent)>>2)]=100;var $4=HEAP32[((_voice)>>2)];var $echo_delay=(($4+76)&4294967295);HEAP32[(($echo_delay)>>2)]=0;var $5=HEAP32[((_voice)>>2)];var $echo_amp=(($5+80)&4294967295);HEAP32[(($echo_amp)>>2)]=0;var $6=HEAP32[((_voice)>>2)];var $flutter=(($6+68)&4294967295);HEAP32[(($flutter)>>2)]=64;var $7=HEAP32[((_voice)>>2)];var $n_harmonic_peaks=(($7+84)&4294967295);HEAP32[(($n_harmonic_peaks)>>2)]=5;var $8=HEAP32[((_voice)>>2)];var $peak_shape=(($8+88)&4294967295);HEAP32[(($peak_shape)>>2)]=0;var $9=HEAP32[((_voice)>>2)];var $voicing=(($9+92)&4294967295);HEAP32[(($voicing)>>2)]=64;var $10=HEAP32[((_voice)>>2)];var $consonant_amp=(($10+100)&4294967295);HEAP32[(($consonant_amp)>>2)]=100;var $11=HEAP32[((_voice)>>2)];var $consonant_ampv=(($11+104)&4294967295);HEAP32[(($consonant_ampv)>>2)]=100;var $12=HEAP32[((_voice)>>2)];var $samplerate=(($12+108)&4294967295);HEAP32[(($samplerate)>>2)]=22050;var $13=HEAP32[((_voice)>>2)];var $klattv=(($13+112)&4294967295);var $arraydecay=(($klattv)&4294967295);var $14=$arraydecay;var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=$14;$stop$=$dest$+32;$value4$=0;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=0;}
68906 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
68907 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=0;};HEAP32[((((_speed+32)&4294967295))>>2)]=450;HEAP32[((((_speed+32+4)&4294967295))>>2)]=800;HEAP32[((((_speed+32+8)&4294967295))>>2)]=175;var $15=HEAP32[((_voice)>>2)];var $roughness=(($15+72)&4294967295);HEAP32[(($roughness)>>2)]=2;__Z10InitBreathv();$pk=0;;while(1){var $16=$pk;var $17=HEAP32[((_voice)>>2)];var $freq=(($17+144)&4294967295);var $arrayidx=(($freq+$16*2)&4294967295);HEAP16[(($arrayidx)>>1)]=256;var $18=$pk;var $arrayidx1=((__ZZ10VoiceResetiE15default_heights+$18)&4294967295);var $19=HEAPU8[($arrayidx1)];var $conv=((($19))&255);var $mul=((($conv)*2)&4294967295);var $conv2=((($mul))&65535);var $20=$pk;var $21=HEAP32[((_voice)>>2)];var $height=(($21+162)&4294967295);var $arrayidx3=(($height+$20*2)&4294967295);HEAP16[(($arrayidx3)>>1)]=$conv2;var $22=$pk;var $arrayidx4=((__ZZ10VoiceResetiE14default_widths+$22)&4294967295);var $23=HEAPU8[($arrayidx4)];var $conv5=((($23))&255);var $mul6=((($conv5)*2)&4294967295);var $conv7=((($mul6))&65535);var $24=$pk;var $25=HEAP32[((_voice)>>2)];var $width=(($25+180)&4294967295);var $arrayidx8=(($width+$24*2)&4294967295);HEAP16[(($arrayidx8)>>1)]=$conv7;var $26=$pk;var $27=HEAP32[((_voice)>>2)];var $breath=(($27+272)&4294967295);var $arrayidx9=(($breath+$26*4)&4294967295);HEAP32[(($arrayidx9)>>2)]=0;var $28=$pk;var $arrayidx10=((__ZZ10VoiceResetiE13breath_widths+$28*4)&4294967295);var $29=HEAP32[(($arrayidx10)>>2)];var $30=$pk;var $31=HEAP32[((_voice)>>2)];var $breathw=(($31+308)&4294967295);var $arrayidx11=(($breathw+$30*4)&4294967295);HEAP32[(($arrayidx11)>>2)]=$29;var $32=$pk;var $33=HEAP32[((_voice)>>2)];var $freqadd=(($33+198)&4294967295);var $arrayidx12=(($freqadd+$32*2)&4294967295);HEAP16[(($arrayidx12)>>1)]=0;var $34=$pk;var $arrayidx13=((__ZL18formant_rate_22050+$34*4)&4294967295);var $35=HEAP32[(($arrayidx13)>>2)];var $mul14=((($35)*22050)&4294967295);var $36=HEAP32[((_samplerate)>>2)];var $div=((((($mul14))|0)/((($36))|0))|0);var $37=$pk;var $arrayidx15=((_formant_rate+$37*4)&4294967295);HEAP32[(($arrayidx15)>>2)]=$div;var $38=$pk;var $inc=((($38)+1)&4294967295);$pk=$inc;var $cmp=((($inc))|0)<9;if($cmp){__label__=1;continue;}else{__label__=2;break;}}
68908 var $39=HEAP32[((_voice)>>2)];var $height16=(($39+162)&4294967295);var $arrayidx17=(($height16+4)&4294967295);HEAP16[(($arrayidx17)>>1)]=240;var $40=HEAP32[((_voice)>>2)];__ZL13SetToneAdjustP7voice_tPi($40,((_tone_points)&4294967295));var $41=HEAP32[((_voice)>>2)];var $speedf1=(($41+52)&4294967295);HEAP32[(($speedf1)>>2)]=256;var $42=HEAP32[((_voice)>>2)];var $speedf2=(($42+56)&4294967295);HEAP32[(($speedf2)>>2)]=238;var $43=HEAP32[((_voice)>>2)];var $speedf3=(($43+60)&4294967295);HEAP32[(($speedf3)>>2)]=232;var $44=$tone_only_addr;var $cmp18=((($44))|0)==0;if($cmp18){__label__=3;;}else{__label__=4;;}
68909 if(__label__==3){HEAP32[((_n_replace_phonemes)>>2)]=0;HEAP32[((_option_quiet)>>2)]=0;var $call=__Z15LoadMbrolaTablePKcS0_i(0,0,0);;};return;return;}
68910 function __ZL13SetToneAdjustP7voice_tPi($voice,$tone_pts){;var __label__;var $voice_addr;var $tone_pts_addr;var $ix;var $pt;var $y;var $freq1;var $freq2;var $height1;var $height2;var $rate;$voice_addr=$voice;$tone_pts_addr=$tone_pts;$freq1=0;var $0=$tone_pts_addr;var $arrayidx=(($0+4)&4294967295);var $1=HEAP32[(($arrayidx)>>2)];$height1=$1;$pt=0;;$for_body$2:while(1){var $2=$pt;var $3=$tone_pts_addr;var $arrayidx1=(($3+4*$2)&4294967295);var $4=HEAP32[(($arrayidx1)>>2)];var $cmp2=((($4))|0)==-1;if($cmp2){__label__=2;;}else{__label__=4;;}
68911 $if_then$$if_end8$4:do{if(__label__==2){var $5=$pt;var $6=$tone_pts_addr;var $arrayidx3=(($6+4*$5)&4294967295);HEAP32[(($arrayidx3)>>2)]=8000;var $7=$pt;var $cmp4=((($7))|0)>0;if(!($cmp4)){__label__=4;break $if_then$$if_end8$4;}
68912 var $8=$pt;var $sub=((($8)-1)&4294967295);var $9=$tone_pts_addr;var $arrayidx6=(($9+4*$sub)&4294967295);var $10=HEAP32[(($arrayidx6)>>2)];var $11=$pt;var $add=((($11)+1)&4294967295);var $12=$tone_pts_addr;var $arrayidx7=(($12+4*$add)&4294967295);HEAP32[(($arrayidx7)>>2)]=$10;;}}while(0);var $13=$pt;var $14=$tone_pts_addr;var $arrayidx9=(($14+4*$13)&4294967295);var $15=HEAP32[(($arrayidx9)>>2)];var $div=((((($15))|0)/8)|0);$freq2=$div;var $16=$pt;var $add10=((($16)+1)&4294967295);var $17=$tone_pts_addr;var $arrayidx11=(($17+4*$add10)&4294967295);var $18=HEAP32[(($arrayidx11)>>2)];$height2=$18;var $19=$freq2;var $20=$freq1;var $sub12=((($19)-($20))&4294967295);var $cmp13=((($sub12))|0)>0;if($cmp13){__label__=5;;}else{__label__=9;;}
68913 $if_then14$$if_end31$8:do{if(__label__==5){var $21=$height2;var $22=$height1;var $sub15=((($21)-($22))&4294967295);var $conv=((($sub15))|0);var $23=$freq2;var $24=$freq1;var $sub16=((($23)-($24))&4294967295);var $conv17=((($sub16))|0);var $div18=($conv)/($conv17);$rate=$div18;var $25=$freq1;$ix=$25;var $26=$ix;var $27=$freq2;var $cmp201=((($26))|0)<((($27))|0);if(!($cmp201)){__label__=9;break $if_then14$$if_end31$8;}
68914 while(1){var $28=$height1;var $29=$rate;var $30=$ix;var $31=$freq1;var $sub22=((($30)-($31))&4294967295);var $conv23=((($sub22))|0);var $mul=($29)*($conv23);var $conv24=((($mul))|0);var $add25=((($conv24)+($28))&4294967295);$y=$add25;var $cmp26=((($add25))|0)>255;if($cmp26){__label__=7;;}else{__label__=8;;}
68915 if(__label__==7){$y=255;;}
68916 var $32=$y;var $conv29=((($32))&255);var $33=$ix;var $34=$voice_addr;var $tone_adjust=(($34+344)&4294967295);var $arrayidx30=(($tone_adjust+$33)&4294967295);HEAP8[($arrayidx30)]=$conv29;var $35=$ix;var $inc=((($35)+1)&4294967295);$ix=$inc;var $36=$ix;var $37=$freq2;var $cmp20=((($36))|0)<((($37))|0);if($cmp20){__label__=6;continue;}else{__label__=9;break $if_then14$$if_end31$8;}}}}while(0);var $38=$freq2;$freq1=$38;var $39=$height2;$height1=$39;var $40=$pt;var $add33=((($40)+2)&4294967295);$pt=$add33;var $cmp=((($add33))|0)<12;if($cmp){__label__=1;continue $for_body$2;}else{__label__=10;break $for_body$2;}};return;return;}
68917 function __Z9LoadVoicePKci($vname,$control){var __stackBase__=STACKTOP;STACKTOP+=1260;_memset(__stackBase__,0,1260);var __label__;var __lastLabel__=null;var $retval;var $vname_addr;var $control_addr;var $f_voice;var $p;var $key;var $ix;var $n;var $value=__stackBase__;var $value2=__stackBase__+4;var $error;var $langix;var $tone_only;var $language_set;var $phonemes_set;var $stress_amps_set;var $stress_lengths_set;var $stress_add_set;var $conditional_rules;var $langopts;var $new_translator;var $voicename=__stackBase__+8;var $language_name=__stackBase__+48;var $translator_name=__stackBase__+88;var $new_dictionary=__stackBase__+128;var $phonemes_name=__stackBase__+168;var $option_name=__stackBase__+208;var $language_type;var $buf=__stackBase__+248;var $path_voices=__stackBase__+448;var $langname=__stackBase__+612;var $stress_amps=__stackBase__+616;var $stress_lengths=__stackBase__+648;var $stress_add=__stackBase__+680;var $names=__stackBase__+712;var $pitch1=__stackBase__+1032;var $pitch2=__stackBase__+1036;var $len;var $priority=__stackBase__+1040;var $age=__stackBase__+1044;var $vgender=__stackBase__+1048;var $factor;var $tone_data=__stackBase__+1128;var $srate=__stackBase__+1176;var $name=__stackBase__+1180;var $phtrans=__stackBase__+1220;$vname_addr=$vname;$control_addr=$control;$f_voice=0;$error=0;$langix=0;var $0=$control_addr;var $and=($0)&2;$tone_only=$and;$language_set=0;$phonemes_set=0;$stress_amps_set=0;$stress_lengths_set=0;$stress_add_set=0;$conditional_rules=0;$langopts=0;$new_translator=0;var $arraydecay=(($voicename)&4294967295);var $1=$vname_addr;var $call=_strcpy($arraydecay,$1);var $arrayidx=(($voicename)&4294967295);var $2=HEAP8[($arrayidx)];var $conv=(tempInt=(($2)),(tempInt>=128?tempInt-256:tempInt));var $cmp=((($conv))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
68918 if(__label__==1){var $arraydecay1=(($voicename)&4294967295);var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=((__str45697)&4294967295);$dest$=$arraydecay1;$stop$=$src$+8;if(($dest$%4)==($src$%4)&&8>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
68919 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
68920 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};;}
68921 var $3=$control_addr;var $and3=($3)&16;var $tobool=((($and3))|0)!=0;if($tobool){__label__=3;;}else{__label__=5;;}
68922 $if_then4$$if_else$5:do{if(__label__==3){var $arraydecay5=(($buf)&4294967295);var $4=$vname_addr;var $call6=_strcpy($arraydecay5,$4);var $arraydecay7=(($buf)&4294967295);var $call8=__Z13GetFileLengthPKc($arraydecay7);var $cmp9=((($call8))|0)<=0;if(!($cmp9)){__label__=9;break $if_then4$$if_else$5;}
68923 $retval=0;__label__=137;break $if_then4$$if_else$5;}
68924 else if(__label__==5){var $arraydecay12=(($path_voices)&4294967295);var $call13=_sprintf($arraydecay12,((__str46698)&4294967295),allocate([((_path_home)&4294967295),0,0,0,47,0,0,0,47,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i32",0,0,0],ALLOC_STACK));var $arraydecay14=(($buf)&4294967295);var $arraydecay15=(($path_voices)&4294967295);var $arraydecay16=(($voicename)&4294967295);var $call17=_sprintf($arraydecay14,((__str47699)&4294967295),allocate([$arraydecay15,0,0,0,$arraydecay16,0,0,0],["i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));var $arraydecay18=(($buf)&4294967295);var $call19=__Z13GetFileLengthPKc($arraydecay18);var $cmp20=((($call19))|0)<=0;if(!($cmp20)){__label__=9;break $if_then4$$if_else$5;}
68925 var $arrayidx22=(($voicename)&4294967295);var $5=HEAP8[($arrayidx22)];var $arrayidx23=(($langname)&4294967295);HEAP8[($arrayidx23)]=$5;var $arrayidx24=(($voicename+1)&4294967295);var $6=HEAP8[($arrayidx24)];var $arrayidx25=(($langname+1)&4294967295);HEAP8[($arrayidx25)]=$6;var $arrayidx26=(($langname+2)&4294967295);HEAP8[($arrayidx26)]=0;var $arraydecay27=(($buf)&4294967295);var $arraydecay28=(($path_voices)&4294967295);var $arraydecay29=(($langname)&4294967295);var $arraydecay30=(($voicename)&4294967295);var $call31=_sprintf($arraydecay27,((__str48700)&4294967295),allocate([$arraydecay28,0,0,0,$arraydecay29,0,0,0,47,0,0,0,$arraydecay30,0,0,0],["i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0],ALLOC_STACK));var $arraydecay32=(($buf)&4294967295);var $call33=__Z13GetFileLengthPKc($arraydecay32);var $cmp34=((($call33))|0)<=0;if(!($cmp34)){__label__=9;break $if_then4$$if_else$5;}
68926 var $arraydecay36=(($buf)&4294967295);var $arraydecay37=(($path_voices)&4294967295);var $arraydecay38=(($voicename)&4294967295);var $call39=_sprintf($arraydecay36,((__str49701)&4294967295),allocate([$arraydecay37,0,0,0,47,0,0,0,$arraydecay38,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0],ALLOC_STACK));var $arraydecay40=(($buf)&4294967295);var $call41=__Z13GetFileLengthPKc($arraydecay40);var $cmp42=((($call41))|0)<=0;if(!($cmp42)){__label__=9;break $if_then4$$if_else$5;}
68927 var $arraydecay44=(($buf)&4294967295);var $arraydecay45=(($path_voices)&4294967295);var $arraydecay46=(($voicename)&4294967295);var $call47=_sprintf($arraydecay44,((__str50702)&4294967295),allocate([$arraydecay45,0,0,0,47,0,0,0,$arraydecay46,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0],ALLOC_STACK));__label__=9;break $if_then4$$if_else$5;}}while(0);$return$$if_end51$12:do{if(__label__==9){var $arraydecay52=(($buf)&4294967295);var $call53=_fopen($arraydecay52,((__str51703)&4294967295));$f_voice=$call53;$language_type=((__str52704)&4294967295);var $cmp54=((($call53))|0)==0;if($cmp54){__label__=10;;}else{__label__=14;;}
68928 $if_then55$$if_end66$14:do{if(__label__==10){var $7=$control_addr;var $and56=($7)&3;var $tobool57=((($and56))|0)!=0;if($tobool57){__label__=11;;}else{__label__=12;;}
68929 if(__label__==11){$retval=0;__label__=137;break $return$$if_end51$12;}
68930 else if(__label__==12){var $arraydecay60=(($voicename)&4294967295);var $call61=__Z22SelectPhonemeTableNamePKc($arraydecay60);var $cmp62=((($call61))|0)>=0;if(!($cmp62)){__label__=14;break $if_then55$$if_end66$14;}
68931 var $arraydecay64=(($voicename)&4294967295);$language_type=$arraydecay64;;}}}while(0);var $8=$tone_only;var $tobool67=((($8))|0)==0;var $9=HEAP32[((_translator)>>2)];var $cmp68=((($9))|0)!=0;var $or_cond=($tobool67)&($cmp68);if($or_cond){__label__=15;;}else{__label__=16;;}
68932 if(__label__==15){var $10=HEAP32[((_translator)>>2)];__Z16DeleteTranslatorP10Translator($10);HEAP32[((_translator)>>2)]=0;;}
68933 var $arraydecay71=(($translator_name)&4294967295);var $11=$language_type;var $call72=_strcpy($arraydecay71,$11);var $arraydecay73=(($new_dictionary)&4294967295);var $12=$language_type;var $call74=_strcpy($arraydecay73,$12);var $arraydecay75=(($phonemes_name)&4294967295);var $13=$language_type;var $call76=_strcpy($arraydecay75,$13);var $14=$tone_only;var $tobool77=((($14))|0)!=0;if($tobool77){__label__=18;;}else{__label__=17;;}
68934 if(__label__==18){var $call80=_strchr(((__ZZ9LoadVoicePKciE16voice_identifier)&4294967295),43);$p=$call80;var $cmp81=((($call80))|0)!=0;if($cmp81){__label__=19;;}else{__label__=20;;}
68935 if(__label__==19){var $16=$p;HEAP8[($16)]=0;;}
68936 var $arraydecay84=(($buf)&4294967295);var $17=$vname_addr;var $arrayidx85=(($17+3)&4294967295);var $call86=_sprintf($arraydecay84,((__str53705)&4294967295),allocate([$arrayidx85,0,0,0],["i8*",0,0,0],ALLOC_STACK));var $arraydecay87=(($buf)&4294967295);var $call88=_strcat(((__ZZ9LoadVoicePKciE16voice_identifier)&4294967295),$arraydecay87);var $18=HEAP32[((_translator)>>2)];var $langopts89=(($18)&4294967295);$langopts=$langopts89;;}
68937 else if(__label__==17){HEAP32[((_voice)>>2)]=__ZL9voicedata;var $15=$vname_addr;__Z8strncpy0PcPKci(((__ZZ9LoadVoicePKciE16voice_identifier)&4294967295),$15,40);HEAP8[(((__ZZ9LoadVoicePKciE10voice_name)&4294967295))]=0;HEAP8[(((__ZZ9LoadVoicePKciE15voice_languages)&4294967295))]=0;HEAP32[((((_voice_selected+8)&4294967295))>>2)]=((__ZZ9LoadVoicePKciE16voice_identifier)&4294967295);HEAP32[((((_voice_selected)&4294967295))>>2)]=((__ZZ9LoadVoicePKciE10voice_name)&4294967295);HEAP32[((((_voice_selected+4)&4294967295))>>2)]=((__ZZ9LoadVoicePKciE15voice_languages)&4294967295);;}
68938 var $19=$tone_only;__Z10VoiceReseti($19);var $20=$tone_only;var $tobool91=((($20))|0)!=0;if($tobool91){__label__=23;;}else{__label__=22;;}
68939 if(__label__==22){var $arraydecay93=(($phonemes_name)&4294967295);var $call94=__Z22SelectPhonemeTableNamePKc($arraydecay93);;}
68940 var $arraydecay97=(($buf)&4294967295);var $arraydecay100=(($buf)&4294967295);var $arrayidx109=(($buf)&4294967295);var $arraydecay114=(($buf)&4294967295);var $arraydecay416=(($buf)&4294967295);var $arrayidx119=(($language_name)&4294967295);var $arraydecay120=(($language_name)&4294967295);var $arraydecay122=(($language_name)&4294967295);var $arraydecay127=(($language_name)&4294967295);var $arraydecay136=(($language_name)&4294967295);var $arraydecay142=(($language_name)&4294967295);var $arraydecay144=(($translator_name)&4294967295);var $arraydecay146=(($new_dictionary)&4294967295);var $arraydecay148=(($phonemes_name)&4294967295);var $arraydecay150=(($phonemes_name)&4294967295);var $arraydecay155=(($translator_name)&4294967295);var $arraydecay170=(($vgender)&4294967295);var $arraydecay172=(($vgender)&4294967295);var $arraydecay180=(($translator_name)&4294967295);var $arraydecay185=(($translator_name)&4294967295);var $arraydecay189=(($new_dictionary)&4294967295);var $arraydecay192=(($phonemes_name)&4294967295);var $arraydecay206=(($stress_lengths)&4294967295);var $arraydecay209=(($stress_amps)&4294967295);var $arraydecay212=(($stress_add)&4294967295);var $arrayidx222=(($names)&4294967295);var $arraydecay223=(($arrayidx222)&4294967295);var $arrayidx224=(($names+40)&4294967295);var $arraydecay225=(($arrayidx224)&4294967295);var $arrayidx226=(($names+80)&4294967295);var $arraydecay227=(($arrayidx226)&4294967295);var $arrayidx228=(($names+120)&4294967295);var $arraydecay229=(($arrayidx228)&4294967295);var $arrayidx230=(($names+160)&4294967295);var $arraydecay231=(($arrayidx230)&4294967295);var $arrayidx232=(($names+200)&4294967295);var $arraydecay233=(($arrayidx232)&4294967295);var $arraydecay290=(($phonemes_name)&4294967295);var $arraydecay308=(($option_name)&4294967295);var $arraydecay312=(($option_name)&4294967295);var $arraydecay320=(($buf)&4294967295);var $arraydecay347=(($tone_data)&4294967295);var $arraydecay348=(($tone_data)&4294967295);var $arrayidx385=(($phtrans)&4294967295);var $arraydecay386=(($name)&4294967295);var $arraydecay387=(($phtrans)&4294967295);var $arraydecay389=(($name)&4294967295);var $arraydecay390=(($phtrans)&4294967295);;$while_cond$34:while(1){var $21=$f_voice;var $cmp96=((($21))|0)!=0;if(!($cmp96)){__label__=114;break $while_cond$34;}
68941 var $22=$f_voice;var $call98=__ZL11fgets_stripPciP7__sFILE($arraydecay97,200,$22);var $cmp99=((($call98))|0)!=0;if(!($cmp99)){__label__=112;break $while_cond$34;}
68942 $p=$arraydecay100;;$for_cond$38:while(1){var $23=$p;var $24=HEAP8[($23)];var $conv101=(tempInt=(($24)),(tempInt>=128?tempInt-256:tempInt));var $cmp102=((($conv101))|0)!=0;if(!($cmp102)){__label__=30;break $for_cond$38;}
68943 var $25=$p;var $26=HEAP8[($25)];var $conv104=(tempInt=(($26)),(tempInt>=128?tempInt-256:tempInt));var $call105=_isspace($conv104);var $tobool106=((($call105))|0)!=0;var $lnot=($tobool106)^1;if(!($lnot)){__label__=30;break $for_cond$38;}
68944 var $27=$p;var $incdec_ptr=(($27+1)&4294967295);$p=$incdec_ptr;__label__=27;continue $for_cond$38;}
68945 var $28=$p;var $incdec_ptr108=(($28+1)&4294967295);$p=$incdec_ptr108;HEAP8[($28)]=0;var $29=HEAP8[($arrayidx109)];var $conv110=(tempInt=(($29)),(tempInt>=128?tempInt-256:tempInt));var $cmp111=((($conv110))|0)==0;if($cmp111){__label__=24;continue $while_cond$34;}
68946 var $call115=__Z10LookupMnemP8MNEM_TABPKc(((__ZL11keyword_tab)&4294967295),$arraydecay114);$key=$call115;var $30=$key;if($30==2){__label__=33;;}
68947 else if($30==1){__label__=41;;}
68948 else if($30==3){__label__=45;;}
68949 else if($30==4){__label__=46;;}
68950 else if($30==6){__label__=50;;}
68951 else if($30==5){__label__=51;;}
68952 else if($30==7){__label__=52;;}
68953 else if($30==8){__label__=53;;}
68954 else if($30==20){__label__=54;;}
68955 else if($30==21){__label__=55;;}
68956 else if($30==22){__label__=56;;}
68957 else if($30==18){__label__=57;;}
68958 else if($30==19){__label__=59;;}
68959 else if($30==23){__label__=32;;}
68960 else if($30==32){__label__=73;;}
68961 else if($30==17){__label__=76;;}
68962 else if($30==24){__label__=77;;}
68963 else if($30==25){__label__=78;;}
68964 else if($30==26){__label__=80;;}
68965 else if($30==27){__label__=81;;}
68966 else if($30==9){__label__=85;;}
68967 else if($30==10){__label__=86;;}
68968 else if($30==11){__label__=88;;}
68969 else if($30==12){__label__=90;;}
68970 else if($30==13){__label__=94;;}
68971 else if($30==14){__label__=95;;}
68972 else if($30==15){__label__=97;;}
68973 else if($30==16){__label__=101;;}
68974 else if($30==33){__label__=102;;}
68975 else if($30==31){__label__=103;;}
68976 else if($30==28){__label__=104;;}
68977 else if($30==29){__label__=107;;}
68978 else if($30==30){__label__=108;;}
68979 else{__label__=109;;}
68980 if(__label__==109){var $195=$key;var $and407=($195)&65280;var $cmp408=((($and407))|0)==256;if($cmp408){__label__=110;;}else{__label__=111;;}
68981 if(__label__==110){var $196=$p;var $197=$key;var $and410=($197)&255;var $198=$langopts;var $param411=(($198+24)&4294967295);var $arrayidx412=(($param411+$and410*4)&4294967295);var $call413=_sscanf($196,((__str63715)&4294967295),allocate([$arrayidx412,0,0,0],["i32*",0,0,0],ALLOC_STACK));__label__=24;continue $while_cond$34;}
68982 else if(__label__==111){var $199=HEAP32[((__impure_ptr)>>2)];var $_stderr415=(($199+12)&4294967295);var $200=HEAP32[(($_stderr415)>>2)];var $call417=_fprintf($200,((__str68720)&4294967295),allocate([$arraydecay416,0,0,0],["i8*",0,0,0],ALLOC_STACK));__label__=24;continue $while_cond$34;}}
68983 else if(__label__==33){var $33=$tone_only;var $tobool116=((($33))|0)!=0;if($tobool116){__label__=24;continue $while_cond$34;}
68984 HEAP32[(($priority)>>2)]=5;HEAP8[($arrayidx119)]=0;var $34=$p;var $call121=_sscanf($34,((__str54706)&4294967295),allocate([$arraydecay120,0,0,0,$priority,0,0,0],["i8*",0,0,0,"i32*",0,0,0],ALLOC_STACK));var $call123=_strcmp($arraydecay122,((__str55707)&4294967295));var $cmp124=((($call123))|0)==0;if($cmp124){__label__=24;continue $while_cond$34;}
68985 var $call128=_strlen($arraydecay127);var $add=((($call128)+2)&4294967295);$len=$add;var $35=$len;var $36=$langix;var $_neg=(((-($36)))&4294967295);var $sub129=((($_neg)+99)&4294967295);var $cmp130=((($35))>>>0)<((($sub129))>>>0);if($cmp130){__label__=36;;}else{__label__=37;;}
68986 if(__label__==36){var $37=HEAP32[(($priority)>>2)];var $conv132=((($37))&255);var $38=$langix;var $arrayidx133=((__ZZ9LoadVoicePKciE15voice_languages+$38)&4294967295);HEAP8[($arrayidx133)]=$conv132;var $39=$langix;var $add134=((($39)+1)&4294967295);var $arrayidx135=((__ZZ9LoadVoicePKciE15voice_languages+$add134)&4294967295);var $call137=_strcpy($arrayidx135,$arraydecay136);var $40=$len;var $41=$langix;var $add138=((($41)+($40))&4294967295);$langix=$add138;;}
68987 var $42=$language_set;var $cmp140=((($42))|0)==0;if(!($cmp140)){__label__=24;continue $while_cond$34;}
68988 var $call143=_strtok($arraydecay142,((__str56708)&4294967295));$language_type=$call143;$language_set=1;var $43=$language_type;var $call145=_strcpy($arraydecay144,$43);var $44=$language_type;var $call147=_strcpy($arraydecay146,$44);var $45=$language_type;var $call149=_strcpy($arraydecay148,$45);var $call151=__Z22SelectPhonemeTableNamePKc($arraydecay150);var $46=$new_translator;var $cmp152=((($46))|0)!=0;if($cmp152){__label__=39;;}else{__label__=40;;}
68989 if(__label__==39){var $47=$new_translator;__Z16DeleteTranslatorP10Translator($47);;}
68990 var $call156=__Z16SelectTranslatorPKc($arraydecay155);$new_translator=$call156;var $48=$new_translator;var $langopts157=(($48)&4294967295);$langopts=$langopts157;__label__=24;continue $while_cond$34;}
68991 else if(__label__==41){var $49=$tone_only;var $cmp160=((($49))|0)==0;if(!($cmp160)){__label__=24;continue $while_cond$34;}
68992 var $50=$p;var $51=HEAP8[($50)];var $conv1636=(tempInt=(($51)),(tempInt>=128?tempInt-256:tempInt));var $call1647=_isspace($conv1636);var $tobool1658=((($call1647))|0)!=0;var $52=$p;if($tobool1658){__lastLabel__=42;__label__=43;;}else{__lastLabel__=42;__label__=44;;}
68993 $while_body166$$while_end$61:do{if(__label__==43){while(1){var $53=__lastLabel__==43?$56:($52);var $incdec_ptr167=(($53+1)&4294967295);$p=$incdec_ptr167;var $54=$p;var $55=HEAP8[($54)];var $conv163=(tempInt=(($55)),(tempInt>=128?tempInt-256:tempInt));var $call164=_isspace($conv163);var $tobool165=((($call164))|0)!=0;var $56=$p;if($tobool165){__lastLabel__=43;__label__=43;continue;}else{__lastLabel__=43;__label__=44;break $while_body166$$while_end$61;}}}}while(0);var $_lcssa=__lastLabel__==42?$52:($56);__Z8strncpy0PcPKci(((__ZZ9LoadVoicePKciE10voice_name)&4294967295),$_lcssa,40);__label__=24;continue $while_cond$34;}
68994 else if(__label__==45){HEAP32[(($age)>>2)]=0;var $57=$p;var $call171=_sscanf($57,((__str54706)&4294967295),allocate([$arraydecay170,0,0,0,$age,0,0,0],["i8*",0,0,0,"i32*",0,0,0],ALLOC_STACK));var $call173=__Z10LookupMnemP8MNEM_TABPKc(((_genders)&4294967295),$arraydecay172);var $conv174=((($call173))&255);HEAP8[(((_voice_selected+12)&4294967295))]=$conv174;var $58=HEAP32[(($age)>>2)];var $conv175=((($58))&255);HEAP8[(((_voice_selected+13)&4294967295))]=$conv175;__label__=24;continue $while_cond$34;}
68995 else if(__label__==46){var $59=$tone_only;var $tobool177=((($59))|0)!=0;if($tobool177){__label__=24;continue $while_cond$34;}
68996 var $60=$p;var $call181=_sscanf($60,((__str57709)&4294967295),allocate([$arraydecay180,0,0,0],["i8*",0,0,0],ALLOC_STACK));var $61=$new_translator;var $cmp182=((($61))|0)!=0;if($cmp182){__label__=48;;}else{__label__=49;;}
68997 if(__label__==48){var $62=$new_translator;__Z16DeleteTranslatorP10Translator($62);;}
68998 var $call186=__Z16SelectTranslatorPKc($arraydecay185);$new_translator=$call186;var $63=$new_translator;var $langopts187=(($63)&4294967295);$langopts=$langopts187;__label__=24;continue $while_cond$34;}
68999 else if(__label__==50){var $64=$p;var $call190=_sscanf($64,((__str57709)&4294967295),allocate([$arraydecay189,0,0,0],["i8*",0,0,0],ALLOC_STACK));__label__=24;continue $while_cond$34;}
69000 else if(__label__==51){var $65=$p;var $call193=_sscanf($65,((__str57709)&4294967295),allocate([$arraydecay192,0,0,0],["i8*",0,0,0],ALLOC_STACK));__label__=24;continue $while_cond$34;}
69001 else if(__label__==52){var $66=$p;__ZL12VoiceFormantPc($66);__label__=24;continue $while_cond$34;}
69002 else if(__label__==53){var $67=$p;var $call196=_sscanf($67,((__str58710)&4294967295),allocate([$pitch1,0,0,0,$pitch2,0,0,0],["i32*",0,0,0,"i32*",0,0,0],ALLOC_STACK));$n=$call196;var $68=HEAP32[(($pitch1)>>2)];var $sub197=((($68)-9)&4294967295);var $shl=($sub197)<<12;var $69=HEAP32[((_voice)>>2)];var $pitch_base=(($69+44)&4294967295);HEAP32[(($pitch_base)>>2)]=$shl;var $70=HEAP32[(($pitch2)>>2)];var $71=HEAP32[(($pitch1)>>2)];var $sub198=((($70)-($71))&4294967295);var $mul=((($sub198)*108)&4294967295);var $72=HEAP32[((_voice)>>2)];var $pitch_range=(($72+48)&4294967295);HEAP32[(($pitch_range)>>2)]=$mul;var $73=HEAP32[(($pitch1)>>2)];var $sub199=((($73)-82)&4294967295);var $conv200=((($sub199))|0);var $div=($conv200)/82;$factor=$div;var $74=$factor;var $div201=($74)/4;var $add202=1+($div201);var $mul203=($add202)*256;var $conv204=((($mul203))|0);var $75=HEAP32[((_voice)>>2)];var $formant_factor=(($75+96)&4294967295);HEAP32[(($formant_factor)>>2)]=$conv204;__label__=24;continue $while_cond$34;}
69003 else if(__label__==54){var $76=$p;var $call207=__ZL12Read8NumbersPcPi($76,$arraydecay206);$stress_lengths_set=$call207;__label__=24;continue $while_cond$34;}
69004 else if(__label__==55){var $77=$p;var $call210=__ZL12Read8NumbersPcPi($77,$arraydecay209);$stress_amps_set=$call210;__label__=24;continue $while_cond$34;}
69005 else if(__label__==56){var $78=$p;var $call213=__ZL12Read8NumbersPcPi($78,$arraydecay212);$stress_add_set=$call213;__label__=24;continue $while_cond$34;}
69006 else if(__label__==57){var $79=$p;var $call215=_sscanf($79,((__str58710)&4294967295),allocate([_option_tone_flags,0,0,0,_option_tone2,0,0,0],["i32*",0,0,0,"i32*",0,0,0],ALLOC_STACK));var $80=HEAP32[((_option_tone_flags)>>2)];var $and216=($80)&255;var $cmp217=((($and216))|0)!=0;if(!($cmp217)){__label__=24;continue $while_cond$34;}
69007 var $81=HEAP32[((_option_tone_flags)>>2)];var $and219=($81)&255;var $82=$langopts;var $intonation_group=(($82+228)&4294967295);HEAP32[(($intonation_group)>>2)]=$and219;__label__=24;continue $while_cond$34;}
69008 else if(__label__==59){var $83=$p;var $call234=_sscanf($83,((__str59711)&4294967295),allocate([$arraydecay223,0,0,0,$arraydecay225,0,0,0,$arraydecay227,0,0,0,$arraydecay229,0,0,0,$arraydecay231,0,0,0,$arraydecay233,0,0,0],["i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));$n=$call234;var $84=$langopts;var $intonation_group235=(($84+228)&4294967295);HEAP32[(($intonation_group235)>>2)]=0;$ix=0;var $85=$ix;var $86=$n;var $cmp2379=((($85))|0)<((($86))|0);if(!($cmp2379)){__label__=24;continue $while_cond$34;}
69009 while(1){var $87=$ix;var $arrayidx239=(($names+$87*40)&4294967295);var $arraydecay240=(($arrayidx239)&4294967295);var $call241=_strcmp($arraydecay240,((__str60712)&4294967295));var $cmp242=((($call241))|0)==0;if($cmp242){__label__=64;;}else{__label__=61;;}
69010 if(__label__==61){var $88=$ix;var $arrayidx245=(($names+$88*40)&4294967295);var $arraydecay246=(($arrayidx245)&4294967295);var $call247=__ZL10LookupTunePKc($arraydecay246);HEAP32[(($value)>>2)]=$call247;var $cmp248=((($call247))|0)<0;if($cmp248){__label__=62;;}else{__label__=63;;}
69011 if(__label__==62){var $89=HEAP32[((__impure_ptr)>>2)];var $_stderr=(($89+12)&4294967295);var $90=HEAP32[(($_stderr)>>2)];var $91=$ix;var $arrayidx250=(($names+$91*40)&4294967295);var $arraydecay251=(($arrayidx250)&4294967295);var $call252=_fprintf($90,((__str61713)&4294967295),allocate([$arraydecay251,0,0,0],["i8*",0,0,0],ALLOC_STACK));;}
69012 else if(__label__==63){var $92=HEAP32[(($value)>>2)];var $conv254=((($92))&255);var $93=$ix;var $94=$langopts;var $tunes=(($94+232)&4294967295);var $arrayidx255=(($tunes+$93)&4294967295);HEAP8[($arrayidx255)]=$conv254;;}}
69013 var $95=$ix;var $inc=((($95)+1)&4294967295);$ix=$inc;var $96=$ix;var $97=$n;var $cmp237=((($96))|0)<((($97))|0);if($cmp237){__label__=60;continue;}else{__label__=24;continue $while_cond$34;}}}
69014 else if(__label__==32){var $31=$p;var $32=HEAP8[($31)];var $conv26117=(tempInt=(($32)),(tempInt>=128?tempInt-256:tempInt));var $cmp26218=((($conv26117))|0)!=0;if(!($cmp26218)){__label__=24;continue $while_cond$34;}
69015 $while_cond264_preheader$90:while(1){var $100=$p;var $101=HEAP8[($100)];var $conv26510=(tempInt=(($101)),(tempInt>=128?tempInt-256:tempInt));var $call26611=_isspace($conv26510);var $tobool26712=((($call26611))|0)!=0;if($tobool26712){__label__=67;;}else{__label__=68;;}
69016 $while_body268$$while_end270$92:do{if(__label__==67){while(1){var $102=$p;var $incdec_ptr269=(($102+1)&4294967295);$p=$incdec_ptr269;var $103=$p;var $104=HEAP8[($103)];var $conv265=(tempInt=(($104)),(tempInt>=128?tempInt-256:tempInt));var $call266=_isspace($conv265);var $tobool267=((($call266))|0)!=0;if($tobool267){__label__=67;continue;}else{__label__=68;break $while_body268$$while_end270$92;}}}}while(0);$n=-1;var $105=$p;var $call271=_atoi($105);$n=$call271;var $cmp272=((($call271))|0)>0;if($cmp272){__label__=69;;}else{__label__=71;;}
69017 $land_lhs_true273$$while_cond279_preheader$96:do{if(__label__==69){var $106=$n;var $cmp274=((($106))|0)<32;if(!($cmp274)){__label__=71;break $land_lhs_true273$$while_cond279_preheader$96;}
69018 var $107=$p;var $incdec_ptr276=(($107+1)&4294967295);$p=$incdec_ptr276;var $108=$n;var $shl277=1<<($108);var $109=$conditional_rules;var $or=($109)|($shl277);$conditional_rules=$or;;}}while(0);var $110=$p;var $111=HEAP8[($110)];var $conv28013=(tempInt=(($111)),(tempInt>=128?tempInt-256:tempInt));var $call28114=_isalnum($conv28013);var $tobool28215=((($call28114))|0)!=0;if($tobool28215){__label__=72;;}else{__label__=65;;}
69019 $while_body283$$while_cond260_loopexit$100:do{if(__label__==72){while(1){var $112=$p;var $incdec_ptr284=(($112+1)&4294967295);$p=$incdec_ptr284;var $113=$p;var $114=HEAP8[($113)];var $conv280=(tempInt=(($114)),(tempInt>=128?tempInt-256:tempInt));var $call281=_isalnum($conv280);var $tobool282=((($call281))|0)!=0;if($tobool282){__label__=72;continue;}else{__label__=65;break $while_body283$$while_cond260_loopexit$100;}}}}while(0);var $98=$p;var $99=HEAP8[($98)];var $conv261=(tempInt=(($99)),(tempInt>=128?tempInt-256:tempInt));var $cmp262=((($conv261))|0)!=0;if($cmp262){__label__=66;continue $while_cond264_preheader$90;}else{__label__=24;continue $while_cond$34;}}}
69020 else if(__label__==73){var $115=$phonemes_set;var $cmp288=((($115))|0)==0;if($cmp288){__label__=74;;}else{__label__=75;;}
69021 if(__label__==74){var $call291=__Z22SelectPhonemeTableNamePKc($arraydecay290);$phonemes_set=1;;}
69022 var $116=$key;var $117=$p;__ZL18PhonemeReplacementiPc($116,$117);__label__=24;continue $while_cond$34;}
69023 else if(__label__==76){var $118=$p;var $119=$langopts;var $word_gap=(($119)&4294967295);var $120=$langopts;var $vowel_pause=(($120+4)&4294967295);var $call294=_sscanf($118,((__str58710)&4294967295),allocate([$word_gap,0,0,0,$vowel_pause,0,0,0],["i32*",0,0,0,"i32*",0,0,0],ALLOC_STACK));__label__=24;continue $while_cond$34;}
69024 else if(__label__==77){var $121=$p;var $122=$langopts;var $stress_rule=(($122+8)&4294967295);var $123=$langopts;var $stress_flags=(($123+12)&4294967295);var $124=$langopts;var $unstressed_wd1=(($124+16)&4294967295);var $125=$langopts;var $unstressed_wd2=(($125+20)&4294967295);var $call296=_sscanf($121,((__str62714)&4294967295),allocate([$stress_rule,0,0,0,$stress_flags,0,0,0,$unstressed_wd1,0,0,0,$unstressed_wd2,0,0,0],["i32*",0,0,0,"i32*",0,0,0,"i32*",0,0,0,"i32*",0,0,0],ALLOC_STACK));__label__=24;continue $while_cond$34;}
69025 else if(__label__==78){var $126=$p;var $call298=_sscanf($126,((__str63715)&4294967295),allocate([$value,0,0,0],["i32*",0,0,0],ALLOC_STACK));var $cmp299=((($call298))|0)==1;var $127=HEAP32[(($value)>>2)];var $cmp301=((($127))|0)<20;var $or_cond1=($cmp299)&($cmp301);if(!($or_cond1)){__label__=24;continue $while_cond$34;}
69026 var $128=HEAP32[(($value)>>2)];var $arrayidx303=((_charsets+$128*4)&4294967295);var $129=HEAP32[(($arrayidx303)>>2)];var $130=$new_translator;var $charset_a0=(($130+696)&4294967295);HEAP32[(($charset_a0)>>2)]=$129;__label__=24;continue $while_cond$34;}
69027 else if(__label__==80){var $131=$p;var $132=$langopts;var $numbers=(($132+184)&4294967295);var $133=$langopts;var $numbers2=(($133+188)&4294967295);var $call306=_sscanf($131,((__str58710)&4294967295),allocate([$numbers,0,0,0,$numbers2,0,0,0],["i32*",0,0,0,"i32*",0,0,0],ALLOC_STACK));__label__=24;continue $while_cond$34;}
69028 else if(__label__==81){HEAP32[(($value2)>>2)]=0;var $134=$p;var $call309=_sscanf($134,((__str64716)&4294967295),allocate([$arraydecay308,0,0,0,$value,0,0,0,$value2,0,0,0],["i8*",0,0,0,"i32*",0,0,0,"i32*",0,0,0],ALLOC_STACK));var $cmp310=((($call309))|0)>=2;if($cmp310){__label__=82;;}else{__label__=84;;}
69029 $land_lhs_true311$$if_else318$114:do{if(__label__==82){var $call313=__Z10LookupMnemP8MNEM_TABPKc(((__ZL11options_tab)&4294967295),$arraydecay312);$ix=$call313;var $cmp314=((($call313))|0)>=0;if(!($cmp314)){__label__=84;break $land_lhs_true311$$if_else318$114;}
69030 var $135=HEAP32[(($value)>>2)];var $136=$ix;var $137=$langopts;var $param=(($137+24)&4294967295);var $arrayidx316=(($param+$136*4)&4294967295);HEAP32[(($arrayidx316)>>2)]=$135;var $138=HEAP32[(($value2)>>2)];var $139=$ix;var $140=$langopts;var $param2=(($140+100)&4294967295);var $arrayidx317=(($param2+$139*4)&4294967295);HEAP32[(($arrayidx317)>>2)]=$138;__label__=24;continue $while_cond$34;}}while(0);var $141=HEAP32[((__impure_ptr)>>2)];var $_stderr319=(($141+12)&4294967295);var $142=HEAP32[(($_stderr319)>>2)];var $143=$p;var $call321=_fprintf($142,((__str65717)&4294967295),allocate([$arraydecay320,0,0,0,$143,0,0,0],["i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));__label__=24;continue $while_cond$34;}
69031 else if(__label__==85){HEAP32[(($value)>>2)]=0;var $144=HEAP32[((_voice)>>2)];var $echo_amp=(($144+80)&4294967295);HEAP32[(($echo_amp)>>2)]=0;var $145=$p;var $146=HEAP32[((_voice)>>2)];var $echo_delay=(($146+76)&4294967295);var $147=HEAP32[((_voice)>>2)];var $echo_amp324=(($147+80)&4294967295);var $call325=_sscanf($145,((__str58710)&4294967295),allocate([$echo_delay,0,0,0,$echo_amp324,0,0,0],["i32*",0,0,0,"i32*",0,0,0],ALLOC_STACK));__label__=24;continue $while_cond$34;}
69032 else if(__label__==86){var $148=$p;var $call327=_sscanf($148,((__str63715)&4294967295),allocate([$value,0,0,0],["i32*",0,0,0],ALLOC_STACK));var $cmp328=((($call327))|0)==1;if(!($cmp328)){__label__=24;continue $while_cond$34;}
69033 var $149=HEAP32[(($value)>>2)];var $mul330=((($149)*32)&4294967295);var $150=HEAP32[((_voice)>>2)];var $flutter=(($150+68)&4294967295);HEAP32[(($flutter)>>2)]=$mul330;__label__=24;continue $while_cond$34;}
69034 else if(__label__==88){var $151=$p;var $call333=_sscanf($151,((__str63715)&4294967295),allocate([$value,0,0,0],["i32*",0,0,0],ALLOC_STACK));var $cmp334=((($call333))|0)==1;if(!($cmp334)){__label__=24;continue $while_cond$34;}
69035 var $152=HEAP32[(($value)>>2)];var $153=HEAP32[((_voice)>>2)];var $roughness=(($153+72)&4294967295);HEAP32[(($roughness)>>2)]=$152;__label__=24;continue $while_cond$34;}
69036 else if(__label__==90){var $154=$p;var $call338=_sscanf($154,((__str63715)&4294967295),allocate([$value,0,0,0],["i32*",0,0,0],ALLOC_STACK));var $cmp339=((($call338))|0)==1;if(!($cmp339)){__label__=24;continue $while_cond$34;}
69037 var $155=HEAP32[(($value)>>2)];var $cmp341=((($155))|0)>4;if($cmp341){__label__=92;;}else{__label__=93;;}
69038 if(__label__==92){var $156=HEAP32[((_voice)>>2)];var $peak_shape=(($156+88)&4294967295);HEAP32[(($peak_shape)>>2)]=1;HEAP32[(($value)>>2)]=4;;}
69039 var $157=HEAP32[(($value)>>2)];var $add344=((($157)+1)&4294967295);var $158=HEAP32[((_voice)>>2)];var $n_harmonic_peaks=(($158+84)&4294967295);HEAP32[(($n_harmonic_peaks)>>2)]=$add344;__label__=24;continue $while_cond$34;}
69040 else if(__label__==94){var $159=$p;__Z14ReadTonePointsPcPi($159,$arraydecay347);var $160=HEAP32[((_voice)>>2)];__ZL13SetToneAdjustP7voice_tPi($160,$arraydecay348);__label__=24;continue $while_cond$34;}
69041 else if(__label__==95){var $161=$p;var $call350=_sscanf($161,((__str63715)&4294967295),allocate([$value,0,0,0],["i32*",0,0,0],ALLOC_STACK));var $cmp351=((($call350))|0)==1;if(!($cmp351)){__label__=24;continue $while_cond$34;}
69042 var $162=HEAP32[(($value)>>2)];var $mul353=((($162)*64)&4294967295);var $div354=((((($mul353))|0)/100)|0);var $163=HEAP32[((_voice)>>2)];var $voicing=(($163+92)&4294967295);HEAP32[(($voicing)>>2)]=$div354;__label__=24;continue $while_cond$34;}
69043 else if(__label__==97){var $164=$p;var $165=HEAP32[((_voice)>>2)];var $breath=(($165+272)&4294967295);var $arrayidx357=(($breath+4)&4294967295);var $call358=__ZL12Read8NumbersPcPi($164,$arrayidx357);var $166=HEAP32[((_voice)>>2)];var $breath359=(($166+272)&4294967295);var $arrayidx360=(($breath359)&4294967295);HEAP32[(($arrayidx360)>>2)]=$call358;$ix=1;;while(1){var $167=$ix;var $rem=((($167))|0)%2;var $tobool364=((($rem))|0)!=0;if($tobool364){__label__=99;;}else{__label__=100;;}
69044 if(__label__==99){var $168=$ix;var $169=HEAP32[((_voice)>>2)];var $breath366=(($169+272)&4294967295);var $arrayidx367=(($breath366+$168*4)&4294967295);var $170=HEAP32[(($arrayidx367)>>2)];var $sub368=(((-($170)))&4294967295);var $171=$ix;var $172=HEAP32[((_voice)>>2)];var $breath369=(($172+272)&4294967295);var $arrayidx370=(($breath369+$171*4)&4294967295);HEAP32[(($arrayidx370)>>2)]=$sub368;;}
69045 var $173=$ix;var $inc373=((($173)+1)&4294967295);$ix=$inc373;var $cmp362=((($inc373))|0)<8;if($cmp362){__label__=98;continue;}else{__label__=24;continue $while_cond$34;}}}
69046 else if(__label__==101){var $174=$p;var $175=HEAP32[((_voice)>>2)];var $breathw=(($175+308)&4294967295);var $arrayidx376=(($breathw+4)&4294967295);var $call377=__ZL12Read8NumbersPcPi($174,$arrayidx376);var $176=HEAP32[((_voice)>>2)];var $breathw378=(($176+308)&4294967295);var $arrayidx379=(($breathw378)&4294967295);HEAP32[(($arrayidx379)>>2)]=$call377;__label__=24;continue $while_cond$34;}
69047 else if(__label__==102){var $177=$p;var $178=HEAP32[((_voice)>>2)];var $consonant_amp=(($178+100)&4294967295);var $179=HEAP32[((_voice)>>2)];var $consonant_ampv=(($179+104)&4294967295);var $call381=_sscanf($177,((__str58710)&4294967295),allocate([$consonant_amp,0,0,0,$consonant_ampv,0,0,0],["i32*",0,0,0,"i32*",0,0,0],ALLOC_STACK));HEAP32[(($value)>>2)]=$call381;__label__=24;continue $while_cond$34;}
69048 else if(__label__==103){var $180=$p;var $181=HEAP32[((_voice)>>2)];var $speed_percent=(($181+64)&4294967295);var $call383=_sscanf($180,((__str63715)&4294967295),allocate([$speed_percent,0,0,0],["i32*",0,0,0],ALLOC_STACK));__label__=24;continue $while_cond$34;}
69049 else if(__label__==104){HEAP32[(($srate)>>2)]=16000;HEAP8[($arrayidx385)]=0;var $182=$p;var $call388=_sscanf($182,((__str66718)&4294967295),allocate([$arraydecay386,0,0,0,$arraydecay387,0,0,0,$srate,0,0,0],["i8*",0,0,0,"i8*",0,0,0,"i32*",0,0,0],ALLOC_STACK));var $183=HEAP32[(($srate)>>2)];var $call391=__Z15LoadMbrolaTablePKcS0_i($arraydecay389,$arraydecay390,$183);var $cmp392=((($call391))|0)!=0;if($cmp392){__label__=105;;}else{__label__=106;;}
69050 if(__label__==105){var $184=HEAP32[((__impure_ptr)>>2)];var $_stderr394=(($184+12)&4294967295);var $185=HEAP32[(($_stderr394)>>2)];var $186=_fwrite(((__str67719)&4294967295),23,1,$185);;}
69051 var $187=HEAP32[(($srate)>>2)];var $188=HEAP32[((_voice)>>2)];var $samplerate=(($188+108)&4294967295);HEAP32[(($samplerate)>>2)]=$187;__label__=24;continue $while_cond$34;}
69052 else if(__label__==107){var $189=HEAP32[((_voice)>>2)];var $klattv=(($189+112)&4294967295);var $arrayidx398=(($klattv)&4294967295);HEAP32[(($arrayidx398)>>2)]=1;var $190=$p;var $191=HEAP32[((_voice)>>2)];var $klattv399=(($191+112)&4294967295);var $arraydecay400=(($klattv399)&4294967295);var $call401=__ZL12Read8NumbersPcPi($190,$arraydecay400);var $192=HEAP32[((_voice)>>2)];var $klattv402=(($192+112)&4294967295);var $arrayidx403=(($klattv402+20)&4294967295);var $193=HEAP32[(($arrayidx403)>>2)];var $sub404=((($193)-40)&4294967295);HEAP32[(($arrayidx403)>>2)]=$sub404;__label__=24;continue $while_cond$34;}
69053 else if(__label__==108){var $194=$p;var $call406=__ZL12Read8NumbersPcPi($194,((_speed+32)&4294967295));__Z8SetSpeedi(3);__label__=24;continue $while_cond$34;}}
69054 $if_end423$$while_end419$146:do{if(__label__==112){var $_pr=$f_voice;var $cmp420=((($_pr))|0)!=0;if(!($cmp420)){__label__=114;break $if_end423$$while_end419$146;}
69055 var $201=$f_voice;var $call422=_fclose($201);;}}while(0);var $202=$new_translator;var $cmp424=((($202))|0)==0;if($cmp424){__label__=115;;}else{__label__=117;;}
69056 $land_lhs_true425$$if_end430$150:do{if(__label__==115){var $203=$tone_only;var $tobool426=((($203))|0)!=0;if($tobool426){__label__=117;break $land_lhs_true425$$if_end430$150;}
69057 var $arraydecay428=(($translator_name)&4294967295);var $call429=__Z16SelectTranslatorPKc($arraydecay428);$new_translator=$call429;;}}while(0);__Z8SetSpeedi(3);$ix=0;;$for_body433$154:while(1){var $204=$ix;var $205=HEAP32[((_voice)>>2)];var $freq=(($205+144)&4294967295);var $arrayidx434=(($freq+$204*2)&4294967295);var $206=HEAP16[(($arrayidx434)>>1)];var $207=$ix;var $208=HEAP32[((_voice)>>2)];var $freq2=(($208+216)&4294967295);var $arrayidx435=(($freq2+$207*2)&4294967295);HEAP16[(($arrayidx435)>>1)]=$206;var $209=$ix;var $210=HEAP32[((_voice)>>2)];var $height=(($210+162)&4294967295);var $arrayidx436=(($height+$209*2)&4294967295);var $211=HEAP16[(($arrayidx436)>>1)];var $212=$ix;var $213=HEAP32[((_voice)>>2)];var $height2=(($213+234)&4294967295);var $arrayidx437=(($height2+$212*2)&4294967295);HEAP16[(($arrayidx437)>>1)]=$211;var $214=$ix;var $215=HEAP32[((_voice)>>2)];var $width=(($215+180)&4294967295);var $arrayidx438=(($width+$214*2)&4294967295);var $216=HEAP16[(($arrayidx438)>>1)];var $217=$ix;var $218=HEAP32[((_voice)>>2)];var $width2=(($218+252)&4294967295);var $arrayidx439=(($width2+$217*2)&4294967295);HEAP16[(($arrayidx439)>>1)]=$216;var $219=$ix;var $inc441=((($219)+1)&4294967295);$ix=$inc441;var $cmp432=((($inc441))|0)<9;if($cmp432){__label__=118;continue $for_body433$154;}else{__label__=119;break $for_body433$154;}}
69058 var $220=$tone_only;var $tobool443=((($220))|0)!=0;if($tobool443){__label__=120;;}else{__label__=121;;}
69059 if(__label__==120){var $221=HEAP32[((_translator)>>2)];$new_translator=$221;;}
69060 else if(__label__==121){var $arraydecay446=(($phonemes_name)&4294967295);var $call447=__Z22SelectPhonemeTableNamePKc($arraydecay446);$ix=$call447;var $cmp448=((($call447))|0)<0;if($cmp448){__label__=122;;}else{__label__=123;;}
69061 if(__label__==122){var $222=HEAP32[((__impure_ptr)>>2)];var $_stderr450=(($222+12)&4294967295);var $223=HEAP32[(($_stderr450)>>2)];var $arraydecay451=(($phonemes_name)&4294967295);var $call452=_fprintf($223,((__str69721)&4294967295),allocate([$arraydecay451,0,0,0],["i8*",0,0,0],ALLOC_STACK));;}
69062 var $224=$ix;var $225=HEAP32[((_voice)>>2)];var $phoneme_tab_ix=(($225+40)&4294967295);HEAP32[(($phoneme_tab_ix)>>2)]=$224;var $226=$ix;var $227=$new_translator;var $phoneme_tab_ix454=(($227+656)&4294967295);HEAP32[(($phoneme_tab_ix454)>>2)]=$226;var $228=$new_translator;var $arraydecay455=(($new_dictionary)&4294967295);var $229=$control_addr;var $and456=($229)&4;var $call457=__Z14LoadDictionaryP10TranslatorPKci($228,$arraydecay455,$and456);$error=$call457;var $230=HEAP8[(((_dictionary_name)&4294967295))];var $conv458=(tempInt=(($230)),(tempInt>=128?tempInt-256:tempInt));var $cmp459=((($conv458))|0)==0;if($cmp459){__label__=124;;}else{__label__=125;;}
69063 if(__label__==124){$retval=0;__label__=137;break $return$$if_end51$12;}
69064 else if(__label__==125){var $231=$conditional_rules;var $232=$new_translator;var $dict_condition=(($232+692)&4294967295);HEAP32[(($dict_condition)>>2)]=$231;var $233=$langix;var $arrayidx462=((__ZZ9LoadVoicePKciE15voice_languages+$233)&4294967295);HEAP8[($arrayidx462)]=0;;}}
69065 var $234=$new_translator;var $langopts464=(($234)&4294967295);$langopts=$langopts464;var $235=$langopts;var $param465=(($235+24)&4294967295);var $arrayidx466=(($param465+24)&4294967295);var $236=HEAP32[(($arrayidx466)>>2)];HEAP32[(($value)>>2)]=$236;var $cmp467=((($236))|0)!=0;if($cmp467){__label__=127;;}else{__label__=128;;}
69066 if(__label__==127){var $237=$new_translator;var $238=HEAP32[(($value)>>2)];__Z13SetLengthModsP10Translatori($237,$238);;}
69067 var $239=HEAP32[((_voice)>>2)];var $width470=(($239+180)&4294967295);var $arrayidx471=(($width470)&4294967295);var $240=HEAP16[(($arrayidx471)>>1)];var $conv472=(tempInt=(($240)),(tempInt>=32768?tempInt-65536:tempInt));var $mul473=((($conv472)*105)&4294967295);var $div474=((((($mul473))|0)/100)|0);var $conv475=((($div474))&65535);var $241=HEAP32[((_voice)>>2)];var $width476=(($241+180)&4294967295);var $arrayidx477=(($width476)&4294967295);HEAP16[(($arrayidx477)>>1)]=$conv475;var $242=$tone_only;var $tobool478=((($242))|0)!=0;if($tobool478){__label__=130;;}else{__label__=129;;}
69068 if(__label__==129){var $243=$new_translator;HEAP32[((_translator)>>2)]=$243;;}
69069 $ix=0;var $244=$ix;var $245=$stress_lengths_set;var $cmp4825=((($244))|0)<((($245))|0);if($cmp4825){__label__=131;;}else{__label__=132;;}
69070 $for_body483$$for_end490$173:do{if(__label__==131){while(1){var $246=$ix;var $arrayidx484=(($stress_lengths+$246*4)&4294967295);var $247=HEAP32[(($arrayidx484)>>2)];var $conv485=((($247))&65535);var $248=$ix;var $249=HEAP32[((_translator)>>2)];var $stress_lengths486=(($249+676)&4294967295);var $arrayidx487=(($stress_lengths486+$248*2)&4294967295);HEAP16[(($arrayidx487)>>1)]=$conv485;var $250=$ix;var $inc489=((($250)+1)&4294967295);$ix=$inc489;var $251=$ix;var $252=$stress_lengths_set;var $cmp482=((($251))|0)<((($252))|0);if($cmp482){__label__=131;continue;}else{__label__=132;break $for_body483$$for_end490$173;}}}}while(0);$ix=0;var $253=$ix;var $254=$stress_add_set;var $cmp4924=((($253))|0)<((($254))|0);if($cmp4924){__label__=133;;}else{__label__=134;;}
69071 $for_body493$$for_end502$177:do{if(__label__==133){while(1){var $255=$ix;var $arrayidx494=(($stress_add+$255*4)&4294967295);var $256=HEAP32[(($arrayidx494)>>2)];var $257=$ix;var $258=HEAP32[((_translator)>>2)];var $stress_lengths495=(($258+676)&4294967295);var $arrayidx496=(($stress_lengths495+$257*2)&4294967295);var $259=HEAP16[(($arrayidx496)>>1)];var $conv497=(tempInt=(($259)),(tempInt>=32768?tempInt-65536:tempInt));var $add498=((($conv497)+($256))&4294967295);var $conv499=((($add498))&65535);HEAP16[(($arrayidx496)>>1)]=$conv499;var $260=$ix;var $inc501=((($260)+1)&4294967295);$ix=$inc501;var $261=$ix;var $262=$stress_add_set;var $cmp492=((($261))|0)<((($262))|0);if($cmp492){__label__=133;continue;}else{__label__=134;break $for_body493$$for_end502$177;}}}}while(0);$ix=0;var $263=$ix;var $264=$stress_amps_set;var $cmp5043=((($263))|0)<((($264))|0);if($cmp5043){__label__=135;;}else{__label__=136;;}
69072 $for_body505$$for_end516$181:do{if(__label__==135){while(1){var $265=$ix;var $arrayidx506=(($stress_amps+$265*4)&4294967295);var $266=HEAP32[(($arrayidx506)>>2)];var $conv507=((($266))&255);var $267=$ix;var $268=HEAP32[((_translator)>>2)];var $stress_amps508=(($268+660)&4294967295);var $arrayidx509=(($stress_amps508+$267)&4294967295);HEAP8[($arrayidx509)]=$conv507;var $269=$ix;var $arrayidx510=(($stress_amps+$269*4)&4294967295);var $270=HEAP32[(($arrayidx510)>>2)];var $sub511=((($270)-1)&4294967295);var $conv512=((($sub511))&255);var $271=$ix;var $272=HEAP32[((_translator)>>2)];var $stress_amps_r=(($272+668)&4294967295);var $arrayidx513=(($stress_amps_r+$271)&4294967295);HEAP8[($arrayidx513)]=$conv512;var $273=$ix;var $inc515=((($273)+1)&4294967295);$ix=$inc515;var $274=$ix;var $275=$stress_amps_set;var $cmp504=((($274))|0)<((($275))|0);if($cmp504){__label__=135;continue;}else{__label__=136;break $for_body505$$for_end516$181;}}}}while(0);var $276=HEAP32[((_voice)>>2)];$retval=$276;;}}while(0);var $277=$retval;STACKTOP=__stackBase__;return $277;return null;}
69073 function __ZL11fgets_stripPciP7__sFILE($buf,$size,$f_in){;var __label__;var $retval;var $buf_addr;var $size_addr;var $f_in_addr;var $len;var $p;$buf_addr=$buf;$size_addr=$size;$f_in_addr=$f_in;var $0=$buf_addr;var $1=$size_addr;var $2=$f_in_addr;var $call=_fgets($0,$1,$2);var $cmp=((($call))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
69074 if(__label__==1){$retval=0;;}
69075 else if(__label__==2){var $3=$buf_addr;var $call1=_strlen($3);$len=$call1;;while(1){var $4=$len;var $dec=((($4)-1)&4294967295);$len=$dec;var $cmp2=((($dec))|0)>0;if(!($cmp2)){__label__=6;break;}
69076 var $5=$len;var $6=$buf_addr;var $arrayidx=(($6+$5)&4294967295);var $7=HEAP8[($arrayidx)];var $conv=(tempInt=(($7)),(tempInt>=128?tempInt-256:tempInt));var $call3=_isspace($conv);var $tobool=((($call3))|0)!=0;if(!($tobool)){__label__=6;break;}
69077 var $8=$len;var $9=$buf_addr;var $arrayidx4=(($9+$8)&4294967295);HEAP8[($arrayidx4)]=0;__label__=3;continue;}
69078 var $10=$buf_addr;var $call5=_strstr($10,((__str82734)&4294967295));$p=$call5;var $cmp6=((($call5))|0)!=0;if($cmp6){__label__=7;;}else{__label__=8;;}
69079 if(__label__==7){var $11=$p;HEAP8[($11)]=0;;}
69080 var $12=$buf_addr;$retval=$12;;}
69081 var $13=$retval;;return $13;return null;}
69082 function __ZL12VoiceFormantPc($p){var __stackBase__=STACKTOP;STACKTOP+=20;_memset(__stackBase__,0,20);var __label__;var $p_addr;var $ix;var $formant=__stackBase__;var $freq=__stackBase__+4;var $height=__stackBase__+8;var $width=__stackBase__+12;var $freqadd=__stackBase__+16;$p_addr=$p;HEAP32[(($freq)>>2)]=100;HEAP32[(($height)>>2)]=100;HEAP32[(($width)>>2)]=100;HEAP32[(($freqadd)>>2)]=0;var $0=$p_addr;var $call=_sscanf($0,((__str81733)&4294967295),allocate([$formant,0,0,0,$freq,0,0,0,$height,0,0,0,$width,0,0,0,$freqadd,0,0,0],["i32*",0,0,0,"i32*",0,0,0,"i32*",0,0,0,"i32*",0,0,0,"i32*",0,0,0],ALLOC_STACK));$ix=$call;var $1=$ix;var $cmp=((($1))|0)<2;if($cmp){__label__=9;;}else{__label__=1;;}
69083 $return$$if_end$2:do{if(__label__==1){var $2=HEAP32[(($formant)>>2)];var $cmp1=((($2))|0)<0;var $3=HEAP32[(($formant)>>2)];var $cmp2=((($3))|0)>8;var $or_cond=($cmp1)|($cmp2);if($or_cond){__label__=9;break $return$$if_end$2;}
69084 var $4=HEAP32[(($freq)>>2)];var $cmp5=((($4))|0)>=0;if($cmp5){__label__=3;;}else{__label__=4;;}
69085 if(__label__==3){var $5=HEAP32[(($freq)>>2)];var $conv=((($5))|0);var $mul=($conv)*2.56001;var $conv7=((($mul))|0);var $conv8=((($conv7))&65535);var $6=HEAP32[(($formant)>>2)];var $7=HEAP32[((_voice)>>2)];var $freq9=(($7+144)&4294967295);var $arrayidx=(($freq9+$6*2)&4294967295);HEAP16[(($arrayidx)>>1)]=$conv8;;}
69086 var $8=HEAP32[(($height)>>2)];var $cmp11=((($8))|0)>=0;if($cmp11){__label__=5;;}else{__label__=6;;}
69087 if(__label__==5){var $9=HEAP32[(($height)>>2)];var $conv13=((($9))|0);var $mul14=($conv13)*2.56001;var $conv15=((($mul14))|0);var $conv16=((($conv15))&65535);var $10=HEAP32[(($formant)>>2)];var $11=HEAP32[((_voice)>>2)];var $height17=(($11+162)&4294967295);var $arrayidx18=(($height17+$10*2)&4294967295);HEAP16[(($arrayidx18)>>1)]=$conv16;;}
69088 var $12=HEAP32[(($width)>>2)];var $cmp20=((($12))|0)>=0;if($cmp20){__label__=7;;}else{__label__=8;;}
69089 if(__label__==7){var $13=HEAP32[(($width)>>2)];var $conv22=((($13))|0);var $mul23=($conv22)*2.56001;var $conv24=((($mul23))|0);var $conv25=((($conv24))&65535);var $14=HEAP32[(($formant)>>2)];var $15=HEAP32[((_voice)>>2)];var $width26=(($15+180)&4294967295);var $arrayidx27=(($width26+$14*2)&4294967295);HEAP16[(($arrayidx27)>>1)]=$conv25;;}
69090 var $16=HEAP32[(($freqadd)>>2)];var $conv29=((($16))&65535);var $17=HEAP32[(($formant)>>2)];var $18=HEAP32[((_voice)>>2)];var $freqadd30=(($18+198)&4294967295);var $arrayidx31=(($freqadd30+$17*2)&4294967295);HEAP16[(($arrayidx31)>>1)]=$conv29;;}}while(0);STACKTOP=__stackBase__;return;return;}
69091 function __ZL12Read8NumbersPcPi($data_in,$data){;var __label__;var $data_in_addr;var $data_addr;$data_in_addr=$data_in;$data_addr=$data;var $0=$data_addr;var $1=$0;var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=$1;$stop$=$dest$+12;$value4$=0;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=0;}
69092 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
69093 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=0;};var $2=$data_in_addr;var $3=$data_addr;var $arrayidx=(($3)&4294967295);var $4=$data_addr;var $arrayidx1=(($4+4)&4294967295);var $5=$data_addr;var $arrayidx2=(($5+8)&4294967295);var $6=$data_addr;var $arrayidx3=(($6+12)&4294967295);var $7=$data_addr;var $arrayidx4=(($7+16)&4294967295);var $8=$data_addr;var $arrayidx5=(($8+20)&4294967295);var $9=$data_addr;var $arrayidx6=(($9+24)&4294967295);var $10=$data_addr;var $arrayidx7=(($10+28)&4294967295);var $call=_sscanf($2,((__str80732)&4294967295),allocate([$arrayidx,0,0,0,$arrayidx1,0,0,0,$arrayidx2,0,0,0,$arrayidx3,0,0,0,$arrayidx4,0,0,0,$arrayidx5,0,0,0,$arrayidx6,0,0,0,$arrayidx7,0,0,0],["i32*",0,0,0,"i32*",0,0,0,"i32*",0,0,0,"i32*",0,0,0,"i32*",0,0,0,"i32*",0,0,0,"i32*",0,0,0,"i32*",0,0,0],ALLOC_STACK));;return $call;return null;}
69094 function __ZL10LookupTunePKc($name){;var __label__;var $retval;var $name_addr;var $ix;$name_addr=$name;$ix=0;;while(1){var $0=$ix;var $1=HEAP32[((_n_tunes)>>2)];var $cmp=((($0))|0)<((($1))|0);if(!($cmp)){__label__=5;break;}
69095 var $2=$name_addr;var $3=$ix;var $4=HEAP32[((_tunes)>>2)];var $arrayidx=(($4+68*$3)&4294967295);var $name1=(($arrayidx)&4294967295);var $arraydecay=(($name1)&4294967295);var $call=_strcmp($2,$arraydecay);var $cmp2=((($call))|0)==0;var $5=$ix;if($cmp2){__label__=3;break;}
69096 var $inc=((($5)+1)&4294967295);$ix=$inc;__label__=1;continue;}
69097 if(__label__==5){$retval=-1;;}
69098 else if(__label__==3){$retval=$5;;}
69099 var $6=$retval;;return $6;return null;}
69100 function __ZL18PhonemeReplacementiPc($type,$p){var __stackBase__=STACKTOP;STACKTOP+=28;_memset(__stackBase__,0,28);var __label__;var $type_addr;var $p_addr;var $n;var $phon;var $flags=__stackBase__;var $phon_string1=__stackBase__+4;var $phon_string2=__stackBase__+16;$type_addr=$type;$p_addr=$p;HEAP32[(($flags)>>2)]=0;var $arraydecay=(($phon_string2)&4294967295);var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=((__str60712)&4294967295);$dest$=$arraydecay;$stop$=$src$+5;if(($dest$%4)==($src$%4)&&5>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
69101 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
69102 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $0=$p_addr;var $arraydecay1=(($phon_string1)&4294967295);var $arraydecay2=(($phon_string2)&4294967295);var $call3=_sscanf($0,((__str79731)&4294967295),allocate([$flags,0,0,0,$arraydecay1,0,0,0,$arraydecay2,0,0,0],["i32*",0,0,0,"i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));$n=$call3;var $1=$n;var $cmp=((($1))|0)<2;var $2=HEAP32[((_n_replace_phonemes)>>2)];var $cmp4=((($2))|0)>=60;var $or_cond=($cmp)|($cmp4);if($or_cond){__label__=3;;}else{__label__=1;;}
69103 $return$$if_end$2:do{if(__label__==1){var $arraydecay5=(($phon_string1)&4294967295);var $call6=__Z19LookupPhonemeStringPKc($arraydecay5);$phon=$call6;var $cmp7=((($call6))|0)==0;if($cmp7){__label__=3;break $return$$if_end$2;}
69104 var $3=$phon;var $conv=((($3))&255);var $4=HEAP32[((_n_replace_phonemes)>>2)];var $arrayidx=((_replace_phonemes+$4*3)&4294967295);var $old_ph=(($arrayidx)&4294967295);HEAP8[($old_ph)]=$conv;var $arraydecay10=(($phon_string2)&4294967295);var $call11=__Z19LookupPhonemeStringPKc($arraydecay10);var $conv12=((($call11))&255);var $5=HEAP32[((_n_replace_phonemes)>>2)];var $arrayidx13=((_replace_phonemes+$5*3)&4294967295);var $new_ph=(($arrayidx13+1)&4294967295);HEAP8[($new_ph)]=$conv12;var $6=HEAP32[(($flags)>>2)];var $conv14=((($6))&255);var $7=HEAP32[((_n_replace_phonemes)>>2)];var $inc=((($7)+1)&4294967295);HEAP32[((_n_replace_phonemes)>>2)]=$inc;var $arrayidx15=((_replace_phonemes+$7*3)&4294967295);var $type16=(($arrayidx15+2)&4294967295);HEAP8[($type16)]=$conv14;;}}while(0);STACKTOP=__stackBase__;return;return;}
69105 function __Z16LoadVoiceVariantPKci($vname,$variant_num){var __stackBase__=STACKTOP;STACKTOP+=60;_memset(__stackBase__,0,60);var __label__;var $retval;var $vname_addr;var $variant_num_addr;var $v;var $variant_name;var $buf=__stackBase__;$vname_addr=$vname;$variant_num_addr=$variant_num;var $arraydecay=(($buf)&4294967295);var $0=$vname_addr;__Z8strncpy0PcPKci($arraydecay,$0,60);var $arraydecay1=(($buf)&4294967295);var $1=$variant_num_addr;__ZL23ExtractVoiceVariantNamePci($arraydecay1,$1);$variant_name=((__ZZL23ExtractVoiceVariantNamePciE12variant_name)&4294967295);var $arraydecay2=(($buf)&4294967295);var $call3=__Z9LoadVoicePKci($arraydecay2,0);$v=$call3;var $cmp=((($call3))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
69106 if(__label__==1){$retval=0;;}
69107 else if(__label__==2){var $2=$variant_name;var $arrayidx=(($2)&4294967295);var $3=HEAP8[($arrayidx)];var $conv=(tempInt=(($3)),(tempInt>=128?tempInt-256:tempInt));var $cmp4=((($conv))|0)!=0;if($cmp4){__label__=3;;}else{__label__=4;;}
69108 if(__label__==3){var $4=$variant_name;var $call6=__Z9LoadVoicePKci($4,2);$v=$call6;;}
69109 var $5=$v;$retval=$5;;}
69110 var $6=$retval;STACKTOP=__stackBase__;return $6;return null;}
69111 function __ZL23ExtractVoiceVariantNamePci($vname,$variant_num){var __stackBase__=STACKTOP;STACKTOP+=8;_memset(__stackBase__,0,8);var __label__;var __lastLabel__=null;var $vname_addr;var $variant_num_addr;var $p;var $variant_prefix=__stackBase__;$vname_addr=$vname;$variant_num_addr=$variant_num;HEAP8[(((__ZZL23ExtractVoiceVariantNamePciE12variant_name)&4294967295))]=0;var $arraydecay=(($variant_prefix)&4294967295);var $call=_sprintf($arraydecay,((__str76728)&4294967295),allocate([47,0,0,0],["i32",0,0,0],ALLOC_STACK));var $0=$vname_addr;var $cmp=((($0))|0)!=0;if($cmp){__label__=1;;}else{__label__=5;;}
69112 $if_then$$if_end10thread_pre_split$2:do{if(__label__==1){var $1=$vname_addr;var $call1=_strchr($1,43);$p=$call1;var $cmp2=((($call1))|0)!=0;if(!($cmp2)){__label__=5;break $if_then$$if_end10thread_pre_split$2;}
69113 var $2=$p;var $incdec_ptr=(($2+1)&4294967295);$p=$incdec_ptr;HEAP8[($2)]=0;var $3=$p;var $4=HEAP8[($3)];var $conv=(tempInt=(($4)),(tempInt>=128?tempInt-256:tempInt));var $isdigittmp=((($conv)-48)&4294967295);var $isdigit=((($isdigittmp))>>>0)<10;var $call4=((($isdigit))&1);var $tobool=((($call4))|0)!=0;if($tobool){__label__=3;;}else{__label__=4;;}
69114 if(__label__==3){var $5=$p;var $call6=_atoi($5);$variant_num_addr=$call6;__lastLabel__=3;__label__=6;break $if_then$$if_end10thread_pre_split$2;}
69115 else if(__label__==4){var $arraydecay7=(($variant_prefix)&4294967295);var $call8=_strcpy(((__ZZL23ExtractVoiceVariantNamePciE12variant_name)&4294967295),$arraydecay7);var $6=$p;__Z8strncpy0PcPKci(((__ZZL23ExtractVoiceVariantNamePciE12variant_name+3)&4294967295),$6,17);__label__=5;break $if_then$$if_end10thread_pre_split$2;}}}while(0);if(__label__==5){var $_pr=$variant_num_addr;__lastLabel__=5;;}
69116 var $7=__lastLabel__==5?$_pr:($call6);var $cmp11=((($7))|0)>0;if($cmp11){__label__=7;;}else{__label__=10;;}
69117 if(__label__==7){var $8=$variant_num_addr;var $cmp13=((($8))|0)<10;var $arraydecay15=(($variant_prefix)&4294967295);var $9=$variant_num_addr;if($cmp13){__label__=8;;}else{__label__=9;;}
69118 if(__label__==8){var $call16=_sprintf(((__ZZL23ExtractVoiceVariantNamePciE12variant_name)&4294967295),((__str77729)&4294967295),allocate([$arraydecay15,0,0,0,$9,0,0,0],["i8*",0,0,0,"i32",0,0,0],ALLOC_STACK));;}
69119 else if(__label__==9){var $sub=((($9)-10)&4294967295);var $call19=_sprintf(((__ZZL23ExtractVoiceVariantNamePciE12variant_name)&4294967295),((__str78730)&4294967295),allocate([$arraydecay15,0,0,0,$sub,0,0,0],["i8*",0,0,0,"i32",0,0,0],ALLOC_STACK));;}}
69120 STACKTOP=__stackBase__;return;return;}
69121 function __Z17SelectVoiceByNamePP12espeak_VOICEPKc($voices,$name){var __stackBase__=STACKTOP;STACKTOP+=44;_memset(__stackBase__,0,44);var __label__;var __lastLabel__=null;var $retval;var $voices_addr;var $name_addr;var $ix;var $match_fname;var $match_fname2;var $match_name;var $id;var $last_part_len;var $last_part=__stackBase__;$voices_addr=$voices;$name_addr=$name;$match_fname=-1;$match_fname2=-1;$match_name=-1;var $0=$voices_addr;var $cmp=((($0))|0)==0;if($cmp){__label__=1;;}else{__label__=4;;}
69122 if(__label__==1){var $1=HEAP32[((__ZL13n_voices_list)>>2)];var $cmp1=((($1))|0)==0;if($cmp1){__label__=2;;}else{__label__=3;;}
69123 if(__label__==2){var $call=_espeak_ListVoices(0);;}
69124 $voices_addr=((__ZL11voices_list)&4294967295);;}
69125 var $arraydecay=(($last_part)&4294967295);var $2=$name_addr;var $call4=_sprintf($arraydecay,((__str70722)&4294967295),allocate([47,0,0,0,$2,0,0,0],["i32",0,0,0,"i8*",0,0,0],ALLOC_STACK));var $arraydecay5=(($last_part)&4294967295);var $call6=_strlen($arraydecay5);$last_part_len=$call6;$ix=0;var $arraydecay18=(($last_part)&4294967295);;$for_cond$8:while(1){var $3=$ix;var $4=$voices_addr;var $arrayidx=(($4+4*$3)&4294967295);var $5=HEAP32[(($arrayidx)>>2)];var $cmp7=((($5))|0)!=0;if(!($cmp7)){__label__=13;break $for_cond$8;}
69126 var $6=$name_addr;var $7=$ix;var $8=$voices_addr;var $arrayidx8=(($8+4*$7)&4294967295);var $9=HEAP32[(($arrayidx8)>>2)];var $name9=(($9)&4294967295);var $10=HEAP32[(($name9)>>2)];var $call10=_strcmp($6,$10);var $cmp11=((($call10))|0)==0;if($cmp11){__label__=7;break $for_cond$8;}
69127 var $12=$name_addr;var $13=$ix;var $14=$voices_addr;var $arrayidx13=(($14+4*$13)&4294967295);var $15=HEAP32[(($arrayidx13)>>2)];var $identifier=(($15+8)&4294967295);var $16=HEAP32[(($identifier)>>2)];$id=$16;var $call14=_strcmp($12,$16);var $cmp15=((($call14))|0)==0;if($cmp15){__label__=9;;}else{__label__=10;;}
69128 $if_then16$$if_else17$12:do{if(__label__==9){var $17=$ix;$match_fname=$17;;}
69129 else if(__label__==10){var $18=$id;var $call19=_strlen($18);var $19=$last_part_len;var $sub=((($call19)-($19))&4294967295);var $20=$id;var $arrayidx20=(($20+$sub)&4294967295);var $call21=_strcmp($arraydecay18,$arrayidx20);var $cmp22=((($call21))|0)==0;if(!($cmp22)){__label__=12;break $if_then16$$if_else17$12;}
69130 var $21=$ix;$match_fname2=$21;;}}while(0);var $22=$ix;var $inc=((($22)+1)&4294967295);$ix=$inc;__label__=5;continue $for_cond$8;}
69131 if(__label__==13){var $_pr=$match_name;__lastLabel__=13;;}
69132 else if(__label__==7){var $11=$ix;$match_name=$11;__lastLabel__=7;;}
69133 var $23=__lastLabel__==13?$_pr:($11);var $cmp27=((($23))|0)<0;if($cmp27){__label__=15;;}else{__label__=17;;}
69134 $if_then28$$if_end32thread_pre_split$21:do{if(__label__==15){var $24=$match_fname;$match_name=$24;var $25=$match_name;var $cmp29=((($25))|0)<0;if(!($cmp29)){__label__=20;break $if_then28$$if_end32thread_pre_split$21;}
69135 var $26=$match_fname2;$match_name=$26;__lastLabel__=16;__label__=18;break $if_then28$$if_end32thread_pre_split$21;}
69136 else if(__label__==17){var $_pr1=$match_name;__lastLabel__=17;__label__=18;break $if_then28$$if_end32thread_pre_split$21;}}while(0);$if_end32$$if_end35$25:do{if(__label__==18){var $27=__lastLabel__==17?$_pr1:($26);var $cmp33=((($27))|0)<0;if(!($cmp33)){__label__=20;break $if_end32$$if_end35$25;}
69137 $retval=0;__label__=21;break $if_end32$$if_end35$25;}}while(0);if(__label__==20){var $28=$match_name;var $29=$voices_addr;var $arrayidx36=(($29+4*$28)&4294967295);var $30=HEAP32[(($arrayidx36)>>2)];$retval=$30;;}
69138 var $31=$retval;STACKTOP=__stackBase__;return $31;return null;}
69139 function _espeak_ListVoices($voice_spec){var __stackBase__=STACKTOP;STACKTOP+=164;_memset(__stackBase__,0,164);var __label__;var $voice_spec_addr;var $ix;var $j;var $v;var $path_voices=__stackBase__;$voice_spec_addr=$voice_spec;$ix=0;var $0=$ix;var $1=HEAP32[((__ZL13n_voices_list)>>2)];var $cmp3=((($0))|0)<((($1))|0);if($cmp3){__label__=1;;}else{__label__=4;;}
69140 $for_body$$for_end$2:do{if(__label__==1){while(1){var $2=$ix;var $arrayidx=((__ZL11voices_list+$2*4)&4294967295);var $3=HEAP32[(($arrayidx)>>2)];var $cmp1=((($3))|0)!=0;if($cmp1){__label__=2;;}else{__label__=3;;}
69141 if(__label__==2){var $4=$ix;var $arrayidx2=((__ZL11voices_list+$4*4)&4294967295);var $5=HEAP32[(($arrayidx2)>>2)];var $6=$5;;;}
69142 var $7=$ix;var $inc=((($7)+1)&4294967295);$ix=$inc;var $8=$ix;var $9=HEAP32[((__ZL13n_voices_list)>>2)];var $cmp=((($8))|0)<((($9))|0);if($cmp){__label__=1;continue;}else{__label__=4;break $for_body$$for_end$2;}}}}while(0);HEAP32[((__ZL13n_voices_list)>>2)]=0;var $arraydecay=(($path_voices)&4294967295);var $call=_sprintf($arraydecay,((__str72724)&4294967295),allocate([((_path_home)&4294967295),0,0,0,47,0,0,0],["i8*",0,0,0,"i32",0,0,0],ALLOC_STACK));var $arraydecay3=(($path_voices)&4294967295);var $call4=_strlen($arraydecay3);var $add=((($call4)+1)&4294967295);HEAP32[((__ZL15len_path_voices)>>2)]=$add;var $arraydecay5=(($path_voices)&4294967295);__ZL9GetVoicesPKc($arraydecay5);var $10=HEAP32[((__ZL13n_voices_list)>>2)];var $arrayidx6=((__ZL11voices_list+$10*4)&4294967295);HEAP32[(($arrayidx6)>>2)]=0;var $11=HEAP32[((__ZL13n_voices_list)>>2)];_qsort(__ZL11voices_list,$11,4,6);var $12=$voice_spec_addr;var $tobool=((($12))|0)!=0;if($tobool){__label__=5;;}else{__label__=6;;}
69143 if(__label__==5){var $13=$voice_spec_addr;var $call8=__ZL14SetVoiceScoresP12espeak_VOICEPS0_i($13,((__ZZ17espeak_ListVoicesE6voices)&4294967295),1);;}
69144 else if(__label__==6){$j=0;$ix=0;var $14=$ix;var $arrayidx101=((__ZL11voices_list+$14*4)&4294967295);var $15=HEAP32[(($arrayidx101)>>2)];$v=$15;var $cmp112=((($15))|0)!=0;if($cmp112){__label__=7;;}else{__label__=12;;}
69145 $for_body12$$for_end28$12:do{if(__label__==7){$for_body12$13:while(1){var $16=$v;var $languages=(($16+4)&4294967295);var $17=HEAP32[(($languages)>>2)];var $arrayidx13=(($17)&4294967295);var $18=HEAP8[($arrayidx13)];var $conv=(tempInt=(($18)),(tempInt>=128?tempInt-256:tempInt));var $cmp14=((($conv))|0)!=0;if($cmp14){__label__=8;;}else{__label__=11;;}
69146 $land_lhs_true$$for_inc26$15:do{if(__label__==8){var $19=$v;var $languages15=(($19+4)&4294967295);var $20=HEAP32[(($languages15)>>2)];var $arrayidx16=(($20+1)&4294967295);var $call17=_strcmp($arrayidx16,((__str55707)&4294967295));var $cmp18=((($call17))|0)!=0;if(!($cmp18)){__label__=11;break $land_lhs_true$$for_inc26$15;}
69147 var $21=$v;var $identifier=(($21+8)&4294967295);var $22=HEAP32[(($identifier)>>2)];var $call20=_memcmp($22,((__str73725)&4294967295),3);var $cmp21=((($call20))|0)!=0;if(!($cmp21)){__label__=11;break $land_lhs_true$$for_inc26$15;}
69148 var $23=$v;var $24=$j;var $inc23=((($24)+1)&4294967295);$j=$inc23;var $arrayidx24=((__ZZ17espeak_ListVoicesE6voices+$24*4)&4294967295);HEAP32[(($arrayidx24)>>2)]=$23;;}}while(0);var $25=$ix;var $inc27=((($25)+1)&4294967295);$ix=$inc27;var $26=$ix;var $arrayidx10=((__ZL11voices_list+$26*4)&4294967295);var $27=HEAP32[(($arrayidx10)>>2)];$v=$27;var $cmp11=((($27))|0)!=0;if($cmp11){__label__=7;continue $for_body12$13;}else{__label__=12;break $for_body12$$for_end28$12;}}}}while(0);var $28=$j;var $arrayidx29=((__ZZ17espeak_ListVoicesE6voices+$28*4)&4294967295);HEAP32[(($arrayidx29)>>2)]=0;;}
69149 STACKTOP=__stackBase__;return((__ZZ17espeak_ListVoicesE6voices)&4294967295);return null;}
69150 function __Z11SelectVoiceP12espeak_VOICEPi($voice_select,$found){var __stackBase__=STACKTOP;STACKTOP+=1272;_memset(__stackBase__,0,1272);var __label__;var $retval;var $voice_select_addr;var $found_addr;var $nv;var $ix;var $ix2;var $j;var $n_variants;var $variant_number;var $gender;var $skip;var $aged;var $variant_name;var $p;var $p_start;var $vp;var $vp2;var $voice_select2=__stackBase__;var $voices=__stackBase__+24;var $voices2=__stackBase__+624;$voice_select_addr=$voice_select;$found_addr=$found;$aged=1;$vp=0;var $0=$found_addr;HEAP32[(($0)>>2)]=1;var $1=$voice_select2;var $2=$voice_select_addr;var $3=$2;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$3;$dest$=$1;$stop$=$src$+24;if(($dest$%4)==($src$%4)&&24>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
69151 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
69152 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $4=HEAP32[((__ZL13n_voices_list)>>2)];var $cmp=((($4))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
69153 if(__label__==1){var $call=_espeak_ListVoices(0);;}
69154 var $languages=(($voice_select2+4)&4294967295);var $5=HEAP32[(($languages)>>2)];var $cmp1=((($5))|0)==0;if($cmp1){__label__=4;;}else{__label__=3;;}
69155 $if_then4$$lor_lhs_false$5:do{if(__label__==3){var $languages2=(($voice_select2+4)&4294967295);var $6=HEAP32[(($languages2)>>2)];var $arrayidx=(($6)&4294967295);var $7=HEAP8[($arrayidx)];var $conv=(tempInt=(($7)),(tempInt>=128?tempInt-256:tempInt));var $cmp3=((($conv))|0)==0;if($cmp3){__label__=4;break $if_then4$$lor_lhs_false$5;}else{__label__=14;break $if_then4$$lor_lhs_false$5;}}}while(0);$if_then4$$if_end41$7:do{if(__label__==4){var $name=(($voice_select2)&4294967295);var $8=HEAP32[(($name)>>2)];var $cmp5=((($8))|0)==0;if($cmp5){__label__=5;;}else{__label__=7;;}
69156 $if_then6$$if_end12$9:do{if(__label__==5){var $identifier=(($voice_select2+8)&4294967295);var $9=HEAP32[(($identifier)>>2)];var $name7=(($voice_select2)&4294967295);HEAP32[(($name7)>>2)]=$9;var $cmp8=((($9))|0)==0;if(!($cmp8)){__label__=7;break $if_then6$$if_end12$9;}
69157 var $name10=(($voice_select2)&4294967295);HEAP32[(($name10)>>2)]=((__str45697)&4294967295);;}}while(0);var $name13=(($voice_select2)&4294967295);var $10=HEAP32[(($name13)>>2)];__Z8strncpy0PcPKci(((__ZZ11SelectVoiceP12espeak_VOICEPiE3buf)&4294967295),$10,60);__ZL23ExtractVoiceVariantNamePci(((__ZZ11SelectVoiceP12espeak_VOICEPiE3buf)&4294967295),0);$variant_name=((__ZZL23ExtractVoiceVariantNamePciE12variant_name)&4294967295);var $call15=__Z17SelectVoiceByNamePP12espeak_VOICEPKc(((__ZL11voices_list)&4294967295),((__ZZ11SelectVoiceP12espeak_VOICEPiE3buf)&4294967295));$vp=$call15;var $cmp16=((($call15))|0)!=0;if(!($cmp16)){__label__=14;break $if_then4$$if_end41$7;}
69158 var $11=$vp;var $languages18=(($11+4)&4294967295);var $12=HEAP32[(($languages18)>>2)];var $arrayidx19=(($12+1)&4294967295);var $languages20=(($voice_select2+4)&4294967295);HEAP32[(($languages20)>>2)]=$arrayidx19;var $gender21=(($voice_select2+12)&4294967295);var $13=HEAPU8[($gender21)];var $conv22=((($13))&255);var $cmp23=((($conv22))|0)==0;if(!($cmp23)){__label__=14;break $if_then4$$if_end41$7;}
69159 var $age=(($voice_select2+13)&4294967295);var $14=HEAPU8[($age)];var $conv24=((($14))&255);var $cmp25=((($conv24))|0)==0;if(!($cmp25)){__label__=14;break $if_then4$$if_end41$7;}
69160 var $variant=(($voice_select2+14)&4294967295);var $15=HEAPU8[($variant)];var $conv27=((($15))&255);var $cmp28=((($conv27))|0)==0;if(!($cmp28)){__label__=14;break $if_then4$$if_end41$7;}
69161 var $16=$variant_name;var $arrayidx30=(($16)&4294967295);var $17=HEAP8[($arrayidx30)];var $conv31=(tempInt=(($17)),(tempInt>=128?tempInt-256:tempInt));var $cmp32=((($conv31))|0)!=0;var $18=$vp;var $identifier34=(($18+8)&4294967295);var $19=HEAP32[(($identifier34)>>2)];if($cmp32){__label__=12;;}else{__label__=13;;}
69162 if(__label__==12){var $20=$variant_name;var $arrayidx35=(($20+3)&4294967295);var $call36=_sprintf(((__ZZ11SelectVoiceP12espeak_VOICEPiE8voice_id)&4294967295),((__str71723)&4294967295),allocate([$19,0,0,0,$arrayidx35,0,0,0],["i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));$retval=((__ZZ11SelectVoiceP12espeak_VOICEPiE8voice_id)&4294967295);__label__=53;break $if_then4$$if_end41$7;}
69163 else if(__label__==13){$retval=$19;__label__=53;break $if_then4$$if_end41$7;}}}while(0);if(__label__==14){var $arraydecay=(($voices)&4294967295);var $call42=__ZL14SetVoiceScoresP12espeak_VOICEPS0_i($voice_select2,$arraydecay,0);$nv=$call42;var $cmp43=((($call42))|0)==0;if($cmp43){__label__=15;;}else{__label__=17;;}
69164 $if_then44$$if_end50$22:do{if(__label__==15){var $21=$found_addr;HEAP32[(($21)>>2)]=0;var $call45=__Z17SelectVoiceByNamePP12espeak_VOICEPKc(((__ZL11voices_list)&4294967295),((__str45697)&4294967295));var $arrayidx46=(($voices)&4294967295);HEAP32[(($arrayidx46)>>2)]=$call45;var $cmp47=((($call45))|0)!=0;if(!($cmp47)){__label__=17;break $if_then44$$if_end50$22;}
69165 $nv=1;;}}while(0);$gender=0;var $gender51=(($voice_select2+12)&4294967295);var $22=HEAPU8[($gender51)];var $conv52=((($22))&255);var $cmp53=((($conv52))|0)==2;if($cmp53){__label__=20;;}else{__label__=18;;}
69166 $if_then62$$lor_lhs_false54$26:do{if(__label__==18){var $age55=(($voice_select2+13)&4294967295);var $23=HEAPU8[($age55)];var $conv56=((($23))&255);var $cmp57=((($conv56))|0)>0;if($cmp57){__label__=19;;}else{__label__=21;;}
69167 if(__label__==19){var $age59=(($voice_select2+13)&4294967295);var $24=HEAPU8[($age59)];var $conv60=((($24))&255);var $cmp61=((($conv60))|0)<13;if($cmp61){__label__=20;break $if_then62$$lor_lhs_false54$26;}}
69168 var $gender63=(($voice_select2+12)&4294967295);var $25=HEAPU8[($gender63)];var $conv64=((($25))&255);var $cmp65=((($conv64))|0)==1;if(!($cmp65)){__label__=23;break $if_then62$$lor_lhs_false54$26;}
69169 $gender=1;__label__=23;break $if_then62$$lor_lhs_false54$26;}}while(0);if(__label__==20){$gender=2;;}
69170 var $age69=(($voice_select2+13)&4294967295);var $26=HEAPU8[($age69)];var $conv70=((($26))&255);var $cmp71=((($conv70))|0)<60;if($cmp71){__label__=24;;}else{__label__=25;;}
69171 $if_end73_thread$$if_end73$35:do{if(__label__==24){$aged=0;var $27=$gender;var $arrayidx742=((_variant_lists+$27*4)&4294967295);var $28=HEAP32[(($arrayidx742)>>2)];$p_start=$28;$p=$28;__label__=26;break $if_end73_thread$$if_end73$35;}
69172 else if(__label__==25){var $_pr=$aged;var $29=$gender;var $arrayidx74=((_variant_lists+$29*4)&4294967295);var $30=HEAP32[(($arrayidx74)>>2)];$p_start=$30;$p=$30;var $cmp75=((($_pr))|0)==0;if($cmp75){__label__=26;break $if_end73_thread$$if_end73$35;}else{__label__=27;break $if_end73_thread$$if_end73$35;}}}while(0);if(__label__==26){var $31=$p;var $incdec_ptr=(($31+1)&4294967295);$p=$incdec_ptr;;}
69173 $n_variants=0;$ix=0;$ix2=0;var $32=$ix;var $33=$nv;var $cmp786=((($32))|0)<((($33))|0);if($cmp786){__label__=28;;}else{__label__=44;;}
69174 $for_body$$while_cond$41:do{if(__label__==28){$for_body$42:while(1){var $34=$ix;var $arrayidx79=(($voices+$34*4)&4294967295);var $35=HEAP32[(($arrayidx79)>>2)];$vp=$35;$skip=0;var $36=$gender;var $cmp80=((($36))|0)!=0;if($cmp80){__label__=29;;}else{__label__=31;;}
69175 $land_lhs_true81$$if_end86$44:do{if(__label__==29){var $37=$vp;var $gender82=(($37+12)&4294967295);var $38=HEAPU8[($gender82)];var $conv83=((($38))&255);var $39=$gender;var $cmp84=((($conv83))|0)!=((($39))|0);if(!($cmp84)){__label__=31;break $land_lhs_true81$$if_end86$44;}
69176 $skip=1;;}}while(0);var $40=$ix2;var $cmp87=((($40))|0)==0;if($cmp87){__label__=32;;}else{__label__=35;;}
69177 $land_lhs_true88$$if_end94$48:do{if(__label__==32){var $41=$aged;var $tobool=((($41))|0)!=0;if(!($tobool)){__label__=35;break $land_lhs_true88$$if_end94$48;}
69178 var $42=$vp;var $age90=(($42+13)&4294967295);var $43=HEAPU8[($age90)];var $conv91=((($43))&255);var $cmp92=((($conv91))|0)<60;if(!($cmp92)){__label__=35;break $land_lhs_true88$$if_end94$48;}
69179 $skip=1;__label__=37;break $land_lhs_true88$$if_end94$48;}}while(0);$if_end98$$if_end94$52:do{if(__label__==35){var $_pr4=$skip;var $cmp95=((($_pr4))|0)==0;if(!($cmp95)){__label__=37;break $if_end98$$if_end94$52;}
69180 var $44=$vp;var $45=$ix2;var $inc=((($45)+1)&4294967295);$ix2=$inc;var $arrayidx97=(($voices2+$45*4)&4294967295);HEAP32[(($arrayidx97)>>2)]=$44;;}}while(0);$j=0;;while(1){var $46=$j;var $47=$vp;var $xx1=(($47+15)&4294967295);var $48=HEAPU8[($xx1)];var $conv100=((($48))&255);var $cmp101=((($46))|0)<((($conv100))|0);if(!($cmp101)){__label__=43;break;}
69181 var $49=$n_variants;var $cmp102=((($49))|0)<12;if(!($cmp102)){__label__=43;break;}
69182 var $50=$p;var $51=HEAP8[($50)];var $conv104=(tempInt=(($51)),(tempInt>=128?tempInt-256:tempInt));$variant_number=$conv104;var $cmp105=((($conv104))|0)==0;if($cmp105){__label__=41;;}else{__label__=42;;}
69183 if(__label__==41){var $52=$p_start;$p=$52;__label__=38;continue;}
69184 else if(__label__==42){var $53=$n_variants;var $inc108=((($53)+1)&4294967295);$n_variants=$inc108;var $arrayidx109=((__ZZ11SelectVoiceP12espeak_VOICEPiE14voice_variants+$53*24)&4294967295);$vp2=$arrayidx109;var $54=$vp2;var $55=$54;var $56=$vp;var $57=$56;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$57;$dest$=$55;$stop$=$src$+24;if(($dest$%4)==($src$%4)&&24>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
69185 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
69186 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $58=$variant_number;var $conv110=((($58))&255);var $59=$vp2;var $variant111=(($59+14)&4294967295);HEAP8[($variant111)]=$conv110;var $60=$vp2;var $61=$ix2;var $inc112=((($61)+1)&4294967295);$ix2=$inc112;var $arrayidx113=(($voices2+$61*4)&4294967295);HEAP32[(($arrayidx113)>>2)]=$60;var $62=$p;var $incdec_ptr114=(($62+1)&4294967295);$p=$incdec_ptr114;var $63=$j;var $inc115=((($63)+1)&4294967295);$j=$inc115;__label__=38;continue;}}
69187 var $64=$ix;var $inc116=((($64)+1)&4294967295);$ix=$inc116;var $65=$ix;var $66=$nv;var $cmp78=((($65))|0)<((($66))|0);if($cmp78){__label__=28;continue $for_body$42;}else{__label__=44;break $for_body$$while_cond$41;}}}}while(0);while(1){var $67=$vp;var $cmp118=((($67))|0)!=0;if(!($cmp118)){__label__=48;break;}
69188 var $68=$p;var $incdec_ptr120=(($68+1)&4294967295);$p=$incdec_ptr120;var $69=HEAP8[($68)];var $conv121=(tempInt=(($69)),(tempInt>=128?tempInt-256:tempInt));$variant_number=$conv121;var $cmp122=((($conv121))|0)!=0;if(!($cmp122)){__label__=48;break;}
69189 var $70=$n_variants;var $cmp124=((($70))|0)<12;if(!($cmp124)){__label__=48;break;}
69190 var $71=$n_variants;var $inc126=((($71)+1)&4294967295);$n_variants=$inc126;var $arrayidx127=((__ZZ11SelectVoiceP12espeak_VOICEPiE14voice_variants+$71*24)&4294967295);$vp2=$arrayidx127;var $72=$vp2;var $73=$72;var $74=$vp;var $75=$74;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$75;$dest$=$73;$stop$=$src$+24;if(($dest$%4)==($src$%4)&&24>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
69191 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
69192 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $76=$variant_number;var $conv128=((($76))&255);var $77=$vp2;var $variant129=(($77+14)&4294967295);HEAP8[($variant129)]=$conv128;var $78=$vp2;var $79=$ix2;var $inc130=((($79)+1)&4294967295);$ix2=$inc130;var $arrayidx131=(($voices2+$79*4)&4294967295);HEAP32[(($arrayidx131)>>2)]=$78;__label__=44;continue;}
69193 var $80=$ix2;var $cmp132=((($80))|0)==0;if($cmp132){__label__=49;;}else{__label__=50;;}
69194 if(__label__==49){$retval=0;;}
69195 else if(__label__==50){var $variant135=(($voice_select2+14)&4294967295);var $81=HEAPU8[($variant135)];var $conv136=((($81))&255);var $82=$ix2;var $rem=((($conv136))|0)%((($82))|0);var $arrayidx137=(($voices2+$rem*4)&4294967295);var $83=HEAP32[(($arrayidx137)>>2)];$vp=$83;var $84=$vp;var $variant138=(($84+14)&4294967295);var $85=HEAPU8[($variant138)];var $conv139=((($85))&255);var $cmp140=((($conv139))|0)!=0;var $86=$vp;if($cmp140){__label__=51;;}else{__label__=52;;}
69196 if(__label__==51){var $variant142=(($86+14)&4294967295);var $87=HEAPU8[($variant142)];var $conv143=((($87))&255);__ZL23ExtractVoiceVariantNamePci(0,$conv143);$variant_name=((__ZZL23ExtractVoiceVariantNamePciE12variant_name)&4294967295);var $88=$vp;var $identifier145=(($88+8)&4294967295);var $89=HEAP32[(($identifier145)>>2)];var $90=$variant_name;var $arrayidx146=(($90+3)&4294967295);var $call147=_sprintf(((__ZZ11SelectVoiceP12espeak_VOICEPiE8voice_id)&4294967295),((__str71723)&4294967295),allocate([$89,0,0,0,$arrayidx146,0,0,0],["i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));$retval=((__ZZ11SelectVoiceP12espeak_VOICEPiE8voice_id)&4294967295);;}
69197 else if(__label__==52){var $identifier149=(($86+8)&4294967295);var $91=HEAP32[(($identifier149)>>2)];$retval=$91;;}}}
69198 var $92=$retval;STACKTOP=__stackBase__;return $92;return null;}
69199 function __ZL14SetVoiceScoresP12espeak_VOICEPS0_i($voice_select,$voices,$control){var __stackBase__=STACKTOP;STACKTOP+=80;_memset(__stackBase__,0,80);var __label__;var $retval;var $voice_select_addr;var $voices_addr;var $control_addr;var $ix;var $score;var $nv;var $n_parts;var $lang_len;var $vp;var $language=__stackBase__;$voice_select_addr=$voice_select;$voices_addr=$voices;$control_addr=$control;$n_parts=0;$lang_len=0;var $0=$voice_select_addr;var $languages=(($0+4)&4294967295);var $1=HEAP32[(($languages)>>2)];var $cmp=((($1))|0)!=0;if($cmp){__label__=1;;}else{__label__=6;;}
69200 $land_lhs_true$$if_end16$2:do{if(__label__==1){var $2=$voice_select_addr;var $languages1=(($2+4)&4294967295);var $3=HEAP32[(($languages1)>>2)];var $arrayidx=(($3)&4294967295);var $4=HEAP8[($arrayidx)];var $conv=(tempInt=(($4)),(tempInt>=128?tempInt-256:tempInt));var $cmp2=((($conv))|0)!=0;if(!($cmp2)){__label__=6;break $land_lhs_true$$if_end16$2;}
69201 $n_parts=1;var $5=$voice_select_addr;var $languages3=(($5+4)&4294967295);var $6=HEAP32[(($languages3)>>2)];var $call=_strlen($6);$lang_len=$call;$ix=0;var $7=$ix;var $8=$lang_len;var $cmp42=((($7))|0)<=((($8))|0);var $9=$ix;var $cmp53=((($9))>>>0)<80;var $or_cond4=($cmp42)&($cmp53);if(!($or_cond4)){__label__=6;break $land_lhs_true$$if_end16$2;}
69202 while(1){var $10=$ix;var $11=$voice_select_addr;var $languages6=(($11+4)&4294967295);var $12=HEAP32[(($languages6)>>2)];var $arrayidx7=(($12+$10)&4294967295);var $13=HEAP8[($arrayidx7)];var $conv8=(tempInt=(($13)),(tempInt>=128?tempInt-256:tempInt));var $call9=_tolower($conv8);var $conv10=((($call9))&255);var $14=$ix;var $arrayidx11=(($language+$14)&4294967295);HEAP8[($arrayidx11)]=$conv10;var $conv12=(tempInt=(($conv10)),(tempInt>=128?tempInt-256:tempInt));var $cmp13=((($conv12))|0)==45;if($cmp13){__label__=4;;}else{__label__=5;;}
69203 if(__label__==4){var $15=$n_parts;var $inc=((($15)+1)&4294967295);$n_parts=$inc;;}
69204 var $16=$ix;var $inc15=((($16)+1)&4294967295);$ix=$inc15;var $17=$ix;var $18=$lang_len;var $cmp4=((($17))|0)<=((($18))|0);var $19=$ix;var $cmp5=((($19))>>>0)<80;var $or_cond=($cmp4)&($cmp5);if($or_cond){__label__=3;continue;}else{__label__=6;break $land_lhs_true$$if_end16$2;}}}}while(0);$nv=0;$ix=0;var $20=$ix;var $21=HEAP32[((__ZL13n_voices_list)>>2)];var $cmp181=((($20))|0)<((($21))|0);if($cmp181){__label__=7;;}else{__label__=13;;}
69205 $for_body19_lr_ph$$for_end37$11:do{if(__label__==7){var $arraydecay=(($language)&4294967295);;$for_body19$13:while(1){var $22=$ix;var $arrayidx20=((__ZL11voices_list+$22*4)&4294967295);var $23=HEAP32[(($arrayidx20)>>2)];$vp=$23;var $24=$control_addr;var $and=($24)&1;var $cmp21=((($and))|0)==0;if($cmp21){__label__=9;;}else{__label__=10;;}
69206 $land_lhs_true22$$if_end26$15:do{if(__label__==9){var $25=$vp;var $identifier=(($25+8)&4294967295);var $26=HEAP32[(($identifier)>>2)];var $call23=_memcmp($26,((__str73725)&4294967295),3);var $cmp24=((($call23))|0)==0;if($cmp24){__label__=12;break $land_lhs_true22$$if_end26$15;}else{__label__=10;break $land_lhs_true22$$if_end26$15;}}}while(0);$for_inc35$$if_end26$17:do{if(__label__==10){var $27=$voice_select_addr;var $28=$n_parts;var $29=$lang_len;var $30=$ix;var $arrayidx27=((__ZL11voices_list+$30*4)&4294967295);var $31=HEAP32[(($arrayidx27)>>2)];var $call28=__ZL10ScoreVoiceP12espeak_VOICEPKciiS0_($27,$arraydecay,$28,$29,$31);$score=$call28;var $cmp29=((($call28))|0)>0;if(!($cmp29)){__label__=12;break $for_inc35$$if_end26$17;}
69207 var $32=$vp;var $33=$nv;var $inc31=((($33)+1)&4294967295);$nv=$inc31;var $34=$voices_addr;var $arrayidx32=(($34+4*$33)&4294967295);HEAP32[(($arrayidx32)>>2)]=$32;var $35=$score;var $36=$vp;var $score33=(($36+16)&4294967295);HEAP32[(($score33)>>2)]=$35;;}}while(0);var $37=$ix;var $inc36=((($37)+1)&4294967295);$ix=$inc36;var $38=$ix;var $39=HEAP32[((__ZL13n_voices_list)>>2)];var $cmp18=((($38))|0)<((($39))|0);if($cmp18){__label__=8;continue $for_body19$13;}else{__label__=13;break $for_body19_lr_ph$$for_end37$11;}}}}while(0);var $40=$nv;var $41=$voices_addr;var $arrayidx38=(($41+4*$40)&4294967295);HEAP32[(($arrayidx38)>>2)]=0;var $42=$nv;var $cmp39=((($42))|0)==0;if($cmp39){__label__=14;;}else{__label__=15;;}
69208 if(__label__==14){$retval=0;;}
69209 else if(__label__==15){var $43=$voices_addr;var $44=$43;var $45=$nv;_qsort($44,$45,4,8);var $46=$nv;$retval=$46;;}
69210 var $47=$retval;STACKTOP=__stackBase__;return $47;return null;}
69211 function __Z14SetVoiceByNamePKc($name){var __stackBase__=STACKTOP;STACKTOP+=24;_memset(__stackBase__,0,24);var __label__;var $retval;var $name_addr;var $v;var $voice_selector=__stackBase__;var $variant_name;$name_addr=$name;var $0=$name_addr;__Z8strncpy0PcPKci(((__ZZ14SetVoiceByNamePKcE3buf)&4294967295),$0,60);__ZL23ExtractVoiceVariantNamePci(((__ZZ14SetVoiceByNamePKcE3buf)&4294967295),0);$variant_name=((__ZZL23ExtractVoiceVariantNamePciE12variant_name)&4294967295);var $1=$voice_selector;var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=$1;$stop$=$dest$+24;$value4$=0;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=0;}
69212 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
69213 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=0;};var $2=$name_addr;var $name1=(($voice_selector)&4294967295);HEAP32[(($name1)>>2)]=$2;var $call2=__Z9LoadVoicePKci(((__ZZ14SetVoiceByNamePKcE3buf)&4294967295),1);var $cmp=((($call2))|0)!=0;if($cmp){__label__=1;;}else{__label__=4;;}
69214 $if_then$$if_end6$2:do{if(__label__==1){var $3=$variant_name;var $arrayidx=(($3)&4294967295);var $4=HEAP8[($arrayidx)];var $conv=(tempInt=(($4)),(tempInt>=128?tempInt-256:tempInt));var $cmp3=((($conv))|0)!=0;if($cmp3){__label__=2;;}else{__label__=3;;}
69215 if(__label__==2){var $5=$variant_name;var $call5=__Z9LoadVoicePKci($5,2);;}
69216 var $6=HEAP32[((_voice)>>2)];__Z13DoVoiceChangeP7voice_t($6);__Z13SetVoiceStackP12espeak_VOICE($voice_selector);$retval=0;;}
69217 else if(__label__==4){var $7=HEAP32[((__ZL13n_voices_list)>>2)];var $cmp7=((($7))|0)==0;if($cmp7){__label__=5;;}else{__label__=6;;}
69218 if(__label__==5){var $call9=_espeak_ListVoices(0);;}
69219 var $call11=__Z17SelectVoiceByNamePP12espeak_VOICEPKc(((__ZL11voices_list)&4294967295),((__ZZ14SetVoiceByNamePKcE3buf)&4294967295));$v=$call11;var $cmp12=((($call11))|0)!=0;if($cmp12){__label__=7;;}else{__label__=11;;}
69220 $if_then13$$if_end24$11:do{if(__label__==7){var $8=$v;var $identifier=(($8+8)&4294967295);var $9=HEAP32[(($identifier)>>2)];var $call14=__Z9LoadVoicePKci($9,0);var $cmp15=((($call14))|0)!=0;if(!($cmp15)){__label__=11;break $if_then13$$if_end24$11;}
69221 var $10=$variant_name;var $arrayidx17=(($10)&4294967295);var $11=HEAP8[($arrayidx17)];var $conv18=(tempInt=(($11)),(tempInt>=128?tempInt-256:tempInt));var $cmp19=((($conv18))|0)!=0;if($cmp19){__label__=9;;}else{__label__=10;;}
69222 if(__label__==9){var $12=$variant_name;var $call21=__Z9LoadVoicePKci($12,2);;}
69223 var $13=HEAP32[((_voice)>>2)];__Z13DoVoiceChangeP7voice_t($13);__Z13SetVoiceStackP12espeak_VOICE($voice_selector);$retval=0;__label__=12;break $if_then$$if_end6$2;}}while(0);$retval=-1;;}}while(0);var $14=$retval;STACKTOP=__stackBase__;return $14;return null;}
69224 function __Z20SetVoiceByPropertiesP12espeak_VOICE($voice_selector){var __stackBase__=STACKTOP;STACKTOP+=4;_memset(__stackBase__,0,4);var __label__;var $retval;var $voice_selector_addr;var $voice_id;var $voice_found=__stackBase__;$voice_selector_addr=$voice_selector;var $0=$voice_selector_addr;var $call=__Z11SelectVoiceP12espeak_VOICEPi($0,$voice_found);$voice_id=$call;var $1=HEAP32[(($voice_found)>>2)];var $cmp=((($1))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
69225 if(__label__==1){$retval=2;;}
69226 else if(__label__==2){var $2=$voice_id;var $call1=__Z16LoadVoiceVariantPKci($2,0);var $3=HEAP32[((_voice)>>2)];__Z13DoVoiceChangeP7voice_t($3);var $4=$voice_selector_addr;__Z13SetVoiceStackP12espeak_VOICE($4);$retval=0;;}
69227 var $5=$retval;STACKTOP=__stackBase__;return $5;return null;}
69228 function __ZL9GetVoicesPKc($path){var __stackBase__=STACKTOP;STACKTOP+=252;_memset(__stackBase__,0,252);var __label__;var __lastLabel__=null;var $path_addr;var $f_voice;var $voice_data;var $ftype;var $fname=__stackBase__;var $dir;var $ent;$path_addr=$path;var $0=$path_addr;var $call=_opendir($0);$dir=$call;var $cmp=((($call))|0)==0;if($cmp){__label__=13;;}else{__label__=1;;}
69229 if(__label__==1){var $1=$dir;var $call11=_readdir($1);$ent=$call11;var $cmp22=((($call11))|0)==0;var $2=HEAP32[((__ZL13n_voices_list)>>2)];var $cmp33=((($2))|0)>=148;var $or_cond4=($cmp22)|($cmp33);if($or_cond4){__label__=12;;}else{__label__=2;;}
69230 $while_end$$if_end5_lr_ph$4:do{if(__label__==2){var $arraydecay=(($fname)&4294967295);var $arraydecay8=(($fname)&4294967295);var $arraydecay14=(($fname)&4294967295);var $arraydecay17=(($fname)&4294967295);var $arraydecay22=(($fname)&4294967295);;$if_end5$6:while(1){var $3=$path_addr;var $4=$ent;var $d_name=(($4+4)&4294967295);var $arraydecay6=(($d_name)&4294967295);var $call7=_sprintf($arraydecay,((__str74726)&4294967295),allocate([$3,0,0,0,47,0,0,0,$arraydecay6,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0],ALLOC_STACK));var $call9=__Z13GetFileLengthPKc($arraydecay8);$ftype=$call9;var $cmp10=((($call9))|0)==-2;if($cmp10){__lastLabel__=3;__label__=4;;}else{__lastLabel__=3;__label__=7;;}
69231 $land_lhs_true$$if_else$8:do{if(__label__==4){var $5=$ent;var $d_name11=(($5+4)&4294967295);var $arrayidx=(($d_name11)&4294967295);var $6=HEAP8[($arrayidx)];var $conv=(tempInt=(($6)),(tempInt>=128?tempInt-256:tempInt));var $cmp12=((($conv))|0)!=46;if($cmp12){__label__=5;;}else{__label__=6;;}
69232 if(__label__==5){__ZL9GetVoicesPKc($arraydecay14);__label__=9;break $land_lhs_true$$if_else$8;}
69233 else if(__label__==6){var $_pr=$ftype;__lastLabel__=6;__label__=7;break $land_lhs_true$$if_else$8;}}}while(0);$while_cond_backedge$$if_else$13:do{if(__label__==7){var $7=__lastLabel__==6?$_pr:($call9);var $cmp15=((($7))|0)>0;if(!($cmp15)){__label__=9;break $while_cond_backedge$$if_else$13;}
69234 var $call18=_fopen($arraydecay17,((__str51703)&4294967295));$f_voice=$call18;var $cmp19=((($call18))|0)==0;if($cmp19){__label__=9;break $while_cond_backedge$$if_else$13;}
69235 var $10=$f_voice;var $11=HEAP32[((__ZL15len_path_voices)>>2)];var $add_ptr=(($arraydecay22+$11)&4294967295);var $12=$ent;var $d_name23=(($12+4)&4294967295);var $arraydecay24=(($d_name23)&4294967295);var $call25=__ZL13ReadVoiceFileP7__sFILEPKcS2_($10,$add_ptr,$arraydecay24);$voice_data=$call25;var $13=$f_voice;var $call26=_fclose($13);var $14=$voice_data;var $cmp27=((($14))|0)!=0;if(!($cmp27)){__label__=9;break $while_cond_backedge$$if_else$13;}
69236 var $15=$voice_data;var $16=HEAP32[((__ZL13n_voices_list)>>2)];var $inc=((($16)+1)&4294967295);HEAP32[((__ZL13n_voices_list)>>2)]=$inc;var $arrayidx29=((__ZL11voices_list+$16*4)&4294967295);HEAP32[(($arrayidx29)>>2)]=$15;;}}while(0);var $8=$dir;var $call1=_readdir($8);$ent=$call1;var $cmp2=((($call1))|0)==0;var $9=HEAP32[((__ZL13n_voices_list)>>2)];var $cmp3=((($9))|0)>=148;var $or_cond=($cmp2)|($cmp3);if($or_cond){__label__=12;break $while_end$$if_end5_lr_ph$4;}else{__label__=3;continue $if_end5$6;}}}}while(0);var $17=$dir;var $call33=_closedir($17);;}
69237 STACKTOP=__stackBase__;return;return;}
69238 function __ZL15VoiceNameSorterPKvS0_($p1,$p2){;var __label__;var $retval;var $p1_addr;var $p2_addr;var $ix;var $v1;var $v2;$p1_addr=$p1;$p2_addr=$p2;var $0=$p1_addr;var $1=$0;var $2=HEAP32[(($1)>>2)];$v1=$2;var $3=$p2_addr;var $4=$3;var $5=HEAP32[(($4)>>2)];$v2=$5;var $6=$v1;var $languages=(($6+4)&4294967295);var $7=HEAP32[(($languages)>>2)];var $arrayidx=(($7+1)&4294967295);var $8=$v2;var $languages1=(($8+4)&4294967295);var $9=HEAP32[(($languages1)>>2)];var $arrayidx2=(($9+1)&4294967295);var $call=_strcmp($arrayidx,$arrayidx2);$ix=$call;var $cmp=((($call))|0)!=0;if($cmp){__label__=1;;}else{__label__=2;;}
69239 if(__label__==1){var $10=$ix;$retval=$10;;}
69240 else if(__label__==2){var $11=$v1;var $languages3=(($11+4)&4294967295);var $12=HEAP32[(($languages3)>>2)];var $arrayidx4=(($12)&4294967295);var $13=HEAP8[($arrayidx4)];var $conv=(tempInt=(($13)),(tempInt>=128?tempInt-256:tempInt));var $14=$v2;var $languages5=(($14+4)&4294967295);var $15=HEAP32[(($languages5)>>2)];var $arrayidx6=(($15)&4294967295);var $16=HEAP8[($arrayidx6)];var $conv7=(tempInt=(($16)),(tempInt>=128?tempInt-256:tempInt));var $sub=((($conv)-($conv7))&4294967295);$ix=$sub;var $cmp8=((($sub))|0)!=0;if($cmp8){__label__=3;;}else{__label__=4;;}
69241 if(__label__==3){var $17=$ix;$retval=$17;;}
69242 else if(__label__==4){var $18=$v1;var $name=(($18)&4294967295);var $19=HEAP32[(($name)>>2)];var $20=$v2;var $name11=(($20)&4294967295);var $21=HEAP32[(($name11)>>2)];var $call12=_strcmp($19,$21);$retval=$call12;;}}
69243 var $22=$retval;;return $22;return null;}
69244 function _espeak_GetCurrentVoice(){;var __label__;;return _voice_selected;return null;}
69245 function __ZL13ReadVoiceFileP7__sFILEPKcS2_($f_in,$fname,$leafname){var __stackBase__=STACKTOP;STACKTOP+=672;_memset(__stackBase__,0,672);var __label__;var $retval;var $f_in_addr;var $fname_addr;var $leafname_addr;var $linebuf=__stackBase__;var $vname=__stackBase__+120;var $vgender=__stackBase__+200;var $vlanguage=__stackBase__+280;var $languages=__stackBase__+360;var $len;var $langix;var $n_languages;var $p;var $voice_data;var $priority=__stackBase__+660;var $age=__stackBase__+664;var $n_variants=__stackBase__+668;var $gender;$f_in_addr=$f_in;$fname_addr=$fname;$leafname_addr=$leafname;$langix=0;$n_languages=0;HEAP32[(($n_variants)>>2)]=3;var $arrayidx=(($vname)&4294967295);HEAP8[($arrayidx)]=0;var $arrayidx1=(($vgender)&4294967295);HEAP8[($arrayidx1)]=0;HEAP32[(($age)>>2)]=0;var $arraydecay=(($linebuf)&4294967295);var $0=$f_in_addr;var $call4=__ZL11fgets_stripPciP7__sFILE($arraydecay,120,$0);var $cmp5=((($call4))|0)!=0;if($cmp5){__label__=1;;}else{__label__=14;;}
69246 $while_body_lr_ph$$while_end49$2:do{if(__label__==1){var $arraydecay2=(($linebuf)&4294967295);var $arrayidx5=(($linebuf+4)&4294967295);var $arraydecay9=(($vname)&4294967295);var $arraydecay10=(($linebuf)&4294967295);var $arrayidx14=(($vlanguage)&4294967295);var $arrayidx15=(($linebuf+8)&4294967295);var $arraydecay16=(($vlanguage)&4294967295);var $arraydecay18=(($vlanguage)&4294967295);var $arraydecay27=(($vlanguage)&4294967295);var $arraydecay31=(($linebuf)&4294967295);var $arrayidx35=(($linebuf+6)&4294967295);var $arraydecay36=(($vgender)&4294967295);var $arraydecay39=(($linebuf)&4294967295);var $arrayidx43=(($linebuf+8)&4294967295);;$while_body$4:while(1){var $call3=_memcmp($arraydecay2,((__str5655)&4294967295),4);var $cmp4=((($call3))|0)==0;if($cmp4){__label__=3;;}else{__label__=6;;}
69247 $if_then$$if_else$6:do{if(__label__==3){$p=$arrayidx5;var $1=$p;var $2=HEAP8[($1)];var $conv1=(tempInt=(($2)),(tempInt>=128?tempInt-256:tempInt));var $call72=_isspace($conv1);var $tobool3=((($call72))|0)!=0;if($tobool3){__label__=4;;}else{__label__=5;;}
69248 $while_body8$$while_end$8:do{if(__label__==4){while(1){var $3=$p;var $incdec_ptr=(($3+1)&4294967295);$p=$incdec_ptr;var $4=$p;var $5=HEAP8[($4)];var $conv=(tempInt=(($5)),(tempInt>=128?tempInt-256:tempInt));var $call7=_isspace($conv);var $tobool=((($call7))|0)!=0;if($tobool){__label__=4;continue;}else{__label__=5;break $while_body8$$while_end$8;}}}}while(0);var $6=$p;__Z8strncpy0PcPKci($arraydecay9,$6,80);;}
69249 else if(__label__==6){var $call11=_memcmp($arraydecay10,((__str6656)&4294967295),8);var $cmp12=((($call11))|0)==0;if($cmp12){__label__=7;;}else{__label__=10;;}
69250 if(__label__==7){HEAP32[(($priority)>>2)]=5;HEAP8[($arrayidx14)]=0;var $call17=_sscanf($arrayidx15,((__str54706)&4294967295),allocate([$arraydecay16,0,0,0,$priority,0,0,0],["i8*",0,0,0,"i32*",0,0,0],ALLOC_STACK));var $call19=_strlen($arraydecay18);var $add=((($call19)+2)&4294967295);$len=$add;var $7=$len;var $8=$langix;var $_neg=(((-($8)))&4294967295);var $sub20=((($_neg)+299)&4294967295);var $cmp21=((($7))>>>0)<((($sub20))>>>0);if(!($cmp21)){__label__=9;break $if_then$$if_else$6;}
69251 var $9=HEAP32[(($priority)>>2)];var $conv23=((($9))&255);var $10=$langix;var $arrayidx24=(($languages+$10)&4294967295);HEAP8[($arrayidx24)]=$conv23;var $11=$langix;var $add25=((($11)+1)&4294967295);var $arrayidx26=(($languages+$add25)&4294967295);var $call28=_strcpy($arrayidx26,$arraydecay27);var $12=$len;var $13=$langix;var $add29=((($13)+($12))&4294967295);$langix=$add29;var $14=$n_languages;var $inc=((($14)+1)&4294967295);$n_languages=$inc;;}
69252 else if(__label__==10){var $call32=_memcmp($arraydecay31,((__str7657)&4294967295),6);var $cmp33=((($call32))|0)==0;if($cmp33){__label__=11;;}else{__label__=12;;}
69253 if(__label__==11){var $call37=_sscanf($arrayidx35,((__str54706)&4294967295),allocate([$arraydecay36,0,0,0,$age,0,0,0],["i8*",0,0,0,"i32*",0,0,0],ALLOC_STACK));;}
69254 else if(__label__==12){var $call40=_memcmp($arraydecay39,((__str75727)&4294967295),8);var $cmp41=((($call40))|0)==0;if(!($cmp41)){__label__=9;break $if_then$$if_else$6;}
69255 var $call44=_sscanf($arrayidx43,((__str63715)&4294967295),allocate([$n_variants,0,0,0],["i32*",0,0,0],ALLOC_STACK));;}}}}while(0);var $15=$f_in_addr;var $call=__ZL11fgets_stripPciP7__sFILE($arraydecay,120,$15);var $cmp=((($call))|0)!=0;if($cmp){__label__=2;continue $while_body$4;}else{__label__=14;break $while_body_lr_ph$$while_end49$2;}}}}while(0);var $16=$langix;var $inc50=((($16)+1)&4294967295);$langix=$inc50;var $arrayidx51=(($languages+$16)&4294967295);HEAP8[($arrayidx51)]=0;var $arraydecay52=(($vgender)&4294967295);var $call53=__Z10LookupMnemP8MNEM_TABPKc(((_genders)&4294967295),$arraydecay52);$gender=$call53;var $17=$n_languages;var $cmp54=((($17))|0)==0;if($cmp54){__label__=15;;}else{__label__=16;;}
69256 if(__label__==15){$retval=0;;}
69257 else if(__label__==16){var $18=$langix;var $19=$fname_addr;var $call58=_strlen($19);var $arraydecay60=(($vname)&4294967295);var $call61=_strlen($arraydecay60);var $add59=((($18)+27)&4294967295);var $add62=((($add59)+($call58))&4294967295);var $add63=((($add62)+($call61))&4294967295);var $call64=_calloc($add63,1);$p=$call64;var $20=$p;var $21=$20;$voice_data=$21;var $22=$p;var $arrayidx65=(($22+24)&4294967295);$p=$arrayidx65;var $23=$p;var $arraydecay66=(($languages)&4294967295);var $24=$langix;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$arraydecay66;$dest$=$23;$stop$=$src$+$24;if(($dest$%4)==($src$%4)&&$24>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
69258 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
69259 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $25=$p;var $26=$voice_data;var $languages67=(($26+4)&4294967295);HEAP32[(($languages67)>>2)]=$25;var $27=$langix;var $28=$p;var $arrayidx68=(($28+$27)&4294967295);var $29=$fname_addr;var $call69=_strcpy($arrayidx68,$29);var $30=$langix;var $31=$p;var $arrayidx70=(($31+$30)&4294967295);var $32=$voice_data;var $identifier=(($32+8)&4294967295);HEAP32[(($identifier)>>2)]=$arrayidx70;var $33=$langix;var $34=$p;var $arrayidx71=(($34+$33)&4294967295);var $35=$voice_data;var $name=(($35)&4294967295);HEAP32[(($name)>>2)]=$arrayidx71;var $arrayidx72=(($vname)&4294967295);var $36=HEAP8[($arrayidx72)];var $conv73=(tempInt=(($36)),(tempInt>=128?tempInt-256:tempInt));var $cmp74=((($conv73))|0)!=0;if($cmp74){__label__=17;;}else{__label__=18;;}
69260 if(__label__==17){var $37=$fname_addr;var $call76=_strlen($37);var $38=$langix;var $add77=((($call76)+1)&4294967295);var $add78=((($add77)+($38))&4294967295);$langix=$add78;var $39=$langix;var $40=$p;var $arrayidx79=(($40+$39)&4294967295);var $arraydecay80=(($vname)&4294967295);var $call81=_strcpy($arrayidx79,$arraydecay80);var $41=$langix;var $42=$p;var $arrayidx82=(($42+$41)&4294967295);var $43=$voice_data;var $name83=(($43)&4294967295);HEAP32[(($name83)>>2)]=$arrayidx82;;}
69261 var $44=HEAP32[(($age)>>2)];var $conv85=((($44))&255);var $45=$voice_data;var $age86=(($45+13)&4294967295);HEAP8[($age86)]=$conv85;var $46=$gender;var $conv87=((($46))&255);var $47=$voice_data;var $gender88=(($47+12)&4294967295);HEAP8[($gender88)]=$conv87;var $48=$voice_data;var $variant=(($48+14)&4294967295);HEAP8[($variant)]=0;var $49=HEAP32[(($n_variants)>>2)];var $conv89=((($49))&255);var $50=$voice_data;var $xx1=(($50+15)&4294967295);HEAP8[($xx1)]=$conv89;var $51=$voice_data;$retval=$51;;}
69262 var $52=$retval;STACKTOP=__stackBase__;return $52;return null;}
69263 function __ZL10ScoreVoiceP12espeak_VOICEPKciiS0_($voice_spec,$spec_language,$spec_n_parts,$spec_lang_len,$voice){;var __label__;var __lastLabel__=null;var $retval;var $voice_spec_addr;var $spec_language_addr;var $spec_n_parts_addr;var $spec_lang_len_addr;var $voice_addr;var $ix;var $p;var $c1;var $c2;var $language_priority;var $n_parts;var $matching;var $matching_parts;var $score;var $x;var $ratio;var $required_age;var $diff;$voice_spec_addr=$voice_spec;$spec_language_addr=$spec_language;$spec_n_parts_addr=$spec_n_parts;$spec_lang_len_addr=$spec_lang_len;$voice_addr=$voice;$score=0;var $0=$voice_addr;var $languages=(($0+4)&4294967295);var $1=HEAP32[(($languages)>>2)];$p=$1;var $2=$spec_language_addr;var $call=_strcmp($2,((__str33683)&4294967295));var $cmp=((($call))|0)==0;if($cmp){__label__=1;;}else{__label__=4;;}
69264 $if_then$$if_end4$2:do{if(__label__==1){var $3=$voice_addr;var $identifier=(($3+8)&4294967295);var $4=HEAP32[(($identifier)>>2)];var $call1=_memcmp($4,((__str73725)&4294967295),3);var $cmp2=((($call1))|0)==0;if($cmp2){__label__=2;;}else{__label__=3;;}
69265 if(__label__==2){$retval=100;;}
69266 else if(__label__==3){$retval=0;;}}
69267 else if(__label__==4){var $5=$spec_n_parts_addr;var $cmp5=((($5))|0)==0;if($cmp5){__label__=5;;}else{__label__=6;;}
69268 $if_end60_thread$$if_else$8:do{if(__label__==5){$score=100;;}
69269 else if(__label__==6){var $6=$p;var $7=HEAP8[($6)];var $conv=(tempInt=(($7)),(tempInt>=128?tempInt-256:tempInt));var $cmp7=((($conv))|0)==0;if($cmp7){__label__=7;;}else{__label__=9;;}
69270 $land_lhs_true$$while_cond_preheader$11:do{if(__label__==7){var $8=$spec_language_addr;var $call8=_strcmp($8,((__str75727)&4294967295));var $cmp9=((($call8))|0)==0;if(!($cmp9)){__label__=9;break $land_lhs_true$$while_cond_preheader$11;}
69271 $score=100;;}}while(0);var $9=$p;var $10=HEAP8[($9)];var $conv123=(tempInt=(($10)),(tempInt>=128?tempInt-256:tempInt));var $cmp134=((($conv123))|0)!=0;if($cmp134){__label__=10;;}else{__label__=31;;}
69272 $while_body$$if_end60$15:do{if(__label__==10){$while_body$16:while(1){var $11=$p;var $incdec_ptr=(($11+1)&4294967295);$p=$incdec_ptr;var $12=HEAP8[($11)];var $conv14=(tempInt=(($12)),(tempInt>=128?tempInt-256:tempInt));$language_priority=$conv14;$matching=1;$matching_parts=0;$n_parts=1;$ix=0;;$for_cond$18:while(1){var $13=$ix;var $14=$spec_lang_len_addr;var $cmp15=((($13))|0)>=((($14))|0);if($cmp15){__label__=13;;}else{__label__=12;;}
69273 $if_then18$$lor_lhs_false$20:do{if(__label__==12){var $15=$ix;var $16=$spec_language_addr;var $arrayidx=(($16+$15)&4294967295);var $17=HEAP8[($arrayidx)];var $conv16=(tempInt=(($17)),(tempInt>=128?tempInt-256:tempInt));$c1=$conv16;var $cmp17=((($conv16))|0)==45;if($cmp17){__label__=13;break $if_then18$$lor_lhs_false$20;}else{__label__=14;break $if_then18$$lor_lhs_false$20;}}}while(0);if(__label__==13){$c1=0;;}
69274 var $18=$ix;var $19=$p;var $arrayidx20=(($19+$18)&4294967295);var $20=HEAP8[($arrayidx20)];var $conv21=(tempInt=(($20)),(tempInt>=128?tempInt-256:tempInt));$c2=$conv21;var $cmp22=((($conv21))|0)==45;if($cmp22){__label__=15;;}else{__label__=16;;}
69275 if(__label__==15){$c2=0;;}
69276 var $21=$c1;var $22=$c2;var $cmp25=((($21))|0)!=((($22))|0);if($cmp25){__label__=17;;}else{__label__=18;;}
69277 if(__label__==17){$matching=0;;}
69278 var $23=$ix;var $24=$p;var $arrayidx28=(($24+$23)&4294967295);var $25=HEAP8[($arrayidx28)];var $conv29=(tempInt=(($25)),(tempInt>=128?tempInt-256:tempInt));var $cmp30=((($conv29))|0)==45;if($cmp30){__label__=19;;}else{__label__=21;;}
69279 $if_then31$$if_end35$31:do{if(__label__==19){var $26=$n_parts;var $inc=((($26)+1)&4294967295);$n_parts=$inc;var $27=$matching;var $tobool=((($27))|0)!=0;if(!($tobool)){__label__=21;break $if_then31$$if_end35$31;}
69280 var $28=$matching_parts;var $inc33=((($28)+1)&4294967295);$matching_parts=$inc33;;}}while(0);var $29=$ix;var $30=$p;var $arrayidx36=(($30+$29)&4294967295);var $31=HEAP8[($arrayidx36)];var $conv37=(tempInt=(($31)),(tempInt>=128?tempInt-256:tempInt));var $cmp38=((($conv37))|0)==0;var $32=$ix;var $add=((($32)+1)&4294967295);if($cmp38){__label__=23;break $for_cond$18;}
69281 $ix=$add;__label__=11;continue $for_cond$18;}
69282 var $33=$p;var $add_ptr=(($33+$add)&4294967295);$p=$add_ptr;var $34=$matching;var $35=$matching_parts;var $add42=((($35)+($34))&4294967295);$matching_parts=$add42;var $36=$matching_parts;var $cmp43=((($36))|0)==0;if($cmp43){__label__=24;;}else{__label__=25;;}
69283 $while_cond_backedge$$if_end45$37:do{if(__label__==25){$x=5;var $39=$spec_n_parts_addr;var $40=$matching_parts;var $sub=((($39)-($40))&4294967295);$diff=$sub;var $cmp46=((($sub))|0)>0;if($cmp46){__label__=26;;}else{__label__=27;;}
69284 if(__label__==26){var $41=$diff;var $42=$x;var $sub48=((($42)-($41))&4294967295);$x=$sub48;;}
69285 var $43=$n_parts;var $44=$matching_parts;var $sub50=((($43)-($44))&4294967295);$diff=$sub50;var $cmp51=((($sub50))|0)>0;if($cmp51){__label__=28;;}else{__label__=29;;}
69286 if(__label__==28){var $45=$diff;var $46=$x;var $sub53=((($46)-($45))&4294967295);$x=$sub53;;}
69287 var $47=$x;var $mul=((($47)*100)&4294967295);var $48=$language_priority;var $mul55=((($48)*2)&4294967295);var $sub56=((($mul)-($mul55))&4294967295);$x=$sub56;var $49=$x;var $50=$score;var $cmp57=((($49))|0)>((($50))|0);if(!($cmp57)){__label__=24;break $while_cond_backedge$$if_end45$37;}
69288 var $51=$x;$score=$51;;}}while(0);var $37=$p;var $38=HEAP8[($37)];var $conv12=(tempInt=(($38)),(tempInt>=128?tempInt-256:tempInt));var $cmp13=((($conv12))|0)!=0;if($cmp13){__label__=10;continue $while_body$16;}else{__label__=31;break $while_body$$if_end60$15;}}}}while(0);var $_pr=$score;var $cmp61=((($_pr))|0)==0;if(!($cmp61)){__label__=33;break $if_end60_thread$$if_else$8;}
69289 $retval=0;__label__=63;break $if_then$$if_end4$2;}}while(0);var $52=$voice_spec_addr;var $name=(($52)&4294967295);var $53=HEAP32[(($name)>>2)];var $cmp64=((($53))|0)!=0;if($cmp64){__label__=34;;}else{__label__=38;;}
69290 $if_then65$$if_end81$50:do{if(__label__==34){var $54=$voice_spec_addr;var $name66=(($54)&4294967295);var $55=HEAP32[(($name66)>>2)];var $56=$voice_addr;var $name67=(($56)&4294967295);var $57=HEAP32[(($name67)>>2)];var $call68=_strcmp($55,$57);var $cmp69=((($call68))|0)==0;if($cmp69){__label__=35;;}else{__label__=36;;}
69291 if(__label__==35){var $58=$score;var $add71=((($58)+500)&4294967295);$score=$add71;;}
69292 else if(__label__==36){var $59=$voice_spec_addr;var $name73=(($59)&4294967295);var $60=HEAP32[(($name73)>>2)];var $61=$voice_addr;var $identifier74=(($61+8)&4294967295);var $62=HEAP32[(($identifier74)>>2)];var $call75=_strcmp($60,$62);var $cmp76=((($call75))|0)==0;if(!($cmp76)){__label__=38;break $if_then65$$if_end81$50;}
69293 var $63=$score;var $add78=((($63)+400)&4294967295);$score=$add78;;}}}while(0);var $64=$voice_spec_addr;var $gender=(($64+12)&4294967295);var $65=HEAPU8[($gender)];var $conv82=((($65))&255);var $cmp83=((($conv82))|0)==1;if($cmp83){__label__=40;;}else{__label__=39;;}
69294 $land_lhs_true88$$lor_lhs_false84$57:do{if(__label__==39){var $66=$voice_spec_addr;var $gender85=(($66+12)&4294967295);var $67=HEAPU8[($gender85)];var $conv86=((($67))&255);var $cmp87=((($conv86))|0)==2;if($cmp87){__label__=40;break $land_lhs_true88$$lor_lhs_false84$57;}else{__label__=45;break $land_lhs_true88$$lor_lhs_false84$57;}}}while(0);$land_lhs_true88$$if_end107$59:do{if(__label__==40){var $68=$voice_addr;var $gender89=(($68+12)&4294967295);var $69=HEAPU8[($gender89)];var $conv90=((($69))&255);var $cmp91=((($conv90))|0)==1;if($cmp91){__label__=42;;}else{__label__=41;;}
69295 if(__label__==41){var $70=$voice_addr;var $gender93=(($70+12)&4294967295);var $71=HEAPU8[($gender93)];var $conv94=((($71))&255);var $cmp95=((($conv94))|0)==2;if(!($cmp95)){__label__=45;break $land_lhs_true88$$if_end107$59;}}
69296 var $72=$voice_spec_addr;var $gender97=(($72+12)&4294967295);var $73=HEAPU8[($gender97)];var $conv98=((($73))&255);var $74=$voice_addr;var $gender99=(($74+12)&4294967295);var $75=HEAPU8[($gender99)];var $conv100=((($75))&255);var $cmp101=((($conv98))|0)==((($conv100))|0);var $76=$score;if($cmp101){__label__=43;;}else{__label__=44;;}
69297 if(__label__==43){var $add103=((($76)+50)&4294967295);$score=$add103;;}
69298 else if(__label__==44){var $sub105=((($76)-50)&4294967295);$score=$sub105;;}}}while(0);var $77=$voice_spec_addr;var $age=(($77+13)&4294967295);var $78=HEAPU8[($age)];var $conv108=((($78))&255);var $cmp109=((($conv108))|0)<=12;if($cmp109){__label__=46;;}else{__label__=49;;}
69299 $land_lhs_true110$$if_end120$68:do{if(__label__==46){var $79=$voice_addr;var $gender111=(($79+12)&4294967295);var $80=HEAPU8[($gender111)];var $conv112=((($80))&255);var $cmp113=((($conv112))|0)==2;if(!($cmp113)){__label__=49;break $land_lhs_true110$$if_end120$68;}
69300 var $81=$voice_addr;var $age115=(($81+13)&4294967295);var $82=HEAPU8[($age115)];var $conv116=((($82))&255);var $cmp117=((($conv116))|0)>12;if(!($cmp117)){__label__=49;break $land_lhs_true110$$if_end120$68;}
69301 var $83=$score;var $add119=((($83)+5)&4294967295);$score=$add119;;}}while(0);var $84=$voice_addr;var $age121=(($84+13)&4294967295);var $85=HEAPU8[($age121)];var $conv122=((($85))&255);var $cmp123=((($conv122))|0)!=0;if($cmp123){__label__=50;;}else{__label__=59;;}
69302 $if_then124$$if_end153thread_pre_split$73:do{if(__label__==50){var $86=$voice_spec_addr;var $age125=(($86+13)&4294967295);var $87=HEAPU8[($age125)];var $conv126=((($87))&255);var $cmp127=((($conv126))|0)==0;if($cmp127){__label__=51;;}else{__label__=52;;}
69303 if(__label__==51){$required_age=30;;}
69304 else if(__label__==52){var $88=$voice_spec_addr;var $age130=(($88+13)&4294967295);var $89=HEAPU8[($age130)];var $conv131=((($89))&255);$required_age=$conv131;;}
69305 var $90=$required_age;var $mul133=((($90)*100)&4294967295);var $91=$voice_addr;var $age134=(($91+13)&4294967295);var $92=HEAPU8[($age134)];var $conv135=((($92))&255);var $div=((((($mul133))|0)/((($conv135))|0))|0);$ratio=$div;var $cmp136=((($div))|0)<100;if($cmp136){__label__=54;;}else{__label__=55;;}
69306 if(__label__==54){var $93=$ratio;var $div138=((10000/((($93))|0))|0);$ratio=$div138;;}
69307 var $94=$ratio;var $sub140=((($94)-100)&4294967295);var $div141=((((($sub140))|0)/10)|0);$ratio=$div141;var $95=$ratio;var $sub142=((5-($95))&4294967295);$x=$sub142;var $cmp143=((($sub142))|0)>0;if($cmp143){__label__=56;;}else{__label__=57;;}
69308 if(__label__==56){$x=0;;}
69309 var $96=$score;var $97=$x;var $add146=((($97)+($96))&4294967295);$score=$add146;var $98=$voice_spec_addr;var $age147=(($98+13)&4294967295);var $99=HEAPU8[($age147)];var $conv148=((($99))&255);var $cmp149=((($conv148))|0)>0;if(!($cmp149)){__label__=59;break $if_then124$$if_end153thread_pre_split$73;}
69310 var $100=$score;var $add151=((($100)+10)&4294967295);$score=$add151;__lastLabel__=58;__label__=60;break $if_then124$$if_end153thread_pre_split$73;}}while(0);if(__label__==59){var $_pr2=$score;__lastLabel__=59;;}
69311 var $101=__lastLabel__==59?$_pr2:($add151);var $cmp154=((($101))|0)<1;if($cmp154){__label__=61;;}else{__label__=62;;}
69312 if(__label__==61){$score=1;;}
69313 var $102=$score;$retval=$102;;}}while(0);var $103=$retval;;return $103;return null;}
69314 function __ZL16VoiceScoreSorterPKvS0_($p1,$p2){;var __label__;var $retval;var $p1_addr;var $p2_addr;var $ix;var $v1;var $v2;$p1_addr=$p1;$p2_addr=$p2;var $0=$p1_addr;var $1=$0;var $2=HEAP32[(($1)>>2)];$v1=$2;var $3=$p2_addr;var $4=$3;var $5=HEAP32[(($4)>>2)];$v2=$5;var $6=$v2;var $score=(($6+16)&4294967295);var $7=HEAP32[(($score)>>2)];var $8=$v1;var $score1=(($8+16)&4294967295);var $9=HEAP32[(($score1)>>2)];var $sub=((($7)-($9))&4294967295);$ix=$sub;var $cmp=((($sub))|0)!=0;if($cmp){__label__=1;;}else{__label__=2;;}
69315 if(__label__==1){var $10=$ix;$retval=$10;;}
69316 else if(__label__==2){var $11=$v1;var $name=(($11)&4294967295);var $12=HEAP32[(($name)>>2)];var $13=$v2;var $name2=(($13)&4294967295);var $14=HEAP32[(($name2)>>2)];var $call=_strcmp($12,$14);$retval=$call;;}
69317 var $15=$retval;;return $15;return null;}
69318 function __Z9WcmdqStopv(){;var __label__;HEAP32[((_wcmdq_head)>>2)]=0;HEAP32[((_wcmdq_tail)>>2)]=0;var $0=HEAP32[((__ZL18sonicSpeedupStream)>>2)];var $cmp=((($0))|0)!=0;if($cmp){__label__=1;;}else{__label__=2;;}
69319 if(__label__==1){var $1=HEAP32[((__ZL18sonicSpeedupStream)>>2)];_sonicDestroyStream($1);HEAP32[((__ZL18sonicSpeedupStream)>>2)]=0;;}
69320 var $2=HEAP8[(((_mbrola_name)&4294967295))];var $conv=(tempInt=(($2)),(tempInt>=128?tempInt-256:tempInt));var $cmp1=((($conv))|0)!=0;if($cmp1){__label__=3;;}else{__label__=4;;}
69321 if(__label__==3){__Z11MbrolaResetv();;};return;return;}
69322 function __Z9WcmdqFreev(){;var __label__;var $i;var $0=HEAP32[((_wcmdq_head)>>2)];var $1=HEAP32[((_wcmdq_tail)>>2)];var $sub=((($0)-($1))&4294967295);$i=$sub;var $2=$i;var $cmp=((($2))|0)<=0;if($cmp){__label__=1;;}else{__label__=2;;}
69323 if(__label__==1){var $3=$i;var $add=((($3)+160)&4294967295);$i=$add;;}
69324 var $4=$i;;return $4;return null;}
69325 function __Z9WcmdqUsedv(){;var __label__;var $call=__Z9WcmdqFreev();var $sub=((160-($call))&4294967295);;return $sub;return null;}
69326 function __Z8WcmdqIncv(){;var __label__;var $0=HEAP32[((_wcmdq_tail)>>2)];var $inc=((($0)+1)&4294967295);HEAP32[((_wcmdq_tail)>>2)]=$inc;var $cmp=((($inc))|0)>=160;if($cmp){__label__=1;;}else{__label__=2;;}
69327 if(__label__==1){HEAP32[((_wcmdq_tail)>>2)]=0;;};return;return;}
69328 function __Z16WavegenOpenSoundv(){;var __label__;;return 0;return null;}
69329 function __Z17WavegenCloseSoundv(){;var __label__;;return 0;return null;}
69330 function __Z16WavegenInitSoundv(){;var __label__;;return 0;return null;}
69331 function __Z11WavegenInitii($rate,$wavemult_fact){;var __label__;var $rate_addr;var $wavemult_fact_addr;var $ix;var $x;$rate_addr=$rate;$wavemult_fact_addr=$wavemult_fact;var $0=$wavemult_fact_addr;var $cmp=((($0))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
69332 if(__label__==1){$wavemult_fact_addr=60;;}
69333 HEAP32[((_wvoice)>>2)]=0;var $1=$rate_addr;HEAP32[((_samplerate_native)>>2)]=$1;HEAP32[((_samplerate)>>2)]=$1;var $2=HEAP32[((_samplerate)>>2)];var $div=((134217728/((($2))|0))|0);HEAP32[((__ZL16PHASE_INC_FACTOR)>>2)]=$div;var $3=HEAP32[((_samplerate)>>2)];var $mul=((($3)*64)&4294967295);var $4=$rate_addr;var $div1=((((($mul))|0)/((($4))|0))|0);HEAP32[((__ZL11Flutter_inc)>>2)]=$div1;HEAP32[((__ZL11samplecount)>>2)]=0;HEAP32[((__ZL8nsamples)>>2)]=0;HEAP32[((__ZL9wavephase)>>2)]=2147483647;HEAP32[((((_wdata+52)&4294967295))>>2)]=32;HEAP32[((((_wdata+60)&4294967295))>>2)]=100;$ix=0;;$for_body$5:while(1){var $5=$ix;var $arrayidx=((_embedded_default+$5*4)&4294967295);var $6=HEAP32[(($arrayidx)>>2)];var $7=$ix;var $arrayidx3=((_embedded_value+$7*4)&4294967295);HEAP32[(($arrayidx3)>>2)]=$6;var $8=$ix;var $inc=((($8)+1)&4294967295);$ix=$inc;var $cmp2=((($inc))|0)<15;if($cmp2){__label__=3;continue $for_body$5;}else{__label__=4;break $for_body$5;}}
69334 var $9=HEAP32[((_samplerate)>>2)];var $10=$wavemult_fact_addr;var $mul4=((($10)*($9))&4294967295);var $div5=((((($mul4))|0)/12800)|0);HEAP32[((__ZL12wavemult_max)>>2)]=$div5;var $11=HEAP32[((__ZL12wavemult_max)>>2)];var $cmp6=((($11))|0)>128;if($cmp6){__label__=5;;}else{__label__=6;;}
69335 if(__label__==5){HEAP32[((__ZL12wavemult_max)>>2)]=128;;}
69336 var $12=HEAP32[((__ZL12wavemult_max)>>2)];var $div9=((((($12))|0)/2)|0);HEAP32[((__ZL15wavemult_offset)>>2)]=$div9;var $13=HEAP32[((_samplerate)>>2)];var $cmp10=((($13))|0)!=22050;if($cmp10){__label__=7;;}else{__label__=9;;}
69337 $if_then11$$if_end25$11:do{if(__label__==7){$ix=0;var $14=$ix;var $15=HEAP32[((__ZL12wavemult_max)>>2)];var $cmp131=((($14))|0)<((($15))|0);if(!($cmp131)){__label__=9;break $if_then11$$if_end25$11;}
69338 while(1){var $16=$ix;var $conv=((($16))|0);var $mul15=6.283185307*($conv);var $17=HEAP32[((__ZL12wavemult_max)>>2)];var $conv16=((($17))|0);var $div17=($mul15)/($conv16);var $call=_cos($div17);var $sub=1-($call);var $mul18=127*($sub);$x=$mul18;var $18=$x;var $conv19=((($18))|0);var $conv20=((($conv19))&255);var $19=$ix;var $arrayidx21=((__ZL8wavemult+$19)&4294967295);HEAP8[($arrayidx21)]=$conv20;var $20=$ix;var $inc23=((($20)+1)&4294967295);$ix=$inc23;var $21=$ix;var $22=HEAP32[((__ZL12wavemult_max)>>2)];var $cmp13=((($21))|0)<((($22))|0);if($cmp13){__label__=8;continue;}else{__label__=9;break $if_then11$$if_end25$11;}}}}while(0);__ZL17WavegenInitPkDatai(1);__ZL17WavegenInitPkDatai(0);HEAP32[((__ZL8pk_shape)>>2)]=((__ZL9pk_shape2)&4294967295);__Z9KlattInitv();;return;return;}
69339 function __ZL17WavegenInitPkDatai($which){;var __label__;;return;return;}
69340 function __Z12GetAmplitudev(){;var __label__;var $amp;var $0=HEAP32[((((_embedded_value+12)&4294967295))>>2)];var $mul=((($0)*55)&4294967295);var $div=((((($mul))|0)/100)|0);$amp=$div;var $1=$amp;var $2=HEAP32[((((_embedded_value+52)&4294967295))>>2)];var $arrayidx=((__ZZ12GetAmplitudevE12amp_emphasis+$2)&4294967295);var $3=HEAPU8[($arrayidx)];var $conv=((($3))&255);var $mul1=((($conv)*($1))&4294967295);var $div2=((((($mul1))|0)/16)|0);HEAP32[((__ZL17general_amplitude)>>2)]=$div2;var $4=HEAP32[((__ZL17general_amplitude)>>2)];;return $4;return null;}
69341 function __Z16PeaksToHarmspectP15wavegen_peaks_tiPii($peaks,$pitch,$htab,$control){;var __label__;var $retval;var $peaks_addr;var $pitch_addr;var $htab_addr;var $control_addr;var $f;var $p;var $fp;var $fhi;var $h;var $pk;var $hmax;var $hmax_samplerate;var $x;var $ix;var $h1;var $y;var $h2;$peaks_addr=$peaks;$pitch_addr=$pitch;$htab_addr=$htab;$control_addr=$control;var $0=HEAP32[((_wvoice)>>2)];var $cmp=((($0))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
69342 if(__label__==1){$retval=1;;}
69343 else if(__label__==2){var $1=HEAP32[((_wvoice)>>2)];var $n_harmonic_peaks=(($1+84)&4294967295);var $2=HEAP32[(($n_harmonic_peaks)>>2)];var $3=$peaks_addr;var $arrayidx=(($3+80*$2)&4294967295);var $freq=(($arrayidx)&4294967295);var $4=HEAP32[(($freq)>>2)];var $5=HEAP32[((_wvoice)>>2)];var $n_harmonic_peaks1=(($5+84)&4294967295);var $6=HEAP32[(($n_harmonic_peaks1)>>2)];var $7=$peaks_addr;var $arrayidx2=(($7+80*$6)&4294967295);var $right=(($arrayidx2+12)&4294967295);var $8=HEAP32[(($right)>>2)];var $add=((($8)+($4))&4294967295);var $9=$pitch_addr;var $div=((((($add))|0)/((($9))|0))|0);$hmax=$div;var $10=$hmax;var $cmp3=((($10))|0)>=400;if($cmp3){__label__=3;;}else{__label__=4;;}
69344 if(__label__==3){$hmax=399;;}
69345 var $11=HEAP32[((_samplerate)>>2)];var $mul=((($11)*19)&4294967295);var $div6=((((($mul))|0)/40)|0);var $shl=($div6)<<16;var $12=$pitch_addr;var $div7=((((($shl))|0)/((($12))|0))|0);$hmax_samplerate=$div7;var $13=$hmax;var $14=$hmax_samplerate;var $cmp8=((($13))|0)>((($14))|0);if($cmp8){__label__=5;;}else{__label__=6;;}
69346 if(__label__==5){var $15=$hmax_samplerate;$hmax=$15;;}
69347 $h=0;var $16=$h;var $17=$hmax;var $cmp118=((($16))|0)<=((($17))|0);if($cmp118){__label__=7;;}else{__label__=8;;}
69348 $for_body$$for_end$11:do{if(__label__==7){while(1){var $18=$h;var $19=$htab_addr;var $arrayidx12=(($19+4*$18)&4294967295);HEAP32[(($arrayidx12)>>2)]=0;var $20=$h;var $inc=((($20)+1)&4294967295);$h=$inc;var $21=$h;var $22=$hmax;var $cmp11=((($21))|0)<=((($22))|0);if($cmp11){__label__=7;continue;}else{__label__=8;break $for_body$$for_end$11;}}}}while(0);$h=0;$pk=0;var $23=$pk;var $24=HEAP32[((_wvoice)>>2)];var $n_harmonic_peaks146=(($24+84)&4294967295);var $25=HEAP32[(($n_harmonic_peaks146)>>2)];var $cmp157=((($23))|0)<=((($25))|0);if($cmp157){__label__=9;;}else{__label__=18;;}
69349 $for_body16$$for_end67$15:do{if(__label__==9){$for_body16$16:while(1){var $26=$pk;var $27=$peaks_addr;var $arrayidx17=(($27+80*$26)&4294967295);$p=$arrayidx17;var $28=$p;var $height=(($28+4)&4294967295);var $29=HEAP32[(($height)>>2)];var $cmp18=((($29))|0)==0;if($cmp18){__label__=17;;}else{__label__=10;;}
69350 $for_inc65$$lor_lhs_false$18:do{if(__label__==10){var $30=$p;var $freq19=(($30)&4294967295);var $31=HEAP32[(($freq19)>>2)];$fp=$31;var $cmp20=((($31))|0)==0;if($cmp20){__label__=17;break $for_inc65$$lor_lhs_false$18;}
69351 var $32=$p;var $freq23=(($32)&4294967295);var $33=HEAP32[(($freq23)>>2)];var $34=$p;var $right24=(($34+12)&4294967295);var $35=HEAP32[(($right24)>>2)];var $add25=((($35)+($33))&4294967295);$fhi=$add25;var $36=$p;var $freq26=(($36)&4294967295);var $37=HEAP32[(($freq26)>>2)];var $38=$p;var $left=(($38+8)&4294967295);var $39=HEAP32[(($left)>>2)];var $sub=((($37)-($39))&4294967295);var $40=$pitch_addr;var $div27=((((($sub))|0)/((($40))|0))|0);var $add28=((($div27)+1)&4294967295);$h=$add28;var $41=$h;var $cmp29=((($41))|0)<=0;if($cmp29){__label__=12;;}else{__label__=13;;}
69352 if(__label__==12){$h=1;;}
69353 var $42=$pitch_addr;var $43=$h;var $mul32=((($43)*($42))&4294967295);$f=$mul32;var $44=$f;var $45=$fp;var $cmp344=((($44))|0)<((($45))|0);if($cmp344){__label__=14;;}else{__label__=15;;}
69354 $for_body35$$for_cond48_loopexit$24:do{if(__label__==14){while(1){var $46=$fp;var $47=$f;var $sub36=((($46)-($47))&4294967295);var $48=$p;var $left37=(($48+8)&4294967295);var $49=HEAP32[(($left37)>>2)];var $shr=($49)>>8;var $div38=((((($sub36))|0)/((($shr))|0))|0);var $50=HEAP32[((__ZL8pk_shape)>>2)];var $arrayidx39=(($50+$div38)&4294967295);var $51=HEAPU8[($arrayidx39)];var $conv=((($51))&255);var $52=$p;var $height40=(($52+4)&4294967295);var $53=HEAP32[(($height40)>>2)];var $mul41=((($53)*($conv))&4294967295);var $54=$h;var $inc42=((($54)+1)&4294967295);$h=$inc42;var $55=$htab_addr;var $arrayidx43=(($55+4*$54)&4294967295);var $56=HEAP32[(($arrayidx43)>>2)];var $add44=((($56)+($mul41))&4294967295);HEAP32[(($arrayidx43)>>2)]=$add44;var $57=$pitch_addr;var $58=$f;var $add46=((($58)+($57))&4294967295);$f=$add46;var $59=$f;var $60=$fp;var $cmp34=((($59))|0)<((($60))|0);if($cmp34){__label__=14;continue;}else{__label__=15;break $for_body35$$for_cond48_loopexit$24;}}}}while(0);var $61=$f;var $62=$fhi;var $cmp495=((($61))|0)<((($62))|0);if(!($cmp495)){__label__=17;break $for_inc65$$lor_lhs_false$18;}
69355 while(1){var $63=$f;var $64=$fp;var $sub51=((($63)-($64))&4294967295);var $65=$p;var $right52=(($65+12)&4294967295);var $66=HEAP32[(($right52)>>2)];var $shr53=($66)>>8;var $div54=((((($sub51))|0)/((($shr53))|0))|0);var $67=HEAP32[((__ZL8pk_shape)>>2)];var $arrayidx55=(($67+$div54)&4294967295);var $68=HEAPU8[($arrayidx55)];var $conv56=((($68))&255);var $69=$p;var $height57=(($69+4)&4294967295);var $70=HEAP32[(($height57)>>2)];var $mul58=((($70)*($conv56))&4294967295);var $71=$h;var $inc59=((($71)+1)&4294967295);$h=$inc59;var $72=$htab_addr;var $arrayidx60=(($72+4*$71)&4294967295);var $73=HEAP32[(($arrayidx60)>>2)];var $add61=((($73)+($mul58))&4294967295);HEAP32[(($arrayidx60)>>2)]=$add61;var $74=$pitch_addr;var $75=$f;var $add63=((($75)+($74))&4294967295);$f=$add63;var $76=$f;var $77=$fhi;var $cmp49=((($76))|0)<((($77))|0);if($cmp49){__label__=16;continue;}else{__label__=17;break $for_inc65$$lor_lhs_false$18;}}}}while(0);var $78=$pk;var $inc66=((($78)+1)&4294967295);$pk=$inc66;var $79=$pk;var $80=HEAP32[((_wvoice)>>2)];var $n_harmonic_peaks14=(($80+84)&4294967295);var $81=HEAP32[(($n_harmonic_peaks14)>>2)];var $cmp15=((($79))|0)<=((($81))|0);if($cmp15){__label__=9;continue $for_body16$16;}else{__label__=18;break $for_body16$$for_end67$15;}}}}while(0);var $82=$peaks_addr;var $arrayidx68=(($82+80)&4294967295);var $height69=(($arrayidx68+4)&4294967295);var $83=HEAP32[(($height69)>>2)];var $mul70=((($83)*10)&4294967295);$y=$mul70;var $84=$pitch_addr;var $div71=((65536000/((($84))|0))|0);$h2=$div71;var $cmp72=((($div71))|0)>0;if($cmp72){__label__=19;;}else{__label__=21;;}
69356 $if_then73$$for_cond81thread_pre_split$32:do{if(__label__==19){var $85=$y;var $86=$h2;var $div74=((((($85))|0)/((($86))|0))|0);$x=$div74;$h=1;var $cmp753=((($85))|0)>0;if(!($cmp753)){__label__=21;break $if_then73$$for_cond81thread_pre_split$32;}
69357 while(1){var $87=$y;var $88=$h;var $inc76=((($88)+1)&4294967295);$h=$inc76;var $89=$htab_addr;var $arrayidx77=(($89+4*$88)&4294967295);var $90=HEAP32[(($arrayidx77)>>2)];var $add78=((($90)+($87))&4294967295);HEAP32[(($arrayidx77)>>2)]=$add78;var $91=$x;var $92=$y;var $sub79=((($92)-($91))&4294967295);$y=$sub79;var $cmp75=((($sub79))|0)>0;if($cmp75){__label__=20;continue;}else{__label__=21;break $if_then73$$for_cond81thread_pre_split$32;}}}}while(0);var $_pr=$pk;var $cmp822=((($_pr))|0)<9;if($cmp822){__label__=22;;}else{__label__=27;;}
69358 $for_body83$$for_end105$37:do{if(__label__==22){while(1){var $93=$pk;var $94=$peaks_addr;var $arrayidx84=(($94+80*$93)&4294967295);var $height85=(($arrayidx84+4)&4294967295);var $95=HEAP32[(($height85)>>2)];var $shr86=($95)>>14;$x=$shr86;var $96=$x;var $97=$x;var $mul87=((($96)*5)&4294967295);var $mul88=((($mul87)*($97))&4294967295);var $div89=((((($mul88))|0)/2)|0);var $98=$pk;var $arrayidx90=((__ZL11peak_height+$98*4)&4294967295);HEAP32[(($arrayidx90)>>2)]=$div89;var $99=$control_addr;var $cmp91=((($99))|0)==0;if($cmp91){__label__=23;;}else{__label__=24;;}
69359 if(__label__==23){var $100=$pk;var $101=$peaks_addr;var $arrayidx93=(($101+80*$100)&4294967295);var $freq94=(($arrayidx93)&4294967295);var $102=HEAP32[(($freq94)>>2)];var $103=$pitch_addr;var $div95=((((($102))|0)/((($103))|0))|0);var $104=$pk;var $arrayidx96=((__ZL13peak_harmonic+$104*4)&4294967295);HEAP32[(($arrayidx96)>>2)]=$div95;;}
69360 var $105=$pk;var $arrayidx98=((__ZL13peak_harmonic+$105*4)&4294967295);var $106=HEAP32[(($arrayidx98)>>2)];var $107=$hmax_samplerate;var $cmp99=((($106))|0)>=((($107))|0);if($cmp99){__label__=25;;}else{__label__=26;;}
69361 if(__label__==25){var $108=$pk;var $arrayidx101=((__ZL11peak_height+$108*4)&4294967295);HEAP32[(($arrayidx101)>>2)]=0;;}
69362 var $109=$pk;var $inc104=((($109)+1)&4294967295);$pk=$inc104;var $cmp82=((($inc104))|0)<9;if($cmp82){__label__=22;continue;}else{__label__=27;break $for_body83$$for_end105$37;}}}}while(0);$f=0;$h=0;var $110=$h;var $111=$hmax;var $cmp1071=((($110))|0)<=((($111))|0);if($cmp1071){__label__=28;;}else{__label__=31;;}
69363 $for_body108$$for_end127$47:do{if(__label__==28){while(1){var $112=$h;var $113=$htab_addr;var $arrayidx109=(($113+4*$112)&4294967295);var $114=HEAP32[(($arrayidx109)>>2)];var $shr110=($114)>>15;$x=$shr110;var $115=$x;var $116=$x;var $mul111=((($116)*($115))&4294967295);var $shr112=($mul111)>>8;var $117=$h;var $118=$htab_addr;var $arrayidx113=(($118+4*$117)&4294967295);HEAP32[(($arrayidx113)>>2)]=$shr112;var $119=$f;var $shr114=($119)>>19;$ix=$shr114;var $cmp115=((($shr114))|0)<1000;if($cmp115){__label__=29;;}else{__label__=30;;}
69364 if(__label__==29){var $120=$h;var $121=$htab_addr;var $arrayidx117=(($121+4*$120)&4294967295);var $122=HEAP32[(($arrayidx117)>>2)];var $123=$ix;var $124=HEAP32[((_wvoice)>>2)];var $tone_adjust=(($124+344)&4294967295);var $arrayidx118=(($tone_adjust+$123)&4294967295);var $125=HEAPU8[($arrayidx118)];var $conv119=((($125))&255);var $mul120=((($conv119)*($122))&4294967295);var $shr121=($mul120)>>13;var $126=$h;var $127=$htab_addr;var $arrayidx122=(($127+4*$126)&4294967295);HEAP32[(($arrayidx122)>>2)]=$shr121;;}
69365 var $128=$h;var $inc125=((($128)+1)&4294967295);$h=$inc125;var $129=$pitch_addr;var $130=$f;var $add126=((($130)+($129))&4294967295);$f=$add126;var $131=$h;var $132=$hmax;var $cmp107=((($131))|0)<=((($132))|0);if($cmp107){__label__=28;continue;}else{__label__=31;break $for_body108$$for_end127$47;}}}}while(0);var $133=$htab_addr;var $arrayidx128=(($133+4)&4294967295);var $134=HEAP32[(($arrayidx128)>>2)];var $_b=HEAPU8[(__ZL16option_harmonic1_b)];var $135=($_b)?6:10;var $mul129=((($135)*($134))&4294967295);$h1=$mul129;var $136=$h1;var $div130=((((($136))|0)/8)|0);var $137=$htab_addr;var $arrayidx131=(($137+4)&4294967295);HEAP32[(($arrayidx131)>>2)]=$div130;var $138=$control_addr;var $and=($138)&1;var $tobool=((($and))|0)!=0;if($tobool){__label__=32;;}else{__label__=34;;}
69366 $if_then132$$if_end144$54:do{if(__label__==32){$h=1;;while(1){var $139=$h;var $140=$htab_addr;var $arrayidx136=(($140+4*$139)&4294967295);var $141=HEAP32[(($arrayidx136)>>2)];var $142=$h;var $143=HEAP32[((__ZL9harmspect)>>2)];var $arrayidx137=(($143+4*$142)&4294967295);var $144=HEAP32[(($arrayidx137)>>2)];var $sub138=((($141)-($144))&4294967295);var $shr139=($sub138)>>3;var $145=$h;var $arrayidx140=((__ZL8harm_inc+$145*4)&4294967295);HEAP32[(($arrayidx140)>>2)]=$shr139;var $146=$h;var $inc142=((($146)+1)&4294967295);$h=$inc142;var $cmp134=((($inc142))|0)<30;if($cmp134){__label__=33;continue;}else{__label__=34;break $if_then132$$if_end144$54;}}}}while(0);var $147=$hmax;$retval=$147;;}
69367 var $148=$retval;;return $148;return null;}
69368 function __Z10InitBreathv(){;var __label__;var $ix;var $0=HEAP32[((_samplerate)>>2)];var $conv=((($0))|0);var $div=-3.1415927/($conv);HEAPF32[((__ZL10minus_pi_t)>>2)]=$div;var $1=HEAPF32[((__ZL10minus_pi_t)>>2)];var $mul=-2*($1);HEAPF32[((__ZL8two_pi_t)>>2)]=$mul;$ix=0;;while(1){var $2=$ix;var $arrayidx=((__ZL7rbreath+$2*40)&4294967295);__ZL12setresonatorP9RESONATORiii($arrayidx,2000,200,1);var $3=$ix;var $inc=((($3)+1)&4294967295);$ix=$inc;var $cmp=((($inc))|0)<9;if($cmp){__label__=1;continue;}else{__label__=2;break;}};return;return;}
69369 function __ZL12setresonatorP9RESONATORiii($rp,$freq,$bwidth,$init){;var __label__;var $rp_addr;var $freq_addr;var $bwidth_addr;var $init_addr;var $x;var $arg;$rp_addr=$rp;$freq_addr=$freq;$bwidth_addr=$bwidth;$init_addr=$init;var $0=$init_addr;var $tobool=((($0))|0)!=0;if($tobool){__label__=1;;}else{__label__=2;;}
69370 if(__label__==1){var $1=$rp_addr;var $x1=(($1+24)&4294967295);HEAPF32[(($x1)>>2)]=0;var $2=$rp_addr;var $x2=(($2+32)&4294967295);HEAPF32[(($x2)>>2)]=0;;}
69371 var $3=HEAPF32[((__ZL10minus_pi_t)>>2)];var $4=$bwidth_addr;var $conv=((($4))|0);var $mul=($3)*($conv);$arg=$mul;var $5=$arg;var $call=_exp($5);$x=$call;var $6=$x;var $7=$x;var $mul1=($6)*($7);var $sub=(-($mul1));var $8=$rp_addr;var $c=(($8+16)&4294967295);HEAPF32[(($c)>>2)]=$sub;var $9=HEAPF32[((__ZL8two_pi_t)>>2)];var $10=$freq_addr;var $conv2=((($10))|0);var $mul3=($9)*($conv2);$arg=$mul3;var $11=$x;var $12=$arg;var $call4=_cos($12);var $mul5=($11)*($call4);var $mul6=($mul5)*2;var $13=$rp_addr;var $b=(($13+8)&4294967295);HEAPF32[(($b)>>2)]=$mul6;var $14=$rp_addr;var $b7=(($14+8)&4294967295);var $15=HEAPF32[(($b7)>>2)];var $sub8=1-($15);var $16=$rp_addr;var $c9=(($16+16)&4294967295);var $17=HEAPF32[(($c9)>>2)];var $sub10=($sub8)-($17);var $18=$rp_addr;var $a=(($18)&4294967295);HEAPF32[(($a)>>2)]=$sub10;;return;return;}
69372 function __Z7Wavegenv(){;var __label__;var __lastLabel__=null;var $retval;var $waveph;var $theta;var $total;var $h;var $ix;var $z;var $z1;var $z2;var $echo;var $ov;var $pk;var $c;var $sample;var $amp;var $modn_amp;var $modn_period;;$for_cond$2:while(1){var $_b=HEAPU8[(__ZL8end_wave_b)];var $0=((($_b))&1);var $cmp=((($0))|0)==0;var $1=HEAP32[((__ZL11samplecount)>>2)];var $2=HEAP32[((__ZL8nsamples)>>2)];var $cmp1=((($1))|0)==((($2))|0);var $or_cond3=($cmp)&($cmp1);if($or_cond3){__label__=2;break $for_cond$2;}
69373 var $and=($1)&63;var $cmp2=((($and))|0)==0;if($cmp2){__label__=4;;}else{__label__=8;;}
69374 $if_then3$$if_else19$5:do{if(__label__==4){var $cmp4=((($1))|0)==0;if($cmp4){__label__=5;;}else{__label__=6;;}
69375 if(__label__==5){HEAP32[((__ZL7hswitch)>>2)]=0;HEAP32[((__ZL9harmspect)>>2)]=((__ZL6hspect)&4294967295);var $3=HEAP32[((((_wdata+4)&4294967295))>>2)];var $shl=($3)<<4;var $call=__Z16PeaksToHarmspectP15wavegen_peaks_tiPii(((__ZL5peaks)&4294967295),$shl,((__ZL6hspect)&4294967295),0);HEAP32[((__ZZ7WavegenvE5maxh2)>>2)]=$call;var $4=HEAP32[((((_wdata+52)&4294967295))>>2)];var $5=HEAP32[((((_wdata+4)&4294967295))>>2)];var $shr=($5)>>8;var $6=HEAP32[((((_wdata+60)&4294967295))>>2)];var $mul=((($6)*($4))&4294967295);var $mul6=((($mul)*($shr))&4294967295);var $div=((((($mul6))|0)/80000)|0);HEAP32[((__ZZ7WavegenvE10amplitude2)>>2)]=$div;var $7=HEAP32[((((_wdata+4)&4294967295))>>2)];var $shr7=($7)>>12;var $div8=((890/((($shr7))|0))|0);HEAP32[((__ZZ7WavegenvE13h_switch_sign)>>2)]=$div8;;}
69376 else if(__label__==6){__ZL17AdvanceParametersv();;}
69377 var $8=HEAP32[((((_wdata+4)&4294967295))>>2)];var $shr10=($8)>>7;var $9=HEAP32[((__ZL16PHASE_INC_FACTOR)>>2)];var $mul11=((($shr10)*($9))&4294967295);HEAP32[((__ZL8phaseinc)>>2)]=$mul11;var $10=HEAP32[((_samplerate)>>2)];var $11=HEAP32[((((_wdata+4)&4294967295))>>2)];var $shr12=($11)>>12;var $div13=((((($10))|0)/((($shr12))|0))|0);HEAP32[((__ZL13cycle_samples)>>2)]=$div13;var $12=HEAP32[((((_wdata+4)&4294967295))>>2)];var $shr14=($12)>>11;HEAP32[((__ZL9hf_factor)>>2)]=$shr14;var $13=HEAP32[((__ZZ7WavegenvE5maxh2)>>2)];HEAP32[((__ZZ7WavegenvE4maxh)>>2)]=$13;var $14=HEAP32[((__ZL7hswitch)>>2)];var $arrayidx=((__ZL6hspect+$14*1600)&4294967295);var $arraydecay=(($arrayidx)&4294967295);HEAP32[((__ZL9harmspect)>>2)]=$arraydecay;var $15=HEAP32[((__ZL7hswitch)>>2)];var $xor=($15)^1;HEAP32[((__ZL7hswitch)>>2)]=$xor;var $16=HEAP32[((((_wdata+4)&4294967295))>>2)];var $shl15=($16)<<4;var $17=HEAP32[((__ZL7hswitch)>>2)];var $arrayidx16=((__ZL6hspect+$17*1600)&4294967295);var $arraydecay17=(($arrayidx16)&4294967295);var $call18=__Z16PeaksToHarmspectP15wavegen_peaks_tiPii(((__ZL5peaks)&4294967295),$shl15,$arraydecay17,1);HEAP32[((__ZZ7WavegenvE5maxh2)>>2)]=$call18;__ZL9SetBreathv();;}
69378 else if(__label__==8){var $and20=($1)&7;var $cmp21=((($and20))|0)==0;if(!($cmp21)){__label__=16;break $if_then3$$if_else19$5;}
69379 $h=1;__lastLabel__=9;;while(1){var $18=__lastLabel__==13?$inc:(1);var $cmp24=((($18))|0)<30;if(!($cmp24)){__label__=14;break;}
69380 var $19=$h;var $20=HEAP32[((__ZZ7WavegenvE5maxh2)>>2)];var $cmp26=((($19))|0)<=((($20))|0);if(!($cmp26)){__label__=14;break;}
69381 var $21=$h;var $22=HEAP32[((__ZZ7WavegenvE4maxh)>>2)];var $cmp27=((($21))|0)<=((($22))|0);if(!($cmp27)){__label__=14;break;}
69382 var $23=$h;var $arrayidx28=((__ZL8harm_inc+$23*4)&4294967295);var $24=HEAP32[(($arrayidx28)>>2)];var $25=$h;var $26=HEAP32[((__ZL9harmspect)>>2)];var $arrayidx29=(($26+4*$25)&4294967295);var $27=HEAP32[(($arrayidx29)>>2)];var $add=((($27)+($24))&4294967295);HEAP32[(($arrayidx29)>>2)]=$add;var $28=$h;var $inc=((($28)+1)&4294967295);$h=$inc;__lastLabel__=13;__label__=10;continue;}
69383 var $29=HEAP32[((__ZZ7WavegenvE3agc)>>2)];var $cmp30=((($29))|0)<256;if(!($cmp30)){__label__=16;break $if_then3$$if_else19$5;}
69384 var $30=HEAP32[((__ZZ7WavegenvE3agc)>>2)];var $inc32=((($30)+1)&4294967295);HEAP32[((__ZZ7WavegenvE3agc)>>2)]=$inc32;;}}while(0);var $31=HEAP32[((__ZL11samplecount)>>2)];var $inc36=((($31)+1)&4294967295);HEAP32[((__ZL11samplecount)>>2)]=$inc36;var $32=HEAP32[((__ZL9wavephase)>>2)];var $cmp37=((($32))|0)>0;var $33=HEAP32[((__ZL8phaseinc)>>2)];var $34=HEAP32[((__ZL9wavephase)>>2)];var $add39=((($34)+($33))&4294967295);HEAP32[((__ZL9wavephase)>>2)]=$add39;var $35=HEAP32[((__ZL9wavephase)>>2)];var $cmp40=((($35))|0)<0;var $or_cond=($cmp37)&($cmp40);if($or_cond){__label__=17;;}else{__label__=38;;}
69385 $if_then41$$if_end118$21:do{if(__label__==17){var $36=HEAP32[((__ZL15wavemult_offset)>>2)];var $37=HEAP32[((__ZL13cycle_samples)>>2)];var $div42=((((($37))|0)/2)|0);var $sub=((($36)-($div42))&4294967295);HEAP32[((__ZL6cbytes)>>2)]=$sub;var $38=HEAP32[((__ZL11samplecount)>>2)];var $39=HEAP32[((__ZL8nsamples)>>2)];var $cmp43=((($38))|0)>((($39))|0);if($cmp43){__label__=18;break $for_cond$2;}
69386 var $40=HEAP32[((__ZZ7WavegenvE11cycle_count)>>2)];var $inc46=((($40)+1)&4294967295);HEAP32[((__ZZ7WavegenvE11cycle_count)>>2)]=$inc46;var $41=HEAP32[((_wvoice)>>2)];var $n_harmonic_peaks=(($41+84)&4294967295);var $42=HEAP32[(($n_harmonic_peaks)>>2)];var $add47=((($42)+1)&4294967295);$pk=$add47;var $cmp495=((($add47))|0)<9;if($cmp495){__label__=20;;}else{__label__=21;;}
69387 $for_body50$$for_end57$24:do{if(__label__==20){while(1){var $43=$pk;var $arrayidx51=((__ZL5peaks+$43*80)&4294967295);var $freq=(($arrayidx51)&4294967295);var $44=HEAP32[(($freq)>>2)];var $45=HEAP32[((((_wdata+4)&4294967295))>>2)];var $mul52=((($45)*16)&4294967295);var $div53=((((($44))|0)/((($mul52))|0))|0);var $46=$pk;var $arrayidx54=((__ZL13peak_harmonic+$46*4)&4294967295);HEAP32[(($arrayidx54)>>2)]=$div53;var $47=$pk;var $inc56=((($47)+1)&4294967295);$pk=$inc56;var $cmp49=((($inc56))|0)<9;if($cmp49){__label__=20;continue;}else{__label__=21;break $for_body50$$for_end57$24;}}}}while(0);var $48=HEAP32[((((_wdata+52)&4294967295))>>2)];var $49=HEAP32[((((_wdata+4)&4294967295))>>2)];var $shr58=($49)>>8;var $50=HEAP32[((((_wdata+60)&4294967295))>>2)];var $mul59=((($50)*($48))&4294967295);var $mul60=((($mul59)*($shr58))&4294967295);var $div61=((((($mul60))|0)/80000)|0);HEAP32[((__ZZ7WavegenvE10amplitude2)>>2)]=$div61;var $51=HEAP32[((__ZL12glottal_flag)>>2)];var $cmp62=((($51))|0)>0;if($cmp62){__label__=22;;}else{__label__=28;;}
69388 $if_then63$$if_end81$28:do{if(__label__==22){var $52=HEAP32[((__ZL12glottal_flag)>>2)];var $cmp64=((($52))|0)==3;if($cmp64){__label__=23;;}else{__label__=25;;}
69389 if(__label__==23){var $53=HEAP32[((__ZL8nsamples)>>2)];var $54=HEAP32[((__ZL11samplecount)>>2)];var $sub66=((($53)-($54))&4294967295);var $55=HEAP32[((__ZL13cycle_samples)>>2)];var $mul67=((($55)*2)&4294967295);var $cmp68=((($sub66))|0)<((($mul67))|0);if(!($cmp68)){__label__=28;break $if_then63$$if_end81$28;}
69390 HEAP32[((__ZL12glottal_flag)>>2)]=2;var $56=HEAP32[((__ZZ7WavegenvE10amplitude2)>>2)];var $57=HEAP32[((__ZL14glottal_reduce)>>2)];var $mul70=((($57)*($56))&4294967295);var $div71=((((($mul70))|0)/256)|0);HEAP32[((__ZZ7WavegenvE10amplitude2)>>2)]=$div71;;}
69391 else if(__label__==25){var $58=HEAP32[((__ZL12glottal_flag)>>2)];var $cmp74=((($58))|0)==4;if($cmp74){__label__=26;;}else{__label__=27;;}
69392 if(__label__==26){HEAP32[((__ZL12glottal_flag)>>2)]=2;var $59=HEAP32[((__ZZ7WavegenvE10amplitude2)>>2)];var $60=HEAP32[((__ZL14glottal_reduce)>>2)];var $mul76=((($60)*($59))&4294967295);var $div77=((((($mul76))|0)/256)|0);HEAP32[((__ZZ7WavegenvE10amplitude2)>>2)]=$div77;;}
69393 else if(__label__==27){var $61=HEAP32[((__ZL12glottal_flag)>>2)];var $dec=((($61)-1)&4294967295);HEAP32[((__ZL12glottal_flag)>>2)]=$dec;;}}}}while(0);var $62=HEAP32[((__ZL13amplitude_env)>>2)];var $cmp82=((($62))|0)!=0;if($cmp82){__label__=29;;}else{__label__=32;;}
69394 if(__label__==29){var $63=HEAP32[((__ZL6amp_ix)>>2)];var $shr84=($63)>>8;$ix=$shr84;var $cmp85=((($shr84))|0)>127;if($cmp85){__label__=30;;}else{__label__=31;;}
69395 if(__label__==30){$ix=127;;}
69396 var $64=$ix;var $65=HEAP32[((__ZL13amplitude_env)>>2)];var $arrayidx88=(($65+$64)&4294967295);var $66=HEAPU8[($arrayidx88)];var $conv=((($66))&255);$amp=$conv;var $67=HEAP32[((__ZZ7WavegenvE10amplitude2)>>2)];var $68=$amp;var $mul89=((($68)*($67))&4294967295);var $div90=((((($mul89))|0)/128)|0);HEAP32[((__ZZ7WavegenvE10amplitude2)>>2)]=$div90;;}
69397 $modn_period=0;var $69=HEAP32[((_voice)>>2)];var $roughness=(($69+72)&4294967295);var $70=HEAP32[(($roughness)>>2)];var $cmp92=((($70))|0)<8;if(!($cmp92)){__label__=38;break $if_then41$$if_end118$21;}
69398 var $71=HEAP32[((__ZL15modulation_type)>>2)];var $72=HEAP32[((_voice)>>2)];var $roughness94=(($72+72)&4294967295);var $73=HEAP32[(($roughness94)>>2)];var $arrayidx95=((__ZL14modulation_tab+$73*8)&4294967295);var $arrayidx96=(($arrayidx95+$71)&4294967295);var $74=HEAPU8[($arrayidx96)];var $conv97=((($74))&255);$modn_period=$conv97;var $75=$modn_period;var $and98=($75)&15;$modn_amp=$and98;var $76=$modn_period;var $shr99=($76)>>4;$modn_period=$shr99;var $cmp101=((($shr99))|0)!=0;if(!($cmp101)){__label__=38;break $if_then41$$if_end118$21;}
69399 var $77=$modn_period;var $cmp103=((($77))|0)==15;if($cmp103){__label__=35;;}else{__label__=36;;}
69400 if(__label__==35){var $78=HEAP32[((__ZZ7WavegenvE10amplitude2)>>2)];var $79=$modn_amp;var $mul105=((($79)*($78))&4294967295);var $div106=((((($mul105))|0)/16)|0);HEAP32[((__ZZ7WavegenvE10amplitude2)>>2)]=$div106;HEAP32[((__ZL15modulation_type)>>2)]=0;;}
69401 else if(__label__==36){var $80=HEAP32[((__ZZ7WavegenvE11cycle_count)>>2)];var $81=$modn_period;var $rem=((($80))|0)%((($81))|0);var $cmp108=((($rem))|0)==0;if(!($cmp108)){__label__=38;break $if_then41$$if_end118$21;}
69402 var $82=HEAP32[((__ZZ7WavegenvE10amplitude2)>>2)];var $83=$modn_amp;var $mul110=((($83)*($82))&4294967295);var $div111=((((($mul110))|0)/16)|0);HEAP32[((__ZZ7WavegenvE10amplitude2)>>2)]=$div111;;}}}while(0);var $84=HEAP32[((__ZL9wavephase)>>2)];var $shr119=($84)>>16;var $conv120=((($shr119))&65535);$waveph=$conv120;$total=0;var $85=HEAP32[((__ZL6cbytes)>>2)];var $inc121=((($85)+1)&4294967295);HEAP32[((__ZL6cbytes)>>2)]=$inc121;var $cmp122=((($inc121))|0)>=0;if($cmp122){__label__=39;;}else{__label__=43;;}
69403 $land_lhs_true123$$if_end149$51:do{if(__label__==39){var $86=HEAP32[((__ZL6cbytes)>>2)];var $87=HEAP32[((__ZL12wavemult_max)>>2)];var $cmp124=((($86))|0)<((($87))|0);if(!($cmp124)){__label__=43;break $land_lhs_true123$$if_end149$51;}
69404 var $88=HEAP32[((_wvoice)>>2)];var $n_harmonic_peaks126=(($88+84)&4294967295);var $89=HEAP32[(($n_harmonic_peaks126)>>2)];var $add127=((($89)+1)&4294967295);$pk=$add127;var $cmp1294=((($add127))|0)<9;if($cmp1294){__label__=41;;}else{__label__=42;;}
69405 $for_body130$$for_end144$54:do{if(__label__==41){while(1){var $90=$pk;var $arrayidx131=((__ZL13peak_harmonic+$90*4)&4294967295);var $91=HEAP32[(($arrayidx131)>>2)];var $92=$waveph;var $conv132=((($92))&65535);var $mul133=((($conv132)*($91))&4294967295);var $conv134=((($mul133))&65535);$theta=$conv134;var $93=$theta;var $conv135=((($93))&65535);var $shr136=($conv135)>>5;var $arrayidx137=((_sin_tab+$shr136*2)&4294967295);var $94=HEAP16[(($arrayidx137)>>1)];var $conv138=(tempInt=(($94)),(tempInt>=32768?tempInt-65536:tempInt));var $95=$pk;var $arrayidx139=((__ZL11peak_height+$95*4)&4294967295);var $96=HEAP32[(($arrayidx139)>>2)];var $mul140=((($96)*($conv138))&4294967295);var $97=$total;var $add141=((($97)+($mul140))&4294967295);$total=$add141;var $98=$pk;var $inc143=((($98)+1)&4294967295);$pk=$inc143;var $cmp129=((($inc143))|0)<9;if($cmp129){__label__=41;continue;}else{__label__=42;break $for_body130$$for_end144$54;}}}}while(0);var $99=$total;var $100=HEAP32[((__ZL9hf_factor)>>2)];var $div145=((((($99))|0)/((($100))|0))|0);var $101=HEAP32[((__ZL6cbytes)>>2)];var $arrayidx146=((__ZL8wavemult+$101)&4294967295);var $102=HEAPU8[($arrayidx146)];var $conv147=((($102))&255);var $mul148=((($conv147)*($div145))&4294967295);$total=$mul148;;}}while(0);var $103=$waveph;$theta=$103;$h=1;var $104=$h;var $105=HEAP32[((__ZZ7WavegenvE13h_switch_sign)>>2)];var $cmp1516=((($104))|0)<=((($105))|0);if($cmp1516){__label__=44;;}else{__label__=45;;}
69406 $for_body152$$while_cond_loopexit$59:do{if(__label__==44){while(1){var $106=$theta;var $conv153=((($106))&65535);var $shr154=($conv153)>>5;var $arrayidx155=((_sin_tab+$shr154*2)&4294967295);var $107=HEAP16[(($arrayidx155)>>1)];var $conv156=(tempInt=(($107)),(tempInt>=32768?tempInt-65536:tempInt));var $108=$h;var $109=HEAP32[((__ZL9harmspect)>>2)];var $arrayidx157=(($109+4*$108)&4294967295);var $110=HEAP32[(($arrayidx157)>>2)];var $mul158=((($110)*($conv156))&4294967295);var $111=$total;var $add159=((($111)+($mul158))&4294967295);$total=$add159;var $112=$waveph;var $conv160=((($112))&65535);var $113=$theta;var $conv161=((($113))&65535);var $add162=((($conv161)+($conv160))&4294967295);var $conv163=((($add162))&65535);$theta=$conv163;var $114=$h;var $inc165=((($114)+1)&4294967295);$h=$inc165;var $115=$h;var $116=HEAP32[((__ZZ7WavegenvE13h_switch_sign)>>2)];var $cmp151=((($115))|0)<=((($116))|0);if($cmp151){__label__=44;continue;}else{__label__=45;break $for_body152$$while_cond_loopexit$59;}}}}while(0);var $117=$h;var $118=HEAP32[((__ZZ7WavegenvE4maxh)>>2)];var $cmp1677=((($117))|0)<=((($118))|0);if($cmp1677){__label__=46;;}else{__label__=47;;}
69407 $while_body$$while_end$63:do{if(__label__==46){while(1){var $119=$theta;var $conv168=((($119))&65535);var $shr169=($conv168)>>5;var $arrayidx170=((_sin_tab+$shr169*2)&4294967295);var $120=HEAP16[(($arrayidx170)>>1)];var $conv171=(tempInt=(($120)),(tempInt>=32768?tempInt-65536:tempInt));var $121=$h;var $122=HEAP32[((__ZL9harmspect)>>2)];var $arrayidx172=(($122+4*$121)&4294967295);var $123=HEAP32[(($arrayidx172)>>2)];var $mul173=((($123)*($conv171))&4294967295);var $124=$total;var $sub174=((($124)-($mul173))&4294967295);$total=$sub174;var $125=$waveph;var $conv175=((($125))&65535);var $126=$theta;var $conv176=((($126))&65535);var $add177=((($conv176)+($conv175))&4294967295);var $conv178=((($add177))&65535);$theta=$conv178;var $127=$h;var $inc179=((($127)+1)&4294967295);$h=$inc179;var $128=$h;var $129=HEAP32[((__ZZ7WavegenvE4maxh)>>2)];var $cmp167=((($128))|0)<=((($129))|0);if($cmp167){__label__=46;continue;}else{__label__=47;break $while_body$$while_end$63;}}}}while(0);var $130=HEAP32[((__ZL7voicing)>>2)];var $cmp180=((($130))|0)!=64;if($cmp180){__label__=48;;}else{__label__=49;;}
69408 if(__label__==48){var $131=$total;var $shr182=($131)>>6;var $132=HEAP32[((__ZL7voicing)>>2)];var $mul183=((($shr182)*($132))&4294967295);$total=$mul183;;}
69409 var $133=HEAP32[((_wvoice)>>2)];var $breath=(($133+272)&4294967295);var $arrayidx185=(($breath)&4294967295);var $134=HEAP32[(($arrayidx185)>>2)];var $tobool=((($134))|0)!=0;if($tobool){__label__=50;;}else{__label__=51;;}
69410 if(__label__==50){var $call187=__ZL11ApplyBreathv();var $135=$total;var $add188=((($135)+($call187))&4294967295);$total=$add188;;}
69411 $z2=0;var $136=HEAP32[((((_wdata+40)&4294967295))>>2)];var $137=HEAP32[((((_wdata+28)&4294967295))>>2)];var $cmp190=((($136))|0)<((($137))|0);if($cmp190){__label__=52;;}else{__label__=57;;}
69412 $if_then191$$if_end222$73:do{if(__label__==52){var $138=HEAP32[((((_wdata+32)&4294967295))>>2)];var $cmp192=((($138))|0)==0;if($cmp192){__label__=53;;}else{__label__=54;;}
69413 if(__label__==53){var $139=HEAP32[((((_wdata+40)&4294967295))>>2)];var $140=HEAP32[((((_wdata+48)&4294967295))>>2)];var $add194=((($139)+1)&4294967295);var $add195=((($add194)+($140))&4294967295);var $141=HEAP32[((((_wdata+24)&4294967295))>>2)];var $arrayidx196=(($141+$add195)&4294967295);var $142=HEAP8[($arrayidx196)];$c=$142;var $143=HEAP32[((((_wdata+40)&4294967295))>>2)];var $144=HEAP32[((((_wdata+48)&4294967295))>>2)];var $add197=((($144)+($143))&4294967295);var $145=HEAP32[((((_wdata+24)&4294967295))>>2)];var $arrayidx198=(($145+$add197)&4294967295);var $146=HEAPU8[($arrayidx198)];var $conv199=((($146))&255);var $147=$c;var $conv200=(tempInt=(($147)),(tempInt>=128?tempInt-256:tempInt));var $mul201=((($conv200)*256)&4294967295);var $add202=((($mul201)+($conv199))&4294967295);$sample=$add202;var $148=HEAP32[((((_wdata+40)&4294967295))>>2)];var $add203=((($148)+2)&4294967295);HEAP32[((((_wdata+40)&4294967295))>>2)]=$add203;;}
69414 else if(__label__==54){var $149=HEAP32[((((_wdata+48)&4294967295))>>2)];var $150=HEAP32[((((_wdata+40)&4294967295))>>2)];var $inc205=((($150)+1)&4294967295);HEAP32[((((_wdata+40)&4294967295))>>2)]=$inc205;var $add206=((($150)+($149))&4294967295);var $151=HEAP32[((((_wdata+24)&4294967295))>>2)];var $arrayidx207=(($151+$add206)&4294967295);var $152=HEAP8[($arrayidx207)];var $conv208=(tempInt=(($152)),(tempInt>=128?tempInt-256:tempInt));var $153=HEAP32[((((_wdata+32)&4294967295))>>2)];var $mul209=((($conv208)*($153))&4294967295);$sample=$mul209;;}
69415 var $154=$sample;var $155=HEAP32[((((_wdata+56)&4294967295))>>2)];var $mul211=((($155)*($154))&4294967295);var $shr212=($mul211)>>10;$z2=$shr212;var $156=$z2;var $157=HEAP32[((((_wdata+36)&4294967295))>>2)];var $mul213=((($157)*($156))&4294967295);var $div214=((((($mul213))|0)/32)|0);$z2=$div214;var $158=HEAP32[((((_wdata+40)&4294967295))>>2)];var $159=HEAP32[((((_wdata+48)&4294967295))>>2)];var $add215=((($159)+($158))&4294967295);var $160=HEAP32[((((_wdata+44)&4294967295))>>2)];var $cmp216=((($add215))|0)>=((($160))|0);if(!($cmp216)){__label__=57;break $if_then191$$if_end222$73;}
69416 var $161=HEAP32[((((_wdata+44)&4294967295))>>2)];var $mul218=((($161)*3)&4294967295);var $div219=((((($mul218))|0)/4)|0);var $162=HEAP32[((((_wdata+48)&4294967295))>>2)];var $sub220=((($162)-($div219))&4294967295);HEAP32[((((_wdata+48)&4294967295))>>2)]=$sub220;;}}while(0);var $163=$z2;var $164=$total;var $shr223=($164)>>8;var $165=HEAP32[((__ZZ7WavegenvE10amplitude2)>>2)];var $mul224=((($shr223)*($165))&4294967295);var $shr225=($mul224)>>13;var $add226=((($shr225)+($163))&4294967295);$z1=$add226;var $166=HEAP32[((_echo_tail)>>2)];var $inc227=((($166)+1)&4294967295);HEAP32[((_echo_tail)>>2)]=$inc227;var $arrayidx228=((_echo_buf+$166*2)&4294967295);var $167=HEAP16[(($arrayidx228)>>1)];var $conv229=(tempInt=(($167)),(tempInt>=32768?tempInt-65536:tempInt));var $168=HEAP32[((_echo_amp)>>2)];var $mul230=((($conv229)*($168))&4294967295);$echo=$mul230;var $169=$echo;var $shr231=($169)>>8;var $170=$z1;var $add232=((($170)+($shr231))&4294967295);$z1=$add232;var $171=HEAP32[((_echo_tail)>>2)];var $cmp233=((($171))|0)>=5500;if($cmp233){__label__=58;;}else{__label__=59;;}
69417 if(__label__==58){HEAP32[((_echo_tail)>>2)]=0;;}
69418 var $172=$z1;var $173=HEAP32[((__ZZ7WavegenvE3agc)>>2)];var $mul236=((($173)*($172))&4294967295);var $shr237=($mul236)>>8;$z=$shr237;var $cmp238=((($shr237))|0)>=32768;if($cmp238){__label__=60;;}else{__label__=63;;}
69419 $if_then239$$if_else247$84:do{if(__label__==60){var $174=$z1;var $div240=((8388608/((($174))|0))|0);var $sub241=((($div240)-1)&4294967295);$ov=$sub241;var $175=$ov;var $176=HEAP32[((__ZZ7WavegenvE3agc)>>2)];var $cmp242=((($175))|0)<((($176))|0);if($cmp242){__label__=61;;}else{__label__=62;;}
69420 if(__label__==61){var $177=$ov;HEAP32[((__ZZ7WavegenvE3agc)>>2)]=$177;;}
69421 var $178=$z1;var $179=HEAP32[((__ZZ7WavegenvE3agc)>>2)];var $mul245=((($179)*($178))&4294967295);var $shr246=($mul245)>>8;$z=$shr246;;}
69422 else if(__label__==63){var $180=$z;var $cmp248=((($180))|0)<=-32768;if(!($cmp248)){__label__=67;break $if_then239$$if_else247$84;}
69423 var $181=$z1;var $div250=((-8388608/((($181))|0))|0);var $sub251=((($div250)-1)&4294967295);$ov=$sub251;var $182=$ov;var $183=HEAP32[((__ZZ7WavegenvE3agc)>>2)];var $cmp252=((($182))|0)<((($183))|0);if($cmp252){__label__=65;;}else{__label__=66;;}
69424 if(__label__==65){var $184=$ov;HEAP32[((__ZZ7WavegenvE3agc)>>2)]=$184;;}
69425 var $185=$z1;var $186=HEAP32[((__ZZ7WavegenvE3agc)>>2)];var $mul255=((($186)*($185))&4294967295);var $shr256=($mul255)>>8;$z=$shr256;;}}while(0);var $187=$z;var $conv259=((($187))&255);var $188=HEAP32[((_out_ptr)>>2)];var $incdec_ptr=(($188+1)&4294967295);HEAP32[((_out_ptr)>>2)]=$incdec_ptr;HEAP8[($188)]=$conv259;var $189=$z;var $shr260=($189)>>8;var $conv261=((($shr260))&255);var $190=HEAP32[((_out_ptr)>>2)];var $incdec_ptr262=(($190+1)&4294967295);HEAP32[((_out_ptr)>>2)]=$incdec_ptr262;HEAP8[($190)]=$conv261;var $191=$z;var $conv263=((($191))&65535);var $192=HEAP32[((_echo_head)>>2)];var $inc264=((($192)+1)&4294967295);HEAP32[((_echo_head)>>2)]=$inc264;var $arrayidx265=((_echo_buf+$192*2)&4294967295);HEAP16[(($arrayidx265)>>1)]=$conv263;var $193=HEAP32[((_echo_head)>>2)];var $cmp266=((($193))|0)>=5500;if($cmp266){__label__=68;;}else{__label__=69;;}
69426 if(__label__==68){HEAP32[((_echo_head)>>2)]=0;;}
69427 var $194=HEAPU32[((_out_ptr)>>2)];var $195=HEAPU32[((_out_end)>>2)];var $cmp269=((($194))>>>0)>=((($195))>>>0);if($cmp269){__label__=70;break $for_cond$2;}else{__label__=1;continue $for_cond$2;}}
69428 if(__label__==2){$retval=0;;}
69429 else if(__label__==18){$retval=0;;}
69430 else if(__label__==70){$retval=1;;}
69431 var $196=$retval;;return $196;return null;}
69432 function __ZL17AdvanceParametersv(){;var __label__;var __lastLabel__=null;var $x;var $ix;var $0=HEAP32[((((_wdata+12)&4294967295))>>2)];var $1=HEAP32[((((_wdata+8)&4294967295))>>2)];var $add=((($1)+($0))&4294967295);HEAP32[((((_wdata+8)&4294967295))>>2)]=$add;var $2=HEAP32[((((_wdata+8)&4294967295))>>2)];var $shr=($2)>>8;$ix=$shr;var $cmp=((($shr))|0)>127;if($cmp){__label__=1;;}else{__label__=2;;}
69433 if(__label__==1){$ix=127;;}
69434 var $3=$ix;var $4=HEAP32[((((_wdata)&4294967295))>>2)];var $arrayidx=(($4+$3)&4294967295);var $5=HEAPU8[($arrayidx)];var $conv=((($5))&255);var $6=HEAP32[((((_wdata+20)&4294967295))>>2)];var $mul=((($conv)*($6))&4294967295);$x=$mul;var $7=$x;var $shr1=($7)>>8;var $8=HEAP32[((((_wdata+16)&4294967295))>>2)];var $add2=((($shr1)+($8))&4294967295);HEAP32[((((_wdata+4)&4294967295))>>2)]=$add2;var $9=HEAP32[((__ZL7amp_inc)>>2)];var $10=HEAP32[((__ZL6amp_ix)>>2)];var $add3=((($10)+($9))&4294967295);HEAP32[((__ZL6amp_ix)>>2)]=$add3;var $11=HEAP32[((__ZZL17AdvanceParametersvE10Flutter_ix)>>2)];var $cmp4=((($11))|0)>=23552;if($cmp4){__label__=3;;}else{__label__=4;;}
69435 if(__label__==3){HEAP32[((__ZZL17AdvanceParametersvE10Flutter_ix)>>2)]=0;;}
69436 var $12=HEAP32[((__ZZL17AdvanceParametersvE10Flutter_ix)>>2)];var $shr7=($12)>>6;var $arrayidx8=((__ZL11Flutter_tab+$shr7)&4294967295);var $13=HEAPU8[($arrayidx8)];var $conv9=((($13))&255);var $sub=((($conv9)-128)&4294967295);var $14=HEAP32[((__ZL11flutter_amp)>>2)];var $mul10=((($sub)*($14))&4294967295);$x=$mul10;var $15=HEAP32[((__ZL11Flutter_inc)>>2)];var $16=HEAP32[((__ZZL17AdvanceParametersvE10Flutter_ix)>>2)];var $add11=((($16)+($15))&4294967295);HEAP32[((__ZZL17AdvanceParametersvE10Flutter_ix)>>2)]=$add11;var $17=$x;var $18=HEAP32[((((_wdata+4)&4294967295))>>2)];var $add12=((($18)+($17))&4294967295);HEAP32[((((_wdata+4)&4294967295))>>2)]=$add12;var $cmp13=((($add12))|0)<102400;if($cmp13){__label__=5;;}else{__label__=6;;}
69437 if(__label__==5){HEAP32[((((_wdata+4)&4294967295))>>2)]=102400;;}
69438 var $19=HEAP32[((__ZL11samplecount)>>2)];var $20=HEAP32[((__ZL17samplecount_start)>>2)];var $cmp16=((($19))|0)==((($20))|0);if($cmp16){__label__=21;;}else{__label__=7;;}
69439 $for_end93$$if_end18$11:do{if(__label__==7){$ix=0;var $21=$ix;var $22=HEAP32[((_wvoice)>>2)];var $n_harmonic_peaks2=(($22+84)&4294967295);var $23=HEAP32[(($n_harmonic_peaks2)>>2)];var $cmp193=((($21))|0)<=((($23))|0);if($cmp193){__lastLabel__=7;__label__=9;;}else{__lastLabel__=7;__label__=8;;}
69440 $for_body$$for_cond60_preheader$13:do{if(__label__==9){while(1){var $24=$ix;var $arrayidx20=((__ZL5peaks+$24*80)&4294967295);var $freq_inc=(($arrayidx20+48)&4294967295);var $25=HEAPF32[(($freq_inc)>>2)];var $26=$ix;var $arrayidx21=((__ZL5peaks+$26*80)&4294967295);var $freq1=(($arrayidx21+16)&4294967295);var $27=HEAPF32[(($freq1)>>2)];var $add22=($27)+($25);HEAPF32[(($freq1)>>2)]=$add22;var $28=$ix;var $arrayidx23=((__ZL5peaks+$28*80)&4294967295);var $freq124=(($arrayidx23+16)&4294967295);var $29=HEAPF32[(($freq124)>>2)];var $conv25=((($29))|0);var $30=$ix;var $arrayidx26=((__ZL5peaks+$30*80)&4294967295);var $freq=(($arrayidx26)&4294967295);HEAP32[(($freq)>>2)]=$conv25;var $31=$ix;var $arrayidx27=((__ZL5peaks+$31*80)&4294967295);var $height_inc=(($arrayidx27+56)&4294967295);var $32=HEAPF32[(($height_inc)>>2)];var $33=$ix;var $arrayidx28=((__ZL5peaks+$33*80)&4294967295);var $height1=(($arrayidx28+24)&4294967295);var $34=HEAPF32[(($height1)>>2)];var $add29=($34)+($32);HEAPF32[(($height1)>>2)]=$add29;var $35=$ix;var $arrayidx30=((__ZL5peaks+$35*80)&4294967295);var $height131=(($arrayidx30+24)&4294967295);var $36=HEAPF32[(($height131)>>2)];var $conv32=((($36))|0);var $37=$ix;var $arrayidx33=((__ZL5peaks+$37*80)&4294967295);var $height=(($arrayidx33+4)&4294967295);HEAP32[(($height)>>2)]=$conv32;var $cmp34=((($conv32))|0)<0;if($cmp34){__label__=10;;}else{__label__=11;;}
69441 if(__label__==10){var $38=$ix;var $arrayidx36=((__ZL5peaks+$38*80)&4294967295);var $height37=(($arrayidx36+4)&4294967295);HEAP32[(($height37)>>2)]=0;;}
69442 var $39=$ix;var $arrayidx39=((__ZL5peaks+$39*80)&4294967295);var $left_inc=(($arrayidx39+64)&4294967295);var $40=HEAPF32[(($left_inc)>>2)];var $41=$ix;var $arrayidx40=((__ZL5peaks+$41*80)&4294967295);var $left1=(($arrayidx40+32)&4294967295);var $42=HEAPF32[(($left1)>>2)];var $add41=($42)+($40);HEAPF32[(($left1)>>2)]=$add41;var $43=$ix;var $arrayidx42=((__ZL5peaks+$43*80)&4294967295);var $left143=(($arrayidx42+32)&4294967295);var $44=HEAPF32[(($left143)>>2)];var $conv44=((($44))|0);var $45=$ix;var $arrayidx45=((__ZL5peaks+$45*80)&4294967295);var $left=(($arrayidx45+8)&4294967295);HEAP32[(($left)>>2)]=$conv44;var $46=$ix;var $cmp46=((($46))|0)<3;var $47=$ix;var $arrayidx48=((__ZL5peaks+$47*80)&4294967295);if($cmp46){__label__=12;;}else{__label__=13;;}
69443 if(__label__==12){var $right_inc=(($arrayidx48+72)&4294967295);var $48=HEAPF32[(($right_inc)>>2)];var $49=$ix;var $arrayidx49=((__ZL5peaks+$49*80)&4294967295);var $right1=(($arrayidx49+40)&4294967295);var $50=HEAPF32[(($right1)>>2)];var $add50=($50)+($48);HEAPF32[(($right1)>>2)]=$add50;var $51=$ix;var $arrayidx51=((__ZL5peaks+$51*80)&4294967295);var $right152=(($arrayidx51+40)&4294967295);var $52=HEAPF32[(($right152)>>2)];var $conv53=((($52))|0);var $53=$ix;var $arrayidx54=((__ZL5peaks+$53*80)&4294967295);var $right=(($arrayidx54+12)&4294967295);HEAP32[(($right)>>2)]=$conv53;;}
69444 else if(__label__==13){var $left56=(($arrayidx48+8)&4294967295);var $54=HEAP32[(($left56)>>2)];var $55=$ix;var $arrayidx57=((__ZL5peaks+$55*80)&4294967295);var $right58=(($arrayidx57+12)&4294967295);HEAP32[(($right58)>>2)]=$54;;}
69445 var $56=$ix;var $inc=((($56)+1)&4294967295);$ix=$inc;var $57=$ix;var $58=HEAP32[((_wvoice)>>2)];var $n_harmonic_peaks=(($58+84)&4294967295);var $59=HEAP32[(($n_harmonic_peaks)>>2)];var $cmp19=((($57))|0)<=((($59))|0);if($cmp19){__lastLabel__=14;__label__=9;continue;}else{__lastLabel__=14;__label__=8;break $for_body$$for_cond60_preheader$13;}}}}while(0);var $_lcssa=__lastLabel__==7?$21:($57);var $cmp611=((($_lcssa))|0)<8;if(!($cmp611)){__label__=21;break $for_end93$$if_end18$11;}
69446 var $_pr=$ix;__lastLabel__=15;;while(1){var $60=__lastLabel__==15?$_pr:($inc92);var $cmp63=((($60))|0)<7;if($cmp63){__label__=17;;}else{__label__=18;;}
69447 if(__label__==17){var $61=$ix;var $arrayidx65=((__ZL5peaks+$61*80)&4294967295);var $freq_inc66=(($arrayidx65+48)&4294967295);var $62=HEAPF32[(($freq_inc66)>>2)];var $63=$ix;var $arrayidx67=((__ZL5peaks+$63*80)&4294967295);var $freq168=(($arrayidx67+16)&4294967295);var $64=HEAPF32[(($freq168)>>2)];var $add69=($64)+($62);HEAPF32[(($freq168)>>2)]=$add69;var $65=$ix;var $arrayidx70=((__ZL5peaks+$65*80)&4294967295);var $freq171=(($arrayidx70+16)&4294967295);var $66=HEAPF32[(($freq171)>>2)];var $conv72=((($66))|0);var $67=$ix;var $arrayidx73=((__ZL5peaks+$67*80)&4294967295);var $freq74=(($arrayidx73)&4294967295);HEAP32[(($freq74)>>2)]=$conv72;;}
69448 var $68=$ix;var $arrayidx76=((__ZL5peaks+$68*80)&4294967295);var $height_inc77=(($arrayidx76+56)&4294967295);var $69=HEAPF32[(($height_inc77)>>2)];var $70=$ix;var $arrayidx78=((__ZL5peaks+$70*80)&4294967295);var $height179=(($arrayidx78+24)&4294967295);var $71=HEAPF32[(($height179)>>2)];var $add80=($71)+($69);HEAPF32[(($height179)>>2)]=$add80;var $72=$ix;var $arrayidx81=((__ZL5peaks+$72*80)&4294967295);var $height182=(($arrayidx81+24)&4294967295);var $73=HEAPF32[(($height182)>>2)];var $conv83=((($73))|0);var $74=$ix;var $arrayidx84=((__ZL5peaks+$74*80)&4294967295);var $height85=(($arrayidx84+4)&4294967295);HEAP32[(($height85)>>2)]=$conv83;var $cmp86=((($conv83))|0)<0;if($cmp86){__label__=19;;}else{__label__=20;;}
69449 if(__label__==19){var $75=$ix;var $arrayidx88=((__ZL5peaks+$75*80)&4294967295);var $height89=(($arrayidx88+4)&4294967295);HEAP32[(($height89)>>2)]=0;;}
69450 var $76=$ix;var $inc92=((($76)+1)&4294967295);$ix=$inc92;var $cmp61=((($inc92))|0)<8;if($cmp61){__lastLabel__=20;__label__=16;continue;}else{__lastLabel__=20;__label__=21;break $for_end93$$if_end18$11;}}}}while(0);;return;return;}
69451 function __ZL9SetBreathv(){;var __label__;var $pk;var $0=HEAP32[((_wvoice)>>2)];var $breath=(($0+272)&4294967295);var $arrayidx=(($breath)&4294967295);var $1=HEAP32[(($arrayidx)>>2)];var $cmp=((($1))|0)==0;if($cmp){__label__=5;;}else{__label__=1;;}
69452 $for_end$$if_end$2:do{if(__label__==1){$pk=1;;while(1){var $2=$pk;var $3=HEAP32[((_wvoice)>>2)];var $breath2=(($3+272)&4294967295);var $arrayidx3=(($breath2+$2*4)&4294967295);var $4=HEAP32[(($arrayidx3)>>2)];var $cmp4=((($4))|0)!=0;if($cmp4){__label__=3;;}else{__label__=4;;}
69453 if(__label__==3){var $5=$pk;var $arrayidx6=((__ZL7rbreath+$5*40)&4294967295);var $6=$pk;var $arrayidx7=((__ZL5peaks+$6*80)&4294967295);var $freq=(($arrayidx7)&4294967295);var $7=HEAP32[(($freq)>>2)];var $shr=($7)>>16;var $8=$pk;var $9=HEAP32[((_wvoice)>>2)];var $breathw=(($9+308)&4294967295);var $arrayidx8=(($breathw+$8*4)&4294967295);var $10=HEAP32[(($arrayidx8)>>2)];__ZL12setresonatorP9RESONATORiii($arrayidx6,$shr,$10,0);;}
69454 var $11=$pk;var $inc=((($11)+1)&4294967295);$pk=$inc;var $cmp1=((($inc))|0)<9;if($cmp1){__label__=2;continue;}else{__label__=5;break $for_end$$if_end$2;}}}}while(0);;return;return;}
69455 function __ZL11ApplyBreathv(){;var __label__;var $value;var $noise;var $ix;var $amp;$value=0;var $call=_rand();var $and=($call)&16383;var $sub=((($and)-8192)&4294967295);$noise=$sub;$ix=1;;while(1){var $0=$ix;var $1=HEAP32[((_wvoice)>>2)];var $breath=(($1+272)&4294967295);var $arrayidx=(($breath+$0*4)&4294967295);var $2=HEAP32[(($arrayidx)>>2)];$amp=$2;var $cmp1=((($2))|0)!=0;if($cmp1){__label__=2;;}else{__label__=3;;}
69456 if(__label__==2){var $3=$ix;var $arrayidx2=((__ZL5peaks+$3*80)&4294967295);var $height=(($arrayidx2+4)&4294967295);var $4=HEAP32[(($height)>>2)];var $shr=($4)>>14;var $5=$amp;var $mul=((($5)*($shr))&4294967295);$amp=$mul;var $6=$ix;var $arrayidx3=((__ZL7rbreath+$6*40)&4294967295);var $7=$noise;var $conv=((($7))|0);var $call4=__ZL9resonatorP9RESONATORd($arrayidx3,$conv);var $8=$amp;var $conv5=((($8))|0);var $mul6=($call4)*($conv5);var $conv7=((($mul6))|0);var $9=$value;var $add=((($conv7)+($9))&4294967295);$value=$add;;}
69457 var $10=$ix;var $inc=((($10)+1)&4294967295);$ix=$inc;var $cmp=((($inc))|0)<9;if($cmp){__label__=1;continue;}else{__label__=4;break;}}
69458 var $11=$value;;return $11;return null;}
69459 function __Z11SetEmbeddedii($control,$value){;var __label__;var __lastLabel__=null;var $control_addr;var $value_addr;var $sign;var $command;$control_addr=$control;$value_addr=$value;$sign=0;var $0=$control_addr;var $and=($0)&31;$command=$and;var $1=$control_addr;var $and1=($1)&96;var $cmp=((($and1))|0)==96;if($cmp){__label__=1;;}else{__label__=2;;}
69460 $if_then$$if_else$2:do{if(__label__==1){$sign=-1;;}
69461 else if(__label__==2){var $2=$control_addr;var $and2=($2)&96;var $cmp3=((($and2))|0)==64;if(!($cmp3)){__label__=4;break $if_then$$if_else$2;}
69462 $sign=1;;}}while(0);var $3=$command;var $cmp6=((($3))|0)<15;if($cmp6){__lastLabel__=4;__label__=5;;}else{__lastLabel__=4;__label__=9;;}
69463 if(__label__==5){var $4=$sign;var $cmp8=((($4))|0)==0;var $5=$value_addr;if($cmp8){__label__=6;;}else{__label__=7;;}
69464 if(__label__==6){var $6=$command;var $arrayidx=((_embedded_value+$6*4)&4294967295);HEAP32[(($arrayidx)>>2)]=$5;;}
69465 else if(__label__==7){var $7=$sign;var $mul=((($7)*($5))&4294967295);var $8=$command;var $arrayidx11=((_embedded_value+$8*4)&4294967295);var $9=HEAP32[(($arrayidx11)>>2)];var $add=((($9)+($mul))&4294967295);HEAP32[(($arrayidx11)>>2)]=$add;;}
69466 var $10=$command;var $arrayidx13=((_embedded_value+$10*4)&4294967295);var $11=HEAP32[(($arrayidx13)>>2)];var $12=$command;var $arrayidx14=((__ZL12embedded_max+$12*4)&4294967295);var $13=HEAP32[(($arrayidx14)>>2)];var $call=__ZL13SetWithRange0ii($11,$13);var $14=$command;var $arrayidx15=((_embedded_value+$14*4)&4294967295);HEAP32[(($arrayidx15)>>2)]=$call;var $_pr=$command;__lastLabel__=8;;}
69467 var $15=__lastLabel__==8?$_pr:($3);if($15==6){__label__=10;;}
69468 else if($15==1){__label__=11;;}
69469 else if($15==3){__label__=12;;}
69470 else if($15==13){__label__=13;;}
69471 else if($15==5){__label__=14;;}
69472 else{__label__=15;;}
69473 $sw_epilog$$sw_bb$$sw_bb17$$sw_bb18$$sw_bb20$$sw_bb22$14:do{if(__label__==10){__ZL14WavegenSetEchov();__label__=11;break $sw_epilog$$sw_bb$$sw_bb17$$sw_bb18$$sw_bb20$$sw_bb22$14;}
69474 else if(__label__==12){var $call19=__Z12GetAmplitudev();HEAP32[((__ZL17general_amplitude)>>2)]=$call19;__label__=15;break $sw_epilog$$sw_bb$$sw_bb17$$sw_bb18$$sw_bb20$$sw_bb22$14;}
69475 else if(__label__==13){var $call21=__Z12GetAmplitudev();HEAP32[((__ZL17general_amplitude)>>2)]=$call21;__label__=15;break $sw_epilog$$sw_bb$$sw_bb17$$sw_bb18$$sw_bb20$$sw_bb22$14;}
69476 else if(__label__==14){__ZL14WavegenSetEchov();__label__=15;break $sw_epilog$$sw_bb$$sw_bb17$$sw_bb18$$sw_bb20$$sw_bb22$14;}}while(0);if(__label__==11){__ZL16SetPitchFormantsv();;};return;return;}
69477 function __ZL13SetWithRange0ii($value,$max){;var __label__;var $retval;var $value_addr;var $max_addr;$value_addr=$value;$max_addr=$max;var $0=$value_addr;var $cmp=((($0))|0)<0;if($cmp){__label__=1;;}else{__label__=2;;}
69478 if(__label__==1){$retval=0;;}
69479 else if(__label__==2){var $1=$value_addr;var $2=$max_addr;var $cmp1=((($1))|0)>((($2))|0);if($cmp1){__label__=3;;}else{__label__=4;;}
69480 if(__label__==3){var $3=$max_addr;$retval=$3;;}
69481 else if(__label__==4){var $4=$value_addr;$retval=$4;;}}
69482 var $5=$retval;;return $5;return null;}
69483 function __ZL14WavegenSetEchov(){;var __label__;var __lastLabel__=null;var $delay;var $amp;var $0=HEAP32[((_wvoice)>>2)];var $voicing=(($0+92)&4294967295);var $1=HEAP32[(($voicing)>>2)];HEAP32[((__ZL7voicing)>>2)]=$1;var $2=HEAP32[((_wvoice)>>2)];var $echo_delay=(($2+76)&4294967295);var $3=HEAP32[(($echo_delay)>>2)];$delay=$3;var $4=HEAP32[((_wvoice)>>2)];var $echo_amp=(($4+80)&4294967295);var $5=HEAP32[(($echo_amp)>>2)];$amp=$5;var $6=$delay;var $cmp=((($6))|0)>=5500;if($cmp){__lastLabel__=0;__label__=1;;}else{__lastLabel__=0;__label__=2;;}
69484 if(__label__==1){$delay=5499;var $_pr=$amp;__lastLabel__=1;;}
69485 var $7=__lastLabel__==1?$_pr:($5);var $cmp1=((($7))|0)>100;if($cmp1){__label__=3;;}else{__label__=4;;}
69486 if(__label__==3){$amp=100;;}
69487 var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=_echo_buf;$stop$=$dest$+11000;$value4$=0;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=0;}
69488 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
69489 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=0;};HEAP32[((_echo_tail)>>2)]=0;var $8=HEAP32[((((_embedded_value+20)&4294967295))>>2)];var $cmp4=((($8))|0)>0;if($cmp4){__label__=5;;}else{__label__=6;;}
69490 $if_end6_thread$$if_end6$8:do{if(__label__==5){var $9=HEAP32[((((_embedded_value+20)&4294967295))>>2)];$amp=$9;$delay=130;;}
69491 else if(__label__==6){var $_pr1=$delay;var $cmp7=((($_pr1))|0)==0;if(!($cmp7)){__label__=8;break $if_end6_thread$$if_end6$8;}
69492 $amp=0;;}}while(0);var $10=$delay;var $11=HEAP32[((_samplerate)>>2)];var $mul=((($11)*($10))&4294967295);var $div=((((($mul))|0)/1000)|0);HEAP32[((_echo_head)>>2)]=$div;var $12=HEAP32[((_echo_head)>>2)];HEAP32[((__ZL11echo_length)>>2)]=$12;var $13=$amp;var $cmp10=((($13))|0)==0;if($cmp10){__lastLabel__=8;__label__=9;;}else{__lastLabel__=8;__label__=10;;}
69493 if(__label__==9){HEAP32[((__ZL11echo_length)>>2)]=0;var $_pr3=$amp;__lastLabel__=9;;}
69494 var $14=__lastLabel__==9?$_pr3:($13);var $cmp13=((($14))|0)>20;if($cmp13){__label__=11;;}else{__label__=12;;}
69495 if(__label__==11){var $15=HEAP32[((_echo_head)>>2)];var $mul15=((($15)*2)&4294967295);HEAP32[((__ZL11echo_length)>>2)]=$mul15;;}
69496 var $16=$amp;HEAP32[((_echo_amp)>>2)]=$16;var $call=__Z12GetAmplitudev();HEAP32[((__ZL17general_amplitude)>>2)]=$call;var $17=HEAP32[((__ZL17general_amplitude)>>2)];var $18=$amp;var $sub=((500-($18))&4294967295);var $mul17=((($sub)*($17))&4294967295);var $div18=((((($mul17))|0)/500)|0);HEAP32[((__ZL17general_amplitude)>>2)]=$div18;;return;return;}
69497 function __ZL16SetPitchFormantsv(){;var __label__;var $ix;var $factor;var $pitch_value;var $0=HEAP32[((((_embedded_value+4)&4294967295))>>2)];$pitch_value=$0;var $cmp=((($0))|0)>101;if($cmp){__label__=1;;}else{__label__=2;;}
69498 if(__label__==1){$pitch_value=101;;}
69499 var $1=$pitch_value;var $sub=((($1)-50)&4294967295);var $mul=((($sub)*25)&4294967295);var $div=((((($mul))|0)/50)|0);var $add=((($div)+256)&4294967295);$factor=$add;$ix=0;;while(1){var $2=$ix;var $3=HEAP32[((_wvoice)>>2)];var $freq2=(($3+216)&4294967295);var $arrayidx=(($freq2+$2*2)&4294967295);var $4=HEAP16[(($arrayidx)>>1)];var $conv=(tempInt=(($4)),(tempInt>=32768?tempInt-65536:tempInt));var $5=$factor;var $mul2=((($conv)*($5))&4294967295);var $div3=((((($mul2))|0)/256)|0);var $conv4=((($div3))&65535);var $6=$ix;var $7=HEAP32[((_wvoice)>>2)];var $freq=(($7+144)&4294967295);var $arrayidx5=(($freq+$6*2)&4294967295);HEAP16[(($arrayidx5)>>1)]=$conv4;var $8=$ix;var $inc=((($8)+1)&4294967295);$ix=$inc;var $cmp1=((($inc))|0)<=5;if($cmp1){__label__=3;continue;}else{__label__=4;break;}}
69500 var $9=HEAP32[((((_embedded_value+24)&4294967295))>>2)];var $mul6=((($9)*3)&4294967295);$factor=$mul6;var $10=HEAP32[((_wvoice)>>2)];var $height2=(($10+234)&4294967295);var $arrayidx7=(($height2)&4294967295);var $11=HEAP16[(($arrayidx7)>>1)];var $conv8=(tempInt=(($11)),(tempInt>=32768?tempInt-65536:tempInt));var $12=$factor;var $mul9=((($12)*2)&4294967295);var $sub10=((256-($mul9))&4294967295);var $mul11=((($sub10)*($conv8))&4294967295);var $div12=((((($mul11))|0)/256)|0);var $conv13=((($div12))&65535);var $13=HEAP32[((_wvoice)>>2)];var $height=(($13+162)&4294967295);var $arrayidx14=(($height)&4294967295);HEAP16[(($arrayidx14)>>1)]=$conv13;var $14=HEAP32[((_wvoice)>>2)];var $height215=(($14+234)&4294967295);var $arrayidx16=(($height215+2)&4294967295);var $15=HEAP16[(($arrayidx16)>>1)];var $conv17=(tempInt=(($15)),(tempInt>=32768?tempInt-65536:tempInt));var $16=$factor;var $sub18=((256-($16))&4294967295);var $mul19=((($sub18)*($conv17))&4294967295);var $div20=((((($mul19))|0)/256)|0);var $conv21=((($div20))&65535);var $17=HEAP32[((_wvoice)>>2)];var $height22=(($17+162)&4294967295);var $arrayidx23=(($height22+2)&4294967295);HEAP16[(($arrayidx23)>>1)]=$conv21;;return;return;}
69501 function __Z15WavegenSetVoiceP7voice_t($v){;var __label__;var $v_addr;$v_addr=$v;var $0=$v_addr;var $1=$0;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$1;$dest$=((__ZZ15WavegenSetVoiceP7voice_tE2v2)&4294967295);$stop$=$src$+1344;if(($dest$%4)==($src$%4)&&1344>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
69502 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
69503 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};HEAP32[((_wvoice)>>2)]=__ZZ15WavegenSetVoiceP7voice_tE2v2;var $2=$v_addr;var $peak_shape=(($2+88)&4294967295);var $3=HEAP32[(($peak_shape)>>2)];var $cmp=((($3))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
69504 if(__label__==1){HEAP32[((__ZL8pk_shape)>>2)]=((_pk_shape1)&4294967295);;}
69505 else if(__label__==2){HEAP32[((__ZL8pk_shape)>>2)]=((__ZL9pk_shape2)&4294967295);;}
69506 var $4=$v_addr;var $consonant_amp=(($4+100)&4294967295);var $5=HEAP32[(($consonant_amp)>>2)];var $mul=((($5)*26)&4294967295);var $div=((((($mul))|0)/100)|0);HEAP32[((__ZL13consonant_amp)>>2)]=$div;var $6=HEAP32[((_samplerate)>>2)];var $cmp1=((($6))|0)<=11000;if($cmp1){__label__=4;;}else{__label__=5;;}
69507 if(__label__==4){var $7=HEAP32[((__ZL13consonant_amp)>>2)];var $mul3=((($7)*2)&4294967295);HEAP32[((__ZL13consonant_amp)>>2)]=$mul3;HEAP8[(__ZL16option_harmonic1_b)]=1;;}
69508 __ZL14WavegenSetEchov();__ZL16SetPitchFormantsv();var $8=HEAP32[((_wvoice)>>2)];var $samplerate=(($8+108)&4294967295);var $9=HEAP32[(($samplerate)>>2)];var $10=HEAP32[((_out_ptr)>>2)];__Z11MarkerEventijiPh(8,0,$9,$10);;return;return;}
69509 function __Z9SetPitch2P7voice_tiiPiS1_($voice,$pitch1,$pitch2,$pitch_base,$pitch_range){;var __label__;var $voice_addr;var $pitch1_addr;var $pitch2_addr;var $pitch_base_addr;var $pitch_range_addr;var $x;var $base;var $range;var $pitch_value;$voice_addr=$voice;$pitch1_addr=$pitch1;$pitch2_addr=$pitch2;$pitch_base_addr=$pitch_base;$pitch_range_addr=$pitch_range;var $0=$pitch1_addr;var $1=$pitch2_addr;var $cmp=((($0))|0)>((($1))|0);if($cmp){__label__=1;;}else{__label__=2;;}
69510 if(__label__==1){var $2=$pitch1_addr;$x=$2;var $3=$pitch2_addr;$pitch1_addr=$3;var $4=$x;$pitch2_addr=$4;;}
69511 var $5=HEAP32[((((_embedded_value+4)&4294967295))>>2)];$pitch_value=$5;var $cmp1=((($5))|0)>101;if($cmp1){__label__=3;;}else{__label__=4;;}
69512 if(__label__==3){$pitch_value=101;;}
69513 var $6=HEAP32[((((_embedded_value+24)&4294967295))>>2)];var $7=$pitch_value;var $sub=((($7)-($6))&4294967295);$pitch_value=$sub;var $cmp4=((($sub))|0)<0;if($cmp4){__label__=5;;}else{__label__=6;;}
69514 if(__label__==5){$pitch_value=0;;}
69515 var $8=$voice_addr;var $pitch_base7=(($8+44)&4294967295);var $9=HEAP32[(($pitch_base7)>>2)];var $10=$pitch_value;var $arrayidx=((_pitch_adjust_tab+$10)&4294967295);var $11=HEAPU8[($arrayidx)];var $conv=((($11))&255);var $mul=((($conv)*($9))&4294967295);var $div=((((($mul))|0)/128)|0);$base=$div;var $12=$voice_addr;var $pitch_range8=(($12+48)&4294967295);var $13=HEAP32[(($pitch_range8)>>2)];var $14=HEAP32[((((_embedded_value+16)&4294967295))>>2)];var $mul9=((($14)*($13))&4294967295);var $div10=((((($mul9))|0)/50)|0);$range=$div10;var $15=$range;var $16=$voice_addr;var $pitch_range11=(($16+48)&4294967295);var $17=HEAP32[(($pitch_range11)>>2)];var $sub12=((($15)-($17))&4294967295);var $mul13=((($sub12)*18)&4294967295);var $18=$base;var $sub14=((($18)-($mul13))&4294967295);$base=$sub14;var $19=$base;var $20=$pitch1_addr;var $21=$range;var $mul15=((($21)*($20))&4294967295);var $div16=((((($mul15))|0)/2)|0);var $add=((($div16)+($19))&4294967295);var $22=$pitch_base_addr;HEAP32[(($22)>>2)]=$add;var $23=$base;var $24=$pitch2_addr;var $25=$range;var $mul17=((($25)*($24))&4294967295);var $div18=((((($mul17))|0)/2)|0);var $26=$pitch_base_addr;var $27=HEAP32[(($26)>>2)];var $_neg=(((-($27)))&4294967295);var $add19=((($div18)+($23))&4294967295);var $sub20=((($add19)+($_neg))&4294967295);var $28=$pitch_range_addr;HEAP32[(($28)>>2)]=$sub20;;return;return;}
69516 function __Z8SetPitchiPhii($length,$env,$pitch1,$pitch2){;var __label__;var $length_addr;var $env_addr;var $pitch1_addr;var $pitch2_addr;$length_addr=$length;$env_addr=$env;$pitch1_addr=$pitch1;$pitch2_addr=$pitch2;var $0=$env_addr;HEAP32[((((_wdata)&4294967295))>>2)]=$0;var $cmp=((($0))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
69517 if(__label__==1){HEAP32[((((_wdata)&4294967295))>>2)]=((_env_fall)&4294967295);;}
69518 HEAP32[((((_wdata+8)&4294967295))>>2)]=0;var $1=$length_addr;var $cmp1=((($1))|0)==0;if($cmp1){__label__=3;;}else{__label__=4;;}
69519 if(__label__==3){HEAP32[((((_wdata+12)&4294967295))>>2)]=0;;}
69520 else if(__label__==4){var $2=$length_addr;var $div=((2097152/((($2))|0))|0);HEAP32[((((_wdata+12)&4294967295))>>2)]=$div;;}
69521 var $3=HEAP32[((_wvoice)>>2)];var $4=$pitch1_addr;var $5=$pitch2_addr;__Z9SetPitch2P7voice_tiiPiS1_($3,$4,$5,((_wdata+16)&4294967295),((_wdata+20)&4294967295));var $6=HEAP32[((((_wdata)&4294967295))>>2)];var $arrayidx=(($6)&4294967295);var $7=HEAPU8[($arrayidx)];var $conv=((($7))&255);var $8=HEAP32[((((_wdata+20)&4294967295))>>2)];var $mul=((($conv)*($8))&4294967295);var $shr=($mul)>>8;var $9=HEAP32[((((_wdata+16)&4294967295))>>2)];var $add=((($shr)+($9))&4294967295);HEAP32[((((_wdata+4)&4294967295))>>2)]=$add;var $10=HEAP32[((_wvoice)>>2)];var $flutter=(($10+68)&4294967295);var $11=HEAP32[(($flutter)>>2)];HEAP32[((__ZL11flutter_amp)>>2)]=$11;;return;return;}
69522 function __Z8SetSynthiiP7frame_tS0_P7voice_t($length,$modn,$fr1,$fr2,$v){;var __label__;var __lastLabel__=null;var $length_addr;var $modn_addr;var $fr1_addr;var $fr2_addr;var $v_addr;var $ix;var $next;var $length2;var $length4;var $qix;var $cmd;$length_addr=$length;$modn_addr=$modn;$fr1_addr=$fr1;$fr2_addr=$fr2;$v_addr=$v;HEAP8[(__ZL8end_wave_b)]=1;var $0=$modn_addr;var $and=($0)&255;HEAP32[((__ZL15modulation_type)>>2)]=$and;HEAP32[((__ZL12glottal_flag)>>2)]=0;var $1=$modn_addr;var $and1=($1)&1024;var $tobool=((($and1))|0)!=0;if($tobool){__label__=1;;}else{__label__=2;;}
69523 if(__label__==1){HEAP32[((__ZL12glottal_flag)>>2)]=3;var $2=$modn_addr;var $shr=($2)>>8;var $and2=($shr)&3;var $arrayidx=((__ZZ8SetSynthiiP7frame_tS0_P7voice_tE19glottal_reduce_tab1+$and2*4)&4294967295);var $3=HEAP32[(($arrayidx)>>2)];HEAP32[((__ZL14glottal_reduce)>>2)]=$3;;}
69524 var $4=$modn_addr;var $and3=($4)&2048;var $tobool4=((($and3))|0)!=0;if($tobool4){__label__=3;;}else{__label__=4;;}
69525 if(__label__==3){HEAP32[((__ZL12glottal_flag)>>2)]=4;var $5=$modn_addr;var $shr6=($5)>>8;var $and7=($shr6)&3;var $arrayidx8=((__ZZ8SetSynthiiP7frame_tS0_P7voice_tE19glottal_reduce_tab2+$and7*4)&4294967295);var $6=HEAP32[(($arrayidx8)>>2)];HEAP32[((__ZL14glottal_reduce)>>2)]=$6;;}
69526 var $7=HEAP32[((_wcmdq_head)>>2)];var $add=((($7)+1)&4294967295);$qix=$add;__lastLabel__=4;;$for_cond$8:while(1){var $8=__lastLabel__==11?$inc:($add);var $cmp=((($8))|0)>=160;if($cmp){__label__=6;;}else{__label__=7;;}
69527 if(__label__==6){$qix=0;;}
69528 var $9=$qix;var $10=HEAP32[((_wcmdq_tail)>>2)];var $cmp12=((($9))|0)==((($10))|0);if($cmp12){__label__=12;break $for_cond$8;}
69529 var $11=$qix;var $arrayidx15=((_wcmdq+$11*16)&4294967295);var $arrayidx16=(($arrayidx15)&4294967295);var $12=HEAP32[(($arrayidx16)>>2)];$cmd=$12;var $13=$cmd;var $cmp17=((($13))|0)==3;if($cmp17){__label__=9;break $for_cond$8;}
69530 var $14=$cmd;var $cmp20=((($14))|0)==6;var $15=$cmd;var $cmp21=((($15))|0)==5;var $or_cond=($cmp20)|($cmp21);if($or_cond){__label__=12;break $for_cond$8;}
69531 var $16=$qix;var $inc=((($16)+1)&4294967295);$qix=$inc;__lastLabel__=11;__label__=5;continue $for_cond$8;}
69532 if(__label__==9){HEAP8[(__ZL8end_wave_b)]=0;;}
69533 var $17=$length_addr;var $add24=((($17)+32)&4294967295);var $and25=($add24)&-64;$length2=$and25;var $cmp26=((($and25))|0)==0;if($cmp26){__label__=13;;}else{__label__=14;;}
69534 if(__label__==13){$length2=64;;}
69535 var $18=HEAP32[((__ZL11samplecount)>>2)];HEAP32[((__ZL17samplecount_start)>>2)]=$18;var $19=$length2;var $20=HEAP32[((__ZL8nsamples)>>2)];var $add29=((($20)+($19))&4294967295);HEAP32[((__ZL8nsamples)>>2)]=$add29;var $21=$length2;var $div=((((($21))|0)/4)|0);$length4=$div;var $22=$v_addr;var $freq=(($22+144)&4294967295);var $arrayidx30=(($freq+14)&4294967295);var $23=HEAP16[(($arrayidx30)>>1)];var $conv=(tempInt=(($23)),(tempInt>=32768?tempInt-65536:tempInt));var $mul=((($conv)*7800)&4294967295);var $24=$v_addr;var $freqadd=(($24+198)&4294967295);var $arrayidx31=(($freqadd+14)&4294967295);var $25=HEAP16[(($arrayidx31)>>1)];var $conv32=(tempInt=(($25)),(tempInt>=32768?tempInt-65536:tempInt));var $mul33=((($conv32)*256)&4294967295);var $add34=((($mul33)+($mul))&4294967295);var $shl=($add34)<<8;HEAP32[((((__ZL5peaks+560)&4294967295))>>2)]=$shl;var $26=$v_addr;var $freq35=(($26+144)&4294967295);var $arrayidx36=(($freq35+16)&4294967295);var $27=HEAP16[(($arrayidx36)>>1)];var $conv37=(tempInt=(($27)),(tempInt>=32768?tempInt-65536:tempInt));var $mul38=((($conv37)*9000)&4294967295);var $28=$v_addr;var $freqadd39=(($28+198)&4294967295);var $arrayidx40=(($freqadd39+16)&4294967295);var $29=HEAP16[(($arrayidx40)>>1)];var $conv41=(tempInt=(($29)),(tempInt>=32768?tempInt-65536:tempInt));var $mul42=((($conv41)*256)&4294967295);var $add43=((($mul42)+($mul38))&4294967295);var $shl44=($add43)<<8;HEAP32[((((__ZL5peaks+640)&4294967295))>>2)]=$shl44;$ix=0;__lastLabel__=14;;$for_body$22:while(1){var $30=__lastLabel__==14?0:($inc187);var $cmp47=((($30))|0)<7;if($cmp47){__label__=16;;}else{__label__=17;;}
69536 if(__label__==16){var $31=$ix;var $32=$fr1_addr;var $ffreq=(($32+2)&4294967295);var $arrayidx49=(($ffreq+$31*2)&4294967295);var $33=HEAP16[(($arrayidx49)>>1)];var $conv50=(tempInt=(($33)),(tempInt>=32768?tempInt-65536:tempInt));var $34=$ix;var $35=$v_addr;var $freq51=(($35+144)&4294967295);var $arrayidx52=(($freq51+$34*2)&4294967295);var $36=HEAP16[(($arrayidx52)>>1)];var $conv53=(tempInt=(($36)),(tempInt>=32768?tempInt-65536:tempInt));var $mul54=((($conv53)*($conv50))&4294967295);var $37=$ix;var $38=$v_addr;var $freqadd55=(($38+198)&4294967295);var $arrayidx56=(($freqadd55+$37*2)&4294967295);var $39=HEAP16[(($arrayidx56)>>1)];var $conv57=(tempInt=(($39)),(tempInt>=32768?tempInt-65536:tempInt));var $mul58=((($conv57)*256)&4294967295);var $add59=((($mul58)+($mul54))&4294967295);var $shl60=($add59)<<8;var $conv61=((($shl60))|0);var $40=$ix;var $arrayidx62=((__ZL5peaks+$40*80)&4294967295);var $freq1=(($arrayidx62+16)&4294967295);HEAPF32[(($freq1)>>2)]=$conv61;var $41=$ix;var $arrayidx63=((__ZL5peaks+$41*80)&4294967295);var $freq164=(($arrayidx63+16)&4294967295);var $42=HEAPF32[(($freq164)>>2)];var $conv65=((($42))|0);var $43=$ix;var $arrayidx66=((__ZL5peaks+$43*80)&4294967295);var $freq67=(($arrayidx66)&4294967295);HEAP32[(($freq67)>>2)]=$conv65;var $44=$ix;var $45=$fr2_addr;var $ffreq68=(($45+2)&4294967295);var $arrayidx69=(($ffreq68+$44*2)&4294967295);var $46=HEAP16[(($arrayidx69)>>1)];var $conv70=(tempInt=(($46)),(tempInt>=32768?tempInt-65536:tempInt));var $47=$ix;var $48=$v_addr;var $freq71=(($48+144)&4294967295);var $arrayidx72=(($freq71+$47*2)&4294967295);var $49=HEAP16[(($arrayidx72)>>1)];var $conv73=(tempInt=(($49)),(tempInt>=32768?tempInt-65536:tempInt));var $mul74=((($conv73)*($conv70))&4294967295);var $50=$ix;var $51=$v_addr;var $freqadd75=(($51+198)&4294967295);var $arrayidx76=(($freqadd75+$50*2)&4294967295);var $52=HEAP16[(($arrayidx76)>>1)];var $conv77=(tempInt=(($52)),(tempInt>=32768?tempInt-65536:tempInt));var $mul78=((($conv77)*256)&4294967295);var $add79=((($mul78)+($mul74))&4294967295);var $shl80=($add79)<<8;var $conv81=((($shl80))|0);$next=$conv81;var $53=$next;var $54=$ix;var $arrayidx82=((__ZL5peaks+$54*80)&4294967295);var $freq183=(($arrayidx82+16)&4294967295);var $55=HEAPF32[(($freq183)>>2)];var $sub=($53)-($55);var $mul84=($sub)*16;var $56=$length4;var $conv85=((($56))|0);var $div86=($mul84)/($conv85);var $57=$ix;var $arrayidx87=((__ZL5peaks+$57*80)&4294967295);var $freq_inc=(($arrayidx87+48)&4294967295);HEAPF32[(($freq_inc)>>2)]=$div86;;}
69537 var $58=$ix;var $59=$fr1_addr;var $fheight=(($59+18)&4294967295);var $arrayidx89=(($fheight+$58)&4294967295);var $60=HEAPU8[($arrayidx89)];var $conv90=((($60))&255);var $61=$ix;var $62=$v_addr;var $height=(($62+162)&4294967295);var $arrayidx91=(($height+$61*2)&4294967295);var $63=HEAP16[(($arrayidx91)>>1)];var $conv92=(tempInt=(($63)),(tempInt>=32768?tempInt-65536:tempInt));var $mul93=((($conv90)*64)&4294967295);var $shl94=((($mul93)*($conv92))&4294967295);var $conv95=((($shl94))|0);var $64=$ix;var $arrayidx96=((__ZL5peaks+$64*80)&4294967295);var $height1=(($arrayidx96+24)&4294967295);HEAPF32[(($height1)>>2)]=$conv95;var $65=$ix;var $arrayidx97=((__ZL5peaks+$65*80)&4294967295);var $height198=(($arrayidx97+24)&4294967295);var $66=HEAPF32[(($height198)>>2)];var $conv99=((($66))|0);var $67=$ix;var $arrayidx100=((__ZL5peaks+$67*80)&4294967295);var $height101=(($arrayidx100+4)&4294967295);HEAP32[(($height101)>>2)]=$conv99;var $68=$ix;var $69=$fr2_addr;var $fheight102=(($69+18)&4294967295);var $arrayidx103=(($fheight102+$68)&4294967295);var $70=HEAPU8[($arrayidx103)];var $conv104=((($70))&255);var $71=$ix;var $72=$v_addr;var $height105=(($72+162)&4294967295);var $arrayidx106=(($height105+$71*2)&4294967295);var $73=HEAP16[(($arrayidx106)>>1)];var $conv107=(tempInt=(($73)),(tempInt>=32768?tempInt-65536:tempInt));var $mul108=((($conv104)*64)&4294967295);var $shl109=((($mul108)*($conv107))&4294967295);var $conv110=((($shl109))|0);$next=$conv110;var $74=$next;var $75=$ix;var $arrayidx111=((__ZL5peaks+$75*80)&4294967295);var $height1112=(($arrayidx111+24)&4294967295);var $76=HEAPF32[(($height1112)>>2)];var $sub113=($74)-($76);var $mul114=($sub113)*64;var $77=$length2;var $conv115=((($77))|0);var $div116=($mul114)/($conv115);var $78=$ix;var $arrayidx117=((__ZL5peaks+$78*80)&4294967295);var $height_inc=(($arrayidx117+56)&4294967295);HEAPF32[(($height_inc)>>2)]=$div116;var $79=$ix;var $cmp118=((($79))|0)<=5;if($cmp118){__label__=18;;}else{__label__=22;;}
69538 $land_lhs_true$$for_inc186$27:do{if(__label__==18){var $80=$ix;var $81=HEAP32[((_wvoice)>>2)];var $n_harmonic_peaks=(($81+84)&4294967295);var $82=HEAP32[(($n_harmonic_peaks)>>2)];var $cmp119=((($80))|0)<=((($82))|0);if(!($cmp119)){__label__=22;break $land_lhs_true$$for_inc186$27;}
69539 var $83=$ix;var $84=$fr1_addr;var $fwidth=(($84+26)&4294967295);var $arrayidx121=(($fwidth+$83)&4294967295);var $85=HEAPU8[($arrayidx121)];var $conv122=((($85))&255);var $86=$ix;var $87=$v_addr;var $width=(($87+180)&4294967295);var $arrayidx123=(($width+$86*2)&4294967295);var $88=HEAP16[(($arrayidx123)>>1)];var $conv124=(tempInt=(($88)),(tempInt>=32768?tempInt-65536:tempInt));var $mul125=((($conv122)*1024)&4294967295);var $shl126=((($mul125)*($conv124))&4294967295);var $conv127=((($shl126))|0);var $89=$ix;var $arrayidx128=((__ZL5peaks+$89*80)&4294967295);var $left1=(($arrayidx128+32)&4294967295);HEAPF32[(($left1)>>2)]=$conv127;var $90=$ix;var $arrayidx129=((__ZL5peaks+$90*80)&4294967295);var $left1130=(($arrayidx129+32)&4294967295);var $91=HEAPF32[(($left1130)>>2)];var $conv131=((($91))|0);var $92=$ix;var $arrayidx132=((__ZL5peaks+$92*80)&4294967295);var $left=(($arrayidx132+8)&4294967295);HEAP32[(($left)>>2)]=$conv131;var $93=$ix;var $94=$fr2_addr;var $fwidth133=(($94+26)&4294967295);var $arrayidx134=(($fwidth133+$93)&4294967295);var $95=HEAPU8[($arrayidx134)];var $conv135=((($95))&255);var $96=$ix;var $97=$v_addr;var $width136=(($97+180)&4294967295);var $arrayidx137=(($width136+$96*2)&4294967295);var $98=HEAP16[(($arrayidx137)>>1)];var $conv138=(tempInt=(($98)),(tempInt>=32768?tempInt-65536:tempInt));var $mul139=((($conv135)*1024)&4294967295);var $shl140=((($mul139)*($conv138))&4294967295);var $conv141=((($shl140))|0);$next=$conv141;var $99=$next;var $100=$ix;var $arrayidx142=((__ZL5peaks+$100*80)&4294967295);var $left1143=(($arrayidx142+32)&4294967295);var $101=HEAPF32[(($left1143)>>2)];var $sub144=($99)-($101);var $mul145=($sub144)*64;var $102=$length2;var $conv146=((($102))|0);var $div147=($mul145)/($conv146);var $103=$ix;var $arrayidx148=((__ZL5peaks+$103*80)&4294967295);var $left_inc=(($arrayidx148+64)&4294967295);HEAPF32[(($left_inc)>>2)]=$div147;var $104=$ix;var $cmp149=((($104))|0)<3;var $105=$ix;if($cmp149){__label__=20;;}else{__label__=21;;}
69540 if(__label__==20){var $106=$fr1_addr;var $fright=(($106+32)&4294967295);var $arrayidx151=(($fright+$105)&4294967295);var $107=HEAPU8[($arrayidx151)];var $conv152=((($107))&255);var $108=$ix;var $109=$v_addr;var $width153=(($109+180)&4294967295);var $arrayidx154=(($width153+$108*2)&4294967295);var $110=HEAP16[(($arrayidx154)>>1)];var $conv155=(tempInt=(($110)),(tempInt>=32768?tempInt-65536:tempInt));var $mul156=((($conv152)*1024)&4294967295);var $shl157=((($mul156)*($conv155))&4294967295);var $conv158=((($shl157))|0);var $111=$ix;var $arrayidx159=((__ZL5peaks+$111*80)&4294967295);var $right1=(($arrayidx159+40)&4294967295);HEAPF32[(($right1)>>2)]=$conv158;var $112=$ix;var $arrayidx160=((__ZL5peaks+$112*80)&4294967295);var $right1161=(($arrayidx160+40)&4294967295);var $113=HEAPF32[(($right1161)>>2)];var $conv162=((($113))|0);var $114=$ix;var $arrayidx163=((__ZL5peaks+$114*80)&4294967295);var $right=(($arrayidx163+12)&4294967295);HEAP32[(($right)>>2)]=$conv162;var $115=$ix;var $116=$fr2_addr;var $fright164=(($116+32)&4294967295);var $arrayidx165=(($fright164+$115)&4294967295);var $117=HEAPU8[($arrayidx165)];var $conv166=((($117))&255);var $118=$ix;var $119=$v_addr;var $width167=(($119+180)&4294967295);var $arrayidx168=(($width167+$118*2)&4294967295);var $120=HEAP16[(($arrayidx168)>>1)];var $conv169=(tempInt=(($120)),(tempInt>=32768?tempInt-65536:tempInt));var $mul170=((($conv166)*1024)&4294967295);var $shl171=((($mul170)*($conv169))&4294967295);var $conv172=((($shl171))|0);$next=$conv172;var $121=$next;var $122=$ix;var $arrayidx173=((__ZL5peaks+$122*80)&4294967295);var $right1174=(($arrayidx173+40)&4294967295);var $123=HEAPF32[(($right1174)>>2)];var $sub175=($121)-($123);var $mul176=($sub175)*64;var $124=$length2;var $conv177=((($124))|0);var $div178=($mul176)/($conv177);var $125=$ix;var $arrayidx179=((__ZL5peaks+$125*80)&4294967295);var $right_inc=(($arrayidx179+72)&4294967295);HEAPF32[(($right_inc)>>2)]=$div178;;}
69541 else if(__label__==21){var $arrayidx180=((__ZL5peaks+$105*80)&4294967295);var $left181=(($arrayidx180+8)&4294967295);var $126=HEAP32[(($left181)>>2)];var $127=$ix;var $arrayidx182=((__ZL5peaks+$127*80)&4294967295);var $right183=(($arrayidx182+12)&4294967295);HEAP32[(($right183)>>2)]=$126;;}}}while(0);var $128=$ix;var $inc187=((($128)+1)&4294967295);$ix=$inc187;var $cmp46=((($inc187))|0)<8;if($cmp46){__lastLabel__=22;__label__=15;continue $for_body$22;}else{__lastLabel__=22;__label__=23;break $for_body$22;}};return;return;}
69542 function __Z11Write4BytesP7__sFILEi($f,$value){;var __label__;var $f_addr;var $value_addr;var $ix;$f_addr=$f;$value_addr=$value;$ix=0;;while(1){var $0=$value_addr;var $and=($0)&255;var $1=$f_addr;var $call=_fputc($and,$1);var $2=$value_addr;var $shr=($2)>>8;$value_addr=$shr;var $3=$ix;var $inc=((($3)+1)&4294967295);$ix=$inc;var $cmp=((($inc))|0)<4;if($cmp){__label__=1;continue;}else{__label__=2;break;}};return;return;}
69543 function __Z12WavegenFill2i($fill_zeros){;var __label__;var __lastLabel__=null;var $retval;var $fill_zeros_addr;var $q;var $length;var $result;$fill_zeros_addr=$fill_zeros;;$while_cond$2:while(1){var $0=HEAPU32[((_out_ptr)>>2)];var $1=HEAPU32[((_out_end)>>2)];var $cmp=((($0))>>>0)<((($1))>>>0);if(!($cmp)){__label__=36;break $while_cond$2;}
69544 var $call=__Z9WcmdqUsedv();var $cmp1=((($call))|0)<=0;if($cmp1){__label__=3;break $while_cond$2;}
69545 $result=0;var $12=HEAP32[((_wcmdq_head)>>2)];var $arrayidx=((_wcmdq+$12*16)&4294967295);var $arraydecay=(($arrayidx)&4294967295);$q=$arraydecay;var $13=$q;var $arrayidx14=(($13+4)&4294967295);var $14=HEAP32[(($arrayidx14)>>2)];$length=$14;var $15=$q;var $arrayidx15=(($15)&4294967295);var $16=HEAP32[(($arrayidx15)>>2)];if($16==9){__label__=11;;}
69546 else if($16==5){__label__=12;;}
69547 else if($16==6){__label__=15;;}
69548 else if($16==7){__label__=16;;}
69549 else if($16==4){__label__=19;;}
69550 else if($16==3){__label__=20;;}
69551 else if($16==2){__label__=21;;}
69552 else if($16==1){__label__=22;;}
69553 else if($16==10){__label__=23;;}
69554 else if($16==8){__label__=25;;}
69555 else if($16==11){__label__=26;;}
69556 else if($16==12){__label__=27;;}
69557 else if($16==13){__label__=28;;}
69558 else if($16==14){__label__=29;;}
69559 else if($16==15){__label__=31;;}
69560 else{__label__=32;;}
69561 $sw_epilogthread_pre_split$$sw_bb$$sw_bb19$$sw_bb24$$sw_bb31$$sw_bb44$$sw_bb45$$sw_bb52$$sw_bb53$$sw_bb60$$sw_bb70$$sw_bb73$$sw_bb76$$sw_bb79$$sw_bb81$$sw_bb86$6:do{if(__label__==11){var $17=$length;var $18=$q;var $arrayidx16=(($18+8)&4294967295);var $19=HEAP32[(($arrayidx16)>>2)];var $20=($19);var $21=$q;var $arrayidx17=(($21+12)&4294967295);var $22=HEAP32[(($arrayidx17)>>2)];var $shr=($22)>>16;var $23=$q;var $arrayidx18=(($23+12)&4294967295);var $24=HEAP32[(($arrayidx18)>>2)];var $and=($24)&65535;__Z8SetPitchiPhii($17,$20,$shr,$and);__label__=32;break $sw_epilogthread_pre_split$$sw_bb$$sw_bb19$$sw_bb24$$sw_bb31$$sw_bb44$$sw_bb45$$sw_bb52$$sw_bb53$$sw_bb60$$sw_bb70$$sw_bb73$$sw_bb76$$sw_bb79$$sw_bb81$$sw_bb86$6;}
69562 else if(__label__==12){var $25=HEAP32[((__ZZ12WavegenFill2iE6resume)>>2)];var $cmp20=((($25))|0)==0;if($cmp20){__label__=13;;}else{__label__=14;;}
69563 if(__label__==13){var $26=$length;var $27=HEAP32[((__ZZ12WavegenFill2iE13echo_complete)>>2)];var $sub=((($27)-($26))&4294967295);HEAP32[((__ZZ12WavegenFill2iE13echo_complete)>>2)]=$sub;;}
69564 HEAP32[((((_wdata+28)&4294967295))>>2)]=0;HEAP32[((((_wdata+60)&4294967295))>>2)]=100;__Z10KlattReseti(1);var $28=$length;var $29=HEAP32[((__ZZ12WavegenFill2iE6resume)>>2)];var $call23=__ZL11PlaySilenceii($28,$29);$result=$call23;__lastLabel__=14;__label__=33;break $sw_epilogthread_pre_split$$sw_bb$$sw_bb19$$sw_bb24$$sw_bb31$$sw_bb44$$sw_bb45$$sw_bb52$$sw_bb53$$sw_bb60$$sw_bb70$$sw_bb73$$sw_bb76$$sw_bb79$$sw_bb81$$sw_bb86$6;}
69565 else if(__label__==15){var $30=HEAP32[((__ZL11echo_length)>>2)];HEAP32[((__ZZ12WavegenFill2iE13echo_complete)>>2)]=$30;HEAP32[((((_wdata+28)&4294967295))>>2)]=0;__Z10KlattReseti(1);var $31=$length;var $32=HEAP32[((__ZZ12WavegenFill2iE6resume)>>2)];var $33=$q;var $arrayidx25=(($33+8)&4294967295);var $34=HEAP32[(($arrayidx25)>>2)];var $35=($34);var $36=$q;var $arrayidx26=(($36+12)&4294967295);var $37=HEAP32[(($arrayidx26)>>2)];var $and27=($37)&255;var $38=$q;var $arrayidx28=(($38+12)&4294967295);var $39=HEAP32[(($arrayidx28)>>2)];var $shr29=($39)>>8;var $call30=__ZL8PlayWaveiiPhii($31,$32,$35,$and27,$shr29);$result=$call30;__lastLabel__=15;__label__=33;break $sw_epilogthread_pre_split$$sw_bb$$sw_bb19$$sw_bb24$$sw_bb31$$sw_bb44$$sw_bb45$$sw_bb52$$sw_bb53$$sw_bb60$$sw_bb70$$sw_bb73$$sw_bb76$$sw_bb79$$sw_bb81$$sw_bb86$6;}
69566 else if(__label__==16){var $40=$q;var $arrayidx32=(($40+12)&4294967295);var $41=HEAP32[(($arrayidx32)>>2)];var $shr33=($41)>>8;HEAP32[((((_wdata+36)&4294967295))>>2)]=$shr33;var $42=$q;var $arrayidx34=(($42+12)&4294967295);var $43=HEAP32[(($arrayidx34)>>2)];var $and35=($43)&255;HEAP32[((((_wdata+32)&4294967295))>>2)]=$and35;var $44=$length;var $and36=($44)&65535;HEAP32[((((_wdata+28)&4294967295))>>2)]=$and36;var $45=$length;var $shr37=($45)>>16;var $and38=($shr37)&65535;HEAP32[((((_wdata+44)&4294967295))>>2)]=$and38;var $46=HEAP32[((((_wdata+32)&4294967295))>>2)];var $cmp39=((($46))|0)==0;if($cmp39){__label__=17;;}else{__label__=18;;}
69567 if(__label__==17){var $47=HEAP32[((((_wdata+28)&4294967295))>>2)];var $mul=((($47)*2)&4294967295);HEAP32[((((_wdata+28)&4294967295))>>2)]=$mul;var $48=HEAP32[((((_wdata+44)&4294967295))>>2)];var $mul41=((($48)*2)&4294967295);HEAP32[((((_wdata+44)&4294967295))>>2)]=$mul41;;}
69568 HEAP32[((((_wdata+40)&4294967295))>>2)]=0;HEAP32[((((_wdata+48)&4294967295))>>2)]=0;var $49=$q;var $arrayidx43=(($49+8)&4294967295);var $50=HEAP32[(($arrayidx43)>>2)];var $51=($50);HEAP32[((((_wdata+24)&4294967295))>>2)]=$51;__label__=32;break $sw_epilogthread_pre_split$$sw_bb$$sw_bb19$$sw_bb24$$sw_bb31$$sw_bb44$$sw_bb45$$sw_bb52$$sw_bb53$$sw_bb60$$sw_bb70$$sw_bb73$$sw_bb76$$sw_bb79$$sw_bb81$$sw_bb86$6;}
69569 else if(__label__==19){HEAP32[((((_wdata+28)&4294967295))>>2)]=0;__label__=20;break $sw_epilogthread_pre_split$$sw_bb$$sw_bb19$$sw_bb24$$sw_bb31$$sw_bb44$$sw_bb45$$sw_bb52$$sw_bb53$$sw_bb60$$sw_bb70$$sw_bb73$$sw_bb76$$sw_bb79$$sw_bb81$$sw_bb86$6;}
69570 else if(__label__==21){HEAP32[((((_wdata+28)&4294967295))>>2)]=0;__label__=22;break $sw_epilogthread_pre_split$$sw_bb$$sw_bb19$$sw_bb24$$sw_bb31$$sw_bb44$$sw_bb45$$sw_bb52$$sw_bb53$$sw_bb60$$sw_bb70$$sw_bb73$$sw_bb76$$sw_bb79$$sw_bb81$$sw_bb86$6;}
69571 else if(__label__==23){var $74=$q;var $arrayidx61=(($74+4)&4294967295);var $75=HEAP32[(($arrayidx61)>>2)];var $76=$q;var $arrayidx62=(($76+8)&4294967295);var $77=HEAP32[(($arrayidx62)>>2)];var $78=$q;var $arrayidx63=(($78+12)&4294967295);var $79=HEAP32[(($arrayidx63)>>2)];var $80=HEAP32[((_out_ptr)>>2)];__Z11MarkerEventijiPh($75,$77,$79,$80);var $81=$q;var $arrayidx64=(($81+4)&4294967295);var $82=HEAP32[(($arrayidx64)>>2)];var $cmp65=((($82))|0)==1;if(!($cmp65)){__label__=32;break $sw_epilogthread_pre_split$$sw_bb$$sw_bb19$$sw_bb24$$sw_bb31$$sw_bb44$$sw_bb45$$sw_bb52$$sw_bb53$$sw_bb60$$sw_bb70$$sw_bb73$$sw_bb76$$sw_bb79$$sw_bb81$$sw_bb86$6;}
69572 var $83=$q;var $arrayidx67=(($83+8)&4294967295);var $84=HEAP32[(($arrayidx67)>>2)];var $and68=($84)&16777215;HEAP32[((_current_source_index)>>2)]=$and68;__label__=32;break $sw_epilogthread_pre_split$$sw_bb$$sw_bb19$$sw_bb24$$sw_bb31$$sw_bb44$$sw_bb45$$sw_bb52$$sw_bb53$$sw_bb60$$sw_bb70$$sw_bb73$$sw_bb76$$sw_bb79$$sw_bb81$$sw_bb86$6;}
69573 else if(__label__==25){var $85=$length;var $86=$q;var $arrayidx71=(($86+8)&4294967295);var $87=HEAP32[(($arrayidx71)>>2)];var $88=($87);var $89=$q;var $arrayidx72=(($89+12)&4294967295);var $90=HEAP32[(($arrayidx72)>>2)];__ZL12SetAmplitudeiPhi($85,$88,$90);__label__=32;break $sw_epilogthread_pre_split$$sw_bb$$sw_bb19$$sw_bb24$$sw_bb31$$sw_bb44$$sw_bb45$$sw_bb52$$sw_bb53$$sw_bb60$$sw_bb70$$sw_bb73$$sw_bb76$$sw_bb79$$sw_bb81$$sw_bb86$6;}
69574 else if(__label__==26){var $91=$q;var $arrayidx74=(($91+4)&4294967295);var $92=HEAP32[(($arrayidx74)>>2)];var $93=($92);__Z15WavegenSetVoiceP7voice_t($93);var $94=$q;var $arrayidx75=(($94+4)&4294967295);var $95=HEAP32[(($arrayidx75)>>2)];var $96=($95);var $97=$96;;__label__=32;break $sw_epilogthread_pre_split$$sw_bb$$sw_bb19$$sw_bb24$$sw_bb31$$sw_bb44$$sw_bb45$$sw_bb52$$sw_bb53$$sw_bb60$$sw_bb70$$sw_bb73$$sw_bb76$$sw_bb79$$sw_bb81$$sw_bb86$6;}
69575 else if(__label__==27){var $98=$q;var $arrayidx77=(($98+4)&4294967295);var $99=HEAP32[(($arrayidx77)>>2)];var $100=$q;var $arrayidx78=(($100+8)&4294967295);var $101=HEAP32[(($arrayidx78)>>2)];__Z11SetEmbeddedii($99,$101);__label__=32;break $sw_epilogthread_pre_split$$sw_bb$$sw_bb19$$sw_bb24$$sw_bb31$$sw_bb44$$sw_bb45$$sw_bb52$$sw_bb53$$sw_bb60$$sw_bb70$$sw_bb73$$sw_bb76$$sw_bb79$$sw_bb81$$sw_bb86$6;}
69576 else if(__label__==28){var $102=$length;var $103=HEAP32[((__ZZ12WavegenFill2iE6resume)>>2)];var $call80=__Z10MbrolaFillii($102,$103);$result=$call80;__lastLabel__=28;__label__=33;break $sw_epilogthread_pre_split$$sw_bb$$sw_bb19$$sw_bb24$$sw_bb31$$sw_bb44$$sw_bb45$$sw_bb52$$sw_bb53$$sw_bb60$$sw_bb70$$sw_bb73$$sw_bb76$$sw_bb79$$sw_bb81$$sw_bb86$6;}
69577 else if(__label__==29){var $104=$q;var $arrayidx82=(($104+4)&4294967295);var $105=HEAP32[(($arrayidx82)>>2)];HEAP32[((((_wdata+60)&4294967295))>>2)]=$105;var $cmp83=((($105))|0)==0;if(!($cmp83)){__label__=32;break $sw_epilogthread_pre_split$$sw_bb$$sw_bb19$$sw_bb24$$sw_bb31$$sw_bb44$$sw_bb45$$sw_bb52$$sw_bb53$$sw_bb60$$sw_bb70$$sw_bb73$$sw_bb76$$sw_bb79$$sw_bb81$$sw_bb86$6;}
69578 HEAP32[((((_wdata+60)&4294967295))>>2)]=100;__label__=32;break $sw_epilogthread_pre_split$$sw_bb$$sw_bb19$$sw_bb24$$sw_bb31$$sw_bb44$$sw_bb45$$sw_bb52$$sw_bb53$$sw_bb60$$sw_bb70$$sw_bb73$$sw_bb76$$sw_bb79$$sw_bb81$$sw_bb86$6;}
69579 else if(__label__==31){var $106=$q;var $arrayidx87=(($106+4)&4294967295);var $107=HEAP32[(($arrayidx87)>>2)];var $conv=((($107))|0);var $div=($conv)/1024;HEAPF32[((_sonicSpeed)>>2)]=$div;__label__=32;break $sw_epilogthread_pre_split$$sw_bb$$sw_bb19$$sw_bb24$$sw_bb31$$sw_bb44$$sw_bb45$$sw_bb52$$sw_bb53$$sw_bb60$$sw_bb70$$sw_bb73$$sw_bb76$$sw_bb79$$sw_bb81$$sw_bb86$6;}}while(0);if(__label__==32){var $_pr=$result;__lastLabel__=32;;}
69580 else if(__label__==20){var $52=HEAP32[((__ZL11echo_length)>>2)];HEAP32[((__ZZ12WavegenFill2iE13echo_complete)>>2)]=$52;var $53=$length;var $and46=($53)&65535;var $54=$q;var $arrayidx47=(($54+4)&4294967295);var $55=HEAP32[(($arrayidx47)>>2)];var $shr48=($55)>>16;var $56=HEAP32[((__ZZ12WavegenFill2iE6resume)>>2)];var $57=$q;var $arrayidx49=(($57+8)&4294967295);var $58=HEAP32[(($arrayidx49)>>2)];var $59=($58);var $60=$q;var $arrayidx50=(($60+12)&4294967295);var $61=HEAP32[(($arrayidx50)>>2)];var $62=($61);var $call51=__ZL8Wavegen2iiiP7frame_tS0_($and46,$shr48,$56,$59,$62);$result=$call51;__lastLabel__=20;;}
69581 else if(__label__==22){var $63=HEAP32[((__ZL11echo_length)>>2)];HEAP32[((__ZZ12WavegenFill2iE13echo_complete)>>2)]=$63;var $64=$length;var $and54=($64)&65535;var $65=$q;var $arrayidx55=(($65+4)&4294967295);var $66=HEAP32[(($arrayidx55)>>2)];var $shr56=($66)>>16;var $67=HEAP32[((__ZZ12WavegenFill2iE6resume)>>2)];var $68=$q;var $arrayidx57=(($68+8)&4294967295);var $69=HEAP32[(($arrayidx57)>>2)];var $70=($69);var $71=$q;var $arrayidx58=(($71+12)&4294967295);var $72=HEAP32[(($arrayidx58)>>2)];var $73=($72);var $call59=__Z14Wavegen_Klatt2iiiP7frame_tS0_($and54,$shr56,$67,$70,$73);$result=$call59;__lastLabel__=22;;}
69582 var $108=__lastLabel__==32?$_pr:(__lastLabel__==28?$call80:(__lastLabel__==22?$call59:(__lastLabel__==20?$call51:(__lastLabel__==15?$call30:($call23)))));var $cmp88=((($108))|0)==0;if($cmp88){__label__=34;;}else{__label__=35;;}
69583 if(__label__==34){__ZL12WcmdqIncHeadv();HEAP32[((__ZZ12WavegenFill2iE6resume)>>2)]=0;__label__=1;continue $while_cond$2;}
69584 else if(__label__==35){HEAP32[((__ZZ12WavegenFill2iE6resume)>>2)]=1;__label__=1;continue $while_cond$2;}}
69585 $while_end91$$if_then$36:do{if(__label__==36){$retval=0;;}
69586 else if(__label__==3){var $2=HEAP32[((__ZZ12WavegenFill2iE13echo_complete)>>2)];var $cmp2=((($2))|0)>0;if($cmp2){__label__=4;;}else{__label__=6;;}
69587 $if_then3$$if_end7$39:do{if(__label__==4){var $3=HEAP32[((__ZZ12WavegenFill2iE13echo_complete)>>2)];var $4=HEAP32[((__ZZ12WavegenFill2iE6resume)>>2)];var $call4=__ZL11PlaySilenceii($3,$4);HEAP32[((__ZZ12WavegenFill2iE6resume)>>2)]=$call4;var $5=HEAP32[((__ZZ12WavegenFill2iE6resume)>>2)];var $cmp5=((($5))|0)==1;if(!($cmp5)){__label__=6;break $if_then3$$if_end7$39;}
69588 $retval=0;__label__=37;break $while_end91$$if_then$36;}}while(0);var $6=$fill_zeros_addr;var $tobool=((($6))|0)!=0;if($tobool){__label__=7;;}else{__label__=9;;}
69589 $while_cond9_preheader$$if_end12$43:do{if(__label__==7){var $7=HEAPU32[((_out_ptr)>>2)];var $8=HEAPU32[((_out_end)>>2)];var $cmp101=((($7))>>>0)<((($8))>>>0);if(!($cmp101)){__label__=9;break $while_cond9_preheader$$if_end12$43;}
69590 while(1){var $9=HEAP32[((_out_ptr)>>2)];var $incdec_ptr=(($9+1)&4294967295);HEAP32[((_out_ptr)>>2)]=$incdec_ptr;HEAP8[($9)]=0;var $10=HEAPU32[((_out_ptr)>>2)];var $11=HEAPU32[((_out_end)>>2)];var $cmp10=((($10))>>>0)<((($11))>>>0);if($cmp10){__label__=8;continue;}else{__label__=9;break $while_cond9_preheader$$if_end12$43;}}}}while(0);$retval=1;;}}while(0);var $109=$retval;;return $109;return null;}
69591 function __ZL11PlaySilenceii($length,$resume){;var __label__;var __lastLabel__=null;var $retval;var $length_addr;var $resume_addr;var $value;$length_addr=$length;$resume_addr=$resume;$value=0;HEAP32[((__ZL8nsamples)>>2)]=0;HEAP32[((__ZL11samplecount)>>2)]=0;HEAP32[((__ZL9wavephase)>>2)]=2147483647;var $0=$length_addr;var $cmp=((($0))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
69592 if(__label__==1){$retval=0;;}
69593 else if(__label__==2){var $1=$resume_addr;var $cmp1=((($1))|0)==0;if($cmp1){__label__=3;;}else{__label__=4;;}
69594 $if_then2$$while_condthread_pre_split$5:do{if(__label__==3){var $2=$length_addr;HEAP32[((__ZZL11PlaySilenceiiE9n_samples)>>2)]=$2;__lastLabel__=3;__label__=5;break $if_then2$$while_condthread_pre_split$5;}}while(0);while(1){if(__label__==5){var $3=__lastLabel__==4?$_pr:($2);var $dec=((($3)-1)&4294967295);HEAP32[((__ZZL11PlaySilenceiiE9n_samples)>>2)]=$dec;var $cmp4=((($3))|0)>0;if(!($cmp4)){__label__=12;break;}
69595 var $4=HEAP32[((_echo_tail)>>2)];var $inc=((($4)+1)&4294967295);HEAP32[((_echo_tail)>>2)]=$inc;var $arrayidx=((_echo_buf+$4*2)&4294967295);var $5=HEAP16[(($arrayidx)>>1)];var $conv=(tempInt=(($5)),(tempInt>=32768?tempInt-65536:tempInt));var $6=HEAP32[((_echo_amp)>>2)];var $mul=((($conv)*($6))&4294967295);var $shr=($mul)>>8;$value=$shr;var $7=HEAP32[((_echo_tail)>>2)];var $cmp5=((($7))|0)>=5500;if($cmp5){__label__=7;;}else{__label__=8;;}
69596 if(__label__==7){HEAP32[((_echo_tail)>>2)]=0;;}
69597 var $8=$value;var $conv8=((($8))&255);var $9=HEAP32[((_out_ptr)>>2)];var $incdec_ptr=(($9+1)&4294967295);HEAP32[((_out_ptr)>>2)]=$incdec_ptr;HEAP8[($9)]=$conv8;var $10=$value;var $shr9=($10)>>8;var $conv10=((($shr9))&255);var $11=HEAP32[((_out_ptr)>>2)];var $incdec_ptr11=(($11+1)&4294967295);HEAP32[((_out_ptr)>>2)]=$incdec_ptr11;HEAP8[($11)]=$conv10;var $12=$value;var $conv12=((($12))&65535);var $13=HEAP32[((_echo_head)>>2)];var $inc13=((($13)+1)&4294967295);HEAP32[((_echo_head)>>2)]=$inc13;var $arrayidx14=((_echo_buf+$13*2)&4294967295);HEAP16[(($arrayidx14)>>1)]=$conv12;var $14=HEAP32[((_echo_head)>>2)];var $cmp15=((($14))|0)>=5500;if($cmp15){__label__=9;;}else{__label__=10;;}
69598 if(__label__==9){HEAP32[((_echo_head)>>2)]=0;;}
69599 var $15=HEAPU32[((_out_ptr)>>2)];var $16=HEAPU32[((_out_end)>>2)];var $cmp18=((($15))>>>0)>=((($16))>>>0);if($cmp18){__label__=11;break;}else{__label__=4;continue;}}
69600 else if(__label__==4){var $_pr=HEAP32[((__ZZL11PlaySilenceiiE9n_samples)>>2)];__lastLabel__=4;__label__=5;continue;}}
69601 if(__label__==12){$retval=0;;}
69602 else if(__label__==11){$retval=1;;}}
69603 var $17=$retval;;return $17;return null;}
69604 function __ZL8PlayWaveiiPhii($length,$resume,$data,$scale,$amp){;var __label__;var $retval;var $length_addr;var $resume_addr;var $data_addr;var $scale_addr;var $amp_addr;var $value;var $c;$length_addr=$length;$resume_addr=$resume;$data_addr=$data;$scale_addr=$scale;$amp_addr=$amp;var $0=$resume_addr;var $cmp=((($0))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
69605 if(__label__==1){var $1=$length_addr;HEAP32[((__ZZL8PlayWaveiiPhiiE9n_samples)>>2)]=$1;HEAP32[((__ZZL8PlayWaveiiPhiiE2ix)>>2)]=0;;}
69606 HEAP32[((__ZL8nsamples)>>2)]=0;HEAP32[((__ZL11samplecount)>>2)]=0;;$while_cond$5:while(1){var $2=HEAP32[((__ZZL8PlayWaveiiPhiiE9n_samples)>>2)];var $dec=((($2)-1)&4294967295);HEAP32[((__ZZL8PlayWaveiiPhiiE9n_samples)>>2)]=$dec;var $cmp1=((($2))|0)>0;if(!($cmp1)){__label__=17;break $while_cond$5;}
69607 var $3=$scale_addr;var $cmp2=((($3))|0)==0;var $4=HEAPU32[((__ZZL8PlayWaveiiPhiiE2ix)>>2)];var $add=((($4)+1)&4294967295);if($cmp2){__label__=5;;}else{__label__=6;;}
69608 if(__label__==5){var $5=$data_addr;var $arrayidx=(($5+$add)&4294967295);var $6=HEAP8[($arrayidx)];$c=$6;var $7=HEAP32[((__ZZL8PlayWaveiiPhiiE2ix)>>2)];var $8=$data_addr;var $arrayidx4=(($8+$7)&4294967295);var $9=HEAPU8[($arrayidx4)];var $conv=((($9))&255);var $10=$c;var $conv5=(tempInt=(($10)),(tempInt>=128?tempInt-256:tempInt));var $mul=((($conv5)*256)&4294967295);var $add6=((($mul)+($conv))&4294967295);$value=$add6;var $11=HEAP32[((__ZZL8PlayWaveiiPhiiE2ix)>>2)];var $add7=((($11)+2)&4294967295);HEAP32[((__ZZL8PlayWaveiiPhiiE2ix)>>2)]=$add7;;}
69609 else if(__label__==6){HEAP32[((__ZZL8PlayWaveiiPhiiE2ix)>>2)]=$add;var $12=$data_addr;var $arrayidx8=(($12+$4)&4294967295);var $13=HEAP8[($arrayidx8)];var $conv9=(tempInt=(($13)),(tempInt>=128?tempInt-256:tempInt));var $14=$scale_addr;var $mul10=((($conv9)*($14))&4294967295);$value=$mul10;;}
69610 var $15=HEAP32[((__ZL13consonant_amp)>>2)];var $16=HEAP32[((__ZL17general_amplitude)>>2)];var $17=$value;var $mul12=((($16)*($15))&4294967295);var $mul13=((($mul12)*($17))&4294967295);$value=$mul13;var $18=$value;var $shr=($18)>>10;$value=$shr;var $19=$value;var $20=$amp_addr;var $mul14=((($20)*($19))&4294967295);var $div=((((($mul14))|0)/32)|0);$value=$div;var $21=HEAP32[((_echo_tail)>>2)];var $inc15=((($21)+1)&4294967295);HEAP32[((_echo_tail)>>2)]=$inc15;var $arrayidx16=((_echo_buf+$21*2)&4294967295);var $22=HEAP16[(($arrayidx16)>>1)];var $conv17=(tempInt=(($22)),(tempInt>=32768?tempInt-65536:tempInt));var $23=HEAP32[((_echo_amp)>>2)];var $mul18=((($conv17)*($23))&4294967295);var $shr19=($mul18)>>8;var $24=$value;var $add20=((($shr19)+($24))&4294967295);$value=$add20;var $cmp21=((($add20))|0)>32767;if($cmp21){__label__=8;;}else{__label__=9;;}
69611 $if_then22$$if_else23$12:do{if(__label__==8){$value=32768;;}
69612 else if(__label__==9){var $25=$value;var $cmp24=((($25))|0)<-32768;if(!($cmp24)){__label__=11;break $if_then22$$if_else23$12;}
69613 $value=-32768;;}}while(0);var $26=HEAP32[((_echo_tail)>>2)];var $cmp28=((($26))|0)>=5500;if($cmp28){__label__=12;;}else{__label__=13;;}
69614 if(__label__==12){HEAP32[((_echo_tail)>>2)]=0;;}
69615 var $27=$value;var $conv31=((($27))&255);var $28=HEAP32[((_out_ptr)>>2)];var $arrayidx32=(($28)&4294967295);HEAP8[($arrayidx32)]=$conv31;var $29=$value;var $shr33=($29)>>8;var $conv34=((($shr33))&255);var $30=HEAP32[((_out_ptr)>>2)];var $arrayidx35=(($30+1)&4294967295);HEAP8[($arrayidx35)]=$conv34;var $31=HEAP32[((_out_ptr)>>2)];var $add_ptr=(($31+2)&4294967295);HEAP32[((_out_ptr)>>2)]=$add_ptr;var $32=$value;var $mul36=((($32)*3)&4294967295);var $div37=((((($mul36))|0)/4)|0);var $conv38=((($div37))&65535);var $33=HEAP32[((_echo_head)>>2)];var $inc39=((($33)+1)&4294967295);HEAP32[((_echo_head)>>2)]=$inc39;var $arrayidx40=((_echo_buf+$33*2)&4294967295);HEAP16[(($arrayidx40)>>1)]=$conv38;var $34=HEAP32[((_echo_head)>>2)];var $cmp41=((($34))|0)>=5500;if($cmp41){__label__=14;;}else{__label__=15;;}
69616 if(__label__==14){HEAP32[((_echo_head)>>2)]=0;;}
69617 var $35=HEAPU32[((_out_ptr)>>2)];var $36=HEAPU32[((_out_end)>>2)];var $cmp44=((($35))>>>0)>=((($36))>>>0);if($cmp44){__label__=16;break $while_cond$5;}else{__label__=3;continue $while_cond$5;}}
69618 if(__label__==17){$retval=0;;}
69619 else if(__label__==16){$retval=1;;}
69620 var $37=$retval;;return $37;return null;}
69621 function __ZL8Wavegen2iiiP7frame_tS0_($length,$modulation,$resume,$fr1,$fr2){;var __label__;var $length_addr;var $modulation_addr;var $resume_addr;var $fr1_addr;var $fr2_addr;$length_addr=$length;$modulation_addr=$modulation;$resume_addr=$resume;$fr1_addr=$fr1;$fr2_addr=$fr2;var $0=$resume_addr;var $cmp=((($0))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
69622 if(__label__==1){var $1=$length_addr;var $2=$modulation_addr;var $3=$fr1_addr;var $4=$fr2_addr;var $5=HEAP32[((_wvoice)>>2)];__Z8SetSynthiiP7frame_tS0_P7voice_t($1,$2,$3,$4,$5);;}
69623 var $call=__Z7Wavegenv();;return $call;return null;}
69624 function __ZL12SetAmplitudeiPhi($length,$amp_env,$value){;var __label__;var $length_addr;var $amp_env_addr;var $value_addr;$length_addr=$length;$amp_env_addr=$amp_env;$value_addr=$value;HEAP32[((__ZL6amp_ix)>>2)]=0;var $0=$length_addr;var $cmp=((($0))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
69625 if(__label__==1){HEAP32[((__ZL7amp_inc)>>2)]=0;;}
69626 else if(__label__==2){var $1=$length_addr;var $div=((2097152/((($1))|0))|0);HEAP32[((__ZL7amp_inc)>>2)]=$div;;}
69627 var $2=$value_addr;var $3=HEAP32[((__ZL17general_amplitude)>>2)];var $mul=((($3)*($2))&4294967295);var $div1=((((($mul))|0)/16)|0);HEAP32[((((_wdata+52)&4294967295))>>2)]=$div1;var $4=HEAP32[((((_wdata+52)&4294967295))>>2)];var $5=HEAP32[((_wvoice)>>2)];var $consonant_ampv=(($5+104)&4294967295);var $6=HEAP32[(($consonant_ampv)>>2)];var $mul2=((($4)*15)&4294967295);var $mul3=((($mul2)*($6))&4294967295);var $div4=((((($mul3))|0)/100)|0);HEAP32[((((_wdata+56)&4294967295))>>2)]=$div4;var $7=$amp_env_addr;HEAP32[((__ZL13amplitude_env)>>2)]=$7;;return;return;}
69628 function __ZL12WcmdqIncHeadv(){;var __label__;var $0=HEAP32[((_wcmdq_head)>>2)];var $inc=((($0)+1)&4294967295);HEAP32[((_wcmdq_head)>>2)]=$inc;var $cmp=((($inc))|0)>=160;if($cmp){__label__=1;;}else{__label__=2;;}
69629 if(__label__==1){HEAP32[((_wcmdq_head)>>2)]=0;;};return;return;}
69630 function __Z11WavegenFilli($fill_zeros){;var __label__;var $fill_zeros_addr;var $finished;var $p_start;var $length;var $max_length;$fill_zeros_addr=$fill_zeros;var $0=HEAP32[((_out_ptr)>>2)];$p_start=$0;var $call=__Z12WavegenFill2i(0);$finished=$call;var $1=HEAPF32[((_sonicSpeed)>>2)];var $cmp=($1)>1;if($cmp){__label__=1;;}else{__label__=3;;}
69631 $if_then$$if_end8$2:do{if(__label__==1){var $2=HEAP32[((_out_end)>>2)];var $3=$p_start;var $sub_ptr_lhs_cast=($2);var $sub_ptr_rhs_cast=($3);var $sub_ptr_sub=((($sub_ptr_lhs_cast)-($sub_ptr_rhs_cast))&4294967295);$max_length=$sub_ptr_sub;var $4=$p_start;var $5=$4;var $6=HEAP32[((_out_ptr)>>2)];var $7=$p_start;var $sub_ptr_lhs_cast1=($6);var $sub_ptr_rhs_cast2=($7);var $sub_ptr_sub3=((($sub_ptr_lhs_cast1)-($sub_ptr_rhs_cast2))&4294967295);var $div=((((($sub_ptr_sub3))|0)/2)|0);var $8=$max_length;var $div4=((((($8))|0)/2)|0);var $9=$finished;var $call5=__ZL7SpeedUpPsiii($5,$div,$div4,$9);var $mul=((($call5)*2)&4294967295);$length=$mul;var $10=$p_start;var $11=$length;var $add_ptr=(($10+$11)&4294967295);HEAP32[((_out_ptr)>>2)]=$add_ptr;var $12=$length;var $13=$max_length;var $cmp6=((($12))|0)>=((($13))|0);if(!($cmp6)){__label__=3;break $if_then$$if_end8$2;}
69632 $finished=0;;}}while(0);var $14=$finished;;return $14;return null;}
69633 function __ZL7SpeedUpPsiii($outbuf,$length_in,$length_out,$end_of_text){;var __label__;var $retval;var $outbuf_addr;var $length_in_addr;var $length_out_addr;var $end_of_text_addr;$outbuf_addr=$outbuf;$length_in_addr=$length_in;$length_out_addr=$length_out;$end_of_text_addr=$end_of_text;var $0=$length_in_addr;var $cmp=((($0))|0)>0;if($cmp){__label__=1;;}else{__label__=6;;}
69634 if(__label__==1){var $1=HEAP32[((__ZL18sonicSpeedupStream)>>2)];var $cmp1=((($1))|0)==0;if($cmp1){__label__=2;;}else{__label__=3;;}
69635 if(__label__==2){var $call=_sonicCreateStream(22050,1);HEAP32[((__ZL18sonicSpeedupStream)>>2)]=$call;;}
69636 var $2=HEAP32[((__ZL18sonicSpeedupStream)>>2)];var $call3=_sonicGetSpeed($2);var $conv=($call3);var $3=HEAPF32[((_sonicSpeed)>>2)];var $cmp4=($conv)!=($3);if($cmp4){__label__=4;;}else{__label__=5;;}
69637 if(__label__==4){var $4=HEAP32[((__ZL18sonicSpeedupStream)>>2)];var $5=HEAPF32[((_sonicSpeed)>>2)];var $conv6=($5);_sonicSetSpeed($4,$conv6);;}
69638 var $6=HEAP32[((__ZL18sonicSpeedupStream)>>2)];var $7=$outbuf_addr;var $8=$length_in_addr;var $call8=_sonicWriteShortToStream($6,$7,$8);;}
69639 var $9=HEAP32[((__ZL18sonicSpeedupStream)>>2)];var $cmp10=((($9))|0)==0;if($cmp10){__label__=7;;}else{__label__=8;;}
69640 if(__label__==7){$retval=0;;}
69641 else if(__label__==8){var $10=$end_of_text_addr;var $tobool=((($10))|0)!=0;if($tobool){__label__=9;;}else{__label__=10;;}
69642 if(__label__==9){var $11=HEAP32[((__ZL18sonicSpeedupStream)>>2)];var $call14=_sonicFlushStream($11);;}
69643 var $12=HEAP32[((__ZL18sonicSpeedupStream)>>2)];var $13=$outbuf_addr;var $14=$length_out_addr;var $call16=_sonicReadShortFromStream($12,$13,$14);$retval=$call16;;}
69644 var $15=$retval;;return $15;return null;}
69645 function __ZL9resonatorP9RESONATORd($r,$input){;var __label__;var $r_addr;var $input_addr;var $x;$r_addr=$r;$input_addr=$input;var $0=$r_addr;var $a=(($0)&4294967295);var $1=HEAPF32[(($a)>>2)];var $2=$input_addr;var $mul=($1)*($2);var $3=$r_addr;var $b=(($3+8)&4294967295);var $4=HEAPF32[(($b)>>2)];var $5=$r_addr;var $x1=(($5+24)&4294967295);var $6=HEAPF32[(($x1)>>2)];var $mul1=($4)*($6);var $add=($mul)+($mul1);var $7=$r_addr;var $c=(($7+16)&4294967295);var $8=HEAPF32[(($c)>>2)];var $9=$r_addr;var $x2=(($9+32)&4294967295);var $10=HEAPF32[(($x2)>>2)];var $mul2=($8)*($10);var $add3=($add)+($mul2);$x=$add3;var $11=$r_addr;var $x14=(($11+24)&4294967295);var $12=HEAPF32[(($x14)>>2)];var $13=$r_addr;var $x25=(($13+32)&4294967295);HEAPF32[(($x25)>>2)]=$12;var $14=$x;var $15=$r_addr;var $x16=(($15+24)&4294967295);HEAPF32[(($x16)>>2)]=$14;var $16=$x;;return $16;return null;}
69646 function __Z15MakePhonemeListP10Translatorii($tr,$post_pause,$start_sentence){var __stackBase__=STACKTOP;STACKTOP+=24152;_memset(__stackBase__,0,24152);var __label__;var __lastLabel__=null;var $tr_addr;var $post_pause_addr;var $start_sentence_addr;var $ix;var $j;var $insert_ph;var $phlist;var $ph;var $prev;var $next;var $next2;var $unstress_count;var $word_stress;var $switched_language;var $max_stress;var $voicing;var $regression;var $end_sourceix;var $alternative;var $first_vowel;var $phdata=__stackBase__;var $n_ph_list3;var $plist3;var $plist3_inserted;var $ph_list3=__stackBase__+152;var $plist2;var $type;var $word_end_devoice;var $k;var $nextw;var $ph2;var $ph2266;var $p;var $x;$tr_addr=$tr;$post_pause_addr=$post_pause;$start_sentence_addr=$start_sentence;$ix=0;$insert_ph=0;$unstress_count=0;$word_stress=0;$switched_language=0;$first_vowel=0;$plist3_inserted=0;$plist2=((_ph_list2)&4294967295);$phlist=((_phoneme_list)&4294967295);var $0=HEAP32[((_n_ph_list2)>>2)];var $sub=((($0)-1)&4294967295);var $1=$plist2;var $arrayidx=(($1+8*$sub)&4294967295);var $sourceix=(($arrayidx+6)&4294967295);var $2=HEAPU16[(($sourceix)>>1)];var $conv=((($2))&65535);$end_sourceix=$conv;$max_stress=0;var $3=HEAP32[((_n_ph_list2)>>2)];var $sub1=((($3)-3)&4294967295);$j=$sub1;__lastLabel__=0;;$for_cond$2:while(1){var $4=__lastLabel__==5?$dec:($sub1);var $cmp=((($4))|0)>=0;if(!($cmp)){__label__=6;break $for_cond$2;}
69647 var $5=$j;var $6=$plist2;var $arrayidx2=(($6+8*$5)&4294967295);var $stresslevel=(($arrayidx2+1)&4294967295);var $7=HEAPU8[($stresslevel)];var $conv3=((($7))&255);var $and=($conv3)&127;var $8=$max_stress;var $cmp4=((($and))|0)>((($8))|0);if($cmp4){__label__=3;;}else{__label__=4;;}
69648 if(__label__==3){var $9=$j;var $10=$plist2;var $arrayidx5=(($10+8*$9)&4294967295);var $stresslevel6=(($arrayidx5+1)&4294967295);var $11=HEAPU8[($stresslevel6)];var $conv7=((($11))&255);var $and8=($conv7)&127;$max_stress=$and8;;}
69649 var $12=$j;var $13=$plist2;var $arrayidx9=(($13+8*$12)&4294967295);var $sourceix10=(($arrayidx9+6)&4294967295);var $14=HEAPU16[(($sourceix10)>>1)];var $conv11=((($14))&65535);var $cmp12=((($conv11))|0)!=0;if($cmp12){__label__=6;break $for_cond$2;}
69650 var $15=$j;var $dec=((($15)-1)&4294967295);$j=$dec;__lastLabel__=5;__label__=1;continue $for_cond$2;}
69651 var $16=$max_stress;var $cmp15=((($16))|0)<4;if($cmp15){__label__=7;;}else{__label__=11;;}
69652 $while_cond$$if_end32$10:do{if(__label__==7){while(1){var $17=$j;var $dec17=((($17)-1)&4294967295);$j=$dec17;var $cmp18=((($dec17))|0)>=0;if(!($cmp18)){__label__=11;break $while_cond$$if_end32$10;}
69653 var $18=$j;var $19=$plist2;var $arrayidx19=(($19+8*$18)&4294967295);var $synthflags=(($arrayidx19+4)&4294967295);var $20=HEAPU16[(($synthflags)>>1)];var $conv20=((($20))&65535);var $and21=($conv20)&64;var $tobool=((($and21))|0)!=0;var $21=$j;var $22=$plist2;var $arrayidx23=(($22+8*$21)&4294967295);var $stresslevel24=(($arrayidx23+1)&4294967295);if($tobool){__label__=9;break;}
69654 var $23=HEAPU8[($stresslevel24)];var $conv28=((($23))&255);var $cmp29=((($conv28))|0)>=4;if($cmp29){__label__=11;break $while_cond$$if_end32$10;}else{__label__=7;continue;}}
69655 HEAP8[($stresslevel24)]=4;;}}while(0);var $24=$tr_addr;var $langopts=(($24)&4294967295);var $param=(($langopts+24)&4294967295);var $arrayidx33=(($param+16)&4294967295);var $25=HEAP32[(($arrayidx33)>>2)];$regression=$25;var $cmp34=((($25))|0)!=0;if($cmp34){__label__=12;;}else{__label__=51;;}
69656 $if_then35$$if_end143$17:do{if(__label__==12){$word_end_devoice=0;$voicing=0;var $26=HEAP32[((_n_ph_list2)>>2)];var $sub36=((($26)-1)&4294967295);$j=$sub36;var $cmp389=((($sub36))|0)>=0;if(!($cmp389)){__label__=51;break $if_then35$$if_end143$17;}
69657 $for_body39$19:while(1){var $27=$j;var $28=$plist2;var $arrayidx40=(($28+8*$27)&4294967295);var $phcode=(($arrayidx40)&4294967295);var $29=HEAPU8[($phcode)];var $idxprom=((($29))&255);var $arrayidx41=((_phoneme_tab+$idxprom*4)&4294967295);var $30=HEAPU32[(($arrayidx41)>>2)];$ph=$30;var $cmp42=((($30))|0)==0;if($cmp42){__label__=50;;}else{__label__=14;;}
69658 $for_inc140$$if_end44$21:do{if(__label__==14){var $31=$ph;var $code=(($31+10)&4294967295);var $32=HEAPU8[($code)];var $conv45=((($32))&255);var $cmp46=((($conv45))|0)==21;var $33=$switched_language;if($cmp46){__lastLabel__=14;__label__=15;;}else{__lastLabel__=14;__label__=16;;}
69659 if(__label__==15){var $xor=($33)^1;$switched_language=$xor;__lastLabel__=15;;}
69660 var $34=__lastLabel__==15?$xor:($33);var $tobool49=((($34))|0)!=0;if($tobool49){__label__=50;break $for_inc140$$if_end44$21;}
69661 var $35=$ph;var $type52=(($35+11)&4294967295);var $36=HEAPU8[($type52)];var $conv53=((($36))&255);$type=$conv53;var $37=$regression;var $and54=($37)&2;var $tobool55=((($and54))|0)!=0;if($tobool55){__label__=18;;}else{__label__=24;;}
69662 $if_then56$$if_end69$27:do{if(__label__==18){var $38=$ph;var $mnemonic=(($38)&4294967295);var $39=HEAP32[(($mnemonic)>>2)];var $cmp57=((($39))|0)==118;if($cmp57){__label__=21;;}else{__label__=19;;}
69663 $if_then64$$lor_lhs_false$29:do{if(__label__==19){var $40=$ph;var $mnemonic58=(($40)&4294967295);var $41=HEAP32[(($mnemonic58)>>2)];var $cmp59=((($41))|0)==15222;if($cmp59){__label__=21;break $if_then64$$lor_lhs_false$29;}
69664 var $42=$ph;var $mnemonic61=(($42)&4294967295);var $43=HEAP32[(($mnemonic61)>>2)];var $and62=($43)&255;var $cmp63=((($and62))|0)==82;if(!($cmp63)){__label__=24;break $if_then56$$if_end69$27;}}}while(0);var $44=$word_end_devoice;var $cmp65=((($44))|0)==1;if($cmp65){__label__=22;;}else{__label__=23;;}
69665 if(__label__==22){$voicing=0;;}
69666 else if(__label__==23){$type=3;;}}}while(0);var $45=$type;var $cmp70=((($45))|0)==4;var $46=$type;var $cmp72=((($46))|0)==6;var $or_cond=($cmp70)|($cmp72);if($or_cond){__label__=25;;}else{__label__=32;;}
69667 $if_then73$$if_else89$37:do{if(__label__==25){var $47=$voicing;var $cmp74=((($47))|0)==0;if($cmp74){__lastLabel__=25;__label__=26;;}else{__lastLabel__=25;__label__=29;;}
69668 if(__label__==26){var $48=$regression;var $and75=($48)&15;var $tobool76=((($and75))|0)!=0;if($tobool76){__label__=27;;}else{__label__=28;;}
69669 if(__label__==27){$voicing=1;__label__=44;break $if_then73$$if_else89$37;}
69670 else if(__label__==28){var $_pr5=$voicing;__lastLabel__=28;;}}
69671 var $49=__lastLabel__==28?$_pr5:($47);var $cmp79=((($49))|0)==2;if(!($cmp79)){__label__=44;break $if_then73$$if_else89$37;}
69672 var $50=$ph;var $end_type=(($50+13)&4294967295);var $51=HEAPU8[($end_type)];var $conv81=((($51))&255);var $cmp82=((($conv81))|0)!=0;if(!($cmp82)){__label__=44;break $if_then73$$if_else89$37;}
69673 var $52=$ph;var $end_type84=(($52+13)&4294967295);var $53=HEAP8[($end_type84)];var $54=$j;var $55=$plist2;var $arrayidx85=(($55+8*$54)&4294967295);var $phcode86=(($arrayidx85)&4294967295);HEAP8[($phcode86)]=$53;;}
69674 else if(__label__==32){var $56=$type;var $cmp90=((($56))|0)==5;var $57=$type;var $cmp92=((($57))|0)==7;var $or_cond1=($cmp90)|($cmp92);if($or_cond1){__label__=33;;}else{__label__=40;;}
69675 if(__label__==33){var $58=$voicing;var $cmp94=((($58))|0)==0;if($cmp94){__lastLabel__=33;__label__=34;;}else{__lastLabel__=33;__label__=37;;}
69676 if(__label__==34){var $59=$regression;var $and96=($59)&15;var $tobool97=((($and96))|0)!=0;if($tobool97){__label__=35;;}else{__label__=36;;}
69677 if(__label__==35){$voicing=2;__label__=44;break $if_then73$$if_else89$37;}
69678 else if(__label__==36){var $_pr6=$voicing;__lastLabel__=36;;}}
69679 var $60=__lastLabel__==36?$_pr6:($58);var $cmp100=((($60))|0)==1;if(!($cmp100)){__label__=44;break $if_then73$$if_else89$37;}
69680 var $61=$ph;var $end_type102=(($61+13)&4294967295);var $62=HEAPU8[($end_type102)];var $conv103=((($62))&255);var $cmp104=((($conv103))|0)!=0;if(!($cmp104)){__label__=44;break $if_then73$$if_else89$37;}
69681 var $63=$ph;var $end_type106=(($63+13)&4294967295);var $64=HEAP8[($end_type106)];var $65=$j;var $66=$plist2;var $arrayidx107=(($66+8*$65)&4294967295);var $phcode108=(($arrayidx107)&4294967295);HEAP8[($phcode108)]=$64;;}
69682 else if(__label__==40){var $67=$regression;var $and112=($67)&8;var $tobool113=((($and112))|0)!=0;if($tobool113){__label__=41;;}else{__label__=43;;}
69683 if(__label__==41){var $68=$type;var $cmp115=((($68))|0)==0;var $69=$type;var $cmp117=((($69))|0)==2;var $or_cond2=($cmp115)|($cmp117);if(!($or_cond2)){__label__=44;break $if_then73$$if_else89$37;}
69684 $voicing=0;;}
69685 else if(__label__==43){$voicing=0;;}}}}while(0);$word_end_devoice=0;var $70=$j;var $71=$plist2;var $arrayidx124=(($71+8*$70)&4294967295);var $sourceix125=(($arrayidx124+6)&4294967295);var $72=HEAP16[(($sourceix125)>>1)];var $tobool126=(tempInt=(($72)),(tempInt>=32768?tempInt-65536:tempInt))!=0;if(!($tobool126)){__label__=50;break $for_inc140$$if_end44$21;}
69686 var $73=$regression;var $and128=($73)&4;var $tobool129=((($and128))|0)!=0;if($tobool129){__label__=46;;}else{__label__=47;;}
69687 if(__label__==46){$voicing=0;;}
69688 var $74=$regression;var $and132=($74)&16;var $tobool133=((($and132))|0)!=0;if(!($tobool133)){__label__=50;break $for_inc140$$if_end44$21;}
69689 var $75=$voicing;var $cmp135=((($75))|0)==0;if(!($cmp135)){__label__=50;break $for_inc140$$if_end44$21;}
69690 $voicing=1;$word_end_devoice=1;;}}while(0);var $76=$j;var $dec141=((($76)-1)&4294967295);$j=$dec141;var $cmp38=((($dec141))|0)>=0;if($cmp38){__label__=13;continue $for_body39$19;}else{__label__=51;break $if_then35$$if_end143$17;}}}}while(0);var $77=$tr_addr;var $arraydecay=(($ph_list3)&4294967295);var $call=__ZL18SubstitutePhonemesP10TranslatorP12PHONEME_LIST($77,$arraydecay);var $sub144=((($call)-2)&4294967295);$n_ph_list3=$sub144;$j=0;;$for_cond145$72:while(1){var $78=$j;var $79=$n_ph_list3;var $cmp146=((($78))|0)<((($79))|0);if(!($cmp146)){__label__=64;break $for_cond145$72;}
69691 var $80=$ix;var $cmp147=((($80))|0)<997;if(!($cmp147)){__label__=64;break $for_cond145$72;}
69692 var $81=$j;var $arrayidx149=(($ph_list3+$81*24)&4294967295);var $sourceix150=(($arrayidx149+6)&4294967295);var $82=HEAP16[(($sourceix150)>>1)];var $tobool151=(tempInt=(($82)),(tempInt>=32768?tempInt-65536:tempInt))!=0;if($tobool151){__label__=55;;}else{__label__=63;;}
69693 if(__label__==55){$word_stress=0;var $83=$j;$nextw=$83;;$for_cond153$78:while(1){var $84=$nextw;var $85=$n_ph_list3;var $cmp154=((($84))|0)<((($85))|0);if(!($cmp154)){__label__=60;break $for_cond153$78;}
69694 var $86=$nextw;var $arrayidx156=(($ph_list3+$86*24)&4294967295);var $stresslevel157=(($arrayidx156+1)&4294967295);var $87=HEAPU8[($stresslevel157)];var $conv158=((($87))&255);var $88=$word_stress;var $cmp159=((($conv158))|0)>((($88))|0);if($cmp159){__label__=58;;}else{__label__=59;;}
69695 if(__label__==58){var $89=$nextw;var $arrayidx161=(($ph_list3+$89*24)&4294967295);var $stresslevel162=(($arrayidx161+1)&4294967295);var $90=HEAPU8[($stresslevel162)];var $conv163=((($90))&255);$word_stress=$conv163;;}
69696 var $91=$nextw;var $inc=((($91)+1)&4294967295);$nextw=$inc;var $92=$nextw;var $arrayidx165=(($ph_list3+$92*24)&4294967295);var $sourceix166=(($arrayidx165+6)&4294967295);var $93=HEAP16[(($sourceix166)>>1)];var $tobool167=(tempInt=(($93)),(tempInt>=32768?tempInt-65536:tempInt))!=0;if($tobool167){__label__=60;break $for_cond153$78;}else{__label__=56;continue $for_cond153$78;}}
69697 var $94=$j;$k=$94;var $95=$k;var $96=$nextw;var $cmp1728=((($95))|0)<((($96))|0);if($cmp1728){__label__=61;;}else{__label__=62;;}
69698 $for_body173$$for_end178$85:do{if(__label__==61){while(1){var $97=$word_stress;var $conv174=((($97))&255);var $98=$k;var $arrayidx175=(($ph_list3+$98*24)&4294967295);var $wordstress=(($arrayidx175+2)&4294967295);HEAP8[($wordstress)]=$conv174;var $99=$k;var $inc177=((($99)+1)&4294967295);$k=$inc177;var $100=$k;var $101=$nextw;var $cmp172=((($100))|0)<((($101))|0);if($cmp172){__label__=61;continue;}else{__label__=62;break $for_body173$$for_end178$85;}}}}while(0);var $102=$nextw;$j=$102;__label__=52;continue $for_cond145$72;}
69699 else if(__label__==63){var $103=$j;var $inc180=((($103)+1)&4294967295);$j=$inc180;__label__=52;continue $for_cond145$72;}}
69700 var $104=HEAP32[((((_phoneme_tab+36)&4294967295))>>2)];$ph=$104;var $105=$ph;var $arrayidx183=(($ph_list3)&4294967295);var $ph184=(($arrayidx183+8)&4294967295);HEAP32[(($ph184)>>2)]=$105;$switched_language=0;$j=0;var $pd_param=(($phdata+4)&4294967295);var $arrayidx233=(($pd_param+12)&4294967295);var $pd_param262=(($phdata+4)&4294967295);var $arrayidx263=(($pd_param262+4)&4294967295);var $pd_param480=(($phdata+4)&4294967295);var $arrayidx481=(($pd_param480+16)&4294967295);var $pd_param484=(($phdata+4)&4294967295);var $arrayidx485=(($pd_param484+16)&4294967295);var $pd_param537=(($phdata+4)&4294967295);var $arrayidx538=(($pd_param537+40)&4294967295);;$for_cond185$91:while(1){var $106=$insert_ph;var $tobool186=((($106))|0)!=0;if($tobool186){__lastLabel__=65;__label__=69;;}else{__lastLabel__=65;__label__=66;;}
69701 if(__label__==66){var $107=$j;var $108=$n_ph_list3;var $cmp187=((($107))|0)<((($108))|0);if(!($cmp187)){__label__=158;break $for_cond185$91;}
69702 var $109=$ix;var $cmp189=((($109))|0)<997;if(!($cmp189)){__label__=158;break $for_cond185$91;}
69703 var $_pr7=$insert_ph;__lastLabel__=68;;}
69704 var $110=__lastLabel__==68?$_pr7:($106);var $111=$ph;$prev=$111;var $112=$j;var $arrayidx192=(($ph_list3+$112*24)&4294967295);$plist3=$arrayidx192;var $cmp193=((($110))|0)!=0;var $113=$plist3;var $phcode195=(($113)&4294967295);var $114=HEAPU8[($phcode195)];var $idxprom196=((($114))&255);var $arrayidx197=((_phoneme_tab+$idxprom196*4)&4294967295);var $115=HEAP32[(($arrayidx197)>>2)];if($cmp193){__label__=70;;}else{__label__=73;;}
69705 if(__label__==70){$next=$115;var $116=$j;var $dec198=((($116)-1)&4294967295);$j=$dec198;var $117=$j;var $arrayidx199=(($ph_list3+$117*24)&4294967295);$plist3_inserted=$arrayidx199;$plist3=$arrayidx199;var $118=$j;var $cmp200=((($118))|0)>0;if($cmp200){__label__=71;;}else{__label__=72;;}
69706 if(__label__==71){var $119=$plist3;var $arrayidx202=(($119+-24)&4294967295);var $120=$arrayidx202;var $121=$plist3;var $arrayidx203=(($121)&4294967295);var $122=$arrayidx203;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$122;$dest$=$120;$stop$=$src$+24;if(($dest$%4)==($src$%4)&&24>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
69707 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
69708 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};;}
69709 var $123=$plist3;var $arrayidx205=(($123)&4294967295);var $124=$arrayidx205;var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=$124;$stop$=$dest$+24;$value4$=0;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=0;}
69710 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
69711 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=0;};var $125=$insert_ph;var $conv206=((($125))&255);var $126=$plist3;var $phcode207=(($126)&4294967295);HEAP8[($phcode207)]=$conv206;var $127=$insert_ph;var $arrayidx208=((_phoneme_tab+$127*4)&4294967295);var $128=HEAP32[(($arrayidx208)>>2)];$ph=$128;var $129=$ph;var $130=$plist3;var $ph209=(($130+8)&4294967295);HEAP32[(($ph209)>>2)]=$129;$insert_ph=0;;}
69712 else if(__label__==73){$ph=$115;var $131=$ph;var $132=$plist3;var $arrayidx214=(($132)&4294967295);var $ph215=(($arrayidx214+8)&4294967295);HEAP32[(($ph215)>>2)]=$131;var $133=$plist3;var $phcode216=(($133)&4294967295);var $134=HEAPU8[($phcode216)];var $conv217=((($134))&255);var $cmp218=((($conv217))|0)==21;if($cmp218){__label__=74;;}else{__label__=75;;}
69713 if(__label__==74){var $135=$plist3;var $tone_ph=(($135+3)&4294967295);var $136=HEAPU8[($tone_ph)];var $conv220=((($136))&255);__Z18SelectPhonemeTablei($conv220);var $137=$switched_language;var $xor221=($137)^32;$switched_language=$xor221;;}
69714 var $138=$plist3;var $arrayidx223=(($138+24)&4294967295);var $phcode224=(($arrayidx223)&4294967295);var $139=HEAPU8[($phcode224)];var $idxprom225=((($139))&255);var $arrayidx226=((_phoneme_tab+$idxprom225*4)&4294967295);var $140=HEAP32[(($arrayidx226)>>2)];$next=$140;var $141=$next;var $142=$plist3;var $arrayidx227=(($142+24)&4294967295);var $ph228=(($arrayidx227+8)&4294967295);HEAP32[(($ph228)>>2)]=$141;;}
69715 var $143=$ph;var $cmp230=((($143))|0)==0;if($cmp230){__label__=157;;}else{__label__=77;;}
69716 $for_inc584$$if_end232$108:do{if(__label__==77){var $144=$tr_addr;var $145=$plist3;__Z16InterpretPhonemeP10TranslatoriP12PHONEME_LISTP12PHONEME_DATA($144,256,$145,$phdata);var $146=HEAP32[(($arrayidx233)>>2)];$alternative=$146;var $cmp234=((($146))|0)>0;if($cmp234){__label__=78;;}else{__label__=83;;}
69717 if(__label__==78){var $147=$ph;$ph2=$147;var $148=$plist3;var $phcode236=(($148)&4294967295);var $149=HEAPU8[($phcode236)];var $conv237=((($149))&255);$insert_ph=$conv237;var $150=$alternative;var $arrayidx238=((_phoneme_tab+$150*4)&4294967295);var $151=HEAP32[(($arrayidx238)>>2)];$ph=$151;var $152=$ph;var $153=$plist3;var $ph239=(($153+8)&4294967295);HEAP32[(($ph239)>>2)]=$152;var $154=$alternative;var $conv240=((($154))&255);var $155=$plist3;var $phcode241=(($155)&4294967295);HEAP8[($phcode241)]=$conv240;var $156=$ph;var $type242=(($156+11)&4294967295);var $157=HEAPU8[($type242)];var $conv243=((($157))&255);var $cmp244=((($conv243))|0)==2;var $158=$plist3;var $synthflags246=(($158+4)&4294967295);var $159=HEAPU16[(($synthflags246)>>1)];var $conv247=((($159))&65535);if($cmp244){__label__=79;;}else{__label__=81;;}
69718 $if_then245$$if_else255$112:do{if(__label__==79){var $or=($conv247)|4;var $conv248=((($or))&65535);HEAP16[(($synthflags246)>>1)]=$conv248;var $160=$ph2;var $type249=(($160+11)&4294967295);var $161=HEAPU8[($type249)];var $conv250=((($161))&255);var $cmp251=((($conv250))|0)!=2;if(!($cmp251)){__label__=82;break $if_then245$$if_else255$112;}
69719 var $162=$plist3;var $stresslevel253=(($162+1)&4294967295);HEAP8[($stresslevel253)]=0;;}
69720 else if(__label__==81){var $and258=($conv247)&-5;var $conv259=((($and258))&65535);HEAP16[(($synthflags246)>>1)]=$conv259;;}}while(0);var $163=$tr_addr;var $164=$plist3;__Z16InterpretPhonemeP10TranslatoriP12PHONEME_LISTP12PHONEME_DATA($163,256,$164,$phdata);;}
69721 var $165=HEAP32[(($arrayidx263)>>2)];$alternative=$165;var $cmp264=((($165))|0)>0;if($cmp264){__label__=84;;}else{__label__=90;;}
69722 if(__label__==84){var $166=$ph;$ph2266=$166;var $167=$alternative;var $arrayidx267=((_phoneme_tab+$167*4)&4294967295);var $168=HEAP32[(($arrayidx267)>>2)];$ph=$168;var $169=$ph;var $170=$plist3;var $ph268=(($170+8)&4294967295);HEAP32[(($ph268)>>2)]=$169;var $171=$alternative;var $conv269=((($171))&255);var $172=$plist3;var $phcode270=(($172)&4294967295);HEAP8[($phcode270)]=$conv269;var $173=$alternative;var $cmp271=((($173))|0)==1;if($cmp271){__label__=157;break $for_inc584$$if_end232$108;}
69723 var $174=$ph;var $type274=(($174+11)&4294967295);var $175=HEAPU8[($type274)];var $conv275=((($175))&255);var $cmp276=((($conv275))|0)==2;var $176=$plist3;var $synthflags278=(($176+4)&4294967295);var $177=HEAPU16[(($synthflags278)>>1)];var $conv279=((($177))&65535);if($cmp276){__label__=86;;}else{__label__=88;;}
69724 $if_then277$$if_else288$121:do{if(__label__==86){var $or280=($conv279)|4;var $conv281=((($or280))&65535);HEAP16[(($synthflags278)>>1)]=$conv281;var $178=$ph2266;var $type282=(($178+11)&4294967295);var $179=HEAPU8[($type282)];var $conv283=((($179))&255);var $cmp284=((($conv283))|0)!=2;if(!($cmp284)){__label__=89;break $if_then277$$if_else288$121;}
69725 var $180=$plist3;var $stresslevel286=(($180+1)&4294967295);HEAP8[($stresslevel286)]=0;;}
69726 else if(__label__==88){var $and291=($conv279)&-5;var $conv292=((($and291))&65535);HEAP16[(($synthflags278)>>1)]=$conv292;;}}while(0);var $181=$tr_addr;var $182=$plist3;__Z16InterpretPhonemeP10TranslatoriP12PHONEME_LISTP12PHONEME_DATA($181,256,$182,$phdata);;}
69727 var $183=$ph;var $type295=(($183+11)&4294967295);var $184=HEAPU8[($type295)];var $conv296=((($184))&255);var $cmp297=((($conv296))|0)==2;if($cmp297){__label__=91;;}else{__label__=110;;}
69728 $if_then298$$if_end362$127:do{if(__label__==91){var $185=$plist3;var $stresslevel299=(($185+1)&4294967295);var $186=HEAPU8[($stresslevel299)];var $conv300=((($186))&255);var $cmp301=((($conv300))|0)<=1;if($cmp301){__label__=92;;}else{__label__=109;;}
69729 if(__label__==92){var $187=$unstress_count;var $inc303=((($187)+1)&4294967295);$unstress_count=$inc303;var $188=$tr_addr;var $langopts304=(($188)&4294967295);var $stress_flags=(($langopts304+12)&4294967295);var $189=HEAP32[(($stress_flags)>>2)];var $and305=($189)&8;var $tobool306=((($and305))|0)!=0;if($tobool306){__label__=93;;}else{__label__=102;;}
69730 if(__label__==93){var $190=$plist3;var $add_ptr=(($190+24)&4294967295);$p=$add_ptr;;while(1){var $191=$p;var $type309=(($191+15)&4294967295);var $192=HEAPU8[($type309)];var $conv310=((($192))&255);var $cmp311=((($conv310))|0)!=0;if(!($cmp311)){__label__=110;break $if_then298$$if_end362$127;}
69731 var $193=$p;var $type313=(($193+15)&4294967295);var $194=HEAPU8[($type313)];var $conv314=((($194))&255);var $cmp315=((($conv314))|0)==2;var $195=$p;if($cmp315){__label__=96;break;}
69732 var $incdec_ptr=(($195+24)&4294967295);$p=$incdec_ptr;__label__=94;continue;}
69733 var $stresslevel317=(($195+1)&4294967295);var $196=HEAPU8[($stresslevel317)];var $conv318=((($196))&255);var $cmp319=((($conv318))|0)<=1;if(!($cmp319)){__label__=110;break $if_then298$$if_end362$127;}
69734 var $197=$plist3;var $wordstress321=(($197+2)&4294967295);var $198=HEAPU8[($wordstress321)];var $conv322=((($198))&255);var $cmp323=((($conv322))|0)<4;if($cmp323){__label__=98;;}else{__label__=99;;}
69735 if(__label__==98){var $199=$plist3;var $stresslevel325=(($199+1)&4294967295);HEAP8[($stresslevel325)]=0;;}
69736 var $200=$p;var $wordstress327=(($200+2)&4294967295);var $201=HEAPU8[($wordstress327)];var $conv328=((($201))&255);var $cmp329=((($conv328))|0)<4;if(!($cmp329)){__label__=110;break $if_then298$$if_end362$127;}
69737 var $202=$p;var $stresslevel331=(($202+1)&4294967295);HEAP8[($stresslevel331)]=0;;}
69738 else if(__label__==102){var $203=$unstress_count;var $cmp338=((($203))|0)>1;if(!($cmp338)){__label__=110;break $if_then298$$if_end362$127;}
69739 var $204=$unstress_count;var $and340=($204)&1;var $cmp341=((($and340))|0)==0;if(!($cmp341)){__label__=110;break $if_then298$$if_end362$127;}
69740 var $205=$tr_addr;var $langopts343=(($205)&4294967295);var $stress_flags344=(($langopts343+12)&4294967295);var $206=HEAP32[(($stress_flags344)>>2)];var $and345=($206)&2;var $tobool346=((($and345))|0)!=0;if($tobool346){__label__=107;;}else{__label__=105;;}
69741 $if_then354$$lor_lhs_false347$146:do{if(__label__==105){var $207=$word_stress;var $cmp348=((($207))|0)>3;if($cmp348){__label__=106;;}else{__label__=108;;}
69742 if(__label__==106){var $208=$plist3;var $add_ptr350=(($208+24)&4294967295);var $sourceix351=(($add_ptr350+6)&4294967295);var $209=HEAPU16[(($sourceix351)>>1)];var $conv352=((($209))&65535);var $cmp353=((($conv352))|0)!=0;if($cmp353){__label__=107;break $if_then354$$lor_lhs_false347$146;}}
69743 var $210=$plist3;var $stresslevel356=(($210+1)&4294967295);HEAP8[($stresslevel356)]=0;__label__=110;break $if_then298$$if_end362$127;}}while(0);$unstress_count=1;;}}
69744 else if(__label__==109){$unstress_count=0;;}}}while(0);var $211=$ph;var $type363=(($211+11)&4294967295);var $212=HEAPU8[($type363)];var $conv364=((($212))&255);var $cmp365=((($conv364))|0)==2;if($cmp365){__label__=111;;}else{__label__=112;;}
69745 if(__label__==111){$first_vowel=0;;}
69746 var $213=$plist3;var $add_ptr368=(($213+24)&4294967295);var $synthflags369=(($add_ptr368+4)&4294967295);var $214=HEAPU16[(($synthflags369)>>1)];var $conv370=((($214))&65535);var $and371=($conv370)&8;var $tobool372=((($and371))|0)!=0;if($tobool372){__label__=113;;}else{__label__=115;;}
69747 $if_then373$$if_end387$157:do{if(__label__==113){var $215=$next;var $type374=(($215+11)&4294967295);var $216=HEAPU8[($type374)];var $conv375=((($216))&255);var $call376=_strchr(((__ZZ15MakePhonemeListP10TranslatoriiE12types_double)&4294967295),$conv375);var $tobool377=((($call376))|0)!=0;if(!($tobool377)){__label__=115;break $if_then373$$if_end387$157;}
69748 var $217=$next;var $code379=(($217+10)&4294967295);var $218=HEAPU8[($code379)];var $conv380=((($218))&255);$insert_ph=$conv380;var $219=$plist3;var $add_ptr381=(($219+24)&4294967295);var $synthflags382=(($add_ptr381+4)&4294967295);var $220=HEAPU16[(($synthflags382)>>1)];var $conv383=((($220))&65535);var $xor384=($conv383)^8;var $conv385=((($xor384))&65535);HEAP16[(($synthflags382)>>1)]=$conv385;;}}while(0);var $221=$plist3;var $add_ptr388=(($221+24)&4294967295);var $sourceix389=(($add_ptr388+6)&4294967295);var $222=HEAPU16[(($sourceix389)>>1)];var $conv390=((($222))&65535);var $cmp391=((($conv390))|0)!=0;if($cmp391){__label__=116;;}else{__label__=141;;}
69749 $if_then392$$if_end471$161:do{if(__label__==116){var $223=$tr_addr;var $langopts393=(($223)&4294967295);var $vowel_pause=(($langopts393+4)&4294967295);var $224=HEAP32[(($vowel_pause)>>2)];var $tobool394=((($224))|0)!=0;if($tobool394){__label__=117;;}else{__label__=134;;}
69750 $land_lhs_true395$$if_end450$163:do{if(__label__==117){var $225=$ph;var $type396=(($225+11)&4294967295);var $226=HEAPU8[($type396)];var $conv397=((($226))&255);var $cmp398=((($conv397))|0)!=0;if(!($cmp398)){__label__=134;break $land_lhs_true395$$if_end450$163;}
69751 var $227=$ph;var $type400=(($227+11)&4294967295);var $228=HEAPU8[($type400)];var $conv401=((($228))&255);var $cmp402=((($conv401))|0)!=2;if($cmp402){__label__=119;;}else{__label__=121;;}
69752 $land_lhs_true403$$if_end409$166:do{if(__label__==119){var $229=$tr_addr;var $langopts404=(($229)&4294967295);var $vowel_pause405=(($langopts404+4)&4294967295);var $230=HEAP32[(($vowel_pause405)>>2)];var $and406=($230)&512;var $tobool407=((($and406))|0)!=0;if(!($tobool407)){__label__=121;break $land_lhs_true403$$if_end409$166;}
69753 $insert_ph=11;;}}while(0);var $231=$next;var $type410=(($231+11)&4294967295);var $232=HEAPU8[($type410)];var $conv411=((($232))&255);var $cmp412=((($conv411))|0)==2;if(!($cmp412)){__label__=134;break $land_lhs_true395$$if_end450$163;}
69754 var $233=$tr_addr;var $langopts414=(($233)&4294967295);var $vowel_pause415=(($langopts414+4)&4294967295);var $234=HEAP32[(($vowel_pause415)>>2)];var $and416=($234)&12;$x=$and416;var $cmp417=((($and416))|0)!=0;if($cmp417){__label__=123;;}else{__label__=126;;}
69755 if(__label__==123){var $235=$x;var $cmp419=((($235))|0)==12;if($cmp419){__label__=124;;}else{__label__=125;;}
69756 if(__label__==124){$insert_ph=11;;}
69757 else if(__label__==125){$insert_ph=23;;}}
69758 var $236=$ph;var $type424=(($236+11)&4294967295);var $237=HEAPU8[($type424)];var $conv425=((($237))&255);var $cmp426=((($conv425))|0)==2;if($cmp426){__label__=127;;}else{__label__=131;;}
69759 $land_lhs_true427$$if_end437$177:do{if(__label__==127){var $238=$tr_addr;var $langopts428=(($238)&4294967295);var $vowel_pause429=(($langopts428+4)&4294967295);var $239=HEAP32[(($vowel_pause429)>>2)];var $and430=($239)&3;$x=$and430;var $cmp431=((($and430))|0)!=0;if(!($cmp431)){__label__=131;break $land_lhs_true427$$if_end437$177;}
69760 var $240=$x;var $cmp433=((($240))|0)==2;if($cmp433){__label__=129;;}else{__label__=130;;}
69761 if(__label__==129){$insert_ph=10;;}
69762 else if(__label__==130){$insert_ph=23;;}}}while(0);var $241=$plist3;var $add_ptr438=(($241+24)&4294967295);var $stresslevel439=(($add_ptr438+1)&4294967295);var $242=HEAPU8[($stresslevel439)];var $conv440=((($242))&255);var $cmp441=((($conv440))|0)>=4;if(!($cmp441)){__label__=134;break $land_lhs_true395$$if_end450$163;}
69763 var $243=$tr_addr;var $langopts443=(($243)&4294967295);var $vowel_pause444=(($langopts443+4)&4294967295);var $244=HEAP32[(($vowel_pause444)>>2)];var $and445=($244)&256;var $tobool446=((($and445))|0)!=0;if(!($tobool446)){__label__=134;break $land_lhs_true395$$if_end450$163;}
69764 $insert_ph=10;;}}while(0);var $245=$plist3;var $246=$plist3_inserted;var $cmp451=((($245))|0)!=((($246))|0);if(!($cmp451)){__label__=141;break $if_then392$$if_end471$161;}
69765 var $247=$tr_addr;var $langopts453=(($247)&4294967295);var $word_gap=(($langopts453)&4294967295);var $248=HEAP32[(($word_gap)>>2)];var $and454=($248)&7;$x=$and454;var $cmp455=((($and454))|0)!=0;if($cmp455){__label__=136;;}else{__label__=139;;}
69766 $if_then456$$if_end466$188:do{if(__label__==136){var $249=$x;var $cmp457=((($249))|0)>1;if($cmp457){__label__=138;;}else{__label__=137;;}
69767 if(__label__==137){var $250=$insert_ph;var $cmp459=((($250))|0)!=10;var $251=$insert_ph;var $cmp461=((($251))|0)!=11;var $or_cond3=($cmp459)&($cmp461);if(!($or_cond3)){__label__=139;break $if_then456$$if_end466$188;}}
69768 var $252=$x;var $arrayidx463=((_pause_phonemes+$252)&4294967295);var $253=HEAPU8[($arrayidx463)];var $conv464=((($253))&255);$insert_ph=$conv464;;}}while(0);var $254=HEAP32[((_option_wordgap)>>2)];var $cmp467=((($254))|0)>0;if(!($cmp467)){__label__=141;break $if_then392$$if_end471$161;}
69769 $insert_ph=24;;}}while(0);var $255=$plist3;var $arrayidx472=(($255+48)&4294967295);var $phcode473=(($arrayidx472)&4294967295);var $256=HEAPU8[($phcode473)];var $idxprom474=((($256))&255);var $arrayidx475=((_phoneme_tab+$idxprom474*4)&4294967295);var $257=HEAP32[(($arrayidx475)>>2)];$next2=$257;var $258=$next2;var $259=$plist3;var $arrayidx476=(($259+48)&4294967295);var $ph477=(($arrayidx476+8)&4294967295);HEAP32[(($ph477)>>2)]=$258;var $260=$insert_ph;var $cmp478=((($260))|0)==0;if($cmp478){__label__=142;;}else{__label__=144;;}
69770 $land_lhs_true479$$if_end486$196:do{if(__label__==142){var $261=HEAP32[(($arrayidx481)>>2)];var $cmp482=((($261))|0)!=0;if(!($cmp482)){__label__=144;break $land_lhs_true479$$if_end486$196;}
69771 var $262=HEAP32[(($arrayidx485)>>2)];$insert_ph=$262;;}}while(0);var $263=$ph;var $264=$ix;var $265=$phlist;var $arrayidx491=(($265+24*$264)&4294967295);var $ph492=(($arrayidx491+8)&4294967295);HEAP32[(($ph492)>>2)]=$263;var $266=$ph;var $type493=(($266+11)&4294967295);var $267=HEAP8[($type493)];var $268=$ix;var $269=$phlist;var $arrayidx494=(($269+24*$268)&4294967295);var $type495=(($arrayidx494+15)&4294967295);HEAP8[($type495)]=$267;var $270=$ix;var $271=$phlist;var $arrayidx496=(($271+24*$270)&4294967295);var $env=(($arrayidx496+14)&4294967295);HEAP8[($env)]=0;var $272=$plist3;var $synthflags497=(($272+4)&4294967295);var $273=HEAPU16[(($synthflags497)>>1)];var $conv498=((($273))&65535);var $274=$switched_language;var $or499=($conv498)|($274);var $conv500=((($or499))&65535);var $275=$ix;var $276=$phlist;var $arrayidx501=(($276+24*$275)&4294967295);var $synthflags502=(($arrayidx501+4)&4294967295);HEAP16[(($synthflags502)>>1)]=$conv500;var $277=$plist3;var $stresslevel503=(($277+1)&4294967295);var $278=HEAPU8[($stresslevel503)];var $conv504=((($278))&255);var $and505=($conv504)&15;var $conv506=((($and505))&255);var $279=$ix;var $280=$phlist;var $arrayidx507=(($280+24*$279)&4294967295);var $stresslevel508=(($arrayidx507+1)&4294967295);HEAP8[($stresslevel508)]=$conv506;var $281=$plist3;var $wordstress509=(($281+2)&4294967295);var $282=HEAP8[($wordstress509)];var $283=$ix;var $284=$phlist;var $arrayidx510=(($284+24*$283)&4294967295);var $wordstress511=(($arrayidx510+2)&4294967295);HEAP8[($wordstress511)]=$282;var $285=$plist3;var $tone_ph512=(($285+3)&4294967295);var $286=HEAP8[($tone_ph512)];var $287=$ix;var $288=$phlist;var $arrayidx513=(($288+24*$287)&4294967295);var $tone_ph514=(($arrayidx513+3)&4294967295);HEAP8[($tone_ph514)]=$286;var $289=$ix;var $290=$phlist;var $arrayidx515=(($290+24*$289)&4294967295);var $sourceix516=(($arrayidx515+6)&4294967295);HEAP16[(($sourceix516)>>1)]=0;var $291=$ph;var $code517=(($291+10)&4294967295);var $292=HEAP8[($code517)];var $293=$ix;var $294=$phlist;var $arrayidx518=(($294+24*$293)&4294967295);var $phcode519=(($arrayidx518)&4294967295);HEAP8[($phcode519)]=$292;var $295=$plist3;var $sourceix520=(($295+6)&4294967295);var $296=HEAPU16[(($sourceix520)>>1)];var $conv521=((($296))&65535);var $cmp522=((($conv521))|0)!=0;if($cmp522){__label__=145;;}else{__label__=147;;}
69772 $if_then523$$if_else533$200:do{if(__label__==145){var $297=$plist3;var $sourceix524=(($297+6)&4294967295);var $298=HEAP16[(($sourceix524)>>1)];var $299=$ix;var $300=$phlist;var $arrayidx525=(($300+24*$299)&4294967295);var $sourceix526=(($arrayidx525+6)&4294967295);HEAP16[(($sourceix526)>>1)]=$298;var $301=$ix;var $302=$phlist;var $arrayidx527=(($302+24*$301)&4294967295);var $newword=(($arrayidx527+19)&4294967295);HEAP8[($newword)]=1;var $303=$start_sentence_addr;var $tobool528=((($303))|0)!=0;if(!($tobool528)){__label__=148;break $if_then523$$if_else533$200;}
69773 var $304=$ix;var $305=$phlist;var $arrayidx530=(($305+24*$304)&4294967295);var $newword531=(($arrayidx530+19)&4294967295);HEAP8[($newword531)]=5;$start_sentence_addr=0;;}
69774 else if(__label__==147){var $306=$ix;var $307=$phlist;var $arrayidx534=(($307+24*$306)&4294967295);var $newword535=(($arrayidx534+19)&4294967295);HEAP8[($newword535)]=0;;}}while(0);var $308=HEAP32[(($arrayidx538)>>2)];var $mul=((($308)*2)&4294967295);var $conv539=((($mul))&65535);var $309=$ix;var $310=$phlist;var $arrayidx540=(($310+24*$309)&4294967295);var $length=(($arrayidx540+12)&4294967295);HEAP16[(($length)>>1)]=$conv539;var $311=$ph;var $code541=(($311+10)&4294967295);var $312=HEAPU8[($code541)];var $conv542=((($312))&255);var $cmp543=((($conv542))|0)==24;var $313=HEAP32[((_option_wordgap)>>2)];var $cmp545=((($313))|0)>0;var $or_cond4=($cmp543)&($cmp545);if($or_cond4){__label__=149;;}else{__label__=150;;}
69775 if(__label__==149){var $314=HEAP32[((((_phoneme_tab+40)&4294967295))>>2)];var $315=$ix;var $316=$phlist;var $arrayidx547=(($316+24*$315)&4294967295);var $ph548=(($arrayidx547+8)&4294967295);HEAP32[(($ph548)>>2)]=$314;var $317=HEAP32[((_option_wordgap)>>2)];var $mul549=((($317)*14)&4294967295);var $conv550=((($mul549))&65535);var $318=$ix;var $319=$phlist;var $arrayidx551=(($319+24*$318)&4294967295);var $length552=(($arrayidx551+12)&4294967295);HEAP16[(($length552)>>1)]=$conv550;;}
69776 var $320=$ph;var $type554=(($320+11)&4294967295);var $321=HEAPU8[($type554)];var $conv555=((($321))&255);var $cmp556=((($conv555))|0)==2;if($cmp556){__label__=155;;}else{__label__=151;;}
69777 $if_then573$$lor_lhs_false557$208:do{if(__label__==151){var $322=$ph;var $type558=(($322+11)&4294967295);var $323=HEAPU8[($type558)];var $conv559=((($323))&255);var $cmp560=((($conv559))|0)==3;if($cmp560){__label__=155;break $if_then573$$lor_lhs_false557$208;}
69778 var $324=$ph;var $type562=(($324+11)&4294967295);var $325=HEAPU8[($type562)];var $conv563=((($325))&255);var $cmp564=((($conv563))|0)==8;if($cmp564){__label__=155;break $if_then573$$lor_lhs_false557$208;}
69779 var $326=$ph;var $type566=(($326+11)&4294967295);var $327=HEAPU8[($type566)];var $conv567=((($327))&255);var $cmp568=((($conv567))|0)==5;if($cmp568){__label__=155;break $if_then573$$lor_lhs_false557$208;}
69780 var $328=$ph;var $type570=(($328+11)&4294967295);var $329=HEAPU8[($type570)];var $conv571=((($329))&255);var $cmp572=((($conv571))|0)==7;if($cmp572){__label__=155;break $if_then573$$lor_lhs_false557$208;}else{__label__=156;break $if_then573$$lor_lhs_false557$208;}}}while(0);if(__label__==155){var $330=$ix;var $331=$phlist;var $arrayidx574=(($331+24*$330)&4294967295);var $length575=(($arrayidx574+12)&4294967295);HEAP16[(($length575)>>1)]=128;var $332=$ix;var $333=$phlist;var $arrayidx576=(($333+24*$332)&4294967295);var $env577=(($arrayidx576+14)&4294967295);HEAP8[($env577)]=0;;}
69781 var $334=$ix;var $335=$phlist;var $arrayidx579=(($335+24*$334)&4294967295);var $prepause=(($arrayidx579+16)&4294967295);HEAP8[($prepause)]=0;var $336=$ix;var $337=$phlist;var $arrayidx580=(($337+24*$336)&4294967295);var $amp=(($arrayidx580+18)&4294967295);HEAP8[($amp)]=20;var $338=$ix;var $339=$phlist;var $arrayidx581=(($339+24*$338)&4294967295);var $pitch1=(($arrayidx581+20)&4294967295);HEAP8[($pitch1)]=-1;var $340=$ix;var $341=$phlist;var $arrayidx582=(($341+24*$340)&4294967295);var $pitch2=(($arrayidx582+21)&4294967295);HEAP8[($pitch2)]=-1;var $342=$ix;var $inc583=((($342)+1)&4294967295);$ix=$inc583;;}}while(0);var $343=$j;var $inc585=((($343)+1)&4294967295);$j=$inc585;__label__=65;continue $for_cond185$91;}
69782 var $344=$ix;var $345=$phlist;var $arrayidx587=(($345+24*$344)&4294967295);var $newword588=(($arrayidx587+19)&4294967295);HEAP8[($newword588)]=2;var $346=$ix;var $347=$phlist;var $arrayidx589=(($347+24*$346)&4294967295);var $phcode590=(($arrayidx589)&4294967295);HEAP8[($phcode590)]=9;var $348=$ix;var $349=$phlist;var $arrayidx591=(($349+24*$348)&4294967295);var $type592=(($arrayidx591+15)&4294967295);HEAP8[($type592)]=0;var $350=$post_pause_addr;var $conv593=((($350))&65535);var $351=$ix;var $352=$phlist;var $arrayidx594=(($352+24*$351)&4294967295);var $length595=(($arrayidx594+12)&4294967295);HEAP16[(($length595)>>1)]=$conv593;var $353=$end_sourceix;var $conv596=((($353))&65535);var $354=$ix;var $355=$phlist;var $arrayidx597=(($355+24*$354)&4294967295);var $sourceix598=(($arrayidx597+6)&4294967295);HEAP16[(($sourceix598)>>1)]=$conv596;var $356=$ix;var $357=$phlist;var $arrayidx599=(($357+24*$356)&4294967295);var $synthflags600=(($arrayidx599+4)&4294967295);HEAP16[(($synthflags600)>>1)]=0;var $358=HEAP32[((((_phoneme_tab+36)&4294967295))>>2)];var $359=$ix;var $inc601=((($359)+1)&4294967295);$ix=$inc601;var $360=$phlist;var $arrayidx602=(($360+24*$359)&4294967295);var $ph603=(($arrayidx602+8)&4294967295);HEAP32[(($ph603)>>2)]=$358;var $361=$ix;var $362=$phlist;var $arrayidx604=(($362+24*$361)&4294967295);var $phcode605=(($arrayidx604)&4294967295);HEAP8[($phcode605)]=9;var $363=$ix;var $364=$phlist;var $arrayidx606=(($364+24*$363)&4294967295);var $type607=(($arrayidx606+15)&4294967295);HEAP8[($type607)]=0;var $365=$ix;var $366=$phlist;var $arrayidx608=(($366+24*$365)&4294967295);var $length609=(($arrayidx608+12)&4294967295);HEAP16[(($length609)>>1)]=0;var $367=$ix;var $368=$phlist;var $arrayidx610=(($368+24*$367)&4294967295);var $sourceix611=(($arrayidx610+6)&4294967295);HEAP16[(($sourceix611)>>1)]=0;var $369=$ix;var $370=$phlist;var $arrayidx612=(($370+24*$369)&4294967295);var $synthflags613=(($arrayidx612+4)&4294967295);HEAP16[(($synthflags613)>>1)]=0;var $371=HEAP32[((((_phoneme_tab+40)&4294967295))>>2)];var $372=$ix;var $inc614=((($372)+1)&4294967295);$ix=$inc614;var $373=$phlist;var $arrayidx615=(($373+24*$372)&4294967295);var $ph616=(($arrayidx615+8)&4294967295);HEAP32[(($ph616)>>2)]=$371;var $374=$ix;HEAP32[((_n_phoneme_list)>>2)]=$374;STACKTOP=__stackBase__;return;return;}
69783 function __ZL18SubstitutePhonemesP10TranslatorP12PHONEME_LIST($tr,$plist_out){;var __label__;var __lastLabel__=null;var $tr_addr;var $plist_out_addr;var $ix;var $k;var $replace_flags;var $n_plist_out;var $word_end;var $switched_language;var $plist2;var $next;$tr_addr=$tr;$plist_out_addr=$plist_out;$n_plist_out=0;$switched_language=0;$next=0;$ix=0;;$for_cond$2:while(1){var $0=$ix;var $1=HEAP32[((_n_ph_list2)>>2)];var $cmp=((($0))|0)<((($1))|0);if(!($cmp)){__label__=26;break $for_cond$2;}
69784 var $2=$n_plist_out;var $cmp1=((($2))|0)<1000;if(!($cmp1)){__label__=26;break $for_cond$2;}
69785 var $3=$ix;var $arrayidx=((_ph_list2+$3*8)&4294967295);$plist2=$arrayidx;var $4=$plist2;var $phcode=(($4)&4294967295);var $5=HEAPU8[($phcode)];var $conv=((($5))&255);var $cmp2=((($conv))|0)==21;var $6=$switched_language;if($cmp2){__lastLabel__=3;__label__=4;;}else{__lastLabel__=3;__label__=5;;}
69786 if(__label__==4){var $xor=($6)^1;$switched_language=$xor;__lastLabel__=4;;}
69787 var $7=__lastLabel__==4?$xor:($6);var $cmp3=((($7))|0)==0;if($cmp3){__label__=6;;}else{__label__=24;;}
69788 $if_then4$$if_end61$9:do{if(__label__==6){var $8=$ix;var $9=HEAP32[((_n_ph_list2)>>2)];var $sub=((($9)-1)&4294967295);var $cmp5=((($8))|0)<((($sub))|0);if($cmp5){__label__=7;;}else{__label__=8;;}
69789 if(__label__==7){var $10=$ix;var $add=((($10)+1)&4294967295);var $arrayidx7=((_ph_list2+$add*8)&4294967295);var $phcode8=(($arrayidx7)&4294967295);var $11=HEAPU8[($phcode8)];var $idxprom=((($11))&255);var $arrayidx9=((_phoneme_tab+$idxprom*4)&4294967295);var $12=HEAP32[(($arrayidx9)>>2)];$next=$12;;}
69790 $word_end=0;var $13=$plist2;var $add_ptr=(($13+8)&4294967295);var $sourceix=(($add_ptr+6)&4294967295);var $14=HEAP16[(($sourceix)>>1)];var $tobool=(tempInt=(($14)),(tempInt>=32768?tempInt-65536:tempInt))!=0;if($tobool){__label__=11;;}else{__label__=9;;}
69791 $if_then14$$lor_lhs_false$14:do{if(__label__==9){var $15=$next;var $cmp11=((($15))|0)!=0;if(!($cmp11)){__label__=12;break $if_then14$$lor_lhs_false$14;}
69792 var $16=$next;var $type=(($16+11)&4294967295);var $17=HEAPU8[($type)];var $conv12=((($17))&255);var $cmp13=((($conv12))|0)==0;if($cmp13){__label__=11;break $if_then14$$lor_lhs_false$14;}else{__label__=12;break $if_then14$$lor_lhs_false$14;}}}while(0);if(__label__==11){$word_end=1;;}
69793 $k=0;;$for_cond16$20:while(1){var $18=$k;var $19=HEAP32[((_n_replace_phonemes)>>2)];var $cmp17=((($18))|0)<((($19))|0);if(!($cmp17)){__label__=23;break $for_cond16$20;}
69794 var $20=$plist2;var $phcode19=(($20)&4294967295);var $21=HEAPU8[($phcode19)];var $conv20=((($21))&255);var $22=$k;var $arrayidx21=((_replace_phonemes+$22*3)&4294967295);var $old_ph=(($arrayidx21)&4294967295);var $23=HEAPU8[($old_ph)];var $conv22=((($23))&255);var $cmp23=((($conv20))|0)==((($conv22))|0);if($cmp23){__label__=15;;}else{__label__=22;;}
69795 $if_then24$$for_inc$23:do{if(__label__==15){var $24=$k;var $arrayidx25=((_replace_phonemes+$24*3)&4294967295);var $type26=(($arrayidx25+2)&4294967295);var $25=HEAP8[($type26)];var $conv27=(tempInt=(($25)),(tempInt>=128?tempInt-256:tempInt));$replace_flags=$conv27;var $26=$replace_flags;var $and=($26)&1;var $tobool28=((($and))|0)!=0;if($tobool28){__label__=16;;}else{__label__=17;;}
69796 if(__label__==16){var $27=$word_end;var $cmp30=((($27))|0)==0;if($cmp30){__label__=22;break $if_then24$$for_inc$23;}}
69797 var $28=$replace_flags;var $and33=($28)&2;var $tobool34=((($and33))|0)!=0;if(!($tobool34)){__label__=19;break $for_cond16$20;}
69798 var $29=$plist2;var $stresslevel=(($29+1)&4294967295);var $30=HEAPU8[($stresslevel)];var $conv36=((($30))&255);var $and37=($conv36)&7;var $cmp38=((($and37))|0)>3;if(!($cmp38)){__label__=19;break $for_cond16$20;}}}while(0);var $41=$k;var $inc=((($41)+1)&4294967295);$k=$inc;__label__=13;continue $for_cond16$20;}
69799 $for_end$$if_end40$30:do{if(__label__==19){var $31=$k;var $arrayidx41=((_replace_phonemes+$31*3)&4294967295);var $new_ph=(($arrayidx41+1)&4294967295);var $32=HEAP8[($new_ph)];var $33=$plist2;var $phcode42=(($33)&4294967295);HEAP8[($phcode42)]=$32;var $34=$plist2;var $stresslevel43=(($34+1)&4294967295);var $35=HEAPU8[($stresslevel43)];var $conv44=((($35))&255);var $cmp45=((($conv44))|0)>1;if(!($cmp45)){__label__=23;break $for_end$$if_end40$30;}
69800 var $36=$plist2;var $phcode47=(($36)&4294967295);var $37=HEAPU8[($phcode47)];var $idxprom48=((($37))&255);var $arrayidx49=((_phoneme_tab+$idxprom48*4)&4294967295);var $38=HEAP32[(($arrayidx49)>>2)];var $phflags=(($38+4)&4294967295);var $39=HEAP32[(($phflags)>>2)];var $and50=($39)&2;var $tobool51=((($and50))|0)!=0;if(!($tobool51)){__label__=23;break $for_end$$if_end40$30;}
69801 var $40=$plist2;var $stresslevel53=(($40+1)&4294967295);HEAP8[($stresslevel53)]=0;;}}while(0);var $42=$plist2;var $phcode56=(($42)&4294967295);var $43=HEAPU8[($phcode56)];var $conv57=((($43))&255);var $cmp58=((($conv57))|0)==0;if($cmp58){__label__=25;break $if_then4$$if_end61$9;}else{__label__=24;break $if_then4$$if_end61$9;}}}while(0);if(__label__==24){var $44=$n_plist_out;var $45=$plist_out_addr;var $arrayidx62=(($45+24*$44)&4294967295);var $46=$arrayidx62;var $47=$plist2;var $48=$47;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$48;$dest$=$46;$stop$=$src$+8;if(($dest$%4)==($src$%4)&&8>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
69802 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
69803 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $49=$plist2;var $phcode63=(($49)&4294967295);var $50=HEAPU8[($phcode63)];var $idxprom64=((($50))&255);var $arrayidx65=((_phoneme_tab+$idxprom64*4)&4294967295);var $51=HEAP32[(($arrayidx65)>>2)];var $52=$n_plist_out;var $53=$plist_out_addr;var $arrayidx66=(($53+24*$52)&4294967295);var $ph=(($arrayidx66+8)&4294967295);HEAP32[(($ph)>>2)]=$51;var $54=$n_plist_out;var $55=$plist_out_addr;var $arrayidx67=(($55+24*$54)&4294967295);var $ph68=(($arrayidx67+8)&4294967295);var $56=HEAP32[(($ph68)>>2)];var $type69=(($56+11)&4294967295);var $57=HEAP8[($type69)];var $58=$n_plist_out;var $59=$plist_out_addr;var $arrayidx70=(($59+24*$58)&4294967295);var $type71=(($arrayidx70+15)&4294967295);HEAP8[($type71)]=$57;var $60=$n_plist_out;var $inc72=((($60)+1)&4294967295);$n_plist_out=$inc72;;}
69804 var $61=$ix;var $inc74=((($61)+1)&4294967295);$ix=$inc74;__label__=1;continue $for_cond$2;}
69805 var $62=$n_plist_out;;return $62;return null;}
69806 function __Z10KlattReseti($control){;var __label__;var __lastLabel__=null;var $control_addr;var $r_ix;$control_addr=$control;var $0=$control_addr;var $cmp=((($0))|0)==2;if($cmp){__lastLabel__=0;__label__=1;;}else{__lastLabel__=0;__label__=2;;}
69807 if(__label__==1){var $1=HEAP32[((((__ZL10kt_globals+8)&4294967295))>>2)];var $mul=((($1)*950)&4294967295);var $div=((((($mul))|0)/10000)|0);HEAP32[((((__ZL10kt_globals+12)&4294967295))>>2)]=$div;var $2=HEAP32[((((__ZL10kt_globals+8)&4294967295))>>2)];var $mul1=((($2)*630)&4294967295);var $div2=((((($mul1))|0)/10000)|0);HEAP32[((((__ZL10kt_globals+16)&4294967295))>>2)]=$div2;var $3=HEAP32[((((__ZL10kt_globals+8)&4294967295))>>2)];var $conv=((($3))|0);var $div3=-3.1415927/($conv);HEAPF32[((((__ZL10kt_globals+72)&4294967295))>>2)]=$div3;var $4=HEAPF32[((((__ZL10kt_globals+72)&4294967295))>>2)];var $mul4=-2*($4);HEAPF32[((((__ZL10kt_globals+80)&4294967295))>>2)]=$mul4;var $5=HEAP32[((((__ZL10kt_globals+12)&4294967295))>>2)];var $6=HEAP32[((((__ZL10kt_globals+16)&4294967295))>>2)];__ZL6setabcllP11resonator_t($5,$6,((__ZL10kt_globals+188+1152)&4294967295));var $_pr=$control_addr;__lastLabel__=1;;}
69808 var $7=__lastLabel__==1?$_pr:($0);var $cmp5=((($7))|0)>0;if($cmp5){__label__=3;;}else{__label__=5;;}
69809 $if_then6$$if_end9$5:do{if(__label__==3){HEAP32[((((__ZL10kt_globals+32)&4294967295))>>2)]=0;HEAP32[((((__ZL10kt_globals+40)&4294967295))>>2)]=0;HEAP32[((((__ZL10kt_globals+44)&4294967295))>>2)]=0;HEAP32[((((__ZL10kt_globals+48)&4294967295))>>2)]=0;$r_ix=17;;while(1){var $8=$r_ix;var $arrayidx=((((__ZL10kt_globals+188)&4294967295)+$8*64)&4294967295);var $p1=(($arrayidx+24)&4294967295);HEAPF32[(($p1)>>2)]=0;var $9=$r_ix;var $arrayidx8=((((__ZL10kt_globals+188)&4294967295)+$9*64)&4294967295);var $p2=(($arrayidx8+32)&4294967295);HEAPF32[(($p2)>>2)]=0;var $10=$r_ix;var $inc=((($10)+1)&4294967295);$r_ix=$inc;var $cmp7=((($inc))|0)<20;if($cmp7){__label__=4;continue;}else{__label__=5;break $if_then6$$if_end9$5;}}}}while(0);$r_ix=0;;while(1){var $11=$r_ix;var $arrayidx13=((((__ZL10kt_globals+188)&4294967295)+$11*64)&4294967295);var $p114=(($arrayidx13+24)&4294967295);HEAPF32[(($p114)>>2)]=0;var $12=$r_ix;var $arrayidx15=((((__ZL10kt_globals+188)&4294967295)+$12*64)&4294967295);var $p216=(($arrayidx15+32)&4294967295);HEAPF32[(($p216)>>2)]=0;var $13=$r_ix;var $inc18=((($13)+1)&4294967295);$r_ix=$inc18;var $cmp11=((($inc18))|0)<=16;if($cmp11){__label__=6;continue;}else{__label__=7;break;}};return;return;}
69810 function __ZL6setabcllP11resonator_t($f,$bw,$rp){;var __label__;var $f_addr;var $bw_addr;var $rp_addr;var $r;var $arg;$f_addr=$f;$bw_addr=$bw;$rp_addr=$rp;var $0=HEAPF32[((((__ZL10kt_globals+72)&4294967295))>>2)];var $1=$bw_addr;var $conv=((($1))|0);var $mul=($0)*($conv);$arg=$mul;var $2=$arg;var $call=_exp($2);$r=$call;var $3=$r;var $4=$r;var $mul1=($3)*($4);var $sub=(-($mul1));var $5=$rp_addr;var $c=(($5+16)&4294967295);HEAPF32[(($c)>>2)]=$sub;var $6=HEAPF32[((((__ZL10kt_globals+80)&4294967295))>>2)];var $7=$f_addr;var $conv2=((($7))|0);var $mul3=($6)*($conv2);$arg=$mul3;var $8=$r;var $9=$arg;var $call4=_cos($9);var $mul5=($8)*($call4);var $mul6=($mul5)*2;var $10=$rp_addr;var $b=(($10+8)&4294967295);HEAPF32[(($b)>>2)]=$mul6;var $11=$rp_addr;var $b7=(($11+8)&4294967295);var $12=HEAPF32[(($b7)>>2)];var $sub8=1-($12);var $13=$rp_addr;var $c9=(($13+16)&4294967295);var $14=HEAPF32[(($c9)>>2)];var $sub10=($sub8)-($14);var $15=$rp_addr;var $a=(($15)&4294967295);HEAPF32[(($a)>>2)]=$sub10;;return;return;}
69811 function __Z13Wavegen_Klatti($resume){;var __label__;var $retval;var $resume_addr;var $pk;var $x;var $ix;var $fade;$resume_addr=$resume;var $0=$resume_addr;var $cmp=((($0))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
69812 if(__label__==1){HEAP32[((__ZL12sample_count)>>2)]=0;;}
69813 $while_cond$4:while(1){var $1=HEAP32[((__ZL12sample_count)>>2)];var $2=HEAP32[((__ZL8nsamples802)>>2)];var $cmp1=((($1))|0)<((($2))|0);if(!($cmp1)){__label__=23;break $while_cond$4;}
69814 var $3=HEAP32[((((_wdata+4)&4294967295))>>2)];var $mul=((($3)*10)&4294967295);var $div=((((($mul))|0)/4096)|0);HEAP32[((((__ZL8kt_frame)&4294967295))>>2)]=$div;$ix=0;;$for_body$7:while(1){var $4=$ix;var $arrayidx=((__ZL5peaks801+$4*80)&4294967295);var $freq=(($arrayidx)&4294967295);var $5=HEAP32[(($freq)>>2)];var $6=$ix;var $arrayidx3=((((__ZL8kt_frame+8)&4294967295)+$6*4)&4294967295);HEAP32[(($arrayidx3)>>2)]=$5;var $7=$ix;var $cmp4=((($7))|0)<4;if($cmp4){__label__=5;;}else{__label__=6;;}
69815 if(__label__==5){var $8=$ix;var $arrayidx6=((__ZL5peaks801+$8*80)&4294967295);var $bw=(($arrayidx6+4)&4294967295);var $9=HEAP32[(($bw)>>2)];var $10=$ix;var $arrayidx7=((((__ZL8kt_frame+48)&4294967295)+$10*4)&4294967295);HEAP32[(($arrayidx7)>>2)]=$9;;}
69816 var $11=$ix;var $inc=((($11)+1)&4294967295);$ix=$inc;var $cmp2=((($inc))|0)<6;if($cmp2){__label__=4;continue $for_body$7;}else{__label__=7;break $for_body$7;}}
69817 $ix=1;;$for_body11$13:while(1){var $12=$ix;var $arrayidx12=((((__ZL8kt_frame+88)&4294967295)+$12*4)&4294967295);HEAP32[(($arrayidx12)>>2)]=0;var $13=$ix;var $inc14=((($13)+1)&4294967295);$ix=$inc14;var $cmp10=((($inc14))|0)<7;if($cmp10){__label__=8;continue $for_body11$13;}else{__label__=9;break $for_body11$13;}}
69818 var $14=HEAP32[((((__ZL6klattp)&4294967295))>>2)];HEAP32[((((__ZL8kt_frame+4)&4294967295))>>2)]=$14;var $15=HEAP32[((((__ZL6klattp+24)&4294967295))>>2)];HEAP32[((((__ZL8kt_frame+196)&4294967295))>>2)]=$15;var $16=HEAP32[((((__ZL6klattp+28)&4294967295))>>2)];HEAP32[((((__ZL8kt_frame+184)&4294967295))>>2)]=$16;var $17=HEAP32[((((__ZL6klattp+32)&4294967295))>>2)];HEAP32[((((__ZL8kt_frame+192)&4294967295))>>2)]=$17;var $18=HEAP32[((((__ZL6klattp+12)&4294967295))>>2)];HEAP32[((((__ZL8kt_frame+168)&4294967295))>>2)]=$18;var $19=HEAP32[((((__ZL6klattp+36)&4294967295))>>2)];HEAP32[((((__ZL8kt_frame+176)&4294967295))>>2)]=$19;var $20=HEAP32[((((__ZL6klattp+16)&4294967295))>>2)];HEAP32[((((__ZL8kt_frame+188)&4294967295))>>2)]=$20;var $21=HEAP32[((((__ZL6klattp+8)&4294967295))>>2)];HEAP32[((((__ZL8kt_frame+180)&4294967295))>>2)]=$21;var $22=HEAP32[((((__ZL6klattp+20)&4294967295))>>2)];HEAP32[((((__ZL8kt_frame+172)&4294967295))>>2)]=$22;$pk=0;;$for_body18$16:while(1){var $23=$pk;var $arrayidx19=((__ZL5peaks801+$23*80)&4294967295);var $freq_inc=(($arrayidx19+48)&4294967295);var $24=HEAPF32[(($freq_inc)>>2)];var $25=$pk;var $arrayidx20=((__ZL5peaks801+$25*80)&4294967295);var $freq1=(($arrayidx20+16)&4294967295);var $26=HEAPF32[(($freq1)>>2)];var $add=($26)+($24);HEAPF32[(($freq1)>>2)]=$add;var $27=$pk;var $arrayidx21=((__ZL5peaks801+$27*80)&4294967295);var $freq122=(($arrayidx21+16)&4294967295);var $28=HEAPF32[(($freq122)>>2)];var $conv=((($28))|0);var $29=$pk;var $arrayidx23=((__ZL5peaks801+$29*80)&4294967295);var $freq24=(($arrayidx23)&4294967295);HEAP32[(($freq24)>>2)]=$conv;var $30=$pk;var $arrayidx25=((__ZL5peaks801+$30*80)&4294967295);var $bw_inc=(($arrayidx25+56)&4294967295);var $31=HEAPF32[(($bw_inc)>>2)];var $32=$pk;var $arrayidx26=((__ZL5peaks801+$32*80)&4294967295);var $bw1=(($arrayidx26+24)&4294967295);var $33=HEAPF32[(($bw1)>>2)];var $add27=($33)+($31);HEAPF32[(($bw1)>>2)]=$add27;var $34=$pk;var $arrayidx28=((__ZL5peaks801+$34*80)&4294967295);var $bw129=(($arrayidx28+24)&4294967295);var $35=HEAPF32[(($bw129)>>2)];var $conv30=((($35))|0);var $36=$pk;var $arrayidx31=((__ZL5peaks801+$36*80)&4294967295);var $bw32=(($arrayidx31+4)&4294967295);HEAP32[(($bw32)>>2)]=$conv30;var $37=$pk;var $arrayidx33=((__ZL5peaks801+$37*80)&4294967295);var $bp_inc=(($arrayidx33+72)&4294967295);var $38=HEAPF32[(($bp_inc)>>2)];var $39=$pk;var $arrayidx34=((__ZL5peaks801+$39*80)&4294967295);var $bp1=(($arrayidx34+40)&4294967295);var $40=HEAPF32[(($bp1)>>2)];var $add35=($40)+($38);HEAPF32[(($bp1)>>2)]=$add35;var $41=$pk;var $arrayidx36=((__ZL5peaks801+$41*80)&4294967295);var $bp137=(($arrayidx36+40)&4294967295);var $42=HEAPF32[(($bp137)>>2)];var $conv38=((($42))|0);var $43=$pk;var $arrayidx39=((__ZL5peaks801+$43*80)&4294967295);var $bp=(($arrayidx39+12)&4294967295);HEAP32[(($bp)>>2)]=$conv38;var $44=$pk;var $arrayidx40=((__ZL5peaks801+$44*80)&4294967295);var $ap_inc=(($arrayidx40+64)&4294967295);var $45=HEAPF32[(($ap_inc)>>2)];var $46=$pk;var $arrayidx41=((__ZL5peaks801+$46*80)&4294967295);var $ap1=(($arrayidx41+32)&4294967295);var $47=HEAPF32[(($ap1)>>2)];var $add42=($47)+($45);HEAPF32[(($ap1)>>2)]=$add42;var $48=$pk;var $arrayidx43=((__ZL5peaks801+$48*80)&4294967295);var $ap144=(($arrayidx43+32)&4294967295);var $49=HEAPF32[(($ap144)>>2)];var $conv45=((($49))|0);var $50=$pk;var $arrayidx46=((__ZL5peaks801+$50*80)&4294967295);var $ap=(($arrayidx46+8)&4294967295);HEAP32[(($ap)>>2)]=$conv45;var $51=$pk;var $inc48=((($51)+1)&4294967295);$pk=$inc48;var $cmp17=((($inc48))|0)<9;if($cmp17){__label__=10;continue $for_body18$16;}else{__label__=11;break $for_body18$16;}}
69819 $ix=0;;$for_body52$19:while(1){var $52=$ix;var $arrayidx53=((__ZL10klattp_inc+$52*8)&4294967295);var $53=HEAPF32[(($arrayidx53)>>2)];var $54=$ix;var $arrayidx54=((__ZL7klattp1+$54*8)&4294967295);var $55=HEAPF32[(($arrayidx54)>>2)];var $add55=($55)+($53);HEAPF32[(($arrayidx54)>>2)]=$add55;var $56=$ix;var $arrayidx56=((__ZL7klattp1+$56*8)&4294967295);var $57=HEAPF32[(($arrayidx56)>>2)];var $conv57=((($57))|0);var $58=$ix;var $arrayidx58=((__ZL6klattp+$58*4)&4294967295);HEAP32[(($arrayidx58)>>2)]=$conv57;var $59=$ix;var $inc60=((($59)+1)&4294967295);$ix=$inc60;var $cmp51=((($inc60))|0)<10;if($cmp51){__label__=12;continue $for_body52$19;}else{__label__=13;break $for_body52$19;}}
69820 $ix=0;;while(1){var $60=$ix;var $arrayidx65=((__ZL5peaks801+$60*80)&4294967295);var $freq66=(($arrayidx65)&4294967295);var $61=HEAP32[(($freq66)>>2)];var $62=$ix;var $arrayidx67=((((__ZL8kt_frame+208)&4294967295)+$62*4)&4294967295);HEAP32[(($arrayidx67)>>2)]=$61;var $63=$ix;var $cmp68=((($63))|0)<4;if($cmp68){__label__=15;;}else{__label__=16;;}
69821 if(__label__==15){var $64=$ix;var $arrayidx70=((__ZL5peaks801+$64*80)&4294967295);var $bw71=(($arrayidx70+4)&4294967295);var $65=HEAP32[(($bw71)>>2)];var $66=$ix;var $arrayidx72=((((__ZL8kt_frame+248)&4294967295)+$66*4)&4294967295);HEAP32[(($arrayidx72)>>2)]=$65;;}
69822 var $67=$ix;var $inc75=((($67)+1)&4294967295);$ix=$inc75;var $cmp63=((($inc75))|0)<=6;if($cmp63){__label__=14;continue;}else{__label__=17;break;}}
69823 var $68=HEAP32[((((_wdata+12)&4294967295))>>2)];var $69=HEAP32[((((_wdata+8)&4294967295))>>2)];var $add77=((($69)+($68))&4294967295);HEAP32[((((_wdata+8)&4294967295))>>2)]=$add77;var $70=HEAP32[((((_wdata+8)&4294967295))>>2)];var $shr=($70)>>8;$ix=$shr;var $cmp78=((($shr))|0)>127;if($cmp78){__label__=18;;}else{__label__=19;;}
69824 if(__label__==18){$ix=127;;}
69825 var $71=$ix;var $72=HEAP32[((((_wdata)&4294967295))>>2)];var $arrayidx81=(($72+$71)&4294967295);var $73=HEAPU8[($arrayidx81)];var $conv82=((($73))&255);var $74=HEAP32[((((_wdata+20)&4294967295))>>2)];var $mul83=((($conv82)*($74))&4294967295);$x=$mul83;var $75=$x;var $shr84=($75)>>8;var $76=HEAP32[((((_wdata+16)&4294967295))>>2)];var $add85=((($shr84)+($76))&4294967295);HEAP32[((((_wdata+4)&4294967295))>>2)]=$add85;var $77=HEAP32[((__ZL8nsamples802)>>2)];var $78=HEAP32[((__ZL12sample_count)>>2)];var $sub=((($77)-($78))&4294967295);HEAP32[((((__ZL10kt_globals+28)&4294967295))>>2)]=$sub;var $cmp86=((($sub))|0)>64;if($cmp86){__label__=20;;}else{__label__=21;;}
69826 if(__label__==20){HEAP32[((((__ZL10kt_globals+28)&4294967295))>>2)]=64;;}
69827 __ZL10frame_initP13klatt_frame_t();var $call=__ZL7parwaveP13klatt_frame_t();var $cmp89=((($call))|0)==1;if($cmp89){__label__=22;break $while_cond$4;}else{__label__=2;continue $while_cond$4;}}
69828 $while_end$$if_then90$34:do{if(__label__==23){var $79=HEAP32[((__ZL8end_wave803)>>2)];var $cmp92=((($79))|0)>0;if($cmp92){__label__=24;;}else{__label__=26;;}
69829 $if_then93$$if_end99$36:do{if(__label__==24){$fade=64;var $80=$fade;HEAP32[((((__ZL10kt_globals+180)&4294967295))>>2)]=$80;HEAP32[((__ZL8end_wave803)>>2)]=0;var $81=$fade;var $82=HEAP32[((__ZL12sample_count)>>2)];var $sub94=((($82)-($81))&4294967295);HEAP32[((__ZL12sample_count)>>2)]=$sub94;var $83=$fade;HEAP32[((((__ZL10kt_globals+28)&4294967295))>>2)]=$83;var $call95=__ZL7parwaveP13klatt_frame_t();var $cmp96=((($call95))|0)==1;if(!($cmp96)){__label__=26;break $if_then93$$if_end99$36;}
69830 $retval=1;__label__=27;break $while_end$$if_then90$34;}}while(0);$retval=0;;}
69831 else if(__label__==22){$retval=1;;}}while(0);var $84=$retval;;return $84;return null;}
69832 function __ZL10frame_initP13klatt_frame_t(){var __stackBase__=STACKTOP;STACKTOP+=56;_memset(__stackBase__,0,56);var __label__;var $frame_addr;var $amp_par=__stackBase__;var $Gain0_tmp;var $ix;$frame_addr=__ZL8kt_frame;var $0=$frame_addr;var $F0hz10=(($0)&4294967295);var $1=HEAP32[(($F0hz10)>>2)];var $div=((((($1))|0)/10)|0);HEAP32[((((__ZL10kt_globals+176)&4294967295))>>2)]=$div;var $2=$frame_addr;var $AVdb=(($2+4)&4294967295);var $3=HEAP32[(($AVdb)>>2)];var $sub=((($3)-7)&4294967295);var $4=$frame_addr;var $AVdb_tmp=(($4+204)&4294967295);HEAP32[(($AVdb_tmp)>>2)]=$sub;var $5=$frame_addr;var $AVdb_tmp1=(($5+204)&4294967295);var $6=HEAP32[(($AVdb_tmp1)>>2)];var $cmp=((($6))|0)<0;if($cmp){__label__=1;;}else{__label__=2;;}
69833 if(__label__==1){var $7=$frame_addr;var $AVdb_tmp2=(($7+204)&4294967295);HEAP32[(($AVdb_tmp2)>>2)]=0;;}
69834 var $8=$frame_addr;var $ASP=(($8+168)&4294967295);var $9=HEAP32[(($ASP)>>2)];var $call=__ZL7DBtoLINl($9);var $mul=($call)*0.05;HEAPF32[((((__ZL10kt_globals+128)&4294967295))>>2)]=$mul;var $10=$frame_addr;var $AF=(($10+184)&4294967295);var $11=HEAP32[(($AF)>>2)];var $call3=__ZL7DBtoLINl($11);var $mul4=($call3)*0.25;HEAPF32[((((__ZL10kt_globals+136)&4294967295))>>2)]=$mul4;var $12=$frame_addr;var $AVpdb=(($12+196)&4294967295);var $13=HEAP32[(($AVpdb)>>2)];var $call5=__ZL7DBtoLINl($13);HEAPF32[((((__ZL10kt_globals+120)&4294967295))>>2)]=$call5;var $14=$frame_addr;var $AB=(($14+192)&4294967295);var $15=HEAP32[(($AB)>>2)];var $call6=__ZL7DBtoLINl($15);var $mul7=($call6)*0.05;HEAPF32[((((__ZL10kt_globals+104)&4294967295))>>2)]=$mul7;$ix=0;;$for_body$5:while(1){var $16=$ix;var $17=$frame_addr;var $Ap=(($17+88)&4294967295);var $arrayidx=(($Ap+$16*4)&4294967295);var $18=HEAP32[(($arrayidx)>>2)];var $call9=__ZL7DBtoLINl($18);var $19=$ix;var $arrayidx10=((__ZZL10frame_initP13klatt_frame_tE14amp_par_factor+$19*8)&4294967295);var $20=HEAPF32[(($arrayidx10)>>2)];var $mul11=($call9)*($20);var $21=$ix;var $arrayidx12=(($amp_par+$21*8)&4294967295);HEAPF32[(($arrayidx12)>>2)]=$mul11;var $22=$ix;var $inc=((($22)+1)&4294967295);$ix=$inc;var $cmp8=((($inc))|0)<=6;if($cmp8){__label__=3;continue $for_body$5;}else{__label__=4;break $for_body$5;}}
69835 var $23=$frame_addr;var $Gain0=(($23+200)&4294967295);var $24=HEAP32[(($Gain0)>>2)];var $sub13=((($24)-3)&4294967295);$Gain0_tmp=$sub13;var $25=$Gain0_tmp;var $cmp14=((($25))|0)<=0;if($cmp14){__label__=5;;}else{__label__=6;;}
69836 if(__label__==5){$Gain0_tmp=57;;}
69837 var $26=$Gain0_tmp;var $call17=__ZL7DBtoLINl($26);var $27=HEAP32[((((__ZL10kt_globals+184)&4294967295))>>2)];var $conv=((($27))|0);var $div18=($call17)/($conv);HEAPF32[((((__ZL10kt_globals+152)&4294967295))>>2)]=$div18;$ix=1;;$for_body21$11:while(1){var $28=$ix;var $29=$frame_addr;var $Fhz=(($29+8)&4294967295);var $arrayidx22=(($Fhz+$28*4)&4294967295);var $30=HEAP32[(($arrayidx22)>>2)];var $31=$ix;var $32=$frame_addr;var $Bhz=(($32+48)&4294967295);var $arrayidx23=(($Bhz+$31*4)&4294967295);var $33=HEAP32[(($arrayidx23)>>2)];var $34=$ix;var $arrayidx24=((((__ZL10kt_globals+188)&4294967295)+$34*64)&4294967295);__ZL6setabcllP11resonator_t($30,$33,$arrayidx24);var $35=$ix;var $cmp25=((($35))|0)<=5;if($cmp25){__label__=8;;}else{__label__=9;;}
69838 if(__label__==8){var $36=$ix;var $37=$frame_addr;var $Fhz_next=(($37+208)&4294967295);var $arrayidx27=(($Fhz_next+$36*4)&4294967295);var $38=HEAP32[(($arrayidx27)>>2)];var $39=$ix;var $40=$frame_addr;var $Bhz_next=(($40+248)&4294967295);var $arrayidx28=(($Bhz_next+$39*4)&4294967295);var $41=HEAP32[(($arrayidx28)>>2)];var $42=$ix;var $arrayidx29=((((__ZL10kt_globals+1468)&4294967295)+$42*64)&4294967295);__ZL6setabcllP11resonator_t($38,$41,$arrayidx29);var $43=$ix;var $arrayidx30=((((__ZL10kt_globals+1468)&4294967295)+$43*64)&4294967295);var $a=(($arrayidx30)&4294967295);var $44=HEAPF32[(($a)>>2)];var $45=$ix;var $arrayidx31=((((__ZL10kt_globals+188)&4294967295)+$45*64)&4294967295);var $a32=(($arrayidx31)&4294967295);var $46=HEAPF32[(($a32)>>2)];var $sub33=($44)-($46);var $div34=($sub33)/64;var $47=$ix;var $arrayidx35=((((__ZL10kt_globals+188)&4294967295)+$47*64)&4294967295);var $a_inc=(($arrayidx35+40)&4294967295);HEAPF32[(($a_inc)>>2)]=$div34;var $48=$ix;var $arrayidx36=((((__ZL10kt_globals+1468)&4294967295)+$48*64)&4294967295);var $b=(($arrayidx36+8)&4294967295);var $49=HEAPF32[(($b)>>2)];var $50=$ix;var $arrayidx37=((((__ZL10kt_globals+188)&4294967295)+$50*64)&4294967295);var $b38=(($arrayidx37+8)&4294967295);var $51=HEAPF32[(($b38)>>2)];var $sub39=($49)-($51);var $div40=($sub39)/64;var $52=$ix;var $arrayidx41=((((__ZL10kt_globals+188)&4294967295)+$52*64)&4294967295);var $b_inc=(($arrayidx41+48)&4294967295);HEAPF32[(($b_inc)>>2)]=$div40;var $53=$ix;var $arrayidx42=((((__ZL10kt_globals+1468)&4294967295)+$53*64)&4294967295);var $c=(($arrayidx42+16)&4294967295);var $54=HEAPF32[(($c)>>2)];var $55=$ix;var $arrayidx43=((((__ZL10kt_globals+188)&4294967295)+$55*64)&4294967295);var $c44=(($arrayidx43+16)&4294967295);var $56=HEAPF32[(($c44)>>2)];var $sub45=($54)-($56);var $div46=($sub45)/64;var $57=$ix;var $arrayidx47=((((__ZL10kt_globals+188)&4294967295)+$57*64)&4294967295);var $c_inc=(($arrayidx47+56)&4294967295);HEAPF32[(($c_inc)>>2)]=$div46;;}
69839 var $58=$ix;var $inc50=((($58)+1)&4294967295);$ix=$inc50;var $cmp20=((($inc50))|0)<=9;if($cmp20){__label__=7;continue $for_body21$11;}else{__label__=10;break $for_body21$11;}}
69840 var $59=$frame_addr;var $Fhz52=(($59+8)&4294967295);var $arrayidx53=(($Fhz52)&4294967295);var $60=HEAP32[(($arrayidx53)>>2)];var $61=$frame_addr;var $Bhz54=(($61+48)&4294967295);var $arrayidx55=(($Bhz54)&4294967295);var $62=HEAP32[(($arrayidx55)>>2)];__ZL10setzeroabcllP11resonator_t($60,$62,((__ZL10kt_globals+188)&4294967295));var $63=$frame_addr;var $Fhz_next56=(($63+208)&4294967295);var $arrayidx57=(($Fhz_next56)&4294967295);var $64=HEAP32[(($arrayidx57)>>2)];var $65=$frame_addr;var $Bhz_next58=(($65+248)&4294967295);var $arrayidx59=(($Bhz_next58)&4294967295);var $66=HEAP32[(($arrayidx59)>>2)];__ZL10setzeroabcllP11resonator_t($64,$66,((__ZL10kt_globals+1468)&4294967295));var $67=HEAPF32[((((__ZL10kt_globals+1468)&4294967295))>>2)];var $68=HEAPF32[((((__ZL10kt_globals+188)&4294967295))>>2)];var $sub60=($67)-($68);var $div61=($sub60)/64;HEAPF32[((((__ZL10kt_globals+188+40)&4294967295))>>2)]=$div61;var $69=HEAPF32[((((__ZL10kt_globals+1468+8)&4294967295))>>2)];var $70=HEAPF32[((((__ZL10kt_globals+188+8)&4294967295))>>2)];var $sub62=($69)-($70);var $div63=($sub62)/64;HEAPF32[((((__ZL10kt_globals+188+48)&4294967295))>>2)]=$div63;var $71=HEAPF32[((((__ZL10kt_globals+1468+16)&4294967295))>>2)];var $72=HEAPF32[((((__ZL10kt_globals+188+16)&4294967295))>>2)];var $sub64=($71)-($72);var $div65=($sub64)/64;HEAPF32[((((__ZL10kt_globals+188+56)&4294967295))>>2)]=$div65;$ix=0;;while(1){var $73=$ix;var $74=$frame_addr;var $Fhz69=(($74+8)&4294967295);var $arrayidx70=(($Fhz69+$73*4)&4294967295);var $75=HEAP32[(($arrayidx70)>>2)];var $76=$ix;var $77=$frame_addr;var $Bphz=(($77+128)&4294967295);var $arrayidx71=(($Bphz+$76*4)&4294967295);var $78=HEAP32[(($arrayidx71)>>2)];var $79=$ix;var $add=((($79)+10)&4294967295);var $arrayidx72=((((__ZL10kt_globals+188)&4294967295)+$add*64)&4294967295);__ZL6setabcllP11resonator_t($75,$78,$arrayidx72);var $80=$ix;var $arrayidx73=(($amp_par+$80*8)&4294967295);var $81=HEAPF32[(($arrayidx73)>>2)];var $82=$ix;var $add74=((($82)+10)&4294967295);var $arrayidx75=((((__ZL10kt_globals+188)&4294967295)+$add74*64)&4294967295);var $a76=(($arrayidx75)&4294967295);var $83=HEAPF32[(($a76)>>2)];var $mul77=($83)*($81);HEAPF32[(($a76)>>2)]=$mul77;var $84=$ix;var $inc79=((($84)+1)&4294967295);$ix=$inc79;var $cmp67=((($inc79))|0)<=6;if($cmp67){__label__=11;continue;}else{__label__=12;break;}}
69841 var $85=HEAP32[((((__ZL10kt_globals+8)&4294967295))>>2)];var $div81=((((($85))|0)/2)|0);__ZL6setabcllP11resonator_t(0,$div81,((__ZL10kt_globals+188+1216)&4294967295));STACKTOP=__stackBase__;return;return;}
69842 function __ZL7parwaveP13klatt_frame_t(){;var __label__;var __lastLabel__=null;var $retval;var $frame_addr;var $temp;var $value;var $outbypas;var $out;var $n4;var $frics;var $glotout;var $aspiration;var $casc_next_in;var $par_glotout;var $ix;var $z2;var $c;var $sample;$frame_addr=__ZL8kt_frame;var $0=$frame_addr;__ZL7flutterP13klatt_frame_t($0);HEAP32[((((__ZL10kt_globals+36)&4294967295))>>2)]=0;;$for_cond$2:while(1){var $1=HEAP32[((((__ZL10kt_globals+36)&4294967295))>>2)];var $2=HEAP32[((((__ZL10kt_globals+28)&4294967295))>>2)];var $cmp=((($1))|0)<((($2))|0);if(!($cmp)){__label__=36;break $for_cond$2;}
69843 var $3=HEAPF32[((__ZZL7parwaveP13klatt_frame_tE5noise)>>2)];var $call=__ZL9gen_noised($3);HEAPF32[((__ZZL7parwaveP13klatt_frame_tE5noise)>>2)]=$call;var $4=HEAP32[((((__ZL10kt_globals+32)&4294967295))>>2)];var $5=HEAP32[((((__ZL10kt_globals+48)&4294967295))>>2)];var $cmp1=((($4))|0)>((($5))|0);if($cmp1){__label__=3;;}else{__label__=4;;}
69844 if(__label__==3){var $6=HEAPF32[((__ZZL7parwaveP13klatt_frame_tE5noise)>>2)];var $mul=($6)*0.5;HEAPF32[((__ZZL7parwaveP13klatt_frame_tE5noise)>>2)]=$mul;;}
69845 var $7=HEAPF32[((((__ZL10kt_globals+136)&4294967295))>>2)];var $8=HEAPF32[((__ZZL7parwaveP13klatt_frame_tE5noise)>>2)];var $mul2=($7)*($8);$frics=$mul2;$n4=0;;$for_body5$8:while(1){var $9=HEAP32[((((__ZL10kt_globals+20)&4294967295))>>2)];if($9==1){__label__=6;;}
69846 else if($9==2){__label__=7;;}
69847 else if($9==3){__label__=8;;}
69848 else{__label__=9;;}
69849 if(__label__==6){var $call6=__ZL16impulsive_sourcev();HEAPF32[((__ZZL7parwaveP13klatt_frame_tE5voice)>>2)]=$call6;;}
69850 else if(__label__==7){var $call8=__ZL14natural_sourcev();HEAPF32[((__ZZL7parwaveP13klatt_frame_tE5voice)>>2)]=$call8;;}
69851 else if(__label__==8){var $call10=__ZL14sampled_sourcev();HEAPF32[((__ZZL7parwaveP13klatt_frame_tE5voice)>>2)]=$call10;;}
69852 var $10=HEAP32[((((__ZL10kt_globals+32)&4294967295))>>2)];var $11=HEAP32[((((__ZL10kt_globals+40)&4294967295))>>2)];var $cmp11=((($10))|0)>=((($11))|0);if($cmp11){__label__=10;;}else{__label__=11;;}
69853 if(__label__==10){HEAP32[((((__ZL10kt_globals+32)&4294967295))>>2)]=0;var $12=$frame_addr;__ZL21pitch_synch_par_resetP13klatt_frame_t($12);;}
69854 var $13=HEAPF32[((__ZZL7parwaveP13klatt_frame_tE5voice)>>2)];var $call14=__ZL9resonatorP11resonator_td(((__ZL10kt_globals+188+1152)&4294967295),$13);HEAPF32[((__ZZL7parwaveP13klatt_frame_tE5voice)>>2)]=$call14;var $14=HEAP32[((((__ZL10kt_globals+32)&4294967295))>>2)];var $inc=((($14)+1)&4294967295);HEAP32[((((__ZL10kt_globals+32)&4294967295))>>2)]=$inc;var $15=$n4;var $inc15=((($15)+1)&4294967295);$n4=$inc15;var $cmp4=((($inc15))|0)<4;if($cmp4){__label__=5;continue $for_body5$8;}else{__label__=12;break $for_body5$8;}}
69855 var $16=HEAPF32[((__ZZL7parwaveP13klatt_frame_tE5voice)>>2)];var $17=HEAPF32[((((__ZL10kt_globals+88)&4294967295))>>2)];var $mul16=($16)*($17);var $18=HEAPF32[((__ZZL7parwaveP13klatt_frame_tE5vlast)>>2)];var $19=HEAPF32[((((__ZL10kt_globals+96)&4294967295))>>2)];var $mul17=($18)*($19);var $add=($mul16)+($mul17);HEAPF32[((__ZZL7parwaveP13klatt_frame_tE5voice)>>2)]=$add;var $20=HEAPF32[((__ZZL7parwaveP13klatt_frame_tE5voice)>>2)];HEAPF32[((__ZZL7parwaveP13klatt_frame_tE5vlast)>>2)]=$20;var $21=HEAP32[((((__ZL10kt_globals+32)&4294967295))>>2)];var $22=HEAP32[((((__ZL10kt_globals+44)&4294967295))>>2)];var $cmp18=((($21))|0)<((($22))|0);if($cmp18){__label__=13;;}else{__label__=14;;}
69856 if(__label__==13){var $23=HEAPF32[((((__ZL10kt_globals+144)&4294967295))>>2)];var $24=HEAP32[((((__ZL10kt_globals+52)&4294967295))>>2)];var $conv=((($24))|0);var $mul20=($23)*($conv);var $25=HEAPF32[((__ZZL7parwaveP13klatt_frame_tE5voice)>>2)];var $add21=($25)+($mul20);HEAPF32[((__ZZL7parwaveP13klatt_frame_tE5voice)>>2)]=$add21;;}
69857 var $26=HEAPF32[((((__ZL10kt_globals+112)&4294967295))>>2)];var $27=HEAPF32[((__ZZL7parwaveP13klatt_frame_tE5voice)>>2)];var $mul23=($26)*($27);$glotout=$mul23;var $28=HEAPF32[((((__ZL10kt_globals+120)&4294967295))>>2)];var $29=HEAPF32[((__ZZL7parwaveP13klatt_frame_tE5voice)>>2)];var $mul24=($28)*($29);$par_glotout=$mul24;var $30=HEAPF32[((((__ZL10kt_globals+128)&4294967295))>>2)];var $31=HEAPF32[((__ZZL7parwaveP13klatt_frame_tE5noise)>>2)];var $mul25=($30)*($31);$aspiration=$mul25;var $32=$aspiration;var $33=$glotout;var $add26=($33)+($32);$glotout=$add26;var $34=$aspiration;var $35=$par_glotout;var $add27=($35)+($34);$par_glotout=$add27;$out=0;var $36=HEAP32[((((__ZL10kt_globals)&4294967295))>>2)];var $cmp28=((($36))|0)!=2;if($cmp28){__label__=15;;}else{__label__=16;;}
69858 if(__label__==15){var $37=$glotout;var $call30=__ZL14antiresonator2P11resonator_td($37);$casc_next_in=$call30;var $38=$casc_next_in;var $call31=__ZL9resonatorP11resonator_td(((__ZL10kt_globals+188+576)&4294967295),$38);$casc_next_in=$call31;var $39=$casc_next_in;var $call32=__ZL9resonatorP11resonator_td(((__ZL10kt_globals+188+512)&4294967295),$39);$casc_next_in=$call32;var $40=$casc_next_in;var $call33=__ZL9resonatorP11resonator_td(((__ZL10kt_globals+188+448)&4294967295),$40);$casc_next_in=$call33;var $41=$casc_next_in;var $call34=__ZL9resonatorP11resonator_td(((__ZL10kt_globals+188+384)&4294967295),$41);$casc_next_in=$call34;var $42=$casc_next_in;var $call35=__ZL10resonator2P11resonator_td(((__ZL10kt_globals+188+320)&4294967295),$42);$casc_next_in=$call35;var $43=$casc_next_in;var $call36=__ZL10resonator2P11resonator_td(((__ZL10kt_globals+188+256)&4294967295),$43);$casc_next_in=$call36;var $44=$casc_next_in;var $call37=__ZL10resonator2P11resonator_td(((__ZL10kt_globals+188+192)&4294967295),$44);$casc_next_in=$call37;var $45=$casc_next_in;var $call38=__ZL10resonator2P11resonator_td(((__ZL10kt_globals+188+128)&4294967295),$45);$casc_next_in=$call38;var $46=$casc_next_in;var $call39=__ZL10resonator2P11resonator_td(((__ZL10kt_globals+188+64)&4294967295),$46);$out=$call39;;}
69859 var $47=$par_glotout;HEAPF32[((__ZZL7parwaveP13klatt_frame_tE5sourc)>>2)]=$47;var $48=HEAPF32[((__ZZL7parwaveP13klatt_frame_tE5sourc)>>2)];var $call41=__ZL9resonatorP11resonator_td(((__ZL10kt_globals+188+704)&4294967295),$48);var $49=$out;var $add42=($49)+($call41);$out=$add42;var $50=HEAPF32[((__ZZL7parwaveP13klatt_frame_tE5sourc)>>2)];var $call43=__ZL9resonatorP11resonator_td(((__ZL10kt_globals+188+640)&4294967295),$50);var $51=$out;var $add44=($51)+($call43);$out=$add44;var $52=$frics;var $53=$par_glotout;var $add45=($52)+($53);var $54=HEAPF32[((__ZZL7parwaveP13klatt_frame_tE8glotlast)>>2)];var $sub=($add45)-($54);HEAPF32[((__ZZL7parwaveP13klatt_frame_tE5sourc)>>2)]=$sub;var $55=$par_glotout;HEAPF32[((__ZZL7parwaveP13klatt_frame_tE8glotlast)>>2)]=$55;$ix=12;;$for_body48$25:while(1){var $56=$ix;var $arrayidx=((((__ZL10kt_globals+188)&4294967295)+$56*64)&4294967295);var $57=HEAPF32[((__ZZL7parwaveP13klatt_frame_tE5sourc)>>2)];var $call49=__ZL9resonatorP11resonator_td($arrayidx,$57);var $58=$out;var $sub50=($call49)-($58);$out=$sub50;var $59=$ix;var $inc52=((($59)+1)&4294967295);$ix=$inc52;var $cmp47=((($inc52))|0)<=16;if($cmp47){__label__=17;continue $for_body48$25;}else{__label__=18;break $for_body48$25;}}
69860 var $60=HEAPF32[((((__ZL10kt_globals+104)&4294967295))>>2)];var $61=HEAPF32[((__ZZL7parwaveP13klatt_frame_tE5sourc)>>2)];var $mul54=($60)*($61);$outbypas=$mul54;var $62=$outbypas;var $63=$out;var $sub55=($62)-($63);$out=$sub55;var $64=$out;var $call56=__ZL9resonatorP11resonator_td(((__ZL10kt_globals+188+1216)&4294967295),$64);$out=$call56;var $65=$out;var $66=HEAP32[((((_wdata+52)&4294967295))>>2)];var $conv57=((($66))|0);var $mul58=($65)*($conv57);var $67=HEAPF32[((((__ZL10kt_globals+152)&4294967295))>>2)];var $mul59=($mul58)*($67);var $conv60=((($mul59))|0);var $conv61=((($conv60))|0);$temp=$conv61;$z2=0;var $68=HEAP32[((((_wdata+40)&4294967295))>>2)];var $69=HEAP32[((((_wdata+28)&4294967295))>>2)];var $cmp62=((($68))|0)<((($69))|0);if($cmp62){__label__=19;;}else{__label__=23;;}
69861 if(__label__==19){var $70=HEAP32[((((_wdata+32)&4294967295))>>2)];var $cmp64=((($70))|0)==0;var $71=HEAPU32[((((_wdata+40)&4294967295))>>2)];var $add66=((($71)+1)&4294967295);if($cmp64){__label__=20;;}else{__label__=21;;}
69862 if(__label__==20){var $72=HEAP32[((((_wdata+24)&4294967295))>>2)];var $arrayidx67=(($72+$add66)&4294967295);var $73=HEAP8[($arrayidx67)];$c=$73;var $74=HEAP32[((((_wdata+40)&4294967295))>>2)];var $75=HEAP32[((((_wdata+24)&4294967295))>>2)];var $arrayidx68=(($75+$74)&4294967295);var $76=HEAPU8[($arrayidx68)];var $conv69=((($76))&255);var $77=$c;var $conv70=(tempInt=(($77)),(tempInt>=128?tempInt-256:tempInt));var $mul71=((($conv70)*256)&4294967295);var $add72=((($mul71)+($conv69))&4294967295);$sample=$add72;var $78=HEAP32[((((_wdata+40)&4294967295))>>2)];var $add73=((($78)+2)&4294967295);HEAP32[((((_wdata+40)&4294967295))>>2)]=$add73;;}
69863 else if(__label__==21){HEAP32[((((_wdata+40)&4294967295))>>2)]=$add66;var $79=HEAP32[((((_wdata+24)&4294967295))>>2)];var $arrayidx75=(($79+$71)&4294967295);var $80=HEAP8[($arrayidx75)];var $conv76=(tempInt=(($80)),(tempInt>=128?tempInt-256:tempInt));var $81=HEAP32[((((_wdata+32)&4294967295))>>2)];var $mul77=((($conv76)*($81))&4294967295);$sample=$mul77;;}
69864 var $82=$sample;var $83=HEAP32[((((_wdata+56)&4294967295))>>2)];var $mul79=((($83)*($82))&4294967295);var $div=((((($mul79))|0)/1024)|0);$z2=$div;var $84=$z2;var $85=HEAP32[((((_wdata+36)&4294967295))>>2)];var $mul80=((($85)*($84))&4294967295);var $div81=((((($mul80))|0)/40)|0);$z2=$div81;var $86=$z2;var $conv82=((($86))|0);var $87=$temp;var $add83=($87)+($conv82);$temp=$add83;;}
69865 var $88=HEAP32[((((__ZL10kt_globals+180)&4294967295))>>2)];var $cmp85=((($88))|0)>0;if($cmp85){__label__=24;;}else{__label__=25;;}
69866 if(__label__==24){var $89=HEAP32[((((__ZL10kt_globals+180)&4294967295))>>2)];var $dec=((($89)-1)&4294967295);HEAP32[((((__ZL10kt_globals+180)&4294967295))>>2)]=$dec;var $90=$temp;var $91=HEAP32[((((__ZL10kt_globals+180)&4294967295))>>2)];var $conv87=((($91))|0);var $mul88=($90)*($conv87);var $div89=($mul88)/64;$temp=$div89;;}
69867 var $92=$temp;var $conv91=((($92))|0);var $93=HEAP32[((_echo_tail)>>2)];var $inc92=((($93)+1)&4294967295);HEAP32[((_echo_tail)>>2)]=$inc92;var $arrayidx93=((_echo_buf+$93*2)&4294967295);var $94=HEAP16[(($arrayidx93)>>1)];var $conv94=(tempInt=(($94)),(tempInt>=32768?tempInt-65536:tempInt));var $95=HEAP32[((_echo_amp)>>2)];var $mul95=((($conv94)*($95))&4294967295);var $shr=($mul95)>>8;var $add96=((($shr)+($conv91))&4294967295);$value=$add96;var $96=HEAP32[((_echo_tail)>>2)];var $cmp97=((($96))|0)>=5500;if($cmp97){__lastLabel__=25;__label__=26;;}else{__lastLabel__=25;__label__=27;;}
69868 if(__label__==26){HEAP32[((_echo_tail)>>2)]=0;var $_pr=$value;__lastLabel__=26;;}
69869 var $97=__lastLabel__==26?$_pr:($add96);var $cmp100=((($97))|0)<-32768;if($cmp100){__label__=28;;}else{__label__=29;;}
69870 $if_end102_thread$$if_end102$41:do{if(__label__==28){$value=-32768;;}
69871 else if(__label__==29){var $_pr1=$value;var $cmp103=((($_pr1))|0)>32767;if(!($cmp103)){__label__=31;break $if_end102_thread$$if_end102$41;}
69872 $value=32767;;}}while(0);var $98=$value;var $conv106=((($98))&255);var $99=HEAP32[((_out_ptr)>>2)];var $incdec_ptr=(($99+1)&4294967295);HEAP32[((_out_ptr)>>2)]=$incdec_ptr;HEAP8[($99)]=$conv106;var $100=$value;var $shr107=($100)>>8;var $conv108=((($shr107))&255);var $101=HEAP32[((_out_ptr)>>2)];var $incdec_ptr109=(($101+1)&4294967295);HEAP32[((_out_ptr)>>2)]=$incdec_ptr109;HEAP8[($101)]=$conv108;var $102=$value;var $conv110=((($102))&65535);var $103=HEAP32[((_echo_head)>>2)];var $inc111=((($103)+1)&4294967295);HEAP32[((_echo_head)>>2)]=$inc111;var $arrayidx112=((_echo_buf+$103*2)&4294967295);HEAP16[(($arrayidx112)>>1)]=$conv110;var $104=HEAP32[((_echo_head)>>2)];var $cmp113=((($104))|0)>=5500;if($cmp113){__label__=32;;}else{__label__=33;;}
69873 if(__label__==32){HEAP32[((_echo_head)>>2)]=0;;}
69874 var $105=HEAP32[((__ZL12sample_count)>>2)];var $inc116=((($105)+1)&4294967295);HEAP32[((__ZL12sample_count)>>2)]=$inc116;var $106=HEAPU32[((_out_ptr)>>2)];var $107=HEAPU32[((_out_end)>>2)];var $cmp117=((($106))>>>0)>=((($107))>>>0);if($cmp117){__label__=34;break $for_cond$2;}
69875 var $108=HEAP32[((((__ZL10kt_globals+36)&4294967295))>>2)];var $inc121=((($108)+1)&4294967295);HEAP32[((((__ZL10kt_globals+36)&4294967295))>>2)]=$inc121;__label__=1;continue $for_cond$2;}
69876 if(__label__==36){$retval=0;;}
69877 else if(__label__==34){$retval=1;;}
69878 var $109=$retval;;return $109;return null;}
69879 function __Z14SetSynth_KlattiiP7frame_tS0_P7voice_ti($length,$modn,$fr1,$fr2,$v,$control){;var __label__;var __lastLabel__=null;var $length_addr;var $modn_addr;var $fr1_addr;var $fr2_addr;var $v_addr;var $control_addr;var $ix;var $next;var $qix;var $cmd;var $fr3;$length_addr=$length;$modn_addr=$modn;$fr1_addr=$fr1;$fr2_addr=$fr2;$v_addr=$v;$control_addr=$control;var $0=HEAP32[((_wvoice)>>2)];var $cmp=((($0))|0)!=0;if($cmp){__label__=1;;}else{__label__=5;;}
69880 if(__label__==1){var $1=HEAP32[((_wvoice)>>2)];var $klattv=(($1+112)&4294967295);var $arrayidx=(($klattv)&4294967295);var $2=HEAP32[(($arrayidx)>>2)];var $cmp1=((($2))|0)>0;if($cmp1){__label__=2;;}else{__label__=4;;}
69881 $land_lhs_true$$if_end$4:do{if(__label__==2){var $3=HEAP32[((_wvoice)>>2)];var $klattv2=(($3+112)&4294967295);var $arrayidx3=(($klattv2)&4294967295);var $4=HEAP32[(($arrayidx3)>>2)];var $cmp4=((($4))|0)<=3;if(!($cmp4)){__label__=4;break $land_lhs_true$$if_end$4;}
69882 var $5=HEAP32[((_wvoice)>>2)];var $klattv6=(($5+112)&4294967295);var $arrayidx7=(($klattv6)&4294967295);var $6=HEAP32[(($arrayidx7)>>2)];HEAP32[((((__ZL10kt_globals+20)&4294967295))>>2)]=$6;var $7=HEAP32[((((__ZL10kt_globals+20)&4294967295))>>2)];var $arrayidx8=((__ZL13scale_wav_tab+$7*4)&4294967295);var $8=HEAP32[(($arrayidx8)>>2)];HEAP32[((((__ZL10kt_globals+184)&4294967295))>>2)]=$8;;}}while(0);var $9=HEAP32[((_wvoice)>>2)];var $flutter=(($9+68)&4294967295);var $10=HEAP32[(($flutter)>>2)];var $div=((((($10))|0)/32)|0);HEAP32[((((__ZL10kt_globals+24)&4294967295))>>2)]=$div;;}
69883 HEAP32[((__ZL8end_wave803)>>2)]=0;var $11=$control_addr;var $and=($11)&2;var $tobool=((($and))|0)!=0;if($tobool){__label__=6;;}else{__label__=7;;}
69884 if(__label__==6){HEAP32[((__ZL8end_wave803)>>2)]=1;;}
69885 var $12=$control_addr;var $and12=($12)&1;var $tobool13=((($and12))|0)!=0;if($tobool13){__label__=8;;}else{__label__=20;;}
69886 $if_then14$$if_end44$12:do{if(__label__==8){HEAP32[((__ZL8end_wave803)>>2)]=1;var $13=HEAP32[((_wcmdq_head)>>2)];var $add=((($13)+1)&4294967295);$qix=$add;__lastLabel__=8;;$for_cond$14:while(1){var $14=__lastLabel__==19?$inc42:($add);var $cmp15=((($14))|0)>=160;if($cmp15){__label__=10;;}else{__label__=11;;}
69887 if(__label__==10){$qix=0;;}
69888 var $15=$qix;var $16=HEAP32[((_wcmdq_tail)>>2)];var $cmp18=((($15))|0)==((($16))|0);if($cmp18){__label__=20;break $if_then14$$if_end44$12;}
69889 var $17=$qix;var $arrayidx21=((_wcmdq+$17*16)&4294967295);var $arrayidx22=(($arrayidx21)&4294967295);var $18=HEAP32[(($arrayidx22)>>2)];$cmd=$18;var $19=$cmd;var $cmp23=((($19))|0)==1;if($cmp23){__label__=13;break $for_cond$14;}
69890 var $31=$cmd;var $cmp37=((($31))|0)==6;var $32=$cmd;var $cmp38=((($32))|0)==5;var $or_cond=($cmp37)|($cmp38);if($or_cond){__label__=20;break $if_then14$$if_end44$12;}
69891 var $33=$qix;var $inc42=((($33)+1)&4294967295);$qix=$inc42;__lastLabel__=19;__label__=9;continue $for_cond$14;}
69892 HEAP32[((__ZL8end_wave803)>>2)]=0;var $20=$qix;var $arrayidx25=((_wcmdq+$20*16)&4294967295);var $arrayidx26=(($arrayidx25+8)&4294967295);var $21=HEAP32[(($arrayidx26)>>2)];var $22=($21);$fr3=$22;$ix=1;__lastLabel__=13;;while(1){var $23=__lastLabel__==17?$inc:(1);var $cmp28=((($23))|0)<6;if(!($cmp28)){__label__=20;break $if_then14$$if_end44$12;}
69893 var $24=$ix;var $25=$fr3;var $ffreq=(($25+2)&4294967295);var $arrayidx29=(($ffreq+$24*2)&4294967295);var $26=HEAP16[(($arrayidx29)>>1)];var $conv=(tempInt=(($26)),(tempInt>=32768?tempInt-65536:tempInt));var $27=$ix;var $28=$fr2_addr;var $ffreq30=(($28+2)&4294967295);var $arrayidx31=(($ffreq30+$27*2)&4294967295);var $29=HEAP16[(($arrayidx31)>>1)];var $conv32=(tempInt=(($29)),(tempInt>=32768?tempInt-65536:tempInt));var $cmp33=((($conv))|0)!=((($conv32))|0);if($cmp33){__label__=16;break;}
69894 var $30=$ix;var $inc=((($30)+1)&4294967295);$ix=$inc;__lastLabel__=17;__label__=14;continue;}
69895 HEAP32[((__ZL8end_wave803)>>2)]=2;;}}while(0);var $34=$control_addr;var $and45=($34)&1;var $tobool46=((($and45))|0)!=0;if($tobool46){__label__=21;;}else{__label__=27;;}
69896 if(__label__==21){$ix=1;__lastLabel__=21;;while(1){var $35=__lastLabel__==25?$inc60:(1);var $cmp49=((($35))|0)<6;if(!($cmp49)){__label__=26;break;}
69897 var $36=$ix;var $arrayidx51=((((__ZZ14SetSynth_KlattiiP7frame_tS0_P7voice_tiE7prev_fr+2)&4294967295)+$36*2)&4294967295);var $37=HEAP16[(($arrayidx51)>>1)];var $conv52=(tempInt=(($37)),(tempInt>=32768?tempInt-65536:tempInt));var $38=$ix;var $39=$fr1_addr;var $ffreq53=(($39+2)&4294967295);var $arrayidx54=(($ffreq53+$38*2)&4294967295);var $40=HEAP16[(($arrayidx54)>>1)];var $conv55=(tempInt=(($40)),(tempInt>=32768?tempInt-65536:tempInt));var $cmp56=((($conv52))|0)!=((($conv55))|0);if($cmp56){__label__=24;break;}
69898 var $41=$ix;var $inc60=((($41)+1)&4294967295);$ix=$inc60;__lastLabel__=25;__label__=22;continue;}
69899 if(__label__==24){__Z10KlattReseti(0);;}
69900 var $42=$fr2_addr;var $43=$42;var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$43;$dest$=__ZZ14SetSynth_KlattiiP7frame_tS0_P7voice_tiE7prev_fr;$stop$=$src$+64;if(($dest$%4)==($src$%4)&&64>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
69901 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
69902 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};;}
69903 $ix=0;__lastLabel__=27;;$for_body65$39:while(1){var $44=__lastLabel__==27?0:($inc90);var $cmp66=((($44))|0)>=5;if($cmp66){__label__=29;;}else{__label__=31;;}
69904 $land_lhs_true67$$if_else$41:do{if(__label__==29){var $45=$fr1_addr;var $frflags=(($45)&4294967295);var $46=HEAP16[(($frflags)>>1)];var $conv68=(tempInt=(($46)),(tempInt>=32768?tempInt-65536:tempInt));var $and69=($conv68)&1;var $cmp70=((($and69))|0)==0;if(!($cmp70)){__label__=31;break $land_lhs_true67$$if_else$41;}
69905 var $47=$ix;var $arrayidx72=((__ZL6klattp+$47*4)&4294967295);HEAP32[(($arrayidx72)>>2)]=0;var $48=$ix;var $arrayidx73=((__ZL7klattp1+$48*8)&4294967295);HEAPF32[(($arrayidx73)>>2)]=0;var $49=$ix;var $arrayidx74=((__ZL10klattp_inc+$49*8)&4294967295);HEAPF32[(($arrayidx74)>>2)]=0;__label__=32;break $land_lhs_true67$$if_else$41;}}while(0);if(__label__==31){var $50=$ix;var $51=$fr1_addr;var $klattp=(($51+39)&4294967295);var $arrayidx75=(($klattp+$50)&4294967295);var $52=HEAPU8[($arrayidx75)];var $conv76=((($52))&255);var $53=$ix;var $arrayidx77=((__ZL6klattp+$53*4)&4294967295);HEAP32[(($arrayidx77)>>2)]=$conv76;var $conv78=((($conv76))|0);var $54=$ix;var $arrayidx79=((__ZL7klattp1+$54*8)&4294967295);HEAPF32[(($arrayidx79)>>2)]=$conv78;var $55=$ix;var $56=$fr2_addr;var $klattp80=(($56+39)&4294967295);var $arrayidx81=(($klattp80+$55)&4294967295);var $57=HEAPU8[($arrayidx81)];var $conv82=((($57))&255);var $58=$ix;var $arrayidx83=((__ZL6klattp+$58*4)&4294967295);var $59=HEAP32[(($arrayidx83)>>2)];var $sub=((($conv82)-($59))&4294967295);var $mul=((($sub)*64)&4294967295);var $conv84=((($mul))|0);var $60=$length_addr;var $conv85=((($60))|0);var $div86=($conv84)/($conv85);var $61=$ix;var $arrayidx87=((__ZL10klattp_inc+$61*8)&4294967295);HEAPF32[(($arrayidx87)>>2)]=$div86;;}
69906 var $62=$ix;var $inc90=((($62)+1)&4294967295);$ix=$inc90;var $cmp64=((($inc90))|0)<10;if($cmp64){__lastLabel__=32;__label__=28;continue $for_body65$39;}else{__lastLabel__=32;__label__=33;break $for_body65$39;}}
69907 var $63=$length_addr;HEAP32[((__ZL8nsamples802)>>2)]=$63;$ix=1;;$for_body94$48:while(1){var $64=$ix;var $65=$fr1_addr;var $ffreq95=(($65+2)&4294967295);var $arrayidx96=(($ffreq95+$64*2)&4294967295);var $66=HEAP16[(($arrayidx96)>>1)];var $conv97=(tempInt=(($66)),(tempInt>=32768?tempInt-65536:tempInt));var $67=$ix;var $68=$v_addr;var $freq=(($68+144)&4294967295);var $arrayidx98=(($freq+$67*2)&4294967295);var $69=HEAP16[(($arrayidx98)>>1)];var $conv99=(tempInt=(($69)),(tempInt>=32768?tempInt-65536:tempInt));var $mul100=((($conv99)*($conv97))&4294967295);var $conv101=((($mul100))|0);var $div102=($conv101)/256;var $70=$ix;var $71=$v_addr;var $freqadd=(($71+198)&4294967295);var $arrayidx103=(($freqadd+$70*2)&4294967295);var $72=HEAP16[(($arrayidx103)>>1)];var $conv104=(tempInt=(($72)),(tempInt>=32768?tempInt-65536:tempInt));var $conv105=((($conv104))|0);var $add106=($div102)+($conv105);var $73=$ix;var $arrayidx107=((__ZL5peaks801+$73*80)&4294967295);var $freq1=(($arrayidx107+16)&4294967295);HEAPF32[(($freq1)>>2)]=$add106;var $74=$ix;var $arrayidx108=((__ZL5peaks801+$74*80)&4294967295);var $freq1109=(($arrayidx108+16)&4294967295);var $75=HEAPF32[(($freq1109)>>2)];var $conv110=((($75))|0);var $76=$ix;var $arrayidx111=((__ZL5peaks801+$76*80)&4294967295);var $freq112=(($arrayidx111)&4294967295);HEAP32[(($freq112)>>2)]=$conv110;var $77=$ix;var $78=$fr2_addr;var $ffreq113=(($78+2)&4294967295);var $arrayidx114=(($ffreq113+$77*2)&4294967295);var $79=HEAP16[(($arrayidx114)>>1)];var $conv115=(tempInt=(($79)),(tempInt>=32768?tempInt-65536:tempInt));var $80=$ix;var $81=$v_addr;var $freq116=(($81+144)&4294967295);var $arrayidx117=(($freq116+$80*2)&4294967295);var $82=HEAP16[(($arrayidx117)>>1)];var $conv118=(tempInt=(($82)),(tempInt>=32768?tempInt-65536:tempInt));var $mul119=((($conv118)*($conv115))&4294967295);var $conv120=((($mul119))|0);var $div121=($conv120)/256;var $83=$ix;var $84=$v_addr;var $freqadd122=(($84+198)&4294967295);var $arrayidx123=(($freqadd122+$83*2)&4294967295);var $85=HEAP16[(($arrayidx123)>>1)];var $conv124=(tempInt=(($85)),(tempInt>=32768?tempInt-65536:tempInt));var $conv125=((($conv124))|0);var $add126=($div121)+($conv125);$next=$add126;var $86=$next;var $87=$ix;var $arrayidx127=((__ZL5peaks801+$87*80)&4294967295);var $freq1128=(($arrayidx127+16)&4294967295);var $88=HEAPF32[(($freq1128)>>2)];var $sub129=($86)-($88);var $mul130=($sub129)*64;var $89=$length_addr;var $conv131=((($89))|0);var $div132=($mul130)/($conv131);var $90=$ix;var $arrayidx133=((__ZL5peaks801+$90*80)&4294967295);var $freq_inc=(($arrayidx133+48)&4294967295);HEAPF32[(($freq_inc)>>2)]=$div132;var $91=$ix;var $cmp134=((($91))|0)<4;if($cmp134){__label__=35;;}else{__label__=36;;}
69908 if(__label__==35){var $92=$ix;var $93=$fr1_addr;var $bw=(($93+35)&4294967295);var $arrayidx136=(($bw+$92)&4294967295);var $94=HEAPU8[($arrayidx136)];var $conv137=((($94))&255);var $mul138=((($conv137)*2)&4294967295);var $conv139=((($mul138))|0);var $95=$ix;var $arrayidx140=((__ZL5peaks801+$95*80)&4294967295);var $bw1=(($arrayidx140+24)&4294967295);HEAPF32[(($bw1)>>2)]=$conv139;var $96=$ix;var $arrayidx141=((__ZL5peaks801+$96*80)&4294967295);var $bw1142=(($arrayidx141+24)&4294967295);var $97=HEAPF32[(($bw1142)>>2)];var $conv143=((($97))|0);var $98=$ix;var $arrayidx144=((__ZL5peaks801+$98*80)&4294967295);var $bw145=(($arrayidx144+4)&4294967295);HEAP32[(($bw145)>>2)]=$conv143;var $99=$ix;var $100=$fr2_addr;var $bw146=(($100+35)&4294967295);var $arrayidx147=(($bw146+$99)&4294967295);var $101=HEAPU8[($arrayidx147)];var $conv148=((($101))&255);var $mul149=((($conv148)*2)&4294967295);var $conv150=((($mul149))|0);$next=$conv150;var $102=$next;var $103=$ix;var $arrayidx151=((__ZL5peaks801+$103*80)&4294967295);var $bw1152=(($arrayidx151+24)&4294967295);var $104=HEAPF32[(($bw1152)>>2)];var $sub153=($102)-($104);var $mul154=($sub153)*64;var $105=$length_addr;var $conv155=((($105))|0);var $div156=($mul154)/($conv155);var $106=$ix;var $arrayidx157=((__ZL5peaks801+$106*80)&4294967295);var $bw_inc=(($arrayidx157+56)&4294967295);HEAPF32[(($bw_inc)>>2)]=$div156;;}
69909 var $107=$ix;var $inc160=((($107)+1)&4294967295);$ix=$inc160;var $cmp93=((($inc160))|0)<6;if($cmp93){__label__=34;continue $for_body94$48;}else{__label__=37;break $for_body94$48;}}
69910 var $108=$fr1_addr;var $klattp162=(($108+39)&4294967295);var $arrayidx163=(($klattp162+1)&4294967295);var $109=HEAPU8[($arrayidx163)];var $conv164=((($109))&255);var $mul165=((($conv164)*2)&4294967295);var $conv166=((($mul165))|0);HEAPF32[((((__ZL5peaks801+16)&4294967295))>>2)]=$conv166;var $110=HEAPF32[((((__ZL5peaks801+16)&4294967295))>>2)];var $cmp167=($110)==0;if($cmp167){__label__=38;;}else{__label__=39;;}
69911 if(__label__==38){var $111=HEAP32[((((__ZL8kt_frame+8+36)&4294967295))>>2)];var $conv169=((($111))|0);HEAPF32[((((__ZL5peaks801+16)&4294967295))>>2)]=$conv169;;}
69912 var $112=HEAPF32[((((__ZL5peaks801+16)&4294967295))>>2)];var $conv171=((($112))|0);HEAP32[((((__ZL5peaks801)&4294967295))>>2)]=$conv171;var $113=$fr2_addr;var $klattp172=(($113+39)&4294967295);var $arrayidx173=(($klattp172+1)&4294967295);var $114=HEAPU8[($arrayidx173)];var $conv174=((($114))&255);var $mul175=((($conv174)*2)&4294967295);var $conv176=((($mul175))|0);$next=$conv176;var $cmp177=($conv176)==0;if($cmp177){__label__=40;;}else{__label__=41;;}
69913 if(__label__==40){var $115=HEAP32[((((__ZL8kt_frame+8+36)&4294967295))>>2)];var $conv179=((($115))|0);$next=$conv179;;}
69914 var $116=$next;var $117=HEAPF32[((((__ZL5peaks801+16)&4294967295))>>2)];var $sub181=($116)-($117);var $mul182=($sub181)*64;var $118=$length_addr;var $conv183=((($118))|0);var $div184=($mul182)/($conv183);HEAPF32[((((__ZL5peaks801+48)&4294967295))>>2)]=$div184;HEAPF32[((((__ZL5peaks801+24)&4294967295))>>2)]=89;HEAP32[((((__ZL5peaks801+4)&4294967295))>>2)]=89;HEAPF32[((((__ZL5peaks801+56)&4294967295))>>2)]=0;var $119=$fr1_addr;var $frflags185=(($119)&4294967295);var $120=HEAP16[(($frflags185)>>1)];var $conv186=(tempInt=(($120)),(tempInt>=32768?tempInt-65536:tempInt));var $and187=($conv186)&1;var $tobool188=((($and187))|0)!=0;if($tobool188){__label__=42;;}else{__label__=44;;}
69915 $if_then189$$if_end236$60:do{if(__label__==42){$ix=1;;while(1){var $121=$ix;var $122=$fr1_addr;var $klatt_bp=(($122+56)&4294967295);var $arrayidx193=(($klatt_bp+$121)&4294967295);var $123=HEAPU8[($arrayidx193)];var $conv194=((($123))&255);var $mul195=((($conv194)*4)&4294967295);var $conv196=((($mul195))|0);var $124=$ix;var $arrayidx197=((__ZL5peaks801+$124*80)&4294967295);var $bp1=(($arrayidx197+40)&4294967295);HEAPF32[(($bp1)>>2)]=$conv196;var $125=$ix;var $arrayidx198=((__ZL5peaks801+$125*80)&4294967295);var $bp1199=(($arrayidx198+40)&4294967295);var $126=HEAPF32[(($bp1199)>>2)];var $conv200=((($126))|0);var $127=$ix;var $arrayidx201=((__ZL5peaks801+$127*80)&4294967295);var $bp=(($arrayidx201+12)&4294967295);HEAP32[(($bp)>>2)]=$conv200;var $128=$ix;var $129=$fr2_addr;var $klatt_bp202=(($129+56)&4294967295);var $arrayidx203=(($klatt_bp202+$128)&4294967295);var $130=HEAPU8[($arrayidx203)];var $conv204=((($130))&255);var $mul205=((($conv204)*2)&4294967295);var $conv206=((($mul205))|0);$next=$conv206;var $131=$next;var $132=$ix;var $arrayidx207=((__ZL5peaks801+$132*80)&4294967295);var $bp1208=(($arrayidx207+40)&4294967295);var $133=HEAPF32[(($bp1208)>>2)];var $sub209=($131)-($133);var $mul210=($sub209)*64;var $134=$length_addr;var $conv211=((($134))|0);var $div212=($mul210)/($conv211);var $135=$ix;var $arrayidx213=((__ZL5peaks801+$135*80)&4294967295);var $bp_inc=(($arrayidx213+72)&4294967295);HEAPF32[(($bp_inc)>>2)]=$div212;var $136=$ix;var $137=$fr1_addr;var $klatt_ap=(($137+49)&4294967295);var $arrayidx214=(($klatt_ap+$136)&4294967295);var $138=HEAPU8[($arrayidx214)];var $conv215=((($138))&255);var $139=$ix;var $arrayidx216=((__ZL5peaks801+$139*80)&4294967295);var $ap1=(($arrayidx216+32)&4294967295);HEAPF32[(($ap1)>>2)]=$conv215;var $140=$ix;var $arrayidx217=((__ZL5peaks801+$140*80)&4294967295);var $ap1218=(($arrayidx217+32)&4294967295);var $141=HEAPF32[(($ap1218)>>2)];var $conv219=((($141))|0);var $142=$ix;var $arrayidx220=((__ZL5peaks801+$142*80)&4294967295);var $ap=(($arrayidx220+8)&4294967295);HEAP32[(($ap)>>2)]=$conv219;var $143=$ix;var $144=$fr2_addr;var $klatt_ap221=(($144+49)&4294967295);var $arrayidx222=(($klatt_ap221+$143)&4294967295);var $145=HEAPU8[($arrayidx222)];var $conv223=((($145))&255);var $mul224=((($conv223)*2)&4294967295);var $conv225=((($mul224))|0);$next=$conv225;var $146=$next;var $147=$ix;var $arrayidx226=((__ZL5peaks801+$147*80)&4294967295);var $ap1227=(($arrayidx226+32)&4294967295);var $148=HEAPF32[(($ap1227)>>2)];var $sub228=($146)-($148);var $mul229=($sub228)*64;var $149=$length_addr;var $conv230=((($149))|0);var $div231=($mul229)/($conv230);var $150=$ix;var $arrayidx232=((__ZL5peaks801+$150*80)&4294967295);var $ap_inc=(($arrayidx232+64)&4294967295);HEAPF32[(($ap_inc)>>2)]=$div231;var $151=$ix;var $inc234=((($151)+1)&4294967295);$ix=$inc234;var $cmp191=((($inc234))|0)<7;if($cmp191){__label__=43;continue;}else{__label__=44;break $if_then189$$if_end236$60;}}}}while(0);;return;return;}
69916 function __Z14Wavegen_Klatt2iiiP7frame_tS0_($length,$modulation,$resume,$fr1,$fr2){;var __label__;var $length_addr;var $modulation_addr;var $resume_addr;var $fr1_addr;var $fr2_addr;$length_addr=$length;$modulation_addr=$modulation;$resume_addr=$resume;$fr1_addr=$fr1;$fr2_addr=$fr2;var $0=$resume_addr;var $cmp=((($0))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
69917 if(__label__==1){var $1=$length_addr;var $2=$modulation_addr;var $3=$fr1_addr;var $4=$fr2_addr;var $5=HEAP32[((_wvoice)>>2)];__Z14SetSynth_KlattiiP7frame_tS0_P7voice_ti($1,$2,$3,$4,$5,1);;}
69918 var $6=$resume_addr;var $call=__Z13Wavegen_Klatti($6);;return $call;return null;}
69919 function __Z9KlattInitv(){;var __label__;var $ix;HEAP32[((__ZL12sample_count)>>2)]=0;HEAP32[((((__ZL10kt_globals)&4294967295))>>2)]=1;HEAP32[((((__ZL10kt_globals+8)&4294967295))>>2)]=22050;HEAP32[((((__ZL10kt_globals+20)&4294967295))>>2)]=1;var $0=HEAP32[((((__ZL10kt_globals+20)&4294967295))>>2)];var $arrayidx=((__ZL13scale_wav_tab+$0*4)&4294967295);var $1=HEAP32[(($arrayidx)>>2)];HEAP32[((((__ZL10kt_globals+184)&4294967295))>>2)]=$1;HEAP32[((((__ZL10kt_globals+172)&4294967295))>>2)]=((__ZZ9KlattInitvE15natural_samples)&4294967295);HEAP32[((((__ZL10kt_globals+160)&4294967295))>>2)]=100;HEAPF32[((((__ZL10kt_globals+164)&4294967295))>>2)]=3;var $2=HEAP32[((((__ZL10kt_globals+8)&4294967295))>>2)];var $mul=((($2)*10)&4294967295);var $div=((((($mul))|0)/1000)|0);HEAP32[((((__ZL10kt_globals+28)&4294967295))>>2)]=$div;HEAP32[((((__ZL10kt_globals+4)&4294967295))>>2)]=0;HEAP32[((((__ZL10kt_globals+24)&4294967295))>>2)]=20;__Z10KlattReseti(2);$ix=0;;while(1){var $3=$ix;var $arrayidx1=((__ZZ9KlattInitvE10formant_hz+$3*2)&4294967295);var $4=HEAP16[(($arrayidx1)>>1)];var $conv=(tempInt=(($4)),(tempInt>=32768?tempInt-65536:tempInt));var $5=$ix;var $arrayidx2=((((__ZL8kt_frame+8)&4294967295)+$5*4)&4294967295);HEAP32[(($arrayidx2)>>2)]=$conv;var $6=$ix;var $arrayidx3=((__ZZ9KlattInitvE9bandwidth+$6*2)&4294967295);var $7=HEAP16[(($arrayidx3)>>1)];var $conv4=(tempInt=(($7)),(tempInt>=32768?tempInt-65536:tempInt));var $8=$ix;var $arrayidx5=((((__ZL8kt_frame+48)&4294967295)+$8*4)&4294967295);HEAP32[(($arrayidx5)>>2)]=$conv4;var $9=$ix;var $arrayidx6=((__ZZ9KlattInitvE12parallel_amp+$9*2)&4294967295);var $10=HEAP16[(($arrayidx6)>>1)];var $conv7=(tempInt=(($10)),(tempInt>=32768?tempInt-65536:tempInt));var $11=$ix;var $arrayidx8=((((__ZL8kt_frame+88)&4294967295)+$11*4)&4294967295);HEAP32[(($arrayidx8)>>2)]=$conv7;var $12=$ix;var $arrayidx9=((__ZZ9KlattInitvE11parallel_bw+$12*2)&4294967295);var $13=HEAP16[(($arrayidx9)>>1)];var $conv10=(tempInt=(($13)),(tempInt>=32768?tempInt-65536:tempInt));var $14=$ix;var $arrayidx11=((((__ZL8kt_frame+128)&4294967295)+$14*4)&4294967295);HEAP32[(($arrayidx11)>>2)]=$conv10;var $15=$ix;var $inc=((($15)+1)&4294967295);$ix=$inc;var $cmp=((($inc))|0)<=9;if($cmp){__label__=1;continue;}else{__label__=2;break;}}
69920 HEAP32[((((__ZL8kt_frame+248)&4294967295))>>2)]=89;HEAP32[((((__ZL8kt_frame)&4294967295))>>2)]=1000;HEAP32[((((__ZL8kt_frame+4)&4294967295))>>2)]=59;HEAP32[((((__ZL8kt_frame+168)&4294967295))>>2)]=0;HEAP32[((((__ZL8kt_frame+172)&4294967295))>>2)]=40;HEAP32[((((__ZL8kt_frame+176)&4294967295))>>2)]=0;HEAP32[((((__ZL8kt_frame+180)&4294967295))>>2)]=0;HEAP32[((((__ZL8kt_frame+184)&4294967295))>>2)]=50;HEAP32[((((__ZL8kt_frame+188)&4294967295))>>2)]=0;HEAP32[((((__ZL8kt_frame+192)&4294967295))>>2)]=0;HEAP32[((((__ZL8kt_frame+196)&4294967295))>>2)]=0;HEAP32[((((__ZL8kt_frame+200)&4294967295))>>2)]=62;;return;return;}
69921 function __ZL7flutterP13klatt_frame_t($frame){;var __label__;var $frame_addr;var $delta_f0;var $fla;var $flb;var $flc;var $fld;var $fle;$frame_addr=$frame;var $0=HEAP32[((((__ZL10kt_globals+24)&4294967295))>>2)];var $conv=((($0))|0);var $div=($conv)/50;$fla=$div;var $1=HEAP32[((((__ZL10kt_globals+176)&4294967295))>>2)];var $conv1=((($1))|0);var $div2=($conv1)/100;$flb=$div2;var $2=HEAP32[((__ZZL7flutterP13klatt_frame_tE10time_count)>>2)];var $conv3=((($2))|0);var $mul=39.898227289999994*($conv3);var $call=_sin($mul);$flc=$call;var $3=HEAP32[((__ZZL7flutterP13klatt_frame_tE10time_count)>>2)];var $conv4=((($3))|0);var $mul5=22.305308169999996*($conv4);var $call6=_sin($mul5);$fld=$call6;var $4=HEAP32[((__ZZL7flutterP13klatt_frame_tE10time_count)>>2)];var $conv7=((($4))|0);var $mul8=14.76548569*($conv7);var $call9=_sin($mul8);$fle=$call9;var $5=$fla;var $6=$flb;var $mul10=($5)*($6);var $7=$flc;var $8=$fld;var $add=($7)+($8);var $9=$fle;var $add11=($add)+($9);var $mul12=($mul10)*($add11);var $mul13=($mul12)*10;$delta_f0=$mul13;var $10=$frame_addr;var $F0hz10=(($10)&4294967295);var $11=HEAP32[(($F0hz10)>>2)];var $12=$delta_f0;var $conv14=((($12))|0);var $add15=((($conv14)+($11))&4294967295);var $13=$frame_addr;var $F0hz1016=(($13)&4294967295);HEAP32[(($F0hz1016)>>2)]=$add15;var $14=HEAP32[((__ZZL7flutterP13klatt_frame_tE10time_count)>>2)];var $inc=((($14)+1)&4294967295);HEAP32[((__ZZL7flutterP13klatt_frame_tE10time_count)>>2)]=$inc;;return;return;}
69922 function __ZL9gen_noised($noise){;var __label__;var $noise_addr;var $temp;$noise_addr=$noise;var $call=_rand();var $rem=((($call))|0)%16383;var $add=((($rem)-8191)&4294967295);$temp=$add;var $0=$temp;HEAP32[((((__ZL10kt_globals+52)&4294967295))>>2)]=$0;var $1=HEAP32[((((__ZL10kt_globals+52)&4294967295))>>2)];var $conv=((($1))|0);var $2=HEAPF32[((__ZZL9gen_noisedE5nlast)>>2)];var $mul=0.75*($2);var $add1=($conv)+($mul);$noise_addr=$add1;var $3=$noise_addr;HEAPF32[((__ZZL9gen_noisedE5nlast)>>2)]=$3;var $4=$noise_addr;;return $4;return null;}
69923 function __ZL16impulsive_sourcev(){;var __label__;var $0=HEAP32[((((__ZL10kt_globals+32)&4294967295))>>2)];var $cmp=((($0))|0)<3;if($cmp){__label__=1;;}else{__label__=2;;}
69924 if(__label__==1){var $1=HEAP32[((((__ZL10kt_globals+32)&4294967295))>>2)];var $arrayidx=((__ZZL16impulsive_sourcevE7doublet+$1*8)&4294967295);var $2=HEAPF32[(($arrayidx)>>2)];HEAPF32[((__ZZL16impulsive_sourcevE5vwave)>>2)]=$2;;}
69925 else if(__label__==2){HEAPF32[((__ZZL16impulsive_sourcevE5vwave)>>2)]=0;;}
69926 var $3=HEAPF32[((__ZZL16impulsive_sourcevE5vwave)>>2)];var $call=__ZL9resonatorP11resonator_td(((__ZL10kt_globals+188+1088)&4294967295),$3);;return $call;return null;}
69927 function __ZL14natural_sourcev(){;var __label__;var $retval;var $lgtemp;var $0=HEAP32[((((__ZL10kt_globals+32)&4294967295))>>2)];var $1=HEAP32[((((__ZL10kt_globals+44)&4294967295))>>2)];var $cmp=((($0))|0)<((($1))|0);if($cmp){__label__=1;;}else{__label__=2;;}
69928 if(__label__==1){var $2=HEAPF32[((((__ZL10kt_globals+64)&4294967295))>>2)];var $3=HEAPF32[((((__ZL10kt_globals+56)&4294967295))>>2)];var $sub=($3)-($2);HEAPF32[((((__ZL10kt_globals+56)&4294967295))>>2)]=$sub;var $4=HEAPF32[((((__ZL10kt_globals+56)&4294967295))>>2)];var $5=HEAPF32[((__ZZL14natural_sourcevE5vwave)>>2)];var $add=($5)+($4);HEAPF32[((__ZZL14natural_sourcevE5vwave)>>2)]=$add;var $6=HEAPF32[((__ZZL14natural_sourcevE5vwave)>>2)];var $mul=($6)*0.028;$lgtemp=$mul;var $7=$lgtemp;$retval=$7;;}
69929 else if(__label__==2){HEAPF32[((__ZZL14natural_sourcevE5vwave)>>2)]=0;$retval=0;;}
69930 var $8=$retval;;return $8;return null;}
69931 function __ZL14sampled_sourcev(){;var __label__;var $itemp;var $ftemp;var $result;var $diff_value;var $current_value;var $next_value;var $temp_diff;var $0=HEAP32[((((__ZL10kt_globals+40)&4294967295))>>2)];var $cmp=((($0))|0)!=0;if($cmp){__label__=1;;}else{__label__=2;;}
69932 if(__label__==1){var $1=HEAP32[((((__ZL10kt_globals+32)&4294967295))>>2)];var $conv=((($1))|0);$ftemp=$conv;var $2=$ftemp;var $3=HEAP32[((((__ZL10kt_globals+40)&4294967295))>>2)];var $conv1=((($3))|0);var $div=($2)/($conv1);$ftemp=$div;var $4=$ftemp;var $5=HEAP32[((((__ZL10kt_globals+160)&4294967295))>>2)];var $conv2=((($5))|0);var $mul=($4)*($conv2);$ftemp=$mul;var $6=$ftemp;var $conv3=((($6))|0);$itemp=$conv3;var $7=$ftemp;var $8=$itemp;var $conv4=((($8))|0);var $sub=($7)-($conv4);$temp_diff=$sub;var $9=$itemp;var $10=HEAP32[((((__ZL10kt_globals+172)&4294967295))>>2)];var $arrayidx=(($10+2*$9)&4294967295);var $11=HEAP16[(($arrayidx)>>1)];var $conv5=(tempInt=(($11)),(tempInt>=32768?tempInt-65536:tempInt));$current_value=$conv5;var $12=$itemp;var $add=((($12)+1)&4294967295);var $13=HEAP32[((((__ZL10kt_globals+172)&4294967295))>>2)];var $arrayidx6=(($13+2*$add)&4294967295);var $14=HEAP16[(($arrayidx6)>>1)];var $conv7=(tempInt=(($14)),(tempInt>=32768?tempInt-65536:tempInt));$next_value=$conv7;var $15=$next_value;var $conv8=((($15))|0);var $16=$current_value;var $conv9=((($16))|0);var $sub10=($conv8)-($conv9);$diff_value=$sub10;var $17=$diff_value;var $18=$temp_diff;var $mul11=($17)*($18);$diff_value=$mul11;var $19=$itemp;var $20=HEAP32[((((__ZL10kt_globals+172)&4294967295))>>2)];var $arrayidx12=(($20+2*$19)&4294967295);var $21=HEAP16[(($arrayidx12)>>1)];var $conv13=(tempInt=(($21)),(tempInt>=32768?tempInt-65536:tempInt));var $conv14=((($conv13))|0);var $22=$diff_value;var $add15=($conv14)+($22);$result=$add15;var $23=$result;var $24=HEAPF32[((((__ZL10kt_globals+164)&4294967295))>>2)];var $mul16=($23)*($24);$result=$mul16;;}
69933 else if(__label__==2){$result=0;;}
69934 var $25=$result;;return $25;return null;}
69935 function __ZL21pitch_synch_par_resetP13klatt_frame_t($frame){;var __label__;var __lastLabel__=null;var $frame_addr;var $temp;var $temp1;$frame_addr=$frame;var $0=$frame_addr;var $F0hz10=(($0)&4294967295);var $1=HEAP32[(($F0hz10)>>2)];var $cmp=((($1))|0)>0;if($cmp){__label__=1;;}else{__label__=15;;}
69936 if(__label__==1){var $2=HEAP32[((((__ZL10kt_globals+8)&4294967295))>>2)];var $mul=((($2)*40)&4294967295);var $3=$frame_addr;var $F0hz101=(($3)&4294967295);var $4=HEAP32[(($F0hz101)>>2)];var $div=((((($mul))|0)/((($4))|0))|0);HEAP32[((((__ZL10kt_globals+40)&4294967295))>>2)]=$div;var $5=$frame_addr;var $AVdb_tmp=(($5+204)&4294967295);var $6=HEAP32[(($AVdb_tmp)>>2)];var $call=__ZL7DBtoLINl($6);HEAPF32[((((__ZL10kt_globals+112)&4294967295))>>2)]=$call;var $7=HEAP32[((((__ZL10kt_globals+40)&4294967295))>>2)];HEAP32[((((__ZL10kt_globals+48)&4294967295))>>2)]=$7;var $8=$frame_addr;var $AVdb_tmp2=(($8+204)&4294967295);var $9=HEAP32[(($AVdb_tmp2)>>2)];var $cmp3=((($9))|0)>0;if($cmp3){__label__=2;;}else{__label__=3;;}
69937 if(__label__==2){var $10=HEAP32[((((__ZL10kt_globals+48)&4294967295))>>2)];var $shr=($10)>>1;HEAP32[((((__ZL10kt_globals+48)&4294967295))>>2)]=$shr;;}
69938 var $11=$frame_addr;var $Aturb=(($11+176)&4294967295);var $12=HEAP32[(($Aturb)>>2)];var $call5=__ZL7DBtoLINl($12);var $mul6=($call5)*0.1;HEAPF32[((((__ZL10kt_globals+144)&4294967295))>>2)]=$mul6;var $13=$frame_addr;var $Kopen=(($13+172)&4294967295);var $14=HEAP32[(($Kopen)>>2)];var $mul7=((($14)*4)&4294967295);HEAP32[((((__ZL10kt_globals+44)&4294967295))>>2)]=$mul7;var $15=HEAP32[((((__ZL10kt_globals+20)&4294967295))>>2)];var $cmp8=((($15))|0)==1;var $16=HEAP32[((((__ZL10kt_globals+44)&4294967295))>>2)];var $cmp9=((($16))|0)>263;var $or_cond=($cmp8)&($cmp9);if($or_cond){__label__=4;;}else{__label__=5;;}
69939 if(__label__==4){HEAP32[((((__ZL10kt_globals+44)&4294967295))>>2)]=263;;}
69940 var $17=HEAP32[((((__ZL10kt_globals+44)&4294967295))>>2)];var $18=HEAP32[((((__ZL10kt_globals+40)&4294967295))>>2)];var $sub=((($18)-1)&4294967295);var $cmp12=((($17))|0)>=((($sub))|0);if($cmp12){__lastLabel__=5;__label__=6;;}else{__lastLabel__=5;__label__=7;;}
69941 if(__label__==6){var $19=HEAP32[((((__ZL10kt_globals+40)&4294967295))>>2)];var $sub14=((($19)-2)&4294967295);HEAP32[((((__ZL10kt_globals+44)&4294967295))>>2)]=$sub14;__lastLabel__=6;;}
69942 var $20=__lastLabel__==6?$sub14:($17);var $cmp16=((($20))|0)<40;if($cmp16){__label__=8;;}else{__label__=9;;}
69943 if(__label__==8){HEAP32[((((__ZL10kt_globals+44)&4294967295))>>2)]=40;;}
69944 var $21=HEAP32[((((__ZL10kt_globals+44)&4294967295))>>2)];var $sub19=((($21)-40)&4294967295);var $arrayidx=((__ZZL21pitch_synch_par_resetP13klatt_frame_tE2B0+$sub19*2)&4294967295);var $22=HEAP16[(($arrayidx)>>1)];var $conv=(tempInt=(($22)),(tempInt>=32768?tempInt-65536:tempInt));HEAPF32[((((__ZL10kt_globals+64)&4294967295))>>2)]=$conv;var $23=HEAPF32[((((__ZL10kt_globals+64)&4294967295))>>2)];var $24=HEAP32[((((__ZL10kt_globals+44)&4294967295))>>2)];var $conv20=((($24))|0);var $mul21=($23)*($conv20);var $mul22=($mul21)*0.333;HEAPF32[((((__ZL10kt_globals+56)&4294967295))>>2)]=$mul22;var $25=HEAP32[((((__ZL10kt_globals+8)&4294967295))>>2)];var $26=HEAP32[((((__ZL10kt_globals+44)&4294967295))>>2)];var $div23=((((($25))|0)/((($26))|0))|0);$temp=$div23;var $27=$temp;__ZL6setabcllP11resonator_t(0,$27,((__ZL10kt_globals+188+1088)&4294967295));var $28=HEAP32[((((__ZL10kt_globals+44)&4294967295))>>2)];var $conv24=((($28))|0);var $mul25=($conv24)*0.00833;$temp1=$mul25;var $29=$temp1;var $30=$temp1;var $mul26=($29)*($30);var $31=HEAPF32[((((__ZL10kt_globals+188+1088)&4294967295))>>2)];var $mul27=($31)*($mul26);HEAPF32[((((__ZL10kt_globals+188+1088)&4294967295))>>2)]=$mul27;var $32=HEAP32[((((__ZL10kt_globals+40)&4294967295))>>2)];var $33=HEAP32[((((__ZL10kt_globals+44)&4294967295))>>2)];var $sub28=((($32)-($33))&4294967295);$temp=$sub28;var $34=$frame_addr;var $Kskew=(($34+188)&4294967295);var $35=HEAP32[(($Kskew)>>2)];var $36=$temp;var $cmp29=((($35))|0)>((($36))|0);if($cmp29){__label__=10;;}else{__label__=11;;}
69945 if(__label__==10){var $37=$temp;var $38=$frame_addr;var $Kskew31=(($38+188)&4294967295);HEAP32[(($Kskew31)>>2)]=$37;;}
69946 var $39=HEAP32[((__ZZL21pitch_synch_par_resetP13klatt_frame_tE4skew)>>2)];var $cmp33=((($39))|0)>=0;var $40=$frame_addr;var $Kskew35=(($40+188)&4294967295);var $41=HEAP32[(($Kskew35)>>2)];if($cmp33){__label__=12;;}else{__label__=13;;}
69947 if(__label__==12){HEAP32[((__ZZL21pitch_synch_par_resetP13klatt_frame_tE4skew)>>2)]=$41;;}
69948 else if(__label__==13){var $sub37=(((-($41)))&4294967295);HEAP32[((__ZZL21pitch_synch_par_resetP13klatt_frame_tE4skew)>>2)]=$sub37;;}
69949 var $42=HEAP32[((((__ZL10kt_globals+40)&4294967295))>>2)];var $43=HEAP32[((__ZZL21pitch_synch_par_resetP13klatt_frame_tE4skew)>>2)];var $add=((($43)+($42))&4294967295);HEAP32[((((__ZL10kt_globals+40)&4294967295))>>2)]=$add;var $44=HEAP32[((__ZZL21pitch_synch_par_resetP13klatt_frame_tE4skew)>>2)];var $sub39=(((-($44)))&4294967295);HEAP32[((__ZZL21pitch_synch_par_resetP13klatt_frame_tE4skew)>>2)]=$sub39;;}
69950 else if(__label__==15){HEAP32[((((__ZL10kt_globals+40)&4294967295))>>2)]=4;HEAPF32[((((__ZL10kt_globals+112)&4294967295))>>2)]=0;var $45=HEAP32[((((__ZL10kt_globals+40)&4294967295))>>2)];HEAP32[((((__ZL10kt_globals+48)&4294967295))>>2)]=$45;HEAPF32[((((__ZL10kt_globals+144)&4294967295))>>2)]=0;HEAPF32[((((__ZL10kt_globals+56)&4294967295))>>2)]=0;HEAPF32[((((__ZL10kt_globals+64)&4294967295))>>2)]=0;;}
69951 var $46=HEAP32[((((__ZL10kt_globals+40)&4294967295))>>2)];var $cmp42=((($46))|0)!=4;var $47=HEAP32[((((__ZL10kt_globals+36)&4294967295))>>2)];var $cmp43=((($47))|0)==0;var $or_cond1=($cmp42)|($cmp43);if($or_cond1){__label__=17;;}else{__label__=20;;}
69952 if(__label__==17){var $48=$frame_addr;var $TLTdb=(($48+180)&4294967295);var $49=HEAP32[(($TLTdb)>>2)];var $conv45=((($49))|0);var $mul46=0.033*($conv45);HEAPF32[((((__ZL10kt_globals+96)&4294967295))>>2)]=$mul46;var $50=HEAPF32[((((__ZL10kt_globals+96)&4294967295))>>2)];var $cmp47=($50)>0;if($cmp47){__label__=18;;}else{__label__=19;;}
69953 if(__label__==18){var $51=HEAPF32[((((__ZL10kt_globals+96)&4294967295))>>2)];var $sub49=1-($51);HEAPF32[((((__ZL10kt_globals+88)&4294967295))>>2)]=$sub49;;}
69954 else if(__label__==19){HEAPF32[((((__ZL10kt_globals+88)&4294967295))>>2)]=1;;}};return;return;}
69955 function __ZL9resonatorP11resonator_td($r,$input){;var __label__;var $r_addr;var $input_addr;var $x;$r_addr=$r;$input_addr=$input;var $0=$r_addr;var $a=(($0)&4294967295);var $1=HEAPF32[(($a)>>2)];var $2=$input_addr;var $mul=($1)*($2);var $3=$r_addr;var $b=(($3+8)&4294967295);var $4=HEAPF32[(($b)>>2)];var $5=$r_addr;var $p1=(($5+24)&4294967295);var $6=HEAPF32[(($p1)>>2)];var $mul1=($4)*($6);var $add=($mul)+($mul1);var $7=$r_addr;var $c=(($7+16)&4294967295);var $8=HEAPF32[(($c)>>2)];var $9=$r_addr;var $p2=(($9+32)&4294967295);var $10=HEAPF32[(($p2)>>2)];var $mul2=($8)*($10);var $add3=($add)+($mul2);$x=$add3;var $11=$r_addr;var $p14=(($11+24)&4294967295);var $12=HEAPF32[(($p14)>>2)];var $13=$r_addr;var $p25=(($13+32)&4294967295);HEAPF32[(($p25)>>2)]=$12;var $14=$x;var $15=$r_addr;var $p16=(($15+24)&4294967295);HEAPF32[(($p16)>>2)]=$14;var $16=$x;;return $16;return null;}
69956 function __ZL14antiresonator2P11resonator_td($input){;var __label__;var $r_addr;var $input_addr;var $x;$r_addr=((__ZL10kt_globals+188)&4294967295);$input_addr=$input;var $0=$r_addr;var $a=(($0)&4294967295);var $1=HEAPF32[(($a)>>2)];var $2=$input_addr;var $mul=($1)*($2);var $3=$r_addr;var $b=(($3+8)&4294967295);var $4=HEAPF32[(($b)>>2)];var $5=$r_addr;var $p1=(($5+24)&4294967295);var $6=HEAPF32[(($p1)>>2)];var $mul1=($4)*($6);var $add=($mul)+($mul1);var $7=$r_addr;var $c=(($7+16)&4294967295);var $8=HEAPF32[(($c)>>2)];var $9=$r_addr;var $p2=(($9+32)&4294967295);var $10=HEAPF32[(($p2)>>2)];var $mul2=($8)*($10);var $add3=($add)+($mul2);$x=$add3;var $11=$r_addr;var $p14=(($11+24)&4294967295);var $12=HEAPF32[(($p14)>>2)];var $13=$r_addr;var $p25=(($13+32)&4294967295);HEAPF32[(($p25)>>2)]=$12;var $14=$input_addr;var $15=$r_addr;var $p16=(($15+24)&4294967295);HEAPF32[(($p16)>>2)]=$14;var $16=$r_addr;var $a_inc=(($16+40)&4294967295);var $17=HEAPF32[(($a_inc)>>2)];var $18=$r_addr;var $a7=(($18)&4294967295);var $19=HEAPF32[(($a7)>>2)];var $add8=($19)+($17);HEAPF32[(($a7)>>2)]=$add8;var $20=$r_addr;var $b_inc=(($20+48)&4294967295);var $21=HEAPF32[(($b_inc)>>2)];var $22=$r_addr;var $b9=(($22+8)&4294967295);var $23=HEAPF32[(($b9)>>2)];var $add10=($23)+($21);HEAPF32[(($b9)>>2)]=$add10;var $24=$r_addr;var $c_inc=(($24+56)&4294967295);var $25=HEAPF32[(($c_inc)>>2)];var $26=$r_addr;var $c11=(($26+16)&4294967295);var $27=HEAPF32[(($c11)>>2)];var $add12=($27)+($25);HEAPF32[(($c11)>>2)]=$add12;var $28=$x;;return $28;return null;}
69957 function __ZL10resonator2P11resonator_td($r,$input){;var __label__;var $r_addr;var $input_addr;var $x;$r_addr=$r;$input_addr=$input;var $0=$r_addr;var $a=(($0)&4294967295);var $1=HEAPF32[(($a)>>2)];var $2=$input_addr;var $mul=($1)*($2);var $3=$r_addr;var $b=(($3+8)&4294967295);var $4=HEAPF32[(($b)>>2)];var $5=$r_addr;var $p1=(($5+24)&4294967295);var $6=HEAPF32[(($p1)>>2)];var $mul1=($4)*($6);var $add=($mul)+($mul1);var $7=$r_addr;var $c=(($7+16)&4294967295);var $8=HEAPF32[(($c)>>2)];var $9=$r_addr;var $p2=(($9+32)&4294967295);var $10=HEAPF32[(($p2)>>2)];var $mul2=($8)*($10);var $add3=($add)+($mul2);$x=$add3;var $11=$r_addr;var $p14=(($11+24)&4294967295);var $12=HEAPF32[(($p14)>>2)];var $13=$r_addr;var $p25=(($13+32)&4294967295);HEAPF32[(($p25)>>2)]=$12;var $14=$x;var $15=$r_addr;var $p16=(($15+24)&4294967295);HEAPF32[(($p16)>>2)]=$14;var $16=$r_addr;var $a_inc=(($16+40)&4294967295);var $17=HEAPF32[(($a_inc)>>2)];var $18=$r_addr;var $a7=(($18)&4294967295);var $19=HEAPF32[(($a7)>>2)];var $add8=($19)+($17);HEAPF32[(($a7)>>2)]=$add8;var $20=$r_addr;var $b_inc=(($20+48)&4294967295);var $21=HEAPF32[(($b_inc)>>2)];var $22=$r_addr;var $b9=(($22+8)&4294967295);var $23=HEAPF32[(($b9)>>2)];var $add10=($23)+($21);HEAPF32[(($b9)>>2)]=$add10;var $24=$r_addr;var $c_inc=(($24+56)&4294967295);var $25=HEAPF32[(($c_inc)>>2)];var $26=$r_addr;var $c11=(($26+16)&4294967295);var $27=HEAPF32[(($c11)>>2)];var $add12=($27)+($25);HEAPF32[(($c11)>>2)]=$add12;var $28=$x;;return $28;return null;}
69958 function __ZL7DBtoLINl($dB){;var __label__;var $retval;var $dB_addr;$dB_addr=$dB;var $0=$dB_addr;var $cmp=((($0))|0)<0;var $1=$dB_addr;var $cmp1=((($1))|0)>87;var $or_cond=($cmp)|($cmp1);if($or_cond){__label__=1;;}else{__label__=2;;}
69959 if(__label__==1){$retval=0;;}
69960 else if(__label__==2){var $2=$dB_addr;var $arrayidx=((__ZZL7DBtoLINlE8amptable+$2*2)&4294967295);var $3=HEAP16[(($arrayidx)>>1)];var $conv=(tempInt=(($3)),(tempInt>=32768?tempInt-65536:tempInt));var $mul=($conv)*0.001;$retval=$mul;;}
69961 var $4=$retval;;return $4;return null;}
69962 function __ZL10setzeroabcllP11resonator_t($f,$bw,$rp){;var __label__;var $f_addr;var $bw_addr;var $rp_addr;var $r;var $arg;$f_addr=$f;$bw_addr=$bw;$rp_addr=$rp;var $0=$f_addr;var $sub=(((-($0)))&4294967295);$f_addr=$sub;var $1=$f_addr;var $cmp=((($1))|0)>=0;if($cmp){__label__=1;;}else{__label__=2;;}
69963 if(__label__==1){$f_addr=-1;;}
69964 var $2=HEAPF32[((((__ZL10kt_globals+72)&4294967295))>>2)];var $3=$bw_addr;var $conv=((($3))|0);var $mul=($2)*($conv);$arg=$mul;var $4=$arg;var $call=_exp($4);$r=$call;var $5=$r;var $6=$r;var $mul1=($5)*($6);var $sub2=(-($mul1));var $7=$rp_addr;var $c=(($7+16)&4294967295);HEAPF32[(($c)>>2)]=$sub2;var $8=HEAPF32[((((__ZL10kt_globals+80)&4294967295))>>2)];var $9=$f_addr;var $conv3=((($9))|0);var $mul4=($8)*($conv3);$arg=$mul4;var $10=$r;var $11=$arg;var $call5=_cos($11);var $mul6=($10)*($call5);var $mul7=($mul6)*2;var $12=$rp_addr;var $b=(($12+8)&4294967295);HEAPF32[(($b)>>2)]=$mul7;var $13=$rp_addr;var $b8=(($13+8)&4294967295);var $14=HEAPF32[(($b8)>>2)];var $sub9=1-($14);var $15=$rp_addr;var $c10=(($15+16)&4294967295);var $16=HEAPF32[(($c10)>>2)];var $sub11=($sub9)-($16);var $17=$rp_addr;var $a=(($17)&4294967295);HEAPF32[(($a)>>2)]=$sub11;var $18=$rp_addr;var $a12=(($18)&4294967295);var $19=HEAPF32[(($a12)>>2)];var $div=1/($19);var $20=$rp_addr;var $a13=(($20)&4294967295);HEAPF32[(($a13)>>2)]=$div;var $21=$rp_addr;var $a14=(($21)&4294967295);var $22=HEAPF32[(($a14)>>2)];var $sub15=(-($22));var $23=$rp_addr;var $c16=(($23+16)&4294967295);var $24=HEAPF32[(($c16)>>2)];var $mul17=($24)*($sub15);HEAPF32[(($c16)>>2)]=$mul17;var $25=$rp_addr;var $a18=(($25)&4294967295);var $26=HEAPF32[(($a18)>>2)];var $sub19=(-($26));var $27=$rp_addr;var $b20=(($27+8)&4294967295);var $28=HEAPF32[(($b20)>>2)];var $mul21=($28)*($sub19);HEAPF32[(($b20)>>2)]=$mul21;;return;return;}
69965 function __Z8sonicMSGPcz($format){var __stackBase__=STACKTOP;STACKTOP+=4100;_memset(__stackBase__,0,4100);var __label__;var $format_addr;var $buffer=__stackBase__;var $ap=__stackBase__+4096;var $file;$format_addr=$format;var $ap1=$ap;HEAP32[(($ap1)>>2)]=arguments[__Z8sonicMSGPcz.length];;var $arraydecay=(($buffer)&4294967295);var $0=$format_addr;var $1=HEAP32[(($ap)>>2)];var $call=_vsprintf($arraydecay,$0,$1);var $ap2=$ap;;var $call3=_fopen(((__str810)&4294967295),((__str1811)&4294967295));$file=$call3;var $2=$file;var $arraydecay4=(($buffer)&4294967295);var $fputs=_fputs($arraydecay4,$2);var $3=$file;var $call6=_fclose($3);STACKTOP=__stackBase__;return;return;}
69966 function _sonicGetSpeed($stream){;var __label__;var $stream_addr;$stream_addr=$stream;var $0=$stream_addr;var $speed=(($0+16)&4294967295);var $1=HEAPF32[(($speed)>>2)];;return $1;return null;}
69967 function _sonicSetSpeed($stream,$speed){;var __label__;var $stream_addr;var $speed_addr;$stream_addr=$stream;$speed_addr=$speed;var $0=$speed_addr;var $1=$stream_addr;var $speed1=(($1+16)&4294967295);HEAPF32[(($speed1)>>2)]=$0;;return;return;}
69968 function _sonicGetPitch($stream){;var __label__;var $stream_addr;$stream_addr=$stream;var $0=$stream_addr;var $pitch=(($0+24)&4294967295);var $1=HEAPF32[(($pitch)>>2)];;return $1;return null;}
69969 function _sonicSetPitch($stream,$pitch){;var __label__;var $stream_addr;var $pitch_addr;$stream_addr=$stream;$pitch_addr=$pitch;var $0=$pitch_addr;var $1=$stream_addr;var $pitch1=(($1+24)&4294967295);HEAPF32[(($pitch1)>>2)]=$0;;return;return;}
69970 function _sonicGetVolume($stream){;var __label__;var $stream_addr;$stream_addr=$stream;var $0=$stream_addr;var $volume=(($0+20)&4294967295);var $1=HEAPF32[(($volume)>>2)];;return $1;return null;}
69971 function _sonicSetVolume($stream,$volume){;var __label__;var $stream_addr;var $volume_addr;$stream_addr=$stream;$volume_addr=$volume;var $0=$volume_addr;var $1=$stream_addr;var $volume1=(($1+20)&4294967295);HEAPF32[(($volume1)>>2)]=$0;;return;return;}
69972 function _sonicGetSampleRate($stream){;var __label__;var $stream_addr;$stream_addr=$stream;var $0=$stream_addr;var $sampleRate=(($0+72)&4294967295);var $1=HEAP32[(($sampleRate)>>2)];;return $1;return null;}
69973 function _sonicGetNumChannels($stream){;var __label__;var $stream_addr;$stream_addr=$stream;var $0=$stream_addr;var $numChannels=(($0+28)&4294967295);var $1=HEAP32[(($numChannels)>>2)];;return $1;return null;}
69974 function _sonicDestroyStream($stream){;var __label__;var $stream_addr;$stream_addr=$stream;var $0=$stream_addr;var $inputBuffer=(($0)&4294967295);var $1=HEAP32[(($inputBuffer)>>2)];var $cmp=((($1))|0)!=0;if($cmp){__label__=1;;}else{__label__=2;;}
69975 if(__label__==1){var $2=$stream_addr;var $inputBuffer1=(($2)&4294967295);var $3=HEAP32[(($inputBuffer1)>>2)];var $4=$3;;;}
69976 var $5=$stream_addr;var $outputBuffer=(($5+4)&4294967295);var $6=HEAP32[(($outputBuffer)>>2)];var $cmp2=((($6))|0)!=0;if($cmp2){__label__=3;;}else{__label__=4;;}
69977 if(__label__==3){var $7=$stream_addr;var $outputBuffer4=(($7+4)&4294967295);var $8=HEAP32[(($outputBuffer4)>>2)];var $9=$8;;;}
69978 var $10=$stream_addr;var $pitchBuffer=(($10+8)&4294967295);var $11=HEAP32[(($pitchBuffer)>>2)];var $cmp6=((($11))|0)!=0;if($cmp6){__label__=5;;}else{__label__=6;;}
69979 if(__label__==5){var $12=$stream_addr;var $pitchBuffer8=(($12+8)&4294967295);var $13=HEAP32[(($pitchBuffer8)>>2)];var $14=$13;;;}
69980 var $15=$stream_addr;var $downSampleBuffer=(($15+12)&4294967295);var $16=HEAP32[(($downSampleBuffer)>>2)];var $cmp10=((($16))|0)!=0;if($cmp10){__label__=7;;}else{__label__=8;;}
69981 if(__label__==7){var $17=$stream_addr;var $downSampleBuffer12=(($17+12)&4294967295);var $18=HEAP32[(($downSampleBuffer12)>>2)];var $19=$18;;;}
69982 var $20=$stream_addr;var $21=$20;;;return;return;}
69983 function _sonicCreateStream($sampleRate,$numChannels){;var __label__;var $retval;var $sampleRate_addr;var $numChannels_addr;var $stream;var $minPeriod;var $maxPeriod;var $maxRequired;$sampleRate_addr=$sampleRate;$numChannels_addr=$numChannels;var $call=_calloc(1,88);var $0=$call;$stream=$0;var $1=$sampleRate_addr;var $div=((((($1))|0)/400)|0);$minPeriod=$div;var $2=$sampleRate_addr;var $div1=((((($2))|0)/65)|0);$maxPeriod=$div1;var $3=$maxPeriod;var $mul=((($3)*2)&4294967295);$maxRequired=$mul;var $4=$stream;var $cmp=((($4))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
69984 if(__label__==1){$retval=0;;}
69985 else if(__label__==2){var $5=$maxRequired;var $6=$stream;var $inputBufferSize=(($6+32)&4294967295);HEAP32[(($inputBufferSize)>>2)]=$5;var $7=$maxRequired;var $8=$numChannels_addr;var $mul2=((($8)*2)&4294967295);var $call3=_calloc($7,$mul2);var $9=$call3;var $10=$stream;var $inputBuffer=(($10)&4294967295);HEAP32[(($inputBuffer)>>2)]=$9;var $11=$stream;var $inputBuffer4=(($11)&4294967295);var $12=HEAP32[(($inputBuffer4)>>2)];var $cmp5=((($12))|0)==0;if($cmp5){__label__=3;;}else{__label__=4;;}
69986 if(__label__==3){var $13=$stream;_sonicDestroyStream($13);$retval=0;;}
69987 else if(__label__==4){var $14=$maxRequired;var $15=$stream;var $outputBufferSize=(($15+40)&4294967295);HEAP32[(($outputBufferSize)>>2)]=$14;var $16=$maxRequired;var $17=$numChannels_addr;var $mul8=((($17)*2)&4294967295);var $call9=_calloc($16,$mul8);var $18=$call9;var $19=$stream;var $outputBuffer=(($19+4)&4294967295);HEAP32[(($outputBuffer)>>2)]=$18;var $20=$stream;var $outputBuffer10=(($20+4)&4294967295);var $21=HEAP32[(($outputBuffer10)>>2)];var $cmp11=((($21))|0)==0;if($cmp11){__label__=5;;}else{__label__=6;;}
69988 if(__label__==5){var $22=$stream;_sonicDestroyStream($22);$retval=0;;}
69989 else if(__label__==6){var $23=$maxRequired;var $24=$stream;var $pitchBufferSize=(($24+36)&4294967295);HEAP32[(($pitchBufferSize)>>2)]=$23;var $25=$maxRequired;var $26=$numChannels_addr;var $mul14=((($26)*2)&4294967295);var $call15=_calloc($25,$mul14);var $27=$call15;var $28=$stream;var $pitchBuffer=(($28+8)&4294967295);HEAP32[(($pitchBuffer)>>2)]=$27;var $29=$stream;var $pitchBuffer16=(($29+8)&4294967295);var $30=HEAP32[(($pitchBuffer16)>>2)];var $cmp17=((($30))|0)==0;if($cmp17){__label__=7;;}else{__label__=8;;}
69990 if(__label__==7){var $31=$stream;_sonicDestroyStream($31);$retval=0;;}
69991 else if(__label__==8){var $32=$maxRequired;var $call20=_calloc($32,2);var $33=$call20;var $34=$stream;var $downSampleBuffer=(($34+12)&4294967295);HEAP32[(($downSampleBuffer)>>2)]=$33;var $35=$stream;var $speed=(($35+16)&4294967295);HEAPF32[(($speed)>>2)]=1;var $36=$stream;var $pitch=(($36+24)&4294967295);HEAPF32[(($pitch)>>2)]=1;var $37=$stream;var $volume=(($37+20)&4294967295);HEAPF32[(($volume)>>2)]=1;var $38=$sampleRate_addr;var $39=$stream;var $sampleRate21=(($39+72)&4294967295);HEAP32[(($sampleRate21)>>2)]=$38;var $40=$numChannels_addr;var $41=$stream;var $numChannels22=(($41+28)&4294967295);HEAP32[(($numChannels22)>>2)]=$40;var $42=$minPeriod;var $43=$stream;var $minPeriod23=(($43+56)&4294967295);HEAP32[(($minPeriod23)>>2)]=$42;var $44=$maxPeriod;var $45=$stream;var $maxPeriod24=(($45+60)&4294967295);HEAP32[(($maxPeriod24)>>2)]=$44;var $46=$maxRequired;var $47=$stream;var $maxRequired25=(($47+64)&4294967295);HEAP32[(($maxRequired25)>>2)]=$46;var $48=$stream;$retval=$48;;}}}}
69992 var $49=$retval;;return $49;return null;}
69993 function _sonicReadFloatFromStream($stream,$samples,$maxSamples){;var __label__;var $retval;var $stream_addr;var $samples_addr;var $maxSamples_addr;var $numSamples;var $remainingSamples;var $buffer;var $count;$stream_addr=$stream;$samples_addr=$samples;$maxSamples_addr=$maxSamples;var $0=$stream_addr;var $numOutputSamples=(($0+48)&4294967295);var $1=HEAP32[(($numOutputSamples)>>2)];$numSamples=$1;$remainingSamples=0;var $2=$numSamples;var $cmp=((($2))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
69994 if(__label__==1){$retval=0;;}
69995 else if(__label__==2){var $3=$numSamples;var $4=$maxSamples_addr;var $cmp1=((($3))|0)>((($4))|0);if($cmp1){__label__=3;;}else{__label__=4;;}
69996 if(__label__==3){var $5=$numSamples;var $6=$maxSamples_addr;var $sub=((($5)-($6))&4294967295);$remainingSamples=$sub;var $7=$maxSamples_addr;$numSamples=$7;;}
69997 var $8=$stream_addr;var $outputBuffer=(($8+4)&4294967295);var $9=HEAP32[(($outputBuffer)>>2)];$buffer=$9;var $10=$numSamples;var $11=$stream_addr;var $numChannels=(($11+28)&4294967295);var $12=HEAP32[(($numChannels)>>2)];var $mul=((($12)*($10))&4294967295);var $dec1=((($mul)-1)&4294967295);$count=$dec1;var $tobool2=((($mul))|0)!=0;if($tobool2){__label__=5;;}else{__label__=6;;}
69998 $while_body$$while_end$8:do{if(__label__==5){while(1){var $13=$buffer;var $incdec_ptr=(($13+2)&4294967295);$buffer=$incdec_ptr;var $14=HEAP16[(($13)>>1)];var $conv=(tempInt=(($14)),(tempInt>=32768?tempInt-65536:tempInt));var $conv4=((($conv))|0);var $div=($conv4)/32767;var $15=$samples_addr;var $incdec_ptr5=(($15+4)&4294967295);$samples_addr=$incdec_ptr5;HEAPF32[(($15)>>2)]=$div;var $_pr=$count;var $dec=((($_pr)-1)&4294967295);$count=$dec;var $tobool=((($_pr))|0)!=0;if($tobool){__label__=5;continue;}else{__label__=6;break $while_body$$while_end$8;}}}}while(0);var $16=$remainingSamples;var $cmp6=((($16))|0)>0;if($cmp6){__label__=7;;}else{__label__=8;;}
69999 if(__label__==7){var $17=$stream_addr;var $outputBuffer8=(($17+4)&4294967295);var $18=HEAP32[(($outputBuffer8)>>2)];var $19=$18;var $20=$stream_addr;var $outputBuffer9=(($20+4)&4294967295);var $21=HEAP32[(($outputBuffer9)>>2)];var $22=$numSamples;var $23=$stream_addr;var $numChannels10=(($23+28)&4294967295);var $24=HEAP32[(($numChannels10)>>2)];var $mul11=((($24)*($22))&4294967295);var $add_ptr=(($21+2*$mul11)&4294967295);var $25=$add_ptr;var $26=$remainingSamples;var $27=$stream_addr;var $numChannels13=(($27+28)&4294967295);var $28=HEAP32[(($numChannels13)>>2)];var $mul12=((($26)*2)&4294967295);var $mul14=((($mul12)*($28))&4294967295);_llvm_memmove_p0i8_p0i8_i32($19,$25,$mul14,1,0);;}
70000 var $29=$remainingSamples;var $30=$stream_addr;var $numOutputSamples16=(($30+48)&4294967295);HEAP32[(($numOutputSamples16)>>2)]=$29;var $31=$numSamples;$retval=$31;;}
70001 var $32=$retval;;return $32;return null;}
70002 function _sonicReadShortFromStream($stream,$samples,$maxSamples){;var __label__;var $retval;var $stream_addr;var $samples_addr;var $maxSamples_addr;var $numSamples;var $remainingSamples;$stream_addr=$stream;$samples_addr=$samples;$maxSamples_addr=$maxSamples;var $0=$stream_addr;var $numOutputSamples=(($0+48)&4294967295);var $1=HEAP32[(($numOutputSamples)>>2)];$numSamples=$1;$remainingSamples=0;var $2=$numSamples;var $cmp=((($2))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
70003 if(__label__==1){$retval=0;;}
70004 else if(__label__==2){var $3=$numSamples;var $4=$maxSamples_addr;var $cmp1=((($3))|0)>((($4))|0);if($cmp1){__label__=3;;}else{__label__=4;;}
70005 if(__label__==3){var $5=$numSamples;var $6=$maxSamples_addr;var $sub=((($5)-($6))&4294967295);$remainingSamples=$sub;var $7=$maxSamples_addr;$numSamples=$7;;}
70006 var $8=$samples_addr;var $9=$8;var $10=$stream_addr;var $outputBuffer=(($10+4)&4294967295);var $11=HEAP32[(($outputBuffer)>>2)];var $12=$11;var $13=$numSamples;var $14=$stream_addr;var $numChannels=(($14+28)&4294967295);var $15=HEAP32[(($numChannels)>>2)];var $mul=((($13)*2)&4294967295);var $mul4=((($mul)*($15))&4294967295);var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$12;$dest$=$9;$stop$=$src$+$mul4;if(($dest$%4)==($src$%4)&&$mul4>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
70007 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
70008 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $16=$remainingSamples;var $cmp5=((($16))|0)>0;if($cmp5){__label__=5;;}else{__label__=6;;}
70009 if(__label__==5){var $17=$stream_addr;var $outputBuffer7=(($17+4)&4294967295);var $18=HEAP32[(($outputBuffer7)>>2)];var $19=$18;var $20=$stream_addr;var $outputBuffer8=(($20+4)&4294967295);var $21=HEAP32[(($outputBuffer8)>>2)];var $22=$numSamples;var $23=$stream_addr;var $numChannels9=(($23+28)&4294967295);var $24=HEAP32[(($numChannels9)>>2)];var $mul10=((($24)*($22))&4294967295);var $add_ptr=(($21+2*$mul10)&4294967295);var $25=$add_ptr;var $26=$remainingSamples;var $27=$stream_addr;var $numChannels12=(($27+28)&4294967295);var $28=HEAP32[(($numChannels12)>>2)];var $mul11=((($26)*2)&4294967295);var $mul13=((($mul11)*($28))&4294967295);_llvm_memmove_p0i8_p0i8_i32($19,$25,$mul13,1,0);;}
70010 var $29=$remainingSamples;var $30=$stream_addr;var $numOutputSamples15=(($30+48)&4294967295);HEAP32[(($numOutputSamples15)>>2)]=$29;var $31=$numSamples;$retval=$31;;}
70011 var $32=$retval;;return $32;return null;}
70012 function _sonicReadUnsignedCharFromStream($stream,$samples,$maxSamples){;var __label__;var $retval;var $stream_addr;var $samples_addr;var $maxSamples_addr;var $numSamples;var $remainingSamples;var $buffer;var $count;$stream_addr=$stream;$samples_addr=$samples;$maxSamples_addr=$maxSamples;var $0=$stream_addr;var $numOutputSamples=(($0+48)&4294967295);var $1=HEAP32[(($numOutputSamples)>>2)];$numSamples=$1;$remainingSamples=0;var $2=$numSamples;var $cmp=((($2))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
70013 if(__label__==1){$retval=0;;}
70014 else if(__label__==2){var $3=$numSamples;var $4=$maxSamples_addr;var $cmp1=((($3))|0)>((($4))|0);if($cmp1){__label__=3;;}else{__label__=4;;}
70015 if(__label__==3){var $5=$numSamples;var $6=$maxSamples_addr;var $sub=((($5)-($6))&4294967295);$remainingSamples=$sub;var $7=$maxSamples_addr;$numSamples=$7;;}
70016 var $8=$stream_addr;var $outputBuffer=(($8+4)&4294967295);var $9=HEAP32[(($outputBuffer)>>2)];$buffer=$9;var $10=$numSamples;var $11=$stream_addr;var $numChannels=(($11+28)&4294967295);var $12=HEAP32[(($numChannels)>>2)];var $mul=((($12)*($10))&4294967295);var $dec1=((($mul)-1)&4294967295);$count=$dec1;var $tobool2=((($mul))|0)!=0;if($tobool2){__label__=5;;}else{__label__=6;;}
70017 $while_body$$while_end$8:do{if(__label__==5){while(1){var $13=$buffer;var $incdec_ptr=(($13+2)&4294967295);$buffer=$incdec_ptr;var $14=HEAP16[(($13)>>1)];var $conv=(tempInt=(($14)),(tempInt>=32768?tempInt-65536:tempInt));var $shr=($conv)>>8;var $conv4=((($shr))&255);var $conv5=(tempInt=(($conv4)),(tempInt>=128?tempInt-256:tempInt));var $add=((($conv5)+128)&4294967295);var $conv6=((($add))&255);var $15=$samples_addr;var $incdec_ptr7=(($15+1)&4294967295);$samples_addr=$incdec_ptr7;HEAP8[($15)]=$conv6;var $_pr=$count;var $dec=((($_pr)-1)&4294967295);$count=$dec;var $tobool=((($_pr))|0)!=0;if($tobool){__label__=5;continue;}else{__label__=6;break $while_body$$while_end$8;}}}}while(0);var $16=$remainingSamples;var $cmp8=((($16))|0)>0;if($cmp8){__label__=7;;}else{__label__=8;;}
70018 if(__label__==7){var $17=$stream_addr;var $outputBuffer10=(($17+4)&4294967295);var $18=HEAP32[(($outputBuffer10)>>2)];var $19=$18;var $20=$stream_addr;var $outputBuffer11=(($20+4)&4294967295);var $21=HEAP32[(($outputBuffer11)>>2)];var $22=$numSamples;var $23=$stream_addr;var $numChannels12=(($23+28)&4294967295);var $24=HEAP32[(($numChannels12)>>2)];var $mul13=((($24)*($22))&4294967295);var $add_ptr=(($21+2*$mul13)&4294967295);var $25=$add_ptr;var $26=$remainingSamples;var $27=$stream_addr;var $numChannels15=(($27+28)&4294967295);var $28=HEAP32[(($numChannels15)>>2)];var $mul14=((($26)*2)&4294967295);var $mul16=((($mul14)*($28))&4294967295);_llvm_memmove_p0i8_p0i8_i32($19,$25,$mul16,1,0);;}
70019 var $29=$remainingSamples;var $30=$stream_addr;var $numOutputSamples18=(($30+48)&4294967295);HEAP32[(($numOutputSamples18)>>2)]=$29;var $31=$numSamples;$retval=$31;;}
70020 var $32=$retval;;return $32;return null;}
70021 function _sonicFlushStream($stream){;var __label__;var $retval;var $stream_addr;var $maxRequired;var $numSamples;var $remainingSpace;var $numOutputSamples;var $expectedSamples;$stream_addr=$stream;var $0=$stream_addr;var $maxRequired1=(($0+64)&4294967295);var $1=HEAP32[(($maxRequired1)>>2)];$maxRequired=$1;var $2=$stream_addr;var $numInputSamples=(($2+44)&4294967295);var $3=HEAP32[(($numInputSamples)>>2)];$numSamples=$3;var $4=$numSamples;var $cmp=((($4))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
70022 $if_then$$if_end$2:do{if(__label__==1){$retval=1;;}
70023 else if(__label__==2){var $5=$numSamples;var $6=$maxRequired;var $cmp2=((($5))|0)>=((($6))|0);if($cmp2){__label__=3;;}else{__label__=5;;}
70024 $land_lhs_true$$if_end4$5:do{if(__label__==3){var $7=$stream_addr;var $call=_sonicWriteShortToStream($7,0,0);var $tobool=((($call))|0)!=0;if($tobool){__label__=5;break $land_lhs_true$$if_end4$5;}
70025 $retval=0;__label__=12;break $if_then$$if_end$2;}}while(0);var $8=$stream_addr;var $numInputSamples5=(($8+44)&4294967295);var $9=HEAP32[(($numInputSamples5)>>2)];$numSamples=$9;var $cmp6=((($9))|0)==0;if($cmp6){__label__=6;;}else{__label__=7;;}
70026 if(__label__==6){$retval=1;;}
70027 else if(__label__==7){var $10=$maxRequired;var $11=$numSamples;var $sub=((($10)-($11))&4294967295);$remainingSpace=$sub;var $12=$stream_addr;var $inputBuffer=(($12)&4294967295);var $13=HEAP32[(($inputBuffer)>>2)];var $14=$numSamples;var $15=$stream_addr;var $numChannels=(($15+28)&4294967295);var $16=HEAP32[(($numChannels)>>2)];var $mul=((($16)*($14))&4294967295);var $add_ptr=(($13+2*$mul)&4294967295);var $17=$add_ptr;var $18=$remainingSpace;var $19=$stream_addr;var $numChannels10=(($19+28)&4294967295);var $20=HEAP32[(($numChannels10)>>2)];var $mul9=((($18)*2)&4294967295);var $mul11=((($mul9)*($20))&4294967295);var $dest$,$stop$,$stop4$,$fast$,$value4$;$dest$=$17;$stop$=$dest$+$mul11;$value4$=0;if($value4$<0)$value4$+=256;$value4$=$value4$+($value4$<<8)+($value4$<<16)+($value4$*16777216);while($dest$%4!==0&&$dest$<$stop$){;;HEAP8[$dest$++]=0;}
70028 $dest$>>=2;$stop4$=$stop$>>2;while($dest$<$stop4$){;;;;;;;HEAP32[$dest$++]=$value4$;}
70029 $dest$<<=2;while($dest$<$stop$){;;HEAP8[$dest$++]=0;};var $21=$maxRequired;var $22=$stream_addr;var $numInputSamples12=(($22+44)&4294967295);HEAP32[(($numInputSamples12)>>2)]=$21;var $23=$stream_addr;var $numOutputSamples13=(($23+48)&4294967295);var $24=HEAP32[(($numOutputSamples13)>>2)];$numOutputSamples=$24;var $25=$stream_addr;var $call14=_sonicWriteShortToStream($25,0,0);var $tobool15=((($call14))|0)!=0;if($tobool15){__label__=9;;}else{__label__=8;;}
70030 if(__label__==9){var $26=$numSamples;var $conv=((($26))|0);var $27=$stream_addr;var $speed=(($27+16)&4294967295);var $28=HEAPF32[(($speed)>>2)];var $mul18=($conv)*($28);var $conv19=($mul18);var $add=($conv19)+0.5;var $conv20=((($add))|0);$expectedSamples=$conv20;var $29=$stream_addr;var $numOutputSamples21=(($29+48)&4294967295);var $30=HEAP32[(($numOutputSamples21)>>2)];var $31=$numOutputSamples;var $32=$expectedSamples;var $add22=((($32)+($31))&4294967295);var $cmp23=((($30))|0)>((($add22))|0);if($cmp23){__label__=10;;}else{__label__=11;;}
70031 if(__label__==10){var $33=$numOutputSamples;var $34=$expectedSamples;var $add25=((($34)+($33))&4294967295);var $35=$stream_addr;var $numOutputSamples26=(($35+48)&4294967295);HEAP32[(($numOutputSamples26)>>2)]=$add25;;}
70032 $retval=1;;}
70033 else if(__label__==8){$retval=0;;}}}}while(0);var $36=$retval;;return $36;return null;}
70034 function _sonicWriteShortToStream($stream,$samples,$numSamples){;var __label__;var $retval;var $stream_addr;var $samples_addr;var $numSamples_addr;$stream_addr=$stream;$samples_addr=$samples;$numSamples_addr=$numSamples;var $0=$stream_addr;var $1=$samples_addr;var $2=$numSamples_addr;var $call=__ZL28addShortSamplesToInputBufferP17sonicStreamStructPsi($0,$1,$2);var $tobool=((($call))|0)!=0;if($tobool){__label__=2;;}else{__label__=1;;}
70035 if(__label__==2){var $3=$stream_addr;var $call1=__ZL18processStreamInputP17sonicStreamStruct($3);$retval=$call1;;}
70036 else if(__label__==1){$retval=0;;}
70037 var $4=$retval;;return $4;return null;}
70038 function _sonicSamplesAvailable($stream){;var __label__;var $stream_addr;$stream_addr=$stream;var $0=$stream_addr;var $numOutputSamples=(($0+48)&4294967295);var $1=HEAP32[(($numOutputSamples)>>2)];;return $1;return null;}
70039 function _sonicWriteFloatToStream($stream,$samples,$numSamples){;var __label__;var $retval;var $stream_addr;var $samples_addr;var $numSamples_addr;$stream_addr=$stream;$samples_addr=$samples;$numSamples_addr=$numSamples;var $0=$stream_addr;var $1=$samples_addr;var $2=$numSamples_addr;var $call=__ZL28addFloatSamplesToInputBufferP17sonicStreamStructPfi($0,$1,$2);var $tobool=((($call))|0)!=0;if($tobool){__label__=2;;}else{__label__=1;;}
70040 if(__label__==2){var $3=$stream_addr;var $call1=__ZL18processStreamInputP17sonicStreamStruct($3);$retval=$call1;;}
70041 else if(__label__==1){$retval=0;;}
70042 var $4=$retval;;return $4;return null;}
70043 function __ZL28addFloatSamplesToInputBufferP17sonicStreamStructPfi($stream,$samples,$numSamples){;var __label__;var $retval;var $stream_addr;var $samples_addr;var $numSamples_addr;var $buffer;var $count;$stream_addr=$stream;$samples_addr=$samples;$numSamples_addr=$numSamples;var $0=$numSamples_addr;var $1=$stream_addr;var $numChannels=(($1+28)&4294967295);var $2=HEAP32[(($numChannels)>>2)];var $mul=((($2)*($0))&4294967295);$count=$mul;var $3=$numSamples_addr;var $cmp=((($3))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
70044 if(__label__==1){$retval=1;;}
70045 else if(__label__==2){var $4=$stream_addr;var $5=$numSamples_addr;var $call=__ZL26enlargeInputBufferIfNeededP17sonicStreamStructi($4,$5);var $tobool=((($call))|0)!=0;if($tobool){__label__=4;;}else{__label__=3;;}
70046 if(__label__==4){var $6=$stream_addr;var $inputBuffer=(($6)&4294967295);var $7=HEAP32[(($inputBuffer)>>2)];var $8=$stream_addr;var $numInputSamples=(($8+44)&4294967295);var $9=HEAP32[(($numInputSamples)>>2)];var $10=$stream_addr;var $numChannels3=(($10+28)&4294967295);var $11=HEAP32[(($numChannels3)>>2)];var $mul4=((($11)*($9))&4294967295);var $add_ptr=(($7+2*$mul4)&4294967295);$buffer=$add_ptr;var $12=$count;var $dec1=((($12)-1)&4294967295);$count=$dec1;var $tobool52=((($12))|0)!=0;if($tobool52){__label__=5;;}else{__label__=6;;}
70047 $while_body$$while_end$7:do{if(__label__==5){while(1){var $13=$samples_addr;var $incdec_ptr=(($13+4)&4294967295);$samples_addr=$incdec_ptr;var $14=HEAPF32[(($13)>>2)];var $mul6=($14)*32767;var $conv=((($mul6))|0);var $15=$buffer;var $incdec_ptr7=(($15+2)&4294967295);$buffer=$incdec_ptr7;HEAP16[(($15)>>1)]=$conv;var $16=$count;var $dec=((($16)-1)&4294967295);$count=$dec;var $tobool5=((($16))|0)!=0;if($tobool5){__label__=5;continue;}else{__label__=6;break $while_body$$while_end$7;}}}}while(0);var $17=$numSamples_addr;var $18=$stream_addr;var $numInputSamples8=(($18+44)&4294967295);var $19=HEAP32[(($numInputSamples8)>>2)];var $add=((($19)+($17))&4294967295);HEAP32[(($numInputSamples8)>>2)]=$add;$retval=1;;}
70048 else if(__label__==3){$retval=0;;}}
70049 var $20=$retval;;return $20;return null;}
70050 function __ZL18processStreamInputP17sonicStreamStruct($stream){;var __label__;var $retval;var $stream_addr;var $originalNumOutputSamples;var $speed;$stream_addr=$stream;var $0=$stream_addr;var $numOutputSamples=(($0+48)&4294967295);var $1=HEAP32[(($numOutputSamples)>>2)];$originalNumOutputSamples=$1;var $2=$stream_addr;var $speed1=(($2+16)&4294967295);var $3=HEAPF32[(($speed1)>>2)];var $4=$stream_addr;var $pitch=(($4+24)&4294967295);var $5=HEAPF32[(($pitch)>>2)];var $div=($3)/($5);$speed=$div;var $6=$speed;var $conv=($6);var $cmp=($conv)>1.00001;if($cmp){__label__=2;;}else{__label__=1;;}
70051 $if_then$$lor_lhs_false$2:do{if(__label__==1){var $7=$speed;var $conv2=($7);var $cmp3=($conv2)<0.99999;if($cmp3){__label__=2;break $if_then$$lor_lhs_false$2;}
70052 var $10=$stream_addr;var $11=$stream_addr;var $inputBuffer=(($11)&4294967295);var $12=HEAP32[(($inputBuffer)>>2)];var $13=$stream_addr;var $numInputSamples=(($13+44)&4294967295);var $14=HEAP32[(($numInputSamples)>>2)];var $call4=__ZL12copyToOutputP17sonicStreamStructPsi($10,$12,$14);var $tobool=((($call4))|0)!=0;if($tobool){__label__=5;;}else{__label__=4;;}
70053 if(__label__==5){var $15=$stream_addr;var $numInputSamples6=(($15+44)&4294967295);HEAP32[(($numInputSamples6)>>2)]=0;__label__=6;break $if_then$$lor_lhs_false$2;}
70054 else if(__label__==4){$retval=0;__label__=12;break $if_then$$lor_lhs_false$2;}}}while(0);$if_then$$if_end7$$return$8:do{if(__label__==2){var $8=$stream_addr;var $9=$speed;__ZL11changeSpeedP17sonicStreamStructf($8,$9);__label__=6;break $if_then$$if_end7$$return$8;}}while(0);$if_end7$$return$10:do{if(__label__==6){var $16=$stream_addr;var $pitch8=(($16+24)&4294967295);var $17=HEAPF32[(($pitch8)>>2)];var $cmp9=($17)!=1;if($cmp9){__label__=7;;}else{__label__=9;;}
70055 $if_then10$$if_end15$12:do{if(__label__==7){var $18=$stream_addr;var $19=$originalNumOutputSamples;var $call11=__ZL11adjustPitchP17sonicStreamStructi($18,$19);var $tobool12=((($call11))|0)!=0;if($tobool12){__label__=9;break $if_then10$$if_end15$12;}
70056 $retval=0;__label__=12;break $if_end7$$return$10;}}while(0);var $20=$stream_addr;var $volume=(($20+20)&4294967295);var $21=HEAPF32[(($volume)>>2)];var $cmp16=($21)!=1;if($cmp16){__label__=10;;}else{__label__=11;;}
70057 if(__label__==10){var $22=$stream_addr;var $outputBuffer=(($22+4)&4294967295);var $23=HEAP32[(($outputBuffer)>>2)];var $24=$originalNumOutputSamples;var $25=$stream_addr;var $numChannels=(($25+28)&4294967295);var $26=HEAP32[(($numChannels)>>2)];var $mul=((($26)*($24))&4294967295);var $add_ptr=(($23+2*$mul)&4294967295);var $27=$stream_addr;var $numOutputSamples18=(($27+48)&4294967295);var $28=HEAP32[(($numOutputSamples18)>>2)];var $29=$originalNumOutputSamples;var $sub=((($28)-($29))&4294967295);var $30=$stream_addr;var $numChannels19=(($30+28)&4294967295);var $31=HEAP32[(($numChannels19)>>2)];var $mul20=((($31)*($sub))&4294967295);var $32=$stream_addr;var $volume21=(($32+20)&4294967295);var $33=HEAPF32[(($volume21)>>2)];__ZL12scaleSamplesPsif($add_ptr,$mul20,$33);;}
70058 $retval=1;;}}while(0);var $34=$retval;;return $34;return null;}
70059 function __ZL28addShortSamplesToInputBufferP17sonicStreamStructPsi($stream,$samples,$numSamples){;var __label__;var $retval;var $stream_addr;var $samples_addr;var $numSamples_addr;$stream_addr=$stream;$samples_addr=$samples;$numSamples_addr=$numSamples;var $0=$numSamples_addr;var $cmp=((($0))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
70060 if(__label__==1){$retval=1;;}
70061 else if(__label__==2){var $1=$stream_addr;var $2=$numSamples_addr;var $call=__ZL26enlargeInputBufferIfNeededP17sonicStreamStructi($1,$2);var $tobool=((($call))|0)!=0;if($tobool){__label__=4;;}else{__label__=3;;}
70062 if(__label__==4){var $3=$stream_addr;var $inputBuffer=(($3)&4294967295);var $4=HEAP32[(($inputBuffer)>>2)];var $5=$stream_addr;var $numInputSamples=(($5+44)&4294967295);var $6=HEAP32[(($numInputSamples)>>2)];var $7=$stream_addr;var $numChannels=(($7+28)&4294967295);var $8=HEAP32[(($numChannels)>>2)];var $mul=((($8)*($6))&4294967295);var $add_ptr=(($4+2*$mul)&4294967295);var $9=$add_ptr;var $10=$samples_addr;var $11=$10;var $12=$numSamples_addr;var $13=$stream_addr;var $numChannels4=(($13+28)&4294967295);var $14=HEAP32[(($numChannels4)>>2)];var $mul3=((($12)*2)&4294967295);var $mul5=((($mul3)*($14))&4294967295);var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$11;$dest$=$9;$stop$=$src$+$mul5;if(($dest$%4)==($src$%4)&&$mul5>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
70063 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
70064 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $15=$numSamples_addr;var $16=$stream_addr;var $numInputSamples6=(($16+44)&4294967295);var $17=HEAP32[(($numInputSamples6)>>2)];var $add=((($17)+($15))&4294967295);HEAP32[(($numInputSamples6)>>2)]=$add;$retval=1;;}
70065 else if(__label__==3){$retval=0;;}}
70066 var $18=$retval;;return $18;return null;}
70067 function _sonicWriteUnsignedCharToStream($stream,$samples,$numSamples){;var __label__;var $retval;var $stream_addr;var $samples_addr;var $numSamples_addr;$stream_addr=$stream;$samples_addr=$samples;$numSamples_addr=$numSamples;var $0=$stream_addr;var $1=$samples_addr;var $2=$numSamples_addr;var $call=__ZL35addUnsignedCharSamplesToInputBufferP17sonicStreamStructPhi($0,$1,$2);var $tobool=((($call))|0)!=0;if($tobool){__label__=2;;}else{__label__=1;;}
70068 if(__label__==2){var $3=$stream_addr;var $call1=__ZL18processStreamInputP17sonicStreamStruct($3);$retval=$call1;;}
70069 else if(__label__==1){$retval=0;;}
70070 var $4=$retval;;return $4;return null;}
70071 function __ZL35addUnsignedCharSamplesToInputBufferP17sonicStreamStructPhi($stream,$samples,$numSamples){;var __label__;var $retval;var $stream_addr;var $samples_addr;var $numSamples_addr;var $buffer;var $count;$stream_addr=$stream;$samples_addr=$samples;$numSamples_addr=$numSamples;var $0=$numSamples_addr;var $1=$stream_addr;var $numChannels=(($1+28)&4294967295);var $2=HEAP32[(($numChannels)>>2)];var $mul=((($2)*($0))&4294967295);$count=$mul;var $3=$numSamples_addr;var $cmp=((($3))|0)==0;if($cmp){__label__=1;;}else{__label__=2;;}
70072 if(__label__==1){$retval=1;;}
70073 else if(__label__==2){var $4=$stream_addr;var $5=$numSamples_addr;var $call=__ZL26enlargeInputBufferIfNeededP17sonicStreamStructi($4,$5);var $tobool=((($call))|0)!=0;if($tobool){__label__=4;;}else{__label__=3;;}
70074 if(__label__==4){var $6=$stream_addr;var $inputBuffer=(($6)&4294967295);var $7=HEAP32[(($inputBuffer)>>2)];var $8=$stream_addr;var $numInputSamples=(($8+44)&4294967295);var $9=HEAP32[(($numInputSamples)>>2)];var $10=$stream_addr;var $numChannels3=(($10+28)&4294967295);var $11=HEAP32[(($numChannels3)>>2)];var $mul4=((($11)*($9))&4294967295);var $add_ptr=(($7+2*$mul4)&4294967295);$buffer=$add_ptr;var $12=$count;var $dec1=((($12)-1)&4294967295);$count=$dec1;var $tobool52=((($12))|0)!=0;if($tobool52){__label__=5;;}else{__label__=6;;}
70075 $while_body$$while_end$7:do{if(__label__==5){while(1){var $13=$samples_addr;var $incdec_ptr=(($13+1)&4294967295);$samples_addr=$incdec_ptr;var $14=HEAPU8[($13)];var $conv=((($14))&255);var $sub=((($conv)-128)&4294967295);var $shl=($sub)<<8;var $conv6=((($shl))&65535);var $15=$buffer;var $incdec_ptr7=(($15+2)&4294967295);$buffer=$incdec_ptr7;HEAP16[(($15)>>1)]=$conv6;var $16=$count;var $dec=((($16)-1)&4294967295);$count=$dec;var $tobool5=((($16))|0)!=0;if($tobool5){__label__=5;continue;}else{__label__=6;break $while_body$$while_end$7;}}}}while(0);var $17=$numSamples_addr;var $18=$stream_addr;var $numInputSamples8=(($18+44)&4294967295);var $19=HEAP32[(($numInputSamples8)>>2)];var $add=((($19)+($17))&4294967295);HEAP32[(($numInputSamples8)>>2)]=$add;$retval=1;;}
70076 else if(__label__==3){$retval=0;;}}
70077 var $20=$retval;;return $20;return null;}
70078 function _sonicChangeFloatSpeed($samples,$numSamples,$speed,$pitch,$volume,$sampleRate,$numChannels){;var __label__;var $samples_addr;var $numSamples_addr;var $speed_addr;var $pitch_addr;var $volume_addr;var $sampleRate_addr;var $numChannels_addr;var $stream;$samples_addr=$samples;$numSamples_addr=$numSamples;$speed_addr=$speed;$pitch_addr=$pitch;$volume_addr=$volume;$sampleRate_addr=$sampleRate;$numChannels_addr=$numChannels;var $0=$sampleRate_addr;var $1=$numChannels_addr;var $call=_sonicCreateStream($0,$1);$stream=$call;var $2=$stream;var $3=$speed_addr;_sonicSetSpeed($2,$3);var $4=$stream;var $5=$pitch_addr;_sonicSetPitch($4,$5);var $6=$stream;var $7=$volume_addr;_sonicSetVolume($6,$7);var $8=$stream;var $9=$samples_addr;var $10=$numSamples_addr;var $call1=_sonicWriteFloatToStream($8,$9,$10);var $11=$stream;var $call2=_sonicFlushStream($11);var $12=$stream;var $call3=_sonicSamplesAvailable($12);$numSamples_addr=$call3;var $13=$stream;var $14=$samples_addr;var $15=$numSamples_addr;var $call4=_sonicReadFloatFromStream($13,$14,$15);var $16=$stream;_sonicDestroyStream($16);var $17=$numSamples_addr;;return $17;return null;}
70079 function _sonicChangeShortSpeed($samples,$numSamples,$speed,$pitch,$volume,$sampleRate,$numChannels){;var __label__;var $samples_addr;var $numSamples_addr;var $speed_addr;var $pitch_addr;var $volume_addr;var $sampleRate_addr;var $numChannels_addr;var $stream;$samples_addr=$samples;$numSamples_addr=$numSamples;$speed_addr=$speed;$pitch_addr=$pitch;$volume_addr=$volume;$sampleRate_addr=$sampleRate;$numChannels_addr=$numChannels;var $0=$sampleRate_addr;var $1=$numChannels_addr;var $call=_sonicCreateStream($0,$1);$stream=$call;var $2=$stream;var $3=$speed_addr;_sonicSetSpeed($2,$3);var $4=$stream;var $5=$pitch_addr;_sonicSetPitch($4,$5);var $6=$stream;var $7=$volume_addr;_sonicSetVolume($6,$7);var $8=$stream;var $9=$samples_addr;var $10=$numSamples_addr;var $call1=_sonicWriteShortToStream($8,$9,$10);var $11=$stream;var $call2=_sonicFlushStream($11);var $12=$stream;var $call3=_sonicSamplesAvailable($12);$numSamples_addr=$call3;var $13=$stream;var $14=$samples_addr;var $15=$numSamples_addr;var $call4=_sonicReadShortFromStream($13,$14,$15);var $16=$stream;_sonicDestroyStream($16);var $17=$numSamples_addr;;return $17;return null;}
70080 function __ZL26enlargeInputBufferIfNeededP17sonicStreamStructi($stream,$numSamples){;var __label__;var $retval;var $stream_addr;var $numSamples_addr;$stream_addr=$stream;$numSamples_addr=$numSamples;var $0=$stream_addr;var $numInputSamples=(($0+44)&4294967295);var $1=HEAP32[(($numInputSamples)>>2)];var $2=$numSamples_addr;var $add=((($2)+($1))&4294967295);var $3=$stream_addr;var $inputBufferSize=(($3+32)&4294967295);var $4=HEAP32[(($inputBufferSize)>>2)];var $cmp=((($add))|0)>((($4))|0);if($cmp){__label__=1;;}else{__label__=3;;}
70081 $if_then$$if_end11$2:do{if(__label__==1){var $5=$stream_addr;var $inputBufferSize1=(($5+32)&4294967295);var $6=HEAP32[(($inputBufferSize1)>>2)];var $shr=($6)>>1;var $7=$numSamples_addr;var $8=$stream_addr;var $inputBufferSize3=(($8+32)&4294967295);var $9=HEAP32[(($inputBufferSize3)>>2)];var $add2=((($shr)+($7))&4294967295);var $add4=((($add2)+($9))&4294967295);HEAP32[(($inputBufferSize3)>>2)]=$add4;var $10=$stream_addr;var $inputBuffer=(($10)&4294967295);var $11=HEAP32[(($inputBuffer)>>2)];var $12=$11;var $13=$stream_addr;var $inputBufferSize5=(($13+32)&4294967295);var $14=HEAP32[(($inputBufferSize5)>>2)];var $15=$stream_addr;var $numChannels=(($15+28)&4294967295);var $16=HEAP32[(($numChannels)>>2)];var $mul=((($14)*2)&4294967295);var $mul6=((($mul)*($16))&4294967295);var $call=_realloc($12,$mul6);var $17=$call;var $18=$stream_addr;var $inputBuffer7=(($18)&4294967295);HEAP32[(($inputBuffer7)>>2)]=$17;var $19=$stream_addr;var $inputBuffer8=(($19)&4294967295);var $20=HEAP32[(($inputBuffer8)>>2)];var $cmp9=((($20))|0)==0;if(!($cmp9)){__label__=3;break $if_then$$if_end11$2;}
70082 $retval=0;__label__=4;break $if_then$$if_end11$2;}}while(0);if(__label__==3){$retval=1;;}
70083 var $21=$retval;;return $21;return null;}
70084 function __ZL11changeSpeedP17sonicStreamStructf($stream,$speed){;var __label__;var __lastLabel__=null;var $retval;var $stream_addr;var $speed_addr;var $samples;var $numSamples;var $position;var $period;var $newSamples;var $maxRequired;$stream_addr=$stream;$speed_addr=$speed;var $0=$stream_addr;var $numInputSamples=(($0+44)&4294967295);var $1=HEAP32[(($numInputSamples)>>2)];$numSamples=$1;$position=0;var $2=$stream_addr;var $maxRequired1=(($2+64)&4294967295);var $3=HEAP32[(($maxRequired1)>>2)];$maxRequired=$3;var $4=$stream_addr;var $numInputSamples2=(($4+44)&4294967295);var $5=HEAP32[(($numInputSamples2)>>2)];var $6=$maxRequired;var $cmp=((($5))|0)<((($6))|0);if($cmp){__label__=1;;}else{__label__=2;;}
70085 if(__label__==1){$retval=1;;}
70086 else if(__label__==2){while(1){var $7=$stream_addr;var $remainingInputToCopy=(($7+68)&4294967295);var $8=HEAP32[(($remainingInputToCopy)>>2)];var $cmp3=((($8))|0)>0;var $9=$stream_addr;if($cmp3){__label__=3;;}else{__label__=4;;}
70087 if(__label__==3){var $10=$position;var $call=__ZL17copyInputToOutputP17sonicStreamStructi($9,$10);$newSamples=$call;var $11=$newSamples;var $12=$position;var $add=((($12)+($11))&4294967295);$position=$add;__lastLabel__=3;;}
70088 else if(__label__==4){var $inputBuffer=(($9)&4294967295);var $13=HEAP32[(($inputBuffer)>>2)];var $14=$position;var $15=$stream_addr;var $numChannels=(($15+28)&4294967295);var $16=HEAP32[(($numChannels)>>2)];var $mul=((($16)*($14))&4294967295);var $add_ptr=(($13+2*$mul)&4294967295);$samples=$add_ptr;var $17=$stream_addr;var $18=$samples;var $call5=__ZL15findPitchPeriodP17sonicStreamStructPs($17,$18);$period=$call5;var $19=$speed_addr;var $conv=($19);var $cmp6=($conv)>1;var $20=$stream_addr;var $21=$samples;var $22=$speed_addr;var $23=$period;if($cmp6){__label__=5;;}else{__label__=6;;}
70089 if(__label__==5){var $call8=__ZL15skipPitchPeriodP17sonicStreamStructPsfi($20,$21,$22,$23);$newSamples=$call8;var $24=$period;var $25=$newSamples;var $26=$position;var $add9=((($25)+($24))&4294967295);var $add10=((($add9)+($26))&4294967295);$position=$add10;__lastLabel__=5;;}
70090 else if(__label__==6){var $call12=__ZL17insertPitchPeriodP17sonicStreamStructPsfi($20,$21,$22,$23);$newSamples=$call12;var $27=$newSamples;var $28=$position;var $add13=((($28)+($27))&4294967295);$position=$add13;__lastLabel__=6;;}}
70091 var $29=__lastLabel__==5?$25:(__lastLabel__==6?$27:($11));var $cmp16=((($29))|0)==0;if($cmp16){__label__=8;break;}
70092 var $30=$position;var $31=$maxRequired;var $add19=((($31)+($30))&4294967295);var $32=$numSamples;var $cmp20=((($add19))|0)<=((($32))|0);if($cmp20){__label__=2;continue;}else{__label__=10;break;}}
70093 if(__label__==8){$retval=0;;}
70094 else if(__label__==10){var $33=$stream_addr;var $34=$position;__ZL18removeInputSamplesP17sonicStreamStructi($33,$34);$retval=1;;}};return;return;}
70095 function __ZL12copyToOutputP17sonicStreamStructPsi($stream,$samples,$numSamples){;var __label__;var $retval;var $stream_addr;var $samples_addr;var $numSamples_addr;$stream_addr=$stream;$samples_addr=$samples;$numSamples_addr=$numSamples;var $0=$stream_addr;var $1=$numSamples_addr;var $call=__ZL27enlargeOutputBufferIfNeededP17sonicStreamStructi($0,$1);var $tobool=((($call))|0)!=0;if($tobool){__label__=2;;}else{__label__=1;;}
70096 if(__label__==2){var $2=$stream_addr;var $outputBuffer=(($2+4)&4294967295);var $3=HEAP32[(($outputBuffer)>>2)];var $4=$stream_addr;var $numOutputSamples=(($4+48)&4294967295);var $5=HEAP32[(($numOutputSamples)>>2)];var $6=$stream_addr;var $numChannels=(($6+28)&4294967295);var $7=HEAP32[(($numChannels)>>2)];var $mul=((($7)*($5))&4294967295);var $add_ptr=(($3+2*$mul)&4294967295);var $8=$add_ptr;var $9=$samples_addr;var $10=$9;var $11=$numSamples_addr;var $12=$stream_addr;var $numChannels2=(($12+28)&4294967295);var $13=HEAP32[(($numChannels2)>>2)];var $mul1=((($11)*2)&4294967295);var $mul3=((($mul1)*($13))&4294967295);var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$10;$dest$=$8;$stop$=$src$+$mul3;if(($dest$%4)==($src$%4)&&$mul3>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
70097 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
70098 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $14=$numSamples_addr;var $15=$stream_addr;var $numOutputSamples4=(($15+48)&4294967295);var $16=HEAP32[(($numOutputSamples4)>>2)];var $add=((($16)+($14))&4294967295);HEAP32[(($numOutputSamples4)>>2)]=$add;var $17=$numSamples_addr;$retval=$17;;}
70099 else if(__label__==1){$retval=0;;}
70100 var $18=$retval;;return $18;return null;}
70101 function __ZL11adjustPitchP17sonicStreamStructi($stream,$originalNumOutputSamples){;var __label__;var $retval;var $stream_addr;var $originalNumOutputSamples_addr;var $pitch;var $numChannels;var $period;var $newPeriod;var $separation;var $position;var $out;var $rampDown;var $rampUp;$stream_addr=$stream;$originalNumOutputSamples_addr=$originalNumOutputSamples;var $0=$stream_addr;var $pitch1=(($0+24)&4294967295);var $1=HEAPF32[(($pitch1)>>2)];$pitch=$1;var $2=$stream_addr;var $numChannels2=(($2+28)&4294967295);var $3=HEAP32[(($numChannels2)>>2)];$numChannels=$3;$position=0;var $4=$stream_addr;var $numOutputSamples=(($4+48)&4294967295);var $5=HEAP32[(($numOutputSamples)>>2)];var $6=$originalNumOutputSamples_addr;var $cmp=((($5))|0)==((($6))|0);if($cmp){__label__=1;;}else{__label__=2;;}
70102 if(__label__==1){$retval=1;;}
70103 else if(__label__==2){var $7=$stream_addr;var $8=$originalNumOutputSamples_addr;var $call=__ZL27moveNewSamplesToPitchBufferP17sonicStreamStructi($7,$8);var $tobool=((($call))|0)!=0;if($tobool){__label__=4;;}else{__label__=3;;}
70104 if(__label__==4){while(1){var $9=$stream_addr;var $numPitchSamples=(($9+52)&4294967295);var $10=HEAP32[(($numPitchSamples)>>2)];var $11=$position;var $sub=((($10)-($11))&4294967295);var $12=$stream_addr;var $maxRequired=(($12+64)&4294967295);var $13=HEAP32[(($maxRequired)>>2)];var $cmp5=((($sub))|0)>=((($13))|0);var $14=$stream_addr;if(!($cmp5)){__label__=11;break;}
70105 var $15=$stream_addr;var $pitchBuffer=(($15+8)&4294967295);var $16=HEAP32[(($pitchBuffer)>>2)];var $17=$position;var $18=$numChannels;var $mul=((($18)*($17))&4294967295);var $add_ptr=(($16+2*$mul)&4294967295);var $call6=__ZL15findPitchPeriodP17sonicStreamStructPs($14,$add_ptr);$period=$call6;var $19=$period;var $conv=((($19))|0);var $20=$pitch;var $div=($conv)/($20);var $conv7=((($div))|0);$newPeriod=$conv7;var $21=$stream_addr;var $22=$newPeriod;var $call8=__ZL27enlargeOutputBufferIfNeededP17sonicStreamStructi($21,$22);var $tobool9=((($call8))|0)!=0;if(!($tobool9)){__label__=6;break;}
70106 var $23=$stream_addr;var $outputBuffer=(($23+4)&4294967295);var $24=HEAP32[(($outputBuffer)>>2)];var $25=$stream_addr;var $numOutputSamples12=(($25+48)&4294967295);var $26=HEAP32[(($numOutputSamples12)>>2)];var $27=$numChannels;var $mul13=((($27)*($26))&4294967295);var $add_ptr14=(($24+2*$mul13)&4294967295);$out=$add_ptr14;var $28=$pitch;var $cmp15=($28)>=1;var $29=$stream_addr;var $pitchBuffer17=(($29+8)&4294967295);var $30=HEAP32[(($pitchBuffer17)>>2)];var $31=$position;var $32=$numChannels;var $mul18=((($32)*($31))&4294967295);var $add_ptr19=(($30+2*$mul18)&4294967295);$rampDown=$add_ptr19;var $33=$stream_addr;var $pitchBuffer20=(($33+8)&4294967295);var $34=HEAP32[(($pitchBuffer20)>>2)];var $35=$position;if($cmp15){__label__=8;;}else{__label__=9;;}
70107 if(__label__==8){var $36=$period;var $37=$newPeriod;var $_neg=(((-($37)))&4294967295);var $add=((($36)+($35))&4294967295);var $sub21=((($add)+($_neg))&4294967295);var $38=$numChannels;var $mul22=((($sub21)*($38))&4294967295);var $add_ptr23=(($34+2*$mul22)&4294967295);$rampUp=$add_ptr23;var $39=$newPeriod;var $40=$numChannels;var $41=$out;var $42=$rampDown;var $43=$rampUp;__ZL10overlapAddiiPsS_S_($39,$40,$41,$42,$43);;}
70108 else if(__label__==9){var $44=$numChannels;var $mul28=((($44)*($35))&4294967295);var $add_ptr29=(($34+2*$mul28)&4294967295);$rampUp=$add_ptr29;var $45=$newPeriod;var $46=$period;var $sub30=((($45)-($46))&4294967295);$separation=$sub30;var $47=$period;var $48=$numChannels;var $49=$separation;var $50=$out;var $51=$rampDown;var $52=$rampUp;__ZL24overlapAddWithSeparationiiiPsS_S_($47,$48,$49,$50,$51,$52);;}
70109 var $53=$newPeriod;var $54=$stream_addr;var $numOutputSamples32=(($54+48)&4294967295);var $55=HEAP32[(($numOutputSamples32)>>2)];var $add33=((($55)+($53))&4294967295);HEAP32[(($numOutputSamples32)>>2)]=$add33;var $56=$period;var $57=$position;var $add34=((($57)+($56))&4294967295);$position=$add34;__label__=4;continue;}
70110 if(__label__==11){var $58=$position;__ZL18removePitchSamplesP17sonicStreamStructi($14,$58);$retval=1;;}
70111 else if(__label__==6){$retval=0;;}}
70112 else if(__label__==3){$retval=0;;}}
70113 var $59=$retval;;return $59;return null;}
70114 function __ZL12scaleSamplesPsif($samples,$numSamples,$volume){;var __label__;var $samples_addr;var $numSamples_addr;var $volume_addr;var $fixedPointVolume;var $value;$samples_addr=$samples;$numSamples_addr=$numSamples;$volume_addr=$volume;var $0=$volume_addr;var $mul=($0)*4096;var $conv=((($mul))|0);$fixedPointVolume=$conv;var $1=$numSamples_addr;var $dec1=((($1)-1)&4294967295);$numSamples_addr=$dec1;var $tobool2=((($1))|0)!=0;if($tobool2){__label__=1;;}else{__label__=6;;}
70115 $while_body$$while_end$2:do{if(__label__==1){$while_body$3:while(1){var $2=$samples_addr;var $3=HEAP16[(($2)>>1)];var $conv1=(tempInt=(($3)),(tempInt>=32768?tempInt-65536:tempInt));var $4=$fixedPointVolume;var $mul2=((($conv1)*($4))&4294967295);var $shr=($mul2)>>12;$value=$shr;var $cmp=((($shr))|0)>32767;if($cmp){__label__=2;;}else{__label__=3;;}
70116 $if_then$$if_else$5:do{if(__label__==2){$value=32767;;}
70117 else if(__label__==3){var $5=$value;var $cmp3=((($5))|0)<-32767;if(!($cmp3)){__label__=5;break $if_then$$if_else$5;}
70118 $value=-32767;;}}while(0);var $6=$value;var $conv6=((($6))&65535);var $7=$samples_addr;var $incdec_ptr=(($7+2)&4294967295);$samples_addr=$incdec_ptr;HEAP16[(($7)>>1)]=$conv6;var $8=$numSamples_addr;var $dec=((($8)-1)&4294967295);$numSamples_addr=$dec;var $tobool=((($8))|0)!=0;if($tobool){__label__=1;continue $while_body$3;}else{__label__=6;break $while_body$$while_end$2;}}}}while(0);;return;return;}
70119 function __ZL27moveNewSamplesToPitchBufferP17sonicStreamStructi($stream,$originalNumOutputSamples){;var __label__;var $retval;var $stream_addr;var $originalNumOutputSamples_addr;var $numSamples;var $numChannels;$stream_addr=$stream;$originalNumOutputSamples_addr=$originalNumOutputSamples;var $0=$stream_addr;var $numOutputSamples=(($0+48)&4294967295);var $1=HEAP32[(($numOutputSamples)>>2)];var $2=$originalNumOutputSamples_addr;var $sub=((($1)-($2))&4294967295);$numSamples=$sub;var $3=$stream_addr;var $numChannels1=(($3+28)&4294967295);var $4=HEAP32[(($numChannels1)>>2)];$numChannels=$4;var $5=$stream_addr;var $numPitchSamples=(($5+52)&4294967295);var $6=HEAP32[(($numPitchSamples)>>2)];var $7=$numSamples;var $add=((($7)+($6))&4294967295);var $8=$stream_addr;var $pitchBufferSize=(($8+36)&4294967295);var $9=HEAP32[(($pitchBufferSize)>>2)];var $cmp=((($add))|0)>((($9))|0);if($cmp){__label__=1;;}else{__label__=3;;}
70120 $if_then$$if_end12$2:do{if(__label__==1){var $10=$stream_addr;var $pitchBufferSize2=(($10+36)&4294967295);var $11=HEAP32[(($pitchBufferSize2)>>2)];var $shr=($11)>>1;var $12=$numSamples;var $13=$stream_addr;var $pitchBufferSize4=(($13+36)&4294967295);var $14=HEAP32[(($pitchBufferSize4)>>2)];var $add3=((($shr)+($12))&4294967295);var $add5=((($add3)+($14))&4294967295);HEAP32[(($pitchBufferSize4)>>2)]=$add5;var $15=$stream_addr;var $pitchBuffer=(($15+8)&4294967295);var $16=HEAP32[(($pitchBuffer)>>2)];var $17=$16;var $18=$stream_addr;var $pitchBufferSize6=(($18+36)&4294967295);var $19=HEAP32[(($pitchBufferSize6)>>2)];var $20=$numChannels;var $mul=((($19)*2)&4294967295);var $mul7=((($mul)*($20))&4294967295);var $call=_realloc($17,$mul7);var $21=$call;var $22=$stream_addr;var $pitchBuffer8=(($22+8)&4294967295);HEAP32[(($pitchBuffer8)>>2)]=$21;var $23=$stream_addr;var $pitchBuffer9=(($23+8)&4294967295);var $24=HEAP32[(($pitchBuffer9)>>2)];var $cmp10=((($24))|0)==0;if(!($cmp10)){__label__=3;break $if_then$$if_end12$2;}
70121 $retval=0;__label__=4;break $if_then$$if_end12$2;}}while(0);if(__label__==3){var $25=$stream_addr;var $pitchBuffer13=(($25+8)&4294967295);var $26=HEAP32[(($pitchBuffer13)>>2)];var $27=$stream_addr;var $numPitchSamples14=(($27+52)&4294967295);var $28=HEAP32[(($numPitchSamples14)>>2)];var $29=$numChannels;var $mul15=((($29)*($28))&4294967295);var $add_ptr=(($26+2*$mul15)&4294967295);var $30=$add_ptr;var $31=$stream_addr;var $outputBuffer=(($31+4)&4294967295);var $32=HEAP32[(($outputBuffer)>>2)];var $33=$originalNumOutputSamples_addr;var $34=$numChannels;var $mul16=((($34)*($33))&4294967295);var $add_ptr17=(($32+2*$mul16)&4294967295);var $35=$add_ptr17;var $36=$numSamples;var $37=$numChannels;var $mul18=((($36)*2)&4294967295);var $mul19=((($mul18)*($37))&4294967295);var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$35;$dest$=$30;$stop$=$src$+$mul19;if(($dest$%4)==($src$%4)&&$mul19>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
70122 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
70123 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $38=$originalNumOutputSamples_addr;var $39=$stream_addr;var $numOutputSamples20=(($39+48)&4294967295);HEAP32[(($numOutputSamples20)>>2)]=$38;var $40=$numSamples;var $41=$stream_addr;var $numPitchSamples21=(($41+52)&4294967295);var $42=HEAP32[(($numPitchSamples21)>>2)];var $add22=((($42)+($40))&4294967295);HEAP32[(($numPitchSamples21)>>2)]=$add22;$retval=1;;}
70124 var $43=$retval;;return $43;return null;}
70125 function __ZL15findPitchPeriodP17sonicStreamStructPs($stream,$samples){var __stackBase__=STACKTOP;STACKTOP+=8;_memset(__stackBase__,0,8);var __label__;var $stream_addr;var $samples_addr;var $minPeriod;var $maxPeriod;var $sampleRate;var $minDiff=__stackBase__;var $maxDiff=__stackBase__+4;var $retPeriod;var $skip;var $period;$stream_addr=$stream;$samples_addr=$samples;var $0=$stream_addr;var $minPeriod1=(($0+56)&4294967295);var $1=HEAP32[(($minPeriod1)>>2)];$minPeriod=$1;var $2=$stream_addr;var $maxPeriod2=(($2+60)&4294967295);var $3=HEAP32[(($maxPeriod2)>>2)];$maxPeriod=$3;var $4=$stream_addr;var $sampleRate3=(($4+72)&4294967295);var $5=HEAP32[(($sampleRate3)>>2)];$sampleRate=$5;$skip=1;var $6=$sampleRate;var $cmp=((($6))|0)>4000;if($cmp){__label__=1;;}else{__label__=2;;}
70126 if(__label__==1){var $7=$sampleRate;var $div=((((($7))|0)/4000)|0);$skip=$div;;}
70127 var $8=$stream_addr;var $numChannels=(($8+28)&4294967295);var $9=HEAP32[(($numChannels)>>2)];var $cmp4=((($9))|0)==1;if($cmp4){__label__=3;;}else{__label__=5;;}
70128 $land_lhs_true$$if_else$5:do{if(__label__==3){var $10=$skip;var $cmp5=((($10))|0)==1;if(!($cmp5)){__label__=5;break $land_lhs_true$$if_else$5;}
70129 var $11=$samples_addr;var $12=$minPeriod;var $13=$maxPeriod;var $call=__ZL22findPitchPeriodInRangePsiiPiS0_($11,$12,$13,$minDiff,$maxDiff);$period=$call;__label__=13;break $land_lhs_true$$if_else$5;}}while(0);$if_end32$$if_else$8:do{if(__label__==5){var $14=$stream_addr;var $15=$samples_addr;var $16=$skip;__ZL15downSampleInputP17sonicStreamStructPsi($14,$15,$16);var $17=$stream_addr;var $downSampleBuffer=(($17+12)&4294967295);var $18=HEAP32[(($downSampleBuffer)>>2)];var $19=$minPeriod;var $20=$skip;var $div7=((((($19))|0)/((($20))|0))|0);var $21=$maxPeriod;var $22=$skip;var $div8=((((($21))|0)/((($22))|0))|0);var $call9=__ZL22findPitchPeriodInRangePsiiPiS0_($18,$div7,$div8,$minDiff,$maxDiff);$period=$call9;var $23=$skip;var $cmp10=((($23))|0)!=1;if(!($cmp10)){__label__=13;break $if_end32$$if_else$8;}
70130 var $24=$skip;var $25=$period;var $mul=((($25)*($24))&4294967295);$period=$mul;var $26=$period;var $27=$skip;var $shl=($27)<<2;var $sub=((($26)-($shl))&4294967295);$minPeriod=$sub;var $28=$period;var $29=$skip;var $shl12=((($29)*4)&4294967295);var $add=((($shl12)+($28))&4294967295);$maxPeriod=$add;var $30=$minPeriod;var $31=$stream_addr;var $minPeriod13=(($31+56)&4294967295);var $32=HEAP32[(($minPeriod13)>>2)];var $cmp14=((($30))|0)<((($32))|0);if($cmp14){__label__=7;;}else{__label__=8;;}
70131 if(__label__==7){var $33=$stream_addr;var $minPeriod16=(($33+56)&4294967295);var $34=HEAP32[(($minPeriod16)>>2)];$minPeriod=$34;;}
70132 var $35=$maxPeriod;var $36=$stream_addr;var $maxPeriod18=(($36+60)&4294967295);var $37=HEAP32[(($maxPeriod18)>>2)];var $cmp19=((($35))|0)>((($37))|0);if($cmp19){__label__=9;;}else{__label__=10;;}
70133 if(__label__==9){var $38=$stream_addr;var $maxPeriod21=(($38+60)&4294967295);var $39=HEAP32[(($maxPeriod21)>>2)];$maxPeriod=$39;;}
70134 var $40=$stream_addr;var $numChannels23=(($40+28)&4294967295);var $41=HEAP32[(($numChannels23)>>2)];var $cmp24=((($41))|0)==1;if($cmp24){__label__=11;;}else{__label__=12;;}
70135 if(__label__==11){var $42=$samples_addr;var $43=$minPeriod;var $44=$maxPeriod;var $call26=__ZL22findPitchPeriodInRangePsiiPiS0_($42,$43,$44,$minDiff,$maxDiff);$period=$call26;;}
70136 else if(__label__==12){var $45=$stream_addr;var $46=$samples_addr;__ZL15downSampleInputP17sonicStreamStructPsi($45,$46,1);var $47=$stream_addr;var $downSampleBuffer28=(($47+12)&4294967295);var $48=HEAP32[(($downSampleBuffer28)>>2)];var $49=$minPeriod;var $50=$maxPeriod;var $call29=__ZL22findPitchPeriodInRangePsiiPiS0_($48,$49,$50,$minDiff,$maxDiff);$period=$call29;;}}}while(0);var $51=$stream_addr;var $52=$period;var $53=HEAP32[(($minDiff)>>2)];var $54=HEAP32[(($maxDiff)>>2)];var $call33=__ZL16prevPeriodBetterP17sonicStreamStructiii($51,$52,$53,$54);var $tobool=((($call33))|0)!=0;if($tobool){__label__=14;;}else{__label__=15;;}
70137 if(__label__==14){var $55=$stream_addr;var $prevPeriod=(($55+76)&4294967295);var $56=HEAP32[(($prevPeriod)>>2)];$retPeriod=$56;;}
70138 else if(__label__==15){var $57=$period;$retPeriod=$57;;}
70139 var $58=HEAP32[(($minDiff)>>2)];var $59=$stream_addr;var $prevMinDiff=(($59+84)&4294967295);HEAP32[(($prevMinDiff)>>2)]=$58;var $60=HEAP32[(($maxDiff)>>2)];var $61=$stream_addr;var $prevMaxDiff=(($61+80)&4294967295);HEAP32[(($prevMaxDiff)>>2)]=$60;var $62=$period;var $63=$stream_addr;var $prevPeriod37=(($63+76)&4294967295);HEAP32[(($prevPeriod37)>>2)]=$62;var $64=$retPeriod;STACKTOP=__stackBase__;return $64;return null;}
70140 function __ZL27enlargeOutputBufferIfNeededP17sonicStreamStructi($stream,$numSamples){;var __label__;var $retval;var $stream_addr;var $numSamples_addr;$stream_addr=$stream;$numSamples_addr=$numSamples;var $0=$stream_addr;var $numOutputSamples=(($0+48)&4294967295);var $1=HEAP32[(($numOutputSamples)>>2)];var $2=$numSamples_addr;var $add=((($2)+($1))&4294967295);var $3=$stream_addr;var $outputBufferSize=(($3+40)&4294967295);var $4=HEAP32[(($outputBufferSize)>>2)];var $cmp=((($add))|0)>((($4))|0);if($cmp){__label__=1;;}else{__label__=3;;}
70141 $if_then$$if_end11$2:do{if(__label__==1){var $5=$stream_addr;var $outputBufferSize1=(($5+40)&4294967295);var $6=HEAP32[(($outputBufferSize1)>>2)];var $shr=($6)>>1;var $7=$numSamples_addr;var $8=$stream_addr;var $outputBufferSize3=(($8+40)&4294967295);var $9=HEAP32[(($outputBufferSize3)>>2)];var $add2=((($shr)+($7))&4294967295);var $add4=((($add2)+($9))&4294967295);HEAP32[(($outputBufferSize3)>>2)]=$add4;var $10=$stream_addr;var $outputBuffer=(($10+4)&4294967295);var $11=HEAP32[(($outputBuffer)>>2)];var $12=$11;var $13=$stream_addr;var $outputBufferSize5=(($13+40)&4294967295);var $14=HEAP32[(($outputBufferSize5)>>2)];var $15=$stream_addr;var $numChannels=(($15+28)&4294967295);var $16=HEAP32[(($numChannels)>>2)];var $mul=((($14)*2)&4294967295);var $mul6=((($mul)*($16))&4294967295);var $call=_realloc($12,$mul6);var $17=$call;var $18=$stream_addr;var $outputBuffer7=(($18+4)&4294967295);HEAP32[(($outputBuffer7)>>2)]=$17;var $19=$stream_addr;var $outputBuffer8=(($19+4)&4294967295);var $20=HEAP32[(($outputBuffer8)>>2)];var $cmp9=((($20))|0)==0;if(!($cmp9)){__label__=3;break $if_then$$if_end11$2;}
70142 $retval=0;__label__=4;break $if_then$$if_end11$2;}}while(0);if(__label__==3){$retval=1;;}
70143 var $21=$retval;;return $21;return null;}
70144 function __ZL10overlapAddiiPsS_S_($numSamples,$numChannels,$out,$rampDown,$rampUp){;var __label__;var $numSamples_addr;var $numChannels_addr;var $out_addr;var $rampDown_addr;var $rampUp_addr;var $o;var $u;var $d;var $i;var $t;$numSamples_addr=$numSamples;$numChannels_addr=$numChannels;$out_addr=$out;$rampDown_addr=$rampDown;$rampUp_addr=$rampUp;$i=0;var $0=$i;var $1=$numChannels_addr;var $cmp2=((($0))|0)<((($1))|0);if($cmp2){__label__=1;;}else{__label__=4;;}
70145 $for_body$$for_end14$2:do{if(__label__==1){$for_body$3:while(1){var $2=$out_addr;var $3=$i;var $add_ptr=(($2+2*$3)&4294967295);$o=$add_ptr;var $4=$rampUp_addr;var $5=$i;var $add_ptr1=(($4+2*$5)&4294967295);$u=$add_ptr1;var $6=$rampDown_addr;var $7=$i;var $add_ptr2=(($6+2*$7)&4294967295);$d=$add_ptr2;$t=0;var $8=$t;var $9=$numSamples_addr;var $cmp41=((($8))|0)<((($9))|0);if($cmp41){__label__=2;;}else{__label__=3;;}
70146 $for_body5$$for_inc12$5:do{if(__label__==2){while(1){var $10=$d;var $11=HEAP16[(($10)>>1)];var $conv=(tempInt=(($11)),(tempInt>=32768?tempInt-65536:tempInt));var $12=$numSamples_addr;var $13=$t;var $sub=((($12)-($13))&4294967295);var $mul=((($sub)*($conv))&4294967295);var $14=$u;var $15=HEAP16[(($14)>>1)];var $conv6=(tempInt=(($15)),(tempInt>=32768?tempInt-65536:tempInt));var $16=$t;var $mul7=((($conv6)*($16))&4294967295);var $add=((($mul7)+($mul))&4294967295);var $17=$numSamples_addr;var $div=((((($add))|0)/((($17))|0))|0);var $conv8=((($div))&65535);var $18=$o;HEAP16[(($18)>>1)]=$conv8;var $19=$numChannels_addr;var $20=$o;var $add_ptr9=(($20+2*$19)&4294967295);$o=$add_ptr9;var $21=$numChannels_addr;var $22=$d;var $add_ptr10=(($22+2*$21)&4294967295);$d=$add_ptr10;var $23=$numChannels_addr;var $24=$u;var $add_ptr11=(($24+2*$23)&4294967295);$u=$add_ptr11;var $25=$t;var $inc=((($25)+1)&4294967295);$t=$inc;var $26=$t;var $27=$numSamples_addr;var $cmp4=((($26))|0)<((($27))|0);if($cmp4){__label__=2;continue;}else{__label__=3;break $for_body5$$for_inc12$5;}}}}while(0);var $28=$i;var $inc13=((($28)+1)&4294967295);$i=$inc13;var $29=$i;var $30=$numChannels_addr;var $cmp=((($29))|0)<((($30))|0);if($cmp){__label__=1;continue $for_body$3;}else{__label__=4;break $for_body$$for_end14$2;}}}}while(0);;return;return;}
70147 function __ZL24overlapAddWithSeparationiiiPsS_S_($numSamples,$numChannels,$separation,$out,$rampDown,$rampUp){;var __label__;var $numSamples_addr;var $numChannels_addr;var $separation_addr;var $out_addr;var $rampDown_addr;var $rampUp_addr;var $o;var $u;var $d;var $i;var $t;$numSamples_addr=$numSamples;$numChannels_addr=$numChannels;$separation_addr=$separation;$out_addr=$out;$rampDown_addr=$rampDown;$rampUp_addr=$rampUp;$i=0;var $0=$i;var $1=$numChannels_addr;var $cmp3=((($0))|0)<((($1))|0);if($cmp3){__label__=1;;}else{__label__=9;;}
70148 $for_body$$for_end33$2:do{if(__label__==1){$for_body$3:while(1){var $2=$out_addr;var $3=$i;var $add_ptr=(($2+2*$3)&4294967295);$o=$add_ptr;var $4=$rampUp_addr;var $5=$i;var $add_ptr1=(($4+2*$5)&4294967295);$u=$add_ptr1;var $6=$rampDown_addr;var $7=$i;var $add_ptr2=(($6+2*$7)&4294967295);$d=$add_ptr2;$t=0;var $8=$t;var $9=$numSamples_addr;var $10=$separation_addr;var $add1=((($10)+($9))&4294967295);var $cmp42=((($8))|0)<((($add1))|0);if($cmp42){__label__=2;;}else{__label__=8;;}
70149 $for_body5$$for_inc31$5:do{if(__label__==2){while(1){var $11=$t;var $12=$separation_addr;var $cmp6=((($11))|0)<((($12))|0);if($cmp6){__label__=3;;}else{__label__=4;;}
70150 if(__label__==3){var $13=$d;var $14=HEAP16[(($13)>>1)];var $conv=(tempInt=(($14)),(tempInt>=32768?tempInt-65536:tempInt));var $15=$numSamples_addr;var $16=$t;var $sub=((($15)-($16))&4294967295);var $mul=((($sub)*($conv))&4294967295);var $17=$numSamples_addr;var $div=((((($mul))|0)/((($17))|0))|0);var $conv7=((($div))&65535);var $18=$o;HEAP16[(($18)>>1)]=$conv7;var $19=$numChannels_addr;var $20=$d;var $add_ptr8=(($20+2*$19)&4294967295);$d=$add_ptr8;;}
70151 else if(__label__==4){var $21=$t;var $22=$numSamples_addr;var $cmp9=((($21))|0)<((($22))|0);if($cmp9){__label__=5;;}else{__label__=6;;}
70152 if(__label__==5){var $23=$d;var $24=HEAP16[(($23)>>1)];var $conv11=(tempInt=(($24)),(tempInt>=32768?tempInt-65536:tempInt));var $25=$numSamples_addr;var $26=$t;var $sub12=((($25)-($26))&4294967295);var $mul13=((($sub12)*($conv11))&4294967295);var $27=$u;var $28=HEAP16[(($27)>>1)];var $conv14=(tempInt=(($28)),(tempInt>=32768?tempInt-65536:tempInt));var $29=$t;var $30=$separation_addr;var $sub15=((($29)-($30))&4294967295);var $mul16=((($sub15)*($conv14))&4294967295);var $add17=((($mul16)+($mul13))&4294967295);var $31=$numSamples_addr;var $div18=((((($add17))|0)/((($31))|0))|0);var $conv19=((($div18))&65535);var $32=$o;HEAP16[(($32)>>1)]=$conv19;var $33=$numChannels_addr;var $34=$d;var $add_ptr20=(($34+2*$33)&4294967295);$d=$add_ptr20;var $35=$numChannels_addr;var $36=$u;var $add_ptr21=(($36+2*$35)&4294967295);$u=$add_ptr21;;}
70153 else if(__label__==6){var $37=$u;var $38=HEAP16[(($37)>>1)];var $conv23=(tempInt=(($38)),(tempInt>=32768?tempInt-65536:tempInt));var $39=$t;var $40=$separation_addr;var $sub24=((($39)-($40))&4294967295);var $mul25=((($sub24)*($conv23))&4294967295);var $41=$numSamples_addr;var $div26=((((($mul25))|0)/((($41))|0))|0);var $conv27=((($div26))&65535);var $42=$o;HEAP16[(($42)>>1)]=$conv27;var $43=$numChannels_addr;var $44=$u;var $add_ptr28=(($44+2*$43)&4294967295);$u=$add_ptr28;;}}
70154 var $45=$numChannels_addr;var $46=$o;var $add_ptr30=(($46+2*$45)&4294967295);$o=$add_ptr30;var $47=$t;var $inc=((($47)+1)&4294967295);$t=$inc;var $48=$t;var $49=$numSamples_addr;var $50=$separation_addr;var $add=((($50)+($49))&4294967295);var $cmp4=((($48))|0)<((($add))|0);if($cmp4){__label__=2;continue;}else{__label__=8;break $for_body5$$for_inc31$5;}}}}while(0);var $51=$i;var $inc32=((($51)+1)&4294967295);$i=$inc32;var $52=$i;var $53=$numChannels_addr;var $cmp=((($52))|0)<((($53))|0);if($cmp){__label__=1;continue $for_body$3;}else{__label__=9;break $for_body$$for_end33$2;}}}}while(0);;return;return;}
70155 function __ZL18removePitchSamplesP17sonicStreamStructi($stream,$numSamples){;var __label__;var $stream_addr;var $numSamples_addr;var $numChannels;var $source;$stream_addr=$stream;$numSamples_addr=$numSamples;var $0=$stream_addr;var $numChannels1=(($0+28)&4294967295);var $1=HEAP32[(($numChannels1)>>2)];$numChannels=$1;var $2=$stream_addr;var $pitchBuffer=(($2+8)&4294967295);var $3=HEAP32[(($pitchBuffer)>>2)];var $4=$numSamples_addr;var $5=$numChannels;var $mul=((($5)*($4))&4294967295);var $add_ptr=(($3+2*$mul)&4294967295);$source=$add_ptr;var $6=$numSamples_addr;var $cmp=((($6))|0)==0;if($cmp){__label__=4;;}else{__label__=1;;}
70156 if(__label__==1){var $7=$numSamples_addr;var $8=$stream_addr;var $numPitchSamples=(($8+52)&4294967295);var $9=HEAP32[(($numPitchSamples)>>2)];var $cmp2=((($7))|0)!=((($9))|0);if($cmp2){__label__=2;;}else{__label__=3;;}
70157 if(__label__==2){var $10=$stream_addr;var $pitchBuffer4=(($10+8)&4294967295);var $11=HEAP32[(($pitchBuffer4)>>2)];var $12=$11;var $13=$source;var $14=$13;var $15=$stream_addr;var $numPitchSamples5=(($15+52)&4294967295);var $16=HEAP32[(($numPitchSamples5)>>2)];var $17=$numSamples_addr;var $sub=((($16)-($17))&4294967295);var $18=$numChannels;var $mul6=((($18)*2)&4294967295);var $mul7=((($mul6)*($sub))&4294967295);_llvm_memmove_p0i8_p0i8_i32($12,$14,$mul7,1,0);;}
70158 var $19=$numSamples_addr;var $20=$stream_addr;var $numPitchSamples9=(($20+52)&4294967295);var $21=HEAP32[(($numPitchSamples9)>>2)];var $sub10=((($21)-($19))&4294967295);HEAP32[(($numPitchSamples9)>>2)]=$sub10;;};return;return;}
70159 function __ZL22findPitchPeriodInRangePsiiPiS0_($samples,$minPeriod,$maxPeriod,$retMinDiff,$retMaxDiff){;var __label__;var __lastLabel__=null;var $samples_addr;var $minPeriod_addr;var $maxPeriod_addr;var $retMinDiff_addr;var $retMaxDiff_addr;var $period;var $bestPeriod;var $s;var $p;var $sVal;var $pVal;var $diff;var $minDiff;var $maxDiff;var $i;$samples_addr=$samples;$minPeriod_addr=$minPeriod;$maxPeriod_addr=$maxPeriod;$retMinDiff_addr=$retMinDiff;$retMaxDiff_addr=$retMaxDiff;$bestPeriod=0;$minDiff=1;$maxDiff=0;var $0=$minPeriod_addr;$period=$0;var $1=$period;var $2=$maxPeriod_addr;var $cmp3=((($1))|0)<=((($2))|0);if($cmp3){__label__=1;;}else{__label__=11;;}
70160 $for_body$$for_end24$2:do{if(__label__==1){$for_body$3:while(1){$diff=0;var $3=$samples_addr;$s=$3;var $4=$samples_addr;var $5=$period;var $add_ptr=(($4+2*$5)&4294967295);$p=$add_ptr;$i=0;var $6=$i;var $7=$period;var $cmp21=((($6))|0)<((($7))|0);if($cmp21){__label__=2;;}else{__label__=6;;}
70161 $for_body3$$for_end$5:do{if(__label__==2){while(1){var $8=$s;var $incdec_ptr=(($8+2)&4294967295);$s=$incdec_ptr;var $9=HEAP16[(($8)>>1)];$sVal=$9;var $10=$p;var $incdec_ptr4=(($10+2)&4294967295);$p=$incdec_ptr4;var $11=HEAP16[(($10)>>1)];$pVal=$11;var $12=$sVal;var $conv=(tempInt=(($12)),(tempInt>=32768?tempInt-65536:tempInt));var $13=$pVal;var $conv5=(tempInt=(($13)),(tempInt>=32768?tempInt-65536:tempInt));var $cmp6=((($conv))|0)>=((($conv5))|0);if($cmp6){__label__=3;;}else{__label__=4;;}
70162 if(__label__==3){var $14=$sVal;var $conv7=(tempInt=(($14)),(tempInt>=32768?tempInt-65536:tempInt));var $15=$pVal;var $conv8=(tempInt=(($15)),(tempInt>=32768?tempInt-65536:tempInt));var $sub=((($conv7)-($conv8))&4294967295);var $conv9=((($sub))&65535);__lastLabel__=3;;}
70163 else if(__label__==4){var $16=$pVal;var $conv10=(tempInt=(($16)),(tempInt>=32768?tempInt-65536:tempInt));var $17=$sVal;var $conv11=(tempInt=(($17)),(tempInt>=32768?tempInt-65536:tempInt));var $sub12=((($conv10)-($conv11))&4294967295);var $conv13=((($sub12))&65535);__lastLabel__=4;;}
70164 var $cond=__lastLabel__==3?$conv9:($conv13);var $conv14=((($cond))&65535);var $18=$diff;var $add=((($18)+($conv14))&4294967295);$diff=$add;var $19=$i;var $inc=((($19)+1)&4294967295);$i=$inc;var $20=$i;var $21=$period;var $cmp2=((($20))|0)<((($21))|0);if($cmp2){__label__=2;continue;}else{__label__=6;break $for_body3$$for_end$5;}}}}while(0);var $22=$diff;var $23=$bestPeriod;var $mul=((($23)*($22))&4294967295);var $24=$minDiff;var $25=$period;var $mul15=((($25)*($24))&4294967295);var $cmp16=((($mul))>>>0)<((($mul15))>>>0);if($cmp16){__label__=7;;}else{__label__=8;;}
70165 if(__label__==7){var $26=$diff;$minDiff=$26;var $27=$period;$bestPeriod=$27;;}
70166 var $28=$diff;var $29=$bestPeriod;var $mul17=((($29)*($28))&4294967295);var $30=$maxDiff;var $31=$period;var $mul18=((($31)*($30))&4294967295);var $cmp19=((($mul17))>>>0)>((($mul18))>>>0);if($cmp19){__label__=9;;}else{__label__=10;;}
70167 if(__label__==9){var $32=$diff;$maxDiff=$32;;}
70168 var $33=$period;var $inc23=((($33)+1)&4294967295);$period=$inc23;var $34=$period;var $35=$maxPeriod_addr;var $cmp=((($34))|0)<=((($35))|0);if($cmp){__label__=1;continue $for_body$3;}else{__label__=11;break $for_body$$for_end24$2;}}}}while(0);var $36=$minDiff;var $37=$retMinDiff_addr;HEAP32[(($37)>>2)]=$36;var $38=$maxDiff;var $39=$retMaxDiff_addr;HEAP32[(($39)>>2)]=$38;var $40=$bestPeriod;;return $40;return null;}
70169 function __ZL15downSampleInputP17sonicStreamStructPsi($stream,$samples,$skip){;var __label__;var $stream_addr;var $samples_addr;var $skip_addr;var $numSamples;var $samplesPerValue;var $i;var $j;var $value;var $downSamples;$stream_addr=$stream;$samples_addr=$samples;$skip_addr=$skip;var $0=$stream_addr;var $maxRequired=(($0+64)&4294967295);var $1=HEAP32[(($maxRequired)>>2)];var $2=$skip_addr;var $div=((((($1))|0)/((($2))|0))|0);$numSamples=$div;var $3=$stream_addr;var $numChannels=(($3+28)&4294967295);var $4=HEAP32[(($numChannels)>>2)];var $5=$skip_addr;var $mul=((($5)*($4))&4294967295);$samplesPerValue=$mul;var $6=$stream_addr;var $downSampleBuffer=(($6+12)&4294967295);var $7=HEAP32[(($downSampleBuffer)>>2)];$downSamples=$7;$i=0;var $8=$i;var $9=$numSamples;var $cmp3=((($8))|0)<((($9))|0);if($cmp3){__label__=1;;}else{__label__=4;;}
70170 $for_body$$for_end9$2:do{if(__label__==1){$for_body$3:while(1){$value=0;$j=0;var $10=$j;var $11=$samplesPerValue;var $cmp21=((($10))|0)<((($11))|0);if($cmp21){__label__=2;;}else{__label__=3;;}
70171 $for_body3$$for_end$5:do{if(__label__==2){while(1){var $12=$samples_addr;var $incdec_ptr=(($12+2)&4294967295);$samples_addr=$incdec_ptr;var $13=HEAP16[(($12)>>1)];var $conv=(tempInt=(($13)),(tempInt>=32768?tempInt-65536:tempInt));var $14=$value;var $add=((($14)+($conv))&4294967295);$value=$add;var $15=$j;var $inc=((($15)+1)&4294967295);$j=$inc;var $16=$j;var $17=$samplesPerValue;var $cmp2=((($16))|0)<((($17))|0);if($cmp2){__label__=2;continue;}else{__label__=3;break $for_body3$$for_end$5;}}}}while(0);var $18=$samplesPerValue;var $19=$value;var $div4=((((($19))|0)/((($18))|0))|0);$value=$div4;var $20=$value;var $conv5=((($20))&65535);var $21=$downSamples;var $incdec_ptr6=(($21+2)&4294967295);$downSamples=$incdec_ptr6;HEAP16[(($21)>>1)]=$conv5;var $22=$i;var $inc8=((($22)+1)&4294967295);$i=$inc8;var $23=$i;var $24=$numSamples;var $cmp=((($23))|0)<((($24))|0);if($cmp){__label__=1;continue $for_body$3;}else{__label__=4;break $for_body$$for_end9$2;}}}}while(0);;return;return;}
70172 function __ZL16prevPeriodBetterP17sonicStreamStructiii($stream,$period,$minDiff,$maxDiff){;var __label__;var $retval;var $stream_addr;var $period_addr;var $minDiff_addr;var $maxDiff_addr;$stream_addr=$stream;$period_addr=$period;$minDiff_addr=$minDiff;$maxDiff_addr=$maxDiff;var $0=$maxDiff_addr;var $mul=((($0)*3)&4294967295);var $div=((((($mul))|0)/2)|0);var $1=$stream_addr;var $prevMaxDiff=(($1+80)&4294967295);var $2=HEAP32[(($prevMaxDiff)>>2)];var $cmp=((($div))|0)<((($2))|0);if($cmp){__label__=1;;}else{__label__=3;;}
70173 $land_lhs_true$$if_end$2:do{if(__label__==1){var $3=$maxDiff_addr;var $conv=((($3))|0);var $mul1=($conv)*3;var $4=$stream_addr;var $prevMinDiff=(($4+84)&4294967295);var $5=HEAP32[(($prevMinDiff)>>2)];var $conv2=((($5))|0);var $mul3=($mul1)*($conv2);var $6=$stream_addr;var $prevMaxDiff4=(($6+80)&4294967295);var $7=HEAP32[(($prevMaxDiff4)>>2)];var $conv5=((($7))|0);var $8=$minDiff_addr;var $conv6=((($8))|0);var $mul7=($conv5)*($conv6);var $mul8=($mul7)*2;var $cmp9=($mul3)<($mul8);if(!($cmp9)){__label__=3;break $land_lhs_true$$if_end$2;}
70174 $retval=1;__label__=4;break $land_lhs_true$$if_end$2;}}while(0);if(__label__==3){$retval=0;;}
70175 var $9=$retval;;return $9;return null;}
70176 function __ZL17copyInputToOutputP17sonicStreamStructi($stream,$position){;var __label__;var $retval;var $stream_addr;var $position_addr;var $numSamples;$stream_addr=$stream;$position_addr=$position;var $0=$stream_addr;var $remainingInputToCopy=(($0+68)&4294967295);var $1=HEAP32[(($remainingInputToCopy)>>2)];$numSamples=$1;var $2=$numSamples;var $3=$stream_addr;var $maxRequired=(($3+64)&4294967295);var $4=HEAP32[(($maxRequired)>>2)];var $cmp=((($2))|0)>((($4))|0);if($cmp){__label__=1;;}else{__label__=2;;}
70177 if(__label__==1){var $5=$stream_addr;var $maxRequired1=(($5+64)&4294967295);var $6=HEAP32[(($maxRequired1)>>2)];$numSamples=$6;;}
70178 var $7=$stream_addr;var $8=$stream_addr;var $inputBuffer=(($8)&4294967295);var $9=HEAP32[(($inputBuffer)>>2)];var $10=$position_addr;var $11=$stream_addr;var $numChannels=(($11+28)&4294967295);var $12=HEAP32[(($numChannels)>>2)];var $mul=((($12)*($10))&4294967295);var $add_ptr=(($9+2*$mul)&4294967295);var $13=$numSamples;var $call=__ZL12copyToOutputP17sonicStreamStructPsi($7,$add_ptr,$13);var $tobool=((($call))|0)!=0;if($tobool){__label__=4;;}else{__label__=3;;}
70179 if(__label__==4){var $14=$numSamples;var $15=$stream_addr;var $remainingInputToCopy4=(($15+68)&4294967295);var $16=HEAP32[(($remainingInputToCopy4)>>2)];var $sub=((($16)-($14))&4294967295);HEAP32[(($remainingInputToCopy4)>>2)]=$sub;var $17=$numSamples;$retval=$17;;}
70180 else if(__label__==3){$retval=0;;}
70181 var $18=$retval;;return $18;return null;}
70182 function __ZL15skipPitchPeriodP17sonicStreamStructPsfi($stream,$samples,$speed,$period){;var __label__;var $retval;var $stream_addr;var $samples_addr;var $speed_addr;var $period_addr;var $newSamples;var $numChannels;$stream_addr=$stream;$samples_addr=$samples;$speed_addr=$speed;$period_addr=$period;var $0=$stream_addr;var $numChannels1=(($0+28)&4294967295);var $1=HEAP32[(($numChannels1)>>2)];$numChannels=$1;var $2=$speed_addr;var $cmp=($2)>=2;if($cmp){__label__=1;;}else{__label__=2;;}
70183 $if_then$$if_else$2:do{if(__label__==1){var $3=$period_addr;var $conv=((($3))|0);var $4=$speed_addr;var $sub=($4)-1;var $div=($conv)/($sub);var $conv2=((($div))|0);$newSamples=$conv2;;}
70184 else if(__label__==2){var $5=$speed_addr;var $cmp3=($5)>1;if(!($cmp3)){__label__=4;break $if_then$$if_else$2;}
70185 var $6=$period_addr;$newSamples=$6;var $7=$period_addr;var $conv5=((($7))|0);var $8=$speed_addr;var $sub6=2-($8);var $mul=($conv5)*($sub6);var $9=$speed_addr;var $sub7=($9)-1;var $div8=($mul)/($sub7);var $conv9=((($div8))|0);var $10=$stream_addr;var $remainingInputToCopy=(($10+68)&4294967295);HEAP32[(($remainingInputToCopy)>>2)]=$conv9;;}}while(0);var $11=$stream_addr;var $12=$newSamples;var $call=__ZL27enlargeOutputBufferIfNeededP17sonicStreamStructi($11,$12);var $tobool=((($call))|0)!=0;if($tobool){__label__=6;;}else{__label__=5;;}
70186 if(__label__==6){var $13=$newSamples;var $14=$numChannels;var $15=$stream_addr;var $outputBuffer=(($15+4)&4294967295);var $16=HEAP32[(($outputBuffer)>>2)];var $17=$stream_addr;var $numOutputSamples=(($17+48)&4294967295);var $18=HEAP32[(($numOutputSamples)>>2)];var $19=$numChannels;var $mul13=((($19)*($18))&4294967295);var $add_ptr=(($16+2*$mul13)&4294967295);var $20=$samples_addr;var $21=$samples_addr;var $22=$period_addr;var $23=$numChannels;var $mul14=((($23)*($22))&4294967295);var $add_ptr15=(($21+2*$mul14)&4294967295);__ZL10overlapAddiiPsS_S_($13,$14,$add_ptr,$20,$add_ptr15);var $24=$newSamples;var $25=$stream_addr;var $numOutputSamples16=(($25+48)&4294967295);var $26=HEAP32[(($numOutputSamples16)>>2)];var $add=((($26)+($24))&4294967295);HEAP32[(($numOutputSamples16)>>2)]=$add;var $27=$newSamples;$retval=$27;;}
70187 else if(__label__==5){$retval=0;;}
70188 var $28=$retval;;return $28;return null;}
70189 function __ZL17insertPitchPeriodP17sonicStreamStructPsfi($stream,$samples,$speed,$period){;var __label__;var $retval;var $stream_addr;var $samples_addr;var $speed_addr;var $period_addr;var $newSamples;var $out;var $numChannels;$stream_addr=$stream;$samples_addr=$samples;$speed_addr=$speed;$period_addr=$period;var $0=$stream_addr;var $numChannels1=(($0+28)&4294967295);var $1=HEAP32[(($numChannels1)>>2)];$numChannels=$1;var $2=$speed_addr;var $cmp=($2)<0.5;var $3=$period_addr;if($cmp){__label__=1;;}else{__label__=2;;}
70190 if(__label__==1){var $conv=((($3))|0);var $4=$speed_addr;var $mul=($conv)*($4);var $5=$speed_addr;var $sub=1-($5);var $div=($mul)/($sub);var $conv2=((($div))|0);$newSamples=$conv2;;}
70191 else if(__label__==2){$newSamples=$3;var $6=$period_addr;var $conv3=((($6))|0);var $7=$speed_addr;var $mul4=2*($7);var $sub5=($mul4)-1;var $mul6=($conv3)*($sub5);var $8=$speed_addr;var $sub7=1-($8);var $div8=($mul6)/($sub7);var $conv9=((($div8))|0);var $9=$stream_addr;var $remainingInputToCopy=(($9+68)&4294967295);HEAP32[(($remainingInputToCopy)>>2)]=$conv9;;}
70192 var $10=$stream_addr;var $11=$period_addr;var $12=$newSamples;var $add=((($12)+($11))&4294967295);var $call=__ZL27enlargeOutputBufferIfNeededP17sonicStreamStructi($10,$add);var $tobool=((($call))|0)!=0;if($tobool){__label__=5;;}else{__label__=4;;}
70193 if(__label__==5){var $13=$stream_addr;var $outputBuffer=(($13+4)&4294967295);var $14=HEAP32[(($outputBuffer)>>2)];var $15=$stream_addr;var $numOutputSamples=(($15+48)&4294967295);var $16=HEAP32[(($numOutputSamples)>>2)];var $17=$numChannels;var $mul12=((($17)*($16))&4294967295);var $add_ptr=(($14+2*$mul12)&4294967295);$out=$add_ptr;var $18=$out;var $19=$18;var $20=$samples_addr;var $21=$20;var $22=$period_addr;var $23=$numChannels;var $mul13=((($22)*2)&4294967295);var $mul14=((($mul13)*($23))&4294967295);var $src$,$dest$,$stop$,$stop4$,$fast$;$src$=$21;$dest$=$19;$stop$=$src$+$mul14;if(($dest$%4)==($src$%4)&&$mul14>8){while($src$%4!==0&&$src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];}
70194 $src$>>=2;$dest$>>=2;$stop4$=$stop$>>2;while($src$<$stop4$){;;;HEAP32[$dest$++]=HEAP32[$src$++];}
70195 $src$<<=2;$dest$<<=2;}while($src$<$stop$){;HEAP8[$dest$++]=HEAP8[$src$++];};var $24=$stream_addr;var $outputBuffer15=(($24+4)&4294967295);var $25=HEAP32[(($outputBuffer15)>>2)];var $26=$stream_addr;var $numOutputSamples16=(($26+48)&4294967295);var $27=HEAP32[(($numOutputSamples16)>>2)];var $28=$period_addr;var $add17=((($28)+($27))&4294967295);var $29=$numChannels;var $mul18=((($add17)*($29))&4294967295);var $add_ptr19=(($25+2*$mul18)&4294967295);$out=$add_ptr19;var $30=$newSamples;var $31=$numChannels;var $32=$out;var $33=$samples_addr;var $34=$period_addr;var $35=$numChannels;var $mul20=((($35)*($34))&4294967295);var $add_ptr21=(($33+2*$mul20)&4294967295);var $36=$samples_addr;__ZL10overlapAddiiPsS_S_($30,$31,$32,$add_ptr21,$36);var $37=$period_addr;var $38=$newSamples;var $39=$stream_addr;var $numOutputSamples23=(($39+48)&4294967295);var $40=HEAP32[(($numOutputSamples23)>>2)];var $add22=((($38)+($37))&4294967295);var $add24=((($add22)+($40))&4294967295);HEAP32[(($numOutputSamples23)>>2)]=$add24;var $41=$newSamples;$retval=$41;;}
70196 else if(__label__==4){$retval=0;;}
70197 var $42=$retval;;return $42;return null;}
70198 function __ZL18removeInputSamplesP17sonicStreamStructi($stream,$position){;var __label__;var $stream_addr;var $position_addr;var $remainingSamples;$stream_addr=$stream;$position_addr=$position;var $0=$stream_addr;var $numInputSamples=(($0+44)&4294967295);var $1=HEAP32[(($numInputSamples)>>2)];var $2=$position_addr;var $sub=((($1)-($2))&4294967295);$remainingSamples=$sub;var $3=$remainingSamples;var $cmp=((($3))|0)>0;if($cmp){__label__=1;;}else{__label__=2;;}
70199 if(__label__==1){var $4=$stream_addr;var $inputBuffer=(($4)&4294967295);var $5=HEAP32[(($inputBuffer)>>2)];var $6=$5;var $7=$stream_addr;var $inputBuffer1=(($7)&4294967295);var $8=HEAP32[(($inputBuffer1)>>2)];var $9=$position_addr;var $10=$stream_addr;var $numChannels=(($10+28)&4294967295);var $11=HEAP32[(($numChannels)>>2)];var $mul=((($11)*($9))&4294967295);var $add_ptr=(($8+2*$mul)&4294967295);var $12=$add_ptr;var $13=$remainingSamples;var $14=$stream_addr;var $numChannels3=(($14+28)&4294967295);var $15=HEAP32[(($numChannels3)>>2)];var $mul2=((($13)*2)&4294967295);var $mul4=((($mul2)*($15))&4294967295);_llvm_memmove_p0i8_p0i8_i32($6,$12,$mul4,1,0);;}
70200 var $16=$remainingSamples;var $17=$stream_addr;var $numInputSamples5=(($17+44)&4294967295);HEAP32[(($numInputSamples5)>>2)]=$16;;return;return;}
70201 function _getopt($argc,$argv,$optstring){var __stackBase__=STACKTOP;STACKTOP+=20;_memset(__stackBase__,0,20);var __label__;var $argc_addr;var $argv_addr;var $optstring_addr;var $data=__stackBase__;var $r;$argc_addr=$argc;$argv_addr=$argv;$optstring_addr=$optstring;__ZL12read_globalsP11getopt_data($data);var $0=$argc_addr;var $1=$argv_addr;var $2=$optstring_addr;var $call=__ZL15getopt_internaliPKPcPKcPK6optionPiiP11getopt_data($0,$1,$2,0,0,0,$data);$r=$call;__ZL13write_globalsP11getopt_data($data);var $3=$r;STACKTOP=__stackBase__;return $3;return null;}
70202 function __ZL12read_globalsP11getopt_data($data){;var __label__;var $data_addr;$data_addr=$data;var $0=HEAP32[((_optarg)>>2)];var $1=$data_addr;var $optarg=(($1)&4294967295);HEAP32[(($optarg)>>2)]=$0;var $2=HEAP32[((_optind)>>2)];var $3=$data_addr;var $optind=(($3+4)&4294967295);HEAP32[(($optind)>>2)]=$2;var $4=HEAP32[((_opterr)>>2)];var $5=$data_addr;var $opterr=(($5+8)&4294967295);HEAP32[(($opterr)>>2)]=$4;var $6=HEAP32[((_optopt)>>2)];var $7=$data_addr;var $optopt=(($7+12)&4294967295);HEAP32[(($optopt)>>2)]=$6;var $8=HEAP32[((__ZL8optwhere)>>2)];var $9=$data_addr;var $optwhere=(($9+16)&4294967295);HEAP32[(($optwhere)>>2)]=$8;;return;return;}
70203 function __ZL15getopt_internaliPKPcPKcPK6optionPiiP11getopt_data($argc,$argv,$shortopts,$longopts,$longind,$only,$data){;var __label__;var __lastLabel__=null;var $retval;var $argc_addr;var $argv_addr;var $shortopts_addr;var $longopts_addr;var $longind_addr;var $only_addr;var $data_addr;var $ordering;var $permute_from;var $num_nonopts;var $optindex;var $match_chars;var $possible_arg;var $longopt_match;var $has_arg;var $cp;var $arg_next;$argc_addr=$argc;$argv_addr=$argv;$shortopts_addr=$shortopts;$longopts_addr=$longopts;$longind_addr=$longind;$only_addr=$only;$data_addr=$data;$ordering=0;$permute_from=0;$num_nonopts=0;$optindex=0;$match_chars=0;$possible_arg=0;$longopt_match=-1;$has_arg=-1;$cp=0;$arg_next=0;var $0=$argc_addr;var $cmp=((($0))|0)==0;if($cmp){__label__=6;;}else{__label__=1;;}
70204 $if_then$$lor_lhs_false$2:do{if(__label__==1){var $1=$argv_addr;var $cmp1=((($1))|0)==0;if($cmp1){__label__=6;break $if_then$$lor_lhs_false$2;}
70205 var $2=$shortopts_addr;var $cmp3=((($2))|0)==0;if($cmp3){__label__=3;;}else{__label__=4;;}
70206 if(__label__==3){var $3=$longopts_addr;var $cmp4=((($3))|0)==0;if($cmp4){__label__=6;break $if_then$$lor_lhs_false$2;}}
70207 var $4=$data_addr;var $optind=(($4+4)&4294967295);var $5=HEAP32[(($optind)>>2)];var $6=$argc_addr;var $cmp6=((($5))|0)>=((($6))|0);if($cmp6){__label__=6;break $if_then$$lor_lhs_false$2;}
70208 var $7=$data_addr;var $optind8=(($7+4)&4294967295);var $8=HEAP32[(($optind8)>>2)];var $9=$argv_addr;var $arrayidx=(($9+4*$8)&4294967295);var $10=HEAP32[(($arrayidx)>>2)];var $cmp9=((($10))|0)==0;if($cmp9){__label__=6;break $if_then$$lor_lhs_false$2;}
70209 var $11=$data_addr;var $optind10=(($11+4)&4294967295);var $12=HEAP32[(($optind10)>>2)];var $13=$argv_addr;var $arrayidx11=(($13+4*$12)&4294967295);var $14=HEAP32[(($arrayidx11)>>2)];var $call=_strcmp($14,((__str831)&4294967295));var $cmp12=((($call))|0)==0;var $15=$data_addr;var $optind14=(($15+4)&4294967295);var $16=HEAP32[(($optind14)>>2)];if($cmp12){__label__=8;;}else{__label__=9;;}
70210 if(__label__==8){var $inc=((($16)+1)&4294967295);HEAP32[(($optind14)>>2)]=$inc;$retval=-1;__label__=96;break $if_then$$lor_lhs_false$2;}
70211 else if(__label__==9){var $cmp17=((($16))|0)==0;if($cmp17){__label__=10;;}else{__label__=11;;}
70212 if(__label__==10){var $17=$data_addr;var $optwhere=(($17+16)&4294967295);HEAP32[(($optwhere)>>2)]=1;var $18=$data_addr;var $optind19=(($18+4)&4294967295);HEAP32[(($optind19)>>2)]=1;;}
70213 var $19=$shortopts_addr;var $cmp21=((($19))|0)!=0;if($cmp21){__label__=12;;}else{__label__=15;;}
70214 $land_lhs_true22$$if_else$16:do{if(__label__==12){var $20=$shortopts_addr;var $21=HEAP8[($20)];var $conv=(tempInt=(($21)),(tempInt>=128?tempInt-256:tempInt));var $cmp23=((($conv))|0)==45;if($cmp23){__label__=14;;}else{__label__=13;;}
70215 if(__label__==13){var $22=$shortopts_addr;var $23=HEAP8[($22)];var $conv25=(tempInt=(($23)),(tempInt>=128?tempInt-256:tempInt));var $cmp26=((($conv25))|0)==43;if(!($cmp26)){__label__=15;break $land_lhs_true22$$if_else$16;}}
70216 var $24=$shortopts_addr;var $25=HEAP8[($24)];var $conv28=(tempInt=(($25)),(tempInt>=128?tempInt-256:tempInt));var $cmp29=((($conv28))|0)==45;var $cond=($cmp29)?1:2;$ordering=$cond;var $26=$shortopts_addr;var $incdec_ptr=(($26+1)&4294967295);$shortopts_addr=$incdec_ptr;__label__=16;break $land_lhs_true22$$if_else$16;}}while(0);if(__label__==15){var $call30=_getenv(((__str1832)&4294967295));var $cmp31=((($call30))|0)!=0;var $cond32=($cmp31)?2:0;$ordering=$cond32;;}
70217 var $27=$data_addr;var $optwhere34=(($27+16)&4294967295);var $28=HEAP32[(($optwhere34)>>2)];var $cmp35=((($28))|0)==1;if($cmp35){__label__=17;;}else{__label__=28;;}
70218 $if_then36$$if_end75$24:do{if(__label__==17){var $29=$ordering;if($29==2){__label__=26;;}
70219 else if($29==1){__label__=24;;}
70220 else{__label__=18;;}
70221 if(__label__==18){var $30=$data_addr;var $optind37=(($30+4)&4294967295);var $31=HEAP32[(($optind37)>>2)];$permute_from=$31;$num_nonopts=0;var $32=$data_addr;var $optind381=(($32+4)&4294967295);var $33=HEAP32[(($optind381)>>2)];var $34=$argv_addr;var $arrayidx392=(($34+4*$33)&4294967295);var $35=HEAP32[(($arrayidx392)>>2)];var $36=$only_addr;var $call403=__ZL9is_optionPci($35,$36);var $tobool4=((($call403))|0)!=0;var $lnot5=($tobool4)^1;var $37=$data_addr;var $optind416=(($37+4)&4294967295);var $38=HEAP32[(($optind416)>>2)];if($lnot5){__lastLabel__=18;__label__=19;;}else{__lastLabel__=18;__label__=20;;}
70222 $while_body$$while_end$28:do{if(__label__==19){while(1){var $39=__lastLabel__==19?$47:($38);var $optind417=__lastLabel__==19?$optind41:($optind416);var $inc42=((($39)+1)&4294967295);HEAP32[(($optind417)>>2)]=$inc42;var $40=$num_nonopts;var $inc43=((($40)+1)&4294967295);$num_nonopts=$inc43;var $41=$data_addr;var $optind38=(($41+4)&4294967295);var $42=HEAP32[(($optind38)>>2)];var $43=$argv_addr;var $arrayidx39=(($43+4*$42)&4294967295);var $44=HEAP32[(($arrayidx39)>>2)];var $45=$only_addr;var $call40=__ZL9is_optionPci($44,$45);var $tobool=((($call40))|0)!=0;var $lnot=($tobool)^1;var $46=$data_addr;var $optind41=(($46+4)&4294967295);var $47=HEAP32[(($optind41)>>2)];if($lnot){__lastLabel__=19;__label__=19;continue;}else{__lastLabel__=19;__label__=20;break $while_body$$while_end$28;}}}}while(0);var $_lcssa=__lastLabel__==18?$38:($47);var $48=$argv_addr;var $arrayidx45=(($48+4*$_lcssa)&4294967295);var $49=HEAP32[(($arrayidx45)>>2)];var $cmp46=((($49))|0)==0;if($cmp46){__label__=21;;}else{__label__=22;;}
70223 if(__label__==21){var $50=$permute_from;var $51=$data_addr;var $optind48=(($51+4)&4294967295);HEAP32[(($optind48)>>2)]=$50;$retval=-1;__label__=96;break $if_then$$lor_lhs_false$2;}
70224 else if(__label__==22){var $52=$data_addr;var $optind50=(($52+4)&4294967295);var $53=HEAP32[(($optind50)>>2)];var $54=$argv_addr;var $arrayidx51=(($54+4*$53)&4294967295);var $55=HEAP32[(($arrayidx51)>>2)];var $call52=_strcmp($55,((__str831)&4294967295));var $cmp53=((($call52))|0)==0;if(!($cmp53)){__label__=28;break $if_then36$$if_end75$24;}
70225 var $56=$argv_addr;var $57=$permute_from;var $add_ptr=(($56+4*$57)&4294967295);var $58=$num_nonopts;__ZL7permutePKPcii($add_ptr,$58,1);var $59=$permute_from;var $add=((($59)+1)&4294967295);var $60=$data_addr;var $optind55=(($60+4)&4294967295);HEAP32[(($optind55)>>2)]=$add;$retval=-1;__label__=96;break $if_then$$lor_lhs_false$2;}}
70226 else if(__label__==26){var $72=$data_addr;var $optind69=(($72+4)&4294967295);var $73=HEAP32[(($optind69)>>2)];var $74=$argv_addr;var $arrayidx70=(($74+4*$73)&4294967295);var $75=HEAP32[(($arrayidx70)>>2)];var $76=$only_addr;var $call71=__ZL9is_optionPci($75,$76);var $tobool72=((($call71))|0)!=0;if($tobool72){__label__=28;break $if_then36$$if_end75$24;}
70227 $retval=-1;__label__=96;break $if_then$$lor_lhs_false$2;}
70228 else if(__label__==24){var $61=$data_addr;var $optind59=(($61+4)&4294967295);var $62=HEAP32[(($optind59)>>2)];var $63=$argv_addr;var $arrayidx60=(($63+4*$62)&4294967295);var $64=HEAP32[(($arrayidx60)>>2)];var $65=$only_addr;var $call61=__ZL9is_optionPci($64,$65);var $tobool62=((($call61))|0)!=0;if($tobool62){__label__=28;break $if_then36$$if_end75$24;}
70229 var $66=$data_addr;var $optind64=(($66+4)&4294967295);var $67=HEAP32[(($optind64)>>2)];var $inc65=((($67)+1)&4294967295);HEAP32[(($optind64)>>2)]=$inc65;var $68=$argv_addr;var $arrayidx66=(($68+4*$67)&4294967295);var $69=HEAP32[(($arrayidx66)>>2)];var $70=$data_addr;var $optarg=(($70)&4294967295);HEAP32[(($optarg)>>2)]=$69;var $71=$data_addr;var $optopt=(($71+12)&4294967295);HEAP32[(($optopt)>>2)]=1;$retval=1;__label__=96;break $if_then$$lor_lhs_false$2;}}}while(0);var $77=$longopts_addr;var $cmp76=((($77))|0)!=0;if($cmp76){__label__=29;;}else{__label__=52;;}
70230 $land_lhs_true77$$if_end162$41:do{if(__label__==29){var $78=$data_addr;var $optind78=(($78+4)&4294967295);var $79=HEAP32[(($optind78)>>2)];var $80=$argv_addr;var $arrayidx79=(($80+4*$79)&4294967295);var $81=HEAP32[(($arrayidx79)>>2)];var $call80=_memcmp($81,((__str831)&4294967295),2);var $cmp81=((($call80))|0)==0;if($cmp81){__label__=32;;}else{__label__=30;;}
70231 if(__label__==30){var $82=$only_addr;var $tobool83=((($82))|0)!=0;if(!($tobool83)){__label__=52;break $land_lhs_true77$$if_end162$41;}
70232 var $83=$data_addr;var $optind85=(($83+4)&4294967295);var $84=HEAP32[(($optind85)>>2)];var $85=$argv_addr;var $arrayidx86=(($85+4*$84)&4294967295);var $86=HEAP32[(($arrayidx86)>>2)];var $arrayidx87=(($86)&4294967295);var $87=HEAP8[($arrayidx87)];var $conv88=(tempInt=(($87)),(tempInt>=128?tempInt-256:tempInt));var $cmp89=((($conv88))|0)==43;if(!($cmp89)){__label__=52;break $land_lhs_true77$$if_end162$41;}}
70233 var $88=$data_addr;var $optwhere91=(($88+16)&4294967295);var $89=HEAP32[(($optwhere91)>>2)];var $cmp92=((($89))|0)==1;if(!($cmp92)){__label__=52;break $land_lhs_true77$$if_end162$41;}
70234 var $90=$data_addr;var $optind94=(($90+4)&4294967295);var $91=HEAP32[(($optind94)>>2)];var $92=$argv_addr;var $arrayidx95=(($92+4*$91)&4294967295);var $93=HEAP32[(($arrayidx95)>>2)];var $call96=_memcmp($93,((__str831)&4294967295),2);var $cmp97=((($call96))|0)==0;if($cmp97){__label__=34;;}else{__label__=35;;}
70235 if(__label__==34){var $94=$data_addr;var $optwhere99=(($94+16)&4294967295);HEAP32[(($optwhere99)>>2)]=2;;}
70236 $longopt_match=-1;var $95=$data_addr;var $optind101=(($95+4)&4294967295);var $96=HEAP32[(($optind101)>>2)];var $97=$argv_addr;var $arrayidx102=(($97+4*$96)&4294967295);var $98=HEAP32[(($arrayidx102)>>2)];var $99=$data_addr;var $optwhere103=(($99+16)&4294967295);var $100=HEAP32[(($optwhere103)>>2)];var $add_ptr104=(($98+$100)&4294967295);var $call105=_strchr($add_ptr104,61);$possible_arg=$call105;var $cmp106=((($call105))|0)==0;if($cmp106){__label__=36;;}else{__label__=37;;}
70237 if(__label__==36){var $101=$data_addr;var $optind108=(($101+4)&4294967295);var $102=HEAP32[(($optind108)>>2)];var $103=$argv_addr;var $arrayidx109=(($103+4*$102)&4294967295);var $104=HEAP32[(($arrayidx109)>>2)];var $call110=_strlen($104);$match_chars=$call110;var $105=$data_addr;var $optind111=(($105+4)&4294967295);var $106=HEAP32[(($optind111)>>2)];var $107=$argv_addr;var $arrayidx112=(($107+4*$106)&4294967295);var $108=HEAP32[(($arrayidx112)>>2)];var $109=$match_chars;var $add_ptr113=(($108+$109)&4294967295);$possible_arg=$add_ptr113;var $110=$match_chars;var $111=$data_addr;var $optwhere114=(($111+16)&4294967295);var $112=HEAP32[(($optwhere114)>>2)];var $sub=((($110)-($112))&4294967295);$match_chars=$sub;;}
70238 else if(__label__==37){var $113=$possible_arg;var $114=$data_addr;var $optind116=(($114+4)&4294967295);var $115=HEAP32[(($optind116)>>2)];var $116=$argv_addr;var $arrayidx117=(($116+4*$115)&4294967295);var $117=HEAP32[(($arrayidx117)>>2)];var $sub_ptr_lhs_cast=($113);var $sub_ptr_rhs_cast=($117);var $sub_ptr_rhs_cast_neg=(((-($sub_ptr_rhs_cast)))&4294967295);var $118=$data_addr;var $optwhere118=(($118+16)&4294967295);var $119=HEAP32[(($optwhere118)>>2)];var $_neg=(((-($119)))&4294967295);var $sub_ptr_sub=((($sub_ptr_rhs_cast_neg)+($sub_ptr_lhs_cast))&4294967295);var $sub119=((($sub_ptr_sub)+($_neg))&4294967295);$match_chars=$sub119;;}
70239 $optindex=0;;while(1){var $120=$optindex;var $121=$longopts_addr;var $arrayidx121=(($121+16*$120)&4294967295);var $name=(($arrayidx121)&4294967295);var $122=HEAP32[(($name)>>2)];var $cmp122=((($122))|0)!=0;if(!($cmp122)){__label__=49;break;}
70240 var $123=$data_addr;var $optind123=(($123+4)&4294967295);var $124=HEAP32[(($optind123)>>2)];var $125=$argv_addr;var $arrayidx124=(($125+4*$124)&4294967295);var $126=HEAP32[(($arrayidx124)>>2)];var $127=$data_addr;var $optwhere125=(($127+16)&4294967295);var $128=HEAP32[(($optwhere125)>>2)];var $add_ptr126=(($126+$128)&4294967295);var $129=$optindex;var $130=$longopts_addr;var $arrayidx127=(($130+16*$129)&4294967295);var $name128=(($arrayidx127)&4294967295);var $131=HEAP32[(($name128)>>2)];var $132=$match_chars;var $call129=_memcmp($add_ptr126,$131,$132);var $cmp130=((($call129))|0)==0;if($cmp130){__label__=41;;}else{__label__=48;;}
70241 if(__label__==41){var $133=$match_chars;var $134=$optindex;var $135=$longopts_addr;var $arrayidx132=(($135+16*$134)&4294967295);var $name133=(($arrayidx132)&4294967295);var $136=HEAP32[(($name133)>>2)];var $call134=_strlen($136);var $cmp135=((($133))|0)==((($call134))|0);if($cmp135){__label__=42;break;}
70242 var $138=$longopt_match;var $cmp138=((($138))|0)<0;if(!($cmp138)){__label__=45;break;}
70243 var $139=$optindex;$longopt_match=$139;;}
70244 var $157=$optindex;var $inc156=((($157)+1)&4294967295);$optindex=$inc156;__label__=39;continue;}
70245 if(__label__==49){var $_pr=$longopt_match;__lastLabel__=49;;}
70246 else if(__label__==42){var $137=$optindex;$longopt_match=$137;__lastLabel__=42;;}
70247 else if(__label__==45){var $140=$data_addr;var $opterr=(($140+8)&4294967295);var $141=HEAP32[(($opterr)>>2)];var $tobool141=((($141))|0)!=0;if($tobool141){__label__=46;;}else{__label__=47;;}
70248 if(__label__==46){var $142=HEAP32[((__impure_ptr)>>2)];var $_stderr=(($142+12)&4294967295);var $143=HEAP32[(($_stderr)>>2)];var $144=$argv_addr;var $arrayidx143=(($144)&4294967295);var $145=HEAP32[(($arrayidx143)>>2)];var $146=$data_addr;var $optind144=(($146+4)&4294967295);var $147=HEAP32[(($optind144)>>2)];var $148=$argv_addr;var $arrayidx145=(($148+4*$147)&4294967295);var $149=HEAP32[(($arrayidx145)>>2)];var $150=$longopt_match;var $151=$longopts_addr;var $arrayidx146=(($151+16*$150)&4294967295);var $name147=(($arrayidx146)&4294967295);var $152=HEAP32[(($name147)>>2)];var $153=$optindex;var $154=$longopts_addr;var $arrayidx148=(($154+16*$153)&4294967295);var $name149=(($arrayidx148)&4294967295);var $155=HEAP32[(($name149)>>2)];var $call150=_fprintf($143,((__str2833)&4294967295),allocate([$145,0,0,0,$149,0,0,0,$152,0,0,0,$155,0,0,0],["i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0],ALLOC_STACK));;}
70249 var $156=$data_addr;var $optopt152=(($156+12)&4294967295);HEAP32[(($optopt152)>>2)]=63;$retval=63;__label__=96;break $if_then$$lor_lhs_false$2;}
70250 var $158=__lastLabel__==49?$_pr:($137);var $cmp157=((($158))|0)>=0;if(!($cmp157)){__label__=52;break $land_lhs_true77$$if_end162$41;}
70251 var $159=$longopt_match;var $160=$longopts_addr;var $arrayidx159=(($160+16*$159)&4294967295);var $has_arg160=(($arrayidx159+4)&4294967295);var $161=HEAP32[(($has_arg160)>>2)];$has_arg=$161;;}}while(0);var $162=$longopt_match;var $cmp163=((($162))|0)<0;if($cmp163){__label__=53;;}else{__label__=63;;}
70252 $land_lhs_true164$$if_end217$73:do{if(__label__==53){var $163=$shortopts_addr;var $cmp165=((($163))|0)!=0;if(!($cmp165)){__label__=63;break $land_lhs_true164$$if_end217$73;}
70253 var $164=$shortopts_addr;var $165=$data_addr;var $optwhere167=(($165+16)&4294967295);var $166=HEAP32[(($optwhere167)>>2)];var $167=$data_addr;var $optind168=(($167+4)&4294967295);var $168=HEAP32[(($optind168)>>2)];var $169=$argv_addr;var $arrayidx169=(($169+4*$168)&4294967295);var $170=HEAP32[(($arrayidx169)>>2)];var $arrayidx170=(($170+$166)&4294967295);var $171=HEAP8[($arrayidx170)];var $conv171=(tempInt=(($171)),(tempInt>=128?tempInt-256:tempInt));var $call172=_strchr($164,$conv171);$cp=$call172;var $172=$cp;var $cmp173=((($172))|0)==0;if($cmp173){__label__=55;;}else{__label__=60;;}
70254 if(__label__==55){var $173=$data_addr;var $opterr175=(($173+8)&4294967295);var $174=HEAP32[(($opterr175)>>2)];var $tobool176=((($174))|0)!=0;if($tobool176){__label__=56;;}else{__label__=57;;}
70255 if(__label__==56){var $175=HEAP32[((__impure_ptr)>>2)];var $_stderr178=(($175+12)&4294967295);var $176=HEAP32[(($_stderr178)>>2)];var $177=$argv_addr;var $arrayidx179=(($177)&4294967295);var $178=HEAP32[(($arrayidx179)>>2)];var $179=$data_addr;var $optwhere180=(($179+16)&4294967295);var $180=HEAP32[(($optwhere180)>>2)];var $181=$data_addr;var $optind181=(($181+4)&4294967295);var $182=HEAP32[(($optind181)>>2)];var $183=$argv_addr;var $arrayidx182=(($183+4*$182)&4294967295);var $184=HEAP32[(($arrayidx182)>>2)];var $arrayidx183=(($184+$180)&4294967295);var $185=HEAP8[($arrayidx183)];var $conv184=(tempInt=(($185)),(tempInt>=128?tempInt-256:tempInt));var $call185=_fprintf($176,((__str3834)&4294967295),allocate([$178,0,0,0,$conv184,0,0,0],["i8*",0,0,0,"i32",0,0,0],ALLOC_STACK));;}
70256 var $186=$data_addr;var $optwhere187=(($186+16)&4294967295);var $187=HEAP32[(($optwhere187)>>2)];var $inc188=((($187)+1)&4294967295);HEAP32[(($optwhere187)>>2)]=$inc188;var $188=$data_addr;var $optwhere189=(($188+16)&4294967295);var $189=HEAP32[(($optwhere189)>>2)];var $190=$data_addr;var $optind190=(($190+4)&4294967295);var $191=HEAP32[(($optind190)>>2)];var $192=$argv_addr;var $arrayidx191=(($192+4*$191)&4294967295);var $193=HEAP32[(($arrayidx191)>>2)];var $arrayidx192=(($193+$189)&4294967295);var $194=HEAP8[($arrayidx192)];var $conv193=(tempInt=(($194)),(tempInt>=128?tempInt-256:tempInt));var $cmp194=((($conv193))|0)==0;if($cmp194){__label__=58;;}else{__label__=59;;}
70257 if(__label__==58){var $195=$data_addr;var $optind196=(($195+4)&4294967295);var $196=HEAP32[(($optind196)>>2)];var $inc197=((($196)+1)&4294967295);HEAP32[(($optind196)>>2)]=$inc197;var $197=$data_addr;var $optwhere198=(($197+16)&4294967295);HEAP32[(($optwhere198)>>2)]=1;;}
70258 var $198=$data_addr;var $optopt200=(($198+12)&4294967295);HEAP32[(($optopt200)>>2)]=63;$retval=63;__label__=96;break $if_then$$lor_lhs_false$2;}
70259 else if(__label__==60){var $199=$cp;var $arrayidx202=(($199+1)&4294967295);var $200=HEAP8[($arrayidx202)];var $conv203=(tempInt=(($200)),(tempInt>=128?tempInt-256:tempInt));var $cmp204=((($conv203))|0)==58;if($cmp204){__lastLabel__=60;__label__=61;;}else{__lastLabel__=60;__label__=62;;}
70260 if(__label__==61){var $201=$cp;var $arrayidx205=(($201+2)&4294967295);var $202=HEAP8[($arrayidx205)];var $conv206=(tempInt=(($202)),(tempInt>=128?tempInt-256:tempInt));var $cmp207=((($conv206))|0)==58;var $cond208=($cmp207)?2:1;__lastLabel__=61;;}
70261 var $cond209=__lastLabel__==61?$cond208:(0);$has_arg=$cond209;var $203=$data_addr;var $optind210=(($203+4)&4294967295);var $204=HEAP32[(($optind210)>>2)];var $205=$argv_addr;var $arrayidx211=(($205+4*$204)&4294967295);var $206=HEAP32[(($arrayidx211)>>2)];var $207=$data_addr;var $optwhere212=(($207+16)&4294967295);var $208=HEAP32[(($optwhere212)>>2)];var $add_ptr213=(($206+$208)&4294967295);var $add_ptr214=(($add_ptr213+1)&4294967295);$possible_arg=$add_ptr214;var $209=$cp;var $210=HEAP8[($209)];var $conv215=(tempInt=(($210)),(tempInt>=128?tempInt-256:tempInt));var $211=$data_addr;var $optopt216=(($211+12)&4294967295);HEAP32[(($optopt216)>>2)]=$conv215;;}}}while(0);$arg_next=0;var $212=$has_arg;if($212==2){__label__=64;;}
70262 else if($212==1){__label__=67;;}
70263 else{__label__=78;;}
70264 if(__label__==78){var $254=$longopt_match;var $cmp279=((($254))|0)<0;var $255=$data_addr;var $optwhere281=(($255+16)&4294967295);if($cmp279){__label__=79;;}else{__label__=81;;}
70265 $if_then280$$if_else292$91:do{if(__label__==79){var $256=HEAP32[(($optwhere281)>>2)];var $inc282=((($256)+1)&4294967295);HEAP32[(($optwhere281)>>2)]=$inc282;var $257=$data_addr;var $optwhere283=(($257+16)&4294967295);var $258=HEAP32[(($optwhere283)>>2)];var $259=$data_addr;var $optind284=(($259+4)&4294967295);var $260=HEAP32[(($optind284)>>2)];var $261=$argv_addr;var $arrayidx285=(($261+4*$260)&4294967295);var $262=HEAP32[(($arrayidx285)>>2)];var $arrayidx286=(($262+$258)&4294967295);var $263=HEAP8[($arrayidx286)];var $conv287=(tempInt=(($263)),(tempInt>=128?tempInt-256:tempInt));var $cmp288=((($conv287))|0)==0;if(!($cmp288)){__label__=82;break $if_then280$$if_else292$91;}
70266 var $264=$data_addr;var $optwhere290=(($264+16)&4294967295);HEAP32[(($optwhere290)>>2)]=1;;}
70267 else if(__label__==81){HEAP32[(($optwhere281)>>2)]=1;;}}while(0);var $265=$data_addr;var $optarg295=(($265)&4294967295);HEAP32[(($optarg295)>>2)]=0;;}
70268 else if(__label__==64){var $213=$possible_arg;var $214=HEAP8[($213)];var $conv219=(tempInt=(($214)),(tempInt>=128?tempInt-256:tempInt));var $cmp220=((($conv219))|0)==61;if($cmp220){__label__=65;;}else{__label__=66;;}
70269 if(__label__==65){var $215=$possible_arg;var $incdec_ptr222=(($215+1)&4294967295);$possible_arg=$incdec_ptr222;;}
70270 var $216=$possible_arg;var $217=HEAP8[($216)];var $conv224=(tempInt=(($217)),(tempInt>=128?tempInt-256:tempInt));var $cmp225=((($conv224))|0)!=0;var $218=$possible_arg;var $cond229=($cmp225)?($218):0;var $219=$data_addr;var $optarg230=(($219)&4294967295);HEAP32[(($optarg230)>>2)]=$cond229;var $220=$data_addr;var $optwhere231=(($220+16)&4294967295);HEAP32[(($optwhere231)>>2)]=1;;}
70271 else if(__label__==67){var $221=$possible_arg;var $222=HEAP8[($221)];var $conv233=(tempInt=(($222)),(tempInt>=128?tempInt-256:tempInt));var $cmp234=((($conv233))|0)==61;if($cmp234){__label__=68;;}else{__label__=69;;}
70272 if(__label__==68){var $223=$possible_arg;var $incdec_ptr236=(($223+1)&4294967295);$possible_arg=$incdec_ptr236;;}
70273 var $224=$possible_arg;var $225=HEAP8[($224)];var $conv238=(tempInt=(($225)),(tempInt>=128?tempInt-256:tempInt));var $cmp239=((($conv238))|0)!=0;if($cmp239){__label__=70;;}else{__label__=71;;}
70274 if(__label__==70){var $226=$possible_arg;var $227=$data_addr;var $optarg241=(($227)&4294967295);HEAP32[(($optarg241)>>2)]=$226;var $228=$data_addr;var $optwhere242=(($228+16)&4294967295);HEAP32[(($optwhere242)>>2)]=1;;}
70275 else if(__label__==71){var $229=$data_addr;var $optind244=(($229+4)&4294967295);var $230=HEAP32[(($optind244)>>2)];var $add245=((($230)+1)&4294967295);var $231=$argc_addr;var $cmp246=((($add245))|0)>=((($231))|0);var $232=$data_addr;if($cmp246){__label__=72;;}else{__label__=77;;}
70276 if(__label__==72){var $opterr248=(($232+8)&4294967295);var $233=HEAP32[(($opterr248)>>2)];var $tobool249=((($233))|0)!=0;if($tobool249){__label__=73;;}else{__label__=76;;}
70277 if(__label__==73){var $234=HEAP32[((__impure_ptr)>>2)];var $_stderr251=(($234+12)&4294967295);var $235=HEAP32[(($_stderr251)>>2)];var $236=$argv_addr;var $arrayidx252=(($236)&4294967295);var $237=HEAP32[(($arrayidx252)>>2)];var $call253=_fprintf($235,((__str4835)&4294967295),allocate([$237,0,0,0],["i8*",0,0,0],ALLOC_STACK));var $238=$longopt_match;var $cmp254=((($238))|0)>=0;var $239=HEAP32[((__impure_ptr)>>2)];var $_stderr256=(($239+12)&4294967295);var $240=HEAP32[(($_stderr256)>>2)];if($cmp254){__label__=74;;}else{__label__=75;;}
70278 if(__label__==74){var $241=$longopt_match;var $242=$longopts_addr;var $arrayidx257=(($242+16*$241)&4294967295);var $name258=(($arrayidx257)&4294967295);var $243=HEAP32[(($name258)>>2)];var $call259=_fprintf($240,((__str5836)&4294967295),allocate([$243,0,0,0],["i8*",0,0,0],ALLOC_STACK));;}
70279 else if(__label__==75){var $244=$cp;var $245=HEAP8[($244)];var $conv262=(tempInt=(($245)),(tempInt>=128?tempInt-256:tempInt));var $call263=_fprintf($240,((__str6837)&4294967295),allocate([$conv262,0,0,0],["i32",0,0,0],ALLOC_STACK));;}}
70280 var $246=$data_addr;var $optind266=(($246+4)&4294967295);var $247=HEAP32[(($optind266)>>2)];var $inc267=((($247)+1)&4294967295);HEAP32[(($optind266)>>2)]=$inc267;var $248=$data_addr;var $optopt268=(($248+12)&4294967295);HEAP32[(($optopt268)>>2)]=58;$retval=58;__label__=96;break $if_then$$lor_lhs_false$2;}
70281 else if(__label__==77){var $optind270=(($232+4)&4294967295);var $249=HEAP32[(($optind270)>>2)];var $add271=((($249)+1)&4294967295);var $250=$argv_addr;var $arrayidx272=(($250+4*$add271)&4294967295);var $251=HEAP32[(($arrayidx272)>>2)];var $252=$data_addr;var $optarg273=(($252)&4294967295);HEAP32[(($optarg273)>>2)]=$251;$arg_next=1;var $253=$data_addr;var $optwhere274=(($253+16)&4294967295);HEAP32[(($optwhere274)>>2)]=1;;}}}
70282 var $266=$ordering;var $cmp297=((($266))|0)==0;if($cmp297){__label__=84;;}else{__label__=87;;}
70283 $land_lhs_true298$$if_else309$117:do{if(__label__==84){var $267=$data_addr;var $optwhere299=(($267+16)&4294967295);var $268=HEAP32[(($optwhere299)>>2)];var $cmp300=((($268))|0)==1;if(!($cmp300)){__label__=87;break $land_lhs_true298$$if_else309$117;}
70284 var $269=$num_nonopts;var $cmp302=((($269))|0)!=0;if(!($cmp302)){__label__=87;break $land_lhs_true298$$if_else309$117;}
70285 var $270=$argv_addr;var $271=$permute_from;var $add_ptr304=(($270+4*$271)&4294967295);var $272=$num_nonopts;var $273=$arg_next;var $add305=((($273)+1)&4294967295);__ZL7permutePKPcii($add_ptr304,$272,$add305);var $274=$permute_from;var $275=$arg_next;var $add306=((($274)+1)&4294967295);var $add307=((($add306)+($275))&4294967295);var $276=$data_addr;var $optind308=(($276+4)&4294967295);HEAP32[(($optind308)>>2)]=$add307;__label__=89;break $land_lhs_true298$$if_else309$117;}}while(0);$if_end318$$if_else309$121:do{if(__label__==87){var $277=$data_addr;var $optwhere310=(($277+16)&4294967295);var $278=HEAP32[(($optwhere310)>>2)];var $cmp311=((($278))|0)==1;if(!($cmp311)){__label__=89;break $if_end318$$if_else309$121;}
70286 var $279=$data_addr;var $optind313=(($279+4)&4294967295);var $280=HEAP32[(($optind313)>>2)];var $281=$arg_next;var $add314=((($280)+1)&4294967295);var $add315=((($add314)+($281))&4294967295);var $282=$data_addr;var $optind316=(($282+4)&4294967295);HEAP32[(($optind316)>>2)]=$add315;;}}while(0);var $283=$longopt_match;var $cmp319=((($283))|0)>=0;if($cmp319){__label__=90;;}else{__label__=95;;}
70287 if(__label__==90){var $284=$longind_addr;var $cmp321=((($284))|0)!=0;if($cmp321){__label__=91;;}else{__label__=92;;}
70288 if(__label__==91){var $285=$longopt_match;var $286=$longind_addr;HEAP32[(($286)>>2)]=$285;;}
70289 var $287=$longopt_match;var $288=$longopts_addr;var $arrayidx324=(($288+16*$287)&4294967295);var $flag=(($arrayidx324+8)&4294967295);var $289=HEAP32[(($flag)>>2)];var $cmp325=((($289))|0)!=0;var $290=$longopt_match;var $291=$longopts_addr;var $arrayidx327=(($291+16*$290)&4294967295);var $val=(($arrayidx327+12)&4294967295);var $292=HEAP32[(($val)>>2)];if($cmp325){__label__=93;;}else{__label__=94;;}
70290 if(__label__==93){var $293=$longopt_match;var $294=$longopts_addr;var $arrayidx328=(($294+16*$293)&4294967295);var $flag329=(($arrayidx328+8)&4294967295);var $295=HEAP32[(($flag329)>>2)];HEAP32[(($295)>>2)]=$292;$retval=0;__label__=96;break $if_then$$lor_lhs_false$2;}
70291 else if(__label__==94){$retval=$292;__label__=96;break $if_then$$lor_lhs_false$2;}}
70292 else if(__label__==95){var $296=$data_addr;var $optopt334=(($296+12)&4294967295);var $297=HEAP32[(($optopt334)>>2)];$retval=$297;__label__=96;break $if_then$$lor_lhs_false$2;}}}}while(0);if(__label__==6){$retval=-1;;}
70293 var $298=$retval;;return $298;return null;}
70294 function __ZL13write_globalsP11getopt_data($data){;var __label__;var $data_addr;$data_addr=$data;var $0=$data_addr;var $optarg=(($0)&4294967295);var $1=HEAP32[(($optarg)>>2)];HEAP32[((_optarg)>>2)]=$1;var $2=$data_addr;var $optind=(($2+4)&4294967295);var $3=HEAP32[(($optind)>>2)];HEAP32[((_optind)>>2)]=$3;var $4=$data_addr;var $opterr=(($4+8)&4294967295);var $5=HEAP32[(($opterr)>>2)];HEAP32[((_opterr)>>2)]=$5;var $6=$data_addr;var $optopt=(($6+12)&4294967295);var $7=HEAP32[(($optopt)>>2)];HEAP32[((_optopt)>>2)]=$7;var $8=$data_addr;var $optwhere=(($8+16)&4294967295);var $9=HEAP32[(($optwhere)>>2)];HEAP32[((__ZL8optwhere)>>2)]=$9;;return;return;}
70295 function _getopt_long($argc,$argv,$shortopts,$longopts,$longind){var __stackBase__=STACKTOP;STACKTOP+=20;_memset(__stackBase__,0,20);var __label__;var $argc_addr;var $argv_addr;var $shortopts_addr;var $longopts_addr;var $longind_addr;var $data=__stackBase__;var $r;$argc_addr=$argc;$argv_addr=$argv;$shortopts_addr=$shortopts;$longopts_addr=$longopts;$longind_addr=$longind;__ZL12read_globalsP11getopt_data($data);var $0=$argc_addr;var $1=$argv_addr;var $2=$shortopts_addr;var $3=$longopts_addr;var $4=$longind_addr;var $call=__ZL15getopt_internaliPKPcPKcPK6optionPiiP11getopt_data($0,$1,$2,$3,$4,0,$data);$r=$call;__ZL13write_globalsP11getopt_data($data);var $5=$r;STACKTOP=__stackBase__;return $5;return null;}
70296 function _getopt_long_only($argc,$argv,$shortopts,$longopts,$longind){var __stackBase__=STACKTOP;STACKTOP+=20;_memset(__stackBase__,0,20);var __label__;var $argc_addr;var $argv_addr;var $shortopts_addr;var $longopts_addr;var $longind_addr;var $data=__stackBase__;var $r;$argc_addr=$argc;$argv_addr=$argv;$shortopts_addr=$shortopts;$longopts_addr=$longopts;$longind_addr=$longind;__ZL12read_globalsP11getopt_data($data);var $0=$argc_addr;var $1=$argv_addr;var $2=$shortopts_addr;var $3=$longopts_addr;var $4=$longind_addr;var $call=__ZL15getopt_internaliPKPcPKcPK6optionPiiP11getopt_data($0,$1,$2,$3,$4,1,$data);$r=$call;__ZL13write_globalsP11getopt_data($data);var $5=$r;STACKTOP=__stackBase__;return $5;return null;}
70297 function ___getopt_r($argc,$argv,$optstring,$data){;var __label__;var $argc_addr;var $argv_addr;var $optstring_addr;var $data_addr;$argc_addr=$argc;$argv_addr=$argv;$optstring_addr=$optstring;$data_addr=$data;var $0=$argc_addr;var $1=$argv_addr;var $2=$optstring_addr;var $3=$data_addr;var $call=__ZL15getopt_internaliPKPcPKcPK6optionPiiP11getopt_data($0,$1,$2,0,0,0,$3);;return $call;return null;}
70298 function ___getopt_long_r($argc,$argv,$shortopts,$longopts,$longind,$data){;var __label__;var $argc_addr;var $argv_addr;var $shortopts_addr;var $longopts_addr;var $longind_addr;var $data_addr;$argc_addr=$argc;$argv_addr=$argv;$shortopts_addr=$shortopts;$longopts_addr=$longopts;$longind_addr=$longind;$data_addr=$data;var $0=$argc_addr;var $1=$argv_addr;var $2=$shortopts_addr;var $3=$longopts_addr;var $4=$longind_addr;var $5=$data_addr;var $call=__ZL15getopt_internaliPKPcPKcPK6optionPiiP11getopt_data($0,$1,$2,$3,$4,0,$5);;return $call;return null;}
70299 function ___getopt_long_only_r($argc,$argv,$shortopts,$longopts,$longind,$data){;var __label__;var $argc_addr;var $argv_addr;var $shortopts_addr;var $longopts_addr;var $longind_addr;var $data_addr;$argc_addr=$argc;$argv_addr=$argv;$shortopts_addr=$shortopts;$longopts_addr=$longopts;$longind_addr=$longind;$data_addr=$data;var $0=$argc_addr;var $1=$argv_addr;var $2=$shortopts_addr;var $3=$longopts_addr;var $4=$longind_addr;var $5=$data_addr;var $call=__ZL15getopt_internaliPKPcPKcPK6optionPiiP11getopt_data($0,$1,$2,$3,$4,1,$5);;return $call;return null;}
70300 function __ZL9is_optionPci($argv_element,$only){;var __label__;var __lastLabel__=null;var $argv_element_addr;var $only_addr;$argv_element_addr=$argv_element;$only_addr=$only;var $0=$argv_element_addr;var $cmp=((($0))|0)==0;if($cmp){__lastLabel__=0;__label__=4;;}else{__lastLabel__=0;__label__=1;;}
70301 $lor_end$$lor_lhs_false$2:do{if(__label__==1){var $1=$argv_element_addr;var $arrayidx=(($1)&4294967295);var $2=HEAP8[($arrayidx)];var $conv=(tempInt=(($2)),(tempInt>=128?tempInt-256:tempInt));var $cmp1=((($conv))|0)==45;if($cmp1){__lastLabel__=1;__label__=4;break $lor_end$$lor_lhs_false$2;}else{__lastLabel__=1;;}
70302 var $3=$only_addr;var $tobool=((($3))|0)!=0;if($tobool){__lastLabel__=2;;}else{__lastLabel__=2;__label__=4;break $lor_end$$lor_lhs_false$2;}
70303 var $4=$argv_element_addr;var $arrayidx2=(($4)&4294967295);var $5=HEAP8[($arrayidx2)];var $conv3=(tempInt=(($5)),(tempInt>=128?tempInt-256:tempInt));var $cmp4=((($conv3))|0)==43;__lastLabel__=3;;}}while(0);var $6=__lastLabel__==1?1:(__lastLabel__==0?1:(__lastLabel__==2?0:($cmp4)));var $conv5=((($6))&1);;return $conv5;return null;}
70304 function __ZL7permutePKPcii($argv,$len1,$len2){;var __label__;var $argv_addr;var $len1_addr;var $len2_addr;$argv_addr=$argv;$len1_addr=$len1;$len2_addr=$len2;var $0=$argv_addr;var $1=$len1_addr;__ZL21reverse_argv_elementsPPci($0,$1);var $2=$argv_addr;var $3=$len1_addr;var $4=$len2_addr;var $add=((($4)+($3))&4294967295);__ZL21reverse_argv_elementsPPci($2,$add);var $5=$argv_addr;var $6=$len2_addr;__ZL21reverse_argv_elementsPPci($5,$6);;return;return;}
70305 function __ZL21reverse_argv_elementsPPci($argv,$num){;var __label__;var $argv_addr;var $num_addr;var $i;var $tmp;$argv_addr=$argv;$num_addr=$num;$i=0;var $0=$i;var $1=$num_addr;var $shr2=($1)>>1;var $cmp3=((($0))|0)<((($shr2))|0);if($cmp3){__label__=1;;}else{__label__=2;;}
70306 $for_body$$for_end$2:do{if(__label__==1){while(1){var $2=$i;var $3=$argv_addr;var $arrayidx=(($3+4*$2)&4294967295);var $4=HEAP32[(($arrayidx)>>2)];$tmp=$4;var $5=$num_addr;var $6=$i;var $_neg=(((-($6)))&4294967295);var $sub=((($5)-1)&4294967295);var $sub1=((($sub)+($_neg))&4294967295);var $7=$argv_addr;var $arrayidx2=(($7+4*$sub1)&4294967295);var $8=HEAP32[(($arrayidx2)>>2)];var $9=$i;var $10=$argv_addr;var $arrayidx3=(($10+4*$9)&4294967295);HEAP32[(($arrayidx3)>>2)]=$8;var $11=$tmp;var $12=$num_addr;var $13=$i;var $_neg1=(((-($13)))&4294967295);var $sub4=((($12)-1)&4294967295);var $sub5=((($sub4)+($_neg1))&4294967295);var $14=$argv_addr;var $arrayidx6=(($14+4*$sub5)&4294967295);HEAP32[(($arrayidx6)>>2)]=$11;var $15=$i;var $inc=((($15)+1)&4294967295);$i=$inc;var $16=$i;var $17=$num_addr;var $shr=($17)>>1;var $cmp=((($16))|0)<((($shr))|0);if($cmp){__label__=1;continue;}else{__label__=2;break $for_body$$for_end$2;}}}}while(0);;return;return;}
70307 function ___strtok_r($s,$delim,$lasts,$skip_leading_delim){;var __label__;var $retval;var $s_addr;var $delim_addr;var $lasts_addr;var $skip_leading_delim_addr;var $spanp;var $c;var $sc;var $tok;$s_addr=$s;$delim_addr=$delim;$lasts_addr=$lasts;$skip_leading_delim_addr=$skip_leading_delim;var $0=$s_addr;var $cmp=((($0))|0)==0;if($cmp){__label__=1;;}else{__label__=3;;}
70308 $land_lhs_true$$cont$2:do{if(__label__==1){var $1=$lasts_addr;var $2=HEAP32[(($1)>>2)];$s_addr=$2;var $cmp1=((($2))|0)==0;if(!($cmp1)){__label__=3;break $land_lhs_true$$cont$2;}
70309 $retval=0;__label__=18;break $land_lhs_true$$cont$2;}}while(0);if(__label__==3){$cont$6:while(1){var $3=$s_addr;var $incdec_ptr=(($3+1)&4294967295);$s_addr=$incdec_ptr;var $4=HEAP8[($3)];var $conv=(tempInt=(($4)),(tempInt>=128?tempInt-256:tempInt));$c=$conv;var $5=$delim_addr;$spanp=$5;;while(1){var $6=$spanp;var $incdec_ptr2=(($6+1)&4294967295);$spanp=$incdec_ptr2;var $7=HEAP8[($6)];var $conv3=(tempInt=(($7)),(tempInt>=128?tempInt-256:tempInt));$sc=$conv3;var $cmp4=((($conv3))|0)!=0;var $8=$c;if(!($cmp4)){__label__=8;break $cont$6;}
70310 var $9=$sc;var $cmp5=((($8))|0)==((($9))|0);if($cmp5){__label__=6;break;}else{__label__=4;continue;}}
70311 var $10=$skip_leading_delim_addr;var $tobool=((($10))|0)!=0;if($tobool){__label__=3;continue $cont$6;}else{__label__=7;break $cont$6;}}
70312 if(__label__==8){var $cmp9=((($8))|0)==0;if($cmp9){__label__=9;;}else{__label__=10;;}
70313 if(__label__==9){var $15=$lasts_addr;HEAP32[(($15)>>2)]=0;$retval=0;;}
70314 else if(__label__==10){var $16=$s_addr;var $add_ptr12=(($16+-1)&4294967295);$tok=$add_ptr12;;$for_cond13$17:while(1){var $17=$s_addr;var $incdec_ptr14=(($17+1)&4294967295);$s_addr=$incdec_ptr14;var $18=HEAP8[($17)];var $conv15=(tempInt=(($18)),(tempInt>=128?tempInt-256:tempInt));$c=$conv15;var $19=$delim_addr;$spanp=$19;;while(1){var $20=$spanp;var $incdec_ptr16=(($20+1)&4294967295);$spanp=$incdec_ptr16;var $21=HEAP8[($20)];var $conv17=(tempInt=(($21)),(tempInt>=128?tempInt-256:tempInt));$sc=$conv17;var $22=$c;var $cmp18=((($conv17))|0)==((($22))|0);if($cmp18){__label__=13;break $for_cond13$17;}
70315 var $28=$sc;var $cmp26=((($28))|0)!=0;if($cmp26){__label__=12;continue;}else{__label__=11;continue $for_cond13$17;}}}
70316 var $23=$c;var $cmp20=((($23))|0)==0;if($cmp20){__label__=14;;}else{__label__=15;;}
70317 if(__label__==14){$s_addr=0;;}
70318 else if(__label__==15){var $24=$s_addr;var $arrayidx23=(($24+-1)&4294967295);HEAP8[($arrayidx23)]=0;;}
70319 var $25=$s_addr;var $26=$lasts_addr;HEAP32[(($26)>>2)]=$25;var $27=$tok;$retval=$27;;}}
70320 else if(__label__==7){var $11=$s_addr;var $12=$lasts_addr;HEAP32[(($12)>>2)]=$11;var $13=$s_addr;var $arrayidx=(($13+-1)&4294967295);HEAP8[($arrayidx)]=0;var $14=$s_addr;var $add_ptr=(($14+-1)&4294967295);$retval=$add_ptr;;}}
70321 var $29=$retval;;return $29;return null;}
70322 function _strtok_r($s,$delim,$lasts){;var __label__;var $s_addr;var $delim_addr;var $lasts_addr;$s_addr=$s;$delim_addr=$delim;$lasts_addr=$lasts;var $0=$s_addr;var $1=$delim_addr;var $2=$lasts_addr;var $call=___strtok_r($0,$1,$2,1);;return $call;return null;}
70323 function _strtok($s,$delim){var __stackBase__=STACKTOP;STACKTOP+=4;_memset(__stackBase__,0,4);var __label__;var $s_addr;var $delim_addr;var $chr=__stackBase__;$s_addr=$s;$delim_addr=$delim;var $0=$s_addr;var $1=$delim_addr;var $call=___strtok_r($0,$1,$chr,1);STACKTOP=__stackBase__;return $call;return null;}
70324 Module.callMain=function callMain(args){var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0);}}
70325 var argv=[allocate(intArrayFromString("/bin/this.program"),'i8',ALLOC_STATIC)];pad();for(var i=0;i<argc-1;i=i+1){argv.push(allocate(intArrayFromString(args[i]),'i8',ALLOC_STATIC));pad();}
70326 argv.push(0);argv=allocate(argv,'i32',ALLOC_STATIC);return _main(argc,argv,0);}
70327 function run(args){args=args||Module.arguments;_path_home=allocate(150,"i8",ALLOC_STATIC);_filetype=allocate(5,"i8",ALLOC_STATIC);_wavefile=allocate(200,"i8",ALLOC_STATIC);_uri_callback=allocate(1,"i32 (i32, i8*, i8*)*",ALLOC_STATIC);_phoneme_callback=allocate(1,"i32 (i8*)*",ALLOC_STATIC);_f_wave=allocate(1,"%struct.__sFILE*",ALLOC_STATIC);_quiet=allocate(1,"i32",ALLOC_STATIC);_samples_total=allocate(1,"i32",ALLOC_STATIC);_samples_split=allocate(1,"i32",ALLOC_STATIC);_wavefile_count=allocate(1,"i32",ALLOC_STATIC);_end_of_sentence=allocate(1,"i32",ALLOC_STATIC);_voice_pcnt=allocate(60,"i16",ALLOC_STATIC);__ZZ13DisplayVoicesP7__sFILEPcE7genders=allocate([32,77,70,32],"i8",ALLOC_STATIC);__str1=allocate([80,116,121,32,76,97,110,103,117,97,103,101,32,65,103,101,47,71,101,110,100,101,114,32,86,111,105,99,101,78,97,109,101,32,32,32,32,32,32,32,70,105,108,101,32,32,32,32,32,32,32,32,79,116,104,101,114,32,76,97,110,103,115,10,0],"i8",ALLOC_STATIC);__str3=allocate([37,51,100,0],"i8",ALLOC_STATIC);__str4=allocate([37,50,100,32,32,37,45,49,50,115,37,115,37,99,32,32,37,45,49,55,115,32,37,45,49,49,115,32,0],"i8",ALLOC_STATIC);__str5=allocate([40,37,115,32,37,100,41,0],"i8",ALLOC_STATIC);__ZZ4mainE12long_options=allocate([0,0,0,0,0,0,0,0,0,0,0,0,104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,256,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,257,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,258,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,259,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,262,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,263,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,264,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,266,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i32*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32*",0,0,0,"i32",0,0,0],ALLOC_STATIC);__str6=allocate([104,101,108,112,0],"i8",ALLOC_STATIC);__str7=allocate([115,116,100,105,110,0],"i8",ALLOC_STATIC);__str8=allocate([99,111,109,112,105,108,101,45,100,101,98,117,103,0],"i8",ALLOC_STATIC);__str9=allocate([99,111,109,112,105,108,101,0],"i8",ALLOC_STATIC);__str10=allocate([112,117,110,99,116,0],"i8",ALLOC_STATIC);__str11=allocate([118,111,105,99,101,115,0],"i8",ALLOC_STATIC);__str12=allocate([115,116,100,111,117,116,0],"i8",ALLOC_STATIC);__str13=allocate([115,112,108,105,116,0],"i8",ALLOC_STATIC);__str14=allocate([112,97,116,104,0],"i8",ALLOC_STATIC);__str15=allocate([112,104,111,110,111,117,116,0],"i8",ALLOC_STATIC);__str16=allocate([112,104,111,0],"i8",ALLOC_STATIC);__str17=allocate([105,112,97,0],"i8",ALLOC_STATIC);__str18=allocate([70,97,105,108,101,100,32,116,111,32,114,101,97,100,32,0],"i8",ALLOC_STATIC);__str19=allocate([97,58,98,58,102,58,103,58,104,107,58,108,58,112,58,113,115,58,118,58,119,58,120,88,109,122,0],"i8",ALLOC_STATIC);__str21=allocate([10,115,112,101,97,107,32,116,101,120,116,45,116,111,45,115,112,101,101,99,104,58,32,37,115,32,32,32,68,97,116,97,32,97,116,58,32,37,115,10,37,115,0],"i8",ALLOC_STATIC);__str23=allocate([67,97,110,39,116,32,119,114,105,116,101,32,116,111,58,32,37,115,10,0],"i8",ALLOC_STATIC);__str25=allocate([37,115,118,111,105,99,101,32,39,37,115,39,10,0],"i8",ALLOC_STATIC);__str27=allocate([37,115,102,105,108,101,32,39,37,115,39,10,0],"i8",ALLOC_STATIC);__str28=allocate([67,97,110,39,116,32,119,114,105,116,101,32,116,111,32,111,117,116,112,117,116,32,102,105,108,101,32,39,37,115,39,10,39,0],"i8",ALLOC_STATIC);__str29=allocate([45,119,32,111,112,116,105,111,110,32,109,117,115,116,32,98,101,32,117,115,101,100,32,98,101,99,97,117,115,101,32,116,104,101,32,112,114,111,103,114,97,109,32,119,97,115,32,98,117,105,108,116,32,119,105,116,104,111,117,116,32,97,32,115,111,117,110,100,32,105,110,116,101,114,102,97,99,101,10,0],"i8",ALLOC_STATIC);__str30=allocate([37,115,95,37,46,50,100,37,115,0],"i8",ALLOC_STATIC);__ZZL12OpenWaveFilePKciE8wave_hdr=allocate([82,73,70,70,36,240,255,127,87,65,86,69,102,109,116,32,16,0,0,0,1,0,1,0,9,61,0,0,18,122,0,0,2,0,16,0,100,97,116,97,0,240,255,127],"i8",ALLOC_STATIC);__str32=allocate([101,110,95,85,83,46,85,84,70,45,56,0],"i8",ALLOC_STATIC);__str33=allocate([85,84,70,45,56,0],"i8",ALLOC_STATIC);__str35=allocate([70,97,105,108,101,100,32,116,111,32,108,111,97,100,32,101,115,112,101,97,107,45,100,97,116,97,10,0],"i8",ALLOC_STATIC);__str36=allocate([87,114,111,110,103,32,118,101,114,115,105,111,110,32,111,102,32,101,115,112,101,97,107,45,100,97,116,97,32,48,120,37,120,32,40,101,120,112,101,99,116,115,32,48,120,37,120,41,32,97,116,32,37,115,10,0],"i8",ALLOC_STATIC);__str37=allocate([10,115,112,101,97,107,32,91,111,112,116,105,111,110,115,93,32,91,34,60,119,111,114,100,115,62,34,93,10,10,45,102,32,60,116,101,120,116,32,102,105,108,101,62,32,32,32,84,101,120,116,32,102,105,108,101,32,116,111,32,115,112,101,97,107,10,45,45,115,116,100,105,110,32,32,32,32,82,101,97,100,32,116,101,120,116,32,105,110,112,117,116,32,102,114,111,109,32,115,116,100,105,110,32,105,110,115,116,101,97,100,32,111,102,32,97,32,102,105,108,101,10,10,73,102,32,110,101,105,116,104,101,114,32,45,102,32,110,111,114,32,45,45,115,116,100,105,110,44,32,116,104,101,110,32,60,119,111,114,100,115,62,32,97,114,101,32,115,112,111,107,101,110,44,32,111,114,32,105,102,32,110,111,110,101,32,116,104,101,110,32,116,101,120,116,10,105,115,32,115,112,111,107,101,110,32,102,114,111,109,32,115,116,100,105,110,44,32,101,97,99,104,32,108,105,110,101,32,115,101,112,97,114,97,116,101,108,121,46,10,10,45,97,32,60,105,110,116,101,103,101,114,62,10,9,32,32,32,65,109,112,108,105,116,117,100,101,44,32,48,32,116,111,32,50,48,48,44,32,100,101,102,97,117,108,116,32,105,115,32,49,48,48,10,45,103,32,60,105,110,116,101,103,101,114,62,10,9,32,32,32,87,111,114,100,32,103,97,112,46,32,80,97,117,115,101,32,98,101,116,119,101,101,110,32,119,111,114,100,115,44,32,117,110,105,116,115,32,111,102,32,49,48,109,83,32,97,116,32,116,104,101,32,100,101,102,97,117,108,116,32,115,112,101,101,100,10,45,107,32,60,105,110,116,101,103,101,114,62,10,9,32,32,32,73,110,100,105,99,97,116,101,32,99,97,112,105,116,97,108,32,108,101,116,116,101,114,115,32,119,105,116,104,58,32,49,61,115,111,117,110,100,44,32,50,61,116,104,101,32,119,111,114,100,32,34,99,97,112,105,116,97,108,115,34,44,10,9,32,32,32,104,105,103,104,101,114,32,118,97,108,117,101,115,32,105,110,100,105,99,97,116,101,32,97,32,112,105,116,99,104,32,105,110,99,114,101,97,115,101,32,40,116,114,121,32,45,107,50,48,41,46,10,45,108,32,60,105,110,116,101,103,101,114,62,10,9,32,32,32,76,105,110,101,32,108,101,110,103,116,104,46,32,73,102,32,110,111,116,32,122,101,114,111,32,40,119,104,105,99,104,32,105,115,32,116,104,101,32,100,101,102,97,117,108,116,41,44,32,99,111,110,115,105,100,101,114,10,9,32,32,32,108,105,110,101,115,32,108,101,115,115,32,116,104,97,110,32,116,104,105,115,32,108,101,110,103,116,104,32,97,115,32,101,110,100,45,111,102,45,99,108,97,117,115,101,10,45,112,32,60,105,110,116,101,103,101,114,62,10,9,32,32,32,80,105,116,99,104,32,97,100,106,117,115,116,109,101,110,116,44,32,48,32,116,111,32,57,57,44,32,100,101,102,97,117,108,116,32,105,115,32,53,48,10,45,115,32,60,105,110,116,101,103,101,114,62,10,9,32,32,32,83,112,101,101,100,32,105,110,32,119,111,114,100,115,32,112,101,114,32,109,105,110,117,116,101,44,32,56,48,32,116,111,32,52,53,48,44,32,100,101,102,97,117,108,116,32,105,115,32,49,55,53,10,45,118,32,60,118,111,105,99,101,32,110,97,109,101,62,10,9,32,32,32,85,115,101,32,118,111,105,99,101,32,102,105,108,101,32,111,102,32,116,104,105,115,32,110,97,109,101,32,102,114,111,109,32,101,115,112,101,97,107,45,100,97,116,97,47,118,111,105,99,101,115,10,45,119,32,60,119,97,118,101,32,102,105,108,101,32,110,97,109,101,62,10,9,32,32,32,87,114,105,116,101,32,115,112,101,101,99,104,32,116,111,32,116,104,105,115,32,87,65,86,32,102,105,108,101,44,32,114,97,116,104,101,114,32,116,104,97,110,32,115,112,101,97,107,105,110,103,32,105,116,32,100,105,114,101,99,116,108,121,10,45,98,9,32,32,32,73,110,112,117,116,32,116,101,120,116,32,101,110,99,111,100,105,110,103,44,32,49,61,85,84,70,56,44,32,50,61,56,32,98,105,116,44,32,52,61,49,54,32,98,105,116,32,10,45,109,9,32,32,32,73,110,116,101,114,112,114,101,116,32,83,83,77,76,32,109,97,114,107,117,112,44,32,97,110,100,32,105,103,110,111,114,101,32,111,116,104,101,114,32,60,32,62,32,116,97,103,115,10,45,113,9,32,32,32,81,117,105,101,116,44,32,100,111,110,39,116,32,112,114,111,100,117,99,101,32,97,110,121,32,115,112,101,101,99,104,32,40,109,97,121,32,98,101,32,117,115,101,102,117,108,32,119,105,116,104,32,45,120,41,10,45,120,9,32,32,32,87,114,105,116,101,32,112,104,111,110,101,109,101,32,109,110,101,109,111,110,105,99,115,32,116,111,32,115,116,100,111,117,116,10,45,88,9,32,32,32,87,114,105,116,101,32,112,104,111,110,101,109,101,115,32,109,110,101,109,111,110,105,99,115,32,97,110,100,32,116,114,97,110,115,108,97,116,105,111,110,32,116,114,97,99,101,32,116,111,32,115,116,100,111,117,116,10,45,122,9,32,32,32,78,111,32,102,105,110,97,108,32,115,101,110,116,101,110,99,101,32,112,97,117,115,101,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,116,101,120,116,10,45,45,99,111,109,112,105,108,101,61,60,118,111,105,99,101,32,110,97,109,101,62,10,9,32,32,32,67,111,109,112,105,108,101,32,112,114,111,110,117,110,99,105,97,116,105,111,110,32,114,117,108,101,115,32,97,110,100,32,100,105,99,116,105,111,110,97,114,121,32,102,114,111,109,32,116,104,101,32,99,117,114,114,101,110,116,10,9,32,32,32,100,105,114,101,99,116,111,114,121,46,32,60,118,111,105,99,101,32,110,97,109,101,62,32,115,112,101,99,105,102,105,101,115,32,116,104,101,32,108,97,110,103,117,97,103,101,10,45,45,105,112,97,32,32,32,32,32,32,87,114,105,116,101,32,112,104,111,110,101,109,101,115,32,116,111,32,115,116,100,111,117,116,32,117,115,105,110,103,32,73,110,116,101,114,110,97,116,105,111,110,97,108,32,80,104,111,110,101,116,105,99,32,65,108,112,104,97,98,101,116,10,45,45,112,97,116,104,61,34,60,112,97,116,104,62,34,10,9,32,32,32,83,112,101,99,105,102,105,101,115,32,116,104,101,32,100,105,114,101,99,116,111,114,121,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,101,115,112,101,97,107,45,100,97,116,97,32,100,105,114,101,99,116,111,114,121,10,45,45,112,104,111,32,32,32,32,32,32,87,114,105,116,101,32,109,98,114,111,108,97,32,112,104,111,110,101,109,101,32,100,97,116,97,32,40,46,112,104,111,41,32,116,111,32,115,116,100,111,117,116,32,111,114,32,116,111,32,116,104,101,32,102,105,108,101,32,105,110,32,45,45,112,104,111,110,111,117,116,10,45,45,112,104,111,110,111,117,116,61,34,60,102,105,108,101,110,97,109,101,62,34,10,9,32,32,32,87,114,105,116,101,32,112,104,111,110,101,109,101,32,111,117,116,112,117,116,32,102,114,111,109,32,45,120,32,45,88,32,45,45,105,112,97,32,97,110,100,32,45,45,112,104,111,32,116,111,32,116,104,105,115,32,102,105,108,101,10,45,45,112,117,110,99,116,61,34,60,99,104,97,114,97,99,116,101,114,115,62,34,10,9,32,32,32,83,112,101,97,107,32,116,104,101,32,110,97,109,101,115,32,111,102,32,112,117,110,99,116,117,97,116,105,111,110,32,99,104,97,114,97,99,116,101,114,115,32,100,117,114,105,110,103,32,115,112,101,97,107,105,110,103,46,32,32,73,102,10,9,32,32,32,61,60,99,104,97,114,97,99,116,101,114,115,62,32,105,115,32,111,109,105,116,116,101,100,44,32,97,108,108,32,112,117,110,99,116,117,97,116,105,111,110,32,105,115,32,115,112,111,107,101,110,46,10,45,45,115,112,108,105,116,61,34,60,109,105,110,117,116,101,115,62,34,10,9,32,32,32,83,116,97,114,116,115,32,97,32,110,101,119,32,87,65,86,32,102,105,108,101,32,101,118,101,114,121,32,60,109,105,110,117,116,101,115,62,46,32,32,85,115,101,100,32,119,105,116,104,32,45,119,10,45,45,115,116,100,111,117,116,32,32,32,87,114,105,116,101,32,115,112,101,101,99,104,32,111,117,116,112,117,116,32,116,111,32,115,116,100,111,117,116,10,45,45,118,111,105,99,101,115,61,60,108,97,110,103,117,97,103,101,62,10,9,32,32,32,76,105,115,116,32,116,104,101,32,97,118,97,105,108,97,98,108,101,32,118,111,105,99,101,115,32,102,111,114,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,108,97,110,103,117,97,103,101,46,10,9,32,32,32,73,102,32,60,108,97,110,103,117,97,103,101,62,32,105,115,32,111,109,105,116,116,101,100,44,32,116,104,101,110,32,108,105,115,116,32,97,108,108,32,118,111,105,99,101,115,46,10,0],"i8",ALLOC_STATIC);__str38=allocate([37,115,47,101,115,112,101,97,107,45,100,97,116,97,0],"i8",ALLOC_STATIC);__str39=allocate([69,83,80,69,65,75,95,68,65,84,65,95,80,65,84,72,0],"i8",ALLOC_STATIC);__str40=allocate([72,79,77,69,0],"i8",ALLOC_STATIC);__str41=allocate([47,117,115,114,47,115,104,97,114,101,47,101,115,112,101,97,107,45,100,97,116,97,0],"i8",ALLOC_STATIC);__ZL5f_log=allocate(1,"%struct.__sFILE*",ALLOC_STATIC);__str42=allocate([117,110,112,114,0],"i8",ALLOC_STATIC);__str143=allocate([119,95,97,108,116,50,0],"i8",ALLOC_STATIC);__str244=allocate([119,95,97,108,116,51,0],"i8",ALLOC_STATIC);__str345=allocate([119,95,97,108,116,0],"i8",ALLOC_STATIC);__str446=allocate([112,95,97,108,116,50,0],"i8",ALLOC_STATIC);__str547=allocate([112,95,97,108,116,51,0],"i8",ALLOC_STATIC);__str648=allocate([112,95,97,108,116,0],"i8",ALLOC_STATIC);_mnem_rules=allocate([0,0,0,0,1,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,19,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,34,0,0,0,0,0,0,0,35,0,0,0,0,0,0,0,33,0,0,0,0,0,0,0,-1,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0],ALLOC_STATIC);__str749=allocate([36,49,0],"i8",ALLOC_STATIC);__str850=allocate([36,50,0],"i8",ALLOC_STATIC);__str951=allocate([36,51,0],"i8",ALLOC_STATIC);__str1052=allocate([36,52,0],"i8",ALLOC_STATIC);__str1153=allocate([36,53,0],"i8",ALLOC_STATIC);__str1254=allocate([36,54,0],"i8",ALLOC_STATIC);__str1355=allocate([36,55,0],"i8",ALLOC_STATIC);__str1456=allocate([36,117,0],"i8",ALLOC_STATIC);__str1557=allocate([36,117,49,0],"i8",ALLOC_STATIC);__str1658=allocate([36,117,50,0],"i8",ALLOC_STATIC);__str1759=allocate([36,117,51,0],"i8",ALLOC_STATIC);__str1860=allocate([36,117,43,0],"i8",ALLOC_STATIC);__str1961=allocate([36,117,49,43,0],"i8",ALLOC_STATIC);__str2062=allocate([36,117,50,43,0],"i8",ALLOC_STATIC);__str2163=allocate([36,117,51,43,0],"i8",ALLOC_STATIC);__str2264=allocate([36,112,97,117,115,101,0],"i8",ALLOC_STATIC);__str2365=allocate([36,111,110,108,121,0],"i8",ALLOC_STATIC);__str2466=allocate([36,111,110,108,121,115,0],"i8",ALLOC_STATIC);__str2567=allocate([36,115,116,114,101,110,100,0],"i8",ALLOC_STATIC);__str2668=allocate([36,115,116,114,101,110,100,50,0],"i8",ALLOC_STATIC);__str2769=allocate([36,117,110,115,116,114,101,115,115,101,110,100,0],"i8",ALLOC_STATIC);__str2870=allocate([36,97,116,101,110,100,0],"i8",ALLOC_STATIC);__str2971=allocate([36,97,116,115,116,97,114,116,0],"i8",ALLOC_STATIC);__str3072=allocate([36,97,98,98,114,101,118,0],"i8",ALLOC_STATIC);__str3173=allocate([36,115,116,101,109,0],"i8",ALLOC_STATIC);__str3274=allocate([36,100,111,117,98,108,101,0],"i8",ALLOC_STATIC);__str3375=allocate([36,97,108,116,0],"i8",ALLOC_STATIC);__str3476=allocate([36,97,108,116,49,0],"i8",ALLOC_STATIC);__str3577=allocate([36,97,108,116,50,0],"i8",ALLOC_STATIC);__str3678=allocate([36,97,108,116,51,0],"i8",ALLOC_STATIC);__str3779=allocate([36,99,111,109,98,105,110,101,0],"i8",ALLOC_STATIC);__str3880=allocate([36,100,111,116,0],"i8",ALLOC_STATIC);__str3981=allocate([36,104,97,115,100,111,116,0],"i8",ALLOC_STATIC);__str4082=allocate([36,109,97,120,51,0],"i8",ALLOC_STATIC);__str4183=allocate([36,98,114,107,0],"i8",ALLOC_STATIC);__str4284=allocate([36,116,101,120,116,0],"i8",ALLOC_STATIC);__str43=allocate([36,118,101,114,98,102,0],"i8",ALLOC_STATIC);__str44=allocate([36,118,101,114,98,115,102,0],"i8",ALLOC_STATIC);__str45=allocate([36,110,111,117,110,102,0],"i8",ALLOC_STATIC);__str46=allocate([36,112,97,115,116,102,0],"i8",ALLOC_STATIC);__str47=allocate([36,118,101,114,98,0],"i8",ALLOC_STATIC);__str48=allocate([36,110,111,117,110,0],"i8",ALLOC_STATIC);__str49=allocate([36,112,97,115,116,0],"i8",ALLOC_STATIC);__str50=allocate([36,118,101,114,98,101,120,116,101,110,100,0],"i8",ALLOC_STATIC);__str51=allocate([36,99,97,112,105,116,97,108,0],"i8",ALLOC_STATIC);__str52=allocate([36,97,108,108,99,97,112,115,0],"i8",ALLOC_STATIC);__str53=allocate([36,97,99,99,101,110,116,0],"i8",ALLOC_STATIC);__str54=allocate([36,115,101,110,116,101,110,99,101,0],"i8",ALLOC_STATIC);__str55=allocate([36,63,0],"i8",ALLOC_STATIC);__str56=allocate([36,116,101,120,116,109,111,100,101,0],"i8",ALLOC_STATIC);__str57=allocate([36,112,104,111,110,101,109,101,109,111,100,101,0],"i8",ALLOC_STATIC);_mnem_flags=allocate([0,0,0,0,65,0,0,0,0,0,0,0,66,0,0,0,0,0,0,0,67,0,0,0,0,0,0,0,68,0,0,0,0,0,0,0,69,0,0,0,0,0,0,0,70,0,0,0,0,0,0,0,71,0,0,0,0,0,0,0,72,0,0,0,0,0,0,0,73,0,0,0,0,0,0,0,74,0,0,0,0,0,0,0,75,0,0,0,0,0,0,0,76,0,0,0,0,0,0,0,77,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,79,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,19,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,23,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,25,0,0,0,0,0,0,0,27,0,0,0,0,0,0,0,28,0,0,0,0,0,0,0,29,0,0,0,0,0,0,0,32,0,0,0,0,0,0,0,33,0,0,0,0,0,0,0,34,0,0,0,0,0,0,0,35,0,0,0,0,0,0,0,36,0,0,0,0,0,0,0,37,0,0,0,0,0,0,0,38,0,0,0,0,0,0,0,40,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,43,0,0,0,0,0,0,0,45,0,0,0,0,0,0,0,100,0,0,0,0,0,0,0,200,0,0,0,0,0,0,0,201,0,0,0,0,0,0,0,-1,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0],ALLOC_STATIC);__ZZ22print_dictionary_flagsPjE3buf=allocate(20,"i8",ALLOC_STATIC);__str59=allocate([37,115,32,32,48,120,37,120,47,37,120,0],"i8",ALLOC_STATIC);__ZZ10DecodeRulePKciPciE6output=allocate(60,"i8",ALLOC_STATIC);__ZZ10DecodeRulePKciPciE7symbols=allocate([32,32,32,32,32,32,32,32,32,32,38,37,43,35,83,68,90,65,76,33,32,64,63,74,78,75,86,63,84,88,63,87],"i8",ALLOC_STATIC);__ZZ10DecodeRulePKciPciE10symbols_lg=allocate([65,66,67,72,70,71,89],"i8",ALLOC_STATIC);__str60=allocate([32,40,0],"i8",ALLOC_STATIC);__str61=allocate([101,105,112,118,100,102,113,32,116,98,97,32,0],"i8",ALLOC_STATIC);__str62=allocate([37,99,37,100,0],"i8",ALLOC_STATIC);__str64=allocate([37,53,100,58,9,0],"i8",ALLOC_STATIC);__str65=allocate([63,37,100,32,0],"i8",ALLOC_STATIC);__ZL11error_count=allocate(1,"i32",ALLOC_STATIC);__ZL21error_need_dictionary=allocate(1,"i32",ALLOC_STATIC);__ZL19letterGroupsDefined=allocate(26,"i8",ALLOC_STATIC);__ZL10debug_flag=allocate(1,"i32",ALLOC_STATIC);__str66=allocate([37,115,37,115,95,0],"i8",ALLOC_STATIC);__str67=allocate([37,115,114,117,108,101,115,46,116,120,116,0],"i8",ALLOC_STATIC);__str69=allocate([37,115,114,117,108,101,115,0],"i8",ALLOC_STATIC);__str71=allocate([119,98,43,0],"i8",ALLOC_STATIC);__str72=allocate([37,115,37,99,116,101,109,112,0],"i8",ALLOC_STATIC);__str73=allocate([85,115,105,110,103,32,112,104,111,110,101,109,101,116,97,98,108,101,58,32,39,37,115,39,10,0],"i8",ALLOC_STATIC);__str74=allocate([114,111,111,116,115,0],"i8",ALLOC_STATIC);__str75=allocate([108,105,115,116,0],"i8",ALLOC_STATIC);__str76=allocate([108,105,115,116,120,0],"i8",ALLOC_STATIC);__str77=allocate([101,120,116,114,97,0],"i8",ALLOC_STATIC);__str78=allocate([67,111,109,112,105,108,105,110,103,58,32,39,37,115,39,10,0],"i8",ALLOC_STATIC);__ZL7linenum=allocate(1,"i32",ALLOC_STATIC);__ZL10group_name=allocate(13,"i8",ALLOC_STATIC);__str79=allocate([119,98,0],"i8",ALLOC_STATIC);__ZL9group3_ix=allocate(1,"i32",ALLOC_STATIC);__str81=allocate([46,76,0],"i8",ALLOC_STATIC);__str82=allocate([46,114,101,112,108,97,99,101,0],"i8",ALLOC_STATIC);__str83=allocate([46,103,114,111,117,112,0],"i8",ALLOC_STATIC);__str84=allocate([48,120,37,120,0],"i8",ALLOC_STATIC);__str85=allocate([37,53,100,58,32,71,114,111,117,112,32,110,97,109,101,32,108,111,110,103,101,114,32,116,104,97,110,32,50,32,98,121,116,101,115,32,40,85,84,70,56,41,0],"i8",ALLOC_STATIC);__str89=allocate([9,37,100,32,114,117,108,101,115,44,32,37,100,32,103,114,111,117,112,115,32,40,37,100,41,10,10,0],"i8",ALLOC_STATIC);__ZL9rule_cond=allocate(80,"i8",ALLOC_STATIC);__ZL8rule_pre=allocate(80,"i8",ALLOC_STATIC);__ZL9rule_post=allocate(80,"i8",ALLOC_STATIC);__ZL10rule_match=allocate(80,"i8",ALLOC_STATIC);__ZL13rule_phonemes=allocate(80,"i8",ALLOC_STATIC);__str90=allocate([37,53,100,58,32,83,121,110,116,97,120,32,101,114,114,111,114,46,32,83,112,97,99,101,32,97,102,116,101,114,32,40,10,0],"i8",ALLOC_STATIC);__str91=allocate([36,103,114,111,117,112,0],"i8",ALLOC_STATIC);__str92=allocate([37,53,100,58,32,83,121,110,116,97,120,32,101,114,114,111,114,10,0],"i8",ALLOC_STATIC);__str93=allocate([37,53,100,58,32,66,97,100,32,112,104,111,110,101,109,101,32,91,37,99,93,32,105,110,32,37,115,10,0],"i8",ALLOC_STATIC);__str94=allocate([37,53,100,58,32,87,114,111,110,103,32,105,110,105,116,105,97,108,32,108,101,116,116,101,114,115,32,39,37,115,39,32,102,111,114,32,103,114,111,117,112,32,39,37,115,39,10,0],"i8",ALLOC_STATIC);__str95=allocate([37,53,100,58,32,98,97,100,32,99,111,110,100,105,116,105,111,110,32,110,117,109,98,101,114,32,63,37,100,10,0],"i8",ALLOC_STATIC);__ZZL16copy_rule_stringPcRiE6outbuf=allocate(20,"i8*",ALLOC_STATIC);__ZZL16copy_rule_stringPcRiE10next_state=allocate([2,0,0,0,2,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0],["i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0],ALLOC_STATIC);__ZZL16copy_rule_stringPcRiE16lettergp_letters=allocate([0,1,2,0,0,4,5,3,6],"i8",ALLOC_STATIC);__str97=allocate([37,53,100,58,32,69,120,112,101,99,116,101,100,32,50,32,100,105,103,105,116,115,32,97,102,116,101,114,32,39,76,39,10,0],"i8",ALLOC_STATIC);__str98=allocate([37,53,100,58,32,76,101,116,116,101,114,32,103,114,111,117,112,32,76,37,46,50,100,32,110,111,116,32,100,101,102,105,110,101,100,10,0],"i8",ALLOC_STATIC);__str99=allocate([37,53,100,58,32,36,32,99,111,109,109,97,110,100,32,110,111,116,32,114,101,99,111,103,110,105,122,101,100,10,0],"i8",ALLOC_STATIC);__str100=allocate([37,53,100,58,32,69,120,112,101,99,116,101,100,32,50,32,100,105,103,105,116,115,32,97,102,116,101,114,32,39,46,76,39,10,0],"i8",ALLOC_STATIC);__str101=allocate([37,53,100,58,32,108,101,116,116,101,114,103,114,111,117,112,32,111,117,116,32,111,102,32,114,97,110,103,101,32,40,48,49,45,37,46,50,100,41,10,0],"i8",ALLOC_STATIC);__str102=allocate([37,53,100,58,32,108,101,116,116,101,114,103,114,111,117,112,32,76,37,46,50,100,32,105,115,32,97,108,114,101,97,100,121,32,100,101,102,105,110,101,100,10,0],"i8",ALLOC_STATIC);__str103=allocate([57,0],"i8",ALLOC_STATIC);__ZL11hash_chains=allocate(4096,"i8*",ALLOC_STATIC);__ZL11hash_counts=allocate(4096,"i32",ALLOC_STATIC);__ZL9text_mode_b=allocate(1,"i1",ALLOC_STATIC);__str104=allocate([37,115,37,115,46,116,120,116,0],"i8",ALLOC_STATIC);__str106=allocate([67,97,110,39,116,32,97,108,108,111,99,97,116,101,32,109,101,109,111,114,121,10,0],"i8",ALLOC_STATIC);__str107=allocate([9,37,100,32,101,110,116,114,105,101,115,10,0],"i8",ALLOC_STATIC);__ZZL12compile_linePcS_PiE10nullstring=allocate(1,"i8",ALLOC_STATIC);__str108=allocate([95,45,0],"i8",ALLOC_STATIC);__str109=allocate([37,53,100,58,32,85,110,107,110,111,119,110,32,107,101,121,119,111,114,100,58,32,37,115,10,0],"i8",ALLOC_STATIC);__str110=allocate([32,0],"i8",ALLOC_STATIC);__str111=allocate([37,53,100,58,32,78,101,101,100,32,116,111,32,99,111,109,112,105,108,101,32,100,105,99,116,105,111,110,97,114,121,32,97,103,97,105,110,10,0],"i8",ALLOC_STATIC);__str112=allocate([37,53,100,58,32,66,97,100,32,112,104,111,110,101,109,101,32,91,37,99,93,32,40,48,120,37,120,41,32,105,110,58,32,37,115,32,32,37,115,10,0],"i8",ALLOC_STATIC);__str113=allocate([85,43,37,120,0],"i8",ALLOC_STATIC);__str114=allocate([37,53,100,58,32,84,119,111,32,109,97,110,121,32,112,97,114,116,115,32,105,110,32,97,32,109,117,108,116,105,45,119,111,114,100,32,101,110,116,114,121,58,32,37,100,10,0],"i8",ALLOC_STATIC);__str115=allocate([67,97,110,39,116,32,97,99,99,101,115,115,32,40,37,115,41,32,102,105,108,101,32,39,37,115,39,10,0],"i8",ALLOC_STATIC);_dictionary_skipwords=allocate(1,"i32",ALLOC_STATIC);_dictionary_name=allocate(40,"i8",ALLOC_STATIC);__ZL13remove_accent=allocate([97,97,97,97,97,97,97,99,101,101,101,101,105,105,105,105,100,110,111,111,111,111,111,0,111,117,117,117,117,121,116,115,97,97,97,97,97,97,97,99,101,101,101,101,105,105,105,105,100,110,111,111,111,111,111,0,111,117,117,117,117,121,116,121,97,97,97,97,97,97,99,99,99,99,99,99,99,99,100,100,100,100,101,101,101,101,101,101,101,101,101,101,103,103,103,103,103,103,103,103,104,104,104,104,105,105,105,105,105,105,105,105,105,105,105,105,106,106,107,107,107,108,108,108,108,108,108,108,108,108,108,110,110,110,110,110,110,110,110,110,111,111,111,111,111,111,111,111,114,114,114,114,114,114,115,115,115,115,115,115,115,115,116,116,116,116,116,116,117,117,117,117,117,117,117,117,117,117,117,117,119,119,121,121,121,122,122,122,122,122,122,115,98,98,98,98,0,0,111,99,99,100,100,100,100,100,101,101,101,102,102,103,103,104,105,105,107,107,108,108,109,110,110,111,111,111,111,111,112,112,121,0,0,115,115,116,116,116,116,117,117,117,118,121,121,122,122,122,122,122,122,122,0,0,0,119,116,116,116,107,100,100,100,108,108,108,110,110,110,97,97,105,105,111,111,117,117,117,117,117,117,117,117,117,117,101,97,97,97,97,97,97,103,103,103,103,107,107,111,111,111,111,122,122,106,100,100,100,103,103,119,119,110,110,97,97,97,97,111,111,97,97,97,97,101,101,101,101,105,105,105,105,111,111,111,111,114,114,114,114,117,117,117,117,115,115,116,116,121,121,104,104,110,100,111,111,122,122,97,97,101,101,111,111,111,111,111,111,111,111,121,121,108,110,116,106,100,113,97,99,99,108,116,115,122,0,0,98,117,118,101,101,106,106,113,113,114,114,121,121,97,97,97,98,111,99,100,100,101,101,101,101,101,101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"i8",ALLOC_STATIC);__str116=allocate([37,115,37,99,37,115,95,100,105,99,116,0],"i8",ALLOC_STATIC);__str2118=allocate([67,97,110,39,116,32,114,101,97,100,32,100,105,99,116,105,111,110,97,114,121,32,102,105,108,101,58,32,39,37,115,39,10,0],"i8",ALLOC_STATIC);__str3119=allocate([69,109,112,116,121,32,95,100,105,99,116,32,102,105,108,101,58,32,39,37,115,10,0],"i8",ALLOC_STATIC);__str4120=allocate([66,97,100,32,100,97,116,97,58,32,39,37,115,39,32,40,37,120,32,108,101,110,103,116,104,61,37,120,41,10,0],"i8",ALLOC_STATIC);__str5121=allocate([69,114,114,111,114,32,105,110,32,37,115,95,114,117,108,101,115,44,32,110,111,32,100,101,102,97,117,108,116,32,114,117,108,101,32,103,114,111,117,112,10,0],"i8",ALLOC_STATIC);__str7123=allocate([61,61,44,44,39,42,32,32,0],"i8",ALLOC_STATIC);_ipa1=allocate([32,0,33,0,34,0,688,0,36,0,37,0,230,0,712,0,40,0,638,0,42,0,43,0,716,0,45,0,46,0,47,0,594,0,49,0,50,0,604,0,52,0,53,0,54,0,55,0,629,0,57,0,720,0,690,0,60,0,61,0,62,0,660,0,601,0,593,0,946,0,231,0,240,0,603,0,70,0,610,0,295,0,618,0,607,0,75,0,76,0,625,0,331,0,596,0,934,0,611,0,640,0,643,0,952,0,650,0,652,0,339,0,967,0,248,0,658,0,810,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,609,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,771,0,127,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__str8124=allocate([61,61,44,44,39,39,0],"i8",ALLOC_STATIC);__str9125=allocate([40,37,115,41,0],"i8",ALLOC_STATIC);__ZL15stress_phonemes=allocate([3,2,4,5,6,7,26],"i8",ALLOC_STATIC);__ZZ13SetWordStressP10TranslatorPcPjiiE15consonant_types=allocate([0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0],"i8",ALLOC_STATIC);__ZZ13SetWordStressP10TranslatorPcPjiiE8guess_ru=allocate([0,0,1,1,2,3,3,4,5,6,7,7,8,9,10,11],"i8",ALLOC_STATIC);__ZZ13SetWordStressP10TranslatorPcPjiiE10guess_ru_v=allocate([0,0,1,1,2,2,3,3,4,5,6,7,7,8,9,10],"i8",ALLOC_STATIC);__ZZ13SetWordStressP10TranslatorPcPjiiE10guess_ru_t=allocate([0,0,1,2,3,3,3,4,5,6,7,7,7,8,9,10],"i8",ALLOC_STATIC);__ZZ14TranslateRulesP10TranslatorPcS1_iS1_iPjE9str_pause=allocate([11,0],"i8",ALLOC_STATIC);__str10126=allocate([85,110,112,114,111,110,111,117,110,99,97,98,108,101,63,32,39,37,115,39,10,0],"i8",ALLOC_STATIC);__str11127=allocate([84,114,97,110,115,108,97,116,101,32,39,37,115,39,10,0],"i8",ALLOC_STATIC);__ZL13diereses_list=allocate([228,0,235,0,239,0,246,0,252,0,255,0,0,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ14LookupDictListP10TranslatorPPcS1_PjiP8WORD_TABE16word_replacement=allocate(160,"i8",ALLOC_STATIC);__str15131=allocate([37,115,32,0],"i8",ALLOC_STATIC);__str16132=allocate([82,101,112,108,97,99,101,58,32,37,115,32,32,37,115,10,0],"i8",ALLOC_STATIC);__ZZ11LookupFlagsP10TranslatorPKcE5flags=allocate(8,"i32",ALLOC_STATIC);__ZZ12RemoveEndingP10TranslatorPciS1_E6ending=allocate(12,"i8",ALLOC_STATIC);__ZZ12RemoveEndingP10TranslatorPciS1_E16add_e_exceptions=allocate(8,"i8*",ALLOC_STATIC);__str17133=allocate([105,111,110,0],"i8",ALLOC_STATIC);__ZZ12RemoveEndingP10TranslatorPciS1_E15add_e_additions=allocate(32,"i8*",ALLOC_STATIC);__str18134=allocate([99,0],"i8",ALLOC_STATIC);__str19135=allocate([114,115,0],"i8",ALLOC_STATIC);__str20136=allocate([105,114,0],"i8",ALLOC_STATIC);__str21137=allocate([117,114,0],"i8",ALLOC_STATIC);__str22138=allocate([97,116,104,0],"i8",ALLOC_STATIC);__str23139=allocate([110,115,0],"i8",ALLOC_STATIC);__str24140=allocate([117,0],"i8",ALLOC_STATIC);__str25141=allocate([97,100,100,32,101,10,0],"i8",ALLOC_STATIC);__str27143=allocate([101,115,0],"i8",ALLOC_STATIC);__str28144=allocate([70,108,97,103,115,58,32,32,37,115,32,32,37,115,10,0],"i8",ALLOC_STATIC);__str29145=allocate([70,111,117,110,100,58,32,39,37,115,32,37,115,0],"i8",ALLOC_STATIC);__str30146=allocate([70,111,117,110,100,58,32,39,37,115,0],"i8",ALLOC_STATIC);__str31147=allocate([39,32,91,37,115,93,32,32,37,115,10,0],"i8",ALLOC_STATIC);__ZZL9MatchRuleP10TranslatorPPcS1_iS1_P11MatchRecordiiE4best=allocate(16,["i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0],ALLOC_STATIC);__str32148=allocate([37,51,100,9,37,115,32,91,37,115,93,10,0],"i8",ALLOC_STATIC);__str34150=allocate([66,97,100,32,114,117,108,101,115,32,100,97,116,97,32,105,110,32,39,37,115,95,100,105,99,116,39,32,97,116,32,48,120,37,120,10,0],"i8",ALLOC_STATIC);_env_fall=allocate([255,253,250,248,246,244,242,240,238,236,234,232,230,228,226,224,222,220,218,216,214,212,210,208,206,204,202,200,198,196,194,192,190,188,186,184,182,180,178,176,174,172,170,168,166,164,162,160,158,156,154,152,150,148,146,144,142,140,138,136,134,132,130,128,126,124,122,120,118,116,114,112,110,108,106,104,102,100,98,96,94,92,90,88,86,84,82,80,78,76,74,72,70,68,66,64,62,60,58,56,54,52,50,48,46,44,42,40,38,36,34,32,30,28,26,24,22,20,18,16,14,12,10,8,6,4,2,0],"i8",ALLOC_STATIC);_env_rise=allocate([0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200,202,204,206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,248,250,253,255],"i8",ALLOC_STATIC);_env_frise=allocate([255,244,234,224,214,204,195,186,177,168,159,151,143,135,127,120,113,106,99,92,86,80,74,68,63,57,52,47,43,38,34,30,26,23,19,16,13,11,8,6,4,2,1,0,0,0,0,0,0,0,1,2,3,4,5,7,8,10,12,14,16,19,21,23,26,29,31,34,37,40,44,46,48,50,52,54,57,59,61,64,66,69,71,74,76,79,81,84,87,90,93,95,98,101,104,107,110,113,116,120,123,126,129,133,136,139,143,146,150,153,157,160,164,168,172,175,179,183,187,191,195,199,203,207,211,215,219,224],"i8",ALLOC_STATIC);__ZL11env_r_frise=allocate([207,204,201,198,195,192,189,185,180,176,171,167,162,156,151,146,140,134,129,123,117,111,105,99,93,87,80,74,68,62,56,51,45,39,34,28,23,18,13,8,4,2,2,1,0,0,0,0,0,1,1,2,3,4,5,7,8,10,12,13,15,18,20,22,25,27,30,33,36,39,42,45,48,52,54,56,58,60,63,65,67,70,72,75,77,80,82,85,88,90,93,96,99,102,105,108,111,114,117,120,123,126,129,133,136,139,143,146,150,153,157,160,164,168,172,175,179,183,187,191,195,199,203,207,211,215,219,224],"i8",ALLOC_STATIC);__ZL10env_frise2=allocate([255,249,244,238,233,228,223,218,213,208,203,198,193,189,184,179,175,170,166,161,157,153,149,144,140,136,132,128,125,121,117,113,110,106,103,99,96,93,89,86,83,80,77,74,71,68,65,62,60,57,55,52,50,47,45,43,40,38,36,34,32,30,28,26,25,23,21,20,18,17,15,14,13,12,10,9,8,7,6,5,5,4,3,2,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,3,4,4,5,6,7,8,9,10,11,12,14,15,16,18,19,21,23,24,26,28,30,32],"i8",ALLOC_STATIC);__ZL12env_r_frise2=allocate([208,206,205,204,202,200,199,197,195,193,192,189,187,184,181,179,176,173,170,167,163,160,157,153,150,146,143,139,135,132,128,124,120,116,112,109,105,101,97,93,89,85,81,77,74,70,66,62,59,55,52,49,47,45,42,40,38,36,34,32,30,28,26,25,23,21,20,18,17,15,14,13,12,10,9,8,7,6,5,5,4,3,2,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,3,4,4,5,6,7,8,9,10,11,12,14,15,16,18,19,21,23,24,26,28,30,32],"i8",ALLOC_STATIC);__ZL12env_risefall=allocate([152,153,153,154,156,157,159,161,164,167,169,172,176,179,182,186,190,193,197,201,205,209,212,216,220,223,227,230,234,237,240,242,245,247,249,251,252,253,254,254,255,255,255,255,255,255,254,253,251,250,248,246,243,241,238,236,233,230,228,224,221,218,215,211,208,204,200,196,192,188,184,180,176,172,167,163,159,154,150,145,141,136,132,127,123,118,114,109,105,101,96,92,88,84,80,76,72,68,64,60,57,53,50,47,43,40,38,35,32,29,26,23,21,18,15,13,10,8,7,5,3,2,1,0,0,0,0,0],"i8",ALLOC_STATIC);__ZL13env_fallrise3=allocate([254,255,255,255,255,255,254,253,252,250,248,246,244,241,238,235,232,229,225,222,218,214,210,205,201,196,191,186,182,176,171,166,161,156,150,145,139,134,128,123,117,111,106,100,95,89,84,79,73,68,63,58,53,48,43,38,34,29,25,21,17,13,10,7,4,3,1,0,0,0,0,0,0,0,0,1,1,2,4,5,7,9,11,13,16,18,21,24,27,30,34,37,41,45,49,53,58,62,67,72,76,81,87,91,94,98,101,104,107,110,113,116,118,120,123,124,126,128,129,130,131,131,132,132,131,131,130,129],"i8",ALLOC_STATIC);__ZL13env_fallrise4=allocate([114,114,113,113,112,111,109,108,106,104,102,100,97,95,92,90,87,84,81,78,75,72,69,66,63,59,56,53,50,47,44,41,38,35,32,29,27,24,22,20,18,16,14,12,11,10,9,8,7,7,7,7,7,6,5,5,5,5,5,5,5,5,5,6,7,7,8,9,10,12,13,15,16,18,20,22,24,27,29,32,35,38,41,44,47,51,55,59,63,67,71,76,81,86,91,96,101,106,111,116,121,127,132,137,143,149,155,161,167,173,179,186,192,199,206,213,220,227,234,241,245,247,250,252,253,254,255,255],"i8",ALLOC_STATIC);__ZL9env_fall2=allocate([254,254,253,253,252,251,251,250,250,249,248,248,247,247,246,246,245,244,244,243,243,242,242,241,240,240,239,238,238,237,236,235,234,234,233,232,231,230,229,228,227,226,225,224,222,221,220,219,217,216,214,213,211,210,208,206,204,203,201,199,197,195,192,190,188,185,183,181,178,175,173,170,167,164,161,158,154,151,148,144,141,137,133,129,125,121,117,113,109,104,100,97,94,91,87,84,81,77,74,70,67,64,60,57,53,50,46,42,39,35,31,28,24,20,17,13,11,9,7,5,4,3,2,1,0,0,0,0],"i8",ALLOC_STATIC);__ZL9env_rise2=allocate([0,0,0,0,1,1,1,2,2,3,3,4,4,5,6,6,7,8,8,9,10,11,12,12,13,14,15,16,17,18,19,20,22,23,24,25,27,28,29,31,32,34,35,37,38,40,41,43,45,47,48,50,52,54,56,58,60,62,64,66,68,71,73,75,78,80,82,85,87,90,93,95,98,101,103,106,109,112,115,118,121,124,127,130,134,137,140,144,147,150,154,157,160,163,166,169,172,175,178,181,184,187,190,193,196,199,202,205,208,211,214,217,220,223,226,228,231,233,236,238,240,242,244,246,248,250,251,253],"i8",ALLOC_STATIC);__ZL16env_risefallrise=allocate([127,127,127,128,129,131,132,135,137,140,143,146,150,153,157,161,165,170,174,178,183,187,192,197,201,205,210,214,218,222,226,230,234,237,240,243,245,248,250,251,252,253,254,254,253,252,251,249,247,244,240,236,231,226,220,213,206,198,189,180,169,158,146,136,130,125,119,114,108,102,96,90,84,78,73,66,60,55,50,45,40,36,31,27,24,20,17,14,12,9,7,6,5,4,4,4,4,5,6,8,10,13,16,20,24,29,35,41,47,55,62,71,80,90,100,112,124,131,133,136,138,140,142,143,145,146,147,147],"i8",ALLOC_STATIC);_envelope_data=allocate(80,"i8*",ALLOC_STATIC);__ZL18tone_nucleus_table=allocate([0,64,8,0,70,18,0,0,0,0,0,0,24,12,0,undef,4,80,18,6,78,22,0,0,0,0,0,0,34,52,0,undef,4,88,22,6,82,22,0,0,0,0,0,0,34,64,0,undef,0,92,8,0,92,80,0,0,0,0,0,0,76,8,1,undef,0,86,4,0,94,66,0,0,0,0,0,0,34,10,0,undef,0,62,10,0,62,20,0,0,0,0,0,0,28,16,0,undef,4,68,18,6,68,22,0,0,0,0,0,0,30,44,0,undef,6,64,16,0,66,32,0,0,0,0,0,0,32,18,0,undef,2,68,46,0,42,32,0,0,0,0,0,0,46,58,0,undef,4,78,24,6,72,22,0,0,0,0,0,0,42,52,0,undef,4,88,34,0,64,32,0,0,0,0,0,0,46,82,0,undef,0,56,12,0,56,20,0,0,0,0,0,0,24,12,0,undef,0,70,18,0,70,24,0,0,0,0,0,0,32,20,0,undef],["i8","i8","i8","i8","i8","i8",0,0,"i16*",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i16*",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i16*",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i16*",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i16*",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i16*",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i16*",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i16*",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i16*",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i16*",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i16*",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i16*",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i16*",0,0,0,"i8","i8","i8","i8"],ALLOC_STATIC);_punctuation_to_tone=allocate([0,1,2,3,0,4,0,1,2,3,0,4,5,6,2,3,0,4,5,7,1,3,0,4,8,9,10,3,0,0,8,8,10,3,0,0,11,11,11,11,0,0,12,12,12,12,0,0],"i8",ALLOC_STATIC);_n_tunes=allocate(1,"i32",ALLOC_STATIC);_tunes=allocate(1,"%struct.TUNE*",ALLOC_STATIC);__ZL12syllable_tab=allocate(1,"%struct.SYLLABLE*",ALLOC_STATIC);__ZL8no_tonic_b=allocate(1,"i1",ALLOC_STATIC);__ZL15tone_head_table=allocate([46,57,78,50,0,0,0,0,3,7,5,0,0,0,0,0,46,57,78,46,0,0,0,0,3,7,5,0,0,0,0,0,46,57,78,46,0,0,0,0,3,7,5,0,0,0,0,0,46,57,90,50,0,0,0,0,3,9,5,0,0,0,0,0,46,57,78,50,0,0,0,0,3,7,5,0,0,0,0,0,46,57,74,55,0,0,0,0,4,7,5,0,0,0,0,0,46,57,74,55,0,0,0,0,4,7,5,0,0,0,0,0,46,57,74,55,0,0,0,0,4,7,5,0,0,0,0,0,46,57,78,50,0,0,0,0,3,7,5,0,0,0,0,0,46,57,78,46,0,0,0,0,3,7,5,0,0,0,0,0,46,57,78,50,0,0,0,0,3,7,5,0,0,0,0,0,34,41,41,32,0,0,0,0,3,7,5,0,0,0,0,0,46,57,55,50,0,0,0,0,3,7,5,0,0,0,0,0],["i8","i8","i8","i8","i32*",0,0,0,"i8","i8","i8",0,"i8*",0,0,0,"i8","i8","i8","i8","i32*",0,0,0,"i8","i8","i8",0,"i8*",0,0,0,"i8","i8","i8","i8","i32*",0,0,0,"i8","i8","i8",0,"i8*",0,0,0,"i8","i8","i8","i8","i32*",0,0,0,"i8","i8","i8",0,"i8*",0,0,0,"i8","i8","i8","i8","i32*",0,0,0,"i8","i8","i8",0,"i8*",0,0,0,"i8","i8","i8","i8","i32*",0,0,0,"i8","i8","i8",0,"i8*",0,0,0,"i8","i8","i8","i8","i32*",0,0,0,"i8","i8","i8",0,"i8*",0,0,0,"i8","i8","i8","i8","i32*",0,0,0,"i8","i8","i8",0,"i8*",0,0,0,"i8","i8","i8","i8","i32*",0,0,0,"i8","i8","i8",0,"i8*",0,0,0,"i8","i8","i8","i8","i32*",0,0,0,"i8","i8","i8",0,"i8*",0,0,0,"i8","i8","i8","i8","i32*",0,0,0,"i8","i8","i8",0,"i8*",0,0,0,"i8","i8","i8","i8","i32*",0,0,0,"i8","i8","i8",0,"i8*",0,0,0,"i8","i8","i8","i8","i32*",0,0,0,"i8","i8","i8",0,"i8*",0,0,0],ALLOC_STATIC);__ZL10number_pre=allocate(1,"i32",ALLOC_STATIC);__ZL10tone_posn2=allocate(1,"i32",ALLOC_STATIC);__ZL9tone_posn=allocate(1,"i32",ALLOC_STATIC);__ZL11number_tail=allocate(1,"i32",ALLOC_STATIC);__ZL14tone_pitch_env=allocate(1,"i32",ALLOC_STATIC);__ZZL18calc_pitch_segmentiiP9TONE_HEADP12TONE_NUCLEUSiiE12continue_tab=allocate([230,32,20,8,0],"i8",ALLOC_STATIC);__ZL8min_drop=allocate([6,0,0,0,7,0,0,0,9,0,0,0,9,0,0,0,20,0,0,0,20,0,0,0,20,0,0,0,25,0,0,0],["i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0],ALLOC_STATIC);__ZL7drops_0=allocate([9,0,0,0,9,0,0,0,16,0,0,0,16,0,0,0,16,0,0,0,23,0,0,0,55,0,0,0,32,0,0,0],["i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0],ALLOC_STATIC);__ZL5oflow=allocate([0,40,24,8,0],"i8",ALLOC_STATIC);__ZL9oflow_emf=allocate([10,52,32,20,10],"i8",ALLOC_STATIC);__ZL10oflow_less=allocate([6,38,24,14,4],"i8",ALLOC_STATIC);__ZL12last_primary=allocate(1,"i32",ALLOC_STATIC);_namedata=allocate(1,"i8*",ALLOC_STATIC);__ZL7f_input=allocate(1,"%struct.__sFILE*",ALLOC_STATIC);_p_textinput=allocate(1,"i8*",ALLOC_STATIC);_p_wchar_input=allocate(1,"i32*",ALLOC_STATIC);__ZL10ungot_word=allocate(1,"i8*",ALLOC_STATIC);_count_characters=allocate(1,"i32",ALLOC_STATIC);__ZL10ssml_stack=allocate(1520,["i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8"],ALLOC_STATIC);__ZL16current_voice_id=allocate(40,"i8",ALLOC_STATIC);_param_stack=allocate(1280,"i32",ALLOC_STATIC);_param_defaults=allocate([0,0,0,0,175,0,0,0,100,0,0,0,50,0,0,0,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],["i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0],ALLOC_STATIC);_walpha_tab=allocate([1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,254,255,1,255,1,255,1,255,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,255,1,255,1,255,1,255,255,255,210,1,255,1,255,206,1,255,205,205,1,255,255,79,202,203,1,255,205,207,255,211,209,1,255,255,255,211,213,255,214,1,255,1,255,1,255,218,1,255,218,255,255,1,255,218,1,255,217,217,1,255,1,255,219,1,255,255,255,1,255,255,255,255,255,255,255,2,1,255,2,1,255,2,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,255,2,1,255,1,255,255,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,255,0,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255,1,255],"i8",ALLOC_STATIC);__ZL10ungot_char=allocate(1,"i32",ALLOC_STATIC);__ZL12end_of_input_b=allocate(1,"i1",ALLOC_STATIC);__str167=allocate([115,112,101,97,107,0],"i8",ALLOC_STATIC);__str1168=allocate([118,111,105,99,101,0],"i8",ALLOC_STATIC);__str2169=allocate([112,114,111,115,111,100,121,0],"i8",ALLOC_STATIC);__str3170=allocate([115,97,121,45,97,115,0],"i8",ALLOC_STATIC);__str4171=allocate([109,97,114,107,0],"i8",ALLOC_STATIC);__str5172=allocate([115,0],"i8",ALLOC_STATIC);__str6173=allocate([112,0],"i8",ALLOC_STATIC);__str7174=allocate([112,104,111,110,101,109,101,0],"i8",ALLOC_STATIC);__str8175=allocate([115,117,98,0],"i8",ALLOC_STATIC);__str9176=allocate([116,116,115,58,115,116,121,108,101,0],"i8",ALLOC_STATIC);__str10177=allocate([97,117,100,105,111,0],"i8",ALLOC_STATIC);__str11178=allocate([101,109,112,104,97,115,105,115,0],"i8",ALLOC_STATIC);__str12179=allocate([98,114,101,97,107,0],"i8",ALLOC_STATIC);__str13180=allocate([109,101,116,97,100,97,116,97,0],"i8",ALLOC_STATIC);__str14181=allocate([98,114,0],"i8",ALLOC_STATIC);__str15182=allocate([108,105,0],"i8",ALLOC_STATIC);__str16183=allocate([100,100,0],"i8",ALLOC_STATIC);__str17184=allocate([105,109,103,0],"i8",ALLOC_STATIC);__str18185=allocate([116,100,0],"i8",ALLOC_STATIC);__str19186=allocate([104,49,0],"i8",ALLOC_STATIC);__str20187=allocate([104,50,0],"i8",ALLOC_STATIC);__str21188=allocate([104,51,0],"i8",ALLOC_STATIC);__str22189=allocate([104,52,0],"i8",ALLOC_STATIC);__str23190=allocate([104,114,0],"i8",ALLOC_STATIC);__str24191=allocate([115,99,114,105,112,116,0],"i8",ALLOC_STATIC);__str25192=allocate([115,116,121,108,101,0],"i8",ALLOC_STATIC);__str26193=allocate([102,111,110,116,0],"i8",ALLOC_STATIC);__str27194=allocate([98,0],"i8",ALLOC_STATIC);__str28195=allocate([105,0],"i8",ALLOC_STATIC);__str29196=allocate([115,116,114,111,110,103,0],"i8",ALLOC_STATIC);__str30197=allocate([101,109,0],"i8",ALLOC_STATIC);__str31198=allocate([99,111,100,101,0],"i8",ALLOC_STATIC);__ZL8ssmltags=allocate([0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0],ALLOC_STATIC);__ZL10n_namedata=allocate(1,"i32",ALLOC_STATIC);__ZL11namedata_ix=allocate(1,"i32",ALLOC_STATIC);__str32199=allocate([103,116,0],"i8",ALLOC_STATIC);__str33200=allocate([108,116,0],"i8",ALLOC_STATIC);__str34201=allocate([97,109,112,0],"i8",ALLOC_STATIC);__str35202=allocate([113,117,111,116,0],"i8",ALLOC_STATIC);__str36203=allocate([110,98,115,112,0],"i8",ALLOC_STATIC);__str37204=allocate([97,112,111,115,0],"i8",ALLOC_STATIC);__ZL18xml_char_mnemonics=allocate([0,0,0,0,62,0,0,0,0,0,0,0,57404,0,0,0,0,0,0,0,38,0,0,0,0,0,0,0,34,0,0,0,0,0,0,0,32,0,0,0,0,0,0,0,39,0,0,0,0,0,0,0,-1,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0],ALLOC_STATIC);__ZZ10ReadClauseP10TranslatorP7__sFILEPcPsPiiS5_S3_E12ungot_string=allocate(24,"i8",ALLOC_STATIC);__ZZ10ReadClauseP10TranslatorP7__sFILEPcPsPiiS5_S3_E15ungot_string_ix=allocate([-1],["i32",0,0,0,0],ALLOC_STATIC);__ZL19clear_skipping_text_b=allocate(1,"i1",ALLOC_STATIC);__ZL11ungot_char2=allocate(1,"i32",ALLOC_STATIC);__ZL19ssml_ignore_l_angle=allocate(1,"i32",ALLOC_STATIC);__str38205=allocate([37,115,37,99,37,99,0],"i8",ALLOC_STATIC);__ZL10sayas_mode=allocate(1,"i32",ALLOC_STATIC);__ZL11ignore_text_b=allocate(1,"i1",ALLOC_STATIC);__ZL11punct_chars=allocate([44,0,46,0,63,0,33,0,58,0,59,0,8211,0,8212,0,8230,0,894,0,903,0,2404,0,1417,0,1373,0,1372,0,1374,0,1371,0,2843,0,1567,0,4962,0,4963,0,4964,0,4965,0,4966,0,4967,0,4968,0,4347,0,12289,0,12290,0,-255,0,-244,0,-242,0,-230,0,-229,0,-225,0,0,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZL16punct_attributes=allocate([0,0,0,0,266260,0,0,0,524328,0,0,0,532520,0,0,0,536621,0,0,0,262174,0,0,0,266270,0,0,0,266270,0,0,0,266270,0,0,0,2396190,0,0,0,532520,0,0,0,266270,0,0,0,557096,0,0,0,557096,0,0,0,266260,0,0,0,1585197,0,0,0,1581096,0,0,0,1572904,0,0,0,266270,0,0,0,532520,0,0,0,524328,0,0,0,266260,0,0,0,266270,0,0,0,262174,0,0,0,262174,0,0,0,532520,0,0,0,524358,0,0,0,524358,0,0,0,299028,0,0,0,557096,0,0,0,569389,0,0,0,299028,0,0,0,557096,0,0,0,294942,0,0,0,299038,0,0,0,565288,0,0,0,266270,0,0,0,0,0,0,0],["i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0],ALLOC_STATIC);__str41208=allocate([32,32,32,0],"i8",ALLOC_STATIC);__ZL12chars_ignore=allocate([8204,0,8205,0,0,0],["i16",0,"i16",0,"i16",0],ALLOC_STATIC);__str42209=allocate([105,32,0],"i8",ALLOC_STATIC);__ZL10audio_text_b=allocate(1,"i1",ALLOC_STATIC);__ZL17speech_parameters=allocate(60,"i32",ALLOC_STATIC);__ZL12n_ssml_stack=allocate(1,"i32",ALLOC_STATIC);__ZL13n_param_stack=allocate(1,"i32",ALLOC_STATIC);__ZL7xmlbase=allocate(1,"i8*",ALLOC_STATIC);__ZZL14LookupCharNameP10TranslatoriiE3buf=allocate(60,"i8",ALLOC_STATIC);__str47214=allocate([91,2,95,94,95,37,115,32,37,115,32,95,94,95,37,115,93,93,0],"i8",ALLOC_STATIC);__str48215=allocate([91,2,37,115,93,93,32,0],"i8",ALLOC_STATIC);__str49216=allocate([91,2,40,88,49,41,40,88,49,41,40,88,49,41,93,93,0],"i8",ALLOC_STATIC);__ZZL13WordToString2jE3buf=allocate(5,"i8",ALLOC_STATIC);__str50217=allocate([1,37,100,73,32,0],"i8",ALLOC_STATIC);__str51218=allocate([32,37,115,0],"i8",ALLOC_STATIC);__str52219=allocate([1,43,49,48,83,0],"i8",ALLOC_STATIC);__str53220=allocate([32,1,45,49,48,83,0],"i8",ALLOC_STATIC);__str54221=allocate([32,37,115,32,37,100,32,37,115,0],"i8",ALLOC_STATIC);__str55222=allocate([37,115,37,99,115,111,117,110,100,105,99,111,110,115,37,99,37,115,0],"i8",ALLOC_STATIC);__str57224=allocate([112,111,108,121,112,104,97,115,101,0],"i8",ALLOC_STATIC);__str58225=allocate([47,116,109,112,47,101,115,112,101,97,107,88,88,88,88,88,88,0],"i8",ALLOC_STATIC);__str59226=allocate([115,111,120,32,34,37,115,34,32,45,114,32,37,100,32,45,119,32,45,115,32,45,99,49,32,37,115,32,37,115,10,0],"i8",ALLOC_STATIC);__str60227=allocate([91,2,37,115,93,93,0],"i8",ALLOC_STATIC);__ZZL14ProcessSsmlTagPwPcRiiiE10mnem_punct=allocate([0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,-1,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0],ALLOC_STATIC);__str61228=allocate([110,111,110,101,0],"i8",ALLOC_STATIC);__str62229=allocate([97,108,108,0],"i8",ALLOC_STATIC);__str63230=allocate([115,111,109,101,0],"i8",ALLOC_STATIC);__ZZL14ProcessSsmlTagPwPcRiiiE13mnem_capitals=allocate([0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,-1,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0],ALLOC_STATIC);__str64231=allocate([110,111,0],"i8",ALLOC_STATIC);__str65232=allocate([115,112,101,108,108,105,110,103,0],"i8",ALLOC_STATIC);__str66233=allocate([105,99,111,110,0],"i8",ALLOC_STATIC);__ZZL14ProcessSsmlTagPwPcRiiiE17mnem_interpret_as=allocate([0,0,0,0,18,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,36,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,193,0,0,0,0,0,0,0,-1,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0],ALLOC_STATIC);__str68235=allocate([99,104,97,114,97,99,116,101,114,115,0],"i8",ALLOC_STATIC);__str69236=allocate([116,116,115,58,99,104,97,114,0],"i8",ALLOC_STATIC);__str70237=allocate([116,116,115,58,107,101,121,0],"i8",ALLOC_STATIC);__str71238=allocate([116,116,115,58,100,105,103,105,116,115,0],"i8",ALLOC_STATIC);__str72239=allocate([116,101,108,101,112,104,111,110,101,0],"i8",ALLOC_STATIC);__ZZL14ProcessSsmlTagPwPcRiiiE17mnem_sayas_format=allocate([0,0,0,0,1,0,0,0,0,0,0,0,-1,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0],ALLOC_STATIC);__str73240=allocate([103,108,121,112,104,115,0],"i8",ALLOC_STATIC);__ZZL14ProcessSsmlTagPwPcRiiiE10mnem_break=allocate([0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,-1,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0],ALLOC_STATIC);__str74241=allocate([120,45,119,101,97,107,0],"i8",ALLOC_STATIC);__str75242=allocate([119,101,97,107,0],"i8",ALLOC_STATIC);__str76243=allocate([109,101,100,105,117,109,0],"i8",ALLOC_STATIC);__str77244=allocate([120,45,115,116,114,111,110,103,0],"i8",ALLOC_STATIC);__ZZL14ProcessSsmlTagPwPcRiiiE13mnem_emphasis=allocate([0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,-1,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0],ALLOC_STATIC);__str78245=allocate([114,101,100,117,99,101,100,0],"i8",ALLOC_STATIC);__str79246=allocate([109,111,100,101,114,97,116,101,0],"i8",ALLOC_STATIC);__ZZL14ProcessSsmlTagPwPcRiiiE12prosody_attr=allocate(20,"i8*",ALLOC_STATIC);__str80247=allocate([114,97,116,101,0],"i8",ALLOC_STATIC);__str81248=allocate([118,111,108,117,109,101,0],"i8",ALLOC_STATIC);__str82249=allocate([114,97,110,103,101,0],"i8",ALLOC_STATIC);__ZL22ignore_if_self_closing=allocate([0,1,1,1,1,0,0,0,0,1,1,0,1,0,1,0,0,0,0],"i8",ALLOC_STATIC);__str83250=allocate([102,105,101,108,100,0],"i8",ALLOC_STATIC);__str84251=allocate([109,111,100,101,0],"i8",ALLOC_STATIC);__str85252=allocate([112,117,110,99,116,117,97,116,105,111,110,0],"i8",ALLOC_STATIC);__str86253=allocate([99,97,112,105,116,97,108,95,108,101,116,116,101,114,115,0],"i8",ALLOC_STATIC);__str87254=allocate([108,101,118,101,108,0],"i8",ALLOC_STATIC);__ZZL14ProcessSsmlTagPwPcRiiiE23emphasis_to_pitch_range=allocate([50,50,40,70,90,90],"i8",ALLOC_STATIC);__ZZL14ProcessSsmlTagPwPcRiiiE18emphasis_to_volume=allocate([100,100,70,110,140,140],"i8",ALLOC_STATIC);__str88255=allocate([105,110,116,101,114,112,114,101,116,45,97,115,0],"i8",ALLOC_STATIC);__str89256=allocate([102,111,114,109,97,116,0],"i8",ALLOC_STATIC);__str90257=allocate([100,101,116,97,105,108,0],"i8",ALLOC_STATIC);__str91258=allocate([37,99,37,100,89,0],"i8",ALLOC_STATIC);__ZL11sayas_start=allocate(1,"i32",ALLOC_STATIC);__str92259=allocate([97,108,105,97,115,0],"i8",ALLOC_STATIC);__str94261=allocate([37,99,37,100,77,0],"i8",ALLOC_STATIC);__str95262=allocate([115,114,99,0],"i8",ALLOC_STATIC);__str96263=allocate([37,115,47,37,115,0],"i8",ALLOC_STATIC);__str97264=allocate([37,99,37,100,73,0],"i8",ALLOC_STATIC);__str98265=allocate([37,99,37,100,85,0],"i8",ALLOC_STATIC);__str99266=allocate([115,116,114,101,110,103,116,104,0],"i8",ALLOC_STATIC);__ZZL14ProcessSsmlTagPwPcRiiiE11break_value=allocate([0,0,0,0,7,0,0,0,14,0,0,0,21,0,0,0,40,0,0,0,80,0,0,0],["i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0],ALLOC_STATIC);__str100267=allocate([37,99,37,100,66,0],"i8",ALLOC_STATIC);__str101268=allocate([116,105,109,101,0],"i8",ALLOC_STATIC);__str102269=allocate([120,109,108,58,98,97,115,101,0],"i8",ALLOC_STATIC);__ZZL18GetVoiceAttributesPwiE11mnem_gender=allocate([0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0],ALLOC_STATIC);__str105272=allocate([110,101,117,116,114,97,108,0],"i8",ALLOC_STATIC);__str106273=allocate([120,109,108,58,108,97,110,103,0],"i8",ALLOC_STATIC);__str108275=allocate([97,103,101,0],"i8",ALLOC_STATIC);__ZZL14LoadSoundFile2PKcE4slot=allocate([-1],["i32",0,0,0,0],ALLOC_STATIC);__str111278=allocate([115,112,97,99,101,32,0],"i8",ALLOC_STATIC);__str112279=allocate([116,97,98,32,0],"i8",ALLOC_STATIC);__str113280=allocate([117,110,100,101,114,115,99,111,114,101,32,0],"i8",ALLOC_STATIC);__str114281=allocate([100,111,117,98,108,101,45,113,117,111,116,101,32,0],"i8",ALLOC_STATIC);__ZZL14ReplaceKeyNamePciRiE8keynames=allocate([0,0,0,0,57376,0,0,0,0,0,0,0,57353,0,0,0,0,0,0,0,57439,0,0,0,0,0,0,0,34,0,0,0,0,0,0,0,0,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0],ALLOC_STATIC);__ZZL19SetProsodyParameteriPwP11PARAM_STACKE11mnem_volume=allocate([0,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30,0,0,0,0,0,0,0,65,0,0,0,0,0,0,0,100,0,0,0,0,0,0,0,150,0,0,0,0,0,0,0,230,0,0,0,0,0,0,0,-1,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0],ALLOC_STATIC);__str115282=allocate([115,105,108,101,110,116,0],"i8",ALLOC_STATIC);__str116283=allocate([120,45,115,111,102,116,0],"i8",ALLOC_STATIC);__str117=allocate([115,111,102,116,0],"i8",ALLOC_STATIC);__str118=allocate([108,111,117,100,0],"i8",ALLOC_STATIC);__str119=allocate([120,45,108,111,117,100,0],"i8",ALLOC_STATIC);__ZZL19SetProsodyParameteriPwP11PARAM_STACKE9mnem_rate=allocate([0,0,0,0,100,0,0,0,0,0,0,0,60,0,0,0,0,0,0,0,80,0,0,0,0,0,0,0,100,0,0,0,0,0,0,0,125,0,0,0,0,0,0,0,160,0,0,0,0,0,0,0,-1,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0],ALLOC_STATIC);__str120=allocate([120,45,115,108,111,119,0],"i8",ALLOC_STATIC);__str121=allocate([115,108,111,119,0],"i8",ALLOC_STATIC);__str122=allocate([102,97,115,116,0],"i8",ALLOC_STATIC);__str123=allocate([120,45,102,97,115,116,0],"i8",ALLOC_STATIC);__ZZL19SetProsodyParameteriPwP11PARAM_STACKE10mnem_pitch=allocate([0,0,0,0,100,0,0,0,0,0,0,0,70,0,0,0,0,0,0,0,85,0,0,0,0,0,0,0,100,0,0,0,0,0,0,0,110,0,0,0,0,0,0,0,120,0,0,0,0,0,0,0,-1,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0],ALLOC_STATIC);__str124=allocate([120,45,108,111,119,0],"i8",ALLOC_STATIC);__str125=allocate([108,111,119,0],"i8",ALLOC_STATIC);__str126=allocate([104,105,103,104,0],"i8",ALLOC_STATIC);__str127=allocate([120,45,104,105,103,104,0],"i8",ALLOC_STATIC);__ZZL19SetProsodyParameteriPwP11PARAM_STACKE10mnem_range=allocate([0,0,0,0,100,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,50,0,0,0,0,0,0,0,100,0,0,0,0,0,0,0,140,0,0,0,0,0,0,0,180,0,0,0,0,0,0,0,-1,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0],ALLOC_STATIC);__ZZL19SetProsodyParameteriPwP11PARAM_STACKE9mnem_tabs=allocate(20,"%struct.MNEM_TAB*",ALLOC_STATIC);__ZZL17ProcessParamStackPcRiE10cmd_letter=allocate([0,83,65,80,82,0,67,0,0,0,0,0,70,0,0],"i8",ALLOC_STATIC);__str128=allocate([37,99,37,100,37,99,0],"i8",ALLOC_STATIC);__ZZL16GetSsmlAttributePwPKcE5empty=allocate(4,"i32",ALLOC_STATIC);__ZZL4GetCvE6ungot2=allocate(1,"i32",ALLOC_STATIC);__ZZL4GetCvE5mask2=allocate([0,128,32,48],"i8",ALLOC_STATIC);__ZL6speed1=allocate([130],["i32",0,0,0,0],ALLOC_STATIC);__ZL6speed2=allocate([121],["i32",0,0,0,0],ALLOC_STATIC);__ZL6speed3=allocate([118],["i32",0,0,0,0],ALLOC_STATIC);__ZL12speed_lookup=allocate([255,255,255,255,255,253,249,245,242,238,235,232,228,225,222,218,216,213,210,207,204,201,198,196,193,191,188,186,183,181,179,176,174,172,169,168,165,163,161,159,158,155,153,152,150,148,146,145,143,141,139,137,136,135,133,131,130,129,127,126,124,123,122,120,119,118,117,115,114,113,112,111,110,109,107,106,105,104,103,102,101,100,99,98,97,96,95,94,93,92,91,90,89,89,88,87,86,85,84,83,82,82,81,80,80,79,78,77,76,76,75,75,74,73,72,71,71,70,69,69,68,67,67,66,66,65,64,64,63,62,62,61,61,60,59,59,58,58,57,57,56,56,55,54,54,53,53,52,52,52,51,50,50,49,49,48,48,47,47,46,46,46,45,45,44,44,44,43,43,42,41,40,40,40,39,39,39,38,38,38,37,37,37,36,36,35,35,35,35,34,34,34,33,33,33,32,32,31,31,31,30,30,30,29,29,29,29,28,28,27,27,27,27,26,26,26,26,25,25,25,24,24,24,24,23,23,23,23,22,22,22,21,21,21,21,20,20,20,20,19,19,19,18,18,17,17,17,16,16,16,16,16,16,15,15,15,15,14,14,14,13,13,13,12,12,12,12,11,11,11,11,10,10,10,9,9,9,8,8,8],"i8",ALLOC_STATIC);__ZL14wav_factor_350=allocate([120,121,120,119,119,118,118,117,116,116,115,114,113,112,112,111,111,110,109,108,107,106,106,104,103,103,102,102,102,101,101,99,98,98,97,96,96,95,94,93,91,90,91,90,89,88,86,85,86,85,85,84,82,81,80,79,77,78,78,76,77,75,75,74,73,71,72,70,69,69,69,67,65,64,63,63,63,61,61,59,59,59,58,56,57,58,56,54,53,52,52,53,52,52,50,48,47,47,45,46,45],"i8",ALLOC_STATIC);__ZL16pause_factor_350=allocate([22,22,22,22,22,22,22,21,21,21,21,20,20,19,19,18,17,16,15,15,15,15,15,15,15],"i8",ALLOC_STATIC);__ZZ11CalcLengthsP10TranslatorE14more_syllables=allocate(1,"i32",ALLOC_STATIC);__str294=allocate([101,115,112,101,97,107,58,32,66,97,100,32,105,110,116,111,110,97,116,105,111,110,32,100,97,116,97,10,0],"i8",ALLOC_STATIC);__ZL18letter_accents_0e0=allocate([870,0,358,0,614,0,1190,0,678,0,1062,0,-30042,0,552,0,874,0,362,0,618,0,682,0,878,0,366,0,622,0,686,0,41,0,1203,0,884,0,372,0,628,0,1204,0,692,0,0,0,1140,0,890,0,378,0,634,0,698,0,382,0,57,0,702,0,0,0,934,0,0,0,422,0,0,0,998,0,0,0,360,0,0,0,616,0,0,0,808,0,0,0,488,0,0,0,489,0,0,0,1129,0,0,0,938,0,0,0,426,0,0,0,810,0,0,0,1002,0,0,0,490,0,0,0,620,0,0,0,428,0,0,0,812,0,0,0,556,0,0,0,621,0,0,0,1133,0,0,0,1198,0,0,0,942,0,0,0,430,0,0,0,1006,0,0,0,46,0,0,0,-29714,0,0,0,623,0,0,0,560,0,48,0,0,0,369,0,0,0,561,0,0,0,497,0,0,0,817,0,0,0,1137,0,0,0,371,0,0,0,563,0,0,0,499,0,51,0,0,0,51,0,0,0,948,0,0,0,436,0,0,0,756,0,0,0,-30028,0,0,0,375,0,0,0,567,0,0,0,503,0,0,0,376,0,0,0,632,0,0,0,568,0,0,0,504,0,0,0,569,0,0,0,505,0,0,0,1145,0,0,0,1210,0,0,0,954,0,0,0,442,0,0,0,1082,0,0,0,762,0,0,0,1018,0,0,0,636,0,0,0,638,0,0,0,0,0,383,0,0,0,831,0,0,0,511,0,56,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZL18letter_accents_250=allocate([166,0,1,0,129,0,1383,0,0,0,296,0,1321,0,1385,0,234,0,0,0,1346,0,0,0,195,0,7491,0,0,0,1263,0,1388,0,44,0,108,0,4,0,0,0,173,0,1389,0,0,0,1262,0,5,0,110,0,1201,0,1265,0,1329,0,-28687,0,178,0,0,0,1394,0,0,0,1331,0,115,0,1268,0,-25932,0,0,0,8,0,183,0,0,0,5431,0,0,0,1335,0,0,0,205,0,119,0,2231,0,1336,0,0,0,0,0,201,0,265,0,185,0,1337,0,1274,0,10,0,1403,0,187,0,188,0,190,0,126,0,1343,0,319,0,0,0,267,0,0,0,204,0,140,0,0,0,0,0,103,0,0,0,3436,0,109,0,303,0,176,0,113,0,1398,0,1100,0,7244,0,-28695,0,0,0,-12311,0,-29127,0,0,0,-12743,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZL13non_ascii_tab=allocate([0,0,945,0,601,0,603,0,947,0,953,0,339,0,969,0,966,0,643,0,965,0,658,0,660,0,638,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZL11accents_tab=allocate([0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0],ALLOC_STATIC);__str297=allocate([37,115,37,99,37,115,37,99,37,115,37,115,0],"i8",ALLOC_STATIC);__str1298=allocate([37,115,37,99,37,99,37,115,0],"i8",ALLOC_STATIC);__str2299=allocate([37,99,37,115,37,99,37,115,37,99,0],"i8",ALLOC_STATIC);__ZZ12LookupLetterP10TranslatorjiPciE13single_letter=allocate(10,"i8",ALLOC_STATIC);__str5302=allocate([95,35,37,100,32,0],"i8",ALLOC_STATIC);__str6303=allocate([95,99,97,112,0],"i8",ALLOC_STATIC);__str7304=allocate([37,99,101,110,0],"i8",ALLOC_STATIC);__str8305=allocate([95,63,65,0],"i8",ALLOC_STATIC);__str9306=allocate([95,63,63,0],"i8",ALLOC_STATIC);__str10307=allocate([37,120,0],"i8",ALLOC_STATIC);__str11308=allocate([37,99,37,115,37,115,0],"i8",ALLOC_STATIC);__str12309=allocate([105,120,99,109,118,108,100,0],"i8",ALLOC_STATIC);__ZZ14TranslateRomanP10TranslatorPcS1_P8WORD_TABE12roman_values=allocate([1,0,0,0,10,0,0,0,100,0,0,0,1000,0,0,0,5,0,0,0,50,0,0,0,500,0,0,0],["i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0],ALLOC_STATIC);__str13310=allocate([95,114,111,109,97,110,0],"i8",ALLOC_STATIC);__str14311=allocate([32,32,37,100,32,32,32,32,0],"i8",ALLOC_STATIC);__ZZL17TranslateNumber_1P10TranslatorPcS1_PjP8WORD_TABiE9str_pause=allocate([11,0],"i8",ALLOC_STATIC);__ZL14n_digit_lookup=allocate(1,"i32",ALLOC_STATIC);__ZL12digit_lookup=allocate(1,"i8*",ALLOC_STATIC);__ZL14number_control=allocate(1,"i32",ALLOC_STATIC);__ZL23speak_missing_thousands=allocate(1,"i32",ALLOC_STATIC);__ZL11ph_ordinal2=allocate(12,"i8",ALLOC_STATIC);__str15312=allocate([95,35,37,115,0],"i8",ALLOC_STATIC);__str16313=allocate([95,48,0],"i8",ALLOC_STATIC);__str17314=allocate([95,100,112,116,0],"i8",ALLOC_STATIC);__str18315=allocate([95,48,77,37,100,0],"i8",ALLOC_STATIC);__str19316=allocate([95,46,0],"i8",ALLOC_STATIC);__str20317=allocate([37,115,37,115,37,115,37,115,0],"i8",ALLOC_STATIC);__str21318=allocate([95,48,90,37,100,0],"i8",ALLOC_STATIC);__str22319=allocate([95,100,112,116,50,0],"i8",ALLOC_STATIC);__str23320=allocate([95,37,100,102,0],"i8",ALLOC_STATIC);__str24321=allocate([95,37,100,37,99,120,0],"i8",ALLOC_STATIC);__str25322=allocate([95,37,100,37,99,0],"i8",ALLOC_STATIC);__str26323=allocate([95,37,100,101,0],"i8",ALLOC_STATIC);__str27324=allocate([95,37,100,97,0],"i8",ALLOC_STATIC);__str28325=allocate([95,37,100,0],"i8",ALLOC_STATIC);__str29326=allocate([95,37,100,88,37,99,0],"i8",ALLOC_STATIC);__str30327=allocate([95,37,100,88,0],"i8",ALLOC_STATIC);__str31328=allocate([95,111,114,100,50,48,0],"i8",ALLOC_STATIC);__str32329=allocate([95,111,114,100,0],"i8",ALLOC_STATIC);__str33330=allocate([95,48,97,110,100,0],"i8",ALLOC_STATIC);__str35332=allocate([95,48,67,111,0],"i8",ALLOC_STATIC);__str36333=allocate([95,48,67,48,0],"i8",ALLOC_STATIC);__str37334=allocate([95,48,67,0],"i8",ALLOC_STATIC);__str39336=allocate([95,37,100,67,111,0],"i8",ALLOC_STATIC);__str40337=allocate([95,37,100,67,48,0],"i8",ALLOC_STATIC);__str41338=allocate([95,37,100,67,0],"i8",ALLOC_STATIC);__str42339=allocate([95,37,100,77,37,100,111,0],"i8",ALLOC_STATIC);__str43340=allocate([95,37,100,77,37,100,101,0],"i8",ALLOC_STATIC);__str44341=allocate([95,37,100,77,37,100,120,0],"i8",ALLOC_STATIC);__str45342=allocate([95,37,100,77,37,100,0],"i8",ALLOC_STATIC);__str46343=allocate([95,48,111,102,0],"i8",ALLOC_STATIC);__str47344=allocate([95,37,115,37,100,111,0],"i8",ALLOC_STATIC);__str48345=allocate([95,37,115,37,100,101,0],"i8",ALLOC_STATIC);__str49346=allocate([95,37,115,37,100,120,0],"i8",ALLOC_STATIC);__str50347=allocate([95,37,115,37,100,0],"i8",ALLOC_STATIC);__str51348=allocate([95,48,77,50,0],"i8",ALLOC_STATIC);__str52349=allocate([95,37,100,77,49,0],"i8",ALLOC_STATIC);__str53350=allocate([95,48,77,49,0],"i8",ALLOC_STATIC);__str54351=allocate([48,77,65,0],"i8",ALLOC_STATIC);__str55352=allocate([49,77,65,0],"i8",ALLOC_STATIC);__str56353=allocate([48,77,0],"i8",ALLOC_STATIC);__str57354=allocate([95,108,105,103,0],"i8",ALLOC_STATIC);__str58355=allocate([95,115,109,99,0],"i8",ALLOC_STATIC);__str59356=allocate([95,116,117,114,0],"i8",ALLOC_STATIC);__str60357=allocate([95,114,101,118,0],"i8",ALLOC_STATIC);__str61358=allocate([95,99,114,108,0],"i8",ALLOC_STATIC);__str62359=allocate([95,97,99,117,0],"i8",ALLOC_STATIC);__str63360=allocate([95,98,114,118,0],"i8",ALLOC_STATIC);__str64361=allocate([95,104,97,99,0],"i8",ALLOC_STATIC);__str65362=allocate([95,99,101,100,0],"i8",ALLOC_STATIC);__str66363=allocate([95,99,105,114,0],"i8",ALLOC_STATIC);__str67364=allocate([95,100,105,97,0],"i8",ALLOC_STATIC);__str68365=allocate([95,97,99,50,0],"i8",ALLOC_STATIC);__str69366=allocate([95,100,111,116,0],"i8",ALLOC_STATIC);__str70367=allocate([95,103,114,118,0],"i8",ALLOC_STATIC);__str71368=allocate([95,109,99,110,0],"i8",ALLOC_STATIC);__str72369=allocate([95,111,103,111,0],"i8",ALLOC_STATIC);__str73370=allocate([95,114,110,103,0],"i8",ALLOC_STATIC);__str74371=allocate([95,115,116,107,0],"i8",ALLOC_STATIC);__str75372=allocate([95,116,108,100,0],"i8",ALLOC_STATIC);__str76373=allocate([95,98,97,114,0],"i8",ALLOC_STATIC);__str77374=allocate([95,114,102,120,0],"i8",ALLOC_STATIC);__str78375=allocate([95,104,111,107,0],"i8",ALLOC_STATIC);_option_mbrola_phonemes=allocate(1,"i32",ALLOC_STATIC);__ZL10mbrola_tab=allocate(1,"%struct.MBROLA_TAB*",ALLOC_STATIC);__ZL15mbr_name_prefix=allocate(1,"i32",ALLOC_STATIC);__str382=allocate([37,115,47,109,98,114,111,108,97,47,37,115,0],"i8",ALLOC_STATIC);__str1383=allocate([47,117,115,114,47,115,104,97,114,101,47,109,98,114,111,108,97,47,37,115,0],"i8",ALLOC_STATIC);__str2384=allocate([47,117,115,114,47,115,104,97,114,101,47,109,98,114,111,108,97,47,37,115,47,37,115,0],"i8",ALLOC_STATIC);__str3385=allocate([47,117,115,114,47,115,104,97,114,101,47,109,98,114,111,108,97,47,118,111,105,99,101,115,47,37,115,0],"i8",ALLOC_STATIC);__str4386=allocate([37,115,47,109,98,114,111,108,97,95,112,104,47,37,115,0],"i8",ALLOC_STATIC);__ZL14mbrola_control=allocate(1,"i32",ALLOC_STATIC);__ZZ15MbrolaTranslateP12PHONEME_LISTiiP7__sFILEE4phix=allocate(1,"i32",ALLOC_STATIC);__ZZ15MbrolaTranslateP12PHONEME_LISTiiP7__sFILEE11embedded_ix=allocate(1,"i32",ALLOC_STATIC);__ZZ15MbrolaTranslateP12PHONEME_LISTiiP7__sFILEE10word_count=allocate(1,"i32",ALLOC_STATIC);__str6388=allocate([37,115,9,0],"i8",ALLOC_STATIC);__str8390=allocate([37,100,9,37,115,0],"i8",ALLOC_STATIC);__str9391=allocate([37,115,9,37,100,9,37,115,0],"i8",ALLOC_STATIC);__str10392=allocate([37,100,10,37,115,9,0],"i8",ALLOC_STATIC);__str11393=allocate([37,100,37,115,10,0],"i8",ALLOC_STATIC);__str12394=allocate([95,32,9,37,100,10,0],"i8",ALLOC_STATIC);__ZZ10MbrolaFilliiE9n_samples=allocate(1,"i32",ALLOC_STATIC);__ZZL10WritePitchiiiiiE6output=allocate(50,"i8",ALLOC_STATIC);__str13395=allocate([32,48,32,37,100,0],"i8",ALLOC_STATIC);__str14396=allocate([32,37,100,32,37,100,0],"i8",ALLOC_STATIC);__str15397=allocate([10,0],"i8",ALLOC_STATIC);__str16398=allocate([9,49,48,48,32,37,100,10,0],"i8",ALLOC_STATIC);__ZZL10GetMbrNameP12PHONEME_LISTP11PHONEME_TABS2_S2_PiS3_S3_E4mnem=allocate(1,"i32",ALLOC_STATIC);__str399=allocate([49,46,52,53,46,48,52,32,32,50,53,46,65,112,114,46,49,49,0],"i8",ALLOC_STATIC);_version_string=allocate(1,"i8*",ALLOC_STATIC);_version_phdata=allocate([83200],["i32",0,0,0,0],ALLOC_STATIC);_option_device_number=allocate([-1],["i32",0,0,0,0],ALLOC_STATIC);_f_logespeak=allocate(1,"%struct.__sFILE*",ALLOC_STATIC);_logging_type=allocate(1,"i32",ALLOC_STATIC);_n_phoneme_tab=allocate(1,"i32",ALLOC_STATIC);_current_phoneme_table=allocate(1,"i32",ALLOC_STATIC);_phoneme_tab=allocate(1024,"%struct.PHONEME_TAB*",ALLOC_STATIC);_phoneme_tab_flags=allocate(256,"i8",ALLOC_STATIC);_phoneme_index=allocate(1,"i16*",ALLOC_STATIC);_phondata_ptr=allocate(1,"i8*",ALLOC_STATIC);_wavefile_data=allocate(1,"i8*",ALLOC_STATIC);__ZL16phoneme_tab_data=allocate(1,"i8*",ALLOC_STATIC);_n_phoneme_tables=allocate(1,"i32",ALLOC_STATIC);_phoneme_tab_list=allocate(4800,["i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","%struct.PHONEME_TAB*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0],ALLOC_STATIC);_phoneme_tab_number=allocate(1,"i32",ALLOC_STATIC);_wavefile_ix=allocate(1,"i32",ALLOC_STATIC);_wavefile_amp=allocate(1,"i32",ALLOC_STATIC);_wavefile_ix2=allocate(1,"i32",ALLOC_STATIC);_wavefile_amp2=allocate(1,"i32",ALLOC_STATIC);_seq_len_adjust=allocate(1,"i32",ALLOC_STATIC);_vowel_transition=allocate(16,"i32",ALLOC_STATIC);_vowel_transition0=allocate(1,"i32",ALLOC_STATIC);_vowel_transition1=allocate(1,"i32",ALLOC_STATIC);__str1412=allocate([112,104,111,110,116,97,98,0],"i8",ALLOC_STATIC);__str2413=allocate([112,104,111,110,105,110,100,101,120,0],"i8",ALLOC_STATIC);__str3414=allocate([112,104,111,110,100,97,116,97,0],"i8",ALLOC_STATIC);__str4415=allocate([105,110,116,111,110,97,116,105,111,110,115,0],"i8",ALLOC_STATIC);__ZZ11LookupSpectP11PHONEME_TABiP10FMT_PARAMSPiP12PHONEME_LISTE10frames_buf=allocate(200,["i16",0,"i16",0,"%struct.frame_t*",0,0,0,"i16",0,"i16",0,"%struct.frame_t*",0,0,0,"i16",0,"i16",0,"%struct.frame_t*",0,0,0,"i16",0,"i16",0,"%struct.frame_t*",0,0,0,"i16",0,"i16",0,"%struct.frame_t*",0,0,0,"i16",0,"i16",0,"%struct.frame_t*",0,0,0,"i16",0,"i16",0,"%struct.frame_t*",0,0,0,"i16",0,"i16",0,"%struct.frame_t*",0,0,0,"i16",0,"i16",0,"%struct.frame_t*",0,0,0,"i16",0,"i16",0,"%struct.frame_t*",0,0,0,"i16",0,"i16",0,"%struct.frame_t*",0,0,0,"i16",0,"i16",0,"%struct.frame_t*",0,0,0,"i16",0,"i16",0,"%struct.frame_t*",0,0,0,"i16",0,"i16",0,"%struct.frame_t*",0,0,0,"i16",0,"i16",0,"%struct.frame_t*",0,0,0,"i16",0,"i16",0,"%struct.frame_t*",0,0,0,"i16",0,"i16",0,"%struct.frame_t*",0,0,0,"i16",0,"i16",0,"%struct.frame_t*",0,0,0,"i16",0,"i16",0,"%struct.frame_t*",0,0,0,"i16",0,"i16",0,"%struct.frame_t*",0,0,0,"i16",0,"i16",0,"%struct.frame_t*",0,0,0,"i16",0,"i16",0,"%struct.frame_t*",0,0,0,"i16",0,"i16",0,"%struct.frame_t*",0,0,0,"i16",0,"i16",0,"%struct.frame_t*",0,0,0,"i16",0,"i16",0,"%struct.frame_t*",0,0,0],ALLOC_STATIC);__str5416=allocate([101,115,112,101,97,107,58,32,78,111,32,101,110,118,101,108,111,112,101,10,0],"i8",ALLOC_STATIC);__str7418=allocate([99,111,110,102,105,103,0],"i8",ALLOC_STATIC);__str9420=allocate([108,111,103,0],"i8",ALLOC_STATIC);__str10421=allocate([37,100,32,37,115,0],"i8",ALLOC_STATIC);__str11422=allocate([119,0],"i8",ALLOC_STATIC);__str13424=allocate([112,97,95,100,101,118,105,99,101,0],"i8",ALLOC_STATIC);__str15426=allocate([115,111,117,110,100,105,99,111,110,0],"i8",ALLOC_STATIC);__str16427=allocate([95,37,99,32,37,115,0],"i8",ALLOC_STATIC);_this_ph_data=allocate(152,["i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8",0,0],ALLOC_STATIC);__ZZL13NumInstnWordsPtE7n_words=allocate([1,1,1,1,1,1,1,1,1,2,4],"i8",ALLOC_STATIC);__ZZL18InterpretConditionP10TranslatoriP12PHONEME_LISTiE11ph_position=allocate([0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,2,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0],["i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0],ALLOC_STATIC);__ZZL15StressConditionP10TranslatorP12PHONEME_LISTiiE15condition_level=allocate([1,0,0,0,2,0,0,0,4,0,0,0,15,0,0,0],["i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0],ALLOC_STATIC);__str17428=allocate([73,110,118,97,108,105,100,32,105,110,115,116,114,117,99,116,105,111,110,32,37,46,52,120,32,102,111,114,32,112,104,111,110,101,109,101,32,39,37,115,39,10,0],"i8",ALLOC_STATIC);__str18429=allocate([114,98,0],"i8",ALLOC_STATIC);__str19430=allocate([67,97,110,39,116,32,114,101,97,100,32,100,97,116,97,32,102,105,108,101,58,32,39,37,115,39,10,0],"i8",ALLOC_STATIC);_n_phoneme_list=allocate(1,"i32",ALLOC_STATIC);_phoneme_list=allocate(24000,["i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0,"i8","i8","i8","i8","i16",0,"i16",0,"%struct.PHONEME_TAB*",0,0,0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8",0,0],ALLOC_STATIC);_mbrola_delay=allocate(1,"i32",ALLOC_STATIC);_mbrola_name=allocate(20,"i8",ALLOC_STATIC);_speed=allocate(64,"i32",ALLOC_STATIC);__ZL9new_voice=allocate(1,"%struct.voice_t*",ALLOC_STATIC);_n_soundicon_tab=allocate([4],["i32",0,0,0,0],ALLOC_STATIC);_soundicon_tab=allocate(1280,["i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0],ALLOC_STATIC);__ZZ12WordToStringjE3buf=allocate(5,"i8",ALLOC_STATIC);__ZL14last_pitch_cmd=allocate(1,"i32",ALLOC_STATIC);__ZL12last_amp_cmd=allocate(1,"i32",ALLOC_STATIC);__ZL10last_frame=allocate(1,"%struct.frame_t*",ALLOC_STATIC);__ZL15syllable_centre=allocate(1,"i32",ALLOC_STATIC);__ZZ18FormantTransition2P10frameref_tRijjP11PHONEME_TABiE10vcolouring=allocate([243,0,272,0,256,0,256,0,256,0,256,0,256,0,240,0,240,0,240,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZL10modn_flags=allocate(1,"i32",ALLOC_STATIC);__ZZ8DoSpect2P11PHONEME_TABiP10FMT_PARAMSP12PHONEME_LISTiE9wave_flag_b=allocate(1,"i1",ALLOC_STATIC);__ZL13fmt_amplitude=allocate(1,"i32",ALLOC_STATIC);__ZL10last_wcmdq=allocate(1,"i32",ALLOC_STATIC);__ZL12pitch_length=allocate(1,"i32",ALLOC_STATIC);__ZL10amp_length=allocate(1,"i32",ALLOC_STATIC);__ZZ8GenerateP12PHONEME_LISTPiiE2ix=allocate(1,"i32",ALLOC_STATIC);__ZZ8GenerateP12PHONEME_LISTPiiE11embedded_ix=allocate(1,"i32",ALLOC_STATIC);__ZZ8GenerateP12PHONEME_LISTPiiE10word_count=allocate(1,"i32",ALLOC_STATIC);__ZZ8GenerateP12PHONEME_LISTPiiE8sourceix=allocate(1,"i32",ALLOC_STATIC);__ZL14syllable_start=allocate(1,"i32",ALLOC_STATIC);__ZL12syllable_end=allocate(1,"i32",ALLOC_STATIC);__ZL8timer_on_b=allocate(1,"i1",ALLOC_STATIC);__ZL6paused_b=allocate(1,"i1",ALLOC_STATIC);__ZZ15SpeakNextClauseP7__sFILEPKviE6f_text=allocate(1,"%struct.__sFILE*",ALLOC_STATIC);__ZZ15SpeakNextClauseP7__sFILEPKviE6p_text=allocate(1,"i8*",ALLOC_STATIC);__str459=allocate([37,115,10,0],"i8",ALLOC_STATIC);__str1460=allocate([87,97,114,110,105,110,103,58,32,65,99,99,101,110,116,101,100,32,108,101,116,116,101,114,115,32,97,114,101,32,110,111,116,32,114,101,99,111,103,110,105,122,101,100,44,32,101,103,58,32,85,43,48,49,48,68,10,83,101,116,32,76,67,95,67,84,89,80,69,32,116,111,32,97,32,85,84,70,45,56,32,108,111,99,97,108,101,10,0],"i8",ALLOC_STATIC);__ZZL13set_frame_rmsP7frame_tiE8sqrt_tab=allocate([0,0,64,0,90,0,110,0,128,0,143,0,156,0,169,0,181,0,192,0,202,0,212,0,221,0,230,0,239,0,247,0,256,0,263,0,271,0,278,0,286,0,293,0,300,0,306,0,313,0,320,0,326,0,332,0,338,0,344,0,350,0,356,0,362,0,367,0,373,0,378,0,384,0,389,0,394,0,399,0,404,0,409,0,414,0,419,0,424,0,429,0,434,0,438,0,443,0,448,0,452,0,457,0,461,0,465,0,470,0,474,0,478,0,483,0,487,0,491,0,495,0,499,0,503,0,507,0,512,0,515,0,519,0,523,0,527,0,531,0,535,0,539,0,543,0,546,0,550,0,554,0,557,0,561,0,565,0,568,0,572,0,576,0,579,0,583,0,586,0,590,0,593,0,596,0,600,0,603,0,607,0,610,0,613,0,617,0,620,0,623,0,627,0,630,0,633,0,636,0,640,0,643,0,646,0,649,0,652,0,655,0,658,0,662,0,665,0,668,0,671,0,674,0,677,0,680,0,683,0,686,0,689,0,692,0,695,0,698,0,701,0,704,0,706,0,709,0,712,0,715,0,718,0,721,0,724,0,726,0,729,0,732,0,735,0,738,0,740,0,743,0,746,0,749,0,751,0,754,0,757,0,759,0,762,0,765,0,768,0,770,0,773,0,775,0,778,0,781,0,783,0,786,0,789,0,791,0,794,0,796,0,799,0,801,0,804,0,807,0,809,0,812,0,814,0,817,0,819,0,822,0,824,0,827,0,829,0,832,0,834,0,836,0,839,0,841,0,844,0,846,0,849,0,851,0,853,0,856,0,858,0,861,0,863,0,865,0,868,0,870,0,872,0,875,0,877,0,879,0,882,0,884,0,886,0,889,0,891,0,893,0,896,0,898,0,900,0,902,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZL10AllocFramevE2ix=allocate(1,"i32",ALLOC_STATIC);__ZZL10AllocFramevE10frame_pool=allocate(10240,["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8"],ALLOC_STATIC);_translator=allocate(1,"%struct.Translator*",ALLOC_STATIC);_translator2=allocate(1,"%struct.Translator*",ALLOC_STATIC);__ZL20translator2_language=allocate(20,"i8",ALLOC_STATIC);_f_trans=allocate(1,"%struct.__sFILE*",ALLOC_STATIC);_option_tone2=allocate(1,"i32",ALLOC_STATIC);_option_tone_flags=allocate(1,"i32",ALLOC_STATIC);_option_phonemes=allocate(1,"i32",ALLOC_STATIC);_option_phoneme_events=allocate(1,"i32",ALLOC_STATIC);_option_quiet=allocate(1,"i32",ALLOC_STATIC);_option_endpause=allocate(1,"i32",ALLOC_STATIC);_option_capitals=allocate(1,"i32",ALLOC_STATIC);_option_punctuation=allocate(1,"i32",ALLOC_STATIC);_option_sayas=allocate(1,"i32",ALLOC_STATIC);_option_ssml=allocate(1,"i32",ALLOC_STATIC);_option_phoneme_input=allocate(1,"i32",ALLOC_STATIC);_option_phoneme_variants=allocate(1,"i32",ALLOC_STATIC);_option_wordgap=allocate(1,"i32",ALLOC_STATIC);_skip_sentences=allocate(1,"i32",ALLOC_STATIC);_skip_words=allocate(1,"i32",ALLOC_STATIC);_skip_characters=allocate(1,"i32",ALLOC_STATIC);_skip_marker=allocate(50,"i8",ALLOC_STATIC);_skipping_text=allocate(1,"i32",ALLOC_STATIC);_end_character_position=allocate(1,"i32",ALLOC_STATIC);_count_sentences=allocate(1,"i32",ALLOC_STATIC);_count_words=allocate(1,"i32",ALLOC_STATIC);_clause_start_char=allocate(1,"i32",ALLOC_STATIC);_clause_start_word=allocate(1,"i32",ALLOC_STATIC);_new_sentence=allocate(1,"i32",ALLOC_STATIC);_pre_pause=allocate(1,"i32",ALLOC_STATIC);_word_phonemes=allocate(160,"i8",ALLOC_STATIC);_n_ph_list2=allocate(1,"i32",ALLOC_STATIC);_ph_list2=allocate(8000,["i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0,"i8","i8","i8","i8","i16",0,"i16",0],ALLOC_STATIC);_option_punctlist=allocate(240,"i32",ALLOC_STATIC);_ctrl_embedded=allocate([1],["i8",0,0,0,0],ALLOC_STATIC);_option_multibyte=allocate(1,"i32",ALLOC_STATIC);_option_linelength=allocate(1,"i32",ALLOC_STATIC);_embedded_list=allocate(1000,"i32",ALLOC_STATIC);_n_replace_phonemes=allocate(1,"i32",ALLOC_STATIC);_replace_phonemes=allocate(180,"i8",ALLOC_STATIC);__ZL10ISO_8859_1=allocate([160,0,161,0,162,0,163,0,164,0,165,0,166,0,167,0,168,0,169,0,170,0,171,0,172,0,173,0,174,0,175,0,176,0,177,0,178,0,179,0,180,0,181,0,182,0,183,0,184,0,185,0,186,0,187,0,188,0,189,0,190,0,191,0,192,0,193,0,194,0,195,0,196,0,197,0,198,0,199,0,200,0,201,0,202,0,203,0,204,0,205,0,206,0,207,0,208,0,209,0,210,0,211,0,212,0,213,0,214,0,215,0,216,0,217,0,218,0,219,0,220,0,221,0,222,0,223,0,224,0,225,0,226,0,227,0,228,0,229,0,230,0,231,0,232,0,233,0,234,0,235,0,236,0,237,0,238,0,239,0,240,0,241,0,242,0,243,0,244,0,245,0,246,0,247,0,248,0,249,0,250,0,251,0,252,0,253,0,254,0,255,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZL10ISO_8859_2=allocate([160,0,260,0,728,0,321,0,164,0,317,0,346,0,167,0,168,0,352,0,350,0,356,0,377,0,173,0,381,0,379,0,176,0,261,0,731,0,322,0,180,0,318,0,347,0,711,0,184,0,353,0,351,0,357,0,378,0,733,0,382,0,380,0,340,0,193,0,194,0,258,0,196,0,313,0,262,0,199,0,268,0,201,0,280,0,203,0,282,0,205,0,206,0,270,0,272,0,323,0,327,0,211,0,212,0,336,0,214,0,215,0,344,0,366,0,218,0,368,0,220,0,221,0,354,0,223,0,341,0,225,0,226,0,259,0,228,0,314,0,263,0,231,0,269,0,233,0,281,0,235,0,283,0,237,0,238,0,271,0,273,0,324,0,328,0,243,0,244,0,337,0,246,0,247,0,345,0,367,0,250,0,369,0,252,0,253,0,355,0,729,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZL10ISO_8859_3=allocate([160,0,294,0,728,0,163,0,164,0,0,0,292,0,167,0,168,0,304,0,350,0,286,0,308,0,173,0,0,0,379,0,176,0,295,0,178,0,179,0,180,0,181,0,293,0,183,0,184,0,305,0,351,0,287,0,309,0,189,0,0,0,380,0,192,0,193,0,194,0,0,0,196,0,266,0,264,0,199,0,200,0,201,0,202,0,203,0,204,0,205,0,206,0,207,0,0,0,209,0,210,0,211,0,212,0,288,0,214,0,215,0,284,0,217,0,218,0,219,0,220,0,364,0,348,0,223,0,224,0,225,0,226,0,0,0,228,0,267,0,265,0,231,0,232,0,233,0,234,0,235,0,236,0,237,0,238,0,239,0,0,0,241,0,242,0,243,0,244,0,289,0,246,0,247,0,285,0,249,0,250,0,251,0,252,0,365,0,349,0,729,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZL10ISO_8859_4=allocate([160,0,260,0,312,0,342,0,164,0,296,0,315,0,167,0,168,0,352,0,274,0,290,0,358,0,173,0,381,0,175,0,176,0,261,0,731,0,343,0,180,0,297,0,316,0,711,0,184,0,353,0,275,0,291,0,359,0,330,0,382,0,331,0,256,0,193,0,194,0,195,0,196,0,197,0,198,0,302,0,268,0,201,0,280,0,203,0,278,0,205,0,206,0,298,0,272,0,325,0,332,0,310,0,212,0,213,0,214,0,215,0,216,0,370,0,218,0,219,0,220,0,360,0,362,0,223,0,257,0,225,0,226,0,227,0,228,0,229,0,230,0,303,0,269,0,233,0,281,0,235,0,279,0,237,0,238,0,299,0,273,0,326,0,333,0,311,0,244,0,245,0,246,0,247,0,248,0,371,0,250,0,251,0,252,0,361,0,363,0,729,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZL10ISO_8859_5=allocate([160,0,1025,0,1026,0,1027,0,1028,0,1029,0,1030,0,1031,0,1032,0,1033,0,1034,0,1035,0,1036,0,173,0,1038,0,1039,0,1040,0,1041,0,1042,0,1043,0,1044,0,1045,0,1046,0,1047,0,1048,0,1049,0,1050,0,1051,0,1052,0,1053,0,1054,0,1055,0,1056,0,1057,0,1058,0,1059,0,1060,0,1061,0,1062,0,1063,0,1064,0,1065,0,1066,0,1067,0,1068,0,1069,0,1070,0,1071,0,1072,0,1073,0,1074,0,1075,0,1076,0,1077,0,1078,0,1079,0,1080,0,1081,0,1082,0,1083,0,1084,0,1085,0,1086,0,1087,0,1088,0,1089,0,1090,0,1091,0,1092,0,1093,0,1094,0,1095,0,1096,0,1097,0,1098,0,1099,0,1100,0,1101,0,1102,0,1103,0,8470,0,1105,0,1106,0,1107,0,1108,0,1109,0,1110,0,1111,0,1112,0,1113,0,1114,0,1115,0,1116,0,167,0,1118,0,1119,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZL10ISO_8859_7=allocate([160,0,8216,0,8217,0,163,0,8364,0,8367,0,166,0,167,0,168,0,169,0,890,0,171,0,172,0,173,0,0,0,8213,0,176,0,177,0,178,0,179,0,900,0,901,0,902,0,183,0,904,0,905,0,906,0,187,0,908,0,189,0,910,0,911,0,912,0,913,0,914,0,915,0,916,0,917,0,918,0,919,0,920,0,921,0,922,0,923,0,924,0,925,0,926,0,927,0,928,0,929,0,0,0,931,0,932,0,933,0,934,0,935,0,936,0,937,0,938,0,939,0,940,0,941,0,942,0,943,0,944,0,945,0,946,0,947,0,948,0,949,0,950,0,951,0,952,0,953,0,954,0,955,0,956,0,957,0,958,0,959,0,960,0,961,0,962,0,963,0,964,0,965,0,966,0,967,0,968,0,969,0,970,0,971,0,972,0,973,0,974,0,0,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZL10ISO_8859_9=allocate([160,0,161,0,162,0,163,0,164,0,165,0,166,0,167,0,168,0,169,0,170,0,171,0,172,0,173,0,174,0,175,0,176,0,177,0,178,0,179,0,180,0,181,0,182,0,183,0,184,0,185,0,186,0,187,0,188,0,189,0,190,0,191,0,192,0,193,0,194,0,195,0,196,0,197,0,198,0,199,0,200,0,201,0,202,0,203,0,204,0,205,0,206,0,207,0,286,0,209,0,210,0,211,0,212,0,213,0,214,0,215,0,216,0,217,0,218,0,219,0,220,0,304,0,350,0,223,0,224,0,225,0,226,0,227,0,228,0,229,0,230,0,231,0,232,0,233,0,234,0,235,0,236,0,237,0,238,0,239,0,287,0,241,0,242,0,243,0,244,0,245,0,246,0,247,0,248,0,249,0,250,0,251,0,252,0,305,0,351,0,255,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZL11ISO_8859_14=allocate([160,0,7682,0,7683,0,163,0,266,0,267,0,7690,0,167,0,7808,0,169,0,7810,0,7691,0,7922,0,173,0,174,0,376,0,7710,0,7711,0,288,0,289,0,7744,0,7745,0,182,0,7766,0,7809,0,7767,0,7811,0,7776,0,7923,0,7812,0,7813,0,7777,0,192,0,193,0,194,0,195,0,196,0,197,0,198,0,199,0,200,0,201,0,202,0,203,0,204,0,205,0,206,0,207,0,372,0,209,0,210,0,211,0,212,0,213,0,214,0,7786,0,216,0,217,0,218,0,219,0,220,0,221,0,374,0,223,0,224,0,225,0,226,0,227,0,228,0,229,0,230,0,231,0,232,0,233,0,234,0,235,0,236,0,237,0,238,0,239,0,373,0,241,0,242,0,243,0,244,0,245,0,246,0,7787,0,248,0,249,0,250,0,251,0,252,0,253,0,375,0,255,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZL6KOI8_R=allocate([9552,0,9553,0,9554,0,1105,0,9555,0,9556,0,9557,0,9558,0,9559,0,9560,0,9561,0,9562,0,9563,0,9564,0,9565,0,9566,0,9567,0,9568,0,9569,0,1025,0,9570,0,9571,0,9572,0,9573,0,9574,0,9575,0,9576,0,9577,0,9578,0,9579,0,9580,0,169,0,1102,0,1072,0,1073,0,1094,0,1076,0,1077,0,1092,0,1075,0,1093,0,1080,0,1081,0,1082,0,1083,0,1084,0,1085,0,1086,0,1087,0,1103,0,1088,0,1089,0,1090,0,1091,0,1078,0,1074,0,1100,0,1099,0,1079,0,1096,0,1101,0,1097,0,1095,0,1098,0,1070,0,1040,0,1041,0,1062,0,1044,0,1045,0,1060,0,1043,0,1061,0,1048,0,1049,0,1050,0,1051,0,1052,0,1053,0,1054,0,1055,0,1071,0,1056,0,1057,0,1058,0,1059,0,1046,0,1042,0,1068,0,1067,0,1047,0,1064,0,1069,0,1065,0,1063,0,1066,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZL5ISCII=allocate([32,0,2305,0,2306,0,2307,0,2309,0,2310,0,2311,0,2312,0,2313,0,2314,0,2315,0,2318,0,2319,0,2320,0,2317,0,2322,0,2323,0,2324,0,2321,0,2325,0,2326,0,2327,0,2328,0,2329,0,2330,0,2331,0,2332,0,2333,0,2334,0,2335,0,2336,0,2337,0,2338,0,2339,0,2340,0,2341,0,2342,0,2343,0,2344,0,2345,0,2346,0,2347,0,2348,0,2349,0,2350,0,2351,0,2399,0,2352,0,2353,0,2354,0,2355,0,2356,0,2357,0,2358,0,2359,0,2360,0,2361,0,32,0,2366,0,2367,0,2368,0,2369,0,2370,0,2371,0,2374,0,2375,0,2376,0,2373,0,2378,0,2379,0,2380,0,2377,0,2381,0,2364,0,2404,0,32,0,32,0,32,0,32,0,32,0,32,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,32,0,32,0,32,0,32,0,32,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);_charsets=allocate(80,"i16*",ALLOC_STATIC);__ZL15length_mod_tabs=allocate(24,"i8*",ALLOC_STATIC);__ZZ7IsAlphajE18extra_indic_alphas=allocate([2672,0,2673,0,0,0],["i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZL8brackets=allocate([40,0,41,0,91,0,93,0,123,0,125,0,60,0,62,0,34,0,39,0,96,0,171,0,187,0,12298,0,12299,0,-8132,0,0,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ8utf8_outjPcE4code=allocate([0,192,224,240],"i8",ALLOC_STATIC);__ZZ8utf8_in2PiPKciE4mask=allocate([255,31,15,7],"i8",ALLOC_STATIC);__str543=allocate([40,37,115,41,32,37,115,32,32,45,62,32,40,37,115,41,32,0],"i8",ALLOC_STATIC);__str1544=allocate([37,115,10,10,0],"i8",ALLOC_STATIC);__ZZ13TranslateWordP10TranslatorPciP8WORD_TABE7word_zz=allocate([0,122,122,0],"i8",ALLOC_STATIC);__ZZ13TranslateWordP10TranslatorPciP8WORD_TABE7word_iz=allocate([0,105,122,0],"i8",ALLOC_STATIC);__ZZ13TranslateWordP10TranslatorPciP8WORD_TABE7word_ss=allocate([0,115,115,0],"i8",ALLOC_STATIC);__str2545=allocate([95,48,108,97,110,103,0],"i8",ALLOC_STATIC);__str4547=allocate([32,32,115,117,102,102,105,120,32,91,37,115,93,10,10,0],"i8",ALLOC_STATIC);__str5548=allocate([104,115,120,0],"i8",ALLOC_STATIC);__str6549=allocate([37,115,37,115,37,115,0],"i8",ALLOC_STATIC);__ZL18any_stressed_words_b=allocate(1,"i1",ALLOC_STATIC);__ZZ15TranslateClauseP10TranslatorP7__sFILEPKvPiPPcE17voice_change_name=allocate(40,"i8",ALLOC_STATIC);__ZL11embedded_ix=allocate(1,"i32",ALLOC_STATIC);__ZL13embedded_read=allocate(1,"i32",ALLOC_STATIC);__ZL6source=allocate(740,"i8",ALLOC_STATIC);__str7550=allocate([67,76,65,85,83,69,32,37,120,58,10,0],"i8",ALLOC_STATIC);__str8551=allocate([69,78,68,67,76,65,85,83,69,10,0],"i8",ALLOC_STATIC);__ZL16max_clause_pause=allocate(1,"i32",ALLOC_STATIC);__ZL13option_sayas2=allocate(1,"i32",ALLOC_STATIC);__ZL18count_sayas_digits=allocate(1,"i32",ALLOC_STATIC);__ZL6breaks=allocate([95,0,0,0],["i16",0,"i16",0],ALLOC_STATIC);__ZL13word_emphasis_b=allocate(1,"i1",ALLOC_STATIC);__ZL15option_emphasis=allocate(1,"i32",ALLOC_STATIC);__ZL13embedded_flag_b=allocate(1,"i1",ALLOC_STATIC);__str9552=allocate([87,79,82,68,58,32,102,108,103,61,37,46,53,120,32,108,101,110,61,37,100,32,32,39,0],"i8",ALLOC_STATIC);__str10553=allocate([39,10,0],"i8",ALLOC_STATIC);__str11554=allocate([95,94,95,0],"i8",ALLOC_STATIC);__ZZL13TranslateCharP10TranslatorPcijjPiE20hangul_compatibility=allocate([0,0,1,170,2,172,173,3,4,5,176,177,178,179,180,180,182,6,7,8,185,9,10,188,12,13,14,15,16,17,18,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117],"i8",ALLOC_STATIC);__ZZL14SubstituteCharP10TranslatorjjPiE11ignore_next_b=allocate(1,"i1",ALLOC_STATIC);__str12555=allocate([80,83,65,82,72,84,73,86,89,77,85,66,70,0],"i8",ALLOC_STATIC);__ZL14length_mods_en=allocate([100,120,100,105,100,110,110,100,95,100,105,120,105,110,125,130,135,115,125,100,105,120,75,100,75,105,120,85,75,100,105,120,85,105,95,115,120,100,95,100,110,120,95,105,100,115,120,100,100,100,105,120,100,105,95,115,120,110,95,100,105,120,100,105,105,122,125,110,105,100,105,120,100,105,105,122,125,110,105,100,105,120,95,105,100,115,120,110,100,100,100,120,100,100,100,100,100,100,100,100],"i8",ALLOC_STATIC);__ZL15length_mods_en0=allocate([100,150,100,105,110,115,110,110,110,100,105,150,105,110,125,135,140,115,135,100,105,150,90,105,90,122,135,100,90,100,105,150,100,105,100,122,135,100,100,100,105,150,100,105,105,115,135,110,105,100,105,150,100,105,105,122,130,120,125,100,105,150,100,105,110,122,125,115,110,100,105,150,100,105,105,122,135,120,105,100,105,150,100,105,105,115,135,110,105,100,100,100,100,100,100,100,100,100,100,100],"i8",ALLOC_STATIC);__ZL17length_mods_equal=allocate([110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110],"i8",ALLOC_STATIC);__str580=allocate([35,10,0],"i8",ALLOC_STATIC);__str1581=allocate([117,110,97,98,108,101,32,116,111,32,103,101,116,32,46,119,97,118,32,104,101,97,100,101,114,32,102,114,111,109,32,109,98,114,111,108,97,0],"i8",ALLOC_STATIC);__str2582=allocate([82,73,70,70,0],"i8",ALLOC_STATIC);__str3583=allocate([87,65,86,69,102,109,116,32,0],"i8",ALLOC_STATIC);__str4584=allocate([109,98,114,111,108,97,32,100,105,100,32,110,111,116,32,114,101,116,117,114,110,32,97,32,46,119,97,118,32,104,101,97,100,101,114,0],"i8",ALLOC_STATIC);__ZL14mbr_samplerate=allocate(1,"i32",ALLOC_STATIC);__ZL14mbr_voice_path=allocate(1,"i8*",ALLOC_STATIC);__ZL10mbr_volume=allocate([1],["float",0,0,0,0],ALLOC_STATIC);__ZL9mbr_state=allocate(1,"i32",ALLOC_STATIC);__ZL7mbr_pid=allocate(1,"i32",ALLOC_STATIC);__ZL10mbr_cmd_fd=allocate(1,"i32",ALLOC_STATIC);__str5585=allocate([10,35,10,0],"i8",ALLOC_STATIC);__ZL12mbr_audio_fd=allocate(1,"i32",ALLOC_STATIC);__ZL12mbr_errorbuf=allocate(160,"i8",ALLOC_STATIC);__ZL12mbr_error_fd=allocate(1,"i32",ALLOC_STATIC);__str7587=allocate([114,101,97,100,40,101,114,114,111,114,41,58,32,37,115,0],"i8",ALLOC_STATIC);__str8588=allocate([71,111,116,32,97,32,114,101,115,101,116,32,115,105,103,110,97,108,0],"i8",ALLOC_STATIC);__str9589=allocate([73,110,112,117,116,32,70,108,117,115,104,32,83,105,103,110,97,108,0],"i8",ALLOC_STATIC);__str10590=allocate([109,98,114,111,108,97,58,32,37,115,0],"i8",ALLOC_STATIC);__str11591=allocate([109,98,114,111,108,97,32,99,108,111,115,101,100,32,115,116,100,101,114,114,32,97,110,100,32,100,105,100,32,110,111,116,32,101,120,105,116,0],"i8",ALLOC_STATIC);__str12592=allocate([119,97,105,116,112,105,100,40,41,32,105,115,32,99,111,110,102,117,115,101,100,0],"i8",ALLOC_STATIC);__str13593=allocate([109,98,114,111,108,97,32,100,105,101,100,32,98,121,32,115,105,103,110,97,108,32,37,100,0],"i8",ALLOC_STATIC);__str14594=allocate([109,98,114,111,108,97,32,101,120,105,116,101,100,32,119,105,116,104,32,115,116,97,116,117,115,32,37,100,0],"i8",ALLOC_STATIC);__str15595=allocate([109,98,114,111,108,97,32,100,105,101,100,32,97,110,100,32,119,97,105,116,32,115,116,97,116,117,115,32,105,115,32,119,101,105,114,100,0],"i8",ALLOC_STATIC);__str16596=allocate([109,98,114,111,119,114,97,112,32,101,114,114,111,114,58,32,37,115,0],"i8",ALLOC_STATIC);__str17597=allocate([44,32,40,37,115,41,0],"i8",ALLOC_STATIC);__ZL21mbr_pending_data_head=allocate(1,"%struct.datablock*",ALLOC_STATIC);__ZL21mbr_pending_data_tail=allocate(1,"%struct.datablock*",ALLOC_STATIC);__str18598=allocate([112,111,108,108,40,41,58,32,37,115,0],"i8",ALLOC_STATIC);__str19599=allocate([109,98,114,111,108,97,32,112,114,111,99,101,115,115,32,105,115,32,115,116,97,108,108,101,100,0],"i8",ALLOC_STATIC);__str20600=allocate([119,114,105,116,101,40,41,58,32,37,115,0],"i8",ALLOC_STATIC);__str21601=allocate([114,101,97,100,40,41,58,32,37,115,0],"i8",ALLOC_STATIC);__ZL13mbr_proc_stat=allocate(1,"i32",ALLOC_STATIC);__str22602=allocate([109,98,114,111,108,97,32,105,110,105,116,32,114,101,113,117,101,115,116,32,119,104,101,110,32,97,108,114,101,97,100,121,32,105,110,105,116,105,97,108,105,122,101,100,0],"i8",ALLOC_STATIC);__str23603=allocate([102,111,114,107,40,41,58,32,37,115,0],"i8",ALLOC_STATIC);__str24604=allocate([100,117,112,50,40,41,58,32,37,115,10,0],"i8",ALLOC_STATIC);__str25605=allocate([37,103,0],"i8",ALLOC_STATIC);__str27607=allocate([45,101,0],"i8",ALLOC_STATIC);__str28608=allocate([45,118,0],"i8",ALLOC_STATIC);__str30610=allocate([45,46,119,97,118,0],"i8",ALLOC_STATIC);__str31611=allocate([109,98,114,111,108,97,58,32,37,115,10,0],"i8",ALLOC_STATIC);__str32612=allocate([47,112,114,111,99,47,37,100,47,115,116,97,116,0],"i8",ALLOC_STATIC);__str33613=allocate([47,112,114,111,99,32,105,115,32,117,110,97,99,99,101,115,115,105,98,108,101,58,32,37,115,0],"i8",ALLOC_STATIC);__str34614=allocate([102,99,110,116,108,40,41,58,32,37,115,0],"i8",ALLOC_STATIC);__str35615=allocate([112,105,112,101,40,41,58,32,37,115,0],"i8",ALLOC_STATIC);__ZZ15SetIndicLettersP10TranslatorE15dev_consonants2=allocate([2,3,88,89,90,91,92,93,94,95],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_fr=allocate([190,0,170,0,190,0,200,0,0,0,0,0,190,0,240,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE14stress_amps_fr=allocate([18,16,18,18,18,18,18,18],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE14stress_amps_sk=allocate([17,17,20,20,20,22,22,21],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_sk=allocate([190,0,190,0,210,0,210,0,0,0,0,0,210,0,210,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_ta=allocate([200,0,200,0,210,0,210,0,0,0,0,0,230,0,230,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE14stress_amps_ta=allocate([18,18,18,18,20,20,22,22],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_af=allocate([170,0,140,0,220,0,220,0,0,0,0,0,250,0,270,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_bn=allocate([180,0,180,0,210,0,210,0,0,0,0,0,230,0,240,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE14stress_amps_bn=allocate([18,18,18,18,20,20,22,22],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_cy=allocate([170,0,220,0,180,0,180,0,0,0,0,0,250,0,270,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE14stress_amps_cy=allocate([17,15,18,18,0,0,22,20],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_da=allocate([160,0,140,0,200,0,200,0,0,0,0,0,220,0,230,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_de=allocate([150,0,130,0,200,0,200,0,0,0,0,0,270,0,270,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE14stress_amps_de=allocate([20,20,20,20,20,22,22,20],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_en=allocate([182,0,140,0,220,0,220,0,0,0,0,0,248,0,275,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__str630=allocate([97,101,105,111,117,121,0],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_el=allocate([155,0,180,0,210,0,210,0,0,0,0,0,270,0,300,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE14stress_amps_el=allocate([15,12,20,20,20,22,22,21],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE9el_vowels=allocate([16,44,45,46,47,48,49,53,55,57,63,69,73,74,75,76,77,78,79,0],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE10el_fvowels=allocate([45,46,47,53,55,57,69,77,0],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE12el_voiceless=allocate([56,58,62,64,66,67,68,70,71,0],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE13el_consonants=allocate([50,51,52,54,56,58,59,60,61,62,64,65,66,67,68,70,71,72,0],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE18el_char_apostrophe=allocate([963,0,0,0,0,0,0,0],["i32",0,0,0,"i32",0,0,0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_eo=allocate([150,0,150,0,230,0,180,0,0,0,0,0,300,0,320,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE14stress_amps_eo=allocate([16,14,20,20,20,22,22,21],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE18eo_char_apostrophe=allocate([108,0,0,0,0,0,0,0],["i32",0,0,0,"i32",0,0,0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_es=allocate([180,0,210,0,190,0,190,0,0,0,0,0,230,0,260,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE14stress_amps_es=allocate([16,12,18,18,20,20,20,20],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE20ca_punct_within_word=allocate([39,0,0,0,183,0,0,0,0,0,0,0],["i32",0,0,0,"i32",0,0,0,"i32",0,0,0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_eu=allocate([200,0,200,0,200,0,200,0,0,0,0,0,210,0,230,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE14stress_amps_eu=allocate([16,16,18,18,18,18,18,18],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE14stress_amps_fi=allocate([18,16,22,22,20,22,22,22],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_fi=allocate([150,0,180,0,200,0,200,0,0,0,0,0,210,0,250,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_hi=allocate([190,0,190,0,210,0,210,0,0,0,0,0,230,0,250,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE14stress_amps_hi=allocate([17,14,20,19,20,22,22,21],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE14stress_amps_hr=allocate([17,17,20,20,20,22,22,21],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_hr=allocate([180,0,160,0,200,0,200,0,0,0,0,0,220,0,230,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_sr=allocate([160,0,150,0,200,0,200,0,0,0,0,0,250,0,260,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZL22replace_cyrillic_latin=allocate([1072,0,0,0,97,0,0,0,1073,0,0,0,98,0,0,0,1094,0,0,0,99,0,0,0,1115,0,0,0,263,0,0,0,1095,0,0,0,269,0,0,0,1119,0,0,0,25034852,0,0,0,1109,0,0,0,7995492,0,0,0,1076,0,0,0,100,0,0,0,1106,0,0,0,273,0,0,0,1077,0,0,0,101,0,0,0,1092,0,0,0,102,0,0,0,1075,0,0,0,103,0,0,0,1093,0,0,0,104,0,0,0,1080,0,0,0,105,0,0,0,1112,0,0,0,106,0,0,0,1082,0,0,0,107,0,0,0,1113,0,0,0,6946924,0,0,0,1083,0,0,0,108,0,0,0,1084,0,0,0,109,0,0,0,1114,0,0,0,6946926,0,0,0,1085,0,0,0,110,0,0,0,1086,0,0,0,111,0,0,0,1087,0,0,0,112,0,0,0,1088,0,0,0,114,0,0,0,1089,0,0,0,115,0,0,0,1096,0,0,0,353,0,0,0,1090,0,0,0,116,0,0,0,1091,0,0,0,117,0,0,0,1074,0,0,0,118,0,0,0,1079,0,0,0,122,0,0,0,1078,0,0,0,382,0,0,0,1107,0,0,0,273,0,0,0,1116,0,0,0,263,0,0,0,0,0,0,0],["i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE14stress_amps_hu=allocate([17,17,19,19,20,22,22,21],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_hu=allocate([185,0,195,0,195,0,190,0,0,0,0,0,210,0,220,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_hy=allocate([250,0,200,0,250,0,250,0,0,0,0,0,250,0,250,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE9hy_vowels=allocate([49,53,55,56,59,72,85,0],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE13hy_consonants=allocate([50,51,52,54,57,58,60,61,62,63,64,65,66,67,68,69,70,71,73,74,75,76,77,78,79,80,81,82,83,84,86,0],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_id=allocate([160,0,200,0,180,0,180,0,0,0,0,0,220,0,240,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE14stress_amps_id=allocate([16,18,18,18,20,22,22,21],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_is=allocate([180,0,160,0,200,0,200,0,0,0,0,0,240,0,250,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE16is_lettergroup_B=allocate([99,0,0,0,102,0,0,0,104,0,0,0,107,0,0,0,112,0,0,0,116,0,0,0,120,0,0,0,254,0,0,0,0,0,0,0],["i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0],ALLOC_STATIC);__str1631=allocate([107,112,115,116,0],"i8",ALLOC_STATIC);__str2632=allocate([106,118,114,0],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_it=allocate([150,0,140,0,170,0,170,0,0,0,0,0,300,0,330,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE14stress_amps_it=allocate([15,14,19,19,20,22,22,20],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE18stress_lengths_jbo=allocate([145,0,145,0,170,0,160,0,0,0,0,0,330,0,350,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE21jbo_punct_within_word=allocate([46,0,0,0,44,0,0,0,39,0,0,0,712,0,0,0,0,0,0,0],["i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE9ka_vowels=allocate([80,84,88,93,99,117,119,0],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE13ka_consonants=allocate([81,82,83,85,86,87,89,90,91,92,94,95,96,97,98,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,118,0],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE10ko_ivowels=allocate([99,100,103,104,109,114,116,117,0],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE9ko_voiced=allocate([2,5,6,171,175,183,188,0],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE14stress_amps_ku=allocate([18,18,20,20,20,22,22,21],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_ku=allocate([180,0,180,0,190,0,180,0,0,0,0,0,230,0,240,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE14stress_amps_lv=allocate([17,13,20,20,20,22,22,21],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_lv=allocate([180,0,130,0,210,0,210,0,0,0,0,0,210,0,210,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE15vowels_cyrillic=allocate([1088,0,0,0,1072,0,0,0,1077,0,0,0,1080,0,0,0,1081,0,0,0,1086,0,0,0,1091,0,0,0,1099,0,0,0,1101,0,0,0,1102,0,0,0,1103,0,0,0,1104,0,0,0,1105,0,0,0,1110,0,0,0,1111,0,0,0,1117,0,0,0,1118,0,0,0,0,0,0,0],["i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE14stress_amps_mk=allocate([17,17,20,20,20,22,22,21],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_mk=allocate([180,0,160,0,200,0,200,0,0,0,0,0,220,0,230,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_nl=allocate([160,0,135,0,210,0,210,0,0,0,0,0,260,0,280,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__str3633=allocate([101,0],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_no=allocate([160,0,140,0,200,0,200,0,0,0,0,0,220,0,230,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE14stress_amps_om=allocate([18,15,20,20,20,22,22,22],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_om=allocate([200,0,200,0,200,0,200,0,0,0,0,0,200,0,200,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_pl=allocate([160,0,190,0,175,0,175,0,0,0,0,0,200,0,210,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE14stress_amps_pl=allocate([17,13,19,19,20,22,22,21],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_pt=allocate([170,0,115,0,210,0,240,0,0,0,0,0,260,0,280,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE14stress_amps_pt=allocate([16,11,19,21,20,22,22,21],"i8",ALLOC_STATIC);__str4634=allocate([98,99,100,102,103,106,107,109,110,112,113,115,116,118,120,122,0],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_ro=allocate([170,0,170,0,180,0,180,0,0,0,0,0,240,0,260,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE14stress_amps_ro=allocate([15,13,18,18,20,22,22,21],"i8",ALLOC_STATIC);__str5635=allocate([98,100,103,106,108,109,110,114,118,119,122,97,101,105,111,117,121,0],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_sq=allocate([150,0,150,0,180,0,180,0,0,0,0,0,300,0,300,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE14stress_amps_sq=allocate([16,12,16,16,20,20,21,19],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE14stress_amps_sv=allocate([16,16,20,20,20,22,22,21],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_sv=allocate([160,0,135,0,220,0,220,0,0,0,0,0,250,0,280,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_sw=allocate([160,0,170,0,200,0,200,0,0,0,0,0,320,0,340,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE14stress_amps_sw=allocate([16,12,19,19,20,22,22,21],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE14stress_amps_tr=allocate([18,16,20,21,20,21,21,20],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_tr=allocate([190,0,180,0,200,0,230,0,0,0,0,0,240,0,250,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_vi=allocate([150,0,150,0,180,0,180,0,210,0,230,0,230,0,240,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE14stress_amps_vi=allocate([16,16,16,16,22,22,22,22],"i8",ALLOC_STATIC);__ZZ16SelectTranslatorPKcE9vowels_vi=allocate([97,0,0,0,224,0,0,0,225,0,0,0,7843,0,0,0,227,0,0,0,7841,0,0,0,259,0,0,0,7857,0,0,0,7855,0,0,0,7859,0,0,0,7861,0,0,0,7863,0,0,0,226,0,0,0,7847,0,0,0,7845,0,0,0,7849,0,0,0,7851,0,0,0,7853,0,0,0,101,0,0,0,232,0,0,0,233,0,0,0,7867,0,0,0,7869,0,0,0,7865,0,0,0,234,0,0,0,7873,0,0,0,7871,0,0,0,7875,0,0,0,7877,0,0,0,7879,0,0,0,105,0,0,0,236,0,0,0,237,0,0,0,7881,0,0,0,297,0,0,0,7883,0,0,0,111,0,0,0,242,0,0,0,243,0,0,0,7887,0,0,0,245,0,0,0,7885,0,0,0,244,0,0,0,7891,0,0,0,7889,0,0,0,7893,0,0,0,7895,0,0,0,7897,0,0,0,417,0,0,0,7901,0,0,0,7899,0,0,0,7903,0,0,0,7905,0,0,0,7907,0,0,0,117,0,0,0,249,0,0,0,250,0,0,0,7911,0,0,0,361,0,0,0,7909,0,0,0,432,0,0,0,7915,0,0,0,7913,0,0,0,7917,0,0,0,7919,0,0,0,7921,0,0,0,121,0,0,0,7923,0,0,0,253,0,0,0,7927,0,0,0,7929,0,0,0,30,0,0,0,0,0,0,0],["i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE17stress_lengths_zh=allocate([230,0,150,0,230,0,230,0,230,0,0,0,240,0,250,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ16SelectTranslatorPKcE14stress_amps_zh=allocate([22,16,22,22,22,22,22,22],"i8",ALLOC_STATIC);__ZZL18Translator_RussianP10TranslatorE14stress_amps_ru=allocate([16,16,18,18,20,24,24,22],"i8",ALLOC_STATIC);__ZZL18Translator_RussianP10TranslatorE17stress_lengths_ru=allocate([150,0,140,0,220,0,220,0,0,0,0,0,260,0,280,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZL18Translator_RussianP10TranslatorE11ru_ivowels2=allocate([44,21,24,46,47,0],"i8",ALLOC_STATIC);__ZZL18SetCyrillicLettersP10TranslatorE9ru_vowels=allocate([16,21,49,24,30,35,43,45,46,47,0],"i8",ALLOC_STATIC);__ZZL18SetCyrillicLettersP10TranslatorE13ru_consonants=allocate([17,18,19,20,22,23,25,26,27,28,29,31,32,33,34,36,37,38,39,40,41,42,44,0],"i8",ALLOC_STATIC);__ZZL18SetCyrillicLettersP10TranslatorE7ru_soft=allocate([44,25,39,41,0],"i8",ALLOC_STATIC);__ZZL18SetCyrillicLettersP10TranslatorE7ru_hard=allocate([42,22,38,40,0],"i8",ALLOC_STATIC);__ZZL18SetCyrillicLettersP10TranslatorE10ru_nothard=allocate([17,18,19,20,23,25,26,27,28,29,31,32,33,34,36,37,39,41,44,0],"i8",ALLOC_STATIC);__ZZL18SetCyrillicLettersP10TranslatorE9ru_voiced=allocate([17,18,19,20,22,23,0],"i8",ALLOC_STATIC);__ZZL18SetCyrillicLettersP10TranslatorE10ru_ivowels=allocate([44,46,47,49,0],"i8",ALLOC_STATIC);__ZL8pairs_ru=allocate([268,0,270,0,275,0,769,0,783,0,1550,0,1553,0,2307,0,2817,0,2831,0,3073,0,3081,0,3585,0,3590,0,3593,0,3598,0,3599,0,3612,0,3843,0,3857,0,3858,0,4111,0,4113,0,4353,0,4358,0,4361,0,4367,0,4627,0,4640,0,32767,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZL13NewTranslatorvE12stress_amps2=allocate([18,18,20,20,20,22,22,20],"i8",ALLOC_STATIC);__ZZL13NewTranslatorvE15stress_lengths2=allocate([182,0,140,0,220,0,220,0,220,0,240,0,260,0,280,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZL13NewTranslatorvE13empty_wstring=allocate(4,"i32",ALLOC_STATIC);__ZZL13NewTranslatorvE13punct_in_word=allocate([39,0,0,0,0,0,0,0],["i32",0,0,0,"i32",0,0,0],ALLOC_STATIC);__ZZL13NewTranslatorvE13default_tunes=allocate([0,1,2,3,0,0],"i8",ALLOC_STATIC);__str6636=allocate([97,101,105,111,117,0],"i8",ALLOC_STATIC);__str7637=allocate([98,99,100,102,103,106,107,108,109,110,112,113,115,116,118,120,122,0],"i8",ALLOC_STATIC);__str8638=allocate([98,99,100,102,103,104,106,107,108,109,110,112,113,114,115,116,118,119,120,122,0],"i8",ALLOC_STATIC);__str9639=allocate([104,108,109,110,114,0],"i8",ALLOC_STATIC);__str10640=allocate([99,102,104,107,112,113,115,116,120,0],"i8",ALLOC_STATIC);__str11641=allocate([98,100,103,106,108,109,110,114,118,119,121,122,0],"i8",ALLOC_STATIC);__str12642=allocate([101,105,121,0],"i8",ALLOC_STATIC);__str13643=allocate(1,"i8",ALLOC_STATIC);__str646=allocate([117,110,107,110,111,119,110,0],"i8",ALLOC_STATIC);__str1647=allocate([109,97,108,101,0],"i8",ALLOC_STATIC);__str2648=allocate([102,101,109,97,108,101,0],"i8",ALLOC_STATIC);_genders=allocate([0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0],ALLOC_STATIC);_tone_points=allocate([600,0,0,0,170,0,0,0,1200,0,0,0,135,0,0,0,2000,0,0,0,110,0,0,0,3000,0,0,0,110,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],["i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0],ALLOC_STATIC);_formant_rate=allocate(36,"i32",ALLOC_STATIC);_voice_selected=allocate(24,["i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8","i8","i8","i8","i32",0,0,0,"i8*",0,0,0],ALLOC_STATIC);__str3653=allocate([114,101,100,117,99,101,95,116,0],"i8",ALLOC_STATIC);__str4654=allocate([98,114,97,99,107,101,116,0],"i8",ALLOC_STATIC);__ZL11options_tab=allocate([0,0,0,0,12,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,-1,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0],ALLOC_STATIC);__str5655=allocate([110,97,109,101,0],"i8",ALLOC_STATIC);__str6656=allocate([108,97,110,103,117,97,103,101,0],"i8",ALLOC_STATIC);__str7657=allocate([103,101,110,100,101,114,0],"i8",ALLOC_STATIC);__str8658=allocate([102,111,114,109,97,110,116,0],"i8",ALLOC_STATIC);__str9659=allocate([112,105,116,99,104,0],"i8",ALLOC_STATIC);__str10660=allocate([112,104,111,110,101,109,101,115,0],"i8",ALLOC_STATIC);__str11661=allocate([116,114,97,110,115,108,97,116,111,114,0],"i8",ALLOC_STATIC);__str12662=allocate([100,105,99,116,105,111,110,97,114,121,0],"i8",ALLOC_STATIC);__str13663=allocate([115,116,114,101,115,115,76,101,110,103,116,104,0],"i8",ALLOC_STATIC);__str14664=allocate([115,116,114,101,115,115,65,109,112,0],"i8",ALLOC_STATIC);__str15665=allocate([115,116,114,101,115,115,65,100,100,0],"i8",ALLOC_STATIC);__str16666=allocate([105,110,116,111,110,97,116,105,111,110,0],"i8",ALLOC_STATIC);__str17667=allocate([116,117,110,101,115,0],"i8",ALLOC_STATIC);__str18668=allocate([100,105,99,116,114,117,108,101,115,0],"i8",ALLOC_STATIC);__str19669=allocate([115,116,114,101,115,115,114,117,108,101,0],"i8",ALLOC_STATIC);__str20670=allocate([99,104,97,114,115,101,116,0],"i8",ALLOC_STATIC);__str21671=allocate([114,101,112,108,97,99,101,0],"i8",ALLOC_STATIC);__str22672=allocate([119,111,114,100,115,0],"i8",ALLOC_STATIC);__str23673=allocate([101,99,104,111,0],"i8",ALLOC_STATIC);__str24674=allocate([102,108,117,116,116,101,114,0],"i8",ALLOC_STATIC);__str25675=allocate([114,111,117,103,104,110,101,115,115,0],"i8",ALLOC_STATIC);__str26676=allocate([99,108,97,114,105,116,121,0],"i8",ALLOC_STATIC);__str27677=allocate([116,111,110,101,0],"i8",ALLOC_STATIC);__str28678=allocate([118,111,105,99,105,110,103,0],"i8",ALLOC_STATIC);__str29679=allocate([98,114,101,97,116,104,0],"i8",ALLOC_STATIC);__str30680=allocate([98,114,101,97,116,104,119,0],"i8",ALLOC_STATIC);__str31681=allocate([110,117,109,98,101,114,115,0],"i8",ALLOC_STATIC);__str32682=allocate([111,112,116,105,111,110,0],"i8",ALLOC_STATIC);__str33683=allocate([109,98,114,111,108,97,0],"i8",ALLOC_STATIC);__str34684=allocate([99,111,110,115,111,110,97,110,116,115,0],"i8",ALLOC_STATIC);__str35685=allocate([107,108,97,116,116,0],"i8",ALLOC_STATIC);__str36686=allocate([102,97,115,116,95,116,101,115,116,50,0],"i8",ALLOC_STATIC);__str37687=allocate([115,112,101,101,100,0],"i8",ALLOC_STATIC);__str38688=allocate([108,95,100,105,101,114,101,115,105,115,0],"i8",ALLOC_STATIC);__str39689=allocate([108,95,112,114,101,102,105,120,0],"i8",ALLOC_STATIC);__str40690=allocate([108,95,114,101,103,114,101,115,115,105,118,101,95,118,0],"i8",ALLOC_STATIC);__str41691=allocate([108,95,117,110,112,114,111,110,111,117,110,99,97,98,108,101,0],"i8",ALLOC_STATIC);__str42692=allocate([108,95,115,111,110,111,114,97,110,116,95,109,105,110,0],"i8",ALLOC_STATIC);__str43693=allocate([108,95,108,101,110,103,116,104,95,109,111,100,115,0],"i8",ALLOC_STATIC);__ZL11keyword_tab=allocate([0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,19,0,0,0,0,0,0,0,23,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,25,0,0,0,0,0,0,0,32,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,26,0,0,0,0,0,0,0,27,0,0,0,0,0,0,0,28,0,0,0,0,0,0,0,33,0,0,0,0,0,0,0,29,0,0,0,0,0,0,0,30,0,0,0,0,0,0,0,31,0,0,0,0,0,0,0,257,0,0,0,0,0,0,0,259,0,0,0,0,0,0,0,260,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,263,0,0,0,0,0,0,0,262,0,0,0,0,0,0,0,0,0,0,0],["i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0],ALLOC_STATIC);__ZL15variants_either=allocate([1,2,12,3,13,4,14,5,11,0,0,0],"i8",ALLOC_STATIC);__ZL13variants_male=allocate([1,2,3,4,5,0,0,0,0,0,0,0],"i8",ALLOC_STATIC);__ZL15variants_female=allocate([11,12,13,14,0,0,0,0,0,0,0,0],"i8",ALLOC_STATIC);_variant_lists=allocate(12,"i8*",ALLOC_STATIC);__ZL9voicedata=allocate(1344,["i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8"],ALLOC_STATIC);_voice=allocate(1,"%struct.voice_t*",ALLOC_STATIC);__str44696=allocate([37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,0],"i8",ALLOC_STATIC);__ZZ10VoiceResetiE15default_heights=allocate([128,128,120,120,110,110,128,128,128],"i8",ALLOC_STATIC);__ZZ10VoiceResetiE14default_widths=allocate([128,128,128,160,171,171,128,128,128],"i8",ALLOC_STATIC);__ZZ10VoiceResetiE13breath_widths=allocate([0,0,0,0,200,0,0,0,200,0,0,0,400,0,0,0,400,0,0,0,400,0,0,0,600,0,0,0,600,0,0,0,600,0,0,0],["i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0],ALLOC_STATIC);__ZL18formant_rate_22050=allocate([240,0,0,0,170,0,0,0,170,0,0,0,170,0,0,0,170,0,0,0,170,0,0,0,170,0,0,0,170,0,0,0,170,0,0,0],["i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0],ALLOC_STATIC);__ZZ9LoadVoicePKciE16voice_identifier=allocate(40,"i8",ALLOC_STATIC);__ZZ9LoadVoicePKciE10voice_name=allocate(40,"i8",ALLOC_STATIC);__ZZ9LoadVoicePKciE15voice_languages=allocate(100,"i8",ALLOC_STATIC);__str45697=allocate([100,101,102,97,117,108,116,0],"i8",ALLOC_STATIC);__str46698=allocate([37,115,37,99,118,111,105,99,101,115,37,99,0],"i8",ALLOC_STATIC);__str47699=allocate([37,115,37,115,0],"i8",ALLOC_STATIC);__str48700=allocate([37,115,37,115,37,99,37,115,0],"i8",ALLOC_STATIC);__str49701=allocate([37,115,101,120,116,114,97,37,99,37,115,0],"i8",ALLOC_STATIC);__str50702=allocate([37,115,116,101,115,116,37,99,37,115,0],"i8",ALLOC_STATIC);__str51703=allocate([114,0],"i8",ALLOC_STATIC);__str52704=allocate([101,110,0],"i8",ALLOC_STATIC);__str53705=allocate([43,37,115,0],"i8",ALLOC_STATIC);__str54706=allocate([37,115,32,37,100,0],"i8",ALLOC_STATIC);__str55707=allocate([118,97,114,105,97,110,116,0],"i8",ALLOC_STATIC);__str56708=allocate([45,0],"i8",ALLOC_STATIC);__str57709=allocate([37,115,0],"i8",ALLOC_STATIC);__str58710=allocate([37,100,32,37,100,0],"i8",ALLOC_STATIC);__str59711=allocate([37,115,32,37,115,32,37,115,32,37,115,32,37,115,32,37,115,0],"i8",ALLOC_STATIC);__str60712=allocate([78,85,76,76,0],"i8",ALLOC_STATIC);__str61713=allocate([85,110,107,110,111,119,110,32,116,117,110,101,32,39,37,115,39,10,0],"i8",ALLOC_STATIC);__str62714=allocate([37,100,32,37,100,32,37,100,32,37,100,0],"i8",ALLOC_STATIC);__str63715=allocate([37,100,0],"i8",ALLOC_STATIC);__str64716=allocate([37,115,32,37,100,32,37,100,0],"i8",ALLOC_STATIC);__str65717=allocate([66,97,100,32,118,111,105,99,101,32,111,112,116,105,111,110,58,32,37,115,32,37,115,10,0],"i8",ALLOC_STATIC);__str66718=allocate([37,115,32,37,115,32,37,100,0],"i8",ALLOC_STATIC);__str67719=allocate([109,98,114,111,108,97,32,118,111,105,99,101,32,110,111,116,32,102,111,117,110,100,10,0],"i8",ALLOC_STATIC);__str68720=allocate([66,97,100,32,118,111,105,99,101,32,97,116,116,114,105,98,117,116,101,58,32,37,115,10,0],"i8",ALLOC_STATIC);__str69721=allocate([85,110,107,110,111,119,110,32,112,104,111,110,101,109,101,32,116,97,98,108,101,58,32,39,37,115,39,10,0],"i8",ALLOC_STATIC);__ZL13n_voices_list=allocate(1,"i32",ALLOC_STATIC);__ZL11voices_list=allocate(600,"%struct.espeak_VOICE*",ALLOC_STATIC);__str70722=allocate([37,99,37,115,0],"i8",ALLOC_STATIC);__ZZ11SelectVoiceP12espeak_VOICEPiE14voice_variants=allocate(288,["i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8","i8","i8","i8","i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8","i8","i8","i8","i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8","i8","i8","i8","i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8","i8","i8","i8","i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8","i8","i8","i8","i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8","i8","i8","i8","i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8","i8","i8","i8","i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8","i8","i8","i8","i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8","i8","i8","i8","i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8","i8","i8","i8","i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8","i8","i8","i8","i32",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8*",0,0,0,"i8","i8","i8","i8","i32",0,0,0,"i8*",0,0,0],ALLOC_STATIC);__ZZ11SelectVoiceP12espeak_VOICEPiE8voice_id=allocate(50,"i8",ALLOC_STATIC);__ZZ11SelectVoiceP12espeak_VOICEPiE3buf=allocate(60,"i8",ALLOC_STATIC);__str71723=allocate([37,115,43,37,115,0],"i8",ALLOC_STATIC);__ZZ14SetVoiceByNamePKcE3buf=allocate(60,"i8",ALLOC_STATIC);__ZZ17espeak_ListVoicesE6voices=allocate(600,"%struct.espeak_VOICE*",ALLOC_STATIC);__str72724=allocate([37,115,37,99,118,111,105,99,101,115,0],"i8",ALLOC_STATIC);__ZL15len_path_voices=allocate(1,"i32",ALLOC_STATIC);__str73725=allocate([109,98,47,0],"i8",ALLOC_STATIC);__str74726=allocate([37,115,37,99,37,115,0],"i8",ALLOC_STATIC);__str75727=allocate([118,97,114,105,97,110,116,115,0],"i8",ALLOC_STATIC);__ZZL23ExtractVoiceVariantNamePciE12variant_name=allocate(20,"i8",ALLOC_STATIC);__str76728=allocate([33,118,37,99,0],"i8",ALLOC_STATIC);__str77729=allocate([37,115,109,37,100,0],"i8",ALLOC_STATIC);__str78730=allocate([37,115,102,37,100,0],"i8",ALLOC_STATIC);__str79731=allocate([37,100,32,37,115,32,37,115,0],"i8",ALLOC_STATIC);__str80732=allocate([37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,0],"i8",ALLOC_STATIC);__str81733=allocate([37,100,32,37,100,32,37,100,32,37,100,32,37,100,0],"i8",ALLOC_STATIC);__str82734=allocate([47,47,0],"i8",ALLOC_STATIC);_sin_tab=allocate([0,0,-25,0,-50,0,-75,0,-100,0,-125,0,-150,0,-175,0,-201,0,-226,0,-251,0,-276,0,-301,0,-326,0,-351,0,-376,0,-401,0,-427,0,-452,0,-477,0,-502,0,-527,0,-552,0,-577,0,-602,0,-627,0,-652,0,-677,0,-702,0,-727,0,-752,0,-777,0,-802,0,-827,0,-852,0,-877,0,-902,0,-927,0,-952,0,-977,0,-1002,0,-1027,0,-1052,0,-1077,0,-1102,0,-1127,0,-1152,0,-1177,0,-1201,0,-1226,0,-1251,0,-1276,0,-1301,0,-1326,0,-1350,0,-1375,0,-1400,0,-1425,0,-1449,0,-1474,0,-1499,0,-1523,0,-1548,0,-1573,0,-1597,0,-1622,0,-1647,0,-1671,0,-1696,0,-1721,0,-1745,0,-1770,0,-1794,0,-1819,0,-1843,0,-1868,0,-1892,0,-1917,0,-1941,0,-1965,0,-1990,0,-2014,0,-2038,0,-2063,0,-2087,0,-2111,0,-2136,0,-2160,0,-2184,0,-2208,0,-2233,0,-2257,0,-2281,0,-2305,0,-2329,0,-2353,0,-2377,0,-2401,0,-2425,0,-2449,0,-2473,0,-2497,0,-2521,0,-2545,0,-2569,0,-2593,0,-2617,0,-2640,0,-2664,0,-2688,0,-2712,0,-2735,0,-2759,0,-2783,0,-2806,0,-2830,0,-2853,0,-2877,0,-2900,0,-2924,0,-2947,0,-2971,0,-2994,0,-3018,0,-3041,0,-3064,0,-3088,0,-3111,0,-3134,0,-3157,0,-3180,0,-3204,0,-3227,0,-3250,0,-3273,0,-3296,0,-3319,0,-3342,0,-3365,0,-3388,0,-3410,0,-3433,0,-3456,0,-3479,0,-3502,0,-3524,0,-3547,0,-3570,0,-3592,0,-3615,0,-3637,0,-3660,0,-3682,0,-3705,0,-3727,0,-3749,0,-3772,0,-3794,0,-3816,0,-3839,0,-3861,0,-3883,0,-3905,0,-3927,0,-3949,0,-3971,0,-3993,0,-4015,0,-4037,0,-4059,0,-4080,0,-4102,0,-4124,0,-4146,0,-4167,0,-4189,0,-4211,0,-4232,0,-4254,0,-4275,0,-4296,0,-4318,0,-4339,0,-4360,0,-4382,0,-4403,0,-4424,0,-4445,0,-4466,0,-4487,0,-4508,0,-4529,0,-4550,0,-4571,0,-4592,0,-4613,0,-4633,0,-4654,0,-4675,0,-4695,0,-4716,0,-4736,0,-4757,0,-4777,0,-4798,0,-4818,0,-4838,0,-4859,0,-4879,0,-4899,0,-4919,0,-4939,0,-4959,0,-4979,0,-4999,0,-5019,0,-5039,0,-5059,0,-5078,0,-5098,0,-5118,0,-5137,0,-5157,0,-5176,0,-5196,0,-5215,0,-5235,0,-5254,0,-5273,0,-5292,0,-5311,0,-5331,0,-5350,0,-5369,0,-5388,0,-5406,0,-5425,0,-5444,0,-5463,0,-5482,0,-5500,0,-5519,0,-5537,0,-5556,0,-5574,0,-5593,0,-5611,0,-5629,0,-5648,0,-5666,0,-5684,0,-5702,0,-5720,0,-5738,0,-5756,0,-5774,0,-5791,0,-5809,0,-5827,0,-5844,0,-5862,0,-5880,0,-5897,0,-5914,0,-5932,0,-5949,0,-5966,0,-5984,0,-6001,0,-6018,0,-6035,0,-6052,0,-6069,0,-6085,0,-6102,0,-6119,0,-6136,0,-6152,0,-6169,0,-6185,0,-6202,0,-6218,0,-6235,0,-6251,0,-6267,0,-6283,0,-6299,0,-6315,0,-6331,0,-6347,0,-6363,0,-6379,0,-6395,0,-6410,0,-6426,0,-6441,0,-6457,0,-6472,0,-6488,0,-6503,0,-6518,0,-6533,0,-6549,0,-6564,0,-6579,0,-6594,0,-6608,0,-6623,0,-6638,0,-6653,0,-6667,0,-6682,0,-6696,0,-6711,0,-6725,0,-6739,0,-6754,0,-6768,0,-6782,0,-6796,0,-6810,0,-6824,0,-6838,0,-6852,0,-6865,0,-6879,0,-6893,0,-6906,0,-6920,0,-6933,0,-6946,0,-6960,0,-6973,0,-6986,0,-6999,0,-7012,0,-7025,0,-7038,0,-7051,0,-7064,0,-7076,0,-7089,0,-7101,0,-7114,0,-7126,0,-7139,0,-7151,0,-7163,0,-7175,0,-7187,0,-7199,0,-7211,0,-7223,0,-7235,0,-7247,0,-7259,0,-7270,0,-7282,0,-7293,0,-7305,0,-7316,0,-7327,0,-7338,0,-7349,0,-7361,0,-7372,0,-7382,0,-7393,0,-7404,0,-7415,0,-7425,0,-7436,0,-7446,0,-7457,0,-7467,0,-7478,0,-7488,0,-7498,0,-7508,0,-7518,0,-7528,0,-7538,0,-7548,0,-7557,0,-7567,0,-7577,0,-7586,0,-7596,0,-7605,0,-7614,0,-7623,0,-7633,0,-7642,0,-7651,0,-7660,0,-7668,0,-7677,0,-7686,0,-7695,0,-7703,0,-7712,0,-7720,0,-7728,0,-7737,0,-7745,0,-7753,0,-7761,0,-7769,0,-7777,0,-7785,0,-7793,0,-7800,0,-7808,0,-7816,0,-7823,0,-7830,0,-7838,0,-7845,0,-7852,0,-7859,0,-7866,0,-7873,0,-7880,0,-7887,0,-7894,0,-7900,0,-7907,0,-7914,0,-7920,0,-7926,0,-7933,0,-7939,0,-7945,0,-7951,0,-7957,0,-7963,0,-7969,0,-7975,0,-7980,0,-7986,0,-7991,0,-7997,0,-8002,0,-8008,0,-8013,0,-8018,0,-8023,0,-8028,0,-8033,0,-8038,0,-8043,0,-8047,0,-8052,0,-8057,0,-8061,0,-8066,0,-8070,0,-8074,0,-8078,0,-8082,0,-8086,0,-8090,0,-8094,0,-8098,0,-8102,0,-8105,0,-8109,0,-8113,0,-8116,0,-8119,0,-8123,0,-8126,0,-8129,0,-8132,0,-8135,0,-8138,0,-8141,0,-8143,0,-8146,0,-8149,0,-8151,0,-8153,0,-8156,0,-8158,0,-8160,0,-8162,0,-8164,0,-8166,0,-8168,0,-8170,0,-8172,0,-8174,0,-8175,0,-8177,0,-8178,0,-8179,0,-8181,0,-8182,0,-8183,0,-8184,0,-8185,0,-8186,0,-8187,0,-8187,0,-8188,0,-8189,0,-8189,0,-8190,0,-8190,0,-8190,0,-8190,0,-8190,0,-8191,0,-8190,0,-8190,0,-8190,0,-8190,0,-8190,0,-8189,0,-8189,0,-8188,0,-8187,0,-8187,0,-8186,0,-8185,0,-8184,0,-8183,0,-8182,0,-8181,0,-8179,0,-8178,0,-8177,0,-8175,0,-8174,0,-8172,0,-8170,0,-8168,0,-8166,0,-8164,0,-8162,0,-8160,0,-8158,0,-8156,0,-8153,0,-8151,0,-8149,0,-8146,0,-8143,0,-8141,0,-8138,0,-8135,0,-8132,0,-8129,0,-8126,0,-8123,0,-8119,0,-8116,0,-8113,0,-8109,0,-8105,0,-8102,0,-8098,0,-8094,0,-8090,0,-8086,0,-8082,0,-8078,0,-8074,0,-8070,0,-8066,0,-8061,0,-8057,0,-8052,0,-8047,0,-8043,0,-8038,0,-8033,0,-8028,0,-8023,0,-8018,0,-8013,0,-8008,0,-8002,0,-7997,0,-7991,0,-7986,0,-7980,0,-7975,0,-7969,0,-7963,0,-7957,0,-7951,0,-7945,0,-7939,0,-7933,0,-7926,0,-7920,0,-7914,0,-7907,0,-7900,0,-7894,0,-7887,0,-7880,0,-7873,0,-7866,0,-7859,0,-7852,0,-7845,0,-7838,0,-7830,0,-7823,0,-7816,0,-7808,0,-7800,0,-7793,0,-7785,0,-7777,0,-7769,0,-7761,0,-7753,0,-7745,0,-7737,0,-7728,0,-7720,0,-7712,0,-7703,0,-7695,0,-7686,0,-7677,0,-7668,0,-7660,0,-7651,0,-7642,0,-7633,0,-7623,0,-7614,0,-7605,0,-7596,0,-7586,0,-7577,0,-7567,0,-7557,0,-7548,0,-7538,0,-7528,0,-7518,0,-7508,0,-7498,0,-7488,0,-7478,0,-7467,0,-7457,0,-7446,0,-7436,0,-7425,0,-7415,0,-7404,0,-7393,0,-7382,0,-7372,0,-7361,0,-7349,0,-7338,0,-7327,0,-7316,0,-7305,0,-7293,0,-7282,0,-7270,0,-7259,0,-7247,0,-7235,0,-7223,0,-7211,0,-7199,0,-7187,0,-7175,0,-7163,0,-7151,0,-7139,0,-7126,0,-7114,0,-7101,0,-7089,0,-7076,0,-7064,0,-7051,0,-7038,0,-7025,0,-7012,0,-6999,0,-6986,0,-6973,0,-6960,0,-6946,0,-6933,0,-6920,0,-6906,0,-6893,0,-6879,0,-6865,0,-6852,0,-6838,0,-6824,0,-6810,0,-6796,0,-6782,0,-6768,0,-6754,0,-6739,0,-6725,0,-6711,0,-6696,0,-6682,0,-6667,0,-6653,0,-6638,0,-6623,0,-6608,0,-6594,0,-6579,0,-6564,0,-6549,0,-6533,0,-6518,0,-6503,0,-6488,0,-6472,0,-6457,0,-6441,0,-6426,0,-6410,0,-6395,0,-6379,0,-6363,0,-6347,0,-6331,0,-6315,0,-6299,0,-6283,0,-6267,0,-6251,0,-6235,0,-6218,0,-6202,0,-6185,0,-6169,0,-6152,0,-6136,0,-6119,0,-6102,0,-6085,0,-6069,0,-6052,0,-6035,0,-6018,0,-6001,0,-5984,0,-5966,0,-5949,0,-5932,0,-5914,0,-5897,0,-5880,0,-5862,0,-5844,0,-5827,0,-5809,0,-5791,0,-5774,0,-5756,0,-5738,0,-5720,0,-5702,0,-5684,0,-5666,0,-5648,0,-5629,0,-5611,0,-5593,0,-5574,0,-5556,0,-5537,0,-5519,0,-5500,0,-5482,0,-5463,0,-5444,0,-5425,0,-5406,0,-5388,0,-5369,0,-5350,0,-5331,0,-5311,0,-5292,0,-5273,0,-5254,0,-5235,0,-5215,0,-5196,0,-5176,0,-5157,0,-5137,0,-5118,0,-5098,0,-5078,0,-5059,0,-5039,0,-5019,0,-4999,0,-4979,0,-4959,0,-4939,0,-4919,0,-4899,0,-4879,0,-4859,0,-4838,0,-4818,0,-4798,0,-4777,0,-4757,0,-4736,0,-4716,0,-4695,0,-4675,0,-4654,0,-4633,0,-4613,0,-4592,0,-4571,0,-4550,0,-4529,0,-4508,0,-4487,0,-4466,0,-4445,0,-4424,0,-4403,0,-4382,0,-4360,0,-4339,0,-4318,0,-4296,0,-4275,0,-4254,0,-4232,0,-4211,0,-4189,0,-4167,0,-4146,0,-4124,0,-4102,0,-4080,0,-4059,0,-4037,0,-4015,0,-3993,0,-3971,0,-3949,0,-3927,0,-3905,0,-3883,0,-3861,0,-3839,0,-3816,0,-3794,0,-3772,0,-3749,0,-3727,0,-3705,0,-3682,0,-3660,0,-3637,0,-3615,0,-3592,0,-3570,0,-3547,0,-3524,0,-3502,0,-3479,0,-3456,0,-3433,0,-3410,0,-3388,0,-3365,0,-3342,0,-3319,0,-3296,0,-3273,0,-3250,0,-3227,0,-3204,0,-3180,0,-3157,0,-3134,0,-3111,0,-3088,0,-3064,0,-3041,0,-3018,0,-2994,0,-2971,0,-2947,0,-2924,0,-2900,0,-2877,0,-2853,0,-2830,0,-2806,0,-2783,0,-2759,0,-2735,0,-2712,0,-2688,0,-2664,0,-2640,0,-2617,0,-2593,0,-2569,0,-2545,0,-2521,0,-2497,0,-2473,0,-2449,0,-2425,0,-2401,0,-2377,0,-2353,0,-2329,0,-2305,0,-2281,0,-2257,0,-2233,0,-2208,0,-2184,0,-2160,0,-2136,0,-2111,0,-2087,0,-2063,0,-2038,0,-2014,0,-1990,0,-1965,0,-1941,0,-1917,0,-1892,0,-1868,0,-1843,0,-1819,0,-1794,0,-1770,0,-1745,0,-1721,0,-1696,0,-1671,0,-1647,0,-1622,0,-1597,0,-1573,0,-1548,0,-1523,0,-1499,0,-1474,0,-1449,0,-1425,0,-1400,0,-1375,0,-1350,0,-1326,0,-1301,0,-1276,0,-1251,0,-1226,0,-1201,0,-1177,0,-1152,0,-1127,0,-1102,0,-1077,0,-1052,0,-1027,0,-1002,0,-977,0,-952,0,-927,0,-902,0,-877,0,-852,0,-827,0,-802,0,-777,0,-752,0,-727,0,-702,0,-677,0,-652,0,-627,0,-602,0,-577,0,-552,0,-527,0,-502,0,-477,0,-452,0,-427,0,-401,0,-376,0,-351,0,-326,0,-301,0,-276,0,-251,0,-226,0,-201,0,-175,0,-150,0,-125,0,-100,0,-75,0,-50,0,-25,0,0,0,25,0,50,0,75,0,100,0,125,0,150,0,175,0,201,0,226,0,251,0,276,0,301,0,326,0,351,0,376,0,401,0,427,0,452,0,477,0,502,0,527,0,552,0,577,0,602,0,627,0,652,0,677,0,702,0,727,0,752,0,777,0,802,0,827,0,852,0,877,0,902,0,927,0,952,0,977,0,1002,0,1027,0,1052,0,1077,0,1102,0,1127,0,1152,0,1177,0,1201,0,1226,0,1251,0,1276,0,1301,0,1326,0,1350,0,1375,0,1400,0,1425,0,1449,0,1474,0,1499,0,1523,0,1548,0,1573,0,1597,0,1622,0,1647,0,1671,0,1696,0,1721,0,1745,0,1770,0,1794,0,1819,0,1843,0,1868,0,1892,0,1917,0,1941,0,1965,0,1990,0,2014,0,2038,0,2063,0,2087,0,2111,0,2136,0,2160,0,2184,0,2208,0,2233,0,2257,0,2281,0,2305,0,2329,0,2353,0,2377,0,2401,0,2425,0,2449,0,2473,0,2497,0,2521,0,2545,0,2569,0,2593,0,2617,0,2640,0,2664,0,2688,0,2712,0,2735,0,2759,0,2783,0,2806,0,2830,0,2853,0,2877,0,2900,0,2924,0,2947,0,2971,0,2994,0,3018,0,3041,0,3064,0,3088,0,3111,0,3134,0,3157,0,3180,0,3204,0,3227,0,3250,0,3273,0,3296,0,3319,0,3342,0,3365,0,3388,0,3410,0,3433,0,3456,0,3479,0,3502,0,3524,0,3547,0,3570,0,3592,0,3615,0,3637,0,3660,0,3682,0,3705,0,3727,0,3749,0,3772,0,3794,0,3816,0,3839,0,3861,0,3883,0,3905,0,3927,0,3949,0,3971,0,3993,0,4015,0,4037,0,4059,0,4080,0,4102,0,4124,0,4146,0,4167,0,4189,0,4211,0,4232,0,4254,0,4275,0,4296,0,4318,0,4339,0,4360,0,4382,0,4403,0,4424,0,4445,0,4466,0,4487,0,4508,0,4529,0,4550,0,4571,0,4592,0,4613,0,4633,0,4654,0,4675,0,4695,0,4716,0,4736,0,4757,0,4777,0,4798,0,4818,0,4838,0,4859,0,4879,0,4899,0,4919,0,4939,0,4959,0,4979,0,4999,0,5019,0,5039,0,5059,0,5078,0,5098,0,5118,0,5137,0,5157,0,5176,0,5196,0,5215,0,5235,0,5254,0,5273,0,5292,0,5311,0,5331,0,5350,0,5369,0,5388,0,5406,0,5425,0,5444,0,5463,0,5482,0,5500,0,5519,0,5537,0,5556,0,5574,0,5593,0,5611,0,5629,0,5648,0,5666,0,5684,0,5702,0,5720,0,5738,0,5756,0,5774,0,5791,0,5809,0,5827,0,5844,0,5862,0,5880,0,5897,0,5914,0,5932,0,5949,0,5966,0,5984,0,6001,0,6018,0,6035,0,6052,0,6069,0,6085,0,6102,0,6119,0,6136,0,6152,0,6169,0,6185,0,6202,0,6218,0,6235,0,6251,0,6267,0,6283,0,6299,0,6315,0,6331,0,6347,0,6363,0,6379,0,6395,0,6410,0,6426,0,6441,0,6457,0,6472,0,6488,0,6503,0,6518,0,6533,0,6549,0,6564,0,6579,0,6594,0,6608,0,6623,0,6638,0,6653,0,6667,0,6682,0,6696,0,6711,0,6725,0,6739,0,6754,0,6768,0,6782,0,6796,0,6810,0,6824,0,6838,0,6852,0,6865,0,6879,0,6893,0,6906,0,6920,0,6933,0,6946,0,6960,0,6973,0,6986,0,6999,0,7012,0,7025,0,7038,0,7051,0,7064,0,7076,0,7089,0,7101,0,7114,0,7126,0,7139,0,7151,0,7163,0,7175,0,7187,0,7199,0,7211,0,7223,0,7235,0,7247,0,7259,0,7270,0,7282,0,7293,0,7305,0,7316,0,7327,0,7338,0,7349,0,7361,0,7372,0,7382,0,7393,0,7404,0,7415,0,7425,0,7436,0,7446,0,7457,0,7467,0,7478,0,7488,0,7498,0,7508,0,7518,0,7528,0,7538,0,7548,0,7557,0,7567,0,7577,0,7586,0,7596,0,7605,0,7614,0,7623,0,7633,0,7642,0,7651,0,7660,0,7668,0,7677,0,7686,0,7695,0,7703,0,7712,0,7720,0,7728,0,7737,0,7745,0,7753,0,7761,0,7769,0,7777,0,7785,0,7793,0,7800,0,7808,0,7816,0,7823,0,7830,0,7838,0,7845,0,7852,0,7859,0,7866,0,7873,0,7880,0,7887,0,7894,0,7900,0,7907,0,7914,0,7920,0,7926,0,7933,0,7939,0,7945,0,7951,0,7957,0,7963,0,7969,0,7975,0,7980,0,7986,0,7991,0,7997,0,8002,0,8008,0,8013,0,8018,0,8023,0,8028,0,8033,0,8038,0,8043,0,8047,0,8052,0,8057,0,8061,0,8066,0,8070,0,8074,0,8078,0,8082,0,8086,0,8090,0,8094,0,8098,0,8102,0,8105,0,8109,0,8113,0,8116,0,8119,0,8123,0,8126,0,8129,0,8132,0,8135,0,8138,0,8141,0,8143,0,8146,0,8149,0,8151,0,8153,0,8156,0,8158,0,8160,0,8162,0,8164,0,8166,0,8168,0,8170,0,8172,0,8174,0,8175,0,8177,0,8178,0,8179,0,8181,0,8182,0,8183,0,8184,0,8185,0,8186,0,8187,0,8187,0,8188,0,8189,0,8189,0,8190,0,8190,0,8190,0,8190,0,8190,0,8191,0,8190,0,8190,0,8190,0,8190,0,8190,0,8189,0,8189,0,8188,0,8187,0,8187,0,8186,0,8185,0,8184,0,8183,0,8182,0,8181,0,8179,0,8178,0,8177,0,8175,0,8174,0,8172,0,8170,0,8168,0,8166,0,8164,0,8162,0,8160,0,8158,0,8156,0,8153,0,8151,0,8149,0,8146,0,8143,0,8141,0,8138,0,8135,0,8132,0,8129,0,8126,0,8123,0,8119,0,8116,0,8113,0,8109,0,8105,0,8102,0,8098,0,8094,0,8090,0,8086,0,8082,0,8078,0,8074,0,8070,0,8066,0,8061,0,8057,0,8052,0,8047,0,8043,0,8038,0,8033,0,8028,0,8023,0,8018,0,8013,0,8008,0,8002,0,7997,0,7991,0,7986,0,7980,0,7975,0,7969,0,7963,0,7957,0,7951,0,7945,0,7939,0,7933,0,7926,0,7920,0,7914,0,7907,0,7900,0,7894,0,7887,0,7880,0,7873,0,7866,0,7859,0,7852,0,7845,0,7838,0,7830,0,7823,0,7816,0,7808,0,7800,0,7793,0,7785,0,7777,0,7769,0,7761,0,7753,0,7745,0,7737,0,7728,0,7720,0,7712,0,7703,0,7695,0,7686,0,7677,0,7668,0,7660,0,7651,0,7642,0,7633,0,7623,0,7614,0,7605,0,7596,0,7586,0,7577,0,7567,0,7557,0,7548,0,7538,0,7528,0,7518,0,7508,0,7498,0,7488,0,7478,0,7467,0,7457,0,7446,0,7436,0,7425,0,7415,0,7404,0,7393,0,7382,0,7372,0,7361,0,7349,0,7338,0,7327,0,7316,0,7305,0,7293,0,7282,0,7270,0,7259,0,7247,0,7235,0,7223,0,7211,0,7199,0,7187,0,7175,0,7163,0,7151,0,7139,0,7126,0,7114,0,7101,0,7089,0,7076,0,7064,0,7051,0,7038,0,7025,0,7012,0,6999,0,6986,0,6973,0,6960,0,6946,0,6933,0,6920,0,6906,0,6893,0,6879,0,6865,0,6852,0,6838,0,6824,0,6810,0,6796,0,6782,0,6768,0,6754,0,6739,0,6725,0,6711,0,6696,0,6682,0,6667,0,6653,0,6638,0,6623,0,6608,0,6594,0,6579,0,6564,0,6549,0,6533,0,6518,0,6503,0,6488,0,6472,0,6457,0,6441,0,6426,0,6410,0,6395,0,6379,0,6363,0,6347,0,6331,0,6315,0,6299,0,6283,0,6267,0,6251,0,6235,0,6218,0,6202,0,6185,0,6169,0,6152,0,6136,0,6119,0,6102,0,6085,0,6069,0,6052,0,6035,0,6018,0,6001,0,5984,0,5966,0,5949,0,5932,0,5914,0,5897,0,5880,0,5862,0,5844,0,5827,0,5809,0,5791,0,5774,0,5756,0,5738,0,5720,0,5702,0,5684,0,5666,0,5648,0,5629,0,5611,0,5593,0,5574,0,5556,0,5537,0,5519,0,5500,0,5482,0,5463,0,5444,0,5425,0,5406,0,5388,0,5369,0,5350,0,5331,0,5311,0,5292,0,5273,0,5254,0,5235,0,5215,0,5196,0,5176,0,5157,0,5137,0,5118,0,5098,0,5078,0,5059,0,5039,0,5019,0,4999,0,4979,0,4959,0,4939,0,4919,0,4899,0,4879,0,4859,0,4838,0,4818,0,4798,0,4777,0,4757,0,4736,0,4716,0,4695,0,4675,0,4654,0,4633,0,4613,0,4592,0,4571,0,4550,0,4529,0,4508,0,4487,0,4466,0,4445,0,4424,0,4403,0,4382,0,4360,0,4339,0,4318,0,4296,0,4275,0,4254,0,4232,0,4211,0,4189,0,4167,0,4146,0,4124,0,4102,0,4080,0,4059,0,4037,0,4015,0,3993,0,3971,0,3949,0,3927,0,3905,0,3883,0,3861,0,3839,0,3816,0,3794,0,3772,0,3749,0,3727,0,3705,0,3682,0,3660,0,3637,0,3615,0,3592,0,3570,0,3547,0,3524,0,3502,0,3479,0,3456,0,3433,0,3410,0,3388,0,3365,0,3342,0,3319,0,3296,0,3273,0,3250,0,3227,0,3204,0,3180,0,3157,0,3134,0,3111,0,3088,0,3064,0,3041,0,3018,0,2994,0,2971,0,2947,0,2924,0,2900,0,2877,0,2853,0,2830,0,2806,0,2783,0,2759,0,2735,0,2712,0,2688,0,2664,0,2640,0,2617,0,2593,0,2569,0,2545,0,2521,0,2497,0,2473,0,2449,0,2425,0,2401,0,2377,0,2353,0,2329,0,2305,0,2281,0,2257,0,2233,0,2208,0,2184,0,2160,0,2136,0,2111,0,2087,0,2063,0,2038,0,2014,0,1990,0,1965,0,1941,0,1917,0,1892,0,1868,0,1843,0,1819,0,1794,0,1770,0,1745,0,1721,0,1696,0,1671,0,1647,0,1622,0,1597,0,1573,0,1548,0,1523,0,1499,0,1474,0,1449,0,1425,0,1400,0,1375,0,1350,0,1326,0,1301,0,1276,0,1251,0,1226,0,1201,0,1177,0,1152,0,1127,0,1102,0,1077,0,1052,0,1027,0,1002,0,977,0,952,0,927,0,902,0,877,0,852,0,827,0,802,0,777,0,752,0,727,0,702,0,677,0,652,0,627,0,602,0,577,0,552,0,527,0,502,0,477,0,452,0,427,0,401,0,376,0,351,0,326,0,301,0,276,0,251,0,226,0,201,0,175,0,150,0,125,0,100,0,75,0,50,0,25,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);_wvoice=allocate(1,"%struct.voice_t*",ALLOC_STATIC);_f_log=allocate(1,"%struct.__sFILE*",ALLOC_STATIC);_option_waveout=allocate(1,"i32",ALLOC_STATIC);_option_log_frames=allocate(1,"i32",ALLOC_STATIC);_embedded_value=allocate(60,"i32",ALLOC_STATIC);_samplerate=allocate(1,"i32",ALLOC_STATIC);_samplerate_native=allocate(1,"i32",ALLOC_STATIC);__ZL5peaks=allocate(720,["i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0],ALLOC_STATIC);_echo_head=allocate(1,"i32",ALLOC_STATIC);_echo_tail=allocate(1,"i32",ALLOC_STATIC);_echo_amp=allocate(1,"i32",ALLOC_STATIC);_echo_buf=allocate(11000,"i16",ALLOC_STATIC);__ZL7rbreath=allocate(360,"double",ALLOC_STATIC);_wdata=allocate(64,["i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0],ALLOC_STATIC);__ZL13amplitude_env=allocate(1,"i8*",ALLOC_STATIC);_out_ptr=allocate(1,"i8*",ALLOC_STATIC);_out_start=allocate(1,"i8*",ALLOC_STATIC);_out_end=allocate(1,"i8*",ALLOC_STATIC);_outbuf_size=allocate(1,"i32",ALLOC_STATIC);_wcmdq=allocate(2560,"i32",ALLOC_STATIC);_wcmdq_head=allocate(1,"i32",ALLOC_STATIC);_wcmdq_tail=allocate(1,"i32",ALLOC_STATIC);_embedded_default=allocate([0,0,0,0,50,0,0,0,175,0,0,0,100,0,0,0,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],["i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0],ALLOC_STATIC);_current_source_index=allocate(1,"i32",ALLOC_STATIC);__ZL18sonicSpeedupStream=allocate(1,"%struct.sonicStreamStruct*",ALLOC_STATIC);_sonicSpeed=allocate([1],["double",0,0,0,0,0,0,0,0],ALLOC_STATIC);_pitch_adjust_tab=allocate([64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,86,87,88,89,91,92,93,94,96,97,98,100,101,103,104,105,107,108,110,111,113,115,116,118,119,121,123,124,126,128,130,132,133,135,137,139,141,143,145,147,149,151,153,155,158,160,162,164,167,169,171,174,176,179,181,184,186,189,191,194,197,199,202,205,208,211,214,217,220,223,226,229,232,236,239,242,246,249,252,254,255],"i8",ALLOC_STATIC);_pk_shape1=allocate([255,254,254,254,254,254,253,253,252,251,251,250,249,248,247,246,245,244,242,241,239,238,236,234,233,231,229,227,225,223,220,218,216,213,211,209,207,205,203,201,199,197,195,193,191,189,187,185,183,180,178,176,173,171,169,166,164,161,159,156,154,151,148,146,143,140,138,135,132,129,126,123,120,118,115,112,108,105,102,99,96,95,93,91,90,88,86,85,83,82,80,79,77,76,74,73,72,70,69,68,67,66,64,63,62,61,60,59,58,57,56,55,55,54,53,52,52,51,50,50,49,48,48,47,47,46,46,46,45,45,45,44,44,44,44,44,44,44,43,43,43,43,44,43,42,42,41,40,40,39,38,38,37,36,36,35,35,34,33,33,32,32,31,30,30,29,29,28,28,27,26,26,25,25,24,24,23,23,22,22,21,21,20,20,19,19,18,18,18,17,17,16,16,15,15,15,14,14,13,13,13,12,12,11,11,11,10,10,10,9,9,9,8,8,8,7,7,7,7,6,6,6,5,5,5,5,4,4,4,4,4,3,3,3,3,2,2,2,2,2,2,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0],"i8",ALLOC_STATIC);__ZL16PHASE_INC_FACTOR=allocate(1,"i32",ALLOC_STATIC);__ZL11Flutter_inc=allocate(1,"i32",ALLOC_STATIC);__ZL11samplecount=allocate(1,"i32",ALLOC_STATIC);__ZL8nsamples=allocate(1,"i32",ALLOC_STATIC);__ZL9wavephase=allocate(1,"i32",ALLOC_STATIC);__ZL12wavemult_max=allocate(1,"i32",ALLOC_STATIC);__ZL15wavemult_offset=allocate(1,"i32",ALLOC_STATIC);__ZL8wavemult=allocate([0,0,0,2,3,5,8,11,14,18,22,27,32,37,43,49,55,62,69,76,83,90,98,105,113,121,128,136,144,152,159,166,174,181,188,194,201,207,213,218,224,228,233,237,240,244,246,249,251,252,253,253,253,253,252,251,249,246,244,240,237,233,228,224,218,213,207,201,194,188,181,174,166,159,152,144,136,128,121,113,105,98,90,83,76,69,62,55,49,43,37,32,27,22,18,14,11,8,5,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"i8",ALLOC_STATIC);__ZL9pk_shape2=allocate([255,254,254,254,254,254,254,254,254,254,253,253,253,253,252,252,252,251,251,251,250,250,249,249,248,248,247,247,246,245,245,244,243,243,242,241,239,237,235,233,231,229,227,225,223,221,218,216,213,211,208,205,203,200,197,194,191,187,184,181,178,174,171,167,163,160,156,152,148,144,140,136,132,127,123,119,114,110,105,100,96,94,91,88,86,83,81,78,76,74,71,69,66,64,62,60,57,55,53,51,49,47,44,42,40,38,36,34,32,30,29,27,25,23,21,19,18,16,14,12,11,9,7,6,4,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"i8",ALLOC_STATIC);__ZL8pk_shape=allocate(1,"i8*",ALLOC_STATIC);__ZZ12GetAmplitudevE12amp_emphasis=allocate([16,16,10,16,22],"i8",ALLOC_STATIC);__ZL17general_amplitude=allocate([60],["i32",0,0,0,0],ALLOC_STATIC);__ZL11peak_height=allocate(36,"i32",ALLOC_STATIC);__ZL13peak_harmonic=allocate(36,"i32",ALLOC_STATIC);__ZL16option_harmonic1_b=allocate(1,"i1",ALLOC_STATIC);__ZL9harmspect=allocate(1,"i32*",ALLOC_STATIC);__ZL8harm_inc=allocate(120,"i32",ALLOC_STATIC);__ZL10minus_pi_t=allocate(1,"double",ALLOC_STATIC);__ZL8two_pi_t=allocate(1,"double",ALLOC_STATIC);__ZZ7WavegenvE4maxh=allocate(1,"i32",ALLOC_STATIC);__ZZ7WavegenvE5maxh2=allocate(1,"i32",ALLOC_STATIC);__ZZ7WavegenvE3agc=allocate([256],["i32",0,0,0,0],ALLOC_STATIC);__ZZ7WavegenvE13h_switch_sign=allocate(1,"i32",ALLOC_STATIC);__ZZ7WavegenvE11cycle_count=allocate(1,"i32",ALLOC_STATIC);__ZZ7WavegenvE10amplitude2=allocate(1,"i32",ALLOC_STATIC);__ZL8end_wave_b=allocate(1,"i1",ALLOC_STATIC);__ZL7hswitch=allocate(1,"i32",ALLOC_STATIC);__ZL6hspect=allocate(3200,"i32",ALLOC_STATIC);__ZL8phaseinc=allocate(1,"i32",ALLOC_STATIC);__ZL13cycle_samples=allocate(1,"i32",ALLOC_STATIC);__ZL9hf_factor=allocate(1,"i32",ALLOC_STATIC);__ZL6cbytes=allocate(1,"i32",ALLOC_STATIC);__ZL12glottal_flag=allocate(1,"i32",ALLOC_STATIC);__ZL14glottal_reduce=allocate(1,"i32",ALLOC_STATIC);__ZL6amp_ix=allocate(1,"i32",ALLOC_STATIC);__ZL15modulation_type=allocate(1,"i32",ALLOC_STATIC);__ZL14modulation_tab=allocate([0,0,0,0,0,70,242,41,0,47,0,47,0,69,242,41,0,47,0,46,0,69,242,40,0,46,0,45,0,52,242,40,0,45,45,44,0,52,242,40,0,43,43,43,0,52,242,40,0,42,42,42,0,52,242,40,0,41,41,41,0,52,242,40],"i8",ALLOC_STATIC);__ZL7voicing=allocate(1,"i32",ALLOC_STATIC);__ZL12embedded_max=allocate([0,0,0,0,32767,0,0,0,750,0,0,0,300,0,0,0,99,0,0,0,99,0,0,0,99,0,0,0,0,0,0,0,750,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0],["i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0],ALLOC_STATIC);__ZZ15WavegenSetVoiceP7voice_tE2v2=allocate(1344,["i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8"],ALLOC_STATIC);__ZL13consonant_amp=allocate([26],["i32",0,0,0,0],ALLOC_STATIC);__ZL11flutter_amp=allocate([64],["i32",0,0,0,0],ALLOC_STATIC);__ZZ8SetSynthiiP7frame_tS0_P7voice_tE19glottal_reduce_tab1=allocate([48,0,0,0,48,0,0,0,64,0,0,0,80,0,0,0],["i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0],ALLOC_STATIC);__ZZ8SetSynthiiP7frame_tS0_P7voice_tE19glottal_reduce_tab2=allocate([144,0,0,0,160,0,0,0,176,0,0,0,192,0,0,0],["i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0],ALLOC_STATIC);__ZL17samplecount_start=allocate(1,"i32",ALLOC_STATIC);__ZZ12WavegenFill2iE6resume=allocate(1,"i32",ALLOC_STATIC);__ZZ12WavegenFill2iE13echo_complete=allocate(1,"i32",ALLOC_STATIC);__ZL11echo_length=allocate(1,"i32",ALLOC_STATIC);__ZL7amp_inc=allocate(1,"i32",ALLOC_STATIC);__ZZL8PlayWaveiiPhiiE9n_samples=allocate(1,"i32",ALLOC_STATIC);__ZZL8PlayWaveiiPhiiE2ix=allocate(1,"i32",ALLOC_STATIC);__ZZL11PlaySilenceiiE9n_samples=allocate(1,"i32",ALLOC_STATIC);__ZZL17AdvanceParametersvE10Flutter_ix=allocate(1,"i32",ALLOC_STATIC);__ZL11Flutter_tab=allocate([128,155,181,203,220,232,237,236,230,220,206,191,176,163,152,144,140,139,140,143,146,148,149,146,140,131,120,105,89,73,60,49,42,41,45,54,68,86,105,125,143,159,170,177,178,173,164,150,135,120,105,92,83,79,79,85,94,107,122,136,150,162,171,176,177,174,168,160,152,145,139,136,137,141,148,157,168,178,187,192,193,189,180,165,146,124,99,74,50,30,14,5,2,5,15,30,48,68,89,109,127,140,150,156,159,159,157,155,153,153,156,161,169,179,191,202,213,220,224,222,216,204,187,166,143,119,96,75,58,46,40,41,47,58,72,89,106,122,134,144,148,149,145,137,128,117,107,98,92,90,92,97,105,116,128,138,148,154,158,157,152,144,134,124,113,104,98,96,99,107,120,136,155,175,194,210,223,230,231,226,215,198,178,156,132,111,91,75,64,57,55,56,61,67,74,80,84,86,85,82,77,72,66,63,62,65,73,86,103,124,147,171,195,217,234,246,252,251,244,231,213,192,170,148,128,113,100,93,90,92,97,104,112,119,125,127,127,123,116,107,97,87,78,72,70,72,78,89,102,117,132,147,159,167,171,170,164,153,139,123,106,91,78,70,67,69,77,90,107,127,146,166,184,197,207,211,210,205,196,185,173,161,150,142,137,135,135,138,141,145,146,145,140,132,120,104,85,65,46,28,14,5,1,5,15,31,52,77,104,129,154,176,193,205,211,211,208,200,191,181,171,164,159,156,157,160,165,170,174,177,176,171,163,150,135,118,99,81,66,54,47,45,49,58,72,89,107,126,142,156,166,170,169,163,152,138,123,108,93,82,74,72,74,80,90,103,117,130],"i8",ALLOC_STATIC);_pause_phonemes=allocate([0,23,10,9,24,19,24,24],"i8",ALLOC_STATIC);__ZZ15MakePhonemeListP10TranslatoriiE12types_double=allocate([6,7,8,3,0],"i8",ALLOC_STATIC);__ZL8kt_frame=allocate(288,"i32",ALLOC_STATIC);__ZL10kt_globals=allocate(2748,["i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"i32",0,0,0,"double",0,0,0,0,0,0,0,"i16*",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0],ALLOC_STATIC);__ZL5peaks801=allocate(720,["i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0],ALLOC_STATIC);__ZL12sample_count=allocate(1,"i32",ALLOC_STATIC);__ZL8nsamples802=allocate(1,"i32",ALLOC_STATIC);__ZL6klattp=allocate(40,"i32",ALLOC_STATIC);__ZL10klattp_inc=allocate(80,"double",ALLOC_STATIC);__ZL7klattp1=allocate(80,"double",ALLOC_STATIC);__ZL8end_wave803=allocate(1,"i32",ALLOC_STATIC);__ZZ14SetSynth_KlattiiP7frame_tS0_P7voice_tiE7prev_fr=allocate(64,["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8","i8"],ALLOC_STATIC);__ZL13scale_wav_tab=allocate([45,0,0,0,38,0,0,0,45,0,0,0,45,0,0,0],["i32",0,0,0,"i32",0,0,0,"i32",0,0,0,"i32",0,0,0],ALLOC_STATIC);__ZZ9KlattInitvE15natural_samples=allocate([-310,0,-400,0,530,0,356,0,224,0,89,0,23,0,-10,0,-58,0,-16,0,461,0,599,0,536,0,701,0,770,0,605,0,497,0,461,0,560,0,404,0,110,0,224,0,131,0,104,0,-97,0,155,0,278,0,-154,0,-1165,0,-598,0,737,0,125,0,-592,0,41,0,11,0,-247,0,-10,0,65,0,92,0,80,0,-304,0,71,0,167,0,-1,0,122,0,233,0,161,0,-43,0,278,0,479,0,485,0,407,0,266,0,650,0,134,0,80,0,236,0,68,0,260,0,269,0,179,0,53,0,140,0,275,0,293,0,296,0,104,0,257,0,152,0,311,0,182,0,263,0,245,0,125,0,314,0,140,0,44,0,203,0,230,0,-235,0,-286,0,23,0,107,0,92,0,-91,0,38,0,464,0,443,0,176,0,98,0,-784,0,-2449,0,-1891,0,-1045,0,-1600,0,-1462,0,-1384,0,-1261,0,-949,0,-730,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ9KlattInitvE10formant_hz=allocate([280,0,688,0,1064,0,2806,0,3260,0,3700,0,6500,0,7000,0,8000,0,280,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ9KlattInitvE9bandwidth=allocate([89,0,160,0,70,0,160,0,200,0,200,0,500,0,500,0,500,0,89,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ9KlattInitvE12parallel_amp=allocate([0,0,59,0,59,0,59,0,59,0,59,0,59,0,0,0,0,0,0,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZ9KlattInitvE11parallel_bw=allocate([59,0,59,0,89,0,149,0,200,0,200,0,500,0,0,0,0,0,0,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZL7parwaveP13klatt_frame_tE5noise=allocate(1,"double",ALLOC_STATIC);__ZZL7parwaveP13klatt_frame_tE5voice=allocate(1,"double",ALLOC_STATIC);__ZZL7parwaveP13klatt_frame_tE5vlast=allocate(1,"double",ALLOC_STATIC);__ZZL7parwaveP13klatt_frame_tE8glotlast=allocate(1,"double",ALLOC_STATIC);__ZZL7parwaveP13klatt_frame_tE5sourc=allocate(1,"double",ALLOC_STATIC);__ZZL21pitch_synch_par_resetP13klatt_frame_tE4skew=allocate(1,"i32",ALLOC_STATIC);__ZZL21pitch_synch_par_resetP13klatt_frame_tE2B0=allocate([1200,0,1142,0,1088,0,1038,0,991,0,948,0,907,0,869,0,833,0,799,0,768,0,738,0,710,0,683,0,658,0,634,0,612,0,590,0,570,0,551,0,533,0,515,0,499,0,483,0,468,0,454,0,440,0,427,0,415,0,403,0,391,0,380,0,370,0,360,0,350,0,341,0,332,0,323,0,315,0,307,0,300,0,292,0,285,0,278,0,272,0,265,0,259,0,253,0,247,0,242,0,237,0,231,0,226,0,221,0,217,0,212,0,208,0,204,0,199,0,195,0,192,0,188,0,184,0,180,0,177,0,174,0,170,0,167,0,164,0,161,0,158,0,155,0,153,0,150,0,147,0,145,0,142,0,140,0,137,0,135,0,133,0,131,0,128,0,126,0,124,0,122,0,120,0,119,0,117,0,115,0,113,0,111,0,110,0,108,0,106,0,105,0,103,0,102,0,100,0,99,0,97,0,96,0,95,0,93,0,92,0,91,0,90,0,88,0,87,0,86,0,85,0,84,0,83,0,82,0,80,0,79,0,78,0,77,0,76,0,75,0,75,0,74,0,73,0,72,0,71,0,70,0,69,0,68,0,68,0,67,0,66,0,65,0,64,0,64,0,63,0,62,0,61,0,61,0,60,0,59,0,59,0,58,0,57,0,57,0,56,0,56,0,55,0,55,0,54,0,54,0,53,0,53,0,52,0,52,0,51,0,51,0,50,0,50,0,49,0,49,0,48,0,48,0,47,0,47,0,46,0,46,0,45,0,45,0,44,0,44,0,43,0,43,0,42,0,42,0,41,0,41,0,41,0,41,0,40,0,40,0,39,0,39,0,38,0,38,0,38,0,38,0,37,0,37,0,36,0,36,0,36,0,36,0,35,0,35,0,35,0,35,0,34,0,34,0,33,0,33,0,33,0,33,0,32,0,32,0,32,0,32,0,31,0,31,0,31,0,31,0,30,0,30,0,30,0,30,0,29,0,29,0,29,0,29,0,28,0,28,0,28,0,28,0,27,0,27,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZL7DBtoLINlE8amptable=allocate([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,7,0,8,0,9,0,10,0,11,0,13,0,14,0,16,0,18,0,20,0,22,0,25,0,28,0,32,0,35,0,40,0,45,0,51,0,57,0,64,0,71,0,80,0,90,0,101,0,114,0,128,0,142,0,159,0,179,0,202,0,227,0,256,0,284,0,318,0,359,0,405,0,455,0,512,0,568,0,638,0,719,0,881,0,911,0,1024,0,1137,0,1276,0,1438,0,1622,0,1823,0,2048,0,2273,0,2552,0,2875,0,3244,0,3645,0,4096,0,4547,0,5104,0,5751,0,6488,0,7291,0,8192,0,9093,0,10207,0,11502,0,12976,0,14582,0,16384,0,18350,0,20644,0,23429,0,26214,0,29491,0,32767,0],["i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0,"i16",0],ALLOC_STATIC);__ZZL14natural_sourcevE5vwave=allocate(1,"double",ALLOC_STATIC);__ZZL16impulsive_sourcevE7doublet=allocate([0,0,0,0,0,0,0,0,13000000,0,0,0,0,0,0,0,-13000000,0,0,0,0,0,0,0],["double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0],ALLOC_STATIC);__ZZL16impulsive_sourcevE5vwave=allocate(1,"double",ALLOC_STATIC);__ZZL9gen_noisedE5nlast=allocate(1,"double",ALLOC_STATIC);__ZZL7flutterP13klatt_frame_tE10time_count=allocate(1,"i32",ALLOC_STATIC);__ZZL10frame_initP13klatt_frame_tE14amp_par_factor=allocate([0.6,0,0,0,0,0,0,0,0.4,0,0,0,0,0,0,0,0.15,0,0,0,0,0,0,0,0.06,0,0,0,0,0,0,0,0.04,0,0,0,0,0,0,0,0.022,0,0,0,0,0,0,0,0.03,0,0,0,0,0,0,0],["double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0,"double",0,0,0,0,0,0,0],ALLOC_STATIC);__str810=allocate([47,116,109,112,47,115,111,110,105,99,46,108,111,103,0],"i8",ALLOC_STATIC);__str1811=allocate([97,0],"i8",ALLOC_STATIC);_optarg=allocate(1,"i8*",ALLOC_STATIC);_optind=allocate(1,"i32",ALLOC_STATIC);_opterr=allocate([1],["i32",0,0,0,0],ALLOC_STATIC);_optopt=allocate([63],["i32",0,0,0,0],ALLOC_STATIC);__ZL8optwhere=allocate(1,"i32",ALLOC_STATIC);__str831=allocate([45,45,0],"i8",ALLOC_STATIC);__str1832=allocate([80,79,83,73,88,76,89,95,67,79,82,82,69,67,84,0],"i8",ALLOC_STATIC);__str2833=allocate([37,115,58,32,111,112,116,105,111,110,32,96,37,115,39,32,105,115,32,97,109,98,105,103,117,111,117,115,32,40,99,111,117,108,100,32,98,101,32,96,45,45,37,115,39,32,111,114,32,96,45,45,37,115,39,41,10,0],"i8",ALLOC_STATIC);__str3834=allocate([37,115,58,32,105,110,118,97,108,105,100,32,111,112,116,105,111,110,32,45,45,32,96,45,37,99,39,10,0],"i8",ALLOC_STATIC);__str4835=allocate([37,115,58,32,97,114,103,117,109,101,110,116,32,114,101,113,117,105,114,101,100,32,102,111,114,32,111,112,116,105,111,110,32,96,0],"i8",ALLOC_STATIC);__str5836=allocate([45,45,37,115,39,10,0],"i8",ALLOC_STATIC);__str6837=allocate([45,37,99,39,10,0],"i8",ALLOC_STATIC);HEAP32[((__ZZ4mainE12long_options)>>2)]=((__str6)&4294967295);HEAP32[((__ZZ4mainE12long_options+16)>>2)]=((__str7)&4294967295);HEAP32[((__ZZ4mainE12long_options+32)>>2)]=((__str8)&4294967295);HEAP32[((__ZZ4mainE12long_options+48)>>2)]=((__str9)&4294967295);HEAP32[((__ZZ4mainE12long_options+64)>>2)]=((__str10)&4294967295);HEAP32[((__ZZ4mainE12long_options+80)>>2)]=((__str11)&4294967295);HEAP32[((__ZZ4mainE12long_options+96)>>2)]=((__str12)&4294967295);HEAP32[((__ZZ4mainE12long_options+112)>>2)]=((__str13)&4294967295);HEAP32[((__ZZ4mainE12long_options+128)>>2)]=((__str14)&4294967295);HEAP32[((__ZZ4mainE12long_options+144)>>2)]=((__str15)&4294967295);HEAP32[((__ZZ4mainE12long_options+160)>>2)]=((__str16)&4294967295);HEAP32[((__ZZ4mainE12long_options+176)>>2)]=((__str17)&4294967295);HEAP32[((_mnem_rules)>>2)]=((__str42)&4294967295);HEAP32[((_mnem_rules+8)>>2)]=((__str143)&4294967295);HEAP32[((_mnem_rules+16)>>2)]=((__str244)&4294967295);HEAP32[((_mnem_rules+24)>>2)]=((__str345)&4294967295);HEAP32[((_mnem_rules+32)>>2)]=((__str446)&4294967295);HEAP32[((_mnem_rules+40)>>2)]=((__str547)&4294967295);HEAP32[((_mnem_rules+48)>>2)]=((__str648)&4294967295);HEAP32[((_mnem_flags)>>2)]=((__str749)&4294967295);HEAP32[((_mnem_flags+8)>>2)]=((__str850)&4294967295);HEAP32[((_mnem_flags+16)>>2)]=((__str951)&4294967295);HEAP32[((_mnem_flags+24)>>2)]=((__str1052)&4294967295);HEAP32[((_mnem_flags+32)>>2)]=((__str1153)&4294967295);HEAP32[((_mnem_flags+40)>>2)]=((__str1254)&4294967295);HEAP32[((_mnem_flags+48)>>2)]=((__str1355)&4294967295);HEAP32[((_mnem_flags+56)>>2)]=((__str1456)&4294967295);HEAP32[((_mnem_flags+64)>>2)]=((__str1557)&4294967295);HEAP32[((_mnem_flags+72)>>2)]=((__str1658)&4294967295);HEAP32[((_mnem_flags+80)>>2)]=((__str1759)&4294967295);HEAP32[((_mnem_flags+88)>>2)]=((__str1860)&4294967295);HEAP32[((_mnem_flags+96)>>2)]=((__str1961)&4294967295);HEAP32[((_mnem_flags+104)>>2)]=((__str2062)&4294967295);HEAP32[((_mnem_flags+112)>>2)]=((__str2163)&4294967295);HEAP32[((_mnem_flags+120)>>2)]=((__str2264)&4294967295);HEAP32[((_mnem_flags+128)>>2)]=((__str2365)&4294967295);HEAP32[((_mnem_flags+136)>>2)]=((__str2466)&4294967295);HEAP32[((_mnem_flags+144)>>2)]=((__str2567)&4294967295);HEAP32[((_mnem_flags+152)>>2)]=((__str2668)&4294967295);HEAP32[((_mnem_flags+160)>>2)]=((__str2769)&4294967295);HEAP32[((_mnem_flags+168)>>2)]=((__str2870)&4294967295);HEAP32[((_mnem_flags+176)>>2)]=((__str2971)&4294967295);HEAP32[((_mnem_flags+184)>>2)]=((__str3072)&4294967295);HEAP32[((_mnem_flags+192)>>2)]=((__str3173)&4294967295);HEAP32[((_mnem_flags+200)>>2)]=((__str3274)&4294967295);HEAP32[((_mnem_flags+208)>>2)]=((__str3375)&4294967295);HEAP32[((_mnem_flags+216)>>2)]=((__str3476)&4294967295);HEAP32[((_mnem_flags+224)>>2)]=((__str3577)&4294967295);HEAP32[((_mnem_flags+232)>>2)]=((__str3678)&4294967295);HEAP32[((_mnem_flags+240)>>2)]=((__str3779)&4294967295);HEAP32[((_mnem_flags+248)>>2)]=((__str3880)&4294967295);HEAP32[((_mnem_flags+256)>>2)]=((__str3981)&4294967295);HEAP32[((_mnem_flags+264)>>2)]=((__str4082)&4294967295);HEAP32[((_mnem_flags+272)>>2)]=((__str4183)&4294967295);HEAP32[((_mnem_flags+280)>>2)]=((__str4284)&4294967295);HEAP32[((_mnem_flags+288)>>2)]=((__str43)&4294967295);HEAP32[((_mnem_flags+296)>>2)]=((__str44)&4294967295);HEAP32[((_mnem_flags+304)>>2)]=((__str45)&4294967295);HEAP32[((_mnem_flags+312)>>2)]=((__str46)&4294967295);HEAP32[((_mnem_flags+320)>>2)]=((__str47)&4294967295);HEAP32[((_mnem_flags+328)>>2)]=((__str48)&4294967295);HEAP32[((_mnem_flags+336)>>2)]=((__str49)&4294967295);HEAP32[((_mnem_flags+344)>>2)]=((__str50)&4294967295);HEAP32[((_mnem_flags+352)>>2)]=((__str51)&4294967295);HEAP32[((_mnem_flags+360)>>2)]=((__str52)&4294967295);HEAP32[((_mnem_flags+368)>>2)]=((__str53)&4294967295);HEAP32[((_mnem_flags+376)>>2)]=((__str54)&4294967295);HEAP32[((_mnem_flags+384)>>2)]=((__str55)&4294967295);HEAP32[((_mnem_flags+392)>>2)]=((__str56)&4294967295);HEAP32[((_mnem_flags+400)>>2)]=((__str57)&4294967295);HEAP32[((__ZZL16copy_rule_stringPcRiE6outbuf)>>2)]=((__ZL9rule_cond)&4294967295);HEAP32[((__ZZL16copy_rule_stringPcRiE6outbuf+4)>>2)]=((__ZL8rule_pre)&4294967295);HEAP32[((__ZZL16copy_rule_stringPcRiE6outbuf+8)>>2)]=((__ZL10rule_match)&4294967295);HEAP32[((__ZZL16copy_rule_stringPcRiE6outbuf+12)>>2)]=((__ZL9rule_post)&4294967295);HEAP32[((__ZZL16copy_rule_stringPcRiE6outbuf+16)>>2)]=((__ZL13rule_phonemes)&4294967295);HEAP32[((__ZZ12RemoveEndingP10TranslatorPciS1_E16add_e_exceptions)>>2)]=((__str17133)&4294967295);HEAP32[((__ZZ12RemoveEndingP10TranslatorPciS1_E15add_e_additions)>>2)]=((__str18134)&4294967295);HEAP32[((__ZZ12RemoveEndingP10TranslatorPciS1_E15add_e_additions+4)>>2)]=((__str19135)&4294967295);HEAP32[((__ZZ12RemoveEndingP10TranslatorPciS1_E15add_e_additions+8)>>2)]=((__str20136)&4294967295);HEAP32[((__ZZ12RemoveEndingP10TranslatorPciS1_E15add_e_additions+12)>>2)]=((__str21137)&4294967295);HEAP32[((__ZZ12RemoveEndingP10TranslatorPciS1_E15add_e_additions+16)>>2)]=((__str22138)&4294967295);HEAP32[((__ZZ12RemoveEndingP10TranslatorPciS1_E15add_e_additions+20)>>2)]=((__str23139)&4294967295);HEAP32[((__ZZ12RemoveEndingP10TranslatorPciS1_E15add_e_additions+24)>>2)]=((__str24140)&4294967295);HEAP32[((_envelope_data)>>2)]=((_env_fall)&4294967295);HEAP32[((_envelope_data+4)>>2)]=((_env_fall)&4294967295);HEAP32[((_envelope_data+8)>>2)]=((_env_rise)&4294967295);HEAP32[((_envelope_data+12)>>2)]=((_env_rise)&4294967295);HEAP32[((_envelope_data+16)>>2)]=((_env_frise)&4294967295);HEAP32[((_envelope_data+20)>>2)]=((__ZL11env_r_frise)&4294967295);HEAP32[((_envelope_data+24)>>2)]=((__ZL10env_frise2)&4294967295);HEAP32[((_envelope_data+28)>>2)]=((__ZL12env_r_frise2)&4294967295);HEAP32[((_envelope_data+32)>>2)]=((__ZL12env_risefall)&4294967295);HEAP32[((_envelope_data+36)>>2)]=((__ZL12env_risefall)&4294967295);HEAP32[((_envelope_data+40)>>2)]=((__ZL13env_fallrise3)&4294967295);HEAP32[((_envelope_data+44)>>2)]=((__ZL13env_fallrise3)&4294967295);HEAP32[((_envelope_data+48)>>2)]=((__ZL13env_fallrise4)&4294967295);HEAP32[((_envelope_data+52)>>2)]=((__ZL13env_fallrise4)&4294967295);HEAP32[((_envelope_data+56)>>2)]=((__ZL9env_fall2)&4294967295);HEAP32[((_envelope_data+60)>>2)]=((__ZL9env_fall2)&4294967295);HEAP32[((_envelope_data+64)>>2)]=((__ZL9env_rise2)&4294967295);HEAP32[((_envelope_data+68)>>2)]=((__ZL9env_rise2)&4294967295);HEAP32[((_envelope_data+72)>>2)]=((__ZL16env_risefallrise)&4294967295);HEAP32[((_envelope_data+76)>>2)]=((__ZL16env_risefallrise)&4294967295);HEAP32[((__ZL15tone_head_table+4)>>2)]=((__ZL7drops_0)&4294967295);HEAP32[((__ZL15tone_head_table+12)>>2)]=((__ZL5oflow)&4294967295);HEAP32[((__ZL15tone_head_table+20)>>2)]=((__ZL7drops_0)&4294967295);HEAP32[((__ZL15tone_head_table+28)>>2)]=((__ZL5oflow)&4294967295);HEAP32[((__ZL15tone_head_table+36)>>2)]=((__ZL7drops_0)&4294967295);HEAP32[((__ZL15tone_head_table+44)>>2)]=((__ZL5oflow)&4294967295);HEAP32[((__ZL15tone_head_table+52)>>2)]=((__ZL7drops_0)&4294967295);HEAP32[((__ZL15tone_head_table+60)>>2)]=((__ZL9oflow_emf)&4294967295);HEAP32[((__ZL15tone_head_table+68)>>2)]=((__ZL7drops_0)&4294967295);HEAP32[((__ZL15tone_head_table+76)>>2)]=((__ZL5oflow)&4294967295);HEAP32[((__ZL15tone_head_table+84)>>2)]=((__ZL7drops_0)&4294967295);HEAP32[((__ZL15tone_head_table+92)>>2)]=((__ZL10oflow_less)&4294967295);HEAP32[((__ZL15tone_head_table+100)>>2)]=((__ZL7drops_0)&4294967295);HEAP32[((__ZL15tone_head_table+108)>>2)]=((__ZL10oflow_less)&4294967295);HEAP32[((__ZL15tone_head_table+116)>>2)]=((__ZL7drops_0)&4294967295);HEAP32[((__ZL15tone_head_table+124)>>2)]=((__ZL10oflow_less)&4294967295);HEAP32[((__ZL15tone_head_table+132)>>2)]=((__ZL7drops_0)&4294967295);HEAP32[((__ZL15tone_head_table+140)>>2)]=((__ZL5oflow)&4294967295);HEAP32[((__ZL15tone_head_table+148)>>2)]=((__ZL7drops_0)&4294967295);HEAP32[((__ZL15tone_head_table+156)>>2)]=((__ZL5oflow)&4294967295);HEAP32[((__ZL15tone_head_table+164)>>2)]=((__ZL7drops_0)&4294967295);HEAP32[((__ZL15tone_head_table+172)>>2)]=((__ZL5oflow)&4294967295);HEAP32[((__ZL15tone_head_table+180)>>2)]=((__ZL7drops_0)&4294967295);HEAP32[((__ZL15tone_head_table+188)>>2)]=((__ZL10oflow_less)&4294967295);HEAP32[((__ZL15tone_head_table+196)>>2)]=((__ZL7drops_0)&4294967295);HEAP32[((__ZL15tone_head_table+204)>>2)]=((__ZL10oflow_less)&4294967295);HEAP32[((__ZL8ssmltags)>>2)]=((__str167)&4294967295);HEAP32[((__ZL8ssmltags+8)>>2)]=((__str1168)&4294967295);HEAP32[((__ZL8ssmltags+16)>>2)]=((__str2169)&4294967295);HEAP32[((__ZL8ssmltags+24)>>2)]=((__str3170)&4294967295);HEAP32[((__ZL8ssmltags+32)>>2)]=((__str4171)&4294967295);HEAP32[((__ZL8ssmltags+40)>>2)]=((__str5172)&4294967295);HEAP32[((__ZL8ssmltags+48)>>2)]=((__str6173)&4294967295);HEAP32[((__ZL8ssmltags+56)>>2)]=((__str7174)&4294967295);HEAP32[((__ZL8ssmltags+64)>>2)]=((__str8175)&4294967295);HEAP32[((__ZL8ssmltags+72)>>2)]=((__str9176)&4294967295);HEAP32[((__ZL8ssmltags+80)>>2)]=((__str10177)&4294967295);HEAP32[((__ZL8ssmltags+88)>>2)]=((__str11178)&4294967295);HEAP32[((__ZL8ssmltags+96)>>2)]=((__str12179)&4294967295);HEAP32[((__ZL8ssmltags+104)>>2)]=((__str13180)&4294967295);HEAP32[((__ZL8ssmltags+112)>>2)]=((__str14181)&4294967295);HEAP32[((__ZL8ssmltags+120)>>2)]=((__str15182)&4294967295);HEAP32[((__ZL8ssmltags+128)>>2)]=((__str16183)&4294967295);HEAP32[((__ZL8ssmltags+136)>>2)]=((__str17184)&4294967295);HEAP32[((__ZL8ssmltags+144)>>2)]=((__str18185)&4294967295);HEAP32[((__ZL8ssmltags+152)>>2)]=((__str19186)&4294967295);HEAP32[((__ZL8ssmltags+160)>>2)]=((__str20187)&4294967295);HEAP32[((__ZL8ssmltags+168)>>2)]=((__str21188)&4294967295);HEAP32[((__ZL8ssmltags+176)>>2)]=((__str22189)&4294967295);HEAP32[((__ZL8ssmltags+184)>>2)]=((__str23190)&4294967295);HEAP32[((__ZL8ssmltags+192)>>2)]=((__str24191)&4294967295);HEAP32[((__ZL8ssmltags+200)>>2)]=((__str25192)&4294967295);HEAP32[((__ZL8ssmltags+208)>>2)]=((__str26193)&4294967295);HEAP32[((__ZL8ssmltags+216)>>2)]=((__str27194)&4294967295);HEAP32[((__ZL8ssmltags+224)>>2)]=((__str28195)&4294967295);HEAP32[((__ZL8ssmltags+232)>>2)]=((__str29196)&4294967295);HEAP32[((__ZL8ssmltags+240)>>2)]=((__str30197)&4294967295);HEAP32[((__ZL8ssmltags+248)>>2)]=((__str31198)&4294967295);HEAP32[((__ZL18xml_char_mnemonics)>>2)]=((__str32199)&4294967295);HEAP32[((__ZL18xml_char_mnemonics+8)>>2)]=((__str33200)&4294967295);HEAP32[((__ZL18xml_char_mnemonics+16)>>2)]=((__str34201)&4294967295);HEAP32[((__ZL18xml_char_mnemonics+24)>>2)]=((__str35202)&4294967295);HEAP32[((__ZL18xml_char_mnemonics+32)>>2)]=((__str36203)&4294967295);HEAP32[((__ZL18xml_char_mnemonics+40)>>2)]=((__str37204)&4294967295);HEAP32[((__ZL7xmlbase)>>2)]=((__str13643)&4294967295);HEAP32[((__ZZL14ProcessSsmlTagPwPcRiiiE10mnem_punct)>>2)]=((__str61228)&4294967295);HEAP32[((__ZZL14ProcessSsmlTagPwPcRiiiE10mnem_punct+8)>>2)]=((__str62229)&4294967295);HEAP32[((__ZZL14ProcessSsmlTagPwPcRiiiE10mnem_punct+16)>>2)]=((__str63230)&4294967295);HEAP32[((__ZZL14ProcessSsmlTagPwPcRiiiE13mnem_capitals)>>2)]=((__str64231)&4294967295);HEAP32[((__ZZL14ProcessSsmlTagPwPcRiiiE13mnem_capitals+8)>>2)]=((__str65232)&4294967295);HEAP32[((__ZZL14ProcessSsmlTagPwPcRiiiE13mnem_capitals+16)>>2)]=((__str66233)&4294967295);HEAP32[((__ZZL14ProcessSsmlTagPwPcRiiiE13mnem_capitals+24)>>2)]=((__str9659)&4294967295);HEAP32[((__ZZL14ProcessSsmlTagPwPcRiiiE17mnem_interpret_as)>>2)]=((__str68235)&4294967295);HEAP32[((__ZZL14ProcessSsmlTagPwPcRiiiE17mnem_interpret_as+8)>>2)]=((__str69236)&4294967295);HEAP32[((__ZZL14ProcessSsmlTagPwPcRiiiE17mnem_interpret_as+16)>>2)]=((__str70237)&4294967295);HEAP32[((__ZZL14ProcessSsmlTagPwPcRiiiE17mnem_interpret_as+24)>>2)]=((__str71238)&4294967295);HEAP32[((__ZZL14ProcessSsmlTagPwPcRiiiE17mnem_interpret_as+32)>>2)]=((__str72239)&4294967295);HEAP32[((__ZZL14ProcessSsmlTagPwPcRiiiE17mnem_sayas_format)>>2)]=((__str73240)&4294967295);HEAP32[((__ZZL14ProcessSsmlTagPwPcRiiiE10mnem_break)>>2)]=((__str61228)&4294967295);HEAP32[((__ZZL14ProcessSsmlTagPwPcRiiiE10mnem_break+8)>>2)]=((__str74241)&4294967295);HEAP32[((__ZZL14ProcessSsmlTagPwPcRiiiE10mnem_break+16)>>2)]=((__str75242)&4294967295);HEAP32[((__ZZL14ProcessSsmlTagPwPcRiiiE10mnem_break+24)>>2)]=((__str76243)&4294967295);HEAP32[((__ZZL14ProcessSsmlTagPwPcRiiiE10mnem_break+32)>>2)]=((__str29196)&4294967295);HEAP32[((__ZZL14ProcessSsmlTagPwPcRiiiE10mnem_break+40)>>2)]=((__str77244)&4294967295);HEAP32[((__ZZL14ProcessSsmlTagPwPcRiiiE13mnem_emphasis)>>2)]=((__str61228)&4294967295);HEAP32[((__ZZL14ProcessSsmlTagPwPcRiiiE13mnem_emphasis+8)>>2)]=((__str78245)&4294967295);HEAP32[((__ZZL14ProcessSsmlTagPwPcRiiiE13mnem_emphasis+16)>>2)]=((__str79246)&4294967295);HEAP32[((__ZZL14ProcessSsmlTagPwPcRiiiE13mnem_emphasis+24)>>2)]=((__str29196)&4294967295);HEAP32[((__ZZL14ProcessSsmlTagPwPcRiiiE12prosody_attr+4)>>2)]=((__str80247)&4294967295);HEAP32[((__ZZL14ProcessSsmlTagPwPcRiiiE12prosody_attr+8)>>2)]=((__str81248)&4294967295);HEAP32[((__ZZL14ProcessSsmlTagPwPcRiiiE12prosody_attr+12)>>2)]=((__str9659)&4294967295);HEAP32[((__ZZL14ProcessSsmlTagPwPcRiiiE12prosody_attr+16)>>2)]=((__str82249)&4294967295);HEAP32[((__ZZL18GetVoiceAttributesPwiE11mnem_gender)>>2)]=((__str1647)&4294967295);HEAP32[((__ZZL18GetVoiceAttributesPwiE11mnem_gender+8)>>2)]=((__str2648)&4294967295);HEAP32[((__ZZL18GetVoiceAttributesPwiE11mnem_gender+16)>>2)]=((__str105272)&4294967295);HEAP32[((__ZZL14ReplaceKeyNamePciRiE8keynames)>>2)]=((__str111278)&4294967295);HEAP32[((__ZZL14ReplaceKeyNamePciRiE8keynames+8)>>2)]=((__str112279)&4294967295);HEAP32[((__ZZL14ReplaceKeyNamePciRiE8keynames+16)>>2)]=((__str113280)&4294967295);HEAP32[((__ZZL14ReplaceKeyNamePciRiE8keynames+24)>>2)]=((__str114281)&4294967295);HEAP32[((__ZZL19SetProsodyParameteriPwP11PARAM_STACKE11mnem_volume)>>2)]=((__str45697)&4294967295);HEAP32[((__ZZL19SetProsodyParameteriPwP11PARAM_STACKE11mnem_volume+8)>>2)]=((__str115282)&4294967295);HEAP32[((__ZZL19SetProsodyParameteriPwP11PARAM_STACKE11mnem_volume+16)>>2)]=((__str116283)&4294967295);HEAP32[((__ZZL19SetProsodyParameteriPwP11PARAM_STACKE11mnem_volume+24)>>2)]=((__str117)&4294967295);HEAP32[((__ZZL19SetProsodyParameteriPwP11PARAM_STACKE11mnem_volume+32)>>2)]=((__str76243)&4294967295);HEAP32[((__ZZL19SetProsodyParameteriPwP11PARAM_STACKE11mnem_volume+40)>>2)]=((__str118)&4294967295);HEAP32[((__ZZL19SetProsodyParameteriPwP11PARAM_STACKE11mnem_volume+48)>>2)]=((__str119)&4294967295);HEAP32[((__ZZL19SetProsodyParameteriPwP11PARAM_STACKE9mnem_rate)>>2)]=((__str45697)&4294967295);HEAP32[((__ZZL19SetProsodyParameteriPwP11PARAM_STACKE9mnem_rate+8)>>2)]=((__str120)&4294967295);HEAP32[((__ZZL19SetProsodyParameteriPwP11PARAM_STACKE9mnem_rate+16)>>2)]=((__str121)&4294967295);HEAP32[((__ZZL19SetProsodyParameteriPwP11PARAM_STACKE9mnem_rate+24)>>2)]=((__str76243)&4294967295);HEAP32[((__ZZL19SetProsodyParameteriPwP11PARAM_STACKE9mnem_rate+32)>>2)]=((__str122)&4294967295);HEAP32[((__ZZL19SetProsodyParameteriPwP11PARAM_STACKE9mnem_rate+40)>>2)]=((__str123)&4294967295);HEAP32[((__ZZL19SetProsodyParameteriPwP11PARAM_STACKE10mnem_pitch)>>2)]=((__str45697)&4294967295);HEAP32[((__ZZL19SetProsodyParameteriPwP11PARAM_STACKE10mnem_pitch+8)>>2)]=((__str124)&4294967295);HEAP32[((__ZZL19SetProsodyParameteriPwP11PARAM_STACKE10mnem_pitch+16)>>2)]=((__str125)&4294967295);HEAP32[((__ZZL19SetProsodyParameteriPwP11PARAM_STACKE10mnem_pitch+24)>>2)]=((__str76243)&4294967295);HEAP32[((__ZZL19SetProsodyParameteriPwP11PARAM_STACKE10mnem_pitch+32)>>2)]=((__str126)&4294967295);HEAP32[((__ZZL19SetProsodyParameteriPwP11PARAM_STACKE10mnem_pitch+40)>>2)]=((__str127)&4294967295);HEAP32[((__ZZL19SetProsodyParameteriPwP11PARAM_STACKE10mnem_range)>>2)]=((__str45697)&4294967295);HEAP32[((__ZZL19SetProsodyParameteriPwP11PARAM_STACKE10mnem_range+8)>>2)]=((__str124)&4294967295);HEAP32[((__ZZL19SetProsodyParameteriPwP11PARAM_STACKE10mnem_range+16)>>2)]=((__str125)&4294967295);HEAP32[((__ZZL19SetProsodyParameteriPwP11PARAM_STACKE10mnem_range+24)>>2)]=((__str76243)&4294967295);HEAP32[((__ZZL19SetProsodyParameteriPwP11PARAM_STACKE10mnem_range+32)>>2)]=((__str126)&4294967295);HEAP32[((__ZZL19SetProsodyParameteriPwP11PARAM_STACKE10mnem_range+40)>>2)]=((__str127)&4294967295);HEAP32[((__ZZL19SetProsodyParameteriPwP11PARAM_STACKE9mnem_tabs+4)>>2)]=((__ZZL19SetProsodyParameteriPwP11PARAM_STACKE9mnem_rate)&4294967295);HEAP32[((__ZZL19SetProsodyParameteriPwP11PARAM_STACKE9mnem_tabs+8)>>2)]=((__ZZL19SetProsodyParameteriPwP11PARAM_STACKE11mnem_volume)&4294967295);HEAP32[((__ZZL19SetProsodyParameteriPwP11PARAM_STACKE9mnem_tabs+12)>>2)]=((__ZZL19SetProsodyParameteriPwP11PARAM_STACKE10mnem_pitch)&4294967295);HEAP32[((__ZZL19SetProsodyParameteriPwP11PARAM_STACKE9mnem_tabs+16)>>2)]=((__ZZL19SetProsodyParameteriPwP11PARAM_STACKE10mnem_range)&4294967295);HEAP32[((__ZL11accents_tab)>>2)]=((__str57354)&4294967295);HEAP32[((__ZL11accents_tab+8)>>2)]=((__str58355)&4294967295);HEAP32[((__ZL11accents_tab+16)>>2)]=((__str59356)&4294967295);HEAP32[((__ZL11accents_tab+24)>>2)]=((__str60357)&4294967295);HEAP32[((__ZL11accents_tab+32)>>2)]=((__str61358)&4294967295);HEAP32[((__ZL11accents_tab+40)>>2)]=((__str62359)&4294967295);HEAP32[((__ZL11accents_tab+48)>>2)]=((__str63360)&4294967295);HEAP32[((__ZL11accents_tab+56)>>2)]=((__str64361)&4294967295);HEAP32[((__ZL11accents_tab+64)>>2)]=((__str65362)&4294967295);HEAP32[((__ZL11accents_tab+72)>>2)]=((__str66363)&4294967295);HEAP32[((__ZL11accents_tab+80)>>2)]=((__str67364)&4294967295);HEAP32[((__ZL11accents_tab+88)>>2)]=((__str68365)&4294967295);HEAP32[((__ZL11accents_tab+96)>>2)]=((__str69366)&4294967295);HEAP32[((__ZL11accents_tab+104)>>2)]=((__str70367)&4294967295);HEAP32[((__ZL11accents_tab+112)>>2)]=((__str71368)&4294967295);HEAP32[((__ZL11accents_tab+120)>>2)]=((__str72369)&4294967295);HEAP32[((__ZL11accents_tab+128)>>2)]=((__str73370)&4294967295);HEAP32[((__ZL11accents_tab+136)>>2)]=((__str74371)&4294967295);HEAP32[((__ZL11accents_tab+144)>>2)]=((__str75372)&4294967295);HEAP32[((__ZL11accents_tab+152)>>2)]=((__str76373)&4294967295);HEAP32[((__ZL11accents_tab+160)>>2)]=((__str77374)&4294967295);HEAP32[((__ZL11accents_tab+168)>>2)]=((__str78375)&4294967295);HEAP32[((_version_string)>>2)]=((__str399)&4294967295);HEAP32[((_charsets)>>2)]=((__ZL10ISO_8859_1)&4294967295);HEAP32[((_charsets+4)>>2)]=((__ZL10ISO_8859_1)&4294967295);HEAP32[((_charsets+8)>>2)]=((__ZL10ISO_8859_2)&4294967295);HEAP32[((_charsets+12)>>2)]=((__ZL10ISO_8859_3)&4294967295);HEAP32[((_charsets+16)>>2)]=((__ZL10ISO_8859_4)&4294967295);HEAP32[((_charsets+20)>>2)]=((__ZL10ISO_8859_5)&4294967295);HEAP32[((_charsets+24)>>2)]=((__ZL10ISO_8859_1)&4294967295);HEAP32[((_charsets+28)>>2)]=((__ZL10ISO_8859_7)&4294967295);HEAP32[((_charsets+32)>>2)]=((__ZL10ISO_8859_1)&4294967295);HEAP32[((_charsets+36)>>2)]=((__ZL10ISO_8859_9)&4294967295);HEAP32[((_charsets+40)>>2)]=((__ZL10ISO_8859_1)&4294967295);HEAP32[((_charsets+44)>>2)]=((__ZL10ISO_8859_1)&4294967295);HEAP32[((_charsets+48)>>2)]=((__ZL10ISO_8859_1)&4294967295);HEAP32[((_charsets+52)>>2)]=((__ZL10ISO_8859_1)&4294967295);HEAP32[((_charsets+56)>>2)]=((__ZL11ISO_8859_14)&4294967295);HEAP32[((_charsets+60)>>2)]=((__ZL10ISO_8859_1)&4294967295);HEAP32[((_charsets+64)>>2)]=((__ZL10ISO_8859_1)&4294967295);HEAP32[((_charsets+68)>>2)]=((__ZL10ISO_8859_1)&4294967295);HEAP32[((_charsets+72)>>2)]=((__ZL6KOI8_R)&4294967295);HEAP32[((_charsets+76)>>2)]=((__ZL5ISCII)&4294967295);HEAP32[((__ZL15length_mod_tabs)>>2)]=((__ZL14length_mods_en)&4294967295);HEAP32[((__ZL15length_mod_tabs+4)>>2)]=((__ZL14length_mods_en)&4294967295);HEAP32[((__ZL15length_mod_tabs+8)>>2)]=((__ZL15length_mods_en0)&4294967295);HEAP32[((__ZL15length_mod_tabs+12)>>2)]=((__ZL17length_mods_equal)&4294967295);HEAP32[((__ZL15length_mod_tabs+16)>>2)]=((__ZL17length_mods_equal)&4294967295);HEAP32[((__ZL15length_mod_tabs+20)>>2)]=((__ZL17length_mods_equal)&4294967295);HEAP32[((_genders)>>2)]=((__str646)&4294967295);HEAP32[((_genders+8)>>2)]=((__str1647)&4294967295);HEAP32[((_genders+16)>>2)]=((__str2648)&4294967295);HEAP32[((__ZL11options_tab)>>2)]=((__str3653)&4294967295);HEAP32[((__ZL11options_tab+8)>>2)]=((__str4654)&4294967295);HEAP32[((__ZL11keyword_tab)>>2)]=((__str5655)&4294967295);HEAP32[((__ZL11keyword_tab+8)>>2)]=((__str6656)&4294967295);HEAP32[((__ZL11keyword_tab+16)>>2)]=((__str7657)&4294967295);HEAP32[((__ZL11keyword_tab+24)>>2)]=((__str8658)&4294967295);HEAP32[((__ZL11keyword_tab+32)>>2)]=((__str9659)&4294967295);HEAP32[((__ZL11keyword_tab+40)>>2)]=((__str10660)&4294967295);HEAP32[((__ZL11keyword_tab+48)>>2)]=((__str11661)&4294967295);HEAP32[((__ZL11keyword_tab+56)>>2)]=((__str12662)&4294967295);HEAP32[((__ZL11keyword_tab+64)>>2)]=((__str13663)&4294967295);HEAP32[((__ZL11keyword_tab+72)>>2)]=((__str14664)&4294967295);HEAP32[((__ZL11keyword_tab+80)>>2)]=((__str15665)&4294967295);HEAP32[((__ZL11keyword_tab+88)>>2)]=((__str16666)&4294967295);HEAP32[((__ZL11keyword_tab+96)>>2)]=((__str17667)&4294967295);HEAP32[((__ZL11keyword_tab+104)>>2)]=((__str18668)&4294967295);HEAP32[((__ZL11keyword_tab+112)>>2)]=((__str19669)&4294967295);HEAP32[((__ZL11keyword_tab+120)>>2)]=((__str20670)&4294967295);HEAP32[((__ZL11keyword_tab+128)>>2)]=((__str21671)&4294967295);HEAP32[((__ZL11keyword_tab+136)>>2)]=((__str22672)&4294967295);HEAP32[((__ZL11keyword_tab+144)>>2)]=((__str23673)&4294967295);HEAP32[((__ZL11keyword_tab+152)>>2)]=((__str24674)&4294967295);HEAP32[((__ZL11keyword_tab+160)>>2)]=((__str25675)&4294967295);HEAP32[((__ZL11keyword_tab+168)>>2)]=((__str26676)&4294967295);HEAP32[((__ZL11keyword_tab+176)>>2)]=((__str27677)&4294967295);HEAP32[((__ZL11keyword_tab+184)>>2)]=((__str28678)&4294967295);HEAP32[((__ZL11keyword_tab+192)>>2)]=((__str29679)&4294967295);HEAP32[((__ZL11keyword_tab+200)>>2)]=((__str30680)&4294967295);HEAP32[((__ZL11keyword_tab+208)>>2)]=((__str31681)&4294967295);HEAP32[((__ZL11keyword_tab+216)>>2)]=((__str32682)&4294967295);HEAP32[((__ZL11keyword_tab+224)>>2)]=((__str33683)&4294967295);HEAP32[((__ZL11keyword_tab+232)>>2)]=((__str34684)&4294967295);HEAP32[((__ZL11keyword_tab+240)>>2)]=((__str35685)&4294967295);HEAP32[((__ZL11keyword_tab+248)>>2)]=((__str36686)&4294967295);HEAP32[((__ZL11keyword_tab+256)>>2)]=((__str37687)&4294967295);HEAP32[((__ZL11keyword_tab+264)>>2)]=((__str38688)&4294967295);HEAP32[((__ZL11keyword_tab+272)>>2)]=((__str39689)&4294967295);HEAP32[((__ZL11keyword_tab+280)>>2)]=((__str40690)&4294967295);HEAP32[((__ZL11keyword_tab+288)>>2)]=((__str41691)&4294967295);HEAP32[((__ZL11keyword_tab+296)>>2)]=((__str42692)&4294967295);HEAP32[((__ZL11keyword_tab+304)>>2)]=((__str43693)&4294967295);HEAP32[((_variant_lists)>>2)]=((__ZL15variants_either)&4294967295);HEAP32[((_variant_lists+4)>>2)]=((__ZL13variants_male)&4294967295);HEAP32[((_variant_lists+8)>>2)]=((__ZL15variants_female)&4294967295);HEAP32[((_voice)>>2)]=__ZL9voicedata;FS.init();__ATEXIT__.push({func:function(){FS.quit()}});___setErrNo(0);_fputc.ret=allocate([0],"i8",ALLOC_STATIC);___buildEnvironment(ENV);_fgetc.ret=allocate([0],"i8",ALLOC_STATIC);FUNCTION_TABLE=[0,0,__ZL13rgroup_sorterP6RGROUPS0_,0,__Z13string_sorterPPcS0_,0,__ZL15VoiceNameSorterPKvS0_,0,__ZL16VoiceScoreSorterPKvS0_,0];Module["FUNCTION_TABLE"]=FUNCTION_TABLE;__globalConstructor__();var ret=null;if(Module._main){ret=Module.callMain(args);__shutdownRuntime__();}
70328 return ret;}
70329 Module.run=run;if(!Module.noInitialRun){run();}
70330 return{Module:Module,FS:FS,run:run};}
70331 var eSpeakDir='/espeak',eSpeakDataDir='/espeak/espeak-data',eSpeakVoicesDir='/espeak/espeak-data/voices',eSpeak=new ESpeak(),fileRegistry=[],fsErrorDetected=false,configDataLoaded=false,unloading=false,speakQueue=[],voicesLoaded={},defaultVoice='',AudioAPI=null,canPlay=false,playbackVolume=1,masterGain=null,audioContext=null,audioPool={},webSoundPool={},isChrome=((typeof navigator!=='undefined')&&navigator.userAgent&&navigator.userAgent.indexOf('Chrome')!==-1),chromeVersion=(isChrome)?parseInt(navigator.userAgent.replace(/^.*?\bChrome\/([0-9]+).*$/,'$1'),10):0;function fsCreateDataFile(path,fname,data,doNotRegister){if(!eSpeak.FS.findObject(path))eSpeak.FS.createPath('/',path.substring(1),true,true);eSpeak.FS.createDataFile(path,fname,data,true,false);if(!doNotRegister)fileRegistry.push({path:path,fname:fname});}
70332 function recoverFromFSError(message){console.log('meSpeak -- recovering from error:',message);var files=[],f,i,l=fileRegistry.length;for(i=0;i<l;i++){f=fileRegistry[i];files.push(eSpeak.FS.findObject(f.path+'/'+f.fname).contents);}
70333 eSpeak=new ESpeak();setUpVFS();for(i=0;i<l;i++){f=fileRegistry[i];fsCreateDataFile(f.path,f.fname,files[i],true);}
70334 fsErrorDetected=true;}
70335 function setUpVFS(){var optionFiles={'croak':'language variant\nname croak\ngender male 70\npitch 85 117\nflutter 20\nformant 0 100 80 110\n','f1':'language variant\nname female1\ngender female 70\npitch 140 200\nflutter 8\nroughness 4\nformant 0 115 80 150\nformant 1 120 80 180\nformant 2 100 70 150 150\nformant 3 115 70 150\nformant 4 110 80 150\nformant 5 110 90 150\nformant 6 105 80 150\nformant 7 110 70 150\nformant 8 110 70 150\nstressAdd -10 -10 -20 -20 0 0 40 60\n','f2':'language variant\nname female2\ngender female\npitch 142 220\nroughness 3\nformant 0 105 80 150\nformant 1 110 80 160\nformant 2 110 70 150\nformant 3 110 70 150\nformant 4 115 80 150\nformant 5 115 80 150\nformant 6 110 70 150\nformant 7 110 70 150\nformant 8 110 70 150\nstressAdd 0 0 -10 -10 0 0 10 40\nbreath 0 2 3 3 3 3 3 2\necho 140 10\nconsonants 125 125\n','f3':'language variant\nname female3\ngender female\npitch 140 240\nformant 0 105 80 150\nformant 1 120 75 150 -50\nformant 2 135 70 150 -250\nformant 3 125 80 150\nformant 4 125 80 150\nformant 5 125 80 150\nformant 6 120 70 150\nformant 7 110 70 150\nformant 8 110 70 150\nstressAmp 18 18 20 20 20 20 20 20\n//breath 0 2 4 4 4 4 4 4\nbreath 0 2 3 3 3 3 3 2\necho 120 10\nroughness 4\n','f4':'language variant\nname female4\ngender female\necho 130 15\npitch 142 200\nformant 0 120 80 150\nformant 1 115 80 160 -20\nformant 2 130 75 150 -200\nformant 3 123 75 150\nformant 4 125 80 150\nformant 5 125 80 150\nformant 6 110 80 150\nformant 7 110 75 150\nformant 8 110 75 150\nstressAdd -20 -20 -20 -20 0 0 20 120\nstressAmp 18 16 20 20 20 20 20 20\n','f5':'language variant\nname female5\ngender female\npitch 160 228\nroughness 0\nformant 0 105 80 150\nformant 1 110 80 160\nformant 2 110 70 150\nformant 3 110 70 150\nformant 4 115 80 200\nformant 5 115 80 100\nformant 6 110 70 150\nformant 7 110 70 100\nformant 8 110 70 150\nstressAdd 0 0 -10 -10 0 0 10 40\nbreath 0 4 6   6 6   6 0 10\necho 140 10\nvoicing 75\nconsonants 150 150\nbreathw 150 150 200 200 400 400\n','klatt':'language variant\nname klatt\nklatt 1\n','klatt2':'language variant\nname klatt2\nklatt 2\n','klatt3':'language variant\nname klatt3\nklatt 3\n','m1':'language variant\nname male1\ngender male 70\npitch 75 109\nflutter 5\nroughness 4\nconsonants 80 100\nformant 0 98 100 100\nformant 1 97 100 100\nformant 2 97 95 100\nformant 3 97 95 100\nformant 4 97 85 100\nformant 5 105 80 100\nformant 6 95 80 100\nformant 7 100 100 100\nformant 8 100 100 100\n//stressAdd -10 -10 -20 -20 0 0 40 70\n','m2':'language variant\nname male2\ngender male\npitch 88 115\necho 130 15\nformant 0 100 80 120\nformant 1 90 85 120\nformant 2 110 85 120\nformant 3 105 90 120\nformant 4 100 90 120\nformant 5 100 90 120\nformant 6 100 90 120\nformant 7 100 90 120\nformant 8 100 90 120\n','m3':'language variant\nname male3\ngender male\npitch 80 122\nformant 0 100 100 100\nformant 1 96 97 100\nformant 2 96 97 100\nformant 3 96 103 100\nformant 4 95 103 100\nformant 5 95 103 100\nformant 6 100 100 100\nformant 7 100 100 100\nformant 8 100 100 100\nstressAdd 10 10 0 0 0 0 -30 -30\n','m4':'language variant\nname male4\ngender male\npitch 70 110\nformant 0 103 100 100\nformant 1 103 100 100\nformant 2 103 100 100\nformant 3 103 100 100\nformant 4 106 100 100\nformant 5 106 100 100\nformant 6 106 100 100\nformant 7 103 100 100\nformant 8 103 100 100\nstressAdd -10 -10 -30 -30 0 0 60 90\n','m5':'language variant\nname male5\ngender male\nformant 0 100 85 130\nformant 1 90 85 130 40\nformant 2 80 85 130 310\nformant 3 105 85 130\nformant 4 105 85 130\nformant 5 105 85 130\nformant 6 105 85 150\nformant 7 105 85 150\nformant 8 105 85 150\nintonation 2\n','m6':'language variant\nname male6\ngender male\npitch 82 117\nformant 0 100 90 120\nformant 1 100 90 140\nformant 2 100 70 140\nformant 3 100 75 140\nformant 4 100 80 140\nformant 5 100 80 140\n','m7':'language variant\nname male7\npitch 75 125\nformant 0 100 125 100\nformant 1 100 90 80\nformant 2 100 70 90\nformant 3 100 60 90\nformant 4 100 60 90\nformant 5 75 50 90\nformant 6 90 50 100\nformant 7 100 50 100\nformant 8 100 50 100\nvoicing 155\n','whisper':'language variant\nname whisper\npitch 75 125\nformant 0 100 125 100\nformant 1 100 90 80\nformant 2 100 70 90\nformant 3 100 60 90\nformant 4 100 60 90\nformant 5 75 50 90\nformant 6 90 50 100\nformant 7 100 50 100\nformant 8 100 50 100\nvoicing 155\n','whisperf':'language variant\nname female whisper\ngender female\npitch 160 220\nroughness 3\nformant 0 105 0 150\nformant 1 110 40 160\nformant 2 110 70 150\nformant 3 110 70 150\nformant 4 115 80 150\nformant 5 115 80 150\nformant 6 110 70 150\nformant 7 110 70 150\nformant 8 110 70 150\nstressAdd 0 0 -10 -10 0 0 10 40\n// whisper\nvoicing 20\nbreath 75 75 50 40 15 10\nbreathw 150 150 200 200 400 400\n'};var dir=eSpeakVoicesDir+'/!v';eSpeak.FS.createPath('/',dir.substring(1),true,true);eSpeak.FS.root.write=true;for(var fn in optionFiles){eSpeak.FS.createDataFile(dir,fn,decodeStringToArray(optionFiles[fn]),true,true);}}
70336 if(eSpeak&&eSpeak.FS)setUpVFS();function setConfigData(data){[['config',decodeBase64ToArray(data.config)],['phontab',decodeBase64ToArray(data.phontab)],['phonindex',decodeBase64ToArray(data.phonindex)],['phondata',decodeBase64ToArray(data.phondata)],['intonations',decodeBase64ToArray(data.intonations)]].forEach(function(pair){var id=pair[0];var data=pair[1];fsCreateDataFile(eSpeakDataDir,id,data);});configDataLoaded=true;var voice=data.voice;if(typeof voice=='object'&&typeof voice.voice_id=='string'&&typeof voice.dict_id=='string'&&typeof voice.dict=='string'&&typeof voice.voice=='string'){setVoiceData(voice);}
70337 executeQueuedCalls();}
70338 function setVoiceData(data){var parts,path,fname,f;if(!voicesLoaded[data.voice_id]){if(data.dict_id&&!eSpeak.FS.findObject(eSpeakDataDir+'/'+data.dict_id))fsCreateDataFile(eSpeakDataDir,data.dict_id,decodeBase64ToArray(data.dict));parts=data.voice_id.split('/');path=eSpeakVoicesDir;if(parts.length>1){path+='/'+parts.slice(0,parts.length-1).join('/');}
70339 fname=parts[parts.length-1];if(data.voice_encoding=='text'){fsCreateDataFile(path,fname,decodeStringToArray(data.voice));}
70340 else{fsCreateDataFile(path,fname,decodeBase64ToArray(data.voice));}
70341 if(data.files&&Array.isArray(data.files)){for(var i=0,l=data.files.length;i<l;i++){f=data.files[i];if(typeof f=='object'&&typeof f.path=='string'&&f.path.length&&typeof f.data=='string'&&f.data.length){parts=f.path.split('/');if(parts.length>1){path=eSpeakDataDir+'/'+parts.slice(0,parts.length-1).join('/');}
70342 else{path=eSpeakDataDir;}
70343 fname=parts[parts.length-1];if(f.encoding=='text'){fsCreateDataFile(path,fname,decodeStringToArray(f.data));}
70344 else{fsCreateDataFile(path,fname,decodeBase64ToArray(f.data));}}}}
70345 voicesLoaded[data.voice_id]=true;}
70346 setDefaultVoice(data.voice_id);executeQueuedCalls();}
70347 function decodeBase64ToArray(str){function f(c){if(c==43){return 62;}
70348 else if(c==47){return 63;}
70349 else if(c==61){return 64;}
70350 else if(c<=57){return c+4;}
70351 else if(c<=90){return c-65;}
70352 else{return c-71;}}
70353 var h1,h2,h3,h4,out=[],i=0,l=str.length;while(i<l){h1=f(str.charCodeAt(i++));h2=f(str.charCodeAt(i++));h3=f(str.charCodeAt(i++));h4=f(str.charCodeAt(i++));out.push((h1<<2)|(h2>>4));if(h3!=64)out.push(((h2&15)<<4)|(h3>>2));if(h4!=64)out.push(((h3&3)<<6)|h4);}
70354 return out;}
70355 function encode64(data){var BASE='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';var PAD='=';var ret='';var leftchar=0;var leftbits=0;for(var i=0,l=data.length;i<l;i++){leftchar=(leftchar<<8)|data[i];leftbits+=8;while(leftbits>=6){var curr=(leftchar>>(leftbits-6))&0x3f;leftbits-=6;ret+=BASE[curr];}}
70356 if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD;}else if(leftbits==4){ret+=BASE[(leftchar&0xf)<<2];ret+=PAD;}
70357 return ret;}
70358 function decodeStringToArray(str){var out=[],l=str.length,i;for(i=0;i<l;i++)out.push(str.charCodeAt(i));return out;}
70359 function executeQueuedCalls(){if(configDataLoaded&&defaultVoice){for(var i=0,l=speakQueue.length;i<l;i++){var args=speakQueue[i];if(args[3].multipart){speakMultipart(args[0],args[1],args[2],args[3]);}
70360 else{speak(args[0],args[1],args[2],args[3]);}}
70361 speakQueue.length=0;}}
70362 function resetQueue(){speakQueue.length=0;}
70363 function speak(text,args,callback,_id){if(typeof args!=='object')args={};if(!canPlay&&!args.rawdata){if(self.console)console.log('meSpeak: Can\'t play; No audio support.');return 0;}
70364 if(!_id||!isValidJobId(_id))_id=getJobId();if(!configDataLoaded||!defaultVoice){if(self.console)console.log(((!configDataLoaded)?'No config-data loaded':'No voice module loaded')+', deferring call.');if(args.rawdata){return null;}
70365 else{speakQueue.push([text,args,callback,_id]);return _id.number;}}
70366 if(args&&args.voice&&!voicesLoaded[args.voice]){if(self.console)console.log('Voice '+args.voice+' not available. Using default voice: '+defaultVoice);}
70367 var varg=(args.voice)?String(args.voice):(args.v)?String(args.v):defaultVoice;if(varg.indexOf('mb/mb-')==0)varg=varg.substring(3);if(args.variant)varg+='+'+String(args.variant).replace(/\+/g,'');var argstack=['-w','wav.wav','-a',args.amplitude!==undefined?String(args.amplitude):args.a!==undefined?String(args.a):'100','-g',args.wordgap!==undefined?String(args.wordgap):args.g!==undefined?String(args.g):'0','-p',args.pitch!==undefined?String(args.pitch):args.p!==undefined?String(args.p):'50','-s',args.speed!==undefined?String(args.speed):args.s!==undefined?String(args.s):'175','-b',args.utf16?'4':args.b!==undefined?String(args.b):'1','-v',varg];var a=args.linebreak||args.l;if(a)argstack.push('-l',String(a));a=args.capitals||args.k;if(a)argstack.push('-k',String(a));a=args.nostop||args.z;if(a)argstack.push('-z');if(args.punct!==undefined){if(typeof args.punct=='string'){if(args.punct.length){argstack.push('--punct="'+String(args.punct).replace(/([\\"'])/g,'\\$1')+'"');}
70368 else{argstack.push('--punct');}}
70369 else if(args.punct){argstack.push('--punct');}}
70370 a=args.ssml||args.m||args.markup;if(a)argstack.push('-m');argstack.push('--path='+eSpeakDir,String(text));if(args.log&&self.console)console.log('executing espeak '+argstack.join(' '));eSpeak.Module.arguments=argstack;if(typeof callback!='function')callback=undefined;if(!callback&&typeof args.callback=='function')callback=args.callback;fsErrorDetected=false;eSpeak.run();if(fsErrorDetected){fsErrorDetected=false;eSpeak.Module.arguments=argstack;eSpeak.run();}
70371 var outfile=eSpeak.FS.root.contents['wav.wav'].contents,wav=unsignedStream(outfile);outfile.length=0;argstack=null;return(args.rawdata)?exportStream(wav,args.rawdata):playSound(wav,args.volume,callback,_id);}
70372 function exportStream(stream,format){switch(String(format).toLowerCase()){case'array':return stream;case'base64':return encode64(stream);case'data-url':case'data-uri':case'dataurl':case'datauri':case'mime':return'data:audio/x-wav;base64,'+encode64(stream);default:var buffer=new ArrayBuffer(stream.length);new Uint8Array(buffer).set(stream);return buffer;}}
70373 function speakMultipart(parts,args,callback,_id){if(typeof args!=='object')args={};if(!canPlay&&!args.rawdata){if(self.console)console.log('meSpeak: Can\'t play; No audio support.');return 0;}
70374 var failed=false;if(typeof callback!='function')callback=undefined;if(!callback&&typeof args.callback=='function')callback=args.callback;if(Object.prototype.toString.call(parts)!='[object Array]'||!parts.length){if(self.console)console.log('meSpeak.speakMultipart: First argument must be an array of objects.');failed=true;}
70375 if(!failed){for(var i=0,l=parts.length;i<l;i++){if(typeof parts[i]!='object'){if(self.console)console.log('meSpeak.speakMultipart: First argument must be an array of objects (part #'+i+').');failed=true;break;}}}
70376 if(failed){if(args.rawdata){return null;}
70377 else{if(callback)callback(false);return 0;}}
70378 if(!_id||!isValidJobId(_id))_id=getJobId();if(!configDataLoaded||!defaultVoice){if(self.console)console.log(((!configDataLoaded)?'No config-data loaded':'No voice module loaded')+', deferring call.');if(args.rawdata){return null;}
70379 else{_id.multipart=true;speakQueue.push([parts,args,callback,_id]);return _id.number;}}
70380 var wav,sampleLength;for(var i=0,l=parts.length;i<l;i++){var n,part=parts[i],opts={};for(n in args)opts[n]=args[n];for(n in part)opts[n]=part[n];opts.rawdata='array';opts.callback=undefined;var buffer=meSpeak.speak(part.text,opts);if(!buffer){if(args.rawdata){return null;}
70381 else{if(callback)callback(false);return 0;}}
70382 if(i==0){wav=buffer;sampleLength=readBytes(buffer,40,4);}
70383 else{sampleLength+=readBytes(buffer,40,4);wav=wav.concat(buffer.slice(44));}
70384 buffer=null;}
70385 writeBytes(wav,4,4,sampleLength);writeBytes(wav,40,4,sampleLength);return(args.rawdata)?exportStream(wav,args.rawdata):playSound(wav,args.volume,callback,_id);}
70386 function writeBytes(f,p,n,value){while(n){f[p++]=value&0xff;value=value>>8;n--;}}
70387 function readBytes(f,p,n){var value=0,shft=0;while(n){value|=f[p++]<<shft;shft+=8;n--;}
70388 return value;}
70389 function unsignedStream(wav){var i,l=wav.length,v,out=new Array(l);for(i=0;i<l;i++){v=wav[i];out[i]=(v>=0)?v:256+v;}
70390 return out;}
70391 function getJobId(){var n,s;while(!n||audioPool[s]||webSoundPool[s]){n=Math.floor(Math.random()*Math.pow(2,32));s=n.toString(16);}
70392 return{number:n,string:s}}
70393 function isValidJobId(id){return!(Object.prototype.toString.call(id)!=='[object Object]'||Object.prototype.toString.call(id.number)!=='[object Number]'||Object.prototype.toString.call(id.string)!=='[object String]'||!id.number||id.string!==id.number.toString(16));}
70394 function playSound(stream,relVolume,callback,_id){if(callback&&(typeof callback!='function'))callback=undefined;if(!_id||!isValidJobId(_id))_id=getJobId();var streamType=Object.prototype.toString.call(stream);if(!(streamType=='[object Array]'||streamType=='[object ArrayBuffer]'||streamType=='[object String]')){if(self.console)console.log('meSpeak: Can\'t play, not an Array, or ArrayBuffer, or base64-String: '+streamType);if(callback)callback(false);return 0;}
70395 if(relVolume!==undefined){relVolume=parseFloat(relVolume);if(isNaN(relVolume)||relVolume<0||relVolume>1)relVolume=undefined;}
70396 if(AudioAPI){if(streamType=='[object String]'){if(stream.indexOf('data:audio/x-wav;base64,',0)==0)stream=stream.substring(24);stream=stream.replace(/=+$/,'');if(stream.match(/[^A-Za-z0-9\+\/]/)){if(self.console)console.log('meSpeak: Can\'t play, not a proper base64-String.');if(callback)callback(false);return 0;}
70397 stream=decodeBase64ToArray(stream);if(!stream.length){if(self.console)console.log('meSpeak: Can\'t play, empty sound data.');if(callback)callback(false);return 0;}
70398 streamType='[object Array]';}
70399 var buffer;if(streamType=='[object Array]'){var buffer=new ArrayBuffer(stream.length);new Uint8Array(buffer).set(stream);}
70400 else{buffer=stream;}
70401 return playWebSound(buffer,relVolume,callback,_id);}
70402 else if(canPlay){var isDataUrl=false;if(streamType=='[object String]'){if(stream.indexOf('data:audio/x-wav;base64,',0)<0){if(stream.match(/[^A-Za-z0-9\+\/]/)){if(self.console)console.log('meSpeak: Can\'t play, not a proper base64-String.');if(callback)callback(false);return 0;}
70403 stream='data:audio/x-wav;base64,'+stream;}
70404 isDataUrl=true;}
70405 else if(streamType=='[object ArrayBuffer]'){stream=new Uint8Array(stream);}
70406 return(new AudioPlayback(stream,relVolume,isDataUrl,callback,_id).started)?_id.number:0;}
70407 else{if(self.console)console.log('meSpeak: Can\'t play; No audio support.');if(callback)callback(false);return 0;}}
70408 function stopSound(){var id,i,k,kl,l,item,n,stopped=0;if(arguments.length>0){for(i=0,l=arguments.length;i<l;i++){n=parseInt(arguments[i]);if(n&&!isNaN(n)){id=n.toString(16);if(audioPool[id]){audioPool[id].stop();stopped++;}
70409 else if(webSoundPool[id]){stopWebSound(webSoundPool[id]);stopped++;}
70410 else{for(k=0,kl=speakQueue.length;k<kl;k++){item=speakQueue[i];if(item[3].string===id){if(!unloading&&typeof item[2]=='function')item[2](false);speakQueue.splice(k,1);stopped++;break;}}}}}}
70411 else{for(id in audioPool){audioPool[id].stop();stopped++;}
70412 for(id in webSoundPool){stopWebSound(webSoundPool[id]);stopped++;}
70413 for(i=0,l=speakQueue.length;i<l;i++){item=speakQueue[i];if(!unloading&&typeof item[2]=='function')item[2](false);stopped++;}
70414 speakQueue.length=0;}
70415 return stopped;}
70416 function setVolume(vol){var id,i,l,n,v;v=parseFloat(vol);if(!isNaN(v)&&v>=0&&v<=1&&v!=playbackVolume){if(arguments.length==1)playbackVolume=v;if(AudioAPI){if(arguments.length>1){for(i=0,l=arguments.length;i<l;i++){n=parseInt(arguments[i]);if(n&&!isNaN(n)){id=n.toString(16);if(webSoundPool[id])setWebSoundVolume(webSoundPool[id],v);}}}
70417 else if(masterGain){masterGain.gain.value=playbackVolume;}}
70418 else if(canPlay){if(arguments.length>1){for(i=0,l=arguments.length;i<l;i++){n=parseInt(arguments[i]);if(n&&!isNaN(n)){id=n.toString(16);if(audioPool[id])audioPool[id].setVolume(v);}}}
70419 else{for(id in audioPool)audioPool[id].adjustVolume();}}}
70420 return vol;}
70421 function getVolume(){if(arguments.length){var n=parseInt(arguments[0]);if(n&&!isNaN(n)){var id=n.toString(16);if(webSoundPool[id])return webSoundPool[id].relVolume;if(audioPool[id])return audioPool[id].relVolume;}
70422 return undefined;}
70423 else{return playbackVolume;}}
70424 function resolveAudioApi(){if(self.AudioContext){AudioAPI=self.AudioContext;canPlay=true;return;}
70425 else{var vendors=['webkit','moz','o','ms'];for(var i=0;i<vendors.length;i++){var api=self[vendors[i]+'AudioContext'];if(api){AudioAPI=api;canPlay=true;return;}}}
70426 if(!AudioAPI){var audioElement=document.createElement('audio');if(audioElement&&audioElement.canPlayType&&(audioElement.canPlayType('audio/wav')||audioElement.canPlayType('audio/x-wav'))){canPlay=true;}
70427 else{canPlay=false;if(self.console)console.log('meSpeak: Muted. No support for HTMLAudioElement with MIME "audio/x-wav" dected.');}}}
70428 resolveAudioApi();function canPlaybackWav(){return canPlay;}
70429 function AudioPlayback(stream,relVolume,isDataUrl,callback,id){this.relVolume=relVolume;this.audio=null;this.id=id.string;this.callback=(typeof callback=='function')?callback:undefined;this.playing=false;this.started=false;this.play(stream,isDataUrl);}
70430 AudioPlayback.prototype={play:function(stream,isDataUrl){try{audioPool[this.id]=this;this.audio=document.createElement('audio');this.adjustVolume();var that=this;this.audio.addEventListener('ended',function(){that.remove();},false);this.audio.addEventListener('canplaythrough',function(){that.audio.play();that.playing=true;},false);if(isDataUrl){this.audio.src=stream;}
70431 else{this.audio.src='data:audio/x-wav;base64,'+encode64(stream);}
70432 this.audio.load();this.started=true;}
70433 catch(e){if(self.console)console.log('meSpeak: HTMLAudioElement Exception: '+e.message);this.started=false;this.remove();}},adjustVolume:function(){this.audio.volume=(this.relVolume!==undefined)?this.relVolume*playbackVolume:playbackVolume;},setVolume:function(v){this.relVolume=v;this.adjustVolume();},remove:function(stopped){if(this.id)delete audioPool[this.id];if(this.callback){var f=this.callback;this.callback=undefined;if(!unloading)f(!stopped);}},stop:function(){try{if(this.playing)this.audio.pause();}
70434 catch(e){}
70435 this.remove(true);}};function playWebSound(stream,volume,callback,id){try{var source,gainNode,timer,relVolume;if(!audioContext)audioContext=new AudioAPI();if(!masterGain){masterGain=(audioContext.createGain)?audioContext.createGain():audioContext.createGainNode();masterGain.connect(audioContext.destination);masterGain.gain.value=playbackVolume;}
70436 source=audioContext.createBufferSource();relVolume=parseFloat(volume);if(relVolume===undefined||isNaN(relVolume)||relVolume<0||relVolume>1)relVolume=1;gainNode=(audioContext.createGain)?audioContext.createGain():audioContext.createGainNode();gainNode.connect(masterGain);gainNode.gain.value=relVolume;source.connect(gainNode);audioContext.decodeAudioData(stream,function(audioData){var f=function(){webSoundEndHandler(source,gainNode,callback,true,id.string);};if(!isChrome&&source.onended!==undefined){source.onended=f;}
70437 else{var duration=audioData.duration;setTimeout(f,duration?Math.ceil(duration*1000):10);}
70438 source.buffer=audioData;if(chromeVersion>=32&&source.start)source.start(0);},function(err){console.log('meSpeak: Web Audio Decoding Error: '+((typeof err=='object')?err.message:err));if(timer)clearTimeout(timer);if(source)source.disconnect();if(gainNode)gainNode.disconnect();if(webSoundPool[id.string])delete webSoundPool[id.string];if(!unloading&&typeof callback=='function')callback(false);return 0;});webSoundPool[id.string]={'source':source,'gainNode':gainNode,'callback':callback,'id':id.string,'relVolume':relVolume};if(chromeVersion<32){if(source.start){source.start(0);}
70439 else{source.noteOn(0);}}
70440 return id.number;}
70441 catch(e){if(self.console)console.log('meSpeak: Web Audio Exception: '+e.message);if(timer)clearTimeout(timer);webSoundEndHandler(source,gainNode,callback,false,id.string);return 0;}}
70442 function webSoundEndHandler(source,gainNode,callback,success,id){if(!unloading&&typeof callback=='function')callback(success);var f=function(){if(source){if(source.onended!==undefined)source.onended=undefined;source.disconnect();}
70443 if(gainNode)gainNode.disconnect();if(id&&webSoundPool[id])delete webSoundPool[id];};if(!success){f();}
70444 else{setTimeout(f,500);}}
70445 function stopWebSound(obj){try{if(obj.source.stop){obj.source.stop(0);}
70446 else{obj.sourcesource.noteOff(0);}}
70447 catch(e){}
70448 webSoundEndHandler(obj.source,obj.gainNode,obj.callback,false,obj.id);}
70449 function setWebSoundVolume(obj,v){obj.gainNode.gain.value=v;obj.relVolume=v;}
70450 function setDefaultVoice(voice){if(voice&&voicesLoaded[voice])defaultVoice=voice;}
70451 function getDefaultVoice(){return defaultVoice;}
70452 function loadVoice(url,callback){if(url)new HttpRequest(url,voiceRequestCallback,callback);}
70453 function loadConfig(url){if(url)new HttpRequest(url,configDataRequestCallback,null);}
70454 function isVoiceLoaded(voice){return(voicesLoaded[voice])?true:false;}
70455 function isConfigLoaded(){return(configDataLoaded)?true:false;}
70456 function HttpRequest(url,loadCallback,userCallback){var req=this.request=new XMLHttpRequest();this.handler=loadCallback;this.url=url;this.localmode=Boolean(self.location.href.search(/^file:/i)==0);this.userCallback=userCallback;var objref=this;try{req.open('GET',url);req.onreadystatechange=function(){objref.handler();};req.send('');}
70457 catch(e){if(self.console)console.log('Failed to load resource from '+url+': Network error.');if(typeof userCallback=='function')userCallback(false,'network error');this.request=this.handler=this.userCallback=null;}}
70458 function voiceRequestCallback(){var req=this.request;if(req.readyState==4){if(this.localmode||req.status==200){var data=JSON.parse(req.responseText);if(typeof data=='object'&&typeof data.voice_id=='string'&&typeof data.voice=='string'&&(((!data.dict_id&&!data.dict_id)||(typeof data.dict_id=='string'&&typeof data.dict=='string'))||(!data.files||(typeof data.files=='object'&&Array.isArray(data.files))))){setVoiceData(data);if(typeof this.userCallback=='function')this.userCallback(true,data.voice_id);}
70459 else{if(self.console)console.log('Failed to load voice from '+this.url+': Not a voice module.');if(typeof this.userCallback=='function')this.userCallback(false,'data error');}}
70460 else{if(self.console)console.log('Failed to load voice from '+this.url+': Received status '+req.status+'.');if(typeof this.userCallback=='function')this.userCallback(false,'file error');}
70461 this.request=this.handler=this.userCallback=null;}}
70462 function configDataRequestCallback(){var req=this.request;if(req.readyState==4){if(this.localmode||req.status==200){var data=JSON.parse(req.responseText);if(typeof data=='object'&&typeof data.config=='string'&&typeof data.phontab=='string'&&typeof data.phonindex=='string'&&typeof data.phondata=='string'&&typeof data.intonations=='string'){setConfigData(data);}
70463 else{if(self.console)console.log('Failed to load config-data from '+this.url+': No valid data.');}}
70464 else{if(self.console)console.log('Failed to load config-data from '+this.url+': Received status '+req.status+'.');}
70465 this.request=this.handler=this.userCallback=null;}}
70466 function unloadHandler(event){unloading=true;stopSound();audioPool={};webSoundPool={};}
70467 window.addEventListener('unload',unloadHandler,false);return{speak:speak,speakMultipart:speakMultipart,loadConfig:loadConfig,loadVoice:loadVoice,setDefaultVoice:setDefaultVoice,getDefaultVoice:getDefaultVoice,setVolume:setVolume,getVolume:getVolume,play:playSound,isConfigLoaded:isConfigLoaded,isVoiceLoaded:isVoiceLoaded,resetQueue:resetQueue,canPlay:canPlaybackWav,stop:stopSound}})();meSpeak.loadConfig("dbsamples/speechConf.json");
70468 meSpeak.loadVoice("dbsamples/speechVoice.json");
70469 define.unordered = true;define('ripple/db', function (require, exports, module) {
70470 /*
70471  *  Copyright 2011 Research In Motion Limited.
70472  *
70473  * Licensed under the Apache License, Version 2.0 (the "License");
70474  * you may not use this file except in compliance with the License.
70475  * You may obtain a copy of the License at
70476  *
70477  * http://www.apache.org/licenses/LICENSE-2.0
70478  *
70479  * Unless required by applicable law or agreed to in writing, software
70480  * distributed under the License is distributed on an "AS IS" BASIS,
70481  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
70482  * See the License for the specific language governing permissions and
70483  * limitations under the License.
70484  */
70485 var _self,
70486     _db,
70487     utils = require('ripple/utils'),
70488     constants = require('ripple/constants'),
70489     event = require('ripple/event'),
70490     _cache = {};
70491
70492 function _validateAndSetPrefix(prefix) {
70493     if (prefix) {
70494         utils.validateArgumentType(prefix, "string");
70495     }
70496
70497     return prefix || constants.COMMON.PREFIX;
70498 }
70499
70500 function _createKey(key, prefix) {
70501     return _validateAndSetPrefix(prefix) + key;
70502 }
70503
70504 function _createItem(key, value, prefix) {
70505     return {
70506         id: _createKey(key, prefix),
70507         key: key,
70508         value: value,
70509         prefix: _validateAndSetPrefix(prefix)
70510     };
70511 }
70512
70513 function _save(key, value, prefix, callback) {
70514     var item = _createItem(key, value, prefix);
70515     _cache[item.id] = item;
70516
70517     _db.transaction(function (tx) {
70518         tx.executeSql('REPLACE INTO persistence (id, key, value, prefix) VALUES (?, ?, ?, ?)', [item.id, item.key, item.value, item.prefix], function () {
70519             return callback && callback();
70520         });
70521     });
70522 }
70523
70524 function _retrieve(key, prefix) {
70525     var item = _cache[_createKey(key, prefix)];
70526     return item ? item.value : undefined;
70527 }
70528
70529 function _retrieveAll(prefix, callback) {
70530     var result = {};
70531
70532     if (prefix) {
70533         utils.forEach(_cache, function (value, key) {
70534             if (value.prefix === prefix) {
70535                 result[value.key] = value.value;
70536             }
70537         });
70538     }
70539
70540     callback.apply(null, [result]);
70541 }
70542
70543 function _remove(key, prefix, callback) {
70544     delete _cache[_createKey(key, prefix)];
70545
70546     _db.transaction(function (tx) {
70547         tx.executeSql('DELETE FROM persistence WHERE key = ? AND prefix = ?', [key, _validateAndSetPrefix(prefix)], function () {
70548             return callback && callback();
70549         });
70550     });
70551 }
70552
70553 function _removeAll(prefix, callback) {
70554     utils.forEach(_cache, function (value, key) {
70555         if (!prefix || key.indexOf(prefix) === 0) {
70556             delete _cache[key];
70557         }
70558     });
70559
70560     _db.transaction(function (tx) {
70561         if (prefix) {
70562             tx.executeSql('DELETE FROM persistence WHERE prefix = ?', [prefix], function () {
70563                 return callback && callback();
70564             });
70565         } else {
70566             tx.executeSql('DELETE FROM persistence', [], function () {
70567                 return callback && callback();
70568             });
70569         }
70570     });
70571 }
70572
70573 _self = {
70574     save: function (key, value, prefix, callback) {
70575         _save(key, value, prefix, callback);
70576         event.trigger("StorageUpdatedEvent");
70577     },
70578
70579     saveObject: function (key, obj, prefix, callback) {
70580         _save(key, JSON.stringify(obj), prefix, callback);
70581         event.trigger("StorageUpdatedEvent");
70582     },
70583
70584     retrieve: function (key, prefix) {
70585         return _retrieve(key, prefix);
70586     },
70587
70588     retrieveObject: function (key, prefix) {
70589         var retrievedValue = _retrieve(key, prefix);
70590         return retrievedValue ? JSON.parse(retrievedValue) : retrievedValue;
70591     },
70592
70593     retrieveAll: function (prefix, callback) {
70594         return _retrieveAll(prefix, callback);
70595     },
70596
70597     remove: function (key, prefix, callback) {
70598         event.trigger("StorageUpdatedEvent");
70599         _remove(key, prefix, callback);
70600     },
70601
70602     removeAll: function (prefix, callback) {
70603         _removeAll(prefix, callback);
70604         event.trigger("StorageUpdatedEvent");
70605     },
70606
70607     initialize: function (previous, baton) {
70608         baton.take();
70609
70610         _db = openDatabase('tinyHippos', '1.0', 'tiny Hippos persistence', 2 * 1024 * 1024);
70611         _db.transaction(function (tx) {
70612             tx.executeSql('CREATE TABLE IF NOT EXISTS persistence (id unique, key, value, prefix)');
70613
70614             tx.executeSql('SELECT id, key, value, prefix FROM persistence', [], function (tx, results) {
70615                 var len = results.rows.length, i, item;
70616
70617                 for (i = 0; i < len; i++) {
70618                     item = results.rows.item(i);
70619                     _cache[item.id] = item;
70620                 }
70621
70622                 baton.pass();
70623             });
70624         });
70625     }
70626 };
70627
70628 module.exports = _self;
70629
70630 });
70631 define('ripple/fileSystem', function (require, exports, module) {
70632 /*
70633  *  Copyright 2011 Research In Motion Limited.
70634  *
70635  * Licensed under the Apache License, Version 2.0 (the "License");
70636  * you may not use this file except in compliance with the License.
70637  * You may obtain a copy of the License at
70638  *
70639  * http://www.apache.org/licenses/LICENSE-2.0
70640  *
70641  * Unless required by applicable law or agreed to in writing, software
70642  * distributed under the License is distributed on an "AS IS" BASIS,
70643  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
70644  * See the License for the specific language governing permissions and
70645  * limitations under the License.
70646  */
70647 var constants = require('ripple/constants'),
70648     db = require('ripple/db'),
70649     exception = require('ripple/exception'),
70650     event = require('ripple/event'),
70651     _console = require('ripple/console'),
70652     utils = require('ripple/utils'),
70653     _fileSystemPaths = {
70654         "photos": { "uri": "" },
70655         "videos": { "uri": "" },
70656         "music": { "uri": "" },
70657         "downloads": { "uri": "" },
70658         "widgethome": { "uri": "" }
70659     },
70660     _fileSystemRegex = {
70661         "photos": { "virtualPathRegex": /^\/virtual\/photos\//i },
70662         "videos": { "virtualPathRegex": /^\/virtual\/videos\//i },
70663         "music": { "virtualPathRegex": /^\/virtual\/music\//i },
70664         "downloads": { "virtualPathRegex": /^\/virtual\/downloads\//i },
70665         "widgethome": { "virtualPathRegex": /^\/virtual\/widgethome\//i }
70666     },
70667     _overrides = {};
70668
70669 module.exports = {
70670     initialize: function () {
70671         _fileSystemPaths = db.retrieveObject(constants.FILESYSTEM.PERSISTENCE_KEY) || _fileSystemPaths;
70672         _fileSystemPaths.widgethome.uri = window.location.protocol + "//" + window.location.host + window.location.pathname.substring(0, window.location.pathname.lastIndexOf('/') + 1);
70673     },
70674
70675     getURI: function getURI(origURI) {
70676         var newURI = origURI,
70677             found = false;
70678
70679         if (_overrides[origURI]) {
70680             return _overrides[origURI];
70681         }
70682
70683         utils.forEach(_fileSystemPaths, function (value, key) {
70684             if (found) {
70685                 return;
70686             }
70687
70688             var uri = value.uri.replace(/\/$/, "");
70689             if (origURI.match(_fileSystemRegex[key].virtualPathRegex)) {
70690                 newURI = origURI.replace(_fileSystemRegex[key].virtualPathRegex, uri + "/");
70691                 found = true;
70692             }
70693         });
70694
70695         return newURI;
70696     },
70697
70698     exists: function (path) {
70699         try {
70700             var scrubbedUri = this.getURI(path),
70701                 xhr = new XMLHttpRequest();
70702
70703             xhr.open("GET", scrubbedUri, false);
70704             xhr.send();
70705
70706             //HACK: this should return maybe for 403
70707             return xhr.status !== 404;
70708         }
70709         catch (e) {
70710             exception.handle(e);
70711             _console.log("failed to check if [" + path + "] exists");
70712             return false;
70713         }
70714     },
70715
70716
70717     getFileSystemPaths: function getFileSystemPaths() {
70718         return utils.copy(_fileSystemPaths);
70719     },
70720
70721     updateFileSystemPaths: function updateFileSystemPaths(filePathsObject) {
70722         _fileSystemPaths = utils.copy(filePathsObject);
70723         _fileSystemPaths.widgethome.uri = window.location.protocol + "//" + window.location.host + window.location.pathname;
70724         db.saveObject(constants.FILESYSTEM.PERSISTENCE_KEY, filePathsObject);
70725     },
70726
70727     override : function (from, to) {
70728         _overrides[from] = to;
70729     }
70730 };
70731
70732 });
70733 define('ripple/notifications', function (require, exports, module) {
70734 /*
70735  *  Copyright 2011 Research In Motion Limited.
70736  *
70737  * Licensed under the Apache License, Version 2.0 (the "License");
70738  * you may not use this file except in compliance with the License.
70739  * You may obtain a copy of the License at
70740  *
70741  * http://www.apache.org/licenses/LICENSE-2.0
70742  *
70743  * Unless required by applicable law or agreed to in writing, software
70744  * distributed under the License is distributed on an "AS IS" BASIS,
70745  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
70746  * See the License for the specific language governing permissions and
70747  * limitations under the License.
70748  */
70749 var constants = require('ripple/constants'),
70750     exception = require('ripple/exception'),
70751     utils = require('ripple/utils'),
70752     event = require('ripple/event');
70753
70754 function _validateAndInitNType(nType) {
70755     nType = nType || "normal";
70756
70757     if (nType !== "normal" && nType !== "error") {
70758         exception.raise(exception.types.NotificationType, "Unknown Notification Type == " + nType + ",when dealing with Console notification.");
70759     }
70760
70761     return nType;
70762 }
70763
70764 function _processNotification(nType, stateType, message) {
70765     nType = _validateAndInitNType(nType);
70766     message = message || "";
70767
70768     var display,
70769         displayText,
70770         className,
70771         notificationIcon,
70772         box = document.getElementById(constants.NOTIFICATIONS.MAIN_CONTAINER_CLASS),
70773         msgBox = document.getElementById(constants.NOTIFICATIONS.MESSAGE_TEXT_CONTAINER_CLASS);
70774
70775     className = "ui-widget";
70776
70777     switch (stateType) {
70778
70779     case constants.NOTIFICATIONS.STATE_TYPES.CLOSE:
70780         display = "display: none;"; //need to do this better.
70781         displayText = "";
70782         break;
70783
70784     case constants.NOTIFICATIONS.STATE_TYPES.OPEN:
70785         display = "display: block;"; //need to do this better.
70786         displayText = message;
70787         if (nType === "error") {
70788             displayText = "Oh Snap!\n\n" + displayText;
70789             className += " ui-state-error ui-corner-all";
70790             notificationIcon = '<span class="ui-icon ui-icon-alert" style="float: left; margin-right: .3em;"></span>';
70791         }
70792         else {
70793             className += " ui-state-highlight ui-corner-all";
70794             notificationIcon = '<span class="ui-icon ui-icon-info" style="float: left; margin-right: .3em;"></span>';
70795         }
70796         break;
70797
70798     default:
70799         exception.raise(exception.types.NotificationStateType, "Unknown StateType == " + stateType.toString());
70800     }
70801
70802     msgBox.innerHTML = notificationIcon + displayText;
70803     box.setAttribute("class", className);
70804     box.setAttribute("style", display);
70805
70806 }
70807
70808 module.exports = {
70809     openNotification: function (nType, msg) {
70810         _processNotification(nType, constants.NOTIFICATIONS.STATE_TYPES.OPEN, msg);
70811     },
70812
70813     closeNotification: function (nType) {
70814         _processNotification(nType, constants.NOTIFICATIONS.STATE_TYPES.CLOSE);
70815     }
70816 };
70817
70818 });
70819 define('ripple/exception', function (require, exports, module) {
70820 /*
70821  *  Copyright 2011 Research In Motion Limited.
70822  *
70823  * Licensed under the Apache License, Version 2.0 (the "License");
70824  * you may not use this file except in compliance with the License.
70825  * You may obtain a copy of the License at
70826  *
70827  * http://www.apache.org/licenses/LICENSE-2.0
70828  *
70829  * Unless required by applicable law or agreed to in writing, software
70830  * distributed under the License is distributed on an "AS IS" BASIS,
70831  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
70832  * See the License for the specific language governing permissions and
70833  * limitations under the License.
70834  */
70835 var _console = require('ripple/console');
70836
70837 function _getStack(depth) {
70838     var caller,
70839         stack = "",
70840         count = 0;
70841
70842     try {
70843         caller = arguments.callee.caller.arguments.callee.caller;
70844
70845         while (count <= depth && caller) {
70846             stack += "function: " + caller.toString().match(/function\s?(.*)\{/)[1] + "\n";
70847             caller = caller.arguments.callee.caller;
70848             count++;
70849         }
70850     } catch (e) {
70851         stack = "failed to determine stack trace (" + (e.name || e.type) + " :: " + e.message + ")";
70852     }
70853
70854     return stack;
70855 }
70856
70857 module.exports = {
70858
70859     types: {
70860         Application: "Application",
70861         ArgumentLength: "ArgumentLength",
70862         ArgumentType: "ArgumentType",
70863         Argument: "Argument",
70864         NotificationType: "NotificationType",
70865         NotificationStateType: "NotificationStateType",
70866         DomObjectNotFound: "DomObjectNotFound",
70867         LayoutType: "LayoutType",
70868         OrientationType: "OrientationType",
70869         DeviceNotFound: "DeviceNotFound",
70870         tinyHipposMaskedException: "tinyHipposMaskedException",
70871         Geo: "Geo",
70872         Accelerometer: "Accelerometer",
70873         MethodNotImplemented: "MethodNotImplemented",
70874         InvalidState: "InvalidState",
70875         ApplicationState: "ApplicationState"
70876     },
70877
70878     handle: function handle(exception, reThrow) {
70879         reThrow = reThrow || false;
70880
70881         var eMsg = exception.message || "exception caught!",
70882         msg = eMsg + "\n\n" + (exception.stack || "*no stack provided*") + "\n\n";
70883
70884         _console.error(msg);
70885
70886         if (reThrow) {
70887             throw exception;
70888         }
70889     },
70890
70891     raise: function raise(exceptionType, message, customExceptionObject) {
70892         var obj = customExceptionObject || {
70893                 type: "",
70894                 message: "",
70895
70896                 toString: function () {
70897                     var result = this.name + ': "' + this.message + '"';
70898
70899                     if (this.stack) {
70900                         result += "\n" + this.stack;
70901                     }
70902                     return result;
70903                 }
70904             };
70905
70906         message = message || "";
70907
70908         obj.name = exceptionType;
70909         obj.type = exceptionType;
70910         // TODO: include the exception objects original message if exists
70911         obj.message = message;
70912         obj.stack = _getStack(5);
70913
70914         throw obj;
70915     },
70916
70917     throwMaskedException: function throwMaskedException(exceptionType, message, customExceptionObject) {
70918         try {
70919             this.raise.apply(this, arguments);
70920         } catch (e) {
70921             this.handle(e);
70922         }
70923         this.raise(this.types.tinyHipposMaskedException, "tinyhippos terminated your script due to exception");
70924     }
70925
70926 };
70927
70928 });
70929 define('ripple/widgetConfig', function (require, exports, module) {
70930 /*
70931  *  Copyright 2011 Research In Motion Limited.
70932  *
70933  * Licensed under the Apache License, Version 2.0 (the "License");
70934  * you may not use this file except in compliance with the License.
70935  * You may obtain a copy of the License at
70936  *
70937  * http://www.apache.org/licenses/LICENSE-2.0
70938  *
70939  * Unless required by applicable law or agreed to in writing, software
70940  * distributed under the License is distributed on an "AS IS" BASIS,
70941  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
70942  * See the License for the specific language governing permissions and
70943  * limitations under the License.
70944  */
70945 var exception = require('ripple/exception'),
70946     event = require('ripple/event'),
70947     app = require('ripple/app'),
70948     _console = require('ripple/console'),
70949     utils = require('ripple/utils'),
70950     platform = require('ripple/platform'),
70951     _validationResult = {
70952         valid: false,
70953         message: "",
70954         value: null
70955     },
70956     _configValidationResults = null;
70957
70958 function _failNodeValidation(schemaNode, message, value, node) {
70959     var validationResult = utils.copy(_validationResult);
70960
70961     if (!schemaNode.validationResult) {
70962         schemaNode.validationResult = [];
70963     }
70964     validationResult.valid = false;
70965     if (value) {
70966         validationResult.value = value;
70967     }
70968     else {
70969         delete(validationResult.value);
70970     }
70971     validationResult.message = schemaNode.nodeName + message;
70972     validationResult.node = node;
70973
70974     schemaNode.validationResult.push(validationResult);
70975 }
70976
70977 function _createEmptyNodeValidation(node) {
70978
70979     var validationResult = utils.copy(_validationResult),
70980         attributeValidationResult, attribute;
70981
70982     if (!node.validationResult) {
70983         node.validationResult = [];
70984     }
70985
70986     validationResult.value = "";
70987     delete(validationResult.valid);
70988     delete(validationResult.message);
70989
70990     if (node.attributes) {
70991         for (attribute in node.attributes) {
70992             if (node.attributes.hasOwnProperty(attribute)) {
70993                 if (!validationResult.attributes) {
70994                     validationResult.attributes = {};
70995                 }
70996
70997                 attributeValidationResult = utils.copy(_validationResult);
70998
70999                 attributeValidationResult.attributeName = node.attributes[attribute].attributeName;
71000                 delete(attributeValidationResult.value);
71001                 delete(attributeValidationResult.valid);
71002                 delete(attributeValidationResult.message);
71003
71004                 validationResult.attributes[attributeValidationResult.attributeName] = attributeValidationResult;
71005             }
71006         }
71007     }
71008
71009     node.validationResult.push(validationResult);
71010 }
71011
71012 function _validateValue(valueToTest, schemaNode) {
71013     var failMessage = "",
71014         nodeValue,
71015         numbers,
71016         numberRangeIndex,
71017         numberRange,
71018         range1,
71019         range2;
71020
71021     switch (schemaNode.type) {
71022     case "string":
71023         if (typeof valueToTest !== "string") {
71024             failMessage = " value was expected to be of type string but was typeof: " + typeof(valueToTest);
71025         }
71026         break;
71027     case "number":
71028         nodeValue = parseFloat(valueToTest);
71029         if (isNaN(nodeValue)) {
71030             failMessage = " value was expected to be of type number but was typeof: " + typeof(valueToTest);
71031         }
71032         break;
71033     case "integer":
71034         nodeValue = parseInt(valueToTest, 10);
71035         if (isNaN(nodeValue)) {
71036             failMessage = " value was expected to be of type number but was typeof: " + typeof(valueToTest);
71037         }
71038         break;
71039     case "boolean":
71040         if (valueToTest !== "false" && valueToTest !== "true") {
71041             failMessage = " value was expected to be of type boolean (i.e. 'true' or 'false' but was: " + valueToTest;
71042         }
71043         break;
71044     case "list":
71045         if (!utils.arrayContains(schemaNode.listValues, valueToTest)) {
71046             failMessage = " value is not recognized as being valid, it was:<br/><br/><span class=\"ui-text-fail\">" + valueToTest +
71047                     "</span><br/><br/>Valid values are:<p class=\"ui-text-pass\">" + schemaNode.listValues.join(" <br/> ") + "</p>";
71048         }
71049         break;
71050     case "listBoolean":
71051     case "listDefault":
71052         if (!utils.arrayContains(schemaNode.listValues, valueToTest)) {
71053             failMessage = " value is not recognized as being valid, it was:<br/><br/><span class=\"ui-text-fail\">" + valueToTest +
71054                     "</span><br/><br/>The framework will assume the value to be:<p class=\"ui-text-pass\">" + schemaNode.defaultValue + "</p>";
71055         }
71056         break;
71057     case "listNumbers":
71058         numbers = valueToTest.split(",");
71059
71060         for (numberRangeIndex = 0; numberRangeIndex < numbers.length; numberRangeIndex++) {
71061             numberRange = valueToTest.split("-");
71062             if (numberRange.length > 1) {
71063                 range1 = parseInt(numberRange[0], 10);
71064                 range2 = parseInt(numberRange[1], 10);
71065                 if (isNaN(range1) || isNaN(range2)) {
71066                     failMessage = " range values where not recognized as being valid, they was: " + range1 +
71067                             " and " + range2 + " :: valid values should be of type 'integer'";
71068                     break;
71069                 }
71070             }
71071             else if (numberRange.length === 1) {
71072                 range1 = parseInt(numberRange[0], 10);
71073                 if (isNaN(range1)) {
71074                     failMessage = " value was not recognized as being valid, it was: " + range1 +
71075                             " :: valid values should be of type 'integer'";
71076                     break;
71077                 }
71078             }
71079         }
71080         break;
71081     case "regex":
71082         if (!valueToTest.match(schemaNode.regex)) {
71083             failMessage = " value does not match expected format. Value should pass this regular expression validation: " + schemaNode.regex;
71084         }
71085         break;
71086     case "iso-language":
71087         break;
71088     default:
71089         exception.raise(exception.types.Application, "Schema node with value type of: " + schemaNode.type + " is not known");
71090     }
71091
71092     return failMessage;
71093 }
71094
71095 function _passNodeValidation(schemaNode, value, node) {
71096     var validationResult = utils.copy(_validationResult);
71097
71098     if (!schemaNode.validationResult) {
71099         schemaNode.validationResult = [];
71100     }
71101     validationResult.valid = true;
71102     validationResult.node = node;
71103     if (value) {
71104         validationResult.value = value;
71105     }
71106     else {
71107         delete(validationResult.value);
71108     }
71109     delete(validationResult.message);
71110
71111     schemaNode.validationResult.push(validationResult);
71112 }
71113
71114 function _validateNodeValue(schemaNode, node) {
71115     var failMessage,
71116         valueToTest = node && node.nodeValue ? node.nodeValue.replace(/^\s\s*/, '').replace(/\s\s*$/, '') : null;
71117
71118     if (schemaNode.type && valueToTest) {
71119
71120         failMessage = _validateValue(valueToTest, schemaNode);
71121
71122         if (failMessage !== "") {
71123             _failNodeValidation(schemaNode, failMessage, valueToTest, node);
71124             return;
71125         }
71126     }
71127     _passNodeValidation(schemaNode, valueToTest, node);
71128 }
71129
71130 function _failNodeAttributeValidation(node, attribute, message, value) {
71131     var nodeValidationResult = node.validationResult ? node.validationResult.pop() : utils.copy(_validationResult),
71132         attributeValidationResult = utils.copy(_validationResult);
71133
71134     if (!nodeValidationResult.attributes) {
71135         nodeValidationResult.attributes = {};
71136     }
71137
71138     nodeValidationResult.valid = false;
71139     nodeValidationResult.message = "One or more attributes failed validation";
71140
71141     attributeValidationResult.attributeName = attribute.attributeName;
71142     attributeValidationResult.valid = false;
71143     if (value) {
71144         attributeValidationResult.value = value;
71145     }
71146     else {
71147         delete(attributeValidationResult.value);
71148     }
71149     attributeValidationResult.message = node.nodeName + "." + attribute.attributeName + message;
71150
71151     nodeValidationResult.attributes[attribute.attributeName] = attributeValidationResult;
71152     node.validationResult.push(nodeValidationResult);
71153 }
71154
71155 function _passNodeAttributeValidation(node, attribute, value) {
71156     var nodeValidationResult = node.validationResult ? node.validationResult.pop() : utils.copy(_validationResult),
71157         attributeValidationResult = utils.copy(_validationResult);
71158
71159     if (!nodeValidationResult.attributes) {
71160         nodeValidationResult.attributes = {};
71161     }
71162
71163     attributeValidationResult.attributeName = attribute.attributeName;
71164     attributeValidationResult.valid = true;
71165     if (value) {
71166         attributeValidationResult.value = value;
71167     }
71168     else {
71169         delete(attributeValidationResult.value);
71170     }
71171     delete(attributeValidationResult.message);
71172
71173     nodeValidationResult.attributes[attribute.attributeName] = attributeValidationResult;
71174     node.validationResult.push(nodeValidationResult);
71175 }
71176
71177 function _validateNodeAttributeValue(schemaNode, schemaNodeAttribute, attribute) {
71178     var failMessage,
71179         valueToTest = attribute ? attribute.value.replace(/^\s\s*/, '').replace(/\s\s*$/, '') : null;
71180
71181     if (schemaNodeAttribute.type && valueToTest) {
71182
71183         failMessage = _validateValue(valueToTest, schemaNodeAttribute);
71184
71185         if (failMessage !== "") {
71186             _failNodeAttributeValidation(schemaNode, schemaNodeAttribute, failMessage, valueToTest);
71187             return;
71188         }
71189     }
71190     _passNodeAttributeValidation(schemaNode, schemaNodeAttribute, valueToTest);
71191 }
71192
71193 function _validateNodeAttributes(schemaNode, node, children) {
71194
71195     var siblings = utils.filter(children, function (child) {
71196             return child !== node;
71197         }),
71198         attributeConverter = function (attribute) {
71199             var _self = {
71200                 toValue: function (n) {
71201                     var obj = _self.toNode(n);
71202                     return obj ? obj.value : null;
71203                 },
71204                 toNode: function (n) {
71205                     return n.attributes.getNamedItem(attribute.attributeName);
71206                 }
71207             };
71208
71209             return _self;
71210         };
71211
71212     utils.forEach(schemaNode.attributes, function (attribute) {
71213
71214         var convert = attributeConverter(attribute),
71215             dupe = false;
71216
71217         if (attribute.unique) {
71218             // this means we need to check and see if there are other node with the same name
71219             // and ensure that they have a different value for this attributes, if not... fail
71220
71221             dupe = siblings.some(function (sibling) {
71222                 return convert.toValue(sibling) === convert.toValue(node);
71223             });
71224
71225             if (dupe) {
71226                 _failNodeAttributeValidation(schemaNode,
71227                         attribute,
71228                         " node is allowed to appear multiple times, however it must be unique based on this attribute and in this case another node with an identical attribute vale was found",
71229                         convert.toValue(node));
71230                 return;
71231             }
71232         }
71233
71234         if (attribute.required && !convert.toValue(node)) {
71235             _failNodeAttributeValidation(schemaNode, attribute, " attribute was expected but not found", null);
71236         }
71237         else {
71238             _validateNodeAttributeValue(schemaNode, attribute, convert.toNode(node));
71239         }
71240     });
71241 }
71242
71243
71244 function _validateNode(schemaNode, parentNode) {
71245     var children = utils.filter(parentNode.childNodes, function (child) {
71246         return child && child.nodeName === schemaNode.nodeName;
71247     });
71248
71249     if (children.length === 0) {
71250         if (schemaNode.required) {
71251             _failNodeValidation(schemaNode, " node expected, but not found", null, null);
71252         }
71253     }
71254
71255     utils.forEach(children, function (child) {
71256         if (schemaNode.occurrence !== 0 && schemaNode.occurrence < children.length) {
71257             _failNodeValidation(schemaNode, " node: more then " + schemaNode.occurrence + " node(s) found", null, child);
71258         }
71259         else {
71260             _validateNodeValue(schemaNode, child.childNodes[0] || child);
71261
71262             _validateNodeAttributes(schemaNode, child, children);
71263         }
71264
71265         utils.forEach(schemaNode.children, function (schema) {
71266             _validateNode(schema, child);
71267         });
71268     });
71269 }
71270
71271 function _validateAgainstSchemaNode(configSchema, configXML) {
71272     var results = utils.copy(configSchema);
71273     try {
71274         _validateNode(results[configSchema.rootElement], configXML);
71275     }
71276     catch (e) {
71277         exception.handle(e, true);
71278     }
71279
71280     return results;
71281 }
71282
71283 function _validate(configXML) {
71284     // traverse the config schema JSON object
71285     // TODO: update to get platform.getPlatformConfigSpec().schema
71286     return _validateAgainstSchemaNode(platform.current().config.schema, configXML);
71287 }
71288
71289 function _process(results) {
71290     // Check to make sure that widget is the correct version (i.e. config.xml needs to match selected platform)
71291     var validVersion = app.validateVersion(results);
71292
71293     if (!validVersion) {
71294         _console.warn("Your application does not appear to match" +
71295                 " the platform you have selected. The version number in your configuration might not " +
71296                 "match the selected platform version or your configuration file has errors in it.");
71297     }
71298
71299     // save widget info
71300     app.saveInfo(results);
71301     event.trigger("WidgetInformationUpdated");
71302
71303     // Check for readonly preferences (WAC only?)
71304
71305     if (app.getInfo().preferences !== {}) {
71306         event.trigger("StorageUpdatedEvent");
71307     }
71308 }
71309
71310 function _xmlToJson(xml) {
71311     var obj = {};
71312
71313     if (xml.nodeType === 1) { // element
71314         if (xml.attributes.length > 0) {
71315             obj["@attributes"] = {};
71316             utils.forEach(xml.attributes, function (attribute) {
71317                 obj["@attributes"][attribute.nodeName] = attribute.nodeValue;
71318             });
71319         }
71320     } 
71321     else if (xml.nodeType === 3) { // text node
71322         obj = xml.nodeValue;
71323     }
71324
71325     if (xml.hasChildNodes && xml.hasChildNodes()) {
71326         utils.forEach(xml.childNodes, function (child) {
71327             if (!child.nodeName) {
71328                 return;
71329             }
71330             if (!obj[child.nodeName]) {
71331                 obj[child.nodeName] = [];
71332             }
71333             obj[child.nodeName].push(_xmlToJson(child));
71334         });
71335     }
71336
71337     return obj;
71338 }
71339
71340 module.exports = {
71341
71342     validate: function (configXML) {
71343         utils.validateNumberOfArguments(1, 1, arguments.length);
71344         return _validate(configXML);
71345     },
71346
71347     initialize: function (previous, baton) {
71348         var xmlHttp = new XMLHttpRequest(),
71349             config = platform.current().config,
71350             fileName = config ? config.fileName : null,
71351             results;
71352
71353         if (!fileName) {
71354             return;
71355         }
71356
71357         try {
71358             xmlHttp.open("GET", utils.appLocation() + fileName, false);
71359             xmlHttp.send();
71360             if (xmlHttp.responseXML) {
71361                 results = _validate(xmlHttp.responseXML);
71362                 results.rawJSON = _xmlToJson(xmlHttp.responseXML);
71363                 _process(results);
71364                 _configValidationResults = results;
71365             }
71366             else {
71367                 _process();
71368                 _configValidationResults = null;
71369                 require('ripple/ui/plugins/widgetConfig').initialize();
71370             }
71371         }
71372         catch (e) {
71373             exception.handle(e);
71374         }
71375     },
71376
71377     getValidationResults: function () {
71378         return _configValidationResults;
71379     }
71380 };
71381
71382 });
71383 define('ripple/devices/PalmPre', function (require, exports, module) {
71384 /*
71385  *  Copyright 2011 Research In Motion Limited.
71386  *
71387  * Licensed under the Apache License, Version 2.0 (the "License");
71388  * you may not use this file except in compliance with the License.
71389  * You may obtain a copy of the License at
71390  *
71391  * http://www.apache.org/licenses/LICENSE-2.0
71392  *
71393  * Unless required by applicable law or agreed to in writing, software
71394  * distributed under the License is distributed on an "AS IS" BASIS,
71395  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
71396  * See the License for the specific language governing permissions and
71397  * limitations under the License.
71398  */
71399 module.exports = {
71400     "id": "PalmPre",
71401     "name": "Palm Pre",
71402     "manufacturer": "Palm",
71403     "model": "Pre",
71404     "osName": "WebOS",
71405     "osVersion": "1.x",
71406
71407     "screen": {
71408         "width": 320,
71409         "height": 480
71410     },
71411     "viewPort": {
71412         "portrait": {
71413             "width": 320,
71414             "height": 480,
71415             "paddingTop": 0,
71416             "paddingLeft": 0
71417         },
71418         "landscape": {
71419             "width": 480,
71420             "height": 320,
71421             "paddingTop": 0,
71422             "paddingLeft": 0
71423         }
71424     },
71425
71426     "ppi": 186.09,
71427     "userAgent": "Mozilla/5.0 (webOS/1.0; U; en-US) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/1.0 Safari/525.27.1 Pre/1.0",
71428     "platforms": ["web", "phonegap"],
71429
71430     "notes": {
71431         "1": "<a href=\"http://www.palm.com/us/products/phones/pre/#tab2\" target=\"_blank\">Specs</a>"
71432     }
71433 };
71434
71435 });
71436 define('ripple/devices/Bold9900', function (require, exports, module) {
71437 /*
71438  *  Copyright 2011 Research In Motion Limited.
71439  *
71440  * Licensed under the Apache License, Version 2.0 (the "License");
71441  * you may not use this file except in compliance with the License.
71442  * You may obtain a copy of the License at
71443  *
71444  * http://www.apache.org/licenses/LICENSE-2.0
71445  *
71446  * Unless required by applicable law or agreed to in writing, software
71447  * distributed under the License is distributed on an "AS IS" BASIS,
71448  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
71449  * See the License for the specific language governing permissions and
71450  * limitations under the License.
71451  */
71452 module.exports = {
71453
71454     "id": "Bold9900",
71455     "name": "BlackBerry Bold 9900",
71456     "model": "9900",
71457     "osName": "BlackBerry OS",
71458     "uuid": "42",
71459     "osVersion": "7",
71460     "manufacturer": "Research In Motion",
71461
71462     "skin": "Bold9900",
71463
71464     "capabilities": [
71465         "input.touch",
71466         "location.gps",
71467         "location.maps",
71468         "media.audio.capture",
71469         "media.video.capture",
71470         "media.recording",
71471         "storage.memorycard",
71472         "network.bluetooth",
71473         "network.wlan",
71474         "network.3gpp"
71475     ],
71476
71477     "screen": {
71478         "width": 640,
71479         "height": 480
71480     },
71481     "viewPort": {
71482         "portrait": {
71483             "width": 640,
71484             "height": 480,
71485             "paddingTop": 0,
71486             "paddingLeft": 0
71487         }
71488     },
71489
71490     "ppi": 287.00,
71491     "userAgent": "Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en) AppleWebKit/534.1+ (KHTML, Like Gecko) Version/7.0.0.141 Mobile Safari/534.1",
71492     "platforms": ["web", "phonegap", "webworks.handset", "cordova"]
71493 };
71494
71495 });
71496 define('ripple/devices/NexusS', function (require, exports, module) {
71497 /*
71498  *  Copyright 2011 Research In Motion Limited.
71499  *
71500  * Licensed under the Apache License, Version 2.0 (the "License");
71501  * you may not use this file except in compliance with the License.
71502  * You may obtain a copy of the License at
71503  *
71504  * http://www.apache.org/licenses/LICENSE-2.0
71505  *
71506  * Unless required by applicable law or agreed to in writing, software
71507  * distributed under the License is distributed on an "AS IS" BASIS,
71508  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
71509  * See the License for the specific language governing permissions and
71510  * limitations under the License.
71511  */
71512 module.exports = {
71513     "id" : "NexusS",
71514     "name": "Nexus S",
71515     "manufacturer": "Samsung",
71516     "model": "Nexux S",
71517     "osName": "Android",
71518     "uuid" : "F54E13F1-C1B7-4212-BFA8-AB3C9C3F088F",
71519     "osVersion": "2.3.x",
71520
71521     "screen": {
71522         "width": 480,
71523         "height": 800
71524     },
71525     "viewPort": {
71526         "portrait": {
71527             "width": 480,
71528             "height": 800,
71529             "paddingTop": 0,
71530             "paddingLeft": 0
71531         },
71532         "landscape": {
71533             "width": 800,
71534             "height": 480,
71535             "paddingTop": 0,
71536             "paddingLeft": 0
71537         }
71538     },
71539
71540     "ppi": 235,
71541     "userAgent": "Mozilla/5.0 (Linux; U; Android 2.3.2; en-us; Nexus S Build/GRH78C) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
71542     "platforms": ["web", "phonegap", "cordova"],
71543
71544     "notes": {
71545         "1": "<a href=\"http://www.google.com/nexus/#/tech-specs\" target=\"_blank\">Specs</a>"
71546     }
71547
71548 };
71549
71550 });
71551 define('ripple/devices/Playbook', function (require, exports, module) {
71552 /*
71553  *  Copyright 2011 Research In Motion Limited.
71554  *
71555  * Licensed under the Apache License, Version 2.0 (the "License");
71556  * you may not use this file except in compliance with the License.
71557  * You may obtain a copy of the License at
71558  *
71559  * http://www.apache.org/licenses/LICENSE-2.0
71560  *
71561  * Unless required by applicable law or agreed to in writing, software
71562  * distributed under the License is distributed on an "AS IS" BASIS,
71563  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
71564  * See the License for the specific language governing permissions and
71565  * limitations under the License.
71566  */
71567 module.exports = {
71568
71569     "id": "Playbook",
71570     "name": "BlackBerry Playbook",
71571     "model": "100669958",
71572     "osName": "BlackBerry PlayBook OS",
71573     "uuid": "42",
71574     "osVersion": "BlackBerry PlayBook OS",
71575     "manufacturer": "Research In Motion",
71576
71577     "skin": "Playbook",
71578
71579     "capabilities": [
71580         "input.touch",
71581         "location.gps",
71582         "media.audio.capture",
71583         "media.video.capture",
71584         "media.recording",
71585         "network.bluetooth",
71586         "network.wlan"
71587     ],
71588
71589     "screen": {
71590         "width": 1024,
71591         "height": 600
71592     },
71593     "viewPort": {
71594         "portrait": {
71595             "width": 1024,
71596             "height": 600,
71597             "paddingTop": 0,
71598             "paddingLeft": 0
71599         },
71600         "landscape": {
71601             "width": 600,
71602             "height": 1024,
71603             "paddingTop": 0,
71604             "paddingLeft": 0
71605         }
71606     },
71607
71608     "defaultOrientation": "landscape",
71609
71610     "ppi": 169.55,
71611     "userAgent": "Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML, like Gecko) Version/7.2.1.0 Safari/536.2+",
71612     "platforms": ["web", "webworks.tablet", "phonegap", "cordova"]
71613 };
71614
71615 });
71616 define('ripple/devices/tizen-WVGA', function (require, exports, module) {
71617 /*
71618  *  Copyright 2011 Research In Motion Limited.
71619  *
71620  * Licensed under the Apache License, Version 2.0 (the "License");
71621  * you may not use this file except in compliance with the License.
71622  * You may obtain a copy of the License at
71623  *
71624  * http://www.apache.org/licenses/LICENSE-2.0
71625  *
71626  * Unless required by applicable law or agreed to in writing, software
71627  * distributed under the License is distributed on an "AS IS" BASIS,
71628  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
71629  * See the License for the specific language governing permissions and
71630  * limitations under the License.
71631  */
71632 module.exports = {
71633     "id": "tizen-WVGA",
71634     "name": "Tizen WVGA (480x800)",
71635     "osName": "Generic",
71636     "osVersion": "Generic",
71637     "manufacturer": "Tizen",
71638     "model": "Generic",
71639     "uuid": "42",
71640
71641     "screen": {
71642         "width": 480,
71643         "height": 800
71644     },
71645     "viewPort": {
71646         "portrait": {
71647             "width": 320,
71648             "height": 534,
71649             "paddingTop": 0,
71650             "paddingLeft": 0
71651         },
71652         "landscape": {
71653             "width": 534,
71654             "height": 320,
71655             "paddingTop": 0,
71656             "paddingLeft": 0
71657         }
71658     },
71659
71660     "ppi": 316,
71661     "browser": ["Generic"],
71662     "platforms": ["web", "phonegap", "tizen", "cordova"],
71663     "userAgent": "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.7 Safari/533.2"
71664 };
71665
71666 });
71667 define('ripple/devices/Pearl9100', function (require, exports, module) {
71668 /*
71669  *  Copyright 2011 Research In Motion Limited.
71670  *
71671  * Licensed under the Apache License, Version 2.0 (the "License");
71672  * you may not use this file except in compliance with the License.
71673  * You may obtain a copy of the License at
71674  *
71675  * http://www.apache.org/licenses/LICENSE-2.0
71676  *
71677  * Unless required by applicable law or agreed to in writing, software
71678  * distributed under the License is distributed on an "AS IS" BASIS,
71679  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
71680  * See the License for the specific language governing permissions and
71681  * limitations under the License.
71682  */
71683 module.exports = {
71684
71685     "id": "Pearl9100",
71686     "name": "BlackBerry Pearl 9100",
71687     "model": "9100",
71688     "osName": "BlackBerry OS",
71689     "uuid": "42",
71690     "osVersion": "6",
71691     "manufacturer": "Research In Motion",
71692
71693     "skin": "Pearl9100",
71694
71695     "capabilities": [
71696         "input.keyboard.issuretype",
71697         "location.gps",
71698         "location.maps",
71699         "media.audio.capture",
71700         "media.video.capture",
71701         "media.recording",
71702         "storage.memorycard",
71703         "network.bluetooth",
71704         "network.wlan",
71705         "network.3gpp"
71706     ],
71707
71708     "screen": {
71709         "width": 360,
71710         "height": 400
71711     },
71712     "viewPort": {
71713         "portrait": {
71714             "width": 360,
71715             "height": 400,
71716             "paddingTop": 0,
71717             "paddingLeft": 0
71718         }
71719     },
71720
71721     "ppi": 239,
71722     "userAgent": "Mozilla/5.0 (BlackBerry; U; BlackBerry 9100; en) AppleWebKit/534.3+ (KHTML, like Gecko) Version/6.0.0.286 Mobile Safari/534.3+",
71723     "platforms": ["web", "phonegap", "webworks.handset"]
71724 };
71725
71726 });
71727 define('ripple/devices/iPhone3', function (require, exports, module) {
71728 /*
71729  *  Copyright 2011 Research In Motion Limited.
71730  *
71731  * Licensed under the Apache License, Version 2.0 (the "License");
71732  * you may not use this file except in compliance with the License.
71733  * You may obtain a copy of the License at
71734  *
71735  * http://www.apache.org/licenses/LICENSE-2.0
71736  *
71737  * Unless required by applicable law or agreed to in writing, software
71738  * distributed under the License is distributed on an "AS IS" BASIS,
71739  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
71740  * See the License for the specific language governing permissions and
71741  * limitations under the License.
71742  */
71743 module.exports = {
71744
71745     "id": "iPhone3",
71746     "name": "iPhone 3G/3Gs/4/4s",
71747     "model": "3G",
71748     "osName": "iPhone",
71749     "osVersion": "3",
71750     "uuid": "e0101010d38bde8e6740011221af335301010333",
71751     "manufacturer": "Apple",
71752
71753     "screen": {
71754         "width": 320,
71755         "height": 480
71756     },
71757     "viewPort": {
71758         "portrait": {
71759             "width": 320,
71760             "height": 480,
71761             "paddingTop": 0,
71762             "paddingLeft": 0
71763         },
71764         "landscape": {
71765             "width": 480,
71766             "height": 320,
71767             "paddingTop": 0,
71768             "paddingLeft": 0
71769         }
71770     },
71771
71772     "ppi": 164.8,
71773     "userAgent": "Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/1A542a Safari/419.3",
71774     "platforms": ["web", "phonegap", "cordova"]
71775 };
71776
71777 });
71778 define('ripple/devices/HD', function (require, exports, module) {
71779 /*
71780  *  Copyright 2012 Intel Corporation
71781  *
71782  * Licensed under the Apache License, Version 2.0 (the "License");
71783  * you may not use this file except in compliance with the License.
71784  * You may obtain a copy of the License at
71785  *
71786  * http://www.apache.org/licenses/LICENSE-2.0
71787  *
71788  * Unless required by applicable law or agreed to in writing, software
71789  * distributed under the License is distributed on an "AS IS" BASIS,
71790  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
71791  * See the License for the specific language governing permissions and
71792  * limitations under the License.
71793  */
71794
71795 module.exports = {
71796     "id": "HD",
71797     "name": "HD (720x1280)",
71798     "osName": "Generic",
71799     "osVersion": "Generic",
71800     "manufacturer": "Generic",
71801     "model": "Generic",
71802     "uuid": "42",
71803     "firmware": "Generic",
71804
71805     "screen": {
71806         "width": 720,
71807         "height": 1280
71808     },
71809     "viewPort": {
71810         "portrait": {
71811             "width": 720,
71812             "height": 1280,
71813             "paddingTop": 0,
71814             "paddingLeft": 0
71815         },
71816         "landscape": {
71817             "width": 1280,
71818             "height": 720,
71819             "paddingTop": 0,
71820             "paddingLeft": 0
71821         }
71822     },
71823
71824     "ppi": 316,
71825     "browser": ["Generic"],
71826     "platforms": ["wac", "web", "phonegap", "tizen", "cordova"],
71827     "userAgent": "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.7 Safari/533.2"
71828 };
71829
71830 });
71831 define('ripple/devices/Tattoo', function (require, exports, module) {
71832 /*
71833  *  Copyright 2011 Research In Motion Limited.
71834  *
71835  * Licensed under the Apache License, Version 2.0 (the "License");
71836  * you may not use this file except in compliance with the License.
71837  * You may obtain a copy of the License at
71838  *
71839  * http://www.apache.org/licenses/LICENSE-2.0
71840  *
71841  * Unless required by applicable law or agreed to in writing, software
71842  * distributed under the License is distributed on an "AS IS" BASIS,
71843  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
71844  * See the License for the specific language governing permissions and
71845  * limitations under the License.
71846  */
71847 module.exports = {
71848     "id": "Tattoo",
71849     "name": "HTC Tattoo",
71850     "manufacturer": "HTC",
71851     "model": "Tattoo",
71852     "osVersion": "1.6",
71853     "uuid": "6F196F23-FD0D-4F62-B27B-730147FCC5A3",
71854     "osName": "Android",
71855
71856     "screen": {
71857         "width": 240,
71858         "height": 320
71859     },
71860     "viewPort": {
71861         "portrait": {
71862             "width": 240,
71863             "height": 320,
71864             "paddingTop": 0,
71865             "paddingLeft": 0
71866         }
71867     },
71868
71869     "ppi": 142.9,
71870     "userAgent": "Mozilla/5.0 (Linux; U; Android 1.6; en-us; HTC_TATTOO_A3288 Build/DRC79) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
71871     "platforms": ["web", "phonegap"]
71872 };
71873
71874 });
71875 define('ripple/devices/custom', function (require, exports, module) {
71876 /*
71877  *  Copyright 2012 Intel Corporation
71878  *
71879  * Licensed under the Apache License, Version 2.0 (the "License");
71880  * you may not use this file except in compliance with the License.
71881  * You may obtain a copy of the License at
71882  *
71883  * http://www.apache.org/licenses/LICENSE-2.0
71884  *
71885  * Unless required by applicable law or agreed to in writing, software
71886  * distributed under the License is distributed on an "AS IS" BASIS,
71887  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
71888  * See the License for the specific language governing permissions and
71889  * limitations under the License.
71890  */
71891
71892 module.exports = {
71893     "id": "CUSTOM",
71894     "name": "Custom",
71895     "osName": "Generic",
71896     "osVersion": "Generic",
71897     "manufacturer": "Generic",
71898     "model": "Generic",
71899     "uuid": "42",
71900     "firmware": "Generic",
71901
71902     "screen": {
71903         "width": 600,
71904         "height": 800
71905     },
71906     "viewPort": {
71907         "portrait": {
71908             "width": 600,
71909             "height": 800,
71910             "paddingTop": 0,
71911             "paddingLeft": 0
71912         },
71913         "landscape": {
71914             "width": 600,
71915             "height": 800,
71916             "paddingTop": 0,
71917             "paddingLeft": 0
71918         }
71919     },
71920
71921     "ppi": 316,
71922     "browser": ["Generic"],
71923     "platforms": [],
71924     "userAgent": "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.7 Safari/533.2"
71925 };
71926
71927 });
71928 define('ripple/devices/Torch9860-9850', function (require, exports, module) {
71929 /*
71930  *  Copyright 2011 Research In Motion Limited.
71931  *
71932  * Licensed under the Apache License, Version 2.0 (the "License");
71933  * you may not use this file except in compliance with the License.
71934  * You may obtain a copy of the License at
71935  *
71936  * http://www.apache.org/licenses/LICENSE-2.0
71937  *
71938  * Unless required by applicable law or agreed to in writing, software
71939  * distributed under the License is distributed on an "AS IS" BASIS,
71940  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
71941  * See the License for the specific language governing permissions and
71942  * limitations under the License.
71943  */
71944 module.exports = {
71945
71946     "id": "Torch9860-9850",
71947     "name": "BlackBerry Torch 9860/9850",
71948     "model": "9860-9850",
71949     "osName": "BlackBerry OS",
71950     "uuid": "42",
71951     "osVersion": "7",
71952     "manufacturer": "Research In Motion",
71953
71954     "skin": "Torch9860-9850",
71955
71956     "capabilities": [
71957         "input.touch",
71958         "location.gps",
71959         "location.maps",
71960         "media.audio.capture",
71961         "media.video.capture",
71962         "media.recording",
71963         "storage.memorycard",
71964         "network.bluetooth",
71965         "network.wlan",
71966         "network.3gpp"
71967     ],
71968
71969     "screen": {
71970         "width": 480,
71971         "height": 800
71972     },
71973     "viewPort": {
71974         "portrait": {
71975             "width": 480,
71976             "height": 800,
71977             "paddingTop": 0,
71978             "paddingLeft": 0
71979         },
71980         "landscape": {
71981             "width": 800,
71982             "height": 480,
71983             "paddingTop": 0,
71984             "paddingLeft": 0
71985         }
71986     },
71987
71988     "ppi": 253,
71989     "userAgent": "Mozilla/5.0 (BlackBerry; U; BlackBerry 9860; en) AppleWebKit/534.1+ (KHTML, Like Gecko) Version/7.0.0.0 Mobile Safari/534.1",
71990     "platforms": ["web", "phonegap", "webworks.handset"]
71991 };
71992
71993 });
71994 define('ripple/devices/WVGA', function (require, exports, module) {
71995 /*
71996  *  Copyright 2011 Research In Motion Limited.
71997  *
71998  * Licensed under the Apache License, Version 2.0 (the "License");
71999  * you may not use this file except in compliance with the License.
72000  * You may obtain a copy of the License at
72001  *
72002  * http://www.apache.org/licenses/LICENSE-2.0
72003  *
72004  * Unless required by applicable law or agreed to in writing, software
72005  * distributed under the License is distributed on an "AS IS" BASIS,
72006  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
72007  * See the License for the specific language governing permissions and
72008  * limitations under the License.
72009  */
72010 module.exports = {
72011     "id": "WVGA",
72012     "name": "WVGA (480x800)",
72013     "osName": "Generic",
72014     "osVersion": "Generic",
72015     "manufacturer": "Generic",
72016     "model": "Generic",
72017     "uuid": "42",
72018
72019     "screen": {
72020         "width": 480,
72021         "height": 800
72022     },
72023     "viewPort": {
72024         "portrait": {
72025             "width": 480,
72026             "height": 800,
72027             "paddingTop": 0,
72028             "paddingLeft": 0
72029         },
72030         "landscape": {
72031             "width": 800,
72032             "height": 480,
72033             "paddingTop": 0,
72034             "paddingLeft": 0
72035         }
72036     },
72037
72038     "ppi": 316,
72039     "browser": ["Generic"],
72040     "platforms": ["web", "phonegap", "tizen", "cordova"],
72041     "userAgent": "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.7 Safari/533.2"
72042 };
72043
72044 });
72045 define('ripple/devices/tizen-HD', function (require, exports, module) {
72046 /*
72047  *  Copyright 2012 Intel Corporation
72048  *
72049  * Licensed under the Apache License, Version 2.0 (the "License");
72050  * you may not use this file except in compliance with the License.
72051  * You may obtain a copy of the License at
72052  *
72053  * http://www.apache.org/licenses/LICENSE-2.0
72054  *
72055  * Unless required by applicable law or agreed to in writing, software
72056  * distributed under the License is distributed on an "AS IS" BASIS,
72057  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
72058  * See the License for the specific language governing permissions and
72059  * limitations under the License.
72060  */
72061
72062 module.exports = {
72063     "id": "tizen-HD",
72064     "name": "Tizen HD (720x1280)",
72065     "osName": "Generic",
72066     "osVersion": "Generic",
72067     "manufacturer": "Tizen",
72068     "model": "Generic",
72069     "uuid": "42",
72070     "firmware": "Generic",
72071
72072     "screen": {
72073         "width": 720,
72074         "height": 1280
72075     },
72076     "viewPort": {
72077         "portrait": {
72078             "width": 360,
72079             "height": 640,
72080             "paddingTop": 0,
72081             "paddingLeft": 0
72082         },
72083         "landscape": {
72084             "width": 640,
72085             "height": 360,
72086             "paddingTop": 0,
72087             "paddingLeft": 0
72088         }
72089     },
72090
72091     "ppi": 316,
72092     "browser": ["Generic"],
72093     "platforms": ["wac", "web", "phonegap", "tizen", "cordova"],
72094     "userAgent": "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.7 Safari/533.2"
72095 };
72096
72097 });
72098 define('ripple/devices/iPad', function (require, exports, module) {
72099 /*
72100  *  Copyright 2011 Research In Motion Limited.
72101  *
72102  * Licensed under the Apache License, Version 2.0 (the "License");
72103  * you may not use this file except in compliance with the License.
72104  * You may obtain a copy of the License at
72105  *
72106  * http://www.apache.org/licenses/LICENSE-2.0
72107  *
72108  * Unless required by applicable law or agreed to in writing, software
72109  * distributed under the License is distributed on an "AS IS" BASIS,
72110  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
72111  * See the License for the specific language governing permissions and
72112  * limitations under the License.
72113  */
72114 module.exports = {
72115
72116     "id": "iPad",
72117     "name": "iPad",
72118     "model": "iPad",
72119     "osName": "iOS",
72120     "uuid": "e0101010d38bde8e6740011221af335301010333",
72121     "osVersion": "1.6",
72122     "manufacturer": "Apple",
72123
72124     "screen": {
72125         "width": 768,
72126         "height": 1024
72127     },
72128     "viewPort": {
72129         "portrait": {
72130             "width": 768,
72131             "height": 1024,
72132             "paddingTop": 0,
72133             "paddingLeft": 0
72134         },
72135         "landscape": {
72136             "width": 1024,
72137             "height": 768,
72138             "paddingTop": 0,
72139             "paddingLeft": 0
72140         }
72141     },
72142
72143     "ppi": 132,
72144     "userAgent": "Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B367 Safari/531.21.10",
72145     "platforms": ["web", "phonegap", "cordova"],
72146
72147     "notes": {
72148         "1": "<a href=\"http://www.apple.com/ipad/specs/\" target=\"_blank\">Specs</a>"
72149     }
72150 };
72151
72152 });
72153 define('ripple/devices/NokiaN97', function (require, exports, module) {
72154 /*
72155  *  Copyright 2011 Research In Motion Limited.
72156  *
72157  * Licensed under the Apache License, Version 2.0 (the "License");
72158  * you may not use this file except in compliance with the License.
72159  * You may obtain a copy of the License at
72160  *
72161  * http://www.apache.org/licenses/LICENSE-2.0
72162  *
72163  * Unless required by applicable law or agreed to in writing, software
72164  * distributed under the License is distributed on an "AS IS" BASIS,
72165  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
72166  * See the License for the specific language governing permissions and
72167  * limitations under the License.
72168  */
72169 module.exports = {
72170     "id": "NokiaN97",
72171     "name": "Nokia N97/5800 (touch)",
72172     "manufacturer": "Nokia",
72173     "model": "N97",
72174     "osName": "S60",
72175     "osVersion": "v5",
72176     "uuid": "42",
72177
72178     "screen": {
72179         "width": 360,
72180         "height": 640
72181     },
72182     "viewPort": {
72183         "portrait": {
72184             "width": 360,
72185             "height": 640,
72186             "paddingTop": 0,
72187             "paddingLeft": 0
72188         },
72189         "landscape": {
72190             "width": 640,
72191             "height": 360,
72192             "paddingTop": 0,
72193             "paddingLeft": 0
72194         }
72195     },
72196
72197     "ppi": 232,
72198     "userAgent": "?",
72199     "platforms": ["web", "phonegap"]
72200 };
72201
72202 });
72203 define('ripple/devices/Style9670', function (require, exports, module) {
72204 /*
72205  *  Copyright 2011 Research In Motion Limited.
72206  *
72207  * Licensed under the Apache License, Version 2.0 (the "License");
72208  * you may not use this file except in compliance with the License.
72209  * You may obtain a copy of the License at
72210  *
72211  * http://www.apache.org/licenses/LICENSE-2.0
72212  *
72213  * Unless required by applicable law or agreed to in writing, software
72214  * distributed under the License is distributed on an "AS IS" BASIS,
72215  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
72216  * See the License for the specific language governing permissions and
72217  * limitations under the License.
72218  */
72219 module.exports = {
72220
72221     "id": "Style9670",
72222     "name": "BlackBerry Style 9670",
72223     "model": "9670",
72224     "osName": "BlackBerry OS",
72225     "uuid": "42",
72226     "osVersion": "6",
72227     "manufacturer": "Research In Motion",
72228
72229     "skin": "Style9670",
72230
72231     "capabilities": [
72232         "location.gps",
72233         "location.maps",
72234         "media.audio.capture",
72235         "media.video.capture",
72236         "media.recording",
72237         "storage.memorycard",
72238         "network.bluetooth",
72239         "network.wlan",
72240         "network.3gpp"
72241     ],
72242
72243     "screen": {
72244         "width": 360,
72245         "height": 400
72246     },
72247     "viewPort": {
72248         "portrait": {
72249             "width": 360,
72250             "height": 400,
72251             "paddingTop": 0,
72252             "paddingLeft": 0
72253         }
72254     },
72255
72256     "ppi": 200,
72257     "userAgent": "Mozilla/5.0 (BlackBerry; U; BlackBerry 9670; en) AppleWebKit/534.3+ (KHTML, like Gecko) Version/6.0.0.286 Mobile Safari/534.3+",
72258     "platforms": ["web", "phonegap", "webworks.handset"]
72259 };
72260
72261 });
72262 define('ripple/devices/Nexus', function (require, exports, module) {
72263 /*
72264  *  Copyright 2011 Research In Motion Limited.
72265  *
72266  * Licensed under the Apache License, Version 2.0 (the "License");
72267  * you may not use this file except in compliance with the License.
72268  * You may obtain a copy of the License at
72269  *
72270  * http://www.apache.org/licenses/LICENSE-2.0
72271  *
72272  * Unless required by applicable law or agreed to in writing, software
72273  * distributed under the License is distributed on an "AS IS" BASIS,
72274  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
72275  * See the License for the specific language governing permissions and
72276  * limitations under the License.
72277  */
72278 module.exports = {
72279     "id": "Nexus",
72280     "name": "Nexus One",
72281     "manufacturer": "HTC",
72282     "model": "Nexux One",
72283     "osName": "Android",
72284     "uuid": "6F196F23-FD0D-4F62-B27B-730147FCC5A3",
72285     "osVersion": "2.x.x",
72286
72287     "screen": {
72288         "width": 480,
72289         "height": 800
72290     },
72291     "viewPort": {
72292         "portrait": {
72293             "width": 480,
72294             "height": 800,
72295             "paddingTop": 0,
72296             "paddingLeft": 0
72297         },
72298         "landscape": {
72299             "width": 800,
72300             "height": 480,
72301             "paddingTop": 0,
72302             "paddingLeft": 0
72303         }
72304     },
72305
72306     "ppi": 252.15,
72307     "userAgent": "Mozilla/5.0 (Linux; U; Android 2.1; en-us; Nexus One Build/ERD62) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",
72308     "platforms": ["web", "phonegap"],
72309
72310     "notes": {
72311         "1": "<a href=\"http://www.google.com/phone/static/en_US-nexusone_tech_specs.html\" target=\"_blank\">Specs</a>"
72312     }
72313 };
72314
72315 });
72316 define('ripple/devices/HVGA', function (require, exports, module) {
72317 /*
72318  *  Copyright 2011 Research In Motion Limited.
72319  *
72320  * Licensed under the Apache License, Version 2.0 (the "License");
72321  * you may not use this file except in compliance with the License.
72322  * You may obtain a copy of the License at
72323  *
72324  * http://www.apache.org/licenses/LICENSE-2.0
72325  *
72326  * Unless required by applicable law or agreed to in writing, software
72327  * distributed under the License is distributed on an "AS IS" BASIS,
72328  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
72329  * See the License for the specific language governing permissions and
72330  * limitations under the License.
72331  */
72332 module.exports = {
72333     "group": "Generic Devices",
72334
72335     "id": "HVGA",
72336     "name": "HVGA (320x480)",
72337     "osName": "Generic",
72338     "osVersion": "Generic",
72339     "manufacturer": "Generic",
72340     "model": "Generic",
72341     "uuid": "42",
72342
72343     "screen": {
72344         "width": 320,
72345         "height": 480
72346     },
72347     "viewPort": {
72348         "portrait": {
72349             "width": 320,
72350             "height": 480,
72351             "paddingTop": 0,
72352             "paddingLeft": 0
72353         },
72354         "landscape": {
72355             "width": 480,
72356             "height": 320,
72357             "paddingTop": 0,
72358             "paddingLeft": 0
72359         }
72360     },
72361
72362     "ppi": 316,
72363     "platforms": ["wac", "web", "phonegap", "tizen", "cordova"],
72364     "userAgent": "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.7 Safari/533.2"
72365 };
72366
72367 });
72368 define('ripple/devices/QVGA', function (require, exports, module) {
72369 /*
72370  *  Copyright 2011 Research In Motion Limited.
72371  *
72372  * Licensed under the Apache License, Version 2.0 (the "License");
72373  * you may not use this file except in compliance with the License.
72374  * You may obtain a copy of the License at
72375  *
72376  * http://www.apache.org/licenses/LICENSE-2.0
72377  *
72378  * Unless required by applicable law or agreed to in writing, software
72379  * distributed under the License is distributed on an "AS IS" BASIS,
72380  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
72381  * See the License for the specific language governing permissions and
72382  * limitations under the License.
72383  */
72384 module.exports = {
72385     "id": "QVGA",
72386     "name": "Generic - QVGA (240X320)",
72387     "osName": "Generic",
72388     "osVersion": "Generic",
72389     "manufacturer": "Generic",
72390     "model": "Generic",
72391     "uuid": "42",
72392
72393     "screen": {
72394         "width": 240,
72395         "height": 320
72396     },
72397     "viewPort": {
72398         "portrait": {
72399             "width": 240,
72400             "height": 320,
72401             "paddingTop": 0,
72402             "paddingLeft": 0
72403         },
72404         "landscape": {
72405             "width": 320,
72406             "height": 240,
72407             "paddingTop": 0,
72408             "paddingLeft": 0
72409         }
72410     },
72411
72412     "ppi": 96,
72413     "platforms": ["web", "phonegap", "cordova", "tizen"],
72414     "userAgent": "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.7 Safari/533.2"
72415 };
72416
72417 });
72418 define('ripple/devices/HPPre3', function (require, exports, module) {
72419 /*
72420  *  Copyright 2011 Research In Motion Limited.
72421  *
72422  * Licensed under the Apache License, Version 2.0 (the "License");
72423  * you may not use this file except in compliance with the License.
72424  * You may obtain a copy of the License at
72425  *
72426  * http://www.apache.org/licenses/LICENSE-2.0
72427  *
72428  * Unless required by applicable law or agreed to in writing, software
72429  * distributed under the License is distributed on an "AS IS" BASIS,
72430  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
72431  * See the License for the specific language governing permissions and
72432  * limitations under the License.
72433  */
72434 module.exports = {
72435     "id": "HPPre3",
72436     "name": "HP Pre 3",
72437     "manufacturer": "HP",
72438     "model": "Pre",
72439     "osName": "WebOS",
72440     "osVersion": "2.x",
72441
72442     "screen": {
72443         "width": 480,
72444         "height": 800
72445     },
72446     "viewPort": {
72447         "portrait": {
72448             "width": 480,
72449             "height": 800,
72450             "paddingTop": 0,
72451             "paddingLeft": 0
72452         },
72453         "landscape": {
72454             "width": 800,
72455             "height": 480,
72456             "paddingTop": 0,
72457             "paddingLeft": 0
72458         }
72459     },
72460
72461     "ppi": 260,
72462     // TODO :: not exactly the correct userAgent webkit version is probably different
72463     "userAgent": "Mozilla/5.0 (webOS/2.0; U; en-US) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/1.0 Safari/525.27.1 Pre/2.0",
72464     "platforms": ["web", "phonegap"],
72465
72466     "notes": {
72467         "1": "<a href=\"http://www.palm.com/us/products/phones/pre3/index.html\" target=\"_blank\">Specs</a>"
72468     }
72469 };
72470
72471 });
72472 define('ripple/devices/Curve9300', function (require, exports, module) {
72473 /*
72474  *  Copyright 2011 Research In Motion Limited.
72475  *
72476  * Licensed under the Apache License, Version 2.0 (the "License");
72477  * you may not use this file except in compliance with the License.
72478  * You may obtain a copy of the License at
72479  *
72480  * http://www.apache.org/licenses/LICENSE-2.0
72481  *
72482  * Unless required by applicable law or agreed to in writing, software
72483  * distributed under the License is distributed on an "AS IS" BASIS,
72484  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
72485  * See the License for the specific language governing permissions and
72486  * limitations under the License.
72487  */
72488 module.exports = {
72489
72490     "id": "Curve9300",
72491     "name": "BlackBerry Curve 9300",
72492     "model": "9300",
72493     "osName": "BlackBerry OS",
72494     "uuid": "42",
72495     "osVersion": "6",
72496     "manufacturer": "Research In Motion",
72497
72498     "skin": "Curve9300",
72499
72500     "capabilities": [
72501         "location.gps",
72502         "location.maps",
72503         "media.audio.capture",
72504         "media.video.capture",
72505         "media.recording",
72506         "storage.memorycard",
72507         "network.bluetooth",
72508         "network.wlan",
72509         "network.3gpp"
72510     ],
72511
72512     "screen": {
72513         "width": 320,
72514         "height": 240
72515     },
72516     "viewPort": {
72517         "portrait": {
72518             "width": 320,
72519             "height": 240,
72520             "paddingTop": 0,
72521             "paddingLeft": 0
72522         }
72523     },
72524
72525     "ppi": 163,
72526     "userAgent": "Mozilla/5.0 (BlackBerry; U; BlackBerry 9300; en) AppleWebKit/534.3+ (KHTML, like Gecko) Version/6.0.0.286 Mobile Safari/534.3+",
72527     "platforms": ["web", "phonegap", "webworks.handset"]
72528 };
72529
72530 });
72531 define('ripple/devices/Bold9700', function (require, exports, module) {
72532 /*
72533  *  Copyright 2011 Research In Motion Limited.
72534  *
72535  * Licensed under the Apache License, Version 2.0 (the "License");
72536  * you may not use this file except in compliance with the License.
72537  * You may obtain a copy of the License at
72538  *
72539  * http://www.apache.org/licenses/LICENSE-2.0
72540  *
72541  * Unless required by applicable law or agreed to in writing, software
72542  * distributed under the License is distributed on an "AS IS" BASIS,
72543  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
72544  * See the License for the specific language governing permissions and
72545  * limitations under the License.
72546  */
72547 module.exports = {
72548
72549     "id": "Bold9700",
72550     "name": "BlackBerry Bold 9700",
72551     "model": "9700",
72552     "osName": "BlackBerry OS",
72553     "uuid": "42",
72554     "osVersion": "6",
72555     "manufacturer": "Research In Motion",
72556
72557     "skin": "Bold9700",
72558
72559     "capabilities": [
72560         "location.gps",
72561         "location.maps",
72562         "media.audio.capture",
72563         "media.video.capture",
72564         "media.recording",
72565         "storage.memorycard",
72566         "network.bluetooth",
72567         "network.wlan",
72568         "network.3gpp"
72569     ],
72570
72571     "screen": {
72572         "width": 480,
72573         "height": 360
72574     },
72575     "viewPort": {
72576         "portrait": {
72577             "width": 480,
72578             "height": 360,
72579             "paddingTop": 0,
72580             "paddingLeft": 0
72581         }
72582     },
72583
72584     "ppi": 245.00,
72585     "userAgent": "Mozilla/5.0 (BlackBerry; U; BlackBerry 9700; en) AppleWebKit/534.1+ (KHTML, Like Gecko) Version/6.0.0.141 Mobile Safari/534.1",
72586     "platforms": ["web", "phonegap", "webworks.handset", "cordova"]
72587 };
72588
72589 });
72590 define('ripple/devices/G1', function (require, exports, module) {
72591 /*
72592  *  Copyright 2011 Research In Motion Limited.
72593  *
72594  * Licensed under the Apache License, Version 2.0 (the "License");
72595  * you may not use this file except in compliance with the License.
72596  * You may obtain a copy of the License at
72597  *
72598  * http://www.apache.org/licenses/LICENSE-2.0
72599  *
72600  * Unless required by applicable law or agreed to in writing, software
72601  * distributed under the License is distributed on an "AS IS" BASIS,
72602  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
72603  * See the License for the specific language governing permissions and
72604  * limitations under the License.
72605  */
72606 module.exports = {
72607
72608     "id": "G1",
72609     "name": "HTC G1",
72610     "model": "G1",
72611     "osName": "Android",
72612     "osVersion": "1.6",
72613     "uuid": "6F196F23-FD0D-4F62-B27B-730147FCC5A3",
72614     "manufacturer": "HTC",
72615
72616     "screen": {
72617         "width": 320,
72618         "height": 480
72619     },
72620     "viewPort": {
72621         "portrait": {
72622             "width": 320,
72623             "height": 480,
72624             "paddingTop": 0,
72625             "paddingLeft": 0
72626         },
72627         "landscape": {
72628             "width": 480,
72629             "height": 320,
72630             "paddingTop": 0,
72631             "paddingLeft": 0
72632         }
72633     },
72634
72635     "ppi": 180.28,
72636     "platforms": ["web", "phonegap"],
72637     "userAgent": "Mozilla/5.0 (Linux; U; Android 1.0; en-us; dream) AppleWebKit/525.10+ (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2",
72638
72639     "notes": {
72640         "1": "<a href=\"http://www.htc.com/www/product/g1/specification.html\" target=\"_blank\">Specs</a>"
72641     }
72642 };
72643
72644 });
72645 define('ripple/devices/NexusGalaxy', function (require, exports, module) {
72646 /*
72647  *  Copyright 2011 Research In Motion Limited.
72648  *
72649  * Licensed under the Apache License, Version 2.0 (the "License");
72650  * you may not use this file except in compliance with the License.
72651  * You may obtain a copy of the License at
72652  *
72653  * http://www.apache.org/licenses/LICENSE-2.0
72654  *
72655  * Unless required by applicable law or agreed to in writing, software
72656  * distributed under the License is distributed on an "AS IS" BASIS,
72657  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
72658  * See the License for the specific language governing permissions and
72659  * limitations under the License.
72660  */
72661 module.exports = {
72662     "id" : "NexusGalaxy",
72663     "name": "Nexus (Galaxy)",
72664     "manufacturer": "Samsung",
72665     "model": "Galaxy Nexus (generic)",
72666     "osName": "Android",
72667     "uuid" : "3D0AD03B-8B46-431A-BEF5-FF01B96BA990",
72668     "osVersion": "4.x.x",
72669
72670     "screen": {
72671         "width": 720,
72672         "height": 1280
72673     },
72674     "viewPort": {
72675         "portrait": {
72676             "width": 720,
72677             "height": 1280,
72678             "paddingTop": 0,
72679             "paddingLeft": 0
72680         },
72681         "landscape": {
72682             "width": 1280,
72683             "height": 720,
72684             "paddingTop": 0,
72685             "paddingLeft": 0
72686         }
72687     },
72688
72689     "ppi": 315,
72690     "userAgent": "Mozilla/5.0 (Linux; Android 4.0.1; Galaxy Nexus Build/ITL41F) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19",
72691     "platforms": ["web", "phonegap", "cordova"],
72692
72693     "notes": {
72694         "1": "<a href=\"http://www.google.com/nexus/#/tech-specs\" target=\"_blank\">Specs</a>"
72695     }
72696
72697 };
72698
72699 });
72700 define('ripple/devices/Torch9810', function (require, exports, module) {
72701 /*
72702  *  Copyright 2011 Research In Motion Limited.
72703  *
72704  * Licensed under the Apache License, Version 2.0 (the "License");
72705  * you may not use this file except in compliance with the License.
72706  * You may obtain a copy of the License at
72707  *
72708  * http://www.apache.org/licenses/LICENSE-2.0
72709  *
72710  * Unless required by applicable law or agreed to in writing, software
72711  * distributed under the License is distributed on an "AS IS" BASIS,
72712  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
72713  * See the License for the specific language governing permissions and
72714  * limitations under the License.
72715  */
72716 module.exports = {
72717
72718     "id": "Torch9810",
72719     "name": "BlackBerry Torch 9810",
72720     "model": "9810",
72721     "osName": "BlackBerry OS",
72722     "uuid": "42",
72723     "osVersion": "7",
72724     "manufacturer": "Research In Motion",
72725
72726     "skin": "Torch9810",
72727
72728     "capabilities": [
72729         "input.touch",
72730         "location.gps",
72731         "location.maps",
72732         "media.audio.capture",
72733         "media.video.capture",
72734         "media.recording",
72735         "storage.memorycard",
72736         "network.bluetooth",
72737         "network.wlan",
72738         "network.3gpp"
72739     ],
72740
72741     "screen": {
72742         "width": 480,
72743         "height": 640
72744     },
72745     "viewPort": {
72746         "portrait": {
72747             "width": 480,
72748             "height": 640,
72749             "paddingTop": 0,
72750             "paddingLeft": 0
72751         },
72752         "landscape": {
72753             "width": 640,
72754             "height": 480,
72755             "paddingTop": 0,
72756             "paddingLeft": 0
72757         }
72758     },
72759
72760     "ppi": 253,
72761     "userAgent": "Mozilla/5.0 (BlackBerry; U; BlackBerry 9810; en) AppleWebKit/534.1+ (KHTML, Like Gecko) Version/7.0.0.0 Mobile Safari/534.1",
72762     "platforms": ["web", "phonegap", "webworks.handset"]
72763 };
72764
72765 });
72766 define('ripple/devices/PalmPre2', function (require, exports, module) {
72767 /*
72768  *  Copyright 2011 Research In Motion Limited.
72769  *
72770  * Licensed under the Apache License, Version 2.0 (the "License");
72771  * you may not use this file except in compliance with the License.
72772  * You may obtain a copy of the License at
72773  *
72774  * http://www.apache.org/licenses/LICENSE-2.0
72775  *
72776  * Unless required by applicable law or agreed to in writing, software
72777  * distributed under the License is distributed on an "AS IS" BASIS,
72778  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
72779  * See the License for the specific language governing permissions and
72780  * limitations under the License.
72781  */
72782 module.exports = {
72783     "id": "PalmPre2",
72784     "name": "Palm Pre 2",
72785     "manufacturer": "Palm",
72786     "model": "Pre",
72787     "osName": "WebOS",
72788     "osVersion": "2.x",
72789
72790     "screen": {
72791         "width": 320,
72792         "height": 480
72793     },
72794     "viewPort": {
72795         "portrait": {
72796             "width": 320,
72797             "height": 480,
72798             "paddingTop": 0,
72799             "paddingLeft": 0
72800         },
72801         "landscape": {
72802             "width": 480,
72803             "height": 320,
72804             "paddingTop": 0,
72805             "paddingLeft": 0
72806         }
72807     },
72808
72809     "ppi": 186.09,
72810     // TODO :: not exactly the correct userAgent webkit version is probably different
72811     "userAgent": "Mozilla/5.0 (webOS/2.0; U; en-US) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/1.0 Safari/525.27.1 Pre/2.0",
72812     "platforms": ["web", "phonegap"],
72813
72814     "notes": {
72815         "1": "<a href=\"http://www.palm.com/us/products/phones/pre2/#tab2\" target=\"_blank\">Specs</a>"
72816     }
72817 };
72818
72819 });
72820 define('ripple/devices/Curve9350-9360-9370', function (require, exports, module) {
72821 /*
72822  *  Copyright 2011 Research In Motion Limited.
72823  *
72824  * Licensed under the Apache License, Version 2.0 (the "License");
72825  * you may not use this file except in compliance with the License.
72826  * You may obtain a copy of the License at
72827  *
72828  * http://www.apache.org/licenses/LICENSE-2.0
72829  *
72830  * Unless required by applicable law or agreed to in writing, software
72831  * distributed under the License is distributed on an "AS IS" BASIS,
72832  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
72833  * See the License for the specific language governing permissions and
72834  * limitations under the License.
72835  */
72836 module.exports = {
72837
72838     "id": "Curve9350-9360-9370",
72839     "name": "BlackBerry Curve 9350/9360/9370",
72840     "model": "9350-9360-9370",
72841     "osName": "BlackBerry OS",
72842     "uuid": "42",
72843     "osVersion": "7",
72844     "manufacturer": "Research In Motion",
72845
72846     "skin": "Curve9350-9360-9370",
72847
72848     "capabilities": [
72849         "location.gps",
72850         "location.maps",
72851         "media.audio.capture",
72852         "media.video.capture",
72853         "media.recording",
72854         "storage.memorycard",
72855         "network.bluetooth",
72856         "network.wlan",
72857         "network.3gpp"
72858     ],
72859
72860     "screen": {
72861         "width": 480,
72862         "height": 360
72863     },
72864     "viewPort": {
72865         "portrait": {
72866             "width": 480,
72867             "height": 360,
72868             "paddingTop": 0,
72869             "paddingLeft": 0
72870         }
72871     },
72872
72873     "ppi": 246.00,
72874     "userAgent": "Mozilla/5.0 (BlackBerry; U; BlackBerry 9350; en) AppleWebKit/534.1+ (KHTML, Like Gecko) Version/7.0.0.0 Mobile Safari/534.1",
72875     "platforms": ["web", "phonegap", "webworks.handset"]
72876 };
72877
72878 });
72879 define('ripple/devices/Colt', function (require, exports, module) {
72880 /*
72881  *  Copyright 2011 Research In Motion Limited.
72882  *
72883  * Licensed under the Apache License, Version 2.0 (the "License");
72884  * you may not use this file except in compliance with the License.
72885  * You may obtain a copy of the License at
72886  *
72887  * http://www.apache.org/licenses/LICENSE-2.0
72888  *
72889  * Unless required by applicable law or agreed to in writing, software
72890  * distributed under the License is distributed on an "AS IS" BASIS,
72891  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
72892  * See the License for the specific language governing permissions and
72893  * limitations under the License.
72894  */
72895 module.exports = {
72896
72897     "id": "Colt",
72898     "name": "BlackBerry 10 Dev Alpha",
72899     "model": "Colt",
72900     "osName": "BlackBerry",
72901     "uuid": "42",
72902     "osVersion": "10.0.6.99",
72903     "manufacturer": "Research In Motion",
72904     "hardwareId": "0x8500240a",
72905
72906     "skin": "Colt",
72907
72908     "capabilities": [
72909         "input.touch",
72910         "location.gps",
72911         "media.audio.capture",
72912         "media.video.capture",
72913         "media.recording",
72914         "network.bluetooth",
72915         "network.wlan"
72916     ],
72917
72918     "screen": {
72919         "width": 768,
72920         "height": 1280
72921     },
72922     "viewPort": {
72923         "portrait": {
72924             "width": 768,
72925             "height": 1280,
72926             "paddingTop": 0,
72927             "paddingLeft": 0
72928         },
72929         "landscape": {
72930             "width": 1280,
72931             "height": 768,
72932             "paddingTop": 0,
72933             "paddingLeft": 0
72934         }
72935     },
72936
72937     "defaultOrientation": "portrait",
72938
72939     "ppi": 355,
72940     "userAgent": "Mozilla/5.0 (BlackBerry) AppleWebKit/536.2+ (KHTML, like Gecko) Version/10.0.4.182 Mobile Safari/536.2+",
72941     "platforms": ["web", "webworks.bb10", "cordova"]
72942 };
72943
72944 });
72945 define('ripple/devices/Nexus7', function (require, exports, module) {
72946 /*
72947  *  Copyright 2011 Research In Motion Limited.
72948  *
72949  * Licensed under the Apache License, Version 2.0 (the "License");
72950  * you may not use this file except in compliance with the License.
72951  * You may obtain a copy of the License at
72952  *
72953  * http://www.apache.org/licenses/LICENSE-2.0
72954  *
72955  * Unless required by applicable law or agreed to in writing, software
72956  * distributed under the License is distributed on an "AS IS" BASIS,
72957  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
72958  * See the License for the specific language governing permissions and
72959  * limitations under the License.
72960  */
72961 module.exports = {
72962     "id" : "Nexus7",
72963     "name": "Nexus 7 (Tablet)",
72964     "manufacturer": "Asus",
72965     "model": "Nexus 7 8/16 GB",
72966     "osName": "Android",
72967     "uuid" : "903802EA-1786-4175-B0F1-1FDF87813CAA",
72968     "osVersion": "4.x.x",
72969
72970     "screen": {
72971         "width": 800,
72972         "height": 1280
72973     },
72974     "viewPort": {
72975         "portrait": {
72976             "width": 800,
72977             "height": 1280,
72978             "paddingTop": 0,
72979             "paddingLeft": 0
72980         },
72981         "landscape": {
72982             "width": 1280,
72983             "height": 800,
72984             "paddingTop": 0,
72985             "paddingLeft": 0
72986         }
72987     },
72988
72989     "ppi": 215,
72990     "userAgent": "Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166  Safari/535.19",
72991     "platforms": ["web", "phonegap", "cordova"],
72992
72993     "notes": {
72994         "1": "<a href=\"http://www.google.com/nexus/#/7/specs\" target=\"_blank\">Specs</a>"
72995     }
72996
72997 };
72998
72999 });
73000 define('ripple/devices/Legend', function (require, exports, module) {
73001 /*
73002  *  Copyright 2011 Research In Motion Limited.
73003  *
73004  * Licensed under the Apache License, Version 2.0 (the "License");
73005  * you may not use this file except in compliance with the License.
73006  * You may obtain a copy of the License at
73007  *
73008  * http://www.apache.org/licenses/LICENSE-2.0
73009  *
73010  * Unless required by applicable law or agreed to in writing, software
73011  * distributed under the License is distributed on an "AS IS" BASIS,
73012  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
73013  * See the License for the specific language governing permissions and
73014  * limitations under the License.
73015  */
73016 module.exports = {
73017     "id": "Legend",
73018     "name": "HTC Legend",
73019     "osName": "Android",
73020     "osVersion": "1.6",
73021     "manufacturer": "HTC",
73022     "model": "Legend",
73023     "uuid": "6F196F23-FD0D-4F62-B27B-730147FCC5A3",
73024
73025     "screen": {
73026         "width": 320,
73027         "height": 480
73028     },
73029     "viewPort": {
73030         "portrait": {
73031             "width": 320,
73032             "height": 480,
73033             "paddingTop": 0,
73034             "paddingLeft": 0
73035         },
73036         "landscape": {
73037             "width": 480,
73038             "height": 320,
73039             "paddingTop": 0,
73040             "paddingLeft": 0
73041         }
73042     },
73043
73044     "ppi": 180.3,
73045     "userAgent": "Mozilla/5.0 (Linux; U; Android 2.1; fr-fr; HTC Legend 1.32.163.1 Build/ERD79) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",
73046     "platforms": ["web", "phonegap"]
73047 };
73048
73049 });
73050 define('ripple/devices/Torch9800', function (require, exports, module) {
73051 /*
73052  *  Copyright 2011 Research In Motion Limited.
73053  *
73054  * Licensed under the Apache License, Version 2.0 (the "License");
73055  * you may not use this file except in compliance with the License.
73056  * You may obtain a copy of the License at
73057  *
73058  * http://www.apache.org/licenses/LICENSE-2.0
73059  *
73060  * Unless required by applicable law or agreed to in writing, software
73061  * distributed under the License is distributed on an "AS IS" BASIS,
73062  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
73063  * See the License for the specific language governing permissions and
73064  * limitations under the License.
73065  */
73066 module.exports = {
73067
73068     "id": "Torch9800",
73069     "name": "BlackBerry Torch 9800",
73070     "model": "9800",
73071     "osName": "BlackBerry OS",
73072     "uuid": "42",
73073     "osVersion": "6",
73074     "manufacturer": "Research In Motion",
73075
73076     "skin": "Torch9800",
73077
73078     "capabilities": [
73079         "input.touch",
73080         "location.gps",
73081         "location.maps",
73082         "media.audio.capture",
73083         "media.video.capture",
73084         "media.recording",
73085         "storage.memorycard",
73086         "network.bluetooth",
73087         "network.wlan",
73088         "network.3gpp"
73089     ],
73090
73091     "screen": {
73092         "width": 360,
73093         "height": 480
73094     },
73095     "viewPort": {
73096         "portrait": {
73097             "width": 360,
73098             "height": 480,
73099             "paddingTop": 0,
73100             "paddingLeft": 0
73101         },
73102         "landscape": {
73103             "width": 480,
73104             "height": 360,
73105             "paddingTop": 0,
73106             "paddingLeft": 0
73107         }
73108     },
73109
73110     "ppi": 188.68,
73111     "userAgent": "Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en) AppleWebKit/534.1+ (KHTML, Like Gecko) Version/6.0.0.141 Mobile Safari/534.1",
73112     "platforms": ["web", "phonegap", "webworks.handset"]
73113 };
73114
73115 });
73116 define('ripple/devices/HPVeer', function (require, exports, module) {
73117 /*
73118  *  Copyright 2011 Research In Motion Limited.
73119  *
73120  * Licensed under the Apache License, Version 2.0 (the "License");
73121  * you may not use this file except in compliance with the License.
73122  * You may obtain a copy of the License at
73123  *
73124  * http://www.apache.org/licenses/LICENSE-2.0
73125  *
73126  * Unless required by applicable law or agreed to in writing, software
73127  * distributed under the License is distributed on an "AS IS" BASIS,
73128  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
73129  * See the License for the specific language governing permissions and
73130  * limitations under the License.
73131  */
73132 module.exports = {
73133     "id": "HPVeer",
73134     "name": "HP Veer",
73135     "manufacturer": "HP",
73136     "model": "Veer",
73137     "osName": "WebOS",
73138     "osVersion": "2.x",
73139
73140     "screen": {
73141         "width": 320,
73142         "height": 400
73143     },
73144     "viewPort": {
73145         "portrait": {
73146             "width": 320,
73147             "height": 400,
73148             "paddingTop": 0,
73149             "paddingLeft": 0
73150         },
73151         "landscape": {
73152             "width": 400,
73153             "height": 320,
73154             "paddingTop": 0,
73155             "paddingLeft": 0
73156         }
73157     },
73158
73159     "ppi": 197,
73160     // TODO :: not exactly the correct userAgent webkit version is probably different
73161     "userAgent": "Mozilla/5.0 (webOS/2.0; U; en-US) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/1.0 Safari/525.27.1 Pre/2.0",
73162     "platforms": ["web", "phonegap"],
73163
73164     "notes": {
73165         "1": "<a href=\"http://www.palm.com/us/products/phones/veer/index.html\" target=\"_blank\">Specs</a>"
73166     }
73167 };
73168
73169 });
73170 define('ripple/devices/WQVGA', function (require, exports, module) {
73171 /*
73172  *  Copyright 2011 Research In Motion Limited.
73173  *
73174  * Licensed under the Apache License, Version 2.0 (the "License");
73175  * you may not use this file except in compliance with the License.
73176  * You may obtain a copy of the License at
73177  *
73178  * http://www.apache.org/licenses/LICENSE-2.0
73179  *
73180  * Unless required by applicable law or agreed to in writing, software
73181  * distributed under the License is distributed on an "AS IS" BASIS,
73182  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
73183  * See the License for the specific language governing permissions and
73184  * limitations under the License.
73185  */
73186 module.exports = {
73187     "id": "WQVGA",
73188     "name": "Generic - WQVGA (240x480)",
73189     "osName": "Generic",
73190     "osVersion": "Generic",
73191     "manufacturer": "Generic",
73192     "model": "Generic",
73193     "uuid": "42",
73194
73195     "screen": {
73196         "width": 240,
73197         "height": 480
73198     },
73199     "viewPort": {
73200         "portrait": {
73201             "width": 240,
73202             "height": 480,
73203             "paddingTop": 0,
73204             "paddingLeft": 0
73205         },
73206         "landscape": {
73207             "width": 480,
73208             "height": 240,
73209             "paddingTop": 0,
73210             "paddingLeft": 0
73211         }
73212     },
73213
73214     "ppi": 96,
73215     "browser": ["Generic"],
73216     "platforms": ["web", "phonegap", "tizen"],
73217     "userAgent": "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.7 Safari/533.2"
73218 };
73219
73220 });
73221 define('ripple/devices/WSVGA', function (require, exports, module) {
73222 /*
73223  *  Copyright 2011 Research In Motion Limited.
73224  *
73225  * Licensed under the Apache License, Version 2.0 (the "License");
73226  * you may not use this file except in compliance with the License.
73227  * You may obtain a copy of the License at
73228  *
73229  * http://www.apache.org/licenses/LICENSE-2.0
73230  *
73231  * Unless required by applicable law or agreed to in writing, software
73232  * distributed under the License is distributed on an "AS IS" BASIS,
73233  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
73234  * See the License for the specific language governing permissions and
73235  * limitations under the License.
73236  */
73237 module.exports = {
73238     "id": "WSVGA",
73239     "name": "WSVGA (600x1024)",
73240     "osName": "Generic",
73241     "osVersion": "Generic",
73242     "manufacturer": "Generic",
73243     "model": "Generic",
73244     "uuid": "42",
73245     "firmware": "Generic",
73246
73247     "screen": {
73248         "width": 600,
73249         "height": 1024
73250     },
73251     "viewPort": {
73252         "portrait": {
73253             "width": 600,
73254             "height": 1024,
73255             "paddingTop": 0,
73256             "paddingLeft": 0
73257         },
73258         "landscape": {
73259             "width": 1024,
73260             "height": 600,
73261             "paddingTop": 0,
73262             "paddingLeft": 0
73263         }
73264     },
73265
73266     "ppi": 316,
73267     "browser": ["Generic"],
73268     "platforms": ["wac", "web", "phonegap", "tizen", "cordova"],
73269     "userAgent": "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.7 Safari/533.2"
73270 };
73271
73272 });
73273 define('ripple/devices/FWVGA', function (require, exports, module) {
73274 /*
73275  *  Copyright 2011 Research In Motion Limited.
73276  *
73277  * Licensed under the Apache License, Version 2.0 (the "License");
73278  * you may not use this file except in compliance with the License.
73279  * You may obtain a copy of the License at
73280  *
73281  * http://www.apache.org/licenses/LICENSE-2.0
73282  *
73283  * Unless required by applicable law or agreed to in writing, software
73284  * distributed under the License is distributed on an "AS IS" BASIS,
73285  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
73286  * See the License for the specific language governing permissions and
73287  * limitations under the License.
73288  */
73289 module.exports = {
73290     "group": "Generic Devices",
73291
73292     "id": "FWVGA",
73293     "name": "Generic - FWVGA (480x854)",
73294     "osName": "Generic",
73295     "osVersion": "Generic",
73296     "manufacturer": "Generic",
73297     "model": "Generic",
73298     "uuid": "42",
73299
73300     "screen": {
73301         "width": 480,
73302         "height": 854
73303     },
73304     "viewPort": {
73305         "portrait": {
73306             "width": 480,
73307             "height": 854,
73308             "paddingTop": 0,
73309             "paddingLeft": 0
73310         },
73311         "landscape": {
73312             "width": 854,
73313             "height": 480,
73314             "paddingTop": 0,
73315             "paddingLeft": 0
73316         }
73317     },
73318
73319     "ppi": 96,
73320     "platforms": ["web", "phonegap", "cordova"],
73321     "userAgent": "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.7 Safari/533.2"
73322 };
73323
73324 });
73325 define('ripple/devices/NokiaN8', function (require, exports, module) {
73326 /*
73327  *  Copyright 2011 Research In Motion Limited.
73328  *
73329  * Licensed under the Apache License, Version 2.0 (the "License");
73330  * you may not use this file except in compliance with the License.
73331  * You may obtain a copy of the License at
73332  *
73333  * http://www.apache.org/licenses/LICENSE-2.0
73334  *
73335  * Unless required by applicable law or agreed to in writing, software
73336  * distributed under the License is distributed on an "AS IS" BASIS,
73337  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
73338  * See the License for the specific language governing permissions and
73339  * limitations under the License.
73340  */
73341 module.exports = {
73342
73343     "id": "NokiaN8",
73344     "name": "Nokia N8",
73345     "model": "N8",
73346     "osName": "SymbianOS",
73347     "uuid": "42",
73348     "osVersion": "3",
73349     "manufacturer": "Nokia",
73350
73351     "screen": {
73352         "width": 360,
73353         "height": 640
73354     },
73355     "viewPort": {
73356         "portrait": {
73357             "width": 360,
73358             "height": 640,
73359             "paddingTop": 0,
73360             "paddingLeft": 0
73361         },
73362         "landscape": {
73363             "width": 640,
73364             "height": 360,
73365             "paddingTop": 0,
73366             "paddingLeft": 0
73367         }
73368     },
73369
73370     "ppi": 209.8,
73371     "userAgent": "(Symbian/3; S60/5.2 Mozilla/5.0; NokiaN8-00/10.0.000; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) BrowserNG/7.2",
73372     "platforms": ["web", "phonegap"],
73373
73374     "notes": {
73375         "1": "<a href=\"http://www.forum.nokia.com/Devices/Device_specifications/N8-00/\" target=\"_blank\">Specs</a>"
73376     }
73377 };
73378
73379 });
73380 define('ripple/devices/Wave', function (require, exports, module) {
73381 /*
73382  *  Copyright 2011 Research In Motion Limited.
73383  *
73384  * Licensed under the Apache License, Version 2.0 (the "License");
73385  * you may not use this file except in compliance with the License.
73386  * You may obtain a copy of the License at
73387  *
73388  * http://www.apache.org/licenses/LICENSE-2.0
73389  *
73390  * Unless required by applicable law or agreed to in writing, software
73391  * distributed under the License is distributed on an "AS IS" BASIS,
73392  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
73393  * See the License for the specific language governing permissions and
73394  * limitations under the License.
73395  */
73396 module.exports = {
73397     "id": "Wave",
73398     "name": "Samsung Wave",
73399     "manufacturer": "Samsung",
73400     "model": "Wave",
73401     "osName": "Bada",
73402     "osVersion": "n/a",
73403
73404     "screen": {
73405         "width": 480,
73406         "height": 800
73407     },
73408     "viewPort": {
73409         "portrait": {
73410             "width": 480,
73411             "height": 800,
73412             "paddingTop": 0,
73413             "paddingLeft": 0
73414         },
73415         "landscape": {
73416             "width": 800,
73417             "height": 480,
73418             "paddingTop": 0,
73419             "paddingLeft": 0
73420         }
73421     },
73422
73423     "ppi": 283,
73424     "userAgent": "?",
73425     "platforms": ["web"]
73426 };
73427
73428 });
73429 define('ripple/devices/IVI-HD', function (require, exports, module) {
73430 /*
73431  *  Copyright 2012 Intel Corporation
73432  *
73433  * Licensed under the Apache License, Version 2.0 (the "License");
73434  * you may not use this file except in compliance with the License.
73435  * You may obtain a copy of the License at
73436  *
73437  * http://www.apache.org/licenses/LICENSE-2.0
73438  *
73439  * Unless required by applicable law or agreed to in writing, software
73440  * distributed under the License is distributed on an "AS IS" BASIS,
73441  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
73442  * See the License for the specific language governing permissions and
73443  * limitations under the License.
73444  */
73445
73446 module.exports = {
73447     "id": "IVI-HD",
73448     "name": "IVI HD (800x480)",
73449     "osName": "Generic",
73450     "osVersion": "Generic",
73451     "manufacturer": "Tizen",
73452     "model": "Generic",
73453     "uuid": "42",
73454     "firmware": "Generic",
73455
73456     "screen": {
73457         "width": 800,
73458         "height": 480
73459     },
73460     "viewPort": {
73461         "portrait": {
73462             "width": 1024,
73463             "height": 640,
73464             "paddingTop": 0,
73465             "paddingLeft": 0
73466         },
73467         "landscape": {
73468             "width": 640,
73469             "height": 1024,
73470             "paddingTop": 0,
73471             "paddingLeft": 0
73472         }
73473     },
73474
73475     "ppi": 316,
73476     "browser": ["Generic"],
73477     "platforms": ["ivi"],
73478     "userAgent": "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.7 Safari/533.2"
73479 };
73480
73481 });
73482 define('ripple/event', function (require, exports, module) {
73483 /*
73484  *  Copyright 2011 Research In Motion Limited.
73485  *
73486  * Licensed under the Apache License, Version 2.0 (the "License");
73487  * you may not use this file except in compliance with the License.
73488  * You may obtain a copy of the License at
73489  *
73490  * http://www.apache.org/licenses/LICENSE-2.0
73491  *
73492  * Unless required by applicable law or agreed to in writing, software
73493  * distributed under the License is distributed on an "AS IS" BASIS,
73494  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
73495  * See the License for the specific language governing permissions and
73496  * limitations under the License.
73497  */
73498 var utils = require('ripple/utils'),
73499     exception = require('ripple/exception'),
73500     _listeners = {};
73501
73502 function _on(eventType, listener, scope, once) {
73503     if (!eventType) {
73504         throw "eventType must be truthy";
73505     }
73506     _listeners[eventType] = _listeners[eventType] || [];
73507     _listeners[eventType].push({
73508         func: listener,
73509         scope: scope,
73510         once: !!once
73511     });
73512 }
73513
73514 function _deleteEventHandler(eventType, listenerFunc, scope) {
73515     var i, listeners;
73516
73517     if (!eventType) {
73518         throw "eventType must be truthy";
73519     }
73520
73521     listeners = _listeners[eventType];
73522
73523     // only delete once
73524     for (i = 0; i < listeners.length; i++) {
73525         if (listeners[i].func === listenerFunc) {
73526             listeners.splice(i, 1);
73527             break;
73528         }
73529     }
73530 }
73531
73532 function _trigger(listener, args, sync) {
73533     try {
73534         if (sync) {
73535             listener.func.apply(listener.scope, args);
73536         }
73537         else {
73538             setTimeout(function () {
73539                 listener.func.apply(listener.scope, args);
73540             }, 1);
73541         }
73542     }
73543     catch (e) {
73544         exception.handle(e);
73545     }
73546 }
73547
73548 module.exports = {
73549     on: function (eventType, listener, scope) {
73550         _on(eventType, listener, scope, false);
73551     },
73552
73553     once: function (eventType, listener, scope) {
73554         _on(eventType, listener, scope, true);
73555     },
73556
73557     trigger: function (eventType, args, sync) {
73558         args = args || [];
73559         sync = sync || false;
73560
73561         var listeners = _listeners[eventType];
73562
73563         if (listeners) {
73564             listeners.forEach(function (listener) {
73565                 _trigger(listener, args, sync);
73566             });
73567
73568             _listeners[eventType] = listeners.filter(function (listener) {
73569                 return !listener.once;
73570             });
73571         }
73572     },
73573
73574     eventHasSubscriber: function (eventType) {
73575         return !!_listeners[eventType];
73576     },
73577
73578     getEventSubscribers: function (eventType) {
73579         return utils.copy(_listeners[eventType]) || [];
73580     },
73581
73582     clear: function (eventType) {
73583         if (eventType) {
73584             delete _listeners[eventType];
73585         }
73586     },
73587
73588     deleteEventHandler: function (eventType, listener, scope) {
73589         _deleteEventHandler(eventType, listener, scope);
73590     }
73591 };
73592
73593 });
73594 define('ripple/devices', function (require, exports, module) {
73595 /*
73596  *  Copyright 2011 Research In Motion Limited.
73597  *
73598  * Licensed under the Apache License, Version 2.0 (the "License");
73599  * you may not use this file except in compliance with the License.
73600  * You may obtain a copy of the License at
73601  *
73602  * http://www.apache.org/licenses/LICENSE-2.0
73603  *
73604  * Unless required by applicable law or agreed to in writing, software
73605  * distributed under the License is distributed on an "AS IS" BASIS,
73606  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
73607  * See the License for the specific language governing permissions and
73608  * limitations under the License.
73609  */
73610 var _self,
73611     db = require('ripple/db'),
73612     utils = require('ripple/utils'),
73613     platform = require('ripple/platform'),
73614     event = require('ripple/event'),
73615     _devices = {};
73616
73617 event.on("HardwareKeyDefault", function (key) {
73618     if (key === 0 || key === "0") { //back button key
73619         require('ripple/emulatorBridge').window().history.back();
73620     }
73621 });
73622
73623 _self = module.exports = {
73624     initialize: function () {
73625         _devices = [
73626 /* 
73627            "Bold9700",
73628             "Bold9900",
73629             "Colt",
73630             "Curve9300",
73631             "Curve9350-9360-9370",
73632             "FWVGA",
73633             "G1",
73634 */          "IVI-HD",
73635             "tizen-WVGA",
73636 /*
73637             "HPPre3",
73638             "HPVeer",
73639 */
73640 //            "HVGA",
73641 /*
73642             "iPad",
73643             "iPhone3",
73644             "Legend",
73645             "Nexus",
73646             "NexusS",
73647             "NexusGalaxy",
73648             "Nexus7",
73649             "NokiaN8",
73650             "NokiaN97",
73651             "PalmPre",
73652             "PalmPre2",
73653             "Pearl9100",
73654             "Playbook",
73655             "QVGA",
73656             "Style9670",
73657             "Tattoo",
73658             "Torch9800",
73659             "Torch9810",
73660             "Torch9860-9850",
73661             "Wave",
73662             "WQVGA",
73663 */
73664 //            "WSVGA",
73665             "WVGA",
73666             "HD",
73667             "tizen-HD",
73668             "custom"
73669         ].reduce(function (hash, deviceID) {
73670             hash[deviceID] = require('ripple/devices/' + deviceID);
73671             return hash;
73672         }, {});
73673
73674         var current = this.getCurrentDevice();
73675         require('ripple/bus').send('userAgent', current.userAgent);
73676     },
73677
73678     getCurrentDevice: function () {
73679         var deviceId = db.retrieve("device-key"),
73680             device = this.getDevice(deviceId),
73681             platformId = platform.current().id,
73682             does = function (device) {
73683                 return {
73684                     include: function (platformId) {
73685                         return device.platforms.some(function (id) {
73686                             return platformId === id;
73687                         });
73688                     }
73689                 };
73690             };
73691
73692         if (deviceId !== "custom" && (!device || !does(device).include(platformId))) {
73693             deviceId = utils.reduce(_devices, function (current, device, id) {
73694                 return does(device).include(platformId) ? id : current;
73695             });
73696             device = this.getDevice(deviceId);
73697         }
73698
73699         return device;
73700     },
73701
73702     getDevice: function (deviceId) {
73703         var device, width, height, viewportWidth, viewportHeight, layout, viewportTag, ratio;
73704
73705         device = _devices[deviceId] ? utils.copy(_devices[deviceId]) : null;
73706         width = db.retrieve("custom_width") || 600;
73707         height = db.retrieve("custom_height") || 800;
73708         viewportTag = db.retrieveObject("viewportTag");
73709         layout = db.retrieve("layout") || "portrait" ;
73710
73711         if (deviceId === undefined)
73712             return null;
73713         width =  parseInt(width, 10);
73714         height =  parseInt(height, 10);
73715
73716         if (viewportTag !== undefined) {
73717             if (viewportTag['width'] !== undefined) {
73718                 if (viewportTag['width'] === "device-width") {
73719                     viewportWidth = device.viewPort[layout].width;
73720                 } else if (viewportTag['width'] === "device-height") {
73721                     viewportWidth = device.viewPort[layout].height;
73722                 }
73723                 else {
73724                     viewportWidth = parseInt(viewportTag['width'], 10);
73725                     if (isNaN(viewportWidth)) {
73726                         viewportWidth = device.viewPort[layout].width;
73727                     }
73728                 }
73729                 db.saveObject("viewport_width", viewportWidth);
73730
73731                 if (layout === "portrait") {
73732                     if (deviceId !== "custom") {
73733                         ratio = device.screen.height / device.screen.width;
73734                     } else {
73735                         ratio = height / width;
73736                     }
73737                     viewportHeight = viewportWidth * ratio;
73738                     db.saveObject("viewport_height", viewportHeight);
73739                 } else {
73740                     if (deviceId !== "custom") {
73741                         ratio = device.screen.width / device.screen.height;
73742                     } else {
73743                         ratio = width / height;
73744                     }
73745                     viewportHeight = viewportWidth * ratio;
73746                     db.saveObject("viewport_height", viewportHeight);
73747                 }
73748             } else if(viewportTag['height'] !== undefined) {
73749                 if (viewportTag['height'] === "device-height") {
73750                     viewportHeight = device.viewPort[layout].height;
73751                 } else if (viewportTag['height'] === "device-width") {
73752                     viewportHeight = device.viewPort[layout].width;
73753                 }
73754                 else {
73755                     viewportHeight = parseInt(viewportTag['height'], 10);
73756                     if (isNaN(viewportHeight)) {
73757                         viewportHeight = device.viewPort[layout].height;
73758                     }
73759                 }
73760                 db.saveObject("viewport_height", viewportHeight);
73761
73762                 if (layout === "portrait") {
73763                     if (deviceId !== "custom") {
73764                         ratio = device.screen.height / device.screen.width;
73765                     } else {
73766                         ratio = height / width;
73767                     }
73768                     viewportWidth = viewportHeight / ratio;
73769                     db.saveObject("viewport_width", viewportWidth);
73770                 } else {
73771                     if (deviceId !== "custom") {
73772                         ratio = device.screen.width / device.screen.height;
73773                     } else {
73774                         ratio = width / height;
73775                     }
73776                     viewportWidth = viewportHeight / ratio;
73777                     db.saveObject("viewport_width", viewportWidth);
73778                 }
73779             }
73780         }
73781
73782         if (viewportWidth === undefined) {
73783             if (deviceId === "custom") {
73784                 viewportWidth = width;
73785             } else {
73786                 viewportWidth = device.viewPort[layout].width;
73787             }
73788         }
73789
73790         if (viewportHeight === undefined) {
73791             if (deviceId === "custom") {
73792                 viewportHeight = height;
73793             } else {
73794                 viewportHeight = device.viewPort[layout].height;
73795             }
73796         }
73797
73798         $('#resolution-custom-width').val(width);
73799         $('#resolution-custom-height').val(height);
73800
73801         if (deviceId === "custom") {
73802             device.screen.width = width;
73803             device.screen.height = height;
73804             $('input:radio[name="resolution-type"][value="custom"]').click();
73805         }
73806
73807         if (layout === "portrait") {
73808             device.viewPort.portrait.width = viewportWidth;
73809             device.viewPort.portrait.height = viewportHeight;
73810             device.viewPort.landscape.width = viewportHeight;
73811             device.viewPort.landscape.height = viewportWidth;
73812         } else {
73813             device.viewPort.portrait.width = viewportHeight;
73814             device.viewPort.portrait.height = viewportWidth;
73815             device.viewPort.landscape.width = viewportWidth;
73816             device.viewPort.landscape.height = viewportHeight;
73817         }
73818         return device;
73819     },
73820
73821     getDevicesForPlatform: function (platformId) {
73822         return utils.filter(_devices, function (device) {
73823             return device.platforms.indexOf(platformId) > -1;
73824         });
73825     }
73826 };
73827
73828 });
73829 define('ripple/dbfs', function (require, exports, module) {
73830 /*
73831  *  Copyright 2011 Research In Motion Limited.
73832  *
73833  * Licensed under the Apache License, Version 2.0 (the "License");
73834  * you may not use this file except in compliance with the License.
73835  * You may obtain a copy of the License at
73836  *
73837  * http://www.apache.org/licenses/LICENSE-2.0
73838  *
73839  * Unless required by applicable law or agreed to in writing, software
73840  * distributed under the License is distributed on an "AS IS" BASIS,
73841  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
73842  * See the License for the specific language governing permissions and
73843  * limitations under the License.
73844  */
73845 var db = require('ripple/db'),
73846     utils = require('ripple/utils'),
73847     event = require('ripple/event'),
73848     _cache = {},
73849     _self;
73850
73851 function _get(path) {
73852     return path.replace(/^\//, '').split("/").reduce(function (obj, token) {
73853         return token === "" ? obj : (obj.children ? obj.children[token] || null : null);
73854     }, _cache);
73855 }
73856
73857 function _getInfo(path) {
73858     var parent = ("/" + path.replace(/^\//, '').replace(/\/$/, '')).split("/"),
73859         name = parent.splice(parent.length - 1, 1).join(""),
73860         ext = name.split(".");
73861
73862     return {
73863         name: name,
73864         extension: ext.length > 1 ? ext[ext.length - 1] : "",
73865         hidden: (name.length > 0 && name[0] === ".") || false,
73866         parent: parent.join("/") || "/"
73867     };
73868 }
73869
73870 function _set(path, obj) {
73871     var parent = _cache,
73872         tokens = path.replace(/^\//, '').replace(/\/$/, '').split("/"),
73873         child = tokens.splice(tokens.length - 1, 1).join("");
73874
73875     tokens.forEach(function (token) {
73876         parent = parent.children[token];
73877     });
73878
73879     parent.children = parent.children || {};
73880     obj.properties = obj.properties || {};
73881     parent.children[child] = obj;
73882 }
73883
73884 function _delete(path) {
73885     var parent = _cache,
73886         tokens = path.replace(/^\//, '').split("/"),
73887         child = tokens.splice(tokens.length - 1, 1).join("");
73888
73889     tokens.forEach(function (token) {
73890         parent = parent.children[token];
73891     });
73892
73893     delete parent.children[child];
73894 }
73895
73896 function _save() {
73897     db.saveObject("db-filesystem", _cache);
73898 }
73899
73900 _self = {
73901
73902     initialize: function (prev, baton) {
73903         _cache = db.retrieveObject("db-filesystem") || {};
73904         event.trigger("FileSystemInitialized", null, true);
73905     },
73906
73907     ls: function (path, success, error) {
73908         try {
73909             var dir = _get(path),
73910                 items = [];
73911
73912             if (dir) {
73913                 utils.forEach(dir.children, function (item) {
73914                     if (!item.isDirectory) {
73915                         item.file = function (callback) {
73916                             callback({});
73917                         };
73918                     }
73919                     items.push(item);
73920                 });
73921             }
73922             else {
73923                 items = {};
73924             }
73925
73926             success(utils.copy(items));
73927         }
73928         catch (e) {
73929             e.code = 1;
73930             error(e);
73931         }
73932     },
73933
73934     rm: function (path, success, error, options) {
73935         _delete(path);
73936         _save();
73937         success();
73938     },
73939
73940     rmdir: function (path, success, error, options) {
73941         _delete(path);
73942         _save();
73943         success();
73944     },
73945
73946     mkdir: function (path, success, error) {
73947         var entry = _get(path),
73948             info = _getInfo(path);
73949
73950         if (!entry) {
73951             _set(path, {
73952                 name: info.name,
73953                 isDirectory: true,
73954                 fullPath: path
73955             });
73956             entry = _get(path);
73957         }
73958         
73959         _save();
73960         if (entry) {
73961             success(utils.copy(entry));
73962         }
73963         else {
73964             error({code: 1});
73965         }
73966     },
73967
73968     mv: function (from, to, success, error) {
73969         try {
73970             var fromEntry = _get(from),
73971                 toInfo = _getInfo(to);
73972
73973             fromEntry.fullPath = to;
73974             fromEntry.name = toInfo.name;
73975
73976             _set(to, fromEntry);
73977             _delete(from);
73978             _save();
73979             success(utils.copy(_get(to)));
73980         }
73981         catch (e) {
73982             e.code = 1;
73983             error(e);
73984         }
73985     },
73986
73987     touch: function (path, success, error) {
73988         if (!_get(path)) {
73989             _set(path, {
73990                 fullPath: path
73991             });
73992         }
73993         _save();
73994         success(utils.copy(_get(path)));
73995     },
73996
73997     cp: function (from, to, success, error) {
73998         try {
73999             var fromEntry = _get(from);
74000             fromEntry.fullPath = to;
74001             _set(to, fromEntry);
74002             _save();
74003             success(utils.copy(_get(to)));
74004         }
74005         catch (e) {
74006             e.code = 1;
74007             error(e);
74008         }
74009     },
74010
74011     stat: function (path, success, error) {
74012         var entry = _get(path);
74013         success(utils.copy(entry));
74014     },
74015
74016     write: function (path, contents, success, error, options) {
74017         var info = _getInfo(path);
74018
74019         _set(path, {
74020             lastModifiedDate: new Date(),
74021             name: info.name,
74022             fullPath: path,
74023             isDirectory: false,
74024             properties: {
74025                 type: "",
74026                 size: contents.size
74027             },
74028             data: contents,
74029             file: function (callback) {
74030                 callback({});
74031             }
74032         });
74033
74034         success(utils.copy(_get(path)));
74035     },
74036
74037     read: function (path, success, error) {
74038         var entry = _get(path);
74039
74040         if (entry) {
74041             success(utils.copy(entry.data));
74042         }
74043         else {
74044             error({code: 1});
74045         }
74046     }
74047 };
74048
74049 module.exports = _self;
74050
74051 });
74052 define('ripple/deviceMotionEmulator', function (require, exports, module) {
74053 /*
74054  *  Copyright 2011 Research In Motion Limited.
74055  *
74056  * Licensed under the Apache License, Version 2.0 (the "License");
74057  * you may not use this file except in compliance with the License.
74058  * You may obtain a copy of the License at
74059  *
74060  * http://www.apache.org/licenses/LICENSE-2.0
74061  *
74062  * Unless required by applicable law or agreed to in writing, software
74063  * distributed under the License is distributed on an "AS IS" BASIS,
74064  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
74065  * See the License for the specific language governing permissions and
74066  * limitations under the License.
74067  */
74068
74069 var event = require('ripple/event'),
74070     platform = require('ripple/platform'),
74071     INTERVAL = 60000,
74072     _self;
74073
74074 function _bind(name, win) {
74075     var callback = null;
74076
74077     win.__defineGetter__(name, function () {
74078         return callback;
74079     });
74080
74081     win.__defineSetter__(name, function (cb) {
74082         callback = cb;
74083     });
74084
74085     return {
74086         get: function () {
74087             return callback;
74088         },
74089         set: function (value) {
74090             callback = value;
74091         },
74092         exec: function (arg) {
74093             return callback && callback(arg);
74094         },
74095         unbind: function (cb) {
74096             callback = cb === callback ? null : callback;
74097         }
74098     };
74099 }
74100
74101 _self = {
74102     init: function (win, doc) {
74103         var widgetWindow = win,
74104             _motion,
74105             _orientation,
74106             _calibration,
74107             add = widgetWindow.addEventListener,
74108             remove = widgetWindow.removeEventListener;
74109
74110         //Hang events off window (these are used to check for API existence by developer)
74111         widgetWindow.DeviceMotionEvent = function DeviceMotionEvent() {};
74112         widgetWindow.DeviceOrientationEvent = function DeviceOrientationEvent() {};
74113
74114         _motion = _bind("ondevicemotion", widgetWindow);
74115         _orientation = _bind("ondeviceorientation", widgetWindow);
74116         _calibration = _bind("oncompassneedscalibration", widgetWindow);
74117
74118         widgetWindow.addEventListener = function (e, callback, useCapture) {
74119             switch (e) {
74120             case "deviceorientation":
74121                 _orientation.set(callback);
74122                 event.trigger("DeviceOrientationEventAddedEvent");
74123                 break;
74124             case "devicemotion":
74125                 _motion.set(callback);
74126                 event.trigger("DeviceMotionEventAddedEvent");
74127                 break;
74128             case "compassneedscalibration":
74129                 _calibration.set(callback);
74130                 break;
74131
74132             default:
74133                 add.apply(widgetWindow, arguments);
74134                 break;
74135             }
74136         };
74137
74138         widgetWindow.removeEventListener = function (event, callback) {
74139             _motion.unbind(callback);
74140             _orientation.unbind(callback);
74141             _calibration.unbind(callback);
74142             remove.apply(widgetWindow, arguments);
74143         };
74144
74145         event.on("DeviceMotionEvent", function (motion) {
74146             var _motionEvent, DeviceMotionEvent;
74147
74148             if (platform.current().DeviceMotionEvent) {
74149                 DeviceMotionEvent = platform.current().DeviceMotionEvent;
74150                 if (typeof DeviceMotionEvent !== "function")
74151                     return;
74152
74153                 _motionEvent = new DeviceMotionEvent();
74154                 _motionEvent.initAccelerometerEvent("devicemotion", true, false, motion.acceleration, motion.accelerationIncludingGravity, 
74155                                                     motion.rotationRate, INTERVAL);    
74156             }
74157             else {
74158                 _motionEvent = {
74159                     acceleration: motion.acceleration,
74160                     accelerationIncludingGravity: motion.accelerationIncludingGravity,
74161                     rotationRate: motion.rotationRate
74162                 };
74163             }
74164
74165             _motion.exec(_motionEvent);
74166         });
74167
74168         event.on("DeviceOrientationEvent", function (motion) {
74169             var _orientationEvent, DeviceOrientationEvent;
74170
74171             if (platform.current().DeviceOrientationEvent) {
74172                 DeviceOrientationEvent = platform.current().DeviceOrientationEvent;
74173                 if (typeof DeviceOrientationEvent !== "function")
74174                     return;
74175
74176                 _orientationEvent = new DeviceOrientationEvent();        
74177                 _orientationEvent.initDeviceOrientationEvent("deviceorientation", true, false, motion.orientation.alpha, 
74178                                                               motion.orientation.beta, motion.orientation.gamma, true);
74179             }
74180             else {
74181                 _orientationEvent = motion.orientation;
74182             }
74183
74184             _orientation.exec(_orientationEvent);
74185         });
74186     }
74187 };
74188
74189 module.exports = _self;
74190
74191 });
74192 define('ripple/platform', function (require, exports, module) {
74193 /*
74194  *  Copyright 2011 Research In Motion Limited.
74195  *
74196  * Licensed under the Apache License, Version 2.0 (the "License");
74197  * you may not use this file except in compliance with the License.
74198  * You may obtain a copy of the License at
74199  *
74200  * http://www.apache.org/licenses/LICENSE-2.0
74201  *
74202  * Unless required by applicable law or agreed to in writing, software
74203  * distributed under the License is distributed on an "AS IS" BASIS,
74204  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
74205  * See the License for the specific language governing permissions and
74206  * limitations under the License.
74207  */
74208 var _current,
74209     db = require('ripple/db'),
74210     utils = require('ripple/utils'),
74211     _console = require('ripple/console'),
74212     app = require('ripple/app'),
74213     event = require('ripple/event'),
74214     spec = require('ripple/platform/spec'),
74215     _self;
74216
74217 function _getRequestedPlatform() {
74218     var requestedPlatform = null,
74219         enableRippleArg = utils.queryString().enableripple,
74220         platform;
74221
74222     if (enableRippleArg) {
74223         enableRippleArg = enableRippleArg.split('-');
74224         platform = spec.get(enableRippleArg[0], enableRippleArg[1]);
74225         if (platform) {
74226             requestedPlatform = { name: platform.id, version: platform.version };
74227         }
74228     }
74229
74230     return requestedPlatform;
74231 }
74232
74233 function _validatePlatform(platform, defaultPlatform) {
74234     if (!platform ||
74235         !spec[platform.name] ||
74236         !spec[platform.name][platform.version] ||
74237         (spec[platform.name][platform.version] && !spec[platform.name][platform.version].objects)) {
74238         return defaultPlatform;
74239     }
74240     return platform;
74241 }
74242
74243 function _getPlatform() {
74244     return require('ripple/platform/' + _current.name + "/" + _current.version + "/spec");
74245 }
74246
74247 function _getCurrentPlatform() {
74248     var uriParams, platform = {};
74249
74250     uriParams = utils.getURIParams(document.documentURI);
74251     if (uriParams && uriParams.platform) {
74252         var platformName = uriParams.platform.split("-")[0], platformVersion;
74253
74254         if (platformName === "mobile" || platformName === "tizen") {
74255             platformName = "tizen";
74256             platformVersion = "2.0";
74257         }
74258         else {
74259             platformName = "ivi";
74260             platformVersion = "3.0";
74261         }
74262         platform.name = platformName;
74263         platform.version = platformVersion;
74264
74265         return platform;
74266     }
74267
74268     return undefined;
74269 }
74270
74271 _self = {
74272     initialize: function () {
74273         var firstAvailablePlatform = utils.map(this.getList(), function (platform) {
74274             return utils.map(platform, function (details, version) {
74275                 return {name: details.id, version: version};
74276             })[0];
74277         })[0];
74278
74279         _current = _getRequestedPlatform() || _getCurrentPlatform() ||
74280                 db.retrieveObject("api-key") || firstAvailablePlatform;
74281         _current = _validatePlatform(_current, firstAvailablePlatform);
74282
74283         db.saveObject("api-key", _current);
74284
74285         _console.prefix = _current.name;
74286     },
74287
74288     getList: function () {
74289         var platformList = {};
74290         utils.forEach(spec, function (platform, platformKey) {
74291             utils.forEach(platform, function (version, versionKey) {
74292                 platformList[platformKey] = platformList[platformKey] || {};
74293                 platformList[platformKey][versionKey] = {
74294                     "id": version.id,
74295                     "name": version.name,
74296                     "type": version.type,
74297                     "text": require('ripple/platform/' + platformKey + "/" + versionKey + "/spec").version
74298                 };
74299             });
74300         });
74301
74302         return platformList;
74303     },
74304
74305     getPersistencePrefix: function (id) {
74306         return _getPlatform().persistencePrefix + (id || app.getInfo().id) + "-";
74307     },
74308
74309     current: function () {
74310         return _getPlatform();
74311     },
74312
74313     changeEnvironment: function (platform, deviceId, callback) {
74314         var save = jWorkflow.order(function (prev, baton) {
74315                 baton.take();
74316                 db.saveObject("api-key", platform, null, baton.pass);
74317             }).andThen(function (prev, baton) {
74318                 baton.take();
74319                 db.save("device-key", deviceId, null, baton.pass);
74320             }).andThen(function (prev, baton) {
74321                 //remove the persisted value for the layout
74322                 baton.take();
74323                 db.save("layout", null, null, baton.pass);
74324             }).andThen(function () {
74325                 event.trigger("PlatformChangedEvent", [], true);
74326                 _console.prefix = null;
74327                 _console.log("Emulator :: loading platform " + platform.name);
74328             });
74329
74330         save.start(callback);
74331     }
74332 };
74333
74334 module.exports = _self;
74335
74336 });
74337 define('ripple/hwKeyEmulator', function (require, exports, module) {
74338 /*
74339  *  Copyright 2011 Research In Motion Limited.
74340  *
74341  * Licensed under the Apache License, Version 2.0 (the "License");
74342  * you may not use this file except in compliance with the License.
74343  * You may obtain a copy of the License at
74344  *
74345  * http://www.apache.org/licenses/LICENSE-2.0
74346  *
74347  * Unless required by applicable law or agreed to in writing, software
74348  * distributed under the License is distributed on an "AS IS" BASIS,
74349  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
74350  * See the License for the specific language governing permissions and
74351  * limitations under the License.
74352  */
74353
74354 var event = require('ripple/event'),
74355    _self;
74356
74357 function _HWKeyEvent(keyName) {
74358     var doc = document.getElementById('document').contentDocument,
74359     event;
74360
74361     event = doc.createEvent('Event');
74362     event.initEvent("tizenhwkey", true, false);
74363     event.__defineGetter__("keyName", function () {
74364         return keyName;
74365     });
74366     doc.dispatchEvent(event);
74367 }
74368
74369
74370 _self = {
74371     init: function (win, doc) {
74372         event.clear("tizenhwkeyEvent");
74373         event.on("tizenhwkeyEvent", function (keyName) {
74374             _HWKeyEvent(keyName);
74375         });
74376     }
74377 };
74378
74379 module.exports = _self;
74380
74381 });
74382 define('ripple/emulatorBridge', function (require, exports, module) {
74383 /*
74384  *  Copyright 2011 Research In Motion Limited.
74385  *
74386  * Licensed under the Apache License, Version 2.0 (the "License");
74387  * you may not use this file except in compliance with the License.
74388  * You may obtain a copy of the License at
74389  *
74390  * http://www.apache.org/licenses/LICENSE-2.0
74391  *
74392  * Unless required by applicable law or agreed to in writing, software
74393  * distributed under the License is distributed on an "AS IS" BASIS,
74394  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
74395  * See the License for the specific language governing permissions and
74396  * limitations under the License.
74397  */
74398 var platform = require('ripple/platform'),
74399     builder = require('ripple/platform/builder'),
74400     utils = require('ripple/utils'),
74401     _xhr, _win, _doc;
74402
74403 function _getEmulatedViewportStyle(attr) {
74404     var vp = document.getElementById("viewport-container");
74405     return vp["client" + attr];
74406 }
74407
74408 function _getEmulatedDeviceStyle(attr) {
74409     var vp = document.getElementById("device-container"), value;
74410     value = vp.style[attr].replace(/\s/g, '');
74411     value = value.split("px")[0] - 4;
74412     return (value);
74413 }
74414
74415 function _screenAvailWidth() {
74416     return _getEmulatedDeviceStyle("width");
74417 }
74418
74419 function _screenAvailHeight() {
74420     return _getEmulatedDeviceStyle("height");
74421 }
74422
74423 function _screenWidth() {
74424     return _getEmulatedDeviceStyle("width");
74425 }
74426
74427 function _screenHeight() {
74428     return _getEmulatedDeviceStyle("height");
74429 }
74430
74431 function _window_innerWidth() {
74432     return _getEmulatedViewportStyle("Width");
74433 }
74434
74435 function _window_innerHeight() {
74436     return _getEmulatedViewportStyle("Height");
74437 }
74438
74439 function _marshalScreen(win) {
74440     utils.forEach({
74441         "availWidth": _screenAvailWidth,
74442         "availHeight": _screenAvailHeight,
74443         "width": _screenWidth,
74444         "height": _screenHeight
74445     }, function (mappedFunc, prop) {
74446         win.screen.__defineGetter__(prop, mappedFunc);
74447     });
74448
74449     utils.forEach({
74450         "innerWidth": _window_innerWidth,
74451         "innerHeight": _window_innerHeight
74452     }, function (mappedFunc, prop) {
74453         win.__defineGetter__(prop, mappedFunc);
74454     });
74455 }
74456
74457 module.exports = {
74458     link: function  (win, doc) {
74459         // Only cache the device window and route onmessage to it
74460         if (win.parent.parent === win.parent &&
74461                 win.frameElement.getAttribute('id') === 'document') {
74462             _win = win;
74463             _doc = doc;
74464             _xhr = win.XMLHttpRequest;
74465
74466             window.onmessage = function (e) {
74467                 if (typeof win.onmessage === 'function') {
74468                     win.onmessage(e);
74469                 }
74470             };
74471         }
74472
74473         require('ripple/widgetConfig').initialize();
74474
74475         var marshal = function (obj, key) {
74476                 window[key] = win[key] = obj;
74477             },
74478             currentPlatform = platform.current(),
74479             sandbox = {};
74480
74481         marshal(window.tinyHippos, "tinyHippos");
74482         marshal(window.XMLHttpRequest, "XMLHttpRequest");
74483         marshal(window.Date, "Date");
74484
74485         if (currentPlatform.initialize) {
74486             currentPlatform.initialize(win);
74487         }
74488
74489         builder.build(platform.current().objects).into(sandbox);
74490         utils.forEach(sandbox, marshal);
74491
74492         _marshalScreen(win);
74493         _marshalScreen(window);
74494     },
74495
74496     document: function () {
74497         return _doc;
74498     },
74499
74500     window: function () {
74501         return _win;
74502     },
74503
74504     xhr: function () {
74505         return _xhr;
74506     }
74507 };
74508
74509 });
74510 define('ripple/documentEventListener', function (require, exports, module) {
74511 /*
74512  *  Copyright 2012 Intel Corporation.
74513  *
74514  * Licensed under the Apache License, Version 2.0 (the "License");
74515  * you may not use this file except in compliance with the License.
74516  * You may obtain a copy of the License at
74517  *
74518  * http://www.apache.org/licenses/LICENSE-2.0
74519  *
74520  * Unless required by applicable law or agreed to in writing, software
74521  * distributed under the License is distributed on an "AS IS" BASIS,
74522  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
74523  * See the License for the specific language governing permissions and
74524  * limitations under the License.
74525  */
74526
74527 var event = require('ripple/event'),
74528     constants = require('ripple/constants'),
74529     deviceSettings = require('ripple/deviceSettings'),
74530     ui = require('ripple/ui'),
74531     _self,
74532     _ComWinShow = false;
74533
74534 function _bind(name, win) {
74535     var _listeners = [];
74536
74537     return {
74538         add: function (callback, useCapture) {
74539             // ignore non-function
74540             if (typeof callback === "function") {
74541                 // ignore useCapture as we could not handle it
74542                 if (!useCapture) {
74543                     if (!_listeners.some(function (listener) {
74544                         return (listener === callback);
74545                     })) {
74546                         _listeners.push(callback);
74547                     }
74548                 }
74549             }
74550         },
74551         exec: function (arg) {
74552             _listeners.forEach(function (listener) {
74553                 listener.apply(win, arg);
74554             });
74555         },
74556         remove: function (callback, useCapture) {
74557             // ignore non-function
74558             if (typeof callback === "function") {
74559                 // ignore useCapture as we do not add them into _listeners
74560                 if (!useCapture) {
74561                     _listeners = _listeners.filter(function (listener) {
74562                         return (listener !== callback);
74563                     });
74564                 }
74565             }
74566         }
74567     };
74568 }
74569
74570 function _isComWinSHow() {
74571     return _ComWinShow;
74572 }
74573
74574 _self = {
74575     mask: function (frame, doc) {
74576         /* 
74577          * The current issue is that "document.addEventListener(visibilitychange, function(){...})" 
74578          * does not work if it is invoked in the document.DOMContentLoaded listeners, for example, at 
74579          * JQuery(document).ready function.
74580
74581          * The reason is that window.DOMContentLoaded is fired after the document.DOMContentLoaded. 
74582          * Currently we have not found a proper event to override the document.addEventListener. 
74583          * The beforeload is fine for window.addEventListener, while does not work for document.addEventListener 
74584          * because the contentDocument will be reset after loading. 
74585          */
74586         frame.addEventListener("DOMContentLoaded", function () {
74587             var widgetDocument = doc,
74588                 _pageVisibility,
74589                 add = widgetDocument.addEventListener,
74590                 remove = widgetDocument.removeEventListener;
74591
74592             widgetDocument.PAGE_HIDDEN  = "hidden";
74593             widgetDocument.PAGE_VISIBLE = "visible";
74594             widgetDocument.PAGE_PREVIEW = "preview";
74595
74596             function _lockScreen(on) {
74597                 var hidden = on;
74598
74599                 if (on) {
74600                     ui.showOverlay("lock-screen-window", function (background) {});
74601                 } else {
74602                     ui.hideOverlay("lock-screen-window", function (background) {});
74603                 }
74604
74605                 event.trigger("visibilitychange", [hidden]);
74606             }
74607
74608             function _isLockScreenOn() {
74609                 return deviceSettings.retrieve("Config.lockScreen");
74610             }
74611
74612             _lockScreen(_isLockScreenOn());
74613
74614             _pageVisibility = _bind("visibilitychange", frame.contentWindow);
74615
74616             widgetDocument.addEventListener = function (event, callback, useCapture) {
74617                 switch (event) {
74618                 case "visibilitychange":
74619                     _pageVisibility.add(callback, useCapture);
74620                     break;
74621
74622                 default:
74623                     add.apply(widgetDocument, arguments);
74624                     break;
74625                 }
74626             };
74627
74628             widgetDocument.removeEventListener = function (event, callback, useCapture) {
74629                 _pageVisibility.remove(callback, useCapture);
74630                 remove.apply(widgetDocument, arguments);
74631             };
74632
74633             event.on("LockScreenChanged", function (on) {
74634                 if (_isComWinSHow() === false) {
74635                     _lockScreen(on);
74636                 }
74637                 else {
74638                     if (on === true) {
74639                         ui.hideOverlay("communication-window");
74640                         _lockScreen(on);
74641                     }
74642                     else {
74643                         _lockScreen(on);
74644                         ui.showOverlay("communication-window");
74645                     }
74646                 }
74647             });
74648
74649             event.on("CommWinShow", function (status) {
74650                 _ComWinShow = status;
74651                 if (_isLockScreenOn() === true) {
74652                     if (status === false) {
74653                         _lockScreen(true);
74654                     }
74655                     else {
74656                         jQuery("#lock-screen-window").hide();
74657                     }
74658                 }
74659             });
74660
74661             event.on("visibilitychange", function (hidden) {
74662                 widgetDocument.hidden = hidden;
74663                 widgetDocument.visibilityState = hidden ? widgetDocument.PAGE_HIDDEN : widgetDocument.PAGE_VISIBLE;
74664                 _pageVisibility.exec();
74665             });
74666         });
74667     }
74668 };
74669
74670 module.exports = _self;
74671
74672 });
74673 define('ripple/honeypot', function (require, exports, module) {
74674 /*
74675  *  Copyright 2011 Research In Motion Limited.
74676  *
74677  * Licensed under the Apache License, Version 2.0 (the "License");
74678  * you may not use this file except in compliance with the License.
74679  * You may obtain a copy of the License at
74680  *
74681  * http://www.apache.org/licenses/LICENSE-2.0
74682  *
74683  * Unless required by applicable law or agreed to in writing, software
74684  * distributed under the License is distributed on an "AS IS" BASIS,
74685  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
74686  * See the License for the specific language governing permissions and
74687  * limitations under the License.
74688  */
74689
74690 var noop = function () {};
74691
74692 module.exports = {
74693     monitor: function (context, target) {
74694
74695         var setup = function (get, set) {
74696             set = set || noop;
74697
74698             context.__defineGetter__(target, noop);
74699             context.__defineSetter__(target, function (value) {
74700                 context.__defineGetter__(target, get);
74701                 set(value);
74702             });
74703         };
74704
74705         return {
74706             andReturn: function (value) {
74707                 setup(function () {
74708                     return value;
74709                 });
74710             },
74711             andRun: function (get, set) {
74712                 setup(get, set);
74713             }
74714         };
74715     }
74716 };
74717
74718 });
74719 define('ripple/bootstrap', function (require, exports, module) {
74720 /*
74721  *  Copyright 2011 Research In Motion Limited.
74722  *
74723  * Licensed under the Apache License, Version 2.0 (the "License");
74724  * you may not use this file except in compliance with the License.
74725  * You may obtain a copy of the License at
74726  *
74727  * http://www.apache.org/licenses/LICENSE-2.0
74728  *
74729  * Unless required by applicable law or agreed to in writing, software
74730  * distributed under the License is distributed on an "AS IS" BASIS,
74731  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
74732  * See the License for the specific language governing permissions and
74733  * limitations under the License.
74734  */
74735 var _bound,
74736     _console = require('ripple/console'),
74737     utils = require('ripple/utils'),
74738     ui = require('ripple/ui'),
74739     db = require('ripple/db'),
74740     _CURRENT_URL = "current-url",
74741     resizer = require('ripple/resizer'),
74742     platform = require('ripple/platform');
74743
74744 var _srcChangedObserver = new WebKitMutationObserver(function (mutations) {
74745             utils.forEach(mutations, function (mutation) {
74746                 _bindObjectsToFrame(mutation.target);
74747             });
74748         });
74749
74750 function _observeIframeAdded(doc) {
74751     doc._iframeAddedObserver.observe(doc, {childList: true, subtree: true});
74752 }
74753
74754 function _bindObjects(win, doc) {
74755     if (!win.tinyHippos) {
74756         require('ripple/emulatorBridge').link(win, doc);
74757         /// require('ripple/platform/tizen/2.0/touchEvent').mask(win, doc);
74758         require('ripple/touchEventEmulator').mask(win, doc);
74759         require('ripple/hwKeyEmulator').init(win, doc);
74760         require('ripple/documentEventListener').mask(win, doc);
74761         require('ripple/deviceMotionEmulator').init(win, doc);
74762         require('ripple/resizer').init(win, doc);
74763         win.addEventListener("DOMContentLoaded", function () {
74764             var iframes =  $(this.document).find("iframe");
74765             // Observe iframe added event so that we can bind objects to newly added iframes
74766             if (!this.document._iframeAddedObserver) {
74767                 this.document._iframeAddedObserver = new WebKitMutationObserver(function (mutations) {
74768                     utils.forEach(mutations, function (mutation) {
74769                         for (var i in mutation.addedNodes) {
74770                             var node = mutation.addedNodes[i];
74771                             if (node.tagName && (node.tagName.toUpperCase() === "IFRAME")) {
74772                                 _bindObjectsToFrame(node);
74773                             }
74774                         }
74775                     });
74776                 });
74777                 _observeIframeAdded(this.document);
74778             }
74779             iframes.each(function () {
74780                 _bindObjectsToFrame(this);
74781             });
74782
74783         });
74784         win.frameElement._bound = true;
74785     }
74786 }
74787
74788 function _beforeLoad() {
74789     this._bound = false;
74790     _bindObjects(this.contentWindow, this.contentDocument);
74791     this._intervalId = window.setInterval(function () {
74792         if (this._bound) {
74793             window.clearInterval(this._intervalId);
74794         } else {
74795             _bindObjects(this.contentWindow, this.contentDocument);
74796         }
74797     }.bind(this), 1);
74798 }
74799
74800 function _bindObjectsToFrame(frame) {
74801     _srcChangedObserver.observe(frame, {attributes: true, attributeFilter: ["src"]});
74802     frame.addEventListener("DOMNodeInserted", _beforeLoad);
74803 //    frame.addEventListener("beforeload", _beforeLoad);
74804     // beforeload event of an iframe will not be triggered unless we detach and
74805     // then attach the iframe to the dom tree
74806     var parentNode = frame.parentNode;
74807     var nextNode = frame.nextSibling;
74808     if (parentNode) {
74809         // Disable iframe added observer to avoid infinite loop of binding objects
74810         if (frame.ownerDocument && frame.ownerDocument._iframeAddedObserver) {
74811             frame.ownerDocument._iframeAddedObserver.disconnect();
74812         }
74813         parentNode.removeChild(frame);
74814         parentNode.insertBefore(frame, nextNode);
74815
74816         if (frame.ownerDocument && frame.ownerDocument._iframeAddedObserver) {
74817             _observeIframeAdded(frame.ownerDocument);
74818         }
74819     }
74820 }
74821
74822 function _createFrame(src) {
74823     var frame = document.createElement("iframe");
74824     frame.setAttribute("id", "document");
74825     frame.src = src;
74826
74827     if (ui.registered("omnibar")) {
74828         _bindObjectsToFrame(frame);
74829     }
74830
74831     return frame;
74832 }
74833
74834 function _cleanBody() {
74835     require('ripple/utils').forEach(document.body.children, function (child) {
74836         if (child && child.id && !child.id.match(/ui|tooltip|bus/)) {
74837             document.body.removeChild(child);
74838         }
74839
74840         document.body.removeAttribute("style");
74841         document.body.removeAttribute("id");
74842         document.body.removeAttribute("class");
74843     });
74844 }
74845
74846 function reload() {
74847     window.tinyHipposReload = true;
74848     location.reload();
74849 }
74850
74851 function _post(src) {
74852     var event = require('ripple/event'),
74853         frame = _createFrame(src);
74854
74855     _console.log("Initialization Finished (Make it so.)");
74856
74857     frame.onload = function () {
74858         var bootLoader = document.querySelector("#emulator-booting"),
74859             id,
74860             iframe = document.getElementById('document'),
74861             viewportTagFound = false,
74862             viewportTagContent = {},
74863             viewportTagStr = "",
74864             tagProperties = [],
74865             propertyKey ="",
74866             propertyValue = "",
74867             curViewPortWidth = "",
74868             curViewPortHeight = "",
74869             layout = db.retrieve("layout") || "portrait",
74870             preLayout = "";
74871
74872         if (bootLoader) {
74873             document.querySelector("#ui").removeChild(bootLoader);
74874         }
74875
74876         // Workaround to enforce the content of iframe to rerender when scrolling
74877         document.getElementById('document').contentWindow.onscroll = function() {
74878             jQuery("#device-maskmask").show();
74879             setTimeout(function() {
74880                 jQuery("#device-maskmask").hide();
74881             }, 50);
74882         }
74883
74884         event.trigger("TinyHipposLoaded");
74885         _cleanBody();
74886         id = window.setInterval(_cleanBody, 20);
74887
74888         window.setTimeout(function () {
74889             window.clearInterval(id);
74890         }, 1200);
74891
74892         // Clean data for different app
74893         if (db.retrieve("current-url") !== db.retrieve("previous-url")) {
74894             db.remove("viewport_width");
74895             db.remove("viewport_height");
74896             db.remove("viewportTag");
74897             db.remove("prelayout");
74898         }
74899
74900         curViewPortWidth = db.retrieve("viewport_width");
74901         curViewPortHeight = db.retrieve("viewport_height");
74902         preLayout = db.retrieve("prelayout") || "portrait";
74903         db.save("previous-url", db.retrieve("current-url"));
74904
74905         if (iframe.contentDocument.getElementsByName('viewport')[0] !== undefined) {
74906             viewportTagStr = iframe.contentDocument.getElementsByName('viewport')[0].getAttribute("content");
74907             viewportTagStr = viewportTagStr.replace(/\s/g, '');
74908             tagProperties = viewportTagStr.split(",");
74909
74910             for (var i in tagProperties) {
74911                 propertyKey = tagProperties[i].split("=")[0];
74912                 propertyValue = tagProperties[i].split("=")[1];
74913                 viewportTagContent[propertyKey] = propertyValue;
74914             }
74915             viewportTagFound = true;
74916         }
74917
74918         // if viewport tag found (width, height)
74919         if (viewportTagFound && ((viewportTagContent['width'] !== undefined) || (viewportTagContent['height'] !== undefined))) {
74920             if ((viewportTagContent['width'] !== undefined)) {
74921                 if (curViewPortWidth !== viewportTagContent['width']) {
74922                     db.saveObject("viewportTag", viewportTagContent);
74923                     if (layout !== preLayout) {
74924                         db.save("prelayout", layout);
74925                         resizer.changeLayoutType(layout);
74926                         event.trigger("LayoutChanged", [layout], true);
74927                         frame.contentWindow.location.reload(); // get the updated screenAvailWidth, screenWidth....
74928                     } else {
74929                         resizer.changeLayoutType(layout);
74930                     }
74931                 }
74932             } else {
74933                 if (curViewPortHeight !== viewportTagContent['height']) {
74934                     db.saveObject("viewportTag", viewportTagContent);
74935                     if (layout !== preLayout) {
74936                         db.save("prelayout", layout);
74937                         resizer.changeLayoutType(layout);
74938                         event.trigger("LayoutChanged", [layout], true);
74939                         frame.contentWindow.location.reload(); // get the updated screenAvailWidth, screenWidth....
74940                     } else {
74941                         resizer.changeLayoutType(layout);
74942                     }
74943                 }
74944             }
74945         } else {
74946             // Set layout to portrait if no viewport tag detected
74947             resizer.changeLayoutType('portrait');
74948             event.trigger("LayoutChanged", ['portrait'], true);
74949         }
74950
74951         if (ui.registered("omnibar")) {
74952             //reset the onload function so that when navigating we can destroy
74953             //the iframe and create a new one so we can reinject the platform by
74954             //calling post again.
74955             frame.onload = function () {
74956                 var url = frame.contentWindow.location.href;
74957                 document.getElementById("viewport-container").removeChild(frame);
74958                 event.trigger("FrameHistoryChange", [url]);
74959                 _console.log("-----------------------------------------------------------");
74960                 _console.log("Pay no attention to that man behind the curtain.");
74961                 _console.log("Environment Warning up again (Set main batteries to auto-fire cycle)");
74962                 _post(url);
74963             };
74964         }
74965     };
74966
74967     // append frame
74968     document.getElementById("viewport-container").appendChild(frame);
74969
74970     delete tinyHippos.boot;
74971 }
74972
74973 function _bootstrap() {
74974     // TODO: figure this out for web and ext
74975     //_console.log("-----------------------------------------------------------");
74976     //_console.log("There be dragons above here!");
74977     _console.log("Web Simulator :: Environment Warming Up (Tea. Earl Gray. Hot.)");
74978
74979     window.tinyHippos = require('ripple');
74980
74981     tinyHippos.boot(function () {
74982         var uri = ui.registered('omnibar') ?
74983                 db.retrieve(_CURRENT_URL) || "about:blank" :
74984                 document.documentURI.replace(/enableripple=[^&]*[&]?/i, "").replace(/[\?&]*$/, "");
74985
74986         _post(uri);
74987         delete tinyHippos.boot;
74988     });
74989 }
74990
74991 module.exports = {
74992     bootstrap: _bootstrap,
74993     inject: function (frameWindow, frameDocument) {
74994         _bindObjects(frameWindow, frameDocument);
74995     }
74996 };
74997
74998 });
74999 define('ripple/appcache', function (require, exports, module) {
75000 /*
75001  *  Copyright 2011 Research In Motion Limited.
75002  *
75003  * Licensed under the Apache License, Version 2.0 (the "License");
75004  * you may not use this file except in compliance with the License.
75005  * You may obtain a copy of the License at
75006  *
75007  * http://www.apache.org/licenses/LICENSE-2.0
75008  *
75009  * Unless required by applicable law or agreed to in writing, software
75010  * distributed under the License is distributed on an "AS IS" BASIS,
75011  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
75012  * See the License for the specific language governing permissions and
75013  * limitations under the License.
75014  */
75015 module.exports = {
75016     initialize: function () {
75017         window.addEventListener('load', function (e) {
75018             window.applicationCache.addEventListener('updateready', function (e) {
75019                 if (window.applicationCache.status === window.applicationCache.UPDATEREADY) {
75020                     window.applicationCache.swapCache();
75021                     window.location.reload();
75022                 }
75023             }, false);
75024         }, false);
75025     }
75026 };
75027
75028 });
75029 define('ripple/app', function (require, exports, module) {
75030 /*
75031  *  Copyright 2011 Research In Motion Limited.
75032  *
75033  * Licensed under the Apache License, Version 2.0 (the "License");
75034  * you may not use this file except in compliance with the License.
75035  * You may obtain a copy of the License at
75036  *
75037  * http://www.apache.org/licenses/LICENSE-2.0
75038  *
75039  * Unless required by applicable law or agreed to in writing, software
75040  * distributed under the License is distributed on an "AS IS" BASIS,
75041  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
75042  * See the License for the specific language governing permissions and
75043  * limitations under the License.
75044  */
75045 var _data = {},
75046     utils = require('ripple/utils'),
75047     _self;
75048
75049 _self = {
75050     setInfo: function (info) {
75051         if (!info) {
75052             _data = {};
75053         }
75054         _data = info;
75055     },
75056
75057     getInfo: function () {
75058         return utils.copy(_data);
75059     },
75060
75061     isPreferenceReadOnly: function (key) {
75062         return (_data.preferences &&
75063                 _data.preferences[key] &&
75064                 _data.preferences[key].readonly &&
75065                 _data.preferences[key].readonly === true);
75066     },
75067
75068     validateVersion: function (configValidationObject) {
75069         // TODO: WTF figure this out, platform is empty object when require at require time
75070         // could be that the new platform _getBuilder code dies when called, beforre it is initialized
75071         var spec = require('ripple/platform').current();
75072         if (typeof spec.config.validateVersion === "function" && configValidationObject) {
75073             return spec.config.validateVersion(configValidationObject);
75074         }
75075
75076         return true;
75077     },
75078
75079     saveInfo: function (configValidationObject) {
75080         var spec = require('ripple/platform').current(),
75081             info = null;
75082         if (typeof spec.config.extractInfo === "function") {
75083             info = spec.config.extractInfo(configValidationObject);
75084         }
75085
75086         if (info) {
75087             _self.setInfo(info);
75088         }
75089     }
75090
75091 };
75092
75093 module.exports = _self;
75094
75095 });
75096 define('ripple/deviceSettings', function (require, exports, module) {
75097 /*
75098  *  Copyright 2011 Research In Motion Limited.
75099  *
75100  * Licensed under the Apache License, Version 2.0 (the "License");
75101  * you may not use this file except in compliance with the License.
75102  * You may obtain a copy of the License at
75103  *
75104  * http://www.apache.org/licenses/LICENSE-2.0
75105  *
75106  * Unless required by applicable law or agreed to in writing, software
75107  * distributed under the License is distributed on an "AS IS" BASIS,
75108  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
75109  * See the License for the specific language governing permissions and
75110  * limitations under the License.
75111  */
75112 /* DeviceSettings
75113  *  A per object store for a platform's settings.
75114  *  For example, RadioInfo object in WAC has isRadioEnabled that can be true/false
75115  *  setting => {key: {key1: "test"}}
75116  */
75117 var _PERSISTENCE_KEY = "devicesettings",
75118     db = require('ripple/db'),
75119     platform = require('ripple/platform'),
75120     _currentDeviceSettings = {},
75121     _self;
75122
75123 function _default(key) {
75124     var keys = key.split("."),
75125         defaults = platform.current().device;
75126     if (keys.length === 1)
75127         return defaults[key];
75128     return keys.length === 2 &&
75129            defaults[keys[0]] &&
75130            defaults[keys[0]][keys[1]] &&
75131            defaults[keys[0]][keys[1]].control ?
75132            defaults[keys[0]][keys[1]].control.value : undefined;
75133 }
75134
75135 _self = {
75136     initialize: function () {
75137         // TODO: remove deprecated DeviceSettings from persisted ones.
75138         _currentDeviceSettings = db.retrieveObject(_PERSISTENCE_KEY) || {};
75139     },
75140     register: function (key, obj) {
75141         _currentDeviceSettings[key] = obj;
75142     },
75143
75144     persist: function (key, obj) {
75145         if (key) {
75146             _currentDeviceSettings[key] = obj;
75147         }
75148         db.saveObject(_PERSISTENCE_KEY, _currentDeviceSettings);
75149     },
75150
75151     retrieve: function (key) {
75152         return _currentDeviceSettings.hasOwnProperty(key) ?
75153                _currentDeviceSettings[key] : _default(key);
75154     },
75155
75156     retrieveAsInt: function (key) {
75157         return parseInt(_self.retrieve(key), 10);
75158     },
75159
75160     retrieveAsBoolean: function (key) {
75161         return !!_self.retrieve(key);
75162     }
75163 };
75164
75165 module.exports = _self;
75166
75167 });
75168 define('ripple/touchEventEmulator', function (require, exports, module) {
75169 /*
75170  *  Copyright 2011 Research In Motion Limited.
75171  *
75172  * Licensed under the Apache License, Version 2.0 (the "License");
75173  * you may not use this file except in compliance with the License.
75174  * You may obtain a copy of the License at
75175  *
75176  * http://www.apache.org/licenses/LICENSE-2.0
75177  *
75178  * Unless required by applicable law or agreed to in writing, software
75179  * distributed under the License is distributed on an "AS IS" BASIS,
75180  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
75181  * See the License for the specific language governing permissions and
75182  * limitations under the License.
75183  */
75184 var emulatorBridge = require('ripple/emulatorBridge'),
75185     utils = require('ripple/utils'),
75186     _isMouseDown, self;
75187
75188 // NOTE: missing view, detail, touches, targetTouches, scale and rotation
75189 function _initTouchEvent(type, canBubble, cancelable, eventData) {
75190     var touchEvent = emulatorBridge.document().createEvent("Event");
75191     touchEvent.initEvent(type, canBubble, cancelable);
75192     utils.mixin(eventData, touchEvent);
75193     return touchEvent;
75194 }
75195
75196 function _raiseTouchEvent(mouseEvent) {
75197     var type = "",
75198         simulatedEvent,
75199         touchObj,
75200         eventData;
75201
75202     switch (mouseEvent.type) {
75203     case "mousedown":
75204         type = "touchstart";
75205         _isMouseDown = true;
75206         break;
75207     case "mousemove":
75208         if (!_isMouseDown) {
75209             return;
75210         }
75211         type = "touchmove";
75212         break;
75213     case "mouseup":
75214         type = "touchend";
75215         _isMouseDown = false;
75216         break;
75217     default:
75218         return;
75219     }
75220
75221     touchObj = {
75222         clientX: mouseEvent.pageX,
75223         clientY: mouseEvent.pageY,
75224         identifier: "",
75225         pageX: mouseEvent.pageX,
75226         pageY: mouseEvent.pageY,
75227         screenX: mouseEvent.pageX,
75228         screenY: mouseEvent.pageY,
75229         target: mouseEvent.target
75230     };
75231
75232     eventData = {
75233         altKey: mouseEvent.altKey,
75234         ctrlKey: mouseEvent.ctrlKey,
75235         shiftKey: mouseEvent.shiftKey,
75236         metaKey: mouseEvent.metaKey,
75237         changedTouches: [touchObj],
75238         targetTouches: [touchObj],
75239         touches: [touchObj]
75240     };
75241
75242     utils.mixin(touchObj, eventData);
75243
75244     simulatedEvent = _initTouchEvent(type, true, true, eventData);
75245
75246     mouseEvent.target.dispatchEvent(simulatedEvent);
75247
75248     if (typeof mouseEvent.target["on" + type] === "function") {
75249         mouseEvent.target["on" + type].apply(mouseEvent.target, [simulatedEvent]);
75250     }
75251 }
75252
75253 function _marshalEvents(win, doc) {
75254     utils.forEach(["mousedown", "mousemove", "mouseup"],
75255         function (event) {
75256             doc.addEventListener(event, _raiseTouchEvent, true);
75257         });
75258
75259     //win.Node.prototype.ontouchstart = null;
75260     //win.Node.prototype.ontouchend = null;
75261     //win.Node.prototype.ontouchmove = null;
75262 }
75263
75264 self = module.exports = {
75265     mask: function (win, doc) {
75266         _marshalEvents(win, doc);
75267     }
75268 };
75269
75270 });
75271 define('ripple/constants', function (require, exports, module) {
75272 /*
75273  *  Copyright 2011 Research In Motion Limited.
75274  *
75275  * Licensed under the Apache License, Version 2.0 (the "License");
75276  * you may not use this file except in compliance with the License.
75277  * You may obtain a copy of the License at
75278  *
75279  * http://www.apache.org/licenses/LICENSE-2.0
75280  *
75281  * Unless required by applicable law or agreed to in writing, software
75282  * distributed under the License is distributed on an "AS IS" BASIS,
75283  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
75284  * See the License for the specific language governing permissions and
75285  * limitations under the License.
75286  */
75287 module.exports = {
75288     "API_URL": "http://api.tinyhippos.com",
75289
75290     "RELEASE_VERSION": "simulator-release-version",
75291
75292     "SERVICES": {
75293         "GOOGLE_MAPS_URI": "http://maps.google.com/maps/api/staticmap?size=476x476&maptype=roadmap",
75294         "GOOGLE_MAPS_API_KEY": "ABQIAAAA-CaPZHXR-0Tzhui_h6gpjhSE_2rGlnYiB7L-ZGVwgaut5s7OYRSlBAaHCzBuZf2_23_vrCOfPxXHjA"
75295     },
75296
75297     "FS_SIZE": 1024 * 1024 * 10,
75298
75299     "COMMON":  {
75300         "APPLICATION_STATE": "ui-application-state-",
75301         "PREFIX": "tinyhippos-",
75302         "DEVICE_CONTAINER" : "device-container",
75303         "MENU_BUTTON" : "menu-button",
75304         "BACK_BUTTON" : "back-button",
75305         "HTML_CONTAINER" : "document",
75306         "INFO_SECTION": "information-sub-container",
75307         "ORIENTATION_SELECT_PORTRAIT_ID" : "layout-portrait",
75308         "ORIENTATION_SELECT_LANDSCAPE_ID" : "layout-landscape",
75309         "PLATFORM_SELECT_ID": "platform-select",
75310         "DEVICE_SELECT_ID": "device-select",
75311         "STORAGE_TABLE_BODY_CLASS": "preferences-list-body",
75312         "STORAGE_COUNT_CONTAINER_ID": "preferences-count",
75313         "GEO_MAP_CONTAINER_ID": "geo-map",
75314         "FILESYSTEM_UPDATE_BUTTON_ID_WITH_HASH": "#update-filesystem-button",
75315         "USER_AGENT_DEFAULT": "default",
75316         "APPLICATIONS_CONTAINER_ID": "widget-applications-content",
75317         "STORAGE_CLEAR_BUTTON_ID": "preferences-clear-button",
75318         "AJAX_LOADER_CONTAINER_CLASS": ".loader",
75319         "IRRELEVANT_CLASS": "irrelevant",
75320         "MULTIMEDIA_VOLUME_SLIDER_ID": "media-volume",
75321         "MULTIMEDIA_VOLUME_FIELD_ID": "media-volume-value",
75322         "MULTIMEDIA_AUDIO_STATE_FIELD_ID": "media-audio-state",
75323         "MULTIMEDIA_AUDIO_PLAYING_FIELD_ID": "multimedia-isaudioplaying",
75324         "MULTIMEDIA_AUDIO_PROGRESS_ID": "media-audio-progress",
75325         "MULTIMEDIA_AUDIO_FILE_FIELD_ID": "media-audio-file",
75326         "MULTIMEDIA_VIDEO_STATE_FIELD_ID": "media-video-state",
75327         "MULTIMEDIA_VIDEO_PLAYING_FIELD_ID": "multimedia-isvideoplaying",
75328         "MULTIMEDIA_VIDEO_PROGRESS_ID": "media-video-progress",
75329         "MULTIMEDIA_VIDEO_FILE_FIELD_ID": "media-video-file",
75330         "EXTENSION_URL_CONTAINER": "extension-url",
75331         "SECURITY_LEVEL": "security-level"
75332     },
75333     "LAUNCHING_HISTORY": "application-launching-history",
75334
75335     "FILESYSTEM": {
75336         "PERSISTENCE_KEY": "filesystem",
75337         "INPUT_PREFIX_ID": "#panel-filesystem-"
75338     },
75339
75340     "PLATFORM":  {
75341         "DEFAULT": {
75342             "name": "tizen",
75343             "version": "1.0"
75344         }
75345     },
75346
75347     "DEVICE":  {
75348         "SAVED_KEY": "device-key"
75349     },
75350
75351     "BATTERY":  {
75352         "TIME": "charging-time",
75353         "VOLUME": "battery-volume",
75354         "CHARGING": "is-charging"
75355     },
75356
75357     "TOUCHEVENT":  {
75358         "OPTION": "touch_option",
75359         "ALTKEY": "touch_altKey",
75360         "METAKEY": "touch_metaKey",
75361         "CTRLKEY": "touch_ctrlKey",
75362         "SHIFTKEY": "touch_shiftKey",
75363         "CANVAS": "touch_canvas"
75364     },
75365
75366     "ENCAPSULATOR":  {
75367         "DEFAULT_HEIGHT": 684,
75368         "DEFAULT_WIDTH": 480,
75369         "LAYOUT": "layout",
75370         "DISPLAY_LAYOUT": {
75371             "LANDSCAPE": "landscape",
75372             "PORTRAIT": "portrait"
75373         },
75374         "ZOOMING": "screen-zooming"
75375     },
75376
75377     "GEO":  {
75378         "OPTIONS" : {
75379             "LATITUDE" : "geo-latitude",
75380             "LONGITUDE" : "geo-longitude",
75381             "ALTITUDE" : "geo-altitude",
75382             "CELL_ID" : "geo-cellid",
75383             "ACCURACY" : "geo-accuracy",
75384             "ALTITUDE_ACCURACY" : "geo-altitudeaccuracy",
75385             "HEADING" : "geo-heading",
75386             "SPEED" : "geo-speed",
75387             "TIME_STAMP" : "geo-timestamp",
75388             "DELAY" : "geo-delay",
75389             "DELAY_LABEL" : "geo-delay-label",
75390             "HEADING_LABEL" : "geo-heading-label",
75391             "HEADING_MAP_LABEL" : "geo-map-direction-label",
75392             "IMAGE" : "geo-map-img",
75393             "MAP_CONTAINER" : "geo-map-container",
75394             "TIMEOUT" : "geo-timeout",
75395             "GPXFILE": "geo-gpxfile",
75396             "GPXGO": "geo-gpx-go",
75397             "GPXMULTIPLIER": "geo-gpxmultiplier-select",
75398             "GPXREPLAYSTATUS": "geo-gpxreplaystatus"
75399         },
75400         "MAP_ZOOM_MAX": 18,
75401         "MAP_ZOOM_MIN": 0,
75402         "MAP_ZOOM_LEVEL_CONTAINER": "geo-map-zoomlevel-value",
75403         "MAP_ZOOM_KEY": "geo-map-zoom-key",
75404         "GPXGO_LABELS": {
75405
75406             "GO": "Go",
75407             "STOP": "Stop"
75408         }
75409     },
75410
75411     "PUSH": {
75412         "OPTIONS" : {
75413             "PAYLOAD" : "push-text"
75414         }
75415     },
75416
75417     "TELEPHONY": {
75418         "CALL_LIST_KEY": "telephony-call-list-key"
75419     },
75420
75421     "PIM": {
75422         "ADDRESS_LIST_KEY": "pim-address-list-key",
75423         "CALENDAR_LIST_KEY": "pim-calendar-list-key"
75424     },
75425
75426     "CAMERA": {
75427         "WINDOW_ANIMATION": "images/tizen-wave.gif",
75428         "WARNING_TEXT": "The runtime simulated saving the camera file to {file}. If you need to access this file in your application, please copy a file to the saved location"
75429     },
75430
75431     "AUDIOPLAYER" : {
75432         "WARNING_TEXT": "The runtime simulated saving the audio file to {file}. If you need to access this file in your application, please copy a file to the saved location"
75433     },
75434
75435     "API_APPLICATION": {
75436         "NO_APPLICATIONS_MESSAGE": "No applications available for your platform"
75437     },
75438
75439     "NOTIFICATIONS":  {
75440         "MESSAGE_CONTAINER_CLASS": "notification-message-div",
75441         "MAIN_CONTAINER_CLASS": "panel-notification",
75442         "CLOSE_BUTTON_CLASS": "panel-notification-closebtn",
75443         "MESSAGE_TEXT_CONTAINER_CLASS": "panel-notification-text",
75444         "CSS_PREFIX": "panel-notification-",
75445         "STATE_TYPES": {
75446             "OPEN": 1,
75447             "CLOSE": 2
75448         }
75449     },
75450
75451     "CSS_PREFIX":  {
75452         "IRRELEVANT" : "irrelevant"
75453     },
75454
75455     "STORAGE":  {
75456         "PAIR_DELIMETER" : ",",
75457         "KEY_VALUE_DELIMETER" : "|"
75458     },
75459
75460     "REGEX":  {
75461         "GEO" : /^geo-/,
75462         "URL": /^((https?|ftp|gopher|telnet|file|notes|ms-help):((\/\/)|(\\\\))+[\w\d:#@%\/;$()~_?\+-=\\\.&]*)$/,
75463         //"Email": /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/
75464         "EMAIL": /^([^@\s]+)@((?:[\-a-z0-9]+\.)+[a-z]{2,})$/,
75465         "WC3_DTF": /^((\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)|(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d)|(\d{4})-(\d\d)-(\d\d)|(\d{4})-(\d\d)|(\d\d\d\d))$/,
75466         "LOCAL_URI": /^https?:\/\/(127\.0\.0\.1|localhost)|^file:\/\//,
75467         "EXTERNAL_URI": /(?:(?:[a-zA-Z0-9\/;\?&=:\-_\$\+!\*'\(\|\\~\[\]#%\.](?!www))+(?:\.[Cc]om|\.[Ee]du|\.[gG]ov|\.[Ii]nt|\.[Mm]il|\.[Nn]et|\.[Oo]rg|\.[Bb]iz|\.[Ii]nfo|\.[Nn]ame|\.[Pp]ro|\.[Aa]ero|\.[cC]oop|\.[mM]useum|\.[Cc]at|\.[Jj]obs|\.[Tt]ravel|\.[Aa]rpa|\.[Mm]obi|\.[Aa]c|\.[Aa]d|\.[aA]e|\.[aA]f|\.[aA]g|\.[aA]i|\.[aA]l|\.[aA]m|\.[aA]n|\.[aA]o|\.[aA]q|\.[aA]r|\.[aA]s|\.[aA]t|\.[aA]u|\.[aA]w|\.[aA]z|\.[aA]x|\.[bB]a|\.[bB]b|\.[bB]d|\.[bB]e|\.[bB]f|\.[bB]g|\.[bB]h|\.[bB]i|\.[bB]j|\.[bB]m|\.[bB]n|\.[bB]o|\.[bB]r|\.[bB]s|\.[bB]t|\.[bB]v|\.[bB]w|\.[bB]y|\.[bB]z|\.[cC]a|\.[cC]c|\.[cC]d|\.[cC]f|\.[cC]g|\.[cC]h|\.[cC]i|\.[cC]k|\.[cC]l|\.[cC]m|\.[cC]n|\.[cC]o|\.[cC]r|\.[cC]s|\.[cC]u|\.[cC]v|\.[cC]x|\.[cC]y|\.[cC]z|\.[dD]e|\.[dD]j|\.[dD]k|\.[dD]m|\.[dD]o|\.[dD]z|\.[eE]c|\.[eE]e|\.[eE]g|\.[eE]h|\.[eE]r|\.[eE]s|\.[eE]t|\.[eE]u|\.[fF]i|\.[fF]j|\.[fF]k|\.[fF]m|\.[fF]o|\.[fF]r|\.[gG]a|\.[gG]b|\.[gG]d|\.[gG]e|\.[gG]f|\.[gG]g|\.[gG]h|\.[gG]i|\.[gG]l|\.[gG]m|\.[gG]n|\.[gG]p|\.[gG]q|\.[gG]r|\.[gG]s|\.[gG]t|\.[gG]u|\.[gG]w|\.[gG]y|\.[hH]k|\.[hH]m|\.[hH]n|\.[hH]r|\.[hH]t^[ml]?|\.[hH]u|\.[iI]d|\.[iI]e|\.[iI]l|\.[iI]m|\.[iI]n|\.[iI]o|\.[iI]q|\.[iI]r|\.[iI]s|\.[iI]t|\.[jJ]e|\.[jJ]m|\.[jJ]o|\.[jJ]p|\.[kK]e|\.[kK]g|\.[kK]h|\.[kK]i|\.[kK]m|\.[kK]n|\.[kK]p|\.[kK]r|\.[kK]w|\.[kK]y|\.[kK]z|\.[lL]a|\.[lL]b|\.[lL]c|\.[lL]i|\.[lL]k|\.[lL]r|\.[lL]s|\.[lL]t|\.[lL]u|\.[lL]v|\.[lL]y|\.[mM]a|\.[mM]c|\.[mM]d|\.[mM]g|\.[mM]h|\.[mM]k|\.[mM]l|\.[mM]m|\.[mM]n|\.[mM]o|\.[mM]p|\.[mM]q|\.[mM]r|\.[mM]s|\.[mM]t|\.[mM]u|\.[mM]v|\.[mM]w|\.[mM]x|\.[mM]y|\.[mM]z|\.[nN]a|\.[nN]c|\.[nN]e|\.[nN]f|\.[nN]g|\.[nN]i|\.[nN]l|\.[nN]o|\.[nN]p|\.[nN]r|\.[nN]u|\.[nN]z|\.[oO]m|\.[pP]a|\.[pP]e|\.[pP]f|\.[pP]g|\.[pP]h|\.[pP]k|\.[pP]l|\.[pP]m|\.[pP]n|\.[pP]r|\.[pP]s|\.[pP]t|\.[pP]w|\.[pP]y|\.[qP]a|\.[rR]e|\.[rR]o|\.[rR]u|\.[rR]w|\.[sS]a|\.[sS]b|\.[sS]c|\.[sS]d|\.[sS]e|\.[sS]g|\.[sS]h|\.[Ss]i|\.[sS]j|\.[sS]k|\.[sS]l|\.[sS]m|\.[sS]n|\.[sS]o|\.[sS]r|\.[sS]t|\.[sS]v[^c]|\.[sS]y|\.[sS]z|\.[tT]c|\.[tT]d|\.[tT]f|\.[tT]g|\.[tT]h|\.[tT]j|\.[tT]k|\.[tT]l|\.[tT]m|\.[tT]n|\.[tT]o|\.[tT]p|\.[tT]r|\.[tT]t|\.[tT]v|\.[tT]w|\.[tT]z|\.[uU]a|\.[uU]g|\.[uU]k|\.[uU]m|\.[uU]s|\.[uU]y|\.[uU]z|\.[vV]a|\.[vV]c|\.[vV]e|\.[vV]g|\.[vV]i|\.[vV]n|\.[vV]u|\.[wW]f|\.[wW]s|\.[yY]e|\.[yY]t|\.[yY]u|\.[zZ]a|\.[zZ]m|\.[zZ]w))/
75468     },
75469
75470     "CONFIG": {
75471         "SUCCESS_CSS": {
75472             "true": "ui-text-pass",
75473             "false": "ui-text-fail",
75474             "missing": "ui-text-missing"
75475         }
75476     },
75477
75478     "SETTINGS": {
75479         "TOOLTIPS_TOGGLE_DIV": "#settings-toggletooltips",
75480         "TOOLTIPS_KEY": "tool-tips-key"
75481     },
75482
75483     "PANEL": {
75484         "PANEL_CONFIG_ENABLE": "panel-config-enable"
75485     },
75486
75487     "UI": {
75488         "JQUERY_UI_BUTTON_CLASSES": "ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only",
75489         "JQUERY_UI_INPUT_CLASSES": "ui-state-default ui-corner-all",
75490         "PANEL_TABLE_CLASS": "panel-table",
75491         "RIGHT_RANGE_LABEL_CLASS": "range-label",
75492         "LEFT_RANGE_LABEL_CLASS": "range-label-left",
75493         "TEXT_LABEL_CLASS": "ui-text-label",
75494         "SCREEN_PPI": 96
75495     },
75496
75497     "MULTIMEDIA": {
75498         "AUDIO_STATES": {
75499             "OPENED": "opened",
75500             "STOPPED": "stopped",
75501             "PAUSED": "paused",
75502             "PLAYING": "playing",
75503             "COMPLETED": "completed"
75504         }
75505     },
75506
75507     "LANG": {
75508         "ISO6392_LIST": ["abk", "ace", "ach", "ada", "ady", "aar", "afh", "afr", "afa", "ain", "aka", "akk", "alb/sqi", "gsw", "ale", "alg", "tut", "amh", "anp", "apa", "ara", "arg", "arp", "arw", "arm/hye", "rup", "art", "asm", "ast", "ath", "aus", "map", "ava", "ave", "awa", "aym", "aze", "ban", "bat", "bal", "bam", "bai", "bad", "bnt", "bas", "bak", "baq/eus", "btk", "bej", "bel", "bem", "ben", "ber", "bho", "bih", "bik", "byn", "bin", "bis", "zbl", "nob", "bos", "bra", "bre", "bug", "bul", "bua", "bur/mya", "cad", "spa", "cat", "cau", "ceb", "cel", "cai", "khm", "chg", "cmc", "cha", "che", "chr", "nya", "chy", "chb", "chi/zho", "chn", "chp", "cho", "zha", "chu", "chk", "chv", "nwc", "syc", "rar", "cop", "cor", "cos", "cre", "mus", "crp", "cpe", "cpf", "cpp", "crh", "hrv", "cus", "cze/ces", "dak", "dan", "dar", "del", "div", "zza", "din", "doi", "dgr", "dra", "dua", "dut/nld", "dum", "dyu", "dzo", "frs", "efi", "egy", "eka", "elx", "eng", "enm", "ang", "myv", "epo", "est", "ewe", "ewo", "fan", "fat", "fao", "fij", "fil", "fin", "fiu", "fon", "fre/fra", "frm", "fro", "fur", "ful", "gaa", "gla", "car", "glg", "lug", "gay", "gba", "gez", "geo/kat", "ger/deu", "nds", "gmh", "goh", "gem", "kik", "gil", "gon", "gor", "got", "grb", "grc", "gre/ell", "kal", "grn", "guj", "gwi", "hai", "hat", "hau", "haw", "heb", "her", "hil", "him", "hin", "hmo", "hit", "hmn", "hun", "hup", "iba", "ice/isl", "ido", "ibo", "ijo", "ilo", "arc", "smn", "inc", "ine", "ind", "inh", "ina", "ile", "iku", "ipk", "ira", "gle", "mga", "sga", "iro", "ita", "jpn", "jav", "kac", "jrb", "jpr", "kbd", "kab", "xal", "kam", "kan", "kau", "pam", "kaa", "krc", "krl", "kar", "kas", "csb", "kaw", "kaz", "kha", "khi", "kho", "kmb", "kin", "kir", "tlh", "kom", "kon", "kok", "kor", "kos", "kpe", "kro", "kua", "kum", "kur", "kru", "kut", "lad", "lah", "lam", "day", "lao", "lat", "lav", "ltz", "lez", "lim", "lin", "lit", "jbo", "dsb", "loz", "lub", "lua", "lui", "smj", "lun", "luo", "lus", "mac/mkd", "mad", "mag", "mai", "mak", "mlg", "may/msa", "mal", "mlt", "mnc", "mdr", "man", "mni", "mno", "glv", "mao/mri", "arn", "mar", "chm", "mah", "mwr", "mas", "myn", "men", "mic", "min", "mwl", "moh", "mdf", "rum/ron", "mkh", "lol", "mon", "mos", "mul", "mun", "nqo", "nah", "nau", "nav", "nde", "nbl", "ndo", "nap", "new", "nep", "nia", "nic", "ssa", "niu", "zxx", "nog", "non", "nai", "frr", "sme", "nso", "nor", "nno", "nub", "iii", "nym", "nyn", "nyo", "nzi", "oci", "pro", "oji", "ori", "orm", "osa", "oss", "oto", "pal", "pau", "pli", "pag", "pan", "pap", "paa", "pus", "per/fas", "peo", "phi", "phn", "pon", "pol", "por", "pra", "que", "raj", "rap", "qaa-qtz", "roa", "roh", "rom", "run", "rus", "sal", "sam", "smi", "smo", "sad", "sag", "san", "sat", "srd", "sas", "sco", "sel", "sem", "srp", "srr", "shn", "sna", "scn", "sid", "sgn", "bla", "snd", "sin", "sit", "sio", "sms", "den", "sla", "slo/slk", "slv", "sog", "som", "son", "snk", "wen", "sot", "sai", "alt", "sma", "srn", "suk", "sux", "sun", "sus", "swa", "ssw", "swe", "syr", "tgl", "tah", "tai", "tgk", "tmh", "tam", "tat", "tel", "ter", "tet", "tha", "tib/bod", "tig", "tir", "tem", "tiv", "tli", "tpi", "tkl", "tog", "ton", "tsi", "tso", "tsn", "tum", "tup", "tur", "ota", "tuk", "tvl", "tyv", "twi", "udm", "uga", "uig", "ukr", "umb", "mis", "und", "hsb", "urd", "uzb", "vai", "ven", "vie", "vol", "vot", "wak", "wln", "war", "was", "wel/cym", "fry", "wal", "wol", "xho", "sah", "yao", "yap", "yid", "yor", "ypk", "znd", "zap", "zen", "zul", "zun"]
75509     },
75510
75511     "XHR": {
75512         "PROXY_DISABLED_BUTTON": "settings-xhrproxy-disabled"
75513     },
75514
75515     "PLATFORMS": {
75516         "WAC": {
75517             "APPLICATIONS": [
75518                 "ALARM",
75519                 "BROWSER",
75520                 "CALCULATOR",
75521                 "CALENDAR",
75522                 "CAMERA",
75523                 "CONTACTS",
75524                 "FILES",
75525                 "GAMES",
75526                 "MAIL",
75527                 "MEDIAPLAYER",
75528                 "MESSAGING",
75529                 "PHONECALL",
75530                 "PICTURES",
75531                 "PROG_MANAGER",
75532                 "SETTINGS",
75533                 "TASKS",
75534                 "WIDGET_MANAGER"
75535             ],
75536             "DEVICE": {
75537                 "WIDGET_ENGINE_NAME": "Generic",
75538                 "WIDGET_ENGINE_PROVIDER": "tinyHippos",
75539                 "WIDGET_ENGINE_VERSION": "x.x"
75540             }
75541         }
75542     },
75543
75544     "POWER_RESOURCE": {
75545         "SCREEN": {
75546             "NAME": "SCREEN",
75547             "STATE": {
75548                 "SCREEN_OFF": {
75549                     "NAME": "SCREEN_OFF",
75550                     "MIN": 0,
75551                     "MAX": 0,
75552                     "VALUE": 0
75553                 },
75554                 "SCREEN_DIM": {
75555                     "NAME": "SCREEN_DIM",
75556                     "MIN": 0,
75557                     "MAX": 0.2,
75558                     "VALUE": 0.15
75559                 },
75560                 "SCREEN_NORMAL": {
75561                     "NAME": "SCREEN_NORMAL",
75562                     "MIN": 0.2,
75563                     "MAX": 1,
75564                     "VALUE": 0.8
75565                 },
75566                 "SCREEN_BRIGHT": {
75567                     "NAME": "SCREEN_BRIGHT",
75568                     "MIN": 1,
75569                     "MAX": 1,
75570                     "VALUE": 1
75571                 }
75572             }
75573         },
75574         "CPU": {
75575             "NAME": "CPU",
75576             "STATE": {
75577                 "CPU_AWAKE": {
75578                     "NAME": "CPU_AWAKE",
75579                     "DEFAULT_VALUE" : 0.5
75580                 }
75581             }
75582         }
75583     }
75584 };
75585
75586 });
75587 define('ripple/ui/plugins/tooltip', function (require, exports, module) {
75588 /*
75589  *  Copyright 2011 Research In Motion Limited.
75590  *
75591  * Licensed under the Apache License, Version 2.0 (the "License");
75592  * you may not use this file except in compliance with the License.
75593  * You may obtain a copy of the License at
75594  *
75595  * http://www.apache.org/licenses/LICENSE-2.0
75596  *
75597  * Unless required by applicable law or agreed to in writing, software
75598  * distributed under the License is distributed on an "AS IS" BASIS,
75599  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
75600  * See the License for the specific language governing permissions and
75601  * limitations under the License.
75602  */
75603 var utils = require('ripple/utils'),
75604     _options = {
75605         track: true,
75606         delay: 0,
75607         showURL: false,
75608         fade: 250,
75609         extraClass: "ui-state-highlight ui-corner-all"
75610     };
75611
75612 module.exports = {
75613     create: function (element, message) {
75614         var options = utils.copy(_options);
75615
75616         options.bodyHandler = function () {
75617             return message;
75618         };
75619
75620         return jQuery(element).tooltip(options);
75621     },
75622
75623     toggle: function () {
75624         jQuery.tooltip.block();
75625         return this.isOff();
75626     },
75627
75628     isOff: function () {
75629         return jQuery.tooltip.blocked;
75630     }
75631 };
75632
75633 });
75634 define('ripple/ui/plugins/call', function (require, exports, module) {
75635 /*
75636  *  Copyright 2012 Intel Corporation
75637  *
75638  * Licensed under the Apache License, Version 2.0 (the "License");
75639  * you may not use this file except in compliance with the License.
75640  * You may obtain a copy of the License at
75641  *
75642  * http://www.apache.org/licenses/LICENSE-2.0
75643  *
75644  * Unless required by applicable law or agreed to in writing, software
75645  * distributed under the License is distributed on an "AS IS" BASIS,
75646  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
75647  * See the License for the specific language governing permissions and
75648  * limitations under the License.
75649  */
75650 var event = require('ripple/event'),
75651     utils = require('ripple/utils'),
75652     db = require('ripple/db'),
75653     _exception = {
75654         "unknown":           "Unknown",
75655         "network":           "Network",
75656         "unreachable":       "Unreachable",
75657         "no-answer":         "No Answer",
75658         "bad-number":        "Bad Number",
75659         "number-not-in-use": "Number Not In Use",
75660         "media":             "Media",
75661         "no-sim":            "No Sim Card",
75662         "account-down":      "Account Down",
75663         "credit-down":       "Credit Down",
75664         "barred":            "Barred",
75665         "network-busy":      "Network Busy",
75666         "network-down":      "Network Down"
75667     },
75668     _status = {
75669         IDLE:       0,
75670         DIALED:     1,
75671         PLACED:     2,
75672         INPROGRESS: 3,
75673     },
75674     _statusInfo = [
75675         "Waiting...;Waiting",                                   // IDLE
75676         "Calling... ;Incomming call from simulator",               // DIALED
75677         "Incomming call from ;Calling simulator",                // PLACED
75678         "In conversation with ;In conversation with simulator"   // INPROGRESS
75679     ],
75680     _data = {
75681         status: _status.IDLE,
75682         isInException: false,
75683         isAutoAccept: false,
75684         autoAcceptTimerId: null,
75685         conversationStartTime: null
75686     },
75687     _contactMap = {
75688         "861012345678": "Guest"
75689     },
75690     _CONTACT_KEY = "tizen1-contact",
75691     _RECORDING_KEY = "tizen1-call-recording",
75692     _RECORDING_PATH = "music/",
75693     _record = {},
75694     _conversationSeconds = 0,
75695     _conversationTimer,
75696     _callingEffectTimer;
75697
75698 function _initContacts() {
75699     var data = db.retrieveObject(_CONTACT_KEY),
75700         contactsSelect = document.getElementById("call-local-phone-number"),
75701         displayName = null, number = null, index = 0, i;
75702         
75703     contactsSelect.innerHTML = "";
75704
75705     utils.forEach(data, function (addrBook) {
75706         utils.forEach(addrBook._contacts, function (contact) {
75707             if (contact.name && contact.name && contact.phoneNumbers &&
75708                 contact.phoneNumbers.length > 0) {
75709                 displayName = contact.name.firstName + ' ' + contact.name.lastName;
75710                 number = contact.phoneNumbers[0].number;
75711                 _contactMap[number] = displayName;
75712
75713                 contactsSelect.appendChild(utils.createElement("option", {
75714                     "innerText": displayName + ':' + number,
75715                     "value": index
75716                 }));
75717                 index++;
75718             }
75719         });
75720     });
75721
75722     if (displayName === null && number === null) {
75723         for (i in _contactMap) {
75724             displayName = _contactMap[i];
75725             number = i;
75726             contactsSelect.appendChild(utils.createElement("option", {
75727                 "innerText": displayName + ':' + number,
75728                 "value": index
75729             }));
75730         }
75731     }
75732 }
75733
75734 function _initEventWatchers() {
75735     event.on("DialerLaunched", function (remoteParty) {
75736         var localContact = document.getElementById("call-local-phone-number");
75737
75738         if (_data.status !== _status.IDLE) {
75739             return;
75740         }
75741
75742         localContact.appendChild(utils.createElement("option", {
75743             "innerText": remoteParty.displayName,
75744             "value": remoteParty.remoteParty,
75745             "selected": "selected"
75746         }));
75747         _localCall();
75748     });
75749 }
75750
75751 function _initExceptionTypes() {
75752     utils.forEach(_exception, function (value, key) {
75753         document.getElementById("call-exception-type").appendChild(utils.createElement("option", {
75754             "innerText": value,
75755             "value": key
75756         }));
75757     });
75758 }
75759
75760 function _initRecord() {
75761     var localPartString = jQuery("#call-local-phone-number option:selected").text() || "",
75762         localPartStringList = localPartString.split(":"),
75763         displayName;
75764
75765     if (localPartStringList.length > 1) {
75766         displayName = localPartStringList[0];
75767     }
75768     else {
75769         displayName = localPartString;
75770     }
75771
75772     _record = {};
75773     _record.serviceId = (new Date()).getTime() || 0;
75774     _record.callParticipants = [{
75775         id: localPartString + ':' + displayName,
75776         displayName: displayName,
75777         contactRef: null
75778     }];
75779     _record.forwardedFrom = null;
75780     _record.startTime = new Date();
75781     _record.recording = [];
75782 }
75783
75784
75785 function updateConvTime() {
75786     var timeObj = new Date(1970, 0, 1),
75787     timeString;
75788
75789     timeObj.setSeconds(_conversationSeconds);
75790     timeString = timeObj.toTimeString().substr(0, 8);
75791     jQuery("#ConvTimeString").text(timeString);
75792     jQuery("#ConvTimeString2").text(timeString);
75793     _conversationSeconds = _conversationSeconds + 1;
75794 }
75795
75796
75797 function CallingEffect() {
75798     var color = jQuery("#callingString").css('color');
75799     if (color === "rgb(255, 255, 255)") {
75800         jQuery("#callingString").css('color', "black");
75801         jQuery("#callingString2").css('color', "black");
75802     }
75803     else {
75804         jQuery("#callingString").css('color', "white");
75805         jQuery("#callingString2").css('color', "white");
75806     }
75807 }
75808
75809
75810 function _transferStatus() {
75811     var statusStringList = _statusInfo[_data.status].split(";"),
75812         localPartString = jQuery("#call-local-phone-number option:selected").text() || "",
75813         localPartStringList = localPartString.split(":"),
75814         localNumber = localPartStringList[0],
75815         localName = _contactMap[localNumber] || localNumber;
75816     jQuery("#status-text").show();
75817     jQuery("#remote-status-text").show();
75818     jQuery("#call-status").show();
75819     jQuery("#remote-call-status").show();
75820     jQuery("#remotePartyName").html(localName);
75821     jQuery("#call-local-call").show();
75822     window.clearInterval(_callingEffectTimer);
75823
75824     switch (_data.status) {
75825     case _status.DIALED:      // local call
75826         jQuery("#call-remote-text").html("Accept");
75827         jQuery("#end-remote-text").html("Reject");
75828         jQuery("#call-status").html("<span style='font-size: 22px;'>" + localName + "</span><br>" + 
75829                         "<span id='callingString' style='font-size: 14px;'>&nbsp;" + statusStringList[0] + 
75830                         "</span><br><br><br><button id='call-local-end-d' class='ui-corner-all' style='padding:2px;" +
75831                         " border-width:1px; background-color:red; color:white; font-size:14px; font-weight:bold; width:100%;'>End call</button>");
75832         jQuery("#call-local-end-d").bind("click", _localEnd);
75833         jQuery("#remote-call-status").html("<span style='font-size: 20px;'>Simulator Bot</span><br>" + 
75834                         "<span id='callingString2' style='font-size: 12px;'>&nbsp;Incoming call...</span>" +
75835                         "<br><br><br><button id='call-remote-decline-d' class='ui-corner-all' style='padding:2px;" +
75836                         " border-width:1px; background-color:red; color:white; font-size:14px; font-weight:bold; width:48%;'>Decline</button>&nbsp;&nbsp;" +
75837                         "<button id='call-remote-answer-d' class='ui-corner-all' style='padding:2px; border-width:1px; background-color:green; color:white; font-size:14px; font-weight:bold; width:48%;'>Answer</button>");
75838         jQuery("#call-remote-answer-d").bind("click", _remoteCall);
75839         jQuery("#call-remote-decline-d").bind("click", _remoteEnd);
75840         _callingEffectTimer = window.setInterval(CallingEffect, 800);
75841         break;
75842     case _status.PLACED:      // Remote Call
75843         jQuery("#call-local-text").html("Accept");
75844         jQuery("#end-local-text").html("Reject");
75845         jQuery("#call-status").html(statusStringList[0] + localName);
75846         jQuery("#remote-call-status").html(statusStringList[1]);
75847         jQuery("#remote-call-status").html("<span style='font-size: 22px;'>Simulator Bot</span><br>" + 
75848                         "<span id='callingString' style='font-size: 14px;'>&nbsp;Calling..." + 
75849                         "</span><br><br><br><button id='call-remote-end-d' class='ui-corner-all' style='padding:2px;" +
75850                         " border-width:1px; background-color:red; color:white; font-size:14px; font-weight:bold; width:100%;'>End call</button>");
75851         jQuery("#call-remote-end-d").bind("click", _remoteEnd);
75852         jQuery("#call-status").html("<span style='font-size: 22px;'>" + localName + "</span><br>" + 
75853                         "<span id='callingString2' style='font-size: 14px;'>&nbsp;Incoming call...</span>" +
75854                         "<br><br><br><button id='call-local-decline-d' class='ui-corner-all' style='padding:2px;" +
75855                         " border-width:1px; background-color:red; color:white; font-size:14px; font-weight:bold; width:48%;'>Decline</button>&nbsp;&nbsp;" +
75856                         "<button id='call-local-answer-d' class='ui-corner-all' style='padding:2px; border-width:1px;" +
75857                         " background-color:green; color:white; font-size:14px; font-weight:bold; width:48%;'>Answer</button>");
75858         jQuery("#call-local-answer-d").bind("click", _localCall);
75859         jQuery("#call-local-decline-d").bind("click", _localEnd);
75860         _callingEffectTimer = window.setInterval(CallingEffect, 800);
75861         break;
75862     case _status.INPROGRESS:
75863         jQuery("#call-status").html("<span style='font-size: 22px;'>" + localName + "</span><br>" + 
75864                         "<span id='ConvTimeString' style='font-size: 14px;'>" + "00:00:00" + 
75865                         "</span><br><br><br><button id='call-local-end-d-c' class='ui-corner-all' style='padding:2px;" +
75866                         " border-width:1px; background-color:red; color:white; font-size:14px; font-weight:bold; width:100%;'>End call</button>");
75867         jQuery("#remote-call-status").html("<span style='font-size: 22px;'>Simulator Robot</span><br>" + 
75868                         "<span id='ConvTimeString2' style='font-size: 14px;'>" + "00:00:00" + 
75869                         "</span><br><br><br><button id='call-remote-end-d-c' class='ui-corner-all' style='padding:2px;" +
75870                         " border-width:1px; background-color:red; color:white; font-size:14px; font-weight:bold; width:100%;'>End call</button>");
75871         jQuery("#call-local-end-d-c").bind("click", _localEnd);
75872         jQuery("#call-remote-end-d-c").bind("click", _remoteEnd);
75873         _conversationTimer = window.setInterval(updateConvTime, 1000);
75874         jQuery("#call-remote-text").html("Call");
75875         jQuery("#end-remote-text").html("End");
75876         jQuery("#call-local-text").html("Call");
75877         jQuery("#end-local-text").html("End");
75878         break;
75879     default:
75880         jQuery("#call-status").html(statusStringList[0]);
75881         jQuery("#call-status").html("default");
75882         jQuery("#remote-call-status").html(statusStringList[1]);
75883         jQuery("#remote-call-status").html("default");
75884         jQuery("#call-remote-text").html("Call");
75885         jQuery("#end-remote-text").html("End");
75886         jQuery("#call-local-text").html("Call");
75887         jQuery("#end-local-text").html("End");
75888         return;
75889     }
75890 }
75891
75892 function _startCall() {
75893     _data.conversationStartTime = new Date();
75894     event.trigger("CallInProgress", [true]);
75895     _data.status = _status.INPROGRESS;
75896     //_transferStatus();
75897 }
75898
75899 function _endCall(callEndReason) {
75900     if (_data.autoAcceptTimerId) {
75901         var path = _RECORDING_PATH + _record.serviceId + ".mp3";
75902
75903         _record.recording.push(path);
75904         db.saveObject(_RECORDING_KEY, path);
75905
75906         clearTimeout(_data.autoAcceptTimerId);
75907         _data.autoAcceptTimerId = null;
75908     }
75909
75910     _record.duration = _data.conversationStartTime ? ((new Date()) - _data.conversationStartTime) : 0;
75911     _data.conversationStartTime = null;
75912     
75913     _record.endReason = callEndReason;
75914
75915     if (_data.status === _status.PLACED) {
75916         _record.direction = "missed-new";
75917     }
75918
75919     event.trigger("CallRecorded", [_record]);
75920     event.trigger("CallInProgress", [false]);
75921
75922     _data.status = _status.IDLE;
75923     _transferStatus();
75924     _record = {};
75925
75926     _conversationSeconds = 0;
75927     window.clearInterval(_conversationTimer);
75928     jQuery("#call-status").hide();
75929     jQuery("#remote-call-status").hide();
75930
75931     jQuery("#status-text").hide();
75932     jQuery("#remote-status-text").hide();
75933 }
75934
75935 function _localCall() {
75936     if (_data.isInException) {
75937         return;
75938     }
75939
75940     switch (_data.status) {
75941     case _status.IDLE:    //local call
75942         _data.status = _status.DIALED;
75943         _initRecord();
75944         _record.direction = "dialed";
75945         break;
75946     case _status.PLACED:
75947         _data.status = _status.INPROGRESS;
75948         _record.direction = "received";
75949         if (_data.autoAcceptTimerId) {
75950             clearTimeout(_data.autoAcceptTimerId);
75951             _data.autoAcceptTimerId = null;
75952         }
75953         _startCall();
75954         break;
75955     default:
75956         return;
75957     }
75958
75959     _transferStatus();
75960
75961     if (_data.isInException) {
75962         _endCall(document.getElementById("call-exception-type").value);
75963     }
75964 }
75965
75966 function _localEnd() {
75967     switch (_data.status) {
75968     case _status.DIALED:     // Local Cancel
75969     case _status.INPROGRESS: // Local End
75970         _endCall("local");
75971         break;
75972     case _status.PLACED:
75973         _record.direction = "missed-new";
75974         _endCall("local");
75975         break;
75976     default:
75977         return;
75978     }
75979 }
75980
75981 function _remoteCall() {
75982     if (_data.isInException) {
75983         return;
75984     }
75985
75986     switch (_data.status) {
75987     case _status.IDLE:      // Remote Call
75988         _data.status = _status.PLACED; 
75989         _initRecord();
75990         if (_data.isAutoAccept) {
75991             _data.autoAcceptTimerId = setTimeout(_localCall, 2000);
75992         }
75993         break;
75994     case _status.DIALED:    // Remote Answer
75995         _startCall();
75996         break;
75997     default:
75998         return;
75999     }
76000
76001     _transferStatus();
76002
76003     if (_data.isInException) {
76004         _endCall(document.getElementById("call-exception-type").value);
76005     }
76006 }
76007
76008 function _remoteEnd() {
76009     switch (_data.status) {
76010     case _status.DIALED:     // Remote Reject
76011         _endCall("rejected");
76012         break;
76013     case _status.INPROGRESS: // Remote End
76014         _endCall("remote");
76015         break;
76016     case _status.PLACED:    // Remote Cancel
76017         _record.direction = "missed-new";
76018         _endCall("remote");
76019         break;
76020     default:
76021         return;
76022     }
76023 }
76024
76025 function _leaveMessage() {
76026     if (!this.checked && _data.autoAcceptTimerId) {
76027         clearTimeout(_data.autoAcceptTimerId);
76028         _data.autoAcceptTimerId = null;
76029     }
76030     _data.isAutoAccept = this.checked;
76031 }
76032
76033 function _exceptionStatus() {
76034     _data.isInException = this.checked;
76035     if (_data.isInException && (_data.status !== _status.IDLE)) {
76036         if (_data.status === _status.RECEIVED) {   // Remote Cancel
76037             _record.direction = "missed-new";
76038             _record.duration = 0;
76039         }
76040         _endCall(document.getElementById("call-exception-type").value);
76041     }
76042 }
76043
76044
76045 function _updateRemotePartyName() {
76046     jQuery("#remotePartyName").text(jQuery("#call-local-phone-number option:selected").text());
76047 }
76048
76049
76050 module.exports = {
76051     panel: {
76052         domId: "call-container",
76053         collapsed: true,
76054         pane: "left",
76055         titleName: "Call",
76056         display: true
76057     },
76058     initialize: function () {
76059         jQuery("#call-local-call").bind("click", _localCall);
76060         jQuery("#call-local-end").bind("click", _localEnd);
76061         jQuery("#call-remote-call").bind("click", _remoteCall);
76062         jQuery("#call-remote-end").bind("click", _remoteEnd);
76063         jQuery("#recording-status").bind("click", _leaveMessage);
76064         jQuery("#call-exception-status").bind("click", _exceptionStatus);
76065         jQuery("#call-exception-type").bind("click", null);
76066
76067         _initEventWatchers();
76068         _initContacts();
76069         jQuery("#remotePartyName").text(jQuery("#call-local-phone-number option:selected").text());
76070         jQuery("#call-local-phone-number").bind("change", _updateRemotePartyName);
76071         _initExceptionTypes();
76072     }
76073 };
76074
76075 });
76076 define('ripple/ui/plugins/omnibar', function (require, exports, module) {
76077 /*
76078  *  Copyright 2011 Research In Motion Limited.
76079  *
76080  * Licensed under the Apache License, Version 2.0 (the "License");
76081  * you may not use this file except in compliance with the License.
76082  * You may obtain a copy of the License at
76083  *
76084  * http://www.apache.org/licenses/LICENSE-2.0
76085  *
76086  * Unless required by applicable law or agreed to in writing, software
76087  * distributed under the License is distributed on an "AS IS" BASIS,
76088  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
76089  * See the License for the specific language governing permissions and
76090  * limitations under the License.
76091  */
76092 var emulatorBridge = require('ripple/emulatorBridge'),
76093     platform = require('ripple/platform'),
76094     db = require('ripple/db'),
76095     utils = require('ripple/utils'),
76096     devices = require('ripple/devices'),
76097     constants = require('ripple/constants'),
76098     _event = require('ripple/event'),
76099     tooltip = require('ripple/ui/plugins/tooltip'),
76100     histories = [];
76101
76102 function _omnibar() {
76103     return document.querySelector(".omni-bar input");
76104 }
76105
76106 function _persist(url) {
76107     db.save("current-url", url);
76108 }
76109
76110 function _persistRoot(url) {
76111     db.save("root-url", url);
76112 }
76113
76114 function _currentURL() {
76115     return db.retrieve("current-url") || "about:blank";
76116 }
76117
76118 function _rootURL() {
76119     return db.retrieve("root-url") || "about:blank";
76120 }
76121
76122 function _reload() {
76123     _event.trigger("ApplicationLoad", null);
76124     emulatorBridge.window().location.reload();
76125 }
76126
76127 function _loadApplication() {
76128     var omnibar = _omnibar(),
76129             xhr;
76130     if (omnibar.value.trim() !== "") {
76131         if (_currentURL().match(/^file:/) && omnibar.value.match(/^file:/)) { // Use ajax to know whether that file exists
76132             xhr = new XMLHttpRequest();
76133             xhr.onreadystatechange = function () {
76134                 if (xhr.readyState === 4) {
76135                     if (xhr.responseText !== '') {
76136                         _persist(omnibar.value);
76137                         _persistRoot(omnibar.value);
76138                         emulatorBridge.window().location.assign(omnibar.value);
76139                     } else {
76140                         alert("File doesn't exist!");
76141                         return;
76142                     }
76143                 }
76144             };
76145             xhr.open('GET', omnibar.value, true);
76146             xhr.send(null);
76147         } else {
76148             omnibar.value = omnibar.value.indexOf("://") < 0 ? "http://" + omnibar.value : omnibar.value;
76149             _persist(omnibar.value);
76150             _persistRoot(omnibar.value);
76151             emulatorBridge.window().location.assign(omnibar.value);
76152         }
76153         _addHistory(omnibar.value);
76154     }
76155     _event.trigger("ApplicationLoad", null);
76156 }
76157
76158 function _hideHistory() {
76159     $("#app-launching-history").hide("slide", {direction: "up"}, "fast");
76160     $("#overlayBackground-transparent").hide();
76161 }
76162
76163 function _makeHistoryItems() {
76164     histories = db.retrieveObject(constants.LAUNCHING_HISTORY);
76165     if (histories === undefined) {
76166         histories = [];
76167     }
76168     $("#app-launching-history").empty();
76169     histories.reverse();
76170     histories.forEach(function (item) {
76171         $("#app-launching-history").append('<div class="app-launching-history-item">' + item + '</div>');
76172     });
76173
76174     if (histories.length === 0) {
76175         $("#app-launching-history").append('<div class="app-launching-history-item-empty">History empty</div>');
76176     }
76177
76178     $(".app-launching-history-item").unbind('click');
76179     $(".app-launching-history-item").bind("click", function () {
76180         $(".omni-bar input").val(histories[$(this).index()]);
76181         _loadApplication();
76182         _hideHistory();
76183     });
76184 }
76185
76186
76187 function _showHistory() {
76188     _makeHistoryItems();
76189     $("#app-launching-history").css("width", $(".omni-bar input").width() + 20);
76190     $("#app-launching-history").show("slide", {direction: "up"}, "fast");
76191     $(window).bind('resize', function () {
76192         $("#app-launching-history").css("width", $(".omni-bar input").width() + 20);
76193         $("#overlayBackground-transparent").css("width", $(window).width());
76194         $("#overlayBackground-transparent").css("height", $(window).height());
76195     });
76196
76197     $("#history-background-overlay").show();
76198     $("#overlayBackground-transparent").css("width", $(window).width());
76199     $("#overlayBackground-transparent").css("height", $(window).height());
76200     $("#overlayBackground-transparent").show();
76201     $("#overlayBackground-transparent").unbind('click');
76202     $("#overlayBackground-transparent").bind("click", function () {
76203         _hideHistory();
76204     });
76205 }
76206
76207
76208 function _addHistory(uri) {
76209     var i = 0, thehistories = db.retrieveObject(constants.LAUNCHING_HISTORY);
76210     if (thehistories !== undefined) {
76211         for (i; i < thehistories.length; i++) {
76212             if (uri === thehistories[i]) {
76213                 return;
76214             }
76215         }
76216         if (thehistories.length >= 20) {
76217             thehistories.reverse();
76218             thehistories.pop();
76219             thehistories.reverse();
76220         }
76221     } else {
76222         thehistories = [];
76223     }
76224     thehistories.push(uri);
76225     db.saveObject(constants.LAUNCHING_HISTORY, thehistories);
76226 }
76227
76228 _event.on("FrameHistoryChange", function (url) {
76229     _omnibar().value = url;
76230     _persist(url);
76231     _persistRoot(url);
76232 });
76233
76234 module.exports = {
76235     initialize: function () {
76236         var omnibar = _omnibar(), loc, tmp,
76237             url, filename, matching, deviceId,
76238             xhr, uriParams, platformName, platformVersion, newUrl;
76239
76240         jQuery(".logo, .beta, .left, .right, .left-panel-collapse, .right-panel-collapse").css({
76241             "marginTop": "35px"
76242         });
76243
76244         jQuery("#settings-xhr-proxy").parent().parent().hide();
76245
76246         $(".omni-bar").show();
76247
76248         uriParams = utils.getURIParams(document.documentURI);
76249         if (uriParams.url !== undefined) {
76250             url = uriParams.url;
76251             if (url.match(/^\.[\.]?/) !== null) {
76252                 loc = document.location;
76253                 filename = loc.pathname.replace(/^.*[\\\/]/, '');
76254                 matching = new RegExp(filename, "g");
76255                 tmp = loc.protocol + "//" + loc.hostname + loc.pathname.replace(matching, "") + url;
76256                 url = tmp;
76257             }
76258             _persist(url);
76259             _persistRoot(url);
76260             require('ripple/widgetConfig').initialize();
76261             require('ripple/ui/plugins/widgetConfig').initialize();
76262         }
76263
76264         omnibar.value = _currentURL();
76265
76266         omnibar.addEventListener("keydown", function (event) {
76267             if (event.keyCode === '13' || event.keyCode === 13 || event.keyCode === '0' || event.keyCode === 0) { // enter or return
76268                 if (omnibar.value.trim() !== "") {
76269                     if (_currentURL().match(/^file:/) && omnibar.value.match(/^file:/)) { // Use ajax to know whether that file exists
76270                         xhr = new XMLHttpRequest();
76271                         xhr.onreadystatechange = function () {
76272                             if (xhr.readyState === 4) {
76273                                 if (xhr.responseText !== '') {
76274                                     _persist(omnibar.value);
76275                                     _persistRoot(omnibar.value);
76276                                     emulatorBridge.window().location.assign(omnibar.value);
76277                                 } else {
76278                                     alert("File doesn't exist!");
76279                                     return;
76280                                 }
76281                             }
76282                         };
76283                         xhr.open('GET', omnibar.value, true);
76284                         xhr.send(null);
76285                     } else {
76286                         //default the protocal if not provided
76287                         omnibar.value = omnibar.value.indexOf("://") < 0 ? "http://" + omnibar.value : omnibar.value;
76288                         _persist(omnibar.value);
76289                         _persistRoot(omnibar.value);
76290                         emulatorBridge.window().location.assign(omnibar.value);
76291                     }
76292                     _event.trigger("ApplicationLoad", null);
76293                     _addHistory(omnibar.value);
76294                 }
76295             }
76296         });
76297
76298         window.addEventListener("keydown", function (event) {
76299             var hasMetaOrAltPressed = (event.metaKey || event.ctrlKey),
76300                 key = parseInt(event.keyCode, 10);
76301
76302             if (key === 82 && hasMetaOrAltPressed) { // cmd/ctrl + r
76303                 event.preventDefault();
76304                 _reload();
76305             }
76306
76307             if (key === 116) { // F5
76308                 event.preventDefault();
76309                 _reload();
76310             }
76311         });
76312
76313         document.getElementById("history-reload").addEventListener("click", _reload);
76314         $("#options-button-history").bind("click", function () {
76315             _showHistory();
76316         });
76317         tooltip.create("#history-reload", "Reload Application");
76318         tooltip.create("#options-button-history", "History");
76319         tooltip.create("#options-button-config-window", "Configuration");
76320         tooltip.create("#options-button-panels", "Panel Settings");
76321         tooltip.create("#options-button-about", "About");
76322     },
76323     currentURL: function () {
76324         return _currentURL();
76325     },
76326     rootURL: function () {
76327         return _rootURL();
76328     }
76329 };
76330
76331 });
76332 define('ripple/ui/plugins/fileSystem', function (require, exports, module) {
76333 /*
76334  *  Copyright 2011 Research In Motion Limited.
76335  *
76336  * Licensed under the Apache License, Version 2.0 (the "License");
76337  * you may not use this file except in compliance with the License.
76338  * You may obtain a copy of the License at
76339  *
76340  * http://www.apache.org/licenses/LICENSE-2.0
76341  *
76342  * Unless required by applicable law or agreed to in writing, software
76343  * distributed under the License is distributed on an "AS IS" BASIS,
76344  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
76345  * See the License for the specific language governing permissions and
76346  * limitations under the License.
76347  */
76348 var utils = require('ripple/utils'),
76349     constants = require('ripple/constants'),
76350     fileSystem = require('ripple/fileSystem'),
76351     fileSystemPaths = fileSystem.getFileSystemPaths();
76352
76353 module.exports = {
76354     panel: {
76355         domId: "filsystem-container",
76356         collapsed: true,
76357         pane: "left"
76358     },
76359     initialize: function () {
76360         var fileSystemPaths = fileSystem.getFileSystemPaths();
76361
76362         utils.forEach(fileSystemPaths, function (value, key) {
76363             utils.bindAutoSaveEvent(jQuery(constants.FILESYSTEM.INPUT_PREFIX_ID + key).val(value.uri), function () {
76364                 value.uri = jQuery(constants.FILESYSTEM.INPUT_PREFIX_ID + key).val();
76365                 fileSystem.updateFileSystemPaths(fileSystemPaths);
76366             });
76367         });
76368     }
76369 };
76370
76371 });
76372 define('ripple/ui/plugins/notifications', function (require, exports, module) {
76373 /*
76374  *  Copyright 2011 Research In Motion Limited.
76375  *
76376  * Licensed under the Apache License, Version 2.0 (the "License");
76377  * you may not use this file except in compliance with the License.
76378  * You may obtain a copy of the License at
76379  *
76380  * http://www.apache.org/licenses/LICENSE-2.0
76381  *
76382  * Unless required by applicable law or agreed to in writing, software
76383  * distributed under the License is distributed on an "AS IS" BASIS,
76384  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
76385  * See the License for the specific language governing permissions and
76386  * limitations under the License.
76387  */
76388
76389 var db = require('ripple/db'),
76390     utils = require('ripple/utils'),
76391     event = require('ripple/event'),
76392     _notificationUIStack,
76393     _notificationTemplate = "";
76394
76395 function _remove(id) {
76396     delete _notificationUIStack[id];
76397     db.saveObject("posted-notifications", _notificationUIStack);
76398     event.trigger("refreshNotificationStack", [], true);
76399     _render();
76400 }
76401
76402 function _removeAll() {
76403     _notificationUIStack = {};
76404     db.saveObject("posted-notifications", _notificationUIStack);
76405     event.trigger("refreshNotificationStack", [], true);
76406     $("#notification-box").empty();
76407     $("#notification-box").append('<div style="color:#666666;">(Empty notification.)</div>');
76408     $("#remove-all-notifications-btn").hide();
76409 }
76410
76411 function _render() {
76412     var notificationHTML = "",
76413         htmlContent = "";
76414
76415     utils.forEach(_notificationUIStack, function (item) {
76416         notificationHTML = _notificationTemplate.replace(/#id/g, item.id)
76417             .replace(/#title/g, item.title)
76418             .replace(/#content/, item.content ? item.content : "")
76419             .replace(/#type/, item.type)
76420             .replace(/#statusType/, item.statusType)
76421             .replace(/#postedTime/, item.postedTime)
76422             .replace(/#iconPath/, item.iconPath ? item.iconPath : "")
76423             .replace(/#subIconPath/, item.subIconPath ? item.subIconPath : "")
76424             .replace(/#number/, item.number ? item.number : "")
76425             .replace(/#detailInfo/, item.detailInfo ? item.detailInfo.join() : "")
76426             .replace(/#backgroundImagePath/, item.backgroundImagePath ? item.backgroundImagePath : "")
76427             .replace(/#thumbnails/, item.thumbnails ? item.thumbnails.join() : "")
76428             .replace(/#soundPath/, item.soundPath ? item.soundPath : "")
76429             .replace(/#vibration/, item.vibration !== undefined ? (item.vibration === true ? "true" : "false") : "")
76430             .replace(/#appControl/, item.appControl ? item.appControl : "")
76431             .replace(/#appId/, item.appId ? item.appId : "")
76432             .replace(/#progressType/g, item.progressType ? item.progressType: "")
76433             .replace(/#progressValue/, (item.statusType === "PROGRESS" && item.progressType === "PERCENTAGE" && item.progressValue) ? item.progressValue.toString() + "%" : "")
76434             .replace(/#progressBarValue/, (item.statusType === "PROGRESS" && item.progressType === "PERCENTAGE" && item.progressValue) ? item.progressValue : 0)
76435             .replace(/#progress2Value/, (item.statusType === "PROGRESS" && item.progressType === "BYTE" && item.progressValue) ? item.progressValue.toString() + " byte(s)" : "")
76436             .replace(/#displayBar/g, (item.statusType !== "PROGRESS" || item.progressType !== "PERCENTAGE") ? "none" : "")
76437             .replace(/#display2Bar/g, (item.statusType !== "PROGRESS" || item.progressType !== "BYTE") ? "none" : "");
76438         htmlContent += notificationHTML;
76439     });
76440
76441     $("#notification-box").accordion("destroy");
76442     $("#notification-box").html(htmlContent).accordion({
76443         active : false,
76444         collapsible : true,
76445         autoHeight : false
76446     });
76447
76448     $("#notification-box .progress-bar").each(function (index, item) {
76449         $(item).width(this.id);
76450     });
76451     if (utils.count(_notificationUIStack) !== 0) {
76452         $("#remove-all-notifications-btn").show();
76453     } else {
76454         $("#remove-all-notifications-btn").hide();
76455     }
76456     $("." + "remove-notification-btn").bind("click", function () {
76457         _remove(this.id);
76458     });
76459 }
76460
76461 module.exports = {
76462     panel: {
76463         domId: "notification-container",
76464         collapsed: true,
76465         pane: "left",
76466         titleName: "Notification",
76467         display: true
76468     },
76469     initialize: function () {
76470         _notificationTemplate = $("#notification-template").html();
76471         $("#notification-box").empty();
76472         _notificationUIStack = db.retrieveObject("posted-notifications") || {};
76473         if (utils.count(_notificationUIStack) === 0) {
76474             $("#notification-box").append('<div style="color:#666666;">(Empty notification.)</div>');
76475         }
76476         else
76477             _render();
76478         $("#remove-all-notifications-btn").bind("click", _removeAll);
76479
76480         event.on("refreshNotificationUI", function () {
76481             _notificationUIStack = db.retrieveObject("posted-notifications");
76482             _render();
76483         });
76484     }
76485 };
76486
76487 });
76488 define('ripple/ui/plugins/messaging', function (require, exports, module) {
76489 /*
76490  *  Copyright 2011 Research In Motion Limited.
76491  *
76492  * Licensed under the Apache License, Version 2.0 (the "License");
76493  * you may not use this file except in compliance with the License.
76494  * You may obtain a copy of the License at
76495  *
76496  * http://www.apache.org/licenses/LICENSE-2.0
76497  *
76498  * Unless required by applicable law or agreed to in writing, software
76499  * distributed under the License is distributed on an "AS IS" BASIS,
76500  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
76501  * See the License for the specific language governing permissions and
76502  * limitations under the License.
76503  */
76504 var event = require('ripple/event'),
76505     utils = require('ripple/utils'),
76506     _type = {
76507         sms: "SMS",
76508         mms: "MMS",
76509         email: "E-mail"
76510     },
76511     _filename_suffix = 0,
76512     _attachments = [];
76513
76514 function _getAttachmentFileName() {
76515     return "attach" + _filename_suffix + ".txt";
76516 }
76517
76518 module.exports = {
76519     panel: {
76520         domId: "messaging-container",
76521         collapsed: true,
76522         pane: "left",
76523         titleName: "Messaging",
76524         display: true
76525     },
76526     initialize: function () {
76527         document.getElementById("messaging-send")
76528             .addEventListener("click", function () {
76529                 var number = document.getElementById("messaging-sms-number").value,
76530                     text = document.getElementById("messaging-text").value,
76531                     type = document.getElementById("messaging-type").value,
76532                     message = {
76533                         type: type,
76534                         body: text,
76535                         from: number,
76536                         time: new Date(),
76537                         attachments: _attachments
76538                     };
76539
76540                 event.trigger("MessageReceived", [message]);
76541                 
76542                 _attachments = [];
76543 /* TODO: add back when attachment is finished
76544                 document.getElementById("messaging-attachments").innerHTML = "";
76545 */
76546                 _filename_suffix = 0;
76547             }, false);
76548
76549 /* TODO: add back when attachment is finished
76550         document.getElementById("messaging-attach")
76551             .addEventListener("click", function () {
76552                 var attachedFile, attachedFileCheckbox, attachedFileName;
76553                 if (_filename_suffix > 0)
76554                     return;
76555                 _attachments.push({filename: _getAttachmentFileName(), content: document.getElementById("messaging-attachment-content").value});
76556
76557                 attachedFile = document.getElementById("messaging-attachments").insertRow(0);
76558                 attachedFileName = attachedFile.insertCell(0);
76559                 attachedFileCheckbox = attachedFile.insertCell(1);
76560                 attachedFileName.innerHTML = _attachments[_filename_suffix].filename;
76561 //                attachedFileCheckbox.innerHTML = '<input type="checkbox" value="' + _filename_suffix + '">';
76562
76563                 document.getElementById("messaging-attachment-content").value = "";
76564                 _filename_suffix++;
76565             }, false);
76566
76567         document.getElementById("messaging-detach")
76568             .addEventListener("click", function () {
76569                 _attachments = [];
76570                 document.getElementById("messaging-attachments").innerHTML = "";
76571                 _filename_suffix = 0;
76572             }, false);
76573 */
76574         event.on("OutsideMessageReceived", function (message) {
76575             var numRecipients = 0,
76576                 i = 0,
76577                 recipients = [],
76578                 recipientsStatus = {},
76579                 strRecipients = document.getElementById("messaging-recipients").value;
76580
76581             recipientsStatus.id = message.id;
76582             recipientsStatus.msg = message.msg;
76583             for (i in message.to) {
76584                 recipientsStatus[message.to[i]] = true;
76585                 recipients.push(message.to[i]);
76586             }
76587             for (i in message.cc) {
76588                 recipientsStatus[message.cc[i]] = true;
76589                 recipients.push(message.cc[i]);
76590             }
76591             for (i in message.bcc) {
76592                 recipientsStatus[message.bcc[i]] = true;
76593                 recipients.push(message.bcc[i]);
76594             }
76595             numRecipients = recipients.length;
76596             strRecipients = recipients.join(",");
76597             event.trigger("MessageSent", [recipientsStatus]);
76598             document.getElementById("messaging-received").innerHTML = "" + numRecipients + " recipient(s)" + " delivered";
76599             document.getElementById("messaging-recipients").value = strRecipients;
76600             document.getElementById("received-message-box").value = message.body;
76601         });
76602         
76603         document.getElementById("messaging-clear")
76604             .addEventListener("click", function () {
76605                 document.getElementById("received-message-box").value = "";
76606                 document.getElementById("messaging-received").innerHTML = "";
76607             }, false);
76608         
76609         utils.forEach(_type, function (msgTypeText, msgType) {
76610             var typeNode = utils.createElement("option", {
76611                     "innerText": msgTypeText,
76612                     "value": msgType
76613                 });
76614
76615             document.getElementById("messaging-type").appendChild(typeNode);
76616         });
76617     }
76618 };
76619
76620 });
76621 define('ripple/ui/plugins/audioPlayer', function (require, exports, module) {
76622 /*
76623  *  Copyright 2011 Research In Motion Limited.
76624  *
76625  * Licensed under the Apache License, Version 2.0 (the "License");
76626  * you may not use this file except in compliance with the License.
76627  * You may obtain a copy of the License at
76628  *
76629  * http://www.apache.org/licenses/LICENSE-2.0
76630  *
76631  * Unless required by applicable law or agreed to in writing, software
76632  * distributed under the License is distributed on an "AS IS" BASIS,
76633  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
76634  * See the License for the specific language governing permissions and
76635  * limitations under the License.
76636  */
76637 var event = require('ripple/event'),
76638     constants = require('ripple/constants'),
76639     audioObj = document.getElementById("multimedia-audio"),
76640     audioProgress = document.getElementById(constants.COMMON.MULTIMEDIA_AUDIO_PROGRESS_ID);
76641
76642 module.exports = {
76643     initialize: function () {
76644         var audioObj = document.getElementById("multimedia-audio"),
76645             audioProgress = document.getElementById(constants.COMMON.MULTIMEDIA_AUDIO_PROGRESS_ID);
76646
76647         if (audioObj) {
76648             event.on("MultimediaVolumeChanged", function (volume) {
76649                 audioObj.volume = parseFloat(volume / 10);
76650             });
76651
76652             audioObj.addEventListener("timeupdate", function () {
76653                 var s = parseInt(audioObj.currentTime % 60, 10),
76654                     m = parseInt((audioObj.currentTime / 60) % 60, 10);
76655
76656                 audioProgress.innerText = ((m > 9) ? m  : "0" + m) + ':' + ((s > 9) ? s  : "0" + s);
76657             }, false);
76658
76659             event.on("MultimediaAudioStateChanged", function (state) {
76660                 document.getElementById(constants.COMMON.MULTIMEDIA_AUDIO_STATE_FIELD_ID).innerText = state;
76661                 document.getElementById(constants.COMMON.MULTIMEDIA_AUDIO_FILE_FIELD_ID).innerText = audioObj.getAttribute("src");
76662             });
76663         }
76664     }
76665 };
76666
76667 });
76668 define('ripple/ui/plugins/settings', function (require, exports, module) {
76669 /*
76670  *  Copyright 2011 Research In Motion Limited.
76671  *
76672  * Licensed under the Apache License, Version 2.0 (the "License");
76673  * you may not use this file except in compliance with the License.
76674  * You may obtain a copy of the License at
76675  *
76676  * http://www.apache.org/licenses/LICENSE-2.0
76677  *
76678  * Unless required by applicable law or agreed to in writing, software
76679  * distributed under the License is distributed on an "AS IS" BASIS,
76680  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
76681  * See the License for the specific language governing permissions and
76682  * limitations under the License.
76683  */
76684 var db = require('ripple/db'),
76685     constants = require('ripple/constants'),
76686     KEY = constants.XHR.PROXY_DISABLED_BUTTON; // TODO: one settings object for all
76687
76688 function _saveAndReload(key, value) {
76689     jWorkflow.order(function (prev, baton) {
76690         baton.take();
76691         db.save(key, value, null, baton.pass);
76692     }).start(function () {
76693         window.tinyHipposReload = true;
76694         location.reload();
76695     });
76696 }
76697
76698 function _initialize(prev, baton) {
76699     var select = document.getElementById("settings-xhr-proxy"),
76700         about = require('ripple/ui/plugins/about-dialog');
76701
76702     select.value = String(db.retrieve(KEY));
76703     select.addEventListener("change", function () {
76704         _saveAndReload(KEY, this.value);
76705     }, false);
76706     
76707     $("#options-menu-about").click(function () {
76708         about.show();
76709     });
76710     // TODO: reload here?
76711 }
76712
76713 module.exports = {
76714     panel: {
76715         domId: "settings-container",
76716         collapsed: true,
76717         pane: "right"
76718     },
76719     initialize: _initialize
76720 };
76721
76722 });
76723 define('ripple/ui/plugins/widgetConfig', function (require, exports, module) {
76724 /*
76725  *  Copyright 2011 Research In Motion Limited.
76726  *
76727  * Licensed under the Apache License, Version 2.0 (the "License");
76728  * you may not use this file except in compliance with the License.
76729  * You may obtain a copy of the License at
76730  *
76731  * http://www.apache.org/licenses/LICENSE-2.0
76732  *
76733  * Unless required by applicable law or agreed to in writing, software
76734  * distributed under the License is distributed on an "AS IS" BASIS,
76735  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
76736  * See the License for the specific language governing permissions and
76737  * limitations under the License.
76738  */
76739 var constants = require('ripple/constants'),
76740     event = require('ripple/event'),
76741     utils = require('ripple/utils'),
76742     exception = require('ripple/exception'),
76743     tooltip = require('ripple/ui/plugins/tooltip'),
76744     platform = require('ripple/platform'),
76745     widgetConfig = require('ripple/widgetConfig');
76746
76747 function _buildConfigAccordionNode(node, accordionContainer, counter) {
76748     var nodeDiv, nodeTitleH3, nodeContentDiv, tableString, attribute, child, result,
76749         tableClass, nameClass, attributeNameClass, messageClass, nameId, messageId, attributeName, attributeValue, attributeMessage,
76750         helpText = {},
76751         nodeCounter = 0,
76752         attributeCounter = 0,
76753         moreNodes = node.validationResult,
76754         createTooltip = function (value, index) {
76755             tooltip.create("#" +  index, value);
76756         };
76757
76758     while (moreNodes) {
76759         result = node.validationResult[nodeCounter];
76760
76761         if (!result) {
76762             // this should never happen
76763             return;
76764         }
76765
76766         // the container of the entire accordion block
76767         nodeDiv = utils.createElement("div", {
76768             "id": "config-accordion-node-content-" + counter + "-" + nodeCounter,
76769             "class": "ui-corner-all"
76770         });
76771
76772         // the header bar of the accordion block
76773         nodeTitleH3 = utils.createElement("h3", {
76774             "id": "config-accordion-node-title-" + counter + "-" + nodeCounter,
76775             "class": "config-accordion-node-title"
76776         });
76777
76778         nodeTitleH3.appendChild(utils.createElement("a", {
76779             href: "#",
76780             innerText: node.nodeName,
76781             "class": constants.CONFIG.SUCCESS_CSS[(result.valid === undefined) ? "missing" : result.valid.toString()]
76782         }));
76783         nodeDiv.appendChild(nodeTitleH3);
76784
76785         if (node.helpText) {
76786             helpText[nodeTitleH3.id] = node.helpText;
76787         }
76788
76789         nodeContentDiv = utils.createElement("div");
76790
76791         // display node value (add tool tip if exists)
76792         if (node.type || (!node.type && result && result.value)) {
76793             nodeContentDiv.appendChild(utils.createElement("div", {
76794                 "id": "config-accordion-node-content-value-" + counter + "-" + nodeCounter,
76795                 "class": "config-accordion-node-content-value",
76796                 "innerHTML": "<span>Value:</span>" + (result.value || "")
76797             }));
76798
76799             if (node.helpValueText) {
76800                 helpText["config-accordion-node-content-value-" + counter + "-" + nodeCounter] = node.helpValueText;
76801             }
76802         }
76803
76804         // display node message if failed validation
76805         if (result && result.message) {
76806             nodeContentDiv.appendChild(utils.createElement("div", {
76807                 "id": "config-accordion-node-content-value-message-" + counter + "-" + nodeCounter,
76808                 "class": "config-accordion-node-content-value-message ui-text-fail",
76809                 "innerHTML": "<span>Message:</span>" + result.message
76810             }));
76811         }
76812
76813         // display node attributes with name, value, message if failed validation
76814         if (result.attributes) {
76815             nodeContentDiv.appendChild(utils.createElement("div", {
76816                 "id": "config-accordion-node-content-attributes-title-" + counter + "-" + nodeCounter,
76817                 "class": "config-accordion-node-content-attributes-title",
76818                 "innerHTML": "Attributes..."
76819             }));
76820
76821             tableClass = "preferences-table";
76822             nameClass = "config-attributes-name-value";
76823             attributeNameClass = "ui-text-label";
76824             messageClass = "config-attributes-message";
76825
76826             tableString = '<table class="' + tableClass + ' ui-widget-content">';
76827             for (attribute in result.attributes) {
76828                 if (result.attributes.hasOwnProperty(attribute)) {
76829                     nameId = "config-accordion-node-content-attributes-table-name-" + counter + "-" + nodeCounter + "-" + attributeCounter;
76830                     messageId = "config-accordion-node-content-attributes-table-message-" + counter + "-" + nodeCounter + "-" + attributeCounter;
76831                     attributeName = result.attributes[attribute].attributeName;
76832                     attributeValue = result.attributes[attribute].value || "&nbsp;";
76833                     attributeMessage = result.attributes[attribute].message || null;
76834
76835                     tableString += '<tr class="' + nameClass + '" id="' + nameId + '">' +
76836                             '<td class="' + attributeNameClass + '">' + attributeName + '</td>' +
76837                             '<td>' + attributeValue + '</td></tr>';
76838
76839                     if (node.attributes[attributeName].helpText) {
76840                         helpText[nameId] = node.attributes[attributeName].helpText;
76841                     }
76842
76843                     if (attributeMessage !== null) {
76844                         tableString += "<tr class=" + messageClass + " id=" + messageId + "><td colspan=\"2\">" +
76845                                 attributeMessage + "</td></tr>";
76846                     }
76847                     attributeCounter++;
76848                 }
76849             }
76850             tableString += "</table>";
76851
76852             nodeContentDiv.innerHTML += tableString;
76853         }
76854
76855
76856         nodeDiv.appendChild(nodeContentDiv);
76857         accordionContainer.appendChild(nodeDiv);
76858
76859         utils.forEach(helpText, createTooltip);
76860
76861         nodeCounter ++;
76862
76863         if (!node.validationResult[nodeCounter]) {
76864             nodeCounter = 0;
76865             moreNodes = false;
76866         }
76867     }
76868
76869     if (node.children) {
76870         for (child in node.children) {
76871             if (node.children.hasOwnProperty(child)) {
76872                 counter ++;
76873                 _buildConfigAccordionNode(node.children[child], accordionContainer, counter);
76874             }
76875         }
76876     }
76877 }
76878
76879 function _initializeConfigResultsView(results) {
76880     try {
76881         var rootNode,
76882             accordionContainer = document.getElementById("widget-config");
76883
76884         accordionContainer.innerHTML = "";
76885         if (!results) {
76886             accordionContainer.appendChild(utils.createElement("div", {
76887                 "class": "config-accordion-node-title " + constants.CONFIG.SUCCESS_CSS["false"],
76888                 "innerHTML": "Expected to find a configuration file for your application, but none is present. Please create" +
76889                         " a configuration file with the following name in the root directory of your application: " +
76890                         platform.current().fileName
76891             }));
76892             return;
76893         }
76894
76895         rootNode = results[results.rootElement];
76896
76897         _buildConfigAccordionNode(rootNode, accordionContainer, 0);
76898
76899         jQuery(function () {
76900             var stop = false;
76901             jQuery("#widget-config h3").click(function (event) {
76902                 if (stop) {
76903                     event.stopImmediatePropagation();
76904                     event.preventDefault();
76905                     stop = false;
76906                 }
76907             });
76908             jQuery("#widget-config").accordion("destroy").accordion({
76909                 header: "> div > h3",
76910                 autoHeight: false
76911             });
76912         });
76913     } catch (e) {
76914         exception.handle(e, true);
76915     }
76916 }
76917
76918 event.on("FrameHistoryChange", function () {
76919     module.exports.initialize();
76920 });
76921
76922 module.exports = {
76923     panel: {
76924         domId: "config-container",
76925         collapsed: true,
76926         pane: "right",
76927         titleName: "Application Configuration",
76928         display: true
76929     },
76930     initialize: function () {
76931         var results = widgetConfig.getValidationResults();
76932         _initializeConfigResultsView(results);
76933     }
76934 };
76935
76936 });
76937 define('ripple/ui/plugins/layout', function (require, exports, module) {
76938 /*
76939  *  Copyright 2011 Research In Motion Limited.
76940  *
76941  * Licensed under the Apache License, Version 2.0 (the "License");
76942  * you may not use this file except in compliance with the License.
76943  * You may obtain a copy of the License at
76944  *
76945  * http://www.apache.org/licenses/LICENSE-2.0
76946  *
76947  * Unless required by applicable law or agreed to in writing, software
76948  * distributed under the License is distributed on an "AS IS" BASIS,
76949  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
76950  * See the License for the specific language governing permissions and
76951  * limitations under the License.
76952  */
76953 var constants = require('ripple/constants'),
76954     db = require('ripple/db'),
76955     resizer = require('ripple/resizer'),
76956     devices = require('ripple/devices'),
76957     event = require('ripple/event');
76958
76959 function _initializeLayout(prev, baton) {
76960     var layout = db.retrieve("layout"),
76961         orientation = db.retrieve("deviceOrientation") || "portrait",
76962         layoutLandscape = document.getElementById(constants.COMMON.ORIENTATION_SELECT_LANDSCAPE_ID),
76963         layoutPortrait = document.getElementById(constants.COMMON.ORIENTATION_SELECT_PORTRAIT_ID),
76964         currentDevice = devices.getCurrentDevice(),
76965         defaultOrientation =  currentDevice ? currentDevice.defaultOrientation : null,
76966         layoutTypeChanged = false;
76967
76968     jQuery("#" + constants.COMMON.ORIENTATION_SELECT_LANDSCAPE_ID).bind("click", function () {
76969         layoutLandscape.setAttribute("class", "layout-selected");
76970         layoutPortrait.setAttribute("class", "layout-not-selected");
76971         resizer.rotateDevice("landscape");
76972         event.trigger("OrientationChanged", ["landscape"], true);
76973     });
76974
76975     jQuery("#" + constants.COMMON.ORIENTATION_SELECT_PORTRAIT_ID).bind("click", function () {
76976         layoutLandscape.setAttribute("class", "layout-not-selected");
76977         layoutPortrait.setAttribute("class", "layout-selected");
76978         resizer.rotateDevice("portrait");
76979         event.trigger("OrientationChanged", ["portrait"], true);
76980     });
76981
76982     jQuery("#" + constants.COMMON.MENU_BUTTON).bind("click", function () {
76983         event.trigger("HardwareKey", [1]);
76984     });
76985
76986     jQuery("#" + constants.COMMON.BACK_BUTTON).bind("click", function () {
76987         event.trigger("HardwareKey", [0]);
76988     });
76989
76990     if (!layout) {
76991         layout = defaultOrientation || "portrait";
76992         layoutTypeChanged = true;
76993         resizer.changeLayoutType(layout);
76994     }
76995
76996     //Hide the orientation buttons that we don't need for this device
76997     if (!currentDevice.viewPort.landscape) {
76998         layoutLandscape.setAttribute("style", "display:none");
76999     }
77000
77001     if (!currentDevice.viewPort.portrait) {
77002         layoutPortrait.setAttribute("style", "display:none");
77003     }
77004
77005     if (layout && layout === "portrait") {
77006         layoutLandscape.setAttribute("class", "layout-not-selected");
77007         layoutPortrait.setAttribute("class", "layout-selected");
77008     }
77009     else if (layout && layout === "landscape") {
77010         layoutLandscape.setAttribute("class", "layout-selected");
77011         layoutPortrait.setAttribute("class", "layout-not-selected");
77012     }
77013
77014     if (!layoutTypeChanged) {
77015         resizer.resize(currentDevice);
77016     }
77017
77018     if (orientation === "portrait") {
77019         layoutLandscape.setAttribute("class", "layout-not-selected");
77020         layoutPortrait.setAttribute("class", "layout-selected");
77021     } else {
77022         layoutLandscape.setAttribute("class", "layout-selected");
77023         layoutPortrait.setAttribute("class", "layout-not-selected");
77024     }
77025     resizer.rotateDevice(orientation);
77026 }
77027
77028 module.exports = {
77029     initialize: _initializeLayout
77030 };
77031
77032 });
77033 define('ripple/ui/plugins/devices', function (require, exports, module) {
77034 /*
77035  *  Copyright 2011 Research In Motion Limited.
77036  *
77037  * Licensed under the Apache License, Version 2.0 (the "License");
77038  * you may not use this file except in compliance with the License.
77039  * You may obtain a copy of the License at
77040  *
77041  * http://www.apache.org/licenses/LICENSE-2.0
77042  *
77043  * Unless required by applicable law or agreed to in writing, software
77044  * distributed under the License is distributed on an "AS IS" BASIS,
77045  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
77046  * See the License for the specific language governing permissions and
77047  * limitations under the License.
77048  */
77049 var constants = require('ripple/constants'),
77050     db = require('ripple/db'),
77051     resizer = require('ripple/resizer');
77052
77053 function _getTextZooming(zooming) {
77054     return zooming + '%';
77055 }
77056
77057 module.exports = {
77058     panel: {
77059         domId: "devices-container",
77060         collapsed: true,
77061         pane: "left",
77062         titleName: "Orientation and Zooming",
77063         display: true
77064     },
77065
77066     initialize: function () {
77067         var zooming = document.getElementById(constants.ENCAPSULATOR.ZOOMING);
77068         function updateZoomingValues() {
77069             var zoomingText, scaleFactor;
77070
77071             zoomingText = _getTextZooming(zooming.value);
77072             jQuery('#screen-zooming-label').html(zoomingText);
77073
77074             // Zooming device skin
77075             scaleFactor = zooming.value / 100;
77076             resizer.scaleDevice(scaleFactor);
77077         }
77078
77079         function initializeValues() {
77080             var zoomingValue =  db.retrieve(constants.ENCAPSULATOR.ZOOMING);
77081
77082             if (!zoomingValue) {
77083                 zoomingValue = 100;
77084             }
77085             jQuery("#" + constants.ENCAPSULATOR.ZOOMING).val(zoomingValue);
77086             updateZoomingValues();
77087         }
77088
77089         jQuery("#" + constants.ENCAPSULATOR.ZOOMING).bind("change", function () {
77090             updateZoomingValues();
77091             db.save(constants.ENCAPSULATOR.ZOOMING, zooming.value);
77092         });
77093
77094         initializeValues();
77095     }
77096 };
77097
77098
77099 });
77100 define('ripple/ui/plugins/storage', function (require, exports, module) {
77101 /*
77102  *  Copyright 2011 Research In Motion Limited.
77103  *
77104  * Licensed under the Apache License, Version 2.0 (the "License");
77105  * you may not use this file except in compliance with the License.
77106  * You may obtain a copy of the License at
77107  *
77108  * http://www.apache.org/licenses/LICENSE-2.0
77109  *
77110  * Unless required by applicable law or agreed to in writing, software
77111  * distributed under the License is distributed on an "AS IS" BASIS,
77112  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
77113  * See the License for the specific language governing permissions and
77114  * limitations under the License.
77115  */
77116 var constants = require('ripple/constants'),
77117     event = require('ripple/event'),
77118     platform = require('ripple/platform'),
77119     utils = require('ripple/utils'),
77120     app = require('ripple/app'),
77121     db = require('ripple/db');
77122
77123 function _updatePreferencesView() {
77124     var node = document.getElementById(constants.COMMON.STORAGE_TABLE_BODY_CLASS),
77125         countTitle = document.getElementById(constants.COMMON.STORAGE_COUNT_CONTAINER_ID);
77126
77127     // TODO: convert to appendChild
77128     if (node) {
77129         db.retrieveAll(platform.getPersistencePrefix(), function (results) {
77130             var str = "",
77131                 counter = 0;
77132
77133             utils.forEach(results, function (value, key) {
77134                 // TODO: based of current platform
77135                 if (app.isPreferenceReadOnly(key)) {
77136                     str += '<tr class="ui-text-highlight">';
77137                 } else {
77138                     str += '<tr>';
77139                 }
77140                 str += '<td>' + key + '</td><td>' + value + "</td></tr>";
77141                 counter ++;
77142             });
77143
77144             node.innerHTML = str;
77145             countTitle.innerHTML = counter.toString();
77146
77147             if (counter === 0) {
77148                 jQuery("#" + constants.COMMON.STORAGE_CLEAR_BUTTON_ID).addClass(constants.CSS_PREFIX.IRRELEVANT);
77149             }
77150             else {
77151                 jQuery("#" + constants.COMMON.STORAGE_CLEAR_BUTTON_ID).removeClass(constants.CSS_PREFIX.IRRELEVANT);
77152             }
77153         });
77154     }
77155 }
77156
77157 module.exports = {
77158     panel: {
77159         domId: "preferences",
77160         collapsed: true,
77161         pane: "left"
77162     },
77163     initialize: function () {
77164         jQuery("#preferences-clear-button").bind("click", function () {
77165             db.removeAll(platform.getPersistencePrefix());
77166         });
77167
77168         event.on("StorageUpdatedEvent", function () {
77169             _updatePreferencesView();
77170         });
77171
77172         _updatePreferencesView();
77173     }
77174 };
77175
77176 });
77177 define('ripple/ui/plugins/messagePort', function (require, exports, module) {
77178 /*
77179  *  Copyright 2014 Intel Corporation.
77180  *
77181  * Licensed under the Apache License, Version 2.0 (the "License");
77182  * you may not use this file except in compliance with the License.
77183  * You may obtain a copy of the License at
77184  *
77185  * http://www.apache.org/licenses/LICENSE-2.0
77186  *
77187  * Unless required by applicable law or agreed to in writing, software
77188  * distributed under the License is distributed on an "AS IS" BASIS,
77189  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
77190  * See the License for the specific language governing permissions and
77191  * limitations under the License.
77192  */
77193
77194 var db = require('ripple/db'),
77195     event = require('ripple/event'),
77196     exception = require('ripple/exception'),
77197     dbinit = require('ripple/platform/tizen/2.0/dbinit'),
77198     _messagePortGlobal = {
77199         localMessagePorts: {}
77200     },
77201     _db = null;
77202
77203 function _initMessagePortDatabase() {
77204     _db = dbinit.MessagePort;
77205
77206     db.saveObject("tizen-messageport", _db);
77207 }
77208
77209 function _initializeMessagePortPanel() {
77210     var stop = false;
77211
77212     _makeRemoteApplicationsHtml();
77213     _sendingRemoteMessage();
77214
77215     try {
77216         jQuery("#messagePort-remote-applications h3").click(function (event) {
77217             if (stop) {
77218                 event.stopImmediatePropagation();
77219                 event.preventDefault();
77220                 stop = true;
77221             }
77222         });
77223         jQuery("#messagePort-remote-applications").accordion("destroy").accordion({
77224             header: "> div > h3",
77225             active: false,
77226             collapsible: true,
77227             autoHeight: false
77228         });
77229     } catch (e) {
77230         exception.handle(e, true);
77231     }
77232 }
77233
77234 function _addLocalMessagePortOptions(messagePortName) {
77235     var htmlTemplate = '<option value="#messagePortName">#messagePortName</option>',
77236         option = '', appId, portSelector = [], sendSelector = [];
77237
77238     for (appId in _db) {
77239         portSelector.push("#" + appId + "-local-port");
77240         sendSelector.push("#" + appId + "-send");
77241     }
77242
77243     option += htmlTemplate.replace(/#messagePortName/g, messagePortName);
77244
77245     jQuery(portSelector.join(",")).append(option);
77246     jQuery(portSelector.join(",")).removeAttr("disabled");
77247     jQuery(sendSelector.join(",")).removeAttr("disabled");
77248 }
77249
77250 function _makeRemoteApplicationsHtml() {
77251     var htmlTemplate = jQuery("#messagePort-remote-template").html(),
77252         portHtmlTemplate = '<h3><span style="font-weight: bold;">#isTrustedIcon</span>&nbsp;#messagePortName</h3>' +
77253             '<div class="#portContainterAddr" style="border: 1px solid #DCDCDC; height: 10em; overflow: auto; border-radius: 8px;"></div>',
77254         optionTemplate = '<input id="#RemoteApplicationId-isTrusted" type="checkbox" value="true" #CHECKED disabled>' +
77255             '<label for="#RemoteApplicationId-isTrusted">Same as current application</label>',
77256         appId, appName, portName, abbr, isTrusted, html = '', portHtml,
77257         tabSelectors = [], portSelectors = [], certificate, option;
77258
77259     for (appId in _db) {
77260         appName = _db[appId].name;
77261         certificate= _db[appId].certificate;
77262
77263         portHtml = '';
77264         for (portName in _db[appId].ports) {
77265             isTrusted = _db[appId].ports[portName];
77266             abbr = portName.replace(/\s+/g, "");
77267
77268             portHtml += portHtmlTemplate.replace(/#messagePortName/g, portName)
77269                 .replace(/#RemoteApplicationId/g, appId)
77270                 .replace(/#isTrustedIcon/g, isTrusted ? "&#9417;" : "&#9711;")
77271                 .replace(/#portContainterAddr/g, abbr);
77272         }
77273
77274         tabSelectors.push("#" + appId + "-operations");
77275         portSelectors.push("#" + appId + "-local-port");
77276
77277         option = optionTemplate.replace(/#RemoteApplicationId/g, appId)
77278             .replace(/#CHECKED/g, certificate ? "checked" : "");
77279
77280         html += htmlTemplate.replace(/#RemoteApplicationId/g, appId)
77281             .replace(/#RemoteApplicationName/g, appName)
77282             .replace(/#RemoteApplicationPortHtml/g, portHtml)
77283             .replace(/#RemoteApplicationIsTrusted/g, option)
77284             .replace(/#80AC27/g, !certificate ? "#FF4500" : "#80AC27");
77285     }
77286
77287     jQuery("#messagePort-remote-applications").html(html);
77288
77289     jQuery(tabSelectors.join(",")).tabs();
77290     jQuery(portSelectors.join(",")).change(function () {
77291         var appId = this.id.replace("-local-port", "");
77292
77293         jQuery("#" + appId + "-access").hide();
77294     });
77295 }
77296
77297 function _sendingRemoteMessage() {
77298     var appId, sendSelector = [], clearSelector = [];
77299
77300     for (appId in _db) {
77301         sendSelector.push("#" + appId + "-send");
77302         clearSelector.push("#" + appId + "-clear");
77303     }
77304
77305     jQuery(sendSelector.join(",")).bind("click", function () {
77306         var appId = this.id.replace("-send", ""),
77307             key = jQuery("#" + appId + "-key").val(),
77308             value = jQuery("#" + appId + "-value").val(),
77309             data, remotePort, errorHtml,
77310             messagePortName = jQuery("#" + appId + "-local-port").val(),
77311             certificate = _db[appId].certificate;
77312
77313         if ((key.length === 0) || (value.length === 0))
77314             return;
77315
77316         data = [{
77317             key: key,
77318             value: value
77319         }];
77320         remotePort = {
77321             appId: appId,
77322             messagePortName: messagePortName,
77323             isTrusted: false
77324         };
77325         jQuery("#" + appId + "-key").val("");
77326         jQuery("#" + appId + "-value").val("");
77327
77328         if (!certificate && _messagePortGlobal.localMessagePorts[messagePortName]) {
77329             errorHtml = 'Access Denied: "' + messagePortName + '" is a trusted port ' +
77330                 'and the target application is signed with the different certification ' +
77331                 'from this application.';
77332             jQuery("#" + appId + "-access").html(errorHtml);
77333             jQuery("#" + appId + "-access").show();
77334             return;
77335         }
77336
77337         event.trigger("LocalMessagePortReceived", [data, remotePort, false]);
77338     });
77339
77340     jQuery(clearSelector.join(",")).bind("click", function () {
77341         var appId = this.id.replace("-clear", "");
77342
77343         jQuery("#" + appId + "-key").val("");
77344         jQuery("#" + appId + "-value").val("");
77345     });
77346 }
77347
77348 function _showRequestMessagePort(id, messagePortName, isTrusted, isRemote, appId) {
77349     var htmlTemplate, port, html, remoteKey;
77350
77351     htmlTemplate = '<h3><span style="font-weight: bold;">#isTrustedIcon</span>&nbsp;#messagePortName</h3>';
77352
77353     if (isRemote) {
77354         remoteKey = messagePortName + "&nbsp;(=>" + appId + ")";
77355         html = htmlTemplate.replace("#messagePortName", remoteKey)
77356             .replace("#isTrustedIcon", isTrusted ? "&#9417;" : "&#9711;");
77357     } else {
77358         remoteKey = messagePortName;
77359         html = htmlTemplate.replace("#messagePortName", remoteKey)
77360             .replace("#isTrustedIcon", isTrusted ? "&#9417;" : "&#9711;");
77361     }
77362
77363     if (port === undefined) {
77364         jQuery(id).append(html);
77365
77366         if (!isRemote) {
77367             _messagePortGlobal.localMessagePorts[messagePortName] = isTrusted;
77368             _addLocalMessagePortOptions(remoteKey);
77369         }
77370     }
77371 }
77372
77373 /**
77374  * receive sending message from current application and show content
77375  * @param remoteMessagePort
77376  * @param data
77377  * @param localMessagePort
77378  * @private
77379  */
77380 function _receiveMessage(remoteMessagePort, data, localMessagePort) {
77381     var htmlTemplate, header, footer, html = '', i, appId, messagePortName, selector,
77382         remotePort;
77383
77384     appId = remoteMessagePort.appId;
77385     messagePortName = remoteMessagePort.messagePortName;
77386
77387     selector = "#" + appId + "-receiving ." + messagePortName.replace(/\s+/g, "");
77388
77389     header = '<table class="preferences-table" style="border-bottom: 1px dashed #DCDCDC; width: 100%;">';
77390     htmlTemplate = '<tr><td><label class="ui-text-label">Key:</label></td><td>#Key</td></tr>' +
77391         '<tr><td><label class="ui-text-label">Value:</label></td><td>#Value</td></tr>';
77392     footer = '</table>';
77393
77394     for (i = 0; i < data.length; i++) {
77395         html += header +
77396             htmlTemplate.replace("#Key", data[i].key).replace("#Value", data[i].value) +
77397             footer;
77398     }
77399
77400     jQuery(selector).html(html);
77401
77402     if (!localMessagePort) return;
77403
77404     remotePort = {
77405         appId: appId,
77406         messagePortName: localMessagePort.messagePortName,
77407         isTrusted: localMessagePort.isTrusted
77408     };
77409
77410     event.trigger("LocalMessagePortReceived", [_db[appId]["reply"], remotePort, true]);
77411 }
77412
77413 //show requested local message port
77414 event.on("LocalMessagePortAdded", function (messagePortName, isTrusted) {
77415     _showRequestMessagePort("#current-app-local-port", messagePortName, isTrusted, false);
77416 });
77417
77418 //show requested remote message port
77419 event.on("RemoteMessagePortAdded", function (appId, messagePortName, isTrusted) {
77420     _showRequestMessagePort("#current-app-remote-port", messagePortName, isTrusted, true, appId);
77421 });
77422
77423 //show sending message content
77424 event.on("RemoteMessagePortSent", function (remoteMessagePort, data, localMessagePort) {
77425     _receiveMessage(remoteMessagePort, data, localMessagePort);
77426 });
77427
77428 module.exports = {
77429     panel: {
77430         domId: "messagePort-container",
77431         collapsed: true,
77432         pane: "left",
77433         titleName: "Message Port",
77434         display: true
77435     },
77436     initialize: function () {
77437         _initMessagePortDatabase();
77438         _initializeMessagePortPanel();
77439     }
77440 };
77441
77442 });
77443 define('ripple/ui/plugins/platform', function (require, exports, module) {
77444 /*
77445  *  Copyright 2011 Research In Motion Limited.
77446  *
77447  * Licensed under the Apache License, Version 2.0 (the "License");
77448  * you may not use this file except in compliance with the License.
77449  * You may obtain a copy of the License at
77450  *
77451  * http://www.apache.org/licenses/LICENSE-2.0
77452  *
77453  * Unless required by applicable law or agreed to in writing, software
77454  * distributed under the License is distributed on an "AS IS" BASIS,
77455  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
77456  * See the License for the specific language governing permissions and
77457  * limitations under the License.
77458  */
77459 var constants = require('ripple/constants'),
77460     utils = require('ripple/utils'),
77461     devices = require('ripple/devices'),
77462     deviceSettings = require('ripple/deviceSettings'),
77463     platform = require('ripple/platform'),
77464     db = require('ripple/db');
77465
77466 function _updatePlatformDeviceSelect(platformID, currentDeviceKey) {
77467     var devicesSelect = document.getElementById(constants.COMMON.DEVICE_SELECT_ID),
77468         listOfSortedDevices = devices.getDevicesForPlatform(platformID)
77469                                         .sort(function (a, b) {
77470                                             return (a.screen.width * a.screen.height) < (b.screen.width * b.screen.height) ? -1 : ((a.screen.width * a.screen.height) > (b.screen.width * b.screen.height) ? 1 : 0);
77471                                         });
77472     db.remove("viewport_width");
77473     db.remove("viewport_height");
77474     db.remove("viewportTag");
77475
77476     devicesSelect.innerHTML = "";
77477     listOfSortedDevices.forEach(function (dev) {
77478         var deviceNode = utils.createElement("option", {
77479             "innerText": dev.name,
77480             "value": dev.id
77481         });
77482
77483         if (currentDeviceKey && deviceNode.value === currentDeviceKey) {
77484             deviceNode.selected = true;
77485         }
77486
77487         devicesSelect.appendChild(deviceNode);
77488     });
77489
77490     if (platformID === "ivi") {
77491         jQuery("#configuration-window-save-btn").hide();
77492         jQuery("#configuration-window-load-btn").hide();
77493
77494         jQuery("#item_container :nth-child(2)").hide();
77495         jQuery("#item_container :nth-child(3)").hide();
77496
77497         _unlockScreen();
77498         //jQuery("#hwkeys-panel").hide();
77499     }
77500     else {
77501         jQuery("#configuration-window-save-btn").show();
77502         jQuery("#configuration-window-load-btn").show();
77503
77504         jQuery("#item_container :nth-child(2)").show();
77505         jQuery("#item_container :nth-child(3)").show();
77506
77507         //jQuery("#hwkeys-panel").show();
77508     }
77509 }
77510
77511 function _unlockScreen() {
77512     if (!deviceSettings.retrieve("Config.lockScreen"))
77513         return;
77514
77515     if ($("#device-settings-Config-lockScreen").length === 0) {
77516         deviceSettings.persist("Config.lockScreen", false);
77517     } else {
77518         $("#device-settings-Config-lockScreen")[0].click();
77519     }
77520 }
77521
77522 function checkResolutionSize(evt) {
77523         var query_str, id_str, len;
77524         query_str = "#resolution-custom-" + evt.data.msg;
77525         id_str = "custom_" + evt.data.msg;
77526         len = jQuery(query_str).val();
77527         if (len >= 200 && len <= 2000) {
77528                 db.save(id_str, len);
77529         } else {
77530                 jQuery(query_str).val(db.retrieve(id_str));
77531         }
77532 }
77533
77534 module.exports = {
77535     initialize: function () {
77536         var currentPlatform = platform.current().id,
77537             currentVersion = platform.current().version,
77538             platformList = platform.getList(),
77539             platformSelect = document.getElementById(constants.COMMON.PLATFORM_SELECT_ID),
77540             versionSelect = document.getElementById("version-select"),
77541             currentDeviceKey = devices.getCurrentDevice().id,
77542             platformNode, versionNode;
77543
77544         jQuery("#platform-select").bind("change", function () {
77545             var newPlatform = jQuery(this).val(),
77546                 newDevice = jQuery("#device-select").val();
77547
77548             jQuery(versionSelect).children("option").remove();
77549             utils.forEach(platformList, function (platform) {
77550                 utils.forEach(platform, function (version, versionNumber) {
77551                     if (newPlatform === version.id) {
77552                         versionSelect.appendChild(utils.createElement("option", {
77553                             "innerText": version.text,
77554                             "value":  versionNumber
77555                         }));
77556                     }
77557                 });
77558             });
77559             _updatePlatformDeviceSelect(newPlatform, newDevice);
77560         });
77561
77562         jQuery("#device-select").bind("focus", function () {
77563             $('input:radio[name="resolution-type"][value="predefined"]').click();
77564         });
77565         jQuery("#resolution-custom-width").bind("focus", function () {
77566             $('input:radio[name="resolution-type"][value="custom"]').click();
77567         });
77568         jQuery("#resolution-custom-height").bind("focus", function () {
77569             $('input:radio[name="resolution-type"][value="custom"]').click();
77570         });
77571         jQuery("#resolution-custom-width").bind("change", {msg: "width"}, checkResolutionSize);
77572         jQuery("#resolution-custom-height").bind("change", {msg: "height"}, checkResolutionSize);
77573
77574         utils.forEach(platformList, function (platform, platformKey) {
77575             platformNode = utils.createElement("option", {
77576                 "innerText": platformKey === "tizen" ? "mobile": platformKey,
77577                 "value":  platformKey
77578             });
77579
77580             utils.forEach(platform, function (version, versionNumber) {
77581                 versionNode = utils.createElement("option", {
77582                     "innerText": version.text,
77583                     "value":  versionNumber
77584                 });
77585
77586                 if (currentPlatform && version.id === currentPlatform) {
77587                     versionSelect.appendChild(versionNode);
77588                     if (currentVersion && currentVersion === versionNumber) {
77589                         platformNode.selected = true;
77590                         versionNode.selected = true;
77591                     }
77592                 }
77593             });
77594             platformSelect.appendChild(platformNode);
77595         });
77596
77597         _updatePlatformDeviceSelect(currentPlatform, currentDeviceKey);
77598     }
77599 };
77600
77601 });
77602 define('ripple/ui/plugins/geoView', function (require, exports, module) {
77603 /*
77604  *  Copyright 2011 Research In Motion Limited.
77605  *
77606  * Licensed under the Apache License, Version 2.0 (the "License");
77607  * you may not use this file except in compliance with the License.
77608  * You may obtain a copy of the License at
77609  *
77610  * http://www.apache.org/licenses/LICENSE-2.0
77611  *
77612  * Unless required by applicable law or agreed to in writing, software
77613  * distributed under the License is distributed on an "AS IS" BASIS,
77614  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
77615  * See the License for the specific language governing permissions and
77616  * limitations under the License.
77617  */
77618 var constants = require('ripple/constants'),
77619     geo = require('ripple/geo'),
77620     db = require('ripple/db'),
77621     event = require('ripple/event'),
77622     utils = require('ripple/utils'),
77623     platform = require('ripple/platform'),
77624     markers,
77625     _gpsMapZoomLevel,
77626     _routePoints = [],
77627     _routes = [],
77628     _routeMarkers,
77629     _lineLayer,
77630     _drawLineTimeout,
77631     _playFrequency = 0,
77632     _originalNavigator = window.navigator,
77633     _locationSharing = false;
77634     _playState = {'play': false, 'replay': false};
77635
77636 function _initTimeZone() {
77637     var allTZ, dbTZ, node = jQuery("#time-locale-select"),
77638         timezone = require('ripple/platform/tizen/2.0/timezone_info'),
77639         alarms, time;
77640
77641     function triggerAlarm() {
77642         time = new Date();
77643         alarms = db.retrieveObject("tizen1.0-db-alarms");
77644         if (alarms !== null) {
77645             utils.forEach(alarms, function (obj) {
77646                 if (obj.id !== undefined) {
77647                     event.trigger("CheckAlarm", [obj.id]);
77648                 }
77649             });
77650         }
77651     }
77652     window.setInterval(triggerAlarm, 1000);
77653
77654     allTZ = timezone.getAllTimezone();
77655     utils.forEach(allTZ, function (tz) {
77656         node.append(utils.createElement("option", {
77657             "value": tz,
77658             "innerHTML": tz + " - " + timezone.getTimezoneAbbr(tz) + "(" + timezone.getTimezoneDiff(tz) + ")"
77659         }));
77660     });
77661     dbTZ = db.retrieve("tizen-timezone");
77662     if (timezone.isValidTimezone(dbTZ)) {
77663         node.val(dbTZ);
77664     } else {
77665         db.save("tizen-timezone", node.val());
77666     }
77667     node.bind("change", function () {
77668         db.save("tizen-timezone", node.val());
77669     });
77670 }
77671
77672 function _updateGpsMap() {
77673     var positionInfo = geo.getPositionInfo(),
77674         mapContainer = document.getElementById(constants.GEO.OPTIONS.MAP_CONTAINER);
77675
77676     if (mapContainer && jQuery(mapContainer).is(':visible')) {
77677         geo.map.setCenter(new OpenLayers.LonLat(positionInfo.longitude, positionInfo.latitude).transform(
77678             new OpenLayers.Projection("EPSG:4326"), new OpenLayers.Projection("EPSG:900913")), _gpsMapZoomLevel, true);
77679     }
77680
77681     if (_lineLayer) {
77682         geo.map.removeLayer(_lineLayer);
77683         geo.map.addLayer(_lineLayer);
77684     }
77685 }
77686
77687 function _updateGpsMapZoom(goUp) {
77688     if (goUp && _gpsMapZoomLevel < constants.GEO.MAP_ZOOM_MAX) {
77689         _gpsMapZoomLevel++;
77690     }
77691     else if (!goUp && _gpsMapZoomLevel > constants.GEO.MAP_ZOOM_MIN) {
77692         _gpsMapZoomLevel--;
77693     }
77694
77695     _updateGpsMap();
77696     db.save(constants.GEO.MAP_ZOOM_KEY, _gpsMapZoomLevel);
77697 }
77698
77699 function _getTextHeading(heading) {
77700     if (heading >= 337.5 || (heading >= 0 && heading <= 22.5)) {
77701         return 'N';
77702     }
77703
77704     if (heading >= 22.5 && heading <= 67.5) {
77705         return 'NE';
77706     }
77707
77708     if (heading >= 67.5 && heading <= 112.5) {
77709         return 'E';
77710     }
77711     if (heading >= 112.5 && heading <= 157.5) {
77712         return 'SE';
77713     }
77714
77715     if (heading >= 157.5 && heading <= 202.5) {
77716         return 'S';
77717     }
77718
77719     if (heading >= 202.5 && heading <= 247.5) {
77720         return 'SW';
77721     }
77722
77723     if (heading >= 247.5 && heading <= 292.5) {
77724         return 'W';
77725     }
77726
77727     if (heading >= 292.5 && heading <= 337.5) {
77728         return 'NW';
77729     }
77730 }
77731
77732 function _updateRoutes() {
77733     var i, j, k, lon_step, lat_step;
77734     _routes = [];
77735
77736     for (i = 0; i < _routePoints.length - 1; i++) {
77737         lon_step = (_routePoints[i + 1].lonlat.lon - _routePoints[i].lonlat.lon) / 50;
77738         lat_step = (_routePoints[i + 1].lonlat.lat - _routePoints[i].lonlat.lat) / 50;
77739
77740         _routes.push(new OpenLayers.LonLat(_routePoints[i].lonlat.lon, _routePoints[i].lonlat.lat));
77741         for (j = 1, k = _routes.length; j < 50; j++, k++) {
77742             _routes.push(new OpenLayers.LonLat(_routes[k - 1].lon + lon_step, _routes[k - 1].lat + lat_step));
77743         }
77744     }
77745     _routes.push(new OpenLayers.LonLat(
77746         _routePoints[_routePoints.length - 1].lonlat.lon,
77747         _routePoints[_routePoints.length - 1].lonlat.lat)
77748     );
77749 }
77750
77751 function _drawLine(array) {
77752     var GEO_OPTIONS = constants.GEO.OPTIONS,
77753         latitude = document.getElementById(GEO_OPTIONS.LATITUDE),
77754         longitude = document.getElementById(GEO_OPTIONS.LONGITUDE),
77755         lonlat = new OpenLayers.LonLat(array[0].lon, array[0].lat).transform(
77756             new OpenLayers.Projection("EPSG:900913"),
77757             new OpenLayers.Projection("EPSG:4326")
77758         ),
77759         points = new Array(
77760             new OpenLayers.Geometry.Point(array[0].lon, array[0].lat),
77761             new OpenLayers.Geometry.Point(array[1].lon, array[1].lat)
77762         ),
77763         line = new OpenLayers.Geometry.LineString(points),
77764         style = {
77765             strokeColor: '#0000ff',
77766             strokeOpacity: 1,
77767             strokeWidth: 3
77768         },
77769         lineFeature = new OpenLayers.Feature.Vector(line, null, style);
77770
77771     if (!_lineLayer) {
77772         _lineLayer = new OpenLayers.Layer.Vector("Line Layer");
77773         geo.map.addLayer(_lineLayer);
77774     }
77775
77776     _lineLayer.addFeatures([lineFeature]);
77777     longitude.value = lonlat.lon;
77778     latitude.value = lonlat.lat;
77779
77780     if (_playFrequency % 10 === 0) {
77781         geo.map.panTo(new OpenLayers.LonLat(array[0].lon, array[0].lat), _gpsMapZoomLevel);
77782     }
77783     _playFrequency++;
77784 }
77785
77786 function clearRoute() {
77787     if (!_playState.play) {
77788         _routePoints.forEach(function (item) {
77789             _routeMarkers.removeMarker(item.marker);
77790         });
77791         _routePoints = [];
77792         _routes = [];
77793         _lineLayer.removeFeatures(_lineLayer.features);
77794     }
77795 }
77796
77797 function setRoute() {
77798     var clickHandler = new OpenLayers.Handler.Click(
77799         this,
77800         {
77801             click: function (e) {
77802                 if (geo.map.calculateBounds(null, 1) === null) {
77803                     geo.map.zoomTo(geo.map.zoom);
77804                 }
77805                 var location = geo.map.getLonLatFromViewPortPx(e.xy),
77806                     size = new OpenLayers.Size(21, 25),
77807                     offset = new OpenLayers.Pixel(-(size.w / 2), -size.h),
77808                     icon = new OpenLayers.Icon('images/map_marker.png', size, offset),
77809                     marker = new OpenLayers.Marker(new OpenLayers.LonLat(location.lon, location.lat), icon);
77810
77811                 geo.map.addLayer(_routeMarkers);
77812                 _routeMarkers.addMarker(marker);
77813                 _routePoints.push({
77814                     lonlat : location,
77815                     marker : marker
77816                 });
77817             }
77818         },
77819         {double: true}
77820     );
77821     clickHandler.dblclick = function () {
77822         _updateRoutes();
77823         this.deactivate();
77824     };
77825
77826     if (!_playState.play) {
77827         clickHandler.setMap(geo.map);
77828         clickHandler.activate();
77829     }
77830 }
77831
77832 function playRoute() {
77833     var speed = document.getElementById("play-route-speed"),
77834         getPlaySpeed = function () {
77835             return 20 / speed.value * 1000 / 50;
77836         },
77837         draw = function () {
77838             if (_routes.length <= 1) {
77839                 window.clearTimeout(_drawLineTimeout);
77840                 geo.map.panTo(new OpenLayers.LonLat(
77841                     _routePoints[_routePoints.length - 1].lonlat.lon,
77842                     _routePoints[_routePoints.length - 1].lonlat.lat),
77843                     _gpsMapZoomLevel);
77844                 _playState.play = false;
77845                 _playState.replay = true;
77846                 document.getElementById('play-btn-icon').src = "images/play.png";
77847             } else {
77848                 _drawLine(_routes);
77849                 _routes.splice(0, 1);
77850                 _drawLineTimeout = window.setTimeout(draw, getPlaySpeed());
77851             }
77852         };
77853
77854     if (!_playState.play && _routes.length !== 0) {
77855         if (_lineLayer && _playState.replay) {
77856             _lineLayer.removeFeatures(_lineLayer.features);
77857             _updateRoutes();
77858         }
77859         draw();
77860         _playState.play = true;
77861         document.getElementById('play-btn-icon').src = "images/pause.png";
77862     } else if (_playState.play) {
77863         window.clearTimeout(_drawLineTimeout);
77864         _playState.play = false;
77865         _playState.replay = false;
77866         document.getElementById('play-btn-icon').src = "images/play.png";
77867     }
77868 }
77869
77870 function skipTo(position) {
77871     if (_routes.length !== 0) {
77872         var index = (position === 'start' ? 0 : _routePoints.length - 1);
77873         window.clearTimeout(_drawLineTimeout);
77874         _lineLayer.removeFeatures(_lineLayer.features);
77875         geo.map.panTo(new OpenLayers.LonLat(_routePoints[index].lonlat.lon, _routePoints[index].lonlat.lat), _gpsMapZoomLevel);
77876         _routes = [];
77877         _updateRoutes();
77878         _playFrequency = 0;
77879         _playState.play = false;
77880         _playState.replay = false;
77881         document.getElementById('play-btn-icon').src = "images/play.png";
77882     }
77883 }
77884
77885 module.exports = {
77886     panel: {
77887         domId: "gps-container",
77888         collapsed: true,
77889         pane: "left",
77890         titleName: "Geolocation",
77891         display: true
77892     },
77893     initialize: function () {
77894         var GEO_OPTIONS = constants.GEO.OPTIONS,
77895             positionInfo = geo.getPositionInfo(),
77896             positionEvent = "PositionInfoUpdatedEvent",
77897             latitude = document.getElementById(GEO_OPTIONS.LATITUDE),
77898             longitude = document.getElementById(GEO_OPTIONS.LONGITUDE),
77899             altitude = document.getElementById(GEO_OPTIONS.ALTITUDE),
77900             accuracy = document.getElementById(GEO_OPTIONS.ACCURACY),
77901             altitudeAccuracy = document.getElementById(GEO_OPTIONS.ALTITUDE_ACCURACY),
77902             heading = document.getElementById(GEO_OPTIONS.HEADING),
77903             speed = document.getElementById(GEO_OPTIONS.SPEED),
77904             cellID = document.getElementById(GEO_OPTIONS.CELL_ID),
77905             delay = document.getElementById(GEO_OPTIONS.DELAY),
77906             delayLabel = document.getElementById(GEO_OPTIONS.DELAY_LABEL),
77907             headingLabel = document.getElementById(GEO_OPTIONS.HEADING_LABEL),
77908             headingMapLabel = document.getElementById(GEO_OPTIONS.HEADING_MAP_LABEL),
77909             timeout = document.getElementById(GEO_OPTIONS.TIMEOUT),
77910             gpxMultiplier = document.getElementById(GEO_OPTIONS.GPXMULTIPLIER),
77911             gpxReplayStatus = document.getElementById(GEO_OPTIONS.GPXREPLAYSTATUS),
77912             gpxGo = $(document.getElementById(GEO_OPTIONS.GPXGO)).find("span")[0],
77913             mapContainer = document.getElementById(GEO_OPTIONS.MAP_CONTAINER),
77914             map = null,
77915             track = [],
77916             _replayingGpxFile = false,
77917             _haltGpxReplay = false;
77918
77919         function updateGeo() {
77920             if (parseFloat(latitude.value) > 90)
77921                 latitude.value = 90;
77922             else if (parseFloat(latitude.value) < -90)
77923                 latitude.value = -90;
77924
77925             if (parseFloat(longitude.value) > 180)
77926                 longitude.value = 180;
77927             else if (parseFloat(longitude.value) < -180)
77928                 longitude.value = -180;
77929
77930             geo.updatePositionInfo({
77931                 latitude: parseFloat(latitude.value),
77932                 longitude: parseFloat(longitude.value),
77933                 altitude: parseInt(altitude.value, 10),
77934                 accuracy: parseInt(accuracy.value, 10),
77935                 altitudeAccuracy: parseInt(altitudeAccuracy.value, 10),
77936                 heading: heading.value ? parseFloat(heading.value) : 0, // HACK: see techdebt http://www.pivotaltracker.com/story/show/5478847
77937                 speed: speed.value ? parseInt(speed.value, 10) : 0, // HACK: see techdebt http://www.pivotaltracker.com/story/show/5478847
77938                 cellID: cellID.value,
77939                 timeStamp: new Date()
77940             },
77941             delay.value,
77942             timeout.checked);
77943         }
77944
77945         function updateHeadingValues() {
77946             var headingDeg = parseFloat(heading.value),
77947                 headingText = _getTextHeading(parseFloat(heading.value));
77948
77949             headingLabel.innerText = headingText;
77950             headingMapLabel.innerHTML = headingText + "</br>" + headingDeg + "&deg;";
77951         }
77952
77953         function updateValsFromMap() {
77954             var center = geo.map.getCenter().transform(
77955                 new OpenLayers.Projection("EPSG:900913"),
77956                 new OpenLayers.Projection("EPSG:4326"));
77957             longitude.value = center.lon;
77958             latitude.value = center.lat;
77959             updateGeo();
77960         }
77961
77962         function initializeValues() {
77963             latitude.value =          positionInfo.latitude;
77964             longitude.value =         positionInfo.longitude;
77965             altitude.value =          positionInfo.altitude;
77966             accuracy.value =          positionInfo.accuracy;
77967             altitudeAccuracy.value =  positionInfo.altitudeAccuracy;
77968             cellID.value =            positionInfo.cellID;
77969             delay.value = document.getElementById(GEO_OPTIONS.DELAY_LABEL).innerText = geo.delay || 0;
77970             if (geo.timeout) {
77971                 timeout.checked = true;
77972             }
77973             updateHeadingValues();
77974         }
77975
77976         function initMap() {
77977             var marker, clickHandler;
77978             // override image location so we don't have to include image assets
77979             OpenLayers.ImgPath = 'http://openlayers.org/api/img/';
77980
77981             // init map
77982             geo.map = new OpenLayers.Map(mapContainer, { controls: [] });
77983
77984             // add controls and OSM map layer
77985             geo.map.addLayer(new OpenLayers.Layer.OSM());
77986             geo.map.addControl(new OpenLayers.Control.Navigation());
77987
77988             // override behaviour of click to pan and double click to zoom in
77989             clickHandler = new OpenLayers.Handler.Click(
77990                 this,
77991                 {
77992                     click: function (e) {
77993                         if (geo.map.calculateBounds(null, 1) === null) {
77994                             geo.map.zoomTo(geo.map.zoom);
77995                         }
77996                         var location = geo.map.getLonLatFromViewPortPx(e.xy);
77997                         geo.map.panTo(new OpenLayers.LonLat(location.lon, location.lat), _gpsMapZoomLevel);
77998                     },
77999
78000                     dblclick: function () {
78001                         _updateGpsMapZoom(true);
78002                     }
78003                 },
78004                 {double: true}
78005             );
78006
78007             // add click handler to map
78008             clickHandler.setMap(geo.map);
78009             clickHandler.activate();
78010
78011             // update long and lat when map is panned
78012             geo.map.events.register("moveend", map, function () {
78013                 updateValsFromMap();
78014             });
78015             geo.map.events.register("zoomend", map, function (obj) {
78016                 if ((obj.object.zoom > _gpsMapZoomLevel && _gpsMapZoomLevel < constants.GEO.MAP_ZOOM_MAX) ||
78017                     (obj.object.zoom < _gpsMapZoomLevel && _gpsMapZoomLevel > constants.GEO.MAP_ZOOM_MIN)) {
78018                     _gpsMapZoomLevel = obj.object.zoom;
78019                 }
78020             });
78021
78022             markers = new OpenLayers.Layer.Markers("markers");
78023             _routeMarkers = new OpenLayers.Layer.Markers("markers");
78024             geo.map.addLayer(markers);
78025
78026             event.on("ApplicationState", function (obj) {
78027                 if (obj && obj[0].id === 'gps-container' && obj.hasClass('ui-box-open')) {
78028                     _updateGpsMap();
78029
78030                     // Update the position if user accept location sharing
78031                     if (_locationSharing === false) {
78032                         _originalNavigator.geolocation.getCurrentPosition(function(geoPosition) {
78033                             geo.map.panTo(new OpenLayers.LonLat(geoPosition.coords.longitude, geoPosition.coords.latitude).transform(
78034                                 new OpenLayers.Projection("EPSG:4326"), new OpenLayers.Projection("EPSG:900913")), _gpsMapZoomLevel);
78035                             _locationSharing = true;
78036                         });
78037                     }
78038
78039                     // Simulator is loaded with geo panel folded, now it's the first time it's unfolded
78040                     if (!marker) {
78041                         // Only when the geo panel is unfolded, getCenter() will go well
78042                         marker = new OpenLayers.Marker(geo.map.getCenter(),
78043                             new OpenLayers.Icon("images/arrow.png", new OpenLayers.Size(22, 30), new OpenLayers.Pixel(-11, -15)));
78044                         markers.addMarker(marker);
78045
78046                         navigator.geolocation.getCurrentPosition(function (geoPosition) {
78047                             geo.map.panTo(new OpenLayers.LonLat(geoPosition.coords.longitude, geoPosition.coords.latitude).transform(
78048                                 new OpenLayers.Projection("EPSG:4326"), new OpenLayers.Projection("EPSG:900913")), _gpsMapZoomLevel);
78049                         });
78050                     }
78051                 }
78052             });
78053             _updateGpsMap();
78054
78055             // Simulator is loaded with geo panel unfolded
78056             if (mapContainer && jQuery(mapContainer).is(':visible')) {
78057                 marker = new OpenLayers.Marker(geo.map.getCenter(),
78058                     new OpenLayers.Icon("images/arrow.png", new OpenLayers.Size(22, 30), new OpenLayers.Pixel(-11, -15)));
78059                 markers.addMarker(marker);
78060
78061                 navigator.geolocation.getCurrentPosition(function (geoPosition) {
78062                     geo.map.panTo(new OpenLayers.LonLat(geoPosition.coords.longitude, geoPosition.coords.latitude).transform(
78063                         new OpenLayers.Projection("EPSG:4326"), new OpenLayers.Projection("EPSG:900913")), _gpsMapZoomLevel);
78064                     _locationSharing = true;
78065                 });
78066             }
78067
78068             geo.map.events.register("move", map, function () {
78069                 markers.clearMarkers();
78070                 marker = new OpenLayers.Marker(geo.map.getCenter(),
78071                         new OpenLayers.Icon("images/arrow.png", new OpenLayers.Size(22, 30), new OpenLayers.Pixel(-11, -15)));
78072                 markers.addMarker(marker);
78073             });
78074         }
78075
78076         function loadGpxFile(win, fail, args) {
78077             var reader = new FileReader(),
78078                 file = args[0],
78079                 _xml,
78080                 t,
78081                 att,
78082                 lastAtt,
78083                 _ele,
78084                 _timestamp,
78085                 _lastTimestamp,
78086                 _useTimestamp = new Date().getTime(),
78087                 _tempTimestamp,
78088                 _tempPosition,
78089                 _lastPosition,
78090                 _useLastTimestamp,
78091                 _heading = 0,
78092                 _speed = 0,
78093                 _dist = 0,
78094                 navUtils = new utils.navHelper();
78095
78096             reader.onload = function (e) {
78097                 _xml = e.target.result;
78098                 t = $(_xml).find('trkpt');
78099
78100                 track = [];
78101
78102                 utils.forEach(t, function (p, i) {
78103                     if (!isNaN(i)) {
78104                         att = t[i].attributes;
78105                         lastAtt = t[i - 1] ? t[i - 1].attributes : {};
78106                         _ele = $(t[i]).find("ele")[0];
78107                         _timestamp = $(t[i]).find("time")[0];
78108                         _lastTimestamp = $(t[i - 1]).find("time")[0];
78109
78110                         if (_timestamp) {
78111                             //files recorded with endomondo and others have timestamps, this is not a route plan but a record of a track
78112                             _useTimestamp = new Date(_timestamp.innerText).getTime();
78113                         }
78114
78115                         if (t[i - 1]) {
78116                             _dist = navUtils.getDistance(att["lat"].value, att["lon"].value, lastAtt["lat"].value, lastAtt["lon"].value);
78117
78118                             if (_lastTimestamp) {
78119                                 _useLastTimestamp = new Date(_lastTimestamp.innerText).getTime();
78120                             }
78121                             else {
78122                                 //routes from YOURS come in as tracks (rather than routes under the GPX schema), but with no timestamps.  This is a route.
78123                                 _useLastTimestamp = _useTimestamp;
78124                                 _useTimestamp += Math.round(_dist / 22.2222 * 1000);  //80km/h in m/s
78125                             }
78126
78127                             _heading = navUtils.getHeading(lastAtt["lat"].value, lastAtt["lon"].value, att["lat"].value, att["lon"].value);
78128                             _speed = (_dist / ((_useTimestamp - _useLastTimestamp) / 1000)).toFixed(2);
78129
78130                             if (!_lastTimestamp) {
78131                                 //on YOURS routes, make sure we have at least one update a second
78132                                 _tempTimestamp = _useLastTimestamp;
78133
78134                                 while (_useTimestamp - _tempTimestamp > 1000) {
78135                                     _tempTimestamp += 1000;
78136                                     _lastPosition = track[track.length - 1].coords;
78137                                     _tempPosition = navUtils.simulateTravel(_lastPosition.latitude, _lastPosition.longitude, _heading, _speed);
78138                                     track.push({
78139                                         coords: {
78140                                             latitude: _tempPosition.latitude,
78141                                             longitude: _tempPosition.longitude,
78142                                             altitude: _ele ? _ele.innerText : 0,
78143                                             accuracy: 150,
78144                                             altitudeAccuracy: 80,
78145                                             heading: _heading,
78146                                             speed: _speed
78147                                         },
78148                                         timestamp: _tempTimestamp
78149                                     });
78150                                 }
78151                             }
78152                         }
78153
78154                         track.push({
78155                             coords: {
78156                                 latitude: att["lat"].value,
78157                                 longitude: att["lon"].value,
78158                                 altitude: _ele ? _ele.innerText : 0,
78159                                 accuracy: 150,
78160                                 altitudeAccuracy: 80,
78161                                 heading: _heading,
78162                                 speed: _speed
78163                             },
78164                             timestamp: _useTimestamp
78165                         });
78166                     }
78167                 });
78168             };
78169             reader.onerror = function (e) {
78170                 fail(e);
78171             };
78172             reader.readAsText(file.target.files[0], "UTF-8");
78173         }
78174
78175         function replayGpxTrack() {
78176             if (_replayingGpxFile) {
78177                 _haltGpxReplay = true;
78178                 gpxGo.innerText = constants.GEO.GPXGO_LABELS.GO;
78179             }
78180             else {
78181                 if (track.length > 0) {
78182                     _haltGpxReplay = false;
78183                     gpxGo.innerText = constants.GEO.GPXGO_LABELS.STOP;
78184
78185                     latitude.value = track[0].coords.latitude;
78186                     longitude.value = track[0].coords.longitude;
78187                     altitude.value = track[0].coords.altitude;
78188                     accuracy.value = track[0].coords.accuracy;
78189                     altitudeAccuracy.value = track[0].coords.altitudeAccuracy;
78190                     heading.value = track[0].coords.heading;
78191                     speed.value = track[0].coords.speed;
78192
78193                     updateGeo();
78194                     updateHeadingValues();
78195                     _triggerEvent();
78196
78197                     moveNextGpxTrack(1);
78198                 }
78199             }
78200         }
78201
78202         function moveNextGpxTrack(i)
78203         {
78204             if (_haltGpxReplay) {
78205                 _replayingGpxFile = false;
78206                 _haltGpxReplay = false;
78207                 console.log("Ripple :: User interrupted replay of GPX file (Aye Captain, answers All Stop.)");
78208             }
78209             else {
78210                 _replayingGpxFile = true;
78211                 var _timeMultiplier = !isNaN(gpxMultiplier.value) ? gpxMultiplier.value : 1,
78212                 _step = 0,
78213                 _interval = 0;
78214
78215                 while (_interval < 250) {
78216                     _step++;
78217                     if ((i + _step) >= track.length) { break; }
78218                     _interval = (track[i + _step].timestamp - track[i].timestamp) / _timeMultiplier;
78219                 }
78220
78221                 gpxReplayStatus.textContent = (_interval / 1000).toFixed(2) + "s (" + (_interval / 1000 * _timeMultiplier).toFixed(2) + "s realtime), " + (i + 1) + " of " + track.length + " (stepping " + _step + " at " + _timeMultiplier + "x)";
78222
78223                 setTimeout(function () {
78224                     latitude.value = track[i].coords.latitude;
78225                     longitude.value = track[i].coords.longitude;
78226                     altitude.value = track[i].coords.altitude;
78227                     accuracy.value = track[i].coords.accuracy;
78228                     altitudeAccuracy.value = track[i].coords.altitudeAccuracy;
78229                     heading.value = track[i].coords.heading;
78230                     speed.value = track[i].coords.speed;
78231
78232                     updateGeo();
78233                     updateHeadingValues();
78234                     _triggerEvent();
78235
78236                     if (track[i + _step]) {
78237                         moveNextGpxTrack(i + _step);
78238                     }
78239                     else {
78240                         if (i < track.length - 1) {
78241                             moveNextGpxTrack(track.length - 1);
78242                         }
78243                         else {
78244                             _replayingGpxFile = false;
78245                             gpxGo.innerText = constants.GEO.GPXGO_LABELS.GO;
78246                             console.log("Ripple :: Finished replaying GPX file (Arriving at our destination, assuming standard orbit Captain.)");
78247                         }
78248                     }
78249                 }, _interval);
78250             }
78251         }
78252
78253         // HACK: see techdebt http://www.pivotaltracker.com/story/show/5478847 (double HACK!!!)
78254         if (platform.current().id === 'phonegap' ||
78255             platform.current().id === 'webworks' ||
78256             platform.current().id === 'cordova') {
78257             // make the fields visible
78258             jQuery("#geo-cellid-container").hide();
78259             jQuery("#geo-heading-container").show();
78260             jQuery("#geo-speed-container").show();
78261         }
78262         else {
78263             jQuery("#geo-cellid-container").show();
78264             jQuery("#geo-heading-container").hide();
78265             jQuery("#geo-speed-container").hide();
78266         }
78267
78268         _gpsMapZoomLevel = db.retrieve(constants.GEO.MAP_ZOOM_KEY) || 14;
78269
78270         jQuery("#geo-map-zoom-decrease").bind("click", function () {
78271             _updateGpsMapZoom(false);
78272         });
78273
78274         jQuery("#geo-map-zoom-increase").bind("click", function () {
78275             _updateGpsMapZoom(true);
78276         });
78277
78278         utils.bindAutoSaveEvent(jQuery("#" + GEO_OPTIONS.LATITUDE), updateGeo);
78279         utils.bindAutoSaveEvent(jQuery("#" + GEO_OPTIONS.LONGITUDE), updateGeo);
78280         utils.bindAutoSaveEvent(jQuery("#" + GEO_OPTIONS.ALTITUDE), updateGeo);
78281         utils.bindAutoSaveEvent(jQuery("#" + GEO_OPTIONS.ACCURACY), updateGeo);
78282         utils.bindAutoSaveEvent(jQuery("#" + GEO_OPTIONS.ALTITUDE_ACCURACY), updateGeo);
78283         utils.bindAutoSaveEvent(jQuery("#" + GEO_OPTIONS.CELL_ID), updateGeo);
78284
78285         jQuery("#play-route-speed-label").html(jQuery("#play-route-speed").val() + 'x');
78286         jQuery("#play-route-speed").bind("change", function () {
78287             jQuery("#play-route-speed-label").html(jQuery("#play-route-speed").val() + 'x');
78288         });
78289         jQuery("#clear-route-btn").bind("click", function () {
78290             clearRoute();
78291         });
78292         jQuery("#set-route-btn").bind("click", function () {
78293             setRoute();
78294         });
78295         jQuery("#play-route-btn").bind("click", function () {
78296             playRoute();
78297         });
78298         jQuery("#back-route-btn").bind("click", function () {
78299             skipTo("start");
78300         });
78301         jQuery("#forward-route-btn").bind("click", function () {
78302             skipTo("end");
78303         });
78304
78305         jQuery("#" + GEO_OPTIONS.DELAY).bind("change", function () {
78306             updateGeo();
78307             delayLabel.innerText = delay.value;
78308         });
78309         jQuery("#" + GEO_OPTIONS.TIMEOUT).bind("click", function () {
78310             updateGeo();
78311         });
78312         jQuery("#" + GEO_OPTIONS.GPXFILE).bind("change", function (a) {
78313             loadGpxFile(null, null, [a]);
78314         });
78315         jQuery("#" + GEO_OPTIONS.GPXGO).bind("click", function () {
78316             replayGpxTrack();
78317         });
78318
78319         // HACK: see techdebt http://www.pivotaltracker.com/story/show/5478847 (double HACK!!!)
78320         if (platform.current().id === 'phonegap' || platform.current().id === 'webworks' || platform.current().id === 'cordova') {
78321             jQuery("#" + GEO_OPTIONS.HEADING).bind("change", function () {
78322                 updateGeo();
78323                 updateHeadingValues();
78324             });
78325
78326             utils.bindAutoSaveEvent(jQuery("#" + GEO_OPTIONS.SPEED), updateGeo);
78327             heading.value =       positionInfo.heading;
78328             speed.value =         positionInfo.speed;
78329         }
78330
78331         initMap();
78332         if (navigator.onLine === false) {
78333             jQuery("#disable_geo_panel").show();
78334         }
78335         jQuery(window).bind("online", function () {
78336             jQuery("#disable_geo_panel").hide();
78337             console.log("ONLINE");
78338         });
78339         jQuery(window).bind("offline", function () {
78340             jQuery("#disable_geo_panel").show();
78341             console.log("OFFLINE");
78342         });
78343
78344         initializeValues();
78345         _initTimeZone();
78346
78347         event.on(positionEvent, function () {
78348             _updateGpsMap();
78349         });
78350
78351         _triggerEvent();
78352
78353         function _triggerEvent() {
78354             event.trigger(positionEvent, [{
78355                 latitude: latitude.value,
78356                 longitude: longitude.value,
78357                 altitude: altitude.value,
78358                 accuracy: accuracy.value,
78359                 altitudeAccuracy: altitudeAccuracy.value,
78360                 heading: heading ? heading.value : 0, // HACK: see techdebt http://www.pivotaltracker.com/story/show/5478847
78361                 speed: speed ? speed.value : 0, // HACK: see techdebt http://www.pivotaltracker.com/story/show/5478847
78362                 cellID: cellID.value,
78363                 timeStamp: new Date()
78364             }]);
78365         }
78366     }
78367 };
78368
78369 });
78370 define('ripple/ui/plugins/goodVibrations', function (require, exports, module) {
78371 /*
78372  *  Copyright 2011 Research In Motion Limited.
78373  *
78374  * Licensed under the Apache License, Version 2.0 (the "License");
78375  * you may not use this file except in compliance with the License.
78376  * You may obtain a copy of the License at
78377  *
78378  * http://www.apache.org/licenses/LICENSE-2.0
78379  *
78380  * Unless required by applicable law or agreed to in writing, software
78381  * distributed under the License is distributed on an "AS IS" BASIS,
78382  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
78383  * See the License for the specific language governing permissions and
78384  * limitations under the License.
78385  */
78386 var constants = require('ripple/constants');
78387
78388 module.exports = {
78389     vibrateDevice: function (milliseconds) {
78390         var node = jQuery("#" + constants.COMMON.DEVICE_CONTAINER),
78391             x, times;
78392
78393         times = Math.floor(milliseconds / 100);
78394
78395         for (x = 1; x <= times; x++) {
78396             node.animate({ left: -10 }, 5)
78397             .animate({ left: 0 }, 1)
78398             .animate({ left: 10 }, 5)
78399             .animate({ left: 0 }, 1);
78400
78401             node.animate({ top: -10 }, 5)
78402             .animate({ top: 0 }, 1)
78403             .animate({ top: 10 }, 5)
78404             .animate({ top: 0 }, 1);
78405         }
78406     },
78407     shakeDevice: function (times) {
78408         var node = jQuery("#" + constants.COMMON.DEVICE_CONTAINER),
78409             x;
78410
78411         for (x = 1; x <= times; x++) {
78412             node.animate({ left: -25 }, 50)
78413             .animate({ left: 0 }, 30)
78414             .animate({ left: 25 }, 50)
78415             .animate({ left: 0 }, 30);
78416         }
78417     }
78418 };
78419
78420 });
78421 define('ripple/ui/plugins/time', function (require, exports, module) {
78422 /*
78423  *  Copyright 2012 Intel Corporation.
78424  *
78425  * Licensed under the Apache License, Version 2.0 (the "License");
78426  * you may not use this file except in compliance with the License.
78427  * You may obtain a copy of the License at
78428  *
78429  * http://www.apache.org/licenses/LICENSE-2.0
78430  *
78431  * Unless required by applicable law or agreed to in writing, software
78432  * distributed under the License is distributed on an "AS IS" BASIS,
78433  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
78434  * See the License for the specific language governing permissions and
78435  * limitations under the License.
78436  */
78437
78438 function _init() {
78439     var db = require('ripple/db'),
78440         utils = require('ripple/utils'),
78441         allTZ, dbTZ, node = jQuery("#time-locale-select"),
78442         timezone = require('ripple/platform/tizen/2.0/timezone_info'),
78443         event = require('ripple/event'),
78444         alarms, time;
78445
78446     function triggerAlarm() {
78447         time = new Date();
78448         alarms = db.retrieveObject("tizen1.0-db-alarms");
78449         if (alarms !== null) {
78450             utils.forEach(alarms, function (obj) {
78451                 if (obj.id !== undefined) {
78452                     event.trigger("CheckAlarm", [obj.id]);
78453                 }
78454             });
78455         }
78456     }
78457     window.setInterval(triggerAlarm, 1000);
78458
78459     allTZ = timezone.getAllTimezone();
78460     utils.forEach(allTZ, function (tz) {
78461         node.append(utils.createElement("option", {
78462             "value": tz,
78463             "innerHTML": tz + " - " + timezone.getTimezoneAbbr(tz) + "(" + timezone.getTimezoneDiff(tz) + ")"
78464         }));
78465     });
78466     dbTZ = db.retrieve("tizen-timezone");
78467     if (timezone.isValidTimezone(dbTZ)) {
78468         node.val(dbTZ);
78469     } else {
78470         db.save("tizen-timezone", node.val());
78471     }
78472     node.bind("change", function () {
78473         db.save("tizen-timezone", node.val());
78474     });
78475 /* FIXME: Node "trigger-alarm-id" will be removed from Time panel
78476  *        due to "time" panel will changed to "time zone" panel(PTSDK-875)
78477
78478     event.on("SendTriggerAppId", function (applicationId) {
78479         if (timeId !== undefined)
78480             clearTimeout(timeId);
78481         triggerNode.empty();
78482         triggerNode.append(utils.createElement("p", {
78483             "innerHTML": applicationId + " is triggered"
78484         }));
78485         triggerNode.show();
78486         timeId = setTimeout("jQuery('#trigger-alarm-id').empty();", 10000);// Comments will disappear after 10s
78487     });
78488 */
78489 }
78490
78491 module.exports = {
78492     panel: {
78493         domId: "time-container",
78494         collapsed: true,
78495         pane: "right",
78496         titleName: "Time",
78497         display: true
78498     },
78499     initialize: _init
78500 };
78501
78502 });
78503 define('ripple/ui/plugins/multimedia', function (require, exports, module) {
78504 /*
78505  *  Copyright 2011 Research In Motion Limited.
78506  *
78507  * Licensed under the Apache License, Version 2.0 (the "License");
78508  * you may not use this file except in compliance with the License.
78509  * You may obtain a copy of the License at
78510  *
78511  * http://www.apache.org/licenses/LICENSE-2.0
78512  *
78513  * Unless required by applicable law or agreed to in writing, software
78514  * distributed under the License is distributed on an "AS IS" BASIS,
78515  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
78516  * See the License for the specific language governing permissions and
78517  * limitations under the License.
78518  */
78519 var constants = require('ripple/constants'),
78520     event = require('ripple/event'),
78521     volumeField = document.getElementById(constants.COMMON.MULTIMEDIA_VOLUME_FIELD_ID),
78522     volume = document.getElementById(constants.COMMON.MULTIMEDIA_VOLUME_SLIDER_ID);
78523
78524 module.exports = {
78525     panel: {
78526         domId: "multimedia-container",
78527         collapsed: true,
78528         pane: "left"
78529     },
78530     initialize: function () {
78531         var volumeField = document.getElementById(constants.COMMON.MULTIMEDIA_VOLUME_FIELD_ID),
78532             volume = document.getElementById(constants.COMMON.MULTIMEDIA_VOLUME_SLIDER_ID);
78533
78534         event.on("MultimediaVolumeChanged", function (volume) {
78535             volumeField.innerText = volume > 9 ? volume : "0" + volume;
78536             if (volume.value !== volume) {
78537                 volume.value = volume;
78538             }
78539         });
78540
78541         volume.addEventListener('change', function () {
78542             event.trigger("MultimediaVolumeChanged", [this.value], true);
78543         }, false);
78544
78545         event.on("MultimediaAudioStateChanged", function updateIsAudioPlaying(state) {
78546             document.getElementById(constants.COMMON.MULTIMEDIA_AUDIO_PLAYING_FIELD_ID).innerHTML = state === constants.MULTIMEDIA.AUDIO_STATES.PLAYING;
78547         });
78548     }
78549 };
78550
78551 });
78552 define('ripple/ui/plugins/exec-dialog', function (require, exports, module) {
78553 /*
78554  *  Copyright 2011 Research In Motion Limited.
78555  *
78556  * Licensed under the Apache License, Version 2.0 (the "License");
78557  * you may not use this file except in compliance with the License.
78558  * You may obtain a copy of the License at
78559  *
78560  * http://www.apache.org/licenses/LICENSE-2.0
78561  *
78562  * Unless required by applicable law or agreed to in writing, software
78563  * distributed under the License is distributed on an "AS IS" BASIS,
78564  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
78565  * See the License for the specific language governing permissions and
78566  * limitations under the License.
78567  */
78568
78569 function exec(func) {
78570     return function () {
78571         var val = $("#exec-response").val();
78572
78573         //TODO: handle multiple args
78574         func.apply(null, val ? [JSON.parse(val)] : []);
78575         $("#exec-dialog").dialog("close");
78576     };
78577 }
78578
78579 module.exports = {
78580     initialize: function () {
78581         $("#exec-dialog").dialog({
78582             autoOpen: false,
78583             modal: true,
78584             title: "I Haz Cheeseburger?!?!",
78585             width: 500,
78586             position: 'center'
78587         }).hide();
78588
78589         $("#exec-success").button();
78590         $("#exec-fail").button();
78591     },
78592
78593     show: function (service, action, success, fail) {
78594         console.log(service);
78595         console.log(action);
78596         $("#exec-service").text(service);
78597         $("#exec-action").text(action);
78598         $("#exec-dialog").dialog("open");
78599         $("#exec-success").unbind().bind('click', exec(success));
78600         $("#exec-fail").unbind().bind('click', exec(fail));
78601     }
78602 };
78603
78604 });
78605 define('ripple/ui/plugins/camera', function (require, exports, module) {
78606 /*
78607  *  Copyright 2011 Research In Motion Limited.
78608  *
78609  * Licensed under the Apache License, Version 2.0 (the "License");
78610  * you may not use this file except in compliance with the License.
78611  * You may obtain a copy of the License at
78612  *
78613  * http://www.apache.org/licenses/LICENSE-2.0
78614  *
78615  * Unless required by applicable law or agreed to in writing, software
78616  * distributed under the License is distributed on an "AS IS" BASIS,
78617  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
78618  * See the License for the specific language governing permissions and
78619  * limitations under the License.
78620  */
78621
78622 var ui = require('ripple/ui'),
78623     event = require('ripple/event'),
78624     video = document.getElementById('camera-video'),
78625     upload = document.getElementById('picture-upload'),
78626     select = document.getElementById('select-file'),
78627     take = document.getElementById('take-file'),
78628     pic = document.getElementById("camera-image");
78629
78630
78631 select.addEventListener('click', function () {
78632     upload.click();
78633 });
78634
78635 upload.addEventListener('change', function () {
78636     pic.src = window.webkitURL.createObjectURL(upload.files[0]);
78637     take.style.display = "inline";
78638 });
78639
78640 take.addEventListener('click', function () {
78641     console.log("captured-image: " + pic.src);
78642     event.trigger('captured-image', [pic.src, upload.files[0]]);
78643     module.exports.hide();
78644 });
78645
78646 module.exports = {
78647     show: function () {
78648         ui.showOverlay("camera-window");
78649         if (pic.src) {
78650             take.style.display = "inline";
78651         }
78652         else {
78653             take.style.display = "none";
78654         }
78655     },
78656     hide: function () {
78657         ui.hideOverlay("camera-window");
78658     }
78659 };
78660
78661 });
78662 define('ripple/ui/plugins/network', function (require, exports, module) {
78663 /*
78664  *  Copyright 2012 Intel Corporation
78665  *
78666  * Licensed under the Apache License, Version 2.0 (the "License");
78667  * you may not use this file except in compliance with the License.
78668  * You may obtain a copy of the License at
78669  *
78670  * http://www.apache.org/licenses/LICENSE-2.0
78671  *
78672  * Unless required by applicable law or agreed to in writing, software
78673  * distributed under the License is distributed on an "AS IS" BASIS,
78674  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
78675  * See the License for the specific language governing permissions and
78676  * limitations under the License.
78677  */
78678
78679 var db = require('ripple/db'),
78680     utils = require('ripple/utils'),
78681     event = require('ripple/event'),
78682     deviceSettings = require('ripple/deviceSettings'),
78683     dbinit = require('ripple/platform/tizen/2.0/dbinit'),
78684     _NFC_TAG = "tizen1.0-nfc-tag",
78685     _NFC_PEER = "tizen1.0-nfc-peer",
78686     _NFC_OUTPUT_MESSAGE = "tizen1.0-nfc-output-message",
78687     _powered = false,
78688     _isConnected = false,
78689     _tagNDEF,
78690     _tagRaw,
78691     _peerNDEF,
78692     btNodes,
78693     _btDeviceTemplate = "",
78694     _btSimulatedDevs = {},
78695     _btBluetoothDB;
78696
78697 String.prototype.toCharCode = function () {
78698     return this.split("").map(function(char) {
78699         return char.charCodeAt(0);
78700     });
78701 };
78702
78703 function elementEnableDisableSetting(prop) {
78704     jQuery("#nfc-attach-msg").text("\xa0");
78705     jQuery("#nfc-peer-send-msg").text("\xa0");
78706     if (prop && prop.power !== undefined && prop.power !== null) {
78707         if (!prop.power) {
78708             $("#nfc-type").removeAttr("disabled");
78709         }
78710     }
78711     if (prop && prop.connectedState !== undefined && prop.connectedState !== null) {
78712         if (prop.connectedState) {
78713             $("#nfc-type").attr("disabled", "disabled");
78714             $("#nfc-tag-type-text").text($("#nfc-tag-type option:selected").text());
78715             $("#nfc-tag-type").hide();
78716             $("#nfc-tag-type-text").show();
78717             $("#nfc-tag-NDEF-support-text").text($("#nfc-tag-NDEF-support option:selected").text());
78718             $("#nfc-tag-NDEF-support").hide();
78719             $("#nfc-tag-NDEF-support-text").show();
78720             $("#nfc-raw-data").attr("disabled", "disabled");
78721         } else {
78722             $("#nfc-type").removeAttr("disabled");
78723             $("#nfc-tag-type").show();
78724             $("#nfc-tag-type-text").hide();
78725             $("#nfc-tag-NDEF-support").show();
78726             $("#nfc-tag-NDEF-support-text").hide();
78727             $("#nfc-raw-data").removeAttr("disabled");
78728         }
78729     }
78730 }
78731
78732 function _initializeDB() {
78733     _tagNDEF = {
78734         type: "GENERIC_TARGET",
78735         isSupportedNDEF: true,
78736         ndefSize: 3,
78737         ndefs: [{
78738             recordCount: 2,
78739             records: [{
78740                 tnf: 1,
78741                 type: "TypeA".toCharCode(),
78742                 id: "ID001".toCharCode(),
78743                 payload: "This is 1st payload".toCharCode()
78744             }, {
78745                 tnf: 1,
78746                 type: "TypeA".toCharCode(),
78747                 id: "ID002".toCharCode(),
78748                 payload: "This is 2nd payload".toCharCode()
78749             }]
78750         },
78751         {
78752             recordCount: 2,
78753             records: [{
78754                 tnf: 1,
78755                 type: "TypeA".toCharCode(),
78756                 id: "ID003".toCharCode(),
78757                 payload: "This is 1st payload".toCharCode()
78758             }, {
78759                 tnf: 1,
78760                 type: "TypeA".toCharCode(),
78761                 id: "ID004".toCharCode(),
78762                 payload: "This is 2nd payload".toCharCode()
78763             }]
78764         },
78765         {
78766             recordCount: 2,
78767             records: [{
78768                 tnf: 1,
78769                 type: "TypeA".toCharCode(),
78770                 id: "ID005".toCharCode(),
78771                 payload: "This is 1st payload".toCharCode()
78772             }, {
78773                 tnf: 1,
78774                 type: "TypeA".toCharCode(),
78775                 id: "ID006".toCharCode(),
78776                 payload: "This is 2nd payload".toCharCode()
78777             }]
78778         }]
78779     };
78780
78781     _tagRaw = {
78782         type: "GENERIC_TARGET",
78783         isSupportedNDEF: false,
78784         rawData : ""
78785     };
78786
78787     _peerNDEF = {
78788         ndef: {
78789             recordCount: 2,
78790             records: [{
78791                 tnf: 1,
78792                 type: "TypeA".toCharCode(),
78793                 id: "ID001".toCharCode(),
78794                 payload: "This is 1st payload".toCharCode()
78795             }, {
78796                 tnf: 1,
78797                 type: "TypeA".toCharCode(),
78798                 id: "ID002".toCharCode(),
78799                 payload: "This is 2nd payload".toCharCode()
78800             }]
78801         }
78802     };
78803 }
78804
78805 function _initializeElements() {
78806     jQuery(function () {
78807         var stop = false,
78808         wifiRadio = $("#wifi-radio"),
78809         isSupportNDEF, type;
78810
78811         // initialize main menus
78812         wifiRadio.buttonset();
78813
78814         $("#cellular-radio").buttonset();
78815         $("#nfc-radio").buttonset();
78816         $("#bluetooth-radio").buttonset();
78817         $("#bearer-radio").buttonset();
78818
78819         $("#wifi-radio1").prop('checked', false);
78820         $("#wifi-radio2").prop('checked', false);
78821         if (deviceSettings.retrieve("WIFI_NETWORK.status") === true) {
78822             $("#wifi-radio1").prop('checked', true);
78823             $("#wifi-radio1-label").css({'color': '#000000'});
78824             $("#wifi-radio2-label").css({'color': '#bbbbbb'});
78825         }
78826         else {
78827             $("#wifi-radio2").prop('checked', true);
78828             $("#wifi-radio1-label").css({'color': '#bbbbbb'});
78829             $("#wifi-radio2-label").css({'color': '#222222'});
78830         }
78831         $("#wifi-radio1").button("refresh");
78832         $("#wifi-radio2").button("refresh");
78833
78834         $("#cellular-radio1").prop('checked', false);
78835         $("#cellular-radio2").prop('checked', false);
78836         if (deviceSettings.retrieve("CELLULAR_NETWORK.status") === true) {
78837             $("#cellular-radio1").prop('checked', true);
78838             $("#cellular-radio1-label").css({'color': '#000000'});
78839             $("#cellular-radio2-label").css({'color': '#bbbbbb'});
78840         }
78841         else {
78842             $("#cellular-radio2").prop('checked', true);
78843             $("#cellular-radio1-label").css({'color': '#bbbbbb'});
78844             $("#cellular-radio2-label").css({'color': '#222222'});
78845         }
78846
78847         if (deviceSettings.retrieve("CELLULAR_NETWORK.isFlightMode") === true) {
78848             $("#cellular-radio1").prop('disabled', true);
78849             $("#cellular-radio2").prop('disabled', true);
78850             $("#panel_flight_mode_notice").show();
78851         }
78852         else {
78853             $("#cellular-radio1").prop('disabled', false);
78854             $("#cellular-radio2").prop('disabled', false);
78855             $("#panel_flight_mode_notice").hide();
78856         }
78857
78858         $("#cellular-radio1").button("refresh");
78859         $("#cellular-radio2").button("refresh");
78860
78861         $("#bearer-radio2").prop('checked', true);
78862         $("#bearer-radio2").button("refresh");
78863
78864         $("#wifi-radio1").click(function () {
78865             $("#wifi-radio1-label").css({'color': '#000000'});
78866             $("#wifi-radio2-label").css({'color': '#bbbbbb'});
78867             deviceSettings.persist("WIFI_NETWORK.status", true);
78868             event.trigger("WiFiNetworkStatusChanged", [true]);
78869         });
78870
78871         $("#wifi-radio2").click(function () {
78872             $("#wifi-radio1-label").css({'color': '#bbbbbb'});
78873             $("#wifi-radio2-label").css({'color': '#222222'});
78874             deviceSettings.persist("WIFI_NETWORK.status", false);
78875             event.trigger("WiFiNetworkStatusChanged", [false]);
78876         });
78877
78878         $("#cellular-radio1").click(function () {
78879             $("#cellular-radio1-label").css({'color': '#000000'});
78880             $("#cellular-radio2-label").css({'color': '#bbbbbb'});
78881             deviceSettings.persist("CELLULAR_NETWORK.status", true);
78882             event.trigger("CellularNetworkStatusChanged", [true]);
78883         });
78884
78885         $("#cellular-radio2").click(function () {
78886             $("#cellular-radio1-label").css({'color': '#bbbbbb'});
78887             $("#cellular-radio2-label").css({'color': '#222222'});
78888             deviceSettings.persist("CELLULAR_NETWORK.status", false);
78889             event.trigger("CellularNetworkStatusChanged", [false]);
78890         });
78891
78892         $("#nfc-radio1-label").css({'color': '#bbbbbb'});
78893         $("#nfc-radio2-label").css({'color': '#222222'});
78894
78895         $("#bluetooth-radio1-label").css({'color': '#bbbbbb'});
78896         $("#bluetooth-radio2-label").css({'color': '#222222'});
78897
78898         $("#bearer-radio1-label").css({'color': '#bbbbbb'});
78899         $("#bearer-radio2-label").css({'color': '#222222'});
78900
78901         $("#nfc-radio1").click(function () {
78902             $("#nfc-radio2-label").css({'color': '#bbbbbb'});
78903             $("#nfc-radio1-label").css({'color': '#222222'});
78904             $("#nfc-main-container").show();
78905         });
78906
78907         $("#nfc-radio2").click(function () {
78908             $("#nfc-radio1-label").css({'color': '#bbbbbb'});
78909             $("#nfc-radio2-label").css({'color': '#222222'});
78910             $("#nfc-main-container").hide();
78911         });
78912
78913         $("#bluetooth-radio1").click(function () {
78914             $("#bluetooth-radio2-label").css({'color': '#bbbbbb'});
78915             $("#bluetooth-radio1-label").css({'color': '#222222'});
78916             $("#bluetooth-main-container").show();
78917         });
78918
78919         $("#bluetooth-radio2").click(function () {
78920             $("#bluetooth-radio1-label").css({'color': '#bbbbbb'});
78921             $("#bluetooth-radio2-label").css({'color': '#222222'});
78922             $("#bluetooth-main-container").hide();
78923         });
78924
78925         $("#bearer-radio1").click(function () {
78926             $("#bearer-radio2-label").css({'color': '#bbbbbb'});
78927             $("#bearer-radio1-label").css({'color': '#222222'});
78928             $("#bearer-main-container").show();
78929         });
78930
78931         $("#bearer-radio2").click(function () {
78932             $("#bearer-radio1-label").css({'color': '#bbbbbb'});
78933             $("#bearer-radio2-label").css({'color': '#222222'});
78934             $("#bearer-main-container").hide();
78935         });
78936
78937         // initialize nfc
78938         jQuery("nfc-tag-ndef-container h3").click(function (event) {
78939             if (stop) {
78940                 event.stopImmediatePropagation();
78941                 event.preventDefault();
78942                 stop = false;
78943             }
78944         });
78945         jQuery("#nfc-tag-ndef-container").accordion("destroy").accordion({
78946             header: "> div > h3",
78947             autoHeight: false
78948         });
78949         jQuery("nfc-nfcpeer h3").click(function (event) {
78950             if (stop) {
78951                 event.stopImmediatePropagation();
78952                 event.preventDefault();
78953                 stop = false;
78954             }
78955         });
78956         jQuery("#nfc-nfcpeer").accordion("destroy").accordion({
78957             header: "> div > h3",
78958             autoHeight: false
78959         });
78960         jQuery("#nfc-tag-NDEF-support").bind("change", function () {
78961             isSupportNDEF = jQuery("#nfc-tag-NDEF-support").val();
78962             if (isSupportNDEF === "Yes") {
78963                 jQuery("#nfc-tag-ndef-container").fadeIn();
78964                 jQuery("#nfc-tag-raw-container").hide();
78965             } else {
78966                 jQuery("#nfc-tag-ndef-container").hide();
78967                 jQuery("#nfc-tag-raw-container").fadeIn();
78968             }
78969         });
78970         jQuery("#nfc-type").bind("change", function () {
78971             type = jQuery("#nfc-type").val();
78972             if (type === "Tag") {
78973                 jQuery("#nfc-nfctag").fadeIn();
78974                 jQuery("#nfc-nfcpeer").hide();
78975             } else {
78976                 jQuery("#nfc-nfctag").hide();
78977                 jQuery("#nfc-nfcpeer").fadeIn();
78978             }
78979             elementEnableDisableSetting();
78980         });
78981         jQuery("#nfc-power").bind("change", function () {
78982             var status;
78983             status = jQuery("#nfc-power").val() === "On" ? true : false;
78984             if (status)
78985                 jQuery("#nfc").show();
78986             event.trigger("nfc-power-setting", [status]);
78987         });
78988         jQuery("#nfc-attach").bind("click", function () {
78989             var type, isAttached;
78990             isAttached = jQuery("#nfc-attach").children().text() === "Attach" ? true : false;
78991             jQuery("#nfc-attach-msg").text("\xa0");
78992
78993             if (!_powered && isAttached) {
78994                 jQuery("#nfc-attach-msg").text("Power:Off, attach won't work");
78995                 return;
78996             }
78997             type = jQuery("#nfc-type").val();
78998             event.trigger("nfc-attach-setting", [type, isAttached]);
78999         });
79000         jQuery("#nfc-peer-send").bind("click", function () {
79001             jQuery("#nfc-peer-send-msg").text("\xa0");
79002             if (!_isConnected) {
79003                 jQuery("#nfc-peer-send-msg").text("Disconnected. Send won't work");
79004                 return;
79005             }
79006             db.saveObject(_NFC_PEER, _peerNDEF);
79007             event.trigger("nfc-peer-sending-ndef", []);
79008         });
79009
79010         // Initialize network bearer selection
79011         $("#bearer-cellular-radio1").prop('checked', true);
79012         $("#bearer-unknown-radio2").prop('checked', true);
79013         $("#bearer-cellular-radio1").button("refresh");
79014         $("#bearer-unknown-radio2").button("refresh");
79015
79016         $("#bearer-cellular-radio2").click(function () {
79017             $("#bearer-cellular button").click();
79018         });
79019
79020         $("#bearer-unknown-radio2").click(function () {
79021             $("#bearer-unknown button").click();
79022         });
79023     });
79024 }
79025
79026 function _btRender() {
79027     var devicesHTML, btHtmlContent = "";
79028
79029     utils.forEach(_btSimulatedDevs, function (item) {
79030         var uuidsHTML = "", firstService = null;
79031
79032         utils.forEach(item.services, function (s, index) {
79033             if (!firstService) {
79034                 firstService = s;
79035             }
79036             uuidsHTML += '<option value="' + index + '">' + s.name + '</option>';
79037         });
79038
79039         devicesHTML = _btDeviceTemplate.replace(/#name/g, item.name)
79040         .replace(/#address/g, item.address)
79041         .replace(/#class-major/, item.deviceClass.majorName)
79042         .replace(/#class-minor/, item.deviceClass.minorName)
79043         .replace(/#class-service/, item.deviceClass.servicesName.join(","))
79044         .replace(/#bonded/, "No")
79045         .replace(/#trusted/, item.isTrusted ? "Yes" : "No")
79046         .replace(/#connected/, "No")
79047         .replace(/#uuids/, uuidsHTML)
79048         .replace(/#service-uuid/, firstService.uuid)
79049         .replace(/#service-protocol/, firstService.protocol)
79050         .replace(/#service-state/, firstService.state || "CLOSED")
79051         .replace(/#id/g, item.address.replace(/:/g, ""));
79052
79053         btHtmlContent += devicesHTML;
79054     });
79055
79056     $("#network-bt-box").accordion("destroy");
79057     $("#network-bt-box").html(btHtmlContent).accordion({
79058         active : false,
79059         collapsible : true,
79060         autoHeight : false
79061     });
79062 }
79063
79064 function _btRemove(index) {
79065     delete _btSimulatedDevs[index];
79066     db.saveObject("bt-simulated-devices", _btSimulatedDevs);
79067     event.trigger("bt-simulated-devices-changed", []);
79068     _btRender();
79069 }
79070
79071 function _bearerRelease(type, idBearer, evNetworkDisconnected) {
79072     if ($("#bearer-row-" + idBearer).length > 0) {
79073         $("tr[id='bearer-row-" + idBearer + "']").remove();
79074     }
79075
79076     event.trigger(evNetworkDisconnected);
79077
79078     $("#bearer-" + type + " tr:even").css("background-color", "white");
79079     $("#bearer-" + type + " tr:odd").css("background-color", "whitesmoke");
79080 }
79081
79082 module.exports = {
79083     panel: {
79084         domId: "network-container",
79085         collapsed: true,
79086         pane: "left",
79087         titleName: "Network Management",
79088         display: true
79089     },
79090     initialize: function () {
79091         _initializeDB();
79092         _initializeElements();
79093
79094         // Events for nfc module
79095         event.on("nfc-power-changed", function (status) {
79096             _powered = status;
79097             if (_powered === true) {
79098                 $("#nfc-power").val("On");
79099             } else {
79100                 $("#nfc-power").val("Off");
79101             }
79102             elementEnableDisableSetting({power: status});
79103         });
79104         event.on("nfc-connectedState-changed", function (state) {
79105             var i, type, isSupportedNDEF, str, bytes = [];
79106             _isConnected = state;
79107             elementEnableDisableSetting({connectedState: state});
79108             type = jQuery("#nfc-type").val();
79109             if (state) {
79110                 jQuery("#nfc-attach").children().text("Detach");
79111                 jQuery("#nfc-tag-connection").text("Connected");
79112                 jQuery("#nfc-peer-connection").text("Connected");
79113                 if (type === "Tag") {
79114                     isSupportedNDEF = jQuery("#nfc-tag-NDEF-support").val() === "Yes" ? true : false;
79115                     if (isSupportedNDEF) {
79116                         _tagNDEF.type = jQuery("#nfc-tag-type").val();
79117                         db.saveObject(_NFC_TAG, _tagNDEF);
79118                     } else {
79119                         _tagRaw.type = jQuery("#nfc-tag-type").val();
79120                         str = jQuery("#nfc-raw-data").val();
79121                         for (i = 0; i < str.length; i++) {
79122                             bytes.push(str.charCodeAt(i));
79123                         }
79124                         _tagRaw.rawData = bytes;
79125                         db.saveObject(_NFC_TAG, _tagRaw);
79126                     }
79127                     event.trigger("nfc-tag-send", [true]);
79128                 } else {
79129                     event.trigger("nfc-peer-send", [true]);
79130                 }
79131             } else {
79132                 jQuery("#nfc-attach").children().text("Attach");
79133                 jQuery("#nfc-tag-connection").text("Disconnected");
79134                 jQuery("#nfc-peer-connection").text("Disconnected");
79135                 jQuery("#nfc-output").text("");
79136                 jQuery("#nfc-output-table").hide();
79137                 if (type === "Tag") {
79138                     event.trigger("nfc-tag-send", [false]);
79139                 } else {
79140                     event.trigger("nfc-peer-send", [false]);
79141                 }
79142             }
79143         });
79144         event.on("nfc-output-msg", function () {
79145             var msg;
79146             msg = db.retrieve(_NFC_OUTPUT_MESSAGE);
79147             jQuery("#nfc-output").text(msg);
79148             jQuery("#nfc-output-table").show();
79149         });
79150
79151         // Events for bluetooth module
79152         event.on("bluetoothPowerState", function (state) {
79153             if (state) {
79154                 $("#bluetooth-radio1").click();
79155             } else {
79156                 $("#bluetooth-radio2").click();
79157             }
79158         });
79159         event.on("bt-adapter-name-changed", function (name) {
79160             $("#bt-adapter-name").text(name);
79161         });
79162         event.on("bt-adapter-power-changed", function (state) {
79163             if (state) {
79164                 $("#bt-adapter-power").text("On");
79165             } else {
79166                 $("#bt-adapter-power").text("Off");
79167             }
79168         });
79169         event.on("bt-adapter-visible-changed", function (state) {
79170             if (state) {
79171                 $("#bt-adapter-visible").text("On");
79172             } else {
79173                 $("#bt-adapter-visible").text("Off");
79174             }
79175         });
79176         event.on("bt-device-bonded-changed", function (addr, isBonded) {
79177             var str = "No";
79178             if (isBonded) {
79179                 str = "Yes";
79180             }
79181             jQuery("#bonded-" + addr.replace(/:/g, "")).html(str);
79182         });
79183         event.on("bt-device-connected-changed", function (addr, isConnected) {
79184             var str = "No";
79185             if (isConnected) {
79186                 str = "Yes";
79187             }
79188             jQuery("#connected-" + addr.replace(/:/g, "")).html(str);
79189         });
79190         event.on("bt-service-state-changed", function (addr, uuid, state) {
79191             var str = "CLOSED";
79192             if (state) {
79193                 str = "OPEN";
79194             }
79195             _btSimulatedDevs[addr].services[uuid].state = str;
79196             jQuery("#service-state-" + addr.replace(/:/g, "")).html(str);
79197         });
79198         event.on("bt-service-write-msg", function (addr, uuid, data) {
79199             var msg = "", uuidNow;
79200             utils.forEach(data, function (char) {
79201                 msg += String.fromCharCode(char);
79202             });
79203             uuidNow = jQuery("#network-bt-uuid-" + addr.replace(/:/g, "")).html();
79204             if (uuidNow === uuid) {
79205                 jQuery("#service-receive-textarea-" + addr.replace(/:/g, "")).html(msg);
79206             }
79207         });
79208
79209         // Event for network bearer selection module
79210         event.on("NetworkRequest", function (networkType, domainName) {
79211             var type = networkType.toLowerCase(), name, idBearer,
79212                 evNetworkOpened       = "NO_" + networkType + "_" + domainName,
79213                 evNetworkDisconnected = "ND_" + networkType + "_" + domainName;
79214
79215             if (!$("#bearer-" + type + "-radio1").prop("checked")) {
79216                 event.trigger(evNetworkOpened, [false]);
79217                 event.trigger(evNetworkDisconnected);
79218
79219                 return;
79220             }
79221
79222             name = domainName.replace(/\./, "");
79223             idBearer = type + '-' + name;
79224
79225             if ($("#bearer-row-" + idBearer).length <= 0) {
79226                 $("#bearer-" + type).append("<tr id='bearer-row-" + idBearer + "'>" +
79227                      "<td>&nbsp<lable class='ui-text-label'>" + domainName + "</label></td>" +
79228                      "<td><button id='bearer-btn-" + idBearer + "'>X</button>&nbsp&nbsp</td>" +
79229                      "</tr>");
79230
79231                 $("#bearer-btn-" + idBearer).click(function () {
79232                     _bearerRelease(type, idBearer, evNetworkDisconnected);
79233                 });
79234
79235                 $("#bearer-" + type + " tr:even").css("background-color", "white");
79236                 $("#bearer-" + type + " tr:odd").css("background-color", "whitesmoke");
79237             }
79238
79239             event.trigger(evNetworkOpened, [true]);
79240         });
79241
79242         event.on("NetworkRelease", function (networkType, domainName) {
79243             var type = networkType.toLowerCase(),
79244                 name = domainName.replace(/\./, ""),
79245                 idBearer = type + '-' + name,
79246                 evNetworkDisconnected = "ND_" + networkType + "_" + domainName;
79247
79248             _bearerRelease(type, idBearer, evNetworkDisconnected);
79249         });
79250
79251         // Update UI for Flight Mode changing
79252         event.on("FlightModeChanged", function (value) {
79253             if (value === true) {
79254                 $("#cellular-radio1").prop('disabled', true);
79255                 $("#cellular-radio2").prop('disabled', true);
79256                 $("#panel_flight_mode_notice").show();
79257             }
79258             else {
79259                 $("#cellular-radio1").prop('disabled', false);
79260                 $("#cellular-radio2").prop('disabled', false);
79261                 $("#panel_flight_mode_notice").hide();
79262             }
79263
79264             $("#cellular-radio1").button("refresh");
79265             $("#cellular-radio2").button("refresh");
79266         });
79267
79268         $("#bt-adapter-name").text(db.retrieveObject("tizen1-db-bluetooth_adapter-name") || "Tizen BT Adapter");
79269         _btDeviceTemplate = $("#network-bt-template").html();
79270         $("#network-bt-box").empty();
79271         btNodes = jQuery("#network-bt-device-select");
79272         btNodes.html("");
79273
79274         _btBluetoothDB = dbinit.Bluetooth;
79275         utils.forEach(_btBluetoothDB, function (item, index) {
79276             btNodes.append(utils.createElement("option", {
79277                 "value": index,
79278                 "innerText": item.name
79279             }));
79280         });
79281
79282         jQuery("#network-bt-nearby-btn").click(function () {
79283             var index;
79284             index = jQuery("#network-bt-device-select").val();
79285             if (_btSimulatedDevs[index]) {
79286                 return;
79287             }
79288             _btSimulatedDevs[index] = _btBluetoothDB[index];
79289             db.saveObject("bt-simulated-devices", _btSimulatedDevs);
79290             event.trigger("bt-simulated-devices-changed", []);
79291             _btRender();
79292         });
79293         $(".network-bt-remove-btn").live("click", function () {
79294             _btRemove(this.id);
79295         });
79296         $(".network-bt-send-btn").live("click", function () {
79297             var msg = jQuery("#service-transfer-textarea-" + this.id.replace(/:/g, "")).val(),
79298             uuid = jQuery("#network-bt-uuid-" + this.id.replace(/:/g, "")).html();
79299             event.trigger("bt-service-rawdata-received", [this.id, uuid, msg]);
79300         });
79301         $(".network-bt-service-select").live("change", function () {
79302             var uuid = this.children[this.selectedIndex].value,
79303             index = this.id,
79304             addr,
79305             service;
79306             addr = index.replace(/:/g, "");
79307             service = _btSimulatedDevs[index].services[uuid];
79308             jQuery("#network-bt-uuid-" + index.replace(/:/g, "")).html(service.uuid);
79309             jQuery("#network-bt-protocol-" + index.replace(/:/g, "")).html(service.protocol);
79310             jQuery("#service-state-" + index.replace(/:/g, "")).html(service.state || "CLOSED");
79311             jQuery("#service-transfer-textarea-" + addr).val("");
79312             jQuery("#service-receive-textarea-" + addr).html("");
79313         });
79314
79315         //Default "Tizen Phone" is nearby
79316         //_btSimulatedDevs["00:02:60:00:05:63"] = _btBluetoothDB["00:02:60:00:05:63"];
79317         _btSimulatedDevs = db.retrieveObject("bt-simulated-devices") || {};
79318         if (Object.keys(_btSimulatedDevs).length === 0) {
79319             for (var address in _btBluetoothDB) {
79320                 _btSimulatedDevs[address] = _btBluetoothDB[address];
79321                 break;
79322             }
79323
79324             db.saveObject("bt-simulated-devices", _btSimulatedDevs);
79325         }
79326
79327         _btRender();
79328     }
79329 };
79330
79331 });
79332 define('ripple/ui/plugins/download', function (require, exports, module) {
79333 /*
79334  *  Copyright 2012 Intel Corporation.
79335  *
79336  * Licensed under the Apache License, Version 2.0 (the "License");
79337  * you may not use this file except in compliance with the License.
79338  * You may obtain a copy of the License at
79339  *
79340  * http://www.apache.org/licenses/LICENSE-2.0
79341  *
79342  * Unless required by applicable law or agreed to in writing, software
79343  * distributed under the License is distributed on an "AS IS" BASIS,
79344  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
79345  * See the License for the specific language governing permissions and
79346  * limitations under the License.
79347  */
79348
79349 var db = require('ripple/db'),
79350     event = require('ripple/event'),
79351     utils = require('ripple/utils'),
79352     _data = {
79353         DB_DOWNLOAD_KEY : "tizen1-db-download",
79354         resources : []
79355     },
79356     _cleanInputs, intervalId,
79357     _downloads;
79358
79359 function _get() {
79360     _downloads = [
79361         {id: "0001", url : "http://tizen.org/small_file.zip", size : "5", speed : "1.0", estimatedTime : "5", MIMEType : "application/zip"},
79362         {id: "0002", url : "http://tizen.org/big_file.zip", size : "20", speed : "1.0", estimatedTime : "20", MIMEType : "application/zip"},
79363         {id: "0003", url : "http://download.tizen.org/tct/2_1/webapi-tizen-download-test-image-hq.png", size : "3937596", speed : "1968798", estimatedTime : "2", MIMEType : "image/png"},
79364         {id: "0004", url : "http://download.tizen.org/tct/2_1/webapi-tizen-download-test-image-lq.png", size : "589", speed : "589", estimatedTime : "1", MIMEType : "image/png"}
79365     ];
79366     _data.resources = db.retrieveObject(_data.DB_DOWNLOAD_KEY) || _downloads;
79367     if (db.retrieveObject(_data.DB_DOWNLOAD_KEY) && db.retrieveObject(_data.DB_DOWNLOAD_KEY).length === 0) {
79368         _data.resources = _downloads;
79369     } else {
79370         _data.resources = db.retrieveObject(_data.DB_DOWNLOAD_KEY) || _downloads;
79371     }
79372     _save();
79373 }
79374
79375 function _save() {
79376     db.saveObject(_data.DB_DOWNLOAD_KEY, _data.resources);
79377     event.trigger('downloadResourceChanged');
79378 }
79379
79380 function checkURL(url) {
79381     var rg = new RegExp("((^http)|(^https)|(^ftp)):\/\/()+");
79382     return rg.test(url);
79383 }
79384
79385 function loadResources() {
79386     var installed = document.getElementById("download-resource"), node, i;
79387     installed.innerHTML = "";
79388     for (i in _data.resources) {
79389         node = utils.createElement("option", {
79390             "innerText": _data.resources[i].url,
79391             "value": _data.resources[i].id
79392         });
79393         installed.appendChild(node);
79394     }
79395     _cleanInputs();
79396 }
79397
79398 function _displayInfo(text) {
79399     var info = document.getElementById("download-error");
79400     info.innerHTML = text;
79401     if (intervalId) {
79402         clearTimeout(intervalId);
79403     }
79404     intervalId = setTimeout(clearDisplayInfo, 5000);
79405 }
79406
79407 function clearDisplayInfo() {
79408     document.getElementById('download-error').innerHTML = '';
79409 }
79410
79411 function _cleanInputs() {
79412     document.getElementById("download-url").value = "";
79413     document.getElementById("download-size").value = "";
79414     document.getElementById("download-speed").value = "";
79415     document.getElementById("download-time").innerText = "0";
79416     document.getElementById("download-MIMEType").value = "";
79417 }
79418
79419 function checkProperties(optionType, url, size, speed, time, MIMEType) {
79420     var back = true;
79421     if (url === "" || size === "" ||  speed === "" || time === "" || MIMEType === "") {
79422         _displayInfo(optionType + " failed, empty input.");
79423         back = false;
79424     }
79425     if (!checkURL(url)) {
79426         _displayInfo(optionType + " failed, 'URL' is invalid.");
79427         back = false;
79428     }
79429     if (size <= 0 ||  speed <= 0) {
79430         _displayInfo(optionType + " failed, invalid input.");
79431         back = false;
79432     }
79433     return back;
79434 }
79435
79436 function showUpdateNotification() {
79437     var url     = document.getElementById("download-url").value,
79438         size    = document.getElementById("download-size").value,
79439         speed   = document.getElementById("download-speed").value,
79440         MIMEType = document.getElementById("download-MIMEType").value,
79441         isValid = true;
79442     if (url === "" || size === "" ||  speed === "" || MIMEType === "" || !checkURL(url) || size <= 0 ||  speed <= 0) {
79443         isValid = false;
79444     }
79445     if (isValid) {
79446         _displayInfo("Resource changed, please Add or Update the content.");
79447     }
79448 }
79449
79450 function _adding() {
79451     var id, time, url, size, speed, MIMEType, object, i, isValid;
79452     url     = document.getElementById("download-url").value;
79453     size    = document.getElementById("download-size").value;
79454     speed   = document.getElementById("download-speed").value;
79455     MIMEType = document.getElementById("download-MIMEType").value;
79456     time    = size / speed;
79457     id      = Math.uuid(null, 16);
79458
79459     isValid = checkProperties("Add", url, size, speed, time, MIMEType);
79460     if (!isValid)
79461         return;
79462     if (_data.resources.length !== 0) {
79463         for (i in _data.resources) {
79464             if (url === _data.resources[i].url) {
79465                 _displayInfo("Add failed, the download resource is already available.");
79466                 return;
79467             }
79468         }
79469     }
79470     document.getElementById("download-time").innerText = Math.round(time * 100) / 100;
79471     object = {'id': id, 'url': url, 'size': size, 'speed': speed, 'estimatedTime': time, MIMEType: MIMEType};
79472     _data.resources.push(object);
79473     _save();
79474     loadResources();
79475 }
79476
79477 function _update() {
79478     var id, time, url, size, speed, MIMEType, i, isExist = false, isValid;
79479
79480     id    = document.getElementById("download-resource").value;
79481     url   = document.getElementById("download-url").value;
79482     size  = document.getElementById("download-size").value;
79483     speed = document.getElementById("download-speed").value;
79484     MIMEType = document.getElementById("download-MIMEType").value;
79485     time  = size / speed;
79486
79487     if (_data.resources.length === 0) {
79488         _displayInfo("Update failed, there is no download resource now.");
79489         return;
79490     }
79491     isValid = checkProperties("Update", url, size, speed, time, MIMEType);
79492     if (!isValid)
79493         return;
79494     for (i in _data.resources) {
79495         if (_data.resources[i].url === url) {
79496             isExist = true;
79497             _data.resources[i] = {id: id, url : url, size : size, speed : speed, estimatedTime: time, MIMEType: MIMEType};
79498             loadResources();
79499             _save();
79500             break;
79501         }
79502     }
79503     if (!isExist)
79504         _displayInfo("Update failed, the download resource doesn't exist.");
79505 }
79506
79507 function _delete() {
79508     var i, id;
79509     id = document.getElementById("download-resource").value;
79510     if (id) {
79511         for (i in _data.resources) {
79512             if (_data.resources[i].id === id) {
79513                 _data.resources.splice(i, 1);
79514                 _save();
79515                 loadResources();
79516             }
79517         }
79518     }
79519 }
79520
79521 function _showAppDetail(id) {
79522     var i;
79523     for (i in _data.resources) {
79524         if (id === _data.resources[i].id) {
79525             document.getElementById("download-time").innerText = Math.round(_data.resources[i].estimatedTime * 100) / 100;
79526             jQuery("#download-url").val(_data.resources[i].url);
79527             jQuery("#download-size").val(_data.resources[i].size);
79528             jQuery("#download-speed").val(_data.resources[i].speed);
79529             jQuery("#download-MIMEType").val(_data.resources[i].MIMEType);
79530         }
79531     }
79532 }
79533
79534 function _changeAppData() {
79535     var id = jQuery("#download-resource").val();
79536     _showAppDetail(id);
79537 }
79538 function changeValue() {
79539     var size  = document.getElementById("download-size").value,
79540         speed = document.getElementById("download-speed").value;
79541     if (size > 0 && speed > 0) {
79542         document.getElementById("download-time").innerText = Math.round(size / speed * 100) / 100;
79543     } else {
79544         document.getElementById("download-time").innerText  = "";
79545     }
79546 }
79547 function checkInputValue(input) {
79548     if (input.value === "" || input.value <= 0) {
79549         input.style['border-color'] = 'red';
79550         _displayInfo("Invalided value.");
79551     } else {
79552         if (input.style['border-color']) {
79553             input.style.removeProperty('border-color');
79554         }
79555         changeValue();
79556         //showUpdateNotification();
79557     }
79558 }
79559 module.exports = {
79560     panel: {
79561         domId: "download-container",
79562         collapsed: true,
79563         pane: "left",
79564         titleName: "Download",
79565         display: true
79566     },
79567     initialize: function () {
79568         _get();
79569         loadResources();
79570
79571         document.getElementById("download-add").addEventListener("click", _adding, false);
79572         document.getElementById("download-update").addEventListener("click", _update, false);
79573         document.getElementById("download-delete").addEventListener("click", _delete, false);
79574
79575         jQuery("#download-resource").bind("focus change", function () {
79576             var url = document.getElementById("download-url"),
79577                 size = document.getElementById("download-size"),
79578                 speed = document.getElementById("download-speed"),
79579                 MIMEType = document.getElementById("download-MIMEType");
79580             if (url.style['border-color']) {
79581                 url.style.removeProperty('border-color');
79582             }
79583             if (MIMEType.style['border-color']) {
79584                 MIMEType.style.removeProperty('border-color');
79585             }
79586             if (size.value > 0 && size.style['border-color']) {
79587                 size.style.removeProperty('border-color');
79588             }
79589             if (speed.value > 0 && speed.style['border-color']) {
79590                 speed.style.removeProperty('border-color');
79591             }
79592             _changeAppData();
79593         });
79594         jQuery("#download-speed").bind("blur", function () {
79595             changeValue();
79596         });
79597         jQuery("#download-size").bind("blur", function () {
79598             changeValue();
79599         });
79600         jQuery("#download-speed").bind("change", function () {
79601             checkInputValue(this);
79602         });
79603         jQuery("#download-size").bind("change", function () {
79604             checkInputValue(this);
79605         });
79606         jQuery("#download-speed").bind("change", function () {
79607             checkInputValue(this);
79608         });
79609         jQuery("#download-url").bind("change", function () {
79610             if (this.style['border-color']) {
79611                 this.style.removeProperty('border-color');
79612             }
79613             if (this.value && checkURL(this.value)) {
79614                 //showUpdateNotification();
79615             } else  {
79616                 _displayInfo("Invalided URL.");
79617                 this.style['border-color'] = 'red';
79618             }
79619         });
79620     }
79621 };
79622
79623 });
79624 define('ripple/ui/plugins/tooltips', function (require, exports, module) {
79625 /*
79626  *  Copyright 2011 Research In Motion Limited.
79627  *
79628  * Licensed under the Apache License, Version 2.0 (the "License");
79629  * you may not use this file except in compliance with the License.
79630  * You may obtain a copy of the License at
79631  *
79632  * http://www.apache.org/licenses/LICENSE-2.0
79633  *
79634  * Unless required by applicable law or agreed to in writing, software
79635  * distributed under the License is distributed on an "AS IS" BASIS,
79636  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
79637  * See the License for the specific language governing permissions and
79638  * limitations under the License.
79639  */
79640 // Class: UI.Tooltips
79641 // Purpose: build tooltips for UI
79642 // See here for Tooltip Options
79643 // http://jquery.bassistance.de/tooltip/demo/
79644 var utils = require('ripple/utils'),
79645     tooltip = require('ripple/ui/plugins/tooltip'),
79646     constants = require('ripple/constants'),
79647     db = require('ripple/db'),
79648     utils = require('ripple/utils');
79649
79650 function _updateButtonText() {
79651     document.querySelector("#settings-toggletooltips > span")
79652             .innerHTML = "Turn " + (tooltip.isOff() ? "On" : "Off");
79653 }
79654
79655 module.exports = {
79656     initialize: function () {
79657         var saved = db.retrieve(constants.SETTINGS.TOOLTIPS_KEY);
79658
79659         // blarg, tooltips are always enabled so if its saved to false disable it
79660         if (!tooltip.isOff() && (saved === "false" || saved === false)) {
79661             tooltip.toggle();
79662         }
79663
79664         _updateButtonText();
79665
79666         jQuery(constants.SETTINGS.TOOLTIPS_TOGGLE_DIV).click(function () {
79667             db.save(constants.SETTINGS.TOOLTIPS_KEY, !tooltip.toggle());
79668             _updateButtonText();
79669         });
79670     }
79671 };
79672
79673 });
79674 define('ripple/ui/plugins/secureElement', function (require, exports, module) {
79675 /*
79676  *  Copyright 2014 Intel Corporation
79677  *
79678  * Licensed under the Apache License, Version 2.0 (the "License");
79679  * you may not use this file except in compliance with the License.
79680  * You may obtain a copy of the License at
79681  *
79682  * http://www.apache.org/licenses/LICENSE-2.0
79683  *
79684  * Unless required by applicable law or agreed to in writing, software
79685  * distributed under the License is distributed on an "AS IS" BASIS,
79686  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
79687  * See the License for the specific language governing permissions and
79688  * limitations under the License.
79689  */
79690
79691 var db = require('ripple/db'),
79692     event = require('ripple/event'),
79693     _data = {
79694         DB_SECUREELEMENT_KEY: "tizen-secureelement",
79695         DEFAULT: [{
79696             name: "UICC and SIM",
79697             isPresent: true
79698         }, {
79699             name: "Secure SD Card",
79700             isPresent: true
79701         }],
79702         dbStorage: null
79703     };
79704
79705 function _initializeDB() {
79706     _data.dbStorage = db.retrieveObject(_data.DB_SECUREELEMENT_KEY) || [];
79707
79708     if (!_data.dbStorage || _data.dbStorage.length === 0) {
79709         _data.dbStorage = _data.DEFAULT;
79710         db.saveObject(_data.DB_SECUREELEMENT_KEY, _data.dbStorage);
79711     }
79712 }
79713
79714 function _getName(prefix) {
79715     var name = {
79716         us: "UICC and SIM",
79717         sc: "Secure SD Card"
79718     };
79719
79720     return name[prefix];
79721 }
79722
79723 function _getPrefix(name) {
79724     var prefix = {
79725         "UICC and SIM": "us",
79726         "Secure SD Card": "sc"
79727     };
79728
79729     return prefix[name];
79730 }
79731
79732 function _initializeElements(reader) {
79733     var name = reader.name,
79734         prop = reader.isPresent,
79735         prefix = _getPrefix(name),
79736         containerId = prefix + "-radio",
79737         container = $("#" + containerId),
79738         radioInsert = $("#" + containerId + "1"),
79739         radioLabelInsert = $("#" + containerId + "1-label"),
79740         radioEject = $("#" + containerId + "2"),
79741         radioLabelEject = $("#" + containerId + "2-label");
79742
79743     container.buttonset();
79744
79745     radioInsert.prop('checked', prop);
79746     radioLabelInsert.css({'color': prop ? '#000000' : '#bbbbbb'});
79747     radioInsert.button("refresh");
79748
79749     radioEject.prop('checked', !prop);
79750     radioLabelEject.css({'color': !prop ? '#000000' : '#bbbbbb'});
79751     radioEject.button("refresh");
79752
79753     _addElementsListeners(radioInsert, radioEject);
79754 }
79755
79756 function _addElementsListeners(radioInsert, radioEject) {
79757     radioInsert.click(function () {
79758         var prefix = /^us-/.test(this.id) ? "us" : "sc",
79759             name = _getName(prefix),
79760             containerId = prefix + "-radio",
79761             radioLabelInsert = $("#" + containerId + "1-label"),
79762             radioLabelEject = $("#" + containerId + "2-label");
79763
79764         radioLabelInsert.css({'color': '#000000'});
79765         radioLabelEject.css({'color': '#bbbbbb'});
79766
79767         event.trigger("ReaderChanged", [name, true]);
79768     });
79769
79770     radioEject.click(function () {
79771         var prefix = /^us-/.test(this.id) ? "us" : "sc",
79772             name = _getName(prefix),
79773             containerId = prefix + "-radio",
79774             radioLabelInsert = $("#" + containerId + "1-label"),
79775             radioLabelEject = $("#" + containerId + "2-label");
79776
79777         radioLabelInsert.css({'color': '#bbbbbb'});
79778         radioLabelEject.css({'color': '#222222'});
79779
79780         event.trigger("ReaderChanged", [name, false]);
79781     });
79782 }
79783
79784 module.exports = {
79785     panel: {
79786         domId: "secureElement-container",
79787         collapsed: true,
79788         pane: "left",
79789         titleName: "Secure Element",
79790         display: true
79791     },
79792     initialize: function () {
79793         var i;
79794
79795         _initializeDB();
79796
79797         for (i = 0; _data.dbStorage && i < _data.dbStorage.length; i++) {
79798             _initializeElements(_data.dbStorage[i]);
79799         }
79800
79801         event.on("ReadersClosed", function () {
79802             var i, reader, prefix, containerId, radioLabelInsert, radioLabelEject,
79803                 radioInsert, radioEject;
79804
79805             for (i = 0; _data.dbStorage && i < _data.dbStorage.length; i++) {
79806                 reader = _data.dbStorage[i];
79807
79808                 reader.isPresent = false;
79809
79810                 prefix = _getPrefix(reader.name);
79811                 containerId = prefix + "-radio";
79812                 radioLabelInsert = $("#" + containerId + "1-label");
79813                 radioLabelEject = $("#" + containerId + "2-label");
79814                 radioInsert = $("#" + containerId + "1");
79815                 radioEject = $("#" + containerId + "2");
79816
79817                 radioInsert.prop('checked', false);
79818                 radioLabelInsert.css({'color': '#bbbbbb'});
79819                 radioInsert.button("refresh");
79820
79821                 radioEject.prop('checked', true);
79822                 radioLabelEject.css({'color': '#000000'});
79823                 radioEject.button("refresh");
79824             }
79825         });
79826     }
79827 };
79828
79829 });
79830 define('ripple/ui/plugins/deviceSettings', function (require, exports, module) {
79831 /*
79832  *  Copyright 2011 Research In Motion Limited.
79833  *
79834  * Licensed under the Apache License, Version 2.0 (the "License");
79835  * you may not use this file except in compliance with the License.
79836  * You may obtain a copy of the License at
79837  *
79838  * http://www.apache.org/licenses/LICENSE-2.0
79839  *
79840  * Unless required by applicable law or agreed to in writing, software
79841  * distributed under the License is distributed on an "AS IS" BASIS,
79842  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
79843  * See the License for the specific language governing permissions and
79844  * limitations under the License.
79845  */
79846 var event = require('ripple/event'),
79847     constants = require('ripple/constants'),
79848     deviceSettings = require('ripple/deviceSettings'),
79849     utils = require('ripple/utils'),
79850     exception = require('ripple/exception'),
79851     platform = require('ripple/platform'),
79852     db = require('ripple/db'),
79853     _CONST = {
79854         "CONTENT_CONTAINER_ID": "devicesettings-content-container",
79855         "UKNOWN_CONTROL_MESSAGE": "Unknown device control type"
79856     },
79857     _contentContainer,
79858     _network_contentContainer,
79859     DBNETWORKSETTING_KEY = "tizen2-preFlightModeNetworksetting",
79860     _CONTAINER_ID = _CONST.CONTENT_CONTAINER_ID;
79861
79862 function _retrieveDeviceInfo(key) {
79863     var layout, rtn, deviceInfo = require('ripple/devices').getCurrentDevice();
79864
79865     switch (key) {
79866     case "Device.model":
79867         return deviceInfo.model;
79868     case "Device.version":
79869         return deviceInfo.firmware;
79870     case "Device.vendor":
79871         return deviceInfo.manufacturer;
79872     case "DISPLAY.resolutionHeight":
79873         return deviceInfo.screen.height;
79874     case "DISPLAY.resolutionWidth":
79875         return deviceInfo.screen.width;
79876     case "DISPLAY.pixelAspectRatio":
79877         return (deviceInfo.screen.width / deviceInfo.screen.height).toFixed(2);
79878
79879     case "DISPLAY.physicalWidth":
79880         return Number((deviceInfo.screen.width / deviceInfo.ppi).toFixed(2));
79881     case "DISPLAY.physicalHeight":
79882         return Number((deviceInfo.screen.height / deviceInfo.ppi).toFixed(2));
79883     case "DISPLAY.dpiY":
79884     case "DISPLAY.dotsPerInchHeight":
79885         return deviceInfo.ppi;
79886     case "DISPLAY.dpiX":
79887     case "DISPLAY.dotsPerInchWidth":
79888         return deviceInfo.ppi;
79889     case "OperatingSystem.version":
79890         return deviceInfo.osVersion;
79891     case "OperatingSystem.name":
79892         return deviceInfo.osName;
79893     case "OperatingSystem.vendor":
79894         return deviceInfo.manufacturer;
79895     case "DEVICE_ORIENTATION.status":
79896         layout = db.retrieve("layout");
79897         if (layout === null || layout === undefined) {
79898             layout = deviceInfo.defaultOrientation || "portrait";
79899         }
79900         if (layout === "portrait") {
79901             return "PORTRAIT_PRIMARY";
79902         } else {
79903             return "LANDSCAPE_PRIMARY";
79904         }
79905         break;
79906     case "WIFI_NETWORK.status":
79907     case "CELLULAR_NETWORK.status":
79908         rtn = deviceSettings.retrieve(key);
79909         if (rtn === true) {
79910             return "ON";
79911         } else {
79912             return "OFF";
79913         }
79914         break;
79915     case "CPU.load":
79916         rtn = deviceSettings.retrieve(key);
79917         if (rtn > 1) {
79918             rtn = 1;
79919             deviceSettings.persist(key, rtn);
79920         }
79921         if (rtn < 0) {
79922             rtn = 0;
79923             deviceSettings.persist(key, rtn);
79924         }
79925         return rtn;
79926     case "DISPLAY.brightness":
79927         rtn = deviceSettings.retrieve(key);
79928         if (rtn > 1) {
79929             rtn = 1;
79930             deviceSettings.persist("DISPLAY.brightness", rtn);
79931         }
79932         if (rtn < 0) {
79933             rtn = 0;
79934             deviceSettings.persist("DISPLAY.brightness", rtn);
79935         }
79936         return rtn;
79937     case "BUILD.manufacturer":
79938         return deviceInfo.manufacturer;
79939     default:
79940         return deviceSettings.retrieve(key);
79941     }
79942 }
79943
79944 function _retrieveSettingName(type) {
79945
79946     switch (type) {
79947     case "CellularHardware":
79948         return "Cellular Hardware";
79949     case "CellularNetwork":
79950         return "Cellular Network";
79951     case "MemoryUnit":
79952         return "Memory Unit";
79953     case "OperatingSystem":
79954         return "Operating System";
79955     case "WebRuntime":
79956         return "Web Runtime";
79957     case "WiFiHardware":
79958         return "WiFi Hardware";
79959     case "WiFiNetwork":
79960         return "WiFi Network";
79961     default:
79962         return type;
79963     }
79964 }
79965
79966 function _appendSettingNode(labelNode, inputNode, label) {
79967     var frag = document.createDocumentFragment(),
79968         rowNode = frag.appendChild(utils.createElement("tr")),
79969         tempTdNode;
79970
79971     rowNode.appendChild(utils.createElement("td"))
79972            .appendChild(labelNode);
79973
79974     tempTdNode = rowNode.appendChild(utils.createElement("td"));
79975
79976     if (label) {
79977         tempTdNode.appendChild(label);
79978     }
79979
79980     tempTdNode.appendChild(inputNode);
79981
79982     return frag;
79983 }
79984
79985 function _getCurrentSetting(setting, settingType, key) {
79986     var ret, savedSetting, fullKey;
79987     fullKey = settingType + "." + key;
79988     savedSetting = _retrieveDeviceInfo(fullKey);
79989     if (fullKey === "WIFI_NETWORK.status" || fullKey === "CELLULAR_NETWORK.status") {
79990         if (savedSetting === "ON") {
79991             savedSetting = true;
79992         } else {
79993             savedSetting = false;
79994         }
79995     }
79996     ret = (savedSetting || savedSetting === false || savedSetting === "" || savedSetting === 0) ? savedSetting : setting.control.value;
79997     return ret;
79998 }
79999
80000 function _buildDOMNode(setting, settingType, key) {
80001     var settingsNode, tagName, jNode,
80002         fullKey = settingType + "." + key,
80003         savedSetting = _retrieveDeviceInfo(fullKey),
80004         // TODO: move this into Utils (isSet method)
80005         currentSetting,
80006         domNode,
80007         domNodeLabel = null;
80008
80009     if (fullKey === "WIFI_NETWORK.status" || fullKey === "CELLULAR_NETWORK.status") {
80010         if (savedSetting === "ON") {
80011             savedSetting = true;
80012         } else {
80013             savedSetting = false;
80014         }
80015     }
80016     currentSetting = (savedSetting || savedSetting === false || savedSetting === "" || savedSetting === 0) ? savedSetting : setting.control.value;
80017
80018     switch (setting.control.type) {
80019     case "text":
80020     case "number":
80021     case "range":
80022     case "checkbox":
80023         tagName = "input";
80024         break;
80025     case "textarea":
80026         tagName = "textarea";
80027         break;
80028     case "select":
80029         tagName = "select";
80030         break;
80031     case "label":
80032         tagName = "label";
80033         break;
80034     default:
80035         exception.raise(exception.types.Application, _CONST.UKNOWN_CONTROL_MESSAGE);
80036     }
80037
80038     settingsNode = utils.createElement(tagName, setting.control.type === "select" ? null : setting.control);
80039     settingsNode.setAttribute("id", "device-settings-" + settingType + "-" + key);
80040
80041     // TODO: this should really be part of utils.createControl? add element of type "range" with label?
80042     if (setting.control.type === "range") {
80043         domNodeLabel = utils.createElement("label", {
80044             "class": constants.UI.LEFT_RANGE_LABEL_CLASS
80045         });
80046     }
80047
80048     domNode = _appendSettingNode(utils.createElement("span", {"innerText": setting.name, "class": "configure-window-text-label"}), settingsNode, domNodeLabel);
80049
80050     jNode = jQuery(settingsNode);
80051     if (tagName !== "label") {
80052         jNode.addClass(constants.UI.JQUERY_UI_INPUT_CLASSES);
80053     }
80054
80055     switch (setting.control.type) {
80056     case "checkbox":
80057         jNode.bind("click", function () {
80058             var checked = this.checked ? true : false;
80059             deviceSettings.persist(fullKey, checked);
80060             if (typeof setting.callback === "function") {
80061                 setting.callback(checked);
80062             }
80063         });
80064
80065         if (currentSetting === true) {
80066             jNode.attr("checked", "checked");
80067         }
80068
80069         break;
80070
80071     case "text":
80072     case "textarea":
80073     case "number":
80074         jNode.val(currentSetting);
80075         utils.bindAutoSaveEvent(jNode, function () {
80076             if (setting.control.type === "number") {
80077                 deviceSettings.persist(fullKey, Number(jNode.val()));
80078             } else {
80079                 deviceSettings.persist(fullKey, jNode.val());
80080             }
80081
80082             if (typeof setting.callback === "function") {
80083                 setting.callback(jNode.val());
80084             }
80085         });
80086         break;
80087
80088     case "label":
80089         jNode.text(currentSetting);
80090         break;
80091
80092     case "select":
80093     case "range":
80094         if (setting.control.type === "select") {
80095             utils.forEach(setting.options,  function (value, option) {
80096                 jNode.append(utils.createElement("option", {
80097                     "value": option,
80098                     "innerText": value
80099                 }));
80100             });
80101         }
80102         else {
80103             if (domNodeLabel) {
80104                 domNodeLabel.innerText = currentSetting;
80105             }
80106         }
80107
80108         jNode.val(currentSetting)
80109              .bind("change", function () {
80110                 if (setting.control.type === "range" && domNodeLabel) {
80111                     domNodeLabel.innerText = jQuery(this).val();
80112                 }
80113                 deviceSettings.persist(fullKey, jQuery(this).val());
80114
80115                 if (typeof setting.callback === "function") {
80116                     setting.callback(jQuery(this).val(), currentSetting);
80117                 }
80118             }
80119         );
80120     }
80121
80122     // TODO: Brent, do in DeviceSettings on load instead?
80123     if (currentSetting !== setting.control.value) {
80124         deviceSettings.register(fullKey, currentSetting);
80125     }
80126
80127     return domNode;
80128 }
80129
80130 function displayBrightnessCB(value) {
80131     if (value > 1) value = 1;
80132     if (value < 0) value = 0;
80133     if (document.getElementById("device-settings-DISPLAY-brightness").value === value) {
80134         return;
80135     }
80136     deviceSettings.persist("DISPLAY.brightness", Number(value));
80137     document.getElementById("device-settings-DISPLAY-brightness").value = value;
80138 }
80139
80140 function cpuLoadCB(value) {
80141     if (value > 1) value = 1;
80142     if (value < 0) value = 0;
80143     if (document.getElementById("device-settings-CPU-load").value === value) {
80144         return;
80145     }
80146     deviceSettings.persist("CPU.load", Number(value));
80147     document.getElementById("device-settings-CPU-load").value = value;
80148 }
80149
80150 function availCapacityCB(value) {
80151     var capacity = deviceSettings.retrieve("STORAGE.capacity");
80152     if (Number(value) > Number(capacity)) value = capacity;
80153     if (Number(value) < 0) value = 0;
80154     deviceSettings.persist("STORAGE.availableCapacity", Number(value));
80155     document.getElementById("device-settings-STORAGE-availableCapacity").value = Number(value);
80156 }
80157
80158 function wiFiNetworkStatusCB(value) {
80159     document.getElementById("device-settings-WIFI_NETWORK-status").checked = value;
80160 }
80161
80162 function flightModeChangedCB(value) {
80163     var networkSettings = {};
80164     if (value === true) {
80165         networkSettings['wifiSetting'] = deviceSettings.retrieve("WIFI_NETWORK.status");
80166         networkSettings['cellularSetting'] = deviceSettings.retrieve("CELLULAR_NETWORK.status");
80167         //networkSettings['bluetoothSetting'] = deviceSettings.retrieve("CELLULAR_NETWORK.status");
80168         //networkSettings['nfcSetting'] = deviceSettings.retrieve("CELLULAR_NETWORK.status");
80169         db.saveObject(DBNETWORKSETTING_KEY, networkSettings);
80170
80171         deviceSettings.persist("CELLULAR_NETWORK.status", false);
80172         deviceSettings.persist("WIFI_NETWORK.status", false);
80173         event.trigger("nfc-power-setting", [false]);
80174         event.trigger("bt-power-setting", [false]);
80175
80176         document.getElementById("device-settings-WIFI_NETWORK-status").checked = false;
80177         document.getElementById("device-settings-CELLULAR_NETWORK-status").checked = false;
80178         $("#device-settings-CELLULAR_NETWORK-status").parent().append("<span id='config_flight_mode_notice' style='color:#555555;'>  (Disabled for Flight Mode)</span>");
80179         document.getElementById("device-settings-CELLULAR_NETWORK-status").disabled = true;
80180
80181     } else {
80182         networkSettings = db.retrieveObject(DBNETWORKSETTING_KEY)||{"wifiSetting": true, "cellularSetting": true};
80183         deviceSettings.persist("WIFI_NETWORK.status", networkSettings['wifiSetting']);
80184         deviceSettings.persist("CELLULAR_NETWORK.status", networkSettings['cellularSetting']);
80185         document.getElementById("device-settings-WIFI_NETWORK-status").checked = networkSettings['wifiSetting'];
80186         document.getElementById("device-settings-CELLULAR_NETWORK-status").checked = networkSettings['cellularSetting'];
80187         $("#config_flight_mode_notice").remove();
80188         document.getElementById("device-settings-CELLULAR_NETWORK-status").disabled = false;
80189     }
80190 }
80191
80192 function cellularNetworkStatusCB(value) {
80193     document.getElementById("device-settings-CELLULAR_NETWORK-status").checked = value;
80194 }
80195
80196 function layoutCB(value) {
80197     if (value === 'portrait') {
80198         deviceSettings.register("DEVICE_ORIENTATION.status", "PORTRAIT_PRIMARY");
80199         document.getElementById("device-settings-DEVICE_ORIENTATION-status").innerText = "PORTRAIT_PRIMARY";
80200     } else {
80201         deviceSettings.register("DEVICE_ORIENTATION.status", "LANDSCAPE_PRIMARY");
80202         document.getElementById("device-settings-DEVICE_ORIENTATION-status").innerText = "LANDSCAPE_PRIMARY";
80203     }
80204 }
80205
80206 // goes through current platforms device settings
80207 // adds nodes to panel and binds respective events
80208 // talks to DeviceSettings for persistence
80209 module.exports = {
80210     initialize: function () {
80211         var settings, value;
80212         _contentContainer = document.getElementById(_CONTAINER_ID);
80213         _network_contentContainer = document.getElementById("networksettings-content-container");
80214
80215         settings = platform.current().device;
80216         utils.forEach(settings, function (settingSection, settingType) {
80217
80218             var currentTableNode, currentTableNode2, settingNameNode, settingName = _retrieveSettingName(settingType);
80219
80220             settingNameNode = utils.createElement("h3", { "innerText": settingName });
80221             settingNameNode.setAttribute("class", "configure-window-session-title");
80222
80223             if (settingType === 'NETWORK' || settingType === 'WIFI_NETWORK' || settingType === 'CELLULAR_NETWORK' || settingType === 'SIM') {
80224                 _network_contentContainer.appendChild(settingNameNode);
80225                 currentTableNode2 = utils.createElement("table", {
80226                     "class": constants.UI.PANEL_TABLE_CLASS
80227                 });
80228                 currentTableNode2.setAttribute("class", "configure-window-panel-table");
80229                 _network_contentContainer.appendChild(currentTableNode2);
80230             }
80231             else {
80232                 _contentContainer.appendChild(settingNameNode);
80233                 currentTableNode = utils.createElement("table", {
80234                     "class": constants.UI.PANEL_TABLE_CLASS
80235                 });
80236                 currentTableNode.setAttribute("class", "configure-window-panel-table");
80237                 _contentContainer.appendChild(currentTableNode);
80238             }
80239
80240             utils.forEach(settingSection, function (setting, key) {
80241                 if (settingType === 'NETWORK' || settingType === 'WIFI_NETWORK' || settingType === 'CELLULAR_NETWORK' || settingType === 'SIM') {
80242                     currentTableNode2.appendChild(_buildDOMNode(setting, settingType, key));
80243                 }
80244                 else {
80245                     currentTableNode.appendChild(_buildDOMNode(setting, settingType, key));
80246                 }
80247                 value = _getCurrentSetting(setting, settingType, key);
80248                 if (setting.callback) {
80249                     setting.callback(value);
80250                 }
80251             });
80252         });
80253
80254         if (deviceSettings.retrieve("CELLULAR_NETWORK.isFlightMode") === true) {
80255             $("#device-settings-CELLULAR_NETWORK-status").parent().append("<span id='config_flight_mode_notice' style='color:#555555;'>  (Disabled for Flight Mode)</span>");
80256             document.getElementById("device-settings-CELLULAR_NETWORK-status").disabled = true;
80257         }
80258
80259         event.on("DisplayBrightnessChanged", displayBrightnessCB);
80260         event.on("DisplayBrightnessChangedByPower", displayBrightnessCB);
80261         event.on("CpuLoadChanged", cpuLoadCB);
80262         event.on("AvailCapacityChanged", availCapacityCB);
80263         event.on("CpuLoadChangedByPower", cpuLoadCB);
80264         event.on("FlightModeChanged", flightModeChangedCB);
80265         event.on("WiFiNetworkStatusChanged", wiFiNetworkStatusCB);
80266         event.on("CellularNetworkStatusChanged", cellularNetworkStatusCB);
80267         event.on("LayoutChanged", layoutCB);
80268     },
80269     terminate: function () {
80270         event.deleteEventHandler("DisplayBrightnessChanged", displayBrightnessCB);
80271         event.deleteEventHandler("DisplayBrightnessChangedByPower", displayBrightnessCB);
80272         event.deleteEventHandler("CpuLoadChanged", cpuLoadCB);
80273         event.deleteEventHandler("AvailCapacityChanged", availCapacityCB);
80274         event.deleteEventHandler("FlightModeChanged", flightModeChangedCB);
80275         event.deleteEventHandler("CpuLoadChangedByPower", cpuLoadCB);
80276         event.deleteEventHandler("WiFiNetworkStatusChanged", wiFiNetworkStatusCB);
80277         event.deleteEventHandler("CellularNetworkStatusChanged", cellularNetworkStatusCB);
80278         event.deleteEventHandler("LayoutChanged", layoutCB);
80279     }
80280 };
80281
80282 });
80283 define('ripple/ui/plugins/invoke', function (require, exports, module) {
80284 /*
80285  *  Copyright 2011 Research In Motion Limited.
80286  *
80287  * Licensed under the Apache License, Version 2.0 (the "License");
80288  * you may not use this file except in compliance with the License.
80289  * You may obtain a copy of the License at
80290  *
80291  * http://www.apache.org/licenses/LICENSE-2.0
80292  *
80293  * Unless required by applicable law or agreed to in writing, software
80294  * distributed under the License is distributed on an "AS IS" BASIS,
80295  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
80296  * See the License for the specific language governing permissions and
80297  * limitations under the License.
80298  */
80299 var constants = require('ripple/constants'),
80300     event = require('ripple/event');
80301
80302 module.exports = {
80303     panel: {
80304         domId: "invoke-container",
80305         collapsed: true,
80306         pane: "left"
80307     },
80308     initialize: function () {
80309         document.getElementById("invoke-send")
80310             .addEventListener("click", function () {
80311                 var invokeInfo = {};
80312
80313                 invokeInfo.uri = document.getElementById("invoke-uri-text").value;
80314                 invokeInfo.source = document.getElementById("invoke-source-text").value;
80315                 invokeInfo.target = document.getElementById("invoke-target-text").value;
80316                 invokeInfo.action = document.getElementById("invoke-action-text").value;
80317                 invokeInfo.type = document.getElementById("invoke-mime-type-text").value;
80318                 invokeInfo.extension = document.getElementById("invoke-extension-text").value;
80319                 invokeInfo.data = document.getElementById("invoke-data-text").value;
80320                 if (invokeInfo.data) {
80321                     invokeInfo.data = window.btoa(invokeInfo.data);
80322                 }
80323
80324                 event.trigger("AppInvoke", [invokeInfo]);
80325             }, false);
80326     }
80327 };
80328
80329 });
80330 define('ripple/ui/plugins/touchEvent', function (require, exports, module) {
80331 /*
80332  *  Copyright 2012 Intel Corporation
80333  *
80334  * Licensed under the Apache License, Version 2.0 (the "License");
80335  * you may not use this file except in compliance with the License.
80336  * You may obtain a copy of the License at
80337  *
80338  * http://www.apache.org/licenses/LICENSE-2.0
80339  *
80340  * Unless required by applicable law or agreed to in writing, software
80341  * distributed under the License is distributed on an "AS IS" BASIS,
80342  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
80343  * See the License for the specific language governing permissions and
80344  * limitations under the License.
80345  */
80346
80347 var event = require('ripple/event'),
80348     db = require('ripple/db'),
80349     constants = require('ripple/constants'),
80350     colors  = ["red", "green", "magenta", "blue", "yellow"],
80351     Point,
80352     intervalId,
80353     moveEvents  = {},
80354     currentIndex = 0,
80355     enlargeRatio = 4;
80356
80357 function _exec(operation) {
80358     var canvas = document.getElementById(constants.TOUCHEVENT.CANVAS),
80359         cxt = canvas.getContext("2d"),
80360         altKey = document.getElementById(constants.TOUCHEVENT.ALTKEY),
80361         metaKey = document.getElementById(constants.TOUCHEVENT.METAKEY),
80362         ctrlKey = document.getElementById(constants.TOUCHEVENT.CTRLKEY),
80363         shiftKey = document.getElementById(constants.TOUCHEVENT.SHIFTKEY),
80364         key, eventType;
80365
80366     if (operation === "start") {
80367         altKey.disabled = 'disabled';
80368         metaKey.disabled = 'disabled';
80369         ctrlKey.disabled = 'disabled';
80370         shiftKey.disabled = 'disabled';
80371         clearInterval(intervalId);
80372         currentIndex = 0;
80373         eventType = "touchEvent";
80374     } else if (operation === "cancel") {
80375         altKey.disabled = '';
80376         metaKey.disabled = '';
80377         ctrlKey.disabled = '';
80378         shiftKey.disabled = '';
80379         altKey.checked = false;
80380         metaKey.checked = false;
80381         ctrlKey.checked = false;
80382         shiftKey.checked = false;
80383         cxt.clearRect(0, 0, canvas.width, canvas.height);
80384         moveEvents = {};
80385         eventType = "touchCancel";
80386     }
80387
80388     event.trigger(eventType, [{
80389         data : moveEvents,
80390         keys : [altKey.checked, metaKey.checked, ctrlKey.checked, shiftKey.checked]
80391     }]);
80392 }
80393
80394 Point = function (x, y, color, isDragging) {
80395     var _self = {};
80396
80397     _self.x = x;
80398     _self.y = y;
80399     _self.color = color;
80400     _self.isDragging = isDragging;
80401
80402     return _self;
80403 };
80404
80405 module.exports = {
80406     panel: {
80407         domId: "touchEvent-container",
80408         collapsed: true,
80409         pane: "left",
80410         titleName: "Touch Event",
80411         display: true
80412     },
80413
80414     initialize: function () {
80415         var deviceInfo = require('ripple/devices').getCurrentDevice(),
80416             canvas = document.getElementById(constants.TOUCHEVENT.CANVAS),
80417             button = document.getElementById(constants.TOUCHEVENT.OPTION),
80418             cxt = canvas.getContext("2d"),
80419             points = [],
80420             paint = false,
80421             currentPoint = {};
80422
80423         function drawPoints() {
80424             var key, index, points = [], point;
80425
80426             for (key in moveEvents) {
80427                 points = moveEvents[key];
80428                 cxt.fillStyle = colors[key];
80429
80430                 for (index = 0; index < points.length; index++) {
80431                     point = points[index];
80432                     cxt.beginPath();
80433                     cxt.arc(point.offsetX, point.offsetY, 5, 0, 2 * Math.PI, 1);
80434                     cxt.fill();
80435                 }
80436             }
80437         }
80438
80439         function endDraw(event) {
80440             if (paint) {
80441                 paint = false;
80442                 clearInterval(intervalId);
80443                 moveEvents[currentIndex].push(event);
80444                 drawPoints();
80445
80446                 currentIndex++;
80447                 if (currentIndex === 5)
80448                     currentIndex = 0;
80449             }
80450         }
80451
80452         canvas.addEventListener("mousedown", function (event) {
80453             if (button.value === "Touch Cancel") {
80454                 button.value = "Touch Start";
80455                 _exec("cancel");
80456             }
80457             moveEvents[currentIndex] = [];
80458             currentPoint = event;
80459             moveEvents[currentIndex].push(event);
80460             paint = true;
80461             drawPoints();
80462             intervalId = setInterval(function () {
80463                 moveEvents[currentIndex].push(currentPoint);
80464             }, 100);
80465         });
80466
80467         canvas.addEventListener("mousemove", function (event) {
80468             if (paint) {
80469                 currentPoint = event;
80470                 drawPoints();
80471             }
80472         });
80473
80474         canvas.addEventListener("mouseup", endDraw);
80475         canvas.addEventListener("mouseout", endDraw);
80476         canvas.addEventListener("mouseleave", endDraw);
80477
80478         document.getElementById(constants.TOUCHEVENT.OPTION).addEventListener("click", function () {
80479             if (!moveEvents[0])
80480                 return;
80481
80482             if (this.value === "Touch Start") {
80483                 this.value = "Touch Cancel";
80484                 _exec("start");
80485             } else if (this.value === "Touch Cancel") {
80486                 this.value = "Touch Start";
80487                 _exec("cancel");
80488             }
80489         }, false);
80490
80491         canvas.width = deviceInfo.screen.width / enlargeRatio;
80492         canvas.height = deviceInfo.screen.height / enlargeRatio;
80493     }
80494 };
80495
80496 });
80497 define('ripple/ui/plugins/options', function (require, exports, module) {
80498 /*
80499  *  Copyright 2011 Research In Motion Limited.
80500  *
80501  * Licensed under the Apache License, Version 2.0 (the "License");
80502  * you may not use this file except in compliance with the License.
80503  * You may obtain a copy of the License at
80504  *
80505  * http://www.apache.org/licenses/LICENSE-2.0
80506  *
80507  * Unless required by applicable law or agreed to in writing, software
80508  * distributed under the License is distributed on an "AS IS" BASIS,
80509  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
80510  * See the License for the specific language governing permissions and
80511  * limitations under the License.
80512  */
80513 var about = require('ripple/ui/plugins/about-dialog'),
80514     settings = require('ripple/ui/plugins/settings-dialog'),
80515     tooltip = require('ripple/ui/plugins/tooltip'),
80516     hide,
80517     show;
80518
80519 show = function () {
80520     if (settings.value("remoteInspector")) {
80521         $("#options-menu-build-warning").show();
80522         tooltip.create("#options-menu-build-warning", "Remote Web Inspector should be disabled when packaging for App World release");
80523     }
80524     else {
80525         $("#options-menu-build-warning").hide();
80526     }
80527
80528     $("#options-window").show();
80529     $("#options-menu").show();
80530 };
80531
80532 hide = function () {
80533     $("#options-window").hide();
80534     $("#options-menu").effect("fade", {}, 300);
80535 };
80536
80537 module.exports = {
80538     initialize: function () {
80539         $("#options-menu").menu().hide();
80540         $("#options-menu").bind("click", function (event) {
80541             var target = $("#" + event.target.parentElement.id),
80542                 action;
80543
80544             if (target.hasClass("not-ready")) {
80545                 return;
80546             }
80547
80548             switch (target.attr("id")) {
80549             case "options-menu-build":
80550             case "options-menu-launch":
80551             case "options-menu-sign":
80552                 action = target.attr("id").split("-")[2];
80553                 if (!settings.can(action)) {
80554                     settings.show(action);
80555                 }
80556                 else {
80557                     settings.perform(action);
80558                 }
80559                 break;
80560             case "options-menu-about":
80561                 about.show();
80562                 break;
80563             case "options-menu-settings":
80564                 settings.show();
80565                 break;
80566             default:
80567                 break;
80568             }
80569             hide();
80570         });
80571
80572         $("#options-window").click(hide);
80573         
80574         $("#options-button-about").bind("click", function (event) {
80575             about.show();
80576         });
80577         
80578         hide();
80579     }
80580 };
80581
80582 });
80583 define('ripple/ui/plugins/geoDB', function (require, exports, module) {
80584 /*
80585  *  Copyright 2012 Intel Corporation.
80586  *
80587  * Licensed under the Apache License, Version 2.0 (the "License");
80588  * you may not use this file except in compliance with the License.
80589  * You may obtain a copy of the License at
80590  *
80591  * http://www.apache.org/licenses/LICENSE-2.0
80592  *
80593  * Unless required by applicable law or agreed to in writing, software
80594  * distributed under the License is distributed on an "AS IS" BASIS,
80595  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
80596  * See the License for the specific language governing permissions and
80597  * limitations under the License.
80598  */
80599
80600 var db = require('ripple/db'),
80601     utils = require('ripple/utils'),
80602     lbs = require('ripple/platform/tizen/2.0/lbs_utils'),
80603     _GEO_OBJECTS = "tizen1.0-geocode-objects",
80604     _geoList, _currentGeo, _saveID, _showGeoDetail;
80605
80606 function _getGeo() {
80607     var geoList = [],
80608         data = db.retrieveObject(_GEO_OBJECTS);
80609
80610     utils.forEach(data, function (geo) {
80611         geoList.push(geo);
80612     });
80613     return geoList;
80614 }
80615
80616 function _saveGeo() {
80617     db.saveObject(_GEO_OBJECTS, _geoList);
80618 }
80619
80620 function GeoEntry(addr, coord) {
80621     var _self;
80622     _self = {
80623         address : addr || null,
80624         coordinate : coord || null
80625     };
80626     return _self;
80627 }
80628
80629 function _updateGeoDBSelect() {
80630     var geoDBSelect = document.getElementById("geo-select"),
80631         geoNode, i;
80632
80633     geoDBSelect.innerHTML = "";
80634     for (i = 0; i < _geoList.length; i++) {
80635         geoNode = utils.createElement("option", {
80636             "innerText": "(" + _geoList[i].coordinate.latitude + ", " + _geoList[i].coordinate.longitude + ")",
80637             "value": i
80638         });
80639         if (_currentGeo === Number(geoNode.value)) {
80640             geoNode.selected = true;
80641             _showGeoDetail(_geoList[_currentGeo].coordinate, _geoList[_currentGeo].address);
80642         }
80643         geoDBSelect.appendChild(geoNode);
80644     }
80645 }
80646
80647 function _showGeoDetail(coord, addr) {
80648     jQuery("#geoDB-latitude").val(coord.latitude);
80649     jQuery("#geoDB-longitude").val(coord.longitude);
80650     jQuery("#geoDB-altitude").val(coord.altitude);
80651     jQuery("#geoDB-accuracy").val(coord.accuracy);
80652     jQuery("#geoDB-altitudeAccuracy").val(coord.altitudeAccuracy);
80653     jQuery("#geoDB-heading").val(coord.heading);
80654     jQuery("#geoDB-speed").val(coord.speed);
80655
80656     jQuery("#geoDB-country").val(addr.country);
80657     jQuery("#geoDB-region").val(addr.region);
80658     jQuery("#geoDB-county").val(addr.county);
80659     jQuery("#geoDB-city").val(addr.city);
80660     jQuery("#geoDB-street").val(addr.street);
80661     jQuery("#geoDB-streetNumber").val(addr.streetNumber);
80662     jQuery("#geoDB-premises").val(addr.premises);
80663     jQuery("#geoDB-additionalInformation").val(addr.additionalInformation);
80664     jQuery("#geoDB-postalCode").val(addr.postalCode);
80665 }
80666
80667 function _changeGeoData() {
80668     var id = Number(jQuery("#geo-select").val());
80669     _currentGeo = id;
80670     _showGeoDetail(_geoList[id].coordinate, _geoList[id].address);
80671 }
80672
80673 function _triggerReadOnly(on) {
80674     if (on === true) {
80675         jQuery("#geoDB-table input").attr("readonly", "readonly");
80676         jQuery("#geoDB-add").show();
80677         jQuery("#geoDB-modify").show();
80678         jQuery("#geoDB-delete").show();
80679         jQuery("#geo-select").removeAttr("disabled");
80680         jQuery("#geoDB-save").hide();
80681         jQuery("#geoDB-cancel").hide();
80682     } else {
80683         jQuery("#geoDB-table input").removeAttr("readonly");
80684         jQuery("#geoDB-add").hide();
80685         jQuery("#geoDB-modify").hide();
80686         jQuery("#geoDB-delete").hide();
80687         jQuery("#geo-select").attr("disabled", "disabled");
80688         jQuery("#geoDB-save").show();
80689         jQuery("#geoDB-cancel").show();
80690     }
80691 }
80692
80693 function _addGeoData() {
80694     _triggerReadOnly(false);
80695     jQuery("#geoDB-table input").val("");
80696     _saveID = _geoList.length;
80697     jQuery("#geo-select").val("");
80698 }
80699 function _modifyGeoData() {
80700     _triggerReadOnly(false);
80701     _saveID = _currentGeo;
80702 }
80703 function _deleteGeoData() {
80704     _geoList.splice(_currentGeo, 1);
80705     _saveGeo();
80706     _currentGeo = 0;
80707     _updateGeoDBSelect();
80708 }
80709 function _saveGeoData() {
80710     var entry;
80711     entry = new GeoEntry(new lbs.StructuredAddress({
80712         country: jQuery("#geoDB-country").val(),
80713         region: jQuery("#geoDB-region").val(),
80714         county: jQuery("#geoDB-county").val(),
80715         city: jQuery("#geoDB-city").val(),
80716         street: jQuery("#geoDB-street").val(),
80717         streetNumber: jQuery("#geoDB-streetNumber").val(),
80718         premises: jQuery("#geoDB-premises").val(),
80719         additionalInformation: jQuery("#geoDB-additionalInformation").val(),
80720         postalCode: jQuery("#geoDB-postalCode").val()
80721     }),
80722         new lbs.GeoCoordinates({
80723         latitude: parseFloat(jQuery("#geoDB-latitude").val()),
80724         longitude: parseFloat(jQuery("#geoDB-longitude").val()),
80725         altitude: parseFloat(jQuery("#geoDB-altitude").val()),
80726         accuracy: parseFloat(jQuery("#geoDB-accuracy").val()),
80727         altitudeAccuracy: parseFloat(jQuery("#geoDB-altitudeAccuracy").val()),
80728         heading: parseFloat(jQuery("#geoDB-heading").val()),
80729         speed: parseFloat(jQuery("#geoDB-speed").val())
80730     }));
80731     if (_saveID === _geoList.length)
80732         _geoList.push(entry);
80733     else
80734         _geoList[_saveID] = entry;
80735     
80736     _saveGeo();
80737     _currentGeo = _saveID;
80738     _updateGeoDBSelect();
80739     _triggerReadOnly(true);
80740 }
80741
80742 function _cancelGeoData() {
80743     _triggerReadOnly(true);
80744     _updateGeoDBSelect();
80745 }
80746
80747 module.exports = {
80748     panel: {
80749         domId: "geoDB-container",
80750         collapsed: true,
80751         pane: "right"
80752     },
80753
80754     initialize: function () {
80755         _currentGeo = 0; // set _geoList[0] as default value
80756         _geoList = _getGeo();
80757         _updateGeoDBSelect();
80758         _triggerReadOnly(true);
80759
80760         jQuery("#geo-select").bind("change", function () {
80761             _changeGeoData();
80762         });
80763         jQuery("#geoDB-add").bind("click", function () {
80764             _addGeoData();
80765         });
80766         jQuery("#geoDB-modify").bind("click", function () {
80767             _modifyGeoData();
80768         });
80769         jQuery("#geoDB-delete").bind("click", function () {
80770             _deleteGeoData();
80771         });
80772         jQuery("#geoDB-save").bind("click", function () {
80773             _saveGeoData();
80774         });
80775         jQuery("#geoDB-cancel").bind("click", function () {
80776             _cancelGeoData();
80777         });
80778     }
80779 };
80780
80781 });
80782 define('ripple/ui/plugins/settings-dialog', function (require, exports, module) {
80783 /*
80784  *  Copyright 2011 Research In Motion Limited.
80785  *
80786  * Licensed under the Apache License, Version 2.0 (the "License");
80787  * you may not use this file except in compliance with the License.
80788  * You may obtain a copy of the License at
80789  *
80790  * http://www.apache.org/licenses/LICENSE-2.0
80791  *
80792  * Unless required by applicable law or agreed to in writing, software
80793  * distributed under the License is distributed on an "AS IS" BASIS,
80794  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
80795  * See the License for the specific language governing permissions and
80796  * limitations under the License.
80797  */
80798 var db = require('ripple/db'),
80799     utils = require('ripple/utils'),
80800     platform = require('ripple/platform'),
80801     notifications = require('ripple/notifications'),
80802     tooltip = require('ripple/ui/plugins/tooltip'),
80803     bus = require('ripple/bus'),
80804     required = {
80805         build: {
80806             "webworks.tablet": ["sdk", "projectPath", "outputPath", "projectName"],
80807             "webworks.bb10": ["sdk", "projectPath", "outputPath", "projectName"],
80808             "webworks.handset": ["sdk", "projectPath", "outputPath", "projectName"]
80809         },
80810         sign: {
80811             "webworks.tablet": ["sdk", "projectPath", "outputPath", "projectName", "csk_password", "p12_password", "bundle_number"],
80812             "webworks.bb10": ["sdk", "projectPath", "outputPath", "projectName", "signingPassword", "bundle_number"],
80813             "webworks.handset": ["sdk", "projectPath", "outputPath", "projectName", "signingPassword"]
80814         },
80815         launch: {
80816             "webworks.tablet": ["sdk", "projectPath", "outputPath", "projectName", "device"],
80817             "webworks.bb10": ["sdk", "projectPath", "outputPath", "projectName", "device"],
80818             "webworks.handset": ["sdk", "projectPath", "outputPath", "projectName", "simulator"]
80819         }
80820     },
80821     _settings = {
80822         get: function () {
80823             var settings = db.retrieveObject("build-settings", platform.getPersistencePrefix()) || {};
80824             settings.debug = !!settings["remoteInspector"];
80825
80826             return settings;
80827         },
80828         save: function (settings) {
80829             db.saveObject("build-settings", settings, platform.getPersistencePrefix());
80830         }
80831     },
80832     port = "9910",
80833     host = "http://127.0.0.1:" + port + "/ripple",
80834     progressContainer = jQuery("#options-progress"),
80835     progressInterval,
80836     _passwordFields = [
80837         "signingPassword",
80838         "devicePassword",
80839         "csk_password",
80840         "p12_password"
80841     ],
80842     _checkboxFields = [
80843         "remoteInspector"
80844     ],
80845     _passwords = {},
80846     _self;
80847
80848 function missing(settings, action) {
80849     return required[action][platform.current().id].filter(function (field) {
80850         return !settings.hasOwnProperty(field);
80851     });
80852 }
80853
80854 function _isPasswordField(id) {
80855     var match = typeof id === "string" && new RegExp("^" + id + "$", "i");
80856     return match && utils.some(_passwordFields, function (name) {
80857         return match.test(name);
80858     });
80859 }
80860
80861 function _isCheckboxField(id) {
80862     var match = typeof id === "string" && new RegExp("^" + id + "$", "i");
80863     return match && utils.some(_checkboxFields, function (name) {
80864         return match.test(name);
80865     });
80866 }
80867
80868 function table(action) {
80869     var _table = $("<table class='panel-table'>"),
80870         _row = {
80871             row: function (item, desc, opts) {
80872                 var id = "settings-field-" + item.toLowerCase(),
80873                     input = "",
80874                     save = function () {
80875                         var s = _settings.get(),
80876                             v = $("#" + id).val(),
80877                             val = opts.type === "number" ? parseInt(v, 10) : v;
80878
80879                         if (_isCheckboxField(item)) {
80880                             s[item] = $("#" + id).prop("checked");
80881                         }
80882                         else if (val) {
80883                             (_isPasswordField(item) ? _passwords : s)[item] = val;
80884                         }
80885                         else {
80886                             delete s[item];
80887                         }
80888                         _settings.save(s);
80889
80890                         if (opts.onChanged) {
80891                             opts.onChanged(s[item]);
80892                         }
80893                     },
80894                     row;
80895
80896                 opts = opts || { type: "text" };
80897
80898                 switch (opts.type) {
80899                 case "select":
80900                     input = "<select id='" + id + "' class='ui-state-default ui-corner-all' style='width:100%'/>";
80901                     break;
80902                 case "span":
80903                     input = "<span id = '" + id + "'>" + opts.text + "</span>";
80904                     break;
80905                 default:
80906                     input = "<input id='" + id + "' type='" + opts.type + "' class='ui-state-default ui-corner-all' style='width:90%' />";
80907                     break;
80908                 }
80909
80910                 row = $("<tr>" +
80911                     "<td><label for='" + id + "' class='ui-text-label'>" + desc + "</label></td>" +
80912                     "<td>" + input + "</td>" +
80913                 "</tr>");
80914
80915                 row.appendTo(_table);
80916
80917                 //bind save handlers to the row
80918                 utils.bindAutoSaveEvent(row.find("#" + id).change(save), save);
80919
80920                 return _row;
80921             },
80922             appendTo: function (id) {
80923                 var fs = $("<fieldset class='main'><legend class='cap-text'>" + action + "</legend></fieldset>");
80924
80925                 $(_table).appendTo(fs);
80926                 fs.appendTo($(id));
80927             }
80928         };
80929
80930     return _row;
80931 }
80932
80933 function create() {
80934     var build = table('build'),
80935         sign = table('sign'),
80936         launch = table('launch');
80937
80938     build
80939         .row("sdk", "SDK Path")
80940         .row("projectPath", "Project Root")
80941         .row("projectName", "Archive Name")
80942         .row("outputPath", "Output Folder")
80943         .row("remoteInspector", "Enable Remote Web Inspector", {
80944             type: "checkbox",
80945             onChanged: function (enabled) {
80946                 if (enabled) {
80947                     $("#options-menu-build-warning").show();
80948                     tooltip.create("#options-menu-build-warning", "Remote Web Inspector should be disabled when packaging for App World release");
80949                 }
80950                 else {
80951                     $("#options-menu-build-warning").hide();
80952                 }
80953             }
80954         })
80955         .appendTo("#settings-tabs-build");
80956
80957     switch (platform.current().id) {
80958     case "webworks.handset":
80959         sign.row("signingPassword", "Password", {
80960             type: "password"
80961         });
80962
80963         launch.row("simulator", "Simulator", {
80964             type: "select"
80965         });
80966
80967         launch.row("simulatorstatus", "Simulator", {
80968             type: "span",
80969             text: "Searching for simulators ..."
80970         });
80971         
80972         break;
80973
80974     case "webworks.tablet":
80975         sign.row("csk_password", "CSK Password", {
80976             type: "password"
80977         });
80978         sign.row("p12_password", "P12 Password", {
80979             type: "password"
80980         });
80981         sign.row("bundle_number", "Bundle Number", {
80982             type: "number"
80983         });
80984
80985         launch.row("device", "Playbook IP");
80986         launch.row("devicePassword", "Playbook Password", {
80987             type: "password"
80988         });
80989
80990         break;
80991
80992     case "webworks.bb10":
80993         sign.row("signingPassword", "Signing Password", {
80994             type: "password"
80995         });
80996         sign.row("bundle_number", "Bundle Number", {
80997             type: "number"
80998         });
80999
81000         launch.row("device", "Device IP");
81001         launch.row("devicePassword", "Device Password", {
81002             type: "password"
81003         });
81004
81005         break;
81006     }
81007
81008     sign.appendTo("#settings-tabs-build");
81009     launch.appendTo("#settings-tabs-build");
81010
81011     $("#settings-field-simulator").parent().parent().hide();
81012 }
81013
81014 function populate(settings) {
81015     var fill = function (action, prop) {
81016         var element = $("#settings-field-" + prop.toLowerCase());
81017
81018         if (_isPasswordField(prop)) {
81019             element.val(_passwords[prop]);
81020         }
81021         else if (_isCheckboxField(prop)) {
81022             element.prop("checked", settings[prop]);
81023         }
81024         else {
81025             element.val(settings[prop]);
81026         }
81027     };
81028
81029     fill("build", "sdk");
81030     fill("build", "projectPath");
81031     fill("build", "outputPath");
81032     fill("build", "projectName");
81033     fill("build", "remoteInspector");
81034
81035     fill("sign", "signingPassword");
81036     fill("sign", "csk_password");
81037     fill("sign", "p12_password");
81038     fill("sign", "bundle_number");
81039
81040     fill("launch", "simulator");
81041     fill("launch", "device");
81042     fill("launch", "devicePassword");
81043 }
81044
81045 function url(action) {
81046     var target = "";
81047
81048     switch (platform.current().id) {
81049     case "webworks.bb10":
81050         target = "bb10";
81051         break;
81052     case "webworks.tablet":
81053         target = "tablet";
81054         break;
81055     case "webworks.handset":
81056         target = "smartphone";
81057         break;
81058     }
81059
81060     return host + "/" + action + "/" + target;
81061 }
81062
81063 function enable(action) {
81064     $("#options-menu-" + action).removeClass("not-ready");
81065     if (action === "launch") {
81066         $("#settings-field-simulatorstatus").parent().parent().hide();
81067         $("#settings-field-simulator").parent().parent().show();
81068     }
81069 }
81070
81071 function disable(action) {
81072     $("#options-menu-" + action).addClass("not-ready");
81073     if (action === "launch") {
81074         $("#settings-field-simulatorstatus").parent().parent().show();
81075         $("#settings-field-simulator").parent().parent().hide();
81076     }
81077 }
81078
81079 function getSimulators() {
81080     if (!_settings.get().sdk) {
81081         $("#settings-field-simulatorstatus").text("");
81082         disable("launch");
81083         return;
81084     }
81085
81086     bus.ajax(
81087         "POST",
81088         host + "/simulators",
81089         _settings.get(),
81090         function (resp) {
81091             var sims = resp.data.simulators;
81092
81093             $("#settings-field-simulator").empty();
81094             if (sims.length > 0) {
81095                 $(resp.data.simulators.map(function (sim) {
81096                     return "<option value='" + sim + "'>" + sim + "</option>";
81097                 }).join()).appendTo("#settings-field-simulator");
81098
81099                 enable("launch");
81100             }
81101             else {
81102                 disable("launch");
81103                 $("#settings-field-simulatorstatus").text("No simulators found :(");
81104             }
81105         },
81106         function () {
81107             disable("launch");
81108             $("#settings-field-simulatorstatus").text("Error attempting to get simulators :(");
81109         }
81110     );
81111 }
81112
81113 function _startProgress() {
81114     if (progressInterval) {
81115         window.clearInterval(progressInterval);
81116     }
81117     progressInterval = window.setInterval(function () {
81118         if (progressContainer.html().length === 5) {
81119             progressContainer.html(".");
81120         }
81121         else {
81122             progressContainer.html(progressContainer.html() + ".");
81123         }
81124     }, 250);
81125 }
81126
81127 function _endProgress() {
81128     window.clearInterval(progressInterval);
81129     progressInterval = null;
81130     progressContainer.html("");
81131 }
81132
81133
81134 _self = {
81135     initialize: function () {
81136         $("#settings-dialog").dialog({
81137             autoOpen: false,
81138             modal: true,
81139             width: 700,
81140             title: "Settings",
81141             position: 'center'
81142         }).hide();
81143
81144         $("#settings-tabs").tabs();
81145         $("#settings-action").button();
81146
81147         create();
81148
81149         if (platform.current().id === "webworks.handset") {
81150             enable("build");
81151             enable("sign");
81152             enable("settings");
81153
81154             getSimulators();
81155             $("#settings-field-sdk").change(getSimulators);
81156         }
81157         else if (platform.current().id === "webworks.tablet") {
81158             enable("build");
81159             enable("sign");
81160             enable("launch");
81161             enable("settings");
81162         }
81163         else if (platform.current().id === "webworks.bb10") {
81164             enable("build");
81165             enable("sign");
81166             enable("launch");
81167             enable("settings");
81168         }
81169     },
81170
81171     can: function (action) {
81172         var settings = {};
81173
81174         utils.mixin(_settings.get(), settings);
81175         utils.mixin(_passwords, settings);
81176
81177         return action && missing(settings, action).length === 0;
81178     },
81179
81180     value: function (prop) {
81181         var settings = {};
81182
81183         utils.mixin(_settings.get(), settings);
81184         return settings[prop];
81185     },
81186
81187     show: function (action) {
81188         var settings = {};
81189
81190         utils.mixin(_settings.get(), settings);
81191         utils.mixin(_passwords, settings);
81192
81193         populate(settings);
81194
81195         $("#settings-dialog").dialog("open");
81196         $("#settings-action").button("option", "label", action || "Close")[action ? "show" : "hide"]();
81197
81198         if (action) {
81199             missing(settings, action).forEach(function (field) {
81200                 $("#settings-field-" + field.toLowerCase()).effect("highlight", {color: "red"}, 1500);
81201             });
81202
81203             $("#settings-action").unbind("click").click(function () {
81204                 if (_self.can(action)) {
81205                     _self.perform(action);
81206                     $("#settings-dialog").dialog("close");
81207                 }
81208                 else {
81209                     _self.show(action);
81210                 }
81211             });
81212         }
81213     },
81214
81215     perform: function (action) {
81216         var settings = _settings.get(),
81217             data = {},
81218             poll = function (resp) {
81219                 var notifications = require("ripple/notifications");
81220
81221                 if (resp && resp.code !== 0) {
81222                     notifications.openNotification("error", "Build request failed with message: " + resp.msg);
81223                     _endProgress();
81224                 }
81225                 else {
81226                     if (resp && resp.data.status === "building") {
81227                         setTimeout(function () {
81228                             bus.ajax(
81229                                 "GET",
81230                                 host + "/build_status/" + resp.data.id,
81231                                 null,
81232                                 poll,
81233                                 function (error) {
81234                                     notifications.openNotification("error", "Build request failed with message: " + JSON.stringify(error));
81235                                     _endProgress();
81236                                 }
81237                             );
81238                         }, 500);
81239                     }
81240                     else {
81241                         if (action.match(/sign/)) {
81242                             settings["bundle_number"] = $("#settings-field-bundle_number").val(parseInt($("#settings-field-bundle_number").val(), 10) + 1).val();
81243                             _settings.save(settings);
81244                         }
81245                         notifications.openNotification("normal", "Build succeeded!");
81246                         _endProgress();
81247                     }
81248                 }
81249             };
81250
81251         utils.mixin(settings, data);
81252         utils.mixin(_passwords, data);
81253
81254         bus.ajax(
81255             "POST",
81256             url(action),
81257             data,
81258             function (resp) {
81259                 _startProgress();
81260                 poll(resp);
81261             },
81262             function (error) {
81263                 var message = "Build request failded with message: " + error.data;
81264
81265                 if (error.code === 0 || error.code === 404) {
81266                     message += "<br>This could be due to the Build and Deploy services not running or not being installed";
81267                 }
81268
81269                 notifications.openNotification("error", message);
81270             }
81271         );
81272     }
81273 };
81274
81275 module.exports = _self;
81276
81277 });
81278 define('ripple/ui/plugins/power', function (require, exports, module) {
81279 /*
81280  *  Copyright 2012 Intel Corporation
81281  *
81282  * Licensed under the Apache License, Version 2.0 (the "License");
81283  * you may not use this file except in compliance with the License.
81284  * You may obtain a copy of the License at
81285  *
81286  * http://www.apache.org/licenses/LICENSE-2.0
81287  *
81288  * Unless required by applicable law or agreed to in writing, software
81289  * distributed under the License is distributed on an "AS IS" BASIS,
81290  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
81291  * See the License for the specific language governing permissions and
81292  * limitations under the License.
81293  */
81294
81295 var db = require('ripple/db'),
81296     event = require('ripple/event'),
81297     constants = require('ripple/constants'),
81298     _volume  = document.getElementById(constants.BATTERY.VOLUME),
81299     _volumeLabel  = document.getElementById(constants.BATTERY.VOLUME + "-label"),
81300     _charging = document.getElementById(constants.BATTERY.CHARGING),
81301     _battery = {
81302         volume: 600,
81303         level:  1.0,
81304         timerId: null,
81305         charge: function (isStart, isCharge, callback) {
81306             var currentVolume,
81307                 checkValue = function () {
81308                     if (_battery.level < 0 || _battery.level > 1.0 || !isStart) {
81309                         clearInterval(_battery.timerId);
81310                         _battery.timerId = null;
81311                         if (_battery.level < 0)
81312                             _battery.level = 0;
81313                         else if (_battery.level > 1.0)
81314                             _battery.level = 1.0;
81315                     }
81316                 };
81317
81318             if (isStart && !_battery.timerId) {
81319                 _battery.timerId = setInterval(function () {
81320                     currentVolume = isCharge ? _battery.level * _battery.volume + 1 : _battery.level * _battery.volume - 1;
81321                     _battery.level = currentVolume / _battery.volume;
81322                     checkValue();
81323                     return callback && callback();
81324                 }, 1000);
81325             }
81326             checkValue();
81327             return callback && callback();
81328         }
81329     };
81330
81331 function _triggerEvent(chargingStatus, chargingTime, dischargingTime, level, type) {
81332     var status = {
81333         charging: chargingStatus,
81334         chargingTime: chargingTime,
81335         dischargingTime: dischargingTime,
81336         level: level,
81337         type: type
81338     };
81339     event.trigger("BatteryEvent", [status]); // for w3c battery api
81340     // for tizen systeminfo api
81341     if (type === "levelchange") {
81342         event.trigger("BatteryLevelChanged", [level]);
81343     }
81344     if (type === "chargingchange") {
81345         event.trigger("BatteryChargingChanged", [status]);
81346     }
81347 }
81348
81349 function _updateLevelIcons() {
81350     var colors = ["black", "black", "black", "black", "black", "black", "#404040", "#606060", "#808080", "#b0b0b0", "#ffffff", "#ffffff", "#ffffff", "#ffffff", "#ffffff", "#ffffff"],
81351         colorIndex = 10 - Math.round(_battery.level * 10),
81352         index;
81353
81354     //map the battery level to the color range
81355     for (index = 0 ; index <= 5 ; index++) {
81356         $("#block" + index).css("backgroundColor", colors[colorIndex]);
81357         colorIndex++;
81358     }
81359 }
81360
81361 function _setVolumeReadOnly(flag) {
81362     if (flag) {
81363         $("#" + constants.BATTERY.VOLUME).hide();
81364         $("#" + constants.BATTERY.VOLUME + "-label").show();
81365     } else {
81366         $("#" + constants.BATTERY.VOLUME).show();
81367         $("#" + constants.BATTERY.VOLUME + "-label").hide();
81368     }
81369 }
81370
81371 function _startDischarging() {
81372     var remainVolume = 0;
81373
81374     if ($("#simulate-low-battery #low-battery-remain-time").val() <= 0) {
81375         $("#simulate-low-battery #low-battery-remain-time").val(0);
81376     }
81377     remainVolume = Number($("#simulate-low-battery #low-battery-remain-time").val());
81378     if ($("#simulate-low-battery #low-battery-start-at").val() > 100) {
81379         $("#simulate-low-battery #low-battery-start-at").val(100);
81380     }
81381     if ($("#simulate-low-battery #low-battery-start-at").val() <= 0) {
81382         $("#simulate-low-battery #low-battery-start-at").val(0);
81383     }
81384     _battery.level = $("#simulate-low-battery #low-battery-start-at").val() / 100.0;
81385     if (_battery.level === 0 || remainVolume === 0) {
81386         $("#simulate-low-battery").dialog("close");
81387         _stopDischarging();
81388         return;
81389     }
81390     _setVolumeReadOnly(true);
81391     if (_charging.checked) {
81392         _charging.checked = false;
81393         _battery.charge(false);
81394     }
81395
81396     _charging.disabled = true;
81397     $("#remaining-time-label").html("Remaining Time to empty (seconds)");
81398     $("#charging-state").html("Plugged in?");
81399
81400     $("#remain-time").show();
81401     _battery.volume = remainVolume / _battery.level;
81402     _volumeLabel.innerText = (_battery.level * 100).toFixed(2);
81403     _battery.charge(true, false, function () {
81404         _volumeLabel.innerText = (_battery.level * 100).toFixed(2);
81405         _volume.value = (_battery.level * 100).toFixed(2);
81406         changeBatteryVolume();
81407         $("#remain-time").html(Math.round(_battery.volume * _battery.level) + " Seconds");
81408         _updateLevelIcons();
81409         if (_battery.level <= 0.0) {
81410             _stopDischarging();
81411         }
81412     });
81413     $("#simulate-low-battery").dialog("close");
81414     $("#simulate-low-battery-btn").hide();
81415     $("#stop-btn").show();
81416     _triggerEvent(false, Infinity, Math.round(_battery.volume * _battery.level), _battery.level, "chargingtimechange");
81417 }
81418
81419 function _stopDischarging() {
81420     _charging.disabled = false;
81421     _battery.level = _volume.value / 100.0;
81422     $("#remain-time").hide();
81423     $("#remain-time").html("");
81424     $("#remaining-time-label").html("Remaining Time (seconds)");
81425     _setVolumeReadOnly(false);
81426     _battery.charge(false);
81427     $("#simulate-low-battery-btn").show();
81428     $("#stop-btn").hide();
81429     _updateLevelIcons();
81430 }
81431
81432 function _setCharging() {
81433     // update the UI parts
81434     if (_charging.checked) {
81435         _battery.volume = 600;
81436         _battery.level = _volume.value / 100;
81437         _setVolumeReadOnly(true);
81438         $("#remain-time").show();
81439         $("#remaining-time-label").html("Remaining Time to fully charged (seconds)");
81440         $("#charging-state").html("Plugged in - charging rate 0.17%/second");
81441         _triggerEvent(true, Math.round(_battery.volume * (1 - _battery.level)), Infinity, _battery.level, "chargingchange");
81442     } else {
81443         _battery.level = _volume.value / 100.0;
81444         _updateLevelIcons();
81445         $("#remain-time").hide();
81446         $("#remain-time").html("");
81447         _setVolumeReadOnly(false);
81448         $("#remaining-time-label").html("Remaining Time (seconds)");
81449         $("#charging-state").html("Plugged in?");
81450         _triggerEvent(false, Infinity, Math.round(_battery.volume * _battery.level), _battery.level, "chargingchange");
81451     }
81452     // if it's unchecked, the timer will stop in this function call, the UI update blow it
81453     _battery.charge(_charging.checked, true, function () {
81454         _volumeLabel.innerText = (_battery.level * 100).toFixed(2);
81455         _volume.value = (_battery.level * 100).toFixed(2);
81456         changeBatteryVolume();
81457         $("#remain-time").html(Math.round(_battery.volume * (1 - _battery.level)) + " Seconds");    //show current remain time
81458         _updateLevelIcons();
81459     });
81460 }
81461
81462 function changeBatteryVolume() {
81463     if (_volume.value < 0)
81464         _volume.value = 0;
81465     else if (_volume.value > 100)
81466         _volume.value = 100;
81467
81468     _battery.level = _volume.value / 100.0;
81469     if (_charging.checked === true) {
81470         _triggerEvent(true, Math.round(_battery.volume * (1 - _battery.level)), Infinity, _battery.level, "levelchange");
81471     } else {
81472         _triggerEvent(false, Infinity, Math.round(_battery.volume * _battery.level), _battery.level, "levelchange");
81473     }
81474     db.save(constants.BATTERY.VOLUME, _volume.value);
81475     _updateLevelIcons();
81476 }
81477
81478 function initBattery() {
81479     $("#" + constants.BATTERY.CHARGING).bind("change", _setCharging);
81480
81481     $("#simulate-low-battery-btn").bind("click", function () {
81482         $("#simulate-low-battery").dialog("open");
81483     });
81484
81485     $("#simulate-low-battery-cancel").bind("click", function () {
81486         $("#low-battery-start-at").val = 20;  //UI initialize
81487         $("#low-battery-remain-time").val = 1200;
81488         $("#simulate-low-battery").dialog("close");
81489     });
81490
81491     $("#simulate-low-battery-start").bind("click", _startDischarging);
81492     $("#stop-btn").bind("click", _stopDischarging);
81493
81494     $("#" + constants.BATTERY.VOLUME).bind("change", function () {
81495         changeBatteryVolume();
81496     });
81497
81498     _charging.checked = false;
81499     _battery.level = db.retrieve(constants.BATTERY.VOLUME) / 100.0;
81500     if (isNaN(_battery.level)) {
81501         _battery.level = 1;
81502     }
81503     _volume.value = (_battery.level * 100).toFixed(2);
81504     _updateLevelIcons();
81505     $("#simulate-low-battery").dialog({
81506         resizable: false,
81507         draggable: true,
81508         modal: true,
81509         autoOpen: false,
81510         position: 'center',
81511         minWidth: '460',
81512         minHeight: '240'
81513     });
81514 }
81515
81516 module.exports = {
81517     panel: {
81518         domId: "power-container",
81519         collapsed: true,
81520         pane: "left",
81521         titleName: "Power Manager",
81522         display: true
81523     },
81524
81525     initialize: function () {
81526         initBattery();
81527     }
81528 };
81529
81530 });
81531 define('ripple/ui/plugins/settings-menu', function (require, exports, module) {
81532 /*
81533  *  Copyright 2011 Research In Motion Limited.
81534  *
81535  * Licensed under the Apache License, Version 2.0 (the "License");
81536  * you may not use this file except in compliance with the License.
81537  * You may obtain a copy of the License at
81538  *
81539  * http://www.apache.org/licenses/LICENSE-2.0
81540  *
81541  * Unless required by applicable law or agreed to in writing, software
81542  * distributed under the License is distributed on an "AS IS" BASIS,
81543  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
81544  * See the License for the specific language governing permissions and
81545  * limitations under the License.
81546  */
81547 var utils = require('ripple/utils'),
81548     constants = require('ripple/constants'),
81549     platform = require('ripple/platform'),
81550     db = require('ripple/db'),
81551     _applicationStateId
81552     ;
81553
81554
81555 function reload() {
81556     window.tinyHipposReload = true;
81557     location.reload();
81558 }
81559
81560 function _showSettingMenu() {
81561     var contentTable = "",
81562     settings = [],
81563     _applicationState = [],
81564     _applicationStateTmp = [],
81565     unselectedNum = 0,
81566     i = 0;
81567
81568     if ($("#settings-menu-popup").is(":visible")) {
81569         $("#settings-menu-popup").hide("slide", {direction: "up"}, "slow");
81570         $("#overlayBackground").hide("fade", "slow");
81571         return;
81572     }
81573
81574     _applicationStateId = constants.COMMON.APPLICATION_STATE + platform.current().id;
81575
81576     _applicationStateTmp = db.retrieveObject(_applicationStateId) || [];
81577
81578     utils.forEach(_applicationStateTmp, function (obj) {
81579         if (obj.display)
81580             _applicationState.push(obj);
81581     });
81582
81583     utils.forEach(_applicationStateTmp, function (obj) {
81584         if (!obj.display)
81585             _applicationState.push(obj);
81586     });
81587
81588     $("#settings-menu-content-panel-table").remove();
81589
81590     contentTable = '<table id="settings-menu-content-panel-table" class="settings-menu-content-table">';
81591     utils.forEach(_applicationState, function (obj) {
81592         var checked = obj.display ? 'checked="yes"':"";
81593         contentTable += '<tr><td><input name="panel-display-setting" type="checkbox" class="settings-menu-checkbox "' +
81594                         checked + '></input>' +
81595                         obj.titleName + '</td></tr>\n';
81596     });
81597     contentTable += "</table>";
81598
81599     $("#settings-menu-container-div").append(contentTable);
81600     $("#settings-menu-popup").css("top", 50);
81601     $("#settings-menu-popup").css("left", $(window).width() - 340);
81602
81603     $("#overlayBackground").css("width", $(window).width());
81604     $("#overlayBackground").css("height", $(window).height());
81605     $("#overlayBackground").show("fade", "slow");
81606     $("#settings-menu-popup").show("slide", {direction: "up"}, "slow");
81607
81608     $("#settings-menu-save-btn").unbind('click');
81609     $("#settings-menu-save-btn").bind("click", function (event) {
81610         $("input[name='panel-display-setting']").each(function (i, a) {
81611             settings.push(a.checked);
81612         });
81613
81614         utils.forEach(_applicationState, function (obj) {
81615             if (!settings[i])
81616                 obj.collapsed = true;
81617             obj.display = settings[i];
81618             i++;
81619         }, this);
81620   
81621         db.saveObject(_applicationStateId, _applicationState);
81622         _applicationStateTmp = db.retrieveObject(_applicationStateId) || [];
81623
81624         $("#settings-menu-popup").hide("slide", {direction: "up"}, "slow");
81625         $("#overlayBackground").hide("fade", "slow");
81626         setTimeout(reload, 500);
81627     });
81628
81629     $(".settings-menu-content-table td").unbind('click');
81630     $(".settings-menu-content-table td").bind("click", function (event) {
81631         var checkbox;
81632         if (($(event.target).children().length === 0)) {
81633             return;
81634         } else {
81635             checkbox = $(event.target).children();
81636         }
81637         
81638         if (checkbox.is(':checked')) {
81639             checkbox.prop('checked', false);
81640         }
81641         else
81642             checkbox.prop('checked', true);
81643     });
81644
81645     $("#settings-menu-close-btn").unbind('click');
81646     $("#settings-menu-close-btn").bind("click", function (event) {
81647         if ($("#settings-menu-popup").is(":visible")) {
81648             $("#settings-menu-popup").hide("slide", {direction: "up"}, "slow");
81649             $("#overlayBackground").hide("fade", "slow");
81650             return;
81651         }
81652     });
81653
81654     $(window).bind('resize', function () {
81655         $("#settings-menu-popup").css("top", 50);
81656         $("#settings-menu-popup").css("left", $(window).width() - 340);
81657         $("#overlayBackground").css("width", $(window).width());
81658         $("#overlayBackground").css("height", $(window).height());
81659     });
81660
81661     $(".settings-menu-checkbox").each(function (i, a) {
81662         if (a.checked === false) {
81663             unselectedNum++;
81664         }
81665     });
81666
81667     if (unselectedNum === 0) {
81668         $("#select_unselect_text").text("Unselect All");
81669         $("#panelSettingSelectAll").prop('checked', true);
81670     }
81671
81672     $("#panelSettingSelectAll").unbind('click');
81673     $("#panelSettingSelectAll").bind("click", function (event) {
81674         if ($("#panelSettingSelectAll").is(':checked')) {
81675             $("#select_unselect_text").text("Unselect All");
81676             $(".settings-menu-checkbox").prop('checked', true);
81677         }
81678         else {
81679             $("#select_unselect_text").text("Select All");
81680             $(".settings-menu-checkbox").prop('checked', false);
81681         }
81682     });
81683 }
81684
81685 module.exports = {
81686     initialize: function () {
81687         $("#options-button-panels").bind("click", function (event) {
81688             _showSettingMenu();
81689         });
81690     }
81691 };
81692
81693 });
81694 define('ripple/ui/plugins/communication', function (require, exports, module) {
81695 /*
81696  *  Copyright 2011 Research In Motion Limited.
81697  *
81698  * Licensed under the Apache License, Version 2.0 (the "License");
81699  * you may not use this file except in compliance with the License.
81700  * You may obtain a copy of the License at
81701  *
81702  * http://www.apache.org/licenses/LICENSE-2.0
81703  *
81704  * Unless required by applicable law or agreed to in writing, software
81705  * distributed under the License is distributed on an "AS IS" BASIS,
81706  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
81707  * See the License for the specific language governing permissions and
81708  * limitations under the License.
81709  */
81710
81711 var ui = require('ripple/ui'),
81712     event = require('ripple/event'),
81713     deviceSettings = require('ripple/deviceSettings'),
81714     db = require('ripple/db'),
81715     utils = require('ripple/utils'),
81716     _messageType = {
81717         sms: "SMS",
81718         mms: "MMS",
81719         email: "E-mail"
81720     },
81721     _attachments = [],
81722 /*
81723     _exception = {
81724         "":                  "Connection Issue",
81725         "unknown":           "Unknown",
81726         "network":           "Network",
81727         "unreachable":       "Unreachable",
81728         "no-answer":         "No Answer",
81729         "bad-number":        "Bad Number",
81730         "number-not-in-use": "Number Not In Use",
81731         "media":             "Media",
81732         "no-sim":            "No Sim Card",
81733         "account-down":      "Account Down",
81734         "credit-down":       "Credit Down",
81735         "barred":            "Barred",
81736         "network-busy":      "Network Busy",
81737         "network-down":      "Network Down"
81738     },
81739 */
81740     _status = {
81741         IDLE:       0,
81742         DIALED:     1,
81743         INPROGRESS: 2,
81744     },
81745     _data = {
81746         status: _status.IDLE,
81747 //        isInException: false,
81748         conversationStartTime: null
81749     },
81750     _contactNameArr = [],
81751     _contactNumArr = [],
81752     _CONTACT_KEY = "tizen1-contact",
81753     _record = {},
81754     _conversationSeconds = 0,
81755     _conversationTimer,
81756     _msgTimer,
81757     _audioPlayersStatus = [];
81758
81759 function _showMsg() {
81760     var messageName = jQuery("#communication-senderName").val(),
81761         messageContent = jQuery("#communication-messageContent").val(),
81762         disMsgName = jQuery(".communication-messageContainer tr:first-child td"),
81763         disMsgContent = jQuery(".communication-messageContainer tr:nth-child(2) td textarea");
81764
81765     ui.showOverlay("communication-window");
81766
81767     disMsgName.text(messageName ? messageName : "Unknown name");
81768     disMsgContent.val(messageContent ? messageContent : "");
81769
81770     jQuery("#communication-viewport").css("height", jQuery("#viewport-container").css("height"))
81771                                      .show("slide", {direction: "up"}, "fast");
81772     jQuery(".communication-callContainer").hide();
81773     jQuery(".communication-messageContainer").show();
81774 }
81775
81776 function _msgEventInitialize() {
81777     jQuery("#communication-messageRadioStatus").hide();
81778     jQuery("#communication-sendMessage").unbind("click").click(function () {
81779         var messageItem,
81780             number = jQuery("#communication-senderName").val(),
81781             text = jQuery("#communication-messageContent").val(),
81782             type = jQuery("#communication-msgType").val(),
81783             message = {
81784                 type: type,
81785                 body: text,
81786                 from: number,
81787                 time: new Date(),
81788                 attachments: _attachments
81789             };
81790
81791         if (deviceSettings.retrieve("CELLULAR_NETWORK.status") === false &&
81792             (type === 'sms' || type === 'mms')) {
81793             jQuery("#communication-messageRadioStatus").html('cellular radio is off<br \>Turn it on from Network Management Panel.');
81794             jQuery("#communication-messageRadioStatus").show();
81795             setTimeout(function () {
81796                 jQuery("#communication-messageRadioStatus").hide();
81797             }, 3000);
81798             return;
81799         }
81800         if (deviceSettings.retrieve("WIFI_NETWORK.status") === false &&
81801             type === 'email') {
81802             jQuery("#communication-messageRadioStatus").html('wifi radio is off<br \>Turn it on from Network Management Panel.');
81803             jQuery("#communication-messageRadioStatus").show();
81804             setTimeout(function () {
81805                 jQuery("#communication-messageRadioStatus").hide();
81806             }, 3000);
81807             return;
81808         }
81809
81810         event.trigger("MessageReceived", [message]);
81811         _attachments = [];
81812         event.trigger("CommWinShow", [true]);
81813         _showMsg();
81814
81815         jQuery(".communication-messageContainer textarea").attr("disabled", "disabled");
81816         jQuery("#communication-messageOut td:nth-child(3)").text(jQuery("#communication-messageContent").val());
81817         messageItem = jQuery("#communication-messageOut").html();
81818         jQuery("#communication-messageDisplay").append(messageItem);
81819
81820         clearTimeout(_msgTimer);
81821         _msgTimer = setTimeout(function () {
81822             if (_data.status === _status.IDLE) {
81823                 ui.hideOverlay("communication-window");
81824                 event.trigger("CommWinShow", [false]);
81825             } else {
81826                 _showCall();
81827             }
81828         }, 5000);
81829     });
81830
81831     jQuery("#communication-clearMessage").unbind("click").click(function () {
81832             jQuery("#communication-messageDisplay").empty();
81833         });
81834
81835     event.on("LayoutChanged", function () {
81836         jQuery("#communication-viewport").css("height", jQuery("#viewport-container").css("height"));
81837
81838     });
81839     event.on("OutsideMessageReceived", function (message) {
81840         var i = 0,
81841             recipients = [],
81842             recipientsStatus = {},
81843             messageItem;
81844
81845         recipientsStatus.id = message.id;
81846         recipientsStatus.msg = message.msg;
81847         for (i in message.to) {
81848             recipientsStatus[message.to[i]] = true;
81849             recipients.push(message.to[i]);
81850         }
81851         for (i in message.cc) {
81852             recipientsStatus[message.cc[i]] = true;
81853             recipients.push(message.cc[i]);
81854         }
81855         for (i in message.bcc) {
81856             recipientsStatus[message.bcc[i]] = true;
81857             recipients.push(message.bcc[i]);
81858         }
81859
81860         event.trigger("MessageSent", [recipientsStatus]);
81861         jQuery("#communication-messageIn td:nth-child(1)").text(message.body);
81862         messageItem = jQuery("#communication-messageIn").html();
81863         jQuery("#communication-messageDisplay").append(messageItem);
81864     });
81865
81866     jQuery("#communication-ok").unbind("click").click(function () {
81867         if (_data.status === _status.IDLE) {
81868             ui.hideOverlay("communication-window");
81869             event.trigger("CommWinShow", [false]);
81870         } else {
81871             _showCall();
81872         }
81873         clearTimeout(_msgTimer);
81874     });
81875 }
81876
81877 function _msgInitialize() {
81878     _msgEventInitialize();
81879
81880     utils.forEach(_messageType, function (msgTypeText, msgType) {
81881         var typeNode = utils.createElement("option", {
81882                 "innerText": msgTypeText,
81883                 "value": msgType
81884             });
81885
81886         jQuery("#communication-msgType").append(typeNode);
81887     });
81888 }
81889
81890 function pauseAllAudioPlayer() {
81891     var audios = $("#document").contents().find("audio"),
81892         index;
81893     for (var index = 0; index < audios.length; index++) {
81894         if (audios[index].paused) {
81895             _audioPlayersStatus[index] = 0;
81896         }
81897         else {
81898             _audioPlayersStatus[index] = 1;
81899             audios[index].pause();
81900         }
81901     }
81902 }
81903
81904 function playAllAudioPlayer() {
81905     var audios = $("#document").contents().find("audio"),
81906         index;
81907     for (var index = 0; index < audios.length; index++) {
81908         if (_audioPlayersStatus[index] === 1) {
81909             audios[index].play();
81910         }
81911     }
81912     _audioPlayersStatus = [];
81913 }
81914
81915 function _showCall() {
81916     var callName = jQuery("#communication-callerName").val(),
81917         callNum = jQuery("#communication-callNum").val(),
81918         disCallName = jQuery(".communication-callContainer tr:first-child td"),
81919         disCallNum = jQuery(".communication-callContainer tr:nth-child(2) td");
81920
81921     ui.showOverlay("communication-window");
81922     event.trigger("CommWinShow", [true]);
81923
81924     disCallName.text(callName ? callName : "Unknown Name");
81925     disCallNum.text(callNum ? callNum : "Unknown Number");
81926
81927     jQuery("#communication-viewport").css("height", jQuery("#viewport-container").css("height"))
81928                                      .show("slide", {direction: "up"}, "fast");
81929     jQuery(".communication-callContainer").show();
81930     jQuery(".communication-messageContainer").hide();
81931     pauseAllAudioPlayer();
81932 }
81933
81934 function _initRecord() {
81935     var callerName = jQuery("#communication-callerName").val(),
81936         callerNum = jQuery("#communication-callNum").val(),
81937         displayName = callerName ? callerName : "Unknown",
81938         displayNum = callerNum ? callerNum : "Unknown";
81939
81940     _record = {};
81941     _record.type = "TEL";
81942     if ($("#is-videoCall").prop("checked") === true) {
81943         _record.features = ["CALL", "VIDEOCALL"];
81944     } else {
81945         _record.features = ["CALL", "VOICECALL"];
81946     }
81947     _record.remoteParties = [{
81948         remoteParty: displayNum,
81949         personId: displayName,
81950     }];
81951     _record.startTime = new Date();
81952 }
81953
81954 function _endCall(callEndReason) {
81955     _record.duration = _data.conversationStartTime ? _conversationSeconds : 0;
81956
81957     _data.conversationStartTime = null;
81958
81959     switch (callEndReason) {
81960     case 'rejected':
81961         _record.direction = "REJECTED";
81962         break;
81963     case 'remote':
81964         _record.direction = "RECEIVED";
81965         break;
81966     case 'local':
81967         _record.direction = "MISSEDNEW";
81968         break; 
81969     }
81970
81971     event.trigger("CallRecorded", [_record]);
81972     event.trigger("CallInProgress", [false]);
81973
81974     _data.status = _status.IDLE;
81975     _record = {};
81976
81977     _conversationSeconds = 0;
81978     window.clearInterval(_conversationTimer);
81979     ui.hideOverlay("communication-window");
81980     event.trigger("CommWinShow", [false]);
81981     playAllAudioPlayer();
81982 }
81983
81984 function _callEventInitialize() {
81985     jQuery("#communication-cellularStatus").hide();
81986     jQuery("#communication-callStart").unbind('click').click(
81987         function () {
81988             if (deviceSettings.retrieve("CELLULAR_NETWORK.status") === false) {
81989                 jQuery("#communication-cellularStatus").show();
81990                 setTimeout(function () {
81991                     jQuery("#communication-cellularStatus").hide();
81992                 }, 3000);
81993
81994                 return;
81995             }
81996             if (_data.status === _status.IDLE) {
81997                 _data.status = _status.DIALED;
81998                 _initRecord();
81999                 _showCall();
82000                 jQuery("#callSettings tr:last-child td").text("Calling...");
82001                 jQuery("#communication-callStart > span").text("End Call");
82002                 jQuery("#callSettings input").attr("disabled", "disabled");
82003             } else {
82004                 _endCall("local");
82005
82006                 jQuery("#callSettings tr:last-child td").text("");
82007                 jQuery("#communication-callStart > span").text("Call");
82008                 jQuery(".communication-callContainer tr:nth-child(3)").show();
82009                 jQuery(".communication-callContainer tr:last-child").hide();
82010                 jQuery("#callSettings input").removeAttr("disabled");
82011             }
82012
82013         }
82014     );
82015
82016     event.on("ApplicationLoad", function () {
82017         switch (_data.status) {
82018         case _status.INPROGRESS:
82019             jQuery("#communication-callStart").click();
82020             break;
82021         case _status.DIALED:
82022             jQuery("#communication-ignore").click();
82023             break;
82024         default:
82025             break;
82026         }
82027     });
82028
82029     jQuery("#communication-ignore").unbind('click').click(function () {
82030         _endCall("rejected");
82031
82032         jQuery("#callSettings tr:last-child td").text("");
82033         jQuery("#communication-callStart > span").text("Call");
82034         jQuery("#communication-callStart").removeData();
82035         jQuery("#callSettings input").removeAttr("disabled");
82036     });
82037
82038     jQuery("#communication-answer").unbind('click').click(function () {
82039         _data.conversationStartTime = new Date();
82040         event.trigger("CallInProgress", [true]);
82041         _data.status = _status.INPROGRESS;
82042
82043         _conversationTimer = setInterval(function () {
82044             var timeObj = new Date(1970, 0, 1),
82045                 timeString;
82046
82047             timeObj.setSeconds(_conversationSeconds);
82048             timeString = timeObj.toTimeString().substr(0, 8);
82049             jQuery("#callSettings tr:last-child td").text(timeString);
82050             _conversationSeconds = _conversationSeconds + 1;
82051         }, 1000);
82052
82053         jQuery(".communication-callContainer tr:nth-child(3)").hide();
82054         jQuery(".communication-callContainer tr:last-child").show();
82055     });
82056
82057     jQuery("#communication-end").unbind('click').click(function () {
82058         _endCall("remote");
82059
82060         jQuery("#callSettings tr:last-child td").text("");
82061         jQuery("#communication-callStart > span").text("Call");
82062         jQuery("#communication-callStart").removeData();
82063         jQuery(".communication-callContainer tr:nth-child(3)").show();
82064         jQuery(".communication-callContainer tr:last-child").hide();
82065         jQuery("#callSettings input").removeAttr("disabled");
82066     });
82067 /*
82068     jQuery("#communication-callEndReason").unbind("change").change(function () {
82069         if (!jQuery("#communication-callEndReason").val()) {
82070             _data.isInException = false;
82071         } else {
82072             _data.isInException = true;
82073             if (_data.isInException && (_data.status !== _status.IDLE)) {
82074                 _endCall(jQuery("#communication-callEndReason").val());
82075             }
82076         }
82077
82078         jQuery("#callSettings tr:last-child td").text("");
82079         jQuery("#communication-callStart > span").text("Call");
82080         jQuery("#communication-callStart").removeData();
82081         jQuery(".communication-callContainer tr:nth-child(3)").show();
82082         jQuery(".communication-callContainer tr:last-child").hide();
82083         jQuery("#callSettings input").removeAttr("disabled");
82084     });
82085 */
82086 }
82087
82088 function _contactInitialize() {
82089     var data = db.retrieveObject(_CONTACT_KEY),
82090         displayName = null, number = null, index = 0;
82091
82092     _contactNameArr = [];
82093     _contactNumArr = [];
82094
82095     utils.forEach(data, function (addrBook) {
82096         utils.forEach(addrBook._contacts, function (contact) {
82097             if (contact.name && contact.name && contact.phoneNumbers && contact.phoneNumbers.length > 0) {
82098                 displayName = contact.name.firstName + ' ' + contact.name.lastName;
82099                 number = contact.phoneNumbers[0].number;
82100                 _contactNameArr.push(displayName);
82101                 _contactNumArr[displayName] = number;
82102                 index++;
82103             }
82104         });
82105     });
82106
82107     jQuery("#communication-callerName").autocomplete({
82108         source: _contactNameArr,
82109         select: function (event, ui) {
82110             jQuery("#communication-callNum").val(_contactNumArr[ui.item.value]);
82111         }
82112     });
82113     jQuery("#communication-senderName").autocomplete({
82114         source: _contactNameArr
82115     });
82116 }
82117
82118 function _callInitialize() {
82119     _callEventInitialize();
82120
82121     _contactInitialize();
82122 /*
82123     utils.forEach(_exception, function (value, key) {
82124         var typeNode = utils.createElement("option", {
82125                 "innerText": value,
82126                 "value": key
82127             });
82128
82129         jQuery("#communication-callEndReason").append(typeNode);
82130     });
82131 */
82132 }
82133
82134 function _pushEventInitialize() {
82135     function register(appService) {
82136         appService.registrationId = Math.uuid(null, 16);
82137
82138         window.setTimeout(function () {
82139             var appLabel;
82140
82141             if ($("#communication-push-" + appService.appId).length !== 0) {
82142                 $("#" + appService.appId).click();
82143                 $("#communication-push-status-" + appService.appId).html("||");
82144                 $("#communication-push-status-" + appService.appId).css("color", "#ff0000");
82145
82146                 return;
82147             }
82148
82149             if (!$("#communication-push-app > tbody").html()) {
82150                 $("#communication-push-header").show();
82151                 $("#communication-push-submit").removeAttr("disabled");
82152             }
82153
82154             appLabel = appService.appControl.uri || appService.appId;
82155
82156             $("#communication-push-app").append(
82157                 "<tr id='communication-push-" + appService.appId + "'>" +
82158                 "<td style='width: 90%'><input type='radio' name='communication-push-list' id='" +
82159                 appService.appId + "' style='margin: 5px' checked='checked' />" +
82160                 "<label for='" + appService.appId + "'>" + appLabel + "</label></td>" +
82161                 "<td id='communication-push-status-" + appService.appId + "'>||</td>" +
82162                 "</tr>");
82163
82164             $("label[for='" + appService.appId + "']").css({
82165                 "display": "inline-block",
82166                 "width": "220px",
82167                 "white-space": "nowrap",
82168                 "overflow": "hidden",
82169                 "text-overflow": "ellipsis"
82170             });
82171
82172             $("#communication-push-status-" + appService.appId).css({
82173                 "width": "10%",
82174                 "color": "#ff0000",
82175                 "text-align": "center",
82176                 "font-weight": "bold",
82177                 "font-size": "14px"
82178             });
82179
82180             $("#communication-push-app tr:even").css("background-color", "white");
82181             $("#communication-push-app tr:odd").css("background-color", "whitesmoke");
82182         }, 1);
82183     }
82184
82185     function unregister(appId) {
82186         if ($("#communication-push-" + appId).length === 0)
82187             return;
82188
82189         $("tr[id='communication-push-" + appId + "']").remove();
82190
82191         if (!$("#communication-push-app > tbody").html()) {
82192             $("#communication-push-header").hide();
82193             $("#communication-push-submit").attr("disabled", "disabled");
82194
82195             return;
82196         }
82197
82198         if ($("input[name='communication-push-list']:checked").length === 0) {
82199             $("#communication-push-app input:first").click();
82200         }
82201
82202         $("#communication-push-app tr:even").css("background-color", "white");
82203         $("#communication-push-app tr:odd").css("background-color", "whitesmoke");
82204     }
82205
82206     function connect(appId) {
82207         $("#communication-push-status-" + appId).html("<=>");
82208         $("#communication-push-status-" + appId).css("color", "#32cd32");
82209     }
82210
82211     function disconnect(appId) {
82212         $("#communication-push-status-" + appId).html("||");
82213         $("#communication-push-status-" + appId).css("color", "#ff0000");
82214     }
82215
82216     event.on("PushRequest", function (command, cmdData) {
82217         switch (command) {
82218         case "REGISTER":
82219             register(cmdData);
82220             break;
82221
82222         case "UNREGISTER":
82223             unregister(cmdData);
82224             break;
82225
82226         case "CONNECT":
82227             connect(cmdData);
82228             break;
82229
82230         case "DISCONNECT":
82231             disconnect(cmdData);
82232             break;
82233         }
82234     });
82235 }
82236
82237 function _pushElementInitialize() {
82238     $("#communication-push-submit").attr("disabled", "disabled");
82239     $("#communication-push-submit").unbind('click').click(function () {
82240         var appId, pushMessage;
82241
82242         appId = $("#communication-push-app :checked").attr("id");
82243         if (!appId)
82244             return;
82245
82246         pushMessage = {
82247             appData:      $("#communication-push-data").val(),
82248             alertMessage: $("#communication-push-msg").val(),
82249             date:         new Date()
82250         };
82251
82252         if (!pushMessage.appData || !pushMessage.alertMessage)
82253             return;
82254
82255         event.trigger("PushNotified", [appId, pushMessage]);
82256     });
82257
82258     $("#communication-push-clear").unbind('click').click(function () {
82259         $("#communication-push-msg").val("");
82260         $("#communication-push-data").val("");
82261     });
82262 }
82263
82264 function _pushInitialize() {
82265     _pushEventInitialize();
82266     _pushElementInitialize();
82267 }
82268
82269 module.exports = {
82270     panel: {
82271         domId: "communication-container",
82272         collapsed: true,
82273         pane: "left",
82274         titleName: "Communications",
82275         display: true
82276     },
82277     initialize: function () {
82278         jQuery("#communication-select").tabs();
82279         _callInitialize();
82280         _msgInitialize();
82281         _pushInitialize();
82282     }
82283 };
82284
82285 });
82286 define('ripple/ui/plugins/package', function (require, exports, module) {
82287 /*
82288  *  Copyright 2011 Research In Motion Limited.
82289  *
82290  * Licensed under the Apache License, Version 2.0 (the "License");
82291  * you may not use this file except in compliance with the License.
82292  * You may obtain a copy of the License at
82293  *
82294  * http://www.apache.org/licenses/LICENSE-2.0
82295  *
82296  * Unless required by applicable law or agreed to in writing, software
82297  * distributed under the License is distributed on an "AS IS" BASIS,
82298  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
82299  * See the License for the specific language governing permissions and
82300  * limitations under the License.
82301  */
82302
82303 var db = require('ripple/db'),
82304     utils = require('ripple/utils'),
82305     event = require('ripple/event'),
82306     dbinit = require('ripple/platform/tizen/2.0/dbinit'),
82307     PackageInformation = require('ripple/platform/tizen/2.0/PackageInformation'),
82308     DB_PACKAGE_KEY = "tizen-db-package",
82309     _data = {
82310         packageList: {},
82311         installedList: {}
82312     },
82313     _currentPackageId = null,
82314     _packages,
82315     _installedList,
82316     _packageListTemplate,
82317     _packageInstalledTemplate;
82318
82319 function _get() {
82320     _data = db.retrieveObject(DB_PACKAGE_KEY);
82321     if (_data === undefined) {
82322         _data = {
82323             packageList: _packages,
82324             installedList: _installedList
82325         };
82326     }
82327     utils.forEach(_data.installedList, function (item) {
82328         item.lastModified = new Date(item.lastModified);
82329     });
82330 }
82331
82332 function _save() {
82333     db.saveObject(DB_PACKAGE_KEY, _data);
82334 }
82335
82336 function loadPackageList() {
82337     var nodes = jQuery("#package-list-select");
82338     nodes.html("");
82339     utils.forEach(_data.packageList, function (item, index) {
82340         nodes.append(utils.createElement("option", {
82341             "value": index,
82342             "innerText": item.name
82343         }));
82344     });
82345     renderPackageListBox($("#package-list-select option:selected").val());
82346 }
82347
82348 function loadInstalledList() {
82349     var html = "";
82350     jQuery("#package-installed-box").empty();
82351     utils.forEach(_data.installedList, function (item) {
82352         html += _packageInstalledTemplate.replace(/#Name/g, item.name)
82353             .replace(/#ID/g, item.id)
82354             .replace(/#IconPath/, item.iconPath)
82355             .replace(/#Version/, item.version)
82356             .replace(/#TotalSize/, item.totalSize)
82357             .replace(/#DataSize/, item.dataSize)
82358             .replace(/#LastModified/, item.lastModified)
82359             .replace(/#Author/, item.author)
82360             .replace(/#Description/, item.description)
82361             .replace(/#APPIDs/, item.appIds.join("<br>"));
82362     });
82363     $("#package-installed-box").accordion("destroy");
82364     $("#package-installed-box").html(html).accordion({
82365         active: false,
82366         collapsible: true,
82367         autoHeight: false
82368     });
82369     $("." + "package-remove-btn").bind("click", function () {
82370         var id = this.id;
82371         if (id === _currentPackageId) {
82372             $("#msg-" + id).html("Can't Uninstall:<br> Package including running app");
82373             setTimeout(function () {
82374                 $("#msg-" + id).text("");
82375             }, 5000);
82376             return;
82377         }
82378         utils.forEach(_data.packageList, function (item) {
82379             if (item.id === id) {
82380                 event.trigger("remove-apps", [item.appIds]);
82381             }
82382         });
82383         delete _data.installedList[this.id];
82384         _save();
82385         loadPackageList();
82386         loadInstalledList();
82387         event.trigger("uninstall-package", [this.id]);
82388     });
82389 }
82390
82391 function renderPackageListBox(path) {
82392     var item, html;
82393     jQuery("#package-list-box").empty();
82394     item = _data.packageList[path];
82395     html = _packageListTemplate.replace(/#Path/, path)
82396         .replace(/#ID/, item.id)
82397         .replace(/#Name/, item.name)
82398         .replace(/#IconPath/, item.iconPath)
82399         .replace(/#Version/, item.version)
82400         .replace(/#TotalSize/, item.totalSize)
82401         .replace(/#DataSize/, item.dataSize)
82402         .replace(/#Author/, item.author)
82403         .replace(/#Description/, item.description)
82404         .replace(/#APPList/, item.appIds.join("<br>"));
82405     jQuery("#package-list-box").html(html);
82406     if (_data.installedList[item.id]) {
82407         jQuery("#package-update-btn").show();
82408     } else {
82409         jQuery("#package-install-btn").show();
82410     }
82411 }
82412
82413 function addPackage(path, type) {
82414     var item;
82415     if (!_data.packageList[path]) {
82416         return;
82417     }
82418     item = _data.packageList[path];
82419     _data.installedList[item.id] = new PackageInformation(
82420         item.id, item.name, item.iconPath, item.version,
82421         item.totalSize, item.dataSize, new Date(),
82422         item.author, item.description, item.appIds
82423     );
82424     if (type === "install") {
82425         event.trigger("install-apps", [item.appIds]);
82426     } else {
82427         event.trigger("update-apps", [item.appIds]);
82428     }
82429     _save();
82430 }
82431
82432 module.exports = {
82433     panel: {
82434         domId: "package-container",
82435         collapsed: true,
82436         pane: "left",
82437         titleName: "Packages and Applications",
82438         display: true
82439     },
82440     initialize: function () {
82441         _packages = dbinit.Package.packages;
82442         _installedList = dbinit.Package.installedList;
82443         _packageListTemplate = jQuery("#package-list-template").html();
82444         _packageInstalledTemplate = jQuery("#package-installed-template").html();
82445
82446         _get();
82447         _save();
82448         loadPackageList();
82449         loadInstalledList();
82450         jQuery("#package-list-select").bind("focus change", function () {
82451             var path = $("#package-list-select option:selected").val();
82452             renderPackageListBox(path);
82453         });
82454         jQuery("#package-install-btn").live("click", function () {
82455             var path = $("#package-list-select option:selected").val();
82456             addPackage(path, "install");
82457             _get();
82458             loadPackageList();
82459             loadInstalledList();
82460             event.trigger("install-packge", [path]);
82461         });
82462         jQuery("#package-update-btn").live("click", function () {
82463             var path = $("#package-list-select option:selected").val();
82464             addPackage(path, "update");
82465             loadPackageList();
82466             loadInstalledList();
82467             event.trigger("update-package", [path]);
82468         });
82469         jQuery("#package-select").tabs();
82470         event.on("installedList-updated", function () {
82471             _get();
82472             loadPackageList();
82473             loadInstalledList();
82474         });
82475         event.on("install-current-package", function (item) {
82476             _data.installedList[item.id] = new PackageInformation(
82477                 item.id, item.name, item.iconPath, item.version,
82478                 item.totalSize, item.dataSize, item.lastModified,
82479                 item.author, item.description, item.appIds);
82480             _currentPackageId = item.id;
82481             loadInstalledList();
82482         });
82483     }
82484 };
82485
82486 });
82487 define('ripple/ui/plugins/application', function (require, exports, module) {
82488 /*
82489  *  Copyright 2012 Intel Corporation.
82490  *
82491  * Licensed under the Apache License, Version 2.0 (the "License");
82492  * you may not use this file except in compliance with the License.
82493  * You may obtain a copy of the License at
82494  *
82495  * http://www.apache.org/licenses/LICENSE-2.0
82496  *
82497  * Unless required by applicable law or agreed to in writing, software
82498  * distributed under the License is distributed on an "AS IS" BASIS,
82499  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
82500  * See the License for the specific language governing permissions and
82501  * limitations under the License.
82502  */
82503
82504 var event = require('ripple/event'),
82505     utils = require('ripple/utils'),
82506     db = require('ripple/db'),
82507     dbinit = require('ripple/platform/tizen/2.0/dbinit'),
82508     DB_APPLICATION_KEY = "tizen1-db-application",
82509     _data = {
82510         appList: {},
82511         installedAppList: {}
82512     },
82513     _appInstalledTemplate,
82514     _apps,
82515     _installedAppList;
82516
82517 function _get() {
82518     _data = db.retrieveObject(DB_APPLICATION_KEY);
82519     if (_data === undefined) {
82520         _data = {
82521             appList: _apps,
82522             installedAppList: _installedAppList
82523         };
82524     }
82525 }
82526
82527 function _save() {
82528     db.saveObject(DB_APPLICATION_KEY, _data);
82529 }
82530
82531 function _loadInstalledAppList() {
82532     var html = "";
82533     jQuery("#application-installed-box").empty();
82534     utils.forEach(_data.installedAppList, function (item) {
82535         html += _appInstalledTemplate.replace(/#Name/g, item.name)
82536             .replace(/#ID/g, item.id)
82537             .replace(/#IconPath/, item.iconPath)
82538             .replace(/#Version/, item.version)
82539             .replace(/#Show/, item.show)
82540             .replace(/#Categories/, item.categories.join("<br>"))
82541             .replace(/#InstallDate/, item.installDate)
82542             .replace(/#Size/, item.size)
82543             .replace(/#PackageID/, item.packageId)
82544             .replace(/#SharedURI/, item.sharedURI)
82545             .replace(/#Operation/, item.operation)
82546             .replace(/#URI/, item.appControl.uri)
82547             .replace(/#MIME/, item.appControl.mime)
82548             .replace(/#category/, item.appControl.category)
82549             .replace(/#Data/, item.appControl.data);
82550     });
82551     jQuery("#application-installed-box").accordion("destroy");
82552     jQuery("#application-installed-box").html(html).accordion({
82553         active: false,
82554         collapsible: true,
82555         autoHeight: false
82556     });
82557 }
82558
82559 function _displayInfo(text) {
82560     var html = "<b>" + text + "</b>";
82561     document.getElementById("application-error").innerHTML = html;
82562 }
82563
82564 function _programChanged(status, id) {
82565     event.trigger("programChanged", [status, id]);
82566 }
82567
82568 function updateApp(id, updateFlag) {
82569     var item = _data.appList[id];
82570     if (!item) {
82571         return;
82572     }
82573     _data.installedAppList[id] = {
82574         id: item.id,
82575         name: item.name,
82576         iconPath: item.iconPath,
82577         version: item.version,
82578         show: item.show,
82579         categories: item.categories,
82580         installDate: new Date(),
82581         size: item.size,
82582         packageId: item.packageId,
82583         sharedURI: item.sharedURI,
82584         operation: item.operation,
82585         appControl: {
82586             uri: item.appControl.uri,
82587             mime: item.appControl.mime,
82588             category: item.appControl.category,
82589             data: item.appControl.data
82590         },
82591         type: item.type,
82592         value: item.value
82593     };
82594     _save();
82595     if (updateFlag) {
82596         _programChanged("updated", id);
82597     } else {
82598         _programChanged("installed", id);
82599     }
82600     _loadInstalledAppList();
82601 }
82602
82603 function removeApp(id) {
82604     delete _data.installedAppList[id];
82605     _save();
82606     _programChanged("uninstalled", id);
82607     _loadInstalledAppList();
82608 }
82609
82610 event.on("install-current-app", function (item) {
82611     _data.installedAppList[item.id] = {
82612         id: item.id,
82613         name: item.name,
82614         iconPath: item.iconPath,
82615         version: item.version,
82616         show: item.show,
82617         categories: item.categories,
82618         installDate: item.installDate,
82619         size: item.size,
82620         packageId: item.packageId,
82621         sharedURI: item.sharedURI,
82622         operation: item.operation,
82623         appControl: {
82624             uri: item.appControl.uri,
82625             mime: item.appControl.mime,
82626             category: item.appControl.category,
82627             data: item.appControl.data
82628         },
82629         type: item.type,
82630         value: item.value
82631     };
82632     _loadInstalledAppList();
82633 });
82634
82635 event.on("appServiceReplied", function () {
82636     _displayInfo("The application has been launched successfully");
82637 });
82638
82639 event.on("install-apps", function (ids) {
82640     utils.forEach(ids, function (id) {
82641         updateApp(id, false);
82642     });
82643 });
82644
82645 event.on("update-apps", function (ids) {
82646     utils.forEach(ids, function (id) {
82647         updateApp(id, true);
82648     });
82649 });
82650
82651 event.on("remove-apps", function (ids) {
82652     utils.forEach(ids, function (id) {
82653         removeApp(id);
82654     });
82655 });
82656
82657 module.exports = {
82658     initialize: function () {
82659         _apps = dbinit.Application.apps;
82660         _installedAppList = dbinit.Application.installedAppList;
82661         _appInstalledTemplate = jQuery("#application-installed-template").html();
82662         _get();
82663         _save();
82664         _loadInstalledAppList();
82665     }
82666 };
82667
82668 });
82669 define('ripple/ui/plugins/sensorSettings', function (require, exports, module) {
82670 /*
82671  *  Copyright 2012 Intel Corporation.
82672  *
82673  * Licensed under the Apache License, Version 2.0 (the "License");
82674  * you may not use this file except in compliance with the License.
82675  * You may obtain a copy of the License at
82676  *
82677  * http://www.apache.org/licenses/LICENSE-2.0
82678  *
82679  * Unless required by applicable law or agreed to in writing, software
82680  * distributed under the License is distributed on an "AS IS" BASIS,
82681  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
82682  * See the License for the specific language governing permissions and
82683  * limitations under the License.
82684  */
82685
82686 var constants = require('ripple/constants'),
82687     sensorSettings = require('ripple/sensorSettings'),
82688     utils = require('ripple/utils'),
82689     exception = require('ripple/exception'),
82690     platform = require('ripple/platform'),
82691     _CONST = {
82692         "CONTENT_CONTAINER_ID": "sensorsettings-content-container",
82693         "UKNOWN_CONTROL_MESSAGE": "Unknown sensor control type"
82694     },
82695     _contentContainer,
82696     _CONTAINER_ID = _CONST.CONTENT_CONTAINER_ID;
82697
82698 function _appendSettingNode(labelNode, inputNode, label) {
82699     var frag = document.createDocumentFragment(),
82700         rowNode = frag.appendChild(utils.createElement("tr")),
82701         tempTdNode;
82702
82703     rowNode.appendChild(utils.createElement("td"))
82704            .appendChild(labelNode);
82705
82706     tempTdNode = rowNode.appendChild(utils.createElement("td"));
82707
82708     if (label) {
82709         tempTdNode.appendChild(label);
82710     }
82711
82712     tempTdNode.appendChild(inputNode);
82713
82714     return frag;
82715 }
82716
82717 function _buildDOMNode(setting, settingType, key) {
82718     var settingsNode, tagName, jNode,
82719         fullKey = settingType + "." + key,
82720         savedSetting = sensorSettings.retrieve(fullKey),
82721         // TODO: move this into Utils (isSet method)
82722         currentSetting = (savedSetting || savedSetting === false || savedSetting === "" || savedSetting === 0) ? savedSetting : setting.control.value,
82723         domNode,
82724         domNodeLabel = null;
82725
82726     switch (setting.control.type) {
82727     case "text":
82728     case "number":
82729     case "range":
82730     case "checkbox":
82731         tagName = "input";
82732         break;
82733     case "textarea":
82734         tagName = "textarea";
82735         break;
82736     case "select":
82737         tagName = "select";
82738         break;
82739     default:
82740         exception.raise(exception.types.Application, _CONST.UKNOWN_CONTROL_MESSAGE);
82741     }
82742
82743     settingsNode = utils.createElement(tagName, setting.control.type === "select" ? null : setting.control);
82744
82745     // TODO: this should really be part of utils.createControl? add element of type "range" with label?
82746     if (setting.control.type === "range") {
82747         domNodeLabel = utils.createElement("label", {
82748             "class": constants.UI.LEFT_RANGE_LABEL_CLASS
82749         });
82750     }
82751
82752     domNode = _appendSettingNode(utils.createElement("span", {"innerText": setting.name, "class": constants.UI.TEXT_LABEL_CLASS}), settingsNode, domNodeLabel);
82753
82754     jNode = jQuery(settingsNode);
82755     jNode.addClass(constants.UI.JQUERY_UI_INPUT_CLASSES);
82756
82757     switch (setting.control.type) {
82758     case "checkbox":
82759         jNode.bind("click", function () {
82760             var checked = this.checked ? true : false;
82761             sensorSettings.persist(fullKey, checked);
82762             if (typeof setting.callback === "function") {
82763                 setting.callback(checked);
82764             }
82765         });
82766
82767         if (currentSetting === true) {
82768             jNode.attr("checked", "checked");
82769         }
82770
82771         break;
82772
82773     case "text":
82774     case "textarea":
82775     case "number":
82776         jNode.val(currentSetting);
82777         utils.bindAutoSaveEvent(jNode, function () {
82778             sensorSettings.persist(fullKey, jNode.val());
82779             if (typeof setting.callback === "function") {
82780                 setting.callback(jNode.val());
82781             }
82782         });
82783         break;
82784
82785     case "select":
82786     case "range":
82787         if (setting.control.type === "select") {
82788             utils.forEach(setting.options,  function (value, option) {
82789                 jNode.append(utils.createElement("option", {
82790                     "value": option,
82791                     "innerText": value
82792                 }));
82793             });
82794         }
82795         else {
82796             if (domNodeLabel) {
82797                 domNodeLabel.innerText = currentSetting;
82798             }
82799         }
82800
82801         jNode.val(currentSetting)
82802              .bind("change", function () {
82803                 if (setting.control.type === "range" && domNodeLabel) {
82804                     domNodeLabel.innerText = jQuery(this).val();
82805                 }
82806                 sensorSettings.persist(fullKey, jQuery(this).val());
82807
82808                 if (typeof setting.callback === "function") {
82809                     setting.callback(jQuery(this).val());
82810                 }
82811             }
82812         );
82813     }
82814
82815     // TODO: Brent, do in DeviceSettings on load instead?
82816     if (currentSetting !== setting.control.value) {
82817         sensorSettings.register(fullKey, currentSetting);
82818     }
82819
82820     return domNode;
82821 }
82822
82823 // goes through current platforms sensor settings
82824 // adds nodes to panel and binds respective events
82825 // talks to SensorSettings for persistence
82826 module.exports = {
82827     panel: {
82828         domId: "sensors-panel-container",
82829         collapsed: true,
82830         pane: "right",
82831         titleName: "Sensors",
82832         display: true
82833     },
82834     initialize: function () {
82835         var settings;
82836
82837         _contentContainer = document.getElementById(_CONTAINER_ID);
82838
82839         settings = platform.current().sensor;
82840
82841         utils.forEach(settings, function (settingSection, settingType) {
82842
82843             var currentTableNode, flag = false;
82844             
82845             utils.forEach(settingSection, function (setting, key) {
82846                 if (typeof setting === "object") {
82847                     flag = true;
82848                     return;
82849                 }
82850             });
82851
82852             if (flag) {
82853                 _contentContainer.appendChild(utils.createElement("h3", { "innerText": settingType }));
82854             }
82855
82856             currentTableNode = utils.createElement("table", {
82857                 "class": constants.UI.PANEL_TABLE_CLASS
82858             });
82859
82860             _contentContainer.appendChild(currentTableNode);
82861
82862             utils.forEach(settingSection, function (setting, key) {
82863                 if (typeof setting === "object") {
82864                     currentTableNode.appendChild(_buildDOMNode(setting, settingType, key));
82865                 }
82866
82867             });
82868         });
82869     }
82870 };
82871
82872 });
82873 define('ripple/ui/plugins/configWindow', function (require, exports, module) {
82874 /*
82875  *  Copyright 2011 Research In Motion Limited.
82876  *
82877  * Licensed under the Apache License, Version 2.0 (the "License");
82878  * you may not use this file except in compliance with the License.
82879  * You may obtain a copy of the License at
82880  *
82881  * http://www.apache.org/licenses/LICENSE-2.0
82882  *
82883  * Unless required by applicable law or agreed to in writing, software
82884  * distributed under the License is distributed on an "AS IS" BASIS,
82885  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
82886  * See the License for the specific language governing permissions and
82887  * limitations under the License.
82888  */
82889 var utils = require('ripple/utils'),
82890     db = require('ripple/db'),
82891     tooltip = require('ripple/ui/plugins/tooltip'),
82892     platform = require('ripple/platform'),
82893     items = [{name: "DEVICE", id: "device-conf-panel"},
82894              {name: "SYSTEM SETTINGS", id: "system-settings-conf-panel"},
82895              {name: "NETWORK", id: "network-conf-panel"}
82896             ],
82897     _KEY = "tizen-configuration-window-setting",
82898     _PERSISTENCE_KEY = "devicesettings",
82899     _DEVICESETTING_SAVE_KEY = "tizen-configuration-window-device-setting",
82900     _DB_APPLICATION_KEY = "tizen1-db-application",
82901     _DB_APPLICATION_SAVE_KEY = "tizen-configuration-window-application-key";
82902
82903 function reload() {
82904     window.tinyHipposReload = true;
82905     location.reload();
82906 }
82907
82908 function _hideConfigWindow() {
82909     $("#configure-window-popup").hide("slide", {direction: "up"}, "slow");
82910     $("#overlayBackground").hide("fade", "slow");
82911 }
82912
82913 function _cancelConfig() {
82914     $("#platform-select").val(platform.current().id);
82915     $("#platform-select").trigger("change");
82916
82917     _hideConfigWindow();
82918 }
82919
82920 function checkResolutionValue(val) {
82921     var ret = false;
82922     if (val >= 200 && val <= 2000) {
82923         ret = true;
82924     }
82925     return ret;
82926 }
82927
82928 function _showConfigWindow() {
82929     var position_x;
82930     $("#item_container").empty();
82931     items.forEach(function (item) {
82932         $("#item_container").append('<div class="configuration-window-item">' + item.name + '</div>');
82933         $("#" + item.id).hide();
82934     });
82935
82936     $("#content_container").show();
82937     $("#" + items[0].id).show("fast");
82938
82939     $(".configuration-window-item:eq(0)").css("background-color", "#003399");
82940     $(".configuration-window-item:eq(0)").css("color", "#ffffff");
82941
82942     $(".configuration-window-item").unbind('click');
82943     $(".configuration-window-item").bind("click", function () {
82944         $(".configuration-window-item").css("background-color", "#eeeeee");
82945         $(".configuration-window-item").css("color", "#333333");
82946
82947         $(this).css("background-color", "#003399");
82948         $(this).css("color", "#ffffff");
82949
82950         items.forEach(function (item) {
82951             $("#" + item.id).hide();
82952         });
82953         $("#" + items[$(this).index()].id).show("fast");
82954     });
82955
82956     if ($("#configure-window-popup").is(":visible")) {
82957         $("#configure-window-popup").hide("slide", {direction: "up"}, "slow");
82958         $("#overlayBackground").hide("fade", "slow");
82959         return;
82960     }
82961
82962     position_x = (($(window).width() - 800) / 2)  < 0 ? 0 : ($(window).width() - 800) / 2;
82963     $("#configure-window-popup").css("top", 80);
82964     $("#configure-window-popup").css("left", position_x);
82965
82966     position_x = (($(window).width() - 400) / 2)  < 0 ? 0 : ($(window).width() - 400) / 2;
82967     $("#configure-window-done-popup").css("top", 80);
82968     $("#configure-window-done-popup").css("left", position_x);
82969
82970     $("#overlayBackground").css("width", $(window).width());
82971     $("#overlayBackground").css("height", $(window).height());
82972     $("#overlayBackground").show("fade", "slow");
82973     $("#configure-window-popup").show("slide", {direction: "up"}, "slow");
82974
82975     $("#configuration-window-done-btn").unbind('click');
82976     $("#configuration-window-done-btn").bind("click", function () {
82977         var platformId, version, device, type, width, height, url;
82978
82979         // device & resolution setting
82980         platformId = jQuery("#platform-select").val();
82981         version = jQuery("#version-select").val();
82982         device = jQuery("#device-select").val();
82983         width = jQuery("#resolution-custom-width").val();
82984         height = jQuery("#resolution-custom-height").val();
82985         type = jQuery('input:radio[name="resolution-type"]:checked').val();
82986
82987         if (type === "custom") {
82988             device = "custom";
82989             if (!checkResolutionValue(width) || !checkResolutionValue(height)) {
82990                 return;
82991             }
82992         }
82993
82994         if (platformId === "mobile" || platformId === "tizen") {
82995             platformId = "tizen";
82996             version = "2.0";
82997         }
82998         else {
82999             platformId = "ivi";
83000             version = "3.0";
83001         }
83002
83003         platform.changeEnvironment({
83004             "name": platformId,
83005             "version": version
83006         }, device, function () {
83007             _hideConfigWindow();
83008             window.tinyHipposReload = true;
83009             url = location.href.replace(/&platform=(.+?)-(.+?)$/, "&platform=" + platformId + "-" + version);
83010             location.href = url;
83011             //reload();
83012         });
83013     });
83014
83015     $("#configuration-window-close-btn").unbind('click');
83016     $("#configuration-window-close-btn").bind("click", function () {
83017         if ($("#configure-window-popup").is(":visible")) {
83018             _cancelConfig();
83019             return;
83020         }
83021     });
83022     tooltip.create("#configuration-window-save-btn", "Save Configuration");
83023     $("#configuration-window-save-btn").unbind('click');
83024     $("#configuration-window-save-btn").bind("click", function () {
83025         var _type, _device, _custom_width = 0, _custom_height = 0, programs, deviceInfo, _settings;
83026
83027         deviceInfo = db.retrieveObject(_PERSISTENCE_KEY);
83028         db.saveObject(_DEVICESETTING_SAVE_KEY, deviceInfo);
83029
83030         _device = jQuery("#device-select").val();
83031         _type = jQuery('input:radio[name="resolution-type"]:checked').val();
83032         if (_type === "custom") {
83033             _device = "custom";
83034             _custom_width = jQuery("#resolution-custom-width").val();
83035             _custom_height = jQuery("#resolution-custom-height").val();
83036         }
83037         _settings = {
83038             platformId : jQuery("#platform-select").val(),
83039             version : jQuery("#version-select").val(),
83040             device : _device,
83041             type : _type,
83042             custom_width : _custom_width,
83043             custom_height : _custom_height
83044         };
83045         db.saveObject(_KEY, _settings);
83046         programs = db.retrieveObject(_DB_APPLICATION_KEY);
83047         db.saveObject(_DB_APPLICATION_SAVE_KEY, programs);
83048     });
83049     tooltip.create("#configuration-window-load-btn", "Load Configuration");
83050     $("#configuration-window-load-btn").unbind('click');
83051     $("#configuration-window-load-btn").bind("click", function () {
83052         var platformList,
83053             deviceInfo,
83054             _settings,
83055             versionSelect = document.getElementById("version-select");
83056         if (db.retrieveObject(_DEVICESETTING_SAVE_KEY) === undefined) {
83057             //Never saving data exist
83058             return;
83059         }
83060         //reload system & network setting
83061         deviceInfo = db.retrieveObject(_DEVICESETTING_SAVE_KEY);
83062         db.saveObject("devicesettings", deviceInfo);
83063         jQuery("#devicesettings-content-container").empty();
83064         jQuery("#networksettings-content-container").empty();
83065         require('ripple/deviceSettings').initialize();
83066         require('ripple/ui/plugins/deviceSettings').terminate();
83067         require('ripple/ui/plugins/deviceSettings').initialize();
83068
83069         //reload device setting
83070         jQuery(versionSelect).empty();
83071         _settings = db.retrieveObject(_KEY);
83072         jQuery("#platform-select").val(_settings.platformId);
83073         jQuery("#device-select").val(_settings.device);
83074         if (_settings.type === "custom") {
83075             $('input:radio[name="resolution-type"][value="custom"]').click();
83076             jQuery("#resolution-custom-width").val(parseInt(_settings.custom_width, 10));
83077             jQuery("#resolution-custom-height").val(parseInt(_settings.custom_height, 10));
83078         } else {
83079             $('input:radio[name="resolution-type"][value="predefined"]').click();
83080         }
83081
83082         platformList = platform.getList();
83083         utils.forEach(platformList, function (platform) {
83084             utils.forEach(platform, function (version, versionNumber) {
83085                 if (_settings.platformId === version.id) {
83086                     versionSelect.appendChild(utils.createElement("option", {
83087                         "innerText": versionNumber,
83088                         "value":  versionNumber
83089                     }));
83090                 }
83091             });
83092         });
83093         jQuery("#version-select").val(_settings.version);
83094     });
83095
83096     $(window).bind('resize', function () {
83097         var position_x = 0;
83098         $("#configure-window-popup").css("top", 80);
83099         position_x = (($(window).width() - 800) / 2)  < 0 ? 0 : ($(window).width() - 800) / 2;
83100         $("#configure-window-popup").css("left", position_x);
83101
83102         $("#configure-window-done-popup").css("top", 180);
83103         position_x = (($(window).width() - 400) / 2)  < 0 ? 0 : ($(window).width() - 400) / 2;
83104         $("#configure-window-done-popup").css("left", position_x);
83105
83106         $("#overlayBackground").css("width", $(window).width());
83107         $("#overlayBackground").css("height", $(window).height());
83108     });
83109
83110     if (jQuery("#platform-select").val() === "ivi") {
83111         jQuery("#configuration-window-save-btn").hide();
83112         jQuery("#configuration-window-load-btn").hide();
83113
83114         jQuery("#item_container :nth-child(2)").hide();
83115         jQuery("#item_container :nth-child(3)").hide();
83116
83117         //jQuery("#hwkeys-panel").hide();
83118     }
83119     else {
83120         jQuery("#configuration-window-save-btn").show();
83121         jQuery("#configuration-window-load-btn").show();
83122
83123         jQuery("#item_container :nth-child(2)").show();
83124         jQuery("#item_container :nth-child(3)").show();
83125
83126         //jQuery("#hwkeys-panel").show();
83127     }
83128 }
83129
83130 module.exports = {
83131     initialize: function () {
83132         if (platform.current().id === "cordova") {
83133             items.splice(1, 1);
83134         }
83135         $("#options-button-config-window").bind("click", function ()  {
83136             _showConfigWindow();
83137         });
83138     }
83139 };
83140
83141 });
83142 define('ripple/ui/plugins/firstRunCheck', function (require, exports, module) {
83143 /*
83144  *  Copyright 2011 Research In Motion Limited.
83145  *
83146  * Licensed under the Apache License, Version 2.0 (the "License");
83147  * you may not use this file except in compliance with the License.
83148  * You may obtain a copy of the License at
83149  *
83150  * http://www.apache.org/licenses/LICENSE-2.0
83151  *
83152  * Unless required by applicable law or agreed to in writing, software
83153  * distributed under the License is distributed on an "AS IS" BASIS,
83154  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
83155  * See the License for the specific language governing permissions and
83156  * limitations under the License.
83157  */
83158 var utils = require('ripple/utils'),
83159     _platform = require('ripple/platform'),
83160     db = require('ripple/db');
83161
83162 function _handleFirstRunResponse(platform, version) {
83163     var device = jQuery("#device-select").val(),
83164         api = {
83165             name: platform.id,
83166             version: version
83167         };
83168
83169
83170     _platform.changeEnvironment(api, device, function () {
83171         window.tinyHipposReload = true;
83172         location.reload();
83173     });
83174 }
83175
83176 function _addPlatformButton(platform, version) {
83177     var section = jQuery(".platform-select-buttons"),
83178         buttonID = "platform-" + platform.id,
83179         button = utils.createElement("button", {
83180             "id": buttonID,
83181             "class": "ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"
83182         });
83183
83184     button.appendChild(utils.createElement("span", {
83185         "class": "ui-button-text",
83186         "innertext" : platform.name
83187     }));
83188
83189     section.append(button);
83190
83191     document.getElementById(buttonID).addEventListener("click", function () {
83192         _handleFirstRunResponse(platform, version);
83193     });
83194 }
83195
83196 function _initializeFirstRunCheck() {
83197     var savedPlatform = db.retrieveObject("api-key"),
83198         firstRunOverlayNode, firstRunOptionsNode,
83199         width, p;
83200
83201     if (!savedPlatform) {
83202         width = jQuery(document).width();
83203         p = (width / 2) - 277;
83204
83205         firstRunOverlayNode = jQuery(".first-run-window").css({display: 'block'});
83206         firstRunOptionsNode = jQuery(".platform-select-dialog").css({display: 'block', left: p + "px"});
83207
83208         utils.forEach(_platform.getList(), function (platform) {
83209             utils.forEach(platform, function (details, version) {
83210                 _addPlatformButton(details, version);
83211             });
83212         });
83213     }
83214 }
83215
83216 module.exports = {
83217     initialize: function () {
83218         if (utils.map(_platform.getList(), function (platform) {
83219             return platform;
83220         }).length > 1) {
83221             _initializeFirstRunCheck();
83222         }
83223     }
83224 };
83225
83226 });
83227 define('ripple/ui/plugins/themeSwitcher', function (require, exports, module) {
83228 /*
83229  *  Copyright 2011 Research In Motion Limited.
83230  *
83231  * Licensed under the Apache License, Version 2.0 (the "License");
83232  * you may not use this file except in compliance with the License.
83233  * You may obtain a copy of the License at
83234  *
83235  * http://www.apache.org/licenses/LICENSE-2.0
83236  *
83237  * Unless required by applicable law or agreed to in writing, software
83238  * distributed under the License is distributed on an "AS IS" BASIS,
83239  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
83240  * See the License for the specific language governing permissions and
83241  * limitations under the License.
83242  */
83243 var utils = require('ripple/utils'),
83244     db = require('ripple/db'),
83245     THEME_KEY = "ui-theme",
83246     THEME_SELECTOR = "#theme-select",
83247     _currentTheme;
83248
83249 function _saveAndReload(key, value) {
83250     jWorkflow.order(function (prev, baton) {
83251                 baton.take();
83252                 db.save(key, value, null, baton.pass);
83253             }).start(function () {
83254                 window.tinyHipposReload = true;
83255                 location.reload();
83256             });
83257 }
83258
83259 module.exports = {
83260     initialize: function () {
83261         var themeToSet = db.retrieve(THEME_KEY);
83262
83263         // Hide the theme switcher and always set the theme to light
83264         jQuery(".theme-switcher").hide();
83265                 if (themeToSet !== "light") {
83266             _saveAndReload(THEME_KEY, "light");
83267                 }
83268                 return;
83269     }
83270 };
83271
83272 });
83273 define('ripple/ui/plugins/about-dialog', function (require, exports, module) {
83274 /*
83275  *  Copyright 2011 Research In Motion Limited.
83276  *
83277  * Licensed under the Apache License, Version 2.0 (the "License");
83278  * you may not use this file except in compliance with the License.
83279  * You may obtain a copy of the License at
83280  *
83281  * http://www.apache.org/licenses/LICENSE-2.0
83282  *
83283  * Unless required by applicable law or agreed to in writing, software
83284  * distributed under the License is distributed on an "AS IS" BASIS,
83285  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
83286  * See the License for the specific language governing permissions and
83287  * limitations under the License.
83288  */
83289 var bus = require('ripple/bus');
83290
83291 module.exports = {
83292     initialize: function () {
83293         $("#about-dialog").dialog({
83294             resizable: false,
83295             draggable: false,
83296             modal: true,
83297             autoOpen: false,
83298             position: 'center',
83299             minWidth: '464',
83300             minHeight: '262'
83301         });
83302     },
83303     show: function () {
83304         //TODO: Restore this line once framework issue is resolved
83305         //var port =  window.stagewebview ? stagewebview.serverPort : "9900";
83306         var port = "9910";
83307
83308         bus.send("version", null, function (resp) {
83309             $("#about-dialog-ripple-ui-version").html("(v" + resp + ")");
83310         });
83311
83312         bus.ajax(
83313             "GET",
83314             "http://127.0.0.1:" + port + "/ripple/about",
83315             null,
83316             function (resp) {
83317                 $("#about-dialog-ripple-build-deploy-version").html("(v" + resp.data.version + ")");
83318             },
83319             function (error) {
83320                 var version = error.data;
83321                 
83322                 if (error.code === 0 || error.code === 404) {
83323                     version = "The service is not running";
83324                 }
83325                 $("#about-dialog-ripple-build-deploy-version").html("(" + version + ")");
83326             }
83327         );
83328
83329         $("#about-dialog").dialog("open");
83330     }
83331 };
83332
83333 });
83334 define('ripple/ui/plugins/videoPlayer', function (require, exports, module) {
83335 /*
83336  *  Copyright 2011 Research In Motion Limited.
83337  *
83338  * Licensed under the Apache License, Version 2.0 (the "License");
83339  * you may not use this file except in compliance with the License.
83340  * You may obtain a copy of the License at
83341  *
83342  * http://www.apache.org/licenses/LICENSE-2.0
83343  *
83344  * Unless required by applicable law or agreed to in writing, software
83345  * distributed under the License is distributed on an "AS IS" BASIS,
83346  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
83347  * See the License for the specific language governing permissions and
83348  * limitations under the License.
83349  */
83350 var constants = require('ripple/constants'),
83351     event = require('ripple/event');
83352
83353 module.exports = {
83354     initialize: function () {
83355         var videoObj,
83356             videoProgress = document.getElementById(constants.COMMON.MULTIMEDIA_VIDEO_PROGRESS_ID);
83357
83358         event.on("MultimediaAppVideoPlayerCreated", function (videoDOMObj) {
83359             videoObj = videoDOMObj;
83360
83361             videoObj.addEventListener("timeupdate", function () {
83362                 var s = parseInt(videoObj.currentTime % 60, 10),
83363                     m = parseInt((videoObj.currentTime / 60) % 60, 10);
83364
83365                 videoProgress.innerText = ((m > 9) ? m  : "0" + m) + ':' + ((s > 9) ? s  : "0" + s);
83366             }, false);
83367         });
83368
83369         event.on("MultimediaVolumeChanged", function (volume) {
83370             if (videoObj) {
83371                 videoObj.volume = parseFloat(volume / 10);
83372             }
83373         });
83374
83375         event.on("MultimediaVideoStateChanged", function (state) {
83376             document.getElementById(constants.COMMON.MULTIMEDIA_VIDEO_STATE_FIELD_ID).innerText = state;
83377             document.getElementById(constants.COMMON.MULTIMEDIA_VIDEO_FILE_FIELD_ID).innerText = videoObj.getAttribute("src");
83378         });
83379     }
83380 };
83381
83382 });
83383 define('ripple/ui/plugins/information', function (require, exports, module) {
83384 /*
83385  *  Copyright 2011 Research In Motion Limited.
83386  *
83387  * Licensed under the Apache License, Version 2.0 (the "License");
83388  * you may not use this file except in compliance with the License.
83389  * You may obtain a copy of the License at
83390  *
83391  * http://www.apache.org/licenses/LICENSE-2.0
83392  *
83393  * Unless required by applicable law or agreed to in writing, software
83394  * distributed under the License is distributed on an "AS IS" BASIS,
83395  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
83396  * See the License for the specific language governing permissions and
83397  * limitations under the License.
83398  */
83399 var constants = require('ripple/constants'),
83400     devices = require('ripple/devices'),
83401     event = require('ripple/event'),
83402     platform = require('ripple/platform'),
83403     utils = require('ripple/utils'),
83404     app = require('ripple/app'),
83405     tooltip = require('ripple/ui/plugins/tooltip'),
83406     db = require('ripple/db');
83407
83408 function _updateInformationView() {
83409     var infoPane = document.getElementById(constants.COMMON.INFO_SECTION),
83410         infoList = [],
83411         device = devices.getCurrentDevice(),
83412         tempString = "",
83413         widgetInfo = app.getInfo(),
83414         layout = db.retrieve("layout") || "portrait",
83415         _systemSettings = db.retrieveObject("tizen2-systemsetting") || {"HOME_SCREEN": "", "LOCK_SCREEN": "", "INCOMING_CALL": "", "NOTIFICATION_EMAIL": ""};
83416
83417     //TODO: refactor this stuff to grab info from API, do this in a loop rather then hardcoded. Better DOM injection approach. This is legacy code
83418
83419     infoList.push('<section id=\"information-banner\" style=\"display:none\"><img id=\"information-banner-icon\" width=\"16px\" height=\"16px\"/> <span id=\"information-banner-count\"></span></section>');
83420
83421     if (widgetInfo.icon) {
83422         infoList.push('<section style="position: absolute; left: 260px;"  class="information-widgeticon"><img class="ui-corner-all" width="64" src="' + utils.appLocation() + widgetInfo.icon + '" alt="widget icon"/></section>');
83423     }
83424     if (widgetInfo.name) {
83425         infoList.push("<section><div id=\"systemSummaryAppNameContainer\" style=\"width:240px; height:20px; overflow:hidden; white-space: nowrap; text-overflow: ellipsis;\" ><label class=\"ui-text-label\">App Name: </label><span class=\"text-is-selectable\">" + widgetInfo.name + "</span></div></section>");
83426         //Update Title
83427         document.title = "Web Simulator - " + widgetInfo.name;
83428     }
83429
83430     infoList.push('<table class="tf_panel-table" style="border-spacing: 0px;">');
83431    
83432     if (widgetInfo.version) {
83433         infoList.push('<section class="information-widgetversion"><label class=\"ui-text-label\">Version: </label><span class="text-is-selectable">' + widgetInfo.version + '</span></section>');
83434     }
83435     infoList.push("<section><label class=\"ui-text-label\">Platform: </label><span class=\"text-is-selectable\">" + platform.current().name + "</span></section>");
83436     infoList.push("<section><label class=\"ui-text-label\">Device: </label><span class=\"text-is-selectable\">" + device.name + "</span></section>");
83437     infoList.push("<section><label class=\"ui-text-label\">OS: </label><span class=\"text-is-selectable\">" + device.osName + " " + device.osVersion + "</span></section>");
83438     infoList.push("<section><label class=\"ui-text-label\">Manufacturer: </label><span class=\"text-is-selectable\">" + device.manufacturer + "</span></section>");
83439     infoList.push("<section><label class=\"ui-text-label\">Screen: </label><span class=\"text-is-selectable\">" + device.screen.width + "x" + device.screen.height + "</span></section>");
83440     infoList.push("<section><label class=\"ui-text-label\">Viewport: </label><span class=\"text-is-selectable\">" + device.viewPort[layout].width.toFixed(0) + "x" + device.viewPort[layout].height.toFixed(0) + "</span></section>");
83441     infoList.push("<section><label class=\"ui-text-label\">Density: </label><span class=\"text-is-selectable\">" + device.ppi + " PPI</span></section>");
83442     infoList.push("<section><label class=\"ui-text-label\" style=\"float:left; padding-top: 0px; \">User Agent: </label>" +
83443                     "<div class=\"text-is-selectable\" style=\"padding-left: 80px\">" + device.userAgent + "</div></section>");
83444
83445     if (device.notes) {
83446         utils.forEach(device.notes, function (note) {
83447             tempString += "<li class=\"text-is-selectable\">" + note + "</li>";
83448         });
83449         infoList.push("<section><div style=\"clear:both;\"></div><label class=\"ui-text-label\">Notes: </label><ul>" + tempString + "</ul></section>");
83450     }
83451
83452     infoList.push("<section><div style=\"clear:both;\"></div><div id=\"systemSummaryHomeScreenContainer\" style=\"width:320px; height:20px; overflow:hidden; white-space: nowrap; text-overflow: ellipsis;\" ><label class=\"ui-text-label\">Home Screen Image: </label><span>" + _systemSettings["HOME_SCREEN"] + "</span></div></section>");
83453     infoList.push("<section><div style=\"clear:both;\"></div><div id=\"systemSummaryLockScreenContainer\" style=\"width:320px; height:20px; overflow:hidden; white-space: nowrap; text-overflow: ellipsis;\" ><label class=\"ui-text-label\">Lock Screen Image: </label><span>" + _systemSettings["LOCK_SCREEN"] + "</span></div></section>");
83454     infoList.push("<section><div style=\"clear:both;\"></div><div id=\"systemSummaryInComingCallContainer\" style=\"width:320px; height:20px; overflow:hidden; white-space: nowrap; text-overflow: ellipsis;\" ><label class=\"ui-text-label\">Incoming Call Number: </label><span>" + _systemSettings["INCOMING_CALL"] + "</span></div></section>");
83455     infoList.push("<section><div style=\"clear:both;\"></div><div id=\"systemSummaryNotiEMailContainer\" style=\"width:320px; height:20px; overflow:hidden; white-space: nowrap; text-overflow: ellipsis;\" ><label class=\"ui-text-label\">Notification Email: </label><span>" + _systemSettings["NOTIFICATION_EMAIL"] + "</span></div></section>");
83456     infoList.push("<section><div style=\"clear:both;\"></div><div id=\"NFCExclusiveModeContainer\" style=\"width:320px; height:20px; overflow:hidden; white-space: nowrap; text-overflow: ellipsis;\" ><label class=\"ui-text-label\">NFC Exclusive Mode: </label><span id=\"NFCExclusiveModeValue\">false</span></div></section>");
83457     infoPane.innerHTML = infoList.join("");
83458
83459     // Make tooltip if it needed
83460     if ((jQuery("#systemSummaryAppNameContainer").children("label").width() + jQuery("#systemSummaryAppNameContainer").children("span").width()) > 240) {
83461         tooltip.create("#systemSummaryAppNameContainer", jQuery("#systemSummaryAppNameContainer").children("span").text());
83462     }
83463     if ((jQuery("#systemSummaryHomeScreenContainer").children("label").width() + jQuery("#systemSummaryHomeScreenContainer").children("span").width()) > 320) {
83464         tooltip.create("#systemSummaryHomeScreenContainer", jQuery("#systemSummaryHomeScreenContainer").children("span").text());
83465     }
83466     if ((jQuery("#systemSummaryLockScreenContainer").children("label").width() + jQuery("#systemSummaryLockScreenContainer").children("span").width()) > 320) {
83467         tooltip.create("#systemSummaryLockScreenContainer", jQuery("#systemSummaryLockScreenContainer").children("span").text());
83468     }
83469     if ((jQuery("#systemSummaryInComingCallContainer").children("label").width() + jQuery("#systemSummaryInComingCallContainer").children("span").width()) > 320) {
83470         tooltip.create("#systemSummaryInComingCallContainer", jQuery("#systemSummaryInComingCallContainer").children("span").text());
83471     }
83472     if ((jQuery("#systemSummaryNotiEMailContainer").children("label").width() + jQuery("#systemSummaryNotiEMailContainer").children("span").width()) > 320) {
83473         tooltip.create("#systemSummaryNotiEMailContainer", jQuery("#systemSummaryNotiEMailContainer").children("span").text());
83474     }
83475 }
83476
83477 function _updateBanner(icon, count) {
83478     var bannerSection = document.getElementById("information-banner"),
83479         iconImg  = document.getElementById("information-banner-icon"),
83480         countSpan = document.getElementById("information-banner-count");
83481
83482     if (icon && (count === undefined || count !== 0)) {
83483         count = count || "";
83484         jQuery("#" + constants.COMMON.INFO_SECTION).show();
83485         jQuery(bannerSection).fadeToggle(1000);
83486         jQuery(bannerSection).fadeIn(1000);
83487     }
83488     else {
83489         jQuery(bannerSection).fadeOut(1000);
83490     }
83491
83492     iconImg.src = utils.appLocation() + icon;
83493     if (icon.indexOf("http") === 0) {
83494         iconImg.src = icon;
83495     }
83496
83497     countSpan.innerHTML = count > 99 ? "99+" : count;
83498 }
83499
83500 module.exports = {
83501     panel: {
83502         domId: "information-container",
83503         collapsed: false,
83504         pane: "left",
83505         titleName: "System Summary",
83506         display: true
83507     },
83508     initialize: function () {
83509         event.on("BannerUpdated", function (icon, count) {
83510             _updateBanner(icon, count);
83511         });
83512
83513         event.on("PlatformChangedEvent", function () {
83514             _updateInformationView();
83515         });
83516
83517         event.on("WidgetInformationUpdated", function () {
83518             _updateInformationView();
83519         });
83520         
83521         event.on("SystemSettingChanged", function () {
83522             _updateInformationView();
83523         });
83524
83525         event.on("ScreenChangeDimensions", function() {
83526             _updateInformationView();
83527         });
83528         _updateInformationView();
83529     }
83530 };
83531
83532 });
83533 define('ripple/ui/plugins/vehicle', function (require, exports, module) {
83534 /*
83535  *  Copyright 2013 Research In Motion Limited.
83536  *
83537  * Licensed under the Apache License, Version 2.0 (the "License");
83538  * you may not use this file except in compliance with the License.
83539  * You may obtain a copy of the License at
83540  *
83541  * http://www.apache.org/licenses/LICENSE-2.0
83542  *
83543  * Unless required by applicable law or agreed to in writing, software
83544  * distributed under the License is distributed on an "AS IS" BASIS,
83545  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
83546  * See the License for the specific language governing permissions and
83547  * limitations under the License.
83548  */
83549 var event = require('ripple/event'),
83550     exception = require('ripple/exception'),
83551     vehiclePanelEngine = require('ripple/platform/ivi/3.0/VehiclePanelEngine').VehiclePanelEngine,
83552     _vehicleGlobalVars = {
83553         currentAutoStatus: false,
83554         currentDataIndex: 0,
83555         timeFlag: null,
83556         timeInterval: 1000, //ms
83557         timeCurrent: 0,
83558         timeHistoryArray: [],
83559         timeHistoryLimit: 60 * 60,
83560         registerListeners: {},
83561         vehicleCache: {},
83562         history: {},
83563         notShowProperties: [
83564             "zone", "time", "source"
83565         ]
83566     };
83567
83568 function _interceptString (str, length) {
83569     return str.length > length ? str.substring(0, length) + "...": str;
83570 }
83571
83572 function _setVehicleConfigurationSel (configuration) {
83573     var selContainer = jQuery("#vehicle-container #vehicle-configuration-types"),
83574         html = "", i = 0;
83575
83576     for (var value in configuration) {
83577         html += '<option value="' + value + '">' +
83578             'Car ' + i +
83579             '</option>';
83580
83581         i++;
83582     }
83583
83584     selContainer.html(html);
83585 }
83586
83587 function _setVehicleConfiguration (configuration, currentType) {
83588     var container = jQuery("#vehicle-container #vehicle-configuration-show"),
83589         selContainer = jQuery("#vehicle-container #vehicle-configuration-types"),
83590         current, property, propertyList, item, unit, html = "", i,
83591         enums, showValue;
83592
83593     if (currentType !== selContainer.val()) {
83594         for (i = 0; i < selContainer[0].options.length; i++) {
83595             if (selContainer[0].options[i].value === currentType) {
83596                 selContainer[0].selectedIndex = i;
83597                 break;
83598             }
83599         }
83600         if (i >= selContainer[0].options.length ) {
83601             throw "undefined configuration: " + currentType + ".";
83602         }
83603     }
83604
83605     current = configuration[currentType];
83606     if (!current) {
83607         throw "undefined configuration: " + currentType + ".";
83608     }
83609
83610     for (property in current) {
83611         html += '<tr><td colspan="2" class="vehicle-property-header">' + property + '</td></tr>';
83612
83613         propertyList = current[property];
83614         for (item in propertyList) {
83615             showValue = propertyList[item];
83616             unit = vehiclePanelEngine.getPropertyUnit(property, item);
83617             enums = vehiclePanelEngine.getPropertyConstant(property, item);
83618             if (enums) {
83619                 showValue = enums["val" + showValue];
83620             }
83621
83622             html += '<tr class="vehicle-property-content">' +
83623                 '<td class="vehicle-property-label"> ' + item + unit + '</td>' +
83624                 '<td class="vehicle-property-value" id="' + property + '-' + item + '-show">' + showValue + '</td>' +
83625                 '<td style="display: none;">' +
83626                 '<input id="' + property + '-' + item + '-set" type="hidden" ' + 'value="' + propertyList[item] + '" />' +
83627                 '</td></tr>';
83628         }
83629     }
83630
83631     container.html(html);
83632     return;
83633 }
83634
83635 function _setVehicleSupported (properties, supported) {
83636     var hideContainer = jQuery("#vehicle-container #vehicle-supported-hide"),
83637         showContainer = jQuery("#vehicle-container #vehicle-supported-show"),
83638         hideHtml = "", showHtml = "", tempHtml, column = 0, columnNum = 3, className,
83639         i, property, propertyAbbr;
83640
83641     for (i = 0; i < properties.length; i++) {
83642         property = properties[i];
83643         propertyAbbr = _interceptString(property, 12);
83644
83645         if (supported.indexOf(property) > -1) {
83646             className = "vehicle-property-supported";
83647             hideHtml += '<input type="checkbox" id="' + property + '-supported" value="' + property + '" checked="checked" />';
83648         }
83649         else {
83650             className = "vehicle-property-unsupported";
83651             hideHtml += '<input type="checkbox" id="' + property + '-supported" value="' + property + '" />';
83652         }
83653
83654         tempHtml = '<td id="' + property + '-supported-show" ' + 'class="' + className + '" title="' + property + '">' + propertyAbbr + '</td>';
83655
83656         if (column % columnNum === 0) {
83657             showHtml += '<tr>' + tempHtml;
83658         }
83659         else if (column % columnNum === (columnNum - 1)){
83660             showHtml += tempHtml + '</tr>';
83661         }
83662         else {
83663             showHtml += tempHtml;
83664         }
83665         column++;
83666     }
83667
83668     hideContainer.html(hideHtml);
83669     showContainer.html(showHtml);
83670 }
83671
83672 function _setVehicleSetting (settings) {
83673     var settingContainer = jQuery("#vehicle-container #vehicle-setting-show"),
83674         property, propertyItems, item, html = "", unit, range,
83675         optionHtml = "", i, optionName, option, options;
83676
83677     for (property in settings) {
83678         html += '<tr><td colspan="2" class="vehicle-property-header">' + property + '</td></tr>';
83679
83680         propertyItems = settings[property];
83681         for (item in propertyItems) {
83682             unit = vehiclePanelEngine.getPropertyUnit(property, item);
83683
83684             if (propertyItems[item].type === "radio" || propertyItems[item].type === "select") {
83685                 optionHtml = "";
83686                 options = propertyItems[item].options;
83687                 for (i = 0; i < options.length; i++) {
83688                     option = options[i];
83689                     for (optionName in option) {
83690                         if (option[optionName].toString() === propertyItems[item].value.toString()) {
83691                             optionHtml += '<option value="' + option[optionName] + '" selected>' +
83692                                 optionName + '</option>';
83693                         }
83694                         else {
83695                             optionHtml += '<option value="' + option[optionName] + '">' +
83696                                 optionName + '</option>';
83697                         }
83698                         break;
83699                     }
83700                 }
83701                 html += '<tr class="vehicle-property-content">' +
83702                     '<td class="vehicle-property-label" title="' + item + unit  + '">' + _interceptString(item + unit, 18)  + '</td>' +
83703                     '<td class="vehicle-property-value">' +
83704                     '<select id="' + property + '-' + item + '-set">' + optionHtml + '</select>' +
83705                     '</td></tr>';
83706             }
83707             else if (propertyItems[item].type === "range") {
83708                 range = vehiclePanelEngine.getPropertyRange(property, item);
83709
83710                 html += '<tr class="vehicle-property-content">' +
83711                     '<td class="vehicle-property-label" title="' + item + unit  + '">' + _interceptString(item + unit, 18)  + '</td>' +
83712                     '<td class="vehicle-property-value">' +
83713                     '<label id="' + property + '-' + item + '-num">' + propertyItems[item].value + '</label>' +
83714                     '<input id="' + property + '-' + item + '-set" type="range" value="' + propertyItems[item].value + '"' +
83715                         ' min="' + range[0] + '" max="' + range[1] + '" step="' + range[2] + '" class="vehicle-property-range" />' +
83716                     '</td></tr>';
83717             }
83718             else if (propertyItems[item].type === "text") {
83719                 html += '<tr class="vehicle-property-content">' +
83720                     '<td class="vehicle-property-label" title="' + item + unit  + '">' + _interceptString(item + unit, 18)  + '</td>' +
83721                     '<td class="vehicle-property-value">' +
83722                     '<input id="' + property + '-' + item + '-set" type="text" value="' + propertyItems[item].value + '" />' +
83723                     '</td></tr>';
83724             }
83725         }
83726     }
83727
83728     settingContainer.html(html);
83729 }
83730
83731 function _addArrayValueEnter (property, item, value) {
83732     var itemValue, html = "", i,
83733         id = property + '-' + item + "-set";
83734
83735     itemValue = value.split(",");
83736
83737     if (jQuery("#" + id + "Array") && jQuery("#" + id + "Array").length === 1) {
83738         html += '<td colspan="3">';
83739     }
83740     else {
83741         html += '<tr id="'+ id + 'Array" class="vehicle-property-array">' +
83742             '<td colspan="3">';
83743     }
83744
83745     if (itemValue.length === 0) {
83746         html += '<div class="vehicle-property-arrayItem">' +
83747             '<button>add</button>' +
83748             '<input type="text" value="0" />' +
83749             '<button>del</button>' +
83750             '</div>';
83751     }
83752     else {
83753         for (i = 0; i < itemValue.length; i++) {
83754             if (i === itemValue.length - 1) {
83755                 html += '<div class="vehicle-property-arrayItem">' +
83756                     '<button style="margin-left: -60px;">add</button>' +
83757                     '<input type="text" value="' + itemValue[i] + '" />' +
83758                     '<button >del</button>' +
83759                     '</div>';
83760             }
83761             else {
83762                 html += '<div class="vehicle-property-arrayItem">' +
83763                     '<button style="display: none;">add</button>' +
83764                     '<input type="text" value="' + itemValue[i] + '" />' +
83765                     '<button >del</button>' +
83766                     '</div>';
83767             }
83768         }
83769     }
83770
83771     if (jQuery("#" + id + "Array") && jQuery("#" + id + "Array").length === 1) {
83772         html += '</td>';
83773
83774         jQuery("#" + id + "Array").html(html);
83775     }
83776     else {
83777         html += '</td></tr>';
83778
83779         html += '<tr id="'+ id + 'OK" class="vehicle-property-array">' +
83780             '<td colspan="3">';
83781         html += '<button class="vehicle-property-arrayOk">OK</button>';
83782         html += '</td></tr>';
83783     }
83784
83785     return html;
83786 }
83787
83788 function _setVehicleAutoRunning (autoRunning, isFill) {
83789     var autoContainer = jQuery("#vehicle-container #vehicle-running-show"),
83790         timeStamp, html = "", unit,  range, property, propertyItem, value, data,
83791         showContainer, setContainer, valueField, options, option, optionName, i,
83792         enums, showValue;
83793
83794     timeStamp = (new Date()).getTime();
83795     data = autoRunning["auto" + _vehicleGlobalVars.currentDataIndex];
83796     if (!data) {
83797         _vehicleGlobalVars.currentDataIndex = 0;
83798         data = autoRunning["auto0"];
83799     }
83800     _vehicleGlobalVars.timeCurrent = timeStamp;
83801
83802     if (!isFill) {
83803         html += '<tr class="vehicle-property-content">' +
83804             '<td class="vehicle-property-label">Time</td>' +
83805             '<td class="vehicle-property-value" id="vehicle-time-show">' + timeStamp + '</td></tr>';
83806
83807         for (property in data) {
83808             html += '<tr><td colspan="2" class="vehicle-property-header">' + property + '</td></tr>';
83809
83810             for (propertyItem in data[property]) {
83811                 value = data[property][propertyItem].value;
83812                 unit = vehiclePanelEngine.getPropertyUnit(property, propertyItem);
83813
83814                 if (Object.prototype.toString.call(value) === '[object Array]') {
83815                     value = value.join(",");
83816                 }
83817
83818                 if (data[property][propertyItem].type === "radio" || data[property][propertyItem].type === "select") {
83819                     valueField = "";
83820                     options = data[property][propertyItem].options;
83821                     for (i = 0; i < options.length; i++) {
83822                         option = options[i];
83823                         for (optionName in option) {
83824                             if (option[optionName].toString() === data[property][propertyItem].value) {
83825                                 valueField += '<option value="' + option[optionName] + '" selected>' +
83826                                     optionName + '</option>';
83827                             }
83828                             else {
83829                                 valueField += '<option value="' + option[optionName] + '">' +
83830                                     optionName + '</option>';
83831                             }
83832                             break;
83833                         }
83834                     }
83835
83836                     valueField = '<select id="' + property + '-' + propertyItem + '-set">' + valueField + '</select>';
83837                 }
83838                 else if (data[property][propertyItem].type === "range") {
83839                     range = vehiclePanelEngine.getPropertyRange(property, propertyItem);
83840
83841                     valueField = '<label id="' + property + '-' + propertyItem + '-num">' + value + '</label>' +
83842                         '<input id="' + property + '-' + propertyItem + '-set" type="range" value="' + value + '"' +
83843                         ' min="' + range[0] + '" max="' + range[1] + '" step="' + range[2] + '" class="vehicle-property-range" />';
83844                 }
83845                 else if (data[property][propertyItem].type === "text") {
83846                     valueField = '<input type="text" value="' + value +'" id="' + property + '-' + propertyItem + '-set" disabled />';
83847                 }
83848
83849                 enums = vehiclePanelEngine.getPropertyConstant(property, propertyItem);
83850                 if (enums) {
83851                     showValue = enums["val" + value];
83852                 }
83853
83854                 html += '<tr class="vehicle-property-content">' +
83855                     '<td class="vehicle-property-label" title="' + propertyItem + unit  + '">' + _interceptString(propertyItem + unit, 18) + '</td>' +
83856                     '<td class="vehicle-property-value vehicle-property-value-auto" id="' + property + '-' + propertyItem + '-show">' + showValue + '</td>' +
83857                     '<td class="vehicle-property-value vehicle-property-value-manual">' +
83858                     valueField +
83859                     '</td></tr>';
83860
83861                 if (data[property][propertyItem].type === "text") {
83862                     html += _addArrayValueEnter(property, propertyItem, value);
83863                 }
83864
83865                 if (_vehicleGlobalVars.registerListeners[property]) {
83866                     event.trigger("vehicle-subscribe-request", [property, false, 0]);
83867                 }
83868             }
83869         }
83870
83871         autoContainer.html(html);
83872         _switchAutoManual(false);
83873     }
83874     else {
83875         if (_vehicleGlobalVars.currentAutoStatus) {
83876             for (property in data) {
83877
83878                 for (propertyItem in data[property]) {
83879                     value = data[property][propertyItem].value;
83880
83881                     showContainer = jQuery("#vehicle-container #vehicle-running-show #" + property + '-' + propertyItem + "-show");
83882                     setContainer = jQuery("#vehicle-container #vehicle-running-show #" + property + '-' + propertyItem + "-set");
83883
83884                     if (Object.prototype.toString.call(value) === '[object Array]') {
83885                         value = value.join(",");
83886                     }
83887
83888                     if (data[property][propertyItem].type === "text") {
83889                         _addArrayValueEnter(property, propertyItem, value);
83890                     }
83891
83892                     if (showContainer && setContainer) {
83893                         showContainer.html(value);
83894                         setContainer.val(value);
83895                     }
83896                 }
83897             }
83898         }
83899         else {
83900         }
83901         jQuery("#vehicle-container #vehicle-running-show #vehicle-time-show").html(timeStamp);
83902     }
83903
83904     for (property in _vehicleGlobalVars.registerListeners) {
83905         event.trigger("vehicle-subscribe-request", [property, false, 0]);
83906     }
83907
83908     _saveVehicleData();
83909     _vehicleGlobalVars.currentDataIndex++;
83910 }
83911
83912 function _formatHistory (historyData, time, zone, source) {
83913     var format = {}, property, name, item, value;
83914
83915     for (property in historyData) {
83916         name = property.split("-")[0];
83917         item = property.split("-")[1];
83918
83919         if (!format[name]) {
83920             format[name] = {};
83921             format[name].time = time;
83922             format[name].zone = zone;
83923             format[name].source = source;
83924         }
83925
83926         value = historyData[property];
83927         if (value.indexOf(",") > -1) {
83928             value = value.split(",");
83929         }
83930         if (value === "true") value = true;
83931         if (value === "false") value = false;
83932
83933         format[name][item] = value;
83934     }
83935
83936     return format;
83937 }
83938
83939 function _saveVehicleData () {
83940     var configurationContainer = jQuery("#vehicle-container #vehicle-configuration-show *[id$='-set']"),
83941         currentConfigContainer = jQuery("#vehicle-container #vehicle-configuration-types"),
83942         settingContainer = jQuery("#vehicle-container #vehicle-setting-show  *[id$='-set']"),
83943         autoContainer = jQuery("#vehicle-container #vehicle-running-show  *[id$='-set']"),
83944         supportedContainer = jQuery("#vehicle-container #vehicle-supported-hide  *[id$='-supported']:checked"),
83945         supported = [], currentConfig, configuration = [], setting = [], autoRunning = [],
83946         history = {}, itemKey, format, delTime, time, zone, source;
83947
83948     supportedContainer.each(function (index, item) {
83949         supported.push(item.value);
83950     });
83951
83952     currentConfig = currentConfigContainer.val().replace("configuration", "");
83953
83954     configurationContainer.each(function (index, item) {
83955         itemKey = item.id.replace("-set", "");
83956         history[itemKey] = item.value;
83957
83958         configuration.push(item.value);
83959     });
83960
83961     settingContainer.each(function (index, item) {
83962         itemKey = item.id.replace("-set", "");
83963         history[itemKey] = item.value;
83964
83965         setting.push(item.value);
83966     });
83967
83968     autoContainer.each(function (index, item) {
83969         var value;
83970
83971         value = item.value;
83972         if (item.id.indexOf("TripMeter") > -1) {
83973             value = item.value.split(",");
83974         }
83975
83976         itemKey = item.id.replace("-set", "");
83977         history[itemKey] = value;
83978
83979         autoRunning.push(value);
83980     });
83981
83982     _vehicleGlobalVars.timeHistoryArray.push(_vehicleGlobalVars.timeCurrent);
83983     if (_vehicleGlobalVars.timeHistoryArray.length > _vehicleGlobalVars.timeHistoryLimit) {
83984         delTime = _vehicleGlobalVars.timeHistoryArray.shift();
83985         delete _vehicleGlobalVars.history[delTime];
83986     }
83987
83988     time = _vehicleGlobalVars.timeCurrent;
83989     source = "";
83990     zone = 0;
83991
83992     format = _formatHistory(history, time, zone, source);
83993     _vehicleGlobalVars.history[_vehicleGlobalVars.timeCurrent] = format;
83994     event.trigger("vehicle-cache-refresh", [supported, format]);
83995
83996     vehiclePanelEngine.saveData(supported, currentConfig, configuration, setting, autoRunning);
83997 }
83998
83999 function _switchAutoManual (isAuto) {
84000     var autoContainer = jQuery("#vehicle-container #vehicle-running-show .vehicle-property-value-auto"),
84001         manualContainer = jQuery("#vehicle-container #vehicle-running-show .vehicle-property-value-manual"),
84002         arrayContainer = jQuery("#vehicle-container #vehicle-running-show .vehicle-property-array"),
84003         autoBtnContainer = jQuery("#vehicle-container #vehicle-running-auto");
84004
84005     if (isAuto) {
84006         autoBtnContainer.addClass("vehicle-property-supported");
84007         autoBtnContainer.removeClass("vehicle-property-unsupported");
84008         autoContainer.show();
84009         manualContainer.hide();
84010         arrayContainer.hide();
84011     }
84012     else {
84013         autoBtnContainer.addClass("vehicle-property-unsupported");
84014         autoBtnContainer.removeClass("vehicle-property-supported");
84015         autoContainer.hide();
84016         manualContainer.show();
84017         arrayContainer.show();
84018     }
84019 }
84020
84021 function _addVehicleDomEventListener () {
84022     var configSelection = jQuery("#vehicle-container #vehicle-configuration-types"),
84023         supportedSelection = jQuery("#vehicle-container #vehicle-supported-show td"),
84024         autoSelection = jQuery("#vehicle-container #vehicle-running-auto"),
84025         arraySelection = jQuery("#vehicle-container .vehicle-property-array"),
84026         arrayOKSelection = jQuery("#vehicle-container .vehicle-property-arrayOk"),
84027         rangeSelection = jQuery("#vehicle-container input[type='range']");
84028
84029     arraySelection.delegate("button", "click", function () {
84030         var els = jQuery(this), appHtml;
84031
84032         appHtml = '<div class="vehicle-property-arrayItem">' +
84033             '<button style="margin-left: -60px;">add</button>' +
84034             '<input type="text" value="0" />' +
84035             '<button >del</button>' +
84036             '</div>';
84037
84038         if (els.html() === "add") {
84039             jQuery(appHtml).insertAfter(els.parent());
84040             els.hide();
84041         }
84042         else if (els.html() === "del") {
84043             if (els.parent().prev().length === 0 && els.parent().next().length === 0)
84044                 return;
84045             els.parent().prev().find("button")[0].style.marginLeft = "-60px";
84046             els.parent().prev().find("button")[0].style.display = "";
84047             els.parent().remove();
84048         }
84049     });
84050
84051     arrayOKSelection.click("click", function () {
84052         var els = jQuery(this), inputEls, i, trEls,
84053             setElsId, value = [];
84054
84055         trEls = els.parent().parent();
84056         setElsId = trEls.attr("id").replace("OK", "");
84057
84058         inputEls = trEls.prev().find("input");
84059         for (i = 0; i < inputEls.length; i++)  {
84060             value.push(inputEls[i].value);
84061         }
84062
84063         jQuery("#vehicle-container #" + setElsId).val(value.join(","));
84064     });
84065
84066     rangeSelection.bind("change", function () {
84067         var domJQuery = jQuery(this);
84068
84069         domJQuery.prev().html(domJQuery.val());
84070     });
84071
84072     configSelection.bind("change", function () {
84073         var configuration, current,
84074             domJQuery = jQuery(this);
84075
84076         configuration = _vehicleGlobalVars.vehicleCache.configurationData;
84077         current = domJQuery.val();
84078         _setVehicleConfiguration(configuration, current);
84079     });
84080
84081     //add vehicle supported click event
84082     supportedSelection.bind("click", function () {
84083         var domJQuery = jQuery(this), vehicleChecked,
84084             propertiesSelector = "#vehicle-container #vehicle-supported-hide",
84085             content, supportedId, inputJQuery;
84086
84087         content = domJQuery.html();
84088         supportedId = content + "-supported";
84089         inputJQuery = jQuery(propertiesSelector + " #" + supportedId);
84090         if (domJQuery.hasClass("vehicle-property-unsupported")) {
84091             inputJQuery.attr("checked", "checked");
84092             domJQuery.removeClass("vehicle-property-unsupported");
84093             domJQuery.addClass("vehicle-property-supported");
84094         }
84095         else {
84096             inputJQuery.removeAttr("checked");
84097             domJQuery.removeClass("vehicle-property-supported");
84098             domJQuery.addClass("vehicle-property-unsupported");
84099         }
84100
84101         vehicleChecked = jQuery("#vehicle-container #vehicle-supported-hide input:checked");
84102         _vehicleGlobalVars.vehicleCache.supported.length = 0;
84103         vehicleChecked.each(function (index, els) {
84104             _vehicleGlobalVars.vehicleCache.supported.push(els.value);
84105         });
84106     });
84107
84108     //add vehicle auto click event
84109     autoSelection.bind("click", function () {
84110         if (_vehicleGlobalVars.currentAutoStatus) {
84111             _vehicleGlobalVars.currentAutoStatus = false;
84112             jQuery("#vehicle-container #vehicle-configuration-noOperation").hide();
84113             jQuery("#vehicle-container #vehicle-supported-noOperation").hide();
84114         }
84115         else {
84116             _vehicleGlobalVars.currentAutoStatus = true;
84117             jQuery("#vehicle-container #vehicle-configuration-noOperation").show();
84118             jQuery("#vehicle-container #vehicle-supported-noOperation").show();
84119         }
84120         _switchAutoManual(_vehicleGlobalVars.currentAutoStatus);
84121
84122         _vehicleGlobalVars.timeFlag = setInterval(function () {
84123             _setVehicleAutoRunning(_vehicleGlobalVars.vehicleCache.autoRunningData, true);
84124         }, _vehicleGlobalVars.timeInterval);
84125     });
84126 }
84127
84128 function _addVehicleEventListener () {
84129     event.once("vehicle-cache-request", function (data) {
84130         data.supported = _vehicleGlobalVars.vehicleCache.supported;
84131         data.data = _vehicleGlobalVars.history[_vehicleGlobalVars.timeCurrent];
84132     });
84133
84134     event.on("vehicle-subscribe-request", function (property, isRegister, zone) {
84135         if (isRegister) {
84136             _vehicleGlobalVars.registerListeners[property] = true;
84137             return;
84138         }
84139
84140         var value, status, time, history,
84141             propertyObj = {};
84142
84143         if (_vehicleGlobalVars.vehicleCache.supported.indexOf(property) === -1) {
84144             propertyObj.val = null;
84145             propertyObj.supported = false;
84146             propertyObj.type = property;
84147         }
84148         else {
84149             history = _vehicleGlobalVars.history;
84150             time = _vehicleGlobalVars.timeCurrent;
84151
84152             value = history[time][property];
84153             value.time = time;
84154             status = true;
84155
84156             propertyObj.val = value;
84157             propertyObj.supported = status;
84158             propertyObj.type = property;
84159         }
84160
84161         event.trigger("vehicle-subscribe-response", [propertyObj]);
84162     });
84163
84164     event.on("vehicle-set-request", function (property, value) {
84165         var status = true, enums, showValue;
84166
84167         for (var item in value) {
84168             var enterID = property + "-" + item + "-set";
84169             var showID = property + "-" + item + "-show";
84170             var enterContainer = jQuery("#vehicle-container #" + enterID);
84171             var showContainer = jQuery("#vehicle-container #" + showID);
84172
84173             if (Object.prototype.toString.call(value[item]) === '[object Array]') {
84174                 enterContainer.val(value[item].join(","));
84175             }
84176             else {
84177                 enterContainer.val(value[item].toString());
84178             }
84179             if (showContainer) {
84180                 enums = vehiclePanelEngine.getPropertyConstant(property, item);
84181                 showValue = value[item];
84182                 if (enums) {
84183                     showValue = enums["val" + value[item]];
84184                 }
84185                 showContainer.html(showValue);
84186             }
84187         }
84188
84189         event.trigger("vehicle-set-response", [status]);
84190     });
84191
84192     event.on("vehicle-history-request", function (property, zone, startTime, endTime) {
84193         var history, historyResponse = [], obj, status, time;
84194
84195         history = _vehicleGlobalVars.history;
84196
84197         for (time in history) {
84198             if (time >= startTime && time <= endTime &&
84199                 history[time].hasOwnProperty(property)) {
84200                 obj = history[time][property];
84201                 obj.time = time;
84202                 historyResponse.push(obj);
84203             }
84204         }
84205         status = true;
84206
84207         event.trigger("vehicle-history-response", [historyResponse, status]);
84208     });
84209 }
84210
84211 function _initializeVehiclePanel () {
84212     try {
84213         var stop = false,
84214             configuration, current, properties, supported, settings,
84215             autoRunning;
84216
84217         _vehicleGlobalVars.timeHistoryArray = [];
84218
84219         configuration = vehiclePanelEngine.getConfiguration();
84220         current = vehiclePanelEngine.getCurrentConfiguration();
84221         _setVehicleConfigurationSel(configuration);
84222         _vehicleGlobalVars.vehicleCache.configurationData = configuration;
84223         _vehicleGlobalVars.vehicleCache.currentConfiguration = current;
84224         _setVehicleConfiguration(configuration, current);
84225
84226         properties = vehiclePanelEngine.getProperties();
84227         supported = vehiclePanelEngine.getSupported();
84228         _vehicleGlobalVars.vehicleCache.properties = properties;
84229         _vehicleGlobalVars.vehicleCache.supported = supported;
84230         _setVehicleSupported(properties, supported);
84231
84232         settings = vehiclePanelEngine.getSettings();
84233         _vehicleGlobalVars.vehicleCache.settingData = settings;
84234         _setVehicleSetting(settings);
84235
84236         autoRunning = vehiclePanelEngine.getAutoRunning();
84237         _vehicleGlobalVars.vehicleCache.autoRunningData = autoRunning;
84238         _setVehicleAutoRunning(autoRunning, false);
84239         _vehicleGlobalVars.currentDataIndex = 0;
84240
84241         _vehicleGlobalVars.timeFlag = setInterval(function () {
84242             _setVehicleAutoRunning(_vehicleGlobalVars.vehicleCache.autoRunningData, true);
84243         }, _vehicleGlobalVars.timeInterval);
84244
84245         _addVehicleDomEventListener();
84246
84247         _addVehicleEventListener();
84248
84249         jQuery("#vehicle-properties h3").click(function (event) {
84250             if (stop) {
84251                 event.stopImmediatePropagation();
84252                 event.preventDefault();
84253                 stop = false;
84254             }
84255         });
84256         jQuery("#vehicle-properties").accordion("destroy").accordion({
84257             header: "> div > h3",
84258             autoHeight: false
84259         });
84260     } catch (e) {
84261         exception.handle(e, true);
84262     }
84263 }
84264
84265 module.exports = {
84266     panel: {
84267         domId: "vehicle-container",
84268         collapsed: true,
84269         pane: "right",
84270         titleName: "Vehicle Information",
84271         display: true
84272     },
84273     initialize: function () {
84274         _initializeVehiclePanel();
84275     }
84276 };
84277
84278 });
84279 define('ripple/ui/plugins/build', function (require, exports, module) {
84280 /*
84281  *  Copyright 2011 Research In Motion Limited.
84282  *
84283  * Licensed under the Apache License, Version 2.0 (the "License");
84284  * you may not use this file except in compliance with the License.
84285  * You may obtain a copy of the License at
84286  *
84287  * http://www.apache.org/licenses/LICENSE-2.0
84288  *
84289  * Unless required by applicable law or agreed to in writing, software
84290  * distributed under the License is distributed on an "AS IS" BASIS,
84291  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
84292  * See the License for the specific language governing permissions and
84293  * limitations under the License.
84294  */
84295 var tooltip = require('ripple/ui/plugins/tooltip'),
84296     settings = require('ripple/ui/plugins/settings-dialog'),
84297     bus = require('ripple/bus');
84298
84299 function handleBuild() {
84300     var node = $(this),
84301         action = node.attr('id').split("-")[2];
84302
84303     if (node.hasClass("not-ready")) {
84304         return;
84305     }
84306
84307     if (!settings.can(action)) {
84308         settings.show(action);
84309     }
84310     else {
84311         settings.perform(action);
84312     }
84313 }
84314
84315 function areServicesRunning(success, fail) {
84316     bus.ajax(
84317         "GET",
84318         "http://127.0.0.1:9910/ripple/about",
84319         null,
84320         function () {
84321             success();
84322         },
84323         function (error) {
84324             fail();
84325         }
84326     );
84327 }
84328
84329 function manageServices(action, callBack) {
84330     bus.send("services", action, function () {
84331         if (typeof callBack === "function") {
84332             callBack();
84333         }
84334     });
84335 }
84336
84337 module.exports = {
84338     panel: {
84339         domId: "build-container",
84340         collapsed: true,
84341         pane: "right"
84342     },
84343
84344     initialize: function () {
84345         $("#options-menu-build").click(handleBuild);
84346         $("#options-menu-sign").click(handleBuild);
84347         $("#options-menu-launch").click(handleBuild);
84348
84349         $('#options-menu-start-service').click(function () {
84350             manageServices("start", function (result) {
84351                 $('#options-menu-services-stop').show();
84352                 $('#options-menu-services-start').hide();
84353             });
84354         });
84355
84356         $('#options-menu-stop-service').click(function () {
84357             manageServices("stop", function (result) {
84358                 $('#options-menu-services-stop').hide();
84359                 $('#options-menu-services-start').show();
84360             });
84361         });
84362
84363         $("#options-menu-settings").click(function () {
84364             settings.show(); 
84365         });
84366
84367         if (settings.value("remoteInspector")) {
84368             $("#options-menu-build-warning").show();
84369             tooltip.create("#options-menu-build-warning", "Remote Web Inspector should be disabled when packaging for App World release");
84370         }
84371
84372         areServicesRunning(
84373             function () {
84374                 $('#options-menu-services-stop').show();
84375                 $('#options-menu-services-start').hide();
84376             }, 
84377             function () {
84378                 $('#options-menu-services-stop').hide();
84379                 $('#options-menu-services-start').show();
84380             }
84381         );
84382     }
84383 };
84384
84385 });
84386 define('ripple/ui/plugins/sensors', function (require, exports, module) {
84387 /*
84388  * Copyright (c) 2010 Epic Train Hack
84389  * Copyright (c) 2011 Research In Motion Limited
84390  * Contributors: Wolfram Kriesing, Dan Silivestru, Brent Lintner
84391  *
84392  * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
84393  *
84394  * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
84395  *
84396  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
84397  */
84398 var event = require('ripple/event'),
84399     accelerometer = require('ripple/accelerometer'),
84400     deviceSettings = require('ripple/deviceSettings'),
84401     Acceleration = require('ripple/platform/w3c/1.0/Acceleration'),
84402     Rotation = require('ripple/platform/w3c/1.0/Rotation'),
84403     sensorSettings = require('ripple/sensorSettings'),
84404     _oldX, _oldY, _oldAlphaX,
84405     _camera, _scene, _renderer, _mesh,
84406     _offsets = {
84407         x: 0,
84408         y: 0,
84409         z: -9.81,
84410     },
84411     _flag, // whether the browser supports webGL
84412     _shape =
84413         //
84414         // The front side
84415         //
84416         // x, y, z      x, y, z         x, y, z
84417         // for some strange reason for y -100 is top, 100 is bottom
84418         "-30,30,10,     30,30,10,       30,60,10,       100,100,100,-1,0;" + // top left, top right, bottom right - of the right triangle
84419         "-30,30,10,     30,60,10,       -30,60,10,      100,100,100,-1,0;" + // top left, right bottom, left bottom - of the left triangle
84420         // front side "the phone display"
84421         "-20,-50,11,    20,-50,11,      20,20,11,       100,100,100,-1,0;" +
84422         "-20,-50,11,    20,20,11,       -20,20,11,      100,100,100,-1,0;" +
84423         // below the display
84424         "-30,30,10,     30,20,10,       30,30,10,       0,0,0,-1,0;" +
84425         "-30,30,10,     -30,20,10,      30,20,10,       0,0,0,-1,0;" +
84426         // above the display
84427         "-30,-60,10,    30,-60,10,      30,-50,10,      0,0,0,-1,0;" +
84428         "-30,-60,10,    30,-50,10,      -30,-50,10,     0,0,0,-1,0;" +
84429         // left of the display
84430         "-30,-50,10,    -20,-50,10,     -20,20,10,      0,0,0,-1,0;" +
84431         "-30,-50,10,    -20,20,10,      -30,20,10,      0,0,0,-1,0;" +
84432         // right of the display
84433         "20,-50,10,     30,-50,10,      30,20,10,       0,0,0,-1,0;" +
84434         "20,-50,10,     30,20,10,       20,20,10,       0,0,0,-1,0;" +
84435
84436
84437         // back side, opposite side to the above one
84438         "-30,-60,-10,   30,60,-10,      30,-60,-10,     0,0,0,-1,0;" +
84439         "-30,-60,-10,   -30,60,-10,     30,60,-10,      0,00,-1,0;" +
84440         // right side
84441         "30,-60,-10,    30,60,-10,      30,60,10,       50,50,80,-1,0;" +
84442         "30,-60,-10,    30,60,10,       30,-60,10,      50,50,80,-1,0;" +
84443         // left side
84444         "-30,-60,-10,   -30,60,10,      -30,60,-10,     50,50,80,-1,0;" +
84445         "-30,-60,-10,   -30,-60,10,     -30,60,10,      50,50,80,-1,0;" +
84446
84447         // top
84448         "30,-60,-10,    -30,-60,10, -30,-60,-10,    50,80,50,-1,0;" +
84449         "30,-60,-10,    30,-60,10,      -30,-60,10, 50,80,50,-1,0;" +
84450         // bottom
84451         "30,60,-10, -30,60,-10,     -30,60,10,      80,50,50,-1,0;" +
84452         "30,60,-10, -30,60,10,      30,60,10,       80,50,50,-1,0";
84453
84454 function _createThreeDModel() {
84455     var node,
84456         shader,
84457         hemiLight,
84458         dirLight,
84459         material,
84460         uniforms,
84461         container,
84462         loader,
84463         directionalLight,
84464         isDiffuseTextureLoaded,
84465         isNormalTextureLoaded,
84466         shiftKeyDown,
84467         mouseDown,
84468         ctrlKeyDown = false;
84469
84470     if (_flag) {
84471         // create a 3D phone model with three.js if webGL is supported
84472         node = document.getElementById("accelerometer-div");
84473         container = document.createElement("div");
84474         $("#accelerometer-div").append(container);
84475
84476         _camera = new THREE.PerspectiveCamera(50, 1.5, 0.1, 100);
84477         _camera.position.set(4.32823, 3.74714, 2.62985);
84478         _scene = new THREE.Scene();
84479         _scene.add(new THREE.AmbientLight(0xffffff));
84480         directionalLight = new THREE.DirectionalLight(0xffffff, 1);
84481         directionalLight.position.set(1, 1, 1).normalize();
84482         _scene.add(directionalLight);
84483         hemiLight = new THREE.HemisphereLight(0xffffff, 0xffffff, 0.6);
84484         hemiLight.color.setHSV(0.6, 0.75, 1);
84485         hemiLight.groundColor.setHSV(0.095, 0.5, 1);
84486         hemiLight.position.set(0, 500, 0);
84487         _scene.add(hemiLight);
84488         dirLight = new THREE.DirectionalLight(0xffffff, 1);
84489         dirLight.color.setHSV(0.1, 0.1, 1);
84490         dirLight.position.set(-1, 1.75, 1);
84491         dirLight.position.multiplyScalar(50);
84492         _scene.add(dirLight);
84493         shader = THREE.ShaderSkin["skin"];
84494         uniforms = THREE.UniformsUtils.clone(shader.uniforms);
84495         uniforms["tNormal"].value = THREE.ImageUtils.loadTexture("images/phoneMap_tNormal.png", {}, function () {
84496             isNormalTextureLoaded = true;
84497             if (isDiffuseTextureLoaded) {
84498                 _renderer.clear();
84499                 _renderer.render(_scene, _camera);
84500             }
84501         });
84502         uniforms["uNormalScale"].value = 0.75;
84503         uniforms["tDiffuse"].value = THREE.ImageUtils.loadTexture("images/phoneMap_tDiffuse.png", {}, function () {
84504             isDiffuseTextureLoaded = true;
84505             if (isNormalTextureLoaded) {
84506                 _renderer.clear();
84507                 _renderer.render(_scene, _camera);
84508             }
84509         });
84510         uniforms["uDiffuseColor"].value.setHex(0xbbbbbb);
84511         uniforms["uSpecularColor"].value.setHex(0x070707);
84512         uniforms["uAmbientColor"].value.setHex(0x111111);
84513         uniforms["uRoughness"].value = 0.185;
84514         uniforms["uSpecularBrightness"].value = 0.8;
84515         material = new THREE.ShaderMaterial({ fragmentShader: shader.fragmentShader, vertexShader: shader.vertexShader, uniforms: uniforms, lights: true });
84516         loader = new THREE.JSONLoader(true);
84517         document.body.appendChild(loader.statusDomElement);
84518
84519         loader.load("phoneModel.js", function (geometry) {
84520             loader.statusDomElement.style.display = "none";
84521             geometry.computeTangents();
84522             _mesh = new THREE.Mesh(geometry, material);
84523             _mesh.position.set(7, 2, -50);
84524             _mesh.scale.set(18, 12, 18);
84525             _scene.add(_mesh);
84526             _renderer.clear();
84527             _renderer.render(_scene, _camera);
84528         });
84529
84530         _renderer = new THREE.WebGLRenderer({antialias: false});
84531         _renderer.setSize(300, 280);
84532         _renderer.setClearColorHex(0xffffff, 1);
84533         _renderer.autoClear = false;
84534
84535         container.appendChild(_renderer.domElement);
84536     } else { // create the model with 3d.js
84537         node = document.querySelector("#accelerometer-canvas");
84538
84539         jQuery("#accelerometer-div").css("display", "none");
84540         jQuery("#accelerometer-canvas").css("display", "block");
84541         ThreeDee.setCenter(150, 100);
84542         ThreeDee.setLight(-300, -300, 800);
84543         _updateCanvas(0, 0);
84544     }
84545
84546     //change accelerometer and phone by moving the mouse and the key "shift"
84547     node.addEventListener("mousemove", function (event) {
84548         var cosX, sinX, cosY, sinY,
84549             alpha = accelerometer.getInfo().orientation.alpha,
84550             beta = accelerometer.getInfo().orientation.beta,
84551             gamma = accelerometer.getInfo().orientation.gamma,
84552             x = accelerometer.getInfo().acceleration.x,
84553             y = accelerometer.getInfo().acceleration.y,
84554             z = accelerometer.getInfo().acceleration.z;
84555
84556         if (!mouseDown) {
84557             return;
84558         }
84559
84560         // if the shift key is pressed down, only the alpha value will be chagned
84561         if (!shiftKeyDown) {
84562             _offsets.x = (_offsets.x + _oldX - event.offsetX) % 360;
84563             _offsets.y = (_offsets.y + _oldY - event.offsetY) % 360;
84564
84565             alpha = alpha || 0;
84566
84567             // enforce gamma in [-90,90] as per w3c spec
84568             gamma = -_offsets.x;
84569             if (gamma < -90) {
84570                 gamma = -90;
84571             }
84572             if (gamma > 90) {
84573                 gamma = 90;
84574             }
84575
84576             // enforce beta in [-180,180] as per w3c spec
84577             beta = -_offsets.y % 360;
84578             if (beta < -180) {
84579                 beta += 360;
84580             }
84581             else if (beta >= 180) {
84582                 beta -= 360;
84583             }
84584
84585             cosX = Math.cos(gamma * (Math.PI / 180));
84586             sinX = Math.sin(gamma * (Math.PI / 180));
84587             cosY = Math.cos(beta * (Math.PI / 180));
84588             sinY = Math.sin(beta * (Math.PI / 180));
84589             x = 9.81 * cosY * sinX;
84590             y = -9.81 * sinY;
84591             z = -9.81 * cosY * cosX;
84592
84593         } else {
84594             alpha = (alpha - (_oldAlphaX - event.offsetX) * 2.5) % 360;
84595         }
84596         _oldX = event.offsetX;
84597         _oldY = event.offsetY;
84598         _oldAlphaX = event.offsetX;
84599         if (_flag)
84600             _updatePhoneModel(alpha, beta, gamma);
84601         else
84602             _updateCanvas(alpha, -beta, gamma);
84603         accelerometer.setInfo({
84604             x: x,
84605             y: y,
84606             z: z,
84607             alpha: alpha,
84608             beta: beta,
84609             gamma: gamma
84610         });
84611     }, false);
84612
84613     node.addEventListener("mousedown", function (e) {
84614         mouseDown = true;
84615         _oldX = e.offsetX;
84616         _oldY = e.offsetY;
84617         if (shiftKeyDown) {
84618             _oldAlphaX = _oldX;
84619         }
84620     });
84621
84622     node.addEventListener("mouseup", function () {
84623         mouseDown = false;
84624     });
84625
84626     document.addEventListener("mouseup", function () {
84627         //Catch mouseup events that fire when outside canvas bounds
84628         mouseDown = false;
84629     });
84630
84631     document.addEventListener("keydown", function (e) {
84632         switch (e.keyCode) {
84633         case 16:                // Shift Key
84634             shiftKeyDown = true;
84635             break;
84636         case 17:                // Ctrl Key
84637             ctrlKeyDown = true;
84638             break;
84639         case 74:                // J Key
84640             if (shiftKeyDown && ctrlKeyDown) { //if shift+ctrl+j keydown in the meantime, console comes up rather than shift key down
84641                 shiftKeyDown = false;
84642                 ctrlKeyDown = false;
84643             }
84644             break;
84645         }
84646     });
84647
84648     document.addEventListener("keyup", function (e) {
84649         if (e.keyCode === 16) { // Shift Key
84650             shiftKeyDown = false;
84651         }
84652     });
84653 }
84654
84655 // update the 3d model created by 3d.js
84656 function _updateCanvas(a, b, g) {
84657     ThreeDee.loadMesh(_shape);
84658     g = g || 0;
84659     ThreeDee.rotate(0, g, 0);
84660     ThreeDee.rotate(b, 0, a);
84661     ThreeDee.backface();
84662     ThreeDee.shade();
84663     ThreeDee.zSort();
84664     Draw.initialize(document.querySelector("#accelerometer-canvas"));
84665     Draw.clear(0, 0, 480, 300);
84666     Draw.drawScene(ThreeDee.getTranslation(), 3);
84667 }
84668
84669 // update the 3d model created by three.js
84670 function _updatePhoneModel(a, b, g) {
84671     _mesh.rotation.x = b / 90 * 1.5;
84672     _mesh.rotation.y = g / 90 * 1.5;
84673     _mesh.rotation.z = a / 90 * 1.5;
84674     _renderer.clear();
84675     _renderer.render(_scene, _camera);
84676 }
84677
84678 function _resetAccelerometer() {
84679     _oldX = 0;
84680     _oldY = 0;
84681     _oldAlphaX = 0;
84682     _offsets = {
84683         x: 0,
84684         y: 0,
84685         z: -9.81
84686     };
84687     if (_flag) {
84688         _mesh.rotation.x = 0;
84689         _mesh.rotation.y = 0;
84690         _mesh.rotation.z = 0;
84691         _renderer.clear();
84692         _renderer.render(_scene, _camera);
84693     } else {
84694         _updateCanvas(0, 0);
84695     }
84696
84697     accelerometer.setInfo({
84698         acceleration: new Acceleration(0, 0, 0),
84699         accelerationIncludingGravity: new Acceleration(0, 0, -9.81),
84700         rotationRate: new Rotation(0, 0, 0),
84701         orientation: new Rotation(0, 0, 0),
84702         timestamp: new Date().getTime()
84703     });
84704     accelerometer.triggerEvent();
84705 }
84706
84707 function _resetMagneticField() {
84708     jQuery("#magnetic-x").val("100");
84709     jQuery("#magnetic-y").val("100");
84710     jQuery("#magnetic-z").val("100");
84711 }
84712
84713 function _resetLightLevel() {
84714     $("#display-state").children().each(function() {
84715         if ($(this).val() === "OFF") {
84716             $(this).attr("selected", "true");
84717             this.selected = true;
84718         }
84719         else {
84720             $(this).attr("selected", "false");
84721             this.selected = false;
84722         }
84723     });
84724 }
84725
84726
84727 // set a typical mode for accelerometer simulation, when the phone drops,
84728 // x will become to be 0, y will become to be -9.81 and z will become to be 0
84729 function _setDrop() {
84730     //duration = 20 * 50 = 1000ms. 20 is ths number of steps and 50 is the duration of steps.
84731     var alpha = Number(accelerometer.getInfo().orientation.alpha),
84732         beta = Number(accelerometer.getInfo().orientation.beta),
84733         gamma = Number(accelerometer.getInfo().orientation.gamma),
84734         cosX, cosY, sinX, sinY, x, y, z,
84735         alphaStep = Math.abs(alpha) / 20,
84736         betaStep = Math.abs(beta - 90) / 20,
84737         gammaStep = Math.abs(gamma) / 20,
84738         counts = 0, dropTimeout,
84739         drop = function () {
84740             if (counts >= 20) {
84741                 window.clearTimeout(dropTimeout);
84742                 // to avoid showing "-0" or "-0.00"
84743                 if (_flag)
84744                     _updatePhoneModel(0, 90, 0);
84745                 else
84746                     _updateCanvas(0, -90, 0);
84747                 accelerometer.setInfo({
84748                     x: 0,
84749                     y: -9.81,
84750                     z: 0,
84751                     alpha: 0,
84752                     beta: 90,
84753                     gamma: 0
84754                 });
84755             } else {
84756                 dropTimeout = setTimeout(drop, 50);
84757                 step();
84758                 counts++;
84759             }
84760         },
84761         step = function () {
84762             var _beta;
84763
84764             alpha = alpha > 0 ? alpha - alphaStep : alpha + alphaStep;
84765             beta = beta > 90 ? beta - betaStep : beta + betaStep;
84766             gamma = gamma > 0 ? gamma - gammaStep : gamma + gammaStep;
84767             _beta = _flag ? beta + betaStep : -(beta + betaStep);
84768             if (_flag)
84769                 _updatePhoneModel(alpha, _beta, gamma);
84770             else
84771                 _updateCanvas(alpha, _beta, gamma);
84772
84773             cosX = Math.cos(gamma * (Math.PI / 180));
84774             sinX = Math.sin(gamma * (Math.PI / 180));
84775             cosY = Number(Math.cos(beta * (Math.PI / 180)).toFixed(6));
84776             sinY = Math.sin(beta * (Math.PI / 180));
84777             x = 9.81 * cosY * sinX;
84778             y = -9.81 * sinY;
84779             z = -9.81 * cosY * cosX;
84780             accelerometer.setInfo({
84781                 x: x,
84782                 y: y,
84783                 z: z,
84784                 alpha: alpha,
84785                 beta: beta,
84786                 gamma: gamma
84787             });
84788             _offsets.x = -gamma;
84789             _offsets.y = -beta;
84790         };
84791
84792     drop();
84793 }
84794
84795 function _initializeSensorSettings() {
84796     var sensorsInputID = ["accelerometer-alpha", "accelerometer-beta", "accelerometer-gamma", "magnetic-x", "magnetic-y", "magnetic-z"],
84797         magneticEvent = ["MagneticField-xChanged", "MagneticField-yChanged", "MagneticField-zChanged"],
84798          magneticData = ["MagneticField.x", "MagneticField.y", "MagneticField.z"],
84799         oldValue, oldInputX,
84800         inputMouseDown,
84801         triggerFunction,
84802         selectedInputID = null;
84803
84804     triggerFunction = function (val, index) {
84805         var cosX, cosY, sinX, sinY, x, y, z,
84806             alpha = accelerometer.getInfo().orientation.alpha,
84807             beta = accelerometer.getInfo().orientation.beta,
84808             gamma = accelerometer.getInfo().orientation.gamma;
84809
84810         //choose which value to change according to index
84811         switch (index) {
84812         case 0:
84813             alpha = val;
84814             break;
84815         case 1:
84816             beta = val;
84817             break;
84818         case 2:
84819             gamma = val;
84820             break;
84821         default:
84822             sensorSettings.persist(magneticData[index - 3], val);
84823             event.trigger(magneticEvent[index - 3], [val]);
84824         }
84825
84826         //change the phone model and values of other inputs when changing a value of input
84827         if (_flag)
84828             _updatePhoneModel(alpha, beta, gamma);
84829         else
84830             _updateCanvas(alpha, -beta, gamma);
84831         cosX = Math.cos(gamma * (Math.PI / 180));
84832         sinX = Math.sin(gamma * (Math.PI / 180));
84833         cosY = Math.cos(beta * (Math.PI / 180));
84834         sinY = Math.sin(beta * (Math.PI / 180));
84835         x = 9.81 * cosY * sinX;
84836         y = -9.81 * sinY;
84837         z = -9.81 * cosY * cosX;
84838         accelerometer.setInfo({
84839             x: x,
84840             y: y,
84841             z: z,
84842             alpha: alpha,
84843             beta: beta,
84844             gamma: gamma
84845         });
84846         _offsets.x = -gamma;
84847         _offsets.y = -beta;
84848     };
84849
84850     // make the input elements more powful: drag mouse to left to decrease the value and right to increase it;
84851     // also change the value with arrow keys.
84852
84853
84854     sensorsInputID.forEach(function (id, index) {
84855         jQuery("#" + id).mousedown(function (e) {
84856             selectedInputID = id;
84857             oldValue = parseInt(this.value, 10);
84858             oldInputX = e.offsetX;
84859             inputMouseDown = true;
84860         });
84861
84862         jQuery("#" + id).mousemove(function (e) {
84863             if (inputMouseDown && (selectedInputID !== null)) {
84864                 jQuery("#" + selectedInputID).val(parseInt(oldValue + (e.offsetX - oldInputX) / 2, 10));
84865                 if (parseInt(this.value, 10) <= parseInt(jQuery(this).attr("minValue"), 10)) {
84866                     this.value = jQuery(this).attr("minValue");
84867                 }
84868                 if (parseInt(this.value, 10) >= parseInt(jQuery(this).attr("maxValue"), 10)) {
84869                     this.value = jQuery(this).attr("maxValue");
84870                 }
84871                 triggerFunction(this.value, index);
84872             }
84873         });
84874
84875         jQuery("#" + id).mouseup(function () {
84876             selectedInputID = null;
84877             inputMouseDown = false;
84878         });
84879         jQuery(document).mouseup(function () {
84880             selectedInputID = null;
84881             inputMouseDown = false;
84882         });
84883
84884         jQuery("#" + id).click(function () {
84885             this.select();
84886         });
84887
84888         jQuery("#" + id).blur(function () {
84889             if (isNaN(this.value)) {
84890                 this.value = 0;
84891             }
84892             else if (parseInt(this.value, 10) > parseInt(jQuery(this).attr("maxValue"), 10))
84893                 this.value = jQuery(this).attr("maxValue");
84894             else if (parseInt(this.value, 10) < parseInt(jQuery(this).attr("minValue"), 10))
84895                 this.value = jQuery(this).attr("minValue");
84896             else
84897                 this.value = parseInt(this.value, 10);
84898             triggerFunction(this.value, index);
84899         });
84900
84901         jQuery("#" + id).keydown(function (e) {
84902             switch (e.keyCode) {
84903             case 38:
84904                 if (parseInt(this.value, 10) < parseInt(jQuery(this).attr("maxValue"), 10)) {
84905                     this.value = parseInt(this.value, 10) + 1;
84906                     triggerFunction(this.value, index);
84907                 }
84908                 break;
84909             case 40:
84910                 if (parseInt(this.value, 10) > parseInt(jQuery(this).attr("minValue"), 10)) {
84911                     this.value = parseInt(this.value, 10) - 1;
84912                     triggerFunction(this.value, index);
84913                 }
84914                 break;
84915             default:
84916                 return;
84917             }
84918         });
84919     });
84920 }
84921
84922 /*
84923 //initialize light settings
84924 function _initializeLightSettings() {
84925     var displayObj = document.getElementById("display-state"),
84926         DISPLAY_STATE  = require('ripple/constants').POWER_RESOURCE.SCREEN.STATE,
84927         brightness;
84928
84929     displayObj.addEventListener("change", function () {
84930         var state = displayObj.value, value;
84931         value = DISPLAY_STATE[state].VALUE;
84932         deviceSettings.persist("Display.brightness", value);
84933         event.trigger("DisplayBrightnessChanged", [value]);
84934     });
84935
84936     brightness = deviceSettings.retrieve("Display.brightness");
84937     if (brightness ===  DISPLAY_STATE.SCREEN_OFF.MAX) {
84938         displayObj.options[0].selected = true;
84939     } else if (brightness <= DISPLAY_STATE.SCREEN_DIM.MAX) {
84940         displayObj.options[1].selected = true;
84941     } else if (brightness <= DISPLAY_STATE.SCREEN_NORMAL.MAX) {
84942         displayObj.options[2].selected = true;
84943     } else {
84944         displayObj.options[3].selected = true;
84945     }
84946 }
84947 */
84948
84949 module.exports = {
84950     panel: {
84951         domId: "sensors-container",
84952         collapsed: true,
84953         pane: "left",
84954         titleName: "Sensors",
84955         display: true
84956     },
84957     initialize: function () {
84958         var gl,
84959             testCanvas = document.getElementById("accelerometer-canvas");
84960
84961         try { // check whether the browser supports webGL, returns null if not support
84962             gl = testCanvas.getContext("experimental-webgl");
84963             gl.viewport(0, 0, testCanvas.width, testCanvas.height);
84964         } catch (e) {
84965             console.log("unsupport webgl");
84966         }
84967
84968         _flag = gl ? true : false;
84969
84970         accelerometer.init();
84971         _createThreeDModel();
84972         _initializeSensorSettings();
84973         //_initializeLightSettings();
84974
84975         jQuery("#accelerometer-shake").click(function () {
84976             window.setTimeout(require('ripple/ui/plugins/goodVibrations').shakeDevice(8), 1);
84977             accelerometer.shake();
84978         });
84979
84980         jQuery("#sensor-reset-all").click(function () {
84981             _resetAccelerometer();
84982             _resetMagneticField();
84983             _resetLightLevel();
84984         });
84985
84986         jQuery("#accelerometer-drop").click(_setDrop);
84987
84988         event.on("AccelerometerInfoChangedEvent", function (motion) {
84989             jQuery("#accelerometer-x").html(motion.accelerationIncludingGravity.x.toFixed(2));
84990             jQuery("#accelerometer-y").html(motion.accelerationIncludingGravity.y.toFixed(2));
84991             jQuery("#accelerometer-z").html(motion.accelerationIncludingGravity.z.toFixed(2));
84992             jQuery("#accelerometer-alpha").val(Number(motion.orientation.alpha).toFixed(2));
84993             jQuery("#accelerometer-beta").val(Number(motion.orientation.beta).toFixed(2));
84994             jQuery("#accelerometer-gamma").val(Number(motion.orientation.gamma).toFixed(2));
84995         }, this);
84996     }
84997 };
84998
84999 });
85000 define('ripple/ui/plugins/push', function (require, exports, module) {
85001 /*
85002  *  Copyright 2011 Research In Motion Limited.
85003  *
85004  * Licensed under the Apache License, Version 2.0 (the "License");
85005  * you may not use this file except in compliance with the License.
85006  * You may obtain a copy of the License at
85007  *
85008  * http://www.apache.org/licenses/LICENSE-2.0
85009  *
85010  * Unless required by applicable law or agreed to in writing, software
85011  * distributed under the License is distributed on an "AS IS" BASIS,
85012  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
85013  * See the License for the specific language governing permissions and
85014  * limitations under the License.
85015  */
85016 var constants = require('ripple/constants'),
85017     event = require('ripple/event'),
85018     utils = require('ripple/utils'),
85019     db = require('ripple/db'),
85020     PUSH_OPTIONS = constants.PUSH.OPTIONS;
85021
85022 function _updatePushPanel(ports) {
85023     var portsSelect = document.getElementById("port-select"),
85024         currentPort = portsSelect.value;
85025
85026     portsSelect.innerHTML = "";
85027
85028     ports.forEach(function (port) {
85029         portsSelect.appendChild(utils.createElement("option", {
85030             innerText: port,
85031             value: port,
85032             selected: currentPort === port
85033         }));
85034     });
85035 }
85036
85037 module.exports = {
85038     panel: {
85039         domId: "push-container",
85040         collapsed: true,
85041         pane: "left"
85042     },
85043     initialize: function () {
85044         event.on("PushListenersChanged", function (listeners) {
85045             _updatePushPanel(listeners);
85046             jQuery("#port-select").effect("highlight", {color: "#62B4C8"}, 1000);
85047         });
85048
85049         _updatePushPanel([]);
85050
85051         document.getElementById("push-send")
85052             .addEventListener("click", function () {
85053                 var port = document.getElementById("port-select").value,
85054                     text = document.getElementById(PUSH_OPTIONS.PAYLOAD).value,
85055                     pushData = {
85056                         headerField: ["21f39092"],
85057                         requestURI: "/",
85058                         source: "ripple",
85059                         isChannelEncrypted: false,
85060                         payload: text
85061                     };
85062
85063                 event.trigger("Push", [pushData, port], true);
85064             }, false);
85065
85066         utils.bindAutoSaveEvent(jQuery("#" + PUSH_OPTIONS.PAYLOAD), function () {
85067             db.save(PUSH_OPTIONS.PAYLOAD, document.getElementById(PUSH_OPTIONS.PAYLOAD).value);
85068         });
85069
85070         document.getElementById(PUSH_OPTIONS.PAYLOAD).value = db.retrieve(PUSH_OPTIONS.PAYLOAD) || "My payload data";
85071     }
85072 };
85073
85074 });
85075 define('ripple/ui/plugins/accelerometer', function (require, exports, module) {
85076 /*
85077  * Copyright (c) 2010 Epic Train Hack
85078  * Copyright (c) 2011 Research In Motion Limited
85079  * Contributors: Wolfram Kriesing, Dan Silivestru, Brent Lintner
85080  *
85081  * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
85082  *
85083  * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
85084  *
85085  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
85086  */
85087 var ui = require('ripple/ui'),
85088     goodVibrations = require('ripple/ui/plugins/goodVibrations'),
85089     accelerometer = require('ripple/accelerometer'),
85090     event = require('ripple/event'),
85091     Rotation = require('ripple/platform/w3c/1.0/Rotation'),
85092     Acceleration = require('ripple/platform/w3c/1.0/Acceleration'),
85093     _mouseDown,
85094     _shiftKeyDown,
85095     _offsets = {
85096         x: 0,
85097         y: 0,
85098         z: -9.81,
85099     },
85100     _oldX,
85101     _oldY,
85102     _oldAlphaX,
85103     _shape =
85104         //
85105         // The front side
85106         //
85107         // x, y, z      x, y, z         x, y, z
85108         // for some strange reason for y -100 is top, 100 is bottom
85109         "-30,30,10,     30,30,10,       30,60,10,       100,100,100,-1,0;" + // top left, top right, bottom right - of the right triangle
85110         "-30,30,10,     30,60,10,       -30,60,10,      100,100,100,-1,0;" + // top left, right bottom, left bottom - of the left triangle
85111         // front side "the phone display"
85112         "-20,-50,11,    20,-50,11,      20,20,11,       100,100,100,-1,0;" +
85113         "-20,-50,11,    20,20,11,       -20,20,11,      100,100,100,-1,0;" +
85114         // below the display
85115         "-30,30,10,     30,20,10,       30,30,10,       0,0,0,-1,0;" +
85116         "-30,30,10,     -30,20,10,      30,20,10,       0,0,0,-1,0;" +
85117         // above the display
85118         "-30,-60,10,    30,-60,10,      30,-50,10,      0,0,0,-1,0;" +
85119         "-30,-60,10,    30,-50,10,      -30,-50,10,     0,0,0,-1,0;" +
85120         // left of the display
85121         "-30,-50,10,    -20,-50,10,     -20,20,10,      0,0,0,-1,0;" +
85122         "-30,-50,10,    -20,20,10,      -30,20,10,      0,0,0,-1,0;" +
85123         // right of the display
85124         "20,-50,10,     30,-50,10,      30,20,10,       0,0,0,-1,0;" +
85125         "20,-50,10,     30,20,10,       20,20,10,       0,0,0,-1,0;" +
85126
85127
85128         // back side, opposite side to the above one
85129         "-30,-60,-10,   30,60,-10,      30,-60,-10,     0,0,0,-1,0;" +
85130         "-30,-60,-10,   -30,60,-10,     30,60,-10,      0,00,-1,0;" +
85131         // right side
85132         "30,-60,-10,    30,60,-10,      30,60,10,       50,50,80,-1,0;" +
85133         "30,-60,-10,    30,60,10,       30,-60,10,      50,50,80,-1,0;" +
85134         // left side
85135         "-30,-60,-10,   -30,60,10,      -30,60,-10,     50,50,80,-1,0;" +
85136         "-30,-60,-10,   -30,-60,10,     -30,60,10,      50,50,80,-1,0;" +
85137
85138         // top
85139         "30,-60,-10,    -30,-60,10, -30,-60,-10,    50,80,50,-1,0;" +
85140         "30,-60,-10,    30,-60,10,      -30,-60,10, 50,80,50,-1,0;" +
85141         // bottom
85142         "30,60,-10, -30,60,-10,     -30,60,10,      80,50,50,-1,0;" +
85143         "30,60,-10, -30,60,10,      30,60,10,       80,50,50,-1,0";
85144
85145 function _shakeDevice() {
85146     window.setTimeout(goodVibrations.shakeDevice(8), 1);
85147     accelerometer.shake();
85148 }
85149
85150 function _updateAccelerometerPanel(motion) {
85151     jQuery("#accelerometer-x").html(Math.round(motion.accelerationIncludingGravity.x * 100) / 100);
85152     jQuery("#accelerometer-y").html(Math.round(motion.accelerationIncludingGravity.y * 100) / 100);
85153     jQuery("#accelerometer-z").html(Math.round(motion.accelerationIncludingGravity.z * 100) / 100);
85154     jQuery("#accelerometer-alpha").html(Math.round(motion.orientation.alpha));
85155     jQuery("#accelerometer-beta").html(Math.round(motion.orientation.beta));
85156     jQuery("#accelerometer-gamma").html(Math.round(motion.orientation.gamma));
85157 }
85158
85159 function _updateCanvas(a, b, g) {
85160     ThreeDee.loadMesh(_shape);
85161     g = g || 0;
85162     ThreeDee.rotate(0, g, 0);
85163     ThreeDee.rotate(b, 0, a);
85164     ThreeDee.backface();
85165     ThreeDee.shade();
85166     ThreeDee.zSort();
85167     Draw.initialize(document.querySelector("#accelerometer-canvas"));
85168     Draw.clear(0, 0, 480, 300);
85169     Draw.drawScene(ThreeDee.getTranslation(), 3);
85170 }
85171
85172 function _createCanvas() {
85173     var node = document.querySelector("#accelerometer-canvas"),
85174         x = 0, y = 0, z = -9.81,
85175         alpha = 0, beta = 0, gamma = 0,
85176         cosX, sinX, cosY, sinY,
85177         deltaAlpha = 360;
85178
85179     ThreeDee.setCenter(150, 100);
85180     ThreeDee.setLight(-300, -300, 800);
85181
85182     node.addEventListener("mousemove", function (e) {
85183         if (!_mouseDown)
85184             return;
85185
85186         if (!_shiftKeyDown) {
85187             _offsets.x = (_offsets.x + _oldX - e.offsetX) % 360;
85188             _offsets.y = (_offsets.y + _oldY - e.offsetY) % 360;
85189
85190             alpha = alpha || 0;
85191
85192             // enforce gamma in [-90,90] as per w3c spec
85193             gamma = -_offsets.x;
85194             if (gamma < -90) {
85195                 gamma = -90;
85196             }
85197             if (gamma > 90) {
85198                 gamma = 90;
85199             }
85200
85201             // enforce beta in [-180,180] as per w3c spec
85202             beta = -_offsets.y % 360;
85203             if (beta < -180) {
85204                 beta += 360;
85205             }
85206             else if (beta >= 180) {
85207                 beta -= 360;
85208             }
85209
85210             cosX = Math.cos((gamma) * (Math.PI / 180));
85211             sinX = Math.sin((gamma) * (Math.PI / 180));
85212             cosY = Math.cos((beta) * (Math.PI / 180));
85213             sinY = Math.sin((beta) * (Math.PI / 180));
85214             x = 9.81 * cosY * sinX;
85215             y = -9.81 * sinY;
85216             z = -9.81 * cosY * cosX;
85217
85218         }
85219         else {
85220             deltaAlpha = (deltaAlpha - (_oldAlphaX - e.offsetX) * 2.5) % 360;
85221             alpha = (360 - deltaAlpha) % 360;
85222         }
85223
85224         _oldX = e.offsetX;
85225         _oldY = e.offsetY;
85226         _oldAlphaX = e.offsetX;
85227
85228         _updateCanvas(deltaAlpha, -beta, gamma);
85229         accelerometer.setInfo({
85230             x: x,
85231             y: y,
85232             z: z,
85233             alpha: alpha,
85234             beta: beta,
85235             gamma: gamma
85236         });
85237
85238     });
85239
85240     node.addEventListener("mousedown", function (e) {
85241         _oldX = e.offsetX;
85242         _oldY = e.offsetY;
85243         if (_shiftKeyDown) {
85244             _oldAlphaX = _oldX;
85245         }
85246         _mouseDown = true;
85247     });
85248
85249     node.addEventListener("mouseup", function (e) {
85250         _mouseDown = false;
85251     });
85252
85253     node.addEventListener("dblclick", function (e) {   
85254         x = 0;
85255         y = 0;
85256         z = -9.81;
85257         alpha = 0;
85258         beta = 0;
85259         gamma = 0;
85260         deltaAlpha = 360;
85261         _resetAccelerometer();
85262     });
85263
85264     document.addEventListener("mouseup", function (e) {
85265         //Catch mouseup events that fire when outside canvas bounds
85266         _mouseDown = false;
85267     });
85268
85269     document.addEventListener("keydown", function (e) {
85270         if (e.keyCode === 16) { // Shift Key            
85271             _shiftKeyDown = true;
85272         }
85273     });
85274
85275     document.addEventListener("keyup", function (e) {
85276         if (e.keyCode === 16) { // Shift Key
85277             _shiftKeyDown = false;
85278         }
85279     });    
85280 }
85281
85282 function _resetAccelerometer() {    
85283     _updateCanvas(0, 0);
85284     _oldX = 0;
85285     _oldY = 0;
85286     _oldAlphaX = 0;
85287     _offsets = {
85288         x: 0,
85289         y: 0,
85290         z: -9.81,
85291     };
85292     accelerometer.setInfo({
85293         acceleration: new Acceleration(0, 0, 0),
85294         accelerationIncludingGravity: new Acceleration(0, 0, -9.81),
85295         rotationRate: new Rotation(0, 0, 0),
85296         orientation: new Rotation(0, 0, 0),
85297         timestamp: new Date().getTime()
85298     });
85299 }
85300
85301 module.exports = {
85302     panel: {
85303         domId: "accelerometer-container",
85304         collapsed: true,
85305         pane: "left",
85306         titleName: "Accelerometer",
85307         display: true
85308     },
85309     initialize: function () {
85310         _createCanvas();
85311         
85312         _resetAccelerometer();
85313
85314         _updateAccelerometerPanel(accelerometer.getInfo());
85315
85316         jQuery("#accelerometer-shake").click(_shakeDevice);
85317
85318         event.on("AccelerometerInfoChangedEvent", _updateAccelerometerPanel, this);
85319     }
85320 };
85321
85322 });
85323 define('ripple/ui/plugins/phone', function (require, exports, module) {
85324 /*
85325  *  Copyright 2011 Research In Motion Limited.
85326  *
85327  * Licensed under the Apache License, Version 2.0 (the "License");
85328  * you may not use this file except in compliance with the License.
85329  * You may obtain a copy of the License at
85330  *
85331  * http://www.apache.org/licenses/LICENSE-2.0
85332  *
85333  * Unless required by applicable law or agreed to in writing, software
85334  * distributed under the License is distributed on an "AS IS" BASIS,
85335  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
85336  * See the License for the specific language governing permissions and
85337  * limitations under the License.
85338  */
85339 var utils = require('ripple/utils'),
85340     Phone = require('ripple/platform/webworks.handset/2.0.0/client/Phone'),
85341     CallLog = require('ripple/platform/webworks.handset/2.0.0/client/CallLog'),
85342     event = require('ripple/event'),
85343     _console = require('ripple/console'),
85344     eventSelect = document.getElementById("phone-event-types"),
85345     eventErrorContainer = document.getElementById("phone-event-error-container"),
85346     eventErrorSelect = document.getElementById("phone-event-error-types");
85347
85348 function _firePhoneLogEvents(type, number, error) {
85349     if (type === Phone.CB_CALL_INITIATED ||
85350         type === Phone.CB_CALL_ANSWERED) {
85351         event.trigger("PhoneCallLogAdded", [{
85352             date: new Date(),
85353             number: number,
85354             status: CallLog.STATUS_NORMAL,
85355             type: CallLog.TYPE_RECEIVED_CALL
85356         }], true);
85357     } else if (type === Phone.CB_CALL_ENDED_BYUSER ||
85358                 type === Phone.CB_CALL_FAILED) {
85359         event.trigger("PhoneCallLogAdded", [{
85360             date: new Date(),
85361             number: number,
85362             status: CallLog.STATUS_NORMAL,
85363             type: CallLog.TYPE_PLACED_CALL
85364         }], true);
85365     }
85366 }
85367
85368 function _updateActiveCalls(type, number, error) {
85369     if (type === Phone.CB_CALL_INITIATED ||
85370         type === Phone.CB_CALL_CONNECTED ||
85371         type === Phone.CB_CALL_CONFERENCECALL_ESTABLISHED ||
85372         type === Phone.CB_CALL_DIRECTCONNECT_CONNECTED ||
85373         type === Phone.CB_CALL_ANSWERED) {
85374         event.trigger("PhoneCallInitiated", [{
85375             id: number,
85376             onhold: false,
85377             outgoing: false,
85378             recipient: {
85379                 name: "",
85380                 number: String(number)
85381             }
85382         }], true);
85383     } else if (type === Phone.CB_CALL_ENDED_BYUSER ||
85384                 type === Phone.CB_CALL_FAILED ||
85385                 type === Phone.CB_CALL_DISCONNECTED ||
85386                 type === Phone.CB_CONFERENCECALL_DISCONNECTED ||
85387                 type === Phone.CB_CALL_DIRECTCONNECT_DISCONNECTED) {
85388         event.trigger("PhoneCallEnded", [{
85389             id: number
85390         }], true);
85391     }
85392 }
85393
85394 module.exports = {
85395     panel: {
85396         domId: "phone-container",
85397         collapsed: true,
85398         pane: "right"
85399     },
85400     initialize: function (prev, baton) {
85401         utils.forEach(Phone, function (value, prop) {
85402             if (prop.match(/^CB_/)) {
85403                 eventSelect.appendChild(utils.createElement("option", {
85404                     value: value,
85405                     innerHTML: prop.replace(/^CB_(CALL_)?/, "")
85406                 }));
85407             }
85408
85409             if (prop.match(/^CALL_ERROR_/)) {
85410                 eventErrorSelect.appendChild(utils.createElement("option", {
85411                     value: value,
85412                     innerHTML: prop.replace(/^CALL_ERROR_/, "")
85413                 }));
85414             }
85415         });
85416
85417         document.getElementById("phone-event-types").addEventListener("change", function () {
85418             eventErrorContainer.setAttribute("style", parseInt(eventSelect.value, 10) === Phone.CB_CALL_FAILED ? "" : "display: none");
85419         });
85420
85421         document.getElementById("phone-logs-clear").addEventListener("click", function () {
85422             event.trigger("PhoneCallLogReset");
85423         });
85424
85425         document.getElementById("phone-event-send").addEventListener("click", function () {
85426             var type = parseInt(eventSelect.value, 10),
85427                 error = type === Phone.CB_CALL_FAILED ? eventErrorSelect.value : undefined,
85428                 callId = document.getElementById("phone-call-id").value;
85429
85430             _firePhoneLogEvents(type, callId, error);
85431             _updateActiveCalls(type, callId, error);
85432
85433             event.trigger("PhoneEvent", [type, callId, error]);
85434
85435             _console.log("Fired PhoneEvent (type " + type +  ") CallID: " +
85436                          callId + (error ? (" (error type " + error + ")") : ""));
85437         }, false);
85438     }
85439 };
85440
85441 });
85442 define('ripple/ui/plugins/HWKeys', function (require, exports, module) {
85443 /*
85444  *  Copyright 2012 Intel Corporation
85445  *
85446  * Licensed under the Apache License, Version 2.0 (the "License");
85447  * you may not use this file except in compliance with the License.
85448  * You may obtain a copy of the License at
85449  *
85450  * http://www.apache.org/licenses/LICENSE-2.0
85451  *
85452  * Unless required by applicable law or agreed to in writing, software
85453  * distributed under the License is distributed on an "AS IS" BASIS,
85454  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
85455  * See the License for the specific language governing permissions and
85456  * limitations under the License.
85457  */
85458
85459 var db = require('ripple/db'),
85460     event = require('ripple/event');
85461
85462
85463 function initHWKey() {
85464     var left = 0,
85465         orientation = db.retrieve('deviceOrientation'),
85466         scaleFactor = db.retrieve('deviceScaleFactor');
85467
85468     if (orientation === 'portrait') {
85469         if (db.retrieve("layout") === "portrait") {
85470             left = 350 + $('#device-layout').width()*scaleFactor;
85471         } else {
85472             left = 470 + $('#device-layout').height()*scaleFactor;
85473         }
85474     } else {
85475         if (db.retrieve("layout") === "portrait") {
85476             left = 490 + $('#device-layout').height()*scaleFactor;
85477         } else {
85478             left = 350 + $('#device-layout').width()*scaleFactor;
85479         }
85480     }
85481
85482     $("#hwkeys-panel").css("top", "40px");
85483     $("#hwkeys-panel").css("left", left+"px");
85484     $("#hwkeys-panel").draggable({ cursor: 'move', containment: [0, 52, 1480, 800]});
85485
85486     jQuery("#hwkey-menu-btn").bind("click", function () {
85487         event.trigger("tizenhwkeyEvent", ["menu"], true);
85488     });
85489     jQuery("#hwkey-back-btn").bind("click", function () {
85490         event.trigger("tizenhwkeyEvent", ["back"], true);
85491     });
85492 }
85493
85494 module.exports = {
85495     initialize: function () {
85496         initHWKey();
85497     }
85498 };
85499
85500 });
85501 define('ripple/ui/plugins/panelCollapse', function (require, exports, module) {
85502 /*
85503  *  Copyright 2011 Research In Motion Limited.
85504  *
85505  * Licensed under the Apache License, Version 2.0 (the "License");
85506  * you may not use this file except in compliance with the License.
85507  * You may obtain a copy of the License at
85508  *
85509  * http://www.apache.org/licenses/LICENSE-2.0
85510  *
85511  * Unless required by applicable law or agreed to in writing, software
85512  * distributed under the License is distributed on an "AS IS" BASIS,
85513  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
85514  * See the License for the specific language governing permissions and
85515  * limitations under the License.
85516  */
85517 // TODO: could use a bit of refactoring sugar
85518 var db = require('ripple/db'),
85519     constants = require('ripple/constants'),
85520     _LEFT_PANEL_COLLAPSE = ".left-panel-collapse",
85521     _RIGHT_PANEL_COLLAPSE = ".right-panel-collapse",
85522     _LEFT_PANEL = ".left",
85523     _RIGHT_PANEL = ".right",
85524     _SAVE_KEY = "panel-collapsed",
85525     platform = require('ripple/platform'),
85526     devices = require('ripple/devices'),
85527     _leftEngaged, _rightEngaged, _store;
85528
85529
85530 $(function () { 
85531     $(window).resize(function () {
85532         var windowHeight = $(window).height();
85533         jQuery(".PanelCollapseBar").css("top", windowHeight - 56);
85534         jQuery("#left_div").css("height", $(window).height() - 21);
85535         if (_store["left"] === true) {
85536             jQuery("#middle_div").css("width", $(window).width());
85537         } else {
85538             jQuery("#middle_div").css("width", $(window).width());
85539         }
85540     });
85541 });
85542
85543
85544 function _persist() {
85545     db.saveObject(_SAVE_KEY, _store);
85546 }
85547
85548
85549 function updateZoomingValues(value, origin) {
85550     var scaleFactor = value / 100, scaleString;
85551     scaleString = "scale(" + scaleFactor + ")";
85552     jQuery('#device-layout').css('-webkit-transform', scaleString);
85553     if (origin === "center") {
85554         jQuery('#device-layout').css('-webkit-transform-origin', 'center top');
85555     } else {
85556         jQuery('#device-layout').css('-webkit-transform-origin', 'left top');
85557     }
85558 }
85559
85560
85561 function _process(collapseNode, panelNode, side, callback) {
85562     var jNode = collapseNode.children("span"),
85563         jPanelNode = jQuery(panelNode),
85564         properties = {},
85565         collapseProperties = {},
85566         options = {
85567             duration: 600,
85568             complete: callback
85569         },
85570         oldIcon, newIcon,
85571         zoomingValue =  db.retrieve(constants.ENCAPSULATOR.ZOOMING);
85572
85573     if (_store[side] === true) {
85574         _store[side] = false;
85575         
85576         if (side === "left") {
85577             jQuery('#left_div').show("fast");
85578             collapseNode.removeClass("PanelCollapseBarCollapsed");
85579             collapseNode.addClass("PanelCollapseBar");
85580             collapseNode.children().remove();
85581             collapseNode.append('<img src="images/sideCollapseIconLeftSide.png" style="margin-left:330px; margin-top: 6px;"/>');
85582             collapseNode.css("top", $(window).height() - 56);
85583             collapseNode.css("left", 0);
85584             jQuery("#middle_div").css("width", $(window).width());
85585             updateZoomingValues(zoomingValue, "left");
85586         }
85587         oldIcon = (side === "left" ? "ui-icon-arrowthick-1-e" : "ui-icon-arrowthick-1-w");
85588         newIcon = (side === "left" ? "ui-icon-arrowthick-1-w" : "ui-icon-arrowthick-1-e");
85589
85590         properties[side] = "0px";
85591         collapseProperties[side] = "345px";
85592         properties.opacity = "1";
85593
85594         if (jQuery("#device-layout").position().left < 290 ) {
85595             jQuery("#device-layout").animate({left: "350px"}, 200 );
85596         }
85597     } else {
85598         _store[side] = true;
85599         
85600         if (side === "left") {
85601             collapseNode.removeClass("PanelCollapseBar");
85602             collapseNode.addClass("PanelCollapseBarCollapsed");
85603             collapseNode.children().remove();
85604             collapseNode.append('<img src="images/sideCollapseIconRightSide.png" style="position: absolute; margin-left:5px; margin-top:48%;"/>');
85605             collapseNode.css("top", 10);
85606             collapseNode.css("left", 0);
85607             collapseNode.css("margin-left", 0);
85608             jQuery('#left_div').hide("slow");
85609             jQuery("#middle_div").css("width", $(window).width());
85610             updateZoomingValues(zoomingValue, "left");
85611         }
85612
85613         oldIcon = (side === "left" ? "ui-icon-arrowthick-1-w" : "ui-icon-arrowthick-1-e");
85614         newIcon = (side === "left" ? "ui-icon-arrowthick-1-e" : "ui-icon-arrowthick-1-w");
85615
85616         properties[side] = "-340px";
85617         collapseProperties[side] = "5px";
85618         properties.opacity = "0.1";
85619     }
85620
85621     jNode.removeClass(oldIcon).addClass(newIcon);
85622
85623     jPanelNode.animate(properties, options);
85624     _persist();
85625 }
85626
85627 module.exports = {
85628     initialize: function () {
85629         var rightCollapseNode = jQuery(_RIGHT_PANEL_COLLAPSE),
85630             leftCollapseNode = jQuery(_LEFT_PANEL_COLLAPSE),
85631             device = devices.getCurrentDevice(),
85632             zoomingValue =  db.retrieve(constants.ENCAPSULATOR.ZOOMING),
85633             deviceNode = jQuery("#device-layout");
85634            
85635         _store = db.retrieveObject(_SAVE_KEY) || {
85636             left: false,
85637             right: false
85638         };
85639
85640         jQuery("#left_div").css("height", $(window).height() - 21);
85641         jQuery("#middle_div").css("width", $(window).width());
85642
85643         jQuery("#device-container").bind("mousedown", function () {
85644             jQuery("#device-maskmask").show();
85645         });
85646
85647         jQuery("#device-container").bind("mouseup", function () {
85648             jQuery("#device-maskmask").hide();
85649         });
85650
85651         jQuery("#deviceTitleBar").bind("mousedown", function () {
85652             jQuery("#device-maskmask").show();
85653         });
85654
85655         jQuery("#deviceTitleBar").bind("mouseup", function () {
85656             jQuery("#device-maskmask").hide();
85657         });
85658
85659         deviceNode.draggable({ cursor: 'move', handle: "#deviceTitleBar", containment: [0, 52, 1280, 800]});
85660         jQuery("#deviceTitle").text(device.name);
85661         if (_store.left === true) {
85662             jQuery(_LEFT_PANEL).css({
85663                 left: "-340px",
85664                 opacity: "0.1"
85665             });
85666
85667             leftCollapseNode.removeClass("PanelCollapseBar");
85668             leftCollapseNode.addClass("PanelCollapseBarCollapsed");
85669             leftCollapseNode.children().remove();
85670             leftCollapseNode.append('<img src="images/sideCollapseIconRightSide.png" style="position: absolute; margin-left:5px; margin-top:48%;"/>');
85671             leftCollapseNode.css("top", 10);
85672             leftCollapseNode.css("left", 0);
85673             leftCollapseNode.css("margin-left", 0);
85674             jQuery('#left_div').hide();
85675             jQuery("#device-layout").css("left", "21px");
85676             updateZoomingValues(zoomingValue, "left");
85677         } else {
85678             jQuery('#left_div').show("fast");
85679             leftCollapseNode.removeClass("PanelCollapseBarCollapsed");
85680             leftCollapseNode.addClass("PanelCollapseBar");
85681             leftCollapseNode.children().remove();
85682             leftCollapseNode.append('<img src="images/sideCollapseIconLeftSide.png" style="margin-left:330px; margin-top: 6px;"/>');
85683             leftCollapseNode.css("top", $(window).height() - 56);
85684             leftCollapseNode.css("left", 0);
85685             jQuery("#device-layout").css("left", "350px");
85686             updateZoomingValues(zoomingValue, "left");
85687         }   
85688
85689         if (_store.right === true) {
85690             jQuery(_RIGHT_PANEL).css({
85691                 right: "-340px",
85692                 opacity: "0.1"
85693             });
85694
85695             rightCollapseNode.css({
85696                 right: "5px"
85697             }).children("span").removeClass("ui-icon-arrowthick-1-e").addClass("ui-icon-arrowthick-1-w");
85698         }
85699
85700         leftCollapseNode.bind("click", function () {
85701             if (!_leftEngaged) {
85702                 _leftEngaged = true;
85703                 _process(leftCollapseNode, _LEFT_PANEL, "left", function () {
85704                     _leftEngaged = false;
85705                 });
85706             }
85707         });
85708
85709         rightCollapseNode.bind("click", function () {
85710             if (!_rightEngaged) {
85711                 _rightEngaged = true;
85712                 _process(rightCollapseNode, _RIGHT_PANEL, "right", function () {
85713                     _rightEngaged = false;
85714                 });
85715             }
85716         });
85717     }
85718 };
85719
85720 });
85721 define('ripple/ui/plugins/eulaCheck', function (require, exports, module) {
85722 /*
85723  *  Copyright 2011 Research In Motion Limited.
85724  *
85725  * Licensed under the Apache License, Version 2.0 (the "License");
85726  * you may not use this file except in compliance with the License.
85727  * You may obtain a copy of the License at
85728  *
85729  * http://www.apache.org/licenses/LICENSE-2.0
85730  *
85731  * Unless required by applicable law or agreed to in writing, software
85732  * distributed under the License is distributed on an "AS IS" BASIS,
85733  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
85734  * See the License for the specific language governing permissions and
85735  * limitations under the License.
85736  */
85737 var utils = require('ripple/utils'),
85738     bus = require('ripple/bus');
85739
85740 function _initializeEulaCheck() {
85741     var width = jQuery(document).width(),
85742         p = (width / 2) - 277;
85743
85744
85745     $(".eula-window").show();
85746     $(".eula-dialog").show().css({left: p + "px"});
85747
85748     $("#eula-accept").click(function () {
85749         bus.send("acceptEula", null, function (result) {
85750             $(".eula-window").hide();
85751             $(".eula-dialog").hide();
85752         });
85753     });
85754
85755     $("#eula-decline").click(function () {
85756         bus.send("disable", null, null);
85757     });
85758 }
85759
85760 module.exports = {
85761     initialize: function () {
85762         //HACK: there has to be a better way!!!
85763         if ($("#extension-url").val().match(/geelfhphabnejjhdalkjhgipohgpdnoc/)) {
85764             // do nothing, extension was installed from the Chrome Store
85765             return;
85766         }
85767
85768         bus.send("checkEula", null, function (response) {
85769             console.log("eula response: ", response);
85770             if (response === false) {
85771                 _initializeEulaCheck();
85772             }
85773         });
85774     }
85775 };
85776
85777 });
85778 define('ripple/ui/plugins/platformEvents', function (require, exports, module) {
85779 /*
85780  *  Copyright 2011 Research In Motion Limited.
85781  *
85782  * Licensed under the Apache License, Version 2.0 (the "License");
85783  * you may not use this file except in compliance with the License.
85784  * You may obtain a copy of the License at
85785  *
85786  * http://www.apache.org/licenses/LICENSE-2.0
85787  *
85788  * Unless required by applicable law or agreed to in writing, software
85789  * distributed under the License is distributed on an "AS IS" BASIS,
85790  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
85791  * See the License for the specific language governing permissions and
85792  * limitations under the License.
85793  */
85794 var _console = require('ripple/console'),
85795     platform = require('ripple/platform'),
85796     event = require('ripple/event'),
85797     exception = require('ripple/exception'),
85798     utils = require('ripple/utils');
85799
85800 module.exports = {
85801     panel: {
85802         domId: "platform-events-container",
85803         collapsed: true,
85804         pane: "right",
85805         titleName: "Platform Events",
85806         display: true
85807     },
85808     initialize: function () {
85809         var eventSelect = document.getElementById("platform-events-select"),
85810             spec = platform.current();
85811
85812         if (!spec.events) {
85813             return;
85814         }
85815
85816         utils.forEach(spec.events, function (method, name) {
85817             eventSelect.appendChild(utils.createElement("option", {
85818                 "innerText": name,
85819                 "value": name
85820             }));
85821         });
85822
85823         jQuery("#platform-events-fire").click(function () {
85824             var eventName = document.getElementById("platform-events-select").value,
85825                 args = spec.events[eventName].args ? document.getElementById("platform-events-args").value : null,
85826                 callback = spec.events[eventName].callback;
85827
85828             _console.log("fired event => " + eventName);
85829
85830             try {
85831                 callback(args);
85832             } catch (e) {
85833                 exception.throwMaskedException(e);
85834             }
85835         });
85836
85837         jQuery(eventSelect).change(function () {
85838             var argsSelect = jQuery("#platform-events-args"),
85839                 args = spec.events[this.value].args;
85840
85841             argsSelect.empty();
85842
85843             if (args) {
85844                 utils.forEach(spec.events[this.value].args, function (arg, index) {
85845                     argsSelect.append(utils.createElement("option", {
85846                         innerText: arg,
85847                         value: index
85848                     }));
85849                 });
85850
85851                 argsSelect.show();
85852             } else {
85853                 argsSelect.hide();
85854             }
85855         });
85856     }
85857 };
85858
85859 });
85860 define('ripple/ui/themes', function (require, exports, module) {
85861 /*
85862  *  Copyright 2011 Research In Motion Limited.
85863  *
85864  * Licensed under the Apache License, Version 2.0 (the "License");
85865  * you may not use this file except in compliance with the License.
85866  * You may obtain a copy of the License at
85867  *
85868  * http://www.apache.org/licenses/LICENSE-2.0
85869  *
85870  * Unless required by applicable law or agreed to in writing, software
85871  * distributed under the License is distributed on an "AS IS" BASIS,
85872  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
85873  * See the License for the specific language governing permissions and
85874  * limitations under the License.
85875  */
85876 //module.exports = ["dark", "light"];
85877 module.exports = ["light"];
85878
85879 });
85880 define('ripple/xhr', function (require, exports, module) {
85881 /*
85882  *  Copyright 2011 Research In Motion Limited.
85883  *
85884  * Licensed under the Apache License, Version 2.0 (the "License");
85885  * you may not use this file except in compliance with the License.
85886  * You may obtain a copy of the License at
85887  *
85888  * http://www.apache.org/licenses/LICENSE-2.0
85889  *
85890  * Unless required by applicable law or agreed to in writing, software
85891  * distributed under the License is distributed on an "AS IS" BASIS,
85892  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
85893  * See the License for the specific language governing permissions and
85894  * limitations under the License.
85895  */
85896 var constants = require('ripple/constants'),
85897     utils = require('ripple/utils'),
85898     ui = require('ripple/ui'),
85899     helpers = require('ripple/xhr/helpers'),
85900     XHR = window.XMLHttpRequest;
85901
85902 module.exports = {
85903     initialize: function (previous, baton) {
85904         window.XMLHttpRequest = require('ripple/xhr/base');
85905
85906         if (helpers.proxyEnabled() && !ui.registered("omnibar")) {
85907             var isFileScheme = utils.location().protocol.match(/^file:/);
85908             window.XMLHttpRequest = require(isFileScheme ? 'ripple/xhr/jsonp' : 'ripple/xhr/cors');
85909         }
85910     }
85911 };
85912
85913 });
85914 define('ripple/sensorSettings', function (require, exports, module) {
85915 /*
85916  *  Copyright 2012 Intel Corporation.
85917  *
85918  * Licensed under the Apache License, Version 2.0 (the "License");
85919  * you may not use this file except in compliance with the License.
85920  * You may obtain a copy of the License at
85921  *
85922  * http://www.apache.org/licenses/LICENSE-2.0
85923  *
85924  * Unless required by applicable law or agreed to in writing, software
85925  * distributed under the License is distributed on an "AS IS" BASIS,
85926  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
85927  * See the License for the specific language governing permissions and
85928  * limitations under the License.
85929  */
85930 var _PERSISTENCE_KEY = "sensorsettings",
85931     db = require('ripple/db'),
85932     platform = require('ripple/platform'),
85933     _currentSensorSettings = {},
85934     _self;
85935
85936 function _default(key) {
85937     var keys = key.split("."),
85938         defaults = platform.current().sensor;
85939
85940     if (keys.length === 1)
85941         return defaults[key];
85942
85943     return keys.length === 2 &&
85944            defaults[keys[0]] &&
85945            defaults[keys[0]][keys[1]] &&
85946            defaults[keys[0]][keys[1]].control ?
85947            defaults[keys[0]][keys[1]].control.value : undefined;
85948 }
85949
85950 _self = {
85951     initialize: function () {
85952         _currentSensorSettings = db.retrieveObject(_PERSISTENCE_KEY) || {};
85953     },
85954     register: function (key, obj) {
85955         _currentSensorSettings[key] = obj;
85956     },
85957
85958     persist: function (key, obj) {
85959         if (key) {
85960             _currentSensorSettings[key] = obj;
85961         }
85962
85963         db.saveObject(_PERSISTENCE_KEY, _currentSensorSettings);
85964     },
85965
85966     retrieve: function (key) {
85967         return _currentSensorSettings.hasOwnProperty(key) ?
85968                _currentSensorSettings[key] : _default(key);
85969     },
85970
85971     retrieveAsInt: function (key) {
85972         return parseInt(_self.retrieve(key), 10);
85973     },
85974
85975     retrieveAsBoolean: function (key) {
85976         return !!_self.retrieve(key);
85977     }
85978 };
85979
85980 module.exports = _self;
85981
85982 });
85983 define('ripple/utils', function (require, exports, module) {
85984 /*
85985  *  Copyright 2011 Research In Motion Limited.
85986  *
85987  * Licensed under the Apache License, Version 2.0 (the "License");
85988  * you may not use this file except in compliance with the License.
85989  * You may obtain a copy of the License at
85990  *
85991  * http://www.apache.org/licenses/LICENSE-2.0
85992  *
85993  * Unless required by applicable law or agreed to in writing, software
85994  * distributed under the License is distributed on an "AS IS" BASIS,
85995  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
85996  * See the License for the specific language governing permissions and
85997  * limitations under the License.
85998  */
85999 var self,
86000     exception = require('ripple/exception'),
86001     constants = require('ripple/constants'),
86002     _HtmlElements = ['header', 'footer', 'section', 'aside', 'nav', 'article'];
86003
86004 self = module.exports = {
86005     validateNumberOfArguments: function (lowerBound, upperBound, numberOfArguments, customExceptionType, customExceptionMessage, customExceptionObject) {
86006
86007         customExceptionMessage = customExceptionMessage || "";
86008
86009         if (arguments.length < 3 || arguments.length > 6) {
86010             exception.raise(exception.types.Argument, "Wrong number of arguments when calling: validateNumberOfArguments()");
86011         }
86012
86013         if (isNaN(lowerBound) && isNaN(upperBound) && isNaN(numberOfArguments)) {
86014             exception.raise(exception.types.ArgumentType, "(validateNumberOfArguments) Arguments are not numbers");
86015         }
86016
86017         lowerBound = parseInt(lowerBound, 10);
86018         upperBound = parseInt(upperBound, 10);
86019         numberOfArguments = parseInt(numberOfArguments, 10);
86020
86021         if (numberOfArguments < lowerBound || numberOfArguments > upperBound) {
86022             exception.raise((customExceptionType || exception.types.ArgumentLength), (customExceptionMessage + "\n\nWrong number of arguments"), customExceptionObject);
86023         }
86024
86025     },
86026
86027     validateArgumentType: function (arg, argType, customExceptionType, customExceptionMessage, customExceptionObject) {
86028         var invalidArg = false,
86029             msg;
86030
86031         switch (argType) {
86032         case "array":
86033             if (!arg instanceof Array) {
86034                 invalidArg = true;
86035             }
86036             break;
86037         case "date":
86038             if (!arg instanceof Date) {
86039                 invalidArg = true;
86040             }
86041             break;
86042         case "integer":
86043             if (typeof arg === "number") {
86044                 if (arg !== Math.floor(arg)) {
86045                     invalidArg = true;
86046                 }
86047             }
86048             else {
86049                 invalidArg = true;
86050             }
86051             break;
86052         default:
86053             if (typeof arg !== argType) {
86054                 invalidArg = true;
86055             }
86056             break;
86057         }
86058
86059         if (invalidArg) {
86060             msg = customExceptionMessage +  ("\n\nInvalid Argument type. argument: " + arg + " ==> was expected to be of type: " + argType);
86061             exception.raise((customExceptionType || exception.types.ArgumentType), msg, customExceptionObject);
86062         }
86063     },
86064
86065     validateMultipleArgumentTypes: function (argArray, argTypeArray, customExceptionType, customExceptionMessage, customExceptionObject) {
86066         for (var i = 0; i < argArray.length; i++) {
86067             this.validateArgumentType(argArray[i], argTypeArray[i], customExceptionType, customExceptionMessage, customExceptionObject);
86068         }
86069     },
86070
86071     createElement: function (elementType, attributes) {
86072         var d = document.createElement(elementType);
86073
86074         if (attributes) {
86075             this.forEach(attributes, function (attributeValue, attributeName) {
86076
86077                 switch (attributeName.toLowerCase()) {
86078
86079                 case "innerhtml":
86080                     d.innerHTML = attributeValue;
86081                     break;
86082
86083                 case "innertext":
86084                     d.innerText = attributeValue;
86085                     break;
86086
86087                 default:
86088                     d.setAttribute(attributeName, attributeValue);
86089                 }
86090
86091             });
86092         }
86093
86094         return d;
86095     },
86096
86097
86098     loadHTMLElements: function () {
86099         for (var i = 0; i < _HtmlElements.length; i += 1) {
86100             document.createElement(_HtmlElements[i]);
86101         }
86102     },
86103
86104     getAllStylesheetRules: function getAllStylesheetRules(title) {
86105         this.validateNumberOfArguments(1, 1, arguments.length);
86106
86107         var i, x, sheet, rules, styles_array = [];
86108
86109         // get style sheet according to title
86110         for (i = 0; i < document.styleSheets.length; i += 1) {
86111
86112             sheet = document.styleSheets[i];
86113             rules = sheet.cssRules;
86114
86115             if (rules) {
86116                 for (x = 0; x < rules.length; x += 1) {
86117                     if (rules[x].selectorText && rules[x].selectorText === (title.toString())) {
86118                         styles_array.push(rules[x]);
86119                     }
86120                 }
86121             }
86122         }
86123
86124         return (styles_array);
86125     },
86126
86127     location: function () {
86128         return window.location;
86129     },
86130
86131     queryString: function () {
86132         // trim the leading ? and split each name=value
86133         var args = this.location().search.replace(/^\?/, '').split('&');
86134
86135         return args.reduce(function (obj, value) {
86136             if (value) {
86137                 value = value.toLowerCase().split("=");
86138                 obj[value[0]] = value[1];
86139             }
86140             return obj;
86141         }, {});
86142     },
86143
86144     extensionUrl: function () {
86145         return document.getElementById("extension-url").innerText;
86146     },
86147
86148     appLocation: function () {
86149         if (require('ripple/ui').registered("omnibar")) {
86150             /* rootURL can only get url saved from 'FrameHistoryChange' event
86151                it causes trouble when navigating directory through online 
86152                version as index.html is automatically loaded.
86153                Need a way to get more updated URL */
86154
86155             var path = require('ripple/ui/plugins/omnibar').rootURL(),
86156                 parts;
86157
86158             if ((parts = path.match(/^((http[s]?|ftp|file):\/\/)(.+\/)?([^\/].+)$/i)) !== null && parts.length === 5) {
86159                 // this is a path already.
86160                 if (path.search(/\/$/, "") !== -1) {
86161                     return path;
86162                 }
86163                 if (parts[4] === "about:blank") {
86164                     path = "";
86165                 }
86166                 else if (parts[3]) {
86167                     path = parts[1] + parts[3];
86168                     if (parts[4].indexOf(".") === -1) {
86169                         path += parts[4] + "/";
86170                     }
86171                 }
86172                 else {
86173                     path = parts[1] + parts[4] + "/";
86174                 }
86175             }
86176             else {
86177                 path = "";
86178             }
86179             return path;
86180         }
86181         return self.rippleLocation();
86182     },
86183
86184     rippleLocation: function () {
86185         var loc = self.location(),
86186             parts = loc.pathname.replace(/\/$/, "").split("/"),
86187             base = "",
86188             port = loc.port ? ":" + loc.port : "";
86189
86190         if (parts[parts.length - 1].indexOf(".") !== -1) {
86191             parts = parts.splice(0, parts.length - 1);
86192         }
86193         base = parts.join("/");
86194
86195         return loc.protocol + "//" + loc.hostname + port + base + "/";
86196     },
86197
86198     arrayContains: function (array, obj) {
86199         var i = array.length;
86200         while (i--) {
86201             if (array[i] === obj) {
86202                 return true;
86203             }
86204         }
86205         return false;
86206     },
86207
86208     some: function (obj, predicate, scope) {
86209         if (obj instanceof Array) {
86210             return obj.some(predicate, scope);
86211         }
86212         else {
86213             var values = self.map(obj, predicate, scope);
86214
86215             return self.reduce(values, function (some, value) {
86216                 return value ? value : some;
86217             }, false);
86218         }
86219     },
86220
86221     count: function (obj) {
86222         return self.sum(obj, function (total) {
86223             return 1;
86224         });
86225     },
86226
86227     sum: function (obj, selector, scope) {
86228         var values = self.map(obj, selector, scope);
86229         return self.reduce(values, function (total, value) {
86230             return total + value;
86231         });
86232     },
86233
86234     max: function (obj, selector, scope) {
86235         var values = self.map(obj, selector, scope);
86236         return self.reduce(values, function (max, value) {
86237             return max < value ? value : max;
86238         }, Number.MIN_VALUE);
86239     },
86240
86241     min: function (obj, selector, scope) {
86242         var values = self.map(obj, selector, scope);
86243         return self.reduce(values, function (min, value) {
86244             return min > value ? value : min;
86245         }, Number.MAX_VALUE);
86246     },
86247
86248     forEach: function (obj, action, scope) {
86249         if (obj instanceof Array) {
86250             return obj.forEach(action, scope);
86251         }
86252         else {
86253             self.map(obj, action, scope);
86254         }
86255     },
86256
86257     filter: function (obj, predicate, scope) {
86258         if (obj instanceof Array) {
86259             return obj.filter(predicate, scope);
86260         }
86261         else {
86262             var result = [];
86263             self.forEach(obj, function (value, index) {
86264                 if (predicate.apply(scope, [value, index])) {
86265                     result.push(value);
86266                 }
86267
86268             }, scope);
86269
86270             return result;
86271         }
86272     },
86273
86274     reduce: function (obj, func, init, scope) {
86275         var i,
86276             initial = init === undefined ? 0 : init,
86277             result = initial;
86278
86279
86280         if (obj instanceof Array) {
86281             return obj.reduce(func, initial);
86282         }
86283         else if (obj instanceof NamedNodeMap) {
86284             for (i = 0; i < obj.length; i++) {
86285                 result = func.apply(scope, [result, obj[i], i]);
86286             }
86287         }
86288         else {
86289             for (i in obj) {
86290                 if (obj.hasOwnProperty(i)) {
86291                     result = func.apply(scope, [result, obj[i], i]);
86292                 }
86293             }
86294         }
86295
86296         return result;
86297
86298     },
86299
86300     map: function (obj, func, scope) {
86301         var i,
86302             returnVal = null,
86303             result = [];
86304
86305         if (obj instanceof Array) {
86306             return obj.map(func, scope);
86307         }
86308         else if (obj instanceof NamedNodeMap) {
86309             for (i = 0; i < obj.length; i++) {
86310                 returnVal = func.apply(scope, [obj[i], i]);
86311                 result.push(returnVal);
86312             }
86313         }
86314         else {
86315             for (i in obj) {
86316                 if (obj.hasOwnProperty(i)) {
86317                     returnVal = func.apply(scope, [obj[i], i]);
86318                     result.push(returnVal);
86319                 }
86320             }
86321         }
86322
86323         return result;
86324     },
86325
86326     regexSanitize: function (regexString) {
86327         return regexString.replace("^", "\\^")
86328                     .replace("$", "\\$")
86329                     .replace("(", "\\(")
86330                     .replace(")", "\\)")
86331                     .replace("<", "\\<")
86332                     .replace("[", "\\[")
86333                     .replace("{", "\\{")
86334                     .replace(/\\/, "\\\\")
86335                     .replace("|", "\\|")
86336                     .replace(">", "\\>")
86337                     .replace(".", "\\.")
86338                     .replace("*", "\\*")
86339                     .replace("+", "\\+")
86340                     .replace("?", "\\?");
86341     },
86342
86343     bindAutoSaveEvent: function (node, saveCallback) {
86344         var oldSetTimeoutId,
86345             jNode = jQuery(node);
86346
86347         jNode.bind("keyup", function (event) {
86348             if (event.keyCode !== 9) {
86349                 clearTimeout(oldSetTimeoutId);
86350                 oldSetTimeoutId = window.setTimeout(function () {
86351                     saveCallback();
86352                 }, 500);
86353             }
86354         });
86355     },
86356
86357     find: function (comparison, collection, startInx, endInx, callback) {
86358         var results = [],
86359             compare = function (s, pattern) {
86360
86361                 if (typeof(s) !== "string" || pattern === null) {
86362                     return s === pattern;
86363                 }
86364
86365                 var regex = pattern.replace(/\./g, "\\.")
86366                                    .replace(/\^/g, "\\^")
86367                                    .replace(/\*/g, ".*")
86368                                    .replace(/\\\.\*/g, "\\*");
86369
86370                 regex = "^".concat(regex, "$");
86371
86372                 return !!s.match(new RegExp(regex, "i"));
86373             };
86374
86375         self.forEach(collection, function (c) {
86376             var match,
86377                 fail = false;
86378
86379             self.forEach(comparison, function (value, key) {
86380                 if (!fail && value !== undefined) {
86381
86382                     if (compare(c[key], value)) {
86383                         match = c;
86384                     }
86385                     else {
86386                         fail = true;
86387                         match = null;
86388                     }
86389                 }
86390             });
86391
86392             if (match) {
86393                 results.push(match);
86394             }
86395         });
86396
86397         if (callback) {
86398             if (startInx === undefined) {
86399                 startInx = 0;
86400             }
86401             if (endInx === undefined) {
86402                 endInx = results.length;
86403             }
86404             if (startInx === endInx) {
86405                 endInx = startInx + 1;
86406             }
86407
86408             callback.apply(null, [results.slice(startInx, endInx)]);
86409         }
86410     },
86411
86412     mixin: function (mixin, to) {
86413         for (var prop in mixin) {
86414             if (Object.hasOwnProperty.call(mixin, prop)) {
86415                 to[prop] = mixin[prop];
86416             }
86417         }
86418         return to;
86419     },
86420
86421     copy: function (obj) {
86422         var i,
86423             newObj = jQuery.isArray(obj) ? [] : {};
86424
86425         if (typeof obj === 'number' ||
86426             typeof obj === 'string' ||
86427             typeof obj === 'boolean' ||
86428             obj === null ||
86429             obj === undefined) {
86430             return obj;
86431         }
86432
86433         if (obj instanceof Date) {
86434             return new Date(obj);
86435         }
86436
86437         if (obj instanceof RegExp) {
86438             return new RegExp(obj);
86439         }
86440
86441         for (i in obj) {
86442             if (obj.hasOwnProperty(i)) {
86443                 if (obj[i] && typeof obj[i] === "object") {
86444                     if (obj[i] instanceof Date) {
86445                         newObj[i] = obj[i];
86446                     }
86447                     else {
86448                         newObj[i] = self.copy(obj[i]);
86449                     }
86450                 }
86451                 else {
86452                     newObj[i] = obj[i];
86453                 }
86454             }
86455         }
86456
86457         return newObj;
86458     },
86459
86460     navHelper: function () {
86461         return {
86462             getHeading: function (lat1, lon1, lat2, lon2) {
86463                 var dLon = this.rad(lon2 - lon1),
86464                     llat1 = this.rad(lat1),
86465                     llat2 = this.rad(lat2),
86466                     y = Math.sin(dLon) * Math.cos(llat2),
86467                     x = Math.cos(llat1) * Math.sin(llat2) - Math.sin(llat1) * Math.cos(llat2) * Math.cos(dLon);
86468                 return (this.deg(Math.atan2(y, x)) + 360) % 360;
86469             },
86470
86471             getDistance: function (lat1, lon1, lat2, lon2) {
86472                 var dLat = this.rad(lat2 - lat1),
86473                     dLon = this.rad(lon2 - lon1),
86474                     a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(this.rad(lat1)) * Math.cos(this.rad(lat2)) * Math.sin(dLon / 2) * Math.sin(dLon / 2),
86475                     c = 2 * Math.asin(Math.sqrt(a)),
86476                     d = 6378100 * c;
86477                 return d;
86478             },
86479
86480             simulateTravel: function (lat, lon, hdg, dist) {
86481                 var lat1 = this.rad(lat),
86482                     lon1 = this.rad(lon),
86483                     brng = this.rad(hdg),
86484                     angularDistance = dist / 6378100,
86485                     lat2 = Math.asin(Math.sin(lat1) * Math.cos(angularDistance) + Math.cos(lat1) * Math.sin(angularDistance) * Math.cos(brng)),
86486                     lon2 = lon1 + Math.atan2(Math.sin(brng) * Math.sin(angularDistance) * Math.cos(lat1), Math.cos(angularDistance) - Math.sin(lat1) * Math.sin(lat2));
86487                 lon2 = (lon2 + 3 * Math.PI) % (2 * Math.PI) - Math.PI; // Normalise to -180..+180
86488
86489                 return {
86490                     latitude: this.deg(lat2),
86491                     longitude: this.deg(lon2)
86492                 };
86493             },
86494
86495             deg: function (num) {
86496                 return num * 180 / Math.PI;
86497             },
86498
86499             rad: function (num) {
86500                 return num * Math.PI / 180;
86501             }
86502         };
86503     },
86504
86505     getURIParams: function (uriString) {
86506         var params = {};
86507
86508         uriString.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(str, key, value) {
86509             params[key] = value;
86510         });
86511
86512         return params;
86513     }
86514 };
86515
86516 });
86517 define('ripple/fs', function (require, exports, module) {
86518 /*
86519  *  Copyright 2011 Research In Motion Limited.
86520  *
86521  * Licensed under the Apache License, Version 2.0 (the "License");
86522  * you may not use this file except in compliance with the License.
86523  * You may obtain a copy of the License at
86524  *
86525  * http://www.apache.org/licenses/LICENSE-2.0
86526  *
86527  * Unless required by applicable law or agreed to in writing, software
86528  * distributed under the License is distributed on an "AS IS" BASIS,
86529  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
86530  * See the License for the specific language governing permissions and
86531  * limitations under the License.
86532  */
86533 var utils = require('ripple/utils'),
86534     constants = require('ripple/constants'),
86535     event = require('ripple/event'),
86536     _console = require('ripple/console'),
86537     _self, _fs;
86538
86539 function _map(array, callback) {
86540     var map = [], i;
86541     for (i = 0; i < array.length; i++) {
86542         map[i] = callback(array[i], i);
86543     }
86544     return map;
86545 }
86546
86547 function _resolveLocalFileSystemURL(path, success, error) {
86548     return (window.resolveLocalFileSystemURL || window.webkitResolveLocalFileSystemURL)(path, success, error);
86549 }
86550
86551 function _blobBuilder() {
86552     var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder;
86553     return new BlobBuilder();
86554 }
86555
86556 function _error(e) {
86557     var msg = '';
86558
86559     switch (e.code) {
86560     case FileError.QUOTA_EXCEEDED_ERR:
86561         msg = 'QUOTA_EXCEEDED_ERR';
86562         break;
86563     case FileError.NOT_FOUND_ERR:
86564         msg = 'NOT_FOUND_ERR';
86565         break;
86566     case FileError.SECURITY_ERR:
86567         msg = 'SECURITY_ERR';
86568         break;
86569     case FileError.INVALID_MODIFICATION_ERR:
86570         msg = 'INVALID_MODIFICATION_ERR';
86571         break;
86572     case FileError.INVALID_STATE_ERR:
86573         msg = 'INVALID_STATE_ERR';
86574         break;
86575     default:
86576         msg = 'Unknown Error';
86577         break;
86578     }
86579
86580     _console.log('FileSystem error: ' + msg);
86581 }
86582
86583 _self = {
86584     initialize: function (prev, baton) {
86585         try {
86586             var requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem;
86587
86588             if (requestFileSystem) {
86589                 baton.take();
86590             }
86591
86592             requestFileSystem(window.TEMPORARY, constants.FS_SIZE, function (fs) {
86593                 _fs = fs;
86594                 event.trigger("FileSystemInitialized", null, true);
86595                 baton.pass();
86596             }, _error);
86597         }
86598         catch (e) {
86599             console.log("File System Not Available");
86600         }
86601     },
86602
86603     ls: function (path, success, error) {
86604         path = path || "/";
86605
86606         _fs.root.getDirectory(path, {}, function (dirEntry) {
86607             var dirReader = dirEntry.createReader();
86608             dirReader.readEntries(function (entries) {
86609                 success(_map(entries, function (entry, index) {
86610                     return entry;
86611                 }));
86612             }, error);
86613         }, error);
86614     },
86615
86616     rm: function (path, success, error, options) {
86617         options = options || {};
86618
86619         _fs.root[options.recursive ? "getDirectory" : "getFile"](path, {create: false}, function (entry) {
86620             entry[options.recursive ? "removeRecursively" : "remove"](function () {
86621                 success();
86622             }, error);
86623         }, error);
86624     },
86625
86626     rmdir: function (path, success, error, options) {
86627         options = options || {};
86628
86629         _fs.root.getDirectory(path, {create: false}, function (entry) {
86630             entry.remove(function () {
86631                 success();
86632             }, error);
86633         }, error);
86634     },
86635
86636     mkdir: function (path, success, error) {
86637         _fs.root.getDirectory(path, {create: true}, function (dirEntry) {
86638             success(dirEntry);
86639         }, error);
86640     },
86641
86642     mv: function (from, to, success, error) {
86643         var path = to.replace(/^\//, "").split("/"),
86644             fileName = path.splice(path.length - 1, 1).toString();
86645
86646         _self.stat(from, function (entry) {
86647             _self.stat(path.length > 0 ? path.join("/") : "/", function (dest) {
86648                 entry.moveTo(dest, fileName, function (finalDestination) {
86649                     success(finalDestination);
86650                 }, error);
86651             }, error);
86652         }, error);
86653     },
86654
86655     touch: function (path, success, error) {
86656         _fs.root.getFile(path, {create: true}, function (fileEntry) {
86657             success(fileEntry);
86658         }, error);
86659     },
86660
86661     cp: function (from, to, success, error) {
86662         var path = to.replace(/^\//, "").split("/"),
86663             fileName = path.splice(path.length - 1, 1).toString();
86664
86665         _self.stat(from, function (entry) {
86666             _self.stat(path.length > 0 ? path.join("/") : "/", function (dest) {
86667                 entry.copyTo(dest, fileName, function (finalDestination) {
86668                     success(finalDestination);
86669                 }, error);
86670             }, error);
86671         }, error);
86672     },
86673
86674     stat: function (path, success, error) {
86675         var url = "filesystem:" + utils.location().origin + "/temporary/" + path;
86676         _resolveLocalFileSystemURL(url, function (entry) {
86677             success(entry);
86678         }, error);
86679     },
86680
86681     write: function (path, contents, success, error, options) {
86682         options = options || {};
86683
86684         function write(entry) {
86685             entry.createWriter(function (fileWriter) {
86686                 var bb = _blobBuilder();
86687
86688                 fileWriter.onwriteend = function (progressEvent) {
86689                     success(entry);
86690                 };
86691                 fileWriter.onerror = error;
86692
86693                 if (options.mode === "append") {
86694                     fileWriter.seek(fileWriter.length);
86695                 }
86696
86697                 bb.append(contents);
86698                 fileWriter.write(bb.getBlob('text/plain'));
86699             }, error);
86700         }
86701
86702         _self.stat(path, function (entry) {
86703             if (options.mode === "append") {
86704                 write(entry);
86705             } else {
86706                 _self.rm(path, function () {
86707                     _self.touch(path, write, error);
86708                 }, error);
86709             }
86710         }, function (e) {
86711             if (e.code === FileError.NOT_FOUND_ERR) {
86712                 _self.touch(path, write, error);
86713             } else {
86714                 error(e);
86715             }
86716         });
86717     },
86718
86719     read: function (path, success, error) {
86720         _self.stat(path, function (entry) {
86721             entry.file(function (file) {
86722                 var reader = new FileReader();
86723
86724                 reader.onloadend = function (progressEvent) {
86725                     success(progressEvent.target.result);
86726                 };
86727                 reader.onerror = error;
86728
86729                 reader.readAsText(file);
86730             }, error);
86731         }, error);
86732     }
86733 };
86734
86735 module.exports = _self;
86736
86737 });
86738 define('ripple/geo', function (require, exports, module) {
86739 /*
86740  *  Copyright 2011 Research In Motion Limited.
86741  *
86742  * Licensed under the Apache License, Version 2.0 (the "License");
86743  * you may not use this file except in compliance with the License.
86744  * You may obtain a copy of the License at
86745  *
86746  * http://www.apache.org/licenses/LICENSE-2.0
86747  *
86748  * Unless required by applicable law or agreed to in writing, software
86749  * distributed under the License is distributed on an "AS IS" BASIS,
86750  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
86751  * See the License for the specific language governing permissions and
86752  * limitations under the License.
86753  */
86754 var db = require('ripple/db'),
86755     exception = require('ripple/exception'),
86756     event = require('ripple/event'),
86757     utils = require('ripple/utils'),
86758     _positionInfo = {
86759         "latitude": 39.968362,
86760         "longitude": 116.410186,
86761         "altitude": 50,
86762         "accuracy": 150,
86763         "altitudeAccuracy": 80,
86764         "heading": 0,
86765         "speed": 0,
86766         "cellID": 1130433
86767     },
86768     self;
86769
86770 function _serialize(settings) {
86771     var tempSettings = utils.copy(settings);
86772     tempSettings.position.timeStamp = "new Date(" + tempSettings.position.timeStamp.getTime() + ")";
86773     return tempSettings;
86774 }
86775
86776 function _validatePositionInfo(pInfo) {
86777     return (pInfo &&
86778         !(isNaN(pInfo.latitude) ||
86779         isNaN(pInfo.longitude) ||
86780         isNaN(pInfo.altitude) ||
86781         isNaN(pInfo.accuracy) ||
86782         isNaN(pInfo.altitudeAccuracy) ||
86783         isNaN(pInfo.heading) ||
86784         isNaN(pInfo.speed) ||
86785         isNaN(pInfo.cellID))) ? true : false;
86786 }
86787
86788 self = module.exports = {
86789     initialize: function () {
86790         var settings = db.retrieveObject("geosettings");
86791         if (settings) {
86792             utils.forEach(_positionInfo, function (value, key) {
86793                 _positionInfo[key] = parseFloat(settings.position[key] || value);
86794             });
86795
86796             self.timeout = settings.timeout;
86797             self.delay = settings.delay || 0;
86798
86799         }
86800     },
86801
86802     getPositionInfo: function () {
86803         var pi = utils.copy(_positionInfo);
86804         pi.timeStamp = new Date();
86805
86806         return pi;
86807     },
86808
86809     updatePositionInfo: function (newPositionInfo, delay, timeout) {
86810         if (!_validatePositionInfo(newPositionInfo)) {
86811             exception.raise(exception.types.Geo, "invalid positionInfo object");
86812         }
86813
86814         _positionInfo = utils.copy(newPositionInfo);
86815         _positionInfo.timeStamp = new Date();
86816
86817         self.delay = delay || 0;
86818         self.timeout = timeout;
86819
86820         db.saveObject("geosettings", _serialize({
86821             position: _positionInfo,
86822             delay: self.delay,
86823             timeout: self.timeout
86824         }));
86825
86826         event.trigger("PositionInfoUpdatedEvent", [_positionInfo]);
86827     },
86828
86829     timeout: false,
86830     delay: 0,
86831     map: {}
86832 };
86833
86834 });
86835 define('ripple/console', function (require, exports, module) {
86836 /*
86837  *  Copyright 2011 Research In Motion Limited.
86838  *
86839  * Licensed under the Apache License, Version 2.0 (the "License");
86840  * you may not use this file except in compliance with the License.
86841  * You may obtain a copy of the License at
86842  *
86843  * http://www.apache.org/licenses/LICENSE-2.0
86844  *
86845  * Unless required by applicable law or agreed to in writing, software
86846  * distributed under the License is distributed on an "AS IS" BASIS,
86847  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
86848  * See the License for the specific language governing permissions and
86849  * limitations under the License.
86850  */
86851 var _self;
86852
86853 function _log(msg, method) {
86854     try {
86855         console[method](_self.prefix ? _self.prefix + " :: " + msg : msg);
86856     } catch (e) {
86857         // silent
86858     }
86859 }
86860
86861 _self = {
86862     log: function (msg) {
86863         _log(msg, "log");
86864     },
86865
86866     warn: function (msg) {
86867         _log(msg, "warn");
86868     },
86869
86870     error: function (msg) {
86871         _log(msg, "error");
86872     }
86873 };
86874
86875 module.exports = _self;
86876
86877 });
86878 define('ripple/resizer', function (require, exports, module) {
86879 /*
86880  *  Copyright 2011 Research In Motion Limited.
86881  *
86882  * Licensed under the Apache License, Version 2.0 (the "License");
86883  * you may not use this file except in compliance with the License.
86884  * You may obtain a copy of the License at
86885  *
86886  * http://www.apache.org/licenses/LICENSE-2.0
86887  *
86888  * Unless required by applicable law or agreed to in writing, software
86889  * distributed under the License is distributed on an "AS IS" BASIS,
86890  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
86891  * See the License for the specific language governing permissions and
86892  * limitations under the License.
86893  */
86894 var db = require('ripple/db'),
86895     exception = require('ripple/exception'),
86896     utils = require('ripple/utils'),
86897     devices = require('ripple/devices'),
86898     constants = require('ripple/constants'),
86899     event = require('ripple/event'),
86900     _win,
86901     _doc,
86902     _self;
86903
86904 function _validateLayoutType(layoutType) {
86905     return (layoutType === "landscape" || layoutType === "portrait");
86906 }
86907
86908 function _validateOrientation(orientation) {
86909     return (orientation === "landscape" || orientation === "portrait");
86910 }
86911
86912 function _getContainers() {
86913     return {
86914         device: {
86915             div: document.getElementById("device-container"),
86916             containerClass: document.getElementById("device-container").getAttribute("class") || ""
86917         },
86918         viewport: {
86919             div: document.getElementById("viewport-container"),
86920             containerClass: document.getElementById("viewport-container").getAttribute("class") || ""
86921         },
86922         "menu-button": {
86923             div: document.getElementById(constants.COMMON.MENU_BUTTON),
86924             containerClass: document.getElementById(constants.COMMON.MENU_BUTTON).getAttribute("class") || ""
86925         },
86926         "back-button": {
86927             div: document.getElementById(constants.COMMON.BACK_BUTTON),
86928             containerClass: document.getElementById(constants.COMMON.BACK_BUTTON).getAttribute("class") || ""
86929         }
86930     };
86931 }
86932
86933 function _setContainers(containers, device, orientation) {
86934     var suffix = {
86935             portrait:  "-wrapper" + (device.skin ? "-" + device.skin : ""),
86936             landscape: "-wrapper-landscape" + (device.skin ? "-" + device.skin : "")
86937         };
86938
86939     utils.forEach(containers, function (container, key) {
86940         container.div.setAttribute("class", container.containerClass.replace(/\s.*$/, "") + " " + key + suffix[orientation]);
86941     });
86942 }
86943
86944 function _getDimensions(device, orientation) {
86945     return {
86946         deviceWidth: orientation === "portrait" ? device.screen.width : device.screen.height,
86947         deviceHeight: orientation === "portrait" ? device.screen.height : device.screen.width,
86948         paddingLeft: device.viewPort[orientation].paddingLeft,
86949         paddingTop: device.viewPort[orientation].paddingTop,
86950         viewPort: {
86951             width: device.viewPort[orientation].width,
86952             height: device.viewPort[orientation].height
86953         }
86954     };
86955 }
86956
86957 function _formatSkin(containers, dimensions) {
86958     var scaleFactor = dimensions.deviceWidth / dimensions.viewPort.width,
86959     scaleString = "scale(" + scaleFactor + ")";
86960
86961     containers.device.div.style.width = (dimensions.deviceWidth + 4) + "px";
86962     containers.device.div.style.height = (dimensions.deviceHeight + 4) + "px";
86963     containers.viewport.div.style.width = dimensions.viewPort.width + "px";
86964     containers.viewport.div.style.height = dimensions.viewPort.height + "px";
86965     containers.viewport.div.style.padding = "0";
86966
86967     jQuery('#viewport-container').css('-webkit-transform', scaleString);
86968     jQuery('#viewport-container').css('-webkit-transform-origin', 'left top');
86969 }
86970
86971 function _setOrientation(layout) {
86972     _win.orientation = window.orientation = layout === "portrait" ? 0 : 90;
86973 }
86974
86975 function _upDateHWKeyPanelPosition(orientation, scaleFactor) {
86976     var left = 0;
86977
86978     if (orientation === 'portrait') {
86979         if (db.retrieve("layout") === "portrait") {
86980             left = 350 + $('#device-layout').width()*scaleFactor;
86981         } else {
86982             left = 470 + $('#device-layout').height()*scaleFactor;
86983         }
86984     } else {
86985         if (db.retrieve("layout") === "portrait") {
86986             left = 490 + $('#device-layout').height()*scaleFactor;
86987         } else {
86988             left = 350 + $('#device-layout').width()*scaleFactor;
86989         }
86990     }
86991
86992     $("#hwkeys-panel").css("top", "40px");
86993     $("#hwkeys-panel").css("left", left+"px");
86994 }
86995
86996 function _getTransformString(orientation, scaleFactor) {
86997     var transformString = "",
86998     offset;
86999
87000     if (orientation === "landscape") {
87001         if (db.retrieve("layout") === "portrait") {
87002             offset = devices.getCurrentDevice().screen.height * scaleFactor + 170;
87003             transformString = "translate("+ offset + "px, 0px) rotate(90deg) scale("+ scaleFactor +")";
87004         } else {
87005             transformString = "translate(0px,0px) rotate(0deg) scale("+ scaleFactor +")";
87006         }
87007     } else {
87008         if (db.retrieve("layout") === "portrait") {
87009             transformString = "translate(0px,0px) rotate(0deg) scale("+ scaleFactor +")";
87010         } else {
87011             offset = devices.getCurrentDevice().screen.width * scaleFactor + 150;
87012             transformString = "translate("+ offset + "px, 0px) rotate(90deg) scale("+ scaleFactor +")";
87013         }
87014     }
87015
87016     return transformString;
87017 }
87018
87019
87020 _self = {
87021     init: function (win, doc) {
87022         _win = win;
87023         _doc = doc;
87024
87025         var layout = db.retrieve("layout") || "portrait";
87026
87027         _setOrientation(layout);
87028
87029         _win.onorientationchange = undefined;
87030
87031         $(".middle").scroll(function () {
87032             if (this.scrollLeft > 0) {
87033                 this.scrollLeft = 0;
87034             }
87035         });
87036     },
87037     // TODO: redo/refactor this in general, seems bloated, also devices REQUIRE viewport schemas which they shouldnt
87038     resize: function (device) {
87039         var layout = db.retrieve("layout"),
87040             orientation = "portrait",
87041             containers, dimensions;
87042
87043         if (layout && layout === "landscape" && device.viewPort.landscape) {
87044             orientation = "landscape";
87045         }
87046
87047         containers = _getContainers();
87048         _setContainers(containers, device, orientation);
87049
87050         dimensions = _getDimensions(device, orientation);
87051         if (!device.skin) {
87052             _formatSkin(containers, dimensions);
87053         }
87054
87055         event.trigger("ScreenChangeDimensions", [dimensions.viewPort.width, dimensions.viewPort.height]);
87056     },
87057
87058     changeLayoutType: function (layoutType) {
87059         var orientation = db.retrieve("deviceOrientation") || "portrait";
87060         if (!_validateLayoutType(layoutType)) {
87061             exception.raise(exception.types.LayoutType, "unknown layout type requested!");
87062         }
87063
87064         db.save("layout", layoutType);
87065         _self.resize(devices.getCurrentDevice());
87066         _self.rotateDevice(orientation);
87067
87068         if (!_win) return;
87069         _setOrientation(layoutType);
87070     },
87071
87072     scaleDevice: function (scaleFactor) {
87073         var orientation = db.retrieve("deviceOrientation") || "portrait",
87074         transformString = _getTransformString(orientation, scaleFactor);
87075         _upDateHWKeyPanelPosition(orientation, scaleFactor);
87076         db.save("deviceScaleFactor", scaleFactor);
87077         jQuery('#device-layout').css('-webkit-transform-origin', '0% 0%');
87078         jQuery('#device-layout').css('-webkit-transform',  transformString);
87079     },
87080
87081     rotateDevice: function (orientation) {
87082         if (!_validateOrientation(orientation)) {
87083             exception.raise(exception.types.OrientationType, "unknown orientation type requested!");
87084         }
87085
87086         db.save("deviceOrientation", orientation);
87087         jQuery('#device-layout').css('-webkit-transform-origin', '0% 0%');
87088         jQuery('#device-layout').css('-webkit-transform',
87089                 _getTransformString(orientation, db.retrieve("deviceScaleFactor")));
87090         _upDateHWKeyPanelPosition(orientation, db.retrieve("deviceScaleFactor"))
87091         if (!_win) return;
87092         if (_win.onorientationchange) {
87093             _win.onorientationchange();
87094         }
87095
87096         var evt = _doc.createEvent("Event");
87097         evt.initEvent("orientationchange", true, true);
87098         _win.dispatchEvent(evt);
87099     }
87100 };
87101
87102 module.exports = _self;
87103
87104 });
87105 define('ripple/platform/tizen/2.0/BluetoothSocket', function (require, exports, module) {
87106 /*
87107  *  Copyright 2013 Intel Corporation.
87108  *
87109  * Licensed under the Apache License, Version 2.0 (the "License");
87110  * you may not use this file except in compliance with the License.
87111  * You may obtain a copy of the License at
87112  *
87113  * http://www.apache.org/licenses/LICENSE-2.0
87114  *
87115  * Unless required by applicable law or agreed to in writing, software
87116  * distributed under the License is distributed on an "AS IS" BASIS,
87117  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
87118  * See the License for the specific language governing permissions and
87119  * limitations under the License.
87120  */
87121
87122 var utils = require('ripple/utils'),
87123     event = require('ripple/event'),
87124     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
87125     t = require('ripple/platform/tizen/2.0/typecast'),
87126     WebAPIException = require('ripple/platform/tizen/2.0/WebAPIException'),
87127     BluetoothSocket,
87128     _security;
87129
87130 BluetoothSocket = function (prop) {
87131     var bluetoothSocket = {}, buffer = [];
87132
87133     _security = prop.metaData;
87134
87135     bluetoothSocket.uuid      = prop.uuid;
87136     bluetoothSocket.state     = prop.state;
87137     bluetoothSocket.peer      = prop.peer;
87138     bluetoothSocket.onmessage = null;
87139     bluetoothSocket.onclose   = null;
87140
87141     this.__defineGetter__("uuid", function () {
87142         return bluetoothSocket.uuid;
87143     });
87144
87145     this.__defineGetter__("state", function () {
87146         return bluetoothSocket.state;
87147     });
87148
87149     this.__defineGetter__("peer", function () {
87150         return bluetoothSocket.peer;
87151     });
87152
87153     this.__defineGetter__("onmessage", function () {
87154         return bluetoothSocket.onmessage;
87155     });
87156     this.__defineSetter__("onmessage", function (val) {
87157         try {
87158             bluetoothSocket.onmessage = t.SuccessCallback(val, "?");
87159         } catch (e) {
87160         }
87161     });
87162
87163     this.__defineGetter__("onclose", function () {
87164         return bluetoothSocket.onclose;
87165     });
87166     this.__defineSetter__("onclose", function (val) {
87167         try {
87168             bluetoothSocket.onclose = t.SuccessCallback(val, "?");
87169         } catch (e) {
87170         }
87171     });
87172
87173     this.writeData = function (data) {
87174         if (!_security.writeData) {
87175             throw new WebAPIException(errorcode.SECURITY_ERR);
87176         }
87177
87178         t.BluetoothSocket("writeData", arguments);
87179
87180         if (bluetoothSocket.state === "CLOSED") {
87181             return;
87182         }
87183
87184         event.trigger("bt-service-write-msg", [bluetoothSocket.peer.address,
87185                 bluetoothSocket.uuid, data]);
87186
87187         return data.length;
87188     };
87189
87190     this.readData = function () {
87191         var data;
87192
87193         if (!_security.readData) {
87194             throw new WebAPIException(errorcode.SECURITY_ERR);
87195         }
87196
87197         if (bluetoothSocket.state === "CLOSED") {
87198             return;
87199         }
87200
87201         data = utils.copy(buffer);
87202         buffer = [];
87203
87204         return data;
87205     };
87206
87207     this.close = function () {
87208         if (!_security.close) {
87209             throw new WebAPIException(errorcode.SECURITY_ERR);
87210         }
87211
87212         bluetoothSocket.state = "CLOSED";
87213
87214         event.trigger("bt-service-state-changed", [bluetoothSocket.peer.address,
87215                 bluetoothSocket.uuid, false]);
87216         event.trigger("bt-device-connected-update",
87217                 [bluetoothSocket.peer.address, false]);
87218
87219         if (bluetoothSocket.onclose) {
87220             bluetoothSocket.onclose();
87221         }
87222     };
87223
87224     event.on("bt-service-state-update", function (addr, state) {
87225         var stateStr = "CLOSED";
87226
87227         if (addr !== bluetoothSocket.peer.address) {
87228             return;
87229         }
87230         if (state) {
87231             stateStr = "OPEN";
87232         }
87233
87234         bluetoothSocket.state = stateStr;
87235
87236         event.trigger("bt-service-state-changed",
87237                 [bluetoothSocket.peer.address, bluetoothSocket.uuid,
87238                 state]);
87239         event.trigger("bt-device-connected-update",
87240                 [bluetoothSocket.peer.address, state]);
87241     });
87242
87243     event.on("bt-service-rawdata-received", function (addr, uuid, msg) {
87244         var i;
87245
87246         if ((addr !== bluetoothSocket.peer.address) ||
87247                 (uuid !== bluetoothSocket.uuid)) {
87248             return;
87249         }
87250         buffer = [];
87251         for (i = 0; i < msg.length; i++) {
87252             buffer.push(msg.charCodeAt(i));
87253         }
87254         if (bluetoothSocket.onmessage) {
87255             bluetoothSocket.onmessage();
87256         }
87257     });
87258
87259     event.on("bt-device-connected-changed", function (addr, isConnected) {
87260         bluetoothSocket.state = isConnected ? "OPEN" : "CLOSED";
87261     });
87262 };
87263
87264 module.exports = BluetoothSocket;
87265
87266 });
87267 define('ripple/platform/tizen/2.0/msg_utils', function (require, exports, module) {
87268 /*
87269  *  Copyright 2012 Intel Corporation.
87270  *
87271  * Licensed under the Apache License, Version 2.0 (the "License");
87272  * you may not use this file except in compliance with the License.
87273  * You may obtain a copy of the License at
87274  *
87275  * http://www.apache.org/licenses/LICENSE-2.0
87276  *
87277  * Unless required by applicable law or agreed to in writing, software
87278  * distributed under the License is distributed on an "AS IS" BASIS,
87279  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
87280  * See the License for the specific language governing permissions and
87281  * limitations under the License.
87282  */
87283
87284
87285 var db = require('ripple/db'),
87286     utils = require('ripple/utils'),
87287     tizen1_utils = require('ripple/platform/tizen/2.0/tizen1_utils'),
87288     MessageBody = require('ripple/platform/tizen/2.0/MessageBody'),
87289     _TIZEN_MESSAGE_DB_KEY = "tizen_db_messages",
87290     MessageElement = function (_type, _id) {
87291         return {
87292             type: _type,
87293             id: _id,
87294             msg: {},
87295             conv: {}
87296         };
87297     },
87298
87299     _conversationCount = function (msg, cid, rst) {
87300         var old_time = new Date(0), t;
87301
87302         utils.forEach(msg.msg, function (o) {
87303             if (o.priv.conversationId === cid &&
87304                 o.priv.messageStatus !== "DRAFT") {
87305                 rst.cnt += 1;
87306                 t = new Date(o.priv.timestamp);
87307                 if (t > old_time) {
87308                     rst.lastid = o.priv.id;
87309                     old_time = t;
87310                 }
87311                 if (o.isRead === false) {
87312                     rst.unread++;
87313                 }
87314             }
87315         });
87316     },
87317
87318     _updateConversation = function (msg, cid) {
87319         var privConv = {}, lastm, rst = {};
87320
87321         rst.cnt = 0;
87322         rst.unread = 0;
87323         rst.lastid = "";
87324         _conversationCount(msg, cid, rst);
87325         if (rst.cnt === 0) {
87326             if (msg.conv[cid] !== undefined) {
87327                 delete msg.conv[cid];
87328             }
87329             return;
87330         }
87331         lastm = msg.msg[rst.lastid];
87332
87333         privConv.id = cid;
87334         privConv.type = msg.type;
87335         privConv.timestamp = new Date(lastm.priv.timestamp);
87336         privConv.messageCount = rst.cnt;
87337         privConv.unreadMessages = rst.unread;
87338         privConv.preview = lastm.body.plainBody;
87339         privConv.subject = lastm.subject;
87340         privConv.isRead = lastm.isRead;
87341         privConv.from = lastm.priv.from;
87342         privConv.to = lastm.to.slice(0);
87343         privConv.cc = lastm.cc.slice(0);
87344         privConv.bcc = lastm.bcc.slice(0);
87345         privConv.lastMessageId = rst.lastid;
87346         msg.conv[cid] = privConv;
87347     };
87348
87349 module.exports = {
87350     conversationCount: _conversationCount,
87351     setMsg: function (m, newm) {
87352         if ((m.to === null) || (m.to === undefined)) {
87353             newm.to = [];
87354         } else {
87355             if (tizen1_utils.isValidArray(m.to)) {
87356                 newm.to = m.to.slice(0);
87357             } else {
87358                 return false;
87359             }
87360         }
87361
87362         if ((m.cc === null) || (m.cc === undefined)) {
87363             newm.cc = [];
87364         } else {
87365             if (tizen1_utils.isValidArray(m.cc)) {
87366                 newm.cc = m.cc.slice(0);
87367             } else {
87368                 return false;
87369             }
87370         }
87371
87372         if ((m.bcc === null) || (m.bcc === undefined)) {
87373             newm.bcc = [];
87374         } else {
87375             if (tizen1_utils.isValidArray(m.bcc)) {
87376                 newm.bcc = m.bcc.slice(0);
87377             } else {
87378                 return false;
87379             }
87380         }
87381
87382         if ((m.body === null) || (m.body === undefined)) {
87383             if (m.htmlBody === null || m.htmlBody === undefined) {
87384                 m.htmlBody = "";
87385             }
87386             if (m.plainBody === null || m.plainBody === undefined) {
87387                 m.plainBody = "";
87388             }
87389             if (typeof m.plainBody !== 'string' || typeof m.htmlBody !== 'string') {
87390                 return false;
87391             }
87392             m.body = new MessageBody(null, true, m.plainBody, m.htmlBody, []);
87393         } else {
87394             if (typeof m.body.plainBody !== 'string' || typeof m.body.htmlBody !== 'string') {
87395                 return false;
87396             }
87397             m.body = new MessageBody(null, true, m.body.plainBody, m.body.htmlBody, []);
87398         }
87399         newm.body = utils.copy(m.body);
87400
87401         if (typeof m.isRead === 'boolean') {
87402             newm.isRead = m.isRead;
87403         } else {
87404             newm.isRead = false;
87405         }
87406
87407         if (typeof m.isHighPriority === 'boolean') {
87408             newm.isHighPriority = m.isHighPriority;
87409         } else {
87410             newm.isHighPriority = false;
87411         }
87412
87413         if ((m.subject === null) || (m.subject === undefined)) {
87414             newm.subject = "";
87415         } else {
87416             newm.subject = String(m.subject);
87417         }
87418
87419         if ((m.inResponseTo === null) || (m.inResponseTo === undefined)) {
87420             newm.inResponseTo = null;
87421         } else {
87422             newm.inResponseTo = String(m.inResponseTo);
87423         }
87424
87425         if ((m.attachments === null) || (m.attachments === undefined)) {
87426             newm.attachments = [];
87427         } else {
87428             newm.attachments = utils.copy(m.attachments);
87429         }
87430         return true;
87431     },
87432
87433     loadMsg: function (type, id) {
87434         var i, ret, msg = db.retrieveObject(_TIZEN_MESSAGE_DB_KEY) || null;
87435         if (msg === null) {
87436             ret = new MessageElement(type, id);
87437         } else {
87438             for (i = 0; i < msg.length; i++) {
87439                 if (msg[i].type === type && msg[i].id === id) {
87440                     ret = msg[i];
87441                     break;
87442                 }
87443             }
87444             if (ret === undefined) {
87445                 ret = new MessageElement(type, id);
87446             } else {
87447                 /* after getting Date out of DB, Date will become
87448                    a string, so need to recast it back to Date */
87449                 for (i in ret.msg) {
87450                     ret.msg[i].priv.timestamp = new Date(ret.msg[i].priv.timestamp);
87451                 }
87452             }
87453         }
87454         return ret;
87455     },
87456
87457     delMsg: function (m) { // m is a PrivMessage
87458         var i, _msg = db.retrieveObject(_TIZEN_MESSAGE_DB_KEY) || [];
87459         if (_msg.length === 0) {
87460             return;
87461         } else {
87462             for (i = 0; i < _msg.length; i++) {
87463                 if (_msg[i].type === m.priv.type && _msg[i].id === m.priv.serviceId) {
87464                     delete _msg[i].msg[m.priv.id];
87465                     if (m.priv.messageStatus !== "DRAFT") {
87466                         _updateConversation(_msg[i], m.priv.conversationId);
87467                     }
87468                     db.saveObject(_TIZEN_MESSAGE_DB_KEY, _msg);
87469                     return;
87470                 }
87471             }
87472         }
87473     },
87474
87475     saveMsg: function (m) { // m is a PrivMessage
87476         var i, new_msg, _msg = db.retrieveObject(_TIZEN_MESSAGE_DB_KEY) || [];
87477         if (_msg.length === 0) {
87478             _msg = new MessageElement(m.priv.type, m.priv.serviceId);
87479             _msg.msg[m.priv.id] = m;
87480             if (m.priv.messageStatus !== "DRAFT") {
87481                 _updateConversation(_msg, m.priv.conversationId);
87482             }
87483             db.saveObject(_TIZEN_MESSAGE_DB_KEY, [_msg]);
87484         } else {
87485             for (i = 0; i < _msg.length; i++) {
87486                 if (_msg[i].type === m.priv.type && _msg[i].id === m.priv.serviceId) {
87487                     _msg[i].msg[m.priv.id] = m;
87488                     if (m.priv.messageStatus !== "DRAFT") {
87489                         _updateConversation(_msg[i], m.priv.conversationId);
87490                     }
87491                     db.saveObject(_TIZEN_MESSAGE_DB_KEY, _msg);
87492                     break;
87493                 }
87494             }
87495             if (i === _msg.length) {
87496                 new_msg = new MessageElement(m.priv.type, m.priv.serviceId);
87497                 new_msg.msg[m.priv.id] = m;
87498                 if (m.priv.messageStatus !== "DRAFT") {
87499                     _updateConversation(new_msg, m.priv.conversationId);
87500                 }
87501                 _msg.push(new_msg);
87502                 db.saveObject(_TIZEN_MESSAGE_DB_KEY, _msg);
87503             }
87504         }
87505     },
87506
87507     loadConv: function (type, id) {
87508         var i, ret;
87509         ret = this.loadMsg(type, id).conv;
87510         for (i in ret) {
87511             ret[i].timestamp = new Date(ret[i].timestamp);
87512         }
87513         return ret;
87514     }
87515 };
87516
87517 });
87518 define('ripple/platform/tizen/2.0/BluetoothClassDeviceMajor', function (require, exports, module) {
87519 /*
87520  *  Copyright 2013 Intel Corporation.
87521  *
87522  * Licensed under the Apache License, Version 2.0 (the "License");
87523  * you may not use this file except in compliance with the License.
87524  * You may obtain a copy of the License at
87525  *
87526  * http://www.apache.org/licenses/LICENSE-2.0
87527  *
87528  * Unless required by applicable law or agreed to in writing, software
87529  * distributed under the License is distributed on an "AS IS" BASIS,
87530  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
87531  * See the License for the specific language governing permissions and
87532  * limitations under the License.
87533  */
87534
87535 var BluetoothClassDeviceMajor = function () {
87536     this.__defineGetter__("MISC", function () {
87537         return 0x00;
87538     });
87539
87540     this.__defineGetter__("COMPUTER", function () {
87541         return 0x01;
87542     });
87543
87544     this.__defineGetter__("PHONE", function () {
87545         return 0x02;
87546     });
87547
87548     this.__defineGetter__("NETWORK", function () {
87549         return 0x03;
87550     });
87551
87552     this.__defineGetter__("AUDIO_VIDEO", function () {
87553         return 0x04;
87554     });
87555
87556     this.__defineGetter__("PERIPHERAL", function () {
87557         return 0x05;
87558     });
87559
87560     this.__defineGetter__("IMAGING", function () {
87561         return 0x06;
87562     });
87563
87564     this.__defineGetter__("WEARABLE", function () {
87565         return 0x07;
87566     });
87567
87568     this.__defineGetter__("TOY", function () {
87569         return 0x08;
87570     });
87571
87572     this.__defineGetter__("HEALTH", function () {
87573         return 0x09;
87574     });
87575
87576     this.__defineGetter__("UNCATEGORIZED", function () {
87577         return 0x1F;
87578     });
87579 };
87580
87581 module.exports = BluetoothClassDeviceMajor;
87582
87583 });
87584 define('ripple/platform/tizen/2.0/SyncServiceInfo', function (require, exports, module) {
87585 /*
87586  *  Copyright 2013 Intel Corporation.
87587  *
87588  * Licensed under the Apache License, Version 2.0 (the "License");
87589  * you may not use this file except in compliance with the License.
87590  * You may obtain a copy of the License at
87591  *
87592  * http://www.apache.org/licenses/LICENSE-2.0
87593  *
87594  * Unless required by applicable law or agreed to in writing, software
87595  * distributed under the License is distributed on an "AS IS" BASIS,
87596  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
87597  * See the License for the specific language governing permissions and
87598  * limitations under the License.
87599  */
87600
87601 var db = require('ripple/db'),
87602     t = require('ripple/platform/tizen/2.0/typecast'),
87603     SyncServiceInfo,
87604     _accounts = {},
87605     _counter = 0;
87606
87607 SyncServiceInfo = function (enable, serviceType, serverDatabaseUri, id,
87608         password) {
87609     var syncServiceInfo = {}, index;
87610
87611     function save() {
87612         _accounts[index] = {
87613             id: syncServiceInfo.id,
87614             password: syncServiceInfo.password
87615         };
87616         db.saveObject("save-syncserviceinfo", _accounts);
87617     }
87618
87619     t.SyncServiceInfo(arguments, this);
87620
87621     syncServiceInfo.enable            = enable;
87622     syncServiceInfo.serviceType       = serviceType;
87623     syncServiceInfo.serverDatabaseUri = serverDatabaseUri;
87624     syncServiceInfo.id                = id || null;
87625     syncServiceInfo.password          = password || null;
87626
87627     this.__defineGetter__("enable", function () {
87628         return syncServiceInfo.enable;
87629     });
87630     this.__defineSetter__("enable", function (enable) {
87631         try {
87632             syncServiceInfo.enable = t.boolean(enable);
87633         } catch (e) {
87634         }
87635     });
87636
87637     this.__defineGetter__("serviceType", function () {
87638         return syncServiceInfo.serviceType;
87639     });
87640     this.__defineSetter__("serviceType", function (serviceType) {
87641         try {
87642             syncServiceInfo.serviceType = t.SyncServiceType(serviceType);
87643         } catch (e) {
87644         }
87645     });
87646
87647     this.__defineGetter__("serverDatabaseUri", function () {
87648         return syncServiceInfo.serverDatabaseUri;
87649     });
87650     this.__defineSetter__("serverDatabaseUri", function (serverDatabaseUri) {
87651         try {
87652             syncServiceInfo.serverDatabaseUri = t.DOMString(serverDatabaseUri);
87653         } catch (e) {
87654         }
87655     });
87656
87657     this.__defineGetter__("id", function () {
87658         return null;
87659     });
87660     this.__defineSetter__("id", function (id) {
87661         try {
87662             syncServiceInfo.id = t.DOMString(id);
87663             save();
87664         } catch (e) {
87665         }
87666     });
87667
87668     this.__defineGetter__("password", function () {
87669         return null;
87670     });
87671     this.__defineSetter__("password", function (password) {
87672         try {
87673             syncServiceInfo.password = t.DOMString(password);
87674             save();
87675         } catch (e) {
87676         }
87677     });
87678
87679     index = _counter++;
87680     Object.defineProperty(this, "__syncServiceInfoID__", {
87681         "configurable": false,
87682         "enumerable":   false,
87683         "get": (function (_id_) {
87684             return function () { return _id_; };
87685         })(index)
87686     });
87687     save();
87688 };
87689
87690 module.exports = SyncServiceInfo;
87691
87692 });
87693 define('ripple/platform/tizen/2.0/systeminfo', function (require, exports, module) {
87694 /*
87695  *  Copyright 2013 Intel Corporation.
87696  *
87697  * Licensed under the Apache License, Version 2.0 (the "License");
87698  * you may not use this file except in compliance with the License.
87699  * You may obtain a copy of the License at
87700  *
87701  * http://www.apache.org/licenses/LICENSE-2.0
87702  *
87703  * Unless required by applicable law or agreed to in writing, software
87704  * distributed under the License is distributed on an "AS IS" BASIS,
87705  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
87706  * See the License for the specific language governing permissions and
87707  * limitations under the License.
87708  */
87709
87710 var deviceSettings = require('ripple/deviceSettings'),
87711     db = require('ripple/db'),
87712     t = require('ripple/platform/tizen/2.0/typecast'),
87713     typedef = require('ripple/platform/tizen/2.0/typedef'),
87714     constants = require('ripple/constants'),
87715     event = require('ripple/event'),
87716     tizen_utils = require('ripple/platform/tizen/2.0/tizen1_utils'),
87717     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
87718     WebAPIException = require('ripple/platform/tizen/2.0/WebAPIException'),
87719     SystemInfoDeviceCapability,
87720     _systemInfoProperties = typedef.SystemInfoPropertyId,
87721     _propertyMap = {}, // Object like: {"BATTERY": ["level", "isCharging"], ...}
87722     _batteryEvent = ["BatteryLevelChanged", "BatteryChargingChanged"],
87723     _watches = {},
87724     _firstCall_watches = {},
87725     _powerData = {},
87726     _systemInfoDeviceCapability = null,
87727     _security = {
87728         "http://tizen.org/privilege/system": ["SystemInfoSIM", "webApiVersion",
87729                 "nativeApiVersion", "platformVersion"],
87730         "http://tizen.org/privilege/systemmanager": ["NetworkImei"]
87731     },
87732     _self;
87733
87734 function _prepareObj(obj, aspect, property, value) {
87735     if ((aspect === "CELLULAR_NETWORK") && (property === "imei")) {
87736         obj.__defineGetter__("imei", function () {
87737             if (!_security.NetworkImei) {
87738                 throw new WebAPIException(errorcode.SECURITY_ERR);
87739             }
87740             return deviceSettings.retrieve("CELLULAR_NETWORK.imei");
87741         });
87742     } else {
87743         if (aspect === "WIFI_NETWORK" || aspect === "CELLULAR_NETWORK") {
87744             if (property === 'status') {
87745                 if (value === true) {
87746                     value = "ON";
87747                 } else {
87748                     value = "OFF";
87749                 }
87750             }
87751         }
87752         obj.__defineGetter__(property, function () {
87753             return value;
87754         });
87755     }
87756 }
87757
87758 function _getValue(aspect, successCallback) {
87759     var properties = [], value, index = 0, property, obj = {};
87760
87761     if ((aspect === "SIM") && !_security.SystemInfoSIM) {
87762         throw new WebAPIException(errorcode.SECURITY_ERR);
87763     }
87764
87765     if (aspect === "BATTERY") {
87766         successCallback(_powerData);
87767         return;
87768     }
87769
87770     properties = _propertyMap[aspect];
87771     for (; index < properties.length; index++) {
87772         property = properties[index];
87773         value = deviceSettings.retrieve(aspect + "." + property);
87774         _prepareObj(obj, aspect, property, value);
87775     }
87776
87777     if (aspect === "STORAGE") {
87778         obj.__defineGetter__("units", function () {
87779             return [obj];
87780         });
87781     }
87782
87783     successCallback(obj);
87784 }
87785
87786 function _initialize() {
87787     var aspectName, index, i, vol;
87788
87789     for (index = 0; index < _systemInfoProperties.length; index++) {
87790         aspectName = _systemInfoProperties[index];
87791         _propertyMap[aspectName] = [];
87792         for (i in deviceSettings.retrieve(aspectName)) {
87793             _propertyMap[aspectName].push(i);
87794         }
87795     }
87796
87797     _propertyMap.BATTERY.push("level");
87798     _propertyMap.BATTERY.push("isCharging");
87799
87800     _powerData.__defineGetter__("isCharging", function () {
87801         return false;
87802     });
87803
87804     vol = db.retrieve(constants.BATTERY.VOLUME) || 100.0;
87805     _powerData.__defineGetter__("level", function () {
87806         return Number((vol / 100.0).toFixed(4));
87807     });
87808
87809     event.on("BatteryEvent", function (status) {
87810         _powerData.__defineGetter__("isCharging", function () {
87811             return status.charging;
87812         });
87813         _powerData.__defineGetter__("level", function () {
87814             return Number(status.level.toFixed(4));
87815         });
87816     });
87817 }
87818
87819 function _isPropertyFound(property) {
87820     if (tizen_utils.isEmptyObject(_propertyMap)) {
87821         _initialize();
87822     }
87823
87824     if (_propertyMap[property]) {
87825         return true;
87826     }
87827
87828     return false;
87829 }
87830
87831 function _delayGetValue(timeout, property, successCallback, errorCallback) {
87832     return window.setInterval(function () {
87833         _getValue(property, successCallback, errorCallback);
87834     }, timeout);
87835 }
87836
87837 _self = function () {
87838     function getCapabilities() {
87839         if (_systemInfoDeviceCapability === null) {
87840             _systemInfoDeviceCapability = new SystemInfoDeviceCapability();
87841         }
87842         return _systemInfoDeviceCapability;
87843     }
87844
87845     function getPropertyValue(property, successCallback, errorCallback) {
87846         t.SystemInfo("getPropertyValue", arguments);
87847
87848         if (!_isPropertyFound(property)) {
87849             throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
87850         }
87851
87852         window.setTimeout(function () {
87853             _getValue(property, successCallback, errorCallback);
87854         }, 1);
87855     }
87856
87857     function addPropertyValueChangeListener(property, successCallback, options) {
87858         var WatchOBJ, watchId = Number(Math.uuid(8, 10)),
87859             _options = new Object(options), properties, prop, index = 0,
87860             deviceEventType, watchObj, firstCallWatchObj;
87861
87862         t.SystemInfo("addPropertyValueChangeListener", arguments);
87863
87864         if (!_isPropertyFound(property)) {
87865             throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
87866         }
87867
87868         WatchOBJ = function (deviceEventType, property, successCallback) {
87869             var obj = this;
87870
87871             this.eventType = deviceEventType;
87872             this.onEvent = function (newValue) {
87873                 if (obj.timeout) {
87874                     window.clearInterval(obj.intervalId);
87875                     obj.intervalId = window.setInterval(function () {
87876                         _getValue(property, successCallback, null);
87877                     }, obj.timeout);
87878                 }
87879
87880                 if ((obj.highThreshold && (newValue < obj.highThreshold)) ||
87881                     (obj.lowThreshold && (newValue > obj.lowThreshold))) {
87882                     return;
87883                 }
87884
87885                 _getValue(property, successCallback, null);
87886             };
87887         };
87888
87889         // A listener will listen all the properties of one aspect, each of the property
87890         // will have an internal watchObj to record the information.
87891         _watches[watchId] = [];
87892
87893         if (property === "BATTERY") {
87894             properties = _batteryEvent;
87895         } else {
87896             properties = _propertyMap[property];
87897         }
87898
87899         for (; index < properties.length; index++) {
87900             prop = properties[index];
87901             if (property === "BATTERY") {
87902                 deviceEventType = prop;
87903             } else {
87904                 deviceEventType = deviceSettings.retrieve(property)[prop].event;
87905             }
87906
87907             if (deviceEventType === undefined) continue;
87908             // These two items are needed when delete an event listener.
87909             watchObj = new WatchOBJ(deviceEventType, property, successCallback);
87910
87911             if (options && _options.timeout) {
87912                 watchObj.intervalId = _delayGetValue(_options.timeout, property,
87913                         successCallback, null);
87914             }
87915
87916             if ((watchObj.eventType === "CpuLoadChanged") ||
87917                     (watchObj.eventType === "DisplayBrightnessChanged") ||
87918                     (watchObj.eventType === "BatteryLevelChanged")) {
87919                 if (options && _options.highThreshold) {
87920                     watchObj.highThreshold = _options.highThreshold;
87921                 }
87922
87923                 if (options && _options.lowThreshold) {
87924                     watchObj.lowThreshold = _options.lowThreshold;
87925                 }
87926             }
87927
87928             _watches[watchId].push(watchObj);
87929             if (watchObj.eventType) {
87930                 event.on(watchObj.eventType, watchObj.onEvent);
87931             }
87932         }
87933
87934         firstCallWatchObj = window.setTimeout(function () {
87935             _getValue(property, successCallback, null);
87936             delete _firstCall_watches[watchId];
87937         }, 1);
87938
87939         _firstCall_watches[watchId] = firstCallWatchObj;
87940
87941         return watchId;
87942     }
87943
87944     function removePropertyValueChangeListener(listenerID) {
87945         var _handler = listenerID, index = 0, watchObjs = [], watchObj;
87946
87947         if (!_watches[_handler])
87948             return;
87949
87950         watchObjs = _watches[_handler];
87951         if (watchObjs) {
87952             for (; index < watchObjs.length; index++) {
87953                 watchObj = watchObjs[index];
87954                 event.deleteEventHandler(watchObj.eventType, watchObj.onEvent);
87955                 if (watchObj.intervalId) {
87956                     window.clearInterval(watchObj.intervalId);
87957                 }
87958             }
87959             delete _watches[_handler];
87960         }
87961
87962         if (_firstCall_watches[_handler]) {
87963             window.clearTimeout(_firstCall_watches[_handler]);
87964             delete _firstCall_watches[_handler];
87965         }
87966     }
87967
87968     function handleSubFeatures(subFeatures) {
87969         var i, subFeature;
87970
87971         for (subFeature in subFeatures) {
87972             for (i in _security[subFeature]) {
87973                 _security[_security[subFeature][i]] = true;
87974             }
87975         }
87976     }
87977
87978     var systeminfo = {
87979         getCapabilities: getCapabilities,
87980         getPropertyValue: getPropertyValue,
87981         addPropertyValueChangeListener: addPropertyValueChangeListener,
87982         removePropertyValueChangeListener: removePropertyValueChangeListener,
87983         handleSubFeatures: handleSubFeatures
87984     };
87985
87986     return systeminfo;
87987 };
87988
87989 SystemInfoDeviceCapability = function () {
87990     this.__defineGetter__("bluetooth", function () {
87991         return true;
87992     });
87993     this.__defineGetter__("nfc", function () {
87994         return true;
87995     });
87996     this.__defineGetter__("nfcReservedPush", function () {
87997         return false;
87998     });
87999     this.__defineGetter__("multiTouchCount", function () {
88000         return 5;
88001     });
88002     this.__defineGetter__("inputKeyboard", function () {
88003         return false;
88004     });
88005     this.__defineGetter__("inputKeyboardLayout", function () {
88006         return false;
88007     });
88008     this.__defineGetter__("wifi", function () {
88009         return true;
88010     });
88011     this.__defineGetter__("wifiDirect", function () {
88012         return true;
88013     });
88014     this.__defineGetter__("opengles", function () {
88015         return false;
88016     });
88017     this.__defineGetter__("openglestextureFormat", function () {
88018         return "";
88019     });
88020     this.__defineGetter__("openglesVersion1_1", function () {
88021         return false;
88022     });
88023     this.__defineGetter__("openglesVersion2_0", function () {
88024         return false;
88025     });
88026     this.__defineGetter__("fmRadio", function () {
88027         return false;
88028     });
88029     this.__defineGetter__("platformVersion", function () {
88030         if (!_security.platformVersion) {
88031             throw new WebAPIException(errorcode.SECURITY_ERR);
88032         }
88033         return "2.2.0";
88034     });
88035     this.__defineGetter__("webApiVersion", function () {
88036         if (!_security.webApiVersion) {
88037             throw new WebAPIException(errorcode.SECURITY_ERR);
88038         }
88039         return "2.2";
88040     });
88041     this.__defineGetter__("nativeApiVersion", function () {
88042         if (!_security.nativeApiVersion) {
88043             throw new WebAPIException(errorcode.SECURITY_ERR);
88044         }
88045         return "2.2";
88046     });
88047     this.__defineGetter__("platformName", function () {
88048         return "Tizen";
88049     });
88050     this.__defineGetter__("camera", function () {
88051         return false;
88052     });
88053     this.__defineGetter__("cameraFront", function () {
88054         return false;
88055     });
88056     this.__defineGetter__("cameraFrontFlash", function () {
88057         return false;
88058     });
88059     this.__defineGetter__("cameraBack", function () {
88060         return false;
88061     });
88062     this.__defineGetter__("cameraBackFlash", function () {
88063         return false;
88064     });
88065     this.__defineGetter__("location", function () {
88066         return true;
88067     });
88068     this.__defineGetter__("locationGps", function () {
88069         return true;
88070     });
88071     this.__defineGetter__("locationWps", function () {
88072         return false;
88073     });
88074     this.__defineGetter__("microphone", function () {
88075         return false;
88076     });
88077     this.__defineGetter__("usbHost", function () {
88078         return true;
88079     });
88080     this.__defineGetter__("usbAccessory", function () {
88081         return false;
88082     });
88083     this.__defineGetter__("screenOutputRca", function () {
88084         return false;
88085     });
88086     this.__defineGetter__("screenOutputHdmi", function () {
88087         return false;
88088     });
88089     this.__defineGetter__("platformCoreCpuArch", function () {
88090         return "x86";
88091     });
88092     this.__defineGetter__("platformCoreFpuArch", function () {
88093         return "ssse3";
88094     });
88095     this.__defineGetter__("sipVoip", function () {
88096         return false;
88097     });
88098     this.__defineGetter__("duid", function () {
88099         return "device unique ID";
88100     });
88101     this.__defineGetter__("speechRecognition", function () {
88102         return false;
88103     });
88104     this.__defineGetter__("speechSynthesis", function () {
88105         return false;
88106     });
88107     this.__defineGetter__("accelerometer", function () {
88108         return true;
88109     });
88110     this.__defineGetter__("accelerometerWakeup", function () {
88111         return false;
88112     });
88113     this.__defineGetter__("barometer", function () {
88114         return false;
88115     });
88116     this.__defineGetter__("barometerWakeup", function () {
88117         return false;
88118     });
88119     this.__defineGetter__("gyroscope", function () {
88120         return true;
88121     });
88122     this.__defineGetter__("gyroscopeWakeup", function () {
88123         return false;
88124     });
88125     this.__defineGetter__("magnetometer", function () {
88126         return false;
88127     });
88128     this.__defineGetter__("magnetometerWakeup", function () {
88129         return false;
88130     });
88131     this.__defineGetter__("photometer", function () {
88132         return false;
88133     });
88134     this.__defineGetter__("photometerWakeup", function () {
88135         return false;
88136     });
88137     this.__defineGetter__("proximity", function () {
88138         return false;
88139     });
88140     this.__defineGetter__("proximityWakeup", function () {
88141         return false;
88142     });
88143     this.__defineGetter__("tiltmeter", function () {
88144         return false;
88145     });
88146     this.__defineGetter__("tiltmeterWakeup", function () {
88147         return false;
88148     });
88149     this.__defineGetter__("dataEncryption", function () {
88150         return false;
88151     });
88152     this.__defineGetter__("graphicsAcceleration", function () {
88153         return false;
88154     });
88155     this.__defineGetter__("push", function () {
88156         return true;
88157     });
88158     this.__defineGetter__("telephony", function () {
88159         return true;
88160     });
88161     this.__defineGetter__("telephonyMms", function () {
88162         return true;
88163     });
88164     this.__defineGetter__("telephonySms", function () {
88165         return true;
88166     });
88167     this.__defineGetter__("screenSizeNormal", function () {
88168         return true;
88169     });
88170     this.__defineGetter__("screenSize480_800", function () {
88171         return true;
88172     });
88173     this.__defineGetter__("screenSize720_1280", function () {
88174         return true;
88175     });
88176     this.__defineGetter__("autoRotation", function () {
88177         return true;
88178     });
88179     this.__defineGetter__("shellAppWidget", function () {
88180         return false;
88181     });
88182     this.__defineGetter__("visionImageRecognition", function () {
88183         return false;
88184     });
88185     this.__defineGetter__("visionQrcodeGeneration", function () {
88186         return false;
88187     });
88188     this.__defineGetter__("visionQrcodeRecognition", function () {
88189         return false;
88190     });
88191     this.__defineGetter__("visionFaceRecognition", function () {
88192         return false;
88193     });
88194     this.__defineGetter__("secureElement", function () {
88195         return true;
88196     });
88197     this.__defineGetter__("nativeOspCompatible", function () {
88198         return false;
88199     });
88200     this.__defineGetter__("profile", function () {
88201         return "MOBILE_WEB";
88202     });
88203 };
88204
88205 module.exports = _self;
88206
88207 });
88208 define('ripple/platform/tizen/2.0/map', function (require, exports, module) {
88209 /*
88210  *  Copyright 2012 Intel Corporation
88211  *
88212  * Licensed under the Apache License, Version 2.0 (the "License");
88213  * you may not use this file except in compliance with the License.
88214  * You may obtain a copy of the License at
88215  *
88216  * http://www.apache.org/licenses/LICENSE-2.0
88217  *
88218  * Unless required by applicable law or agreed to in writing, software
88219  * distributed under the License is distributed on an "AS IS" BASIS,
88220  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
88221  * See the License for the specific language governing permissions and
88222  * limitations under the License.
88223  */
88224
88225 var lbs = require('ripple/platform/tizen/2.0/lbs_utils'),
88226     mapProviders = [],
88227     MapStyle,
88228     MapProvider,
88229     _self;
88230
88231 function _initialize() {
88232     // EPSG:3857 is a Spherical Mercator projection coordinate system popularized by web services such as Google and later OpenStreetMap
88233     // mapStyles are from http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames
88234     var projection = "EPSG:3857",
88235         mapStyle1 = new MapStyle("Mapnik", "http://b.tile.openstreetmap.org/${z}/${x}/${y}.png"),
88236         mapStyle2 = new MapStyle("Cycle", "http://b.tile.opencyclemap.org/cycle/${z}/${x}/${y}.png");
88237
88238     mapProviders = [new MapProvider({name: "OpenStreetMap", connectivity: "ONLINE"}, projection, [mapStyle1, mapStyle2])];
88239 }
88240
88241 _self = {
88242     getDefaultProvider: function () {
88243         return mapProviders[0];
88244     },
88245     getProviders: function () {
88246         return mapProviders;
88247     }
88248 };
88249
88250 MapStyle = function (name, url) {
88251     return {
88252         name: name,
88253         url: url
88254     };
88255 };
88256
88257 MapProvider = function (prop, projection, mapStyles) {
88258     var mapProvider = new lbs.LocationServiceProvider(prop);
88259
88260     mapProvider.__defineGetter__("projection", function () {
88261         return projection;
88262     });
88263
88264     mapProvider.__defineGetter__("mapStyles", function () {
88265         return mapStyles;
88266     });
88267
88268     return mapProvider;
88269 };
88270
88271 _initialize();
88272
88273 module.exports = _self;
88274
88275 });
88276 define('ripple/platform/tizen/2.0/datasync', function (require, exports, module) {
88277 /*
88278  *  Copyright 2013 Intel Corporation
88279  *
88280  * Licensed under the Apache License, Version 2.0 (the "License");
88281  * you may not use this file except in compliance with the License.
88282  * You may obtain a copy of the License at
88283  *
88284  * http://www.apache.org/licenses/LICENSE-2.0
88285  *
88286  * Unless required by applicable law or agreed to in writing, software
88287  * distributed under the License is distributed on an "AS IS" BASIS,
88288  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
88289  * See the License for the specific language governing permissions and
88290  * limitations under the License.
88291  */
88292
88293 var db = require('ripple/db'),
88294     utils = require('ripple/utils'),
88295     ET = require('ripple/platform/tizen/2.0/syncml-js-lib/elementtree'),
88296     t = require('ripple/platform/tizen/2.0/typecast'),
88297     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
88298     WebAPIError = require('ripple/platform/tizen/2.0/WebAPIError'),
88299     WebAPIException = require('ripple/platform/tizen/2.0/WebAPIException'),
88300     SyncInfoMod = require('ripple/platform/tizen/2.0/SyncInfo'),
88301     SyncServiceInfoMod = require('ripple/platform/tizen/2.0/SyncServiceInfo'),
88302     SyncProfileInfoMod = require('ripple/platform/tizen/2.0/SyncProfileInfo'),
88303     SyncStatistics = require('ripple/platform/tizen/2.0/SyncStatistics'),
88304     _data = {
88305         DB_DATASYNC_ITEMS: "tizen1-db-datasync-items",
88306         DB_DATASYNC_COUNTER: "tizen1-db-datasync-counter",
88307         MAX_PROFILE_NUMBER: 5,
88308         profile_num: 0,
88309         profiles: {},
88310         sync_accounts: {},
88311         service_accounts: {},
88312         item_counter: 1000,
88313         type_table: {
88314             "TWO_WAY":             1,
88315             "SLOW":                2,
88316             "ONE_WAY_FROM_CLIENT": 3,
88317             "REFRESH_FROM_CLIENT": 4,
88318             "ONE_WAY_FROM_SERVER": 5,
88319             "REFRESH_FROM_SERVER": 6
88320         },
88321         mode_table: {
88322             "TWO_WAY":             200,
88323             "SLOW":                201,
88324             "ONE_WAY_FROM_CLIENT": 202,
88325             "REFRESH_FROM_CLIENT": 203,
88326             "ONE_WAY_FROM_SERVER": 204,
88327             "REFRESH_FROM_SERVER": 205
88328         },
88329         items: {}
88330     },
88331     _security = {
88332         "http://tizen.org/privilege/datasync":
88333             ["add", "update", "remove", "getMaxProfilesNum", "getProfilesNum",
88334              "get", "getAll", "startSync", "stopSync", "getLastSyncStatistics"]
88335     },
88336     _self,
88337     syncml = {
88338         adapter: require('ripple/platform/tizen/2.0/syncml-js-lib/adapter'),
88339         agent: require('ripple/platform/tizen/2.0/syncml-js-lib/agent'),
88340         base64: require('ripple/platform/tizen/2.0/syncml-js-lib/base64'),
88341         codec:  require('ripple/platform/tizen/2.0/syncml-js-lib/codec'),
88342         common: require('ripple/platform/tizen/2.0/syncml-js-lib/common'),
88343         constant: require('ripple/platform/tizen/2.0/syncml-js-lib/constant'),
88344         context: require('ripple/platform/tizen/2.0/syncml-js-lib/context'),
88345         ctype: require('ripple/platform/tizen/2.0/syncml-js-lib/ctype'),
88346         devinfo: require('ripple/platform/tizen/2.0/syncml-js-lib/devinfo'),
88347         item: require('ripple/platform/tizen/2.0/syncml-js-lib/item'),
88348         localadapter: require('ripple/platform/tizen/2.0/syncml-js-lib/localadapter'),
88349         matcher: require('ripple/platform/tizen/2.0/syncml-js-lib/matcher'),
88350         protocol: require('ripple/platform/tizen/2.0/syncml-js-lib/protocol'),
88351         remoteadapter: require('ripple/platform/tizen/2.0/syncml-js-lib/remoteadapter'),
88352         router: require('ripple/platform/tizen/2.0/syncml-js-lib/router'),
88353         state: require('ripple/platform/tizen/2.0/syncml-js-lib/state'),
88354         storage: require('ripple/platform/tizen/2.0/syncml-js-lib/storage'),
88355         store: require('ripple/platform/tizen/2.0/syncml-js-lib/store'),
88356         synchronizer: require('ripple/platform/tizen/2.0/syncml-js-lib/synchronizer'),
88357         useragent: require('ripple/platform/tizen/2.0/syncml-js-lib/useragent')
88358     },
88359     TizenAgent;
88360
88361 function _get() {
88362     _data.item_counter = db.retrieveObject(_data.DB_DATASYNC_COUNTER) || 1000;
88363     _data.items = db.retrieveObject(_data.DB_DATASYNC_ITEMS) || {};
88364 }
88365
88366 function _save() {
88367     db.saveObject(_data.DB_DATASYNC_COUNTER, _data.item_counter);
88368     db.saveObject(_data.DB_DATASYNC_ITEMS, _data.items);
88369 }
88370
88371 TizenAgent = syncml.agent.Agent.extend({
88372     constructor: function() {
88373     },
88374     getContentTypes: function() {
88375         return [
88376             new syncml.ctype.ContentTypeInfo('text/x-vcard', '2.1',{preferred: true})
88377         ];
88378     },
88379     dumpsItem: function(item, contentType, version, cb) {
88380         var cdata = new ET.CdataElement(item.item);
88381         cb(null, cdata);
88382     },
88383     loadsItem: function(data, contentType, version, cb) {
88384         return cb(null, {item: data._node.textContent});
88385     },
88386     getAllItems: function(cb) {
88387         var items = [];
88388         utils.forEach(_data.items, function(contact) {
88389             items.push(contact);
88390         });
88391         return cb(null, items);
88392     },
88393     addItem: function(item, cb) {
88394         _data.item_counter++;
88395         item.id = _data.item_counter.toString();
88396         _data.items[item.id] = item;
88397         _save();
88398         return cb(null, item);
88399     },
88400     getItem: function(itemID, cb) {
88401         return cb(null, _data.items[itemID]);
88402     },
88403     replaceItem: function(item, reportChanges, cb) {
88404         _data.items[item.id] = item;
88405         _save();
88406         return cb(null, null);
88407     },
88408     deleteItem: function(itemID, cb) {
88409         delete _data.items[itemID];
88410         _save();
88411         return cb(null);
88412     }
88413 });
88414
88415 function _initialize() {
88416     _data.agent = new TizenAgent();
88417     _get();
88418 }
88419
88420 _self = function () {
88421     var datasync;
88422
88423     // private
88424     function createInternalProfile(profile) {
88425         var _profile, sync_account, service_accounts;
88426
88427         sync_account = db.retrieveObject("save-syncinfo")[profile.syncInfo.__syncInfoID__];
88428
88429         _profile = {
88430             profileName: profile.profileName,
88431             syncInfo: {
88432                 url:        profile.syncInfo.url,
88433                 id:         sync_account.id,
88434                 password:   sync_account.password,
88435                 mode:       profile.syncInfo.mode
88436             },
88437             serviceInfo: []
88438         };
88439
88440         switch (_profile.syncInfo.mode) {
88441         case "MANUAL":
88442             _profile.syncInfo.type = profile.syncInfo.type || "TWO_WAY";
88443             break;
88444         case "PERIODIC":
88445             //TODO: set 1_HOUR as default value
88446             _profile.interval = profile.syncInfo.interval || "1_HOUR";
88447             _profile.syncInfo.type = "TWO_WAY";
88448             break;
88449         case "PUSH":
88450             _profile.syncInfo.type = "TWO_WAY";
88451             break;
88452         }
88453
88454         if (profile.serviceInfo) {
88455             service_accounts = db.retrieveObject("save-syncserviceinfo");
88456             utils.forEach(profile.serviceInfo, function (service) {
88457                 _profile.serviceInfo.push({
88458                     enable:             service.enable,
88459                     serviceType:        service.serviceType,
88460                     serverDatabaseUri:  service.serverDatabaseUri,
88461                     id:                 service_accounts[service.__syncServiceInfoID__].id,
88462                     password:           service_accounts[service.__syncServiceInfoID__].password
88463                 });
88464             });
88465         }
88466
88467         return _profile;
88468     }
88469
88470     function createExternalProfile(profileId) {
88471         var profile, i, _syncinfo, _serviceinfo, p;
88472
88473         p = _data.profiles[profileId];
88474
88475         switch (p.syncInfo.mode) {
88476         case "MANUAL":
88477             _syncinfo = new SyncInfoMod(p.syncInfo.url, p.syncInfo.id, p.syncInfo.password, "MANUAL", p.syncInfo.type);
88478             _syncinfo.interval = null;
88479             break;
88480         case "PERIODIC":
88481             _syncinfo = new SyncInfoMod(p.syncInfo.url, p.syncInfo.id, p.syncInfo.password, "PERIODIC", p.syncInfo.interval);
88482             break;
88483         case "PUSH":
88484             _syncinfo = new SyncInfoMod(p.syncInfo.url, p.syncInfo.id, p.syncInfo.password, "PUSH");
88485             break;
88486         }
88487
88488         if (p.serviceInfo) {
88489             _serviceinfo = [];
88490             for (i in p.serviceInfo) {
88491                 var info;
88492                 info = new SyncServiceInfoMod(p.serviceInfo[i].enable,
88493                         p.serviceInfo[i].serviceType, p.serviceInfo[i].serverDatabaseUri,
88494                         p.serviceInfo[i].id || null, p.serviceInfo[i].password || null);
88495                 _serviceinfo.push(info);
88496             }
88497         }
88498
88499         profile = new SyncProfileInfoMod(p.profileName, _syncinfo, _serviceinfo);
88500         Object.defineProperty(profile, "profileId", {value: p.profileId, writable: false});
88501
88502         return profile;
88503     }
88504
88505     // public
88506     function add(profile) {
88507         var _profile;
88508
88509         if (!_security.add) {
88510             throw new WebAPIException(errorcode.SECURITY_ERR);
88511         }
88512
88513         t.DataSynchronizationManager("add", arguments);
88514
88515         _profile = createInternalProfile(profile);
88516
88517         if (_data.profile_num > _data.MAX_PROFILE_NUMBER) {
88518             throw new WebAPIException(errorcode.QUOTA_EXCEEDED_ERR);
88519         }
88520
88521         _profile.profileId = Math.uuid(null, 16);
88522         _data.profiles[_profile.profileId] = _profile;
88523         _data.profile_num++;
88524
88525         Object.defineProperty(profile, "profileId", {value: _profile.profileId, writable: false});
88526     }
88527
88528     function update(profile) {
88529         var _profile;
88530
88531         if (!_security.update) {
88532             throw new WebAPIException(errorcode.SECURITY_ERR);
88533         }
88534
88535         t.DataSynchronizationManager("update", arguments);
88536
88537         _profile = createInternalProfile(profile);
88538
88539         if (!profile.profileId || !_data.profiles[profile.profileId]) {
88540             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
88541         }
88542
88543         _profile.profileId = profile.profileId;
88544         _data.profiles[_profile.profileId] = _profile;
88545     }
88546
88547     function remove(profileId) {
88548         if (!_security.remove) {
88549             throw new WebAPIException(errorcode.SECURITY_ERR);
88550         }
88551
88552         t.DataSynchronizationManager("remove", arguments);
88553
88554         if (!_data.profiles[profileId]) {
88555             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
88556         }
88557
88558         delete _data.profiles[profileId];
88559         _data.profile_num--;
88560     }
88561
88562     function getMaxProfilesNum() {
88563         if (!_security.getMaxProfilesNum) {
88564             throw new WebAPIException(errorcode.SECURITY_ERR);
88565         }
88566
88567         return _data.MAX_PROFILE_NUMBER;
88568     }
88569
88570     function getProfilesNum() {
88571         if (!_security.getProfilesNum) {
88572             throw new WebAPIException(errorcode.SECURITY_ERR);
88573         }
88574
88575         return _data.profile_num;
88576     }
88577
88578     function get(profileId) {
88579         var profile;
88580
88581         if (!_security.get) {
88582             throw new WebAPIException(errorcode.SECURITY_ERR);
88583         }
88584
88585         t.DataSynchronizationManager("get", arguments);
88586
88587         if (!_data.profiles[profileId]) {
88588             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
88589         }
88590
88591         profile = createExternalProfile(profileId);
88592
88593         return profile;
88594     }
88595
88596     function getAll() {
88597         var profiles = [], i;
88598
88599         if (!_security.getAll) {
88600             throw new WebAPIException(errorcode.SECURITY_ERR);
88601         }
88602
88603         for (i in _data.profiles) {
88604             profiles.push(createExternalProfile(_data.profiles[i].profileId));
88605         }
88606
88607         return profiles;
88608     }
88609
88610     function startSync(profileId, progressCallback) {
88611         var _profile, _stores, _routes, sync_peer;
88612
88613         if (!_security.startSync) {
88614             throw new WebAPIException(errorcode.SECURITY_ERR);
88615         }
88616
88617         t.DataSynchronizationManager("startSync", arguments);
88618
88619         if (!_data.profiles[profileId]) {
88620             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
88621         }
88622         _data.profiles[profileId].stop_flag = false;
88623
88624         sync_peer = function(adapter, store, peer, type) {
88625             adapter.sync(peer, type, function(err, stats) {
88626                 var p, name, hereTotal, peerTotal;
88627                 p = _data.profiles[profileId];
88628                 if (p.stop_flag === true) {
88629                     p.syncStatistics =[{
88630                         syncStatus: "STOP",
88631                         serviceType:            p.serviceInfo[0].serviceType,
88632                         lastSyncTime:           new Date(),
88633                         serverToClientTotal:    0,
88634                         serverToClientAdded:    0,
88635                         serverToClientUpdated:  0,
88636                         serverToClientRemoved:  0,
88637                         clientToServerTotal:    0,
88638                         clientToServerAdded:    0,
88639                         clientToServerUpdated:  0,
88640                         clientToServerRemoved:  0
88641                     }];
88642                     p.stop_flag = false;
88643                     return;
88644                 }
88645                 if (err) {
88646                     if (progressCallback) {
88647                         if (progressCallback.onfailed) {
88648                             progressCallback.onfailed(profileId, new WebAPIError(errorcode.UNKNOWN_ERR));
88649                         }
88650                     }
88651                     p.syncStatistics =[{
88652                         syncStatus: "FAIL",
88653                         serviceType:            p.serviceInfo[0].serviceType,
88654                         lastSyncTime:           new Date(),
88655                         serverToClientTotal:    0,
88656                         serverToClientAdded:    0,
88657                         serverToClientUpdated:  0,
88658                         serverToClientRemoved:  0,
88659                         clientToServerTotal:    0,
88660                         clientToServerAdded:    0,
88661                         clientToServerUpdated:  0,
88662                         clientToServerRemoved:  0
88663                     }];
88664                     p.stop_flag = false;
88665                     return;
88666                 }
88667                 name = p.profileName + "-" + p.serviceInfo[0].serviceType;
88668                 hereTotal = stats[name].hereAdd + stats[name].hereDel + stats[name].hereMod;
88669                 peerTotal = stats[name].peerAdd + stats[name].peerDel + stats[name].peerMod;
88670                 p.syncStatistics =[{
88671                     syncStatus: "SUCCESS",
88672                     serviceType:            p.serviceInfo[0].serviceType,
88673                     lastSyncTime:           new Date(),
88674                     serverToClientTotal:    hereTotal,
88675                     serverToClientAdded:    stats[name].hereAdd,
88676                     serverToClientUpdated:  stats[name].hereMod,
88677                     serverToClientRemoved:  stats[name].hereDel,
88678                     clientToServerTotal:    peerTotal,
88679                     clientToServerAdded:    stats[name].peerAdd,
88680                     clientToServerUpdated:  stats[name].peerMod,
88681                     clientToServerRemoved:  stats[name].peerDel
88682                 }];
88683                 p.stop_flag = false;
88684
88685                 if (progressCallback) {
88686                     if (progressCallback.oncompleted) {
88687                         progressCallback.oncompleted(profileId);
88688                     }
88689                 }
88690             });
88691         };
88692         _profile = _data.profiles[profileId];
88693         _profile.context = new syncml.context.Context({prefix: "tizen-"});
88694         _stores = [];
88695         _routes = [];
88696         utils.forEach(_profile.serviceInfo, function(service) {
88697             var name = _profile.profileName + "-" + service.serviceType;
88698             _stores.push({
88699                 uri:            name,
88700                 displayName:    name,
88701                 maxGuidSize:    64,
88702                 maxObjSize:     4000000,
88703                 agent:          _data.agent
88704             });
88705             _routes.push([name, service.serverDatabaseUri]);
88706         });
88707         _profile.context.getEasyClientAdapter({
88708             displayName: "Tizen syncML adapter",
88709             devInfo: {
88710                 devID: "tizen-syncml-03",
88711                 devType: syncml.constant.DEVTYPE_WORKSTATION,
88712                 manufacturerName: "Tizen",
88713                 modelName: "tizen.syncml.client",
88714                 hierarchicalSync: false
88715             },
88716             stores: _stores,
88717             peer: {
88718                 url:        _profile.syncInfo.url,
88719                 username:   _profile.syncInfo.id,
88720                 password:   _profile.syncInfo.password
88721             },
88722             routes: _routes
88723         }, function(err, adapter, stores, peer) {
88724             if (err) {
88725                 console.log("[datasync.syncml] getEasyClientAdapter fail:", err);
88726                 return;
88727             }
88728             utils.forEach(stores, function(store) {
88729                 var args = {
88730                     data:       _data.mode_table[_profile.syncInfo.type],
88731                     source:     store.uri,
88732                     target:     _profile.serviceInfo[0].serverDatabaseUri,
88733                     nextAnchor: syncml.common.ts()
88734                 };
88735                 if (args.data === _data.mode_table["SLOW"]) {
88736                     args.lastAnchor = null;
88737                 } else if (peer.getStore(args.target)) {
88738                     args.lastAnchor = peer.getStore(args.target)._getBinding().localAnchor;
88739                 }
88740
88741                 db.saveObject("syncml-alert-args", args);
88742                 db.saveObject("syncml-first-flag", false);
88743                 sync_peer(adapter, store, peer, _data.type_table[_profile.syncInfo.type]);
88744             });
88745         });
88746
88747     }
88748
88749     function stopSync(profileId) {
88750         if (!_security.stopSync) {
88751             throw new WebAPIException(errorcode.SECURITY_ERR);
88752         }
88753
88754         t.DataSynchronizationManager("stopSync", arguments);
88755
88756         if (!_data.profiles[profileId]) {
88757             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
88758         }
88759
88760         _data.profiles[profileId].stop_flag = true;
88761     }
88762
88763     function getLastSyncStatistics(profileId) {
88764         var s, statistics = [], i;
88765
88766         if (!_security.getLastSyncStatistics) {
88767             throw new WebAPIException(errorcode.SECURITY_ERR);
88768         }
88769
88770         t.DataSynchronizationManager("getLastSyncStatistics", arguments);
88771
88772         if (!_data.profiles[profileId]) {
88773             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
88774         }
88775
88776         s = _data.profiles[profileId].syncStatistics;
88777
88778         for (i in s) {
88779             statistics.push(
88780                 new SyncStatistics(s[i].syncStatus, s[i].serviceType, s[i].lastSyncTime,
88781                     s[i].serverToClientTotal, s[i].serverToClientAdded,
88782                     s[i].serverToClientUpdated, s[i].serverToClientRemoved,
88783                     s[i].clientToServerTotal, s[i].clientToServerAdded,
88784                     s[i].clientToServerUpdated, s[i].clientToServerRemoved)
88785             );
88786         }
88787
88788         return statistics;
88789     }
88790
88791     function handleSubFeatures(subFeatures) {
88792         var i, subFeature;
88793
88794         for (subFeature in subFeatures) {
88795             for (i in _security[subFeature]) {
88796                 _security[_security[subFeature][i]] = true;
88797             }
88798         }
88799     }
88800
88801     datasync = {
88802         add:                    add,
88803         update:                 update,
88804         remove:                 remove,
88805         getMaxProfilesNum:      getMaxProfilesNum,
88806         getProfilesNum:         getProfilesNum,
88807         get:                    get,
88808         getAll:                 getAll,
88809         startSync:              startSync,
88810         stopSync:               stopSync,
88811         getLastSyncStatistics:  getLastSyncStatistics,
88812         handleSubFeatures:      handleSubFeatures
88813     };
88814
88815     return datasync;
88816 };
88817
88818 _initialize();
88819
88820 module.exports = _self;
88821
88822 });
88823 define('ripple/platform/tizen/2.0/messageport', function (require, exports, module) {
88824 /*
88825  *  Copyright 2014 Intel Corporation.
88826  *
88827  * Licensed under the Apache License, Version 2.0 (the "License");
88828  * you may not use this file except in compliance with the License.
88829  * You may obtain a copy of the License at
88830  *
88831  * http://www.apache.org/licenses/LICENSE-2.0
88832  *
88833  * Unless required by applicable law or agreed to in writing, software
88834  * distributed under the License is distributed on an "AS IS" BASIS,
88835  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
88836  * See the License for the specific language governing permissions and
88837  * limitations under the License.
88838  */
88839
88840 var db = require('ripple/db'),
88841     event = require('ripple/event'),
88842     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
88843     t = require('ripple/platform/tizen/2.0/typecast'),
88844     WebAPIException = require('ripple/platform/tizen/2.0/WebAPIException'),
88845     LocalMessagePort,
88846     RemoteMessagePort,
88847     MessagePortInternal,
88848     _data = {
88849         messagePorts: {},
88850         nListener: 0
88851     },
88852     _self;
88853
88854 function _get() {
88855     return db.retrieveObject("tizen-messageport");
88856 }
88857
88858 function _registerApplication(appId, certificate) {
88859     if (_data.messagePorts[appId])
88860         return;
88861
88862     _data.messagePorts[appId] = {
88863         local: {},
88864         remote: {},
88865         certificate: certificate
88866     };
88867 }
88868
88869 function _initialize() {
88870     var appId, app, port, database = _get();
88871
88872     for (appId in database) {
88873         app = database[appId];
88874
88875         _registerApplication(appId, app.certificate);
88876
88877         for (port in app.ports) {
88878             _setMessagePort(appId, port, app.ports[port], false);
88879             _data.messagePorts[appId].local[port].listeners
88880                     [++_data.nListener] = _remoteListener(appId, port);
88881         }
88882     }
88883
88884     event.on("LocalMessagePortReceived", function (data, remotePort) {
88885         var currentAppId = _getCurrentAppId(), appId, messagePortName, isTrusted;
88886
88887         appId = remotePort.appId;
88888         messagePortName = remotePort.messagePortName;
88889         isTrusted = remotePort.isTrusted;
88890
88891         if (!_getMessagePort(appId, messagePortName, true)) {
88892             if (!_data.messagePorts[appId].remote[currentAppId]) {
88893                 _data.messagePorts[appId].remote[currentAppId] = {};
88894             }
88895             _data.messagePorts[appId].remote[currentAppId][messagePortName] =
88896                     new MessagePortInternal(currentAppId, appId, messagePortName,
88897                     true, isTrusted);
88898         }
88899
88900         remotePort.appId = currentAppId;
88901         _dispatchMessage(appId, remotePort, data, null);
88902     });
88903 }
88904
88905 function _getCurrentAppId() {
88906     return tizen.application.getCurrentApplication().appInfo.id;
88907 }
88908
88909 function _remoteListener(appId, port) {
88910     var remotePort = {
88911         appId: appId,
88912         messagePortName: port
88913     };
88914
88915     return function (data, localMessagePort) {
88916         event.trigger("RemoteMessagePortSent", [remotePort, data,
88917                 localMessagePort]);
88918     };
88919 }
88920
88921 function _setMessagePort(appId, messagePortName, isTrusted, isRemote) {
88922     var messagePort, ports, currentAppId = "";
88923
88924     if (!isRemote) {
88925         messagePort = new MessagePortInternal(currentAppId, appId,
88926                 messagePortName, isRemote, isTrusted);
88927         ports = _data.messagePorts[appId].local;
88928     } else {
88929         currentAppId = _getCurrentAppId();
88930         messagePort = new MessagePortInternal(currentAppId, appId,
88931             messagePortName, isRemote, isTrusted);
88932
88933         if (!_data.messagePorts[currentAppId].remote[appId]) {
88934             _data.messagePorts[currentAppId].remote[appId] = {};
88935         }
88936         ports = _data.messagePorts[currentAppId].remote[appId];
88937     }
88938
88939     ports[messagePortName] = messagePort;
88940
88941     return messagePort.external;
88942 }
88943
88944 function _getMessagePort(appId, messagePortName, isRemote) {
88945     var messagePort, currentAppId = _getCurrentAppId(),
88946         app = _data.messagePorts[currentAppId];
88947
88948     messagePort = !isRemote ? app.local[messagePortName] :
88949             (app.remote[appId] ? app.remote[appId][messagePortName] : null);
88950
88951     return !messagePort ? null : messagePort.external;
88952 }
88953
88954 function _dispatchMessage(selfId, dest, data, repliedMessagePort) {
88955     var app, watchId, listener, localPort, messagePort = null,
88956         messagePortName = dest.messagePortName,
88957         appId = dest.appId,
88958         repliedName;
88959
88960     app = _data.messagePorts[appId];
88961     localPort = app.local[messagePortName];
88962
88963     if (repliedMessagePort) {
88964         repliedName = repliedMessagePort.messagePortName;
88965         if (_data.messagePorts[appId].remote[selfId] &&
88966                 _data.messagePorts[appId].remote[selfId][repliedName]) {
88967             messagePort = _data.messagePorts[appId].remote[selfId]
88968                     [repliedName].external;
88969         }
88970     }
88971
88972     for (watchId in localPort.listeners) {
88973         listener = localPort.listeners[watchId];
88974         listener(data, messagePort);
88975     }
88976 }
88977
88978 _self = {
88979     requestLocalMessagePort: function (localMessagePortName) {
88980         var currentAppId, localMessagePort;
88981
88982         t.MessagePortManager("requestLocalMessagePort", arguments);
88983
88984         currentAppId = _getCurrentAppId();
88985         _registerApplication(currentAppId, true);
88986
88987         localMessagePort = _getMessagePort(currentAppId,
88988                 localMessagePortName, false);
88989
88990         if (localMessagePort) {
88991             if (localMessagePort.isTrusted) {
88992                 throw new WebAPIException(errorcode.UNKNOWN_ERR);
88993             }
88994         } else {
88995             localMessagePort = _setMessagePort(currentAppId,
88996                     localMessagePortName, false, false);
88997
88998             event.trigger("LocalMessagePortAdded", [localMessagePortName,
88999                     false]);
89000         }
89001
89002         return localMessagePort;
89003     },
89004
89005     requestTrustedLocalMessagePort: function (localMessagePortName) {
89006         var currentAppId, localMessagePort;
89007
89008         t.MessagePortManager("requestTrustedLocalMessagePort", arguments);
89009
89010         currentAppId = _getCurrentAppId();
89011         _registerApplication(currentAppId, true);
89012
89013         localMessagePort = _getMessagePort(currentAppId,
89014                 localMessagePortName, false);
89015
89016         if (localMessagePort) {
89017             if (!localMessagePort.isTrusted) {
89018                 throw new WebAPIException(errorcode.UNKNOWN_ERR);
89019             }
89020         } else {
89021             localMessagePort = _setMessagePort(currentAppId,
89022                     localMessagePortName, true, false);
89023
89024             event.trigger("LocalMessagePortAdded", [localMessagePortName,
89025                     true]);
89026         }
89027
89028         return localMessagePort;
89029     },
89030
89031     requestRemoteMessagePort: function (appId, remoteMessagePortName) {
89032         var remoteMessagePort, app, currentAppId;
89033
89034         t.MessagePortManager("requestRemoteMessagePort", arguments);
89035
89036         currentAppId = _getCurrentAppId();
89037         _registerApplication(currentAppId, true);
89038
89039         app = _data.messagePorts[appId];
89040
89041         if (!app || !app.local[remoteMessagePortName]) {
89042             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
89043         }
89044         if (app.local[remoteMessagePortName].isTrusted) {
89045             throw new WebAPIException(errorcode.INVALID_ACCESS_ERR);
89046         }
89047
89048         remoteMessagePort = _getMessagePort(appId,
89049                 remoteMessagePortName, true);
89050
89051         if (remoteMessagePort) {
89052             if (remoteMessagePort.isTrusted) {
89053                 throw new WebAPIException(errorcode.UNKNOWN_ERR);
89054             }
89055         } else {
89056             remoteMessagePort = _setMessagePort(appId,
89057                     remoteMessagePortName, false, true);
89058
89059             event.trigger("RemoteMessagePortAdded", [appId,
89060                     remoteMessagePortName, false]);
89061         }
89062
89063         return remoteMessagePort;
89064     },
89065
89066     requestTrustedRemoteMessagePort: function (appId, remoteMessagePortName) {
89067         var remoteMessagePort, app, currentAppId;
89068
89069         t.MessagePortManager("requestTrustedRemoteMessagePort", arguments);
89070
89071         currentAppId = _getCurrentAppId();
89072         _registerApplication(currentAppId, true);
89073
89074         app = _data.messagePorts[appId];
89075
89076         if (!app) {
89077             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
89078         }
89079         if (!app.certificate) {
89080             throw new WebAPIException(errorcode.INVALID_ACCESS_ERR);
89081         }
89082         if (!app.local[remoteMessagePortName]) {
89083             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
89084         }
89085         if (!app.local[remoteMessagePortName].isTrusted) {
89086             throw new WebAPIException(errorcode.INVALID_ACCESS_ERR);
89087         }
89088
89089         remoteMessagePort = _getMessagePort(appId,
89090                 remoteMessagePortName, true);
89091
89092         if (remoteMessagePort) {
89093             if (!remoteMessagePort.isTrusted) {
89094                 throw new WebAPIException(errorcode.UNKNOWN_ERR);
89095             }
89096         } else {
89097             remoteMessagePort = _setMessagePort(appId,
89098                     remoteMessagePortName, true, true);
89099
89100             event.trigger("RemoteMessagePortAdded", [appId,
89101                     remoteMessagePortName, true]);
89102         }
89103
89104         return remoteMessagePort;
89105     }
89106 };
89107
89108 LocalMessagePort = function (messagePortName, isTrusted, listeners) {
89109     var messagePort = {};
89110
89111     messagePort.messagePortName = messagePortName || "";
89112     messagePort.isTrusted = isTrusted || false;
89113
89114     this.__defineGetter__("messagePortName", function () {
89115         return messagePort.messagePortName;
89116     });
89117
89118     this.__defineGetter__("isTrusted", function () {
89119         return messagePort.isTrusted;
89120     });
89121
89122     this.addMessagePortListener = function (listener) {
89123         var watchId;
89124
89125         t.LocalMessagePort("addMessagePortListener", arguments);
89126
89127         watchId = ++_data.nListener;
89128         listeners[watchId] = listener;
89129
89130         return watchId;
89131     };
89132
89133     this.removeMessagePortListener = function (watchId) {
89134         t.LocalMessagePort("removeMessagePortListener", arguments);
89135
89136         if (!listeners[watchId]) {
89137             // throw new WebAPIException(errorcode.NOT_FOUND_ERR);
89138             return;
89139         }
89140
89141         delete listeners[watchId];
89142     };
89143 };
89144
89145 RemoteMessagePort = function (selfId, appId, messagePortName, isTrusted) {
89146     var messagePort = {};
89147
89148     messagePort.appId = appId || "";
89149     messagePort.messagePortName = messagePortName || "";
89150     messagePort.isTrusted = isTrusted || false;
89151
89152     this.__defineGetter__("appId", function () {
89153         return messagePort.appId;
89154     });
89155
89156     this.__defineGetter__("messagePortName", function () {
89157         return messagePort.messagePortName;
89158     });
89159
89160     this.__defineGetter__("isTrusted", function () {
89161         return messagePort.isTrusted;
89162     });
89163
89164     this.sendMessage = function (data, localMessagePort) {
89165         t.RemoteMessagePort("sendMessage", arguments);
89166
89167         window.setTimeout(function () {
89168             _dispatchMessage(selfId, messagePort, data, localMessagePort);
89169         }, 1);
89170     };
89171 };
89172
89173 MessagePortInternal = function (selfId, appId, messagePortName, isRemote,
89174         isTrusted) {
89175     this.isTrusted = isTrusted;
89176
89177     if (isRemote) {
89178         this.external = new RemoteMessagePort(selfId, appId, messagePortName,
89179                 isTrusted);
89180     } else {
89181         this.listeners = {};
89182         this.external = new LocalMessagePort(messagePortName, isTrusted,
89183                 this.listeners);
89184     }
89185 };
89186
89187 _initialize();
89188
89189 module.exports = _self;
89190
89191 });
89192 define('ripple/platform/tizen/2.0/errorcode', function (require, exports, module) {
89193 /*
89194  *  Copyright 2011 Intel Corporation.
89195  *
89196  * Licensed under the Apache License, Version 2.0 (the "License"),
89197  * you may not use this file except in compliance with the License.
89198  * You may obtain a copy of the License at
89199  *
89200  * http://www.apache.org/licenses/LICENSE-2.0
89201  *
89202  * Unless required by applicable law or agreed to in writing, software
89203  * distributed under the License is distributed on an "AS IS" BASIS,
89204  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
89205  * See the License for the specific language governing permissions and
89206  * limitations under the License.
89207  */
89208
89209 var _self = {};
89210
89211 _self.__defineGetter__("UNKNOWN_ERR", function () {
89212     return 0;
89213 });
89214
89215 _self.__defineGetter__("INDEX_SIZE_ERR", function () {
89216     return 1;
89217 });
89218
89219 _self.__defineGetter__("DOMSTRING_SIZE_ERR", function () {
89220     return 2;
89221 });
89222
89223 _self.__defineGetter__("HIERARCHY_REQUEST_ERR", function () {
89224     return 3;
89225 });
89226
89227 _self.__defineGetter__("WRONG_DOCUMENT_ERR", function () {
89228     return 4;
89229 });
89230
89231 _self.__defineGetter__("INVALID_CHARACTER_ERR", function () {
89232     return 5;
89233 });
89234
89235 _self.__defineGetter__("NO_DATA_ALLOWED_ERR", function () {
89236     return 6;
89237 });
89238
89239 _self.__defineGetter__("NO_MODIFICATION_ALLOWED_ERR", function () {
89240     return 7;
89241 });
89242
89243 _self.__defineGetter__("NOT_FOUND_ERR", function () {
89244     return 8;
89245 });
89246
89247 _self.__defineGetter__("NOT_SUPPORTED_ERR", function () {
89248     return 9;
89249 });
89250
89251 _self.__defineGetter__("INUSE_ATTRIBUTE_ERR", function () {
89252     return 10;
89253 });
89254
89255 _self.__defineGetter__("INVALID_STATE_ERR", function () {
89256     return 11;
89257 });
89258
89259 _self.__defineGetter__("SYNTAX_ERR", function () {
89260     return 12;
89261 });
89262
89263 _self.__defineGetter__("INVALID_MODIFICATION_ERR", function () {
89264     return 13;
89265 });
89266
89267 _self.__defineGetter__("NAMESPACE_ERR", function () {
89268     return 14;
89269 });
89270
89271 _self.__defineGetter__("INVALID_ACCESS_ERR", function () {
89272     return 15;
89273 });
89274
89275 _self.__defineGetter__("VALIDATION_ERR", function () {
89276     return 16;
89277 });
89278
89279 _self.__defineGetter__("TYPE_MISMATCH_ERR", function () {
89280     return 17;
89281 });
89282
89283 _self.__defineGetter__("SECURITY_ERR", function () {
89284     return 18;
89285 });
89286
89287 _self.__defineGetter__("NETWORK_ERR", function () {
89288     return 19;
89289 });
89290
89291 _self.__defineGetter__("ABORT_ERR", function () {
89292     return 20;
89293 });
89294
89295 _self.__defineGetter__("URL_MISMATCH_ERR", function () {
89296     return 21;
89297 });
89298
89299 _self.__defineGetter__("QUOTA_EXCEEDED_ERR", function () {
89300     return 22;
89301 });
89302
89303 _self.__defineGetter__("TIMEOUT_ERR", function () {
89304     return 23;
89305 });
89306
89307 _self.__defineGetter__("INVALID_NODE_TYPE_ERR", function () {
89308     return 24;
89309 });
89310
89311 _self.__defineGetter__("DATA_CLONE_ERR", function () {
89312     return 25;
89313 });
89314
89315 _self.__defineGetter__("INVALID_VALUES_ERR", function () {
89316     return 99;
89317 });
89318
89319 _self.__defineGetter__("IO_ERR", function () {
89320     return 100;
89321 });
89322
89323 _self.__defineGetter__("SERVICE_NOT_AVAILABLE_ERR", function () {
89324     return 111;
89325 });
89326
89327 module.exports = _self;
89328
89329
89330 });
89331 define('ripple/platform/tizen/2.0/POIBase', function (require, exports, module) {
89332 /*
89333  *  Copyright 2012 Intel Corporation.
89334  *
89335  * Licensed under the Apache License, Version 2.0 (the "License");
89336  * you may not use this file except in compliance with the License.
89337  * You may obtain a copy of the License at
89338  *
89339  * http://www.apache.org/licenses/LICENSE-2.0
89340  *
89341  * Unless required by applicable law or agreed to in writing, software
89342  * distributed under the License is distributed on an "AS IS" BASIS,
89343  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
89344  * See the License for the specific language governing permissions and
89345  * limitations under the License.
89346  */
89347
89348 var tizen1_utils = require('ripple/platform/tizen/2.0/tizen1_utils'),
89349     POIGeometry = require('ripple/platform/tizen/2.0/POIGeometry'),
89350     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
89351     WebAPIError = require('ripple/platform/tizen/2.0/WebAPIError');
89352
89353
89354 module.exports = function (prop) {
89355     var _self, i, copy, attr;
89356     _self = {
89357         name : null,
89358         categories : [],
89359         address : null,
89360         phoneNumbers : [],
89361         geometry : null,
89362         urls : [],
89363         rating : null,
89364         tags : null,
89365         toGeoJSON : function () {
89366             throw new WebAPIError(errorcode.NOT_SUPPORTED_ERR);
89367         }
89368     };
89369
89370     _self.__defineGetter__("id", function () {
89371         return null;
89372     });
89373
89374     _self.__defineGetter__("providerName", function () {
89375         return null;
89376     });
89377
89378     if (prop) {
89379         if (prop.name) {
89380             _self.name = String(prop.name);
89381         }
89382         if (tizen1_utils.isValidArray(prop.categories)) {
89383             _self.categories = [];
89384             for (i in prop.categories) {
89385                 _self.categories.push(String(prop.categories[i]));
89386             }
89387         }
89388         if (prop.address) {
89389             if (typeof prop.address === "string") {
89390                 _self.address = String(prop.address);
89391             } else if (Object.prototype.toString.call(prop.address) === "[object Object]") {
89392                 copy = prop.address.constructor();
89393                 for (attr in prop.address) {
89394                     if (prop.address.hasOwnProperty(attr)) {
89395                         copy[attr] = prop.address[attr];
89396                     }
89397                 }
89398                 _self.address = copy;
89399             }
89400         }
89401         if (tizen1_utils.isValidArray(prop.phoneNumbers)) {
89402             _self.phoneNumbers = [];
89403             for (i in prop.phoneNumbers) {
89404                 _self.phoneNumbers.push(String(prop.phoneNumbers[i]));
89405             }
89406         }
89407         if (prop.geometry) {
89408             _self.geometry = new POIGeometry(prop.geometry.position, prop.geometry.viewport, prop.geometry.wkt);
89409         }
89410         if (tizen1_utils.isValidArray(prop.urls)) {
89411             _self.urls = [];
89412             for (i in prop.urls) {
89413                 _self.urls.push(String(prop.urls[i]));
89414             }
89415         }
89416         if (typeof prop.rating === "number") {
89417             _self.rating = prop.rating;
89418         }
89419         if (Object.prototype.toString.call(prop.tags) === "[object Object]") {
89420             copy = prop.tags.constructor();
89421             for (attr in prop.tags) {
89422                 if (prop.tags.hasOwnProperty(attr)) {
89423                     copy[attr] = prop.tags[attr];
89424                 }
89425             }
89426             _self.tags = copy;
89427         }
89428     }
89429
89430     return _self;
89431 };
89432
89433 });
89434 define('ripple/platform/tizen/2.0/NDEFRecordInternal', function (require, exports, module) {
89435 /*
89436  *  Copyright 2013 Intel Corporation
89437  *
89438  * Licensed under the Apache License, Version 2.0 (the "License");
89439  * you may not use this file except in compliance with the License.
89440  * You may obtain a copy of the License at
89441  *
89442  * http://www.apache.org/licenses/LICENSE-2.0
89443  *
89444  * Unless required by applicable law or agreed to in writing, software
89445  * distributed under the License is distributed on an "AS IS" BASIS,
89446  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
89447  * See the License for the specific language governing permissions and
89448  * limitations under the License.
89449  */
89450
89451 module.exports = function (tnf, type, payload, id) {
89452     this.__defineGetter__("tnf", function () {
89453         return tnf;
89454     });
89455
89456     this.__defineGetter__("type", function () {
89457         return type;
89458     });
89459
89460     this.__defineGetter__("id", function () {
89461         return id;
89462     });
89463
89464     this.__defineGetter__("payload", function () {
89465         return payload;
89466     });
89467 };
89468
89469 });
89470 define('ripple/platform/tizen/2.0/EventBase', function (require, exports, module) {
89471 /*
89472  *  Copyright 2012 Intel Corporation.
89473  *
89474  * Licensed under the Apache License, Version 2.0 (the "License");
89475  * you may not use this file except in compliance with the License.
89476  * You may obtain a copy of the License at
89477  *
89478  * http://www.apache.org/licenses/LICENSE-2.0
89479  *
89480  * Unless required by applicable law or agreed to in writing, software
89481  * distributed under the License is distributed on an "AS IS" BASIS,
89482  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
89483  * See the License for the specific language governing permissions and
89484  * limitations under the License.
89485  */
89486
89487 module.exports = function () {
89488     var _self = {
89489         CAPTURING_PHASE: 1,
89490         AT_TARGET:  2,
89491         BUBBLING_PHASE: 3,
89492
89493         type: '',
89494         target: null, //new EventTarget(),
89495         currentTarget: null, //new EventTarget(),
89496         eventPhase: 0,
89497         bubbles: false,
89498         cancelable: false,
89499         timeStamp: 0
89500     };
89501
89502     this.__defineGetter__("type", function () {
89503         return _self.type;
89504     });
89505
89506     this.__defineGetter__("target", function () {
89507         return _self.target;
89508     });
89509
89510     this.__defineGetter__("currentTarget", function () {
89511         return _self.currentTarget;
89512     });
89513
89514     this.__defineGetter__("eventPhase", function () {
89515         return _self.eventPhase;
89516     });
89517
89518     this.__defineGetter__("bubbles", function () {
89519         return _self.bubbles;
89520     });
89521
89522     this.__defineGetter__("cancelable", function () {
89523         return _self.cancelable;
89524     });
89525
89526     this.__defineGetter__("timeStamp", function () {
89527         return _self.timeStamp;
89528     });
89529
89530     this.stopPropagation = function () {};
89531
89532     this.preventDefault = function () {};
89533
89534     this.initEvent = function (eventTypeArg, canBubbleArg, cancelableArg) {
89535         _self.type = eventTypeArg;
89536         _self.bubbles = canBubbleArg;
89537         _self.cancelable = cancelableArg;
89538
89539         _self.timeStamp = (new Date()).getTime();
89540     };
89541
89542     return _self;
89543 };
89544
89545
89546 });
89547 define('ripple/platform/tizen/2.0/messaging', function (require, exports, module) {
89548 /*
89549  *  Copyright 2012 Intel Corporation.
89550  *
89551  * Licensed under the Apache License, Version 2.0 (the "License");
89552  * you may not use this file except in compliance with the License.
89553  * You may obtain a copy of the License at
89554  *
89555  * http://www.apache.org/licenses/LICENSE-2.0
89556  *
89557  * Unless required by applicable law or agreed to in writing, software
89558  * distributed under the License is distributed on an "AS IS" BASIS,
89559  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
89560  * See the License for the specific language governing permissions and
89561  * limitations under the License.
89562  */
89563
89564 var _self,
89565     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
89566     WebAPIException = require('ripple/platform/tizen/2.0/WebAPIException'),
89567     MessagingService = require('ripple/platform/tizen/2.0/MessagingService'),
89568     t = require('ripple/platform/tizen/2.0/typedef'),
89569     TypeCoerce = require('ripple/platform/tizen/2.0/typecoerce'),
89570     TIZEN_MESSAGING_SMS = "messaging.sms",
89571     TIZEN_MESSAGING_MMS = "messaging.mms",
89572     TIZEN_MESSAGING_EMAIL = "messaging.email",
89573     _security_check = {read: false, write: false},
89574     _sms_service = null,
89575     _mms_service = null,
89576     _email_service = null;
89577
89578 _self = function () {
89579     this.getMessageServices = function (messageServiceType, onSuccess, onError) {
89580         var service;
89581
89582         if (!(new TypeCoerce(t.MessageServiceTag)).match(messageServiceType)) {
89583             throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
89584         }
89585         if (!(new TypeCoerce(t.MessageServiceArraySuccessCallback)).match(onSuccess)) {
89586             throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
89587         }
89588         if (onError && !(new TypeCoerce(t.ErrorCallback)).match(onError)) {
89589             throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
89590         }
89591
89592         switch (messageServiceType) {
89593         case "messaging.sms":
89594             if (_sms_service === null) {
89595                 _sms_service = [new MessagingService("Tizen SMS Service 1", TIZEN_MESSAGING_SMS, _security_check), new MessagingService("Tizen SMS Service 2", TIZEN_MESSAGING_SMS, _security_check)];
89596             }
89597             service = _sms_service;
89598             break;
89599         case "messaging.mms":
89600             if (_mms_service === null) {
89601                 _mms_service = [new MessagingService("Tizen MMS Service", TIZEN_MESSAGING_MMS, _security_check)];
89602             }
89603             service = _mms_service;
89604             break;
89605         case "messaging.email":
89606             if (_email_service === null) {
89607                 _email_service = [new MessagingService("Tizen Email Service", TIZEN_MESSAGING_EMAIL, _security_check)];
89608             }
89609             service = _email_service;
89610             break;
89611         default:
89612             throw (new WebAPIException(errorcode.INVALID_VALUES_ERR));
89613         }
89614         setTimeout(function () {
89615             onSuccess(service);
89616         }, 1);
89617     };
89618     this.handleSubFeatures = function (subFeatures) {
89619         if (subFeatures.hasOwnProperty('http://tizen.org/privilege/messaging.read')) {
89620             _security_check.read = true;
89621         }
89622         if (subFeatures.hasOwnProperty('http://tizen.org/privilege/messaging.write')) {
89623             _security_check.write = true;
89624         }
89625     };
89626 };
89627
89628 module.exports = _self;
89629
89630 });
89631 define('ripple/platform/tizen/2.0/NDEFRecord', function (require, exports, module) {
89632 /*
89633  *  Copyright 2013 Intel Corporation
89634  *
89635  * Licensed under the Apache License, Version 2.0 (the "License");
89636  * you may not use this file except in compliance with the License.
89637  * You may obtain a copy of the License at
89638  *
89639  * http://www.apache.org/licenses/LICENSE-2.0
89640  *
89641  * Unless required by applicable law or agreed to in writing, software
89642  * distributed under the License is distributed on an "AS IS" BASIS,
89643  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
89644  * See the License for the specific language governing permissions and
89645  * limitations under the License.
89646  */
89647
89648 var t = require('ripple/platform/tizen/2.0/typecast'),
89649     NDEFRecordInternal = require('ripple/platform/tizen/2.0/NDEFRecordInternal'),
89650     NDEFRecord;
89651
89652 NDEFRecord = function () {
89653     var voc = [
89654         function (tnf, type, payload, id) {
89655             NDEFRecordInternal.call(this, tnf, type, payload, id || []);
89656         },
89657         function (raw_data) {
89658             NDEFRecordInternal.call(this, 0, [], [], []);
89659         }
89660     ];
89661
89662     t.NDEFRecord(arguments, this, voc);
89663 };
89664
89665 module.exports = NDEFRecord;
89666
89667 });
89668 define('ripple/platform/tizen/2.0/MessageStorage', function (require, exports, module) {
89669 /*
89670  *  Copyright 2012 Intel Corporation.
89671  *
89672  * Licensed under the Apache License, Version 2.0 (the "License");
89673  * you may not use this file except in compliance with the License.
89674  * You may obtain a copy of the License at
89675  *
89676  * http://www.apache.org/licenses/LICENSE-2.0
89677  *
89678  * Unless required by applicable law or agreed to in writing, software
89679  * distributed under the License is distributed on an "AS IS" BASIS,
89680  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
89681  * See the License for the specific language governing permissions and
89682  * limitations under the License.
89683  */
89684 var _self,
89685     utils = require('ripple/utils'),
89686     event = require('ripple/event'),
89687     Message = require('ripple/platform/tizen/2.0/Message'),
89688     Conversation = require('ripple/platform/tizen/2.0/Conversation'),
89689     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
89690     WebAPIException = require('ripple/platform/tizen/2.0/WebAPIException'),
89691     WebAPIError = require('ripple/platform/tizen/2.0/WebAPIError'),
89692     PrivMessage = require('ripple/platform/tizen/2.0/PrivMessage'),
89693     MessageFolder = require('ripple/platform/tizen/2.0/MessageFolder'),
89694     msg_utils = require('ripple/platform/tizen/2.0/msg_utils'),
89695     tizen1_utils = require('ripple/platform/tizen/2.0/tizen1_utils'),
89696     t = require('ripple/platform/tizen/2.0/typedef'),
89697     TypeCoerce = require('ripple/platform/tizen/2.0/typecoerce'),
89698     TIZEN_DEFAULT_MSG_FROM = {"messaging.sms": "13572468",
89699                               "messaging.mms": "13572468",
89700                               "messaging.email": "tizen.simulator@tizen.org"};
89701
89702 _self = function (messages, security_check) {
89703     var message_storage = {},
89704         _findMessage, _findConversation,
89705         _processMessageChange, _processConversationChange,
89706         _folders = {}, folderOpt = {},
89707         _msgListeners = {},
89708         _convListeners = {},
89709         _folderListeners = {},
89710         _security_check = security_check,
89711         _messages = messages;
89712
89713     // init folders
89714     folderOpt = {id: "INBOX", serviceId: _messages.id, contentType: _messages.type,
89715                  path: "inbox", type: "INBOX", synchronizable: true};
89716     _folders.INBOX = new MessageFolder(folderOpt);
89717     folderOpt = {id: "OUTBOX", serviceId: _messages.id, contentType: _messages.type,
89718                  path: "outbox", type: "OUTBOX", synchronizable: false};
89719     _folders.OUTBOX = new MessageFolder(folderOpt);
89720     folderOpt = {id: "DRAFT", serviceId: _messages.id, contentType: _messages.type,
89721                  path: "draft", type: "DRAFTS", synchronizable: false};
89722     _folders.DRAFT = new MessageFolder(folderOpt);
89723     folderOpt = {id: "SENTBOX", serviceId: _messages.id, contentType: _messages.type,
89724                  path: "sentbox", type: "SENTBOX", synchronizable: false};
89725     _folders.SENTBOX = new MessageFolder(folderOpt);
89726
89727     event.on("MsgRecv", function (msg) {
89728         // msg sent from panel to module
89729         if (msg.priv.type !== _messages.type ||
89730             msg.priv.serviceId !== _messages.id) {
89731             return;
89732         }
89733         // trigger Message add
89734         _processMessageChange([msg], "add");
89735         _messages.conv = msg_utils.loadConv(_messages.type, _messages.id);
89736
89737         if (_messages.conv[msg.priv.conversationId].messageCount === 1) {
89738             _processConversationChange([_messages.conv[msg.priv.conversationId]], "add");
89739         } else {
89740             _processConversationChange([_messages.conv[msg.priv.conversationId]], "update");
89741         }
89742     });
89743
89744     event.on("OutsideMessageReceived", function (msg) {
89745         // msg sent from module to panel
89746         if (msg.msg.priv.type !== _messages.type ||
89747             msg.msg.priv.serviceId !== _messages.id) {
89748             return;
89749         }
89750         // trigger conversation/Message add
89751         _processMessageChange([msg.msg], "add");
89752         _messages.conv = msg_utils.loadConv(_messages.type, _messages.id);
89753
89754         if (_messages.conv[msg.msg.priv.conversationId].messageCount === 1) {
89755             _processConversationChange([_messages.conv[msg.msg.priv.conversationId]], "add");
89756         } else {
89757             _processConversationChange([_messages.conv[msg.msg.priv.conversationId]], "update");
89758         }
89759     });
89760
89761     event.on("MsgSentRst", function (rst) {
89762         // ACK from panel when module sent a msg to panel
89763         if (rst.priv.type !== _messages.type ||
89764             rst.priv.serviceId !== _messages.id) {
89765             return;
89766         }
89767         // trigger conversation/Message Update
89768         _processMessageChange([rst], "update");
89769         _messages.conv = msg_utils.loadConv(_messages.type, _messages.id);
89770         _processConversationChange([_messages.conv[rst.priv.conversationId]], "update");
89771     });
89772
89773     _findMessage = function (src, filter) {
89774         var ret, foo = {};
89775         switch (filter.attributeName) {
89776         case "type":
89777             foo[filter.attributeName] = _messages.type;
89778             ret = tizen1_utils.matchAttributeFilter([foo],
89779                       filter.attributeName, filter.matchFlag, filter.matchValue);
89780             if (ret.length === 0) {
89781                 ret = [];
89782             } else {
89783                 // make an array
89784                 ret = utils.filter(src, function () { return true; });
89785             }
89786             break;
89787         case "id":
89788         case "conversationId":
89789         case "folderId":
89790         case "from":
89791         case "messageStatus":
89792             ret = tizen1_utils.matchAttributeFilter(src,
89793                       "priv." + filter.attributeName,
89794                       filter.matchFlag, filter.matchValue);
89795             break;
89796         case "hasAttachment":
89797             if (filter.matchFlag !== "EXACTLY" || typeof filter.matchValue !== "boolean") {
89798                 throw (new WebAPIException(errorcode.INVALID_VALUES_ERR,
89799                               "Support only matchFlag === 'EXACTLY' and typeof matchValue === 'boolean'"));
89800             }
89801             ret = tizen1_utils.matchAttributeBooleanFilter(src,
89802                       "priv." + filter.attributeName, filter.matchValue);
89803             break;
89804         case "to":
89805         case "cc":
89806         case "bcc":
89807             ret = tizen1_utils.matchAttributeArrayFilter(src,
89808                       filter.attributeName, filter.matchFlag, filter.matchValue);
89809             break;
89810         case "body":
89811             ret = tizen1_utils.matchAttributeFilter(src,
89812                       filter.attributeName + ".plainBody",
89813                       filter.matchFlag, filter.matchValue);
89814             break;
89815         case "subject":
89816         case "inResponseTo":
89817             ret = tizen1_utils.matchAttributeFilter(src, filter.attributeName,
89818                       filter.matchFlag, filter.matchValue);
89819             break;
89820         case "isRead":
89821         case "isHighPriority":
89822             if (filter.matchFlag !== "EXACTLY" || typeof filter.matchValue !== "boolean") {
89823                 throw (new WebAPIException(errorcode.INVALID_VALUES_ERR,
89824                               "Support only matchFlag === 'EXACTLY' and typeof matchValue === 'boolean'"));
89825             }
89826             ret = tizen1_utils.matchAttributeBooleanFilter(src,
89827                       filter.attributeName, filter.matchValue);
89828             break;
89829         case "timestamp":
89830             ret = tizen1_utils.matchAttributeRangeFilter(src,
89831                       "priv." + filter.attributeName,
89832                       filter.initialValue, filter.endValue);
89833             break;
89834
89835         case "attachments":
89836             throw (new WebAPIException(errorcode.NOT_SUPPORTED_ERR,
89837                                   "not support find by " + filter.attributeName));
89838         default:
89839             throw (new WebAPIException(errorcode.INVALID_VALUES_ERR,
89840                                    "invalid attributeName"));
89841         }
89842         return ret;
89843     };
89844
89845     _processMessageChange = function (messages, type) {
89846         var i, j, ret = [], tmp,
89847             operation = {"add": "messagesadded",
89848                          "remove": "messagesremoved",
89849                          "update": "messagesupdated"};
89850
89851         for (i in _msgListeners) {
89852             ret = [];
89853             if (_msgListeners[i].filter !== null) {
89854                 tmp = _findMessage(messages, _msgListeners[i].filter);
89855             } else {
89856                 tmp = messages;
89857             }
89858             if (tmp.length !== 0) {
89859                 for (j = 0; j < tmp.length; j++) {
89860                     ret.push(new Message(tmp[j].priv.type, tmp[j]));
89861                 }
89862                 _msgListeners[i].callback[operation[type]](ret);
89863             }
89864         }
89865     };
89866
89867     _findConversation = function (src, filter) {
89868         var ret, foo = {};
89869         switch (filter.attributeName) {
89870         case "type":
89871             foo[filter.attributeName] = _messages.type;
89872             ret = tizen1_utils.matchAttributeFilter([foo], filter.attributeName, filter.matchFlag, filter.matchValue);
89873             if (ret.length === 0) {
89874                 ret = [];
89875             } else {
89876                 // make an array
89877                 ret = utils.filter(_messages.conv, function () { return true; });
89878             }
89879             break;
89880         case "id":
89881         case "preview":
89882         case "subject":
89883         case "from":
89884         case "lastMessageId":
89885             ret = tizen1_utils.matchAttributeFilter(src, filter.attributeName, filter.matchFlag, filter.matchValue);
89886             break;
89887         case "to":
89888         case "cc":
89889         case "bcc":
89890             ret = tizen1_utils.matchAttributeArrayFilter(src,
89891                       filter.attributeName, filter.matchFlag, filter.matchValue);
89892             break;
89893         case "isRead":
89894             if (filter.matchFlag !== "EXACTLY" || typeof filter.matchValue !== "boolean") {
89895                 throw (new WebAPIException(errorcode.INVALID_VALUES_ERR,
89896                               "Support only matchFlag === 'EXACTLY' and typeof matchValue === 'boolean'"));
89897             }
89898             ret = tizen1_utils.matchAttributeBooleanFilter(src,
89899                       filter.attributeName, filter.matchValue);
89900             break;
89901         case "timestamp":
89902         case "messageCount":
89903         case "unreadMessages":
89904             ret = tizen1_utils.matchAttributeRangeFilter(src,
89905                       filter.attributeName,
89906                       filter.initialValue, filter.endValue);
89907             break;
89908         default:
89909             throw (new WebAPIException(errorcode.INVALID_VALUES_ERR,
89910                                    "invalid attributeName"));
89911         }
89912         return ret;
89913     };
89914
89915     _processConversationChange = function (conversations, type) {
89916         var i, j, ret = [], tmp,
89917             operation = {"add": "conversationsadded",
89918                          "remove": "conversationsremoved",
89919                          "update": "conversationsupdated"};
89920
89921         for (i in _convListeners) {
89922             ret = [];
89923             if (_convListeners[i].filter !== null) {
89924                 tmp = _findConversation(conversations, _convListeners[i].filter);
89925             } else {
89926                 tmp = conversations;
89927             }
89928             if (tmp.length !== 0) {
89929                 for (j = 0; j < tmp.length; j++) {
89930                     ret.push(new Conversation(tmp[j]));
89931                 }
89932                 _convListeners[i].callback[operation[type]](ret);
89933             }
89934         }
89935     };
89936
89937     message_storage = {
89938         addDraftMessage: function (_msg, onSuccess, onError) {
89939             var m, msg = {}, opt = {};
89940
89941             if (_security_check.write === false) {
89942                 throw (new WebAPIException(errorcode.SECURITY_ERR));
89943             }
89944             if (msg_utils.setMsg(_msg, msg) === false) {
89945                 throw (new WebAPIException(errorcode.TYPE_MISMATCH_ERR));
89946             }
89947             if (onSuccess && !(new TypeCoerce(t.SuccessCallback)).match(onSuccess)) {
89948                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
89949             }
89950             if (onError && !(new TypeCoerce(t.ErrorCallback)).match(onError)) {
89951                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
89952             }
89953             opt.id = Math.uuid(8, 16);
89954             opt.serviceId = _messages.id;
89955             if ((msg.inResponseTo !== null) &&
89956                 (_messages.msg[msg.inResponseTo] !== undefined)) {
89957                 opt.conversationId = _messages.msg[msg.inResponseTo].conversationId;
89958             } else {
89959                 opt.conversationId = opt.id;
89960             }
89961             opt.folderId = "DRAFTS";
89962             opt.type = _messages.type;
89963             opt.timestamp = new Date();
89964             opt.from = TIZEN_DEFAULT_MSG_FROM[_messages.type];
89965             if (msg.attachments.length === 0) {
89966                 opt.hasAttachment = false;
89967             } else {
89968                 opt.hasAttachment = true;
89969             }
89970             opt.messageStatus = "DRAFT";
89971
89972             m = new PrivMessage(msg, opt);
89973             _messages.msg[m.priv.id] = m;  // local
89974             msg_utils.saveMsg(_messages.msg[m.priv.id]);  // remote
89975             // trigger message add
89976             _processMessageChange([m], "add");
89977             if (onSuccess) {
89978                 setTimeout(function () {
89979                     onSuccess(new Message(m.priv.type, m));
89980                 }, 1);
89981             }
89982         },
89983
89984         removeMessages: function (messages, onSuccess, onError) {
89985             var i, c, na_msg = "", msgToDel = [], convToDel = {}, delConv = [], updateConv = [];
89986
89987             if (_security_check.write === false) {
89988                 throw (new WebAPIException(errorcode.SECURITY_ERR));
89989             }
89990             if (tizen1_utils.isValidArray(messages) === false) {
89991                 throw (new WebAPIException(errorcode.TYPE_MISMATCH_ERR));
89992             }
89993             if (messages.length === 0) {
89994                 throw (new WebAPIException(errorcode.INVALID_VALUES_ERR));
89995             }
89996             if (onSuccess && !(new TypeCoerce(t.SuccessCallback)).match(onSuccess)) {
89997                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
89998             }
89999             if (onError && !(new TypeCoerce(t.ErrorCallback)).match(onError)) {
90000                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
90001             }
90002
90003             _messages.conv = msg_utils.loadConv(_messages.type, _messages.id);
90004             for (i = 0; i < messages.length; i++) {
90005                 if (_messages.msg[messages[i].id] === undefined) {
90006                     na_msg += messages[i].id + ", ";
90007                 } else {
90008                     msgToDel.push(utils.copy(_messages.msg[messages[i].id]));
90009                 }
90010                 if (_messages.conv[messages[i].conversationId] !== undefined) {
90011                     convToDel[messages[i].conversationId] = _messages.conv[messages[i].conversationId];
90012                 }
90013             }
90014             if (na_msg === "") {
90015                 for (i = 0; i < messages.length; i++) {
90016                     // conversation updated at remote when msg is deleted
90017                     msg_utils.delMsg(_messages.msg[messages[i].id]); // remote
90018                     delete _messages.msg[messages[i].id]; // local
90019                 }
90020                 // update conversation
90021                 _messages.conv = msg_utils.loadConv(_messages.type, _messages.id);
90022                 for (c in convToDel) {
90023                     if (_messages.conv[c] === undefined) {
90024                         delConv.push(convToDel[c]);
90025                     } else {
90026                         updateConv.push(convToDel[c]);
90027                     }
90028                 }
90029                 if (onSuccess) {
90030                     setTimeout(function () {
90031                         onSuccess();
90032                     }, 1);
90033                 }
90034                 // trigger messages remove
90035                 _processMessageChange(msgToDel, "remove");
90036                 if (delConv.length > 0) {
90037                     _processConversationChange(delConv, "remove");
90038                 }
90039                 if (updateConv.length > 0) {
90040                     _processConversationChange(updateConv, "update");
90041                 }
90042             } else {
90043                 if (onError) {
90044                     setTimeout(function () {
90045                         onError(new WebAPIError(errorcode.NOT_FOUND_ERR,
90046                                 na_msg + "not found !!"));
90047                     }, 1);
90048                 }
90049             }
90050         },
90051
90052         updateMessages: function (messages, onSuccess, onError) {
90053             var i, m, updateConv = {}, updateMsg = [], tmp,
90054                 na_msg = "", invalid_msg = "";
90055
90056             if (_security_check.write === false) {
90057                 throw (new WebAPIException(errorcode.SECURITY_ERR));
90058             }
90059             if (onSuccess && !(new TypeCoerce(t.SuccessCallback)).match(onSuccess)) {
90060                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
90061             }
90062             if (onError && !(new TypeCoerce(t.ErrorCallback)).match(onError)) {
90063                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
90064             }
90065             if (tizen1_utils.isValidArray(messages) === false) {
90066                 throw (new WebAPIException(errorcode.TYPE_MISMATCH_ERR));
90067             }
90068             if (messages.length === 0) {
90069                 throw (new WebAPIException(errorcode.INVALID_VALUES_ERR));
90070             }
90071             // update conversation
90072             _messages.conv = msg_utils.loadConv(_messages.type, _messages.id);
90073             for (i = 0; i < messages.length; i++) {
90074                 m = _messages.msg[messages[i].id];
90075                 if (m === undefined) {
90076                     // msg not found
90077                     na_msg += messages[i].id + ", ";
90078                 } else {
90079                     if (m.priv.messageStatus === "DRAFT") {
90080                         tmp = {};
90081                         // allow update all writeable attr in draft
90082                         if (msg_utils.setMsg(messages[i], tmp) === false) {
90083                             invalid_msg += messages[i].id + ", ";
90084                         }
90085                     }
90086                 }
90087             }
90088             if (invalid_msg !== "") {
90089                 if (onError) {
90090                     setTimeout(function () {
90091                         onError(new WebAPIError(errorcode.INVALID_VALUES_ERR,
90092                                 invalid_msg + "invalid values"));
90093                     }, 1);
90094                 }
90095                 return;
90096             }
90097             if (na_msg !== "") {
90098                 if (onError) {
90099                     setTimeout(function () {
90100                         onError(new WebAPIError(errorcode.NOT_FOUND_ERR,
90101                                 na_msg + "not found !!"));
90102                     }, 1);
90103                 }
90104                 return;
90105             }
90106
90107             for (i = 0; i < messages.length; i++) {
90108                 m = _messages.msg[messages[i].id];
90109                 if (m.priv.messageStatus === "DRAFT") {
90110                     msg_utils.setMsg(messages[i], m);
90111                     updateMsg.push(m);
90112                 } else {
90113                     // only allow update isRead in other folders
90114                     if (typeof messages[i].isRead === 'boolean') {
90115                         m.isRead = messages[i].isRead;
90116                         updateMsg.push(m);
90117                         updateConv[m.priv.conversationId] = _messages.conv[m.priv.conversationId];
90118                     }
90119                 }
90120                 msg_utils.saveMsg(m);
90121             }
90122             if (onSuccess) {
90123                 setTimeout(function () {
90124                     onSuccess();
90125                 }, 1);
90126             }
90127
90128             // trigger Message update
90129             _processMessageChange(updateMsg, "update");
90130
90131             _messages.conv = msg_utils.loadConv(_messages.type, _messages.id);
90132             // trigger conversation update
90133             _processConversationChange(updateConv, "update");
90134         },
90135
90136         findMessages: function (filter, onSuccess, onError, sort, _limit, _offset) {
90137             var i, tmp, offset, limit, ret = [];
90138
90139             if (_security_check.read === false) {
90140                 throw (new WebAPIException(errorcode.SECURITY_ERR));
90141             }
90142             if (!(new TypeCoerce(t.MessageArraySuccessCallback)).match(onSuccess)) {
90143                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
90144             }
90145             if (onError && !(new TypeCoerce(t.ErrorCallback)).match(onError)) {
90146                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
90147             }
90148             if (sort && !(new TypeCoerce(t.SortMode)).match(sort)) {
90149                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
90150             }
90151             if (_limit && !(new TypeCoerce(t.long)).match(_limit)) {
90152                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
90153             }
90154             if (_offset && !(new TypeCoerce(t.long)).match(_offset)) {
90155                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
90156             }
90157             tmp = _findMessage(_messages.msg, filter);
90158
90159             if (_offset) {
90160                 offset = _offset;
90161             } else {
90162                 offset = 0;
90163             }
90164             if (_limit) {
90165                 limit = Math.min(_limit + offset, tmp.length);
90166             } else {
90167                 limit = tmp.length;
90168             }
90169             for (i = offset; i < limit; i++) {
90170                 ret.push(new Message(tmp[i].priv.type, tmp[i]));
90171             }
90172             setTimeout(function () {
90173                 onSuccess(ret);
90174             }, 1);
90175         },
90176
90177         findConversations: function (filter, onSuccess, onError, sort, _limit, _offset) {
90178             var i, tmp, offset, limit, ret = [];
90179
90180             if (_security_check.read === false) {
90181                 throw (new WebAPIException(errorcode.SECURITY_ERR));
90182             }
90183             if (!(new TypeCoerce(t.MessageConversationArraySuccessCallback)).match(onSuccess)) {
90184                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
90185             }
90186             if (onError && !(new TypeCoerce(t.ErrorCallback)).match(onError)) {
90187                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
90188             }
90189             if (sort && !(new TypeCoerce(t.SortMode)).match(sort)) {
90190                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
90191             }
90192             if (_limit && !(new TypeCoerce(t.long)).match(_limit)) {
90193                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
90194             }
90195             if (_offset && !(new TypeCoerce(t.long)).match(_offset)) {
90196                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
90197             }
90198             // download conversation
90199             _messages.conv = msg_utils.loadConv(_messages.type, _messages.id);
90200
90201             tmp = _findConversation(_messages.conv, filter);
90202
90203             if (_offset) {
90204                 offset = _offset;
90205             } else {
90206                 offset = 0;
90207             }
90208             if (_limit) {
90209                 limit = Math.min(_limit + offset, tmp.length);
90210             } else {
90211                 limit = tmp.length;
90212             }
90213             for (i = offset; i < limit; i++) {
90214                 ret.push(new Conversation(tmp[i]));
90215             }
90216             setTimeout(function () {
90217                 onSuccess(ret);
90218             }, 1);
90219         },
90220
90221         removeConversations: function (conversations, onSuccess, onError) {
90222             var i, m, na_msg = "", retConv = [], removeMsg = [];
90223
90224             if (_security_check.write === false) {
90225                 throw (new WebAPIException(errorcode.SECURITY_ERR));
90226             }
90227             if (onSuccess && !(new TypeCoerce(t.SuccessCallback)).match(onSuccess)) {
90228                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
90229             }
90230             if (onError && !(new TypeCoerce(t.ErrorCallback)).match(onError)) {
90231                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
90232             }
90233             // download conversation
90234             _messages.conv = msg_utils.loadConv(_messages.type, _messages.id);
90235
90236             if (tizen1_utils.isValidArray(conversations) === false) {
90237                 throw (new WebAPIException(errorcode.TYPE_MISMATCH_ERR));
90238             }
90239             if (conversations.length === 0) {
90240                 throw (new WebAPIException(errorcode.INVALID_VALUES_ERR));
90241             }
90242             if ((onSuccess && typeof onSuccess !== "function") ||
90243                 (onError && typeof onError !== "function")) {
90244                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
90245             }
90246
90247             for (i = 0; i < conversations.length; i++) {
90248                 if (_messages.conv[conversations[i].id] === undefined) {
90249                     na_msg += conversations[i].id + ", ";
90250                 } else {
90251                     retConv.push(_messages.conv[conversations[i].id]);
90252                     for (m in _messages.msg) {
90253                         if (_messages.msg[m].priv.conversationId === conversations[i].id) {
90254                             removeMsg.push(_messages.msg[m]);
90255                         }
90256                     }
90257                 }
90258             }
90259             if (na_msg === "") {
90260                 for (i = 0; i < removeMsg.length; i++) {
90261                     // conversation updated at remote
90262                     msg_utils.delMsg(removeMsg[i]);  // remote
90263                     delete _messages.msg[removeMsg[i].priv.id]; // local
90264                 }
90265                 // trigger msg(retMsg)/conv(retConv) delete update
90266                 _processMessageChange(removeMsg, "remove");
90267                 _processConversationChange(retConv, "remove");
90268                 if (onSuccess) {
90269                     setTimeout(function () {
90270                         onSuccess();
90271                     }, 1);
90272                 }
90273             } else {
90274                 if (onError) {
90275                     setTimeout(function () {
90276                         onError(new WebAPIError(errorcode.NOT_FOUND_ERR,
90277                                 na_msg + "not found !!"));
90278                     }, 1);
90279                 }
90280             }
90281         },
90282
90283         findFolders: function (filter, onSuccess, onError) {
90284             var ret = [], tmp, i;
90285
90286             if (_security_check.read === false) {
90287                 throw (new WebAPIException(errorcode.SECURITY_ERR));
90288             }
90289             if (!(new TypeCoerce(t.MessageFolderArraySuccessCallback)).match(onSuccess)) {
90290                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
90291             }
90292             if (onError && !(new TypeCoerce(t.ErrorCallback)).match(onError)) {
90293                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
90294             }
90295             switch (filter.attributeName) {
90296             case "id":
90297             case "serviceId":
90298             case "contentType":
90299             case "name":
90300             case "path":
90301             case "type":
90302                 tmp = tizen1_utils.matchAttributeFilter(_folders,
90303                           filter.attributeName, filter.matchFlag,
90304                           filter.matchValue);
90305                 break;
90306             case "synchronizable":
90307                 if (filter.matchFlag !== "EXACTLY" ||
90308                     typeof filter.matchValue !== "boolean") {
90309                     throw (new WebAPIException(errorcode.INVALID_VALUES_ERR,
90310                                   "Support only matchFlag === 'EXACTLY' and typeof matchValue === 'boolean'"));
90311                 }
90312                 tmp = tizen1_utils.matchAttributeBooleanFilter(_folders,
90313                           filter.attributeName, filter.matchValue);
90314                 break;
90315             case "parentId":
90316                 if (filter.matchValue === null) {
90317                     tmp = utils.filter(_folders, function (o) { return o.parentId === null; });
90318                 } else {
90319                     tmp = tizen1_utils.matchAttributeFilter(_folders,
90320                               filter.attributeName, filter.matchValue);
90321                 }
90322                 break;
90323             default:
90324                 throw (new WebAPIException(errorcode.INVALID_VALUES_ERR,
90325                                        "invalid attributeName"));
90326             }
90327             for (i = 0; i < tmp.length; i++) {
90328                 ret.push(new MessageFolder(tmp[i]));
90329             }
90330             setTimeout(function () {
90331                 onSuccess(ret);
90332             }, 1);
90333         },
90334
90335         addMessagesChangeListener: function (msgCallback, filter) {
90336             var watchId, msgListener = {};
90337
90338             if (_security_check.read === false) {
90339                 throw (new WebAPIException(errorcode.SECURITY_ERR));
90340             }
90341             if (!(new TypeCoerce(t.MessagesChangeCallback)).match(msgCallback)) {
90342                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
90343             }
90344             if (filter && !(new TypeCoerce(t.AbstractFilter)).match(filter)) {
90345                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
90346             }
90347
90348             watchId = Number(Math.uuid(8, 10));
90349             msgListener.callback = msgCallback;
90350             msgListener.filter = filter || null;
90351             _msgListeners[watchId] = msgListener;
90352             return watchId;
90353         },
90354
90355         addConversationsChangeListener: function (convCallback, filter) {
90356             var watchId, convListener = {};
90357
90358             if (_security_check.read === false) {
90359                 throw (new WebAPIException(errorcode.SECURITY_ERR));
90360             }
90361             if (!(new TypeCoerce(t.MessageConversationsChangeCallback)).match(convCallback)) {
90362                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
90363             }
90364             if (filter && !(new TypeCoerce(t.AbstractFilter)).match(filter)) {
90365                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
90366             }
90367
90368             watchId = Number(Math.uuid(8, 10));
90369             convListener.callback = convCallback;
90370             convListener.filter = filter || null;
90371             _convListeners[watchId] = convListener;
90372             return watchId;
90373         },
90374
90375         addFoldersChangeListener: function (callback, filter) {
90376             var watchId, folderListener = {};
90377
90378             if (_security_check.read === false) {
90379                 throw (new WebAPIException(errorcode.SECURITY_ERR));
90380             }
90381             if (!(new TypeCoerce(t.MessageFoldersChangeCallback)).match(callback)) {
90382                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
90383             }
90384             if (filter && !(new TypeCoerce(t.AbstractFilter)).match(filter)) {
90385                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
90386             }
90387
90388             watchId = Number(Math.uuid(8, 10));
90389             folderListener.callback = callback;
90390             folderListener.filter = filter || null;
90391             _folderListeners[watchId] = folderListener;
90392             return watchId;
90393         },
90394
90395         removeChangeListener: function (watchid) {
90396             if (_security_check.read === false) {
90397                 throw (new WebAPIException(errorcode.SECURITY_ERR));
90398             }
90399             if (_msgListeners[watchid] !== undefined) {
90400                 delete _msgListeners[watchid];
90401                 return;
90402             }
90403             if (_convListeners[watchid] !== undefined) {
90404                 delete _convListeners[watchid];
90405                 return;
90406             }
90407             if (_folderListeners[watchid] !== undefined) {
90408                 delete _folderListeners[watchid];
90409                 return;
90410             }
90411         }
90412
90413     };
90414     return message_storage;
90415 };
90416
90417 module.exports = _self;
90418
90419 });
90420 define('ripple/platform/tizen/2.0/datacontrol', function (require, exports, module) {
90421 /*
90422  *  Copyright 2013 Intel Corporation
90423  *
90424  * Licensed under the Apache License, Version 2.0 (the "License");
90425  * you may not use this file except in compliance with the License.
90426  * You may obtain a copy of the License at
90427  *
90428  * http://www.apache.org/licenses/LICENSE-2.0
90429  *
90430  * Unless required by applicable law or agreed to in writing, software
90431  * distributed under the License is distributed on an "AS IS" BASIS,
90432  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
90433  * See the License for the specific language governing permissions and
90434  * limitations under the License.
90435  */
90436
90437 var db = require('ripple/db'),
90438     utils = require('ripple/utils'),
90439     t = require('ripple/platform/tizen/2.0/typecast'),
90440     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
90441     WebAPIError = require('ripple/platform/tizen/2.0/WebAPIError'),
90442     WebAPIException = require('ripple/platform/tizen/2.0/WebAPIException'),
90443     DataControlConsumerFactory,
90444     DataControlConsumerObject,
90445     SQLDataControlConsumer,
90446     MappedDataControlConsumer,
90447     SQLData,
90448     MappedData,
90449     _data = {
90450         DB_DATACONTROL_KEY: "tizen1-db-datacontrol",
90451         IDS_PROVIDER:       ["http://tizen.org/datacontrol/provider/DictionaryDataControlProvider"],
90452         IDS_DATA:           ["Dictionary"],
90453         PERSIST_DELAY:      1000,
90454         SQL:                null,
90455         MAP:                null,
90456         dbStorage:          null
90457     },
90458     _security = {
90459         "http://tizen.org/privilege/datacontrol.consumer":
90460             ["getDataControlConsumer", "insert", "update", "remove", "select",
90461             "addValue", "removeValue", "getValue", "updateValue"]
90462     },
90463     _self;
90464
90465 function _get() {
90466     _data.dbStorage = db.retrieveObject(_data.DB_DATACONTROL_KEY) || {};
90467 }
90468
90469 function _save() {
90470     db.saveObject(_data.DB_DATACONTROL_KEY, _data.dbStorage);
90471 }
90472
90473 function _load(type) {
90474     if (!_data.dbStorage[type])
90475         return;
90476
90477     _data[type] = {};
90478
90479     utils.forEach(_data.dbStorage[type], function (provider, id) {
90480         var dataId;
90481
90482         _data[type][id] = {};
90483
90484         for (dataId in provider) {
90485             _data[type][id][dataId] = new DataControlConsumerFactory(type,
90486                     id, dataId, provider[dataId]);
90487         }
90488     });
90489 }
90490
90491 function _initialize() {
90492     _get();
90493
90494     _load("SQL");
90495     _load("MAP");
90496 }
90497
90498 _self = function () {
90499     var datacontrol;
90500
90501     // private
90502     function initConsumer(type) {
90503         var providers;
90504
90505         _data.dbStorage[type] = {};
90506         providers = _data.dbStorage[type];
90507
90508         _data.IDS_PROVIDER.forEach(function (id) {
90509             providers[id] = {};
90510
90511             _data.IDS_DATA.forEach(function (dataId) {
90512                 providers[id][dataId] = {};
90513             });
90514         });
90515
90516         _load(type);
90517     }
90518
90519     // public
90520     function getDataControlConsumer(providerId, dataId, type) {
90521         if (!_security.getDataControlConsumer) {
90522             throw new WebAPIException(errorcode.SECURITY_ERR);
90523         }
90524
90525         t.DataControlManager("getDataControlConsumer", arguments);
90526
90527         if (_data[type] === null) {
90528             initConsumer(type);
90529         }
90530         if (!_data[type][providerId] || !_data[type][providerId][dataId]) {
90531             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
90532         }
90533
90534         return _data[type][providerId][dataId];
90535     }
90536
90537     function handleSubFeatures(subFeatures) {
90538         var i, subFeature;
90539
90540         for (subFeature in subFeatures) {
90541             for (i in _security[subFeature]) {
90542                 _security[_security[subFeature][i]] = true;
90543             }
90544         }
90545     }
90546
90547     datacontrol = {
90548         getDataControlConsumer: getDataControlConsumer,
90549         handleSubFeatures:      handleSubFeatures
90550     };
90551
90552     return datacontrol;
90553 };
90554
90555 DataControlConsumerObject = function (type, providerId, dataId) {
90556     this.__defineGetter__("type", function () {
90557         return type;
90558     });
90559
90560     this.__defineGetter__("providerId", function () {
90561         return providerId;
90562     });
90563
90564     this.__defineGetter__("dataId", function () {
90565         return dataId;
90566     });
90567 };
90568
90569 SQLDataControlConsumer = function (providerId, dataId, dc) {
90570     var self, privateData = new SQLData(dc);
90571
90572     // public
90573     function insert(reqId, insertionData, successCallback, errorCallback) {
90574         if (!_security.insert) {
90575             throw new WebAPIException(errorcode.SECURITY_ERR);
90576         }
90577
90578         t.SQLDataControlConsumer("insert", arguments, true);
90579
90580         privateData.insert(insertionData, function (rowId) {
90581             if (successCallback) {
90582                 successCallback(reqId, rowId);
90583             }
90584         }, function (error) {
90585             if (errorCallback) {
90586                 errorCallback(reqId, error);
90587             }
90588         });
90589     }
90590
90591     function update(reqId, updateData, where, successCallback, errorCallback) {
90592         if (!_security.update) {
90593             throw new WebAPIException(errorcode.SECURITY_ERR);
90594         }
90595
90596         t.SQLDataControlConsumer("update", arguments, true);
90597
90598         privateData.update(updateData, where, function () {
90599             if (successCallback) {
90600                 successCallback(reqId);
90601             }
90602         }, function (error) {
90603             if (errorCallback) {
90604                 errorCallback(reqId, error);
90605             }
90606         });
90607     }
90608
90609     function remove(reqId, where, successCallback, errorCallback) {
90610         if (!_security.remove) {
90611             throw new WebAPIException(errorcode.SECURITY_ERR);
90612         }
90613
90614         t.SQLDataControlConsumer("remove", arguments, true);
90615
90616         privateData.remove(where, function () {
90617             if (successCallback) {
90618                 successCallback(reqId);
90619             }
90620         }, function (error) {
90621             if (errorCallback) {
90622                 errorCallback(reqId, error);
90623             }
90624         });
90625     }
90626
90627     function select(reqId, columns, where, successCallback, errorCallback, page,
90628             maxNumberPerPage) {
90629         if (!_security.select) {
90630             throw new WebAPIException(errorcode.SECURITY_ERR);
90631         }
90632
90633         t.SQLDataControlConsumer("select", arguments, true);
90634
90635         privateData.select(columns, where, function (rows) {
90636             successCallback(rows, reqId);
90637         }, function (error) {
90638             if (errorCallback) {
90639                 errorCallback(reqId, error);
90640             }
90641         }, page, maxNumberPerPage);
90642     }
90643
90644     self = new DataControlConsumerObject("SQL", providerId, dataId);
90645
90646     self.insert = insert;
90647     self.update = update;
90648     self.remove = remove;
90649     self.select = select;
90650
90651     return self;
90652 };
90653
90654 MappedDataControlConsumer = function (providerId, dataId, dc) {
90655     var self, privateData = new MappedData(dc);
90656
90657     function addValue(reqId, key, value, successCallback, errorCallback) {
90658         if (!_security.addValue) {
90659             throw new WebAPIException(errorcode.SECURITY_ERR);
90660         }
90661
90662         t.MappedDataControlConsumer("addValue", arguments);
90663
90664         window.setTimeout(function () {
90665             if (privateData.insert(key, value)) {
90666                 if (successCallback) {
90667                     successCallback(reqId);
90668                 }
90669             } else if (errorCallback) {
90670                 errorCallback(reqId, new WebAPIError(errorcode.UNKNOWN_ERR));
90671             }
90672         }, 1);
90673     }
90674
90675     function removeValue(reqId, key, value, successCallback, errorCallback) {
90676         if (!_security.removeValue) {
90677             throw new WebAPIException(errorcode.SECURITY_ERR);
90678         }
90679
90680         t.MappedDataControlConsumer("removeValue", arguments);
90681
90682         window.setTimeout(function () {
90683             if (privateData.remove(key, value)) {
90684                 successCallback(reqId);
90685             } else if (errorCallback) {
90686                 errorCallback(reqId, new WebAPIError(errorcode.NOT_FOUND_ERR));
90687             }
90688         }, 1);
90689     }
90690
90691     function getValue(reqId, key, successCallback, errorCallback) {
90692         if (!_security.getValue) {
90693             throw new WebAPIException(errorcode.SECURITY_ERR);
90694         }
90695
90696         t.MappedDataControlConsumer("getValue", arguments);
90697
90698         window.setTimeout(function () {
90699             var values;
90700
90701             values = privateData.search(key);
90702
90703             if (values !== null) {
90704                 successCallback(values, reqId);
90705             } else if (errorCallback) {
90706                 errorCallback(reqId, new WebAPIError(errorcode.NOT_FOUND_ERR));
90707             }
90708         }, 1);
90709     }
90710
90711     function updateValue(reqId, key, oldValue, newValue, successCallback,
90712             errorCallback) {
90713         if (!_security.updateValue) {
90714             throw new WebAPIException(errorcode.SECURITY_ERR);
90715         }
90716
90717         t.MappedDataControlConsumer("updateValue", arguments);
90718
90719         window.setTimeout(function () {
90720             if (privateData.update(key, oldValue, newValue)) {
90721                 successCallback(reqId);
90722             } else if (errorCallback) {
90723                 errorCallback(reqId, new WebAPIError(errorcode.NOT_FOUND_ERR));
90724             }
90725         }, 1);
90726     }
90727
90728     self = new DataControlConsumerObject("MAP", providerId, dataId);
90729
90730     self.addValue    = addValue;
90731     self.removeValue = removeValue;
90732     self.getValue    = getValue;
90733     self.updateValue = updateValue;
90734
90735     return self;
90736 };
90737
90738 DataControlConsumerFactory = function (type, providerId, dataId, dc) {
90739     var self;
90740
90741     switch (type) {
90742     case "SQL":
90743         self = new SQLDataControlConsumer(providerId, dataId, dc);
90744         break;
90745
90746     case "MAP":
90747         self = new MappedDataControlConsumer(providerId, dataId, dc);
90748         break;
90749     }
90750
90751     return self;
90752 };
90753
90754 SQLData = function (dc) {
90755     var self, data, columnNames, SQLErr2WebAPIErr;
90756
90757     // private
90758     function getDBTableName() {
90759         return "DC_" + Math.uuid(8, 16);
90760     }
90761
90762     function getColumnNames(tx, results) {
90763         columnNames = results.rows.item(0).sql
90764                 .replace(/^[^\(]+\(([^\)]+)\)/g, "$1")
90765                 .replace(/(^|(,) )([^ ,]+)([^,]*|$)/g, "$2$3")
90766                 .split(",");
90767     }
90768
90769     function queryColumns(columns) {
90770         return columns.join("=?,") + "=?";
90771     }
90772
90773     function queryValues(n) {
90774         return (new Array(n)).join("?,") + "?";
90775     }
90776
90777     function shedQuotes(values) {
90778         return values.every(function (value, i, arr) {
90779             arr[i] = value.replace(/^('|")(.*)\1$/g, "$2");
90780
90781             return (arr[i] !== value);
90782         });
90783     }
90784
90785     function isNull(p) {
90786         return ((p === undefined) || (p === null));
90787     }
90788
90789     function initialize() {
90790         SQLErr2WebAPIErr = [
90791             0,      // 0: UNKNOWN_ERR         0: UNKNOWN_ERR
90792             100,    // 1: DATABASE_ERR      100: IO_ERR
90793             100,    // 2: VERSION_ERR       100: IO_ERR
90794             100,    // 3: TOO_LARGE_ERR     100: IO_ERR
90795             22,     // 4: QUOTA_ERR          22: QUOTA_EXCEEDED_ERR
90796             12,     // 5: SYNTAX_ERR         12: SYNTAX_ERR
90797             100,    // 6: CONSTRAINT_ERR    100: IO_ERR
90798             23      // 7: TIMEOUT_ERR        23: TIMEOUT_ERR
90799         ];
90800
90801         if (!("table" in dc)) {
90802             dc.table = getDBTableName();
90803             columnNames = ["id"];
90804             _save();
90805         }
90806
90807         data = openDatabase('tinyHippos', '1.0', 'tiny Hippos persistence',
90808                 2 * 1024 * 1024);
90809
90810         data.transaction(function (tx) {
90811             tx.executeSql('CREATE TABLE IF NOT EXISTS ' + dc.table +
90812                     ' (id unique)');
90813             tx.executeSql('SELECT sql FROM sqlite_master WHERE type="table" AND name=?',
90814                     [dc.table], getColumnNames);
90815         });
90816     }
90817
90818     // public
90819     function insert(rowData, onSuccess, onError) {
90820         if (rowData.columns.length > rowData.values.length) {
90821             throw new WebAPIException(errorcode.INVALID_VALUES_ERR);
90822         }
90823         if (!shedQuotes(rowData.values)) {
90824             throw new WebAPIException(errorcode.INVALID_VALUES_ERR);
90825         }
90826
90827         data.transaction(function (tx) {
90828             rowData.columns.forEach(function (column) {
90829                 if (columnNames.indexOf(column) !== -1)
90830                     return;
90831
90832                 tx.executeSql('ALTER TABLE ' + dc.table + ' ADD ' + column +
90833                         ' TEXT', [], function () {
90834                             columnNames.push(column);
90835                         }, function (tx, error) {
90836                             onError(new WebAPIError(
90837                                     SQLErr2WebAPIErr[error.code],
90838                                     error.message));
90839                         });
90840             });
90841
90842             tx.executeSql('INSERT INTO ' + dc.table + ' (' +
90843                     rowData.columns.join() + ') VALUES (' +
90844                     queryValues(rowData.values.length) + ')', rowData.values,
90845                     function (tx, results) {
90846                         onSuccess(results.insertId);
90847                     }, function (tx, error) {
90848                         onError(new WebAPIError(SQLErr2WebAPIErr[error.code],
90849                                 error.message));
90850                     });
90851         });
90852     }
90853
90854     function update(rowData, where, onSuccess, onError) {
90855         if (rowData.columns.length > rowData.values.length) {
90856             throw new WebAPIException(errorcode.INVALID_VALUES_ERR);
90857         }
90858         if (!shedQuotes(rowData.values)) {
90859             throw new WebAPIException(errorcode.INVALID_VALUES_ERR);
90860         }
90861
90862         data.transaction(function (tx) {
90863             tx.executeSql('UPDATE ' + dc.table + ' SET ' +
90864                     queryColumns(rowData.columns) + ' WHERE ' + where,
90865                     rowData.values, onSuccess, function (tx, error) {
90866                         onError(new WebAPIError(SQLErr2WebAPIErr[error.code],
90867                                 error.message));
90868                     });
90869         });
90870     }
90871
90872     function remove(where, onSuccess, onError) {
90873         data.transaction(function (tx) {
90874             tx.executeSql('DELETE FROM ' + dc.table + ' WHERE ' + where, [],
90875                     onSuccess, function (tx, error) {
90876                         onError(new WebAPIError(SQLErr2WebAPIErr[error.code],
90877                                 error.message));
90878                     });
90879         });
90880     }
90881
90882     function select(columns, where, onSuccess, onError, page, maxNumberPerPage) {
90883         if (isNull(page)) {
90884             page = 1;
90885         } else {
90886             if (page <= 0) {
90887                 throw new WebAPIException(errorcode.INVALID_VALUES_ERR);
90888             }
90889             page = parseInt(page, 10);
90890         }
90891
90892         if (isNull(maxNumberPerPage)) {
90893             if (page > 1) {
90894                 throw new WebAPIException(errorcode.INVALID_VALUES_ERR);
90895             }
90896         } else {
90897             if (maxNumberPerPage <= 0) {
90898                 throw new WebAPIException(errorcode.INVALID_VALUES_ERR);
90899             }
90900             maxNumberPerPage = parseInt(maxNumberPerPage, 10);
90901         }
90902
90903         data.transaction(function (tx) {
90904             tx.executeSql('SELECT ' + columns.join() + ' FROM ' + dc.table +
90905                     ' WHERE ' + where, [], function (tx, results) {
90906                         var rows = [], rowStart, rowData, r, c;
90907
90908                         rowStart = maxNumberPerPage ?
90909                             (page - 1) * maxNumberPerPage : 0;
90910
90911                         for (r = rowStart; r < results.rows.length; ++r) {
90912                             rowData = {
90913                                 columns: columns,
90914                                 values: []
90915                             };
90916                             for (c in columns) {
90917                                 rowData.values.push(results.rows
90918                                     .item(r)[columns[c]]);
90919                             }
90920                             rows.push(rowData);
90921
90922                             if (maxNumberPerPage && (--maxNumberPerPage === 0))
90923                                 break;
90924                         }
90925
90926                         onSuccess(rows);
90927                     }, function (tx, error) {
90928                         onError(new WebAPIError(SQLErr2WebAPIErr[error.code],
90929                                 error.message));
90930                     });
90931         });
90932     }
90933
90934     initialize();
90935
90936     self = {
90937         insert: insert,
90938         update: update,
90939         remove: remove,
90940         select: select
90941     };
90942
90943     return self;
90944 };
90945
90946 MappedData = function (dc) {
90947     var self, data = {}, ioStamp = 0;
90948
90949     // private
90950     function addNode(tree, arr, i) {
90951         var key, value;
90952
90953         if (typeof arr[i] === "string") {
90954             key = arr[i];
90955             value = 1;
90956         } else {
90957             key = arr[i][0];
90958             value = arr[i][1];
90959         }
90960         tree.insert(key, value);
90961     }
90962
90963     function bisearch(tree, arr, queue) {
90964         var start, end, mid;
90965
90966         if (queue.length === 0)
90967             return;
90968
90969         start = queue.shift();
90970         end = queue.shift();
90971
90972         if (start > end)
90973             return;
90974
90975         mid = start + parseInt((end - start) / 2, 10);
90976         addNode(tree, arr, mid);
90977         queue.push(start, mid - 1);
90978         queue.push(mid + 1, end);
90979     }
90980
90981     function build(arr) {
90982         var tree, mid, lTree = [], rTree = [];
90983
90984         tree = redblack.tree();
90985         mid = parseInt(arr.length / 2, 10);
90986         addNode(tree, arr, mid);
90987
90988         lTree.push(0, mid - 1);
90989         rTree.push(mid + 1, arr.length - 1);
90990
90991         while ((lTree.length > 0) || (rTree.length > 0)) {
90992             bisearch(tree, arr, lTree);
90993             bisearch(tree, arr, rTree);
90994         }
90995
90996         return tree;
90997     }
90998
90999     function initialize() {
91000         for (var key in dc) {
91001             data[key] = build(dc[key]);
91002         }
91003     }
91004
91005     function traverse(tree, key) {
91006         dc[key] = [];
91007         tree.forEach(function (count, value) {
91008             dc[key].push((count === 1) ? value : [value, count]);
91009         });
91010     }
91011
91012     function persist() {
91013         if (ioStamp !== 0) {
91014             window.clearTimeout(ioStamp);
91015         }
91016         ioStamp = window.setTimeout(function () {
91017             var key;
91018
91019             for (key in data) {
91020                 traverse(data[key], key);
91021             }
91022
91023             _save();
91024
91025             ioStamp = 0;
91026         }, _data.PERSIST_DELAY);
91027     }
91028
91029     // public
91030     function insert(key, value) {
91031         var tree, count;
91032
91033         if (!(key in data)) {
91034             data[key] = redblack.tree();
91035         }
91036
91037         tree = data[key];
91038
91039         if (!tree)
91040             return false;
91041
91042         count = tree.get(value);
91043         tree.insert(value, count ? (count + 1) : 1);
91044         persist();
91045
91046         return true;
91047     }
91048
91049     function remove(key, value) {
91050         var tree, count;
91051
91052         if (!(key in data))
91053             return false;
91054
91055         tree = data[key];
91056         count = tree.get(value);
91057         if (count === null)
91058             return false;
91059
91060         tree.delete(value);
91061
91062         if (tree.root === null) {
91063             delete data[key];
91064             if (key in dc) {
91065                 delete dc[key];
91066             }
91067         }
91068
91069         persist();
91070
91071         return true;
91072     }
91073
91074     function search(key) {
91075         var values = [], tree;
91076
91077         if (!(key in data))
91078             return null;
91079
91080         tree = data[key];
91081         tree.forEach(function (count, value) {
91082             while (count--) {
91083                 values.push(value);
91084             }
91085         });
91086
91087         return values;
91088     }
91089
91090     function update(key, oldValue, newValue) {
91091         var tree, count, countNew;
91092
91093         if (!(key in data))
91094             return false;
91095
91096         tree = data[key];
91097         count = tree.get(oldValue);
91098         if (count === null)
91099             return false;
91100
91101         countNew = tree.get(newValue);
91102         count += (countNew === null) ? 0 : countNew;
91103         tree.delete(oldValue);
91104         tree.insert(newValue, count);
91105         persist();
91106
91107         return true;
91108     }
91109
91110     initialize();
91111
91112     self = {
91113         insert: insert,
91114         remove: remove,
91115         search: search,
91116         update: update
91117     };
91118
91119     return self;
91120 };
91121
91122 _initialize();
91123
91124 module.exports = _self;
91125
91126 });
91127 define('ripple/platform/tizen/2.0/CalendarAlarm', function (require, exports, module) {
91128 /*
91129  *  Copyright 2013 Intel Corporation.
91130  *
91131  * Licensed under the Apache License, Version 2.0 (the "License");
91132  * you may not use this file except in compliance with the License.
91133  * You may obtain a copy of the License at
91134  *
91135  * http://www.apache.org/licenses/LICENSE-2.0
91136  *
91137  * Unless required by applicable law or agreed to in writing, software
91138  * distributed under the License is distributed on an "AS IS" BASIS,
91139  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
91140  * See the License for the specific language governing permissions and
91141  * limitations under the License.
91142  */
91143
91144 var t = require('ripple/platform/tizen/2.0/typecast'),
91145     CalendarAlarm;
91146
91147 CalendarAlarm = function () {
91148     var voc, calendarAlarm = {};
91149
91150     // private
91151     function construct() {
91152         this.__defineGetter__("absoluteDate", function () {
91153             return calendarAlarm.absoluteDate;
91154         });
91155         this.__defineSetter__("absoluteDate", function (val) {
91156             try {
91157                 calendarAlarm.absoluteDate = t.TZDate(val, "?");
91158             } catch (e) {
91159             }
91160         });
91161
91162         this.__defineGetter__("before", function () {
91163             return calendarAlarm.before;
91164         });
91165         this.__defineSetter__("before", function (val) {
91166             try {
91167                 calendarAlarm.before = t.TimeDuration(val, "?");
91168             } catch (e) {
91169             }
91170         });
91171
91172         this.__defineGetter__("method", function () {
91173             return calendarAlarm.method;
91174         });
91175         this.__defineSetter__("method", function (val) {
91176             try {
91177                 calendarAlarm.method = t.AlarmMethod(val);
91178             } catch (e) {
91179             }
91180         });
91181
91182         this.__defineGetter__("description", function () {
91183             return calendarAlarm.description;
91184         });
91185         this.__defineSetter__("description", function (val) {
91186             try {
91187                 calendarAlarm.description = t.DOMString(val, "?");
91188             } catch (e) {
91189             }
91190         });
91191     }
91192
91193     // Constructor
91194     function CalendarAlarm_TZDate_AlarmMethod_DOMString(absoluteDate, method,
91195             description) {
91196         construct.call(this);
91197
91198         calendarAlarm.absoluteDate = absoluteDate;
91199         calendarAlarm.before       = null;
91200         calendarAlarm.method       = method;
91201         calendarAlarm.description  = description || "";
91202     }
91203
91204     function CalendarAlarm_TimeDuration_AlarmMethod_DOMString(before, method,
91205             description) {
91206         construct.call(this);
91207
91208         calendarAlarm.absoluteDate = null;
91209         calendarAlarm.before       = before;
91210         calendarAlarm.method       = method;
91211         calendarAlarm.description  = description || "";
91212     }
91213
91214     voc = [CalendarAlarm_TZDate_AlarmMethod_DOMString,
91215            CalendarAlarm_TimeDuration_AlarmMethod_DOMString];
91216     t.CalendarAlarm(arguments, this, voc);
91217 };
91218
91219 module.exports = CalendarAlarm;
91220
91221 });
91222 define('ripple/platform/tizen/2.0/TZDate', function (require, exports, module) {
91223 /*
91224  *  Copyright 2012 Intel Corporation.
91225  *
91226  * Licensed under the Apache License, Version 2.0 (the "License");
91227  * you may not use this file except in compliance with the License.
91228  * You may obtain a copy of the License at
91229  *
91230  * http://www.apache.org/licenses/LICENSE-2.0
91231  *
91232  * Unless required by applicable law or agreed to in writing, software
91233  * distributed under the License is distributed on an "AS IS" BASIS,
91234  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
91235  * See the License for the specific language governing permissions and
91236  * limitations under the License.
91237  */
91238
91239 var errorcode = require('ripple/platform/tizen/2.0/errorcode'),
91240     WebAPIException = require('ripple/platform/tizen/2.0/WebAPIException'),
91241     tz = require('ripple/platform/tizen/2.0/timezone_info'),
91242     tizen1_utils = require('ripple/platform/tizen/2.0/tizen1_utils'),
91243     _Month = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
91244     _Day = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
91245
91246 function TZDate (dt) {
91247     var d, UTCd, UTC_diff, tzid = "", target_diff, temp_date, localeTime_fmt = 'h:m:s', localeDate_fmt = 'D, d M y',
91248     time = require('ripple/platform/tizen/2.0/time'),
91249         hour = arguments[3] || 0, min = arguments[4] || 0,
91250         sec = arguments[5] || 0, msec = arguments[6] || 0,
91251
91252     _checkTZDate = function (dat) {
91253         var Tzdate = require('ripple/platform/tizen/2.0/TZDate'),
91254             i, tzd;
91255         if (typeof dat !== 'object' || dat === undefined || dat === null) {
91256             return false;
91257         }
91258         tzd = new Tzdate();
91259         for (i in tzd) {
91260             if (dat.hasOwnProperty(i) === false) {
91261                 return false;
91262             }
91263         }
91264         return true;
91265     },
91266     _d2UTCd_sync = function () {
91267         UTCd = new Date(d.valueOf() - (UTC_diff * 1000 * 60 * 60));
91268     },
91269     _UTCd2d_sync = function () {
91270         d = new Date(UTCd.valueOf() + (UTC_diff * 1000 * 60 * 60));
91271     },
91272     _getValue = function (o) {
91273         var other;
91274         other = new Date(o.getUTCFullYear(), o.getUTCMonth(), o.getUTCDate(),
91275                     o.getUTCHours(), o.getUTCMinutes(), o.getUTCSeconds(), o.getUTCMilliseconds());
91276         return other.valueOf();
91277     },
91278     _formatDateString = function (fmt) {
91279         var i, ret = '';
91280         for (i = 0; i < fmt.length; i++) {
91281             switch (fmt.charAt(i)) {
91282             case 'd':
91283                 ret = ret + d.getDate();
91284                 break;
91285             case 'y':
91286                 ret = ret + d.getFullYear();
91287                 break;
91288             case 'm':
91289                 ret = ret + (d.getMonth() + 1);
91290                 break;
91291             case 'M':
91292                 ret = ret + _Month[d.getMonth()];
91293                 break;
91294             case 'D':
91295                 ret = ret + _Day[d.getDay()];
91296                 break;
91297             default:
91298                 ret = ret + fmt.charAt(i);
91299             }
91300         }
91301         return ret;
91302     },
91303     _formatTimeString = function (fmt) {
91304         var i, hh, mm, ss, AP, ret = "";
91305         if (fmt.search(/ap/) === -1) {
91306             AP = false;
91307         } else {
91308             AP = true;
91309             if (d.getHours() > 11) {
91310                 fmt = fmt.replace("ap", "PM");
91311             } else {
91312                 fmt = fmt.replace("ap", "AM");
91313             }
91314         }
91315         for (i = 0; i < fmt.length; i++) {
91316             switch (fmt.charAt(i)) {
91317             case 'h':
91318                 hh = d.getHours();
91319                 if (AP) {
91320                     hh = (hh > 12) ? hh - 12 : hh;
91321                 }
91322                 ret = ret + hh;
91323                 break;
91324             case 'm':
91325                 mm = d.getMinutes();
91326                 mm = (mm < 10 ? "0" : "") + mm;
91327                 ret = ret + mm;
91328                 break;
91329             case 's':
91330                 ss = d.getSeconds();
91331                 ss = (ss < 10 ? "0" : "") + ss;
91332                 ret = ret + ss;
91333                 break;
91334             default:
91335                 ret = ret + fmt.charAt(i);
91336             }
91337         }
91338         return ret;
91339     };
91340
91341     if (arguments[7] !== undefined) {
91342         tzid = arguments[7];
91343     }
91344
91345     if (dt === null || dt === undefined) {
91346         temp_date = new Date();
91347         if (arguments[1] !== undefined) {
91348             if (typeof arguments[1] !== 'string') {
91349                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
91350             }
91351             if (tz.isValidTimezone(arguments[1]) === false) {
91352                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
91353             }
91354             tzid = arguments[1];
91355         } else {
91356             tzid = time.getLocalTimezone();
91357         }
91358         target_diff = tz.getTimezoneDiff(tzid);
91359         d = new Date(temp_date.valueOf() + (target_diff + temp_date.getTimezoneOffset() / 60) * 1000 * 60 * 60);
91360     } else {
91361         if (tizen1_utils.isValidDate(dt)) {
91362             d = new Date(dt);
91363             if (arguments[1] !== undefined) {
91364                 tzid = arguments[1];
91365             } else {
91366                 tzid = time.getLocalTimezone();
91367             }
91368         } else {
91369             if (arguments.length === 1) {
91370                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
91371             } else {
91372                 d = new Date(arguments[0], arguments[1], arguments[2], hour, min, sec, msec);
91373             }
91374         }
91375     }
91376
91377     if (tz.isValidTimezone(tzid) === false) {
91378         tzid = 'UTC';
91379     }
91380     UTC_diff = tz.getTimezoneDiff(tzid);
91381     _d2UTCd_sync();
91382
91383     this.getDate = function () {
91384         return d.getDate();
91385     };
91386     this.setDate = function (dt) {
91387         d.setDate(dt);
91388         _d2UTCd_sync();
91389     };
91390     this.getDay = function () {
91391         return d.getDay();
91392     };
91393     this.getFullYear = function () {
91394         return d.getFullYear();
91395     };
91396     this.setFullYear = function (yr) {
91397         d.setFullYear(yr);
91398         _d2UTCd_sync();
91399     };
91400     this.getHours = function () {
91401         return d.getHours();
91402     };
91403     this.setHours = function (hr) {
91404         d.setHours(hr);
91405         _d2UTCd_sync();
91406     };
91407     this.getMilliseconds = function () {
91408         return d.getMilliseconds();
91409     };
91410     this.setMilliseconds = function (msec) {
91411         d.setMilliseconds(msec);
91412         _d2UTCd_sync();
91413     };
91414     this.getMinutes = function () {
91415         return d.getMinutes();
91416     };
91417     this.setMinutes = function (min) {
91418         d.setMinutes(min);
91419         _d2UTCd_sync();
91420     };
91421     this.getMonth = function () {
91422         return d.getMonth();
91423     };
91424     this.setMonth = function (m) {
91425         d.setMonth(m);
91426         _d2UTCd_sync();
91427     };
91428     this.getSeconds = function () {
91429         return d.getSeconds();
91430     };
91431     this.setSeconds = function (s) {
91432         d.setSeconds(s);
91433         _d2UTCd_sync();
91434     };
91435     this.getUTCDate = function () {
91436         return UTCd.getDate();
91437     };
91438     this.setUTCDate = function (dt) {
91439         UTCd.setDate(dt);
91440         _UTCd2d_sync();
91441     };
91442     this.getUTCDay = function () {
91443         return UTCd.getDay();
91444     };
91445     this.getUTCFullYear = function () {
91446         return UTCd.getFullYear();
91447     };
91448     this.setUTCFullYear = function (yr) {
91449         UTCd.setFullYear(yr);
91450         _UTCd2d_sync();
91451     };
91452     this.getUTCHours = function () {
91453         return UTCd.getHours();
91454     };
91455     this.setUTCHours = function (hr) {
91456         UTCd.setHours(hr);
91457         _UTCd2d_sync();
91458     };
91459     this.getUTCMilliseconds = function () {
91460         return UTCd.getMilliseconds();
91461     };
91462     this.setUTCMilliseconds = function (msec) {
91463         UTCd.setMilliseconds(msec);
91464         _UTCd2d_sync();
91465     };
91466     this.getUTCMinutes = function () {
91467         return UTCd.getMinutes();
91468     };
91469     this.setUTCMinutes = function (min) {
91470         UTCd.setMinutes(min);
91471         _UTCd2d_sync();
91472     };
91473     this.getUTCMonth = function () {
91474         return UTCd.getMonth();
91475     };
91476     this.setUTCMonth = function (m) {
91477         UTCd.setMonth(m);
91478         _UTCd2d_sync();
91479     };
91480     this.getUTCSeconds = function () {
91481         return UTCd.getSeconds();
91482     };
91483     this.setUTCSeconds = function (s) {
91484         UTCd.setSeconds(s);
91485         _UTCd2d_sync();
91486     };
91487     this.getTimezone = function () {
91488         return tzid;
91489     };
91490     this.toTimezone = function (new_tzid) {
91491         var diff,
91492             Tzdate = require('ripple/platform/tizen/2.0/TZDate');
91493         if (tz.isValidTimezone(String(new_tzid)) === true) {
91494             diff = tz.getTimezoneDiff(new_tzid) - UTC_diff;
91495             return new Tzdate(new Date(d.valueOf() + (diff * 1000 * 60 * 60)), new_tzid);
91496         } else {
91497             throw new WebAPIException(errorcode.INVALID_VALUES_ERR);
91498         }
91499     };
91500     this.toLocalTimezone = function () {
91501         var diff,
91502             localTzid,
91503             Tzdate = require('ripple/platform/tizen/2.0/TZDate');
91504         localTzid = time.getLocalTimezone();
91505
91506         diff = tz.getTimezoneDiff(localTzid) - UTC_diff;
91507         return new Tzdate(new Date(d.valueOf() + (diff * 1000 * 60 * 60)), localTzid);
91508     };
91509     this.toUTC = function () {
91510         var Tzdate = require('ripple/platform/tizen/2.0/TZDate');
91511         return new Tzdate(UTCd, "UTC");
91512     };
91513     this.difference = function (other) {
91514         var diff,
91515             TDur = require('ripple/platform/tizen/2.0/TimeDuration');
91516         if (_checkTZDate(other) === false) {
91517             throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
91518         }
91519         diff = (UTCd.valueOf() - _getValue(other));
91520         if (diff % 86400000 === 0) {
91521             return new TDur(diff/86400000, 'DAYS');
91522         } else {
91523             return new TDur(diff);
91524         }
91525     };
91526     this.equalsTo = function (other) {
91527         if (_checkTZDate(other) === false) {
91528             throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
91529         }
91530         return (UTCd.valueOf() === _getValue(other));
91531     };
91532     this.earlierThan = function (other) {
91533         if (_checkTZDate(other) === false) {
91534             throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
91535         }
91536         return (UTCd.valueOf() < _getValue(other));
91537     };
91538     this.laterThan = function (other) {
91539         if (_checkTZDate(other) === false) {
91540             throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
91541         }
91542         return (UTCd.valueOf() > _getValue(other));
91543     };
91544     this.addDuration = function (dur) {
91545         var Tzdate = require('ripple/platform/tizen/2.0/TZDate'),
91546             Tunit = {"MSECS": 1,
91547                 "SECS": 1000,
91548                 "MINS": 60 * 1000,
91549                 "HOURS": 60 * 60 * 1000,
91550                 "DAYS": 24 * 60 * 60 * 1000
91551             };
91552         if (typeof dur !== 'object' || dur === undefined || dur === null) {
91553             throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
91554         }
91555         if (dur.length === undefined || dur.length === null ||
91556                 dur.unit === undefined || dur.unit === null) {
91557             throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
91558         }
91559         if ((typeof dur.length) !== 'number') {
91560             throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
91561         }
91562         if (Tunit[dur.unit] === undefined) {
91563             throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
91564         }
91565         return new Tzdate(new Date(d.valueOf() + (parseInt(dur.length, 10) * Tunit[dur.unit])), tzid);
91566     };
91567     this.toLocaleDateString = function () {
91568         if (d.toString() === "Invalid Date") {
91569             return d.toString();
91570         } else {
91571             return _formatDateString(localeDate_fmt);
91572         }
91573     };
91574     this.toLocaleTimeString = function () {
91575         if (d.toString() === "Invalid Date") {
91576             return d.toString();
91577         } else {
91578             return _formatTimeString(localeTime_fmt);
91579         }
91580     };
91581     this.toLocaleString = function () {
91582         if (d.toString() === "Invalid Date") {
91583             return d.toString();
91584         } else {
91585             return (this.toLocaleDateString() + " " + this.toLocaleTimeString());
91586         }
91587     };
91588     this.toDateString = function () {
91589         var ret = "", fmt = time.getDateFormat();
91590         if (d.toString() === "Invalid Date") {
91591             return d.toString();
91592         }
91593         ret = _formatDateString(fmt);
91594         return ret;
91595     };
91596     this.toTimeString = function () {
91597         var ret, fmt = time.getTimeFormat();
91598
91599         if (d.toString() === "Invalid Date") {
91600             return d.toString();
91601         }
91602
91603         ret = _formatTimeString(fmt);
91604         if (tz.getTimezoneDesc(tzid) !== null) {
91605             return ret + " " + tz.getTimezoneDesc(tzid);
91606         } else {
91607             return ret + " " + tz.getTimezoneAbbr(tzid);
91608         }
91609         return ret;
91610     };
91611     this.toString = function () {
91612         if (d.toString() === "Invalid Date") {
91613             return d.toString();
91614         } else {
91615             return (this.toDateString() + " " + this.toTimeString());
91616         }
91617     };
91618     this.getTimezoneAbbreviation = function () {
91619         return tz.getTimezoneAbbr(tzid);
91620     };
91621     this.secondsFromUTC = function () {
91622         return (-1 * UTC_diff * 60 * 60);
91623     };
91624     this.isDST = function () {
91625         throw (new WebAPIException(errorcode.NOT_SUPPORTED_ERR));
91626     };
91627     this.getPreviousDSTTransition = function () {
91628         throw (new WebAPIException(errorcode.NOT_SUPPORTED_ERR));
91629     };
91630     this.getNextDSTTransition = function () {
91631         throw (new WebAPIException(errorcode.NOT_SUPPORTED_ERR));
91632     };
91633     return this;
91634 }
91635
91636 module.exports = TZDate;
91637
91638 });
91639 define('ripple/platform/tizen/2.0/NotificationBase', function (require, exports, module) {
91640 /*
91641  *  Copyright 2013 Intel Corporation.
91642  *
91643  * Licensed under the Apache License, Version 2.0 (the "License");
91644  * you may not use this file except in compliance with the License.
91645  * You may obtain a copy of the License at
91646  *
91647  * http://www.apache.org/licenses/LICENSE-2.0
91648  *
91649  * Unless required by applicable law or agreed to in writing, software
91650  * distributed under the License is distributed on an "AS IS" BASIS,
91651  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
91652  * See the License for the specific language governing permissions and
91653  * limitations under the License.
91654  */
91655
91656 var t = require('ripple/platform/tizen/2.0/typecast'),
91657     Notification;
91658
91659 Notification = function (title, content) {
91660     var notification = {};
91661
91662     notification.title = title;
91663     notification.content = content || null;
91664
91665     this.__defineGetter__("id", function () {
91666         return undefined;
91667     });
91668
91669     this.__defineGetter__("type", function () {
91670         return "STATUS";
91671     });
91672
91673     this.__defineGetter__("postedTime", function () {
91674         return undefined;
91675     });
91676
91677     this.__defineGetter__("title", function () {
91678         return notification.title;
91679     });
91680     this.__defineSetter__("title", function (val) {
91681         try {
91682             notification.title = t.DOMString(val);
91683         } catch (e) {
91684         }
91685     });
91686
91687     this.__defineGetter__("content", function () {
91688         return notification.content;
91689     });
91690     this.__defineSetter__("content", function (val) {
91691         try {
91692             notification.content = t.DOMString(val, "?");
91693         } catch (e) {
91694         }
91695     });
91696 };
91697
91698 module.exports = Notification;
91699
91700 });
91701 define('ripple/platform/tizen/2.0/spec', function (require, exports, module) {
91702 /*
91703  *  Copyright 2012 Intel Corporation.
91704  *
91705  * Licensed under the Apache License, Version 2.0 (the "License");
91706  * you may not use this file except in compliance with the License.
91707  * You may obtain a copy of the License at
91708  *
91709  * http://www.apache.org/licenses/LICENSE-2.0
91710  *
91711  * Unless required by applicable law or agreed to in writing, software
91712  * distributed under the License is distributed on an "AS IS" BASIS,
91713  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
91714  * See the License for the specific language governing permissions and
91715  * limitations under the License.
91716  */
91717
91718 module.exports = {
91719
91720     id: "tizen",
91721     version: "2.2",
91722     name: "TIZEN",
91723
91724     persistencePrefix: "tizen1-",
91725
91726     config: require('ripple/platform/tizen/2.0/spec/config'),
91727     ui: require('ripple/platform/tizen/2.0/spec/ui'),
91728     device: require('ripple/platform/tizen/2.0/spec/device'),
91729     sensor: require('ripple/platform/tizen/2.0/spec/sensor'),
91730     DeviceMotionEvent: require('ripple/platform/tizen/2.0/DeviceMotionEvent'),
91731     DeviceOrientationEvent: require('ripple/platform/tizen/2.0/DeviceOrientationEvent'),
91732
91733     objects: {
91734         Coordinates: {
91735             path: "w3c/1.0/Coordinates"
91736         },
91737         Position: {
91738             path: "w3c/1.0/Position"
91739         },
91740         PositionError: {
91741             path: "w3c/1.0/PositionError"
91742         },
91743         SensorConnection: {
91744             path: "w3c/1.0/SensorConnection"
91745         },
91746         navigator: {
91747             path: "tizen/2.0/navigator",
91748             children: {
91749                 geolocation: {
91750                     path: "wac/2.0/geolocation"
91751                 },
91752                 battery: {
91753                     path: "tizen/2.0/battery"
91754                 }
91755             }
91756         },
91757         tizen: {
91758             feature: "http://tizen.org/privilege/tizen",
91759             children: {
91760                 AlarmAbsolute: {
91761                     path: "tizen/2.0/AlarmAbsolute"
91762                 },
91763                 AlarmRelative: {
91764                     path: "tizen/2.0/AlarmRelative"
91765                 },
91766                 ApplicationControl: {
91767                     path: "tizen/2.0/ApplicationControl"
91768                 },
91769                 ApplicationControlData: {
91770                     path: "tizen/2.0/ApplicationControlData"
91771                 },
91772                 AttributeFilter: {
91773                     path: "tizen/2.0/AttributeFilter"
91774                 },
91775                 AttributeRangeFilter: {
91776                     path: "tizen/2.0/AttributeRangeFilter"
91777                 },
91778                 BookmarkFolder: {
91779                     path: "tizen/2.0/BookmarkFolder"
91780                 },
91781                 BookmarkItem: {
91782                     path: "tizen/2.0/BookmarkItem"
91783                 },
91784                 CalendarAlarm: {
91785                     path: "tizen/2.0/CalendarAlarm"
91786                 },
91787                 CalendarAttendee: {
91788                     path: "tizen/2.0/CalendarAttendee"
91789                 },
91790                 CalendarEvent: {
91791                     path: "tizen/2.0/CalendarEvent"
91792                 },
91793                 CalendarEventId: {
91794                     path: "tizen/2.0/CalendarEventId"
91795                 },
91796                 CalendarRecurrenceRule: {
91797                     path: "tizen/2.0/CalendarRecurrenceRule"
91798                 },
91799                 CalendarTask: {
91800                     path: "tizen/2.0/CalendarTask"
91801                 },
91802                 CompositeFilter: {
91803                     path: "tizen/2.0/CompositeFilter"
91804                 },
91805                 Contact: {
91806                     path: "tizen/2.0/ContactBase"
91807                 },
91808                 ContactAddress: {
91809                     path: "tizen/2.0/ContactAddress"
91810                 },
91811                 ContactAnniversary: {
91812                     path: "tizen/2.0/ContactAnniversary"
91813                 },
91814                 ContactEmailAddress: {
91815                     path: "tizen/2.0/ContactEmailAddress"
91816                 },
91817                 ContactGroup: {
91818                     path: "tizen/2.0/ContactGroup"
91819                 },
91820                 ContactName: {
91821                     path: "tizen/2.0/ContactName"
91822                 },
91823                 ContactOrganization: {
91824                     path: "tizen/2.0/ContactOrganization"
91825                 },
91826                 ContactPhoneNumber: {
91827                     path: "tizen/2.0/ContactPhoneNumber"
91828                 },
91829                 ContactRef: {
91830                     path: "tizen/2.0/ContactRef"
91831                 },
91832                 ContactWebSite: {
91833                     path: "tizen/2.0/ContactWebSite"
91834                 },
91835                 DownloadRequest: {
91836                     path: "tizen/2.0/DownloadRequest"
91837                 },
91838                 Message: {
91839                     path: "tizen/2.0/Message"
91840                 },
91841                 NDEFMessage: {
91842                     path: "tizen/2.0/NDEFMessage"
91843                 },
91844                 NDEFRecord: {
91845                     path: "tizen/2.0/NDEFRecord"
91846                 },
91847                 NDEFRecordMedia: {
91848                     path: "tizen/2.0/NDEFRecordMedia"
91849                 },
91850                 NDEFRecordText: {
91851                     path: "tizen/2.0/NDEFRecordText"
91852                 },
91853                 NDEFRecordURI: {
91854                     path: "tizen/2.0/NDEFRecordURI"
91855                 },
91856                 NotificationDetailInfo: {
91857                     path: "tizen/2.0/NotificationDetailInfo"
91858                 },
91859                 SimpleCoordinates: {
91860                     path: "tizen/2.0/SimpleCoordinates"
91861                 },
91862                 SortMode: {
91863                     path: "tizen/2.0/SortMode"
91864                 },
91865                 StatusNotification: {
91866                     path: "tizen/2.0/StatusNotification"
91867                 },
91868                 SyncInfo: {
91869                     path: "tizen/2.0/SyncInfo"
91870                 },
91871                 SyncServiceInfo: {
91872                     path: "tizen/2.0/SyncServiceInfo"
91873                 },
91874                 SyncProfileInfo: {
91875                     path: "tizen/2.0/SyncProfileInfo"
91876                 },
91877                 TZDate: {
91878                     path: "tizen/2.0/TZDate"
91879                 },
91880                 TimeDuration: {
91881                     path: "tizen/2.0/TimeDuration"
91882                 },
91883                 alarm: {
91884                     path: "tizen/2.0/alarm",
91885                     feature: "http://tizen.org/privilege/alarm",
91886                     handleSubfeatures: true
91887                 },
91888                 application: {
91889                     path: "tizen/2.0/application",
91890                     feature: "http://tizen.org/privilege/application.launch|http://tizen.org/privilege/appmanager.kill|http://tizen.org/privilege/appmanager.certificate",
91891                     handleSubfeatures: true
91892                 },
91893                 bluetooth: {
91894                     path: "tizen/2.0/bluetooth",
91895                     feature: "http://tizen.org/privilege/bluetoothmanager|http://tizen.org/privilege/bluetooth.admin|http://tizen.org/privilege/bluetooth.gap|http://tizen.org/privilege/bluetooth.spp",
91896                     handleSubfeatures: true
91897                 },
91898                 bookmark: {
91899                     path: "tizen/2.0/bookmark",
91900                     feature: "http://tizen.org/privilege/bookmark.read|http://tizen.org/privilege/bookmark.write",
91901                     handleSubfeatures: true
91902                 },
91903                 callhistory: {
91904                     path: "tizen/2.0/callHistory",
91905                     feature: "http://tizen.org/privilege/callhistory|http://tizen.org/privilege/callhistory.read|http://tizen.org/privilege/callhistory.write",
91906                     handleSubfeatures: true
91907                 },
91908                 calendar: {
91909                     path: "tizen/2.0/calendar",
91910                     feature: "http://tizen.org/privilege/calendar.read|http://tizen.org/privilege/calendar.write",
91911                     handleSubfeatures: true
91912                 },
91913                 contact: {
91914                     path: "tizen/2.0/contact",
91915                     feature: "http://tizen.org/privilege/contact.read|http://tizen.org/privilege/contact.write",
91916                     handleSubfeatures: true
91917                 },
91918                 content: {
91919                     path: "tizen/2.0/content",
91920                     feature: "http://tizen.org/privilege/content.read|http://tizen.org/privilege/content.write",
91921                     handleSubfeatures: true
91922                 },
91923                 datacontrol: {
91924                     path: "tizen/2.0/datacontrol",
91925                     feature: "http://tizen.org/privilege/datacontrol.consumer",
91926                     handleSubfeatures: true
91927                 },
91928                 datasync: {
91929                     path: "tizen/2.0/datasync",
91930                     feature: "http://tizen.org/privilege/datasync",
91931                     handleSubfeatures: true
91932                 },
91933                 download: {
91934                     path: "tizen/2.0/download",
91935                     feature: "http://tizen.org/privilege/download",
91936                     handleSubfeatures: true
91937                 },
91938                 filesystem: {
91939                     path: "tizen/2.0/filesystem",
91940                     feature: "http://tizen.org/privilege/filesystem.read|http://tizen.org/privilege/filesystem.write"
91941                 },
91942                 messageport: {
91943                     path: "tizen/2.0/messageport"
91944                 },
91945                 messaging: {
91946                     path: "tizen/2.0/messaging",
91947                     feature: "http://tizen.org/privilege/messaging.send|http://tizen.org/privilege/messaging.read|http://tizen.org/privilege/messaging.write",
91948                     handleSubfeatures: true
91949                 },
91950                 networkbearerselection: {
91951                     path: "tizen/2.0/networkbearerselection",
91952                     feature: "http://tizen.org/privilege/networkbearerselection",
91953                     handleSubfeatures: true
91954                 },
91955                 nfc: {
91956                     path: "tizen/2.0/nfc",
91957                     feature: "http://tizen.org/privilege/nfc.common|http://tizen.org/privilege/nfc.admin|http://tizen.org/privilege/nfc.tag|http://tizen.org/privilege/nfc.p2p",
91958                     handleSubfeatures: true
91959                 },
91960                 notification: {
91961                     path: "tizen/2.0/notification",
91962                     feature: "http://tizen.org/privilege/notification",
91963                     handleSubfeatures: true
91964                 },
91965                 package: {
91966                     path: "tizen/2.0/package",
91967                     feature: "http://tizen.org/privilege/packagemanager.install|http://tizen.org/privilege/package.info",
91968                     handleSubfeatures: true
91969                 },
91970                 power: {
91971                     path: "tizen/2.0/power",
91972                     feature: "http://tizen.org/privilege/power",
91973                     handleSubfeatures: true
91974                 },
91975                 push: {
91976                     path: "tizen/2.0/push",
91977                     feature: "http://tizen.org/privilege/push",
91978                     handleSubfeatures: true
91979                 },
91980                 seService: {
91981                     path: "tizen/2.0/secureelement",
91982                     feature: "http://tizen.org/privilege/secureelement",
91983                     handleSubfeatures: true
91984                 },
91985                 systeminfo: {
91986                     path: "tizen/2.0/systeminfo",
91987                     feature: "http://tizen.org/privilege/system|http://tizen.org/privilege/systemmanager",
91988                     handleSubfeatures: true
91989                 },
91990                 systemsetting: {
91991                     path: "tizen/2.0/systemsetting",
91992                     feature: "http://tizen.org/privilege/setting",
91993                     handleSubfeatures: true
91994                 },
91995                 time: {
91996                     path: "tizen/2.0/time",
91997                     feature: "http://tizen.org/privilege/time",
91998                     handleSubfeatures: true
91999                 },
92000                 websetting: {
92001                     path: "tizen/2.0/websetting",
92002                     feature: "http://tizen.org/privilege/websetting",
92003                     handleSubfeatures: true
92004                 }
92005             }
92006         }
92007     }
92008 };
92009
92010 });
92011 define('ripple/platform/tizen/2.0/routeBackend_local', function (require, exports, module) {
92012 /*
92013  *  Copyright 2012 Intel Corporation.
92014  *
92015  * Licensed under the Apache License, Version 2.0 (the "License");
92016  * you may not use this file except in compliance with the License.
92017  * You may obtain a copy of the License at
92018  *
92019  * http://www.apache.org/licenses/LICENSE-2.0
92020  *
92021  * Unless required by applicable law or agreed to in writing, software
92022  * distributed under the License is distributed on an "AS IS" BASIS,
92023  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
92024  * See the License for the specific language governing permissions and
92025  * limitations under the License.
92026  */
92027
92028 var db = require('ripple/db'),
92029     utils = require('ripple/utils'),
92030     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
92031     WebAPIError = require('ripple/platform/tizen/2.0/WebAPIError'),
92032     SimpleCoordinates = require('ripple/platform/tizen/2.0/SimpleCoordinates'),
92033     tizen1_utils = require('ripple/platform/tizen/2.0/tizen1_utils'),
92034     lbs = require('ripple/platform/tizen/2.0/lbs'),
92035     LocationServiceProvider = {},
92036     RouteWaypoint,
92037     RouteDistance,
92038     RouteDuration,
92039     RouteStep,
92040     RouteSegment,
92041     RouteRequestOptions,
92042     RouteResultSummary,
92043     RouteResult,
92044     _data = {
92045         DB_ROUTE_LOCATION_KEY: "tizen1-db-route",
92046         DB_ROUTE_COLLEAGE_KEY: "tizen2-db-route",
92047         routeProvider: {},
92048         routes: [],
92049         RouteDistanceUnit: ["M", "KM", "MI", "FT"],
92050         providers: [],
92051         path: []
92052     },
92053     _self;
92054
92055 // The RouteWaypoint object
92056 RouteWaypoint = function () {
92057     return {
92058         position: {
92059             latitude: 0,
92060             longitude: 0
92061         },
92062         isStopover: true
92063     };
92064 };
92065
92066 // The RouteDistance object
92067 RouteDistance = function () {
92068     return {
92069         text: "",
92070         value: 0,
92071         unit: "KM"
92072     };
92073 };
92074
92075 // The RouteDuration object
92076 RouteDuration = function () {
92077     return {
92078         text: "",
92079         value: 0 // The duration in a seconds
92080     };
92081 };
92082
92083 // The RouteStep object
92084 RouteStep = function () {
92085     var _self = {
92086         mode: "",        // The way of the travel, for example: car, bike, foot
92087         instruction: "", // The instruction of this step
92088         points: []       // The points of this step
92089     };
92090
92091     _self.origin      = new SimpleCoordinates(0, 0);
92092     _self.destination = new SimpleCoordinates(0, 0);
92093     _self.distance    = new RouteDistance();
92094     _self.duration    = new RouteDuration();
92095
92096     return _self;
92097 };
92098
92099 // The RouteSegment object
92100 RouteSegment = function () {
92101     var _self = {
92102         steps: []
92103     };
92104
92105     _self.origin      = new SimpleCoordinates(0, 0);
92106     _self.destination = new SimpleCoordinates(0, 0);
92107     _self.distance    = new RouteDistance();
92108     _self.duration    = new RouteDuration();
92109
92110     return _self;
92111 };
92112
92113 // The RouteRequestOptions object
92114 RouteRequestOptions = function () {
92115     return {
92116         mode: "", // CAR, BIKE
92117         unit: "KM",
92118         routeGoal: "SHORTEST",
92119         constraints: ["HIGHWAY", "TOLL", "UNPAVED"],
92120         wayPoints: [],
92121         maxResults: 1
92122     };
92123 };
92124
92125 // The RouteResultSummary object
92126 RouteResultSummary = function () {
92127     var _self = {};
92128
92129     _self.origin        = new SimpleCoordinates(0, 0);
92130     _self.destination   = new SimpleCoordinates(0, 0);
92131     _self.totalDistance = new RouteDistance();
92132     _self.totalDuration = new RouteDuration();
92133
92134     return _self;
92135 };
92136
92137 // The RouteResult object
92138 RouteResult = function () {
92139     var _self = {
92140         segments: []
92141     };
92142
92143     _self.summary = new RouteResultSummary();
92144
92145     return _self;
92146 };
92147
92148 // Floyd arithmetic in Mathematics, solving the optimal way
92149 function floyd(e, n, startIndex, endIndex) {
92150     var MAX = Infinity,
92151         a = new Array(n), i, j, k, p = new Array(n),
92152         paths, pathWay = [];
92153
92154     for (i = 1; i < n + 1; i++) {
92155         a[i] = new Array(n);
92156     }
92157     for (i = 1; i < n + 1; i++) {
92158         p[i] = new Array(n);
92159     }
92160     for (i = 1; i < n + 1; i++) {
92161         for (j = 1; j < n + 1; j++) {
92162             if (i === j || e[i][j] === "MIN") {
92163                 a[i][j] = 0;
92164             } else if (e[i][j] !== 0 && e[i][j] !== "MIN") {
92165                 a[i][j] = e[i][j];
92166             } else {
92167                 a[i][j] = MAX;
92168             }
92169             p[i][j] = 0;
92170         }
92171     }
92172     for (i = 1; i < n + 1; i++) {
92173         a[i][i] = 0;
92174     }
92175     for (k = 1; k < n + 1; k++) {
92176         for (i = 1; i < n + 1; i++) {
92177             for (j = 1; j < n + 1; j++) {
92178                 if (parseInt(a[i][k], 10) + parseInt(a[k][j], 10) < a[i][j]) {
92179                     a[i][j] = parseInt(a[i][k], 10) + parseInt(a[k][j], 10);
92180                     p[i][j] = k;
92181                 }
92182             }
92183         }
92184     }
92185     _data.path = [];
92186     paths = findPath(startIndex, endIndex, p);
92187     pathWay = [];
92188     pathWay.push(startIndex);
92189     for (i = 0; i < paths.length; i++) {
92190         pathWay.push(paths[i]);
92191     }
92192     pathWay.push(endIndex);
92193
92194     return pathWay;
92195 }
92196
92197 // Find the best way in the locations
92198 function findPath(i, j, p) {
92199     var k = p[i][j];
92200
92201     if (k === 0 || i === j) {
92202         return _data.path;
92203     }
92204     findPath(i, k, p);
92205     _data.path.push(k);
92206
92207     return findPath(k, j, p);
92208 }
92209
92210 // Find the index in the locations by string
92211 function findIndexByStr(str, locations) {
92212     for (var i in locations) {
92213         if (locations[i].name === str) {
92214             return parseInt(i, 10) + 1;
92215         }
92216     }
92217     return -1;
92218 }
92219
92220 // Find the index in the colleages by name1 and name2
92221 function findValueByStr(start, end, locations, colleages) {
92222     for (var i in colleages) {
92223         if (colleages[i].name1 === locations[start - 1].name && colleages[i].name2 === locations[end - 1].name) {
92224             return parseInt(i, 10);
92225         } else if (colleages[i].name2 === locations[start - 1].name && colleages[i].name1 === locations[end - 1].name) {
92226             return parseInt(i, 10);
92227         }
92228     }
92229     return -1;
92230 }
92231
92232 // Find the index in the locations by latitude and longitude
92233 function searchIndexBycoodinates(latitude, longitude, locations) {
92234     if (latitude !== null && longitude !== null) {
92235         for (var i in locations) {
92236             if (locations[i].latitude === latitude && locations[i].longitude === longitude) {
92237                 return parseInt(i, 10) + 1;
92238             }
92239         }
92240     }
92241     return -1;
92242 }
92243
92244 // Get the relation among the locations
92245 function getRelation(n, colleages, locations, goal) {
92246     var i, j, start, end, relation = new Array(n + 1);
92247     for (i = 1; i < n + 2; i++) {
92248         relation[i] = new Array(n + 1);
92249     }
92250     for (i = 1; i < n + 1; i++) {
92251         for (j = 1; j < n + 1; j++) {
92252             relation[i][j] = 0;
92253         }
92254     }
92255     for (i in colleages) {
92256         start = findIndexByStr(colleages[i].name1, locations);
92257         end = findIndexByStr(colleages[i].name2, locations);
92258         if (start !== -1 && end !== -1 && start !== end) {
92259             switch (goal) {
92260             case "distance":
92261                 relation[start][end] = colleages[i].distance;
92262                 relation[end][start] = colleages[i].distance;
92263                 break;
92264
92265             case "duration":
92266                 relation[start][end] = colleages[i].duration;
92267                 relation[end][start] = colleages[i].duration;
92268                 break;
92269
92270             case "simple":
92271                 relation[start][end] = 1;
92272                 relation[end][start] = 1;
92273                 break;
92274
92275             case "scenic":
92276                 if (colleages[i].addition.scenic === "SCENIC") {
92277                     relation[start][end] = 1;
92278                     relation[start][end] = 1;
92279                 } else if (colleages[i].addition.scenic === "") {
92280                     relation[start][end] = "MIN";
92281                     relation[start][end] = "MIN";
92282                 }
92283                 break;
92284
92285             case "cheap":
92286                 if (colleages[i].addition.toll === "TOLL") {
92287                     relation[start][end] = 1;
92288                     relation[end][start] = 1;
92289                 } else if (colleages[i].addition.toll === "") {
92290                     relation[start][end] = "MIN";
92291                     relation[start][end] = "MIN";
92292                 }
92293                 break;
92294
92295             case "safe":
92296                 if (colleages[i].addition.hazardous === "HAZARDOUS") {
92297                     relation[start][end] = 1;
92298                     relation[end][start] = 1;
92299                 } else if (colleages[i].addition.hazardous === "") {
92300                     relation[start][end] = "MIN";
92301                     relation[end][start] = "MIN";
92302                 }
92303                 break;
92304
92305             default:
92306                 return null;
92307             }
92308         }
92309     }
92310
92311     return relation;
92312 }
92313
92314 // Get the distance relationship among the locations
92315 function distanceRelation(n, colleages, locations) {
92316     return getRelation(n, colleages, locations, "distance");
92317 }
92318
92319 // Get the duration relationship among the locations
92320 function durationRelation(n, colleages, locations) {
92321     return getRelation(n, colleages, locations, "duration");
92322 }
92323
92324 // Get the simple relationship among the locations
92325 function simpleRelation(n, colleages, locations) {
92326     return getRelation(n, colleages, locations, "simple");
92327 }
92328
92329 // Get the cheap relationship among the locations
92330 function cheapRelation(n, colleages, locations) {
92331     return getRelation(n, colleages, locations, "cheap");
92332 }
92333
92334 // Get the safe relationship among the locations
92335 function safeRelation(n, colleages, locations) {
92336     return getRelation(n, colleages, locations, "safe");
92337 }
92338
92339 // Get the scenic relationship among the locations
92340 function scenicRelation(n, colleages, locations) {
92341     return getRelation(n, colleages, locations, "scenic");
92342 }
92343
92344 // Get the shortest way by origin, destination, locations and colleages
92345 function optimalWay(origin, destination, locations, colleages, relation) {
92346     var n = locations.length, i, steps = [], step, relations, routeLocations,
92347         originIndex, destinationIndex, startIndex, endIndex, colleageIndex,
92348         originLatitude, originLongitude, destinationLatitude, destinationLongitude,
92349         startLatitude, startLongitude, endLatitude, endLongitude,
92350         originLocation, destinationLocation, segment, result;
92351
92352     originLatitude = origin.latitude;
92353     originLongitude = origin.longitude;
92354     originIndex = searchIndexBycoodinates(originLatitude, originLongitude, locations);
92355
92356     destinationLatitude = destination.latitude;
92357     destinationLongitude = destination.longitude;
92358     destinationIndex = searchIndexBycoodinates(destinationLatitude, destinationLongitude, locations);
92359
92360     relations = relation(n, colleages, locations);
92361
92362     if (originIndex !== -1 && destinationIndex !== -1) {
92363         routeLocations = floyd(relations, n, parseInt(originIndex, 10), parseInt(destinationIndex, 10));
92364
92365         for (i = 0; i < routeLocations.length - 1; i++) {
92366             colleageIndex = findValueByStr(routeLocations[i], routeLocations[i + 1], locations, colleages);
92367
92368             if (colleageIndex !== -1) {
92369                 step = new RouteStep();
92370                 startIndex = parseInt(routeLocations[i], 10) - 1;
92371                 endIndex = parseInt(routeLocations[i + 1], 10) - 1;
92372
92373                 startLatitude = locations[startIndex].latitude;
92374                 startLongitude = locations[startIndex].longitude;
92375                 originLocation = new SimpleCoordinates(startLatitude, startLongitude);
92376
92377                 endLatitude = locations[endIndex].latitude;
92378                 endLongitude = locations[endIndex].longitude;
92379                 destinationLocation = new SimpleCoordinates(endLatitude, endLongitude);
92380
92381                 step.origin = originLocation;
92382                 step.destination = destinationLocation;
92383                 step.distance = colleages[colleageIndex].distance;
92384                 step.duration = colleages[colleageIndex].duration;
92385                 step.mode = colleages[colleageIndex].mode;
92386                 step.addition = colleages[colleageIndex].addition;
92387
92388                 steps.push(step);
92389             } else if (colleageIndex === -1) {
92390                 return null;
92391             }
92392         }
92393
92394         segment = new RouteSegment();
92395         segment.steps = steps;
92396         result = new RouteResult();
92397         result.segments[0] = segment;
92398
92399         return result;
92400     }
92401     return null;
92402 }
92403
92404 // Get the shortest way by origin, destination, locations and colleages
92405 function shortestWay(origin, destination, locations, colleages) {
92406     return optimalWay(origin, destination, locations, colleages, distanceRelation);
92407 }
92408
92409 // Get the fastest way by origin, destination, locations and colleages
92410 function fastestWay(origin, destination, locations, colleages) {
92411     return optimalWay(origin, destination, locations, colleages, durationRelation);
92412 }
92413
92414 // Get the simplest way by origin, destination, locations and colleages
92415 function simplestWay(origin, destination, locations, colleages) {
92416     return optimalWay(origin, destination, locations, colleages, simpleRelation);
92417 }
92418
92419 // Get the most scenic way by origin, destination, locations and colleages
92420 function mostScenicWay(origin, destination, locations, colleages) {
92421     return optimalWay(origin, destination, locations, colleages, scenicRelation);
92422 }
92423
92424 // Get the cheapest way by origin, destination, locations and colleages
92425 function cheapestWay(origin, destination, locations, colleages) {
92426     return optimalWay(origin, destination, locations, colleages, cheapRelation);
92427 }
92428
92429 // Get the safest way by origin, destination, locations and colleages
92430 function safestWay(origin, destination, locations, colleages) {
92431     return optimalWay(origin, destination, locations, colleages, safeRelation);
92432 }
92433
92434 // Uniquelize the array
92435 function uniquelize(array) {
92436     var temp = {}, result = [], i;
92437     for (i = array.length; i--;) {
92438         temp[array[i]] = array[i];
92439     }
92440     for (i in temp) {
92441         result.push(temp[i]);
92442     }
92443     return result;
92444 }
92445
92446 // Is it intersect between the Array a and b
92447 function intersect(a, b) {
92448     var i, j;
92449
92450     a = uniquelize(a);
92451     if (a.length === 0 && b.length === 0) {
92452         return true;
92453     }
92454     for (i in a) {
92455         for (j in b) {
92456             if (a[i] === b[j])
92457                 return true;
92458         }
92459     }
92460     return false;
92461 }
92462
92463 function getConstrains(result) {
92464     var steps = result.segments[0].steps, constrains = [];
92465
92466     utils.forEach(steps, function (item, index) {
92467         if (item.addition.highway === "HIGHWAY") {
92468             constrains.push("HIGHWAY");
92469         }
92470         if (item.addition.toll === "TOLL") {
92471             constrains.push("TOLL");
92472         }
92473         if (item.addition.bridge === "BRIDGE") {
92474             constrains.push("BRIDGE");
92475         }
92476         if (item.addition.hazardous === "HAZARDOUS") {
92477             constrains.push("HAZARDOUS");
92478         }
92479         if (item.addition.scenic === "SCENIC") {
92480             constrains.push("SCENIC");
92481         }
92482     });
92483     if (constrains.length > 0) {
92484         return uniquelize(constrains);
92485     }
92486     return constrains;
92487 }
92488
92489 module.exports = function (prop) {
92490     var _self = new lbs.LocationServiceProvider(prop);
92491     _self.find = function (origin, destination, successCallback, errorCallback, options) {
92492         function _find() {
92493             var locations, colleages, i, result = {}, emptyResult = [], modes = [], resultModes = [], constrains = [], resultconstrains = [];
92494
92495             locations = db.retrieveObject(_data.DB_ROUTE_LOCATION_KEY);
92496             colleages = db.retrieveObject(_data.DB_ROUTE_COLLEAGE_KEY);
92497
92498             modes = options.modes;
92499             constrains = options.constrains;
92500             if (locations.length > 0 && colleages.length > 0) {
92501                 switch (options.routeGoal) {
92502                 case "SHORTEST":
92503                     result = shortestWay(origin, destination, locations, colleages);
92504                     break;
92505
92506                 case "FASTEST":
92507                     result = fastestWay(origin, destination, locations, colleages);
92508                     break;
92509
92510                 case "SIMPLEST":
92511                     result = simplestWay(origin, destination, locations, colleages);
92512                     break;
92513
92514                 case "MOST_SCENIC":
92515                     result = mostScenicWay(origin, destination, locations, colleages);
92516                     break;
92517
92518                 case "CHEAPEST":
92519                     result = cheapestWay(origin, destination, locations, colleages);
92520                     break;
92521
92522                 case "SAFEST":
92523                     result = safestWay(origin, destination, locations, colleages);
92524                     break;
92525
92526                 default:
92527                     result = shortestWay(origin, destination, locations, colleages);
92528                     break;
92529                 }
92530                 if (result !== null) {
92531                     for (i in result.segments[0].steps) {
92532                         resultModes.push(result.segments[0].steps[i].mode);
92533                     }
92534                     resultconstrains = getConstrains(result);
92535                     if (intersect(resultModes, modes) && intersect(resultconstrains, constrains)) {
92536                         successCallback(result);
92537                     } else {
92538                         successCallback(null);
92539                     }
92540                 }
92541             } else {
92542                 successCallback(emptyResult);
92543             }
92544         }
92545         tizen1_utils.validateTypeMismatch(successCallback, errorCallback, "find", _find);
92546     };
92547     return _self;
92548 };
92549
92550 });
92551 define('ripple/platform/tizen/2.0/ReverseGeocodeOptions', function (require, exports, module) {
92552 /*      
92553  *  Copyright 2012 Intel Corporation.
92554  *  
92555  * Licensed under the Apache License, Version 2.0 (the "License");
92556  * you may not use this file except in compliance with the License.
92557  * You may obtain a copy of the License at
92558  *  
92559  * http://www.apache.org/licenses/LICENSE-2.0
92560  *  
92561  * Unless required by applicable law or agreed to in writing, software
92562  * distributed under the License is distributed on an "AS IS" BASIS,
92563  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
92564  * See the License for the specific language governing permissions and
92565  * limitations under the License.
92566  */
92567 var errorcode = require('ripple/platform/tizen/2.0/errorcode'),
92568     WebAPIError = require('ripple/platform/tizen/2.0/WebAPIError'),
92569     SortMode = require('ripple/platform/tizen/2.0/SortMode');
92570
92571 module.exports = function (_sortMode, _resultType, _maxResults) {
92572     var _self;
92573     if (_sortMode !== null && _sortMode !== undefined) {
92574         if (typeof _sortMode !== "object") {
92575             throw (new WebAPIError(errorcode.TYPE_MISMATCH_ERR));
92576         }
92577         try {
92578             new SortMode(_sortMode.attributeName, _sortMode.order);
92579         } catch (e) {
92580             throw (new WebAPIError(errorcode.TYPE_MISMATCH_ERR));
92581         }
92582     }
92583     if (_resultType !== null && _resultType !== undefined) {
92584         if (_resultType !== "FORMATTED" && _resultType !== "STRUCTURED") {
92585             throw (new WebAPIError(errorcode.TYPE_MISMATCH_ERR));
92586         }
92587     }
92588     if (_maxResults !== null && _maxResults !== undefined) {
92589         if (typeof _maxResults !== "number") {
92590             throw (new WebAPIError(errorcode.TYPE_MISMATCH_ERR));
92591         }
92592     }
92593     _self = {
92594         sortMode : _sortMode,
92595         resultType : _resultType || "FORMATTED",
92596         maxResults : _maxResults || 0
92597     };
92598
92599     return _self;
92600 };
92601
92602
92603 });
92604 define('ripple/platform/tizen/2.0/BookmarkFolder', function (require, exports, module) {
92605 /*
92606  *  Copyright 2013 Intel Corporation.
92607  *
92608  * Licensed under the Apache License, Version 2.0 (the "License");
92609  * you may not use this file except in compliance with the License.
92610  * You may obtain a copy of the License at
92611  *
92612  * http://www.apache.org/licenses/LICENSE-2.0
92613  *
92614  * Unless required by applicable law or agreed to in writing, software
92615  * distributed under the License is distributed on an "AS IS" BASIS,
92616  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
92617  * See the License for the specific language governing permissions and
92618  * limitations under the License.
92619  */
92620
92621 var t = require('ripple/platform/tizen/2.0/typecast'),
92622     BookmarkFolder;
92623
92624 BookmarkFolder = function (title) {
92625     t.BookmarkFolder(arguments, this);
92626
92627     this.__defineGetter__("parent", function () {
92628         return undefined;
92629     });
92630
92631     this.__defineGetter__("title", function () {
92632         return title;
92633     });
92634 };
92635
92636 module.exports = BookmarkFolder;
92637
92638 });
92639 define('ripple/platform/tizen/2.0/dbinit', function (require, exports, module) {
92640 /*
92641  *  Copyright 2013 Intel Corporation.
92642  *
92643  * Licensed under the Apache License, Version 2.0 (the "License");
92644  * you may not use this file except in compliance with the License.
92645  * You may obtain a copy of the License at
92646  *
92647  * http://www.apache.org/licenses/LICENSE-2.0
92648  *
92649  * Unless required by applicable law or agreed to in writing, software
92650  * distributed under the License is distributed on an "AS IS" BASIS,
92651  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
92652  * See the License for the specific language governing permissions and
92653  * limitations under the License.
92654  */
92655
92656 var utils = require('ripple/utils'),
92657     exception = require('ripple/exception'),
92658     dbfs = require('ripple/platform/tizen/2.0/dbfs'),
92659     filesystem = require('ripple/platform/tizen/2.0/filesystem'),
92660     DBBuilder,
92661     Content,
92662     FileSystem,
92663     _data = {
92664         dbBuilder: null
92665     },
92666     _self = {};
92667
92668 function _initialize() {
92669     _data.dbBuilder = new DBBuilder();
92670
92671     _data.dbBuilder.register("FileSystem", "", FileSystem);
92672     _data.dbBuilder.register("Content", "dbcontent.xml", Content);
92673     _data.dbBuilder.register("Package", "dbpackage.xml");
92674     _data.dbBuilder.register("Application", "dbapplication.xml");
92675     _data.dbBuilder.register("Bluetooth", "dbbluetooth.xml");
92676     _data.dbBuilder.register("MessagePort", "dbmessageport.json");
92677
92678     _data.FileSystem.initdb();
92679 }
92680
92681 DBBuilder = function () {
92682     var self;
92683
92684     // private
92685     function formatString(str) {
92686         return str.replace(/^\s+|[\t\n\r\v]+|\s+$/g, "").replace(/\s+/g, " ");
92687     }
92688
92689     function getType(node) {
92690         var type, reNum, reHexNum, reDate;
92691
92692         if (node.childNodes) {
92693             return (node.childNodes[0].nodeName === "i") ? "Array" : "Object";
92694         }
92695
92696         // Special case
92697         if (node.nodeName === "version") {
92698             return "DOMString";
92699         }
92700
92701         reNum = /^(-?\d+)(\.\d+)?$/;
92702         reHexNum = /^0[Xx][0-9A-Fa-f]+$/;
92703         reDate = /^(\d{4})\-(\d{2})\-(\d{2})\s+(\d{2}):(\d{2}):(\d{2})$/;
92704
92705         if (reNum.test(node.textContent)) {
92706             type = "Number";
92707         } else if (reHexNum.test(node.textContent)) {
92708             type = "Number";
92709         } else if (reDate.test(node.textContent)) {
92710             type = "Date";
92711         } else if (node.textContent === "true" || node.textContent === "false") {
92712             type = "Boolean";
92713         } else {
92714             type = "DOMString";
92715         }
92716
92717         return type;
92718     }
92719
92720     function build(node) {
92721         var i, value;
92722
92723         switch (getType(node)) {
92724         case "Boolean":
92725             value = (formatString(node.textContent) === "true");
92726             break;
92727
92728         case "Date":
92729             value = new Date(formatString(node.textContent));
92730             break;
92731
92732         case "Number":
92733             value = Number(formatString(node.textContent));
92734             break;
92735
92736         case "Object":
92737             value = {};
92738             for (i in node.childNodes) {
92739                 value[node.childNodes[i].nodeName] = build(node.childNodes[i]);
92740             }
92741             break;
92742
92743         case "Array":
92744             value = [];
92745             for (i in node.childNodes) {
92746                 value.push(build(node.childNodes[i]));
92747             }
92748             break;
92749
92750         default:  // "DOMString"
92751             value = formatString(node.textContent);
92752             break;
92753         }
92754
92755         return value;
92756     }
92757
92758     function parse(obj) {
92759         var i, res = {};
92760
92761         res.nodeName = ("name" in obj.attributes) ?
92762                 obj.attributes["name"].value : obj.nodeName;
92763
92764         if (obj.childElementCount === 0) {
92765             res.textContent = obj.textContent;
92766         } else {
92767             res.childNodes = [];
92768
92769             for (i in obj.childNodes) {
92770                 if (obj.childNodes[i].attributes) {
92771                     res.childNodes.push(parse(obj.childNodes[i]));
92772                 }
92773             }
92774         }
92775
92776         return res;
92777     }
92778
92779     // public
92780     function register(type, dbXml, Extension) {
92781         _data[type] = Extension ? new Extension() : {};
92782
92783         if (!dbXml)
92784             return;
92785
92786         _self.__defineGetter__(type, function () {
92787             var fnInit;
92788
92789             if (!_data[type].db) {
92790                 fnInit = _data[type].initdb || initdb;
92791                 _data[type].db = fnInit(dbXml);
92792             }
92793
92794             return _data[type].db;
92795         });
92796     }
92797
92798     function initdb(dbXml) {
92799         var db = {}, xmlHttp, res;
92800
92801         try {
92802             xmlHttp = new XMLHttpRequest();
92803             xmlHttp.open("GET", "dbsamples/" + dbXml, false);
92804             xmlHttp.send();
92805         } catch (e) {
92806             exception.handle(e);
92807         }
92808
92809         if (/^(.+)\.json$/.test(dbXml)) {
92810             if (!xmlHttp.responseText) {
92811                 return null;
92812             }
92813
92814             db = JSON.parse(formatString(xmlHttp.responseText));
92815         } else {
92816             if (!xmlHttp.responseXML) {
92817                 return null;
92818             }
92819
92820             res = parse(xmlHttp.responseXML.documentElement);
92821             res.childNodes.forEach(function (node) {
92822                 db[node.nodeName] = build(node);
92823             });
92824         }
92825
92826         return db;
92827     }
92828
92829     self = {
92830         register: register,
92831         initdb:   initdb
92832     };
92833
92834     return self;
92835 };
92836
92837 /*
92838  * FileSystem
92839  */
92840
92841 FileSystem = function () {
92842     var self;
92843
92844     // private
92845     function createPath(path) {
92846         var parts = path.replace(/^\//, "").split("/"),
92847             workflow = jWorkflow.order();
92848
92849         parts.forEach(function (part, index) {
92850             var dir = "/" + utils.copy(parts).splice(0, index + 1).join("/");
92851
92852             workflow.andThen(function (prev, baton) {
92853                 baton.take();
92854                 dbfs.mkdir(dir, baton.pass, baton.pass);
92855             });
92856         });
92857
92858         workflow.start();
92859     }
92860
92861     // public
92862     function initdb() {
92863         filesystem.resolve("images", function () {});
92864         filesystem.resolve("videos", function () {});
92865         filesystem.resolve("music", function () {});
92866     }
92867
92868     function createFile(uri) {
92869         var directoryURI;
92870
92871         directoryURI = uri.slice(0, uri.lastIndexOf("/") + 1)
92872                 .replace(/file:\/\//, "");
92873
92874         dbfs.stat(directoryURI, function () {}, function () {
92875             createPath(directoryURI);
92876         });
92877
92878         uri = uri.replace(/file:\/\//, "");
92879         dbfs.touch(uri, function () {});
92880     }
92881
92882     self = {
92883         initdb: initdb,
92884         createFile: createFile
92885     };
92886
92887     return self;
92888 };
92889
92890 /*
92891  * Content
92892  */
92893
92894 Content = function () {
92895     var self, ContentStorage;
92896
92897     ContentStorage = function (contents, directories) {
92898         var i, parentURI;
92899
92900         for (i in directories) {
92901             directories[i].contents = {};
92902             this[directories[i].directoryURI] = directories[i];
92903         }
92904
92905         for (i in contents) {
92906             parentURI = contents[i].contentURI.slice(0,
92907                     contents[i].contentURI.lastIndexOf("/") + 1)
92908                     .replace(/file:\/\//, "");
92909
92910             if (parentURI in this) {
92911                 this[parentURI].contents[contents[i].contentURI] = contents[i];
92912             }
92913         }
92914     };
92915
92916     // public
92917     function initdb(dbXml) {
92918         var i, db;
92919
92920         db = _data.dbBuilder.initdb(dbXml);
92921
92922         if (!db)
92923             return null;
92924
92925         for (i in db.contents) {
92926             _data.FileSystem.createFile(db.contents[i].contentURI);
92927         }
92928
92929         return new ContentStorage(db.contents, db.directories);
92930     }
92931
92932     self = {
92933         initdb: initdb
92934     };
92935
92936     return self;
92937 };
92938
92939 _initialize();
92940
92941 module.exports = _self;
92942
92943 });
92944 define('ripple/platform/tizen/2.0/pendingoperation', function (require, exports, module) {
92945 /*
92946  *  Copyright 2011 Intel Corporation.
92947  *
92948  * Licensed under the Apache License, Version 2.0 (the "License");
92949  * you may not use this file except in compliance with the License.
92950  * You may obtain a copy of the License at
92951  *
92952  * http://www.apache.org/licenses/LICENSE-2.0
92953  *
92954  * Unless required by applicable law or agreed to in writing, software
92955  * distributed under the License is distributed on an "AS IS" BASIS,
92956  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
92957  * See the License for the specific language governing permissions and
92958  * limitations under the License.
92959  */
92960
92961 module.exports = function (pendingObj) {
92962     var pending = true;
92963     this.cancel = function () {
92964         if (pending === true) {
92965             if (typeof (pendingObj.getCancelFlag) === "function" && pendingObj.getCancelFlag() === false) {
92966                 pending = false;
92967                 // this clearTimeout is for the case when a 3rd party is invoked to do the task, and it's finished sooner than the intended timeout. therefore, the 3rd party set CancelFlag false, and this cancel is called before timeout
92968                 clearTimeout(pendingObj.pendingID);
92969                 return false;
92970             }
92971             if (typeof (pendingObj.userCancel) === "function") {
92972                 pendingObj.userCancel();
92973             }
92974             clearTimeout(pendingObj.pendingID);
92975             pending = false;
92976             return true;
92977         } else {
92978             return false;
92979         }
92980     };
92981 };
92982
92983
92984 });
92985 define('ripple/platform/tizen/2.0/navigator', function (require, exports, module) {
92986 /*
92987  *  Copyright 2011 Research In Motion Limited.
92988  *  Copyright 2012 Intel Corporation.
92989  *
92990  * Licensed under the Apache License, Version 2.0 (the "License");
92991  * you may not use this file except in compliance with the License.
92992  * You may obtain a copy of the License at
92993  *
92994  * http://www.apache.org/licenses/LICENSE-2.0
92995  *
92996  * Unless required by applicable law or agreed to in writing, software
92997  * distributed under the License is distributed on an "AS IS" BASIS,
92998  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
92999  * See the License for the specific language governing permissions and
93000  * limitations under the License.
93001  */
93002 var _original = window.navigator,
93003     utils = require('ripple/utils'),
93004     devices = require('ripple/devices'),
93005     constants = require('ripple/constants'),
93006     vibration = require('ripple/platform/tizen/2.0/vibration'),
93007     _self = {};
93008
93009 (function () {
93010     var key,
93011         nav = window.navigator;
93012
93013     function _handle(obj, key) {
93014         return typeof obj[key] !== "function" ? obj[key] : function () {
93015             return obj[key].apply(obj, Array.prototype.slice.call(arguments));
93016         };
93017     }
93018
93019     for (key in nav) {
93020         _self[key] = _handle(nav, key);
93021     }
93022 }());
93023
93024 _self.__defineGetter__('userAgent', function () {
93025     var currentUserAgent = devices.getCurrentDevice().userAgent;
93026
93027     return currentUserAgent === constants.COMMON.USER_AGENT_DEFAULT ?
93028         _original.userAgent : currentUserAgent;
93029 });
93030
93031 _self.__defineGetter__('vibrate', function () {
93032     return vibration.vibrate;
93033 });
93034
93035 module.exports = _self;
93036
93037 });
93038 define('ripple/platform/tizen/2.0/BluetoothDevice', function (require, exports, module) {
93039 /*
93040  *  Copyright 2013 Intel Corporation.
93041  *
93042  * Licensed under the Apache License, Version 2.0 (the "License");
93043  * you may not use this file except in compliance with the License.
93044  * You may obtain a copy of the License at
93045  *
93046  * http://www.apache.org/licenses/LICENSE-2.0
93047  *
93048  * Unless required by applicable law or agreed to in writing, software
93049  * distributed under the License is distributed on an "AS IS" BASIS,
93050  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
93051  * See the License for the specific language governing permissions and
93052  * limitations under the License.
93053  */
93054
93055 var utils = require('ripple/utils'),
93056     event = require('ripple/event'),
93057     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
93058     t = require('ripple/platform/tizen/2.0/typecast'),
93059     WebAPIError = require('ripple/platform/tizen/2.0/WebAPIError'),
93060     WebAPIException = require('ripple/platform/tizen/2.0/WebAPIException'),
93061     BluetoothClass = require('ripple/platform/tizen/2.0/BluetoothClass'),
93062     BluetoothSocket = require('ripple/platform/tizen/2.0/BluetoothSocket'),
93063     BluetoothDevice,
93064     _security;
93065
93066 BluetoothDevice = function (prop) {
93067     var bluetoothDevice = {}, sockets = {}, self;
93068
93069     bluetoothDevice.name        = prop.name || "";
93070     bluetoothDevice.address     = prop.address || "";
93071     bluetoothDevice.deviceClass = new BluetoothClass(prop.deviceClass,
93072             prop.metaData) || {};
93073     bluetoothDevice.isBonded    = prop.isBonded || false;
93074     bluetoothDevice.isTrusted   = prop.isTrusted || false;
93075     bluetoothDevice.isConnected = prop.isConnected || false;
93076     bluetoothDevice.services    = prop.services;
93077     bluetoothDevice.uuids       = [];
93078
93079     this.__defineGetter__("name", function () {
93080         return bluetoothDevice.name;
93081     });
93082
93083     this.__defineGetter__("address", function () {
93084         return bluetoothDevice.address;
93085     });
93086
93087     this.__defineGetter__("deviceClass", function () {
93088         return bluetoothDevice.deviceClass;
93089     });
93090
93091     this.__defineGetter__("isBonded", function () {
93092         return bluetoothDevice.isBonded;
93093     });
93094
93095     this.__defineGetter__("isTrusted", function () {
93096         return bluetoothDevice.isTrusted;
93097     });
93098
93099     this.__defineGetter__("isConnected", function () {
93100         return bluetoothDevice.isConnected;
93101     });
93102
93103     this.__defineGetter__("uuids", function () {
93104         return bluetoothDevice.uuids;
93105     });
93106
93107     this.connectToServiceByUUID = function (uuid, successCallback,
93108             errorCallback) {
93109         if (!_security.all && !_security.connectToServiceByUUID) {
93110             throw new WebAPIException(errorcode.SECURITY_ERR);
93111         }
93112
93113         t.BluetoothDevice("connectToServiceByUUID", arguments);
93114
93115         window.setTimeout(function () {
93116             if (bluetoothDevice.uuids.join(",").indexOf(uuid) === -1) {
93117                 if (errorCallback) {
93118                     errorCallback(new WebAPIError(errorcode.NOT_FOUND_ERR));
93119                 }
93120                 return;
93121             }
93122
93123             bluetoothDevice.isConnected = true;
93124             event.trigger("bt-device-connected-changed", [bluetoothDevice.address,
93125                     true]);
93126             event.trigger("bt-service-state-changed", [bluetoothDevice.address,
93127                     uuid, true]);
93128
93129             window.setTimeout(function () {
93130                 successCallback(sockets[uuid]);
93131             }, 1);
93132         }, 1);
93133     };
93134
93135     event.on("bt-device-connected-update", function (addr, isConnected) {
93136         if (addr !== bluetoothDevice.address)
93137             return;
93138
93139         bluetoothDevice.isConnected = isConnected;
93140         event.trigger("bt-device-connected-changed",
93141                 [bluetoothDevice.address, bluetoothDevice.isConnected]);
93142     });
93143
93144     event.on("bt-device-bonded-changed", function (addr, isBonded) {
93145         if (addr !== bluetoothDevice.address)
93146             return;
93147
93148         bluetoothDevice.isBonded = isBonded;
93149     });
93150
93151     _security = prop.metaData;
93152     self = this;
93153
93154     utils.forEach(bluetoothDevice.services, function (service) {
93155         bluetoothDevice.uuids.push(service.uuid);
93156         sockets[service.uuid] = new BluetoothSocket({
93157             uuid: service.uuid,
93158             protocol: service.protocol,
93159             state: "CLOSED",
93160             peer: self,
93161             metaData: _security
93162         });
93163     });
93164 };
93165
93166 module.exports = BluetoothDevice;
93167
93168 });
93169 define('ripple/platform/tizen/2.0/dbfs', function (require, exports, module) {
93170 /*
93171  *  Copyright 2011 Research In Motion Limited.
93172  *  Copyright 2012 Intel Corporation.
93173  *
93174  * Licensed under the Apache License, Version 2.0 (the "License");
93175  * you may not use this file except in compliance with the License.
93176  * You may obtain a copy of the License at
93177  *
93178  * http://www.apache.org/licenses/LICENSE-2.0
93179  *
93180  * Unless required by applicable law or agreed to in writing, software
93181  * distributed under the License is distributed on an "AS IS" BASIS,
93182  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
93183  * See the License for the specific language governing permissions and
93184  * limitations under the License.
93185  */
93186
93187 var db = require('ripple/db'),
93188     utils = require('ripple/utils'),
93189     _console = require('ripple/console'),
93190     _cache = {},
93191     _self;
93192
93193 function _get(path) {
93194     return path.replace(/^\//, '').split("/").reduce(function (obj, token) {
93195         return token === "" ? obj : ((obj && obj.children) ? obj.children[token] || null : null);
93196     }, _cache);
93197 }
93198
93199 function _getInfo(path) {
93200     var parent = ("/" + path.replace(/^\//, '').replace(/\/$/, '')).split("/"),
93201         name = parent.splice(parent.length - 1, 1).join("");
93202
93203     return {
93204         name: name,
93205         parent: parent.join("/") || "/"
93206     };
93207 }
93208
93209 function _set(path, obj) {
93210     var parent = _cache,
93211         tokens = path.replace(/^\//, '').split("/"),
93212         child = tokens.splice(tokens.length - 1, 1).join("");
93213
93214     tokens.forEach(function (token) {
93215         parent = parent.children[token];
93216     });
93217
93218     parent.children = parent.children || {};
93219     parent.children[child] = obj;
93220 }
93221
93222 function _delete(path) {
93223     var parent = _cache,
93224         tokens = path.replace(/^\//, '').split("/"),
93225         child = tokens.splice(tokens.length - 1, 1).join("");
93226
93227     tokens.forEach(function (token) {
93228         parent = parent.children[token];
93229     });
93230
93231     delete parent.children[child];
93232 }
93233
93234 function _save() {
93235     db.saveObject("tizen1-db-filesystem", _cache);
93236 }
93237
93238 function _walk(path, parent) {
93239     _self.ls(path, function (entries) {
93240         parent.children = parent.children || {};
93241
93242         entries.forEach(function (entry) {
93243             parent.children[entry.name] = entry;
93244
93245             if (entry.isDirectory) {
93246                 _walk(entry.fullPath, entry);
93247             } else {
93248                 /* after getting Date out of DB, Date will become
93249                    a string, so need to recast it back to Date */
93250                 if (entry.lastModifiedDate !== null && entry.lastModifiedDate !== undefined)
93251                     entry.lastModifiedDate = new Date(entry.lastModifiedDate);
93252                 if (entry.createdDate !== null && entry.createdDate !== undefined)
93253                     entry.createdDate = new Date(entry.createdDate);
93254
93255                 _self.read(entry.fullPath, function (data) {
93256                     parent.children[entry.name].data = data;
93257                 }, function (e) {
93258                     _console.error(e);
93259                 });
93260             }
93261         });
93262     }, function (e) {
93263         _console.error(e);
93264     });
93265 }
93266
93267 function _createPath(path) {
93268     var parts = path.replace(/^\//, '').split("/"),
93269         workflow = jWorkflow.order();
93270
93271     parts.forEach(function (part, index) {
93272         var dir = "/" + utils.copy(parts).splice(0, index + 1).join("/");
93273
93274         workflow.andThen(function (prev, baton) {
93275             baton.take();
93276             _self.mkdir(dir, baton.pass, baton.pass);
93277         });
93278     });
93279
93280     workflow.start();
93281 }
93282
93283 _self = {
93284     // The order is consistent with _virtualRoots in filesystem.js
93285     roots: ["/opt/documents", "/opt/images", "/opt/music", "/opt/videos", "/opt/downloads", "/home/user/appdata/simulatedapp/wgt-package", "/home/user/appdata/simulatedapp/wgt-private", "/home/user/appdata/simulatedapp/wgt-private-tmp", "/SDCard", "/opt/attachments"],
93286     initialize: function () {
93287         // TODO: Initialize at bootstrap and emulatorBridge.link
93288         _cache = db.retrieveObject("tizen1-db-filesystem") || {};
93289         // create real root paths if empty
93290         _self.roots.every(function (root) {
93291             _createPath(root);
93292             return true;
93293         });
93294         // build the file system cache so that we could access information synchronously
93295         _walk("/", _cache);
93296     },
93297     ls: function (path, success, error) {
93298         try {
93299             var dir = _get(path),
93300                 items = [];
93301
93302             if (dir) {
93303                 utils.forEach(dir.children, function (item) {
93304                     items.push(item);
93305                 });
93306             }
93307             else {
93308                 items = {};
93309             }
93310
93311             success(items);
93312         }
93313         catch (e) {
93314             e.code = 1;
93315             error(e);
93316         }
93317     },
93318     rm: function (path, success, error, options) {
93319         _delete(path);
93320         _save();
93321         success();
93322     },
93323     rmdir: function (path, success, error, options) {
93324         _delete(path);
93325         _save();
93326         success();
93327     },
93328     mkdir: function (path, success, error) {
93329         var entry = _get(path),
93330             info = _getInfo(path);
93331
93332         if (!entry) {
93333             _set(path, {
93334                 lastModifiedDate: new Date(),
93335                 createdDate: new Date(),
93336                 name: info.name,
93337                 isDirectory: true,
93338                 fullPath: path
93339             });
93340             entry = _get(path);
93341             _save();
93342         }
93343
93344         if (entry) {
93345             success(entry);
93346         }
93347         else {
93348             error({code: 1});
93349         }
93350     },
93351     mv: function (from, to, success, error) {
93352         try {
93353             var fromEntry = _get(from),
93354                 toInfo = _getInfo(to);
93355
93356             fromEntry.fullPath = to;
93357             fromEntry.name = toInfo.name;
93358
93359             _set(to, fromEntry);
93360             _delete(from);
93361             _save();
93362             success();
93363         }
93364         catch (e) {
93365             e.code = 1;
93366             error(e);
93367         }
93368     },
93369     touch: function (path, success, error) {
93370         var entry = _get(path),
93371             info  = _getInfo(path);
93372
93373         if (!entry) {
93374             _set(path, {
93375                 lastModifiedDate: new Date(),
93376                 createdDate: new Date(),
93377                 name: info.name,
93378                 isDirectory: false,
93379                 fullPath: path,
93380                 data: ""
93381             });
93382             entry = _get(path);
93383         }
93384         _save();
93385         success(entry);
93386     },
93387     cp: function (from, to, success, error) {
93388         try {
93389             var fromEntry = _get(from),
93390                 copied = utils.copy(fromEntry);
93391
93392             copied.name  = _getInfo(to).name;
93393             copied.fullPath = to;
93394             _set(to, copied);
93395             _save();
93396             success();
93397         }
93398         catch (e) {
93399             e.code = 1;
93400             error(e);
93401         }
93402     },
93403     stat: function (path, success, error) {
93404         var entry = _get(path);
93405
93406         if (entry) {
93407             success(entry);
93408         } else {
93409             error({code: 1});
93410         }
93411     },
93412     write: function (path, contents, success, error, options) {
93413         var entry = _get(path);
93414
93415         if (entry) {
93416             entry.lastModifiedDate = new Date();
93417             entry.data = contents;
93418             _save();
93419             success();
93420         } else {
93421             error({code: 1});
93422         }
93423
93424     },
93425     read: function (path, success, error) {
93426         var entry = _get(path);
93427
93428         if (entry) {
93429             success(utils.copy(entry.data));
93430         }
93431         else {
93432             error({code: 1});
93433         }
93434     }
93435 };
93436
93437 module.exports = _self;
93438
93439 });
93440 define('ripple/platform/tizen/2.0/spec/config', function (require, exports, module) {
93441 /*
93442  *  Copyright 2011 Research In Motion Limited.
93443  *  Copyright 2011 Intel Corporation.
93444  *
93445  * Licensed under the Apache License, Version 2.0 (the "License");
93446  * you may not use this file except in compliance with the License.
93447  * You may obtain a copy of the License at
93448  *
93449  * http://www.apache.org/licenses/LICENSE-2.0
93450  *
93451  * Unless required by applicable law or agreed to in writing, software
93452  * distributed under the License is distributed on an "AS IS" BASIS,
93453  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
93454  * See the License for the specific language governing permissions and
93455  * limitations under the License.
93456  */
93457 var utils = require('ripple/utils'),
93458     db = require('ripple/db'),
93459     constants = require('ripple/constants');
93460
93461 module.exports = {
93462     fileName: "config.xml",
93463     validateVersion: function (configValidationObject) {
93464         var valid = true;
93465         // no xmlns:JIL in wac 2.0 spec
93466         valid = !!configValidationObject.widget.validationResult[0].attributes.xmlns.valid;
93467
93468         return valid;
93469     },
93470     extractInfo: function (configValidationObject) {
93471         if (!configValidationObject) {
93472             return null;
93473         }
93474
93475         var widgetInfo = {},
93476             configFeatures,
93477             configPreferences,
93478             preferenceName,
93479             platform, rst, i, j,
93480             settingRst = {
93481                 'screen-orientation': 'portrait',
93482                 'context-menu': 'enable',
93483                 'background-support': 'disable',
93484                 encryption: 'disable',
93485                 'install-location': 'auto',
93486                 'hwkey-event': 'enable'
93487             };
93488
93489         widgetInfo.id = configValidationObject.widget.validationResult[0].attributes.id.value || "";
93490         widgetInfo.name = configValidationObject.widget.children.name.validationResult[0].value;
93491         widgetInfo.icon = configValidationObject.widget.children.icon.validationResult[0].attributes.src.value;
93492         widgetInfo.version = configValidationObject.widget.validationResult[0].attributes.version.value;
93493         if (configValidationObject.widget.children.application.validationResult[0].valid) {
93494             widgetInfo.tizenAppId = configValidationObject.widget.children.application.validationResult[0].attributes.id.value;
93495             widgetInfo.tizenPackageId = configValidationObject.widget.children.application.validationResult[0].attributes.package.value;
93496         }
93497
93498         widgetInfo.features = {};
93499
93500         if (configValidationObject.widget.children.setting.hasOwnProperty('validationResult') === true) {
93501             rst = configValidationObject.widget.children.setting.validationResult;
93502             // the first one has higher priority per platform implementation
93503             for (i = rst.length -1 ; i >= 0; i--) {
93504                 if (rst[i].valid === true) {
93505                     for (j in rst[i].attributes) {
93506                         if (rst[i].attributes[j].value !== undefined) {
93507                             settingRst[j] = rst[i].attributes[j].value;
93508                         }
93509                     }
93510                 }
93511             }
93512             db.save("layout", settingRst["screen-orientation"]);
93513         }
93514
93515         configFeatures = configValidationObject.widget.children.feature.validationResult;
93516         utils.forEach(configFeatures, function (f) {
93517             if (f.valid === true) {
93518                 var feature = {id: f.attributes.name.value,
93519                          required: f.attributes.required.valid};
93520                 widgetInfo.features[feature.id] = feature;
93521             }
93522         });
93523
93524         widgetInfo.preferences = {};
93525
93526         configPreferences = configValidationObject.widget.children.preference.validationResult;
93527
93528         platform = require('ripple/platform');
93529         utils.forEach(configPreferences, function (preference) {
93530             preferenceName = preference.attributes.name.value;
93531             if (preferenceName) {
93532                 widgetInfo.preferences[preferenceName] = {
93533                     "key": preferenceName,
93534                     "value": preference.attributes.value.value || "",
93535                     "readonly": preference.attributes.readonly.value === "true"
93536                 };
93537
93538                 db.save(preferenceName,
93539                         widgetInfo.preferences[preferenceName].value,
93540                         platform.getPersistencePrefix(widgetInfo.id));
93541             }
93542         });
93543
93544         return widgetInfo;
93545     },
93546     schema: {
93547         rootElement: "widget",
93548         widget: {
93549             nodeName: "widget",
93550             required: true,
93551             occurrence: 1,
93552             helpText: "\"widget\" element describes widget information in configuration documents and serves as a container for other elements. It must be used in the configuration document and may have the following child elments: name,description,icon,author,license,content,feature and preference.The \"widget\" element MAY have following attributes: id,version,height,width, defaultlocale, xml:lang and dir",
93553             attributes: {
93554                 xmlns: {
93555                     attributeName: "xmlns",
93556                     required: true,
93557                     type: "list",
93558                     listValues: ["http://www.w3.org/ns/widgets"]
93559                 },
93560                 "xmlns:tizen": {
93561                     attributeName: "xmlns:tizen",
93562                     required: false,
93563                     type: "list",
93564                     listValues: ["http://tizen.org/ns/widgets"]
93565                 },
93566                 "xml:lang": {
93567                     attributeName: "xml:lang",
93568                     required: false,
93569                     type: "iso-language"
93570                 },
93571                 dir: {
93572                     attributeName: "dir",
93573                     required: false,
93574                     type: "list",
93575                     listValues: ["ltr", "rtl", "lro", "rlo"]
93576                 },
93577                 id: {
93578                     attributeName: "id",
93579                     required: false,
93580                     type: "string"
93581                 },
93582                 version: {
93583                     attributeName: "version",
93584                     required: false,
93585                     type: "string"
93586                 },
93587                 height: {
93588                     attributeName: "height",
93589                     required: false,
93590                     type: "integer"
93591                 },
93592                 width: {
93593                     attributeName: "width",
93594                     required: false,
93595                     type: "integer"
93596                 },
93597                 viewmodes: {
93598                     attributeName: "viewmodes",
93599                     required: false,
93600                     type: "list",
93601                     listValues: ["windowed", "floating", "fullscreen", "maximized", "minimized"]
93602                 },
93603                 defaultlocale: {
93604                     attributeName: "defaultlocale",
93605                     required: false,
93606                     type: "iso-language"
93607                 }
93608             },
93609             children: {
93610                 name: {
93611                     nodeName: "name",
93612                     required: false,
93613                     occurrence: 0,
93614                     type: "string",
93615                     attributes: {
93616                         "xml:lang": {
93617                             attributeName: "xml:lang",
93618                             required: false,
93619                             type: "iso-language",
93620                             unique: true
93621                         },
93622                         dir: {
93623                             attributeName: "dir",
93624                             required: false,
93625                             type: "list",
93626                             listValues: ["ltr", "rtl", "lro", "rlo"]
93627                         },
93628                         "short": {
93629                             attributeName: "short",
93630                             required: false,
93631                             type: "string"
93632                         }
93633                     },
93634                     children: {
93635                         span: {
93636                             nodeName: "span",
93637                             required: false,
93638                             type: "string",
93639                             attributes: {
93640                                 "xml:lang": {
93641                                     attributeName: "xml:lang",
93642                                     required: false,
93643                                     type: "iso-language",
93644                                     unique: true
93645                                 },
93646                                 dir: {
93647                                     attributeName: "dir",
93648                                     required: false,
93649                                     type: "list",
93650                                     listValues: ["ltr", "rtl", "lro", "rlo"]
93651                                 }
93652                             }
93653                         }
93654                     }
93655                 },
93656                 description: {
93657                     nodeName: "description",
93658                     required: false,
93659                     occurrence: 0,
93660                     type: "string",
93661                     attributes: {
93662                         "xml:lang": {
93663                             attributeName: "xml:lang",
93664                             required: false,
93665                             type: "iso-language",
93666                             unique: true
93667                         },
93668                         dir: {
93669                             attributeName: "dir",
93670                             required: false,
93671                             type: "list",
93672                             listValues: ["ltr", "rtl", "lro", "rlo"]
93673                         }
93674                     },
93675                     children: {
93676                         span: {
93677                             nodeName: "span",
93678                             required: false,
93679                             type: "string",
93680                             attributes: {
93681                                 "xml:lang": {
93682                                     attributeName: "xml:lang",
93683                                     required: false,
93684                                     type: "iso-language",
93685                                     unique: true
93686                                 },
93687                                 dir: {
93688                                     attributeName: "dir",
93689                                     required: false,
93690                                     type: "list",
93691                                     listValues: ["ltr", "rtl", "lro", "rlo"]
93692                                 }
93693                             }
93694                         }
93695                     }
93696                 },
93697                 author: {
93698                     nodeName: "author",
93699                     required: false,
93700                     occurrence: 0,
93701                     type: "string",
93702                     attributes: {
93703                         "xml:lang": {
93704                             attributeName: "xml:lang",
93705                             required: false,
93706                             type: "iso-language"
93707                         },
93708                         dir: {
93709                             attributeName: "dir",
93710                             required: false,
93711                             type: "list",
93712                             listValues: ["ltr", "rtl", "lro", "rlo"]
93713                         },
93714                         href: {
93715                             attributeName: "href",
93716                             required: false,
93717                             type: "regex",
93718                             regex: constants.REGEX.URL
93719                         },
93720                         email: {
93721                             attributeName: "email",
93722                             required: false,
93723                             type: "regex",
93724                             regex: constants.REGEX.EMAIL
93725                         }
93726                     },
93727                     children: {
93728                         span: {
93729                             nodeName: "span",
93730                             required: false,
93731                             type: "string",
93732                             attributes: {
93733                                 "xml:lang": {
93734                                     attributeName: "xml:lang",
93735                                     required: false,
93736                                     type: "iso-language",
93737                                     unique: true
93738                                 },
93739                                 dir: {
93740                                     attributeName: "dir",
93741                                     required: false,
93742                                     type: "list",
93743                                     listValues: ["ltr", "rtl", "lro", "rlo"]
93744                                 }
93745                             }
93746                         }
93747                     }
93748                 },
93749                 license: {
93750                     nodeName: "license",
93751                     required: false,
93752                     occurrence: 0,
93753                     type: "string",
93754                     attributes: {
93755                         "xml:lang": {
93756                             attributeName: "xml:lang",
93757                             required: false,
93758                             type: "iso-language"
93759                         },
93760                         dir: {
93761                             attributeName: "dir",
93762                             required: false,
93763                             type: "list",
93764                             listValues: ["ltr", "rtl", "lro", "rlo"]
93765                         },
93766                         href: {
93767                             attributeName: "href",
93768                             type: "regex",
93769                             required: false,
93770                             regex: constants.REGEX.URL
93771                         }
93772                     },
93773                     children: {
93774                         span: {
93775                             nodeName: "span",
93776                             required: false,
93777                             type: "string",
93778                             attributes: {
93779                                 "xml:lang": {
93780                                     attributeName: "xml:lang",
93781                                     required: false,
93782                                     type: "iso-language",
93783                                     unique: true
93784                                 },
93785                                 dir: {
93786                                     attributeName: "dir",
93787                                     required: false,
93788                                     type: "list",
93789                                     listValues: ["ltr", "rtl", "lro", "rlo"]
93790                                 }
93791                             }
93792                         }
93793                     }
93794                 },
93795                 icon: {
93796                     nodeName: "icon",
93797                     required: false,
93798                     occurrence: 0,
93799                     attributes: {
93800                         "xml:lang": {
93801                             attributeName: "xml:lang",
93802                             required: false,
93803                             type: "iso-language"
93804                         },
93805                         dir: {
93806                             attributeName: "dir",
93807                             required: false,
93808                             type: "list",
93809                             listValues: ["ltr", "rtl", "lro", "rlo"]
93810                         },
93811                         src: {
93812                             attributeName: "src",
93813                             required: true,
93814                             type: "string"
93815                         },
93816                         width: {
93817                             attributeName: "width",
93818                             required: false,
93819                             type: "integer"
93820                         },
93821                         height: {
93822                             attributeName: "height",
93823                             required: false,
93824                             type: "integer"
93825                         }
93826                     }
93827                 },
93828                 content: {
93829                     nodeName: "content",
93830                     required: false,
93831                     occurrence: 1,
93832                     attributes: {
93833                         "xml:lang": {
93834                             attributeName: "xml:lang",
93835                             required: false,
93836                             type: "iso-language",
93837                             unique: true
93838                         },
93839                         dir: {
93840                             attributeName: "dir",
93841                             required: false,
93842                             type: "list",
93843                             listValues: ["ltr", "rtl", "lro", "rlo"]
93844                         },
93845                         src: {
93846                             attributeName: "src",
93847                             required: true,
93848                             type: "string"
93849                         },
93850                         encoding: {
93851                             attributeName: "encoding",
93852                             required: false,
93853                             type: "string"
93854                         },
93855                         type: {
93856                             attributeName: "type",
93857                             required: false,
93858                             type: "string"
93859                         }
93860                     }
93861                 },
93862                 setting: {
93863                     nodeName: "tizen:setting",
93864                     required: false,
93865                     occurrence: 0,
93866                     attributes: {
93867                         'screen-orientation': {
93868                             attributeName: "screen-orientation",
93869                             required: false,
93870                             type: "list",
93871                             listValues: ['portrait', 'landscape', 'auto']
93872                         },
93873                         'context-menu': {
93874                             attributeName: "context-menu",
93875                             required: false,
93876                             type: "list",
93877                             listValues: ['enable', 'disable']
93878                         },
93879                         'background-support': {
93880                             attributeName: "background-support",
93881                             required: false,
93882                             type: "list",
93883                             listValues: ['enable', 'disable']
93884                         },
93885                         'encryption': {
93886                             attributeName: "encryption",
93887                             required: false,
93888                             type: "list",
93889                             listValues: ['enable', 'disable']
93890                         },
93891                         'install-location': {
93892                             attributeName: "install-location",
93893                             required: false,
93894                             type: "list",
93895                             listValues: ['auto', 'internal-only', 'perfer-external']
93896                         },
93897                         'hwkey-event': {
93898                             attributeName: "hwkey-event",
93899                             required: false,
93900                             type: "list",
93901                             listValues: ['enable', 'disable']
93902                         }
93903                     }
93904                 },
93905                 application: {
93906                     nodeName: "tizen:application",
93907                     required: true,
93908                     occurrence: 1,
93909                     attributes: {
93910                         id: {
93911                             attributeName: "id",
93912                             required: true,
93913                             type: "string"
93914                         },
93915                         required_version: {
93916                             attributeName: "required_version",
93917                             required: true,
93918                             type: "list",
93919                             listValues: ['1.0', '2.0', '2.1', '2.2']
93920                         },
93921                         package: {
93922                             attributeName: "package",
93923                             required: false,
93924                             type: "string"
93925                         }
93926                     }
93927                 },
93928                 "tizen:content": {
93929                     nodeName: "tizen:content",
93930                     required: false,
93931                     occurrence: 1,
93932                     attributes: {
93933                         src: {
93934                             attributeName: "src",
93935                             required: true,
93936                             type: "string"
93937                         }
93938                     }
93939                 },
93940                 control: {
93941                     nodeName: "tizen:app-control",
93942                     required: false,
93943                     occurrence: 0,
93944                     children: {
93945                         src: {
93946                             nodeName: "tizen:src",
93947                             required: true,
93948                             occurence: 0,
93949                             attributes: {
93950                                 name: {
93951                                     attributeName: "name",
93952                                     required: false,
93953                                     type: "string"
93954                                 }
93955                             }
93956                         },
93957                         operation: {
93958                             nodeName: "tizen:operation",
93959                             required: true,
93960                             occurence: 0,
93961                             attributes: {
93962                                 name: {
93963                                     attributeName: "name",
93964                                     required: false,
93965                                     type: "string"
93966                                 }
93967                             }
93968                         },
93969                         uri: {
93970                             nodeName: "tizen:uri",
93971                             required: false,
93972                             occurence: 0,
93973                             attributes: {
93974                                 name: {
93975                                     attributeName: "name",
93976                                     required: false,
93977                                     type: "string"
93978                                 }
93979                             }
93980                         },
93981                         mime: {
93982                             nodeName: "tizen:mime",
93983                             required: false,
93984                             occurence: 0,
93985                             attributes: {
93986                                 name: {
93987                                     attributeName: "name",
93988                                     required: false,
93989                                     type: "string"
93990                                 }
93991                             }
93992                         }
93993                     }
93994                 },
93995                 "app-widget": {
93996                     nodeName: "tizen:app-widget",
93997                     required: false,
93998                     occurrence: 0,
93999                     attributes: {
94000                         id: {
94001                             attributeName: "id",
94002                             required: true,
94003                             type: "string"
94004                         },
94005                         primary: {
94006                             attributeName: "primary",
94007                             required: true,
94008                             type: "list",
94009                             listValues: ['true', 'false']
94010                         },
94011                         "auto-launch": {
94012                             attributeName: "auto-launch",
94013                             required: false,
94014                             type: "list",
94015                             listValues: ['true', 'false']
94016                         },
94017                         "update-period": {
94018                             attributeName: "update-period",
94019                             required: false,
94020                             type: "integer"
94021                         }
94022                     },
94023                     children: {
94024                         "box-label": {
94025                             nodeName: "tizen:box-label",
94026                             required: true,
94027                             occurence: 1
94028                         },
94029                         "box-icon": {
94030                             nodeName: "tizen:box-icon",
94031                             required: true,
94032                             occurence: 1,
94033                             attributes: {
94034                                 src: {
94035                                     attributeName: "src",
94036                                     required: true,
94037                                     type: "string"
94038                                 }
94039                             }
94040                         },
94041                         "box-content": {
94042                             nodeName: "tizen:box-content",
94043                             required: true,
94044                             occurence: 1,
94045                             attributes: {
94046                                 src: {
94047                                     attributeName: "src",
94048                                     required: true,
94049                                     type: "string"
94050                                 },
94051                                 "mouse-event": {
94052                                     attributeName: "mouse-event",
94053                                     required: false,
94054                                     type: "string"
94055                                 },
94056                                 "touch-event": {
94057                                     attributeName: "touch-event",
94058                                     required: false,
94059                                     type: "string"
94060                                 }
94061                             },
94062                             children: {
94063                                 "box-size": {
94064                                     nodeName: "tizen:box-size",
94065                                     required: false,
94066                                     occurence: 1,
94067                                     attributes: {
94068                                         "preview": {
94069                                             attributeName: "preview",
94070                                             required: false,
94071                                             type: "string"
94072                                         }
94073                                     }
94074                                 },
94075                                 pd: {
94076                                     nodeName: "tizen:pd",
94077                                     required: false,
94078                                     occurence: 1,
94079                                     attributes: {
94080                                         "src": {
94081                                             attributeName: "src",
94082                                             required: true,
94083                                             type: "string"
94084                                         },
94085                                         "width": {
94086                                             attributeName: "width",
94087                                             required: true,
94088                                             type: "integer"
94089                                         },
94090                                         "height": {
94091                                             attributeName: "height",
94092                                             required: true,
94093                                             type: "integer"
94094                                         }
94095                                     }
94096                                 }
94097                             }
94098                         }
94099                     }
94100                 },
94101                 account: {
94102                     nodeName: "tizen:account",
94103                     required: false,
94104                     occurrence: 0,
94105                     attributes: {
94106                         "multiple-account-support": {
94107                             attributeName: "multiple-account-support",
94108                             required: true,
94109                             type: "list",
94110                             listValues: ['true', 'false']
94111                         }
94112                     },
94113                     children: {
94114                         icon: {
94115                             nodeName: "tizen:icon",
94116                             required: false,
94117                             occurence: 1,
94118                             attributes: {
94119                                 section: {
94120                                     attributeName: "section",
94121                                     required: true,
94122                                     type: "string"
94123                                 }
94124                             }
94125                         },
94126                         "display-name": {
94127                             nodeName: "tizen:display-name",
94128                             required: false,
94129                             occurence: 1,
94130                             attributes: {
94131                                 "xml:lang": {
94132                                     attributeName: "xml:lang",
94133                                     required: false,
94134                                     type: "string"
94135                                 }
94136                             }
94137                         },
94138                         capability: {
94139                             nodeName: "capability",
94140                             required: false,
94141                             occurence: 1
94142                         }
94143                     }
94144                 },
94145                 feature: {
94146                     nodeName: "tizen:privilege",
94147                     required: false,
94148                     occurrence: 0,
94149                     attributes: {
94150                         "xml:lang": {
94151                             attributeName: "xml:lang",
94152                             required: false,
94153                             type: "iso-language"
94154                         },
94155                         dir: {
94156                             attributeName: "dir",
94157                             required: false,
94158                             type: "list",
94159                             listValues: ["ltr", "rtl", "lro", "rlo"]
94160                         },
94161                         name: {
94162                             attributeName: "name",
94163                             required: true,
94164                             type: "list",
94165                             listValues: ["http://www.w3.org/TR/battery-status/",
94166                                          "http://www.w3.org/TR/geolocation-API/",
94167                                          "http://www.w3.org/TR/touch-events/",
94168                                          "http://www.w3.org/TR/vibration/",
94169                                          "http://tizen.org/privilege/tizen",
94170                                          "http://tizen.org/privilege/alarm",
94171                                          "http://tizen.org/privilege/application.launch",
94172                                          "http://tizen.org/privilege/appmanager.kill", "http://tizen.org/privilege/appmanager.certificate",
94173                                          "http://tizen.org/privilege/bluetoothmanager", "http://tizen.org/privilege/bluetooth.admin",
94174                                          "http://tizen.org/privilege/bluetooth.gap", "http://tizen.org/privilege/bluetooth.spp",
94175                                          "http://tizen.org/privilege/bookmark.read", "http://tizen.org/privilege/bookmark.write",
94176                                          "http://tizen.org/privilege/calendar.read", "http://tizen.org/privilege/calendar.write",
94177                                          "http://tizen.org/privilege/callhistory.read", "http://tizen.org/privilege/callhistory.write",
94178                                          "http://tizen.org/privilege/contact.read", "http://tizen.org/privilege/contact.write",
94179                                          "http://tizen.org/privilege/content.read", "http://tizen.org/privilege/content.write",
94180                                          "http://tizen.org/privilege/datacontrol.consumer",
94181                                          "http://tizen.org/privilege/datasync",
94182                                          "http://tizen.org/privilege/download",
94183                                          "http://tizen.org/privilege/filesystem.read", "http://tizen.org/privilege/filesystem.write",
94184                                          "http://tizen.org/privilege/messaging.read", "http://tizen.org/privilege/messaging.write",
94185                                          "http://tizen.org/privilege/networkbearerselection",
94186                                          "http://tizen.org/privilege/nfc.common", "http://tizen.org/privilege/nfc.admin",
94187                                          "http://tizen.org/privilege/nfc.tag", "http://tizen.org/privilege/nfc.p2p",
94188                                          "http://tizen.org/privilege/notification",
94189                                          "http://tizen.org/privilege/packagemanager.install", "http://tizen.org/privilege/package.info",
94190                                          "http://tizen.org/privilege/power",
94191                                          "http://tizen.org/privilege/push",
94192                                          "http://tizen.org/privilege/secureelement",
94193                                          "http://tizen.org/privilege/setting",
94194                                          "http://tizen.org/privilege/system", "http://tizen.org/privilege/systemmanager",
94195                                          "http://tizen.org/privilege/time",
94196                                          "http://tizen.org/privilege/websetting"]
94197                         },
94198                         required: {
94199                             attributeName: "required",
94200                             type: "boolean",
94201                             required: false
94202                         }
94203                     },
94204                     children: {
94205                         param: {
94206                             nodeName: "param",
94207                             required: false,
94208                             occurrence: 0,
94209                             attributes: {
94210                                 "xml:lang": {
94211                                     attributeName: "xml:lang",
94212                                     required: false,
94213                                     type: "iso-language"
94214                                 },
94215                                 dir: {
94216                                     attributeName: "dir",
94217                                     required: false,
94218                                     type: "list",
94219                                     listValues: ["ltr", "rtl", "lro", "rlo"]
94220                                 },
94221                                 name: {
94222                                     attributeName: "name",
94223                                     required: true,
94224                                     type: "string"
94225                                 },
94226                                 value: {
94227                                     attributeName: "value",
94228                                     required: true,
94229                                     type: "string"
94230                                 }
94231                             }
94232                         }
94233                     }
94234                 },
94235                 preference: {
94236                     nodeName: "preference",
94237                     required: false,
94238                     occurrence: 0,
94239                     attributes: {
94240                         "xml:lang": {
94241                             attributeName: "xml:lang",
94242                             required: false,
94243                             type: "iso-language"
94244                         },
94245                         dir: {
94246                             attributeName: "dir",
94247                             required: false,
94248                             type: "list",
94249                             listValues: ["ltr", "rtl", "lro", "rlo"]
94250                         },
94251                         name: {
94252                             attributeName: "name",
94253                             required: true,
94254                             type: "string"
94255                         },
94256                         value: {
94257                             type: "string",
94258                             required: false,
94259                             attributeName: "value"
94260                         },
94261                         readonly: {
94262                             attributeName: "readonly",
94263                             type: "boolean",
94264                             required: false
94265                         }
94266                     }
94267                 }
94268             }
94269         }
94270     }
94271 };
94272
94273 });
94274 define('ripple/platform/tizen/2.0/spec/device', function (require, exports, module) {
94275 /*
94276  *  Copyright 2011 Intel Corporation.
94277  *
94278  * Licensed under the Apache License, Version 2.0 (the "License");
94279  * you may not use this file except in compliance with the License.
94280  * You may obtain a copy of the License at
94281  *
94282  * http://www.apache.org/licenses/LICENSE-2.0
94283  *
94284  * Unless required by applicable law or agreed to in writing, software
94285  * distributed under the License is distributed on an "AS IS" BASIS,
94286  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
94287  * See the License for the specific language governing permissions and
94288  * limitations under the License.
94289  */
94290 var event = require('ripple/event'),
94291     utils = require('ripple/utils'),
94292     StorageTypeTable = {
94293         "UNKNOWN": "UNKNOWN",
94294         "INTERNAL": "INTERNAL",
94295         "MMC": "MMC",
94296         "USB_HOST": "USB_HOST"
94297     },
94298     NetworkTypeTable = {
94299         "NONE": "NONE",
94300         "2G": "2G",
94301         "2.5G": "2.5G",
94302         "3G": "3G",
94303         "4G": "4G",
94304         "WIFI": "WIFI",
94305         "ETHERNET": "ETHERNET",
94306         "UNKNOWN": "UNKNOWN"
94307     },
94308     LocaleTable = {
94309         "eng_USA": "eng_USA",
94310         "eng_CAN": "eng_CAN",
94311         "deu_DEU": "deu_DEU",
94312         "jpn_JPN": "jpn_JPN",
94313         "zho_CHN": "zho_CHN",
94314         "UNKNOWN": "UNKNOWN"
94315     },
94316     SimStateTable = {
94317         "ABSENT": "ABSENT",
94318         "INITIALIZING": "INITIALIZING",
94319         "READY": "READY",
94320         "PIN_REQUIRED": "PIN_REQUIRED",
94321         "PUK_REQUIRED":"PUK_REQUIRED",
94322         "NETWORK_LOCKED": "NETWORK_LOCKED",
94323         "SIM_LOCKED": "SIM_LOCKED",
94324         "UNKNOWN": "UNKNOWN"
94325     };
94326
94327 function deviceStatusEventTrigger(setting) {
94328     event.trigger("DeviceStatusChanged", [setting]);
94329 }
94330
94331 module.exports = {
94332     "Config": {
94333         "vibratingMode": {
94334             "name": "Vibrator",
94335             "control": {
94336                 "type": "checkbox",
94337                 "value": true
94338             },
94339             "callback": function (setting) {
94340                 event.trigger("VibratingModeChanged", [setting]);
94341             }
94342         },
94343         "lockScreen": {
94344             "name": "Lock Screen",
94345             "control": {
94346                 "type": "checkbox",
94347                 "value": false
94348             },
94349             "callback": function (setting) {
94350                 event.trigger("LockScreenChanged", [setting]);
94351             }
94352         }
94353     },
94354     "DEVICE_ORIENTATION": {
94355         "status": {
94356             "name": "Status",
94357             "control": {
94358                 "type": "label",
94359                 "innertext": "PORTRAIT_PRIMARY",
94360                 "value": "PORTRAIT_PRIMARY"
94361             },
94362             "event": "LayoutChanged"
94363         },
94364         "isAutoRotation": {
94365             "name": "Is Auto Rotation",
94366             "control": {
94367                 "type": "label",
94368                 "value": false
94369             }
94370         }
94371     },
94372     "CPU": {
94373         "load": {
94374             "name": "Load",
94375             "control": {
94376                 "type": "number",
94377                 "value": 0.1
94378             },
94379             "event": "CpuLoadChanged",
94380             "callback": function (setting) {
94381                 if (setting > 1) setting = 1;
94382                 if (setting < 0) setting = 0;
94383                 event.trigger("CpuLoadChanged", [setting]);
94384             }
94385         }
94386     },
94387     "STORAGE": {
94388         "type": {
94389             "name": "Type",
94390             "control": {
94391                 "type": "select",
94392                 "value": StorageTypeTable["INTERNAL"]
94393             },
94394             "options": (function () {
94395                 var optionList = {};
94396                 utils.forEach(StorageTypeTable, function (key, value) {
94397                     optionList[key] = StorageTypeTable[value];
94398                 });
94399
94400                 return optionList;
94401             }())
94402         },
94403         "capacity": {
94404             "name": "Capacity(bytes)",
94405             "control": {
94406                 "type": "label",
94407                 "value": 16000000000
94408             },
94409         },
94410         "availableCapacity": {
94411             "name": "AvailableCapacity(bytes)",
94412             "control": {
94413                 "type": "number",
94414                 "value": 12000000000
94415             },
94416             "callback": function (setting) {
94417                 event.trigger("AvailCapacityChanged", [setting]);
94418             }
94419         },
94420         "isRemovable": {
94421             "name": "IsRemovable",
94422             "control": {
94423                 "type": "checkbox",
94424                 "value": true
94425             }
94426         }
94427     },
94428     "BUILD": {
94429         "model": {
94430             "name": "Model",
94431             "control": {
94432                 "type": "label",
94433                 "innertext": "tizen-2.2 build",
94434                 "value": "tizen-2.2 build"
94435             }
94436         },
94437         "manufacturer": {
94438             "name": "Manufacturer",
94439             "control": {
94440                 "type": "label",
94441                 "innertext": "Tizen",
94442                 "value": "Tizen"
94443             }
94444         },
94445         "buildVersion": {
94446             "name": "Build Version",
94447             "control": {
94448                 "type": "label",
94449                 "innertext": "TIZEN_WEB_SIMULATOR_000001",
94450                 "value": "TIZEN_WEB_SIMULATOR_000001"
94451             }
94452         }
94453     },
94454     "LOCALE": {
94455         "language": {
94456             "name": "Language",
94457             "control": {
94458                 "type": "select",
94459                 "value": LocaleTable["eng_USA"]
94460             },
94461             "options": (function () {
94462                 var optionList = {};
94463                 utils.forEach(LocaleTable, function (key, value) {
94464                     optionList[key] = LocaleTable[value];
94465                 });
94466
94467                 return optionList;
94468             }())
94469         },
94470         "country": {
94471             "name": "Country",
94472             "control": {
94473                 "type": "select",
94474                 "value": LocaleTable["eng_USA"]
94475             },
94476             "options": (function () {
94477                 var optionList = {};
94478                 utils.forEach(LocaleTable, function (key, value) {
94479                     optionList[key] = LocaleTable[value];
94480                 });
94481
94482                 return optionList;
94483             }())
94484         }
94485     },
94486     "DISPLAY": {
94487         "resolutionWidth": {
94488             "name": "Resolution Width(pixels)",
94489             "control": {
94490                 "type": "label",
94491                 "value": 0
94492             }
94493         },
94494         "resolutionHeight": {
94495             "name": "Resolution Height(pixels)",
94496             "control": {
94497                 "type": "label",
94498                 "value": 0
94499             }
94500         },
94501         "dotsPerInchWidth": {
94502             "name": "DPI-X",
94503             "control": {
94504                 "type": "label",
94505                 "value": 0
94506             }
94507         },
94508         "dotsPerInchHeight": {
94509             "name": "DPI-Y",
94510             "control": {
94511                 "type": "label",
94512                 "value": 0
94513             }
94514         },
94515         "physicalWidth": {
94516             "name": "Physical Width(millimeters)",
94517             "control": {
94518                 "type": "label",
94519                 "value": 0
94520             }
94521         },
94522         "physicalHeight": {
94523             "name": "Physical Height(millimeters)",
94524             "control": {
94525                 "type": "label",
94526                 "value": 0
94527             }
94528         },
94529         "brightness": {
94530             "name": "Brightness",
94531             "control": {
94532                 "type": "number",
94533                 "value": 1
94534             },
94535             "event": "DisplayBrightnessChanged",
94536             "callback": function (setting) {
94537                 if (setting > 1) setting = 1;
94538                 if (setting < 0) setting = 0;
94539                 event.trigger("DisplayBrightnessChanged", [setting]);
94540             }
94541         }
94542     },
94543     "NETWORK": {
94544         "networkType": {
94545             "name": "Network Type",
94546             "control" : {
94547                 "type": "select",
94548                 "value": NetworkTypeTable["NONE"]
94549             },
94550             "options": (function () {
94551                 var optionList = {};
94552                 utils.forEach(NetworkTypeTable, function (key, value) {
94553                     optionList[key] = NetworkTypeTable[value];
94554                 });
94555
94556                 return optionList;
94557             }())
94558         }
94559     },
94560     "WIFI_NETWORK": {
94561         "status": {
94562             "name": "Status",
94563             "control": {
94564                 "type": "checkbox",
94565                 "value": false
94566             },
94567             "event": "WiFiNetworkStatusChanged",
94568             "callback": function (setting) {
94569                 event.trigger("WiFiNetworkStatusChanged", [setting]);
94570             }
94571         },
94572         "ssid": {
94573             "name": "SSID",
94574             "control": {
94575                 "type": "text",
94576                 "value": "Tizen WiFi"
94577             }
94578         },
94579         "ipAddress": {
94580             "name": "IP Address",
94581             "control": {
94582                 "type": "text",
94583                 "value": "192.168.0.1"
94584             }
94585         },
94586         "ipv6Address": {
94587             "name": "IPv6 Address",
94588             "control": {
94589                 "type": "text",
94590                 "value": "2001:db8:85a3:0:0:0:70:7334"
94591             }
94592         },
94593         "signalStrength": {
94594             "name": "Signal Strength",
94595             "control": {
94596                 "type": "select",
94597                 "value": 0
94598             },
94599             "options": (function () {
94600                 var i,
94601                     optionList = {};
94602
94603                 for (i = 0; i <= 10; i++) {
94604                     optionList[i] = i;
94605                 }
94606
94607                 return optionList;
94608             }())
94609         }
94610     },
94611     "CELLULAR_NETWORK": {
94612         "status": {
94613             "name": "Status",
94614             "control": {
94615                 "type": "checkbox",
94616                 "value": true
94617             },
94618             "event": "CellularNetworkStatusChanged",
94619             "callback": function (setting) {
94620                 event.trigger("CellularNetworkStatusChanged", [setting]);
94621             }
94622         },
94623         "apn": {
94624             "name": "APN",
94625             "control": {
94626                 "type": "text",
94627                 "value": "Tizen"
94628             }
94629         },
94630         "ipAddress": {
94631             "name": "IP Address",
94632             "control": {
94633                 "type": "text",
94634                 "value": "10.0.2.16"
94635             }
94636         },
94637         "ipv6Address": {
94638             "name": "IPv6 Address",
94639             "control": {
94640                 "type": "text",
94641                 "value": "2001:db8:85a3:0:0:0:70:7334"
94642             }
94643         },
94644         "mcc": {
94645             "name": "MCC",
94646             "control": {
94647                 "type": "number",
94648                 "value": 460
94649             }
94650         },
94651         "mnc": {
94652             "name": "MNC",
94653             "control": {
94654                 "type": "number",
94655                 "value": 0
94656             }
94657         },
94658         "cellId": {
94659             "name": "Cell ID",
94660             "control": {
94661                 "type": "number",
94662                 "value": 0
94663             }
94664         },
94665         "lac": {
94666             "name": "LAC",
94667             "control": {
94668                 "type": "number",
94669                 "value": 0
94670             }
94671         },
94672         "isRoaming": {
94673             "name": "Roaming",
94674             "control": {
94675                 "type": "checkbox",
94676                 "value": true
94677             }
94678         },
94679         "isFlightMode": {
94680             "name": "Flight Mode",
94681             "control": {
94682                 "type": "checkbox",
94683                 "value": false
94684             },
94685             "callback": function (setting) {
94686                 event.trigger("FlightModeChanged", [setting]);
94687             }
94688         },
94689         "imei": {
94690             "name": "IMEI",
94691             "control": {
94692                 "type": "text",
94693                 "value": "012417005203000"
94694             }
94695         }
94696     },
94697     "SIM": {
94698         "state": {
94699             "name": "State",
94700             "control": {
94701                 "type": "select",
94702                 "value": SimStateTable["READY"]
94703             },
94704             "options": (function () {
94705                 var optionList = {};
94706                 utils.forEach(SimStateTable, function (key, value) {
94707                     optionList[key] = SimStateTable[value];
94708                 });
94709
94710                 return optionList;
94711             }())
94712         },
94713         "operatorName": {
94714             "name": "Operator Name",
94715             "control": {
94716                 "type": "text",
94717                 "value": "Tizen"
94718             }
94719         },
94720         "msisdn": {
94721             "name": "MSISDN",
94722             "control": {
94723                 "type": "text",
94724                 "value": "088123456789"
94725             }
94726         },
94727         "iccid": {
94728             "name": "ICCID",
94729             "control": {
94730                 "type": "text",
94731                 "value": "123000MFSSYYGXXXXXXP"
94732             }
94733         },
94734         "mcc": {
94735             "name": "MCC",
94736             "control": {
94737                 "type": "number",
94738                 "value": 460
94739             }
94740         },
94741         "mnc": {
94742             "name": "MNC",
94743             "control": {
94744                 "type": "number",
94745                 "value": 0
94746             }
94747         },
94748         "msin": {
94749             "name": "MSIN",
94750             "control": {
94751                 "type": "text",
94752                 "value": "H1 H2 H3 S 12345"
94753             }
94754         },
94755         "spn": {
94756             "name": "SPN",
94757             "control": {
94758                 "type": "text",
94759                 "value": "TizenSPN"
94760             }
94761         }
94762     },
94763     "PERIPHERAL": {
94764         "isVideoOutputOn": {
94765             "name": "Video Output",
94766             "control": {
94767                 "type": "checkbox",
94768                 "value": false
94769             }
94770         }
94771     }
94772 };
94773
94774
94775 });
94776 define('ripple/platform/tizen/2.0/spec/sensor', function (require, exports, module) {
94777 /*
94778  *  Copyright 2012 Intel Corporation.
94779  *
94780  * Licensed under the Apache License, Version 2.0 (the "License");
94781  * you may not use this file except in compliance with the License.
94782  * You may obtain a copy of the License at
94783  *
94784  * http://www.apache.org/licenses/LICENSE-2.0
94785  *
94786  * Unless required by applicable law or agreed to in writing, software
94787  * distributed under the License is distributed on an "AS IS" BASIS,
94788  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
94789  * See the License for the specific language governing permissions and
94790  * limitations under the License.
94791  */
94792 var event = require('ripple/event');
94793
94794 function sensorStatusEventTrigger(setting) {
94795     event.trigger("SensorStatusChanged", [setting]);
94796 }
94797
94798 module.exports = {
94799     "Accelerometer": {
94800         "resolution": 0.039239998906850815,
94801         "minDelay": 20,
94802         "range": 20.051639556884766,
94803         "name": "Accelerometer",
94804         "type": "Accelerometer"
94805     },
94806     "MagneticField": {
94807         "x": {
94808             "name": "X",
94809             "control": {
94810                 "type": "range",
94811                 "value": 100.0000000000000000,
94812                 "min": 0.0000000000000000,
94813                 "max": 200.0000000000000000,
94814                 "step": 0.0000000000000001
94815             },
94816             "callback": function (setting) {
94817                 event.trigger("MagneticField-xChanged", [setting]);
94818             }
94819         },
94820
94821         "y": {
94822             "name": "Y",
94823             "control": {
94824                 "type": "range",
94825                 "value": 100.0000000000000000,
94826                 "min": 0.0000000000000000,
94827                 "max": 200.0000000000000000,
94828                 "step": 0.0000000000000001
94829             },
94830             "callback": function (setting) {
94831                 event.trigger("MagneticField-yChanged", [setting]);
94832             }
94833         },
94834
94835         "z": {
94836             "name": "Z",
94837             "control": {
94838                 "type": "range",
94839                 "value": 100.0000000000000000,
94840                 "min": 0.0000000000000000,
94841                 "max": 200.0000000000000000,
94842                 "step": 0.0000000000000001
94843             },
94844             "callback": function (setting) {
94845                 event.trigger("MagneticField-zChanged", [setting]);
94846             }
94847         },
94848
94849         "resolution": 1,
94850         "minDelay": 20,
94851         "range": 359,
94852         "name": "MagneticField",
94853         "type": "MagneticField"
94854     },
94855     "Rotation": {
94856         "resolution": 1,
94857         "minDelay": 20,
94858         "range": 359,
94859         "name": "Rotation",
94860         "type": "Rotation"
94861     },
94862     "Orientation": {
94863         "resolution": 1,
94864         "minDelay": 20,
94865         "range": 359,
94866         "name": "Orientation",
94867         "type": "Orientation"
94868     }
94869 };
94870
94871 });
94872 define('ripple/platform/tizen/2.0/spec/ui', function (require, exports, module) {
94873 /*
94874  *  Copyright 2011 Intel Corporation.
94875  *
94876  * Licensed under the Apache License, Version 2.0 (the "License");
94877  * you may not use this file except in compliance with the License.
94878  * You may obtain a copy of the License at
94879  *
94880  * http://www.apache.org/licenses/LICENSE-2.0
94881  *
94882  * Unless required by applicable law or agreed to in writing, software
94883  * distributed under the License is distributed on an "AS IS" BASIS,
94884  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
94885  * See the License for the specific language governing permissions and
94886  * limitations under the License.
94887  */
94888 module.exports = {
94889     plugins: [
94890         "sensors",
94891         "communication",
94892         "geoView",
94893         "widgetConfig",
94894         "deviceSettings",
94895         "application",
94896         "network",
94897         "power",
94898         "download",
94899         "notifications",
94900         "package",
94901         "messagePort",
94902         "secureElement"
94903     ]
94904 };
94905
94906 });
94907 define('ripple/platform/tizen/2.0/AlarmBase', function (require, exports, module) {
94908 /*
94909  *  Copyright 2012 Intel Corporation.
94910  *
94911  * Licensed under the Apache License, Version 2.0 (the "License");
94912  * you may not use this file except in compliance with the License.
94913  * You may obtain a copy of the License at
94914  *
94915  * http://www.apache.org/licenses/LICENSE-2.0
94916  *
94917  * Unless required by applicable law or agreed to in writing, software
94918  * distributed under the License is distributed on an "AS IS" BASIS,
94919  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
94920  * See the License for the specific language governing permissions and
94921  * limitations under the License.
94922  */
94923
94924 module.exports = function (self) {
94925     self = self || this;
94926
94927     self.__defineGetter__("id", function () {
94928         return null;
94929     });
94930 };
94931
94932 });
94933 define('ripple/platform/tizen/2.0/CalendarRecurrenceRule', function (require, exports, module) {
94934 /*
94935  *  Copyright 2013 Intel Corporation.
94936  *
94937  * Licensed under the Apache License, Version 2.0 (the "License");
94938  * you may not use this file except in compliance with the License.
94939  * You may obtain a copy of the License at
94940  *
94941  * http://www.apache.org/licenses/LICENSE-2.0
94942  *
94943  * Unless required by applicable law or agreed to in writing, software
94944  * distributed under the License is distributed on an "AS IS" BASIS,
94945  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
94946  * See the License for the specific language governing permissions and
94947  * limitations under the License.
94948  */
94949
94950 var t = require('ripple/platform/tizen/2.0/typecast'),
94951     CalendarRecurrenceRule;
94952
94953 CalendarRecurrenceRule = function (frequency, ruleInitDict) {
94954     var calendarRecurrenceRule = {}, attr;
94955
94956     t.CalendarRecurrenceRule(arguments, this);
94957
94958     calendarRecurrenceRule.frequency       = frequency;
94959     calendarRecurrenceRule.interval        = 1;
94960     calendarRecurrenceRule.untilDate       = null;
94961     calendarRecurrenceRule.occurrenceCount = -1;
94962     calendarRecurrenceRule.daysOfTheWeek   = [];
94963     calendarRecurrenceRule.setPositions    = [];
94964     calendarRecurrenceRule.exceptions      = [];
94965
94966     if (ruleInitDict) {
94967         for (attr in ruleInitDict) {
94968             switch (attr) {
94969             case "daysOfTheWeek":
94970                 calendarRecurrenceRule.daysOfTheWeek = t.ByDayValue(
94971                         ruleInitDict.daysOfTheWeek, "[]+");
94972                 break;
94973
94974             case "setPositions":
94975                 calendarRecurrenceRule.setPositions = t.short(
94976                         ruleInitDict.setPositions, "[]+");
94977                 break;
94978
94979             case "exceptions":
94980                 calendarRecurrenceRule.exceptions = t.TZDate(
94981                         ruleInitDict.exceptions, "[]+");
94982                 break;
94983
94984             default:
94985                 calendarRecurrenceRule[attr] = ruleInitDict[attr];
94986                 break;
94987             }
94988         }
94989     }
94990
94991     this.__defineGetter__("frequency", function () {
94992         return calendarRecurrenceRule.frequency;
94993     });
94994     this.__defineSetter__("frequency", function (val) {
94995         try {
94996             calendarRecurrenceRule.frequency = t.RecurrenceRuleFrequency(val);
94997         } catch (e) {
94998         }
94999     });
95000
95001     this.__defineGetter__("interval", function () {
95002         return calendarRecurrenceRule.interval;
95003     });
95004     this.__defineSetter__("interval", function (val) {
95005         try {
95006             calendarRecurrenceRule.interval = t.unsigned_short(val);
95007         } catch (e) {
95008         }
95009     });
95010
95011     this.__defineGetter__("untilDate", function () {
95012         return calendarRecurrenceRule.untilDate;
95013     });
95014     this.__defineSetter__("untilDate", function (val) {
95015         try {
95016             calendarRecurrenceRule.untilDate = t.TZDate(val, "?");
95017         } catch (e) {
95018         }
95019     });
95020
95021     this.__defineGetter__("occurrenceCount", function () {
95022         return calendarRecurrenceRule.occurrenceCount;
95023     });
95024     this.__defineSetter__("occurrenceCount", function (val) {
95025         try {
95026             calendarRecurrenceRule.occurrenceCount = t.long(val);
95027         } catch (e) {
95028         }
95029     });
95030
95031     this.__defineGetter__("daysOfTheWeek", function () {
95032         return calendarRecurrenceRule.daysOfTheWeek;
95033     });
95034     this.__defineSetter__("daysOfTheWeek", function (val) {
95035         try {
95036             calendarRecurrenceRule.daysOfTheWeek = t.ByDayValue(val, "[]");
95037         } catch (e) {
95038         }
95039     });
95040
95041     this.__defineGetter__("setPositions", function () {
95042         return calendarRecurrenceRule.setPositions;
95043     });
95044     this.__defineSetter__("setPositions", function (val) {
95045         try {
95046             calendarRecurrenceRule.setPositions = t.short(val, "[]");
95047         } catch (e) {
95048         }
95049     });
95050
95051     this.__defineGetter__("exceptions", function () {
95052         return calendarRecurrenceRule.exceptions;
95053     });
95054     this.__defineSetter__("exceptions", function (val) {
95055         try {
95056             calendarRecurrenceRule.exceptions = t.TZDate(val, "[]");
95057         } catch (e) {
95058         }
95059     });
95060 };
95061
95062 module.exports = CalendarRecurrenceRule;
95063
95064 });
95065 define('ripple/platform/tizen/2.0/systemsetting', function (require, exports, module) {
95066 /*
95067  *  Copyright 2013 Intel Corporation.
95068  *
95069  * Licensed under the Apache License, Version 2.0 (the "License");
95070  * you may not use this file except in compliance with the License.
95071  * You may obtain a copy of the License at
95072  *
95073  * http://www.apache.org/licenses/LICENSE-2.0
95074  *
95075  * Unless required by applicable law or agreed to in writing, software
95076  * distributed under the License is distributed on an "AS IS" BASIS,
95077  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
95078  * See the License for the specific language governing permissions and
95079  * limitations under the License.
95080  */
95081
95082 var db = require('ripple/db'),
95083     event = require('ripple/event'),
95084     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
95085     t = require('ripple/platform/tizen/2.0/typecast'),
95086     WebAPIException = require('ripple/platform/tizen/2.0/WebAPIException'),
95087     _systemSettings = null,
95088     DBSYSTEMSETTING_KEY = "tizen2-systemsetting",
95089     _security = {
95090         "http://tizen.org/privilege/setting": ["setProperty"]
95091     },
95092     _self;
95093
95094 function _initialize() {
95095     _systemSettings = db.retrieveObject(DBSYSTEMSETTING_KEY);
95096     if (!_systemSettings) {
95097         _systemSettings = {"HOME_SCREEN": "images/home_screen.jpg", "LOCK_SCREEN": "images/lock_screen.jpg", "INCOMING_CALL": "sounds/incoming.wav", "NOTIFICATION_EMAIL": "sounds/notification.wav"};
95098         db.saveObject(DBSYSTEMSETTING_KEY, _systemSettings);
95099         event.trigger("SystemSettingChanged");
95100     }
95101 }
95102
95103 _self = function () {
95104     var systemSetting;
95105
95106     function setProperty(type, value, successCallback, errorCallback) {
95107         if (!_security.setProperty) {
95108             throw new WebAPIException(errorcode.SECURITY_ERR);
95109         }
95110
95111         t.SystemSettingManager("setProperty", arguments);
95112
95113         _systemSettings = db.retrieveObject(DBSYSTEMSETTING_KEY);
95114         _systemSettings[type] = value;
95115         db.saveObject(DBSYSTEMSETTING_KEY, _systemSettings);
95116         event.trigger("SystemSettingChanged");
95117         window.setTimeout(function () {
95118             successCallback();
95119         }, 1);
95120     }
95121
95122     function getProperty(type, successCallback, errorCallback) {
95123         t.SystemSettingManager("getProperty", arguments);
95124
95125         _systemSettings = db.retrieveObject(DBSYSTEMSETTING_KEY);
95126         window.setTimeout(function () {
95127             successCallback(_systemSettings[type]);
95128         }, 1);
95129     }
95130
95131     function handleSubFeatures(subFeatures) {
95132         var i, subFeature;
95133
95134         for (subFeature in subFeatures) {
95135             for (i in _security[subFeature]) {
95136                 _security[_security[subFeature][i]] = true;
95137             }
95138         }
95139     }
95140
95141     systemSetting = {
95142         setProperty:       setProperty,
95143         getProperty:       getProperty,
95144         handleSubFeatures: handleSubFeatures
95145     };
95146
95147     return systemSetting;
95148 };
95149
95150 _initialize();
95151
95152 module.exports = _self;
95153
95154 });
95155 define('ripple/platform/tizen/2.0/battery', function (require, exports, module) {
95156 /*
95157  *  Copyright 2012 Intel Corporation
95158  *
95159  * Licensed under the Apache License, Version 2.0 (the "License");
95160  * you may not use this file except in compliance with the License.
95161  * You may obtain a copy of the License at
95162  *
95163  * http://www.apache.org/licenses/LICENSE-2.0
95164  *
95165  * Unless required by applicable law or agreed to in writing, software
95166  * distributed under the License is distributed on an "AS IS" BASIS,
95167  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
95168  * See the License for the specific language governing permissions and
95169  * limitations under the License.
95170  */
95171
95172 var event = require('ripple/event'),
95173     utils = require('ripple/utils'),
95174     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
95175     WebAPIError = require('ripple/platform/tizen/2.0/WebAPIError'),
95176     _data = {
95177         charging: true,
95178         chargingTime: 0,
95179         level: 1.0,
95180         dischargingTime: Infinity,
95181         chargingchange: {},
95182         chargingtimechange: {},
95183         levelchange: {},
95184         dischargingtimechange: {}
95185     },
95186     _self;
95187
95188 _self = {
95189     addEventListener: function (event, callback, capture) {
95190         if (typeof callback !== "function" || event === undefined) {
95191             throw (new WebAPIError(errorcode.TYPE_MISMATCH_ERR));
95192         }
95193         switch (event) {
95194         case "chargingchange":
95195         case "chargingtimechange":
95196         case "levelchange":
95197         case "dischargingtimechange":
95198             var isExist = false, item;
95199             for (item in _data[event]) {
95200                 if (callback === item) {
95201                     isExist = true;
95202                     break;
95203                 }
95204             }
95205             if (!isExist) {
95206                 _data[event].add(callback);
95207             }
95208             break;
95209
95210         default:
95211             break;
95212         }
95213     },
95214
95215     removeEventListener: function (event, callback, capture) {
95216         if (typeof callback !== "function" || event === undefined) {
95217             throw (new WebAPIError(errorcode.TYPE_MISMATCH_ERR));
95218         }
95219         _data[event].unbind(callback);
95220     },
95221
95222     dispatchEvent: function (event) {
95223         if (event === undefined) {
95224             throw (new WebAPIError(errorcode.TYPE_MISMATCH_ERR));
95225         }
95226         return _data[event].exec(event);
95227     }
95228 };
95229
95230 _self.__defineGetter__("charging", function () {
95231     return _data.charging;
95232 });
95233
95234 _self.__defineGetter__("chargingTime", function () {
95235     return _data.chargingTime;
95236 });
95237
95238 _self.__defineGetter__("level", function () {
95239     return _data.level;
95240 });
95241
95242 _self.__defineGetter__("dischargingTime", function () {
95243     return _data.dischargingTime;
95244 });
95245
95246 function _initialize() {
95247     var callback = [];
95248
95249     function bind(name) {
95250         _self.__defineGetter__(name, function () {
95251             return callback;
95252         });
95253
95254         _self.__defineSetter__(name, function (cb) {
95255             callback = cb;
95256         });
95257
95258         return {
95259             get: function () {
95260                 return callback;
95261             },
95262
95263             set: function (value) {
95264                 callback = value;
95265             },
95266
95267             add: function (value) {
95268                 callback.push(value);
95269             },
95270
95271             exec: function (arg) {
95272                 callback.forEach(function (callback) {
95273                     return !callback || callback(arg);
95274                 });
95275             },
95276
95277             unbind: function (value) {
95278                 if (value === undefined) {
95279                     callback = [];
95280                 } else {
95281                     utils.forEach(callback, function (callback, index) {
95282                         if (callback === value) {
95283                             callback.splice(index, 1);
95284                         }
95285                     });
95286                 }
95287             }
95288         };
95289     }
95290
95291     _data.chargingchange        = bind("onchargingchange");
95292     _data.chargingtimechange    = bind("onchargingtimechange");
95293     _data.levelchange           = bind("onlevelchange");
95294     _data.dischargingtimechange = bind("ondischargingtimechange");
95295
95296     event.on("BatteryEvent", function (status) {
95297         for (var ev in status) {
95298             if ((status[ev] !== undefined) && (status[ev] !== _data[ev])) {
95299                 _data[ev] = status[ev];
95300             }
95301         }
95302         _data[status.type].exec();
95303     });
95304 }
95305
95306 _initialize();
95307
95308 module.exports = _self;
95309
95310 });
95311 define('ripple/platform/tizen/2.0/CalendarTask', function (require, exports, module) {
95312 /*
95313  *  Copyright 2013 Intel Corporation.
95314  *
95315  * Licensed under the Apache License, Version 2.0 (the "License");
95316  * you may not use this file except in compliance with the License.
95317  * You may obtain a copy of the License at
95318  *
95319  * http://www.apache.org/licenses/LICENSE-2.0
95320  *
95321  * Unless required by applicable law or agreed to in writing, software
95322  * distributed under the License is distributed on an "AS IS" BASIS,
95323  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
95324  * See the License for the specific language governing permissions and
95325  * limitations under the License.
95326  */
95327
95328 var t = require('ripple/platform/tizen/2.0/typecast'),
95329     typedef = require('ripple/platform/tizen/2.0/typedef'),
95330     CalendarItem = require('ripple/platform/tizen/2.0/CalendarItem'),
95331     CalendarTask;
95332
95333 CalendarTask = function () {
95334     var voc, calendarTask = {};
95335
95336     // private
95337     function construct(taskInitDict) {
95338         CalendarItem.call(this, taskInitDict);
95339
95340         this.status = "NEEDS_ACTION";
95341
95342         calendarTask.convertToString = this.convertToString;
95343         calendarTask.dueDate         = null;
95344         calendarTask.completedDate   = null;
95345         calendarTask.progress        = 0;
95346
95347         this.__defineGetter__("dueDate", function () {
95348             return calendarTask.dueDate;
95349         });
95350         this.__defineSetter__("dueDate", function (val) {
95351             try {
95352                 calendarTask.dueDate = t.TZDate(val, "?");
95353             } catch (e) {
95354             }
95355         });
95356
95357         this.__defineGetter__("completedDate", function () {
95358             return calendarTask.completedDate;
95359         });
95360         this.__defineSetter__("completedDate", function (val) {
95361             try {
95362                 calendarTask.completedDate = t.TZDate(val, "?");
95363             } catch (e) {
95364             }
95365         });
95366
95367         this.__defineGetter__("progress", function () {
95368             return calendarTask.progress;
95369         });
95370         this.__defineSetter__("progress", function (val) {
95371             try {
95372                 calendarTask.progress = t.unsigned_short(val);
95373             } catch (e) {
95374             }
95375         });
95376
95377         this.convertToString = convertToString;
95378         this.clone           = clone(this);
95379     }
95380
95381     function clone(self) {
95382         return function () {
95383             return new CalendarTask(self);
95384         };
95385     }
95386
95387     // public
95388     function convertToString(format) {
95389         var str;
95390
95391         str = calendarTask.convertToString.call(this, format);
95392         str = str.replace(/#TYPE#/g, "VTASK");
95393
95394         // TODO: dueDate is not supported
95395         // TODO: completedDate is not supported
95396         if (this.progress) {
95397             str = str.replace(/#PROGRESS#/g, "PERCENT-COMPLETE:" +
95398                     this.progress + "\r\n");
95399         }
95400
95401         str = str.replace(/#AVAILABILITY#.*\r\n/g, "");
95402         str = str.replace(/#[^#]*#/g, "");
95403
95404         return str;
95405     }
95406
95407     // Constructor
95408     function CalendarTask_CalendarTaskInit(taskInitDict) {
95409         var attr;
95410
95411         construct.call(this, taskInitDict);
95412
95413         if (taskInitDict) {
95414             for (attr in taskInitDict) {
95415                 if (attr in typedef.CalendarTaskInit) {
95416                     calendarTask[attr] = taskInitDict[attr];
95417                 }
95418             }
95419         }
95420     }
95421
95422     function CalendarTask_DOMString_CalendarTextFormat(stringRepresentation,
95423             format) {
95424     }
95425
95426     voc = [CalendarTask_CalendarTaskInit,
95427            CalendarTask_DOMString_CalendarTextFormat];
95428     t.CalendarTask(arguments, this, voc);
95429 };
95430
95431 module.exports = CalendarTask;
95432
95433 });
95434 define('ripple/platform/tizen/2.0/pendingObject', function (require, exports, module) {
95435 /*
95436  *  Copyright 2011 Intel Corporation.
95437  *
95438  * Licensed under the Apache License, Version 2.0 (the "License");
95439  * you may not use this file except in compliance with the License.
95440  * You may obtain a copy of the License at
95441  *
95442  * http://www.apache.org/licenses/LICENSE-2.0
95443  *
95444  * Unless required by applicable law or agreed to in writing, software
95445  * distributed under the License is distributed on an "AS IS" BASIS,
95446  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
95447  * See the License for the specific language governing permissions and
95448  * limitations under the License.
95449  */
95450
95451 module.exports = function (pendingObj) {
95452     var cancelFlag = true;
95453     this.setCancelFlag = function (flag) {
95454         cancelFlag = flag;
95455     };
95456     this.getCancelFlag = function () {
95457         return cancelFlag;
95458     };
95459     this.userCancel = null;
95460     this.pendingID = null;
95461 };
95462
95463 });
95464 define('ripple/platform/tizen/2.0/PackageInformation', function (require, exports, module) {
95465 /*
95466  *  Copyright 2013 Intel Corporation.
95467  *
95468  * Licensed under the Apache License, Version 2.0 (the "License");
95469  * you may not use this file except in compliance with the License.
95470  * You may obtain a copy of the License at
95471  *
95472  * http://www.apache.org/licenses/LICENSE-2.0
95473  *
95474  * Unless required by applicable law or agreed to in writing, software
95475  * distributed under the License is distributed on an "AS IS" BASIS,
95476  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
95477  * See the License for the specific language governing permissions and
95478  * limitations under the License.
95479  */
95480 module.exports = function (id, name, iconPath, version, totalSize,
95481         dataSize, lastModified, author, description, appIds) {
95482     var packageInformation = {}, _date = new Date(lastModified);
95483
95484     packageInformation.__defineGetter__("id", function () {
95485         return id;
95486     });
95487     packageInformation.__defineGetter__("name", function () {
95488         return name;
95489     });
95490     packageInformation.__defineGetter__("iconPath", function () {
95491         return iconPath;
95492     });
95493     packageInformation.__defineGetter__("version", function () {
95494         return version;
95495     });
95496     packageInformation.__defineGetter__("totalSize", function () {
95497         return totalSize;
95498     });
95499     packageInformation.__defineGetter__("dataSize", function () {
95500         return dataSize;
95501     });
95502     packageInformation.__defineGetter__("lastModified", function () {
95503         return _date;
95504     });
95505     packageInformation.__defineGetter__("author", function () {
95506         return author;
95507     });
95508     packageInformation.__defineGetter__("description", function () {
95509         return description;
95510     });
95511     packageInformation.__defineGetter__("appIds", function () {
95512         return appIds;
95513     });
95514
95515     return packageInformation;
95516 };
95517
95518 });
95519 define('ripple/platform/tizen/2.0/POIFilter', function (require, exports, module) {
95520 /*
95521  *  Copyright 2012 Intel Corporation.
95522  *
95523  * Licensed under the Apache License, Version 2.0 (the "License");
95524  * you may not use this file except in compliance with the License.
95525  * You may obtain a copy of the License at
95526  *
95527  * http://www.apache.org/licenses/LICENSE-2.0
95528  *
95529  * Unless required by applicable law or agreed to in writing, software
95530  * distributed under the License is distributed on an "AS IS" BASIS,
95531  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
95532  * See the License for the specific language governing permissions and
95533  * limitations under the License.
95534  */
95535
95536 module.exports = function (attributeName, value) {
95537     var _self;
95538
95539     _self = {
95540         attributeName: attributeName,
95541         value: value
95542     };
95543
95544     return _self;
95545 };
95546
95547 });
95548 define('ripple/platform/tizen/2.0/GeoPolyBounds', function (require, exports, module) {
95549 /*
95550  *  Copyright 2012 Intel Corporation.
95551  *
95552  * Licensed under the Apache License, Version 2.0 (the "License");
95553  * you may not use this file except in compliance with the License.
95554  * You may obtain a copy of the License at
95555  *
95556  * http://www.apache.org/licenses/LICENSE-2.0
95557  *
95558  * Unless required by applicable law or agreed to in writing, software
95559  * distributed under the License is distributed on an "AS IS" BASIS,
95560  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
95561  * See the License for the specific language governing permissions and
95562  * limitations under the License.
95563  */
95564
95565 module.exports = function (_points) {
95566     var points = _points || [];
95567
95568     this.__defineGetter__("points", function () {
95569         return points;
95570     });
95571 };
95572
95573 });
95574 define('ripple/platform/tizen/2.0/POIGeometry', function (require, exports, module) {
95575 /*
95576  *  Copyright 2012 Intel Corporation.
95577  *
95578  * Licensed under the Apache License, Version 2.0 (the "License");
95579  * you may not use this file except in compliance with the License.
95580  * You may obtain a copy of the License at
95581  *
95582  * http://www.apache.org/licenses/LICENSE-2.0
95583  *
95584  * Unless required by applicable law or agreed to in writing, software
95585  * distributed under the License is distributed on an "AS IS" BASIS,
95586  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
95587  * See the License for the specific language governing permissions and
95588  * limitations under the License.
95589  */
95590
95591 var SimpleCoordinates = require('ripple/platform/tizen/2.0/SimpleCoordinates'),
95592     GeoRectBounds = require('ripple/platform/tizen/2.0/GeoRectBounds');
95593
95594 module.exports = function (position, viewport, wkt) {
95595     var _self, _position = null, _viewport = null, _wkt = "";
95596
95597     if (position) {
95598         _position = new SimpleCoordinates(position.latitude, position.longitude);
95599     }
95600
95601     if (viewport) {
95602         _viewport = new GeoRectBounds(viewport.southWest, viewport.northEast);
95603     }
95604
95605     if (wkt) {
95606         _wkt = String(wkt);
95607     }
95608
95609     _self = {
95610         position : _position,
95611         viewport: _viewport,
95612         wkt: _wkt
95613     };
95614
95615     return _self;
95616 };
95617
95618 });
95619 define('ripple/platform/tizen/2.0/BluetoothClass', function (require, exports, module) {
95620 /*
95621  *  Copyright 2013 Intel Corporation.
95622  *
95623  * Licensed under the Apache License, Version 2.0 (the "License");
95624  * you may not use this file except in compliance with the License.
95625  * You may obtain a copy of the License at
95626  *
95627  * http://www.apache.org/licenses/LICENSE-2.0
95628  *
95629  * Unless required by applicable law or agreed to in writing, software
95630  * distributed under the License is distributed on an "AS IS" BASIS,
95631  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
95632  * See the License for the specific language governing permissions and
95633  * limitations under the License.
95634  */
95635
95636 var errorcode = require('ripple/platform/tizen/2.0/errorcode'),
95637     t = require('ripple/platform/tizen/2.0/typecast'),
95638     WebAPIException = require('ripple/platform/tizen/2.0/WebAPIException'),
95639     BluetoothClass,
95640     _security;
95641
95642 BluetoothClass = function (prop, metaData) {
95643     var bluetoothClass = {};
95644
95645     _security = metaData;
95646
95647     bluetoothClass.major    = prop.major || 0;
95648     bluetoothClass.minor    = prop.minor || 0;
95649     bluetoothClass.services = prop.services || [];
95650
95651     this.__defineGetter__("major", function () {
95652         return bluetoothClass.major;
95653     });
95654
95655     this.__defineGetter__("minor", function () {
95656         return bluetoothClass.minor;
95657     });
95658
95659     this.__defineGetter__("services", function () {
95660         return bluetoothClass.services;
95661     });
95662
95663     bluetoothClass.services.forEach(function (service, i) {
95664         bluetoothClass.services.__defineGetter__(i, function () {
95665             return service;
95666         });
95667     });
95668
95669     this.hasService = function (service) {
95670         if (!_security.hasService) {
95671             throw new WebAPIException(errorcode.SECURITY_ERR);
95672         }
95673
95674         t.BluetoothClass("hasService", arguments);
95675
95676         return (bluetoothClass.services.join(",").indexOf(service) !== -1);
95677     };
95678 };
95679
95680 module.exports = BluetoothClass;
95681
95682 });
95683 define('ripple/platform/tizen/2.0/NDEFRecordURI', function (require, exports, module) {
95684 /*
95685  *  Copyright 2013 Intel Corporation
95686  *
95687  * Licensed under the Apache License, Version 2.0 (the "License");
95688  * you may not use this file except in compliance with the License.
95689  * You may obtain a copy of the License at
95690  *
95691  * http://www.apache.org/licenses/LICENSE-2.0
95692  *
95693  * Unless required by applicable law or agreed to in writing, software
95694  * distributed under the License is distributed on an "AS IS" BASIS,
95695  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
95696  * See the License for the specific language governing permissions and
95697  * limitations under the License.
95698  */
95699
95700 var t = require('ripple/platform/tizen/2.0/typecast'),
95701     NDEFRecordInternal = require('ripple/platform/tizen/2.0/NDEFRecordInternal'),
95702     NDEFRecordURI;
95703
95704 NDEFRecordURI = function (uri) {
95705     var payload = [], i;
95706
95707     t.NDEFRecordURI(arguments, this);
95708
95709     // Store uri in payload
95710     payload.push(0);
95711     for (i = 0; i < uri.length; i++) {
95712         payload.push(uri.charCodeAt(i));
95713     }
95714
95715     NDEFRecordInternal.call(this, tizen.nfc.NFC_RECORD_TNF_WELL_KNOWN,
95716             ["U".charCodeAt(0)], payload, []);
95717
95718     this.__defineGetter__("uri", function () {
95719         return uri;
95720     });
95721 };
95722
95723 module.exports = NDEFRecordURI;
95724
95725 });
95726 define('ripple/platform/tizen/2.0/StatusNotification', function (require, exports, module) {
95727 /*
95728  *  Copyright 2013 Intel Corporation.
95729  *
95730  * Licensed under the Apache License, Version 2.0 (the "License");
95731  * you may not use this file except in compliance with the License.
95732  * You may obtain a copy of the License at
95733  *
95734  * http://www.apache.org/licenses/LICENSE-2.0
95735  *
95736  * Unless required by applicable law or agreed to in writing, software
95737  * distributed under the License is distributed on an "AS IS" BASIS,
95738  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
95739  * See the License for the specific language governing permissions and
95740  * limitations under the License.
95741  */
95742
95743 var t = require('ripple/platform/tizen/2.0/typecast'),
95744     ApplicationControl = require('ripple/platform/tizen/2.0/ApplicationControl'),
95745     Notification = require('ripple/platform/tizen/2.0/NotificationBase'),
95746     NotificationDetailInfo = require('ripple/platform/tizen/2.0/NotificationDetailInfo'),
95747     StatusNotification;
95748
95749 StatusNotification = function (statusType, title, notificationInitDict) {
95750     var statusNotification = {}, attr, i, info;
95751
95752     t.StatusNotification(arguments, this);
95753
95754     Notification.call(this, title, notificationInitDict ?
95755             notificationInitDict.content : null);
95756
95757     statusNotification.statusType          = statusType;
95758     statusNotification.iconPath            = null;
95759     statusNotification.subIconPath         = null;
95760     statusNotification.number              = null;
95761     statusNotification.detailInfo          = [];
95762     statusNotification.ledColor            = null;
95763     statusNotification.ledOnPeriod         = 0;
95764     statusNotification.ledOffPeriod        = 0;
95765     statusNotification.backgroundImagePath = null;
95766     statusNotification.thumbnails          = [];
95767     statusNotification.soundPath           = null;
95768     statusNotification.vibration           = false;
95769     statusNotification.appControl          = null;
95770     statusNotification.appId               = null;
95771     statusNotification.progressType        = "PERCENTAGE";
95772     statusNotification.progressValue       = null;
95773
95774     for (attr in notificationInitDict) {
95775         switch (attr) {
95776         case "appControl":
95777             statusNotification.appControl = new ApplicationControl(
95778                     notificationInitDict.appControl.operation,
95779                     notificationInitDict.appControl.uri || null,
95780                     notificationInitDict.appControl.mime || null,
95781                     notificationInitDict.appControl.category || null,
95782                     notificationInitDict.appControl.data || null);
95783             break;
95784
95785         case "detailInfo":
95786             for (i in notificationInitDict.detailInfo) {
95787                 info = notificationInitDict.detailInfo[i];
95788                 info = new NotificationDetailInfo(info.mainText,
95789                         info.subText);
95790
95791                 statusNotification.detailInfo.push(info);
95792             }
95793             break;
95794
95795         default:
95796             statusNotification[attr] = notificationInitDict[attr];
95797             break;
95798         }
95799     }
95800
95801     this.__defineGetter__("statusType", function () {
95802         return statusNotification.statusType;
95803     });
95804
95805     this.__defineGetter__("iconPath", function () {
95806         return statusNotification.iconPath;
95807     });
95808     this.__defineSetter__("iconPath", function (val) {
95809         try {
95810             statusNotification.iconPath = t.DOMString(val, "?");
95811         } catch (e) {
95812         }
95813     });
95814
95815     this.__defineGetter__("subIconPath", function () {
95816         return statusNotification.subIconPath;
95817     });
95818     this.__defineSetter__("subIconPath", function (val) {
95819         try {
95820             statusNotification.subIconPath = t.DOMString(val, "?");
95821         } catch (e) {
95822         }
95823     });
95824
95825     this.__defineGetter__("number", function () {
95826         return statusNotification.number;
95827     });
95828     this.__defineSetter__("number", function (val) {
95829         try {
95830             statusNotification.number = t.long(val, "?");
95831         } catch (e) {
95832         }
95833     });
95834
95835     this.__defineGetter__("detailInfo", function () {
95836         return statusNotification.detailInfo;
95837     });
95838     this.__defineSetter__("detailInfo", function (val) {
95839         try {
95840             statusNotification.detailInfo = t.NotificationDetailInfo(val, "[]?");
95841         } catch (e) {
95842         }
95843     });
95844
95845     this.__defineGetter__("ledColor", function () {
95846         return statusNotification.ledColor;
95847     });
95848     this.__defineSetter__("ledColor", function (val) {
95849         try {
95850             statusNotification.ledColor = t.DOMString(val, "?");
95851         } catch (e) {
95852         }
95853     });
95854
95855     this.__defineGetter__("ledOnPeriod", function () {
95856         return statusNotification.ledOnPeriod;
95857     });
95858     this.__defineSetter__("ledOnPeriod", function (val) {
95859         try {
95860             statusNotification.ledOnPeriod = t.unsigned_long(val);
95861         } catch (e) {
95862         }
95863     });
95864
95865     this.__defineGetter__("ledOffPeriod", function () {
95866         return statusNotification.ledOffPeriod;
95867     });
95868     this.__defineSetter__("ledOffPeriod", function (val) {
95869         try {
95870             statusNotification.ledOffPeriod = t.unsigned_long(val);
95871         } catch (e) {
95872         }
95873     });
95874
95875     this.__defineGetter__("backgroundImagePath", function () {
95876         return statusNotification.backgroundImagePath;
95877     });
95878     this.__defineSetter__("backgroundImagePath", function (val) {
95879         try {
95880             statusNotification.backgroundImagePath = t.DOMString(val, "?");
95881         } catch (e) {
95882         }
95883     });
95884
95885     this.__defineGetter__("thumbnails", function () {
95886         return statusNotification.thumbnails;
95887     });
95888     this.__defineSetter__("thumbnails", function (val) {
95889         try {
95890             statusNotification.thumbnails = t.DOMString(val, "[]?");
95891         } catch (e) {
95892         }
95893     });
95894
95895     this.__defineGetter__("soundPath", function () {
95896         return statusNotification.soundPath;
95897     });
95898     this.__defineSetter__("soundPath", function (val) {
95899         try {
95900             statusNotification.soundPath = t.DOMString(val, "?");
95901         } catch (e) {
95902         }
95903     });
95904
95905     this.__defineGetter__("vibration", function () {
95906         return statusNotification.vibration;
95907     });
95908     this.__defineSetter__("vibration", function (val) {
95909         try {
95910             statusNotification.vibration = t.boolean(val);
95911         } catch (e) {
95912         }
95913     });
95914
95915     this.__defineGetter__("appControl", function () {
95916         return statusNotification.appControl;
95917     });
95918     this.__defineSetter__("appControl", function (val) {
95919         try {
95920             statusNotification.appControl = t.ApplicationControl(val, "?");
95921         } catch (e) {
95922         }
95923     });
95924
95925     this.__defineGetter__("appId", function () {
95926         return statusNotification.appId;
95927     });
95928     this.__defineSetter__("appId", function (val) {
95929         try {
95930             statusNotification.appId = t.ApplicationId(val, "?");
95931         } catch (e) {
95932         }
95933     });
95934
95935     this.__defineGetter__("progressType", function () {
95936         return statusNotification.progressType;
95937     });
95938     this.__defineSetter__("progressType", function (val) {
95939         try {
95940             statusNotification.progressType = t.NotificationProgressType(val);
95941         } catch (e) {
95942         }
95943     });
95944
95945     this.__defineGetter__("progressValue", function () {
95946         return statusNotification.progressValue;
95947     });
95948     this.__defineSetter__("progressValue", function (val) {
95949         try {
95950             val = t.unsigned_long(val, '?');
95951
95952             if ((statusNotification.progressType === "PERCENTAGE") &&
95953                     (val > 100))
95954                 return;
95955
95956             statusNotification.progressValue = val;
95957         } catch (e) {
95958         }
95959     });
95960 };
95961
95962 module.exports = StatusNotification;
95963
95964 });
95965 define('ripple/platform/tizen/2.0/WebAPIError', function (require, exports, module) {
95966 /*
95967  *  Copyright 2012 Intel Corporation.
95968  *
95969  * Licensed under the Apache License, Version 2.0 (the "License");
95970  * you may not use this file except in compliance with the License.
95971  * You may obtain a copy of the License at
95972  *
95973  * http://www.apache.org/licenses/LICENSE-2.0
95974  *
95975  * Unless required by applicable law or agreed to in writing, software
95976  * distributed under the License is distributed on an "AS IS" BASIS,
95977  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
95978  * See the License for the specific language governing permissions and
95979  * limitations under the License.
95980  */
95981
95982 var errorcode = require('ripple/platform/tizen/2.0/errorcode');
95983
95984 var msg = {
95985     0: "Generic Error",
95986     1: "Index or size is negative, or greater than the allowed value.",
95987     2: "Specified range of text does not fit into a DOMString.",
95988     3: "Node is inserted somewhere it doesn't belong.",
95989     4: "Node is used in a different document than the one that created it (that doesn't support it).",
95990     5: "An invalid or illegal character is specified.",
95991     6: "Data is specified for a Node which does not support data.",
95992     7: "An attempt is made to modify an object where modifications are not allowed.",
95993     8: "An attempt is made to reference a Node in a context where it does not exist.",
95994     9: "The implementation does not support the requested type of object or operation.",
95995     10: "An attempt is made to add an attribute that is already in use elsewhere.",
95996     11: "An attempt is made to use an object that is not, or is no longer, usable.",
95997     12: "An invalid or illegal string is specified.",
95998     13: "An attempt is made to modify the type of the underlying object.",
95999     14: "An attempt is made to create or change an object in a way which is incorrect with regard to namespaces.",
96000     15: "A parameter or an operation is not supported by the underlying object.",
96001     16: "A call to a method such as insertBefore or removeChild would make the Node invalid with respect to \"partial validity\", this exception would be raised and the operation would not be done.",
96002     17: "The type of an object is incompatible with the expected type of the parameter associated to the object.",
96003     18: "An attempt is made to perform an operation or access some data in a way that would be a security risk or a violation of the user agent's security policy.",
96004     19: "A network error occurs in synchronous requests.",
96005     20: "The abort error occurs in asynchronous requests by user prompt.",
96006     21: "The operation could not be completed because the URL does not match.",
96007     22: "The quota has been exceeded.",
96008     23: "The operation timed out.",
96009     24: "The supplied node is incorrect or has an incorrect ancestor for this operation.",
96010     25: "The object can not be cloned.",
96011     99: "The content of an object does not include valid values.",
96012     100: "Error occurred in communication with the underlying implementation that meant the requested method could not complete.",
96013     111: "Requested service is not available."
96014 },
96015     errType = {
96016     0: "UnknownError",
96017     1: "IndexSizeError",
96018     2: "DOMStringSizeError",
96019     3: "HierarchyRequestError",
96020     4: "WrongDocumentError",
96021     5: "InvalidCharacterError",
96022     6: "NoDataAllowedError",
96023     7: "NoModificationAllowedError",
96024     8: "NotFoundError",
96025     9: "NotSupportedError",
96026     10: "InuseAttributeError",
96027     11: "InvalidStateError",
96028     12: "SyntaxError",
96029     13: "InvalidModificationError",
96030     14: "NamespaceError",
96031     15: "InvalidAccessError",
96032     16: "ValidationError",
96033     17: "TypeMismatchError",
96034     18: "SecurityError",
96035     19: "NetworkError",
96036     20: "AbortError",
96037     21: "URLMismatchError",
96038     22: "QuotaExceededError",
96039     23: "TimeoutError",
96040     24: "InvalidNodeTypeError",
96041     25: "DataCloneError",
96042     99: "InvalidValuesError",
96043     100: "IOError",
96044     111: "ServiceNotAvailableError"
96045 };
96046
96047 /*
96048   support 3 types of error:
96049   - WebAPIError()
96050       code = errorcode.UNKNOWN_ERR
96051       message = errorcode.message[UNKNOWN_ERR]
96052   - WebAPIError(errorcode."TYPE_MISMATCH_ERR")
96053       code = 17
96054       message = errorcode.message[17]
96055   - WebAPIError(my_own_error_code, "This is my error message.")
96056       code = my_own_error_code(number)
96057       message = "This is my error message."
96058 */
96059
96060 module.exports = function (code, message, name) {
96061     var _code, _message, _name;
96062
96063     if (typeof code !== 'number') {
96064         _code = errorcode.UNKNOWN_ERR;
96065         _message = msg[_code];
96066         _name = errType[_code];
96067     } else {
96068         _code = code;
96069         if (typeof message === 'string') {
96070             _message = message;
96071         } else {
96072             _message = msg[_code];
96073         }
96074         if (typeof name === 'string') {
96075             _name = name;
96076         } else {
96077             _name = errType[_code];
96078         }
96079     }
96080
96081     this.__defineGetter__("code", function () {
96082         return _code;
96083     });
96084     this.__defineGetter__("message", function () {
96085         return _message;
96086     });
96087     this.__defineGetter__("name", function () {
96088         return _name;
96089     });
96090 };
96091
96092 });
96093 define('ripple/platform/tizen/2.0/notification', function (require, exports, module) {
96094 /*
96095  *  Copyright 2013 Intel Corporation.
96096  *
96097  * Licensed under the Apache License, Version 2.0 (the "License");
96098  * you may not use this file except in compliance with the License.
96099  * You may obtain a copy of the License at
96100  *
96101  * http://www.apache.org/licenses/LICENSE-2.0
96102  *
96103  * Unless required by applicable law or agreed to in writing, software
96104  * distributed under the License is distributed on an "AS IS" BASIS,
96105  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
96106  * See the License for the specific language governing permissions and
96107  * limitations under the License.
96108  */
96109
96110 var db = require('ripple/db'),
96111     utils = require('ripple/utils'),
96112     event = require('ripple/event'),
96113     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
96114     t = require('ripple/platform/tizen/2.0/typecast'),
96115     WebAPIException = require('ripple/platform/tizen/2.0/WebAPIException'),
96116     StatusNotification = require('ripple/platform/tizen/2.0/StatusNotification'),
96117     _notificationStack,
96118     _security = {
96119         "http://tizen.org/privilege/notification": ["post", "update", "remove",
96120                 "removeAll"]
96121     },
96122     _self;
96123
96124 _self = function () {
96125     function post(notification) {
96126         var posted = {};
96127
96128         if (!_security.post) {
96129             throw new WebAPIException(errorcode.SECURITY_ERR);
96130         }
96131
96132         t.NotificationManager("post", arguments);
96133
96134         if (notification.id !== undefined) {
96135             return;
96136         }
96137         posted.id = Math.uuid(null, 16);
96138
96139         notification.__defineGetter__("id", function () {
96140             return posted.id;
96141         });
96142
96143         if (!_notificationStack[notification.id]) {
96144             posted.postedTime = new Date();
96145
96146             notification.__defineGetter__("postedTime", function () {
96147                 return posted.postedTime;
96148             });
96149
96150             _notificationStack[notification.id] = t.Notification(notification,
96151                     "+");
96152             db.saveObject("posted-notifications", _notificationStack);
96153             event.trigger("refreshNotificationUI", [], true);
96154         }
96155     }
96156
96157     function update(notification) {
96158         if (!_security.update) {
96159             throw new WebAPIException(errorcode.SECURITY_ERR);
96160         }
96161
96162         t.NotificationManager("update", arguments);
96163
96164         if (!_notificationStack[notification.id]) {
96165             throw new WebAPIException(errorcode.UNKNOWN_ERR);
96166         }
96167         _notificationStack[notification.id] = t.Notification(notification,
96168                 "+");
96169         db.saveObject("posted-notifications", _notificationStack);
96170         event.trigger("refreshNotificationUI", [], true);
96171     }
96172
96173     function remove(id) {
96174         if (!_security.remove) {
96175             throw new WebAPIException(errorcode.SECURITY_ERR);
96176         }
96177
96178         t.NotificationManager("remove", arguments);
96179
96180         if (!_notificationStack[id]) {
96181             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
96182         }
96183         delete _notificationStack[id];
96184         db.saveObject("posted-notifications", _notificationStack);
96185         event.trigger('refreshNotificationUI', [], true);
96186     }
96187
96188     function removeAll() {
96189         if (!_security.removeAll) {
96190             throw new WebAPIException(errorcode.SECURITY_ERR);
96191         }
96192
96193         _notificationStack = {};
96194         db.saveObject("posted-notifications", _notificationStack);
96195         event.trigger('refreshNotificationUI', [], true);
96196     }
96197
96198     function get(id) {
96199         var n, notification;
96200
96201         t.NotificationManager("get", arguments);
96202
96203         if (!_notificationStack[id]) {
96204             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
96205         }
96206         n = _notificationStack[id];
96207         notification = new StatusNotification(n.statusType, n.title, n);
96208
96209         notification.__defineGetter__("id", function () {
96210             return n.id;
96211         });
96212
96213         notification.__defineGetter__("postedTime", function () {
96214             return n.postedTime;
96215         });
96216
96217         return notification;
96218     }
96219
96220     function getAll() {
96221         var notifications = [];
96222
96223         utils.forEach(_notificationStack, function (n) {
96224             var notification;
96225
96226             notification = new StatusNotification(n.statusType, n.title, n);
96227
96228             notification.__defineGetter__("id", function () {
96229                 return n.id;
96230             });
96231
96232             notification.__defineGetter__("postedTime", function () {
96233                 return n.postedTime;
96234             });
96235
96236             notifications.push(notification);
96237         });
96238
96239         return notifications;
96240     }
96241
96242     function handleSubFeatures(subFeatures) {
96243         var i, subFeature;
96244
96245         for (subFeature in subFeatures) {
96246             for (i in _security[subFeature]) {
96247                 _security[_security[subFeature][i]] = true;
96248             }
96249         }
96250     }
96251
96252     var notification = {
96253         post:              post,
96254         update:            update,
96255         remove:            remove,
96256         removeAll:         removeAll,
96257         get:               get,
96258         getAll:            getAll,
96259         handleSubFeatures: handleSubFeatures
96260     };
96261
96262     return notification;
96263 };
96264
96265 function _initilize() {
96266     _notificationStack = db.retrieveObject("posted-notifications") || {};
96267
96268     utils.forEach(_notificationStack, function (n) {
96269         n.postedTime = new Date(n.postedTime);
96270     });
96271
96272     event.on("refreshNotificationStack", function () {
96273         _notificationStack = db.retrieveObject("posted-notifications");
96274     });
96275 }
96276
96277 _initilize();
96278
96279 module.exports = _self;
96280
96281 });
96282 define('ripple/platform/tizen/2.0/AttributeRangeFilter', function (require, exports, module) {
96283 /*
96284  *  Copyright 2013 Intel Corporation.
96285  *
96286  * Licensed under the Apache License, Version 2.0 (the "License");
96287  * you may not use this file except in compliance with the License.
96288  * You may obtain a copy of the License at
96289  *
96290  * http://www.apache.org/licenses/LICENSE-2.0
96291  *
96292  * Unless required by applicable law or agreed to in writing, software
96293  * distributed under the License is distributed on an "AS IS" BASIS,
96294  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
96295  * See the License for the specific language governing permissions and
96296  * limitations under the License.
96297  */
96298
96299 var t = require('ripple/platform/tizen/2.0/typecast'),
96300     AttributeRangeFilter;
96301
96302 AttributeRangeFilter = function (attributeName, initialValue, endValue) {
96303     var attributeRangeFilter = {};
96304
96305     t.AttributeRangeFilter(arguments, this);
96306
96307     this.__defineGetter__("attributeName", function () {
96308         return attributeRangeFilter.attributeName;
96309     });
96310     this.__defineSetter__("attributeName", function (val) {
96311         try {
96312             attributeRangeFilter.attributeName = t.DOMString(val);
96313         } catch (e) {
96314         }
96315     });
96316
96317     attributeRangeFilter.attributeName = attributeName;
96318
96319     this.initialValue = initialValue || null;
96320     this.endValue     = endValue || null;
96321 };
96322
96323 module.exports = AttributeRangeFilter;
96324
96325 });
96326 define('ripple/platform/tizen/2.0/SyncStatistics', function (require, exports, module) {
96327 /*
96328  *  Copyright 2013 Intel Corporation.
96329  *
96330  * Licensed under the Apache License, Version 2.0 (the "License");
96331  * you may not use this file except in compliance with the License.
96332  * You may obtain a copy of the License at
96333  *
96334  * http://www.apache.org/licenses/LICENSE-2.0
96335  *
96336  * Unless required by applicable law or agreed to in writing, software
96337  * distributed under the License is distributed on an "AS IS" BASIS,
96338  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
96339  * See the License for the specific language governing permissions and
96340  * limitations under the License.
96341  */
96342
96343 var SyncStatistics = function (syncStatus, serviceType, lastSyncTime,
96344         serverToClientTotal, serverToClientAdded, serverToClientUpdated,
96345         serverToClientRemoved, clientToServerTotal, clientToServerAdded,
96346         clientToServerUpdated, clientToServerRemoved) {
96347     this.__defineGetter__("syncStatus", function () {
96348         return syncStatus;
96349     });
96350
96351     this.__defineGetter__("serviceType", function () {
96352         return serviceType;
96353     });
96354
96355     this.__defineGetter__("lastSyncTime", function () {
96356         return lastSyncTime;
96357     });
96358
96359     this.__defineGetter__("serverToClientTotal", function () {
96360         return serverToClientTotal;
96361     });
96362
96363     this.__defineGetter__("serverToClientAdded", function () {
96364         return serverToClientAdded;
96365     });
96366
96367     this.__defineGetter__("serverToClientUpdated", function () {
96368         return serverToClientUpdated;
96369     });
96370
96371     this.__defineGetter__("serverToClientRemoved", function () {
96372         return serverToClientRemoved;
96373     });
96374
96375     this.__defineGetter__("clientToServerTotal", function () {
96376         return clientToServerTotal;
96377     });
96378
96379     this.__defineGetter__("clientToServerAdded", function () {
96380         return clientToServerAdded;
96381     });
96382
96383     this.__defineGetter__("clientToServerUpdated", function () {
96384         return clientToServerUpdated;
96385     });
96386
96387     this.__defineGetter__("clientToServerRemoved", function () {
96388         return clientToServerRemoved;
96389     });
96390 };
96391
96392 module.exports = SyncStatistics;
96393
96394 });
96395 define('ripple/platform/tizen/2.0/typedef', function (require, exports, module) {
96396 /*
96397  *  Copyright 2013 Intel Corporation.
96398  *
96399  * Licensed under the Apache License, Version 2.0 (the "License");
96400  * you may not use this file except in compliance with the License.
96401  * You may obtain a copy of the License at
96402  *
96403  * http://www.apache.org/licenses/LICENSE-2.0
96404  *
96405  * Unless required by applicable law or agreed to in writing, software
96406  * distributed under the License is distributed on an "AS IS" BASIS,
96407  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
96408  * See the License for the specific language governing permissions and
96409  * limitations under the License.
96410  */
96411
96412 var _t, _c, _i;
96413
96414 /*
96415  * Primitive type definition
96416  */
96417
96418 _t = {
96419     // Basic
96420     Callback:                           "Callback",
96421     DOMString:                          "",
96422     Date:                               new Date(),
96423     Function:                           function () {},
96424     TZDate:                             "TZDate",
96425     any:                                "any",
96426     boolean:                            false,
96427     byte:                               "byte",
96428     double:                             "double",
96429     float:                              "float",
96430     long:                               "long",
96431     octet:                              "octet",
96432     short:                              "short",
96433     long_long:                          "long long",
96434     unsigned_long:                      "unsigned long",
96435     unsigned_long_long:                 "unsigned long long",
96436     unsigned_short:                     "unsigned short",
96437
96438     // Common
96439     FilterMatchFlag:                    ["EXACTLY", "FULLSTRING", "CONTAINS",
96440                                          "STARTSWITH", "ENDSWITH", "EXISTS"],
96441     SortModeOrder:                      ["ASC", "DESC"],
96442     CompositeFilterType:                ["UNION", "INTERSECTION"],
96443
96444     // Bluetooth
96445     BluetoothSocketState:               ["CLOSED", "OPEN"],
96446     BluetoothProfileType:               ["HEALTH", "HEALTH"],
96447     BluetoothHealthChannelType:         ["RELIABLE", "STREAMING"],
96448
96449     // Calendar
96450     CalendarType:                       ["EVENT", "TASK"],
96451     CalendarTextFormat:                 ["ICALENDAR_20", "VCALENDAR_10"],
96452     AlarmMethod:                        ["SOUND", "DISPLAY"],
96453     RecurrenceRuleFrequency:            ["DAILY", "WEEKLY", "MONTHLY",
96454                                          "YEARLY"],
96455     ByDayValue:                         ["MO", "TU", "WE", "TH", "FR", "SA",
96456                                          "SU"],
96457     EventAvailability:                  ["BUSY", "FREE"],
96458     AttendeeType:                       ["INDIVIDUAL", "GROUP", "RESOURCE",
96459                                          "ROOM", "UNKNOWN"],
96460     AttendeeStatus:                     ["PENDING", "ACCEPTED", "DECLINED",
96461                                          "TENTATIVE", "DELEGATED", "COMPLETED",
96462                                          "IN_PROCESS"],
96463     AttendeeRole:                       ["REQ_PARTICIPANT", "OPT_PARTICIPANT",
96464                                          "NON_PARTICIPANT", "CHAIR"],
96465     CalendarItemPriority:               ["HIGH", "MEDIUM", "LOW"],
96466     CalendarItemVisibility:             ["PUBLIC", "PRIVATE", "CONFIDENTIAL"],
96467     CalendarItemStatus:                 ["TENTATIVE", "CONFIRMED", "CANCELLED",
96468                                          "NEEDS_ACTION", "IN_PROCESS",
96469                                          "COMPLETED"],
96470
96471     // Contact
96472     ContactTextFormat:                  ["VCARD_30", "VCARD_30"],    // Enum must has more than one value
96473
96474     // Content
96475     ContentDirectoryStorageType:        ["INTERNAL", "EXTERNAL"],
96476     ContentType:                        ["IMAGE", "VIDEO", "AUDIO", "OTHER"],
96477     AudioContentLyricsType:             ["SYNCHRONIZED", "UNSYNCHRONIZED"],
96478     ImageContentOrientation:            ["NORMAL", "FLIP_HORIZONTAL",
96479                                          "ROTATE_180", "FLIP_VERTICAL",
96480                                          "TRANSPOSE", "ROTATE_90", "TRANSVERSE",
96481                                          "ROTATE_270"],
96482
96483     // Data Control
96484     DataType:                           ["MAP", "SQL"],
96485
96486     // Data Synchronization
96487     SyncMode:                           ["MANUAL", "PERIODIC", "PUSH"],
96488     SyncType:                           ["TWO_WAY", "SLOW",
96489                                          "ONE_WAY_FROM_CLIENT",
96490                                          "REFRESH_FROM_CLIENT",
96491                                          "ONE_WAY_FROM_SERVER",
96492                                          "REFRESH_FROM_SERVER"],
96493     SyncInterval:                       ["5_MINUTES", "15_MINUTES", "1_HOUR",
96494                                          "4_HOURS", "12_HOURS", "1_DAY",
96495                                          "1_WEEK", "1_MONTH"],
96496     SyncServiceType:                    ["CONTACT", "EVENT"],
96497     SyncStatus:                         ["SUCCESS", "FAIL", "STOP", "NONE"],
96498
96499     // Download
96500     DownloadState:                      ["QUEUED", "DOWNLOADING", "PAUSED",
96501                                          "CANCELED", "COMPLETED", "FAILED"],
96502     DownloadNetworkType:                ["CELLULAR", "WIFI", "ALL"],
96503
96504     // Messaging
96505     MessageServiceTag:                  ["messaging.sms", "messaging.mms",
96506                                          "messaging.email"],
96507
96508     // Network Bearer Selection
96509     NetworkType:                        ["CELLULAR", "UNKNOWN"],
96510
96511     // NFC
96512     NDEFRecordTextEncoding:             ["UTF8", "UTF16"],
96513     NFCTagType:                         ["GENERIC_TARGET", "ISO14443_A",
96514                                          "ISO14443_4A", "ISO14443_3A",
96515                                          "MIFARE_MINI", "MIFARE_1K",
96516                                          "MIFARE_4K", "MIFARE_ULTRA",
96517                                          "MIFARE_DESFIRE", "ISO14443_B",
96518                                          "ISO14443_4B", "ISO14443_BPRIME",
96519                                          "FELICA", "JEWEL", "ISO15693",
96520                                          "UNKNOWN_TARGET"],
96521
96522     // Notification
96523     NotificationType:                   ["STATUS", "STATUS"],
96524     StatusNotificationType:             ["SIMPLE", "THUMBNAIL", "ONGOING",
96525                                          "PROGRESS"],
96526     NotificationProgressType:           ["PERCENTAGE", "BYTE"],
96527
96528     // System Info
96529     SystemInfoPropertyId:               ["BATTERY", "CPU", "STORAGE", "DISPLAY",
96530                                          "DEVICE_ORIENTATION", "BUILD",
96531                                          "LOCALE", "NETWORK", "WIFI_NETWORK",
96532                                          "CELLULAR_NETWORK", "SIM",
96533                                          "PERIPHERAL"],
96534     SystemInfoNetworkType:              ["NONE", "2G", "2.5G", "3G", "4G",
96535                                          "WIFI", "ETHERNET", "UNKNOWN"],
96536     SystemInfoDeviceOrientationStatus:  ["PORTRAIT_PRIMARY",
96537                                          "PORTRAIT_SECONDARY",
96538                                          "LANDSCAPE_PRIMARY",
96539                                          "LANDSCAPE_SECONDARY"],
96540     SystemInfoSimState:                 ["ABSENT", "INITIALIZING", "READY",
96541                                          "PIN_REQUIRED", "PUK_REQUIRED",
96542                                          "NETWORK_LOCKED", "SIM_LOCKED",
96543                                          "UNKNOWN"],
96544     SystemInfoProfile:                  ["MOBILE_FULL", "MOBILE_WEB"],
96545
96546     // System Setting
96547     SystemSettingType:                  ["HOME_SCREEN", "LOCK_SCREEN",
96548                                          "INCOMING_CALL", "NOTIFICATION_EMAIL"],
96549
96550     // Time
96551     TimeDurationUnit:                   ["MSECS", "SECS", "MINS", "HOURS",
96552                                          "DAYS"]
96553 };
96554
96555 /*
96556  * Derivative type definition
96557  */
96558
96559 /*
96560  * Object
96561  *
96562  * attributes
96563  *     Specify a type for each attribute.
96564  *
96565  * _optional
96566  *     Optional attributes table, which consists of two types of attributes,
96567  *
96568  *     nullable
96569  *         Nullable attributes, marked as '?' in IDL.
96570  *
96571  *     undefined
96572  *         Array type attributes, that not definitely specified to be
96573  *         initialized as an empty array, i.e., undefined-initialized array.
96574  *
96575  * _derived
96576  *     Subtype list, which consists of derived subtypes. It exists in the
96577  *     definition of a base type.
96578  *
96579  * _dictionary
96580  *     Dictionary type, which indicates that the object is a dictionary type.
96581  */
96582
96583 /*
96584  * Union types
96585  *     An array consists of two or more other types.
96586  */
96587
96588 /*
96589  * Common
96590  */
96591
96592 _t.AttributeFilter = {
96593     attributeName: _t.DOMString,
96594     matchFlag:     _t.FilterMatchFlag,
96595     matchValue:    _t.any,
96596
96597     _optional: {
96598         // nullable
96599         matchValue: true
96600     }
96601 };
96602
96603 _t.AttributeRangeFilter = {
96604     attributeName: _t.DOMString,
96605     initialValue:  _t.any,
96606     endValue:      _t.any,
96607
96608     _optional: {
96609         // nullable
96610         initialValue: true,
96611         endValue:     true
96612     }
96613 };
96614
96615 _t.CompositeFilter = {
96616     type:    _t.CompositeFilterType,
96617     filters: ["AbstractFilter"]     // Recursive expansion
96618 };
96619
96620 _t.AbstractFilter = {
96621     _derived: [_t.AttributeFilter, _t.AttributeRangeFilter, _t.CompositeFilter]
96622 };
96623
96624 _t.SortMode = {
96625     attributeName: _t.DOMString,
96626     order:         _t.SortModeOrder
96627 };
96628
96629 _t.SimpleCoordinates = {
96630     latitude:  _t.double,
96631     longitude: _t.double
96632 };
96633
96634 _t.SuccessCallback = _t.Function;
96635 _t.ErrorCallback   = _t.Function;
96636
96637 /*
96638  * Time
96639  */
96640
96641 _t.TimeDuration = {
96642     length:      _t.long_long,
96643     unit:        _t.TimeDurationUnit,
96644     difference:  _t.Function,
96645     equalsTo:    _t.Function,
96646     lessThan:    _t.Function,
96647     greaterThan: _t.Function
96648 };
96649
96650 /*
96651  * Alarm
96652  */
96653
96654 _t.AlarmId = _t.DOMString;
96655
96656 _t.AlarmRelative = {
96657     delay:               _t.unsigned_long_long,
96658     period:              _t.unsigned_long_long,
96659     getRemainingSeconds: _t.Function,
96660
96661     _optional: {
96662         // nullable
96663         period:              true,
96664         getRemainingSeconds: true
96665     }
96666 };
96667
96668 _t.AlarmAbsolute = {
96669     date:                 _t.Date,
96670     period:               _t.unsigned_long_long,
96671     daysOfTheWeek:        [_t.ByDayValue],
96672     getNextScheduledDate: _t.Function,
96673
96674     _optional: {
96675         // nullable
96676         period:               true,
96677         getNextScheduledDate: true
96678     }
96679 };
96680
96681 _t.Alarm = {
96682     id: _t.AlarmId,
96683
96684     _optional: {
96685         // nullable
96686         id: true
96687     },
96688
96689     _derived: [_t.AlarmRelative, _t.AlarmAbsolute]
96690 };
96691
96692 /*
96693  * Application
96694  */
96695
96696 _t.ApplicationId                              = _t.DOMString;
96697 _t.ApplicationContextId                       = _t.DOMString;
96698 _t.ApplicationInformationArraySuccessCallback = _t.Function;
96699 _t.FindAppControlSuccessCallback              = _t.Function;
96700 _t.ApplicationContextArraySuccessCallback     = _t.Function;
96701
96702 _t.ApplicationControlData = {
96703     key:   _t.DOMString,
96704     value: [_t.DOMString]
96705 };
96706
96707 _t.ApplicationControl = {
96708     operation: _t.DOMString,
96709     uri:       _t.DOMString,
96710     mime:      _t.DOMString,
96711     category:  _t.DOMString,
96712     data:      [_t.ApplicationControlData],
96713
96714     _optional: {
96715         // nullable
96716         uri:      true,
96717         mime:     true,
96718         category: true
96719     }
96720 };
96721
96722 _t.ApplicationControlDataArrayReplyCallback = {
96723     onsuccess: _t.Callback,
96724     onfailure: _t.Callback
96725 };
96726
96727 _t.ApplicationInformationEventCallback = {
96728     oninstalled:   _t.Callback,
96729     onupdated:     _t.Callback,
96730     onuninstalled: _t.Callback
96731 };
96732
96733 /*
96734  * Bluetooth
96735  */
96736
96737 _t.BluetoothAddress                          = _t.DOMString;
96738 _t.BluetoothUUID                             = _t.DOMString;
96739 _t.BluetoothDeviceSuccessCallback            = _t.Function;
96740 _t.BluetoothDeviceArraySuccessCallback       = _t.Function;
96741 _t.BluetoothSocketSuccessCallback            = _t.Function;
96742 _t.BluetoothServiceSuccessCallback           = _t.Function;
96743 _t.BluetoothHealthApplicationSuccessCallback = _t.Function;
96744 _t.BluetoothHealthChannelSuccessCallback     = _t.Function;
96745
96746 _t.BluetoothClass = {
96747     major:      _t.octet,
96748     minor:      _t.octet,
96749     services:   [_t.unsigned_short],
96750     hasService: _t.Function
96751 };
96752
96753 _t.BluetoothDevice = {
96754     name:                   _t.DOMString,
96755     address:                _t.BluetoothAddress,
96756     deviceClass:            _t.BluetoothClass,
96757     isBonded:               _t.boolean,
96758     isTrusted:              _t.boolean,
96759     isConnected:            _t.boolean,
96760     uuids:                  [_t.BluetoothUUID],
96761     connectToServiceByUUID: _t.Function
96762 };
96763
96764 _t.BluetoothHealthApplication = {
96765     dataType:   _t.unsigned_short,
96766     name:       _t.DOMString,
96767     onconnect:  _t.BluetoothHealthChannelSuccessCallback,
96768     unregister: _t.Function,
96769
96770     _optional: {
96771         onconnect: true
96772     }
96773 };
96774
96775 _t.BluetoothAdapterChangeCallback = {
96776     onstatechanged:      _t.Callback,
96777     onnamechanged:       _t.Callback,
96778     onvisibilitychanged: _t.Callback
96779 };
96780
96781 _t.BluetoothDiscoverDevicesSuccessCallback = {
96782     onstarted:           _t.Callback,
96783     ondevicefound:       _t.Callback,
96784     ondevicedisappeared: _t.Callback,
96785     onfinished:          _t.Callback
96786 };
96787
96788 _t.BluetoothHealthChannelChangeCallback = {
96789     onmessage: _t.Callback,
96790     onclose:   _t.Callback
96791 };
96792
96793 /*
96794  * Bookmark
96795  */
96796
96797 _t.BookmarkFolder = {
96798     parent: "BookmarkFolder",
96799     title:  _t.DOMString,
96800
96801     _optional: {
96802         // nullable
96803         parent: true
96804     }
96805 };
96806
96807 _t.BookmarkItem = {
96808     parent: _t.BookmarkFolder,
96809     title:  _t.DOMString,
96810     url:    _t.DOMString,
96811
96812     _optional: {
96813         // nullable
96814         parent: true
96815     }
96816 };
96817
96818 _t.Bookmark = [_t.BookmarkItem, _t.BookmarkFolder];
96819
96820 /*
96821  * Contact
96822  */
96823
96824 _t.AddressBookId  = _t.DOMString;
96825 _t.ContactId      = _t.DOMString;
96826 _t.PersonId       = _t.DOMString;
96827 _t.ContactGroupId = _t.DOMString;
96828
96829 _t.Person = {
96830     id:               _t.PersonId,
96831     displayName:      _t.DOMString,
96832     contactCount:     _t.long,
96833     hasPhoneNumber:   _t.boolean,
96834     hasEmail:         _t.boolean,
96835     isFavorite:       _t.boolean,
96836     photoURI:         _t.DOMString,
96837     ringtoneURI:      _t.DOMString,
96838     displayContactId: _t.ContactId,
96839
96840     _optional: {
96841         // nullable
96842         photoURI:    true,
96843         ringtoneURI: true
96844     }
96845 };
96846
96847 _t.ContactRef = {
96848     addressBookId: _t.AddressBookId,
96849     contactId:     _t.ContactId
96850 };
96851
96852 _t.ContactName = {
96853     prefix:            _t.DOMString,
96854     suffix:            _t.DOMString,
96855     firstName:         _t.DOMString,
96856     middleName:        _t.DOMString,
96857     lastName:          _t.DOMString,
96858     nicknames:         [_t.DOMString],
96859     phoneticFirstName: _t.DOMString,
96860     phoneticLastName:  _t.DOMString,
96861     displayName:       _t.DOMString,
96862
96863     _optional: {
96864         // nullable
96865         prefix:            true,
96866         suffix:            true,
96867         firstName:         true,
96868         middleName:        true,
96869         lastName:          true,
96870         phoneticFirstName: true,
96871         phoneticLastName:  true,
96872         displayName:       true
96873     }
96874 };
96875
96876 _t.ContactOrganization = {
96877     name:       _t.DOMString,
96878     department: _t.DOMString,
96879     title:      _t.DOMString,
96880     role:       _t.DOMString,
96881     logoURI:    _t.DOMString,
96882
96883     _optional: {
96884         // nullable
96885         name:       true,
96886         department: true,
96887         title:      true,
96888         role:       true,
96889         logoURI:    true
96890     }
96891 };
96892
96893 _t.ContactWebSite = {
96894     url:  _t.DOMString,
96895     type: _t.DOMString,
96896
96897     _optional: {
96898         // nullable
96899         type: true
96900     }
96901 };
96902
96903 _t.ContactAnniversary = {
96904     date:  _t.Date,
96905     label: _t.DOMString,
96906
96907     _optional: {
96908         // nullable
96909         label: true
96910     }
96911 };
96912
96913 _t.ContactAddress = {
96914     country:               _t.DOMString,
96915     region:                _t.DOMString,
96916     city:                  _t.DOMString,
96917     streetAddress:         _t.DOMString,
96918     additionalInformation: _t.DOMString,
96919     postalCode:            _t.DOMString,
96920     isDefault:             _t.boolean,
96921     types:                 [_t.DOMString],
96922
96923     _optional: {
96924         // nullable
96925         country:               true,
96926         region:                true,
96927         city:                  true,
96928         streetAddress:         true,
96929         additionalInformation: true,
96930         postalCode:            true,
96931         // undefined
96932         types:                 true
96933     }
96934 };
96935
96936 _t.ContactPhoneNumber = {
96937     number:    _t.DOMString,
96938     isDefault: _t.boolean,
96939     types:     [_t.DOMString],
96940
96941     _optional: {
96942         // undefined
96943         types: true
96944     }
96945 };
96946
96947 _t.ContactEmailAddress = {
96948     email:     _t.DOMString,
96949     isDefault: _t.boolean,
96950     types:     [_t.DOMString],
96951
96952     _optional: {
96953         // undefined
96954         types: true
96955     }
96956 };
96957
96958 _t.Contact = {
96959     id:              _t.ContactId,
96960     personId:        _t.PersonId,
96961     addressBookId:   _t.AddressBookId,
96962     lastUpdated:     _t.Date,
96963     isFavorite:      _t.boolean,
96964     name:            _t.ContactName,
96965     addresses:       [_t.ContactAddress],
96966     photoURI:        _t.DOMString,
96967     phoneNumbers:    [_t.ContactPhoneNumber],
96968     emails:          [_t.ContactEmailAddress],
96969     birthday:        _t.Date,
96970     anniversaries:   [_t.ContactAnniversary],
96971     organizations:   [_t.ContactOrganization],
96972     notes:           [_t.DOMString],
96973     urls:            [_t.ContactWebSite],
96974     ringtoneURI:     _t.DOMString,
96975     groupIds:        [_t.ContactGroupId],
96976     convertToString: _t.Function,
96977     clone:           _t.Function,
96978
96979     _optional: {
96980         // nullable
96981         id:            true,
96982         personId:      true,
96983         addressBookId: true,
96984         lastUpdated:   true,
96985         name:          true,
96986         photoURI:      true,
96987         birthday:      true,
96988         ringtoneURI:   true
96989     }
96990 };
96991
96992 _t.ContactGroup = {
96993     id:            _t.ContactGroupId,
96994     addressBookId: _t.AddressBookId,
96995     name:          _t.DOMString,
96996     ringtoneURI:   _t.DOMString,
96997     photoURI:      _t.DOMString,
96998     readOnly:      _t.boolean,
96999
97000     _optional: {
97001         // nullable
97002         id:            true,
97003         addressBookId: true,
97004         ringtoneURI:   true,
97005         photoURI:      true
97006     }
97007 };
97008
97009 _t.PersonArraySuccessCallback      = _t.Function;
97010 _t.ContactArraySuccessCallback     = _t.Function;
97011 _t.AddressBookArraySuccessCallback = _t.Function;
97012
97013 _t.AddressBookChangeCallback = {
97014     oncontactsadded:   _t.Callback,
97015     oncontactsupdated: _t.Callback,
97016     oncontactsremoved: _t.Callback
97017 };
97018
97019 _t.PersonsChangeCallback = {
97020     onpersonsadded:   _t.Callback,
97021     onpersonsupdated: _t.Callback,
97022     onpersonsremoved: _t.Callback
97023 };
97024
97025 _t.ContactInit = {
97026     name:          _t.ContactName,
97027     addresses:     [_t.ContactAddress],
97028     photoURI:      _t.DOMString,
97029     phoneNumbers:  [_t.ContactPhoneNumber],
97030     emails:        [_t.ContactEmailAddress],
97031     birthday:      _t.Date,
97032     anniversaries: [_t.ContactAnniversary],
97033     organizations: [_t.ContactOrganization],
97034     notes:         [_t.DOMString],
97035     urls:          [_t.ContactWebSite],
97036     ringtoneURI:   _t.DOMString,
97037     groupIds:      [_t.ContactGroupId],
97038
97039     _dictionary: null
97040 };
97041
97042 _t.ContactNameInit = {
97043     prefix:            _t.DOMString,
97044     suffix:            _t.DOMString,
97045     firstName:         _t.DOMString,
97046     middleName:        _t.DOMString,
97047     lastName:          _t.DOMString,
97048     nicknames:         [_t.DOMString],
97049     phoneticFirstName: _t.DOMString,
97050     phoneticLastName:  _t.DOMString,
97051
97052     _dictionary: null
97053 };
97054
97055 _t.ContactOrganizationInit = {
97056     name:       _t.DOMString,
97057     department: _t.DOMString,
97058     title:      _t.DOMString,
97059     role:       _t.DOMString,
97060     logoURI:    _t.DOMString,
97061
97062     _dictionary: null
97063 };
97064
97065 _t.ContactAddressInit = {
97066     country:               _t.DOMString,
97067     region:                _t.DOMString,
97068     city:                  _t.DOMString,
97069     streetAddress:         _t.DOMString,
97070     additionalInformation: _t.DOMString,
97071     postalCode:            _t.DOMString,
97072     isDefault:             _t.boolean,
97073     types:                 [_t.DOMString],
97074
97075     _dictionary: null
97076 };
97077
97078 /*
97079  * Calendar
97080  */
97081
97082 _t.CalendarId                        = _t.DOMString;
97083 _t.CalendarTaskId                    = _t.DOMString;
97084 _t.CalendarEventArraySuccessCallback = _t.Function;
97085 _t.CalendarItemArraySuccessCallback  = _t.Function;
97086 _t.CalendarArraySuccessCallback      = _t.Function;
97087
97088 _t.CalendarEventId = {
97089     uid: _t.DOMString,
97090     rid: _t.DOMString,
97091
97092     _optional: {
97093         // nullable
97094         rid: true
97095     }
97096 };
97097
97098 _t.CalendarItemId = [_t.CalendarEventId, _t.CalendarTaskId];
97099
97100 _t.CalendarAlarm = {
97101     absoluteDate: _t.TZDate,
97102     before:       _t.TimeDuration,
97103     method:       _t.AlarmMethod,
97104     description:  _t.DOMString,
97105
97106     _optional: {
97107         // nullable
97108         absoluteDate: true,
97109         before:       true,
97110         description:  true
97111     }
97112 };
97113
97114 _t.CalendarAttendee = {
97115     uri:          _t.DOMString,
97116     name:         _t.DOMString,
97117     role:         _t.AttendeeRole,
97118     status:       _t.AttendeeStatus,
97119     RSVP:         _t.boolean,
97120     type:         _t.AttendeeType,
97121     group:        _t.DOMString,
97122     delegatorURI: _t.DOMString,
97123     delegateURI:  _t.DOMString,
97124     contactRef:   _t.ContactRef,
97125
97126     _optional: {
97127         // nullable
97128         name:         true,
97129         group:        true,
97130         delegatorURI: true,
97131         delegateURI:  true,
97132         contactRef:   true
97133     }
97134 };
97135
97136 _t.CalendarRecurrenceRule = {
97137     frequency:       _t.RecurrenceRuleFrequency,
97138     interval:        _t.unsigned_short,
97139     untilDate:       _t.TZDate,
97140     occurrenceCount: _t.long,
97141     daysOfTheWeek:   [_t.ByDayValue],
97142     setPositions:    [_t.short],
97143     exceptions:      [_t.TZDate],
97144
97145     _optional: {
97146         // nullable
97147         untilDate: true
97148     }
97149 };
97150
97151 _t.CalendarTask = {
97152     dueDate:       _t.TZDate,
97153     completedDate: _t.TZDate,
97154     progress:      _t.unsigned_short,
97155
97156     _optional: {
97157         // nullable
97158         dueDate:       true,
97159         completedDate: true
97160     }
97161 };
97162
97163 _t.CalendarEvent = {
97164     isDetached:       _t.boolean,
97165     endDate:          _t.TZDate,
97166     availability:     _t.EventAvailability,
97167     recurrenceRule:   _t.CalendarRecurrenceRule,
97168     expandRecurrence: _t.Function,
97169
97170     _optional: {
97171         // nullable
97172         endDate:        true,
97173         recurrenceRule: true
97174     }
97175 };
97176
97177 _t.CalendarItem = {
97178     id:                   _t.CalendarItemId,
97179     calendarId:           _t.CalendarId,
97180     lastModificationDate: _t.TZDate,
97181     description:          _t.DOMString,
97182     summary:              _t.DOMString,
97183     isAllDay:             _t.boolean,
97184     startDate:            _t.TZDate,
97185     duration:             _t.TimeDuration,
97186     location:             _t.DOMString,
97187     geolocation:          _t.SimpleCoordinates,
97188     organizer:            _t.DOMString,
97189     visibility:           _t.CalendarItemVisibility,
97190     status:               _t.CalendarItemStatus,
97191     priority:             _t.CalendarItemPriority,
97192     alarms:               [_t.CalendarAlarm],
97193     categories:           [_t.DOMString],
97194     attendees:            [_t.CalendarAttendee],
97195     convertToString:      _t.Function,
97196     clone:                _t.Function,
97197
97198     _optional: {
97199         // nullable
97200         id:                   true,
97201         calendarId:           true,
97202         lastModificationDate: true,
97203         description:          true,
97204         summary:              true,
97205         startDate:            true,
97206         duration:             true,
97207         location:             true,
97208         geolocation:          true,
97209         organizer:            true
97210     },
97211
97212     _derived: [_t.CalendarTask, _t.CalendarEvent]
97213 };
97214
97215 _t.CalendarItemInit = {
97216     description: _t.DOMString,
97217     summary:     _t.DOMString,
97218     isAllDay:    _t.boolean,
97219     startDate:   _t.TZDate,
97220     duration:    _t.TimeDuration,
97221     location:    _t.DOMString,
97222     geolocation: _t.SimpleCoordinates,
97223     organizer:   _t.DOMString,
97224     visibility:  _t.CalendarItemVisibility,
97225     status:      _t.CalendarItemStatus,
97226     priority:    _t.CalendarItemPriority,
97227     alarms:      [_t.CalendarAlarm],
97228     categories:  [_t.DOMString],
97229     attendees:   [_t.CalendarAttendee],
97230
97231     _dictionary: null
97232 };
97233
97234 _t.CalendarTaskInit = {
97235     dueDate:       _t.TZDate,
97236     completedDate: _t.TZDate,
97237     progress:      _t.short,
97238
97239     _dictionary: _t.CalendarItemInit
97240 };
97241
97242 _t.CalendarEventInit = {
97243     endDate:        _t.TZDate,
97244     availability:   _t.EventAvailability,
97245     recurrenceRule: _t.CalendarRecurrenceRule,
97246
97247     _dictionary: _t.CalendarItemInit
97248 };
97249
97250 _t.CalendarAttendeeInit = {
97251     name:         _t.DOMString,
97252     role:         _t.AttendeeRole,
97253     status:       _t.AttendeeStatus,
97254     RSVP:         _t.boolean,
97255     type:         _t.AttendeeType,
97256     group:        _t.DOMString,
97257     delegatorURI: _t.DOMString,
97258     delegateURI:  _t.DOMString,
97259     contactRef:   _t.ContactRef,
97260
97261     _dictionary: null
97262 };
97263
97264 _t.CalendarRecurrenceRuleInit = {
97265     interval:        _t.short,
97266     untilDate:       _t.TZDate,
97267     occurrenceCount: _t.long,
97268     daysOfTheWeek:   [_t.ByDayValue],
97269     setPositions:    [_t.short],
97270     exceptions:      [_t.TZDate],
97271
97272     _dictionary: null
97273 };
97274
97275 _t.CalendarChangeCallback = {
97276     onitemsadded:   _t.Callback,
97277     onitemsupdated: _t.Callback,
97278     onitemsremoved: _t.Callback
97279 };
97280
97281 /*
97282  * CallHistory
97283  */
97284
97285 _t.CallHistoryEntryArraySuccessCallback = _t.Function;
97286
97287 _t.RemoteParty = {
97288     remoteParty: _t.DOMString,
97289     personId:    _t.PersonId,
97290
97291     _optional: {
97292         // nullable
97293         remoteParty: true,
97294         personId:    true
97295     }
97296 };
97297
97298 _t.CallHistoryEntry = {
97299     uid:           _t.DOMString,
97300     type:          _t.DOMString,
97301     features:      [_t.DOMString],
97302     remoteParties: [_t.RemoteParty],
97303     startTime:     _t.Date,
97304     duration:      _t.unsigned_long,
97305     direction:     _t.DOMString,
97306
97307     _optional: {
97308         // nullable
97309         features: true
97310     }
97311 };
97312
97313 _t.CallHistoryChangeCallback = {
97314     onadded:   _t.Callback,
97315     onchanged: _t.Callback,
97316     onremoved: _t.Callback
97317 };
97318
97319 /*
97320  * Content
97321  */
97322
97323 _t.ContentId                            = _t.DOMString;
97324 _t.ContentDirectoryId                   = _t.DOMString;
97325 _t.ContentArraySuccessCallback          = _t.Function;
97326 _t.ContentDirectoryArraySuccessCallback = _t.Function;
97327 _t.ContentScanSuccessCallback           = _t.Function;
97328
97329 _t.ContentChangeCallback = {
97330     oncontentadded:   _t.Callback,
97331     oncontentupdated: _t.Callback,
97332     oncontentremoved: _t.Callback
97333 };
97334
97335 _t.VideoContent = {
97336     geolocation: _t.SimpleCoordinates,
97337     album:       _t.DOMString,
97338     artists:     [_t.DOMString],
97339     duration:    _t.unsigned_long,
97340     width:       _t.unsigned_long,
97341     height:      _t.unsigned_long,
97342
97343     _optional: {
97344         // nullable
97345         geolocation: true,
97346         album:       true,
97347         artists:     true
97348     }
97349 };
97350
97351 _t.AudioContentLyrics = {
97352     type:       _t.AudioContentLyricsType,
97353     timestamps: [_t.unsigned_long],
97354     texts:      [_t.DOMString],
97355
97356     _optional: {
97357         // undefined
97358         timestamps: true
97359     }
97360 };
97361
97362 _t.AudioContent = {
97363     album:       _t.DOMString,
97364     genres:      [_t.DOMString],
97365     artists:     [_t.DOMString],
97366     composers:   [_t.DOMString],
97367     lyrics:      _t.AudioContentLyrics,
97368     copyright:   _t.DOMString,
97369     bitrate:     _t.unsigned_long,
97370     trackNumber: _t.unsigned_short,
97371     duration:    _t.unsigned_long,
97372
97373     _optional: {
97374         // nullable
97375         album:       true,
97376         genres:      true,
97377         artists:     true,
97378         composers:   true,
97379         lyrics:      true,
97380         copyright:   true,
97381         trackNumber: true
97382     }
97383 };
97384
97385 _t.ImageContent = {
97386     geolocation: _t.SimpleCoordinates,
97387     width:       _t.unsigned_long,
97388     height:      _t.unsigned_long,
97389     orientation: _t.ImageContentOrientation,
97390
97391     _optional: {
97392         // nullable
97393         geolocation: true
97394     }
97395 };
97396
97397 _t.Content = {
97398     editableAttributes: [_t.DOMString],
97399     id:                 _t.ContentId,
97400     name:               _t.DOMString,
97401     type:               _t.ContentType,
97402     mimeType:           _t.DOMString,
97403     title:              _t.DOMString,
97404     contentURI:         _t.DOMString,
97405     thumbnailURIs:      [_t.DOMString],
97406     releaseDate:        _t.Date,
97407     modifiedDate:       _t.Date,
97408     size:               _t.unsigned_long,
97409     description:        _t.DOMString,
97410     rating:             _t.float,
97411
97412     _optional: {
97413         // nullable
97414         thumbnailURIs: true,
97415         releaseDate:   true,
97416         modifiedDate:  true,
97417         description:   true
97418     },
97419
97420     _derived: [_t.VideoContent, _t.AudioContent, _t.ImageContent]
97421 };
97422
97423 /*
97424  * Data Control
97425  */
97426
97427 _t.DataControlSuccessCallback         = _t.Function;
97428 _t.DataControlErrorCallback           = _t.Function;
97429 _t.DataControlInsertSuccessCallback   = _t.Function;
97430 _t.DataControlSelectSuccessCallback   = _t.Function;
97431 _t.DataControlGetValueSuccessCallback = _t.Function;
97432
97433 _t.RowData = {
97434     columns: [_t.DOMString],
97435     values:  [_t.DOMString]
97436 };
97437
97438 /*
97439  * Data Synchronization
97440  */
97441
97442 _t.SyncProfileId = _t.DOMString;
97443
97444 _t.SyncInfo = {
97445     url:      _t.DOMString,
97446     id:       _t.DOMString,
97447     password: _t.DOMString,
97448     mode:     _t.SyncMode,
97449     type:     _t.SyncType,
97450     interval: _t.SyncInterval,
97451
97452     _optional: {
97453         // nullable
97454         id:       true,
97455         password: true,
97456         type:     true,
97457         interval: true
97458     }
97459 };
97460
97461 _t.SyncServiceInfo = {
97462     enable:            _t.boolean,
97463     serviceType:       _t.SyncServiceType,
97464     serverDatabaseUri: _t.DOMString,
97465     id:                _t.DOMString,
97466     password:          _t.DOMString,
97467
97468     _optional: {
97469         // nullable
97470         id:       true,
97471         password: true
97472     }
97473 };
97474
97475 _t.SyncProfileInfo = {
97476     profileId:   _t.SyncProfileId,
97477     profileName: _t.DOMString,
97478     syncInfo:    _t.SyncInfo,
97479     serviceInfo: [_t.SyncServiceInfo],
97480
97481     _optional: {
97482         // nullable
97483         profileId:   true,
97484         serviceInfo: true
97485     }
97486 };
97487
97488 _t.SyncProgressCallback = {
97489     onprogress:  _t.Callback,
97490     oncompleted: _t.Callback,
97491     onstopped:   _t.Callback,
97492     onfailed:    _t.Callback
97493 };
97494
97495 /*
97496  * Download
97497  */
97498
97499 _t.DownloadHTTPHeaderFields = {};
97500
97501 _t.DownloadRequest = {
97502     url:         _t.DOMString,
97503     destination: _t.DOMString,
97504     fileName:    _t.DOMString,
97505     networkType: _t.DownloadNetworkType,
97506     httpHeader:  _t.DownloadHTTPHeaderFields,
97507
97508     _optional: {
97509         destination: true,
97510         fileName:    true,
97511         networkType: true,
97512         httpHeader:  true
97513     }
97514 };
97515
97516 _t.DownloadCallback = {
97517     onprogress:  _t.Callback,
97518     onpaused:    _t.Callback,
97519     oncanceled:  _t.Callback,
97520     oncompleted: _t.Callback,
97521     onfailed:    _t.Callback
97522 };
97523
97524 /*
97525  * Messaging
97526  */
97527
97528 _t.MessageId                               = _t.DOMString;
97529 _t.MessageAttachmentId                     = _t.DOMString;
97530 _t.MessageConvId                           = _t.DOMString;
97531 _t.MessageFolderId                         = _t.DOMString;
97532 _t.MessageServiceArraySuccessCallback      = _t.Function;
97533 _t.MessageRecipientsCallback               = _t.Function;
97534 _t.MessageBodySuccessCallback              = _t.Function;
97535 _t.MessageAttachmentSuccessCallback        = _t.Function;
97536 _t.MessageArraySuccessCallback             = _t.Function;
97537 _t.MessageConversationArraySuccessCallback = _t.Function;
97538 _t.MessageFolderArraySuccessCallback       = _t.Function;
97539
97540 _t.MessageFolder = {
97541     id:             _t.MessageFolderId,
97542     parentId:       _t.MessageFolderId,
97543     serviceId:      _t.DOMString,
97544     contentType:    _t.MessageServiceTag,
97545     name:           _t.DOMString,
97546     path:           _t.DOMString,
97547     type:           _t.DOMString,
97548     synchronizable: _t.boolean,
97549
97550     _optional: {
97551         // nullable
97552         parentId: true
97553     }
97554 };
97555
97556 _t.MessagesChangeCallback = {
97557     messagesadded:   _t.Callback,
97558     messagesupdated: _t.Callback,
97559     messagesremoved: _t.Callback
97560 };
97561
97562 _t.MessageConversationsChangeCallback = {
97563     conversationsadded:   _t.Callback,
97564     conversationsupdated: _t.Callback,
97565     conversationsremoved: _t.Callback
97566 };
97567
97568 _t.MessageFoldersChangeCallback = {
97569     foldersadded:   _t.Callback,
97570     foldersupdated: _t.Callback,
97571     foldersremoved: _t.Callback
97572 };
97573
97574 /*
97575  * Message Port
97576  */
97577
97578 _t.MessagePortCallback = _t.Function;
97579
97580 _t.LocalMessagePort = {
97581     messagePortName:           _t.DOMString,
97582     isTrusted:                 _t.boolean,
97583     addMessagePortListener:    _t.Function,
97584     removeMessagePortListener: _t.Function
97585 };
97586
97587 _t.MessagePortDataItem = {
97588     key:   _t.DOMString,
97589     value: _t.DOMString,
97590
97591     _dictionary: null
97592 };
97593
97594 /*
97595  * Network Bearer Selection
97596  */
97597
97598 _t.NetworkSuccessCallback = {
97599     onsuccess:      _t.Callback,
97600     ondisconnected: _t.Callback
97601 };
97602
97603 /*
97604  * NFC
97605  */
97606
97607 _t.NDEFMessageReadCallback  = _t.Function;
97608 _t.ByteArraySuccessCallback = _t.Function;
97609
97610 _t.NFCTagDetectCallback = {
97611     onattach: _t.Callback,
97612     ondetach: _t.Callback
97613 };
97614
97615 _t.NFCPeerDetectCallback = {
97616     onattach: _t.Callback,
97617     ondetach: _t.Callback
97618 };
97619
97620 _t.NDEFRecordText = {
97621     text:         _t.DOMString,
97622     languageCode: _t.DOMString,
97623     encoding:     _t.NDEFRecordTextEncoding
97624 };
97625
97626 _t.NDEFRecordURI = {
97627     uri: _t.DOMString
97628 };
97629
97630 _t.NDEFRecordMedia = {
97631     mimeType: _t.DOMString
97632 };
97633
97634 _t.NDEFRecord = {
97635     tnf:     _t.short,
97636     type:    [_t.byte],
97637     id:      [_t.byte],
97638     payload: [_t.byte],
97639
97640     _derived: [_t.NDEFRecordText, _t.NDEFRecordURI, _t.NDEFRecordMedia]
97641 };
97642
97643 _t.NDEFMessage = {
97644     recordCount: _t.long,
97645     records:     [_t.NDEFRecord],
97646     toByte:      _t.Function
97647 };
97648
97649 /*
97650  * Notification
97651  */
97652
97653 _t.NotificationId = _t.DOMString;
97654
97655 _t.NotificationDetailInfo = {
97656     mainText: _t.DOMString,
97657     subText:  _t.DOMString,
97658
97659     _optional: {
97660         // nullable
97661         subText: true
97662     }
97663 };
97664
97665 _t.StatusNotificationInit = {
97666     content:             _t.DOMString,
97667     iconPath:            _t.DOMString,
97668     soundPath:           _t.DOMString,
97669     vibration:           _t.boolean,
97670     appControl:          _t.ApplicationControl,
97671     appId:               _t.ApplicationId,
97672     progressType:        _t.NotificationProgressType,
97673     progressValue:       _t.unsigned_long,
97674     number:              _t.long,
97675     subIconPath:         _t.DOMString,
97676     detailInfo:          [_t.NotificationDetailInfo],
97677     ledColor:            _t.DOMString,
97678     ledOnPeriod:         _t.unsigned_long,
97679     ledOffPeriod:        _t.unsigned_long,
97680     backgroundImagePath: _t.DOMString,
97681     thumbnails:          [_t.DOMString],
97682
97683     _dictionary: null
97684 };
97685
97686 _t.StatusNotification = {
97687     statusType:          _t.StatusNotificationType,
97688     iconPath:            _t.DOMString,
97689     subIconPath:         _t.DOMString,
97690     number:              _t.long,
97691     detailInfo:          [_t.NotificationDetailInfo],
97692     ledColor:            _t.DOMString,
97693     ledOnPeriod:         _t.unsigned_long,
97694     ledOffPeriod:        _t.unsigned_long,
97695     backgroundImagePath: _t.DOMString,
97696     thumbnails:          [_t.DOMString],
97697     soundPath:           _t.DOMString,
97698     vibration:           _t.boolean,
97699     appControl:          _t.ApplicationControl,
97700     appId:               _t.ApplicationId,
97701     progressType:        _t.NotificationProgressType,
97702     progressValue:       _t.unsigned_long,
97703
97704     _optional: {
97705         // nullable
97706         iconPath:            true,
97707         subIconPath:         true,
97708         number:              true,
97709         detailInfo:          true,
97710         ledColor:            true,
97711         backgroundImagePath: true,
97712         thumbnails:          true,
97713         soundPath:           true,
97714         appControl:          true,
97715         appId:               true,
97716         progressValue:       true
97717     }
97718 };
97719
97720 _t.Notification = {
97721     id:         _t.NotificationId,
97722     type:       _t.NotificationType,
97723     postedTime: _t.Date,
97724     title:      _t.DOMString,
97725     content:    _t.DOMString,
97726
97727     _optional: {
97728         // nullable
97729         id:         true,
97730         postedTime: true,
97731         content:    true
97732     },
97733
97734     _derived: [_t.StatusNotification]
97735 };
97736
97737 /*
97738  * Push
97739  */
97740
97741 _t.PushRegistrationId          = _t.DOMString;
97742 _t.PushRegisterSuccessCallback = _t.Function;
97743 _t.PushNotificationCallback    = _t.Function;
97744
97745 /*
97746  * Secure Element
97747  */
97748
97749 _t.ReaderArraySuccessCallback = _t.Function;
97750 _t.SEChangeListener = {
97751     onSEReady:    _t.Callback,
97752     onSENotReady: _t.Callback
97753 };
97754 _t.SessionSuccessCallback  = _t.Function;
97755 _t.ChannelSuccessCallback  = _t.Function;
97756 _t.TransmitSuccessCallback = _t.Function;
97757
97758 /*
97759  * Package
97760  */
97761
97762 _t.PackageId = _t.DOMString;
97763 _t.PackageInformationArraySuccessCallback = _t.Function;
97764
97765 _t.PackageProgressCallback = {
97766     onprogress: _t.Callback,
97767     oncomplete: _t.Callback
97768 };
97769
97770 _t.PackageInfomationEventCallback = {
97771     oninstalled:   _t.Callback,
97772     onupdated:     _t.Callback,
97773     onuninstalled: _t.Callback
97774 };
97775
97776 /*
97777  * System Info
97778  */
97779
97780 _t.SystemInfoPropertySuccessCallback = _t.Callback;
97781
97782 _t.SystemInfoOptions = {
97783     timeout:       _t.unsigned_long,
97784     highThreshold: _t.double,
97785     lowThreshold:  _t.double,
97786
97787     _dictionary: null
97788 };
97789
97790 /*
97791  * System Setting
97792  */
97793
97794 _t.SystemSettingSuccessCallback = _t.Function;
97795
97796 /*
97797  * Constructor list definition
97798  */
97799
97800 /*
97801  * Generic constructor
97802  *     Construct a prototype of constructor. A fake array of arguments type is
97803  *     specified for constructor.
97804  *
97805  * Overloaded constructors
97806  *     Construct an array of prototype of constructor. Each array element is
97807  *     specified for one of constructors. The constructor with extra arguments
97808  *     are recommended to be defined ahead of the one with fewer same arguments
97809  *     for exact match.
97810  */
97811
97812 _c = {
97813     // Alarm
97814     AlarmAbsolute: [],
97815
97816     // Calendar
97817     CalendarTask:  [],
97818     CalendarEvent: [],
97819     CalendarAlarm: [],
97820
97821     // Contact
97822     Contact:       [],
97823
97824     // NFC
97825     NDEFMessage:   [],
97826     NDEFRecord:    [],
97827
97828     // Data Synchronization
97829     SyncInfo:      [],
97830
97831     // Time
97832     TZDate:        []
97833 };
97834
97835 /*
97836  * Common
97837  */
97838
97839 // AttributeFilter
97840 _c.AttributeFilter = {
97841     0: _t.DOMString,
97842     1: _t.FilterMatchFlag,
97843     2: _t.any,
97844
97845     _optional: {
97846         1: true,
97847         2: true
97848     }
97849 };
97850
97851 // AttributeRangeFilter
97852 _c.AttributeRangeFilter = {
97853     0: _t.DOMString,
97854     1: _t.any,
97855     2: _t.any,
97856
97857     _optional: {
97858         1: true,
97859         2: true
97860     }
97861 };
97862
97863 // CompositeFilter
97864 _c.CompositeFilter = {
97865     0: _t.CompositeFilterType,
97866     1: [_t.AbstractFilter],
97867
97868     _optional: {
97869         1: true
97870     }
97871 };
97872
97873 // SortMode
97874 _c.SortMode = {
97875     0: _t.DOMString,
97876     1: _t.SortModeOrder,
97877
97878     _optional: {
97879         1: true
97880     }
97881 };
97882
97883 // SimpleCoordinates
97884 _c.SimpleCoordinates = {
97885     0: _t.double,
97886     1: _t.double
97887 };
97888
97889 /*
97890  * Alarm
97891  */
97892
97893 // AlarmRelative
97894 _c.AlarmRelative = {
97895     0: _t.long,
97896     1: _t.long,
97897
97898     _optional: {
97899         1: true
97900     }
97901 };
97902
97903 // AlarmAbsolute
97904 _c.AlarmAbsolute[0] = {
97905     0: _t.Date,
97906     1: [_t.ByDayValue]
97907 };
97908
97909 _c.AlarmAbsolute[1] = {
97910     0: _t.Date,
97911     1: _t.long
97912 };
97913
97914 _c.AlarmAbsolute[2] = {
97915     0: _t.Date
97916 };
97917
97918 /*
97919  * Application
97920  */
97921
97922 // ApplicationControlData
97923 _c.ApplicationControlData = {
97924     0: _t.DOMString,
97925     1: [_t.DOMString]
97926 };
97927
97928 // ApplicationControl
97929 _c.ApplicationControl = {
97930     0: _t.DOMString,
97931     1: _t.DOMString,
97932     2: _t.DOMString,
97933     3: _t.DOMString,
97934     4: [_t.ApplicationControlData],
97935
97936     _optional: {
97937         1: true,
97938         2: true,
97939         3: true,
97940         4: true
97941     }
97942 };
97943
97944 /*
97945  * Bookmark
97946  */
97947
97948 // BookmarkItem
97949 _c.BookmarkItem = {
97950     0: _t.DOMString,
97951     1: _t.DOMString
97952 };
97953
97954 // BookmarkFolder
97955 _c.BookmarkFolder = {
97956     0: _t.DOMString
97957 };
97958
97959 /*
97960  * Calendar
97961  */
97962
97963 // CalendarTask
97964 _c.CalendarTask[0] = {
97965     0: _t.CalendarTaskInit,
97966
97967     _optional: {
97968         // nullable
97969         0: true
97970     }
97971 };
97972
97973 _c.CalendarTask[1] = {
97974     0: _t.DOMString,
97975     1: _t.CalendarTextFormat
97976 };
97977
97978 // CalendarEvent
97979 _c.CalendarEvent[0] = {
97980     0: _t.CalendarEventInit,
97981
97982     _optional: {
97983         // nullable
97984         0: true
97985     }
97986 };
97987
97988 _c.CalendarEvent[1] = {
97989     0: _t.DOMString,
97990     1: _t.CalendarTextFormat
97991 };
97992
97993 // CalendarAttendee
97994 _c.CalendarAttendee = {
97995     0: _t.DOMString,
97996     1: _t.CalendarAttendeeInit,
97997
97998     _optional: {
97999         1: true
98000     }
98001 };
98002
98003 // CalendarRecurrenceRule
98004 _c.CalendarRecurrenceRule = {
98005     0: _t.RecurrenceRuleFrequency,
98006     1: _t.CalendarRecurrenceRuleInit,
98007
98008     _optional: {
98009         1: true
98010     }
98011 };
98012
98013 // CalendarEventId
98014 _c.CalendarEventId = {
98015     0: _t.DOMString,
98016     1: _t.DOMString,
98017
98018     _optional: {
98019         1: true
98020     }
98021 };
98022
98023 // CalendarAlarm
98024 _c.CalendarAlarm[0] = {
98025     0: _t.TZDate,
98026     1: _t.AlarmMethod,
98027     2: _t.DOMString,
98028
98029     _optional: {
98030         2: true
98031     }
98032 };
98033
98034 _c.CalendarAlarm[1] = {
98035     0: _t.TimeDuration,
98036     1: _t.AlarmMethod,
98037     2: _t.DOMString,
98038
98039     _optional: {
98040         2: true
98041     }
98042 };
98043
98044 /*
98045  * Contact
98046  */
98047
98048 // Contact
98049 _c.Contact[0] = {
98050     0: _t.ContactInit,
98051
98052     _optional: {
98053         0: true
98054     }
98055 };
98056
98057 _c.Contact[1] = {
98058     0: _t.DOMString
98059 };
98060
98061 // ContactRef
98062 _c.ContactRef = {
98063     0: _t.AddressBookId,
98064     1: _t.ContactId
98065 };
98066
98067 // ContactName
98068 _c.ContactName = {
98069     0: _t.ContactNameInit,
98070
98071     _optional: {
98072         0: true
98073     }
98074 };
98075
98076 // ContactOrganization
98077 _c.ContactOrganization = {
98078     0: _t.ContactOrganizationInit,
98079
98080     _optional: {
98081         0: true
98082     }
98083 };
98084
98085 // ContactWebSite
98086 _c.ContactWebSite = {
98087     0: _t.DOMString,
98088     1: _t.DOMString,
98089
98090     _optional: {
98091         1: true
98092     }
98093 };
98094
98095 // ContactAnniversary
98096 _c.ContactAnniversary = {
98097     0: _t.Date,
98098     1: _t.DOMString,
98099
98100     _optional: {
98101         1: true
98102     }
98103 };
98104
98105 // ContactAddress
98106 _c.ContactAddress = {
98107     0: _t.ContactAddressInit,
98108
98109     _optional: {
98110         0: true
98111     }
98112 };
98113
98114 // ContactPhoneNumber
98115 _c.ContactPhoneNumber = {
98116     0: _t.DOMString,
98117     1: [_t.DOMString],
98118     2: _t.boolean,
98119
98120     _optional: {
98121         1: true,
98122         2: true
98123     }
98124 };
98125
98126 // ContactEmailAddress
98127 _c.ContactEmailAddress = {
98128     0: _t.DOMString,
98129     1: [_t.DOMString],
98130     2: _t.boolean,
98131
98132     _optional: {
98133         1: true,
98134         2: true
98135     }
98136 };
98137
98138 // ContactGroup
98139 _c.ContactGroup = {
98140     0: _t.DOMString,
98141     1: _t.DOMString,
98142     2: _t.DOMString,
98143
98144     _optional: {
98145         1: true,
98146         2: true
98147     }
98148 };
98149
98150 /*
98151  * Data Synchronization
98152  */
98153
98154 // SyncInfo
98155 _c.SyncInfo[0] = {
98156     0: _t.DOMString,
98157     1: _t.DOMString,
98158     2: _t.DOMString,
98159     3: _t.SyncMode,
98160     4: _t.SyncType
98161 };
98162
98163 _c.SyncInfo[1] = {
98164     0: _t.DOMString,
98165     1: _t.DOMString,
98166     2: _t.DOMString,
98167     3: _t.SyncMode,
98168     4: _t.SyncInterval
98169 };
98170
98171 _c.SyncInfo[2] = {
98172     0: _t.DOMString,
98173     1: _t.DOMString,
98174     2: _t.DOMString,
98175     3: _t.SyncMode
98176 };
98177
98178 // SyncServiceInfo
98179 _c.SyncServiceInfo = {
98180     0: _t.boolean,
98181     1: _t.SyncServiceType,
98182     2: _t.DOMString,
98183     3: _t.DOMString,
98184     4: _t.DOMString,
98185
98186     _optional: {
98187         3: true,
98188         4: true
98189     }
98190 };
98191
98192 // SyncProfileInfo
98193 _c.SyncProfileInfo = {
98194     0: _t.DOMString,
98195     1: _t.SyncInfo,
98196     2: [_t.SyncServiceInfo],
98197
98198     _optional: {
98199         2: true
98200     }
98201 };
98202
98203 /*
98204  * Download
98205  */
98206
98207 // DownloadRequest
98208 _c.DownloadRequest = {
98209     0: _t.DOMString,
98210     1: _t.DOMString,
98211     2: _t.DOMString,
98212     3: _t.DownloadNetworkType,
98213     4: _t.DownloadHTTPHeaderFields,
98214
98215     _optional: {
98216         1: true,
98217         2: true,
98218         3: true,
98219         4: true
98220     }
98221 };
98222
98223 /*
98224  * NFC
98225  */
98226
98227 // NDEFMessage
98228 _c.NDEFMessage[0] = {
98229     0: [_t.NDEFRecord]
98230 };
98231
98232 _c.NDEFMessage[1] = {
98233     0: [_t.byte]
98234 };
98235
98236 _c.NDEFMessage[2] = null;
98237
98238 // NDEFRecord
98239 _c.NDEFRecord[0] = {
98240     0: _t.short,
98241     1: [_t.byte],
98242     2: [_t.byte],
98243     3: [_t.byte],
98244
98245     _optional: {
98246         3: true
98247     }
98248 };
98249
98250 _c.NDEFRecord[1] = {
98251     0: [_t.byte]
98252 };
98253
98254 // NDEFRecordText
98255 _c.NDEFRecordText = {
98256     0: _t.DOMString,
98257     1: _t.DOMString,
98258     2: _t.DOMString,
98259
98260     _optional: {
98261         2: true
98262     }
98263 };
98264
98265 // NDEFRecordURI
98266 _c.NDEFRecordURI = {
98267     0: _t.DOMString
98268 };
98269
98270 // NDEFRecordMedia
98271 _c.NDEFRecordMedia = {
98272     0: _t.DOMString,
98273     1: [_t.byte]
98274 };
98275
98276 /*
98277  * Notification
98278  */
98279
98280 // StatusNotification
98281 _c.StatusNotification = {
98282     0: _t.StatusNotificationType,
98283     1: _t.DOMString,
98284     2: _t.StatusNotificationInit,
98285
98286     _optional: {
98287         2: true
98288     }
98289 };
98290
98291 // NotificationDetailInfo
98292 _c.NotificationDetailInfo = {
98293     0: _t.DOMString,
98294     1: _t.DOMString,
98295
98296     _optional: {
98297         1: true
98298     }
98299 };
98300
98301 /*
98302  * Time
98303  */
98304
98305 // TZDate
98306 _c.TZDate[0] = {
98307     0: _t.Date,
98308     1: _t.DOMString,
98309
98310     _optional: {
98311         // nullable
98312         0: true,
98313         1: true
98314     }
98315 };
98316
98317 _c.TZDate[1] = {
98318     0: _t.long,
98319     1: _t.long,
98320     2: _t.long,
98321     3: _t.long,
98322     4: _t.long,
98323     5: _t.long,
98324     6: _t.long,
98325     7: _t.DOMString,
98326
98327     _optional: {
98328         // nullable
98329         3: true,
98330         4: true,
98331         5: true,
98332         6: true,
98333         7: true
98334     }
98335 };
98336
98337 // TimeDuration
98338 _c.TimeDuration = {
98339     0: _t.long_long,
98340     1: _t.TimeDurationUnit,
98341
98342     _optional: {
98343         // nullable
98344         1: true
98345     }
98346 };
98347
98348 /*
98349  * Interface prototype definition
98350  */
98351
98352 _i = {
98353     // Alarm
98354     AlarmManager:                  {},
98355
98356     // Application
98357     ApplicationManager:            {},
98358     Application:                   {},
98359     RequestedApplicationControl:   {},
98360
98361     // Bluetooth
98362     BluetoothManager:              {},
98363     BluetoothAdapter:              {},
98364     BluetoothDevice:               {},
98365     BluetoothSocket:               {},
98366     BluetoothClass:                {},
98367     BluetoothServiceHandler:       {},
98368     BluetoothHealthProfileHandler: {},
98369     BluetoothHealthApplication:    {},
98370     BluetoothHealthChannel:        {},
98371
98372     // Bookmark
98373     BookmarkManager:               {},
98374
98375     // Calendar
98376     CalendarManager:               {},
98377     Calendar:                      {},
98378     CalendarItem:                  {},
98379     CalendarEvent:                 {},
98380
98381     // Call History
98382     CallHistory:                   {},
98383
98384     // Contact
98385     ContactManager:                {},
98386     AddressBook:                   {},
98387     Person:                        {},
98388     Contact:                       {},
98389
98390     // Content
98391     ContentManager:                {},
98392
98393     // Data Control
98394     DataControlManager:            {},
98395     SQLDataControlConsumer:        {},
98396     MappedDataControlConsumer:     {},
98397
98398     // Data Synchronization
98399     DataSynchronizationManager:    {},
98400
98401     // Download
98402     DownloadManager:               {},
98403
98404     // Network Bearer Selection
98405     NetworkBearerSelection:        {},
98406
98407     // NFC
98408     NFCManager:                    {},
98409     NFCAdapter:                    {},
98410     NFCTag:                        {},
98411     NFCPeer:                       {},
98412     NDEFMessage:                   {},
98413
98414     // Notification
98415     NotificationManager:           {},
98416
98417     // Message
98418     Messaging:                     {},
98419     MessageService:                {},
98420     MessageStorage:                {},
98421
98422     // Message Port
98423     MessagePortManager:            {},
98424     LocalMessagePort:              {},
98425     RemoteMessagePort:             {},
98426
98427     // Package
98428     PackageManager:                {},
98429
98430     // Push
98431     PushManager:                   {},
98432
98433     // Secure Element
98434     SEService:                     {},
98435     Reader:                        {},
98436     Session:                       {},
98437     Channel:                       {},
98438
98439     // System Info
98440     SystemInfo:                    {},
98441
98442     // System Setting
98443     SystemSettingManager:          {},
98444
98445     // Time
98446     TimeUtil:                      {},
98447     TZDate:                        {},
98448     TimeDuration:                  {},
98449
98450     // Web Setting
98451     WebSettingManager:             {}
98452 };
98453
98454 /*
98455  * Alarm
98456  */
98457
98458 // AlarmManager
98459 _i.AlarmManager.add = {
98460     0: _t.Alarm,
98461     1: _t.ApplicationId,
98462     2: _t.ApplicationControl,
98463
98464     _optional: {
98465         2: true
98466     }
98467 };
98468
98469 _i.AlarmManager.remove = {
98470     0: _t.AlarmId
98471 };
98472
98473 _i.AlarmManager.removeAll = null;
98474
98475 _i.AlarmManager.get = {
98476     0: _t.AlarmId
98477 };
98478
98479 _i.AlarmManager.getAll = null;
98480
98481 /*
98482  * Application
98483  */
98484
98485 // ApplicationManager
98486 _i.ApplicationManager.getCurrentApplication = null;
98487
98488 _i.ApplicationManager.kill = {
98489     0: _t.ApplicationContextId,
98490     1: _t.SuccessCallback,
98491     2: _t.ErrorCallback,
98492
98493     _optional: {
98494         1: true,
98495         2: true
98496     }
98497 };
98498
98499 _i.ApplicationManager.launch = {
98500     0: _t.ApplicationId,
98501     1: _t.SuccessCallback,
98502     2: _t.ErrorCallback,
98503
98504     _optional: {
98505         1: true,
98506         2: true
98507     }
98508 };
98509
98510 _i.ApplicationManager.launchAppControl = {
98511     0: _t.ApplicationControl,
98512     1: _t.ApplicationId,
98513     2: _t.SuccessCallback,
98514     3: _t.ErrorCallback,
98515     4: _t.ApplicationControlDataArrayReplyCallback,
98516
98517     _optional: {
98518         1: true,
98519         2: true,
98520         3: true,
98521         4: true
98522     }
98523 };
98524
98525 _i.ApplicationManager.findAppControl = {
98526     0: _t.ApplicationControl,
98527     1: _t.FindAppControlSuccessCallback,
98528     2: _t.ErrorCallback,
98529
98530     _optional: {
98531         2: true
98532     }
98533 };
98534
98535 _i.ApplicationManager.getAppsContext = {
98536     0: _t.ApplicationContextArraySuccessCallback,
98537     1: _t.ErrorCallback,
98538
98539     _optional: {
98540         1: true
98541     }
98542 };
98543
98544 _i.ApplicationManager.getAppContext = {
98545     0: _t.ApplicationContextId,
98546
98547     _optional: {
98548         0: true
98549     }
98550 };
98551
98552 _i.ApplicationManager.getAppsInfo = {
98553     0: _t.ApplicationInformationArraySuccessCallback,
98554     1: _t.ErrorCallback,
98555
98556     _optional: {
98557         1: true
98558     }
98559 };
98560
98561 _i.ApplicationManager.getAppInfo = {
98562     0: _t.ApplicationId,
98563
98564     _optional: {
98565         0: true
98566     }
98567 };
98568
98569 _i.ApplicationManager.getAppCerts = {
98570     0: _t.ApplicationId,
98571
98572     _optional: {
98573         0: true
98574     }
98575 };
98576
98577 _i.ApplicationManager.getAppSharedURI = {
98578     0: _t.ApplicationId,
98579
98580     _optional: {
98581         0: true
98582     }
98583 };
98584
98585 _i.ApplicationManager.getAppMetaData = {
98586     0: _t.ApplicationId,
98587
98588     _optional: {
98589         0: true
98590     }
98591 };
98592
98593 _i.ApplicationManager.addAppInfoEventListener = {
98594     0: _t.ApplicationInformationEventCallback
98595 };
98596
98597 _i.ApplicationManager.removeAppInfoEventListener = {
98598     0: _t.long
98599 };
98600
98601 // Application
98602 _i.Application.exit = null;
98603 _i.Application.hide = null;
98604 _i.Application.getRequestedAppControl = null;
98605
98606 // RequestedApplicationControl
98607 _i.RequestedApplicationControl.replyResult = {
98608     0: [_t.ApplicationControlData],
98609
98610     _optional: {
98611         0: true
98612     }
98613 };
98614
98615 _i.RequestedApplicationControl.replyFailure = null;
98616
98617 /*
98618  * Bluetooth
98619  */
98620
98621 // BluetoothManager
98622 _i.BluetoothManager.getDefaultAdapter = null;
98623
98624 // BluetoothAdapter
98625 _i.BluetoothAdapter.setName = {
98626     0: _t.DOMString,
98627     1: _t.SuccessCallback,
98628     2: _t.ErrorCallback,
98629
98630     _optional: {
98631         1: true,
98632         2: true
98633     }
98634 };
98635
98636 _i.BluetoothAdapter.setPowered = {
98637     0: _t.boolean,
98638     1: _t.SuccessCallback,
98639     2: _t.ErrorCallback,
98640
98641     _optional: {
98642         1: true,
98643         2: true
98644     }
98645 };
98646
98647 _i.BluetoothAdapter.setVisible = {
98648     0: _t.boolean,
98649     1: _t.SuccessCallback,
98650     2: _t.ErrorCallback,
98651     3: _t.unsigned_short,
98652
98653     _optional: {
98654         1: true,
98655         2: true,
98656         3: true
98657     }
98658 };
98659
98660 _i.BluetoothAdapter.setChangeListener = {
98661     0: _t.BluetoothAdapterChangeCallback
98662 };
98663
98664 _i.BluetoothAdapter.unsetChangeListener = null;
98665
98666 _i.BluetoothAdapter.discoverDevices = {
98667     0: _t.BluetoothDiscoverDevicesSuccessCallback,
98668     1: _t.ErrorCallback,
98669
98670     _optional: {
98671         1: true
98672     }
98673 };
98674
98675 _i.BluetoothAdapter.stopDiscovery = {
98676     0: _t.SuccessCallback,
98677     1: _t.ErrorCallback,
98678
98679     _optional: {
98680         0: true,
98681         1: true
98682     }
98683 };
98684
98685 _i.BluetoothAdapter.getKnownDevices = {
98686     0: _t.BluetoothDeviceArraySuccessCallback,
98687     1: _t.ErrorCallback,
98688
98689     _optional: {
98690         1: true
98691     }
98692 };
98693
98694 _i.BluetoothAdapter.getDevice = {
98695     0: _t.BluetoothAddress,
98696     1: _t.BluetoothDeviceSuccessCallback,
98697     2: _t.ErrorCallback,
98698
98699     _optional: {
98700         2: true
98701     }
98702 };
98703
98704 _i.BluetoothAdapter.createBonding = {
98705     0: _t.BluetoothAddress,
98706     1: _t.BluetoothDeviceSuccessCallback,
98707     2: _t.ErrorCallback,
98708
98709     _optional: {
98710         2: true
98711     }
98712 };
98713
98714 _i.BluetoothAdapter.destroyBonding = {
98715     0: _t.BluetoothAddress,
98716     1: _t.SuccessCallback,
98717     2: _t.ErrorCallback,
98718
98719     _optional: {
98720         1: true,
98721         2: true
98722     }
98723 };
98724
98725 _i.BluetoothAdapter.registerRFCOMMServiceByUUID = {
98726     0: _t.BluetoothUUID,
98727     1: _t.DOMString,
98728     2: _t.BluetoothServiceSuccessCallback,
98729     3: _t.ErrorCallback,
98730
98731     _optional: {
98732         3: true
98733     }
98734 };
98735
98736 _i.BluetoothAdapter.getBluetoothProfileHandler = {
98737     0: _t.BluetoothProfileType
98738 };
98739
98740 // BluetoothDevice
98741 _i.BluetoothDevice.connectToServiceByUUID = {
98742     0: _t.BluetoothUUID,
98743     1: _t.BluetoothSocketSuccessCallback,
98744     2: _t.ErrorCallback,
98745
98746     _optional: {
98747         2: true
98748     }
98749 };
98750
98751 // BluetoothSocket
98752 _i.BluetoothSocket.readData = null;
98753 _i.BluetoothSocket.close = null;
98754
98755 _i.BluetoothSocket.writeData = {
98756     0: [_t.byte]
98757 };
98758
98759 // BluetoothClass
98760 _i.BluetoothClass.hasService = {
98761     0: _t.unsigned_short
98762 };
98763
98764 // BluetoothServiceHandler
98765 _i.BluetoothServiceHandler.unregister = {
98766     0: _t.SuccessCallback,
98767     1: _t.ErrorCallback,
98768
98769     _optional: {
98770         0: true,
98771         1: true
98772     }
98773 };
98774
98775 // BluetoothHealthProfileHandler
98776 _i.BluetoothHealthProfileHandler.registerSinkApplication = {
98777     0: _t.unsigned_short,
98778     1: _t.DOMString,
98779     2: _t.BluetoothHealthApplicationSuccessCallback,
98780     3: _t.ErrorCallback,
98781
98782     _optional: {
98783         3: true
98784     }
98785 };
98786
98787 _i.BluetoothHealthProfileHandler.connectToSource = {
98788     0: _t.BluetoothDevice,
98789     1: _t.BluetoothHealthApplication,
98790     2: _t.BluetoothHealthChannelSuccessCallback,
98791     3: _t.ErrorCallback,
98792
98793     _optional: {
98794         3: true
98795     }
98796 };
98797
98798 // BluetoothHealthApplication
98799 _i.BluetoothHealthApplication.unregister = {
98800     0: _t.SuccessCallback,
98801     1: _t.ErrorCallback,
98802
98803     _optional: {
98804         0: true,
98805         1: true
98806     }
98807 };
98808
98809 // BluetoothHealthChannel
98810 _i.BluetoothHealthChannel.close = null;
98811 _i.BluetoothHealthChannel.unsetListener = null;
98812
98813 _i.BluetoothHealthChannel.sendData = {
98814     0: [_t.byte]
98815 };
98816
98817 _i.BluetoothHealthChannel.setListener = {
98818     0: _t.BluetoothHealthChannelChangeCallback
98819 };
98820
98821 /*
98822  * Bookmark
98823  */
98824
98825 // BookmarkManager
98826 _i.BookmarkManager.get = {
98827     0: _t.BookmarkFolder,
98828     1: _t.boolean,
98829
98830     _optional: {
98831         0: true,
98832         1: true
98833     }
98834 };
98835
98836 _i.BookmarkManager.add = {
98837     0: _t.Bookmark,
98838     1: _t.BookmarkFolder,
98839
98840     _optional: {
98841         1: true
98842     }
98843 };
98844
98845 _i.BookmarkManager.remove = {
98846     0: _t.Bookmark,
98847
98848     _optional: {
98849         0: true
98850     }
98851 };
98852
98853 /*
98854  * Calendar
98855  */
98856
98857 // CalendarManager
98858 _i.CalendarManager.getCalendars = {
98859     0: _t.CalendarType,
98860     1: _t.CalendarArraySuccessCallback,
98861     2: _t.ErrorCallback,
98862
98863     _optional: {
98864         2: true
98865     }
98866 };
98867
98868 _i.CalendarManager.getUnifiedCalendar = {
98869     0: _t.CalendarType
98870 };
98871
98872 _i.CalendarManager.getDefaultCalendar = {
98873     0: _t.CalendarType
98874 };
98875
98876 _i.CalendarManager.getCalendar = {
98877     0: _t.CalendarType,
98878     1: _t.CalendarId
98879 };
98880
98881 // Calendar
98882 _i.Calendar.get = {
98883     0: _t.CalendarItemId
98884 };
98885
98886 _i.Calendar.add = {
98887     0: _t.CalendarItem
98888 };
98889
98890 _i.Calendar.addBatch = {
98891     0: [_t.CalendarItem],
98892     1: _t.CalendarItemArraySuccessCallback,
98893     2: _t.ErrorCallback,
98894
98895     _optional: {
98896         1: true,
98897         2: true
98898     }
98899 };
98900
98901 _i.Calendar.update = {
98902     0: _t.CalendarItem,
98903     1: _t.boolean,
98904
98905     _optional: {
98906         1: true
98907     }
98908 };
98909
98910 _i.Calendar.updateBatch = {
98911     0: [_t.CalendarItem],
98912     1: _t.SuccessCallback,
98913     2: _t.ErrorCallback,
98914     3: _t.boolean,
98915
98916     _optional: {
98917         1: true,
98918         2: true,
98919         3: true
98920     }
98921 };
98922
98923 _i.Calendar.remove = {
98924     0: _t.CalendarItemId
98925 };
98926
98927 _i.Calendar.removeBatch = {
98928     0: [_t.CalendarItemId],
98929     1: _t.SuccessCallback,
98930     2: _t.ErrorCallback,
98931
98932     _optional: {
98933         1: true,
98934         2: true
98935     }
98936 };
98937
98938 _i.Calendar.find = {
98939     0: _t.CalendarItemArraySuccessCallback,
98940     1: _t.ErrorCallback,
98941     2: _t.AbstractFilter,
98942     3: _t.SortMode,
98943
98944     _optional: {
98945         1: true,
98946         2: true,
98947         3: true
98948     }
98949 };
98950
98951 _i.Calendar.addChangeListener = {
98952     0: _t.CalendarChangeCallback
98953 };
98954
98955 _i.Calendar.removeChangeListener = {
98956     0: _t.long
98957 };
98958
98959 // CalendarItem
98960 _i.CalendarItem.convertToString = {
98961     0: _t.CalendarTextFormat
98962 };
98963
98964 _i.CalendarItem.clone = null;
98965
98966 // CalendarEvent
98967 _i.CalendarEvent.expandRecurrence = {
98968     0: _t.TZDate,
98969     1: _t.TZDate,
98970     2: _t.CalendarEventArraySuccessCallback,
98971     3: _t.ErrorCallback,
98972
98973     _optional: {
98974         3: true
98975     }
98976 };
98977
98978 /*
98979  * Call History
98980  */
98981
98982 // CallHistory
98983 _i.CallHistory.find = {
98984     0: _t.CallHistoryEntryArraySuccessCallback,
98985     1: _t.ErrorCallback,
98986     2: _t.AbstractFilter,
98987     3: _t.SortMode,
98988     4: _t.unsigned_long,
98989     5: _t.unsigned_long,
98990
98991     _optional: {
98992         // nullable
98993         1: true,
98994         2: true,
98995         3: true,
98996         4: true,
98997         5: true
98998     }
98999 };
99000
99001 _i.CallHistory.remove = {
99002     0: _t.CallHistoryEntry
99003 };
99004
99005 _i.CallHistory.removeBatch = {
99006     0: [_t.CallHistoryEntry],
99007     1: _t.SuccessCallback,
99008     2: _t.ErrorCallback,
99009
99010     _optional: {
99011         // nullable
99012         1: true,
99013         2: true
99014     }
99015 };
99016
99017 _i.CallHistory.removeAll = {
99018     0: _t.SuccessCallback,
99019     1: _t.ErrorCallback,
99020
99021     _optional: {
99022         // nullable
99023         0: true,
99024         1: true
99025     }
99026 };
99027
99028 _i.CallHistory.addChangeListener = {
99029     0: _t.CallHistoryChangeCallback
99030 };
99031
99032 _i.CallHistory.removeChangeListener = {
99033     0: _t.long
99034 };
99035
99036 /*
99037  * Contact
99038  */
99039
99040 // ContactManager
99041 _i.ContactManager.getAddressBooks = {
99042     0: _t.AddressBookArraySuccessCallback,
99043     1: _t.ErrorCallback,
99044
99045     _optional: {
99046         1: true
99047     }
99048 };
99049
99050 _i.ContactManager.getUnifiedAddressBook = null;
99051 _i.ContactManager.getDefaultAddressBook = null;
99052
99053 _i.ContactManager.getAddressBook = {
99054     0: _t.AddressBookId
99055 };
99056
99057 _i.ContactManager.get = {
99058     0: _t.PersonId
99059 };
99060
99061 _i.ContactManager.update = {
99062     0: _t.Person
99063 };
99064
99065 _i.ContactManager.updateBatch = {
99066     0: [_t.Person],
99067     1: _t.SuccessCallback,
99068     2: _t.ErrorCallback,
99069
99070     _optional: {
99071         1: true,
99072         2: true
99073     }
99074 };
99075
99076 _i.ContactManager.remove = {
99077     0: _t.PersonId
99078 };
99079
99080 _i.ContactManager.removeBatch = {
99081     0: [_t.PersonId],
99082     1: _t.SuccessCallback,
99083     2: _t.ErrorCallback,
99084
99085     _optional: {
99086         1: true,
99087         2: true
99088     }
99089 };
99090
99091 _i.ContactManager.find = {
99092     0: _t.PersonArraySuccessCallback,
99093     1: _t.ErrorCallback,
99094     2: _t.AbstractFilter,
99095     3: _t.SortMode,
99096
99097     _optional: {
99098         1: true,
99099         2: true,
99100         3: true
99101     }
99102 };
99103
99104 _i.ContactManager.addChangeListener = {
99105     0: _t.PersonsChangeCallback
99106 };
99107
99108 _i.ContactManager.removeChangeListener = {
99109     0: _t.long
99110 };
99111
99112 // AddressBook
99113 _i.AddressBook.get = {
99114     0: _t.ContactId
99115 };
99116
99117 _i.AddressBook.add = {
99118     0: _t.Contact
99119 };
99120
99121 _i.AddressBook.addBatch = {
99122     0: [_t.Contact],
99123     1: _t.ContactArraySuccessCallback,
99124     2: _t.ErrorCallback,
99125
99126     _optional: {
99127         1: true,
99128         2: true
99129     }
99130 };
99131
99132 _i.AddressBook.update = {
99133     0: _t.Contact
99134 };
99135
99136 _i.AddressBook.updateBatch = {
99137     0: [_t.Contact],
99138     1: _t.SuccessCallback,
99139     2: _t.ErrorCallback,
99140
99141     _optional: {
99142         1: true,
99143         2: true
99144     }
99145 };
99146
99147 _i.AddressBook.remove = {
99148     0: _t.ContactId
99149 };
99150
99151 _i.AddressBook.removeBatch = {
99152     0: [_t.ContactId],
99153     1: _t.SuccessCallback,
99154     2: _t.ErrorCallback,
99155
99156     _optional: {
99157         1: true,
99158         2: true
99159     }
99160 };
99161
99162 _i.AddressBook.find = {
99163     0: _t.ContactArraySuccessCallback,
99164     1: _t.ErrorCallback,
99165     2: _t.AbstractFilter,
99166     3: _t.SortMode,
99167
99168     _optional:{
99169         1: true,
99170         2: true,
99171         3: true
99172     }
99173 };
99174
99175 _i.AddressBook.addChangeListener = {
99176     0: _t.AddressBookChangeCallback,
99177     1: _t.ErrorCallback,
99178
99179     _optional: {
99180         1: true
99181     }
99182 };
99183
99184 _i.AddressBook.removeChangeListener = {
99185     0: _t.long
99186 };
99187
99188 _i.AddressBook.getGroup = {
99189     0: _t.ContactGroupId
99190 };
99191
99192 _i.AddressBook.addGroup = {
99193     0: _t.ContactGroup
99194 };
99195
99196 _i.AddressBook.updateGroup = {
99197     0: _t.ContactGroup
99198 };
99199
99200 _i.AddressBook.removeGroup = {
99201     0: _t.ContactGroupId
99202 };
99203
99204 _i.AddressBook.getGroups = null;
99205
99206 // Person
99207 _i.Person.link = {
99208     0: _t.PersonId
99209 };
99210
99211 _i.Person.unlink = {
99212     0: _t.ContactId
99213 };
99214
99215 // Contact
99216 _i.Contact.convertToString = {
99217     0: _t.ContactTextFormat,
99218
99219     _optional: {
99220         0: true
99221     }
99222 };
99223
99224 _i.Contact.clone = null;
99225
99226 /*
99227  * Content
99228  */
99229
99230 // ContentManager
99231 _i.ContentManager.update = {
99232     0: _t.Content
99233 };
99234
99235 _i.ContentManager.updateBatch = {
99236     0: [_t.Content],
99237     1: _t.SuccessCallback,
99238     2: _t.ErrorCallback,
99239
99240     _optional: {
99241         1: true,
99242         2: true
99243     }
99244 };
99245
99246 _i.ContentManager.getDirectories = {
99247     0: _t.ContentDirectoryArraySuccessCallback,
99248     1: _t.ErrorCallback,
99249
99250     _optional: {
99251         1: true
99252     }
99253 };
99254
99255 _i.ContentManager.find = {
99256     0: _t.ContentArraySuccessCallback,
99257     1: _t.ErrorCallback,
99258     2: _t.ContentDirectoryId,
99259     3: _t.AbstractFilter,
99260     4: _t.SortMode,
99261     5: _t.unsigned_long,
99262     6: _t.unsigned_long,
99263
99264     _optional: {
99265         1: true,
99266         2: true,
99267         3: true,
99268         4: true,
99269         5: true,
99270         6: true
99271     }
99272 };
99273
99274 _i.ContentManager.scanFile = {
99275     0: _t.DOMString,
99276     1: _t.ContentScanSuccessCallback,
99277     2: _t.ErrorCallback,
99278
99279     _optional: {
99280         1: true,
99281         2: true
99282     }
99283 };
99284
99285 _i.ContentManager.setChangeListener = {
99286     0: _t.ContentChangeCallback
99287 };
99288
99289 _i.ContentManager.unsetChangeListener = null;
99290
99291 /*
99292  * Data Control
99293  */
99294
99295 // DataControlManager
99296 _i.DataControlManager.getDataControlConsumer = {
99297     0: _t.DOMString,
99298     1: _t.DOMString,
99299     2: _t.DataType
99300 };
99301
99302 // SQLDataControlConsumer
99303 _i.SQLDataControlConsumer.insert = {
99304     0: _t.unsigned_long,
99305     1: _t.RowData,
99306     2: _t.DataControlInsertSuccessCallback,
99307     3: _t.DataControlErrorCallback,
99308
99309     _optional: {
99310         2: true,
99311         3: true
99312     }
99313 };
99314
99315 _i.SQLDataControlConsumer.update = {
99316     0: _t.unsigned_long,
99317     1: _t.RowData,
99318     2: _t.DOMString,
99319     3: _t.DataControlSuccessCallback,
99320     4: _t.DataControlErrorCallback,
99321
99322     _optional: {
99323         3: true,
99324         4: true
99325     }
99326 };
99327
99328 _i.SQLDataControlConsumer.remove = {
99329     0: _t.unsigned_long,
99330     1: _t.DOMString,
99331     2: _t.DataControlSuccessCallback,
99332     3: _t.DataControlErrorCallback,
99333
99334     _optional: {
99335         2: true,
99336         3: true
99337     }
99338 };
99339
99340 _i.SQLDataControlConsumer.select = {
99341     0: _t.unsigned_long,
99342     1: [_t.DOMString],
99343     2: _t.DOMString,
99344     3: _t.DataControlSelectSuccessCallback,
99345     4: _t.DataControlErrorCallback,
99346     5: _t.unsigned_long,
99347     6: _t.unsigned_long,
99348
99349     _optional: {
99350         4: true,
99351         5: true,
99352         6: true
99353     }
99354 };
99355
99356 // MappedDataControlConsumer
99357 _i.MappedDataControlConsumer.addValue = {
99358     0: _t.unsigned_long,
99359     1: _t.DOMString,
99360     2: _t.DOMString,
99361     3: _t.DataControlSuccessCallback,
99362     4: _t.DataControlErrorCallback,
99363
99364     _optional: {
99365         3: true,
99366         4: true
99367     }
99368 };
99369
99370 _i.MappedDataControlConsumer.removeValue = {
99371     0: _t.unsigned_long,
99372     1: _t.DOMString,
99373     2: _t.DOMString,
99374     3: _t.DataControlSuccessCallback,
99375     4: _t.DataControlErrorCallback,
99376
99377     _optional: {
99378         4: true
99379     }
99380 };
99381
99382 _i.MappedDataControlConsumer.getValue = {
99383     0: _t.unsigned_long,
99384     1: _t.DOMString,
99385     2: _t.DataControlGetValueSuccessCallback,
99386     3: _t.DataControlErrorCallback,
99387
99388     _optional: {
99389         3: true
99390     }
99391 };
99392
99393 _i.MappedDataControlConsumer.updateValue = {
99394     0: _t.unsigned_long,
99395     1: _t.DOMString,
99396     2: _t.DOMString,
99397     3: _t.DOMString,
99398     4: _t.DataControlSuccessCallback,
99399     5: _t.DataControlErrorCallback,
99400
99401     _optional: {
99402         5: true
99403     }
99404 };
99405
99406 /*
99407  * Data Synchronization
99408  */
99409
99410 // DataSynchronizationManager
99411 _i.DataSynchronizationManager.getMaxProfilesNum = null;
99412 _i.DataSynchronizationManager.getProfilesNum    = null;
99413 _i.DataSynchronizationManager.getAll            = null;
99414
99415 _i.DataSynchronizationManager.add = {
99416     0: _t.SyncProfileInfo
99417 };
99418
99419 _i.DataSynchronizationManager.update = {
99420     0: _t.SyncProfileInfo
99421 };
99422
99423 _i.DataSynchronizationManager.remove = {
99424     0: _t.SyncProfileId
99425 };
99426
99427 _i.DataSynchronizationManager.get = {
99428     0: _t.SyncProfileId
99429 };
99430
99431 _i.DataSynchronizationManager.startSync = {
99432     0: _t.SyncProfileId,
99433     1: _t.SyncProgressCallback,
99434
99435     _optional: {
99436         1: true
99437     }
99438 };
99439
99440 _i.DataSynchronizationManager.stopSync = {
99441     0: _t.SyncProfileId
99442 };
99443
99444 _i.DataSynchronizationManager.getLastSyncStatistics = {
99445     0: _t.SyncProfileId
99446 };
99447
99448 /*
99449  * Download
99450  */
99451
99452 // DownloadManager
99453 _i.DownloadManager.start = {
99454     0: _t.DownloadRequest,
99455     1: _t.DownloadCallback,
99456
99457     _optional: {
99458         1: true
99459     }
99460 };
99461
99462 _i.DownloadManager.cancel = {
99463     0: _t.long
99464 };
99465
99466 _i.DownloadManager.pause = {
99467     0: _t.long
99468 };
99469
99470 _i.DownloadManager.resume = {
99471     0: _t.long
99472 };
99473
99474 _i.DownloadManager.getState = {
99475     0: _t.long
99476 };
99477
99478 _i.DownloadManager.getDownloadRequest = {
99479     0: _t.long
99480 };
99481
99482 _i.DownloadManager.getMIMEType = {
99483     0: _t.long
99484 };
99485
99486 _i.DownloadManager.setListener = {
99487     0: _t.long,
99488     1: _t.DownloadCallback
99489 };
99490
99491 /*
99492  * Message Port
99493  */
99494
99495 // MessagePortManager
99496 _i.MessagePortManager.requestLocalMessagePort = {
99497     0: _t.DOMString
99498 };
99499
99500 _i.MessagePortManager.requestTrustedLocalMessagePort = {
99501     0: _t.DOMString
99502 };
99503
99504 _i.MessagePortManager.requestRemoteMessagePort = {
99505     0: _t.ApplicationId,
99506     1: _t.DOMString
99507 };
99508
99509 _i.MessagePortManager.requestTrustedRemoteMessagePort = {
99510     0: _t.ApplicationId,
99511     1: _t.DOMString
99512 };
99513
99514 // LocalMessagePort
99515 _i.LocalMessagePort.addMessagePortListener = {
99516     0: _t.MessagePortCallback
99517 };
99518
99519 _i.LocalMessagePort.removeMessagePortListener = {
99520     0: _t.long
99521 };
99522
99523 // RemoteMessagePort
99524 _i.RemoteMessagePort.sendMessage = {
99525     0: [_t.MessagePortDataItem],
99526     1: _t.LocalMessagePort,
99527
99528     _optional: {
99529         1: true
99530     }
99531 };
99532
99533 /*
99534  * Network Bearer Selection
99535  */
99536
99537 // NetworkBearerSelection
99538 _i.NetworkBearerSelection.requestRouteToHost = {
99539     0: _t.NetworkType,
99540     1: _t.DOMString,
99541     2: _t.NetworkSuccessCallback,
99542     3: _t.ErrorCallback,
99543
99544     _optional: {
99545         3: true
99546     }
99547 };
99548
99549 _i.NetworkBearerSelection.releaseRouteToHost = {
99550     0: _t.NetworkType,
99551     1: _t.DOMString,
99552     2: _t.SuccessCallback,
99553     3: _t.ErrorCallback,
99554
99555     _optional: {
99556         3: true
99557     }
99558 };
99559
99560 /*
99561  * NFC
99562  */
99563
99564 // NFCManager
99565 _i.NFCManager.getDefaultAdapter = null;
99566 _i.NFCManager.setExclusiveMode = {
99567     0: _t.boolean
99568 };
99569
99570 // NFCAdapter
99571 _i.NFCAdapter.setPowered = {
99572     0: _t.boolean,
99573     1: _t.SuccessCallback,
99574     2: _t.ErrorCallback,
99575
99576     _optional: {
99577         1: true,
99578         2: true
99579     }
99580 };
99581
99582 _i.NFCAdapter.setTagListener = {
99583     0: _t.NFCTagDetectCallback,
99584     1: [_t.NFCTagType],
99585
99586     _optional: {
99587         1: true
99588     }
99589 };
99590
99591 _i.NFCAdapter.setPeerListener = {
99592     0: _t.NFCPeerDetectCallback
99593 };
99594
99595 _i.NFCAdapter.unsetTagListener  = null;
99596 _i.NFCAdapter.unsetPeerListener = null;
99597 _i.NFCAdapter.getCachedMessage  = null;
99598
99599 // NFCTag
99600 _i.NFCTag.readNDEF = {
99601     0: _t.NDEFMessageReadCallback,
99602     1: _t.ErrorCallback,
99603
99604     _optional: {
99605         1: true
99606     }
99607 };
99608
99609 _i.NFCTag.writeNDEF = {
99610     0: _t.NDEFMessage,
99611     1: _t.SuccessCallback,
99612     2: _t.ErrorCallback,
99613
99614     _optional: {
99615         1: true,
99616         2: true
99617     }
99618 };
99619
99620 _i.NFCTag.transceive = {
99621     0: [_t.byte],
99622     1: _t.ByteArraySuccessCallback,
99623     2: _t.ErrorCallback,
99624
99625     _optional: {
99626         2: true
99627     }
99628 };
99629
99630 // NFCPeer
99631 _i.NFCPeer.setReceiveNDEFListener = {
99632     0: _t.NDEFMessageReadCallback
99633 };
99634
99635 _i.NFCPeer.unsetReceiveNDEFListener = null;
99636
99637 _i.NFCPeer.sendNDEF = {
99638     0: _t.NDEFMessage,
99639     1: _t.SuccessCallback,
99640     2: _t.ErrorCallback,
99641
99642     _optional: {
99643         1: true,
99644         2: true
99645     }
99646 };
99647
99648 // NDEFMessage
99649 _i.NDEFMessage.toByte = null;
99650
99651 /*
99652  * Notification
99653  */
99654
99655 // NotificationManager
99656 _i.NotificationManager.post = {
99657     0: _t.Notification
99658 };
99659
99660 _i.NotificationManager.update = {
99661     0: _t.Notification
99662 };
99663
99664 _i.NotificationManager.remove = {
99665     0: _t.NotificationId
99666 };
99667
99668 _i.NotificationManager.get = {
99669     0: _t.NotificationId
99670 };
99671
99672 _i.NotificationManager.removeAll = null;
99673 _i.NotificationManager.getAll = null;
99674
99675 /*
99676  * Package
99677  */
99678
99679 // PackageManager
99680 _i.PackageManager.install = {
99681     0: _t.DOMString,
99682     1: _t.PackageProgressCallback,
99683     2: _t.ErrorCallback,
99684
99685     _optional: {
99686         2: true
99687     }
99688 };
99689
99690 _i.PackageManager.uninstall = {
99691     0: _t.PackageId,
99692     1: _t.PackageProgressCallback,
99693     2: _t.ErrorCallback,
99694
99695     _optional: {
99696         2: true
99697     }
99698 };
99699
99700 _i.PackageManager.getPackagesInfo = {
99701     0: _t.PackageInformationArraySuccessCallback,
99702     1: _t.ErrorCallback,
99703
99704     _optional: {
99705         1: true
99706     }
99707 };
99708
99709 _i.PackageManager.getPackageInfo = {
99710     0: _t.PackageId,
99711
99712     _optional: {
99713         0: true
99714     }
99715 };
99716
99717 _i.PackageManager.setPackageInfoEventListener = {
99718     0: _t.PackageInfomationEventCallback
99719 };
99720
99721 _i.PackageManager.unsetPackageInfoEventListener = null;
99722
99723 /*
99724  * Push
99725  */
99726
99727 // PushManager
99728 _i.PushManager.registerService = {
99729     0: _t.ApplicationControl,
99730     1: _t.PushRegisterSuccessCallback,
99731     2: _t.ErrorCallback,
99732
99733     _optional: {
99734         2: true
99735     }
99736 };
99737
99738 _i.PushManager.unregisterService = {
99739     0: _t.SuccessCallback,
99740     1: _t.ErrorCallback,
99741
99742     _optional: {
99743         0: true,
99744         1: true
99745     }
99746 };
99747
99748 _i.PushManager.connectService = {
99749     0: _t.PushNotificationCallback
99750 };
99751
99752 _i.PushManager.disconnectService = null;
99753 _i.PushManager.getRegistrationId = null;
99754
99755 /*
99756  * Secure Element
99757  */
99758
99759 // SEService
99760 _i.SEService.getReaders = {
99761     0: _t.ReaderArraySuccessCallback,
99762     1: _t.ErrorCallback,
99763
99764     _optional: {
99765         // nullable
99766         1: true
99767     }
99768 };
99769
99770 _i.SEService.registerSEListener = {
99771     0: _t.SEChangeListener
99772 };
99773
99774 _i.SEService.unregisterSEListener = {
99775     0: _t.unsigned_long
99776 };
99777
99778 _i.SEService.shutdown = null;
99779
99780 // Reader
99781 _i.Reader.openSession = {
99782     0: _t.SessionSuccessCallback,
99783     1: _t.ErrorCallback,
99784
99785     _optional: {
99786         // nullable
99787         1: true
99788     }
99789 };
99790
99791 _i.Reader.getName = null;
99792 _i.Reader.closeSessions = null;
99793
99794 // Session
99795 _i.Session.openBasicChannel = {
99796     0: [_t.byte],
99797     1: _t.ChannelSuccessCallback,
99798     2: _t.ErrorCallback,
99799
99800     _optional: {
99801         // nullable
99802         2: true
99803     }
99804 };
99805
99806 _i.Session.openLogicalChannel = {
99807     0: [_t.byte],
99808     1: _t.ChannelSuccessCallback,
99809     2: _t.ErrorCallback,
99810
99811     _optional: {
99812         // nullable
99813         2: true
99814     }
99815 };
99816
99817 _i.Session.getATR = null;
99818 _i.Session.close = null;
99819 _i.Session.closeChannels = null;
99820
99821 // Channel
99822 _i.Channel.transmit = {
99823     0: [_t.byte],
99824     1: _t.TransmitSuccessCallback,
99825     2: _t.ErrorCallback,
99826
99827     _optional: {
99828         // nullable
99829         2: true
99830     }
99831 };
99832
99833 _i.Channel.close = null;
99834
99835 /*
99836  * System Info
99837  */
99838
99839 // SystemInfo
99840 _i.SystemInfo.getCapabilities = null;
99841
99842 _i.SystemInfo.getPropertyValue = {
99843     0: _t.SystemInfoPropertyId,
99844     1: _t.SystemInfoPropertySuccessCallback,
99845     2: _t.ErrorCallback,
99846
99847     _optional: {
99848         2: true
99849     }
99850 };
99851
99852 _i.SystemInfo.addPropertyValueChangeListener = {
99853     0: _t.SystemInfoPropertyId,
99854     1: _t.SystemInfoPropertySuccessCallback,
99855     2: _t.SystemInfoOptions,
99856
99857     _optional: {
99858         2: true
99859     }
99860 };
99861
99862 _i.SystemInfo.removePropertyValueChangeListener = {
99863     0: _t.unsigned_long
99864 };
99865
99866 /*
99867  * System Setting
99868  */
99869
99870 // SystemSettingManager
99871 _i.SystemSettingManager.setProperty = {
99872     0: _t.SystemSettingType,
99873     1: _t.DOMString,
99874     2: _t.SuccessCallback,
99875     3: _t.ErrorCallback,
99876
99877     _optional: {
99878         3: true
99879     }
99880 };
99881
99882 _i.SystemSettingManager.getProperty = {
99883     0: _t.SystemSettingType,
99884     1: _t.SystemSettingSuccessCallback,
99885     2: _t.ErrorCallback,
99886
99887     _optional: {
99888         2: true
99889     }
99890 };
99891
99892 /*
99893  * Time
99894  */
99895
99896 // TimeUtil
99897 _i.TimeUtil.getCurrentDateTime    = null;
99898 _i.TimeUtil.getLocalTimezone      = null;
99899 _i.TimeUtil.getAvailableTimezones = null;
99900 _i.TimeUtil.getTimeFormat         = null;
99901
99902 _i.TimeUtil.getDateFormat = {
99903     0: _t.boolean,
99904
99905     _optional: {
99906         0: true
99907     }
99908 };
99909
99910 _i.TimeUtil.isLeapYear = {
99911     0: _t.long
99912 };
99913
99914 // TimeDuration
99915 _i.TimeDuration.difference = {
99916     0: _t.TimeDuration
99917 };
99918
99919 _i.TimeDuration.equalsTo = {
99920     0: _t.TimeDuration
99921 };
99922
99923 _i.TimeDuration.lessThan = {
99924     0: _t.TimeDuration
99925 };
99926
99927 _i.TimeDuration.greaterThan = {
99928     0: _t.TimeDuration
99929 };
99930
99931 /*
99932  * Web Setting
99933  */
99934
99935 // WebSettingManager
99936 _i.WebSettingManager.setUserAgentString = {
99937     0: _t.DOMString,
99938     1: _t.SuccessCallback,
99939     2: _t.ErrorCallback,
99940
99941     _optional: {
99942         1: true,
99943         2: true
99944     }
99945 };
99946
99947 _i.WebSettingManager.removeAllCookies = {
99948     0: _t.SuccessCallback,
99949     1: _t.ErrorCallback,
99950
99951     _optional: {
99952         0: true,
99953         1: true
99954     }
99955 };
99956
99957 // Exports
99958 _t.constructor = _c;
99959 _t.interface   = _i;
99960
99961 module.exports = _t;
99962
99963 });
99964 define('ripple/platform/tizen/2.0/secureelement', function (require, exports, module) {
99965 /*
99966  *  Copyright 2014 Intel Corporation.
99967  *
99968  * Licensed under the Apache License, Version 2.0 (the "License");
99969  * you may not use this file except in compliance with the License.
99970  * You may obtain a copy of the License at
99971  *
99972  * http://www.apache.org/licenses/LICENSE-2.0
99973  *
99974  * Unless required by applicable law or agreed to in writing, software
99975  * distributed under the License is distributed on an "AS IS" BASIS,
99976  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
99977  * See the License for the specific language governing permissions and
99978  * limitations under the License.
99979  */
99980
99981 var db = require('ripple/db'),
99982     event = require('ripple/event'),
99983     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
99984     t = require('ripple/platform/tizen/2.0/typecast'),
99985     WebAPIError = require('ripple/platform/tizen/2.0/WebAPIError'),
99986     WebAPIException = require('ripple/platform/tizen/2.0/WebAPIException'),
99987     Reader,
99988     ReaderInternal,
99989     Session,
99990     SessionInternal,
99991     Channel,
99992     _data = {
99993         APDU_COMMANDS:        null,
99994         DB_SECUREELEMENT_KEY: "tizen-secureelement",
99995         readers:              [],
99996         listeners:            {},
99997         nListener:            0,
99998         internal:             [],
99999         dbStorage:            null
100000     },
100001     _security = {
100002         "http://tizen.org/privilege/secureelement": ["getReaders",
100003                 "registerSEListener", "unregisterSEListener", "shutdown",
100004                 "getName", "openSession", "closeSessions", "openBasicChannel",
100005                 "openLogicalChannel", "getATR", "close", "closeChannels",
100006                 "transmit"]
100007     },
100008     _self;
100009
100010 function _get() {
100011     _data.dbStorage = db.retrieveObject(_data.DB_SECUREELEMENT_KEY) || [];
100012 }
100013
100014 function _save() {
100015     db.saveObject(_data.DB_SECUREELEMENT_KEY, _data.dbStorage);
100016 }
100017
100018 function _getCurrentAppId() {
100019     return tizen.application.getCurrentApplication().appInfo.id;
100020 }
100021
100022 function _initialize() {
100023     /*
100024      *  INS   RESPONSE         COMMAND
100025      */
100026
100027     _data.APDU_COMMANDS = {
100028         0xb0: [0x90, 0x00], // READ BINARY *
100029         0xd0: [0x90, 0x00], // WRITE BINARY
100030         0xd6: [0x90, 0x00], // UPDATE BINARY
100031         0x0e: [0x90, 0x00], // ERASE BINARY
100032         0xb2: [0x90, 0x00], // READ RECORD *
100033         0xd2: [0x90, 0x00], // WRITE RECORD
100034         0xe2: [0x90, 0x00], // APPEND RECORD
100035         0xdc: [0x90, 0x00], // UPDATE RECORD
100036         0xca: [0x90, 0x00], // GET DATA *
100037         0xda: [0x90, 0x00], // PUT DATA
100038         0xa4: [0x69, 0x00], // SELECT FILE *
100039         0x20: [0x90, 0x00], // VERIFY
100040         0x88: [0x90, 0x00], // INTERNAL AUTHENTICATE *
100041         0x82: [0x90, 0x00], // EXTERNAL AUTHENTICATE
100042         0x84: [0x90, 0x00], // GET CHALLENGE *
100043         0x70: [0x69, 0x00], // MANAGE CHANNEL *
100044         0xc0: [0x90, 0x00], // GET RESPONSE *
100045         0xc2: [0x90, 0x00]  // ENVELOPE *
100046     };
100047
100048     _get();
100049
100050     _data.dbStorage.forEach(function (dbReader) {
100051         var reader;
100052
100053         reader = new ReaderInternal(dbReader);
100054         _data.internal.push(reader);
100055         _data.readers.push(new Reader(reader));
100056     });
100057
100058     event.on("ReaderChanged", function (name, isPresent) {
100059         _data.internal.some(function (reader, index) {
100060             var i;
100061
100062             if (reader.name !== name)
100063                 return false;
100064
100065             reader.isPresent = isPresent;
100066             _data.dbStorage[index].isPresent = isPresent;
100067
100068             if (isPresent) {
100069                 for (i in _data.listeners) {
100070                     _data.listeners[i].onSEReady(_data.readers[index]);
100071                 }
100072             } else {
100073                 _data.readers[index].closeSessions();
100074                 for (i in _data.listeners) {
100075                     _data.listeners[i].onSENotReady(_data.readers[index]);
100076                 }
100077             }
100078
100079             return true;
100080         });
100081
100082         _save();
100083     });
100084 }
100085
100086 _self = function () {
100087     var secureelement;
100088
100089     // public
100090     function getReaders(successCallback, errorCallback) {
100091         if (!_security.getReaders) {
100092             throw new WebAPIException(errorcode.SECURITY_ERR);
100093         }
100094
100095         t.SEService("getReaders", arguments);
100096
100097         window.setTimeout(function () {
100098             if (_data.readers.length === 0) {
100099                 if (errorCallback) {
100100                     errorCallback(new WebAPIError(errorcode.UNKNOWN_ERR));
100101                 }
100102                 return;
100103             }
100104             successCallback(_data.readers);
100105         }, 1);
100106     }
100107
100108     function registerSEListener(listener) {
100109         var id;
100110
100111         if (!_security.registerSEListener) {
100112             throw new WebAPIException(errorcode.SECURITY_ERR);
100113         }
100114
100115         t.SEService("registerSEListener", arguments);
100116
100117         id = ++_data.nListener;
100118         _data.listeners[id] = listener;
100119
100120         return id;
100121     }
100122
100123     function unregisterSEListener(id) {
100124         if (!_security.unregisterSEListener) {
100125             throw new WebAPIException(errorcode.SECURITY_ERR);
100126         }
100127
100128         t.SEService("unregisterSEListener", arguments);
100129
100130         if (!_data.listeners[id])
100131             return;
100132
100133         delete _data.listeners[id];
100134     }
100135
100136     function shutdown() {
100137         if (!_security.shutdown) {
100138             throw new WebAPIException(errorcode.SECURITY_ERR);
100139         }
100140
100141         t.SEService("shutdown", arguments);
100142
100143         _data.readers.forEach(function (reader) {
100144             reader.closeSessions();
100145         });
100146         _data.internal.forEach(function (reader) {
100147             reader.isPresent = false;
100148         });
100149
100150         event.trigger("ReadersClosed");
100151
100152         window.setTimeout(function () {
100153             _data.readers.forEach(function (reader) {
100154                 for (var i in _data.listeners) {
100155                     _data.listeners[i].onSENotReady(reader);
100156                 }
100157             });
100158         }, 1);
100159     }
100160
100161     function handleSubFeatures(subFeatures) {
100162         var i, subFeature;
100163
100164         for (subFeature in subFeatures) {
100165             for (i in _security[subFeature]) {
100166                 _security[_security[subFeature][i]] = true;
100167             }
100168         }
100169     }
100170
100171     secureelement = {
100172         getReaders:           getReaders,
100173         registerSEListener:   registerSEListener,
100174         unregisterSEListener: unregisterSEListener,
100175         shutdown:             shutdown,
100176         handleSubFeatures:    handleSubFeatures
100177     };
100178
100179     return secureelement;
100180 };
100181
100182 Reader = function (reader) {
100183     // public
100184     function getName() {
100185         if (!_security.getName) {
100186             throw new WebAPIException(errorcode.SECURITY_ERR);
100187         }
100188
100189         t.Reader("getName", arguments);
100190
100191         return reader.name;
100192     }
100193
100194     function openSession(successCallback, errorCallback) {
100195         if (!_security.openSession) {
100196             throw new WebAPIException(errorcode.SECURITY_ERR);
100197         }
100198
100199         t.Reader("openSession", arguments);
100200
100201         window.setTimeout(function () {
100202             var session;
100203
100204             if (!reader.isPresent) {
100205                 if (errorCallback) {
100206                     errorCallback(new WebAPIError(errorcode.INVALID_STATE_ERR));
100207                 }
100208                 return;
100209             }
100210
100211             session = new SessionInternal();
100212             reader.sessions.push(session);
100213
100214             successCallback(session.external);
100215         }, 1);
100216     }
100217
100218     function closeSessions() {
100219         if (!_security.closeSessions) {
100220             throw new WebAPIException(errorcode.SECURITY_ERR);
100221         }
100222
100223         t.Reader("closeSessions", arguments);
100224
100225         if (!reader.isPresent)
100226             return;
100227
100228         if (reader.sessions.length === 0)
100229             return;
100230
100231         reader.sessions.forEach(function (session) {
100232             session.external.close();
100233         });
100234
100235         reader.sessions = [];
100236     }
100237
100238     this.__defineGetter__("isPresent", function () {
100239         return reader.isPresent;
100240     });
100241
100242     reader.sessions    = [];
100243
100244     this.getName       = getName;
100245     this.openSession   = openSession;
100246     this.closeSessions = closeSessions;
100247 };
100248
100249 Session = function (channels) {
100250     var session = {};
100251
100252     // private
100253     function openChannel(isBasic, aid, successCallback, errorCallback) {
100254         window.setTimeout(function () {
100255             var channel, peers, appId;
100256
100257             if (session.isClosed) {
100258                 if (errorCallback) {
100259                     errorCallback(new WebAPIError(errorcode.INVALID_STATE_ERR));
100260                 }
100261                 return;
100262             }
100263
100264             if ((aid.length < 5) || (aid.length > 16)) {
100265                 if (errorCallback) {
100266                     errorCallback(new WebAPIError(
100267                             errorcode.INVALID_VALUES_ERR));
100268                 }
100269                 return;
100270             }
100271
100272             if (isBasic) {
100273                 appId = _getCurrentAppId();
100274
100275                 if (session.locker !== null) {
100276                     if (session.locker === appId) {
100277                         channel = channels.basic[0];
100278                         successCallback(channel);
100279                     } else if (errorCallback) {
100280                         errorCallback(new WebAPIError(errorcode.SECURITY_ERR));
100281                     }
100282                     return;
100283                 }
100284
100285                 session.locker = appId;
100286                 peers = channels.basic;
100287             } else {
100288                 peers = channels.logical;
100289             }
100290
100291             channel = new Channel(isBasic, aid, onChannelClosed);
100292             peers.push(channel);
100293
100294             successCallback(channel);
100295         }, 1);
100296     }
100297
100298     function closeChannel(channels) {
100299         channels.forEach(function (channel) {
100300             channel.close();
100301         });
100302     }
100303
100304     function onChannelClosed(isBasicChannel) {
100305         if (isBasicChannel) {
100306             session.locker = null;
100307         }
100308     }
100309
100310     // public
100311     function openBasicChannel(aid, successCallback, errorCallback) {
100312         if (!_security.openBasicChannel) {
100313             throw new WebAPIException(errorcode.SECURITY_ERR);
100314         }
100315
100316         t.Session("openBasicChannel", arguments);
100317
100318         openChannel(true, aid, successCallback, errorCallback);
100319     }
100320
100321     function openLogicalChannel(aid, successCallback, errorCallback) {
100322         if (!_security.openLogicalChannel) {
100323             throw new WebAPIException(errorcode.SECURITY_ERR);
100324         }
100325
100326         t.Session("openLogicalChannel", arguments);
100327
100328         openChannel(false, aid, successCallback, errorCallback);
100329     }
100330
100331     function getATR() {
100332         /*
100333          * +--+--+---+---+---+---+---+---+---+--------------------+---+
100334          * |TS|T0|TA1|TB1|TC1|TD1|TD2|TA3|TB3|    History Bytes   |TCK|
100335          * |3B|F7|13 |00 |00 |81 |31 |FE |45 |54 49 5A 45 4E 33 30|A0 |
100336          * ------------------------------------------------------------
100337          *  T0                Y1 = 0xF(TA1, TB1, TC1, TD1), k = 7
100338          *  TD1               Y2 = 0x8(TD2), T = 1
100339          *  TD2               Y3 = 0x3(TA3, TB3), T = 1
100340          *  History Bytes     T1 ~ Tk = 'TIZEN30'
100341          *  Tck               XOR T0 ~ Tk
100342          * +----------------------------------------------------------+
100343          */
100344
100345         var atr = [0x3B, 0xF7, 0x13, 0x00, 0x00, 0x81, 0x31, 0xFE, 0x45, 0x54,
100346                    0x49, 0x5A, 0x45, 0x4E, 0x33, 0x30, 0xA0];
100347
100348         if (!_security.getATR) {
100349             throw new WebAPIException(errorcode.SECURITY_ERR);
100350         }
100351
100352         if (session.isClosed) {
100353             throw new WebAPIException(errorcode.UNKNOWN_ERR);
100354         }
100355
100356         t.Session("getATR", arguments);
100357
100358         return t.byte(atr, "[]+");
100359     }
100360
100361     function close() {
100362         if (!_security.close) {
100363             throw new WebAPIException(errorcode.SECURITY_ERR);
100364         }
100365
100366         t.Session("close", arguments);
100367
100368         if (session.isClosed)
100369             return;
100370
100371         closeChannels();
100372         session.isClosed = true;
100373     }
100374
100375     function closeChannels() {
100376         var type;
100377
100378         if (!_security.closeChannels) {
100379             throw new WebAPIException(errorcode.SECURITY_ERR);
100380         }
100381
100382         t.Session("closeChannels", arguments);
100383
100384         if (session.isClosed)
100385             return;
100386
100387         if ((channels.basic.length === 0) && (channels.logical.length === 0))
100388             return;
100389
100390         for (type in channels) {
100391             closeChannel(channels[type]);
100392             channels[type] = [];
100393         }
100394     }
100395
100396     session.isClosed = false;
100397     session.locker   = null;
100398     channels.basic   = [];
100399     channels.logical = [];
100400
100401     this.__defineGetter__("isClosed", function () {
100402         return session.isClosed;
100403     });
100404
100405     this.openBasicChannel   = openBasicChannel;
100406     this.openLogicalChannel = openLogicalChannel;
100407     this.getATR             = getATR;
100408     this.close              = close;
100409     this.closeChannels      = closeChannels;
100410 };
100411
100412 Channel = function (isBasic, aid, onClosed) {
100413     var channel = {};
100414
100415     // private
100416     function getResponse(command) {
100417         var response;
100418
100419         if (!command[1])
100420             return [0x67, 0x00];
100421
100422         response = _data.APDU_COMMANDS[t.octet(command[1])];
100423         if (!response)
100424             return [0x6d, 0x00];
100425
100426         return response;
100427     }
100428
100429     function isTransmitted(response) {
100430         return ((response[0] === 0x90) && (response[1] === 0x00));
100431     }
100432
100433     // public
100434     function close() {
100435         if (!_security.close) {
100436             throw new WebAPIException(errorcode.SECURITY_ERR);
100437         }
100438
100439         t.Channel("close", arguments);
100440
100441         if (channel.isClosed)
100442             return;
100443
100444         channel.isClosed = true;
100445         onClosed(channel.isBasicChannel);
100446     }
100447
100448     function transmit(command, successCallback, errorCallback) {
100449         if (!_security.transmit) {
100450             throw new WebAPIException(errorcode.SECURITY_ERR);
100451         }
100452
100453         t.Channel("transmit", arguments, true);
100454
100455         window.setTimeout(function () {
100456             var response;
100457
100458             if (channel.isClosed) {
100459                 if (errorCallback) {
100460                     errorCallback(new WebAPIError(errorcode.INVALID_STATE_ERR));
100461                 }
100462                 return;
100463             }
100464
100465             response = getResponse(command);
100466             if (!isTransmitted((response))) {
100467                 if (errorCallback) {
100468                     errorCallback(new WebAPIError(errorcode.SECURITY_ERR));
100469                 }
100470                 return;
100471             }
100472
100473             event.trigger("SETransmitted", [aid, command]);
100474
100475             successCallback(t.byte(response, "[]+"));
100476         }, 1);
100477     }
100478
100479     channel.isBasicChannel = !!isBasic;
100480     channel.isClosed       = false;
100481
100482     this.__defineGetter__("isBasicChannel", function () {
100483         return channel.isBasicChannel;
100484     });
100485
100486     this.close    = close;
100487     this.transmit = transmit;
100488 };
100489
100490 ReaderInternal = function (reader) {
100491     this.name      = reader.name;
100492     this.isPresent = reader.isPresent;
100493 };
100494
100495 SessionInternal = function () {
100496     this.channels = {};
100497     this.external = new Session(this.channels);
100498 };
100499
100500 _initialize();
100501
100502 module.exports = _self;
100503
100504 });
100505 define('ripple/platform/tizen/2.0/geoBackend_nominatim', function (require, exports, module) {
100506 /*
100507  *  Copyright 2012 Intel Corporation.
100508  *
100509  * Licensed under the Apache License, Version 2.0 (the "License");
100510  * you may not use this file except in compliance with the License.
100511  * You may obtain a copy of the License at
100512  *
100513  * http://www.apache.org/licenses/LICENSE-2.0
100514  *
100515  * Unless required by applicable law or agreed to in writing, software
100516  * distributed under the License is distributed on an "AS IS" BASIS,
100517  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
100518  * See the License for the specific language governing permissions and
100519  * limitations under the License.
100520  */
100521
100522 var lbs = require('ripple/platform/tizen/2.0/lbs_utils'),
100523     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
100524     WebAPIError = require('ripple/platform/tizen/2.0/WebAPIError'),
100525     tizen1_utils = require('ripple/platform/tizen/2.0/tizen1_utils'),
100526     GeocodeResult = require('ripple/platform/tizen/2.0/GeocodeResult');
100527
100528 function _concatAddrString(addr) {
100529     var ret = "", i, pieces;
100530     if (typeof addr === "string") {
100531         pieces = addr.split(" ");
100532         for (i = 0; i < pieces.length; i++) {
100533             ret = ret + pieces[i] + "+";
100534         }
100535     } else if (typeof addr === "object") {
100536         if (addr.premises !== null && addr.premises !== undefined) {
100537             ret = ret + addr.premises + "+";
100538         }
100539         if (addr.streetNumber !== null && addr.streetNumber !== undefined) {
100540             ret = ret + addr.streetNumber + "+";
100541         }
100542         if (addr.street !== null && addr.street !== undefined) {
100543             ret = ret + addr.street + "+";
100544         }
100545         if (addr.city !== null && addr.city !== undefined) {
100546             ret = ret + addr.city + "+";
100547         }
100548         if (addr.county !== null && addr.county !== undefined) {
100549             ret = ret + addr.county + "+";
100550         }
100551         if (addr.region !== null && addr.region !== undefined) {
100552             ret = ret + addr.region + "+";
100553         }
100554         if (addr.postalCode !== null && addr.postalCode !== undefined) {
100555             ret = ret + addr.postalCode + "+";
100556         }
100557         if (addr.country !== null && addr.country !== undefined) {
100558             ret = ret + addr.country + "+";
100559         }
100560     } else {
100561         return undefined;
100562     }
100563     ret = ret.slice(0, -1);
100564     return ret;
100565 }
100566
100567 module.exports = function (prop) {
100568     var _self = new lbs.LocationServiceProvider(prop);
100569
100570     _self.geocode = function (address, successCB, errorCB, options) {
100571         function _geocode() {
100572             var i, searchStr, coordinates = [], result;
100573
100574             searchStr = _concatAddrString(address);
100575             if (searchStr === undefined) {
100576                 throw (new WebAPIError(errorcode.TYPE_MISMATCH_ERR));
100577             }
100578             searchStr = "http://nominatim.openstreetmap.org/search?q=" + searchStr + "&format=json&polygon=1&addressdetails=1";
100579
100580             /* use nominatim online geo service. (http://nominatim.openstreetmap.org) */
100581             $.getJSON(searchStr, function (data) {
100582                 for (i = 0; i < data.length; i++) {
100583                     result = new GeocodeResult(parseFloat(data[i].lat), parseFloat(data[i].lon));
100584                     coordinates.push(result);
100585                 }
100586                 successCB(coordinates);
100587             }).error(function () {
100588                 if (errorCB) {
100589                     setTimeout(function () {
100590                         errorCB(new WebAPIError(errorcode.NETWORK_ERR));
100591                     }, 1);
100592                 }
100593             });
100594         }
100595
100596         tizen1_utils.validateTypeMismatch(successCB, errorCB, "geocode", _geocode);
100597     };
100598
100599     _self.reverseGeocode = function (coordinates, successCB, errorCB, options) {
100600         function _reverseGeocode() {
100601             var searchStr = "";
100602             if (typeof coordinates !== "object" ||
100603                 typeof coordinates.latitude !== "number" ||
100604                 typeof coordinates.longitude !== "number") {
100605                 throw (new WebAPIError(errorcode.TYPE_MISMATCH_ERR));
100606             }
100607             searchStr = "http://nominatim.openstreetmap.org/reverse?format=json&lat=" +
100608                         coordinates.latitude + "&lon=" + coordinates.longitude + "&zoom=18&addressdetails=1";
100609
100610             /* use nominatim online geo service. (http://nominatim.openstreetmap.org) */
100611             $.getJSON(searchStr, function (data) {
100612                 var addr;
100613
100614                 if (options && options.resultType === "STRUCTURED") {
100615                     addr = new lbs.StructuredAddress({
100616                         country : data.address.country,
100617                         region : data.address.state,
100618                         county : data.address.county,
100619                         city : data.address.city,
100620                         street : data.address.road,
100621                         streetNumber : data.address.streetNumber,
100622                         postalCode : data.address.postcode
100623                     });
100624                 } else {
100625                     addr = data.display_name;
100626                 }
100627                 successCB([addr]);
100628             }).error(function () {
100629                 if (errorCB) {
100630                     setTimeout(function () {
100631                         errorCB(new WebAPIError(errorcode.NETWORK_ERR));
100632                     }, 1);
100633                 }
100634             });
100635         }
100636
100637         tizen1_utils.validateTypeMismatch(successCB, errorCB, "reverseGeocode", _reverseGeocode);
100638     };
100639
100640     return _self;
100641 };
100642
100643
100644 });
100645 define('ripple/platform/tizen/2.0/route', function (require, exports, module) {
100646 /*
100647  *  Copyright 2012 Intel Corporation.
100648  *
100649  * Licensed under the Apache License, Version 2.0 (the "License");
100650  * you may not use this file except in compliance with the License.
100651  * You may obtain a copy of the License at
100652  *
100653  * http://www.apache.org/licenses/LICENSE-2.0
100654  *
100655  * Unless required by applicable law or agreed to in writing, software
100656  * distributed under the License is distributed on an "AS IS" BASIS,
100657  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
100658  * See the License for the specific language governing permissions and
100659  * limitations under the License.
100660  */
100661
100662 var errorcode = require('ripple/platform/tizen/2.0/errorcode'),
100663     WebAPIError = require('ripple/platform/tizen/2.0/WebAPIError'),
100664     SimpleCoordinates = require('ripple/platform/tizen/2.0/SimpleCoordinates'),
100665     ProviderNominatim = require('ripple/platform/tizen/2.0/routeBackend_navigation'), // navigation route service
100666     _getProviders,
100667     _providers,
100668     _self;
100669
100670 function _initialize() {
100671     _providers = [new ProviderNominatim({name : "Nominatim", connectivity : "ONLINE"})];
100672 }
100673
100674 _initialize();
100675
100676 _self = {
100677     getDefaultProvider : function () {
100678         if (arguments.length !== 0) {
100679             throw (new WebAPIError(errorcode.INVALID_VALUES_ERR));
100680         }
100681         return _providers[0];
100682     },
100683     getProviders : function () {
100684         if (arguments.length !== 0) {
100685             throw (new WebAPIError(errorcode.INVALID_VALUES_ERR));
100686         }
100687         return _providers;
100688     }
100689 };
100690
100691 module.exports = _self;
100692
100693 });
100694 define('ripple/platform/tizen/2.0/time', function (require, exports, module) {
100695 /*
100696  *  Copyright 2012 Intel Corporation.
100697  *
100698  * Licensed under the Apache License, Version 2.0 (the "License");
100699  * you may not use this file except in compliance with the License.
100700  * You may obtain a copy of the License at
100701  *
100702  * http://www.apache.org/licenses/LICENSE-2.0
100703  *
100704  * Unless required by applicable law or agreed to in writing, software
100705  * distributed under the License is distributed on an "AS IS" BASIS,
100706  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
100707  * See the License for the specific language governing permissions and
100708  * limitations under the License.
100709  */
100710
100711 var t = require('ripple/platform/tizen/2.0/typecast'),
100712     TZDate = require('ripple/platform/tizen/2.0/TZDate'),
100713     db = require('ripple/db'),
100714     tz = require('ripple/platform/tizen/2.0/timezone_info'),
100715     _timeFormat = "h:m:s ap", _shortDateFormat = "d/m/y",
100716     _longDateFormat = "D, M d, y", _self;
100717
100718 _self = {
100719     getCurrentDateTime: function () {
100720         t.TimeUtil("getCurrentDateTime", arguments);
100721         return new TZDate();
100722     },
100723     getLocalTimezone: function () {
100724         t.TimeUtil("getLocalTimezone", arguments);
100725         var localtz = db.retrieve("tizen-timezone") || "UTC";
100726         return localtz;
100727     },
100728     getAvailableTimezones: function () {
100729         t.TimeUtil("getAvailableTimezones", arguments);
100730         var ret = tz.getAllTimezone();
100731         return ret;
100732     },
100733     getDateFormat: function (shortformat) {
100734         t.TimeUtil("getDateFormat", arguments);
100735
100736         if (shortformat) {
100737             return _shortDateFormat;
100738         } else {
100739             return _longDateFormat;
100740         }
100741     },
100742     getTimeFormat: function () {
100743         t.TimeUtil("getTimeFormat", arguments);
100744         return _timeFormat;
100745     },
100746     isLeapYear: function (year) {
100747         t.TimeUtil("isLeapYear", arguments);
100748         return ((year % 4 === 0) && (year % 100 !== 0 || year % 400 === 0));
100749     }
100750 };
100751
100752 module.exports = _self;
100753
100754 });
100755 define('ripple/platform/tizen/2.0/Message', function (require, exports, module) {
100756 /*
100757  *  Copyright 2012 Intel Corporation.
100758  *
100759  * Licensed under the Apache License, Version 2.0 (the "License");
100760  * you may not use this file except in compliance with the License.
100761  * You may obtain a copy of the License at
100762  *
100763  * http://www.apache.org/licenses/LICENSE-2.0
100764  *
100765  * Unless required by applicable law or agreed to in writing, software
100766  * distributed under the License is distributed on an "AS IS" BASIS,
100767  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
100768  * See the License for the specific language governing permissions and
100769  * limitations under the License.
100770  */
100771
100772 var msg_utils = require('ripple/platform/tizen/2.0/msg_utils'),
100773     MessageBody = require('ripple/platform/tizen/2.0/MessageBody'),
100774     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
100775     WebAPIException = require('ripple/platform/tizen/2.0/WebAPIException');
100776
100777 module.exports = function (type, messageInit) {
100778     var _id = null, _serviceId = null, _conversationId = null,
100779         _folderId = null, _type = type, _timestamp = null,
100780         _from = null, _hasAttachment = false, _messageStatus = null,
100781         msg = {};
100782
100783     if (messageInit !== undefined && messageInit !== null) {
100784         if (msg_utils.setMsg(messageInit, msg) === false) {
100785             throw (new WebAPIException(errorcode.TYPE_MISMATCH_ERR));
100786         }
100787         if (messageInit.priv !== undefined) {
100788             /* secret constructor for PrivateMessage */
100789             _id = messageInit.priv.id;
100790             _serviceId = messageInit.priv.serviceId;
100791             _conversationId = messageInit.priv.conversationId;
100792             _folderId = messageInit.priv.folderId;
100793             _type = messageInit.priv.type;
100794             _timestamp = new Date(messageInit.priv.timestamp);
100795             _from = messageInit.priv.from;
100796             _hasAttachment = messageInit.priv.hasAttachment;
100797             _messageStatus = messageInit.priv.messageStatus;
100798         }
100799         msg.body = new MessageBody(_id, msg.body.loaded, msg.body.plainBody, msg.body.htmlBody, []);
100800     }
100801
100802     msg.__defineGetter__("id", function () {
100803         return _id;
100804     });
100805     msg.__defineGetter__("conversationId", function () {
100806         return _conversationId;
100807     });
100808     msg.__defineGetter__("folderId", function () {
100809         return _folderId;
100810     });
100811     msg.__defineGetter__("type", function () {
100812         return _type;
100813     });
100814     msg.__defineGetter__("timestamp", function () {
100815         return _timestamp;
100816     });
100817     msg.__defineGetter__("from", function () {
100818         return _from;
100819     });
100820     msg.__defineGetter__("hasAttachment", function () {
100821         return _hasAttachment;
100822     });
100823     msg.__defineGetter__("messageStatus", function () {
100824         return _messageStatus;
100825     });
100826     return msg;
100827 };
100828
100829 });
100830 define('ripple/platform/tizen/2.0/NDEFRecordMedia', function (require, exports, module) {
100831 /*
100832  *  Copyright 2013 Intel Corporation
100833  *
100834  * Licensed under the Apache License, Version 2.0 (the "License");
100835  * you may not use this file except in compliance with the License.
100836  * You may obtain a copy of the License at
100837  *
100838  * http://www.apache.org/licenses/LICENSE-2.0
100839  *
100840  * Unless required by applicable law or agreed to in writing, software
100841  * distributed under the License is distributed on an "AS IS" BASIS,
100842  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
100843  * See the License for the specific language governing permissions and
100844  * limitations under the License.
100845  */
100846
100847 var t = require('ripple/platform/tizen/2.0/typecast'),
100848     NDEFRecordInternal = require('ripple/platform/tizen/2.0/NDEFRecordInternal'),
100849     NDEFRecordMedia;
100850
100851 NDEFRecordMedia = function (mimeType, data) {
100852     var i, type = [], payload;
100853
100854     t.NDEFRecordMedia(arguments, this);
100855
100856     for (i = 0; i < mimeType.length; i++) {
100857         type[i] = mimeType.charCodeAt(i);
100858     }
100859     payload = t.byte(data, "[]");
100860
100861     // Normally, we can use prototype to inherit a class, for example:
100862     //     NDEFRecordMedia.prototype = new NDEFRecord(2, [...], [...], [...]);
100863     // But the test case thinks that all the inherited property should be
100864     // the object's own property. So, we can only change the "this" point
100865     // of NDEFRecord constructor here.
100866     NDEFRecordInternal.call(this, tizen.nfc.NFC_RECORD_TNF_MIME_MEDIA, type,
100867             payload, []);
100868
100869     this.__defineGetter__("mimeType", function () {
100870         return mimeType;
100871     });
100872 };
100873
100874 module.exports = NDEFRecordMedia;
100875
100876 });
100877 define('ripple/platform/tizen/2.0/WebAPIException', function (require, exports, module) {
100878 /*
100879  *  Copyright 2012 Intel Corporation.
100880  *
100881  * Licensed under the Apache License, Version 2.0 (the "License");
100882  * you may not use this file except in compliance with the License.
100883  * You may obtain a copy of the License at
100884  *
100885  * http://www.apache.org/licenses/LICENSE-2.0
100886  *
100887  * Unless required by applicable law or agreed to in writing, software
100888  * distributed under the License is distributed on an "AS IS" BASIS,
100889  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
100890  * See the License for the specific language governing permissions and
100891  * limitations under the License.
100892  */
100893
100894 var errorcode = require('ripple/platform/tizen/2.0/errorcode');
100895
100896 var msg = {
100897     0: "Generic Error",
100898     1: "Index or size is negative, or greater than the allowed value.",
100899     2: "Specified range of text does not fit into a DOMString.",
100900     3: "Node is inserted somewhere it doesn't belong.",
100901     4: "Node is used in a different document than the one that created it (that doesn't support it).",
100902     5: "An invalid or illegal character is specified.",
100903     6: "Data is specified for a Node which does not support data.",
100904     7: "An attempt is made to modify an object where modifications are not allowed.",
100905     8: "An attempt is made to reference a Node in a context where it does not exist.",
100906     9: "The implementation does not support the requested type of object or operation.",
100907     10: "An attempt is made to add an attribute that is already in use elsewhere.",
100908     11: "An attempt is made to use an object that is not, or is no longer, usable.",
100909     12: "An invalid or illegal string is specified.",
100910     13: "An attempt is made to modify the type of the underlying object.",
100911     14: "An attempt is made to create or change an object in a way which is incorrect with regard to namespaces.",
100912     15: "A parameter or an operation is not supported by the underlying object.",
100913     16: "A call to a method such as insertBefore or removeChild would make the Node invalid with respect to \"partial validity\", this exception would be raised and the operation would not be done.",
100914     17: "The type of an object is incompatible with the expected type of the parameter associated to the object.",
100915     18: "An attempt is made to perform an operation or access some data in a way that would be a security risk or a violation of the user agent's security policy.",
100916     19: "A network error occurs in synchronous requests.",
100917     20: "The abort error occurs in asynchronous requests by user prompt.",
100918     21: "The operation could not be completed because the URL does not match.",
100919     22: "The quota has been exceeded.",
100920     23: "The operation timed out.",
100921     24: "The supplied node is incorrect or has an incorrect ancestor for this operation.",
100922     25: "The object can not be cloned.",
100923     99: "The content of an object does not include valid values.",
100924     100: "Error occurred in communication with the underlying implementation that meant the requested method could not complete.",
100925     111: "Requested service is not available."
100926 },
100927     errType = {
100928     0: "UnknownError",
100929     1: "IndexSizeError",
100930     2: "DOMStringSizeError",
100931     3: "HierarchyRequestError",
100932     4: "WrongDocumentError",
100933     5: "InvalidCharacterError",
100934     6: "NoDataAllowedError",
100935     7: "NoModificationAllowedError",
100936     8: "NotFoundError",
100937     9: "NotSupportedError",
100938     10: "InuseAttributeError",
100939     11: "InvalidStateError",
100940     12: "SyntaxError",
100941     13: "InvalidModificationError",
100942     14: "NamespaceError",
100943     15: "InvalidAccessError",
100944     16: "ValidationError",
100945     17: "TypeMismatchError",
100946     18: "SecurityError",
100947     19: "NetworkError",
100948     20: "AbortError",
100949     21: "URLMismatchError",
100950     22: "QuotaExceededError",
100951     23: "TimeoutError",
100952     24: "InvalidNodeTypeError",
100953     25: "DataCloneError",
100954     99: "InvalidValuesError",
100955     100: "IOError",
100956     111: "ServiceNotAvailableError"
100957 };
100958
100959 /*
100960   support 3 types of error:
100961   - WebAPIError()
100962       code = errorcode.UNKNOWN_ERR
100963       message = errorcode.message[UNKNOWN_ERR]
100964   - WebAPIError(errorcode."TYPE_MISMATCH_ERR")
100965       code = 17
100966       message = errorcode.message[17]
100967   - WebAPIError(my_own_error_code, "This is my error message.")
100968       code = my_own_error_code(number)
100969       message = "This is my error message."
100970 */
100971
100972 module.exports = function (code, message, name) {
100973     var g, c, _code, _message, _name;
100974
100975     for (c in errorcode) {
100976         g = errorcode.__lookupGetter__(c);
100977         if (g) {
100978             this.__defineGetter__(c, g);
100979         }
100980     }
100981
100982     if (typeof code !== 'number') {
100983         _code = errorcode.UNKNOWN_ERR;
100984         _message = msg[_code];
100985         _name = errType[_code];
100986     } else {
100987         _code = code;
100988         if (typeof message === 'string') {
100989             _message = message;
100990         } else {
100991             _message = msg[_code];
100992         }
100993         if (typeof name === 'string') {
100994             _name = name;
100995         } else {
100996             _name = errType[_code];
100997         }
100998     }
100999
101000     this.__defineGetter__("code", function () {
101001         return _code;
101002     });
101003     this.__defineGetter__("message", function () {
101004         return _message;
101005     });
101006     this.__defineGetter__("name", function () {
101007         return _name;
101008     });
101009 };
101010
101011 });
101012 define('ripple/platform/tizen/2.0/ApplicationControlData', function (require, exports, module) {
101013 /*
101014  *  Copyright 2013 Intel Corporation.
101015  *
101016  * Licensed under the Apache License, Version 2.0 (the "License");
101017  * you may not use this file except in compliance with the License.
101018  * You may obtain a copy of the License at
101019  *
101020  * http://www.apache.org/licenses/LICENSE-2.0
101021  *
101022  * Unless required by applicable law or agreed to in writing, software
101023  * distributed under the License is distributed on an "AS IS" BASIS,
101024  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
101025  * See the License for the specific language governing permissions and
101026  * limitations under the License.
101027  */
101028
101029 var t = require('ripple/platform/tizen/2.0/typecast'),
101030     ApplicationControlData;
101031
101032 ApplicationControlData = function (key, value) {
101033     var applicationControlData = {};
101034
101035     t.ApplicationControlData(arguments, this);
101036
101037     applicationControlData.key   = key;
101038     applicationControlData.value = value;
101039
101040     this.__defineGetter__("key", function () {
101041         return applicationControlData.key;
101042     });
101043     this.__defineSetter__("key", function (val) {
101044         try {
101045             applicationControlData.key = t.DOMString(val);
101046         } catch (e) {
101047         }
101048     });
101049
101050     this.__defineGetter__("value", function () {
101051         return applicationControlData.value;
101052     });
101053     this.__defineSetter__("value", function (val) {
101054         try {
101055             applicationControlData.value = t.DOMString(val, '[]');
101056         } catch (e) {
101057         }
101058     });
101059 };
101060
101061 module.exports = ApplicationControlData;
101062
101063 });
101064 define('ripple/platform/tizen/2.0/MessagingService', function (require, exports, module) {
101065 /*
101066  *  Copyright 2012 Intel Corporation.
101067  *
101068  * Licensed under the Apache License, Version 2.0 (the "License");
101069  * you may not use this file except in compliance with the License.
101070  * You may obtain a copy of the License at
101071  *
101072  * http://www.apache.org/licenses/LICENSE-2.0
101073  *
101074  * Unless required by applicable law or agreed to in writing, software
101075  * distributed under the License is distributed on an "AS IS" BASIS,
101076  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
101077  * See the License for the specific language governing permissions and
101078  * limitations under the License.
101079  */
101080
101081 var event = require('ripple/event'),
101082     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
101083     deviceSettings = require('ripple/deviceSettings'),
101084     WebAPIError = require('ripple/platform/tizen/2.0/WebAPIError'),
101085     WebAPIException = require('ripple/platform/tizen/2.0/WebAPIException'),
101086     PrivMessage = require('ripple/platform/tizen/2.0/PrivMessage'),
101087     MessageStorage = require('ripple/platform/tizen/2.0/MessageStorage'),
101088     msg_utils = require('ripple/platform/tizen/2.0/msg_utils'),
101089     t = require('ripple/platform/tizen/2.0/typedef'),
101090     TypeCoerce = require('ripple/platform/tizen/2.0/typecoerce'),
101091     _self,
101092     TIZEN_DEFAULT_MSG_FROM = {"messaging.sms": "13572468",
101093                               "messaging.mms": "13572468",
101094                               "messaging.email": "tizen.simulator@tizen.org"},
101095     INCOMING_TYPE = {"messaging.sms": "sms",
101096                      "messaging.mms": "mms",
101097                      "messaging.email": "email"};
101098
101099 _self = function (id, type, security_check) {
101100     var msg_service = {},
101101         pendingOperations = {},
101102         _msgSending = {},
101103         _receivedEmails = [],
101104         _id = id,
101105         _type = type,
101106         _security_check = security_check,
101107         _from = TIZEN_DEFAULT_MSG_FROM[_type],
101108         _incomingType = INCOMING_TYPE[_type],
101109         _messages = msg_utils.loadMsg(_type, _id),
101110         _messageStorage = new MessageStorage(_messages, _security_check);
101111
101112     event.on("MessageSent", function (rst) {
101113         var i, rsp_ok = [], rsp_fail = [];
101114         // rst.msg is the real msg in module
101115         if (rst.msg.priv.type !== _type ||
101116             rst.msg.priv.serviceId !== _id) {
101117             // not my msg
101118             return;
101119         }
101120         if (_msgSending[rst.id] !== undefined) {
101121             for (i in rst) {
101122                 if ((i !== "id") && (i !== "msg")) {
101123                     if (rst[i] === true) {
101124                         rsp_ok.push(i);
101125                     } else {
101126                         rsp_fail.push(i);
101127                     }
101128                 }
101129             }
101130             rst.msg.priv.folderId = "SENTBOX";
101131             if (rsp_fail.length === 0) {
101132                 rst.msg.priv.messageStatus = "SENT";
101133                 _msgSending[rst.id].onsuccess(rsp_ok);
101134             } else {
101135                 rst.msg.priv.messageStatus = "FAILED";
101136                 _msgSending[rst.id].onerror(rsp_fail);
101137             }
101138             msg_utils.saveMsg(rst.msg);  // sync to remote
101139             event.trigger("MsgSentRst", [rst.msg]);
101140             delete _msgSending[rst.id];
101141         }
101142     });
101143
101144     event.on("MessageReceived", function (rst) {
101145         var m, opt = {}, msgInit = {}, msg = {};
101146
101147         if (rst.type !== _incomingType) {
101148             // not my msg
101149             return;
101150         }
101151         msgInit.plainBody = rst.body;
101152         msgInit.to = [_from];
101153         // TODO: handle attachment
101154         if (msg_utils.setMsg(msgInit, msg) === false) {
101155             throw (new WebAPIException(errorcode.TYPE_MISMATCH_ERR, "received message error"));
101156         }
101157         opt.id = Math.uuid(8, 16);
101158         opt.serviceId = _id;
101159         opt.conversationId = opt.id;
101160         opt.folderId = "INBOX";
101161         opt.type = _type;
101162         opt.timestamp = new Date();
101163         opt.from = rst.from;
101164         if (msg.attachments.length === 0) {
101165             opt.hasAttachment = false;
101166         } else {
101167             opt.hasAttachment = true;
101168         }
101169         opt.messageStatus = "RECEIVED";
101170         m = new PrivMessage(msg, opt);
101171         msg_utils.saveMsg(m);   // save in server
101172         if (_type !== "messaging.email") {
101173             _messages.msg[m.priv.id] = m;  // sync to local
101174             event.trigger("MsgRecv", [m]);
101175         } else {
101176             _receivedEmails.push(m);  // don't sync to local yet
101177         }
101178     });
101179
101180     msg_service = {
101181         sendMessage: function (_msg, onSuccess, onError) {
101182             var m, msg = {}, opt = {}, shortMsg = {}, rst = {};
101183             if (_security_check.write === false) {
101184                 throw (new WebAPIException(errorcode.SECURITY_ERR));
101185             }
101186             if (_msg === null || _msg === undefined || _msg.id === undefined) {
101187                 throw (new WebAPIException(errorcode.TYPE_MISMATCH_ERR));
101188             }
101189
101190             if (msg_utils.setMsg(_msg, msg) === false) {
101191                 throw (new WebAPIException(errorcode.TYPE_MISMATCH_ERR));
101192             }
101193             if ((arguments.length > 1) && onSuccess !== null && !(new TypeCoerce(t.SuccessCallback)).match(onSuccess)) {
101194                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
101195             }
101196             if ((arguments.length > 2) && onError !== null && !(new TypeCoerce(t.ErrorCallback)).match(onError)) {
101197                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
101198             }
101199             if (deviceSettings.retrieve("CELLULAR_NETWORK.status") === false &&
101200                 (_incomingType === 'sms' || _incomingType === 'mms')) {
101201                 if (onError) {
101202                     setTimeout(function () {
101203                         onError(new WebAPIError(errorcode.NETWORK_ERR));
101204                     }, 1);
101205                 }
101206                 return;
101207             }
101208             if (deviceSettings.retrieve("WIFI_NETWORK.status") === false &&
101209                 _incomingType === 'email') {
101210                 if (onError) {
101211                     setTimeout(function () {
101212                         onError(new WebAPIError(errorcode.NETWORK_ERR));
101213                     }, 1);
101214                 }
101215                 return;
101216             }
101217             if (typeof _msg.id === 'string') {
101218                 if (_messages.msg[_msg.id] === undefined) {
101219                     if (onError) {
101220                         setTimeout(function () {
101221                             onError(new WebAPIError(errorcode.INVALID_VALUES_ERR));
101222                         }, 1);
101223                     }
101224                     return;
101225                 }
101226                 if (_messages.msg[_msg.id].priv.messageStatus === "DRAFT") {
101227                     msg_utils.delMsg(_messages.msg[_msg.id]);
101228                     delete _messages.msg[_msg.id];
101229                 } else {
101230                     // if msg found in storage, it can only be a draft.
101231                     if (onError) {
101232                         setTimeout(function () {
101233                             onError(new WebAPIError(errorcode.UNKNOWN_ERR));
101234                         }, 1);
101235                     }
101236                     return;
101237                 }
101238             }
101239             opt.id = Math.uuid(8, 16);
101240             opt.serviceId = _id;
101241             if ((msg.inResponseTo !== null) &&
101242                 (_messages.msg[msg.inResponseTo] !== undefined) &&
101243                 (_messages.msg[msg.inResponseTo].priv.messageStatus !== "DRAFT")) {
101244                 opt.conversationId = _messages.msg[msg.inResponseTo].priv.conversationId;
101245             } else {
101246                 opt.conversationId = opt.id;
101247             }
101248             opt.folderId = "OUTBOX";
101249             opt.type = _type;
101250             opt.timestamp = new Date();
101251             opt.from = _from;
101252             if (msg.attachments.length === 0) {
101253                 opt.hasAttachment = false;
101254             } else {
101255                 opt.hasAttachment = true;
101256             }
101257             opt.messageStatus = "SENDING";
101258
101259             m = new PrivMessage(msg, opt);
101260             _messages.msg[m.priv.id] = m;
101261             msg_utils.saveMsg(m);  // sync to remote
101262             shortMsg.msg = m;   // pass by ref
101263             shortMsg.id = m.priv.id;
101264             shortMsg.body = m.body.plainBody;
101265             shortMsg.to = m.to.slice(0);
101266             shortMsg.cc = m.cc.slice(0);
101267             shortMsg.bcc = m.bcc.slice(0);
101268             event.trigger("OutsideMessageReceived", [shortMsg]);
101269             rst.onsuccess = onSuccess;
101270             rst.onerror = onError;
101271             _msgSending[m.priv.id] = rst;
101272         },
101273
101274         loadMessageBody: function (msg, onSuccess, onError) {
101275             var pendingID;
101276             if (_security_check.write === false) {
101277                 throw (new WebAPIException(errorcode.SECURITY_ERR));
101278             }
101279             if (_messages.msg[msg.id] === undefined) {
101280                 throw (new WebAPIException(errorcode.NOT_FOUND_ERR));
101281             }
101282             if (!(new TypeCoerce(t.MessageBodySuccessCallback)).match(onSuccess)) {
101283                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
101284             }
101285             if ((arguments.length > 2) && onError !== null && !(new TypeCoerce(t.ErrorCallback)).match(onError)) {
101286                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
101287             }
101288             pendingID = setTimeout(function () {
101289                 if (pendingOperations.hasOwnProperty(pendingID) === false) {
101290                     // has been cancelled/expired
101291                     return;
101292                 }
101293                 delete pendingOperations[pendingID];
101294                 onSuccess(_messages.msg[msg.id].body);
101295             }, 1);
101296             pendingOperations[pendingID] = onError;
101297             return pendingID;
101298         },
101299         loadMessageAttachment: function (msg, onSuccess, onError) {
101300             var pendingID;
101301
101302             if (_security_check.write === false) {
101303                 throw (new WebAPIException(errorcode.SECURITY_ERR));
101304             }
101305             if (_messages.msg[msg.id] === undefined) {
101306                 throw (new WebAPIException(errorcode.NOT_FOUND_ERR));
101307             }
101308             if (!(new TypeCoerce(t.MessageAttachmentSuccessCallback)).match(onSuccess)) {
101309                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
101310             }
101311             if ((arguments.length > 2) && onError !== null && !(new TypeCoerce(t.ErrorCallback)).match(onError)) {
101312                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
101313             }
101314             pendingID = setTimeout(function () {
101315                 if (pendingOperations.hasOwnProperty(pendingID) === false) {
101316                     // has been cancelled/expired
101317                     return;
101318                 }
101319                 delete pendingOperations[pendingID];
101320                 onSuccess(_messages.msg[msg.id].attachments);
101321             }, 1);
101322             pendingOperations[pendingID] = onError;
101323             return pendingID;
101324         },
101325         sync: function (successCallback, errorCallback, limit) {
101326             var i, m, pendingID;
101327
101328             if (_security_check.write === false) {
101329                 throw (new WebAPIException(errorcode.SECURITY_ERR));
101330             }
101331             if ((arguments.length > 0) && successCallback !== null && !(new TypeCoerce(t.SuccessCallback)).match(successCallback)) {
101332                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
101333             }
101334             if ((arguments.length > 1) && errorCallback !== null && !(new TypeCoerce(t.ErrorCallback)).match(errorCallback)) {
101335                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
101336             }
101337             if ((arguments.length > 2) && limit !== null && !(new TypeCoerce(t.long)).match(limit)) {
101338                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
101339             }
101340             pendingID = setTimeout(function () {
101341                 if (pendingOperations.hasOwnProperty(pendingID) === false) {
101342                     // has been cancelled/expired
101343                     return;
101344                 }
101345                 delete pendingOperations[pendingID];
101346                 for (i = 0; i < _receivedEmails.length; i++) {
101347                     m = _receivedEmails[i];
101348                     _messages.msg[m.priv.id] = m;  // sync to local
101349                     event.trigger("MsgRecv", [m]);
101350                 }
101351                 _receivedEmails = [];
101352                 if (successCallback) {
101353                     successCallback();
101354                 }
101355             }, 1);
101356             pendingOperations[pendingID] = errorCallback;
101357             return pendingID;
101358         },
101359
101360         syncFolder: function (folder, onSuccess, onError, limit) {
101361             var i, m, pendingID;
101362
101363             if (_security_check.write === false) {
101364                 throw (new WebAPIException(errorcode.SECURITY_ERR));
101365             }
101366             if (!(new TypeCoerce(t.MessageFolder)).match(folder)) {
101367                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
101368             }
101369             if ((arguments.length > 1) && onSuccess !== null && !(new TypeCoerce(t.SuccessCallback)).match(onSuccess)) {
101370                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
101371             }
101372             if ((arguments.length > 2) && onError !== null && !(new TypeCoerce(t.ErrorCallback)).match(onError)) {
101373                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
101374             }
101375             if ((arguments.length > 3) && limit !== null && !(new TypeCoerce(t.long)).match(limit)) {
101376                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
101377             }
101378             pendingID = setTimeout(function () {
101379                 if (pendingOperations.hasOwnProperty(pendingID) === false) {
101380                     // has been cancelled/expired
101381                     return;
101382                 }
101383                 delete pendingOperations[pendingID];
101384                 if (folder.id === "INBOX") {
101385                     for (i = 0; i < _receivedEmails.length; i++) {
101386                         m = _receivedEmails[i];
101387                         _messages.msg[m.priv.id] = m;  // sync to local
101388                         event.trigger("MsgRecv", [m]);
101389                     }
101390                     _receivedEmails = [];
101391                 }
101392                 onSuccess();
101393             }, 1);
101394             pendingOperations[pendingID] = onError;
101395             return pendingID;
101396         },
101397
101398         stopSync: function (pendingID) {
101399             if (!(new TypeCoerce(t.long)).match(pendingID)) {
101400                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
101401             }
101402             if (pendingOperations[pendingID] !== undefined) {
101403                 clearTimeout(pendingID);
101404                 pendingOperations[pendingID](new WebAPIError(errorcode.ABORT_ERR));
101405             }
101406             delete pendingOperations[pendingID];
101407         }
101408     };
101409     msg_service.__defineGetter__("type", function () {
101410         return _type;
101411     });
101412     msg_service.__defineGetter__("messageStorage", function () {
101413         return _messageStorage;
101414     });
101415     return msg_service;
101416 };
101417
101418 module.exports = _self;
101419
101420 });
101421 define('ripple/platform/tizen/2.0/vibration', function (require, exports, module) {
101422 /*
101423  *  Copyright 2012 Intel Corporation.
101424  *
101425  * Licensed under the Apache License, Version 2.0 (the "License");
101426  * you may not use this file except in compliance with the License.
101427  * You may obtain a copy of the License at
101428  *
101429  * http://www.apache.org/licenses/LICENSE-2.0
101430  *
101431  * Unless required by applicable law or agreed to in writing, software
101432  * distributed under the License is distributed on an "AS IS" BASIS,
101433  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
101434  * See the License for the specific language governing permissions and
101435  * limitations under the License.
101436  */
101437
101438 var event = require('ripple/event'),
101439     deviceSettings = require('ripple/deviceSettings'),
101440     constants = require('ripple/constants'),
101441     tizen1_utils = require('ripple/platform/tizen/2.0/tizen1_utils'),
101442     emulatorBridge = require('ripple/emulatorBridge'),
101443     curPost,
101444     _self;
101445
101446 function isVibratorOn() {
101447     return deviceSettings.retrieve("Config.vibratingMode");
101448 }
101449
101450 var vibrator = (function () {
101451     var vibratorPattern,
101452         isVibrating = false,
101453         runTime = 0,
101454         vibrateTimeout = null,
101455         MILLILSECONDS_OF_ONE_VIBRATION = 100,
101456         node = jQuery("#" + constants.COMMON.DEVICE_CONTAINER),
101457         movementIndex = 0,
101458         movement = [{ left: -10 }, { left: 0 }, { left: 10 }, { left: 0 },
101459                     {top: -10 }, { top: 0 }, {top: 10 }, { top: 0 }];
101460
101461     function _clearTimeout() {
101462         if (vibrateTimeout) {
101463             clearInterval(vibrateTimeout);
101464             vibrateTimeout = null;
101465         }
101466     }
101467
101468     function stopVibrate() {
101469         isVibrating = false;
101470         _clearTimeout();
101471         node.css({left: 0, top: 0}, MILLILSECONDS_OF_ONE_VIBRATION);
101472     }
101473
101474     function vibrate() {
101475         node.css(movement[movementIndex]);
101476         movementIndex = (movementIndex + 1) % 8;
101477     }
101478
101479     function changePulse() {
101480         if (emulatorBridge.document().hidden) {
101481             return;
101482         }
101483
101484         //run time
101485         runTime = runTime + MILLILSECONDS_OF_ONE_VIBRATION;
101486         if (curPost >= vibratorPattern.length) {
101487             setTimeout(stopVibrate, 1);
101488         }
101489         if (runTime > vibratorPattern[curPost]) {
101490             curPost = curPost + 1;
101491             runTime = 0;
101492         } else {
101493             if ((curPost % 2) === 0) {
101494                 vibrate();
101495             }
101496         }
101497     }
101498
101499     function startVibrate(_pattern) {
101500         if (!isVibratorOn())
101501             return;
101502
101503         vibratorPattern = _pattern;
101504         _clearTimeout();
101505         movementIndex = 0;
101506         if (_pattern) {
101507             runTime = 0;
101508             vibrateTimeout = setInterval(changePulse, MILLILSECONDS_OF_ONE_VIBRATION);
101509         }
101510         isVibrating = true;
101511     }
101512
101513     return {
101514         isVibrating: isVibrating,
101515         startVibrate: startVibrate,
101516         stopVibrate: stopVibrate
101517     };
101518 }());
101519
101520 _self = {
101521     vibrate: function () {
101522         var pattern = arguments[0],
101523             i;
101524
101525         // If vibrator is off, stop the vibration
101526         event.on("VibratingModeChanged", function (value) {
101527             if (value === false) {
101528                 vibrator.stopVibrate();
101529             }
101530         });
101531
101532         //1. If the hidden attribute [PAGE-VISIBILITY] is set to true, abort these steps.
101533         if (emulatorBridge.document().hidden) {
101534             return;
101535         }
101536
101537         //2. Let pattern be the value of the first argument.
101538         if (!tizen1_utils.isValidArray(pattern)) {
101539             pattern |= 0;
101540         } else {
101541             for (i = 0; i < pattern.length; i++) {
101542                 pattern[i] |= 0;
101543             }
101544         }
101545
101546         //3. If pattern is 0, or an empty list, cancel the pre-existing instance of the processing vibration patterns algorithm, if any, and abort these steps.
101547         if (pattern === 0 || (tizen1_utils.isValidArray(pattern) && pattern.length === 0)) {
101548             vibrator.stopVibrate();
101549             return;
101550         }
101551
101552         //4. If pattern is a list, proceed to the next step. Otherwise run the following substeps:
101553         //a. Let list be an initially empty list, and add pattern to list.
101554         //b. Let pattern be list.
101555         if (!tizen1_utils.isValidArray(pattern)) {
101556             pattern = [pattern];
101557         }
101558
101559         //5. If any entry of pattern exceeds an implementation-dependent limit, then the user agent may throw a NotSupportedError exception and abort these steps.
101560
101561         //6. If the length of pattern is even, then remove the last entry in pattern.
101562         if (pattern.length % 2 === 0) {
101563             pattern.pop();
101564         }
101565
101566         //7. Cancel the pre-existing instance of the processing vibration patterns algorithm, if any.
101567         if (vibrator.isVibrating) {
101568             vibrator.stopVibrate();
101569         }
101570
101571         curPost = 0;
101572         vibrator.startVibrate(pattern);
101573     }
101574 };
101575
101576 module.exports = _self;
101577
101578 });
101579 define('ripple/platform/tizen/2.0/poiBackend_openmapquest', function (require, exports, module) {
101580 /*
101581  *  Copyright 2012 Intel Corporation.
101582  *
101583  * Licensed under the Apache License, Version 2.0 (the "License");
101584  * you may not use this file except in compliance with the License.
101585  * You may obtain a copy of the License at
101586  *
101587  * http://www.apache.org/licenses/LICENSE-2.0
101588  *
101589  * Unless required by applicable law or agreed to in writing, software
101590  * distributed under the License is distributed on an "AS IS" BASIS,
101591  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
101592  * See the License for the specific language governing permissions and
101593  * limitations under the License.
101594  */
101595
101596 var lbs = require('ripple/platform/tizen/2.0/lbs_utils'),
101597     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
101598     WebAPIError = require('ripple/platform/tizen/2.0/WebAPIError'),
101599     tizen1_utils = require('ripple/platform/tizen/2.0/tizen1_utils'),
101600     POIGeometry = require('ripple/platform/tizen/2.0/POIGeometry'),
101601     SimpleCoordinates = require('ripple/platform/tizen/2.0/SimpleCoordinates'),
101602     _security;
101603
101604 function POIPublic(prop) {
101605     /* This is created for public use */
101606     var _self, i, copy, attr,  _id = null, _providerName = null;
101607     if (prop.id) {
101608         _id = prop.id;
101609     }
101610     if (prop.providerName) {
101611         _providerName = prop.providerName;
101612     }
101613     _self = {
101614         name : null,
101615         categories : [],
101616         address : null,
101617         phoneNumbers : [],
101618         geometry : null,
101619         urls : [],
101620         rating : null,
101621         tags : null,
101622         toGeoJSON : function () {
101623             throw new WebAPIError(errorcode.NOT_SUPPORTED_ERR);
101624         }
101625     };
101626
101627     _self.__defineGetter__("id", function () {
101628         return _id;
101629     });
101630
101631     _self.__defineGetter__("providerName", function () {
101632         return _providerName;
101633     });
101634
101635     if (prop) {
101636         if (prop.name) {
101637             _self.name = String(prop.name);
101638         }
101639         if (tizen1_utils.isValidArray(prop.categories)) {
101640             _self.categories = [];
101641             for (i in prop.categories) {
101642                 _self.categories.push(String(prop.categories[i]));
101643             }
101644         }
101645         if (prop.address) {
101646             if (typeof prop.address === "string") {
101647                 _self.address = String(prop.address);
101648             } else if (Object.prototype.toString.call(prop.address) === "[object Object]") {
101649                 copy = prop.address.constructor();
101650                 for (attr in prop.address) {
101651                     if (prop.address.hasOwnProperty(attr)) {
101652                         copy[attr] = prop.address[attr];
101653                     }
101654                 }
101655                 _self.address = copy;
101656             }
101657         }
101658         if (tizen1_utils.isValidArray(prop.phoneNumbers)) {
101659             _self.phoneNumbers = [];
101660             for (i in prop.phoneNumbers) {
101661                 _self.phoneNumbers.push(String(prop.phoneNumbers[i]));
101662             }
101663         }
101664         if (prop.geometry) {
101665             _self.geometry = new POIGeometry(prop.geometry.position, prop.geometry.viewport, prop.geometry.wkt);
101666         }
101667         if (tizen1_utils.isValidArray(prop.urls)) {
101668             _self.urls = [];
101669             for (i in prop.urls) {
101670                 _self.urls.push(String(prop.urls[i]));
101671             }
101672         }
101673         if (typeof prop.rating === "number") {
101674             _self.rating = prop.rating;
101675         }
101676         if (Object.prototype.toString.call(prop.tags) === "[object Object]") {
101677             copy = prop.tags.constructor();
101678             for (attr in prop.tags) {
101679                 if (prop.tags.hasOwnProperty(attr)) {
101680                     copy[attr] = prop.tags[attr];
101681                 }
101682             }
101683             _self.tags = copy;
101684         }
101685     }
101686
101687     return _self;
101688 }
101689
101690 module.exports = function (prop) {
101691
101692     var _self = new lbs.LocationServiceProvider(prop);
101693
101694     if (prop.metaData) {
101695         _security = prop.metaData;
101696     }
101697
101698     _self.__defineGetter__("supportedFilterTypes", function () {
101699         return [];
101700     });
101701
101702     _self.__defineGetter__("supportedPOIFilterAttributes", function () {
101703         return [];
101704     });
101705
101706     _self.__defineGetter__("supportedCategories", function () {
101707         /* reference: http://wiki.openstreetmap.org/wiki/Map_Features#Amenity */
101708         return ["bar", "bbq", "biergarten", "cafe", "drinking_water", "fast_food", "food_court", "ice_cream",
101709                 "pub", "restaurant", "college", "kindergarten", "library", "school", "university",
101710                 "bicycle_parking", "bicycle_rental", "bus_station", "car_rental", "car_sharing", "car_wash",
101711                 "ev_charging", "ferry_terminal", "fuel", "grit_bin", "parking", "parking_entrance",
101712                 "parking_space", "taxi", "atm", "bank", "bureau_de_change", "baby_hatch", "clinic",
101713                 "dentist", "doctors", "hospital", "nursing_home", "pharmacy", "social_facility", "veterinary",
101714                 "arts_centre", "cinema", "community_centre", "fountain", "nightclub", "social_centre",
101715                 "stripclub", "studio", "swingerclub", "theatre", "bench", "brothel", "clock", "courthouse",
101716                 "crematorium", "embassy", "fire_station", "grave_yard", "hunting_stand", "marketplace",
101717                 "place_of_worship", "police", "post_box", "post_office", "prison", "public_building",
101718                 "recycling", "sauna", "shelter", "shower", "telephone", "toilets", "townhall", "vending_machine",
101719                 "waste_basket", "waste_disposal", "watering_place"];
101720     });
101721
101722     _self.__defineGetter__("capabilities", function () {
101723         /* The set is empty, indicating that this provider supports only 'find' operations */
101724         return [];
101725     });
101726
101727     _self.find = function (point, successCallback, errorCallback, options) {
101728         /* This provider only supports searching by "GeoRectBounds" due to MapQuest XAPI limitation */
101729
101730         function _find() {
101731             var searchStr, pois = [], isTypeOK = false,
101732                 id, providerName, name, categories = [], geometry;
101733
101734             if (Object.prototype.toString.call(point) === "[object Object]") {
101735                 if (point.southWest && point.northEast) {
101736                     if (typeof point.southWest.latitude === "number" &&
101737                         typeof point.southWest.longitude === "number" &&
101738                         typeof point.northEast.latitude === "number" &&
101739                         typeof point.northEast.longitude === "number") {
101740                         isTypeOK = true;
101741                     }
101742                 }
101743             }
101744
101745             if (!isTypeOK) {
101746                 throw (new WebAPIError(errorcode.TYPE_MISMATCH_ERR));
101747             }
101748
101749             searchStr = "http://open.mapquestapi.com/xapi/api/0.6/node";
101750             if (options && tizen1_utils.isValidArray(options.categories) &&
101751                 options.categories.length > 0 && typeof options.categories[0] === "string") {
101752                 /* xapi support single amenity only */
101753                 searchStr += "[amenity=" + options.categories[0] + "]";
101754             }
101755             searchStr += "[bbox=" + point.southWest.longitude + "," + point.southWest.latitude + "," +
101756                 point.northEast.longitude + "," + point.northEast.latitude + "]";
101757
101758             /* use Open MapQuest online xapi service. (http://open.mapquestapi.com/xapi/) */
101759             $.ajax({
101760                 type: "GET",
101761                 url: searchStr,
101762                 dataType: "xml",
101763                 timeout: 15000, /* 15 secs timeout */
101764                 success: function (xml) {
101765                     providerName = $(xml).find("osm").attr("generator");
101766                     $(xml).find("node").each(function () {
101767                         var $item = $(this);
101768                         categories = [];
101769                         id = $item.attr("id");
101770                         geometry = new POIGeometry(new SimpleCoordinates($item.attr("lat"), $item.attr("lon")));
101771                         $item.find("tag").each(function () {
101772                             if ($(this).attr("k") === "name") {
101773                                 name = $(this).attr("v");
101774                             } else if ($(this).attr("k") === "amenity") {
101775                                 categories.push($(this).attr("v"));
101776                             }
101777                         });
101778                         pois.push(new POIPublic({id: id, providerName: providerName, name: name,
101779                                                 categories: categories, geometry: geometry}));
101780                     });
101781                     successCallback(pois);
101782                 },
101783                 error: function (obj, msg) {
101784                     if (errorCallback) {
101785                         if (msg === "timeout") {
101786                             setTimeout(function () {
101787                                 errorCallback(new WebAPIError(errorcode.TIMEOUT_ERR));
101788                             }, 1);
101789                         } else {
101790                             setTimeout(function () {
101791                                 errorCallback(new WebAPIError(errorcode.NETWORK_ERR));
101792                             }, 1);
101793                         }
101794                     }
101795                 }
101796             });
101797         }
101798
101799         if (!_security.all && !_security.find) {
101800             throw new WebAPIError(errorcode.SECURITY_ERR);
101801         }
101802
101803         tizen1_utils.validateTypeMismatch(successCallback, errorCallback, "find", _find);
101804     };
101805
101806     _self.update = function (poi, successCallback, errorCallback) {
101807         if (!_security.all && !_security.update) {
101808             throw new WebAPIError(errorcode.SECURITY_ERR);
101809         }
101810
101811         throw new WebAPIError(errorcode.NOT_SUPPORTED_ERR);
101812     };
101813
101814     _self.add = function (poi, successCallback, errorCallback) {
101815         if (!_security.all && !_security.add) {
101816             throw new WebAPIError(errorcode.SECURITY_ERR);
101817         }
101818
101819         throw new WebAPIError(errorcode.NOT_SUPPORTED_ERR);
101820     };
101821
101822     _self.remove = function (poi, successCallback, errorCallback) {
101823         if (!_security.all && !_security.remove) {
101824             throw new WebAPIError(errorcode.SECURITY_ERR);
101825         }
101826
101827         throw new WebAPIError(errorcode.NOT_SUPPORTED_ERR);
101828     };
101829
101830     return _self;
101831 };
101832
101833 });
101834 define('ripple/platform/tizen/2.0/BluetoothClassDeviceService', function (require, exports, module) {
101835 /*
101836  *  Copyright 2013 Intel Corporation
101837  *
101838  * Licensed under the Apache License, Version 2.0 (the "License");
101839  * you may not use this file except in compliance with the License.
101840  * You may obtain a copy of the License at
101841  *
101842  * http://www.apache.org/licenses/LICENSE-2.0
101843  *
101844  * Unless required by applicable law or agreed to in writing, software
101845  * distributed under the License is distributed on an "AS IS" BASIS,
101846  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
101847  * See the License for the specific language governing permissions and
101848  * limitations under the License.
101849  */
101850
101851 var BluetoothClassDeviceService = function () {
101852     this.__defineGetter__("LIMITED_DISCOVERABILITY", function () {
101853         return 0x0001;
101854     });
101855
101856     this.__defineGetter__("POSITIONING", function () {
101857         return 0x0008;
101858     });
101859
101860     this.__defineGetter__("NETWORKING", function () {
101861         return 0x0010;
101862     });
101863
101864     this.__defineGetter__("RENDERING", function () {
101865         return 0x0020;
101866     });
101867
101868     this.__defineGetter__("CAPTURING", function () {
101869         return 0x0040;
101870     });
101871
101872     this.__defineGetter__("OBJECT_TRANSFER", function () {
101873         return 0x0080;
101874     });
101875
101876     this.__defineGetter__("AUDIO", function () {
101877         return 0x0100;
101878     });
101879
101880     this.__defineGetter__("TELEPHONY", function () {
101881         return 0x0200;
101882     });
101883
101884     this.__defineGetter__("INFORMATION", function () {
101885         return 0x0400;
101886     });
101887 };
101888
101889 module.exports = BluetoothClassDeviceService;
101890
101891 });
101892 define('ripple/platform/tizen/2.0/download', function (require, exports, module) {
101893 /*
101894  *  Copyright 2012 Intel Corporation.
101895  *
101896  * Licensed under the Apache License, Version 2.0 (the "License");
101897  * you may not use this file except in compliance with the License.
101898  * You may obtain a copy of the License at
101899  *
101900  * http://www.apache.org/licenses/LICENSE-2.0
101901  *
101902  * Unless required by applicable law or agreed to in writing, software
101903  * distributed under the License is distributed on an "AS IS" BASIS,
101904  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
101905  * See the License for the specific language governing permissions and
101906  * limitations under the License.
101907  */
101908
101909 var db = require('ripple/db'),
101910     event = require('ripple/event'),
101911     t = require('ripple/platform/tizen/2.0/typecast'),
101912     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
101913     filesystem = require('ripple/platform/tizen/2.0/filesystem'),
101914     WebAPIError = require('ripple/platform/tizen/2.0/WebAPIError'),
101915     WebAPIException = require('ripple/platform/tizen/2.0/WebAPIException'),
101916     DownloadRequest = require('ripple/platform/tizen/2.0/DownloadRequest'),
101917     DownloadState = {
101918         QUEUED: "QUEUED",
101919         DOWNLOADING: "DOWNLOADING",
101920         PAUSED: "PAUSED",
101921         CANCELED: "CANCELED",
101922         COMPLETED: "COMPLETED",
101923         FAILED: "FAILED"
101924     },
101925     _security = {
101926         "http://tizen.org/privilege/download": ["start"]
101927     },
101928     DB_DOWNLOAD_KEY = "tizen1-db-download",
101929     DownloadItem, _isInitialized = false, INTERVAL = 1000,
101930     _downloads = [], _resources = [], _self;
101931
101932 function _initDownloadItem(download) {
101933     var url, index, isExist = false;
101934     url = download.url;
101935     if (download.destination === null) {
101936         download.destination = "downloads";
101937     }
101938     if (download.fileName === null) {
101939         index = url.lastIndexOf('\/') + 1;
101940         download.fileName = url.substring(index);
101941     }
101942     if (!_isInitialized) {
101943         initializeResource();
101944     }
101945     _resources.some(function (value) {
101946         if (value.url === url) {
101947             download.size           = Number(value.size);
101948             download.speed          = Number(value.speed);
101949             download.estimatedTime = Math.round(value.estimatedTime * 100) / 100;
101950             download.MIMEType       = value.MIMEType;
101951             isExist =  true;
101952             return;
101953         }
101954     });
101955     if (!isExist) {
101956         download.state = DownloadState.FAILED;
101957         _exec(download.callback, 'onfailed', download.id, new WebAPIError(errorcode.NOT_FOUND_ERR));
101958         return;
101959     }
101960     return download;
101961 }
101962
101963 function _exec(callback, name, downloadId, arg1, arg2) {
101964     if (callback === null) {
101965         return;
101966     }
101967
101968     window.setTimeout(function () {
101969         switch (name) {
101970         case "onprogress":
101971             callback[name](downloadId, arg1, arg2);
101972             break;
101973
101974         case "onpaused":
101975             callback[name](downloadId);
101976             break;
101977
101978         case "oncanceled":
101979             callback[name](downloadId);
101980             break;
101981
101982         case "oncompleted":
101983             callback[name](downloadId, arg1);
101984             break;
101985
101986         case "onfailed":
101987             callback[name](downloadId, arg1);
101988             break;
101989
101990         default:
101991             break;
101992         }
101993     }, 1);
101994 }
101995
101996 function _getDownloadObjById(id) {
101997     var isFound = false, backObj;
101998     id = Number(id);
101999     _downloads.some(function (obj) {
102000         if (obj.id === id) {
102001             backObj = obj;
102002             isFound = true;
102003             return;
102004         }
102005     });
102006     if (!isFound) {
102007         throw new WebAPIException(errorcode.NOT_FOUND_ERR);
102008     }
102009     return backObj;
102010 }
102011
102012 function initializeResource() {
102013     _resources = db.retrieveObject(DB_DOWNLOAD_KEY);
102014     _isInitialized = true;
102015 }
102016
102017 function _saveFile(downloadObj, callback) {
102018     var name, path, content;
102019
102020     name = downloadObj.fileName;
102021     path = downloadObj.destination;
102022     content = 'size|' + downloadObj.size + ',speed|' + downloadObj.speed + ',url|' + downloadObj.url + ',estimatedTime|' + downloadObj.estimatedTime;
102023     function onsuccess(fs) {
102024         fs.write(content);
102025         fs.close();
102026     }
102027     function onerror(e) {
102028         _exec(downloadObj.callback, 'onfailed', downloadObj.id, e);
102029     }
102030     function rename(name) { //index.html==>index_1.html
102031         var index, c;
102032         index = name.lastIndexOf('.');
102033         if (index < 0) {
102034             index = name.length;
102035         }
102036         c = name.substr(index - 2, 1);
102037         if (c === '_') {
102038             name = name.substr(0, index - 1) + (Number(name.substr(index - 1, 1)) + 1) + name.substring(index);
102039         } else {
102040             name = name.substr(0, index) + "_1" + name.substring(index);
102041         }
102042         return name;
102043     }
102044
102045     filesystem.resolve(path, function (dir) {
102046         var file, isExist = true;
102047         while (isExist) {
102048             try {
102049                 file = dir.resolve(name);
102050                 name = rename(name);
102051             } catch (e) {
102052                 isExist = false;
102053             }
102054         }
102055         file = dir.createFile(name);
102056         file.openStream('w', onsuccess, onerror, 'UTF-8');
102057         callback(name);
102058     }, onerror, "rw");
102059 }
102060
102061 DownloadItem = function (download, callback) {
102062     var _self;
102063     _self = {
102064         id           : Number(Math.uuid(8, 10)),
102065         url          : download.url,
102066         state        : DownloadState.QUEUED,
102067         fileName     : download.fileName || null,
102068         destination  : download.destination || null,
102069         callback     : callback || null
102070     };
102071     return _self;
102072 };
102073
102074 _self = function () {
102075     function start(downloadRequest, downloadCallback) {
102076         var downloadObj, fileSize, increment, receivedSize = 0, intervalId;
102077
102078         if (!_security.start) {
102079             throw new WebAPIException(errorcode.SECURITY_ERR);
102080         }
102081
102082         t.DownloadManager("start", arguments);
102083
102084         downloadObj = new DownloadItem(downloadRequest, downloadCallback);
102085         _downloads.push(downloadObj);
102086         downloadObj = _initDownloadItem(downloadObj);
102087         if (downloadObj === null || downloadObj === undefined) {
102088             return;
102089         }
102090         downloadObj.state = DownloadState.DOWNLOADING;
102091
102092         fileSize = downloadObj.size;
102093         increment = downloadObj.speed;
102094         intervalId = setInterval(function () {
102095             if (receivedSize >= fileSize) {//Finish downloading
102096                 receivedSize = fileSize;
102097                 downloadObj.state = DownloadState.COMPLETED;
102098                 _saveFile(downloadObj, function (fileName) {
102099                     _exec(downloadObj.callback, 'oncompleted', downloadObj.id, fileName);
102100                 });
102101                 clearInterval(intervalId);
102102             } else { // Continue downloading
102103                 receivedSize += increment;
102104                 downloadObj.receivedSize = receivedSize;
102105                 _exec(downloadObj.callback, 'onprogress', downloadObj.id, receivedSize, fileSize);
102106             }
102107         }, INTERVAL);
102108         downloadObj.intervalId = intervalId;
102109         return downloadObj.id;
102110     }
102111
102112     function cancel(downloadId) {
102113         var downloadObj;
102114
102115         t.DownloadManager("cancel", arguments);
102116
102117         downloadObj = _getDownloadObjById(downloadId);
102118         clearInterval(downloadObj.intervalId);
102119         if (downloadObj.state !== DownloadState.DOWNLOADING &&
102120             downloadObj.state !== DownloadState.PAUSED) {
102121             _exec(downloadObj.callback, 'onfailed', downloadObj.id, new WebAPIError(errorcode.INVALID_VALUES_ERR));
102122             return;
102123         }
102124         downloadObj.state = DownloadState.CANCELED;
102125         _exec(downloadObj.callback, 'oncanceled', downloadObj.id);
102126     }
102127
102128     function pause(downloadId) {
102129         var downloadObj;
102130
102131         t.DownloadManager("pause", arguments);
102132
102133         downloadObj = _getDownloadObjById(downloadId);
102134         clearInterval(downloadObj.intervalId);
102135         if (downloadObj.state !== DownloadState.DOWNLOADING) {
102136             _exec(downloadObj.callback, 'onfailed', downloadObj.id, new WebAPIError(errorcode.INVALID_VALUES_ERR));
102137             return;
102138         }
102139         downloadObj.state = DownloadState.PAUSED;
102140         _exec(downloadObj.callback, 'onpaused', downloadObj.id);
102141     }
102142
102143     function resume(downloadId) {
102144         var downloadObj, fileSize, receivedSize, increment, intervalId;
102145
102146         t.DownloadManager("resume", arguments);
102147
102148         downloadObj  = _getDownloadObjById(downloadId);
102149         fileSize     = downloadObj.size;
102150         receivedSize = downloadObj.receivedSize;
102151         increment    = downloadObj.speed;
102152
102153         if (downloadObj.state !== DownloadState.PAUSED) {
102154             _exec(downloadObj.callback, 'onfailed', downloadObj.id, new WebAPIError(errorcode.INVALID_VALUES_ERR));
102155             return;
102156         }
102157         downloadObj.state = DownloadState.DOWNLOADING;
102158         intervalId = setInterval(function () {
102159             if (receivedSize >= fileSize) {//Finish downloading
102160                 receivedSize = fileSize;
102161                 downloadObj.state = DownloadState.COMPLETED;
102162                 _saveFile(downloadObj, function (fileName) {
102163                     _exec(downloadObj.callback, 'oncompleted', downloadObj.id, fileName);
102164                 });
102165                 clearInterval(intervalId);
102166             } else {// Continue downloading
102167                 receivedSize += increment;
102168                 downloadObj.receivedSize = receivedSize;
102169                 _exec(downloadObj.callback, 'onprogress', downloadObj.id, receivedSize, fileSize);
102170             }
102171         }, INTERVAL);
102172         downloadObj.intervalId = intervalId;
102173     }
102174
102175     function getState(downloadId) {
102176         var downloadObj;
102177
102178         t.DownloadManager("getState", arguments);
102179
102180         downloadObj = _getDownloadObjById(downloadId);
102181         return downloadObj.state;
102182     }
102183
102184     function getDownloadRequest(downloadId) {
102185         var req, downloadObj;
102186
102187         t.DownloadManager("getDownloadRequest", arguments);
102188
102189         downloadObj = _getDownloadObjById(downloadId);
102190         req = new DownloadRequest(downloadObj.url, downloadObj.destination, downloadObj.fileName);
102191         return req;
102192     }
102193
102194     function getMIMEType(downloadId) {
102195         var downloadObj;
102196
102197         t.DownloadManager("getMIMEType", arguments);
102198
102199         downloadObj = _getDownloadObjById(downloadId);
102200         return downloadObj.MIMEType;
102201     }
102202
102203     function setListener(downloadId, downloadCallback) {
102204         var downloadObj;
102205
102206         t.DownloadManager("setListener", arguments);
102207
102208         downloadObj = _getDownloadObjById(downloadId);
102209         if (downloadObj) {
102210             downloadObj.callback = downloadCallback;
102211         }
102212     }
102213
102214     function handleSubFeatures(subFeatures) {
102215         var i, subFeature;
102216
102217         for (subFeature in subFeatures) {
102218             for (i in _security[subFeature]) {
102219                 _security[_security[subFeature][i]] = true;
102220             }
102221         }
102222     }
102223
102224     var download = {
102225         start: start,
102226         cancel: cancel,
102227         pause: pause,
102228         resume: resume,
102229         getState: getState,
102230         getDownloadRequest: getDownloadRequest,
102231         getMIMEType: getMIMEType,
102232         setListener: setListener,
102233         handleSubFeatures: handleSubFeatures
102234     };
102235
102236     return download;
102237 };
102238
102239 event.on('downloadResourceChanged', function () {
102240     _isInitialized = false;
102241 });
102242
102243 module.exports = _self;
102244
102245 });
102246 define('ripple/platform/tizen/2.0/websetting', function (require, exports, module) {
102247 /*
102248  *  Copyright 2014 Intel Corporation.
102249  *
102250  * Licensed under the Apache License, Version 2.0 (the "License");
102251  * you may not use this file except in compliance with the License.
102252  * You may obtain a copy of the License at
102253  *
102254  * http://www.apache.org/licenses/LICENSE-2.0
102255  *
102256  * Unless required by applicable law or agreed to in writing, software
102257  * distributed under the License is distributed on an "AS IS" BASIS,
102258  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
102259  * See the License for the specific language governing permissions and
102260  * limitations under the License.
102261  */
102262
102263 var errorcode = require('ripple/platform/tizen/2.0/errorcode'),
102264     t = require('ripple/platform/tizen/2.0/typecast'),
102265     WebAPIError = require('ripple/platform/tizen/2.0/WebAPIError'),
102266     WebAPIException = require('ripple/platform/tizen/2.0/WebAPIException'),
102267     _data = {
102268         userAgent: null
102269     },
102270     _security = {
102271         "http://tizen.org/privilege/websetting": ["removeAllCookies"]
102272     },
102273     _self;
102274
102275 function _isInvalidString(str) {
102276     str = str.trim();
102277
102278     return (/\t|\n|\r|\v/.test(str)) || (str.length === 0);
102279 }
102280
102281 function _clearAllCookies() {
102282     var cookies = document.cookie.split(";"),
102283         i, equalPos, name;
102284
102285     for (i = 0; i < cookies.length; i++) {
102286         equalPos = cookies[i].indexOf("=");
102287         name = (equalPos > -1) ? cookies[i].substr(0, equalPos) : cookies[i];
102288
102289         document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:00 GMT";
102290     }
102291 }
102292
102293 _self = function () {
102294     var websetting;
102295
102296     function setUserAgentString(userAgent, successCallback, errorCallback) {
102297         t.WebSettingManager("setUserAgentString", arguments, true);
102298
102299         window.setTimeout(function () {
102300             if (_isInvalidString(userAgent)) {
102301                 if (errorCallback) {
102302                     errorCallback(new WebAPIError(errorcode.INVALID_VALUES_ERR));
102303                 }
102304                 return;
102305             }
102306
102307             if (_data.userAgent === null) {
102308                 navigator.__defineGetter__("userAgent", function() {
102309                     return _data.userAgent;
102310                 });
102311             }
102312
102313             _data.userAgent = userAgent;
102314
102315             successCallback();
102316         }, 1);
102317     }
102318
102319     function removeAllCookies(successCallback, errorCallback) {
102320         if (!_security.removeAllCookies) {
102321             throw new WebAPIException(errorcode.SECURITY_ERR);
102322         }
102323
102324         t.WebSettingManager("removeAllCookies", arguments);
102325
102326         window.setTimeout(function () {
102327             _clearAllCookies();
102328             successCallback();
102329         }, 1);
102330     }
102331
102332     function handleSubFeatures(subFeatures) {
102333         var i, subFeature;
102334
102335         for (subFeature in subFeatures) {
102336             for (i in _security[subFeature]) {
102337                 _security[_security[subFeature][i]] = true;
102338             }
102339         }
102340     }
102341
102342     websetting = {
102343         setUserAgentString: setUserAgentString,
102344         removeAllCookies: removeAllCookies,
102345         handleSubFeatures: handleSubFeatures
102346     };
102347
102348     return websetting;
102349 };
102350
102351 module.exports = _self;
102352
102353 });
102354 define('ripple/platform/tizen/2.0/CalendarAttendee', function (require, exports, module) {
102355 /*
102356  *  Copyright 2013 Intel Corporation.
102357  *
102358  * Licensed under the Apache License, Version 2.0 (the "License");
102359  * you may not use this file except in compliance with the License.
102360  * You may obtain a copy of the License at
102361  *
102362  * http://www.apache.org/licenses/LICENSE-2.0
102363  *
102364  * Unless required by applicable law or agreed to in writing, software
102365  * distributed under the License is distributed on an "AS IS" BASIS,
102366  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
102367  * See the License for the specific language governing permissions and
102368  * limitations under the License.
102369  */
102370
102371 var t = require('ripple/platform/tizen/2.0/typecast'),
102372     CalendarAttendee;
102373
102374 CalendarAttendee = function (uri, attendeeInitDict) {
102375     var calendarAttendee = {}, attr;
102376
102377     t.CalendarAttendee(arguments, this);
102378
102379     calendarAttendee.uri          = uri;
102380     calendarAttendee.name         = undefined;
102381     calendarAttendee.role         = "REQ_PARTICIPANT";
102382     calendarAttendee.status       = "PENDING";
102383     calendarAttendee.RSVP         = false;
102384     calendarAttendee.type         = "INDIVIDUAL";
102385     calendarAttendee.group        = undefined;
102386     calendarAttendee.delegatorURI = undefined;
102387     calendarAttendee.delegateURI  = undefined;
102388     calendarAttendee.contactRef   = null;
102389
102390     if (attendeeInitDict) {
102391         for (attr in attendeeInitDict) {
102392             calendarAttendee[attr] = attendeeInitDict[attr];
102393         }
102394     }
102395
102396     this.__defineGetter__("uri", function () {
102397         return calendarAttendee.uri;
102398     });
102399     this.__defineSetter__("uri", function (val) {
102400         try {
102401             calendarAttendee.uri = t.DOMString(val);
102402         } catch (e) {
102403         }
102404     });
102405
102406     this.__defineGetter__("name", function () {
102407         return calendarAttendee.name;
102408     });
102409     this.__defineSetter__("name", function (val) {
102410         try {
102411             calendarAttendee.name = t.DOMString(val, "?");
102412         } catch (e) {
102413         }
102414     });
102415
102416     this.__defineGetter__("role", function () {
102417         return calendarAttendee.role;
102418     });
102419     this.__defineSetter__("role", function (val) {
102420         try {
102421             calendarAttendee.role = t.AttendeeRole(val);
102422         } catch (e) {
102423         }
102424     });
102425
102426     this.__defineGetter__("status", function () {
102427         return calendarAttendee.status;
102428     });
102429     this.__defineSetter__("status", function (val) {
102430         try {
102431             calendarAttendee.status = t.AttendeeStatus(val);
102432         } catch (e) {
102433         }
102434     });
102435
102436     this.__defineGetter__("RSVP", function () {
102437         return calendarAttendee.RSVP;
102438     });
102439     this.__defineSetter__("RSVP", function (val) {
102440         try {
102441             calendarAttendee.RSVP = t.boolean(val);
102442         } catch (e) {
102443         }
102444     });
102445
102446     this.__defineGetter__("type", function () {
102447         return calendarAttendee.type;
102448     });
102449     this.__defineSetter__("type", function (val) {
102450         try {
102451             calendarAttendee.type = t.AttendeeType(val);
102452         } catch (e) {
102453         }
102454     });
102455
102456     this.__defineGetter__("group", function () {
102457         return calendarAttendee.group;
102458     });
102459     this.__defineSetter__("group", function (val) {
102460         try {
102461             calendarAttendee.group = t.DOMString(val, "?");
102462         } catch (e) {
102463         }
102464     });
102465
102466     this.__defineGetter__("delegatorURI", function () {
102467         return calendarAttendee.delegatorURI;
102468     });
102469     this.__defineSetter__("delegatorURI", function (val) {
102470         try {
102471             calendarAttendee.delegatorURI = t.DOMString(val, "?");
102472         } catch (e) {
102473         }
102474     });
102475
102476     this.__defineGetter__("delegateURI", function () {
102477         return calendarAttendee.delegateURI;
102478     });
102479     this.__defineSetter__("delegateURI", function (val) {
102480         try {
102481             calendarAttendee.delegateURI = t.DOMString(val, "?");
102482         } catch (e) {
102483         }
102484     });
102485
102486     this.__defineGetter__("contactRef", function () {
102487         return calendarAttendee.contactRef;
102488     });
102489     this.__defineSetter__("contactRef", function (val) {
102490         try {
102491             calendarAttendee.contactRef = t.ContactRef(val, "?");
102492         } catch (e) {
102493         }
102494     });
102495 };
102496
102497 module.exports = CalendarAttendee;
102498
102499 });
102500 define('ripple/platform/tizen/2.0/decorator', function (require, exports, module) {
102501 /*
102502  *  Copyright 2013 Intel Corporation.
102503  *
102504  * Licensed under the Apache License, Version 2.0 (the "License");
102505  * you may not use this file except in compliance with the License.
102506  * You may obtain a copy of the License at
102507  *
102508  * http://www.apache.org/licenses/LICENSE-2.0
102509  *
102510  * Unless required by applicable law or agreed to in writing, software
102511  * distributed under the License is distributed on an "AS IS" BASIS,
102512  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
102513  * See the License for the specific language governing permissions and
102514  * limitations under the License.
102515  */
102516
102517 var t = require('ripple/platform/tizen/2.0/typecast'),
102518     ContactDecorator,
102519     _self;
102520
102521 ContactDecorator = function (contact, overlap) {
102522     var raw = {};
102523
102524     // private
102525     function clone(obj) {
102526         return function () {
102527             var Contact = require('ripple/platform/tizen/2.0/ContactBase'),
102528                 duplicate;
102529
102530             duplicate = new Contact(obj);
102531
102532             duplicate.__defineGetter__("id", function () {
102533                 return null;
102534             });
102535
102536             duplicate.__defineGetter__("addressBookId", function () {
102537                 return null;
102538             });
102539
102540             return duplicate;
102541         };
102542     }
102543
102544     // public
102545     function convertToString(format) {
102546         t.Contact("convertToString", arguments);
102547
102548         // TODO: Convert contact according to VCard protocal
102549         return "";
102550     }
102551
102552     raw.id            = overlap ? overlap.id : null;
102553     raw.personId      = overlap ? overlap.personId : null;
102554     raw.addressBookId = overlap ? overlap.addressBookId : null;
102555     raw.lastUpdated   = overlap ? overlap.lastUpdated : null;
102556     raw.isFavorite    = overlap ? overlap.isFavorite : false;
102557     raw.name          = contact.name;
102558     raw.addresses     = contact.addresses;
102559     raw.photoURI      = contact.photoURI;
102560     raw.phoneNumbers  = contact.phoneNumbers;
102561     raw.emails        = contact.emails;
102562     raw.birthday      = contact.birthday;
102563     raw.anniversaries = contact.anniversaries;
102564     raw.organizations = contact.organizations;
102565     raw.notes         = contact.notes;
102566     raw.urls          = contact.urls;
102567     raw.ringtoneURI   = contact.ringtoneURI;
102568     raw.groupIds      = contact.groupIds;
102569
102570     contact.__defineGetter__("id", function () {
102571         return raw.id;
102572     });
102573
102574     contact.__defineGetter__("personId", function () {
102575         return raw.personId;
102576     });
102577
102578     contact.__defineGetter__("addressBookId", function () {
102579         return raw.addressBookId;
102580     });
102581
102582     contact.__defineGetter__("lastUpdated", function () {
102583         return raw.lastUpdated;
102584     });
102585
102586     contact.__defineGetter__("isFavorite", function () {
102587         return raw.isFavorite;
102588     });
102589
102590     contact.__defineGetter__("name", function () {
102591         return raw.name;
102592     });
102593     contact.__defineSetter__("name", function (val) {
102594         try {
102595             raw.name = t.ContactName(val, "?");
102596         } catch (e) {
102597         }
102598     });
102599
102600     contact.__defineGetter__("addresses", function () {
102601         return raw.addresses;
102602     });
102603     contact.__defineSetter__("addresses", function (val) {
102604         try {
102605             raw.addresses = t.ContactAddress(val, "[]");
102606         } catch (e) {
102607         }
102608     });
102609
102610     contact.__defineGetter__("photoURI", function () {
102611         return raw.photoURI;
102612     });
102613     contact.__defineSetter__("photoURI", function (val) {
102614         try {
102615             raw.photoURI = t.DOMString(val, "?");
102616         } catch (e) {
102617         }
102618     });
102619
102620     contact.__defineGetter__("phoneNumbers", function () {
102621         return raw.phoneNumbers;
102622     });
102623     contact.__defineSetter__("phoneNumbers", function (val) {
102624         try {
102625             raw.phoneNumbers = t.ContactPhoneNumber(val, "[]");
102626         } catch (e) {
102627         }
102628     });
102629
102630     contact.__defineGetter__("emails", function () {
102631         return raw.emails;
102632     });
102633     contact.__defineSetter__("emails", function (val) {
102634         try {
102635             raw.emails = t.ContactEmailAddress(val, "[]");
102636         } catch (e) {
102637         }
102638     });
102639
102640     contact.__defineGetter__("birthday", function () {
102641         return raw.birthday;
102642     });
102643     contact.__defineSetter__("birthday", function (val) {
102644         try {
102645             raw.birthday = t.Date(val, "?");
102646         } catch (e) {
102647         }
102648     });
102649
102650     contact.__defineGetter__("anniversaries", function () {
102651         return raw.anniversaries;
102652     });
102653     contact.__defineSetter__("anniversaries", function (val) {
102654         try {
102655             raw.anniversaries = t.ContactAnniversary(val, "[]");
102656         } catch (e) {
102657         }
102658     });
102659
102660     contact.__defineGetter__("organizations", function () {
102661         return raw.organizations;
102662     });
102663     contact.__defineSetter__("organizations", function (val) {
102664         try {
102665             raw.organizations = t.ContactOrganization(val, "[]");
102666         } catch (e) {
102667         }
102668     });
102669
102670     contact.__defineGetter__("notes", function () {
102671         return raw.notes;
102672     });
102673     contact.__defineSetter__("notes", function (val) {
102674         try {
102675             raw.notes = t.DOMString(val, "[]");
102676         } catch (e) {
102677         }
102678     });
102679
102680     contact.__defineGetter__("urls", function () {
102681         return raw.urls;
102682     });
102683     contact.__defineSetter__("urls", function (val) {
102684         try {
102685             raw.urls = t.ContactWebSite(val, "[]");
102686         } catch (e) {
102687         }
102688     });
102689
102690     contact.__defineGetter__("ringtoneURI", function () {
102691         return raw.ringtoneURI;
102692     });
102693     contact.__defineSetter__("ringtoneURI", function (val) {
102694         try {
102695             raw.ringtoneURI = t.DOMString(val, "?");
102696         } catch (e) {
102697         }
102698     });
102699
102700     contact.__defineGetter__("groupIds", function () {
102701         return raw.groupIds;
102702     });
102703     contact.__defineSetter__("groupIds", function (val) {
102704         try {
102705             raw.groupIds = t.ContactGroupId(val, "[]");
102706         } catch (e) {
102707         }
102708     });
102709
102710     if (contact.name) {
102711         contact.name.__defineGetter__("displayName", function () {
102712             return ((overlap && overlap.name) ? overlap.name.displayName :
102713                     null);
102714         });
102715     }
102716
102717     contact.convertToString = convertToString;
102718     contact.clone           = clone(contact);
102719 };
102720
102721 _self = {
102722     Contact: ContactDecorator
102723 };
102724
102725 module.exports = _self;
102726
102727 });
102728 define('ripple/platform/tizen/2.0/BookmarkItem', function (require, exports, module) {
102729 /*
102730  *  Copyright 2013 Intel Corporation.
102731  *
102732  * Licensed under the Apache License, Version 2.0 (the "License");
102733  * you may not use this file except in compliance with the License.
102734  * You may obtain a copy of the License at
102735  *
102736  * http://www.apache.org/licenses/LICENSE-2.0
102737  *
102738  * Unless required by applicable law or agreed to in writing, software
102739  * distributed under the License is distributed on an "AS IS" BASIS,
102740  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
102741  * See the License for the specific language governing permissions and
102742  * limitations under the License.
102743  */
102744
102745 var t = require('ripple/platform/tizen/2.0/typecast'),
102746     BookmarkItem;
102747
102748 BookmarkItem = function (title, url) {
102749     t.BookmarkItem(arguments, this);
102750
102751     this.__defineGetter__("parent", function () {
102752         return undefined;
102753     });
102754     this.__defineGetter__("title", function () {
102755         return title;
102756     });
102757     this.__defineGetter__("url", function () {
102758         return url;
102759     });
102760 };
102761
102762 module.exports = BookmarkItem;
102763
102764 });
102765 define('ripple/platform/tizen/2.0/ContactAddress', function (require, exports, module) {
102766 /*
102767  *  Copyright 2013 Intel Corporation.
102768  *
102769  * Licensed under the Apache License, Version 2.0 (the "License");
102770  * you may not use this file except in compliance with the License.
102771  * You may obtain a copy of the License at
102772  *
102773  * http://www.apache.org/licenses/LICENSE-2.0
102774  *
102775  * Unless required by applicable law or agreed to in writing, software
102776  * distributed under the License is distributed on an "AS IS" BASIS,
102777  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
102778  * See the License for the specific language governing permissions and
102779  * limitations under the License.
102780  */
102781
102782 var t = require('ripple/platform/tizen/2.0/typecast'),
102783     ContactAddress;
102784
102785 ContactAddress = function (addressInitDict) {
102786     var contactAddress = {}, attr, arr, i;
102787
102788     t.ContactAddress(arguments, this);
102789
102790     contactAddress.country               = null;
102791     contactAddress.region                = null;
102792     contactAddress.city                  = null;
102793     contactAddress.streetAddress         = null;
102794     contactAddress.additionalInformation = null;
102795     contactAddress.postalCode            = null;
102796     contactAddress.isDefault             = false;
102797     contactAddress.types                 = ["HOME"];
102798
102799     this.__defineGetter__("country", function () {
102800         return contactAddress.country;
102801     });
102802     this.__defineSetter__("country", function (val) {
102803         try {
102804             contactAddress.country = t.DOMString(val, "?");
102805         } catch (e) {
102806         }
102807     });
102808
102809     this.__defineGetter__("region", function () {
102810         return contactAddress.region;
102811     });
102812     this.__defineSetter__("region", function (val) {
102813         try {
102814             contactAddress.region = t.DOMString(val, "?");
102815         } catch (e) {
102816         }
102817     });
102818
102819     this.__defineGetter__("city", function () {
102820         return contactAddress.city;
102821     });
102822     this.__defineSetter__("city", function (val) {
102823         try {
102824             contactAddress.city = t.DOMString(val, "?");
102825         } catch (e) {
102826         }
102827     });
102828
102829     this.__defineGetter__("streetAddress", function () {
102830         return contactAddress.streetAddress;
102831     });
102832     this.__defineSetter__("streetAddress", function (val) {
102833         try {
102834             contactAddress.streetAddress = t.DOMString(val, "?");
102835         } catch (e) {
102836         }
102837     });
102838
102839     this.__defineGetter__("additionalInformation", function () {
102840         return contactAddress.additionalInformation;
102841     });
102842     this.__defineSetter__("additionalInformation", function (val) {
102843         try {
102844             contactAddress.additionalInformation = t.DOMString(val, "?");
102845         } catch (e) {
102846         }
102847     });
102848
102849     this.__defineGetter__("postalCode", function () {
102850         return contactAddress.postalCode;
102851     });
102852     this.__defineSetter__("postalCode", function (val) {
102853         try {
102854             contactAddress.postalCode = t.DOMString(val, "?");
102855         } catch (e) {
102856         }
102857     });
102858
102859     this.__defineGetter__("isDefault", function () {
102860         return contactAddress.isDefault;
102861     });
102862     this.__defineSetter__("isDefault", function (val) {
102863         try {
102864             contactAddress.isDefault = t.boolean(val);
102865         } catch (e) {
102866         }
102867     });
102868
102869     this.__defineGetter__("types", function () {
102870         return contactAddress.types;
102871     });
102872     this.__defineSetter__("types", function (val) {
102873         try {
102874             contactAddress.types = t.DOMString(val, "[]");
102875         } catch (e) {
102876         }
102877     });
102878
102879     if (addressInitDict) {
102880         for (attr in addressInitDict) {
102881             switch (attr) {
102882             case "types":
102883                 arr = addressInitDict[attr];
102884                 if (arr) {
102885                     for (i in arr) {
102886                         contactAddress[attr][i] = arr[i];
102887                     }
102888                 }
102889                 break;
102890
102891             default:
102892                 contactAddress[attr] = addressInitDict[attr];
102893                 break;
102894             }
102895         }
102896     }
102897 };
102898
102899 module.exports = ContactAddress;
102900
102901 });
102902 define('ripple/platform/tizen/2.0/ContactEmailAddress', function (require, exports, module) {
102903 /*
102904  *  Copyright 2013 Intel Corporation.
102905  *
102906  * Licensed under the Apache License, Version 2.0 (the "License");
102907  * you may not use this file except in compliance with the License.
102908  * You may obtain a copy of the License at
102909  *
102910  * http://www.apache.org/licenses/LICENSE-2.0
102911  *
102912  * Unless required by applicable law or agreed to in writing, software
102913  * distributed under the License is distributed on an "AS IS" BASIS,
102914  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
102915  * See the License for the specific language governing permissions and
102916  * limitations under the License.
102917  */
102918
102919 var t = require('ripple/platform/tizen/2.0/typecast'),
102920     ContactEmailAddress;
102921
102922 ContactEmailAddress = function (email, types, isDefault) {
102923     var contactEmailAddress = {};
102924
102925     t.ContactEmailAddress(arguments, this);
102926
102927     contactEmailAddress.email     = email;
102928     contactEmailAddress.isDefault = isDefault || false;
102929     contactEmailAddress.types     = (types && types[0]) ? types : ["WORK"];
102930
102931     this.__defineGetter__("email", function () {
102932         return contactEmailAddress.email;
102933     });
102934     this.__defineSetter__("email", function (val) {
102935         try {
102936             contactEmailAddress.email = t.DOMString(val);
102937         } catch (e) {
102938         }
102939     });
102940
102941     this.__defineGetter__("isDefault", function () {
102942         return contactEmailAddress.isDefault;
102943     });
102944     this.__defineSetter__("isDefault", function (val) {
102945         try {
102946             contactEmailAddress.isDefault = t.boolean(val);
102947         } catch (e) {
102948         }
102949     });
102950
102951     this.__defineGetter__("types", function () {
102952         return contactEmailAddress.types;
102953     });
102954     this.__defineSetter__("types", function (val) {
102955         try {
102956             contactEmailAddress.types = t.DOMString(val, "[]");
102957         } catch (e) {
102958         }
102959     });
102960 };
102961
102962 module.exports = ContactEmailAddress;
102963
102964 });
102965 define('ripple/platform/tizen/2.0/account', function (require, exports, module) {
102966 /*
102967  *  Copyright 2012 Intel Corporation.
102968  *
102969  * Licensed under the Apache License, Version 2.0 (the "License");
102970  * you may not use this file except in compliance with the License.
102971  * You may obtain a copy of the License at
102972  *
102973  * http://www.apache.org/licenses/LICENSE-2.0
102974  *
102975  * Unless required by applicable law or agreed to in writing, software
102976  * distributed under the License is distributed on an "AS IS" BASIS,
102977  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
102978  * See the License for the specific language governing permissions and
102979  * limitations under the License.
102980  */
102981
102982 var db = require('ripple/db'),
102983     utils = require('ripple/utils'),
102984     tizen1_utils = require('ripple/platform/tizen/2.0/tizen1_utils'),
102985     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
102986     WebAPIError = require('ripple/platform/tizen/2.0/WebAPIError'),
102987     _data = {
102988         DB_ACCOUNT_KEY : "tizen1-db-accounts",
102989         accounts : {}
102990     },
102991     _self;
102992
102993 function _checkAccount(account) {
102994     if (typeof account !== "object" ||
102995         typeof account.id !== "string" ||
102996         typeof account.appid !== "string" ||
102997         typeof account.userName !== "string" ||
102998         typeof account.displayName !== "string" ||
102999         typeof account.service !== "object") {
103000         return false;
103001     }
103002
103003     return true;
103004 }
103005
103006 function _checkCallback(successCallback, errorCallback) {
103007     tizen1_utils.validateArgumentType(successCallback, "function",
103008                                         new WebAPIError(errorcode.TYPE_MISMATCH_ERR));
103009     if (errorCallback) {
103010         tizen1_utils.validateArgumentType(errorCallback, "function",
103011                                             new WebAPIError(errorcode.TYPE_MISMATCH_ERR));
103012     }
103013 }
103014
103015 _self = {
103016     getAccounts : function () {
103017         var results = [];
103018         utils.forEach(_data.accounts, function (account) {
103019             results.push(utils.copy(account));
103020         });
103021
103022         return results;
103023     },
103024
103025     getAccountById : function (id) {
103026         var acccount = null;
103027
103028         if (typeof id !== "string") {
103029             throw new WebAPIError(errorcode.TYPE_MISMATCH_ERR);
103030         }
103031
103032         if (_data.accounts[id]) {
103033             account = utils.copy(_data.accounts[id]);
103034         }
103035
103036         return account;
103037     },
103038
103039     getAccountByUserName : function (userName) {
103040         var result = null;
103041
103042         if (typeof userName !== "string") {
103043             throw new WebAPIError(errorcode.TYPE_MISMATCH_ERR);
103044         }
103045
103046         utils.forEach(_data.accounts, function (account) {
103047             if (userName === account.userName) {
103048                 result = utils.copy(account);
103049             }
103050         });
103051
103052         return result;
103053     },
103054
103055     getAccountByappId : function (appId) {
103056         var result = null;
103057
103058         if (typeof appId !== "string") {
103059             throw new WebAPIError(errorcode.TYPE_MISMATCH_ERR);
103060         }
103061
103062         utils.forEach(_data.accounts, function (account) {
103063             if (appId === account.appId) {
103064                 result = utils.copy(account);
103065             }
103066         });
103067
103068         return result;
103069     },
103070
103071     getAccountByServiceId : function (serviceId) {
103072         var result = null;
103073
103074         if (typeof serviceId !== "string") {
103075             throw new WebAPIError(errorcode.TYPE_MISMATCH_ERR);
103076         }
103077
103078         utils.forEach(_data.accounts, function (account) {
103079             if (serviceId === account.service.id) {
103080                 result = utils.copy(account);
103081             }
103082         });
103083
103084         return result;
103085     },
103086
103087     getAccountByTag : function (tag) {
103088         var results = [], i;
103089
103090         if (typeof tag !== "string") {
103091             throw new WebAPIError(errorcode.TYPE_MISMATCH_ERR);
103092         }
103093
103094         utils.forEach(_data.accounts, function (account) {
103095             for (i in account.service.tag) {
103096                 if (tag === account.service.tag[i]) {
103097                     results.push(utils.copy(account));
103098                     break;
103099                 }
103100             }
103101         });
103102
103103         return results;
103104     },
103105
103106     add : function (account, successCallback, errorCallback) {
103107         if (!_checkAccount(account)) {
103108             throw new WebAPIError(errorcode.TYPE_MISMATCH_ERR);
103109         }
103110
103111         _checkCallback(successCallback, errorCallback);
103112
103113         if (!_data.accounts[account.id]) {
103114             _data.accounts[account.id] = utils.copy(account);
103115         }
103116
103117         successCallback();
103118     },
103119
103120     update : function (account, successCallback, errorCallback) {
103121         if (!_checkAccount(account)) {
103122             throw new WebAPIError(errorcode.TYPE_MISMATCH_ERR);
103123         }
103124
103125         _checkCallback(successCallback, errorCallback);
103126
103127         if (!_data.accounts[account.id]) {
103128             errorCallback(new WebAPIError(errorcode.NOT_FOUND_ERR));
103129             return;
103130         }
103131
103132         _data.accounts[account.id] = utils.copy(account);
103133         successCallback();
103134     },
103135
103136     remove : function (id, successCallback, errorCallback) {
103137         if (typeof id !== "string") {
103138             throw new WebAPIError(errorcode.TYPE_MISMATCH_ERR);
103139         }
103140
103141         _checkCallback(successCallback, errorCallback);
103142
103143         if (!_data.accounts[id]) {
103144             errorCallback(new WebAPIError(errorcode.NOT_FOUND_ERR));
103145             return;
103146         }
103147
103148         delete _data.accounts[id];
103149         successCallback();
103150     },
103151
103152     getAccountApplications : function () {
103153         var results = [];
103154         /* FIXME: wait for API update */
103155         return results;
103156     }
103157 };
103158
103159 function _initialize() {
103160     _data.accounts = db.retrieveObject(_data.DB_ACCOUNT_KEY) || {};
103161 }
103162
103163 _initialize();
103164
103165 module.exports = _self;
103166
103167 });
103168 define('ripple/platform/tizen/2.0/syncml-js-lib/agent', function (require, exports, module) {
103169 // -*- coding: utf-8 -*-
103170 //-----------------------------------------------------------------------------
103171 // file: $Id$
103172 // lib:  syncml-js.agent
103173 // auth: griffin <griffin@uberdev.org>
103174 // date: 2012/10/22
103175 // copy: (C) CopyLoose 2012 UberDev <hardcore@uberdev.org>, No Rights Reserved.
103176 //-----------------------------------------------------------------------------
103177
103178 var common = require('ripple/platform/tizen/2.0/syncml-js-lib/common');
103179
103180 var _self = (function () {
103181
103182     var exports = {};
103183
103184     //---------------------------------------------------------------------------
103185     exports.Agent = common.Base.extend({
103186
103187         //-------------------------------------------------------------------------
103188         constructor: function(options) {
103189             options = _.defaults(options, {
103190                 hierarchicalSync: false
103191             });
103192             this.hierarchicalSync = options.hierarchicalSync;
103193         },
103194
103195         //-------------------------------------------------------------------------
103196         dumpItem: function(item, stream, contentType, version, cb) {
103197             return this.dumpsItem(
103198                 item, contentType, version,
103199                 function(err, data, new_contentType, new_version) {
103200                     if ( err ) {
103201                         return cb(err);
103202                     }
103203                     stream.write(data, function(err) {
103204                         if ( err ) {
103205                             return cb(err);
103206                         }
103207                         cb(null, new_contentType, new_version);
103208                     });
103209                 });
103210         },
103211
103212         //-------------------------------------------------------------------------
103213         loadItem: function(stream, contentType, version, cb) {
103214             var self = this;
103215             stream.read(function(err, data) {
103216                 if ( err ) {
103217                     cb(err);
103218                 }
103219                 self.loadsItem(data, contentType, version, cb);
103220             });
103221         },
103222
103223         //-------------------------------------------------------------------------
103224         deleteAllItems: function(cb) {
103225             var self = this;
103226             self.getAllItems(function(err, items) {
103227                 if ( err ) {
103228                     return cb(err);
103229                 }
103230                 common.cascade(items, function(e, cb) {
103231                     self.deleteItem(e, cb);
103232                 }, cb);
103233             });
103234         },
103235
103236         // TODO: add documentation about all expected methods...
103237
103238         getAllItems: function(cb) {
103239             // cb(null, LIST)
103240             return cb(new common.NotImplementedError());
103241         },
103242
103243         dumpsItem: function(item, contentType, version, cb) {
103244             // cb(null, DATA [, NEW-CONTENTTYPE [, NEW-VERSION]])
103245             return cb(new common.NotImplementedError());
103246         },
103247
103248         loadsItem: function(data, contentType, version, cb) {
103249             // cb(null, ITEM)
103250             return cb(new common.NotImplementedError());
103251         },
103252
103253         addItem: function(item, cb) {
103254             // cb(null, ITEM)
103255             return cb(new common.NotImplementedError());
103256         },
103257
103258         getItem: function(itemID, cb) {
103259             // cb(null, ITEM)
103260             return cb(new common.NotImplementedError());
103261         },
103262
103263         replaceItem: function(item, reportChanges, cb) {
103264             // cb(null [, CSPEC])
103265             return cb(new common.NotImplementedError());
103266         },
103267
103268         deleteItem: function(itemID, cb) {
103269             // cb(null)
103270             return cb(new common.NotImplementedError());
103271         },
103272
103273         getContentTypes: function() {
103274             throw new common.NotImplementedError();
103275         },
103276
103277         matchItem: function(item, cb) {
103278             this.getAllItems(function(err, list) {
103279                 if ( err ) {
103280                     return cb(err);
103281                 }
103282                 var match = _.find(list, function(cur) {
103283                     return cur.compare && cur.compare(item) == 0;
103284                 });
103285                 return cb(null, match);
103286             });
103287         }
103288
103289     // TODO: mergeItems()
103290
103291     });
103292
103293     return exports;
103294
103295 })();
103296
103297 module.exports = _self;
103298
103299 });
103300 define('ripple/platform/tizen/2.0/syncml-js-lib/item', function (require, exports, module) {
103301 // -*- coding: utf-8 -*-
103302 //-----------------------------------------------------------------------------
103303 // file: $Id$
103304 // lib:  syncml-js.item
103305 // auth: griffin <griffin@uberdev.org>
103306 // date: 2012/11/30
103307 // copy: (C) CopyLoose 2012 UberDev <hardcore@uberdev.org>, No Rights Reserved.
103308 //-----------------------------------------------------------------------------
103309
103310 var common = require('ripple/platform/tizen/2.0/syncml-js-lib/common');
103311
103312 var _self = (function () {
103313     var exports = {};
103314
103315     //---------------------------------------------------------------------------
103316     exports.Item = common.Base.extend({
103317
103318         //: the unique identifier (within the context of a SyncML datastore)
103319         //: of the current SyncML item.
103320         id: null,
103321
103322         compare: function(other) {
103323             return ( other === this ? 0 : 1 );
103324         }
103325
103326     });
103327
103328     return exports;
103329
103330 })();
103331
103332 module.exports = _self;
103333
103334 });
103335 define('ripple/platform/tizen/2.0/syncml-js-lib/storage', function (require, exports, module) {
103336 // -*- coding: utf-8 -*-
103337 //-----------------------------------------------------------------------------
103338 // file: $Id$
103339 // lib:  syncml-js.storage
103340 // auth: griffin <griffin@uberdev.org>
103341 // date: 2012/10/31
103342 // copy: (C) CopyLoose 2012 UberDev <hardcore@uberdev.org>, No Rights Reserved.
103343 //-----------------------------------------------------------------------------
103344
103345 var common = require('ripple/platform/tizen/2.0/syncml-js-lib/common'),
103346     constant = require('ripple/platform/tizen/2.0/syncml-js-lib/constant');
103347
103348 var _self = (function () {
103349
103350     var exports = {};
103351
103352     //---------------------------------------------------------------------------
103353     _.extend(exports, {
103354
103355         //-------------------------------------------------------------------------
103356         errstr: function(target) {
103357             if ( target.error && typeof(target.error.toString) == 'function' )
103358         return target.error.toString();
103359     var ret = '';
103360     var count = 0;
103361     for ( var key in target.error )
103362         count += 1;
103363     if ( count == 1 && target.error.name )
103364         ret = '' + target.error.name;
103365     else
103366     {
103367         ret = '{';
103368         for ( var key in target.error )
103369     {
103370         ret += key + ': ' + target.error[key];
103371         count -= 1;
103372         if ( count > 0 )
103373         ret += ', ';
103374     }
103375     }
103376     if ( target.errorCode )
103377     {
103378         if ( ret.length <= 0 || ret == '{}' )
103379             ret = '' + target.errorCode;
103380         else
103381             ret = '[' + target.errorCode + '] ' + ret;
103382     }
103383     if ( ret.length <= 0 || ret == '{}' )
103384         // last ditch effort...
103385         ret = common.prettyJson(target);
103386     return ret;
103387         },
103388
103389             //-------------------------------------------------------------------------
103390             openDatabase: function(context, cb) {
103391                 var dbreq = context.storage.indexedDB.open(context.dbname, 1);
103392                 dbreq.onblocked = function(event) {
103393                     cb({code: 'syncml-js.storage.OD.10',
103394                         message: 'database blocked by other process/tab/window'});
103395                 };
103396                 dbreq.onerror = function(event) {
103397                     var errmsg = exports.errstr(event.target);
103398                     cb({code: 'syncml-js.storage.OD.20',
103399                         message: 'failed to open syncml-js database: ' + errmsg});
103400                 };
103401                 dbreq.onupgradeneeded = function(event) {
103402
103403
103404                     var db = event.target.result;
103405
103406                     var adapterTable = db.createObjectStore('adapter', {keyPath: 'id'});
103407                     adapterTable.createIndex('isLocal', 'isLocal', {unique: false});
103408                     adapterTable.createIndex('devID', 'devID', {unique: true});
103409
103410                     var mappingTable = db.createObjectStore(
103411                             'mapping',
103412                             {keyPath: ['store_id', 'guid']});
103413                     mappingTable.createIndex('store_id', 'store_id', {unique: false});
103414                     // mappingTable.createIndex('guid', 'guid', {unique: false});
103415                     // mappingTable.createIndex('luid', 'luid', {unique: false});
103416
103417                     var changeTable = db.createObjectStore(
103418                             'change',
103419                             {keyPath: ['store_id', 'item_id']});
103420                     changeTable.createIndex('store_id', 'store_id', {unique: false});
103421                     // changeTable.createIndex('item_id', 'item_id', {unique: false});
103422
103423                 };
103424                 dbreq.onsuccess = function(event) {
103425                     cb(null, event.target.result);
103426                 };
103427             },
103428
103429             //-------------------------------------------------------------------------
103430             getTransaction: function(db, tables, mode) {
103431                 // NOTE: the spec says passing in null should be valid... but
103432                 //       mozilla's indexedDB seems to barf with:
103433                 //         [Exception... "The operation failed because the
103434                 //         requested database object could not be found. For
103435                 //         example, an object store did not exist but was
103436                 //         being opened."  code: "8" nsresult: "0x80660003
103437                 //         (NotFoundError)"
103438                 if ( ! tables )
103439                     tables = ['adapter','mapping','change'];
103440                 if ( ! mode )
103441                     mode = 'readwrite';
103442                 return db.transaction(tables, mode);
103443             },
103444
103445             //-------------------------------------------------------------------------
103446             dumpDatabase: function(context, cb) {
103447
103448                 var ret = {};
103449                 var txn = context._txn();
103450
103451                 var steps = [
103452                     function(cb) {
103453                         exports.getAll(context, txn.objectStore('adapter'), {}, function(err, adapters) {
103454                             ret.adapter = adapters;
103455                             return cb(err);
103456                         });
103457                     },
103458                     function(cb) {
103459                         exports.getAll(context, txn.objectStore('mapping'), {}, function(err, mappings) {
103460                             ret.mapping = mappings;
103461                             return cb(err);
103462                         });
103463                     },
103464                     function(cb) {
103465                         exports.getAll(context, txn.objectStore('change'), {}, function(err, changes) {
103466                             ret.change = changes;
103467                             return cb(err);
103468                         });
103469                     }
103470                 ];
103471
103472                 common.cascade(steps, function(step, cb) {
103473                     return step(cb);
103474                 }, function(err) {
103475                     return cb(err, ret);
103476                 });
103477             },
103478
103479             //-------------------------------------------------------------------------
103480             clearDatabase: function(context, cb) {
103481                 var dbreq = context.storage.indexedDB.open(context.dbname, 1);
103482                 dbreq.onblocked = function(event) {
103483                     cb({code: 'syncml-js.storage.CD.10',
103484                         message: 'database blocked by other process/tab/window'});
103485                 };
103486                 dbreq.onerror = function(event) {
103487                     var errmsg = exports.errstr(event.target);
103488                     cb({code: 'syncml-js.storage.CD.20',
103489                         message: 'failed to open syncml-js database: ' + errmsg});
103490                 };
103491                 dbreq.onsuccess = function(event) {
103492                     var db = event.target.result;
103493                     db.onerror = dbreq.onerror;
103494                     async.map(['adapter', 'mapping', 'change'], function(name, cb) {
103495                         cb();
103496                     }, function(err) {
103497                         if ( err )
103498                         return cb(err);
103499                     db.close();
103500                     });
103501                 };
103502             },
103503
103504             //-------------------------------------------------------------------------
103505             getAll: function(context, source, options, cb) {
103506                 // supported options:
103507                 //   - range
103508                 //   - only
103509                 options = options || {};
103510                 var range = options.range;
103511                 if ( ! range && options.only )
103512                     range = context.storage.IDBKeyRange.only(options.only);
103513                 var req = source.openCursor(range);
103514                 var ret = [];
103515                 req.onsuccess = function(event) {
103516                     var cursor = event.target.result;
103517                     if ( cursor )
103518                     {
103519                         ret.push(cursor.value);
103520                         // ret.push({key: cursor.key, value: cursor.value});
103521                         return cursor.continue();
103522                     }
103523                     cb(null, ret);
103524                 };
103525                 req.onerror = function(event) {
103526                     cb(exports.errstr(event.target));
103527                 };
103528             },
103529
103530             //-------------------------------------------------------------------------
103531             put: function(store, object, cb) {
103532                 var req = store.put(object);
103533                 req.onsuccess = function(event) { cb(); };
103534                 req.onerror = function(event) {
103535                     cb(exports.errstr(event.target));
103536                 };
103537             },
103538
103539             //-------------------------------------------------------------------------
103540             delete: function(store, objectID, cb) {
103541                 var req = store.delete(objectID);
103542                 req.onsuccess = function(event) { cb(); };
103543                 req.onerror = function(event) {
103544                     cb(exports.errstr(event.target));
103545                 };
103546             },
103547
103548             //-------------------------------------------------------------------------
103549             deleteAll: function(source, matches, cb) {
103550                 var req = source.openCursor();
103551                 req.onsuccess = function(event) {
103552                     var cursor = event.target.result;
103553                     if ( cursor )
103554                     {
103555                         for (key in matches)
103556                             if ( matches[key] != cursor.value[key] )
103557                                 return cursor.continue();
103558                         exports.delete(source, cursor.key, function(err) {
103559                             if ( err )
103560                             return cb(err);
103561                         return cursor.continue();
103562                         });
103563                         return;
103564                     }
103565                     cb(null);
103566                 };
103567                 req.onerror = function(event) {
103568                     cb(exports.errstr(event.target));
103569                 };
103570             },
103571
103572             //-------------------------------------------------------------------------
103573             iterateCursor: function(openCursor, iterator, cb) {
103574                 openCursor.onsuccess = function(event) {
103575                     var cursor = event.target.result;
103576                     if ( ! cursor )
103577                         return cb();
103578                     iterator(cursor.value.value, cursor.value.id, function(err) {
103579                         if ( err )
103580                         return cb(err);
103581                     return cursor.continue();
103582                     });
103583                 };
103584                 openCursor.onerror = function(event) {
103585                     cb(exports.errstr(event.target));
103586                 };
103587             }
103588
103589     });
103590
103591     return exports;
103592
103593 })();
103594
103595 module.exports = _self;
103596
103597 });
103598 define('ripple/platform/tizen/2.0/syncml-js-lib/devinfo', function (require, exports, module) {
103599 // -*- coding: utf-8 -*-
103600 //-----------------------------------------------------------------------------
103601 // file: $Id$
103602 // lib:  syncml-js.devinfo
103603 // auth: griffin <griffin@uberdev.org>
103604 // date: 2012/11/06
103605 // copy: (C) CopyLoose 2012 UberDev <hardcore@uberdev.org>, No Rights Reserved.
103606 //-----------------------------------------------------------------------------
103607
103608 var common = require('ripple/platform/tizen/2.0/syncml-js-lib/common'),
103609     constant = require('ripple/platform/tizen/2.0/syncml-js-lib/constant'),
103610     storemod = require('ripple/platform/tizen/2.0/syncml-js-lib/store'),
103611     ET = require('ripple/platform/tizen/2.0/syncml-js-lib/elementtree'),
103612     _self;
103613
103614 _self = (function () {
103615
103616     var exports = {};
103617
103618     var strAttributeMap = [
103619     ['manufacturerName',    'Man'],
103620       ['modelName',           'Mod'],
103621       ['oem',                 'OEM'],
103622       ['firmwareVersion',     'FwV'],
103623       ['softwareVersion',     'SwV'],
103624       ['hardwareVersion',     'HwV'],
103625       ['devID',               'DevID'],
103626       ['devType',             'DevTyp']
103627     ];
103628
103629 var boolAttributeMap = [
103630     ['utc',                 'UTC'],
103631       ['largeObjects',        'SupportLargeObjs'],
103632       ['hierarchicalSync',    'SupportHierarchicalSync'],
103633       ['numberOfChanges',     'SupportNumberOfChanges']
103634     ];
103635
103636 //---------------------------------------------------------------------------
103637 exports.DevInfo = common.Base.extend({
103638
103639     //-------------------------------------------------------------------------
103640     constructor: function(adapter, options) {
103641         var self = this;
103642         var options = _.defaults({}, options, {
103643             devType           : constant.DEVTYPE_WORKSTATION,
103644             manufacturerName  : '-',
103645             modelName         : '-',
103646             oem               : '-',
103647             hardwareVersion   : '-',
103648             firmwareVersion   : '-',
103649             softwareVersion   : '-',
103650             utc               : true,
103651             largeObjects      : true,
103652             hierarchicalSync  : true,
103653             numberOfChanges   : true,
103654             extensions        : {}
103655         });
103656
103657         // todo: is there anyway to mark attributes as read-only?...
103658
103659         //: [read-only] these are all read-only attributes
103660         this.devID            = options.devID || common.makeID();
103661         this.devType          = options.devType;
103662         this.manufacturerName = options.manufacturerName;
103663         this.modelName        = options.modelName;
103664         this.oem              = options.oem;
103665         this.hardwareVersion  = options.hardwareVersion;
103666         this.firmwareVersion  = options.firmwareVersion;
103667         this.softwareVersion  = options.softwareVersion;
103668         this.utc              = options.utc;
103669         this.largeObjects     = options.largeObjects;
103670         this.hierarchicalSync = options.hierarchicalSync;
103671         this.numberOfChanges  = options.numberOfChanges;
103672         this.extensions       = {};
103673
103674         _.each(options.extensions, function(values, name) {
103675             self.setExtension(name, values);
103676         });
103677
103678         // --- private attributes
103679         this._a       = adapter;
103680     },
103681
103682         //-------------------------------------------------------------------------
103683         setExtension: function(name, values) {
103684             this.extensions[name] = _.isArray(values) ? values : [values];
103685         },
103686
103687         //-------------------------------------------------------------------------
103688         getExtensionKeys: function() {
103689             return _.keys(this.extensions);
103690         },
103691
103692         //-------------------------------------------------------------------------
103693         getExtension: function(name) {
103694             return this.extensions[name];
103695         },
103696
103697         //-------------------------------------------------------------------------
103698         _load: function(cb) {
103699             cb();
103700         },
103701
103702         //-------------------------------------------------------------------------
103703         _updateModel: function(cb) {
103704             if ( ! this._a._model )
103705                 return cb('devinfo created on un-initialized adapter');
103706             this._a._model.devInfo = {
103707                 devID            : this.devID,
103708                 devType          : this.devType,
103709                 manufacturerName : this.manufacturerName,
103710                 modelName        : this.modelName,
103711                 oem              : this.oem,
103712                 hardwareVersion  : this.hardwareVersion,
103713                 firmwareVersion  : this.firmwareVersion,
103714                 softwareVersion  : this.softwareVersion,
103715                 utc              : this.utc,
103716                 largeObjects     : this.largeObjects,
103717                 hierarchicalSync : this.hierarchicalSync,
103718                 numberOfChanges  : this.numberOfChanges,
103719                 extensions       : this.extensions
103720             };
103721             cb();
103722         },
103723
103724         //-------------------------------------------------------------------------
103725         toSyncML: function(dtdVersion, stores) {
103726             dtdVersion = dtdVersion || constant.SYNCML_DTD_VERSION_1_2;
103727             if ( dtdVersion != constant.SYNCML_DTD_VERSION_1_2 )
103728                 throw new Error('unsupported DTD version "' + dtdVersion + '"')
103729                     var xret = ET.Element('DevInf', {'xmlns': constant.NAMESPACE_DEVINF})
103730                     ET.SubElement(xret, 'VerDTD').text = dtdVersion;
103731             for ( var idx=0 ; idx<strAttributeMap.length ; idx++ )
103732             {
103733                 var map = strAttributeMap[idx];
103734                 // todo: should i enforce the fact that these are all *required*?...
103735                 if ( this[map[0]] != undefined )
103736                     ET.SubElement(xret, map[1]).text = this[map[0]];
103737             }
103738             for ( var idx=0 ; idx<boolAttributeMap.length ; idx++ )
103739             {
103740                 var map = boolAttributeMap[idx];
103741                 if ( this[map[0]] )
103742                     ET.SubElement(xret, map[1])
103743             }
103744             if ( stores && stores.length > 0 )
103745                 for ( var idx=0 ; idx<stores.length ; idx++ )
103746                     xret.append(stores[idx].toSyncML());
103747             var xext = null;
103748             for ( var name in this.extensions )
103749             {
103750                 if ( ! xext )
103751                     xext = ET.SubElement(xret, 'Ext');
103752                 ET.SubElement(xext, 'XNam').text = name;
103753                 var values = this.extensions[name];
103754                 for ( var idx=0 ; idx<values.length ; idx++ )
103755                     ET.SubElement(xext, 'XVal').text = '' + values[idx];
103756             };
103757             return xret;
103758         },
103759
103760 }, {
103761
103762     //-------------------------------------------------------------------------
103763     fromSyncML: function(xnode) {
103764         var options = {};
103765         var stores  = []
103766             var dtdVersion = xnode.findtext('VerDTD')
103767             if ( dtdVersion != constant.SYNCML_DTD_VERSION_1_2 )
103768                 throw new common.ProtocolError('unsupported DTD version "' + dtdVersion + '"');
103769         for ( var idx=0 ; idx<strAttributeMap.length ; idx++ )
103770         {
103771             var map = strAttributeMap[idx];
103772             // todo: should i enforce the fact that these are all *required*?...
103773             options[map[0]] = xnode.findtext(map[1]);
103774         }
103775         for ( var idx=0 ; idx<boolAttributeMap.length ; idx++ )
103776         {
103777             var map = boolAttributeMap[idx];
103778             options[map[0]] = xnode.find(map[1]) != undefined;
103779         }
103780         _.each(xnode.getchildren(), function(child) {
103781             if ( child.tag == 'DataStore' )
103782             return stores.push(storemod.Store.fromSyncML(child));
103783         if ( child.tag == 'Ext' )
103784         {
103785             options.extensions = {};
103786             var elist = child.getchildren();
103787             var ecur  = null;
103788             for ( var idx=0 ; idx<elist.length ; idx++ )
103789         {
103790             var eitem = elist[idx];
103791             if ( eitem.tag == 'XNam' )
103792         {
103793             ecur = eitem.text;
103794             continue;
103795         }
103796         if ( ! ecur )
103797             // paranoia...
103798             continue;
103799         if ( ! options.extensions[ecur] )
103800             options.extensions[ecur] = [];
103801         options.extensions[ecur].push(eitem.text);
103802         }
103803         return;
103804         }
103805         });
103806         return [new exports.DevInfo(null, options), stores];
103807     }
103808
103809 });
103810
103811 return exports;
103812
103813 })();
103814
103815 module.exports = _self;
103816
103817 });
103818 define('ripple/platform/tizen/2.0/syncml-js-lib/ctype', function (require, exports, module) {
103819 // -*- coding: utf-8 -*-
103820 //-----------------------------------------------------------------------------
103821 // file: $Id$
103822 // auth: metagriffin <metagriffin@uberdev.org>
103823 // date: 2012/10/13
103824 // copy: (C) CopyLoose 2012 UberDev <hardcore@uberdev.org>, No Rights Reserved.
103825 //-----------------------------------------------------------------------------
103826 var common = require('ripple/platform/tizen/2.0/syncml-js-lib/common'),
103827     ET = require('ripple/platform/tizen/2.0/syncml-js-lib/elementtree'),
103828     _self;
103829
103830 _self = (function () {
103831
103832     var exports = {};
103833
103834     //---------------------------------------------------------------------------
103835     exports.ContentTypeInfo = common.Base.extend({
103836
103837         //-------------------------------------------------------------------------
103838         constructor: function(ctype, versions, options) {
103839             this.ctype    = ctype;
103840             this.versions = _.isArray(versions) ? versions : [versions];
103841             _.defaults(this, options || {}, {
103842                 preferred: false,
103843                 transmit:  true,
103844                 receive:   true,
103845             });
103846         },
103847
103848         //-------------------------------------------------------------------------
103849         merge: function(other) {
103850             if ( this.ctype != other.ctype
103851                 || ! _.isEqual(this.versions, other.versions)
103852                 || this.preferred != other.preferred )
103853                 return false;
103854             this.transmit = this.transmit || other.transmit;
103855             this.receive  = this.receive  || other.receive;
103856             return true
103857         },
103858
103859         //-------------------------------------------------------------------------
103860         toStruct: function() {
103861             return {
103862                 ctype: this.ctype,
103863                 versions: this.versions,
103864                 preferred: this.preferred,
103865                 transmit:  this.transmit,
103866                 receive:   this.receive
103867             };
103868         },
103869
103870         //-------------------------------------------------------------------------
103871         toSyncML: function(nodeName, uniqueVerCt) {
103872             if ( _.isFunction(nodeName) )
103873             {
103874                 cb = nodeName;
103875                 nodeName = null;
103876             }
103877             else if ( _.isFunction(uniqueVerCt) )
103878             {
103879                 cb = uniqueVerCt;
103880                 uniqueVerCt = null;
103881             }
103882             if ( ! nodeName )
103883             {
103884                 nodeName = this.transmit ? 'Tx' : 'Rx';
103885                 if ( this.preferred )
103886                     nodeName += '-Pref';
103887             }
103888             if ( this.preferred )
103889                 nodeName += '-Pref';
103890
103891             if ( uniqueVerCt )
103892             {
103893                 var ret = _.map(this.versions, function(v) {
103894                     var tmp = ET.Element(nodeName);
103895                     ET.SubElement(tmp, 'CTType').text = this.ctype;
103896                     ET.SubElement(tmp, 'VerCT').text = v;
103897                     return tmp;
103898                 }, this);
103899                 return ret;
103900             }
103901             var ret = ET.Element(nodeName);
103902             ET.SubElement(ret, 'CTType').text = this.ctype;
103903             _.each(this.versions, function(v) {
103904                 ET.SubElement(ret, 'VerCT').text = v;
103905             });
103906             return ret;
103907         },
103908
103909         describe: function(stream, cb) {
103910             stream.write(this.ctype);
103911             stream.write(this.versions.length == 1 ? ' version ' : ' versions ');
103912             stream.write(this.versions.join(', '));
103913             var flags = [];
103914             if ( this.preferred )
103915                 flags.push('preferred');
103916             if ( this.transmit )
103917                 flags.push('tx');
103918             if ( this.receive )
103919                 flags.push('rx');
103920             if ( flags.length > 0 )
103921             {
103922                 stream.write(' (');
103923                         stream.write(flags.join(', '));
103924                         stream.write(')');
103925                         }
103926                         stream.write('\n');
103927                         }
103928
103929                         }, {
103930
103931                             //-------------------------------------------------------------------------
103932                             fromStruct: function(struct) {
103933                                 return new exports.ContentTypeInfo(struct.ctype, struct.versions, struct);
103934                             },
103935
103936                     //-------------------------------------------------------------------------
103937                     fromSyncML: function(xnode) {
103938                         return new exports.ContentTypeInfo(
103939                             xnode.findtext('CTType'),
103940                             _.map(xnode.findall('VerCT'), function(e) { return e.text; }),
103941                             {
103942                                 preferred: xnode.tag.match('-Pref$') != undefined,
103943                         transmit:  xnode.tag.indexOf('Tx') >= 0,
103944                         receive:   xnode.tag.indexOf('Rx') >= 0
103945                             }
103946                             );
103947                     }
103948
103949                         });
103950
103951     return exports;
103952
103953 })();
103954
103955 module.exports = _self;
103956
103957 });
103958 define('ripple/platform/tizen/2.0/syncml-js-lib/remoteadapter', function (require, exports, module) {
103959 // -*- coding: utf-8 -*-
103960 //-----------------------------------------------------------------------------
103961 // file: $Id$
103962 // lib:  syncml-js.remoteadapter
103963 // auth: griffin <griffin@uberdev.org>
103964 // date: 2012/11/04
103965 // copy: (C) CopyLoose 2012 UberDev <hardcore@uberdev.org>, No Rights Reserved.
103966 //-----------------------------------------------------------------------------
103967
103968 var common = require('ripple/platform/tizen/2.0/syncml-js-lib/common'),
103969     devinfomod = require('ripple/platform/tizen/2.0/syncml-js-lib/devinfo'),
103970     adapter = require('ripple/platform/tizen/2.0/syncml-js-lib/adapter'),
103971     storemod = require('ripple/platform/tizen/2.0/syncml-js-lib/store'),
103972     _self;
103973
103974 _self = (function () {
103975     var exports = {};
103976
103977     //---------------------------------------------------------------------------
103978     exports.RemoteAdapter = adapter.Adapter.extend({
103979
103980         //-------------------------------------------------------------------------
103981         constructor: function(adapter, options) {
103982
103983             //: [read-only] the URL of the remote syncml peer, acting as a server,
103984             //: to connect to.
103985             this.url = options.url || null;
103986
103987             //: [read-only] specifies whether this Adapter represents a local
103988             //: or remote peer.
103989             this.isLocal = false;
103990
103991             //: [read-only] the DevID of the remote syncml peer (which usually
103992             //: defaults to the URL).
103993             this.devID = options.devID || options.url || null;
103994
103995             //: [read-only] the authentication method to use to identify the local
103996             //: peer to the remote peer.
103997             ///TODO: this.auth = options.auth || null;
103998             this.auth = 'syncml:auth-basic';
103999
104000             //: [read-only] the human-friendly display name of the remote peer.
104001             this.displayName = options.displayName || null;
104002
104003             //: [read-only] the username to use during credential-based authentication.
104004             this.username = options.username || null;
104005
104006             //: [read-only] the password to use during credential-based authentication.
104007             this.password = options.password || null;
104008
104009             //: [read-only] the peer-wide default value of the maximum
104010             //: message size.
104011             this.maxMsgSize = options.maxMsgSize || null;
104012
104013             //: [read-only] the peer-wide default value of the maximum
104014             //: object size.
104015             this.maxObjSize = options.maxObjSize || null;
104016
104017             //: [read-only] the DevInfo object for this remote peer.
104018             this.devInfo = null;
104019
104020             this.lastSessionID = options.lastSessionID || null;
104021
104022             // --- private attributes
104023             this.id       = options.id || common.makeID();
104024             this._a       = adapter;
104025             this._c       = adapter._c;
104026             this._stores  = {};
104027             this._proxy   = null;
104028
104029             // TODO: filter these options for db-valid only properties...
104030             this._options = options;
104031         },
104032
104033             //-------------------------------------------------------------------------
104034             _load: function(cb) {
104035
104036                 var self  = this;
104037                 var model = this._getModel();
104038
104039                 // todo: should this be loading these?...
104040                 // self.displayName = model.displayName;
104041                 // self.devID       = model.devID;
104042
104043                 var loadDevInfo = function(cb) {
104044                     var di = new devinfomod.DevInfo(self, model.devInfo);
104045                     di._load(function(err) {
104046                         if ( err )
104047                         return cb(err);
104048                     self.devInfo = di;
104049                     cb();
104050                     });
104051                 };
104052
104053                 var loadStores = function(cb) {
104054                     common.cascade(model.stores, function(e, cb) {
104055                         var store = new storemod.Store(self, e);
104056                         store._load(function(err) {
104057                             if ( err )
104058                             return cb(err);
104059                         self._stores[store.uri] = store;
104060                         return cb();
104061                         });
104062                     }, cb);
104063                 };
104064
104065                 loadDevInfo(function(err) {
104066                     if ( err )
104067                     return cb(err);
104068                 loadStores(cb);
104069                 });
104070             },
104071
104072             //-------------------------------------------------------------------------
104073             _updateModel: function(cb) {
104074                 var self = this;
104075                 if ( ! this._a._model || ! this._a._model.peers )
104076                     return cb(new common.InternalError('peer created on un-initialized adapter'));
104077                 var model = self._getModel();
104078                 // todo: should this be in this._getModel()?...
104079                 if ( ! model )
104080                 {
104081                     model = {
104082                         id:       self.id,
104083                         devInfo:  null,
104084                         stores:   [],
104085                         routes:   []
104086                     };
104087                     self._a._model.peers.push(model);
104088                 }
104089
104090                 model.isLocal         = 0;
104091                 model.url             = self.url;
104092                 model.devID           = self.devID;
104093                 model.displayName     = self.displayName;
104094                 model.auth            = self.auth;
104095                 model.username        = self.username;
104096                 model.password        = self.password;
104097                 model.lastSessionID   = self.lastSessionID
104098                     model.maxMsgSize      = self.maxMsgSize;
104099                 model.maxObjSize      = self.maxObjSize;
104100
104101                 common.cascade([
104102
104103                         // update the devInfo model
104104                         function(cb) {
104105                             if ( ! self.devInfo )
104106                     return cb();
104107                 return self.devInfo._updateModel(cb);
104108                         },
104109
104110                         // update the stores model
104111                         function(cb) {
104112                             // TODO: this should really be the responsibility of the Store class...
104113                             // NOTE: since bindings are not stored in Store, they need to be saved
104114                             //       and re-applied.
104115                             // TODO: or, perhaps better, i should purge all unwanted stores
104116                             //       instead of doing this brute-force method...
104117                             var bindings = _.object(_.map(model.stores, function(store) {
104118                                 return [store.uri, store.binding];
104119                             }));
104120                             model.stores = [];
104121                             common.cascade(_.values(self._stores), function(store, cb) {
104122                                 store._updateModel(cb);
104123                             }, function(err) {
104124                                 if ( err )
104125                                 return cb(err);
104126                             _.each(bindings, function(binding, uri) {
104127                                 var store = _.find(model.stores, function(s) { return s.uri == uri; });
104128                                 if ( ! store )
104129                                 return;
104130                             store.binding = binding;
104131                             });
104132                             return cb();
104133                             });
104134                         },
104135
104136                         ], cb);
104137
104138             },
104139
104140             //-------------------------------------------------------------------------
104141             _getModel: function() {
104142                 return _.find(this._a._model.peers,
104143                         function(e) { return e.id == this.id; }, this);
104144             },
104145
104146             //-------------------------------------------------------------------------
104147             _setRemoteInfo: function(devInfo, stores, cb) {
104148                 var self      = this;
104149                 self._model   = self._getModel();
104150                 devInfo._a    = self;
104151                 self.devInfo  = devInfo;
104152                 self.devInfo._updateModel(function(err) {
104153                     if ( err )
104154                     return cb(err);
104155                 // merge the new datastore info with any pre-existing store bindings
104156                 // step 1: prepare the new stores (clean up the URIs)
104157                 var lut = _.object(_.map(stores, function(store) {
104158                     store.uri = self.normUri(store.uri);
104159                     return [store.uri, store];
104160                 }));
104161                 // step 2: remove all stores that are no longer mentioned
104162                 self._stores = _.object(
104163                     _.map(
104164                         _.filter(_.keys(self._stores), function(oldUri) {
104165                             return _.indexOf(_.keys(lut), oldUri) >= 0;
104166                         }), function(uri) {
104167                             return [uri, self._stores[uri]];
104168                         }
104169                         )
104170                     );
104171                 // step 3: merge the datastore info for existing stores
104172                 var merge_stores = function(cb) {
104173                     common.cascade(_.values(self._stores), function(store, cb) {
104174                         store.merge(lut[store.uri], function(err) {
104175                             if ( err )
104176                             return cb(err);
104177                         delete lut[store.uri];
104178                         return cb();
104179                         });
104180                     }, cb);
104181                 };
104182                 // step 4: add new datastores
104183                 var add_stores = function(cb) {
104184                     common.cascade(_.values(lut), function(store, cb) {
104185                         self.addStore(store, cb);
104186                     }, cb);
104187                 };
104188                 merge_stores(function(err) {
104189                     if ( err )
104190                     return cb(err);
104191                 add_stores(cb);
104192                 });
104193                 });
104194             },
104195
104196             //-------------------------------------------------------------------------
104197             setRoute: function(localUri, remoteUri, autoMapped, cb) {
104198                 if ( _.isFunction(autoMapped) )
104199                     // defaulting 'autoMapped' to false
104200                     return this.setRoute(localUri, remoteUri, false, autoMapped);
104201                 var pmodel = this._getModel();
104202                 if ( ! pmodel )
104203                     return cb(new common.InternalError('could not locate this peer in local adapter'));
104204                 pmodel.routes = _.filter(pmodel.routes, function(r) {
104205                     return r.localUri != localUri && r.remoteUri != remoteUri;
104206                 });
104207                 pmodel.routes.push({localUri   : localUri,
104208                     remoteUri  : remoteUri,
104209                     autoMapped : autoMapped
104210                 });
104211                 // now search through previous bindings, breaking incorrect ones...
104212                 // NOTE: this requires that a router.recalculate() is called at
104213                 //       some point later since other valid bindings may now be
104214                 //       possible...
104215                 _.each(pmodel.stores, function(store) {
104216                     if ( store.uri != remoteUri
104217                         && ( ! store.binding || store.binding.uri != localUri ) )
104218                     {
104219                         return;
104220                     }
104221                     if ( ! store.binding )
104222                 {
104223                     store.binding = {
104224                         uri          : localUri,
104225                     autoMapped   : autoMapped,
104226                     localAnchor  : null,
104227                     remoteAnchor : null
104228                     };
104229                     return;
104230                 }
104231                 if ( store.uri == remoteUri && store.binding.uri == localUri )
104232                 {
104233                     store.binding.autoMapped = store.binding.autoMapped && autoMapped;
104234                     return;
104235                 }
104236                 store.binding = null;
104237                 return;
104238                 });
104239                 // TODO: this additional route may impact "smart routing" - recalculate?...
104240                 // TODO: saving adapter from peer --- SHOULD IT BE DOING THIS?...
104241                 // TODO: get transaction from a session!...
104242                 this._a._save(this._c._txn(), cb);
104243             },
104244
104245             //-------------------------------------------------------------------------
104246             sendRequest: function(session, contentType, data, cb) {
104247                 var xmlhttp;
104248
104249                 // TODO: shouldn't proxies just overwrite .sendRequest() ?...
104250                 if ( this._proxy )
104251                     return this._proxy.sendRequest(session, contentType, data, cb);
104252
104253                 var req = {
104254                     url     : session.info.respUri || this.url,
104255                     method  : 'POST',
104256                     headers : {'Content-Type': contentType},
104257                     body    : data
104258                 };
104259
104260                 xmlhttp = new XMLHttpRequest();
104261                 xmlhttp.open(req.method, req.url, false);
104262
104263                 xmlhttp.setRequestHeader("Content-Type", contentType);
104264                 xmlhttp.send(req.body);
104265
104266                 var response = {
104267                     headers: {
104268                         "Content-Type": xmlhttp.getResponseHeader("content-type")
104269                     },
104270                     body: xmlhttp.responseXML
104271                 };
104272                 return cb(null, response);
104273             }
104274
104275     });
104276
104277     return exports;
104278
104279 })();
104280
104281 module.exports = _self;
104282
104283 });
104284 define('ripple/platform/tizen/2.0/syncml-js-lib/base64', function (require, exports, module) {
104285 // -*- coding: utf-8 -*-
104286 //-----------------------------------------------------------------------------
104287 // file: $Id$
104288 //-----------------------------------------------------------------------------
104289
104290 var _self = (function() {
104291
104292     // shamelessly scrubbed from:
104293     //   http://www.webtoolkit.info/javascript-base64.html
104294
104295     /**
104296      *
104297      *  Base64 encode / decode
104298      *  http://www.webtoolkit.info/
104299      *
104300      **/
104301
104302     var Base64 = {
104303
104304         // private property
104305         _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
104306
104307       // public method for encoding
104308       encode : function (input) {
104309           var output = "";
104310           var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
104311           var i = 0;
104312
104313           input = Base64._utf8_encode(input);
104314
104315           while (i < input.length) {
104316
104317               chr1 = input.charCodeAt(i++);
104318               chr2 = input.charCodeAt(i++);
104319               chr3 = input.charCodeAt(i++);
104320
104321               enc1 = chr1 >> 2;
104322               enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
104323               enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
104324               enc4 = chr3 & 63;
104325
104326               if (isNaN(chr2)) {
104327                   enc3 = enc4 = 64;
104328               } else if (isNaN(chr3)) {
104329                   enc4 = 64;
104330               }
104331
104332               output = output +
104333                   this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
104334                   this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
104335
104336           }
104337
104338           return output;
104339       },
104340
104341       // public method for decoding
104342       decode : function (input) {
104343           var output = "";
104344           var chr1, chr2, chr3;
104345           var enc1, enc2, enc3, enc4;
104346           var i = 0;
104347
104348           input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
104349
104350           while (i < input.length) {
104351
104352               enc1 = this._keyStr.indexOf(input.charAt(i++));
104353               enc2 = this._keyStr.indexOf(input.charAt(i++));
104354               enc3 = this._keyStr.indexOf(input.charAt(i++));
104355               enc4 = this._keyStr.indexOf(input.charAt(i++));
104356
104357               chr1 = (enc1 << 2) | (enc2 >> 4);
104358               chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
104359               chr3 = ((enc3 & 3) << 6) | enc4;
104360
104361               output = output + String.fromCharCode(chr1);
104362
104363               if (enc3 != 64) {
104364                   output = output + String.fromCharCode(chr2);
104365               }
104366               if (enc4 != 64) {
104367                   output = output + String.fromCharCode(chr3);
104368               }
104369
104370           }
104371
104372           output = Base64._utf8_decode(output);
104373
104374           return output;
104375
104376       },
104377
104378       // private method for UTF-8 encoding
104379       _utf8_encode : function (string) {
104380           string = string.replace(/\r\n/g,"\n");
104381           var utftext = "";
104382
104383           for (var n = 0; n < string.length; n++) {
104384
104385               var c = string.charCodeAt(n);
104386
104387               if (c < 128) {
104388                   utftext += String.fromCharCode(c);
104389               }
104390               else if((c > 127) && (c < 2048)) {
104391                   utftext += String.fromCharCode((c >> 6) | 192);
104392                   utftext += String.fromCharCode((c & 63) | 128);
104393               }
104394               else {
104395                   utftext += String.fromCharCode((c >> 12) | 224);
104396                   utftext += String.fromCharCode(((c >> 6) & 63) | 128);
104397                   utftext += String.fromCharCode((c & 63) | 128);
104398               }
104399
104400           }
104401
104402           return utftext;
104403       },
104404
104405       // private method for UTF-8 decoding
104406       _utf8_decode : function (utftext) {
104407           var string = "";
104408           var i = 0;
104409           var c = c1 = c2 = 0;
104410
104411           while ( i < utftext.length ) {
104412
104413               c = utftext.charCodeAt(i);
104414
104415               if (c < 128) {
104416                   string += String.fromCharCode(c);
104417                   i++;
104418               }
104419               else if((c > 191) && (c < 224)) {
104420                   c2 = utftext.charCodeAt(i+1);
104421                   string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
104422                   i += 2;
104423               }
104424               else {
104425                   c2 = utftext.charCodeAt(i+1);
104426                   c3 = utftext.charCodeAt(i+2);
104427                   string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
104428                   i += 3;
104429               }
104430
104431           }
104432
104433           return string;
104434       }
104435
104436     };
104437
104438     return Base64;
104439
104440 })();
104441
104442 module.exports = _self;
104443
104444 });
104445 define('ripple/platform/tizen/2.0/syncml-js-lib/constant', function (require, exports, module) {
104446 // -*- coding: utf-8 -*-
104447 //-----------------------------------------------------------------------------
104448 // file: $Id$
104449 // desc: SyncML constants
104450 // auth: metagriffin <metagriffin@uberdev.org>
104451 // date: 2012/10/13
104452 // copy: (C) CopyLoose 2012 UberDev <hardcore@uberdev.org>, No Rights Reserved.
104453 //-----------------------------------------------------------------------------
104454
104455 var _self = {
104456     // SyncML versions
104457     SYNCML_VERSION_1_0                      : 'SyncML/1.0',
104458     SYNCML_VERSION_1_1                      : 'SyncML/1.1',
104459     SYNCML_VERSION_1_2                      : 'SyncML/1.2',
104460     SYNCML_DTD_VERSION_1_0                  : '1.0',
104461     SYNCML_DTD_VERSION_1_1                  : '1.1',
104462     SYNCML_DTD_VERSION_1_2                  : '1.2',
104463
104464     // SyncML alert/sync codes
104465     ALERT_DISPLAY                           : 100,
104466     ALERT_TWO_WAY                           : 200,
104467     ALERT_SLOW_SYNC                         : 201,
104468     ALERT_ONE_WAY_FROM_CLIENT               : 202,
104469     ALERT_REFRESH_FROM_CLIENT               : 203,
104470     ALERT_ONE_WAY_FROM_SERVER               : 204,
104471     ALERT_REFRESH_FROM_SERVER               : 205,
104472     ALERT_TWO_WAY_BY_SERVER                 : 206,
104473     ALERT_ONE_WAY_FROM_CLIENT_BY_SERVER     : 207,
104474     ALERT_REFRESH_FROM_CLIENT_BY_SERVER     : 208,
104475     ALERT_ONE_WAY_FROM_SERVER_BY_SERVER     : 209,
104476     ALERT_REFRESH_FROM_SERVER_BY_SERVER     : 210,
104477     // alert codes 211-220 are reserved for future use
104478
104479     // SyncML SyncCap SyncTypes
104480     SYNCTYPE_AUTO                           : null,
104481     SYNCTYPE_TWO_WAY                        : 1,
104482     SYNCTYPE_SLOW_SYNC                      : 2,
104483     SYNCTYPE_ONE_WAY_FROM_CLIENT            : 3,
104484     SYNCTYPE_REFRESH_FROM_CLIENT            : 4,
104485     SYNCTYPE_ONE_WAY_FROM_SERVER            : 5,
104486     SYNCTYPE_REFRESH_FROM_SERVER            : 6,
104487     SYNCTYPE_SERVER_ALERTED                 : 7,
104488
104489     // Special syncml-js SyncTypes
104490     SYNCTYPE_DISCOVER                       : 'discover',
104491
104492     // SyncML synctype-to-alertcode mapping
104493     // taking advantage of the fact that 1..7 maps to 200..206
104494     // (more or less... "7" is a bit "nebulous"...)
104495     SyncTypeToAlert: _.object(_.map(_.range(7), function(i) {
104496         return [ i + 1, i + 200 ];
104497     })),
104498
104499     // Conflict handling policies
104500     POLICY_ERROR                            : 1,
104501     POLICY_CLIENT_WINS                      : 2,
104502     POLICY_SERVER_WINS                      : 3,
104503
104504     // SyncML XML namespaces
104505     NAMESPACE_SYNCML_1_0                    : 'syncml:syncml1.0',
104506     NAMESPACE_SYNCML_1_1                    : 'syncml:syncml1.1',
104507     NAMESPACE_SYNCML_1_2                    : 'syncml:syncml1.2',
104508     NAMESPACE_METINF                        : 'syncml:metinf',
104509     NAMESPACE_DEVINF                        : 'syncml:devinf',
104510     NAMESPACE_AUTH_BASIC                    : 'syncml:auth-basic',
104511     NAMESPACE_AUTH_MD5                      : 'syncml:auth-md5',
104512     NAMESPACE_FILTER_CGI                    : 'syncml:filtertype-cgi',
104513
104514     // Commonly used content-types
104515     TYPE_TEXT_PLAIN                         : 'text/plain',
104516     TYPE_VCARD_V21                          : 'text/x-vcard',
104517     TYPE_VCARD_V30                          : 'text/vcard',
104518     TYPE_VCALENDAR                          : 'text/x-vcalendar',
104519     TYPE_ICALENDAR                          : 'text/calendar',
104520     TYPE_MESSAGE                            : 'text/message',
104521     TYPE_SYNCML                             : 'application/vnd.syncml',
104522     TYPE_SYNCML_DEVICE_INFO                 : 'application/vnd.syncml-devinf',
104523     TYPE_SYNCML_ICALENDAR                   : 'application/vnd.syncml-xcal',
104524     TYPE_SYNCML_EMAIL                       : 'application/vnd.syncml-xmsg',
104525     TYPE_SYNCML_BOOKMARK                    : 'application/vnd.syncml-xbookmark',
104526     TYPE_SYNCML_RELATIONAL_OBJECT           : 'application/vnd.syncml-xrelational',
104527     TYPE_OMADS_FOLDER                       : 'application/vnd.omads-folder',
104528     TYPE_OMADS_FILE                         : 'application/vnd.omads-file',
104529     TYPE_OMADS_EMAIL                        : 'application/vnd.omads-email',
104530     TYPE_SQL                                : 'application/sql',
104531     TYPE_LDAP                               : 'text/directory',
104532     TYPE_EMAIL                              : 'message/rfc2822',
104533     TYPE_EMAIL_822                          : 'message/rfc822',
104534     TYPE_SIF_CONTACT                        : 'text/x-s4j-sifc',
104535     TYPE_SIF_NOTE                           : 'text/x-s4j-sifn',
104536     TYPE_SIF_TASK                           : 'text/x-s4j-sift',
104537     TYPE_SIF_EVENT                          : 'text/x-s4j-sife',
104538
104539     // non-agent URI paths
104540     URI_DEVINFO_1_0                         : 'devinf10',
104541     URI_DEVINFO_1_1                         : 'devinf11',
104542     URI_DEVINFO_1_2                         : 'devinf12',
104543
104544     // Response codes - Generic
104545     STATUS_INVALID_CODE                     : 0,
104546     // Response codes - Informational 1xx
104547     STATUS_IN_PROGRESS                      : 101,
104548     // Response codes - Successful 2xx
104549     STATUS_OK                               : 200,
104550     STATUS_ITEM_ADDED                       : 201,
104551     STATUS_ACCEPTED_FOR_PROCESSING          : 202,
104552     STATUS_NONAUTHORIATATIVE_RESPONSE       : 203,
104553     STATUS_NO_CONTENT                       : 204,
104554     STATUS_RESET_CONTENT                    : 205,
104555     STATUS_PARTIAL_CONTENT                  : 206,
104556     STATUS_CONFLICT_RESOLVED_MERGE          : 207,
104557     STATUS_CONFLICT_RESOLVED_CLIENT_DATA    : 208,
104558     STATUS_CONFLICT_RESOLVED_DUPLICATE      : 209,
104559     STATUS_DELETE_WITHOUT_ARCHIVE           : 210,
104560     STATUS_ITEM_NOT_DELETED                 : 211,
104561     STATUS_AUTHENTICATION_ACCEPTED          : 212,
104562     STATUS_CHUNKED_ITEM_ACCEPTED            : 213,
104563     STATUS_OPERATION_CANCELLED_OK           : 214,
104564     STATUS_NOT_EXECUTED                     : 215,
104565     STATUS_ATOMIC_ROLLBACK_OK               : 216,
104566     STATUS_RESULT_ALERT                     : 221,
104567     STATUS_NEXT_MESSAGE                     : 222,
104568     STATUS_NO_END_OF_DATA                   : 223,
104569     STATUS_SUSPEND                          : 224,
104570     STATUS_RESUME                           : 225,
104571     STATUS_DATA_MANAGEMENT                  : 226,
104572     // status codes 227-250 are reserved for future use,
104573     // Response codes - Redirection 3xx
104574     STATUS_MULTIPLE_CHOICES                 : 300,
104575     STATUS_MOVED_PERMANENTLY                : 301,
104576     STATUS_FOUND                            : 302,
104577     STATUS_SEE_ANOTHER_URI                  : 303,
104578     STATUS_NOT_MODIFIED                     : 304,
104579     STATUS_USE_PROXY                        : 305,
104580     // Response codes - Originator Exceptions 4xx
104581     STATUS_BAD_REQUEST                      : 400,
104582     STATUS_INVALID_CREDENTIALS              : 401,
104583     STATUS_PAYMENT_REQUIRED                 : 402,
104584     STATUS_FORBIDDEN                        : 403,
104585     STATUS_NOT_FOUND                        : 404,
104586     STATUS_COMMAND_NOT_ALLOWED              : 405,
104587     STATUS_OPTIONAL_FEATURE_NOT_SUPPORTED   : 406,
104588     STATUS_MISSING_CREDENTIALS              : 407,
104589     STATUS_REQUEST_TIMEOUT                  : 408,
104590     STATUS_UPDATE_CONFLICT                  : 409,
104591     STATUS_GONE                             : 410,
104592     STATUS_SIZE_REQUIRED                    : 411,
104593     STATUS_INCOMPLETE_COMMAND               : 412,
104594     STATUS_REQUESTED_ENTITY_TOO_LARGE       : 413,
104595     STATUS_URI_TOO_LONG                     : 414,
104596     STATUS_UNSUPPORTED_MEDIA_TYPE           : 415,
104597     STATUS_REQUESTED_SIZE_TOO_BIG           : 416,
104598     STATUS_RETRY_LATER                      : 417,
104599     STATUS_ALREADY_EXISTS                   : 418,
104600     STATUS_CONFLICT_RESOLVED_SERVER_DATA    : 419,
104601     STATUS_DEVICE_FULL                      : 420,
104602     STATUS_UNKNOWN_SEARCH_GRAMMAR           : 421,
104603     STATUS_BAD_CGI_SCRIPT                   : 422,
104604     STATUS_SOFT_DELETE_CONFLICT             : 423,
104605     STATUS_OBJECT_SIZE_MISMATCH             : 424,
104606     STATUS_PERMISSION_DENIED                : 425,
104607     // Response codes - Recipient Exceptions 5xx
104608     STATUS_COMMAND_FAILED                   : 500,
104609     STATUS_NOT_IMPLEMENTED                  : 501,
104610     STATUS_BAD_GATEWAY                      : 502,
104611     STATUS_SERVICE_UNAVAILABLE              : 503,
104612     STATUS_GATEWAY_TIMEOUT                  : 504,
104613     STATUS_VERSION_NOT_SUPPORTED            : 505,
104614     STATUS_PROCESSING_ERROR                 : 506,
104615     STATUS_ATOMIC_FAILED                    : 507,
104616     STATUS_REFRESH_REQUIRED                 : 508,
104617     STATUS_RECIPIENT_EXCEPTION_RESERVED1    : 509,
104618     STATUS_DATASTORE_FAILURE                : 510,
104619     STATUS_SERVER_FAILURE                   : 511,
104620     STATUS_SYNCHRONIZATION_FAILED           : 512,
104621     STATUS_PROTOCOL_VERSION_NOT_SUPPORTED   : 513,
104622     STATUS_OPERATION_CANCELLED              : 514,
104623     STATUS_ATOMIC_ROLLBACK_FAILED           : 516,
104624     STATUS_ATOMIC_RESPONSE_TOO_LARGE_TO_FIT : 517,
104625
104626     // SyncML codecs
104627     CODEC_XML                               : 'xml',
104628     CODEC_WBXML                             : 'wbxml',
104629     FORMAT_B64                              : 'b64',
104630     FORMAT_AUTO                             : 'auto',
104631
104632     // SyncML nodes
104633     NODE_SYNCML                             : 'SyncML',
104634     NODE_SYNCBODY                           : 'SyncBody',
104635
104636     // SyncML commands
104637     CMD_SYNCHDR                             : 'SyncHdr',
104638     CMD_SYNC                                : 'Sync',
104639     CMD_ALERT                               : 'Alert',
104640     CMD_STATUS                              : 'Status',
104641     CMD_GET                                 : 'Get',
104642     CMD_PUT                                 : 'Put',
104643     CMD_ADD                                 : 'Add',
104644     CMD_REPLACE                             : 'Replace',
104645     CMD_DELETE                              : 'Delete',
104646     CMD_RESULTS                             : 'Results',
104647     CMD_ATOMIC                              : 'Atomic',
104648     CMD_COPY                                : 'Copy',
104649     CMD_EXEC                                : 'Exec',
104650     CMD_MAP                                 : 'Map',
104651     CMD_MAPITEM                             : 'MapItem',
104652     CMD_SEARCH                              : 'Search',
104653     CMD_SEQUENCE                            : 'Sequence',
104654     CMD_FINAL                               : 'Final',
104655
104656     // SyncML standard device types
104657     DEVTYPE_HANDHELD                        : 'handheld',
104658     DEVTYPE_PAGER                           : 'pager',
104659     DEVTYPE_PDA                             : 'pda',
104660     DEVTYPE_PHONE                           : 'phone',
104661     DEVTYPE_SERVER                          : 'server',
104662     DEVTYPE_SMARTPHONE                      : 'smartphone',
104663     DEVTYPE_WORKSTATION                     : 'workstation',
104664
104665     // Item status codes
104666     ITEM_OK                                 : 0,
104667     ITEM_ADDED                              : 1,
104668     ITEM_MODIFIED                           : 2,
104669     ITEM_DELETED                            : 3,
104670     ITEM_SOFTDELETED                        : 4,
104671 };
104672
104673 module.exports = _self;
104674
104675 });
104676 define('ripple/platform/tizen/2.0/syncml-js-lib/context', function (require, exports, module) {
104677 // -*- coding: utf-8 -*-
104678 //-----------------------------------------------------------------------------
104679 // file: $Id$
104680 // lib:  syncml-js.context
104681 // auth: griffin <griffin@uberdev.org>
104682 // date: 2012/10/22
104683 // copy: (C) CopyLoose 2012 UberDev <hardcore@uberdev.org>, No Rights Reserved.
104684 //-----------------------------------------------------------------------------
104685
104686 var common = require('ripple/platform/tizen/2.0/syncml-js-lib/common'),
104687     constant = require('ripple/platform/tizen/2.0/syncml-js-lib/constant'),
104688     storage = require('ripple/platform/tizen/2.0/syncml-js-lib/storage'),
104689     router = require('ripple/platform/tizen/2.0/syncml-js-lib/router'),
104690     synchronizer = require('ripple/platform/tizen/2.0/syncml-js-lib/synchronizer'),
104691     protocol = require('ripple/platform/tizen/2.0/syncml-js-lib/protocol'),
104692     localadapter = require('ripple/platform/tizen/2.0/syncml-js-lib/localadapter'),
104693     idxdb = {},
104694     _self;
104695
104696 // todo: is this the right place to put this?...
104697 //       the reason that i did not put it in the `define` call is
104698 //       because it needs access to `this.indexedDB`...
104699 var idxdb = {};
104700 if ( typeof(window) != 'undefined' && window.indexedDB )
104701 {
104702     idxdb.indexedDB   = window.indexedDB;
104703     idxdb.IDBKeyRange = window.IDBKeyRange;
104704 }
104705 else
104706 {
104707     idxdb.indexedDB   = this.indexedDB;
104708     idxdb.IDBKeyRange = this.IDBKeyRange;
104709 }
104710
104711 _self = (function () {
104712     var exports = {};
104713
104714     //---------------------------------------------------------------------------
104715     exports.Context = common.Base.extend({
104716
104717         //-------------------------------------------------------------------------
104718         constructor: function(options) {
104719             // options.storage expects the following properties:
104720             //   - indexedDB
104721             //   - IDBKeyRange
104722             options = options || {};
104723             this.storage      = options.storage || idxdb;
104724             this.dbname       = ( options.prefix || '' ) + 'syncml-js';
104725             this.autoCommit   = options.autoCommit == undefined ? true : options.autoCommit;
104726             this.router       = options.router || new router.SmartRouter();
104727             this.synchronizer = options.synchronizer || new synchronizer.Synchronizer();
104728             this.protocol     = options.protocol || new protocol.Protocol();
104729             this.codec        = options.codec || constant.CODEC_XML;
104730             this.listener     = options.listener;
104731             this.ua           = options.ua;
104732             this.config       = _.defaults({}, options.config, {
104733                 trustDevInfo      : false,
104734                 exposeErrorTrace  : false
104735             });
104736             this._db          = null;
104737             this._dbtxn       = null;
104738         },
104739
104740             //-------------------------------------------------------------------------
104741             getAdapter: function(options, devInfo, cb) {
104742                 options = options || {};
104743                 var self = this;
104744                 if ( this._db == undefined )
104745                 {
104746                     storage.openDatabase(this, function(err, db) {
104747                         if ( err ) {
104748                             return cb(err);
104749                         }
104750                         self._db = db;
104751                         self._db.onerror = function(event) {
104752                             // todo: remove this?...
104753                         };
104754                         self._dbtxn = storage.getTransaction(self._db, null, 'readwrite');
104755                         self.getAdapter(options, devInfo, cb);
104756                     });
104757                 }
104758                 else
104759                 {
104760                     var ret = new localadapter.LocalAdapter(this, options, devInfo);
104761                     return ret._load(cb);
104762                 }
104763             },
104764
104765             //-------------------------------------------------------------------------
104766             _txn: function() {
104767                 try {
104768                     // this is a work-around for XPC-based syncml... try to open
104769                     // a store, if it fails, we need a new transaction.
104770                     var store = this._dbtxn.objectStore('mapping');
104771                     return this._dbtxn;
104772                 } catch ( exc ) {
104773                     this._dbtxn = storage.getTransaction(this._db, null, 'readwrite');
104774                     return this._dbtxn;
104775                 }
104776             },
104777
104778             //-------------------------------------------------------------------------
104779             getEasyClientAdapter: function(options, cb) {
104780                 try{
104781                     this._getEasyClientAdapter(options, cb);
104782                 }catch(e){
104783                     cb(e);
104784                 }
104785             },
104786
104787             //-------------------------------------------------------------------------
104788             _getEasyClientAdapter: function(options, cb) {
104789                 // options should be:= {
104790                 //   // devID,
104791                 //   // displayName,
104792                 //   devInfo: {},
104793                 //   stores: [],
104794                 //   peer: {},
104795                 //   routes: [
104796                 //     [ source, target ],
104797                 //   ]
104798                 // }
104799                 // response: cb(err, adapter, stores, peer);
104800
104801                 var self = this;
104802
104803                 var ret = {
104804                     adapter: null,
104805                     stores: [],
104806                     peer: null
104807                 };
104808
104809                 var setupAdapter = function(cb) {
104810                     var adapterOptions = _.omit(options, 'devInfo', 'stores', 'peers', 'routes');
104811                     self.getAdapter(adapterOptions, options.devInfo, function(err, adapter) {
104812                         if ( err ) {
104813                             return cb(err);
104814                         }
104815                         ret.adapter = adapter;
104816                         if ( adapter.devInfo ) {
104817                             return cb();
104818                         }
104819                         adapter.setDevInfo(options.devInfo, cb);
104820                     });
104821                 };
104822
104823                 var setupStores = function(cb) {
104824                     common.cascade(options.stores, function(storeInfo, cb) {
104825                         var store = ret.adapter.getStore(storeInfo.uri);
104826                         if ( store != undefined )
104827                         {
104828                             if ( storeInfo.agent ) {
104829                                 store.agent = storeInfo.agent;
104830                             }
104831                             ret.stores.push(store);
104832                             return cb();
104833                         }
104834                         ret.adapter.addStore(storeInfo, function(err, store) {
104835                             if ( err ) {
104836                                 return cb(err);
104837                             }
104838                             ret.stores.push(store);
104839                             return cb();
104840                         });
104841                     }, cb);
104842                 };
104843
104844                 var setupPeer = function(cb) {
104845                     var peer = _.find(ret.adapter.getPeers(), function(p) {
104846                         return p.url == options.peer.url;
104847                     });
104848                     if ( peer )
104849                     {
104850                         ret.peer = peer;
104851                         return cb();
104852                     }
104853                     ret.adapter.addPeer(options.peer, function(err, peer) {
104854                         if ( err ) {
104855                             return cb(err);
104856                         }
104857                         ret.peer = peer;
104858                         common.cascade(options.routes, function(route, cb) {
104859                             ret.peer.setRoute(route[0], route[1], cb);
104860                         }, cb);
104861                     });
104862                 };
104863                 setupAdapter(function(err) {
104864                     if ( err ) {
104865                         return cb(err);
104866                     }
104867                     setupStores(function(err) {
104868                         if ( err ) {
104869                             return cb(err);
104870                         }
104871                         setupPeer(function(err) {
104872                             if ( err ) {
104873                                 return cb(err);
104874                             }
104875                             cb(null, ret.adapter, ret.stores, ret.peer);
104876                         });
104877                     });
104878                 });
104879             },
104880
104881             //-------------------------------------------------------------------------
104882             close: function(cb) {
104883                 if ( this._db )
104884                     this._db.close();
104885                 this._db = null;
104886                 cb(null);
104887             }
104888
104889     });
104890
104891     return exports;
104892
104893 })();
104894
104895 module.exports = _self;
104896
104897 });
104898 define('ripple/platform/tizen/2.0/syncml-js-lib/state', function (require, exports, module) {
104899 // -*- coding: utf-8 -*-
104900 //-----------------------------------------------------------------------------
104901 // file: $Id$
104902 // auth: metagriffin <metagriffin@uberdev.org>
104903 // date: 2012/10/27
104904 // copy: (C) CopyLoose 2012 UberDev <hardcore@uberdev.org>, No Rights Reserved.
104905 //-----------------------------------------------------------------------------
104906
104907 var common = require('ripple/platform/tizen/2.0/syncml-js-lib/common'),
104908     constant = require('ripple/platform/tizen/2.0/syncml-js-lib/constant'),
104909     _self;
104910
104911 _self = (function () {
104912     var exports = {};
104913
104914     //---------------------------------------------------------------------------
104915     exports.makeCommand = function(options) {
104916         return _.defaults({}, options, {
104917             // ?
104918         });
104919     };
104920
104921     //---------------------------------------------------------------------------
104922     exports.makeStats = function(options) {
104923         return _.defaults({}, options, {
104924             mode      : null,
104925                hereAdd   : 0,
104926                hereMod   : 0,
104927                hereDel   : 0,
104928                hereErr   : 0,
104929                peerAdd   : 0,
104930                peerMod   : 0,
104931                peerDel   : 0,
104932                peerErr   : 0,
104933                conflicts : 0,
104934                merged    : 0,
104935         });
104936     };
104937
104938     //---------------------------------------------------------------------------
104939     exports.makeSessionInfo = function(options) {
104940         return _.defaults({}, options, {
104941             id           : null,
104942                msgID        : null,
104943                cmdID        : 0,
104944                dsstates     : {},
104945                lastCommands : [],
104946                stats        : exports.makeStats()
104947         });
104948     };
104949
104950     //---------------------------------------------------------------------------
104951     exports.makeStoreSyncState = function(options) {
104952         return _.defaults({}, options, {
104953             uri        : null,
104954                peerUri    : null,
104955                lastAnchor : null,
104956                nextAnchor : '' + common.ts(),
104957                mode       : constant.ALERT_TWO_WAY,
104958                action     : null,
104959                stats      : exports.makeStats()
104960         });
104961     };
104962
104963     //---------------------------------------------------------------------------
104964     exports.makeSession = function(options) {
104965         return new (function() {
104966             this.context   = options.context || null;
104967             this.ua        = options.ua      || null;
104968             this.txn       = options.txn     || options.context.txn;
104969             this.adapter   = options.adapter || null;
104970             this.peer      = options.peer    || null;
104971             this.info      = options.info    || null;
104972             this.discover  = options.discover ? true : false;
104973             this.isServer  = options.isServer ? true : false;
104974             this.nextCmdID = function() {
104975                 this.info.cmdID += 1;
104976                 return this.info.cmdID;
104977             };
104978         })();
104979
104980         // return _.defaults({}, options, {
104981         //   context : null,
104982         //   adapter : null,
104983         //   peer    : null,
104984         //   info    : null
104985         // });
104986     };
104987
104988     var smult = function(s, count) {
104989         var ret = '';
104990         for ( var idx=0 ; idx<count ; idx++ )
104991             ret += s;
104992         return ret;
104993     };
104994
104995     var num2str = function(num) {
104996         // TODO: i18n...
104997         // TODO: this is *UGLY*
104998         // TODO: OMG, i'm *so* embarrassed
104999         // TODO: but it works... sort of.
105000         if ( num == 0 )
105001             return '-';
105002         var ret = '';
105003         num = '' + num;
105004         for ( var idx=num.length ; idx>0 ; idx-=3 )
105005         {
105006             if ( ret.length > 0 )
105007                 ret = ',' + ret;
105008             ret = num.charAt(idx - 1) + ret;
105009             if ( idx - 1 > 0 )
105010                 ret = num.charAt(idx - 2) + ret;
105011             if ( idx - 2 > 0 )
105012                 ret = num.charAt(idx - 3) + ret;
105013         }
105014         return ret;
105015     };
105016
105017     var center = function(s, wid, pad) {
105018         // todo: is there no way to get sprintf to do this for me???...
105019         pad = pad || ' ';
105020         if ( wid <= s.length )
105021             return s;
105022         var diff = wid - s.length;
105023         return smult(pad, Math.floor(diff / 2)) + s + smult(pad, Math.ceil(diff / 2));
105024     };
105025
105026     var right = function(s, wid, pad) {
105027         // todo: is there no way to get sprintf to do this for me???...
105028         pad = pad || ' ';
105029         if ( wid <= s.length )
105030             return s;
105031         return smult(pad, wid - s.length) + s;
105032     };
105033
105034     //---------------------------------------------------------------------------
105035     // TODO: this should probably be put into another package...
105036     exports.describeStats = function(stats, stream, options) {
105037
105038         // ASCII OBJECTIVE:
105039         // +----------------------------------------------------------------------------------+
105040         // |                                      TITLE                                       |
105041         // +----------+------+-------------------------+--------------------------+-----------+
105042         // |          |      |          Local          |          Remote          | Conflicts |
105043         // |   Source | Mode |  Add  | Mod | Del | Err |   Add  | Mod | Del | Err | Col | Mrg |
105044         // +----------+------+-------+-----+-----+-----+--------+-----+-----+-----+-----+-----+
105045         // | contacts |  <=  |   -   |  -  |  -  |  -  | 10,387 |  -  |  -  |  -  |  -  |  -  |
105046         // |     note |  SS  | 1,308 |  -  |   2 |  -  |    -   |  -  |  -  |  -  |  -  |  -  |
105047         // +----------+------+-------+-----+-----+-----+--------+-----+-----+-----+-----+-----+
105048         // |                  1,310 local changes and 10,387 remote changes.                  |
105049         // +----------------------------------------------------------------------------------+
105050
105051         // UNICODE OBJECTIVE:
105052         // ┌──────────────────────────────────────────────────────────────────────────────────┐
105053         // │                                      TITLE                                       │
105054         // ├──────────┬──────┬─────────────────────────┬──────────────────────────┬───────────┤
105055         // │          │      │          Local          │          Remote          │ Conflicts │
105056         // │   Source │ Mode │  Add    Mod   Del   Err │   Add    Mod   Del   Err │ Col   Mrg │
105057         // ├──────────┼──────┼───────┼─────┼─────┼─────┼────────┼─────┼─────┼─────┼─────┼─────┤
105058         // │ contacts │  <=  │       │     │     │     │ 10,387 │     │     │     │     │     │
105059         // │     note │  SS  │ 1,308 │     │   2 │     │        │     │     │     │     │     │
105060         // ├──────────┴──────┴───────┴─────┴─────┴─────┴────────┴─────┴─────┴─────┴─────┴─────┤
105061         // │                  1,310 local changes and 10,387 remote changes.                  │
105062         // └──────────────────────────────────────────────────────────────────────────────────┘
105063
105064         // todo: perhaps the fancy version should have color-coding as well?...
105065
105066         options = _.defaults({}, options, {
105067             title      : null,
105068                 details    : true,
105069                 totals     : true,
105070                 ascii      : false,
105071                 gettext    : function(text) { return text; }
105072         });
105073
105074         var modeStringLut = _.object([
105075                 [constant.SYNCTYPE_TWO_WAY             , '<>'],
105076                 [constant.SYNCTYPE_SLOW_SYNC           , 'SS'],
105077                 [constant.SYNCTYPE_ONE_WAY_FROM_CLIENT , '->'],
105078                 [constant.SYNCTYPE_REFRESH_FROM_CLIENT , '=>'],
105079                 [constant.SYNCTYPE_ONE_WAY_FROM_SERVER , '<-'],
105080                 [constant.SYNCTYPE_REFRESH_FROM_SERVER , '<=']
105081                 ]);
105082
105083         if ( options.ascii )
105084         {
105085
105086             // unicode graphing characters: ('\xe2\x94\x80' - '\xe2\x94\xc0')
105087             // mapping table unicode ==> ascii
105088
105089             glyphs = {
105090                 '─': '-',
105091                 '━': '-',
105092                 '│': '|',
105093                 '┃': '|',
105094                 '┄': '-',
105095                 '┅': '-',
105096                 '┆': '|',
105097                 '┇': '|',
105098                 '┈': '-',
105099                 '┉': '-',
105100                 '┊': '|',
105101                 '┋': '|',
105102                 '┌': '+',
105103                 '┍': '+',
105104                 '┎': '+',
105105                 '┏': '+',
105106                 '┐': '+',
105107                 '┑': '+',
105108                 '┒': '+',
105109                 '┓': '+',
105110                 '└': '+',
105111                 '┕': '+',
105112                 '┖': '+',
105113                 '┗': '+',
105114                 '┘': '+',
105115                 '┙': '+',
105116                 '┚': '+',
105117                 '┛': '+',
105118                 '├': '+',
105119                 '┝': '+',
105120                 '┞': '+',
105121                 '┟': '+',
105122                 '┠': '+',
105123                 '┡': '+',
105124                 '┢': '+',
105125                 '┣': '+',
105126                 '┤': '+',
105127                 '┥': '+',
105128                 '┦': '+',
105129                 '┧': '+',
105130                 '┨': '+',
105131                 '┩': '+',
105132                 '┪': '+',
105133                 '┫': '+',
105134                 '┬': '+',
105135                 '┭': '+',
105136                 '┮': '+',
105137                 '┯': '+',
105138                 '┰': '+',
105139                 '┱': '+',
105140                 '┲': '+',
105141                 '┳': '+',
105142                 '┴': '+',
105143                 '┵': '+',
105144                 '┶': '+',
105145                 '┷': '+',
105146                 '┸': '+',
105147                 '┹': '+',
105148                 '┺': '+',
105149                 '┻': '+',
105150                 '┼': '+',
105151                 '┽': '+',
105152                 '┾': '+',
105153                 '┿': '+',
105154             };
105155
105156             var UnicodeToAsciiStream = common.Stream.extend({
105157                 constructor: function(stream) {
105158                     this.stream = stream;
105159                 },
105160                 write: function(data) {
105161                     if ( data == undefined )
105162                 return;
105163             var ascii = '';
105164             for ( var idx=0 ; idx<data.length ; idx++ )
105165             {
105166                 var el = data[idx];
105167                 if ( glyphs[el] != undefined )
105168                 ascii += glyphs[el];
105169                 else
105170                 ascii += el;
105171             }
105172             this.stream.write(ascii);
105173                 }
105174             });
105175
105176             stream = new UnicodeToAsciiStream(stream);
105177
105178         }
105179
105180         // todo: this does not handle the case where the title is wider than the table.
105181
105182         var wSrc  = options.gettext('Source').length;
105183         var wMode = options.gettext('Mode').length;
105184         var wCon  = options.gettext('Conflicts').length;
105185         var wCol  = options.gettext('Col').length;
105186         var wMrg  = options.gettext('Mrg').length;
105187         var wHereAdd = wPeerAdd = options.gettext('Add').length;
105188         var wHereMod = wPeerMod = options.gettext('Mod').length;
105189         var wHereDel = wPeerDel = options.gettext('Del').length;
105190         var wHereErr = wPeerErr = options.gettext('Err').length
105191
105192             var totLoc = 0;
105193         var totRem = 0;
105194         var totErr = 0;
105195         var totCol = 0;
105196         var totMrg = 0;
105197
105198         _.each(stats, function(value, key) {
105199             wSrc  = Math.max(wSrc, key.length);
105200             wMode = Math.max(wMode, modeStringLut[value.mode].length);
105201             wCol  = Math.max(wCol, num2str(value.conflicts).length);
105202             wMrg  = Math.max(wMrg, num2str(value.merged).length);
105203             wHereAdd = Math.max(wHereAdd, num2str(value.hereAdd).length);
105204             wPeerAdd = Math.max(wPeerAdd, num2str(value.peerAdd).length);
105205             wHereMod = Math.max(wHereMod, num2str(value.hereMod).length);
105206             wPeerMod = Math.max(wPeerMod, num2str(value.peerMod).length);
105207             wHereDel = Math.max(wHereDel, num2str(value.hereDel).length);
105208             wPeerDel = Math.max(wPeerDel, num2str(value.peerDel).length);
105209             wHereErr = Math.max(wHereErr, num2str(value.hereErr).length);
105210             wPeerErr = Math.max(wPeerErr, num2str(value.peerErr).length);
105211             totLoc += value.hereAdd + value.hereMod + value.hereDel;
105212             totRem += value.peerAdd + value.peerMod + value.peerDel;
105213             totErr += value.hereErr + value.peerErr;
105214             totCol += value.conflicts;
105215             totMrg += value.merged;
105216         });
105217
105218         // TODO: i'm 100% sure there is a python library that can do this for me...
105219
105220         if ( wCon > wCol + 3 + wMrg )
105221         {
105222             diff = wCon - ( wCol + 3 + wMrg );
105223             wCol += diff / 2;
105224             wMrg = wCon - 3 - wCol;
105225         }
105226         else
105227             wCon = wCol + 3 + wMrg;
105228
105229         if ( options.details )
105230             tWid = ( wSrc + 3 + wMode + 3
105231                     + wHereAdd + wHereMod + wHereDel + wHereErr + 9 + 3
105232                     + wPeerAdd + wPeerMod + wPeerDel + wPeerErr + 9 + 3
105233                     + wCon );
105234         else
105235             tWid = options.title ? options.title.length : 0;
105236
105237         if ( options.totals )
105238         {
105239             // TODO: oh dear. from an i18n POV, this is *horrible*!...
105240             sumlist = [];
105241             // for val, singular, plural in [
105242             _.each([
105243                     [totLoc, options.gettext('local change'), options.gettext('local changes')],
105244                     [totRem, options.gettext('remote change'), options.gettext('remote changes')],
105245                     [totErr, options.gettext('error'), options.gettext('errors')]
105246                     ], function(set) {
105247                         if ( set[0] <= 0 )
105248                 return;
105249             sumlist.push(num2str(set[0]) + ' ' + ( set[0] == 1 ? set[1] : set[2] ));
105250                     });
105251             if ( sumlist.length <= 0 )
105252                 sumlist = options.gettext('No changes');
105253             else if ( sumlist.length == 1 )
105254                 sumlist = sumlist[0];
105255             else
105256                 sumlist = ( sumlist.slice(0, -1).join(', ') + ' '
105257                         + options.gettext('and') + ' ' + sumlist[sumlist.length - 1] );
105258             if ( totMrg > 0 || totCol > 0 )
105259             {
105260                 sumlist += ': ';
105261                 if ( totMrg == 1 )
105262                     sumlist += num2str(totMrg) + ' ' + options.gettext('merge');
105263                 else if ( totMrg > 1 )
105264                     sumlist += num2str(totMrg) + ' ' + options.gettext('merges');
105265                 if ( totMrg > 0 && totCol > 0 )
105266                     sumlist += ' ' + options.gettext('and') + ' ';
105267                 if ( totCol == 1 )
105268                     sumlist += num2str(totCol) + ' ' + options.gettext('conflict');
105269                 else if ( totCol > 1 )
105270                     sumlist += num2str(totCol) + ' ' + options.gettext('conflicts');
105271             }
105272             sumlist += '.';
105273             if ( sumlist.length > tWid )
105274             {
105275                 wSrc += sumlist.length - tWid;
105276                 tWid = sumlist.length;
105277             }
105278         }
105279
105280         if ( options.title )
105281         {
105282             stream.write('┏━' + smult('━', tWid) + '━┓\n');
105283             stream.write('┃ ' + center(options.title, tWid) + ' ┃\n');
105284         }
105285
105286         if ( options.details )
105287         {
105288             if ( options.title )
105289                 stream.write('┡━'
105290                         + smult('━', wSrc)
105291                         + '━┯━'
105292                         + smult('━', wMode)
105293                         + '━┯━'
105294                         + smult('━', ( wHereAdd + wHereMod + wHereDel + wHereErr + 9 ))
105295                         + '━┯━'
105296                         + smult('━', ( wPeerAdd + wPeerMod + wPeerDel + wPeerErr + 9 ))
105297                         + '━┯━'
105298                         + smult('━', wCon)
105299                         + '━┩\n'
105300                         );
105301             else
105302                 stream.write('┌─'
105303                         + smult('─', wSrc)
105304                         + '─┬─'
105305                         + smult('─', wMode)
105306                         + '─┬─'
105307                         + smult('─', ( wHereAdd + wHereMod + wHereDel + wHereErr + 9 ))
105308                         + '─┬─'
105309                         + smult('─', ( wPeerAdd + wPeerMod + wPeerDel + wPeerErr + 9 ))
105310                         + '─┬─'
105311                         + smult('─', wCon)
105312                         + '─┐\n'
105313                         );
105314
105315             stream.write('│ ' + smult(' ', wSrc));
105316             stream.write(' │ ' + smult(' ', wMode));
105317             stream.write(' │ ' + center(options.gettext('Local'), wHereAdd + wHereMod + wHereDel + wHereErr + 9 ));
105318             stream.write(' │ ' + center(options.gettext('Remote'), wPeerAdd + wPeerMod + wPeerDel + wPeerErr + 9 ));
105319             stream.write(' │ ' + center(options.gettext('Conflicts'), wCon));
105320             stream.write(' │\n');
105321
105322             stream.write('│ ' + right(options.gettext('Source'), wSrc));
105323             stream.write(' │ ' + center(options.gettext('Mode'), wMode));
105324             stream.write(' │ ' + center(options.gettext('Add'), wHereAdd));
105325             stream.write(( options.ascii ? ' │ ' : '   ' ) + center(options.gettext('Mod'), wHereMod));
105326             stream.write(( options.ascii ? ' │ ' : '   ' ) + center(options.gettext('Del'), wHereDel));
105327             stream.write(( options.ascii ? ' │ ' : '   ' ) + center(options.gettext('Err'), wHereErr));
105328             stream.write(' │ ' + center(options.gettext('Add'), wPeerAdd));
105329             stream.write(( options.ascii ? ' │ ' : '   ' ) + center(options.gettext('Mod'), wPeerMod));
105330             stream.write(( options.ascii ? ' │ ' : '   ' ) + center(options.gettext('Del'), wPeerDel));
105331             stream.write(( options.ascii ? ' │ ' : '   ' ) + center(options.gettext('Err'), wPeerErr));
105332             stream.write(' │ ' + center(options.gettext('Col'), wCol));
105333             stream.write(( options.ascii ? ' │ ' : '   ' ) + center(options.gettext('Mrg'), wMrg));
105334             stream.write(' │\n');
105335
105336             stream.write('├─' + smult('─', wSrc)
105337                     + '─┼─' + smult('─', wMode)
105338                     + '─┼─' + smult('─', wHereAdd)
105339                     + '─┼─' + smult('─', wHereMod)
105340                     + '─┼─' + smult('─', wHereDel)
105341                     + '─┼─' + smult('─', wHereErr)
105342                     + '─┼─' + smult('─', wPeerAdd)
105343                     + '─┼─' + smult('─', wPeerMod)
105344                     + '─┼─' + smult('─', wPeerDel)
105345                     + '─┼─' + smult('─', wPeerErr)
105346                     + '─┼─' + smult('─', wCol)
105347                     + '─┼─' + smult('─', wMrg)
105348                     + '─┤\n'
105349                     );
105350
105351             var numcol = function(val, wid) {
105352                 if ( val == 0 )
105353                     return ' │ ' + center(options.ascii ? '-' : ' ', wid);
105354                 return ' │ ' + right(num2str(val), wid);
105355             };
105356
105357             var keys = _.keys(stats);
105358             // todo: sort case insensitively...
105359             keys.sort();
105360             _.each(keys, function(key) {
105361                 var stat = stats[key];
105362                 stream.write('│ ' + right(key, wSrc));
105363                 stream.write(' │ ' + center(modeStringLut[stat.mode], wMode));
105364                 stream.write(numcol(stat.hereAdd, wHereAdd));
105365                 stream.write(numcol(stat.hereMod, wHereMod));
105366                 stream.write(numcol(stat.hereDel, wHereDel));
105367                 stream.write(numcol(stat.hereErr, wHereErr));
105368                 stream.write(numcol(stat.peerAdd, wPeerAdd));
105369                 stream.write(numcol(stat.peerMod, wPeerMod));
105370                 stream.write(numcol(stat.peerDel, wPeerDel));
105371                 stream.write(numcol(stat.peerErr, wPeerErr));
105372                 stream.write(numcol(stat.conflicts, wCol));
105373                 stream.write(numcol(stat.merged, wMrg));
105374                 stream.write(' │\n');
105375             });
105376
105377             if ( options.totals )
105378                 stream.write('├─');
105379             else
105380                 stream.write('└─');
105381
105382             stream.write(smult('─', wSrc)
105383                     + '─┴─' + smult('─', wMode)
105384                     + '─┴─' + smult('─', wHereAdd)
105385                     + '─┴─' + smult('─', wHereMod)
105386                     + '─┴─' + smult('─', wHereDel)
105387                     + '─┴─' + smult('─', wHereErr)
105388                     + '─┴─' + smult('─', wPeerAdd)
105389                     + '─┴─' + smult('─', wPeerMod)
105390                     + '─┴─' + smult('─', wPeerDel)
105391                     + '─┴─' + smult('─', wPeerErr)
105392                     + '─┴─' + smult('─', wCol)
105393                     + '─┴─' + smult('─', wMrg)
105394                     );
105395
105396             if ( options.totals )
105397                 stream.write('─┤\n');
105398             else
105399                 stream.write('─┘\n');
105400         }
105401
105402         // ─━│┃┄┅┆┇┈┉┊┋┼┽┾┿
105403         // ┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛
105404         // ├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫
105405         // ┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻
105406
105407         if ( options.totals )
105408         {
105409             if ( !! options.title && ! options.details )
105410                 stream.write('┌─' + smult('─', tWid) + '─┐\n');
105411             stream.write('│ ' + center(sumlist, tWid));
105412             stream.write(' │\n');
105413             stream.write('└─' + smult('─', tWid) + '─┘\n');
105414         }
105415
105416         return;
105417
105418     };
105419
105420     return exports;
105421
105422 })();
105423
105424 module.exports = _self;
105425
105426 });
105427 define('ripple/platform/tizen/2.0/syncml-js-lib/elementtree', function (require, exports, module) {
105428 /*
105429  *  Copyright 2013 Intel Corporation
105430  *
105431  * Licensed under the Apache License, Version 2.0 (the "License");
105432  * you may not use this file except in compliance with the License.
105433  * You may obtain a copy of the License at
105434  *
105435  * http://www.apache.org/licenses/LICENSE-2.0
105436  *
105437  * Unless required by applicable law or agreed to in writing, software
105438  * distributed under the License is distributed on an "AS IS" BASIS,
105439  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
105440  * See the License for the specific language governing permissions and
105441  * limitations under the License.
105442  */
105443
105444 var utils = require('ripple/utils'),
105445     _parser,
105446     _serializer,
105447     _self;
105448
105449 function _find(query, element, type) {
105450     var querylist = query.split("/"),
105451         e = element._node,
105452         tag, i, ret;
105453
105454     if (querylist.length === 0) {
105455         return undefined;
105456     }
105457
105458     for(i = 0; i < querylist.length; i++) {
105459         tag = querylist[i];
105460         try {
105461             e = e.getElementsByTagName(tag)[0];
105462         } catch (error) {
105463             e = undefined;
105464             break;
105465         }
105466     }
105467
105468     if (e) {
105469         if (type === "TEXT") {
105470             return e.textContent;
105471         } else if (type === "NODE") {
105472             ret = {
105473                 _doc: element,
105474                 _node: e,
105475                 find: function (query) {
105476                     return _find(query, this, "NODE");
105477                 },
105478                 findtext: function (query) {
105479                     return _find(query, this, "TEXT");
105480                 },
105481                 findall: function (query) {
105482                     return _findall(query, this);
105483                 },
105484                 getchildren: function () {
105485                     return _getchildren(this);
105486                 },
105487                 append: function (node) {
105488                     this._node.appendChild(node._node);
105489                 },
105490                 getroot: function () {
105491                     return this;
105492                 }
105493             };
105494             ret.__defineSetter__("text", function (text) {
105495                 this._node.textContent = text;
105496             });
105497             ret.__defineGetter__("text", function () {
105498                 return this._node.textContent;
105499             });
105500             ret.__defineGetter__("tag", function () {
105501                 return _tag(this);
105502             });
105503             return ret;
105504         }
105505     } else {
105506         return undefined;
105507     }
105508 }
105509
105510 function _findall(query, element) {
105511     var querylist = query.split("/"),
105512         e = element._node,
105513         tag,
105514         array,
105515         tmp,
105516         ret = [],
105517         i;
105518
105519     for(i = 0; i < querylist.length - 1; i++) {
105520         tag = querylist[i];
105521         try {
105522             e = e.getElementsByTagName(tag)[0];
105523         } catch (error) {
105524             return ret;
105525         }
105526     }
105527
105528     tag = querylist[querylist.length - 1];
105529     array = e.getElementsByTagName(tag);
105530     ///return ret;
105531     for(i = 0; i < array.length; i++) {
105532         tmp = {
105533             _doc: element,
105534             _node: array[i],
105535             find: function (query) {
105536                 return _find(query, this, "NODE");
105537             },
105538             findtext: function (query) {
105539                 return _find(query, this, "TEXT");
105540             },
105541             findall: function (query) {
105542                 return _findall(query, this);
105543             },
105544             getchildren: function () {
105545                 return _getchildren(this);
105546             },
105547             append: function (node) {
105548                 this._node.appendChild(node._node);
105549             },
105550             getroot: function () {
105551                 return this;
105552             }
105553         };
105554         tmp.__defineSetter__("text", function (text) {
105555             this._node.textContent = text;
105556         });
105557         tmp.__defineGetter__("text", function () {
105558             return this._node.textContent;
105559         });
105560         tmp.__defineGetter__("tag", function () {
105561             return _tag(this);
105562         });
105563         ret.push(tmp);
105564     }
105565     return ret;
105566 }
105567
105568 function _tag(element) {
105569     var array;
105570     array = element._node.tagName.split(":");
105571     return array[array.length - 1];
105572 }
105573
105574 function _getchildren(element) {
105575     var ret = [], e, i;
105576     for (i = 0; i < element._node.childNodes.length; i++) {
105577         e = {
105578             _doc: element,
105579             _node: element._node.childNodes[i],
105580             find: function (query) {
105581                 return _find(query, this, "NODE");
105582             },
105583             findtext: function (query) {
105584                 return _find(query, this, "TEXT");
105585             },
105586             findall: function (query) {
105587                 return _findall(query, this);
105588             },
105589             getchildren: function () {
105590                 return _getchildren(this);
105591             },
105592             append: function (node) {
105593                 this._node.appendChild(node._node);
105594             },
105595             getroot: function () {
105596                 return this;
105597             }
105598         };
105599         e.__defineSetter__("text", function (text) {
105600             this._node.textContent = text;
105601         });
105602         e.__defineGetter__("text", function () {
105603             return this._node.textContent;
105604         });
105605         e.__defineGetter__("tag", function () {
105606             return _tag(this);
105607         });
105608         ret.push(e);
105609     }
105610
105611     return ret;
105612 }
105613
105614
105615 _self = (function () {
105616     ET = {};
105617
105618     ET.Element = function(name, attributes) {
105619         var element = {},
105620             doc,
105621             node;
105622
105623         doc = _parser.parseFromString("<" + name + "></" + name + ">", "text/xml");
105624         node = doc.childNodes[0];
105625         if (attributes) {
105626             utils.forEach(attributes, function (value, key) {
105627                 node.setAttribute(key, value);
105628             });
105629         }
105630
105631         element = {
105632             _doc: doc,
105633             _node: node,
105634             find: function (query) {
105635                 return _find(query, this, "NODE");
105636             },
105637             findtext: function (query) {
105638                 return _find(query, this, "TEXT");
105639             },
105640             findall: function (query) {
105641                 return _findall(query, this);
105642             },
105643             getchildren: function () {
105644                 return _getchildren(this);
105645             },
105646             append: function (node) {
105647                 this._node.appendChild(node._node);
105648             },
105649             getroot: function () {
105650                 return this;
105651             }
105652         };
105653
105654         element.__defineSetter__("text", function (text) {
105655             this._node.textContent = text;
105656         });
105657
105658         element.__defineGetter__("text", function () {
105659             return this._node.textContent;
105660         });
105661
105662         element.__defineGetter__("tag", function () {
105663             return _tag(this);
105664         });
105665
105666         return element;
105667     };
105668
105669     ET.SubElement = function(element, name, attributes) {
105670         var subElement = {},
105671             node;
105672         node = element._doc.createElement(name);
105673         if (attributes) {
105674             utils.forEach(attributes, function (value, key) {
105675                 node.setAttribute(key, value);
105676             });
105677         }
105678         element._node.appendChild(node);
105679         subElement = {
105680             _doc: element._doc,
105681             _node: node,
105682             find: function (query) {
105683                 return _find(query, this, "NODE");
105684             },
105685             findtext: function (query) {
105686                 return _find(query, this, "TEXT");
105687             },
105688             findall: function (query) {
105689                 return _findall(query, this);
105690             },
105691             getchildren: function () {
105692                 return _getchildren(this);
105693             },
105694             append: function (node) {
105695                 this._node.appendChild(node._node);
105696             },
105697             getroot: function () {
105698                 return this;
105699             }
105700         };
105701         subElement.__defineSetter__("text", function (text) {
105702             this._node.textContent = text;
105703         });
105704         subElement.__defineGetter__("text", function () {
105705             return this._node.textContent;
105706         });
105707         subElement.__defineGetter__("tag", function () {
105708             return _tag(this);
105709         });
105710
105711         return subElement;
105712     };
105713
105714     ET.tostring = function(element) {
105715         return _serializer.serializeToString(element._node);
105716     };
105717     ET.parse = function(doc) {
105718         var element = {};
105719
105720         element = {
105721             _doc: doc,
105722             _node: doc.childNodes[0],
105723             find: function (query) {
105724                 return _find(query, this, "NODE");
105725             },
105726             findtext: function (query) {
105727                 return _find(query, this, "TEXT");
105728             },
105729             findall: function (query) {
105730                 return _findall(query, this);
105731             },
105732             getchildren: function () {
105733                 return _getchildren(this);
105734             },
105735             append: function (node) {
105736                 this._node.appendChild(node._node);
105737             },
105738             getroot: function () {
105739                 return this;
105740             }
105741         };
105742         element.__defineSetter__("text", function (text) {
105743             this._node.textContent = text;
105744         });
105745         element.__defineGetter__("text", function () {
105746             return this._node.textContent;
105747         });
105748         element.__defineGetter__("tag", function () {
105749             return _tag(this);
105750         });
105751
105752         return element;
105753     };
105754
105755     ET.CdataElement = function(str) {
105756         var doc, cdata;
105757         doc = _parser.parseFromString("<data></data>", "text/xml");
105758         cdata = doc.createCDATASection(str);
105759         return cdata;
105760     };
105761
105762     return ET;
105763 })();
105764
105765 _parser = new DOMParser();
105766 _serializer = new XMLSerializer();
105767
105768 module.exports = _self;
105769
105770 });
105771 define('ripple/platform/tizen/2.0/syncml-js-lib/localadapter', function (require, exports, module) {
105772 // -*- coding: utf-8 -*-
105773 //-----------------------------------------------------------------------------
105774 // file: $Id$
105775 // lib:  syncml-js.localadapter
105776 // auth: griffin <griffin@uberdev.org>
105777 // date: 2012/10/22
105778 // copy: (C) CopyLoose 2012 UberDev <hardcore@uberdev.org>, No Rights Reserved.
105779 //-----------------------------------------------------------------------------
105780
105781 var common = require('ripple/platform/tizen/2.0/syncml-js-lib/common'),
105782     constant = require('ripple/platform/tizen/2.0/syncml-js-lib/constant'),
105783     codec = require('ripple/platform/tizen/2.0/syncml-js-lib/codec'),
105784     storage = require('ripple/platform/tizen/2.0/syncml-js-lib/storage'),
105785     remote = require('ripple/platform/tizen/2.0/syncml-js-lib/remoteadapter'),
105786     storemod = require('ripple/platform/tizen/2.0/syncml-js-lib/store'),
105787     devinfomod = require('ripple/platform/tizen/2.0/syncml-js-lib/devinfo'),
105788     adapter = require('ripple/platform/tizen/2.0/syncml-js-lib/adapter'),
105789     state = require('ripple/platform/tizen/2.0/syncml-js-lib/state'),
105790     useragent = require('ripple/platform/tizen/2.0/syncml-js-lib/useragent'),
105791     _self;
105792
105793 _self = (function () {
105794     var exports = {};
105795
105796     //---------------------------------------------------------------------------
105797     exports.LocalAdapter = adapter.Adapter.extend({
105798
105799         //-------------------------------------------------------------------------
105800         constructor: function(context, options, devInfo) {
105801
105802             // todo: is there anyway to mark attributes as read-only?...
105803
105804             //: [read-only] devInfo describes this adapter's device info and
105805             //: capabilities.
105806             this.devInfo = null;
105807
105808             //: [read-only] the device ID of this adapter.
105809             this.devID = options.devID || null;
105810
105811             //: [read-only] specifies whether this Adapter represents a local
105812             //: or remote peer.
105813             this.isLocal = true;
105814
105815             //: [read-only] human-facing name of this adapter
105816             this.displayName = options.displayName || null;
105817
105818             //: [read-only] the adapter-wide default value of the maximum
105819             //: message size.
105820             this.maxMsgSize = options.maxMsgSize || null;
105821
105822             //: [read-only] the adapter-wide default value of the maximum
105823             //: object size.
105824             this.maxObjSize = options.maxObjSize || null;
105825
105826             //: [read-only] specifies default conflict resolution policy for
105827             //: this adapter. if undefined, defaults to constant.POLICY_ERROR.
105828             this.conflictPolicy = options.conflictPolicy || constant.POLICY_ERROR;
105829
105830             // --- private attributes
105831             this.id       = options.id || common.makeID();
105832             this._c       = context;
105833             // TODO: use _.pick() for these options...
105834             this._options = options;
105835             this._devInfo = devInfo;
105836             this._model   = null;
105837             this._stores  = {};
105838             this._peers   = [];
105839         },
105840
105841             //-------------------------------------------------------------------------
105842             _getModel: function() {
105843                 return this._model;
105844             },
105845
105846             //-------------------------------------------------------------------------
105847             setDevInfo: function(devInfo, cb) {
105848                 if ( this._model == undefined )
105849                     this._model = {
105850                         id              : this.id,
105851                         displayName     : this.displayName,
105852                         maxMsgSize      : this.maxMsgSize,
105853                         maxObjSize      : this.maxObjSize,
105854                         conflictPolicy  : this.conflictPolicy,
105855                         devInfo         : null,
105856                         stores          : [],
105857                         peers           : [],
105858                         isLocal         : 1
105859                     };
105860
105861                 var di = new devinfomod.DevInfo(this, devInfo);
105862                 di._updateModel(_.bind(function(err) {
105863                     if ( err )
105864                         return cb(err);
105865
105866                     this._model.devID = this._model.devInfo.devID;
105867                     this.devID        = this._model.devInfo.devID;
105868                     this.devInfo      = di;
105869
105870                 // since the local devinfo has changed, we need to ensure that
105871                 // we rebroadcast it (in case there are any affects...), thus
105872                 // resetting all anchors.
105873                 // TODO: this seems a little heavy-handed, since this will force
105874                 //       a slow-sync for each datastore. is that really the best
105875                 //       thing?...
105876                 this._resetAllAnchors();
105877
105878                 this._save(this._c._txn(), cb);
105879
105880                 }, this));
105881             },
105882
105883             //-------------------------------------------------------------------------
105884             _resetAllAnchors: function() {
105885                 _.each(this._model.peers, function(peer) {
105886                     _.each(peer.stores, function(store) {
105887                         if ( ! store.binding )
105888                         return;
105889                     store.binding.localAnchor  = null;
105890                     store.binding.remoteAnchor = null;
105891                     });
105892                 });
105893             },
105894
105895             //-------------------------------------------------------------------------
105896             getPeers: function() {
105897                 return this._peers;
105898             },
105899
105900             //-------------------------------------------------------------------------
105901             addPeer: function(peerInfo, cb) {
105902                 var self = this;
105903
105904                 // TODO: if there is already a peer for the specified URL, then
105905                 //       we may have a problem!...
105906
105907                 // todo: if we are adding a peer to an adapter that already has
105908                 //       non-client peers, then we may have a problem!...
105909                 //       (this is only true while syncml-js is not capable of truly
105910                 //       operating in peer-to-peer mode)
105911
105912                 var peer = new remote.RemoteAdapter(this, peerInfo);
105913                 peer._updateModel(function(err) {
105914                     if ( err )
105915                     return cb(err);
105916                 self._peers.push(peer);
105917                 cb(null, peer);
105918                 });
105919             },
105920
105921             //-------------------------------------------------------------------------
105922             save: function(cb) {
105923                 this._save(this._c._txn(), cb);
105924             },
105925
105926             //-------------------------------------------------------------------------
105927             _save: function(dbtxn, cb) {
105928                 var self = this;
105929                 self._updateModel(function(err) {
105930                     if ( err )
105931                     return cb(err);
105932                 storage.put(dbtxn.objectStore('adapter'), self._model, cb);
105933                 });
105934             },
105935
105936             //-------------------------------------------------------------------------
105937             _updateModel: function(cb) {
105938                 var self = this;
105939                 var model = self._model;
105940                 model.displayName    = self.displayName;
105941                 model.devID          = self.devID;
105942                 model.maxMsgSize     = self.maxMsgSize;
105943                 model.maxObjSize     = self.maxObjSize;
105944                 model.conflictPolicy = self.conflictPolicy;
105945                 model.isLocal        = 1;
105946                 common.cascade([
105947                         // update the devInfo model
105948                         function(cb) {
105949                             if ( ! self.devInfo )
105950                     return cb();
105951                 return self.devInfo._updateModel(cb);
105952                         },
105953                         // update the stores model
105954                         function(cb) {
105955                             model.stores = [];
105956                             common.cascade(_.values(self._stores), function(store, cb) {
105957                                 store._updateModel(cb);
105958                             }, cb);
105959                         },
105960
105961                         // update the peers model
105962                         function(cb) {
105963                             // NOTE: unlike stores, which can completely regenerate the
105964                             //       model based on the class, the peers store binding
105965                             //       and routing info is only in the model, so cannot be
105966                             //       completely deleted...
105967                             common.cascade(self._peers, function(peer, cb) {
105968                                 peer._updateModel(cb);
105969                             }, cb);
105970                         }
105971
105972                 ], cb);
105973             },
105974
105975             //-------------------------------------------------------------------------
105976             _load: function(cb) {
105977                 var self = this;
105978
105979                 // TODO: if options specifies a devID/name/etc, use that...
105980
105981                 storage.getAll(
105982                     this._c,
105983                     this._c._txn().objectStore('adapter').index('isLocal'),
105984                     {only: 1},
105985                     function(err, adapters) {
105986                         if ( err ) {
105987                             return cb(err);
105988                         }
105989                         if ( adapters.length > 1 )
105990                             return cb('multiple local adapters defined - specify which devID to load');
105991                         if ( adapters.length <= 0 )
105992                             return cb(null, self);
105993                         self._loadModel(adapters[0], function(err) {
105994                             if ( err )
105995                                 return cb(err);
105996                             return cb(null, self);
105997                         });
105998                     }
105999                 );
106000             },
106001
106002             //-------------------------------------------------------------------------
106003             _loadModel: function(model, cb) {
106004                 var self = this;
106005                 self._model         = model;
106006                 self.displayName    = model.displayName;
106007                 self.devID          = model.devID;
106008                 self.maxMsgSize     = model.maxMsgSize;
106009                 self.maxObjSize     = model.maxObjSize;
106010                 self.conflictPolicy = model.conflictPolicy;
106011                 common.cascade([
106012                         // load device info
106013                         function(cb) {
106014                             var di = new devinfomod.DevInfo(self, self._model.devInfo);
106015                             di._load(function(err) {
106016                                 if ( err )
106017                                 return cb(err);
106018                             self.devInfo = di;
106019                             cb();
106020                             });
106021                         },
106022                         // load stores
106023                         function(cb) {
106024                             common.cascade(model.stores, function(e, cb) {
106025                                 var store = new storemod.Store(self, e);
106026                                 store._load(function(err) {
106027                                     if ( err )
106028                                     return cb(err);
106029                                 self._stores[store.uri] = store;
106030                                 return cb();
106031                                 });
106032                             }, cb);
106033                         },
106034                         // load peers
106035                         function(cb) {
106036                             var remotes = _.filter(model.peers, function(e) {
106037                                 return ! e.isLocal;
106038                             });
106039                             self._peers = [];
106040                             common.cascade(remotes, function(e, cb) {
106041                                 var peer = new remote.RemoteAdapter(self, e);
106042                                 peer._load(function(err) {
106043                                     if ( err )
106044                                     return cb(err);
106045                                 self._peers.push(peer);
106046                                 return cb();
106047                                 });
106048                             }, cb);
106049                         }
106050                 ], cb);
106051             },
106052
106053             //-------------------------------------------------------------------------
106054             sync: function(peer, mode, options, cb) {
106055                 // `options` is optional and can have the following properties:
106056                 //   * `ua`
106057
106058                 // TODO: initialize a new context transaction?...
106059                 // todo: or perhaps add a new session.txn?...
106060
106061                 if ( cb == undefined && _.isFunction(options) )
106062                 {
106063                     cb = options;
106064                     options = {};
106065                 }
106066                 options = options || {};
106067
106068                 var self = this;
106069                 var discover = ( mode == constant.SYNCTYPE_DISCOVER );
106070                 if ( discover )
106071                     mode = constant.SYNCTYPE_SLOW_SYNC;
106072
106073                 if ( ! _.find(self._peers, function(p) { return p === peer; }) )
106074                     return cb(new common.InvalidAdapter('invalid peer for adapter'));
106075                 if ( mode != constant.SYNCTYPE_AUTO )
106076                 {
106077                     mode = common.synctype2alert(mode);
106078                     if ( ! mode )
106079                         return cb(new common.TypeError('invalid synctype'));
106080                 }
106081                 if ( ! self.devInfo )
106082                     return cb(new common.InvalidAdapter('cannot synchronize adapter as client: invalid devInfo'));
106083
106084                 var session = state.makeSession({
106085                     context  : self._c,
106086                     ua       : new useragent.UserAgentMultiplexer([options.ua, self._c.ua]),
106087                     txn      : _.bind(self._c._txn, self._c),
106088                     adapter  : self,
106089                     peer     : peer,
106090                     isServer : false,
106091                     discover : discover,
106092                     info     : state.makeSessionInfo({
106093                         id       : ( peer.lastSessionID || 0 ) + 1,
106094                     msgID    : 1,
106095                     codec    : self._c.codec,
106096                     mode     : mode
106097                     })
106098                 });
106099
106100                 session.send = function(contentType, data, cb) {
106101                     session.peer.sendRequest(session, contentType, data, function(err, response) {
106102                         if ( err )
106103                         return cb(err);
106104                     // todo: allow the client to force the server to authorize itself as well...
106105                     self._receive(session, response, null, cb);
106106                     });
106107                 };
106108
106109                 // TODO: should i do a router.calculate() at this point?
106110                 //       the reason is that if there was a sync, then a
106111                 //       .setRoute(), then things may have changed...
106112                 //       corner-case, yes... but still valid.
106113
106114                 var failed = 0;
106115
106116                 var startSession = function() {
106117                     session.context.protocol.initialize(session, null, function(err, commands) {
106118                         if ( err )
106119                         return cb(err);
106120                     self._transmit(session, commands, function(err) {
106121                         if ( err )
106122                     {
106123                         if ( ! ( err instanceof common.InvalidCredentials )
106124                             && ! ( err instanceof common.CredentialsRequired ) )
106125                             return cb(err);
106126                         if ( err instanceof common.InvalidCredentials )
106127                         failed += 1;
106128                     if ( failed > 100 )
106129                     {
106130                         return cb(err);
106131                     }
106132                     var credErr = err;
106133                     var uaEvent = {
106134                         session : session,
106135                         auth    : err.auth,
106136                         count   : failed
106137                     };
106138                     return session.ua.fetchCredentials(uaEvent, function(err, auth) {
106139                         if ( err )
106140                         return cb(err);
106141                     if ( ! auth )
106142                         return cb(credErr);
106143                     if ( auth.persist )
106144                     {
106145                         session.peer.auth = auth.type;
106146                         session.peer.username = auth.username;
106147                         session.peer.password = auth.password;
106148                     }
106149                     else
106150                         session.auth = auth;
106151                     // todo: should i just create a new session?...
106152                     session.info.id += 1;
106153                     session.info.msgID = 1;
106154                     return startSession();
106155                     });
106156                     }
106157                     self._save(session.txn(), function(err) {
106158                         if ( err )
106159                         return cb(err);
106160                     return cb(null, self._session2stats(session));
106161                     });
106162                     });
106163                     });
106164                 };
106165
106166                 session.context.synchronizer.initStoreSync(session, function(err) {
106167                     if ( err )
106168                     return cb(err);
106169                 startSession();
106170                 });
106171
106172             },
106173
106174             //-------------------------------------------------------------------------
106175             _session2stats: function(session) {
106176                 var ret = {};
106177                 _.each(_.values(session.info.dsstates), function(ds) {
106178                     var stats = _.clone(ds.stats);
106179                     stats.mode = common.alert2synctype(ds.mode);
106180                     if ( ds.action == 'error' && ds.error )
106181                     stats.error = ds.error;
106182                 ret[ds.uri] = stats;
106183                 });
106184                 return ret;
106185             },
106186
106187             //-------------------------------------------------------------------------
106188             _transmit: function(session, commands, cb) {
106189                 var self = this;
106190                 if ( session.info.msgID > 20 )
106191                     return cb('too many client/server messages');
106192                 session.context.protocol.negotiate(session, commands, function(err, commands) {
106193                     if ( err )
106194                     return cb(err);
106195                 if ( session.context.protocol.isComplete(session, commands) )
106196                 {
106197                     // we're done! store all the anchors and session IDs and exit...
106198                     var pmodel = session.peer._getModel();
106199                     if ( ! pmodel )
106200                     return cb('unexpected error: could not locate this peer in local adapter');
106201                 _.each(session.info.dsstates, function(ds, uri) {
106202                     var pstore = _.find(pmodel.stores, function(s) { return s.uri == ds.peerUri; });
106203                     if ( ! pstore )
106204                     return cb('unexpected error: could not locate bound peer store in local adapter');
106205                 pstore.binding.localAnchor  = ds.nextAnchor;
106206                 pstore.binding.remoteAnchor = ds.peerNextAnchor;
106207                 });
106208                 session.peer.lastSessionID = session.info.id;
106209                 pmodel.lastSessionID       = session.info.id;
106210                 return cb();
106211                 }
106212                 session.context.protocol.produce(session, commands, function(err, tree) {
106213                     if ( err )
106214                     return cb(err);
106215                 codec.Codec.autoEncode(tree, session.info.codec, function(err, contentType, data) {
106216                     if ( err )
106217                     return cb(err);
106218                 // update the session with the last request commands so
106219                 // that when we receive the response package, it can be
106220                 // compared against that.
106221                 // TODO: should that only be done on successful transmit?...
106222                 session.info.lastCommands = commands;
106223                 session.send(contentType, data, function(err) {
106224                     if ( err )
106225                     return cb(err);
106226                 cb();
106227                 });
106228                 })
106229                 });
106230                 });
106231             },
106232
106233             //-------------------------------------------------------------------------
106234             authorize: function(request, sessionInfo, authorize, cb) {
106235                 var self = this;
106236                 var ct   = request.headers['Content-Type'];
106237                 codec.Codec.autoDecode(ct, request.body, function(err, xtree, codecName) {
106238                     if ( err )
106239                     return cb(err);
106240                 self._c.protocol.authorize(xtree, null, authorize, cb);
106241                 });
106242             },
106243
106244             //-------------------------------------------------------------------------
106245             getTargetID: function(request, sessionInfo, cb) {
106246                 var self = this;
106247                 var ct   = request.headers['Content-Type'];
106248                 codec.Codec.autoDecode(ct, request.body, function(err, xtree, codecName) {
106249                     if ( err )
106250                     return cb(err);
106251                 return cb(null, self._c.protocol.getTargetID(xtree));
106252                 });
106253             },
106254
106255             //-------------------------------------------------------------------------
106256             handleRequest: function(request, sessionInfo, authorize, response, options, cb) {
106257
106258                 // TODO: initialize a new context transaction?...
106259                 // todo: or perhaps add a new session.txn?...
106260
106261                 if ( cb == undefined && _.isFunction(options) )
106262                 {
106263                     cb = options;
106264                     options = {};
106265                 }
106266                 options = options || {};
106267
106268                 var self = this;
106269                 var session = state.makeSession({
106270                     context  : self._c,
106271                     ua       : new useragent.UserAgentMultiplexer([options.ua, self._c.ua]),
106272                     txn      : _.bind(self._c._txn, self._c),
106273                     adapter  : self,
106274                     peer     : null,
106275                     isServer : true,
106276                     info     : sessionInfo
106277                 });
106278                 session.send = response;
106279                 this._receive(session, request, authorize, function(err, stats) {
106280                     if ( err )
106281                     return cb(err);
106282                 self._save(session.txn(), function(err) {
106283                     if ( err )
106284                     return cb(err);
106285                 return cb(null, self._session2stats(session));
106286                 });
106287                 });
106288             },
106289
106290             //-------------------------------------------------------------------------
106291             _receive: function(session, request, authorize, cb) {
106292                 var self = this;
106293                 if ( ! session.isServer )
106294                 {
106295                     session.info.lastMsgID = session.info.msgID;
106296                     session.info.msgID += 1;
106297                 }
106298                 var ct = request.headers['Content-Type'];
106299                 codec.Codec.autoDecode(ct, request.body, function(err, xtree, codecName) {
106300                     if ( err )
106301                     return cb(err);
106302                 session.info.codec = codecName;
106303                 var do_authorize = ( ! authorize ) ? common.noop : function(cb) {
106304                     session.context.protocol.authorize(xtree, null, authorize, function(err) {
106305                         return cb(err);
106306                     });
106307                 };
106308                 do_authorize(function(err) {
106309                     if ( err )
106310                     return cb(err);
106311                 session.context.protocol.consume(
106312                     session, session.info.lastCommands, xtree,
106313                     function(err, commands) {
106314                         if ( err ) {
106315                             return cb(err);
106316                         }
106317                         if ( session.discover && session.peer.devInfo )
106318                     return cb(null, self._session2stats(session));
106319                 self._transmit(session, commands, function(err) {
106320                     if ( err )
106321                     return cb(err);
106322                 if ( ! session.isServer )
106323                     return cb();
106324                 self._save(session.txn(), function(err) {
106325                     if ( err )
106326                     return cb(err);
106327                 return cb(null, self._session2stats(session));
106328                 });
106329                 });
106330                     }
106331                 );
106332                 });
106333                 })
106334             },
106335
106336     });
106337
106338     return exports;
106339
106340 })();
106341
106342 module.exports = _self;
106343
106344 });
106345 define('ripple/platform/tizen/2.0/syncml-js-lib/protocol', function (require, exports, module) {
106346 // -*- coding: utf-8 -*-
106347 //-----------------------------------------------------------------------------
106348 // file: $Id$
106349 // lib:  syncml-js.protocol
106350 // auth: griffin <griffin@uberdev.org>
106351 // date: 2012/11/04
106352 // copy: (C) CopyLoose 2012 UberDev <hardcore@uberdev.org>, No Rights Reserved.
106353 //-----------------------------------------------------------------------------
106354
106355 var db = require('ripple/db'),
106356     common = require('ripple/platform/tizen/2.0/syncml-js-lib/common'),
106357     constant = require('ripple/platform/tizen/2.0/syncml-js-lib/constant'),
106358     devinfo = require('ripple/platform/tizen/2.0/syncml-js-lib/devinfo'),
106359     state = require('ripple/platform/tizen/2.0/syncml-js-lib/state'),
106360     base64 = require('ripple/platform/tizen/2.0/syncml-js-lib/base64'),
106361     ET = require('ripple/platform/tizen/2.0/syncml-js-lib/elementtree'),
106362     _firstflag = false,
106363     changednum, _counts;
106364
106365 var _self = (function () {
106366
106367     var exports = {};
106368
106369     //---------------------------------------------------------------------------
106370     var getError = function(xnode) {
106371         var ret = {
106372             message: xnode.findtext('Item/Data')
106373         };
106374         try{
106375             var xerr  = xnode.find('Error');
106376         }catch(e){
106377             var xerr = null;
106378         }
106379         if ( ! xerr )
106380 {
106381     try{
106382         var xerr  = xnode.find('Item/Error');
106383     }catch(e){
106384         var xerr = null;
106385     }
106386 }
106387 if ( ! xerr )
106388 {
106389     if ( ! ret.message )
106390         return null;
106391     return ret;
106392 }
106393 ret.code    = xerr.findtext('Code');
106394 ret.message = xerr.findtext('Message');
106395 ret.trace   = xerr.findtext('Trace');
106396 return ret;
106397 }
106398
106399 //---------------------------------------------------------------------------
106400 var badStatus = function(xnode, kls, attrs) {
106401     if ( ! kls )
106402         kls = common.ProtocolError;
106403     var code  = xnode.findtext('Data');
106404     var cname = xnode.findtext('Cmd');
106405     var msg   = null;
106406     if ( kls == common.ProtocolError )
106407         msg = 'unexpected status code ' + code + ' for command "' + cname + '"';
106408     else
106409         msg = 'received status code ' + code + ' for command "' + cname + '"';
106410     var error = getError(xnode);
106411     if ( error )
106412     {
106413         if ( error.code )
106414             msg += ': [' + error.code + '] ' + error.message;
106415         else
106416             msg += ': ' + error.message;
106417     }
106418     return new kls(msg, undefined, attrs)
106419 };
106420
106421 //---------------------------------------------------------------------------
106422 exports.getError  = getError;
106423 exports.badStatus = badStatus;
106424
106425 //---------------------------------------------------------------------------
106426 exports.Protocol = common.Base.extend({
106427
106428     //-------------------------------------------------------------------------
106429     constructor: function(options) {
106430     },
106431
106432     //-------------------------------------------------------------------------
106433     authorize: function(xtree, uri, authorize, cb) {
106434
106435         // TODO: if this session has been authorized before, don't call authorize
106436         //       ie.:
106437         //         if ( session.info.authAccepted )
106438         //           return cb();
106439         //       BUT this requires the session object... oops.
106440
106441         if ( ! authorize )
106442     authorize = function(uri, data, cb) { return cb(null, data); };
106443 if ( xtree.tag != 'SyncML' )
106444     throw new common.ProtocolError('root element was not "SyncML"');
106445 var xcred = xtree.find('SyncHdr/Cred');
106446 if ( ! xcred )
106447     return authorize(uri, null, cb);
106448 var data = xcred.findtext('Data');
106449 var authtype = xcred.findtext('Meta/Type');
106450 var format = xcred.findtext('Meta/Format');
106451 if ( format == constant.FORMAT_B64 )
106452     data = base64.decode(data);
106453 else if ( format )
106454     throw new common.UnknownFormatType(format);
106455 switch ( authtype )
106456 {
106457     case constant.NAMESPACE_AUTH_BASIC:
106458         {
106459             data = common.splitn(data, ':', 1);
106460             return authorize(uri, {
106461                 auth:     constant.NAMESPACE_AUTH_BASIC,
106462                    username: data[0],
106463                    password: data[1]
106464             }, cb);
106465         }
106466     case constant.NAMESPACE_AUTH_MD5:
106467         {
106468             return authorize(uri, {
106469                 auth:   constant.NAMESPACE_AUTH_BASIC,
106470                    digest: data
106471             }, cb);
106472         }
106473     default:
106474         {
106475             return cb(new common.UnknownAuthType(
106476                         'unknown/unimplemented auth type "' + authtype + '"'));
106477         }
106478 }
106479 },
106480
106481     //-------------------------------------------------------------------------
106482     getTargetID: function(xtree) {
106483         if ( xtree.tag != 'SyncML' )
106484             throw new common.ProtocolError('root element was not "SyncML"');
106485         // todo: do more validity checks?...
106486         return xtree.findtext('SyncHdr/Target/LocURI');
106487     },
106488
106489     //-------------------------------------------------------------------------
106490     isComplete: function(session, commands) {
106491         return (! session.isServer
106492                 && commands.length == 3
106493                 && commands[0].name == constant.CMD_SYNCHDR
106494                 && commands[1].name == constant.CMD_STATUS
106495                 && commands[1].statusOf == constant.CMD_SYNCHDR
106496                 && commands[1].statusCode == constant.STATUS_OK
106497                 && commands[2].name == constant.CMD_FINAL
106498                );
106499     },
106500
106501     //----------------------<---------------------------------------------------
106502     initialize: function(session, xtree, cb) {
106503         var cmd = state.makeCommand({
106504             name        : constant.CMD_SYNCHDR,
106505         cmdID       : 0,
106506         version     : constant.SYNCML_VERSION_1_2,
106507         source      : session.info.effectiveID || session.adapter.devID,
106508         sourceName  : session.adapter.displayName,
106509         respUri     : session.isServer ? session.info.returnUrl : null
106510         });
106511
106512         var checkPeer = ( ! session.isServer ) ? function(cb) {
106513             if ( ! xtree )
106514                 return cb();
106515             var xhdr = xtree.find('SyncHdr');
106516             // todo: check peer id...
106517             if ( session.info.id != common.int(xhdr.findtext('SessionID')) )
106518             {
106519                 return cb(new common.ProtocolError('session ID mismatch "'
106520                             + xhdr.findtext('SessionID')
106521                             + '" (expected: ' + session.info.id + ')'));
106522                         }
106523                         // todo: check message id...
106524                         cb();
106525                         } : function(cb) {
106526                             var xhdr = xtree.find('SyncHdr');
106527                             var peerID = xhdr.findtext('Source/LocURI');
106528                             if ( session.info.peerID && session.info.peerID != peerID )
106529                 {
106530                     return cb(new common.ProtocolError('unexpected peer ID "' + peerID + '"'));
106531                 }
106532                 if ( session.peer && session.peer.devID != peerID )
106533                 {
106534                     return cb(new common.ProtocolError('unacceptable peer ID "' + peerID + '"'));
106535                 }
106536                 session.info.peerID = peerID;
106537                 // check that no session swapping occurred
106538                 if ( session.info.id != undefined
106539                     && session.info.id != common.int(xhdr.findtext('SessionID')) )
106540                 {
106541                     return cb(new common.ProtocolError('session ID mismatch "'
106542                                 + xhdr.findtext('SessionID')
106543                                 + '" (expected: ' + session.info.id + ')'));
106544                             }
106545                             session.info.id     = common.int(xhdr.findtext('SessionID'));
106546                             session.info.msgID  = common.int(xhdr.findtext('MsgID'));
106547                             if ( session.peer && session.peer.devID == peerID )
106548                             return cb();
106549                             // TODO: i should delete unused peers here... ie. anything that
106550                             //       hasn't been used in some configurable number of seconds,
106551                             //       which should probably default to something like a month...
106552                             session.peer = _.find(session.adapter.getPeers(), function(peer) {
106553                                 return ( peer.devID == peerID );
106554                             });
106555                             if ( session.peer )
106556                             {
106557                                 return cb();
106558                             }
106559                             var peerInfo = {
106560                                 devID:        peerID,
106561                            displayName:  xhdr.findtext('Source/LocName'),
106562                            maxMsgSize:   common.int(xhdr.findtext('Meta/MaxMsgSize')),
106563                            maxObjSize:   common.int(xhdr.findtext('Meta/MaxObjSize'))
106564                             };
106565                             session.adapter.addPeer(peerInfo, function(err, peer) {
106566                                 if ( err )
106567                                 return cb(err);
106568                             session.peer = peer;
106569                             return cb();
106570                             });
106571                         };
106572
106573         checkPeer(function(err) {
106574
106575             session.info.cmdID        = 0;
106576             session.info.pendingMsgID = ( session.isServer
106577                 ? session.info.msgID
106578                 : session.info.lastMsgID );
106579             cmd.sessionID   = session.info.id;
106580             cmd.msgID       = session.info.msgID;
106581             cmd.target      = session.peer ? session.peer.devID || null : null;
106582             cmd.targetName  = session.peer ? session.peer.displayName || null : null;
106583             cmd.auth        = session.auth
106584             ? session.auth.type
106585             : session.peer
106586             ? session.peer.auth
106587             : null;
106588
106589         if ( err )
106590             return cb(err, [cmd]);
106591
106592         if ( cmd.msgID == 1 )
106593         {
106594             // NOTE: normally, the "server" would not send this info. however, in
106595             //       the syncml-js world where it is much more peer-oriented
106596             //       instead of client/server, i send this as well... the
106597             //       idea being, if two "client" peers are communicating in
106598             //       the event of server unavailability, then they may need
106599             //       to know each-others limitations...
106600             cmd.maxMsgSize = common.getMaxMemorySize(session.context);
106601             cmd.maxObjSize = common.getMaxMemorySize(session.context);
106602             ///cmd.maxMsgSize = 150000;
106603             ///cmd.maxObjSize = 4000000;
106604         }
106605         cb(null, [cmd]);
106606         });
106607     },
106608
106609     //-------------------------------------------------------------------------
106610     negotiate: function(session, commands, cb) {
106611         // // todo: determine why i decided to clone the commands...
106612         // commands = _.clone(commands);
106613
106614         if ( commands.length > 0 && _.last(commands).name == constant.CMD_FINAL )
106615             return cb(null, commands);
106616
106617         if ( commands.length > 0
106618                 && _.last(commands).name == constant.CMD_ALERT
106619                 && _.last(commands).data == constant.STATUS_NEXT_MESSAGE )
106620             // todo: should i add a "final" here?...
106621             // commands.push(state.makeCommand({name: constant.CMD_FINAL}));
106622             return cb(null, commands);
106623
106624         var createDevInfoCommands = function(commands, cb) {
106625             // todo: this flag is crap. instead, the local devInfo should have
106626             //       a record of which sessionID lead to the recording, and
106627             //       base it on that. maybe timestamp too... (but it must be
106628             //       in the minutes, just in case...)
106629             session.info.gotinfo = true;
106630             if ( ! session.discover )
106631             {
106632                 commands.push(state.makeCommand({
106633                     name       : constant.CMD_PUT,
106634                     cmdID      : session.nextCmdID(),
106635                     type       : constant.TYPE_SYNCML_DEVICE_INFO + '+' + session.info.codec,
106636                     source     : './' + constant.URI_DEVINFO_1_2,
106637                     data       : session.adapter.devInfo.toSyncML(constant.SYNCML_DTD_VERSION_1_2,
106638                         _.values(session.adapter._stores))
106639                 }));
106640             }
106641             commands.push(state.makeCommand({
106642                 name     : constant.CMD_GET,
106643                 cmdID    : session.nextCmdID(),
106644                 type     : constant.TYPE_SYNCML_DEVICE_INFO + '+' + session.info.codec,
106645                 target   : './' + constant.URI_DEVINFO_1_2
106646             }));
106647             return cb(null, commands);
106648         };
106649
106650         var createCommands = function(commands, cb) {
106651             // request the remote device info if not currently available or
106652             // in discover mode or explicitly re-exchanging it (paranoid mode)
106653             var putget = false;
106654             if ( !! session.discover )
106655             {
106656                 return createDevInfoCommands(commands, cb);
106657             }
106658             if ( ! session.peer.devInfo )
106659             {
106660                 var uaEvent = {session: session};
106661                 return session.ua.acceptDevInfoSwap(uaEvent, function(err) {
106662                     if ( err )
106663                 {
106664                     return cb(err);
106665                 }
106666                 return createDevInfoCommands(commands, cb);
106667                 });
106668             }
106669             if ( ! session.context.config.trustDevInfo && ! session.info.gotinfo )
106670             {
106671                 return createDevInfoCommands(commands, cb);
106672             }
106673             // NOTE: in the current handling of "trustDevInfo", i am doing a
106674             //       potentially unnecessary extra request/response phase to
106675             //       confirm that the devInfo has not changed... i *could*
106676             //       issue the put/get as well as the alert, *assuming* that
106677             //       no devInfo is going to change...
106678             return session.context.synchronizer.actions(session, commands, cb);
106679         };
106680
106681         return createCommands(commands, function(err, commands) {
106682             if ( err )
106683             return cb(err);
106684         //Hack: Memotoo service need to send alert command at the beging
106685         var args, tmp;
106686         args = db.retrieveObject("syncml-alert-args");
106687         tmp = {
106688             name       : constant.CMD_ALERT,
106689                cmdID      : session.nextCmdID(),
106690                data       : args.data,
106691                source     : args.source,
106692                target     : args.target,
106693                maxObjSize : "4000000"
106694         };
106695         if (args.lastAnchor) {
106696             tmp.lastAnchor = args.lastAnchor;
106697         }
106698
106699         if (args.nextAnchor) {
106700             tmp.nextAnchor = args.nextAnchor;
106701         }
106702         _firstflag = db.retrieveObject("syncml-first-flag");
106703         if( !_firstflag) {
106704             commands.push(state.makeCommand(tmp));
106705             db.saveObject("syncml-first-flag", true);
106706         }
106707         commands.push(state.makeCommand({name: constant.CMD_FINAL}));
106708         cb(null, commands);
106709         });
106710     },
106711
106712     //-------------------------------------------------------------------------
106713     // NOTE: `produce` is equivalent to the `pysyncml.protocol.commands2tree`...
106714     // Consumes state.Command commands and converts them to an ET protocol tree
106715     produce: function(session, commands, cb) {
106716
106717         if ( commands.length <= 0 )
106718             return cb('protocol.produce received empty commands');
106719
106720         var hdrcmd = commands[0];
106721         commands = _.rest(commands, 1);
106722
106723         if ( hdrcmd.name != constant.CMD_SYNCHDR )
106724             return cb('unexpected first command "' + hdrcmd.name + '"');
106725
106726         if ( hdrcmd.version != constant.SYNCML_VERSION_1_2 )
106727             return cb('unsupported SyncML version "' + hdrcmd.version + '"');
106728
106729         var xsync = ET.Element(constant.NODE_SYNCML);
106730         var xhdr  = ET.SubElement(xsync, hdrcmd.name);
106731         if ( hdrcmd.version == constant.SYNCML_VERSION_1_2 )
106732         {
106733             ET.SubElement(xhdr, 'VerDTD').text = constant.SYNCML_DTD_VERSION_1_2;
106734             ET.SubElement(xhdr, 'VerProto').text = hdrcmd.version;
106735         }
106736
106737         ET.SubElement(xhdr, 'SessionID').text = hdrcmd.sessionID;
106738         ET.SubElement(xhdr, 'MsgID').text = hdrcmd.msgID;
106739         var xsrc = ET.SubElement(xhdr, 'Source');
106740         ET.SubElement(xsrc, 'LocURI').text = hdrcmd.source;
106741         if ( hdrcmd.sourceName )
106742             ET.SubElement(xsrc, 'LocName').text = hdrcmd.sourceName;
106743         var xtgt = ET.SubElement(xhdr, 'Target');
106744         ET.SubElement(xtgt, 'LocURI').text = hdrcmd.target;
106745         if ( hdrcmd.targetName )
106746             ET.SubElement(xtgt, 'LocName').text = hdrcmd.targetName;
106747         if ( hdrcmd.respUri )
106748             ET.SubElement(xhdr, 'RespURI').text = hdrcmd.respUri;
106749
106750         if ( hdrcmd.auth && ! session.info.authAccepted )
106751         {
106752             // TODO: implement other auth schemes...
106753             if ( hdrcmd.auth != constant.NAMESPACE_AUTH_BASIC )
106754                 return cb('auth method "' + hdrcmd.auth + '" not implemented');
106755
106756             if ( hdrcmd.auth == constant.NAMESPACE_AUTH_BASIC )
106757             {
106758                 var xcred = ET.SubElement(xhdr, 'Cred');
106759                 var xmeta = ET.SubElement(xcred, 'Meta');
106760                 ET.SubElement(xmeta, 'Format', {'xmlns': constant.NAMESPACE_METINF}).text = 'b64';
106761                 ET.SubElement(xmeta, 'Type', {'xmlns': constant.NAMESPACE_METINF}).text   = hdrcmd.auth;
106762                 ET.SubElement(xcred, 'Data').text = base64.encode(
106763                         ( session.auth ? session.auth.username : session.peer.username )
106764                         + ':' + ( session.auth ? session.auth.password : session.peer.password ) );
106765             }
106766
106767         }
106768         if ( hdrcmd.maxMsgSize || hdrcmd.maxObjSize )
106769         {
106770             var xmeta = ET.SubElement(xhdr, 'Meta');
106771             if ( hdrcmd.maxMsgSize )
106772                 ET.SubElement(xmeta, 'MaxMsgSize',
106773                         {'xmlns': constant.NAMESPACE_METINF}).text = hdrcmd.maxMsgSize;
106774             if ( hdrcmd.maxObjSize )
106775                 ET.SubElement(xmeta, 'MaxObjSize',
106776                         {'xmlns': constant.NAMESPACE_METINF}).text = hdrcmd.maxObjSize;
106777         }
106778
106779         var xbody = ET.SubElement(xsync, constant.NODE_SYNCBODY);
106780
106781         for ( var idx=0 ; idx<commands.length ; idx++ )
106782         {
106783             var cmd  = commands[idx];
106784             var xcmd = ET.SubElement(xbody, cmd.name);
106785             if ( cmd.cmdID != undefined )
106786                 ET.SubElement(xcmd, 'CmdID').text = cmd.cmdID;
106787             var func = this['_produce_cmd_' + cmd.name.toLowerCase()];
106788             if ( ! func )
106789                 return cb(new common.InternalError('unexpected command "' + cmd.name + '"'));
106790             try{
106791                 func.call(this, session, cmd, xcmd);
106792             }catch(e){
106793                 return cb(new common.InternalError(
106794                             'failed invoking protocol sub-production of "' + cmd.name + '": ' + e, e));
106795             }
106796             if ( cmd.name == constant.CMD_FINAL && idx + 1 != commands.length )
106797                 return cb('command "' + cmd.name + '" not at end of commands');
106798         }
106799
106800         cb(null, xsync);
106801     },
106802
106803     //-------------------------------------------------------------------------
106804     _produce_cmd_alert: function(session, cmd, xcmd) {
106805         ET.SubElement(xcmd, 'Data').text = cmd.data;
106806         var xitem = ET.SubElement(xcmd, 'Item');
106807         ET.SubElement(ET.SubElement(xitem, 'Source'), 'LocURI').text = cmd.source;
106808         ET.SubElement(ET.SubElement(xitem, 'Target'), 'LocURI').text = cmd.target;
106809         if ( cmd.lastAnchor || cmd.nextAnchor || cmd.maxObjSize )
106810         {
106811             var xmeta = ET.SubElement(xitem, 'Meta');
106812             var xanch = ET.SubElement(xmeta, 'Anchor', {'xmlns': constant.NAMESPACE_METINF});
106813             if ( cmd.lastAnchor )
106814                 ET.SubElement(xanch, 'Last').text = cmd.lastAnchor;
106815             if ( cmd.nextAnchor )
106816                 ET.SubElement(xanch, 'Next').text = cmd.nextAnchor;
106817             if ( cmd.maxObjSize )
106818                 ET.SubElement(xmeta, 'MaxObjSize',
106819                         {'xmlns': constant.NAMESPACE_METINF}).text = cmd.maxObjSize;
106820         }
106821     },
106822
106823     //-------------------------------------------------------------------------
106824     _produce_cmd_status: function(session, cmd, xcmd) {
106825         ET.SubElement(xcmd, 'MsgRef').text    = '' + cmd.msgRef;
106826         ET.SubElement(xcmd, 'CmdRef').text    = '' + cmd.cmdRef;
106827         ET.SubElement(xcmd, 'Cmd').text       = cmd.statusOf;
106828         if ( cmd.sourceRef )
106829             ET.SubElement(xcmd, 'SourceRef').text = cmd.sourceRef;
106830         if ( cmd.targetRef )
106831             ET.SubElement(xcmd, 'TargetRef').text = cmd.targetRef;
106832         ET.SubElement(xcmd, 'Data').text      = cmd.statusCode;
106833         var xitem = null;
106834         var xdata = null;
106835         if ( cmd.nextAnchor || cmd.lastAnchor )
106836         {
106837             xitem = ET.SubElement(xcmd, 'Item');
106838             xdata = ET.SubElement(xitem, 'Data');
106839             var xanch = ET.SubElement(xdata, 'Anchor', {'xmlns': constant.NAMESPACE_METINF});
106840             if ( cmd.lastAnchor )
106841                 ET.SubElement(xanch, 'Last').text = cmd.lastAnchor;
106842             if ( cmd.nextAnchor )
106843                 ET.SubElement(xanch, 'Next').text = cmd.nextAnchor;
106844         }
106845         // NOTE: this is NOT standard SyncML...
106846         if ( cmd.errorCode || cmd.errorMsg )
106847         {
106848             xitem = xitem || ET.SubElement(xcmd, 'Item');
106849             xdata = xdata || ET.SubElement(xitem, 'Data');
106850             var xerr = ET.SubElement(xitem, 'Error');
106851             xdata.text = cmd.errorMsg;
106852             if ( cmd.errorCode )
106853                 ET.SubElement(xerr, 'Code').text = cmd.errorCode;
106854             if ( cmd.errorMsg )
106855                 ET.SubElement(xerr, 'Message').text = cmd.errorMsg;
106856             if ( session.context.config.exposeErrorTrace && cmd.errorTrace )
106857                 ET.SubElement(xerr, 'Trace').text = cmd.errorTrace;
106858         }
106859     },
106860
106861     //-------------------------------------------------------------------------
106862     _produce_cmd_get: function(session, cmd, xcmd) {
106863         ET.SubElement(ET.SubElement(xcmd, 'Meta'), 'Type',
106864                 {'xmlns': constant.NAMESPACE_METINF}).text = cmd.type;
106865         if ( cmd.source || cmd.target || cmd.data )
106866         {
106867             var xitem = ET.SubElement(xcmd, 'Item');
106868             if ( cmd.source )
106869             {
106870                 var xsrc = ET.SubElement(xitem, 'Source');
106871                 ET.SubElement(xsrc, 'LocURI').text  = cmd.source;
106872                 ET.SubElement(xsrc, 'LocName').text = cmd.source;
106873             }
106874             if ( cmd.target )
106875             {
106876                 var xtgt = ET.SubElement(xitem, 'Target');
106877                 ET.SubElement(xtgt, 'LocURI').text  = cmd.target;
106878                 ET.SubElement(xtgt, 'LocName').text = cmd.target;
106879             }
106880             if ( cmd.data )
106881             {
106882                 if ( _.isString(cmd.data) )
106883                     ET.SubElement(xitem, 'Data').text = cmd.data;
106884                 else
106885                     // assuming here that it is an ElementTree object...
106886                     ET.SubElement(xitem, 'Data').append(cmd.data);
106887             }
106888         }
106889     },
106890
106891     //-------------------------------------------------------------------------
106892     _produce_cmd_put: function(session, cmd, xcmd) {
106893         return this._produce_cmd_get(session, cmd, xcmd);
106894     },
106895
106896     //-------------------------------------------------------------------------
106897     _produce_cmd_results: function(session, cmd, xcmd) {
106898         ET.SubElement(xcmd, 'MsgRef').text    = cmd.msgRef;
106899         ET.SubElement(xcmd, 'CmdRef').text    = cmd.cmdRef;
106900         ET.SubElement(ET.SubElement(xcmd, 'Meta'), 'Type',
106901                 {'xmlns': constant.NAMESPACE_METINF}).text = cmd.type;
106902         var xitem = ET.SubElement(xcmd, 'Item');
106903         var xsrc  = ET.SubElement(xitem, 'Source');
106904         ET.SubElement(xsrc, 'LocURI').text  = cmd.source;
106905         ET.SubElement(xsrc, 'LocName').text = cmd.source;
106906         if ( cmd.data )
106907         {
106908             if ( _.isString(cmd.data) )
106909                 ET.SubElement(xitem, 'Data').text = cmd.data;
106910             else
106911                 // assuming here that it is an ElementTree object...
106912                 ET.SubElement(xitem, 'Data').append(cmd.data);
106913         }
106914     },
106915
106916     //-------------------------------------------------------------------------
106917     _produce_cmd_sync: function(session, cmd, xcmd) {
106918         ET.SubElement(ET.SubElement(xcmd, 'Source'), 'LocURI').text = cmd.source;
106919         ET.SubElement(ET.SubElement(xcmd, 'Target'), 'LocURI').text = cmd.target;
106920         if ( cmd.noc != undefined )
106921             ET.SubElement(xcmd, 'NumberOfChanges').text = '' + cmd.noc;
106922         if ( ! cmd.data )
106923             return;
106924         for ( var idx=0 ; idx<cmd.data.length ; idx++ )
106925         {
106926             var scmd = cmd.data[idx];
106927             var xscmd = ET.SubElement(xcmd, scmd.name);
106928             if ( scmd.cmdID )
106929                 ET.SubElement(xscmd, 'CmdID').text = scmd.cmdID;
106930             if ( scmd.type
106931                     || ( scmd.format && scmd.format != constant.FORMAT_AUTO ) )
106932             {
106933                 var xsmeta = ET.SubElement(xscmd, 'Meta')
106934                     // todo: implement auto encoding determination...
106935                     //       (the current implementation just lets XML encoding
106936                     //       do it, which is for most things good enough, but
106937                     //       not so good for sequences that need a large amount
106938                     //       of escaping such as binary data...)
106939                     if ( scmd.format && scmd.format != constant.FORMAT_AUTO )
106940                         ET.SubElement(xsmeta, 'Format',
106941                                 {'xmlns': constant.NAMESPACE_METINF}).text = scmd.format;
106942                 if ( scmd.type )
106943                     ET.SubElement(xsmeta, 'Type',
106944                             {'xmlns': constant.NAMESPACE_METINF}).text = scmd.type;
106945             }
106946             var xsitem = ET.SubElement(xscmd, 'Item');
106947             if ( scmd.source )
106948                 ET.SubElement(ET.SubElement(xsitem, 'Source'),
106949                         'LocURI').text = scmd.source;
106950             if ( scmd.sourceParent )
106951                 ET.SubElement(ET.SubElement(xsitem, 'SourceParent'),
106952                         'LocURI').text = scmd.sourceParent;
106953             if ( scmd.target )
106954                 ET.SubElement(ET.SubElement(xsitem, 'Target'),
106955                         'LocURI').text = scmd.target;
106956             if ( scmd.targetParent )
106957                 ET.SubElement(ET.SubElement(xsitem, 'TargetParent'),
106958                         'LocURI').text = scmd.targetParent;
106959             if ( scmd.data )
106960             {
106961                 if ( _.isString(scmd.data) )
106962                     ET.SubElement(xsitem, 'Data').text = scmd.data;
106963                 else
106964                     // assuming here that it is an ElementTree object...
106965                     ET.SubElement(xsitem, 'Data')._node.appendChild(scmd.data);
106966             }
106967         }
106968     },
106969
106970     //-------------------------------------------------------------------------
106971     _produce_cmd_map: function(session, cmd, xcmd) {
106972         ET.SubElement(ET.SubElement(xcmd, 'Source'), 'LocURI').text = cmd.source;
106973         ET.SubElement(ET.SubElement(xcmd, 'Target'), 'LocURI').text = cmd.target;
106974         if ( cmd.sourceItem || cmd.targetItem )
106975         {
106976             var xitem = ET.SubElement(xcmd, constant.CMD_MAPITEM);
106977             if ( cmd.sourceItem )
106978                 ET.SubElement(ET.SubElement(xitem, 'Source'), 'LocURI').text = cmd.sourceItem;
106979             if ( cmd.targetItem )
106980                 ET.SubElement(ET.SubElement(xitem, 'Target'), 'LocURI').text = cmd.targetItem;
106981         }
106982     },
106983
106984     //-------------------------------------------------------------------------
106985     _produce_cmd_final: function(session, cmd, xcmd) {
106986         return;
106987     },
106988
106989     //-------------------------------------------------------------------------
106990     // NOTE: `consume` is equivalent to the `pysyncml.protocol.tree2commands`...
106991     // consume: function...
106992     consume: function(session, lastcmds, xsync, cb) {
106993
106994         // do some preliminary sanity checks...
106995         // todo: do i really want to be returning an error instead of
106996         // generating an error response?...
106997
106998         if ( xsync.tag != constant.NODE_SYNCML
106999                 || xsync.getchildren().length != 2
107000                 || xsync.getchildren()[0].tag != constant.CMD_SYNCHDR
107001                 || xsync.getchildren()[1].tag != constant.NODE_SYNCBODY
107002            )
107003         {
107004             return cb('unexpected SyncML document structure');
107005         }
107006
107007         var version = xsync.getchildren()[0].findtext('VerProto');
107008         if ( version != constant.SYNCML_VERSION_1_2 )
107009             return cb('unsupported SyncML version "' + version + '"');
107010
107011         var verdtd = xsync.getchildren()[0].findtext('VerDTD');
107012         if ( verdtd != constant.SYNCML_DTD_VERSION_1_2 )
107013             return cb('unsupported SyncML DTD version "' + verdtd + '"');
107014
107015         var self = this;
107016
107017         self.initialize(session, xsync, function(err, cmds) {
107018             var hdrcmd = ( cmds && cmds.length > 0 ) ? cmds[0] : null;
107019             var makeErrorCommands = function(err, cb) {
107020
107021                 if ( err.exception )
107022
107023             if ( ! session.isServer )
107024             return cb(err);
107025
107026         var errcmd = state.makeCommand({
107027             name       : constant.CMD_STATUS,
107028             cmdID      : '1',
107029             msgRef     : session.info.pendingMsgID,
107030             cmdRef     : 0,
107031             sourceRef  : xsync.getchildren()[0].findtext('Source/LocURI'),
107032             targetRef  : xsync.getchildren()[0].findtext('Target/LocURI'),
107033             statusOf   : constant.CMD_SYNCHDR,
107034             statusCode : constant.STATUS_COMMAND_FAILED,
107035             errorMsg   : 'an error occurred during processing'
107036         });
107037
107038         // TODO: make this configurable as to whether or not any error
107039         //       is sent back to the peer as a SyncML "standardized" error
107040         //       status...
107041
107042         // TODO: make sure this is doing what is expected/intended...
107043         if ( err.code || err.name )
107044             errcmd.errorCode  = 'syncml-js.' + ( err.code || err.name );
107045         errcmd.errorMsg   = err.message || common.j(err) || '' + err;
107046
107047         return cb(null, [hdrcmd, errcmd,
107048                 state.makeCommand({name: constant.CMD_FINAL})]);
107049             };
107050
107051             if ( err )
107052                 return makeErrorCommands(err, cb);
107053
107054             try {
107055                 self._consume(session, lastcmds, xsync, cmds, function(err, commands) {
107056                     if ( err )
107057                     return makeErrorCommands(err, cb);
107058                 return cb(null, commands);
107059                 });
107060             } catch ( exc ) {
107061                 return makeErrorCommands(exc, cb);
107062             }
107063
107064         });
107065     },
107066
107067     //-------------------------------------------------------------------------
107068     _consume: function(session, lastcmds, xsync, commands, cb) {
107069
107070         var self       = this;
107071         var hdrcmd     = commands[0];
107072         var statusCode = constant.STATUS_OK;
107073
107074         // analyze the SyncHdr
107075         var children = xsync.getchildren()[0].getchildren();
107076         for ( var idx=0 ; idx<children.length ; idx++ )
107077         {
107078             var child = children[idx];
107079
107080
107081             if ( child.tag == 'VerDTD' )
107082             {
107083                 if ( hdrcmd.version == constant.SYNCML_VERSION_1_2 )
107084                 {
107085                     if ( child.text != constant.SYNCML_DTD_VERSION_1_2 )
107086                         return cb(new common.ProtocolError('bad VerDTD "' + child.text + '"'));
107087                 }
107088                 else
107089                     return cb(new common.FeatureNotSupported(
107090                                 'unsupported internal SyncML version "' + hdrcmd.version + '"'));
107091                 continue;
107092             }
107093
107094             if ( child.tag == 'VerProto' )
107095                 // this was checked earlier...
107096                 continue;
107097
107098             if ( child.tag == 'SessionID' )
107099             {
107100                 if ( child.text != hdrcmd.sessionID )
107101                     return cb(new common.ProtocolError(
107102                                 'session ID mismatch: "' + child.text + '" != "' + hdrcmd.sessionID + '"'));
107103                 continue;
107104             }
107105
107106             if ( child.tag == 'MsgID' )
107107             {
107108                 var chkmsg = ( session.isServer ? hdrcmd.msgID : lastcmds[0].msgID );
107109                 if ( child.text != chkmsg )
107110                     return cb(new common.ProtocolError(
107111                                 'message ID mismatch: "' + child.text + '" != "' + chkmsg + '"'));
107112                 continue;
107113             }
107114
107115             if ( child.tag == 'Target' )
107116             {
107117                 var uri = child.findtext('LocURI');
107118
107119                 // TODO... server-side...
107120
107121                 if ( uri != hdrcmd.source )
107122                     return cb(new common.ProtocolError(
107123                                 'incoming target mismatch: "' + uri + '" != "' + hdrcmd.source + '"'));
107124                 continue;
107125             }
107126
107127             if ( child.tag == 'Source' )
107128             {
107129                 var uri = child.findtext('LocURI');
107130                 if ( uri != hdrcmd.target && uri != lastcmds[0].target )
107131                     return cb(new common.ProtocolError(
107132                                 'incoming source mismatch: "' + uri + '" != "' + hdrcmd.target + '"'));
107133                 continue;
107134             }
107135
107136             if ( child.tag == 'RespURI' )
107137             {
107138                 // hdrcmd.target = child.text
107139                 // session.info.respUri = child.text
107140                 if ( ! session.isServer )
107141                     session.info.respUri = child.text;
107142                 continue;
107143             }
107144
107145             if ( child.tag == 'Cred' )
107146             {
107147                 // the responsibility is on the calling framework to ensure this is
107148                 // checked long before we get here... ie. Adapter.authorize(...)
107149                 // or via the Adapter.handleRequest() `authorize` parameter...
107150                 statusCode = constant.STATUS_AUTHENTICATION_ACCEPTED;
107151                 continue;
107152             }
107153
107154             if ( child.tag == 'Meta' )
107155             {
107156                 // this should already have been consumed during the protocol.initialize() call
107157                 continue;
107158             }
107159
107160             return cb(new common.ProtocolError('unexpected header node "' + child.tag + '"'));
107161         };
107162
107163         commands.push(state.makeCommand({
107164             name       : constant.CMD_STATUS,
107165             cmdID      : session.nextCmdID(),
107166             msgRef     : session.info.pendingMsgID,
107167             cmdRef     : 0,
107168             sourceRef  : xsync.getchildren()[0].findtext('Source/LocURI'),
107169             targetRef  : xsync.getchildren()[0].findtext('Target/LocURI'),
107170             statusOf   : constant.CMD_SYNCHDR,
107171             statusCode : statusCode
107172         }));
107173
107174         // and now evaluate the SyncBody
107175
107176         var chkcmds = _.filter(lastcmds, function(e) {
107177             return e.name != constant.CMD_STATUS && e.name != constant.CMD_FINAL;
107178         });
107179
107180         // for each "sync" command, search for sub-commands
107181         // todo: should this be generalized to search for any sub-commands?...
107182         _.each(chkcmds, function(e) {
107183             if ( e.name != constant.CMD_SYNC || ! e.data || e.data.length <= 0 )
107184             return;
107185         _.each(e.data, function(sub) { chkcmds.push(sub); });
107186         });
107187
107188         var children = xsync.getchildren()[1].getchildren();
107189
107190         // first, check all the 'Status' commands
107191
107192         var consumeStatus = function(cb) {
107193
107194             common.cascade(children, function(child, cb) {
107195
107196                 if ( child.tag != constant.CMD_STATUS )
107197                 return cb();
107198
107199             cname = child.findtext('Cmd');
107200
107201             var blen   = chkcmds.length;
107202             var chkcmd = null;
107203             var chkerr = null;
107204
107205             chkcmds = _.filter(chkcmds, function(cmd) {
107206                 if ( chkerr )
107207                 return;
107208             if ( cmd.cmdID != child.findtext('CmdRef')
107209                 || cmd.name != cname
107210                 || lastcmds[0].msgID != child.findtext('MsgRef') )
107211                 return true;
107212             if ( chkcmd )
107213                 chkerr = new Error('unexpected error: multiple check commands match status command');
107214             chkcmd = cmd;
107215             return false;
107216             });
107217
107218             if ( chkerr )
107219                 return cb(chkerr);
107220
107221             if ( chkcmds.length >= blen )
107222                 return cb(new common.ProtocolError(
107223                             'unexpected status node "s' + session.info.id + '.m' + child.findtext('MsgRef')
107224                             + '.c' + child.findtext('CmdRef') + ' cmd=' + cname + '"'));
107225
107226             // TODO: check for unknown elements (and complain?)...
107227
107228             var code = common.int(child.findtext('Data'));
107229
107230             if ( code == constant.STATUS_MISSING_CREDENTIALS )
107231             {
107232                 var authtype = child.findtext('Chal/Meta/Type');
107233                 var attrs = {auth: {type: authtype}};
107234                 return cb(badStatus(child, common.CredentialsRequired, attrs));
107235             }
107236
107237             if ( code == constant.STATUS_INVALID_CREDENTIALS )
107238             {
107239                 // TODO: get the auth type... from where??...
107240                 var authtype = child.findtext('Chal/Meta/Type');
107241                 var attrs = {auth: {type: authtype}};
107242                 return cb(badStatus(child, common.InvalidCredentials, attrs));
107243             }
107244
107245             var targetRef = child.findtext('TargetRef');
107246             if ( targetRef )
107247             {
107248                 // note: doing a normUri on chkcmd.target because it could be "./devinf12"...
107249                 if ( session.peer.normUri(targetRef) != session.peer.normUri(chkcmd.target) )
107250                     return cb(new common.ProtocolError('unexpected target-ref "'
107251                                 + targetRef + '" != "' + chkcmd.target
107252                                 + '" for command "' + cname + '"'));
107253             }
107254
107255             var sourceRef = child.findtext('SourceRef');
107256             if ( sourceRef )
107257             {
107258                 // note: doing a normUri on chkcmd.source because it could be "./devinf12"...
107259                 if ( cname == constant.CMD_SYNCHDR )
107260                 {
107261                     // this is a little odd, but syncevolution strips the sessionid path
107262                     // parameter off for some reason, so compensating here...
107263                     if ( _.indexOf([session.adapter.normUri(chkcmd.source),
107264                                 session.info.effectiveID,
107265                                 session.info.returnUrl],
107266                                 session.adapter.normUri(sourceRef)) < 0
107267                             && session.adapter.normUri(chkcmd.source).indexOf(session.adapter.normUri(sourceRef)) != 0 )
107268                         return cb(new common.ProtocolError('unexpected source-ref "'
107269                                     + sourceRef + '" != "' + chkcmd.source
107270                                     + '" for command "' + cname + '"'));
107271                 }
107272                 else
107273                 {
107274                     if ( session.adapter.normUri(sourceRef) != session.adapter.normUri(chkcmd.source) )
107275                         return cb(new common.ProtocolError('unexpected source-ref "'
107276                                     + sourceRef + '" != "' + chkcmd.source
107277                                     + '" for command "' + cname + '"'));
107278                 }
107279             }
107280
107281             // todo: any other common elements?...
107282
107283             switch ( cname )
107284             {
107285
107286                 case constant.CMD_SYNCHDR:
107287                     {
107288                         if ( code != constant.STATUS_OK && code != constant.STATUS_AUTHENTICATION_ACCEPTED )
107289                             return cb(badStatus(child));
107290                         if ( code == constant.STATUS_AUTHENTICATION_ACCEPTED )
107291                         {
107292                             // TODO: there is currently nothing that can "reset" the
107293                             //       authAccepted flag...  there should be a trap such
107294                             //       that if an auth fails, then authAccepted gets set
107295                             //       to false.
107296                             session.info.authAccepted = true;
107297                         }
107298                         return cb();
107299                     }
107300
107301                 case constant.CMD_ALERT:
107302                     {
107303                         if ( code == constant.STATUS_OK )
107304                             // TODO: do something with the Item/Data/Anchor/Next?...
107305                             return cb();
107306                         if ( code == constant.STATUS_REFRESH_REQUIRED && ! session.isServer )
107307                         {
107308                             // TODO: support the ability for the UA to control which kind of
107309                             //       refresh to do (slow-sync, client-refresh, server-refresh)
107310                             return cb();
107311                         }
107312                         return cb(badStatus(child));
107313                     }
107314
107315                 case constant.CMD_GET:
107316                     {
107317                         if ( code != constant.STATUS_OK )
107318                             return cb(badStatus(child));
107319                         return cb();
107320                     }
107321
107322                 case constant.CMD_PUT:
107323                     {
107324                         if ( code != constant.STATUS_OK )
107325                             return cb(badStatus(child));
107326                         return cb();
107327                     }
107328
107329                 case constant.CMD_RESULTS:
107330                     {
107331                         if ( code != constant.STATUS_OK )
107332                             return cb(badStatus(child));
107333                         return cb();
107334                     }
107335
107336                 case constant.CMD_SYNC:
107337                     {
107338                         // todo: should this be moved into the synchronizer as a "settle" event?...
107339                         var ds = session.info.dsstates[session.adapter.normUri(chkcmd.source)]
107340                             if ( code != constant.STATUS_OK )
107341                             {
107342                                 // check for server-side errors...
107343                                 if ( code >= 500 && code < 600 && child.findtext('Item/Data') )
107344                                 {
107345                                     ds.action = 'error';
107346                                     ds.error  = getError(child);
107347                                     ds.stats.peerErr += 1;
107348                                     return cb();
107349                                 }
107350                                 return cb(badStatus(child));
107351                             }
107352                         if ( ds.action == 'send' )
107353                         {
107354                             if ( session.isServer )
107355                             {
107356                                 ds.action = 'save';
107357                                 return cb();
107358                             }
107359                             ds.action = common.oneWayOut(session, ds.mode) ? 'done' : 'recv';
107360                             return cb();
107361                         }
107362                         return cb(new common.ProtocolError('unexpected sync state for action=' + ds.action));
107363                     }
107364
107365                 case constant.CMD_ADD:
107366                 case constant.CMD_REPLACE:
107367                 case constant.CMD_DELETE:
107368                     {
107369                         var scmd = state.makeCommand({
107370                             name       : cname,
107371                             msgID      : hdrcmd.msgID,
107372                             cmdID      : child.findtext('CmdID'),
107373                             sourceRef  : sourceRef,
107374                             targetRef  : targetRef,
107375                             data       : code
107376                         });
107377
107378                         session.context.synchronizer.settle(
107379                                 session, scmd, chkcmd, child,
107380                                 function(err, cmds) {
107381                                     if ( err )
107382                             return cb(err);
107383                         _.each(cmds, function(cmd) { commands.push(cmd); });
107384                         return cb();
107385                                 });
107386                         return;
107387                     }
107388
107389                 case constant.CMD_MAP:
107390                     {
107391                         if ( session.isServer )
107392                             return cb(new common.ProtocolError(
107393                                         'unexpected server-side status for command "' + cname + '"'));
107394                         if ( code != constant.STATUS_OK )
107395                             return cb(badStatus(child));
107396                         return cb();
107397                     }
107398
107399                 default:
107400                     {
107401                         return cb(new common.ProtocolError('unexpected status for command "' + cname + '"'));
107402                     }
107403
107404             }
107405
107406             }, cb);
107407
107408         };
107409
107410         // second, check all the non-'Status' commands
107411
107412         var consumeCommands = function(cb) {
107413
107414             var gotFinal = false;
107415
107416             common.cascade(children, function(child, cb) {
107417
107418
107419                 if ( child.tag == constant.CMD_STATUS )
107420                 return cb();
107421
107422             if ( child.tag == constant.CMD_FINAL )
107423             {
107424                 gotFinal = true;
107425                 return cb();
107426             }
107427
107428
107429             // todo: restrict this to the following commands?...
107430             //         CMD_ALERT, CMD_GET, CMD_PUT,
107431             //         CMD_SYNC, CMD_RESULTS, CMD_MAP
107432
107433             var func = self['_consume_node_' + child.tag.toLowerCase()];
107434
107435             if ( ! func )
107436                 return cb(new common.ProtocolError('unexpected command node "' + child.tag + '"'));
107437
107438             try{
107439
107440                 func.call(self, session, lastcmds, xsync, child, function(err, cmds) {
107441                     if ( err )
107442                     return cb(err);
107443                 _.each(cmds, function(cmd) { commands.push(cmd); });
107444                 return cb();
107445                 });
107446
107447             }catch(e){
107448                 // log.error('failed invoking protocol sub-consumption of "%s": %s', child.tag, e);
107449                 // log.error('  ' + stacktrace({e: e}).join('\n  '));
107450                 return cb(new common.InternalError(
107451                             'failed invoking protocol sub-consumption of "' + child.tag + '": ' + e, e));
107452             }
107453
107454             }, function(err) {
107455
107456                 if ( err )
107457                     return cb(err);
107458
107459                 if ( ! gotFinal )
107460                 {
107461                     commands.push(state.makeCommand({
107462                         name       : constant.CMD_ALERT,
107463                         cmdID      : session.nextCmdID(),
107464                         data       : constant.STATUS_NEXT_MESSAGE,
107465                         source     : session.adapter.devID,
107466                         target     : session.peer.devID,
107467                     }));
107468                 }
107469
107470                 return cb();
107471
107472             });
107473
107474         };
107475
107476         // do it!
107477
107478         consumeStatus(function(err) {
107479
107480             if ( err )
107481             return cb(err);
107482
107483         // TODO: is this right?... or should i be getting pissed off and
107484         //       raising hell that all my commands were not addressed?...
107485
107486         _.each(chkcmds, function(chkcmd) {
107487             commands.push(chkcmd);
107488         });
107489
107490         return consumeCommands(function(err) {
107491             if ( err )
107492             return cb(err);
107493         return cb(null, commands);
107494         });
107495
107496         });
107497
107498     },
107499
107500     //-------------------------------------------------------------------------
107501     _consume_node_get: function(session, lastcmds, xsync, xnode, cb) {
107502         var cttype = xnode.findtext('Meta/Type');
107503         var target = xnode.findtext('Item/Target/LocURI');
107504         if ( cttype.indexOf(constant.TYPE_SYNCML_DEVICE_INFO) == 0
107505                 && session.adapter.normUri(target) == constant.URI_DEVINFO_1_2 )
107506             return this._consume_node_get_devinf12(session, lastcmds, xsync, xnode, cb);
107507         // todo: make error status node...
107508         cb(new common.ProtocolError(
107509                     'unexpected "' + constant.CMD_GET + '" command for local "' + target + '"'));
107510     },
107511
107512     //-------------------------------------------------------------------------
107513     _consume_node_get_devinf12: function(session, lastcmds, xsync, xnode, cb) {
107514         var ret = [];
107515         ret.push(state.makeCommand({
107516             name       : constant.CMD_STATUS,
107517             cmdID      : session.nextCmdID(),
107518             msgRef     : session.info.pendingMsgID,
107519             cmdRef     : xnode.findtext('CmdID'),
107520             statusOf   : xnode.tag,
107521             statusCode : constant.STATUS_OK,
107522             targetRef  : xnode.findtext('Item/Target/LocURI')
107523         }));
107524         ret.push(state.makeCommand({
107525             name       : constant.CMD_RESULTS,
107526             cmdID      : session.nextCmdID(),
107527             msgRef     : session.info.pendingMsgID,
107528             cmdRef     : xnode.findtext('CmdID'),
107529             type       : constant.TYPE_SYNCML_DEVICE_INFO + '+' + session.info.codec,
107530             source     : './' + constant.URI_DEVINFO_1_2,
107531             data       : session.adapter.devInfo.toSyncML(constant.SYNCML_DTD_VERSION_1_2,
107532                 _.values(session.adapter._stores))
107533
107534         }));
107535         cb(null, ret);
107536     },
107537
107538     //-------------------------------------------------------------------------
107539     _consume_node_put: function(session, lastcmds, xsync, xnode, cb) {
107540         var cttype = xnode.findtext('Meta/Type');
107541         var source = xnode.findtext('Item/Source/LocURI');
107542         if ( cttype.indexOf(constant.TYPE_SYNCML_DEVICE_INFO) == 0
107543                 && session.peer.normUri(source) == constant.URI_DEVINFO_1_2 )
107544             return this._consume_node_put_devinf12(session, lastcmds, xsync, xnode, cb);
107545         // todo: make error status node...
107546         cb(new common.ProtocolError(
107547                     'unexpected "' + constant.CMD_PUT + '" command for remote "' + source + '"'));
107548     },
107549
107550     //-------------------------------------------------------------------------
107551     _consume_node_put_devinf12: function(session, lastcmds, xsync, xnode, cb) {
107552         var xdev = xnode.find('Item/Data/DevInf');
107553         var res  = devinfo.DevInfo.fromSyncML(xdev);
107554         session.peer._setRemoteInfo(res[0], res[1], function(err) {
107555             if ( err )
107556             return cb(err);
107557
107558         var okcmd = state.makeCommand({
107559             name       : constant.CMD_STATUS,
107560             cmdID      : session.nextCmdID(),
107561             msgRef     : xsync.findtext('SyncHdr/MsgID'),
107562             cmdRef     : xnode.findtext('CmdID'),
107563             sourceRef  : xnode.findtext('Item/Source/LocURI'),
107564             statusOf   : xnode.tag,
107565             statusCode : constant.STATUS_OK
107566         });
107567
107568         if ( session.isServer )
107569             return cb(null, [okcmd]);
107570
107571         // TODO: this should only cause a `recalculate` if any
107572         //       meta-information actually changed...
107573
107574         session.context.router.recalculate(session.adapter, session.peer, function(err) {
107575             if ( err )
107576             return cb(err);
107577         session.context.synchronizer.initStoreSync(session, function(err) {
107578             if ( err )
107579             return cb(err);
107580
107581         // TODO: the call to _setRemoteInfo makes the peer
107582         //       "dirty" without saving changes to the model...
107583         //       make sure the `save` executed in Adapter.sync()
107584         //       or Adapter.handleRequest() appropriately causes
107585         //       objects to save themselves to the model...
107586
107587         // session.adapter._save(session.txn(), function(err) {
107588         //   if ( err )
107589         //     return cb(err);
107590
107591         return cb(null, [okcmd]);
107592
107593         // });
107594
107595         });
107596         });
107597         });
107598     },
107599
107600     //-------------------------------------------------------------------------
107601     _consume_node_results: function(session, lastcmds, xsync, xnode, cb) {
107602         var cttype = xnode.findtext('Meta/Type');
107603         var source = xnode.findtext('Item/Source/LocURI');
107604         if ( cttype.indexOf(constant.TYPE_SYNCML_DEVICE_INFO) == 0
107605                 && session.peer.normUri(source) == constant.URI_DEVINFO_1_2 )
107606             return this._consume_node_put_devinf12(session, lastcmds, xsync, xnode, cb);
107607         // todo: make error status node...
107608         return cb(new common.ProtocolError('unexpected "' + constant.CMD_RESULTS
107609                     + '" command for remote "' + source + '"'))
107610     },
107611
107612     //-------------------------------------------------------------------------
107613     _consume_node_alert: function(session, lastcmds, xsync, xnode, cb) {
107614         var code = common.int(xnode.findtext('Data'));
107615         var statusCode = constant.STATUS_OK
107616             switch ( code )
107617             {
107618                 case constant.ALERT_TWO_WAY:
107619                 case constant.ALERT_SLOW_SYNC:
107620                 case constant.ALERT_ONE_WAY_FROM_CLIENT:
107621                 case constant.ALERT_REFRESH_FROM_CLIENT:
107622                 case constant.ALERT_ONE_WAY_FROM_SERVER:
107623                 case constant.ALERT_REFRESH_FROM_SERVER:
107624                     // todo: these should only be received out-of-band: right?...
107625                     // case constant.ALERT_TWO_WAY_BY_SERVER:
107626                     // case constant.ALERT_ONE_WAY_FROM_CLIENT_BY_SERVER:
107627                     // case constant.ALERT_REFRESH_FROM_CLIENT_BY_SERVER:
107628                     // case constant.ALERT_ONE_WAY_FROM_SERVER_BY_SERVER:
107629                     // case constant.ALERT_REFRESH_FROM_SERVER_BY_SERVER:
107630                     {
107631                         break;
107632                     }
107633                 default:
107634                     {
107635                         if ( session.isServer && code == constant.STATUS_RESUME )
107636                         {
107637                             code = constant.ALERT_SLOW_SYNC;
107638                         }
107639                         else
107640                         {
107641                             return cb(new common.FeatureNotSupported(
107642                                         'unimplemented sync mode '
107643                                         + code + ' ("' + common.mode2string(code) + '")'));
107644                         }
107645                     }
107646             }
107647
107648         if ( session.isServer )
107649         {
107650             // TODO: if this is the server, we need to validate that the requested
107651             //       sync mode is actually feasible... i.e. check:
107652             //         - do the anchors match?
107653             //         - have we bound the datastores together?
107654             //         - is there a pending sync?
107655         }
107656
107657         var uri  = session.adapter.normUri(xnode.findtext('Item/Target/LocURI'));
107658         var ruri = session.peer.normUri(xnode.findtext('Item/Source/LocURI'));
107659
107660         // TODO: this should really be done by the synchronizer... as it can
107661         //       then also do a lot of checks - potentially responding with
107662         //       an error...
107663
107664         var getDS = function(cb) {
107665             if ( session.isServer )
107666             {
107667                 var ds = session.info.dsstates[uri];
107668                 if ( ds )
107669                 {
107670                     ds.action = 'alert';
107671                     return cb(null, ds);
107672                 }
107673
107674                 var peerStore = session.peer.getStore(ruri);
107675                 if ( ! peerStore )
107676                     return cb(new common.ProtocolError(
107677                                 'request to synchronize unknown remote client URI "' + ruri
107678                                 + '" (to local server URI "' + uri + '")'));
107679
107680                 // todo: if already correctly bound, then we don't need to re-bind
107681                 // if ( peerStore._getBinding() )
107682                 // {
107683                 //   log.critical('(currently bound)');
107684                 // }
107685                 // else
107686                 //   log.critical('(currently unbound)');
107687
107688                 session.peer.setRoute(uri, ruri, true, function(err) {
107689                     if ( err )
107690                     return cb(err);
107691                 var peerStore = session.peer.getStore(ruri);
107692                 var ds = state.makeStoreSyncState({
107693                     uri        : uri,
107694                     peerUri    : ruri,
107695                     lastAnchor : peerStore._getBinding().localAnchor,
107696                     mode       : null,
107697                     action     : 'alert'
107698                 });
107699                 session.info.dsstates[uri] = ds;
107700                 return cb(null, ds);
107701                 });
107702                 return;
107703             }
107704             else
107705             {
107706                 var ds = session.info.dsstates[uri];
107707                 if ( ! ds )
107708                     return cb(new common.ProtocolError('request for unreflected local datastore "'
107709                                 + uri + '"'));
107710                 ds.action = 'send';
107711                 if ( code == ds.mode )
107712                     return cb(null, ds);
107713
107714                 var uaEvent = {
107715                     session   : session,
107716                     uri       : uri,
107717                     peerUri   : ruri,
107718                     modeReq   : ds.mode,
107719                     modeRes   : code
107720                 };
107721                 session.ua.acceptSyncModeSwitch(uaEvent, function(err) {
107722                     if ( err )
107723                 {
107724                     return cb(err);
107725                 }
107726                 if ( session.context.listener )
107727                     session.context.listener(uaEvent);
107728                 return cb(null, ds);
107729                 });
107730             }
107731         };
107732
107733
107734         getDS(function(err, ds) {
107735
107736             if ( err )
107737             return cb(err);
107738
107739         ds.mode = code;
107740         ds.peerLastAnchor = xnode.findtext('Item/Meta/Anchor/Last', null);
107741         ds.peerNextAnchor = xnode.findtext('Item/Meta/Anchor/Next', null);
107742
107743         if ( ds.peerLastAnchor != session.peer.getStore(ruri)._getBinding().remoteAnchor )
107744         {
107745             ds.peerLastAnchor = null;
107746             switch ( ds.mode )
107747         {
107748             case constant.ALERT_SLOW_SYNC:
107749             case constant.ALERT_REFRESH_FROM_CLIENT:
107750             case constant.ALERT_REFRESH_FROM_SERVER:
107751                 {
107752                     break;
107753                 }
107754             default:
107755                 {
107756                     if ( session.isServer )
107757                     {
107758                         ds.mode = constant.ALERT_SLOW_SYNC;
107759                         statusCode = constant.STATUS_REFRESH_REQUIRED;
107760                     }
107761                     else
107762                     {
107763                         // todo: should i assume that the server knows something
107764                         //       that i don't and just go along with it?...
107765                         return cb(new common.ProtocolError(
107766                                     'server-side requested inappropriate ' + common.mode2string(ds.mode)
107767                                     + ' sync mode on unbound datastore "' + uri + '"'));
107768                     }
107769                 }
107770         }
107771         }
107772
107773         return cb(null, [state.makeCommand({
107774             name       : constant.CMD_STATUS,
107775                cmdID      : session.nextCmdID(),
107776                msgRef     : xsync.findtext('SyncHdr/MsgID'),
107777                cmdRef     : xnode.findtext('CmdID'),
107778                targetRef  : xnode.findtext('Item/Target/LocURI'),
107779                sourceRef  : xnode.findtext('Item/Source/LocURI'),
107780                statusOf   : xnode.tag,
107781                statusCode : statusCode,
107782                // todo: syncevolution does not echo the remote last anchor... why not?
107783                lastAnchor : ds.peerLastAnchor,
107784                nextAnchor : ds.peerNextAnchor
107785         })]);
107786
107787         });
107788
107789     },
107790
107791     //-------------------------------------------------------------------------
107792     _consume_node_sync: function(session, lastcmds, xsync, xnode, cb) {
107793         var self   = this;
107794         var uri    = xnode.findtext('Target/LocURI');
107795         var store  = session.adapter.getStore(session.adapter.normUri(uri));
107796         var ds     = session.info.dsstates[session.adapter.normUri(uri)];
107797         var commands = [state.makeCommand({
107798             name        : constant.CMD_SYNC,
107799             msgID       : xsync.findtext('SyncHdr/MsgID'),
107800             cmdID       : xnode.findtext('CmdID'),
107801             source      : xnode.findtext('Source/LocURI'),
107802             target      : uri,
107803             data        : [],
107804         })];
107805         var noc = common.int(xnode.findtext('NumberOfChanges'));
107806         if (noc !== undefined) {
107807             changednum = noc;
107808             _counts = 0;
107809         }
107810         common.cascade(xnode.getchildren(), function(child, cb) {
107811             switch ( child.tag )
107812         {
107813             case 'CmdID':
107814             case 'Target':
107815             case 'Source':
107816             case 'NumberOfChanges':
107817                 {
107818                     return cb();
107819                 }
107820             case constant.CMD_ADD:
107821             case constant.CMD_REPLACE:
107822             case constant.CMD_DELETE:
107823                 {
107824                     var func = self['_consume_sync_' + child.tag.toLowerCase()];
107825                     func.call(self, session, lastcmds, store, xsync, child, function(err, cmds) {
107826                         if ( err )
107827                         return cb(err);
107828                     _.each(cmds, function(cmd) { commands[0].data.push(cmd); });
107829                     return cb();
107830                     });
107831                     return;
107832                 }
107833             default:
107834                 {
107835                     return cb(new common.ProtocolError('unexpected sync command "' + child.tag + '"'));
107836                 }
107837         }
107838         }, function(err) {
107839             if ( err )
107840                 return cb(err);
107841             // confirm that i received the right number of changes...
107842             /*
107843                if ( noc != undefined && noc != commands[0].data.length )
107844                return cb(new common.ProtocolError('number-of-changes mismatch (received '
107845                + commands[0].data.length + ', expected '
107846                + noc + ')'));
107847                */
107848             _counts =  _counts + commands[0].data.length;
107849             if ( ds.action != 'error' )
107850             {
107851                 if ( ! session.isServer )
107852                 {
107853                     if ( ds.action != 'recv' )
107854                         return cb(new common.ProtocolError('unexpected sync state for URI "'
107855                                     + uri + '": action=' + ds.action));
107856                     if (changednum != undefined && changednum <= _counts)  {
107857                         ds.action = 'done';
107858                         changednum = undefined;
107859                         _counts = 0;
107860                     }
107861                 }
107862                 else
107863                 {
107864                     if ( ds.action != 'alert' )
107865                         return cb(new common.ProtocolError(
107866                                     'unexpected sync state for URI "' + uri + '": action=' + ds.action));
107867                     ds.action = common.oneWayIn(session, ds.mode) ? 'save' : 'send';
107868                 }
107869             }
107870             return session.context.synchronizer.reactions(session, commands, cb);
107871         });
107872     },
107873
107874     //-------------------------------------------------------------------------
107875     _consume_xnode2item: function(session, lastcmds, store, xsync, xnode, cb) {
107876         var ctype  = xnode.findtext('Meta/Type');
107877         // todo: can the version be specified in the Meta tag?... maybe create an
107878         //       extension to SyncML to communicate this?...
107879         var ctver  = null;
107880         var format = xnode.findtext('Meta/Format');
107881         var xitem  = xnode.findall('Item/Data');
107882         if ( xitem.length > 1 )
107883             return cb(new common.ProtocolError(
107884                         '"' + xnode.tag + '" command with non-singular item data nodes'));
107885         if ( xitem.length < 1 )
107886             return cb(new common.ProtocolError(
107887                         '"' + xnode.tag + '" command with missing data node'));
107888         var xitem = xitem[0];
107889         // todo: confirm that getchildren only returns element nodes...
107890         if ( xitem.getchildren().length == 1 )
107891             data = xitem.getchildren()[0];
107892         else
107893         {
107894             data = xitem.text;
107895             if ( format == constant.FORMAT_B64 )
107896                 data = base64.decode(data);
107897         }
107898         return store.agent.loadsItem(data, ctype, ctver, cb);
107899     },
107900
107901     //-------------------------------------------------------------------------
107902     _consume_sync_add: function(session, lastcmds, store, xsync, xnode, cb) {
107903         this._consume_xnode2item(session, lastcmds, store, xsync, xnode, function(err, item) {
107904             if ( err )
107905             return cb(err);
107906         return cb(null, [state.makeCommand({
107907             name          : constant.CMD_ADD,
107908                msgID         : xsync.findtext('SyncHdr/MsgID'),
107909                cmdID         : xnode.findtext('CmdID'),
107910                source        : xnode.findtext('Item/Source/LocURI'),
107911                sourceParent  : xnode.findtext('Item/SourceParent/LocURI'),
107912                targetParent  : xnode.findtext('Item/TargetParent/LocURI'),
107913                data          : item
107914         })]);
107915         });
107916     },
107917
107918     //-------------------------------------------------------------------------
107919     _consume_sync_replace: function(session, lastcmds, store, xsync, xnode, cb) {
107920         this._consume_xnode2item(session, lastcmds, store, xsync, xnode, function(err, item) {
107921             if ( err )
107922             return cb(err);
107923         return cb(null, [state.makeCommand({
107924             name          : constant.CMD_REPLACE,
107925                msgID         : xsync.findtext('SyncHdr/MsgID'),
107926                cmdID         : xnode.findtext('CmdID'),
107927                source        : xnode.findtext('Item/Source/LocURI'),
107928                sourceParent  : xnode.findtext('Item/SourceParent/LocURI'),
107929                target        : xnode.findtext('Item/Target/LocURI'),
107930                targetParent  : xnode.findtext('Item/TargetParent/LocURI'),
107931                data          : item
107932         })]);
107933         });
107934     },
107935
107936     //-------------------------------------------------------------------------
107937     _consume_sync_delete: function(session, lastcmds, store, xsync, xnode, cb) {
107938         return cb(null, [state.makeCommand({
107939             name          : constant.CMD_DELETE,
107940         msgID         : xsync.findtext('SyncHdr/MsgID'),
107941         cmdID         : xnode.findtext('CmdID'),
107942         source        : xnode.findtext('Item/Source/LocURI'),
107943         sourceParent  : xnode.findtext('Item/SourceParent/LocURI'),
107944         target        : xnode.findtext('Item/Target/LocURI'),
107945         targetParent  : xnode.findtext('Item/TargetParent/LocURI')
107946         })]);
107947     },
107948
107949     // #----------------------------------------------------------------------------
107950     // def makeStatus(self, session, xsync, xnode, status=constant.STATUS_OK, **kw):
107951     //   return state.Command(
107952     //     name       = constant.CMD_STATUS,
107953     //     cmdID      = session.nextCmdID(),
107954     //     msgRef     = xsync.findtext('SyncHdr/MsgID'),
107955     //     cmdRef     = xnode.findtext('CmdID'),
107956     //     statusOf   = xnode.tag,
107957     //     statusCode = status,
107958     //     **kw
107959     //     )
107960
107961     //-------------------------------------------------------------------------
107962     _consume_node_map: function(session, lastcmds, xsync, xnode, cb) {
107963         if ( ! session.isServer )
107964             return cb(new common.ProtocolError(
107965                         'unexpected "Map" command received by client-side SyncML peer'));
107966         // TODO: convert the sender-side to support command.items like
107967         //       this as well...
107968         var cmd = state.makeCommand({
107969             name    : constant.CMD_MAP,
107970             msgID   : xsync.findtext('SyncHdr/MsgID'),
107971             cmdID   : xnode.findtext('CmdID'),
107972             source  : xnode.findtext('Source/LocURI'),
107973             target  : xnode.findtext('Target/LocURI'),
107974             items   : []
107975         });
107976         _.each(xnode.findall('MapItem'), function(xnode) {
107977             // todo: support hierarchical sync...
107978             cmd.items.push({
107979                 source        : xnode.findtext('Source/LocURI'),
107980                 // sourceParent  : xnode.findtext('SourceParent/LocURI'),
107981                 target        : xnode.findtext('Target/LocURI'),
107982                 // targetParent  : xnode.findtext('TargetParent/LocURI')
107983             });
107984         });
107985         return session.context.synchronizer.reactions(session, [cmd], cb);
107986     }
107987
107988
107989 });
107990
107991 return exports;
107992
107993 })();
107994
107995 module.exports = _self;
107996
107997 });
107998 define('ripple/platform/tizen/2.0/syncml-js-lib/router', function (require, exports, module) {
107999 // -*- coding: utf-8 -*-
108000 //-----------------------------------------------------------------------------
108001 // file: $Id$
108002 // lib:  syncml-js.router
108003 // auth: griffin <griffin@uberdev.org>
108004 // date: 2012/11/04
108005 // copy: (C) CopyLoose 2012 UberDev <hardcore@uberdev.org>, No Rights Reserved.
108006 //-----------------------------------------------------------------------------
108007
108008 var common = require('ripple/platform/tizen/2.0/syncml-js-lib/common'),
108009     constant = require('ripple/platform/tizen/2.0/syncml-js-lib/constant'),
108010     ctype = require('ripple/platform/tizen/2.0/syncml-js-lib/ctype'),
108011     matcher = require('ripple/platform/tizen/2.0/syncml-js-lib/matcher'),
108012     stablematch = require('ripple/platform/tizen/2.0/syncml-js-lib/stablematch'),
108013     _self;
108014
108015 _self = (function () {
108016
108017     var exports = {};
108018
108019     //---------------------------------------------------------------------------
108020     exports.Router = common.Base.extend({
108021
108022         //-------------------------------------------------------------------------
108023         constructor: function(options) {
108024         },
108025
108026         //-------------------------------------------------------------------------
108027         getTargetUri: function(adapter, peer, sourceUri) {
108028             var pmodel = peer._getModel();
108029             for ( var idx=0 ; idx<pmodel.routes.length ; idx++ )
108030     {
108031         var route = pmodel.routes[idx];
108032         if ( route.localUri == sourceUri )
108033         return route.remoteUri;
108034     }
108035     for ( var idx=0 ; idx<pmodel.stores.length ; idx++ )
108036     {
108037         var store = pmodel.stores[idx];
108038         if ( store.binding && store.binding.uri == sourceUri )
108039         return store.uri;
108040     }
108041     return null;
108042         },
108043
108044         //-------------------------------------------------------------------------
108045         recalculate: function(adapter, peer, cb) {
108046             // the non-"SmartRouter" only connects manually-configured routes...
108047             var routes = _.filter(peer._getModel().routes,
108048                     function(r) { return ! r.autoMapped; });
108049             return this._setupRoutes(adapter, peer, routes, cb);
108050         },
108051
108052         //-------------------------------------------------------------------------
108053         _setupRoutes: function(adapter, peer, routes, cb) {
108054             // available local URIs
108055             var lset = _.map(adapter._getModel().stores,
108056                     function(s) { return adapter.normUri(s.uri); });
108057             // available remote URIs
108058             var rset = _.map(peer._getModel().stores,
108059                     function(s) { return peer.normUri(s.uri); });
108060
108061             // break all routes not listed
108062             var ruris = _.map(routes, function(r) { return r.remoteUri; });
108063             var xrset = _.filter(rset, function(uri) {
108064                 return _.indexOf(ruris, uri) < 0;
108065             });
108066             _.each(xrset, function(uri) {
108067                 var smodel = peer.getStore(uri)._getModel();
108068                 if ( ! smodel.binding )
108069                 return;
108070             smodel.binding = null;
108071             });
108072
108073             var err = null;
108074             _.each(routes, function(route) {
108075                 if ( err )
108076                 return;
108077
108078             route.localUri  = adapter.normUri(route.localUri);
108079             route.remoteUri = peer.normUri(route.remoteUri);
108080             if ( _.indexOf(rset, route.remoteUri) < 0
108081                 || _.indexOf(lset, route.localUri) < 0 )
108082             {
108083                 err = 'unable to route from "' + route.localUri
108084                 + '" (here) to "' + route.remoteUri
108085                 + '" (peer): no such stores or already routed elsewhere';
108086             return;
108087             }
108088
108089             lset = _.filter(lset, function(uri) { return uri != route.localUri; });
108090             rset = _.filter(rset, function(uri) { return uri != route.remoteUri; });
108091
108092
108093             var smodel = peer.getStore(route.remoteUri)._getModel();
108094             if ( smodel.binding && smodel.binding.uri == route.localUri )
108095                 return;
108096             smodel.binding = {
108097                 uri          : route.localUri,
108098                 autoMapped   : route.autoMapped,
108099                 localAnchor  : null,
108100                 remoteAnchor : null
108101             };
108102             });
108103
108104             if ( err )
108105                 return cb(err);
108106
108107             return cb();
108108         },
108109
108110         //-------------------------------------------------------------------------
108111         getBestTransmitContentType: function(adapter, peer, uri) {
108112             var lstore = adapter.getStore(uri);
108113             var rstore = peer.getStore(this.getTargetUri(adapter, peer, uri));
108114             return matcher.pickTransmitContentType(lstore, rstore);
108115         },
108116
108117     });
108118
108119     //---------------------------------------------------------------------------
108120     exports.SmartRouter = exports.Router.extend({
108121
108122         //-------------------------------------------------------------------------
108123         recalculate: function(adapter, peer, cb) {
108124
108125             // note: if you don't want smart routing, assign the non-SmartRouter
108126             //       router (i.e. syncml-js.Router) to the loaded context
108127
108128             // available local URIs
108129             var llut = _.object(
108130                 _.map(adapter._getModel().stores,
108131                     function(s) { return [adapter.normUri(s.uri), s]; }));
108132             var lset = _.keys(llut);
108133
108134             // available remote URIs
108135             var rlut = _.object(
108136                 _.map(peer._getModel().stores,
108137                     function(s) { return [adapter.normUri(s.uri), s]; }));
108138             var rset = _.keys(rlut);
108139
108140             // TODO: i am directly touching the model here.
108141             //       total i-rep violation.
108142             //       i'm embarrassed.
108143             //       fortunately, it's just between syncml-js classes...
108144             //       but now you know, doh! please don't blackmail me!... ;-)
108145
108146             // manual routes
108147             var pmodel = peer._getModel();
108148             pmodel.routes = _.filter(pmodel.routes,
108149                     function(r) { return ! r.autoMapped; });
108150
108151             // remove manual routes from available routes
108152             var uris = _.map(pmodel.routes, function(r) { return r.localUri; });
108153             lset = _.filter(lset, function(uri) {
108154                 return _.indexOf(uris, uri) < 0;
108155             });
108156             uris = _.map(pmodel.routes, function(r) { return r.remoteUri; });
108157             rset = _.filter(rset, function(uri) {
108158                 return _.indexOf(uris, uri) < 0;
108159             });
108160
108161             // match remaining stores
108162             var rankL = function(luri) {
108163                 var ret = _.rest(rset, 0);
108164                 ret.sort(function(a, b) {
108165                     return matcher.cmpStore(llut[luri], rlut[a], rlut[b]);
108166                 });
108167                 return ret;
108168             };
108169             var rankR = function(ruri) {
108170                 var ret = _.rest(lset, 0);
108171                 ret.sort(function(a, b) {
108172                     return matcher.cmpStore(rlut[ruri], llut[a], llut[b]);
108173                 });
108174                 return ret;
108175             };
108176             var matches = stablematch.match(lset, rset, rankL, rankR);
108177
108178             // add them to the routes (as auto-routed)
108179             for ( var idx=0 ; idx<matches.length ; idx++ )
108180             {
108181                 var pair = matches[idx];
108182                 pmodel.routes.push({
108183                     localUri   : pair[0],
108184                     remoteUri  : pair[1],
108185                     autoMapped : true
108186                 });
108187             }
108188
108189             return this._setupRoutes(adapter, peer, pmodel.routes, cb);
108190         },
108191
108192     });
108193
108194     return exports;
108195
108196 })();
108197
108198 module.exports = _self;
108199
108200 });
108201 define('ripple/platform/tizen/2.0/syncml-js-lib/codec', function (require, exports, module) {
108202 // -*- coding: utf-8 -*-
108203 //-----------------------------------------------------------------------------
108204 // file: $Id$
108205 // auth: metagriffin <metagriffin@uberdev.org>
108206 // date: 2012/10/13
108207 // copy: (C) CopyLoose 2012 UberDev <hardcore@uberdev.org>, No Rights Reserved.
108208 //-----------------------------------------------------------------------------
108209
108210 var common = require('ripple/platform/tizen/2.0/syncml-js-lib/common'),
108211     constant = require('ripple/platform/tizen/2.0/syncml-js-lib/constant'),
108212     _self;
108213
108214 _self = (function () {
108215
108216     var exports = {};
108217
108218     //---------------------------------------------------------------------------
108219     exports.Codec = common.Base.extend({
108220
108221         encode: function(xtree, cb) {
108222             throw new common.NotImplementedError();
108223         },
108224
108225         decode: function(contentType, data, cb) {
108226             throw new common.NotImplementedError();
108227         },
108228     }, {
108229
108230         factory: function(codec) {
108231             // todo: should this be converted to callback-based?...
108232             if ( codec == constant.CODEC_XML )
108233         return new exports.XmlCodec()
108234         // TODO
108235         // if ( codec == constant.CODEC_WBXML )
108236         //   return exports.WbxmlCodec()
108237         throw new common.UnknownCodec('unknown or unimplemented codec "' + codec + '"')
108238         },
108239
108240             autoEncode: function(xtree, codecName, cb) {
108241                 exports.Codec.factory(codecName).encode(xtree, cb);
108242             },
108243
108244             autoDecode: function(contentType, data, cb) {
108245                 if ( contentType.indexOf(constant.TYPE_SYNCML + '+') != 0 )
108246                     return cb('unknown or unimplemented content type "' + contentType + '"');
108247                 var ct = contentType.slice((constant.TYPE_SYNCML + '+').length).split(';')[0];
108248                 exports.Codec.factory(ct).decode(contentType, data, function(err, tree) {
108249                     if ( err )
108250                     return cb(err);
108251                 return cb(null, tree, ct);
108252                 });
108253             },
108254     });
108255
108256     //---------------------------------------------------------------------------
108257     exports.XmlCodec = exports.Codec.extend({
108258
108259         name: constant.CODEC_XML,
108260
108261         encode: function(xtree, cb) {
108262             // todo: really enforce this charset...
108263             var ctype = constant.TYPE_SYNCML + '+' + this.name + '; charset=UTF-8';
108264             var ret = ET.tostring(xtree);
108265             if ( ret.charAt(0) == '<' && ret.charAt(1) == '?' )
108266     {
108267         var idx = ret.indexOf('?>');
108268         if ( idx >= 0 )
108269         ret = ret.substr(0, idx + 2).replace(/'/g, '"') + ret.substr(idx + 2);
108270     }
108271     cb(null, ctype, ret);
108272         },
108273
108274         decode: function(contentType, data, cb) {
108275             var expCT = constant.TYPE_SYNCML + '+' + this.name;
108276             if ( contentType.indexOf(expCT) != 0 )
108277         cb(new common.ProtocolError(
108278                 'received unexpected content-type "' + contentType + '" (expected "'
108279                     + expCT + '")'));
108280             try
108281             {
108282                 return cb(null, ET.parse(data).getroot());
108283             }
108284             catch(e)
108285             {
108286                 return cb(new common.ProtocolError('could not parse XML: ' + e, e));
108287             }
108288         }
108289
108290     });
108291
108292     //---------------------------------------------------------------------------
108293     // TODO: implement wbxml...
108294     // exports.WbXmlCodec = exports.Codec.extend({
108295     //   encode: function(xtree, cb) {
108296     //   },
108297     //   decode: function(contentType, data, cb) {
108298     //   }
108299     // });
108300
108301     return exports;
108302
108303 })();
108304
108305 module.exports = _self;
108306
108307 });
108308 define('ripple/platform/tizen/2.0/syncml-js-lib/stablematch', function (require, exports, module) {
108309 // -*- coding: utf-8 -*-
108310 //-----------------------------------------------------------------------------
108311 // file: $Id$
108312 // desc: implements a solution to the stable matching problem using a
108313 //       left-optimized algorithm. shamelessly adapted from:
108314 //         https://github.com/paulgb/Python-Gale-Shapley/
108315 // auth: metagriffin <mg.npmjs@uberdev.org>
108316 // date: 2012/12/29
108317 // copy: (C) CopyLoose 2012 UberDev <hardcore@uberdev.org>, No Rights Reserved.
108318 //-----------------------------------------------------------------------------
108319
108320 var _self = (function () {
108321
108322     var exports = {};
108323
108324     // TODO: figure out how to pull this dynamically from package.json...
108325     exports.version = '0.0.4';
108326
108327     //---------------------------------------------------------------------------
108328     exports.match = function(A, B, rankA, rankB) {
108329         if ( ! A || ! B || ! A.length || ! B.length ) {
108330             return [];
108331         }
108332         if ( A.length == B.length ) {
108333             return exports._match(A, B, rankA, rankB);
108334         }
108335
108336         // TODO: this is a brute-force implementation of getting both
108337         //       lists to be of symmetric length... make this "better".
108338         //       for example, build this directly into _match() or use
108339         //       deterministic exclusion of the longer data set.
108340
108341         var sA   = _.rest(A, 0);
108342         var sB   = _.rest(B, 0);
108343         var mlen = Math.max(sA, sB);
108344         while ( sA.length < mlen )
108345             sA.push(null);
108346         while ( sB.length < mlen )
108347             sB.push(null);
108348         var sRA  = function(a) {
108349             var ret = rankA(a);
108350             while ( ret.length < mlen )
108351                 ret.push(null);
108352             return ret;
108353         };
108354         var sRB  = function(b) {
108355             var ret = rankB(b);
108356             while ( ret.length < mlen )
108357                 ret.push(null);
108358             return ret;
108359         };
108360         var ret = exports._match(sA, sB, sRA, sRB);
108361         return _.filter(ret, function(pair) {
108362             return pair[0] != null && pair[1] != null;
108363         });
108364     };
108365
108366     //---------------------------------------------------------------------------
108367     exports._match = function(A, B, rankA, rankB) {
108368         // this translates sets A and B to indeces, since _imatch can only work
108369         // with sets of elements that can be used as the key in a hash (in this
108370         // implementation).
108371         var iA  = _.range(A.length);
108372         var iB  = _.range(B.length);
108373         var iRA = function(ia) {
108374             var ret = rankA(A[ia]);
108375             return _.map(ret, function(item) {
108376                 return _.indexOf(B, item);
108377             });
108378         };
108379         var iRB = function(ib) {
108380             var ret = rankB(B[ib]);
108381             return _.map(ret, function(item) {
108382                 return _.indexOf(A, item);
108383             });
108384         };
108385         var ret = exports._imatch(iA, iB, iRA, iRB);
108386         return _.map(ret, function(item) {
108387             return [A[item[0]], B[item[1]]];
108388         });
108389     };
108390
108391     //---------------------------------------------------------------------------
108392     exports._imatch = function(A, B, rankA, rankB) {
108393         // TODO: improve this... it was a brute-force porting of
108394         //         https://github.com/paulgb/Python-Gale-Shapley
108395         //       without any eye on optimal outcome or performance...
108396         //: `partners` is a paring hash of { a => [b, rank] }
108397         var partners = {};
108398         _.each(A, function(a) {
108399             partners[a] = [rankA(a)[0], 0];
108400         });
108401         //: `stable` indicates stability of the current pairing in `partners`
108402         var stable = false;
108403         while ( ! stable )
108404         {
108405             stable = true;
108406             _.each(B, function(b) {
108407                 var paired = false;
108408                 for ( var n=0 ; n<A.length ; n++ )
108409                 {
108410                     var a = rankB(b)[n];
108411                     var pair = partners[a];
108412                     if ( pair[0] == b )
108413                     {
108414                         if ( paired )
108415                         {
108416                             stable = false;
108417                             partners[a] = [rankA(a)[pair[1] + 1], pair[1] + 1];
108418                         }
108419                         else
108420                             paired = true;
108421                     }
108422                 }
108423             });
108424         }
108425         return _.map(_.keys(partners), function(a) {
108426             return [a, partners[a][0]];
108427         });
108428     };
108429
108430     return exports;
108431 })();
108432
108433 module.exports = _self;
108434
108435 });
108436 define('ripple/platform/tizen/2.0/syncml-js-lib/common', function (require, exports, module) {
108437 // -*- coding: utf-8 -*-
108438 //-----------------------------------------------------------------------------
108439 // file: $Id$
108440 // auth: metagriffin <metagriffin@uberdev.org>
108441 // date: 2012/10/13
108442 // copy: (C) CopyLoose 2012 UberDev <hardcore@uberdev.org>, No Rights Reserved.
108443 //-----------------------------------------------------------------------------
108444
108445 var constant = require('ripple/platform/tizen/2.0/syncml-js-lib/constant'),
108446     _self;
108447
108448 _self = (function () {
108449     var exports = {};
108450
108451     //---------------------------------------------------------------------------
108452     // object inheritance helper routines shamelessly scrubbed from backbone.js
108453
108454     // The self-propagating extend function that Backbone classes use.
108455     var extend = exports.extend = function (protoProps, classProps) {
108456         var child = inherits(this, protoProps, classProps);
108457         child.extend = this.extend;
108458         return child;
108459     };
108460
108461     // Shared empty constructor function to aid in prototype-chain creation.
108462     var ctor = function(){};
108463
108464     // Helper function to correctly set up the prototype chain, for subclasses.
108465     // Similar to `goog.inherits`, but uses a hash of prototype properties and
108466     // class properties to be extended.
108467     var inherits = function(parent, protoProps, staticProps) {
108468         var child;
108469
108470         // The constructor function for the new subclass is either defined by you
108471         // (the "constructor" property in your `extend` definition), or defaulted
108472         // by us to simply call the parent's constructor.
108473         if (protoProps && protoProps.hasOwnProperty('constructor')) {
108474             child = protoProps.constructor;
108475         } else {
108476             child = function(){ parent.apply(this, arguments); };
108477         }
108478
108479         // Inherit class (static) properties from parent.
108480         _.extend(child, parent);
108481
108482         // Set the prototype chain to inherit from `parent`, without calling
108483         // `parent`'s constructor function.
108484         ctor.prototype = parent.prototype;
108485         child.prototype = new ctor();
108486
108487         // Add prototype properties (instance properties) to the subclass,
108488         // if supplied.
108489         if (protoProps) _.extend(child.prototype, protoProps);
108490
108491         // Add static properties to the constructor function, if supplied.
108492         if (staticProps) _.extend(child, staticProps);
108493
108494         // Correctly set child's `prototype.constructor`.
108495         child.prototype.constructor = child;
108496
108497         // Set a convenience property in case the parent's prototype is needed later.
108498         child.__super__ = parent.prototype;
108499
108500         return child;
108501     };
108502
108503     //-----------------------------------------------------------------------------
108504     exports.Base = function() {};
108505     exports.Base.extend = extend;
108506
108507     //-----------------------------------------------------------------------------
108508     var SyncmlError = exports.Base.extend({
108509         constructor: function(msg, exception, attrs) {
108510             this.message = this.name;
108511             if ( msg != undefined )
108512         this.message += ': ' + msg;
108513     this.exception = exception;
108514     if ( attrs )
108515         _.extend(this, attrs);
108516         },
108517         toString: function() {
108518             return this.message;
108519         }
108520     });
108521
108522     //---------------------------------------------------------------------------
108523     exports.Stream = exports.Base.extend({
108524
108525         writeln: function(data) {
108526             if ( data == undefined )
108527         return;
108528     return this.write(data + '\n');
108529         },
108530
108531         indented: function(indent) {
108532             return new exports.IndentStream(this, indent || this._indent);
108533         }
108534
108535     });
108536
108537     _.extend(exports, {
108538
108539         //---------------------------------------------------------------------------
108540         // exceptions
108541         SyncmlError:           SyncmlError.extend({name: 'SyncmlError'}),
108542         TypeError:             SyncmlError.extend({name: 'TypeError'}),
108543         NotImplementedError:   SyncmlError.extend({name: 'NotImplementedError'}),
108544         ProtocolError:         SyncmlError.extend({name: 'ProtocolError'}),
108545         InternalError:         SyncmlError.extend({name: 'InternalError'}),
108546         ConflictError:         SyncmlError.extend({name: 'ConflictError'}),
108547         FeatureNotSupported:   SyncmlError.extend({name: 'FeatureNotSupported'}),
108548         LogicalError:          SyncmlError.extend({name: 'LogicalError'}),
108549         CredentialsRequired:   SyncmlError.extend({name: 'CredentialsRequired'}),
108550         InvalidCredentials:    SyncmlError.extend({name: 'InvalidCredentials'}),
108551         InvalidContext:        SyncmlError.extend({name: 'InvalidContext'}),
108552         InvalidAdapter:        SyncmlError.extend({name: 'InvalidAdapter'}),
108553         InvalidStore:          SyncmlError.extend({name: 'InvalidStore'}),
108554         InvalidContentType:    SyncmlError.extend({name: 'InvalidContentType'}),
108555         InvalidAgent:          SyncmlError.extend({name: 'InvalidAgent'}),
108556         InvalidContent:        SyncmlError.extend({name: 'InvalidContent'}),
108557         InvalidItem:           SyncmlError.extend({name: 'InvalidItem'}),
108558         UnknownCodec:          SyncmlError.extend({name: 'UnknownCodec'}),
108559         NoSuchRoute:           SyncmlError.extend({name: 'NoSuchRoute'}),
108560         UnknownAuthType:       SyncmlError.extend({name: 'UnknownAuthType'}),
108561         UnknownFormatType:     SyncmlError.extend({name: 'UnknownFormatType'}),
108562
108563         //---------------------------------------------------------------------------
108564         // UUID generation
108565         makeID: function() {
108566             // shamelessly scrubbed from:
108567             //   http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523
108568             // (adjusted to remove the dashes)
108569             // todo: see some of those links on how to make this more "robust"...
108570             return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
108571                 var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
108572                 return v.toString(16);
108573             });
108574         },
108575
108576         //-------------------------------------------------------------------------
108577         synctype2alert: function(type) {
108578             return constant.SyncTypeToAlert[type];
108579         },
108580
108581         //-------------------------------------------------------------------------
108582         alert2synctype: function(alert) {
108583             for ( var key in constant.SyncTypeToAlert )
108584             {
108585                 if ( constant.SyncTypeToAlert[key] == alert )
108586                     return exports.int(key);
108587             }
108588             return null;
108589         },
108590
108591         //-------------------------------------------------------------------------
108592         mode2string: function(code) {
108593             switch ( code )
108594             {
108595                 case constant.ALERT_TWO_WAY:                       return 'two-way';
108596                 case constant.ALERT_SLOW_SYNC:                     return 'slow-sync';
108597                 case constant.ALERT_ONE_WAY_FROM_CLIENT:           return 'one-way-from-client';
108598                 case constant.ALERT_REFRESH_FROM_CLIENT:           return 'refresh-from-client';
108599                 case constant.ALERT_ONE_WAY_FROM_SERVER:           return 'one-way-from-server';
108600                 case constant.ALERT_REFRESH_FROM_SERVER:           return 'refresh-from-server';
108601                 case constant.ALERT_TWO_WAY_BY_SERVER:             return 'two-way-by-server';
108602                 case constant.ALERT_ONE_WAY_FROM_CLIENT_BY_SERVER: return 'one-way-from-client-by-server';
108603                 case constant.ALERT_REFRESH_FROM_CLIENT_BY_SERVER: return 'refresh-from-client-by-server';
108604                 case constant.ALERT_ONE_WAY_FROM_SERVER_BY_SERVER: return 'one-way-from-server-by-server';
108605                 case constant.ALERT_REFRESH_FROM_SERVER_BY_SERVER: return 'refresh-from-server-by-server';
108606                 default: return 'UNKNOWN';
108607             }
108608         },
108609
108610         //-------------------------------------------------------------------------
108611         state2string: function(state) {
108612             switch ( state )
108613             {
108614                 case constant.ITEM_OK:           return 'ok';
108615                 case constant.ITEM_ADDED:        return 'added';
108616                 case constant.ITEM_MODIFIED:     return 'modified';
108617                 case constant.ITEM_DELETED:      return 'deleted';
108618                 case constant.ITEM_SOFTDELETED:  return 'soft-deleted';
108619                 default: return 'UNKNOWN';
108620             }
108621         },
108622
108623         //-------------------------------------------------------------------------
108624         oneWay: function(mode) {
108625             switch ( mode )
108626             {
108627                 case constant.ALERT_TWO_WAY:
108628                 case constant.ALERT_SLOW_SYNC:
108629                     return false;
108630                 case constant.ALERT_ONE_WAY_FROM_CLIENT:
108631                 case constant.ALERT_REFRESH_FROM_CLIENT:
108632                 case constant.ALERT_ONE_WAY_FROM_SERVER:
108633                 case constant.ALERT_REFRESH_FROM_SERVER:
108634                     return true;
108635                     // case constant.ALERT_TWO_WAY_BY_SERVER:
108636                     // case constant.ALERT_ONE_WAY_FROM_CLIENT_BY_SERVER:
108637                     // case constant.ALERT_REFRESH_FROM_CLIENT_BY_SERVER:
108638                     // case constant.ALERT_ONE_WAY_FROM_SERVER_BY_SERVER:
108639                     // case constant.ALERT_REFRESH_FROM_SERVER_BY_SERVER:
108640                 default:
108641                     throw new exports.InternalError('invalid mode "' + mode + '"');
108642             }
108643         },
108644
108645         //-------------------------------------------------------------------------
108646         oneWayIn: function(session, mode) {
108647             switch ( mode )
108648             {
108649                 case constant.ALERT_TWO_WAY:
108650                 case constant.ALERT_SLOW_SYNC:
108651                     return false;
108652                 case constant.ALERT_ONE_WAY_FROM_CLIENT:
108653                 case constant.ALERT_REFRESH_FROM_CLIENT:
108654                     return !! session.isServer;
108655                 case constant.ALERT_ONE_WAY_FROM_SERVER:
108656                 case constant.ALERT_REFRESH_FROM_SERVER:
108657                     return ! session.isServer;
108658                     // case constant.ALERT_TWO_WAY_BY_SERVER:
108659                     // case constant.ALERT_ONE_WAY_FROM_CLIENT_BY_SERVER:
108660                     // case constant.ALERT_REFRESH_FROM_CLIENT_BY_SERVER:
108661                     // case constant.ALERT_ONE_WAY_FROM_SERVER_BY_SERVER:
108662                     // case constant.ALERT_REFRESH_FROM_SERVER_BY_SERVER:
108663                 default:
108664                     throw new exports.InternalError('invalid mode "' + mode + '"');
108665             }
108666         },
108667
108668         //-------------------------------------------------------------------------
108669         oneWayOut: function(session, mode) {
108670             switch ( mode )
108671             {
108672                 case constant.ALERT_TWO_WAY:
108673                 case constant.ALERT_SLOW_SYNC:
108674                     return false;
108675                 case constant.ALERT_ONE_WAY_FROM_CLIENT:
108676                 case constant.ALERT_REFRESH_FROM_CLIENT:
108677                     return ! session.isServer;
108678                 case constant.ALERT_ONE_WAY_FROM_SERVER:
108679                 case constant.ALERT_REFRESH_FROM_SERVER:
108680                     return !! session.isServer;
108681                     // case constant.ALERT_TWO_WAY_BY_SERVER:
108682                     // case constant.ALERT_ONE_WAY_FROM_CLIENT_BY_SERVER:
108683                     // case constant.ALERT_REFRESH_FROM_CLIENT_BY_SERVER:
108684                     // case constant.ALERT_ONE_WAY_FROM_SERVER_BY_SERVER:
108685                     // case constant.ALERT_REFRESH_FROM_SERVER_BY_SERVER:
108686                 default:
108687                     throw new exports.InternalError('invalid mode "' + mode + '"');
108688             }
108689         },
108690
108691         //-------------------------------------------------------------------------
108692         cascade: function(list, iterator, cb) {
108693             if ( ! cb && iterator )
108694             {
108695                 cb = iterator;
108696                 iterator = null;
108697             }
108698             if ( ! list )
108699                 return cb();
108700             var cur = 0;
108701             var next = function() {
108702                 if ( cur >= list.length )
108703                     return cb();
108704                 var curcb = function(err) {
108705                     if ( err )
108706                         return cb(err);
108707                     cur += 1;
108708                     var args = [];
108709                     for ( var idx=1 ; idx<arguments.length ; idx++ )
108710                         args.push(arguments[idx]);
108711                     return next.apply(null, args);
108712                 };
108713                 var func = iterator || list[cur];
108714                 var args = [];
108715                 if ( iterator )
108716                     args.push(list[cur]);
108717                 for ( var idx=0 ; idx<arguments.length ; idx++ )
108718                     args.push(arguments[idx]);
108719                 args.push(curcb);
108720                 return func.apply(null, args);
108721             };
108722             return next();
108723         },
108724
108725         //-------------------------------------------------------------------------
108726         ts: function() {
108727             return Math.floor((new Date()).getTime() / 1000);
108728         },
108729
108730         //-------------------------------------------------------------------------
108731         j: function(obj) {
108732             return JSON.stringify(obj);
108733         },
108734
108735         //-------------------------------------------------------------------------
108736         noop: function(cb) {
108737             return cb();
108738         },
108739
108740         //-------------------------------------------------------------------------
108741         platformBits: function() {
108742
108743             // TODO: implement this!...
108744
108745             return 32;
108746         },
108747
108748         //-------------------------------------------------------------------------
108749         getMaxMemorySize: function(context) {
108750
108751             // Returns the maximum size of a memory object. By default this
108752             // is, set to ``sys.maxint``, however the `context` may override
108753             // this behavior.
108754
108755             // NOTE: currently, this is being hardcoded to a maximum of 2GB for
108756             //       compatibility with funambol servers, which croak above that
108757             //       value.
108758
108759             // TODO: allow the context to control this, or implement auto-detect to
108760             //       determine what the remote peer can support...
108761
108762             return Math.min(Math.pow(2, exports.platformBits() - 1) - 1,
108763                     Math.pow(2, 31) - 1);
108764         },
108765
108766         //-------------------------------------------------------------------------
108767         normpath: function(path) {
108768             if ( path == undefined )
108769                 return null;
108770             if ( path.length <= 0 )
108771                 return '';
108772             if ( path.indexOf('/') < 0 )
108773                 path = path.replace('\\', '/');
108774             var ret = [];
108775             var plist = path.split('/');
108776             for ( var idx=0 ; idx<plist.length ; idx++ )
108777             {
108778                 var item = plist[idx];
108779                 if ( item.length <= 0 || item == '.' )
108780                     continue;
108781                 if ( item != '..' || ret.length <= 0 || ret[ret.length - 1] == '..' )
108782                 {
108783                     ret.push(item);
108784                     continue;
108785                 }
108786                 ret.pop();
108787             }
108788             ret = ret.join('/');
108789             if ( path.charAt(0) != '/' )
108790                 return ret;
108791             return '/' + ret;
108792         },
108793
108794         //-------------------------------------------------------------------------
108795         int: function(str, defval) {
108796             if ( ! str )
108797                 return defval;
108798             return parseInt(str, 10);
108799         },
108800
108801         //-------------------------------------------------------------------------
108802         cmp: function(a, b) {
108803             if ( a < b )
108804                 return -1;
108805             if ( a > b )
108806                 return 1;
108807             return 0;
108808         },
108809
108810         //-------------------------------------------------------------------------
108811         // partially emulates python's string.split() method
108812         splitn: function(str, sep, limit) {
108813             var ret = str.split(sep);
108814             if ( ret.length <= ( limit + 1 ) )
108815                 return ret;
108816             var tmp = ret.slice(0, limit);
108817             tmp.push(ret.slice(limit).join(sep));
108818             return tmp;
108819         },
108820
108821         //-------------------------------------------------------------------------
108822         prettyJson: function(obj, indent) {
108823             indent = indent || '';
108824             var ret = '';
108825             if ( _.isArray(obj) )
108826             {
108827                 if ( obj.length <= 0 )
108828                     return '[]';
108829                 ret = '[\n' + indent;
108830                 _.each(obj, function(el, idx) {
108831                     ret += '  ' + exports.prettyJson(el, indent + '  ');
108832                     if ( idx + 1 < obj.length )
108833                     ret += ',';
108834                 ret += '\n' + indent;
108835                 });
108836                 return ret + ']';
108837             }
108838             if ( _.isObject(obj) )
108839             {
108840                 var keys = _.keys(obj);
108841                 if ( keys.length <= 0 )
108842                     return '{}';
108843                 keys.sort();
108844                 ret = '{\n' + indent;
108845                     _.each(keys, function(key, idx) {
108846                         ret += '  ' + exports.prettyJson(key)
108847                         + ': ' + exports.prettyJson(obj[key], indent + '  ');
108848                     if ( idx + 1 < keys.length )
108849                         ret += ',';
108850                     ret += '\n' + indent;
108851                     });
108852                     return ret + ( indent.length <= 0 ? '}\n' : '}' );
108853             }
108854             return JSON.stringify(obj);
108855         },
108856
108857         //-------------------------------------------------------------------------
108858         urlEncode: function(dat) {
108859             return ( dat == undefined ? dat : encodeURIComponent(dat) );
108860         },
108861
108862         //-------------------------------------------------------------------------
108863         /*
108864            rmfr: function(path, cb) {
108865            fs.stat(path, function(err, stats) {
108866            if ( err && err.code == 'ENOENT' )
108867            return cb();
108868            if ( err )
108869            return cb(err);
108870            if ( ! stats.isDirectory() )
108871            return fs.unlink(path, cb);
108872            fs.readdir(path, function(err, files) {
108873            exports.cascade(files, function(file, cb) {
108874            var curpath = pathmod.join(path, file);
108875            return exports.rmfr(curpath, cb);
108876            }, function(err) {
108877            if ( err )
108878            return cb(err);
108879            fs.rmdir(path, cb);
108880            });
108881            });
108882            });
108883            },
108884            */
108885         //-------------------------------------------------------------------------
108886         /*
108887            makedirs: function(path, cb) {
108888         // node sucks. i can't believe it doesn't provide a fs.makedirs(). wtf.
108889         // clean up the path
108890         path = pathmod.normalize(path.split(/[\\\/]/).join('/'));
108891         var paths = path.split('/');
108892         paths = _.map(paths, function(p, idx) {
108893         return paths.slice(0, idx + 1).join('/');
108894         });
108895         if ( path.charAt(0) == '/' )
108896         paths.shift();
108897         exports.cascade(paths, function(path, cb) {
108898         fs.stat(path, function(err, stats) {
108899         if ( err && err.code == 'ENOENT' )
108900         return fs.mkdir(path, cb);
108901         if ( err )
108902         return cb(err);
108903         if ( stats.isDirectory() )
108904         return cb();
108905         // this probably won't work, but let's get the error anyhow...
108906         return fs.mkdir(path, cb);
108907         });
108908         }, cb);
108909         },
108910         */
108911
108912         //-------------------------------------------------------------------------
108913         StringStream: exports.Stream.extend({
108914
108915             constructor: function(initData) {
108916                 this._data = initData || '';
108917             },
108918
108919         write: function(data) {
108920             if ( data == undefined )
108921             return;
108922         this._data += data;
108923         },
108924
108925         getData: function() {
108926             return this._data;
108927         }
108928
108929         }),
108930
108931         //-------------------------------------------------------------------------
108932         IndentStream: exports.Stream.extend({
108933
108934             //-----------------------------------------------------------------------
108935             constructor: function(stream, indent, options) {
108936                 options = options || {};
108937                 this._stream    = stream;
108938                 this._indent    = indent || '  ';
108939                 this._cleared   = true;
108940                 this._stayBlank = !! options.stayBlank;
108941             },
108942
108943         //-----------------------------------------------------------------------
108944         write: function(data) {
108945             var self = this;
108946             if ( data == undefined )
108947             return;
108948         // if ( ! data || ! data.length || data.length <= 0 )
108949         //   return;
108950         var lines = data.split('\n');
108951         if ( self._cleared )
108952             self._stream.write(self._indent);
108953         self._cleared = false;
108954         for ( var idx=0 ; idx<lines.length ; idx++ )
108955         {
108956             var line = lines[idx];
108957             if ( line == '' )
108958             {
108959                 if ( idx + 1 >= lines.length )
108960                     self._cleared = true;
108961                 else
108962                 {
108963                     if ( idx != 0 && ! self._stayBlank )
108964                         self._stream.write(self._indent);
108965                 }
108966             }
108967             else
108968             {
108969                 if ( idx != 0 || self._cleared )
108970                     self._stream.write(self._indent);
108971                 self._stream.write(line);
108972             }
108973             if ( idx + 1 < lines.length )
108974                 self._stream.write('\n');
108975         }
108976         }
108977
108978         })
108979
108980     });
108981
108982     return exports;
108983 })();
108984
108985 module.exports = _self;
108986
108987 });
108988 define('ripple/platform/tizen/2.0/syncml-js-lib/useragent', function (require, exports, module) {
108989 // -*- coding: utf-8 -*-
108990 //-----------------------------------------------------------------------------
108991 // file: $Id$
108992 // lib:  syncml-js.useragent
108993 // auth: griffin <griffin@uberdev.org>
108994 // date: 2013/06/07
108995 // copy: (C) CopyLoose 2013 UberDev <hardcore@uberdev.org>, No Rights Reserved.
108996 //-----------------------------------------------------------------------------
108997
108998 var common = require('ripple/platform/tizen/2.0/syncml-js-lib/common'),
108999     constant = require('ripple/platform/tizen/2.0/syncml-js-lib/constant'),
109000     _self;
109001
109002 _self = (function () {
109003     var exports = {};
109004
109005     //---------------------------------------------------------------------------
109006     exports.UserAgent = common.Base.extend({
109007         // primary handlers:
109008         acceptSyncModeSwitch:  null, // function(EVENT, CALLBACK(ERR))
109009             acceptDevInfoSwap:     null, // function(EVENT, CALLBACK(ERR))
109010             chooseRefreshRequired: null, // function(EVENT, CALLBACK(ERR, TYPE))
109011             fetchCredentials:      null, // function(EVENT, CALLBACK(ERR, AUTH))
109012             // fallback handlers:
109013             accept:                null, // function(TYPE, EVENT, CALLBACK(ERR))
109014             choose:                null, // function(TYPE, EVENT, CALLBACK(ERR, CHOICE))
109015             fetch:                 null, // function(TYPE, EVENT, CALLBACK(ERR, STRUCT))
109016             // catchall handler:
109017             handle:                null  // function(ACTION, TYPE, EVENT, CALLBACK(ERR, RESULT...))
109018     });
109019
109020     //---------------------------------------------------------------------------
109021     exports.UserAgentMultiplexer = common.Base.extend({
109022
109023         //-------------------------------------------------------------------------
109024         constructor: function(uaList) {
109025             this.ualist = uaList;
109026         },
109027
109028         //-------------------------------------------------------------------------
109029         _getHandler: function(name) {
109030             for ( var idx=0 ; idx<this.ualist.length ; idx++ )
109031     {
109032         var ua = this.ualist[idx];
109033         if ( ua && _.isFunction(ua[name]) )
109034         return ua[name];
109035     }
109036     return null;
109037         },
109038
109039         //-------------------------------------------------------------------------
109040         hasHandler: function(name) {
109041             return !! this._getHandler(name);
109042         },
109043
109044         //-------------------------------------------------------------------------
109045         acceptSyncModeSwitch: function(event, cb) {
109046             return this._handle({
109047                 handler: 'acceptSyncModeSwitch',
109048             action:  'accept',
109049             type:    'sync.mode.switch'
109050             }, event, cb);
109051         },
109052
109053         //-------------------------------------------------------------------------
109054         acceptDevInfoSwap: function(event, cb) {
109055             return this._handle({
109056                 handler: 'acceptDevInfoSwap',
109057             action:  'accept',
109058             type:    'dev.info.swap'
109059             }, event, cb);
109060         },
109061
109062         //-------------------------------------------------------------------------
109063         chooseRefreshRequired: function(event, cb) {
109064             return this._handle({
109065                 handler: 'chooseRefreshRequired',
109066             action:  'choose',
109067             type:    'refresh.required',
109068             choices: [
109069             {value: constant.SYNCTYPE_SLOW_SYNC, default: true},
109070             {value: constant.SYNCTYPE_REFRESH_FROM_CLIENT},
109071             {value: constant.SYNCTYPE_REFRESH_FROM_SERVER}
109072             ]
109073             }, event, function(err, choice) {
109074                 if ( err )
109075                 return cb(err);
109076             // todo: catch the condition where `choice` is not a valid synctype
109077             return cb(err, common.synctype2alert(choice));
109078             });
109079         },
109080
109081         //-------------------------------------------------------------------------
109082         fetchCredentials: function(event, cb) {
109083             return this._handle({
109084                 handler: 'fetchCredentials',
109085             action:  'fetch',
109086             type:    'auth.challenge',
109087             choices: [
109088             {value: constant.SYNCTYPE_SLOW_SYNC, default: true},
109089             {value: constant.SYNCTYPE_REFRESH_FROM_CLIENT},
109090             {value: constant.SYNCTYPE_REFRESH_FROM_SERVER}
109091             ]
109092             }, event, cb);
109093         },
109094
109095         //-------------------------------------------------------------------------
109096         _handle: function(spec, event, cb) {
109097             event = _.extend({}, spec, event, {
109098                 type         : spec.type,
109099             context      : event.session.context,
109100             adapter      : event.session.adapter,
109101             peer         : event.session.peer,
109102             ua_handler   : spec.handler,
109103             ua_action    : spec.action
109104             });
109105             var handler = this._getHandler(spec.handler);
109106             if ( handler )
109107                 return handler(event, cb);
109108             handler = this._getHandler(spec.action);
109109             if ( handler )
109110                 return handler(spec.type, event, cb);
109111             handler = this._getHandler('handle');
109112             if ( handler )
109113                 return handler(spec.action, spec.type, event, cb);
109114             if ( spec.action == 'accept' )
109115             {
109116                 return cb();
109117             }
109118             if ( spec.action == 'choose'
109119                     && event.choices && event.choices.length > 0 )
109120             {
109121                 var choice = _.find(event.choices, function(c) { return c.default; });
109122                 if ( ! choice )
109123                     choice = event.choices[0];
109124                 if ( choice.value )
109125                     choice = choice.value;
109126                 return cb(null, choice);
109127             }
109128             if ( spec.type == 'auth.challenge' )
109129                 return cb();
109130             return cb(new common.NotImplementedError(
109131                         'user-agent handler for event type "' + spec.type + '" (action: "'
109132                             + spec.action + '") not found or defined'));
109133         }
109134
109135     });
109136
109137     return exports;
109138
109139 })();
109140
109141 module.exports = _self;
109142
109143 });
109144 define('ripple/platform/tizen/2.0/syncml-js-lib/adapter', function (require, exports, module) {
109145 // -*- coding: utf-8 -*-
109146 //-----------------------------------------------------------------------------
109147 // file: $Id$
109148 // lib:  syncml-js.adapter
109149 // auth: griffin <griffin@uberdev.org>
109150 // date: 2012/10/22
109151 // copy: (C) CopyLoose 2012 UberDev <hardcore@uberdev.org>, No Rights Reserved.
109152 //-----------------------------------------------------------------------------
109153
109154 var common = require('ripple/platform/tizen/2.0/syncml-js-lib/common'),
109155     constant = require('ripple/platform/tizen/2.0/syncml-js-lib/constant'),
109156     storemod = require('ripple/platform/tizen/2.0/syncml-js-lib/store');
109157
109158
109159 var _self = (function () {
109160
109161     var exports = {};
109162
109163     //---------------------------------------------------------------------------
109164     exports.Adapter = common.Base.extend({
109165
109166         // //-------------------------------------------------------------------------
109167         // constructor: function(context, options, devInfo) {
109168
109169         //-------------------------------------------------------------------------
109170         normUri: function(uri) {
109171             return common.normpath(uri);
109172         },
109173
109174         //-------------------------------------------------------------------------
109175         getStores: function() {
109176             return _.values(this._stores);
109177         },
109178
109179         //-------------------------------------------------------------------------
109180         getStore: function(uri) {
109181             return this._stores[this.normUri(uri)];
109182         },
109183
109184         //-------------------------------------------------------------------------
109185         addStore: function(store, cb) {
109186             var self = this;
109187             if ( store instanceof storemod.Store )
109188             {
109189                 store.uri = self.normUri(store.uri);
109190                 store._a  = self;
109191             }
109192             else
109193                 store = new storemod.Store(this, store);
109194             store._updateModel(function(err) {
109195                 if ( err )
109196                 return cb(err);
109197             self._stores[store.uri] = store;
109198
109199             // TODO: remove this sensitivity...
109200             if ( ! self.isLocal )
109201                 return cb();
109202
109203             self._save(self._c._txn(), function(err) {
109204                 if ( err )
109205                 return cb(err);
109206             cb(null, store);
109207             });
109208             });
109209         },
109210
109211         //-------------------------------------------------------------------------
109212         removeStore: function(uri, cb) {
109213             var self = this;
109214             if ( ! self.isLocal )
109215                 // todo: implement
109216                 return cb(new common.LogicalError(
109217                             'cannot remove remote store "' + uri + '": remote peer responsibility'));
109218             if ( ! self._stores[uri] )
109219                 return cb(new common.InternalError(
109220                             'cannot remove store "' + uri + '": no such store'));
109221             delete self._stores[uri];
109222             var model = self._getModel();
109223             model.stores = _.filter(model.stores, function(store) {
109224                 return store.uri != uri;
109225             });
109226             _.each(model.peers, function(peer) {
109227                 peer.routes = _.filter(peer.routes, function(route) {
109228                     return route.localUri != uri;
109229                 });
109230                 _.each(peer.stores, function(store) {
109231                     if ( store.binding && store.binding.uri == uri )
109232                     store.binding = null;
109233                 });
109234             });
109235             return cb();
109236         },
109237
109238         //-------------------------------------------------------------------------
109239         _isMapper: function() {
109240             // indicates whether or not this adapter is capable of mapping
109241             // items. in the standard SyncML peer model, only the server
109242             // ever does mapping, but in the dream-land of syncml-js, all
109243             // peers can be mappers, or even better, implements an extension
109244             // "is-uuid/adopted" that does not require mapping. so, since
109245             // that is just a dream-land for now, this will try to identify
109246             // if this adapter represents a server...
109247             // todo: enhance syncml-js so that it is not needed!...
109248             if ( ! this.isLocal )
109249                 return this.url && this.url.length > 0;
109250             return this.devInfo && this.devInfo.devType == constant.DEVTYPE_SERVER;
109251         },
109252
109253         //-------------------------------------------------------------------------
109254         describe: function(stream, cb) {
109255             var self = this;
109256             if ( self.url )
109257                 stream.writeln('URL: ' + self.url);
109258             stream.writeln('Device ID: ' + self.devID);
109259             var s1 = stream.indented();
109260             var s2 = s1.indented();
109261
109262             var describe_stores = function(cb) {
109263                 var stores = self.getStores();
109264                 if ( stores.length <= 0 )
109265                 {
109266                     stream.writeln('Data stores: (none)');
109267                     return cb();
109268                 }
109269                 stream.writeln('Data stores:');
109270                 common.cascade(stores, function(store, cb) {
109271                     s1.writeln(( store.displayName || store.uri ) + ':');
109272                     store.describe(s2, cb);
109273                 }, cb);
109274             };
109275
109276             var describe_peers = function(cb) {
109277                 if ( ! self.getPeers )
109278                     return cb();
109279                 var peers = self.getPeers();
109280                 if ( peers.length <= 0 )
109281                 {
109282                     stream.writeln('Known peers: (none)');
109283                     return cb();
109284                 }
109285                 stream.writeln('Known peers:');
109286                 common.cascade(peers, function(peer, cb) {
109287                     s1.writeln(( peer.displayName || peer.url ) + ':');
109288                     peer.describe(s2, cb);
109289                 }, cb);
109290             }
109291
109292             describe_stores(function(err) {
109293                 if ( err )
109294                 return cb(err);
109295             describe_peers(cb);
109296             });
109297         }
109298
109299     });
109300
109301     return exports;
109302
109303     })();
109304
109305     module.exports = _self;
109306
109307 });
109308 define('ripple/platform/tizen/2.0/syncml-js-lib/synchronizer', function (require, exports, module) {
109309 // -*- coding: utf-8 -*-
109310 //-----------------------------------------------------------------------------
109311 // file: $Id$
109312 // lib:  syncml-js.synchronizer
109313 // auth: griffin <griffin@uberdev.org>
109314 // date: 2012/11/05
109315 // copy: (C) CopyLoose 2012 UberDev <hardcore@uberdev.org>, No Rights Reserved.
109316 //-----------------------------------------------------------------------------
109317
109318 var common = require('ripple/platform/tizen/2.0/syncml-js-lib/common'),
109319     constant = require('ripple/platform/tizen/2.0/syncml-js-lib/constant'),
109320     ctype = require('ripple/platform/tizen/2.0/syncml-js-lib/ctype'),
109321     state = require('ripple/platform/tizen/2.0/syncml-js-lib/state'),
109322     protocol = require('ripple/platform/tizen/2.0/syncml-js-lib/protocol'),
109323     storage = require('ripple/platform/tizen/2.0/syncml-js-lib/storage'),
109324     _self;
109325
109326 _self = (function () {
109327
109328     var exports = {};
109329     var badStatus = protocol.badStatus;
109330
109331     //---------------------------------------------------------------------------
109332     exports.Synchronizer = common.Base.extend({
109333
109334         //-------------------------------------------------------------------------
109335         constructor: function(options) {
109336         },
109337
109338         //-------------------------------------------------------------------------
109339         initStoreSync: function(session, cb) {
109340             async.eachSeries(session.peer._getModel().stores, function(rstore, cb) {
109341                 // TODO: should the server-side be doing this? probably not
109342                 //       since store mapping is a client-side decision...
109343                 var ruri = session.peer.normUri(rstore.uri);
109344                 if ( session.info.dsstates[ruri] || ! rstore.binding )
109345                 return cb();
109346             var lstore = session.adapter.getStore(rstore.binding.uri);
109347             if ( ! lstore || ! lstore.agent )
109348                 return cb();
109349             var ds = state.makeStoreSyncState({
109350                 uri        : lstore.uri,
109351                 peerUri    : ruri,
109352                 lastAnchor : rstore.binding.localAnchor,
109353                 mode       : session.info.mode || constant.ALERT_TWO_WAY,
109354                 action     : 'alert'
109355             });
109356             if ( ! ds.lastAnchor )
109357             {
109358                 switch ( ds.mode )
109359             {
109360                 case constant.ALERT_SLOW_SYNC:
109361                 case constant.ALERT_REFRESH_FROM_CLIENT:
109362                 case constant.ALERT_REFRESH_FROM_SERVER:
109363                     {
109364                         break;
109365                     }
109366                 case constant.ALERT_TWO_WAY:
109367                 case constant.ALERT_ONE_WAY_FROM_CLIENT:
109368                 case constant.ALERT_ONE_WAY_FROM_SERVER:
109369                     {
109370                         if ( session.info.mode == constant.SYNCTYPE_AUTO )
109371                         {
109372                             ds.mode = constant.ALERT_SLOW_SYNC;
109373                             break;
109374                         }
109375                         var uaEvent = {
109376                             session   : session,
109377                             store     : lstore,
109378                             peerStore : rstore,
109379                             modeReq   : ds.mode
109380                         };
109381                         return session.ua.chooseRefreshRequired(uaEvent, function(err, mode) {
109382                             if ( err )
109383                             return cb(err);
109384                         if ( ! _.contains([constant.ALERT_SLOW_SYNC,
109385                                 constant.ALERT_REFRESH_FROM_CLIENT,
109386                                 constant.ALERT_REFRESH_FROM_SERVER], mode) )
109387                             return cb(new common.TypeError(
109388                                     'invalid mode chosen for refresh: ' + common.j(mode)));
109389                         ds.mode = mode;
109390                         session.info.dsstates[ds.uri] = ds;
109391                         return cb();
109392                         });
109393                     }
109394                 default:
109395                     {
109396                         return cb(new common.InternalError(
109397                                     'unexpected sync mode "' + ds.mode + '" requested'));
109398                     }
109399             }
109400             }
109401             session.info.dsstates[ds.uri] = ds;
109402             return cb();
109403             }, cb);
109404         },
109405
109406         //-------------------------------------------------------------------------
109407         // SYNCHRONIZATION PHASE: ACTION
109408         //-------------------------------------------------------------------------
109409
109410         //-------------------------------------------------------------------------
109411         actions: function(session, commands, cb) {
109412             var self = this;
109413             common.cascade(_.keys(session.info.dsstates), function(uri, cb) {
109414                 var ds = session.info.dsstates[uri];
109415                 if ( ds.action == 'done' )
109416                 return cb();
109417             // TODO: is this the right handling of an "error" dsstate?...
109418             if ( ds.action == 'error' )
109419                 return cb();
109420             var func = self['_action_' + ds.action.toLowerCase()];
109421             if ( ! func )
109422                 return cb(new common.InternalError(
109423                         'unexpected store action "' + ds.action + '"'));
109424             try{
109425                 func.call(self, session, ds, function(err, cmds) {
109426                     if ( err )
109427                     return cb(err);
109428                 _.each(cmds, function(cmd) { commands.push(cmd); });
109429                 return cb();
109430                 });
109431             }catch(e){
109432                 return cb(new common.InternalError(
109433                         'failed invoking synchronizer action: ' + e, e));
109434             }
109435             }, function(err) {
109436                 if ( err )
109437                     return cb(err);
109438                 return cb(null, commands);
109439             });
109440         },
109441
109442         //-------------------------------------------------------------------------
109443         _action_alert: function(session, dsstate, cb) {
109444
109445             var src = session.adapter.getStore(dsstate.uri);
109446             var tgt = session.peer.getStore(dsstate.peerUri);
109447
109448             // TODO: ensure that mode is acceptable...
109449
109450             // todo: perhaps i should only specify maxObjSize if it differs from
109451             //       adapter.maxObjSize?...
109452
109453             return cb(null, [state.makeCommand({
109454                 name        : constant.CMD_ALERT,
109455                    cmdID       : session.nextCmdID(),
109456                    data        : dsstate.mode,
109457                    source      : src.uri,
109458                    target      : tgt.uri,
109459                    lastAnchor  : dsstate.lastAnchor,
109460                    nextAnchor  : dsstate.nextAnchor,
109461                    maxObjSize  : src.maxObjSize,
109462             })]);
109463
109464         },
109465
109466         //-------------------------------------------------------------------------
109467         _action_send: function(session, dsstate, cb) {
109468             var store = session.adapter.getStore(dsstate.uri);
109469             var agent = store.agent;
109470             var peerStore = session.peer.getStore(dsstate.peerUri);
109471
109472             var cmd = state.makeCommand({
109473                 name   : constant.CMD_SYNC,
109474                 cmdID  : session.nextCmdID(),
109475                 source : dsstate.uri,
109476                 // target : adapter.router.getTargetUri(uri),
109477                 target : dsstate.peerUri
109478             });
109479
109480             switch ( dsstate.mode )
109481             {
109482                 case constant.ALERT_TWO_WAY:
109483                 case constant.ALERT_SLOW_SYNC:
109484                 case constant.ALERT_ONE_WAY_FROM_CLIENT:
109485                 case constant.ALERT_REFRESH_FROM_CLIENT:
109486                 case constant.ALERT_ONE_WAY_FROM_SERVER:
109487                 case constant.ALERT_REFRESH_FROM_SERVER:
109488                     // todo: these should only be received out-of-band, right?...
109489                     // case constant.ALERT_TWO_WAY_BY_SERVER:
109490                     // case constant.ALERT_ONE_WAY_FROM_CLIENT_BY_SERVER:
109491                     // case constant.ALERT_REFRESH_FROM_CLIENT_BY_SERVER:
109492                     // case constant.ALERT_ONE_WAY_FROM_SERVER_BY_SERVER:
109493                     // case constant.ALERT_REFRESH_FROM_SERVER_BY_SERVER:
109494                     {
109495                         break;
109496                     }
109497                 default:
109498                     {
109499                         return cb(new common.InternalError(
109500                                     'unexpected sync mode "' + common.mode2string(dsstate.mode) + '"'));
109501                     }
109502             }
109503
109504             if ( session.isServer )
109505             {
109506                 if ( dsstate.mode == constant.ALERT_REFRESH_FROM_CLIENT
109507                         || dsstate.mode == constant.ALERT_ONE_WAY_FROM_CLIENT )
109508                 {
109509                     cmd.noc = 0;
109510                     return cb(null, [cmd]);
109511                 }
109512             }
109513
109514             if ( ! session.isServer )
109515             {
109516                 if ( dsstate.mode == constant.ALERT_REFRESH_FROM_SERVER
109517                         || dsstate.mode == constant.ALERT_ONE_WAY_FROM_SERVER )
109518                 {
109519                     cmd.noc = 0;
109520                     return cb(null, [cmd]);
109521                 }
109522             }
109523
109524             switch ( dsstate.mode )
109525             {
109526
109527                 case constant.ALERT_TWO_WAY:
109528                 case constant.ALERT_ONE_WAY_FROM_CLIENT: // when ! session.isServer
109529                 case constant.ALERT_ONE_WAY_FROM_SERVER: // when session.isServer
109530                     {
109531                         // send local changes
109532
109533                         storage.getAll(
109534                                 session.context,
109535                                 session.txn().objectStore('change').index('store_id'),
109536                                 {only: peerStore.id},
109537                                 function(err, changes) {
109538                                     if ( err )
109539                             return cb(err);
109540                         var ctype = session.context.router.getBestTransmitContentType(
109541                             session.adapter, session.peer, dsstate.uri);
109542                         cmd.data = [];
109543
109544                         // TODO: add support for hierarchical operations...
109545                         //       including MOVE, COPY, etc.
109546
109547                         // TODO: this assumes that the entire object set can fit in memory...
109548                         //       perhaps, as a work-around, just keep a reference to the object
109549                         //       and then stream-based serialize it actually gets converted to
109550                         //       XML.
109551
109552                         common.cascade(changes, function(change, cb) {
109553
109554                             if ( dsstate.conflicts && _.indexOf(dsstate.conflicts, change.item_id) >= 0 )
109555                             return cb();
109556
109557                         var scmdtype = null;
109558                         switch ( change.state )
109559                         {
109560                             case constant.ITEM_ADDED:    scmdtype = constant.CMD_ADD;     break;
109561                             case constant.ITEM_MODIFIED: scmdtype = constant.CMD_REPLACE; break;
109562                             case constant.ITEM_DELETED:  scmdtype = constant.CMD_DELETE;  break;
109563                             default:
109564                                                          {
109565                                                              return cb();
109566                                                          }
109567                         }
109568
109569                         // todo: do something with the ctype version (ie. ctype[1])?...
109570                         var scmd = state.makeCommand({
109571                             name    : scmdtype,
109572                             cmdID   : session.nextCmdID(),
109573                             format  : constant.FORMAT_AUTO,
109574                             type    : change.state != constant.ITEM_DELETED ? ctype[0] : null,
109575                             uri     : dsstate.uri
109576                         });
109577
109578                         // TODO: need to add hierarchical addition support here...
109579
109580                         var set_data = scmdtype == constant.CMD_DELETE ? common.noop : function(cb) {
109581
109582                             agent.getItem(change.item_id, function(err, item) {
109583                                 if ( err )
109584                                 return cb(err);
109585                             agent.dumpsItem(item, ctype[0], ctype[1], function(err, data, nct, nv) {
109586                                 if ( err )
109587                                 return cb(err);
109588                             scmd.data = data;
109589                             scmd.type = nct || scmd.type;
109590                             // todo: what to do with the content-type version?... eg.
109591                             //         scmd.version = nv || scmd.version;
109592                             // TODO: support hierarchical sync
109593                             // if ( agent.hierarchicalSync && item.parent )
109594                             //   scmd.sourceParent = '' + item.parent
109595                             return cb();
109596                             });
109597                             });
109598                         };
109599
109600                         var set_target = scmdtype == constant.CMD_ADD ? function(cb) {
109601                             scmd.source = change.item_id;
109602                             cb();
109603                         } : function(cb) {
109604                             if ( ! session.isServer )
109605                             {
109606                                 scmd.source = change.item_id;
109607                                 return cb();
109608                             }
109609                             peerStore._getMapping(change.item_id, function(err, luid) {
109610                                 if ( err )
109611                                 return cb(err);
109612                             if ( luid )
109613                                 scmd.target = luid;
109614                             else
109615                                 scmd.source = change.item_id;
109616                             cb();
109617                             });
109618                         };
109619
109620                         set_data(function(err) {
109621                             if ( err )
109622                             return cb(err);
109623                         set_target(function(err) {
109624                             if ( err )
109625                             return cb(err);
109626                         cmd.data.push(scmd);
109627                         return cb();
109628                         });
109629                         });
109630                         }, function(err) {
109631                             if ( err )
109632                                 return cb(err);
109633                             cmd.noc = cmd.data.length;
109634                             return cb(null, [cmd]);
109635                         });
109636                                 }
109637                         );
109638                         return;
109639                     }
109640                 case constant.ALERT_SLOW_SYNC:
109641                 case constant.ALERT_REFRESH_FROM_SERVER: // when session.isServer
109642                 case constant.ALERT_REFRESH_FROM_CLIENT: // when ! session.isServer
109643                     {
109644                         // todo: this approach assumes that the entire object set can fit
109645                         //       in memory... perhaps move to an iterator-based approach?...
109646                         cmd.data = [];
109647
109648                         agent.getAllItems(function(err, items) {
109649
109650                             if ( err )
109651                             return cb(err);
109652
109653                         // TODO: support hierarchical sync...
109654
109655                         if ( agent.hierarchicalSync )
109656                         {
109657                             return cb(new common.NotImplementedError('hierarchical-sync'));
109658                             //       orditems = []            # the ordered items
109659                             //       dunitems = dict()        # lut of the ordered items
109660                             //       curitems = dict()        # lut of current items (for loop detection)
109661                             //       lutitems = dict([(item.id, item) for item in items])
109662                             //       def appenditem(item):
109663                             //         if item.id in dunitems:
109664                             //           return
109665                             //         if item.id in curitems:
109666                             //           raise common.LogicalError('recursive item hierarchy detected at item %r' % (item,))
109667                             //         curitems[item.id] = True
109668                             //         if item.parent is not None:
109669                             //           appenditem(lutitems[item.parent])
109670                             //         orditems.append(item)
109671                             //         dunitems[item.id] = item
109672                             //       for item in items:
109673                             //         curitems = dict()
109674                             //         appenditem(item)
109675                         }
109676
109677                         var ctype = session.context.router.getBestTransmitContentType(
109678                                 session.adapter, session.peer, dsstate.uri);
109679
109680                         common.cascade(items, function(item, cb) {
109681
109682                             // TODO: these should all be non-deleted items, right?...
109683
109684                             if ( _.indexOf(dsstate.conflicts, '' + item.id) >= 0 )
109685                             return cb();
109686
109687                         // note: need to check for mappings since on slow-sync, the
109688                         // server will already have received the client's "add" commands
109689                         // at this point (and therefore should not send them back...)
109690                         var check_sync = function(cb) {
109691                             if ( ! session.isServer )
109692                             return cb(null, true);
109693                         peerStore._getMapping(item.id, function(err, luid) {
109694                             return cb(err, luid ? false : true);
109695                         });
109696                         };
109697
109698                         check_sync(function(err, dosync) {
109699                             if ( err )
109700                             return cb(err);
109701
109702                         if ( ! dosync )
109703                             return cb();
109704
109705                         agent.dumpsItem(
109706                             item, ctype[0], ctype[1],
109707                             function(err, data, new_ct, new_v) {
109708
109709                                 if ( err )
109710                             return cb(err);
109711
109712                         // todo: do something with the content-type version...
109713                         var scmd = state.makeCommand({
109714                             name    : constant.CMD_ADD,
109715                             cmdID   : session.nextCmdID(),
109716                             format  : constant.FORMAT_AUTO,
109717                             type    : new_ct || ctype[0],
109718                             uri     : dsstate.uri,
109719                             source  : '' + item.id,
109720                             data    : data
109721                         });
109722
109723                         if ( agent.hierarchicalSync )
109724                         {
109725                             // TODO: support hierarchical sync...
109726                             // if agent.hierarchicalSync and item.parent is not None:
109727                             //   scmd.sourceParent = str(item.parent)
109728                             return cb(new common.NotImplementedError('hierarchical-sync'));
109729                         }
109730
109731                         cmd.data.push(scmd);
109732                         return cb();
109733                             });
109734
109735                         });
109736
109737                         }, function(err) {
109738                             if ( err )
109739                                 return cb(err);
109740                             cmd.noc = cmd.data.length;
109741                             return cb(null, [cmd]);
109742                         });
109743
109744                         });
109745                         return;
109746                     }
109747             }
109748
109749             return cb(new common.InternalError(
109750                         'unexpected sync situation (action=' + dsstate.action
109751                             + ', mode=' + common.mode2string(dsstate.mode)
109752                             + ', isServer=' + ( session.isServer ? '1' : '0' ) + ')'));
109753                     },
109754
109755                     //-------------------------------------------------------------------------
109756                     _action_save: function(session, dsstate, cb) {
109757                         if ( ! session.isServer )
109758                 // TODO: for now, only servers should take the "save" action - the client
109759                 //       will explicitly do this at the end of the .sync() method.
109760                 //       ... mostly because clients don't call synchronizer.actions()
109761                 //       one final time ...
109762                 //       *BUT* perhaps that should be changed?... for example, .sync()
109763                 //       could call synchronizer.actions() to cause action_save's to occur
109764                 //       *AND* verify that synchronizer.actions() does not return anything...
109765                 return cb(new common.InternalError(
109766                         'unexpected sync save situation (action=' + dsstate.action
109767                             + ', mode=' + common.mode2string(dsstate.mode)
109768                             + ', isServer=' + ( session.isServer ? '1' : '0' ) + ')'));
109769
109770                     var peerStore = session.peer.getStore(dsstate.peerUri);
109771                     var binding = peerStore._getBinding();
109772                     binding.localAnchor  = dsstate.nextAnchor;
109773                     binding.remoteAnchor = dsstate.peerNextAnchor;
109774                     return cb(null);
109775                     },
109776
109777                     //-------------------------------------------------------------------------
109778                     // SYNCHRONIZATION PHASE: REACTION
109779                     //-------------------------------------------------------------------------
109780
109781                     //-------------------------------------------------------------------------
109782                     reactions: function(session, commands, cb) {
109783                         var self = this;
109784                         var ret  = [];
109785                         session.hierlut = null;
109786                         common.cascade(commands, function(cmd, cb) {
109787                             var func = self['_reaction_' + cmd.name.toLowerCase()];
109788                             if ( ! func )
109789                             return cb(new common.InternalError(
109790                                     'unexpected store reaction "' + cmd.name + '"'));
109791                         try{
109792                             func.call(self, session, cmd, function(err, cmds) {
109793                                 if ( err ) {
109794                                     return cb(err);
109795                                 }
109796                                 _.each(cmds, function(cmd) { ret.push(cmd); });
109797                                 return cb();
109798                             });
109799                         }catch(e){
109800                             return cb(new common.InternalError(
109801                                     'failed invoking synchronizer reaction: ' + e, e));
109802                         }
109803                         }, function(err) {
109804                             session.hierlut = null;
109805                             if ( err )
109806                                 return cb(err);
109807                             return cb(null, ret);
109808                         });
109809                     },
109810
109811                     //-------------------------------------------------------------------------
109812                     _reaction_sync: function(session, command, cb) {
109813                         var self = this;
109814                         var ret  = [state.makeCommand({
109815                             name       : constant.CMD_STATUS,
109816                             cmdID      : session.nextCmdID(),
109817                             msgRef     : command.msgID,
109818                             cmdRef     : command.cmdID,
109819                             targetRef  : command.target,
109820                             sourceRef  : command.source,
109821                             statusOf   : command.name,
109822                             statusCode : constant.STATUS_OK
109823                         })];
109824                         var store = session.adapter.getStore(session.adapter.normUri(command.target));
109825                         var dsstate = session.info.dsstates[store.uri];
109826                         if ( ! store.agent )
109827                         {
109828                             // todo: this is a bit different handling than anywhere else...
109829                             //       should everywhere else be like here, or the other way
109830                             //       round?...
109831                             //       the "REAL BIG ISSUE" is that atomicity of the changes
109832                             //       is a little vague at this point...
109833                             dsstate.stats.hereErr += 1;
109834                             dsstate.action = 'error';
109835                             dsstate.error  = {
109836                                 message:  'Sync agent for store "' + store.uri + '" not available',
109837                                 code:     'syncml-js.TypeError'
109838                             };
109839                             ret[0].statusCode = constant.STATUS_SERVICE_UNAVAILABLE;
109840                             ret[0].errorMsg   = dsstate.error.message;
109841                             ret[0].errorCode  = dsstate.error.code;
109842                             return cb(null, ret);
109843                         }
109844
109845                         if ( store.agent.hierarchicalSync )
109846                             session.hierlut = {};
109847
109848                         var preprocess = common.noop;
109849
109850                         if ( ( ! session.isServer && dsstate.mode == constant.ALERT_REFRESH_FROM_SERVER )
109851                                 || ( session.isServer && dsstate.mode == constant.ALERT_REFRESH_FROM_CLIENT ) )
109852                         {
109853                             // delete all local items
109854                             preprocess = function(cb) {
109855                                 store.agent.getAllItems(function(err, items) {
109856                                     if ( err )
109857                                     return cb(err);
109858                                 common.cascade(items, function(item, cb) {
109859                                     store.agent.deleteItem(item.id, function(err) {
109860                                         if ( err )
109861                                         return cb(err);
109862                                     dsstate.stats.hereDel += 1;
109863                                     if ( ! session.isServer )
109864                                         return cb();
109865                                     store.registerChange(item.id, constant.ITEM_DELETED,
109866                                         {excludePeerID: session.peer.id}, cb);
109867                                     });
109868                                 }, function(err) {
109869                                     if ( err )
109870                                     return cb(err);
109871                                 return store.getPeerStore(session.peer)._delChange({}, cb);
109872                                 });
109873                                 });
109874                             };
109875                         }
109876
109877                         if ( dsstate.mode == constant.ALERT_SLOW_SYNC
109878                                 || ( session.isServer && dsstate.mode == constant.ALERT_REFRESH_FROM_SERVER ) )
109879                         {
109880                             // delete all mappings and pending changes
109881                             var peerStore = store.getPeerStore(session.peer);
109882                             var prepreprocess = preprocess;
109883                             preprocess = function(cb) {
109884                                 prepreprocess(function(err) {
109885                                     if ( err )
109886                                     return cb(err);
109887                                 peerStore._delChange({}, function(err) {
109888                                     if ( err )
109889                                     return cb(err);
109890                                 peerStore._clearAllMappings(cb);
109891                                 });
109892                                 });
109893                             };
109894                         }
109895
109896                         preprocess(function(err) {
109897                             if ( err )
109898                             return cb(err);
109899
109900                         if ( command.data.length <= 0 )
109901                             return cb(null, ret);
109902
109903                         // paranoia: verify that i should be receiving data...
109904                         if ( ! ( dsstate.mode == constant.ALERT_TWO_WAY
109905                                 || dsstate.mode == constant.ALERT_SLOW_SYNC
109906                                 || ( ! session.isServer
109907                                     && ( dsstate.mode == constant.ALERT_ONE_WAY_FROM_SERVER
109908                                         || dsstate.mode == constant.ALERT_REFRESH_FROM_SERVER ) )
109909                                 || ( session.isServer
109910                                     && ( dsstate.mode == constant.ALERT_ONE_WAY_FROM_CLIENT
109911                                         || dsstate.mode == constant.ALERT_REFRESH_FROM_CLIENT ) ) ) )
109912                             return cb(new common.ProtocolError(
109913                                     'unexpected sync data (role="'
109914                                         + ( session.isServer ? 'server' : 'client' )
109915                                         + '", mode="' + common.mode2string(dsstate.mode)
109916                                         + '")'));
109917
109918                         common.cascade(command.data, function(cmd, cb) {
109919
109920                             // NOTE: commented this paranoia setting out, since the server
109921                             //       *may* decide to update/delete a client item...
109922                             //       e.g. conflict-resolved-merge (207)
109923                             // TODO: perhaps i should only allow non-ADDs for those items
109924                             //       that i received a conflict-resolved-merge (207) for?...
109925
109926                             // // paranoia: non-'add' sync commands should only be received in non-refresh modes
109927                             // if ( cmd.name != constant.CMD_ADD
109928                             //      && _.indexOf([constant.ALERT_TWO_WAY,
109929                             //                    constant.ALERT_ONE_WAY_FROM_SERVER,
109930                             //                    constant.ALERT_ONE_WAY_FROM_CLIENT], dsstate.mode) < 0 )
109931                             //   return cb(new common.ProtocolError(
109932                             //     'unexpected non-add sync command (role="'
109933                             //       + ( session.isServer ? 'server' : 'client' )
109934                             //       + '", mode="' + common.mode2string(dsstate.mode)
109935                             //       + '", command="' + cmd.name
109936                             //       + '")'));
109937
109938                             self._reaction_syncdispatch(session, cmd, store, dsstate, function(err, cmds) {
109939                                 if ( err )
109940                                 return cb(err);
109941                             _.each(cmds, function(cmd) { ret.push(cmd); });
109942                             return cb();
109943                             });
109944
109945                         }, function(err) {
109946                             if ( err )
109947                                 return cb(err);
109948                             return cb(null, ret);
109949                         });
109950                         });
109951                     },
109952
109953                     //-------------------------------------------------------------------------
109954                     _reaction_syncdispatch: function(session, cmd, store, dsstate, cb) {
109955
109956                         var self = this;
109957                         var func = self['_reaction_sync_' + cmd.name.toLowerCase()];
109958                         if ( ! func )
109959                             return cb(new common.ProtocolError(
109960                                         'unexpected reaction requested for sync command "' + cmd.name + '"'));
109961
109962                         var check_for_conflicts = common.noop;
109963
109964                         if ( session.isServer
109965                                 && cmd.name != constant.CMD_ADD
109966                                 && dsstate.mode != constant.ALERT_REFRESH_FROM_CLIENT )
109967                         {
109968                             // server, non-add, non-slowsync, non-refresh commands: check for conflicts.
109969                             // note that certain types of content could be a conflict even if it is an
109970                             // "Add" command; for example, two files with the same name cannot be added
109971                             // from separate clients.
109972
109973                             check_for_conflicts = function(cb) {
109974
109975                                 // todo: allow agents to raise a ConflictError...
109976                                 //       ==> perhaps this is already covered by the .matchItem() API?...
109977
109978                                 var policy = store.conflictPolicy || session.adapter.conflictPolicy;
109979                                 var peerStore = session.peer.getStore(dsstate.peerUri);
109980                                 self.getSourceMapping(
109981                                         session, constant.CMD_SYNC, cmd, peerStore, cmd.source,
109982                                         function(err, itemID) {
109983
109984                                             if ( err )
109985                                     return cb(err);
109986                                 if ( ! itemID )
109987                                     // this shouldn't happen...
109988                                     return cb();
109989
109990                                 peerStore._getChange(itemID, function(err, change) {
109991                                     if ( err )
109992                                     return cb(err);
109993                                 if ( ! change )
109994                                     return cb();
109995
109996                                 var retcmd = state.makeCommand({
109997                                     name       : constant.CMD_STATUS,
109998                                     cmdID      : session.nextCmdID(),
109999                                     msgRef     : cmd.msgID,
110000                                     cmdRef     : cmd.cmdID,
110001                                     sourceRef  : cmd.source,
110002                                     targetRef  : cmd.target,
110003                                     statusOf   : cmd.name,
110004                                     // todo: make this error message a bit more descriptive...
110005                                     errorMsg   : 'command "' + cmd.name + '" conflict for item ID "'
110006                                     + itemID + '" (state: ' + common.state2string(change.state) + ')'
110007                                 });
110008
110009
110010                                     // four possible states: mod-mod, mod-del, del-mod, del-del
110011                                     if ( ! dsstate.conflicts )
110012                                     dsstate.conflicts = [];
110013
110014                                     // handle mod-mod (but only if change-tracking is enabled)
110015                                     if ( change.state == constant.ITEM_MODIFIED
110016                                         && cmd.name == constant.CMD_REPLACE )
110017                                     {
110018                                         cmd._conflict = retcmd;
110019                                         cmd._change   = change;
110020                                         return cb();
110021                                     }
110022
110023                                     // handle del-del
110024                                     if ( change.state == constant.ITEM_DELETED
110025                                             && cmd.name == constant.CMD_DELETE )
110026                                     {
110027                                         // both changes are deletes... that's not a conflict.
110028                                         // TODO: should i really be doing all this here?... it does not
110029                                         //       follow the pattern..
110030                                         peerStore._delChange({
110031                                             itemID: change.item_id,
110032                                             state:  change.state
110033                                         }, function(err) {
110034                                             if ( err )
110035                                             return cb(err);
110036                                         dsstate.stats.peerDel   += 1;
110037                                         dsstate.stats.hereDel   += 1;
110038                                         dsstate.stats.merged    += 1;
110039                                         retcmd.statusCode = constant.STATUS_CONFLICT_RESOLVED_MERGE;
110040                                         retcmd.errorCode  = null;
110041                                         retcmd.errorMsg   = null;
110042                                         return cb(null, [retcmd]);
110043                                         });
110044                                         return;
110045                                     }
110046
110047                                     // handle del-mod or mod-del
110048                                     if ( ( change.state == constant.ITEM_DELETED
110049                                                 || cmd.name == constant.CMD_DELETE )
110050                                             && policy != constant.POLICY_ERROR )
110051                                     {
110052                                         // one of them is a delete and a conflict that can be solved
110053                                         // by the framework
110054                                         cmd._conflict = retcmd;
110055                                         cmd._change   = change;
110056                                         return cb();
110057                                     }
110058
110059                                     dsstate.conflicts.push(itemID);
110060                                     dsstate.stats.peerErr   += 1;
110061                                     dsstate.stats.conflicts += 1;
110062                                     retcmd.statusCode = constant.STATUS_UPDATE_CONFLICT;
110063                                     retcmd.errorCode  = 'syncml-js.synchronizer.RSd.10';
110064                                     return cb(null, [retcmd]);
110065                                 });
110066                                         }
110067                                 );
110068                             };
110069                         }
110070
110071                         check_for_conflicts(function(err, cmds) {
110072                             if ( err || cmds )
110073                             return cb(err, cmds);
110074                         try{
110075                             func.call(self, session, cmd, store, dsstate, cb);
110076                         }catch(e){
110077                             return cb(new common.InternalError(
110078                                     'failed invoking synchronizer sync reaction: ' + e, e));
110079                         }
110080                         });
110081
110082                     },
110083
110084                     //-------------------------------------------------------------------------
110085                     _reaction_sync_add: function(session, cmd, store, dsstate, cb) {
110086                         var curitem = null;
110087                         var item    = null;
110088                         if ( store.agent.hierarchicalSync )
110089                         {
110090                             if ( cmd.targetParent )
110091                                 cmd.data.parent = cmd.targetParent;
110092                             else if ( cmd.sourceParent )
110093                                 cmd.data.parent = session.hierlut[cmd.sourceParent];
110094                         }
110095
110096                         var matcher = common.noop;
110097                         if ( session.isServer && dsstate.mode == constant.ALERT_SLOW_SYNC )
110098                         {
110099                             // TODO: if the matched item is already mapped to another client-side
110100                             //       object, then this should cancel the matching...
110101                             matcher = function(cb) {
110102                                 store.agent.matchItem(cmd.data, function(err, match) {
110103                                     if ( err )
110104                                     return cb(err);
110105                                 if ( ! match || ! match.compare )
110106                                     return cb();
110107                                 curitem = match;
110108                                 if ( match.compare(cmd.data) == 0 )
110109                                     return cb();
110110                                 store.agent.mergeItems(curitem, cmd.data, null, function(err) {
110111                                     // TODO: if there is a common.ConflictError, set
110112                                     //       curitem to null and continue without error...
110113                                     if ( err )
110114                                     return cb(err);
110115                                 store.registerChange(curitem.id, constant.ITEM_MODIFIED,
110116                                     {changeSpec: cspec, excludePeerID: session.peer.id},
110117                                     cb);
110118                                 });
110119                                 });
110120                             };
110121                         }
110122
110123                         matcher(function(err) {
110124                             if ( err )
110125                             return cb(err);
110126                         var adder = common.noop;
110127                         if ( ! curitem )
110128                             adder = function(cb) {
110129                                 store.agent.addItem(cmd.data, function(err, newitem) {
110130                                     if ( err )
110131                                     return cb(err);
110132                                 item = newitem;
110133                                 dsstate.stats.hereAdd += 1;
110134                                 store.registerChange(item.id, constant.ITEM_ADDED,
110135                                     {excludePeerID: session.peer.id}, cb);
110136                                 });
110137                             };
110138                         else
110139                             item = curitem;
110140                         return adder(function(err) {
110141                             if ( err )
110142                             return cb(err);
110143
110144                         if ( store.agent.hierarchicalSync )
110145                             session.hierlut[cmd.source] = item.id;
110146
110147                         var ret = [state.makeCommand({
110148                             name       : constant.CMD_STATUS,
110149                             cmdID      : session.nextCmdID(),
110150                             msgRef     : cmd.msgID,
110151                             cmdRef     : cmd.cmdID,
110152                             sourceRef  : cmd.source,
110153                             statusOf   : cmd.name,
110154                             statusCode : ( curitem
110155                                 ? constant.STATUS_ALREADY_EXISTS
110156                                 : constant.STATUS_ITEM_ADDED )
110157                         })];
110158
110159                         if ( ! session.isServer )
110160                         {
110161                             ret.push(state.makeCommand({
110162                                 name       : constant.CMD_MAP,
110163                                 cmdID      : session.nextCmdID(),
110164                                 source     : store.uri,
110165                                 target     : dsstate.peerUri,
110166                                 sourceItem : item.id,
110167                                 targetItem : cmd.source
110168                             }));
110169                             return cb(null, ret);
110170                         }
110171
110172                         var peerStore = session.peer.getStore(dsstate.peerUri);
110173                         peerStore._setMapping(item.id, cmd.source, function(err) {
110174                             if ( err )
110175                             return cb(err);
110176                         return cb(null, ret);
110177                         });
110178
110179                         });
110180                         });
110181
110182                     },
110183
110184                     //-------------------------------------------------------------------------
110185                     getSourceMapping: function(session, cmdctxt, cmd, peerStore, luid, cb) {
110186                         peerStore._getReverseMapping(luid, function(err, guid) {
110187
110188                             if ( err )
110189                             return cb(err);
110190
110191                         if ( guid )
110192                             return cb(null, guid);
110193
110194                         return cb(new common.InvalidItem(
110195                                 'unexpected "' + cmdctxt + '/' + cmd.name
110196                                 + '" request for unmapped item ID "' + luid + '"'));
110197
110198                         // todo: pysyncml generates a nice cmd-specific error node:
110199                         //       (which is probably over-kill)
110200
110201                         //     curmap = adapter._context._model.Mapping.q(store_id=peerStore.id, luid=luid).one()
110202                         //     return str(curmap.guid)
110203                         //   except NoResultFound:
110204                         //     msg = 'unexpected "%s/%s" request for unmapped item ID: %r' % (cmdctxt, cmd.name, luid)
110205                         //     # todo: this is a bit of a hack when cmdctxt == 'Status'...
110206                         //     return state.Command(
110207                         //       name       = constant.CMD_STATUS,
110208                         //       cmdID      = session.nextCmdID(),
110209                         //       msgRef     = cmd.msgID,
110210                         //       cmdRef     = cmd.cmdID,
110211                         //       sourceRef  = cmd.source,
110212                         //       targetRef  = cmd.target,
110213                         //       statusOf   = cmd.name if cmdctxt != constant.CMD_STATUS else cmdctxt,
110214                         //       statusCode = constant.STATUS_COMMAND_FAILED,
110215                         //       errorCode  = __name__ + '.' + self.__class__.__name__ + '.GSM.10',
110216                         //       errorMsg   = msg,
110217                         //       )
110218
110219                         });
110220                     },
110221
110222                     //-------------------------------------------------------------------------
110223                     _reaction_sync_replace: function(session, cmd, store, dsstate, cb) {
110224
110225                         // TODO: handle hierarchical-sync...
110226                         var self = this;
110227                         var item = cmd.data;
110228                         var get_item_id = ( ! session.isServer ) ? function(cb) {
110229                             item.id = cmd.target;
110230                             return cb();
110231                         } : function(cb) {
110232                             var peerStore = session.peer.getStore(dsstate.peerUri);
110233                             self.getSourceMapping(
110234                                     session, constant.CMD_SYNC, cmd, peerStore, cmd.source,
110235                                     function(err, guid) {
110236
110237                                         if ( err )
110238                                 return cb(err);
110239
110240                             // todo: what if guid is null?...
110241
110242                             item.id = guid;
110243                             return cb();
110244                                     }
110245                                     );
110246                         };
110247
110248                         var okcmd = state.makeCommand({
110249                             name       : constant.CMD_STATUS,
110250                             cmdID      : session.nextCmdID(),
110251                             msgRef     : cmd.msgID,
110252                             cmdRef     : cmd.cmdID,
110253                             targetRef  : cmd.target,
110254                             sourceRef  : cmd.source,
110255                             statusOf   : cmd.name,
110256                             statusCode : constant.STATUS_OK
110257                         });
110258
110259                         var handle_conflict = ( ! cmd._conflict ) ? common.noop : function(cb) {
110260
110261                             //   if cmd._conflict is not None:
110262                             //     try:
110263                             //       if cmd._change.state == constant.ITEM_DELETED:
110264                             //         raise common.ConflictError('item deleted')
110265                             //       if cmd._change.changeSpec is None:
110266                             //         raise common.ConflictError('no change tracking enabled - falling back to policy')
110267                             //       cspec = store.agent.mergeItems(store.agent.getItem(item.id), item, cmd._change.changeSpec)
110268                             //       dsstate.stats.hereMod += 1
110269                             //       store.registerChange(item.id, constant.ITEM_MODIFIED,
110270                             //                            changeSpec=cspec, excludePeerID=adapter.peer.id)
110271                             //       okcmd.statusCode = constant.STATUS_CONFLICT_RESOLVED_MERGE
110272                             //       # NOTE: *not* suppressing the change that is registered from server
110273                             //       #       to client, since the merge may have resulted in an item that
110274                             //       #       is not identical to the one on the client.
110275                             //       return [okcmd]
110276                             //     except common.ConflictError, e:
110277                             //       # conflict types: client=mod/server=mod or client=mod/server=del
110278                             //       if store.conflictPolicy == constant.POLICY_CLIENT_WINS:
110279                             //         adapter._context._model.session.delete(cmd._change)
110280                             //         dsstate.stats.merged += 1
110281                             //         okcmd.statusCode = constant.STATUS_CONFLICT_RESOLVED_CLIENT_DATA
110282                             //         if cmd._change.state == constant.ITEM_DELETED:
110283                             //           # todo: this "re-creation" of a new item is detrimental to
110284                             //           #       clients that are tracking changes to an item (for
110285                             //           #       example, a SyncML svn client bridge...). but then, to
110286                             //           #       them, this item may already have been deleted. ugh.
110287                             //           dsstate.stats.hereMod += 1
110288                             //           item = store.agent.addItem(item)
110289                             //           peerStore = store.peer
110290                             //           adapter._context._model.Mapping.q(store_id=peerStore.id, guid=item.id).delete()
110291                             //           newmap = adapter._context._model.Mapping(store_id=peerStore.id,
110292                             //                                                    guid=item.id,
110293                             //                                                    luid=cmd.source)
110294                             //           adapter._context._model.session.add(newmap)
110295                             //           store.registerChange(item.id, constant.ITEM_ADDED,
110296                             //                                excludePeerID=adapter.peer.id)
110297                             //           return [okcmd]
110298                             //         # falling back to standard handling...
110299                             //       elif store.conflictPolicy == constant.POLICY_SERVER_WINS:
110300                             //         dsstate.stats.merged += 1
110301                             //         okcmd.statusCode = constant.STATUS_CONFLICT_RESOLVED_SERVER_DATA
110302                             //         return [okcmd]
110303                             //       else:
110304                             //         # store.conflictPolicy == constant.POLICY_ERROR or other...
110305                             //         dsstate.stats.peerErr    += 1
110306                             //         dsstate.stats.conflicts  += 1
110307                             //         cmd._conflict.errorMsg   += ', agent failed merge: ' + str(e)
110308                             //         cmd._conflict.statusCode = constant.STATUS_UPDATE_CONFLICT
110309                             //         cmd._conflict.errorCode  = common.fullClassname(self) + '.RSR.10'
110310                             //         dsstate.conflicts.append(str(item.id))
110311                             //         return [cmd._conflict]
110312
110313                             cb();
110314
110315                         };
110316
110317                         // TODO: support hierarchical-sync...
110318                         // if ( store.agent.hierarchicalSync )
110319                         //   session.hierlut[cmd.source] = item.id;
110320
110321                         get_item_id(function(err) {
110322                             if ( err )
110323                             return cb(err);
110324                         handle_conflict(function(err) {
110325                             if ( err )
110326                             return cb(err);
110327                         store.agent.replaceItem(item, session.isServer, function(err, cspec) {
110328                             if ( err )
110329                             return cb(err);
110330                         dsstate.stats.hereMod += 1;
110331                         store.registerChange(
110332                             item.id, constant.ITEM_MODIFIED,
110333                             {changeSpec: cspec, excludePeerID: session.peer.id},
110334                             function(err) {
110335                                 if ( err )
110336                             return cb(err);
110337                         return cb(null, [okcmd]);
110338                             }
110339                             );
110340                         });
110341                         });
110342                         });
110343
110344                     },
110345
110346                     //-------------------------------------------------------------------------
110347                     _reaction_sync_delete: function(session, cmd, store, dsstate, cb) {
110348
110349                         var self   = this;
110350                         var status = constant.STATUS_OK;
110351                         var itemID = null;
110352
110353                         var get_item_id = ( ! session.isServer ) ? function(cb) {
110354                             itemID = cmd.target;
110355                             return cb();
110356                         } : function(cb) {
110357                             var peerStore = session.peer.getStore(dsstate.peerUri);
110358                             self.getSourceMapping(
110359                                     session, constant.CMD_SYNC, cmd, peerStore, cmd.source,
110360                                     function(err, guid) {
110361
110362                                         // if not isinstance(itemID, basestring):
110363                                         //   return [itemID]
110364
110365                                         if ( err )
110366                                 return cb(err);
110367
110368                             // todo: what if guid is null?...
110369
110370                             itemID = guid;
110371                             if ( ! cmd._conflict )
110372                                 return cb();
110373                             var policy = store.conflictPolicy || session.adapter.conflictPolicy;
110374                             switch ( policy )
110375                             {
110376
110377                                 case constant.POLICY_CLIENT_WINS:
110378                                     {
110379
110380
110381                                         // TODO ::: implement these...
110382
110383                                         //   //     adapter._context._model.session.delete(cmd._change)
110384                                         //   //     status = constant.STATUS_CONFLICT_RESOLVED_CLIENT_DATA
110385                                         //   //     session.dsstates[store.uri].stats.merged += 1
110386                                         //   //     # falling back to standard handling...
110387
110388                                         //   break;
110389
110390                                     }
110391                                 case constant.POLICY_SERVER_WINS:
110392                                     {
110393
110394
110395                                         //   //     adapter._context._model.session.delete(cmd._change)
110396                                         //   //     store.peer.registerChange(itemID, constant.ITEM_ADDED)
110397                                         //   //     session.dsstates[store.uri].stats.merged += 1
110398                                         //   //     cmd._conflict.statusCode = constant.STATUS_CONFLICT_RESOLVED_SERVER_DATA
110399                                         //   //     cmd._conflict.errorCode  = None
110400                                         //   //     cmd._conflict.errorMsg   = None
110401                                         //   //     return [cmd._conflict]
110402
110403                                         //   break;
110404
110405                                     }
110406
110407                                 default:
110408                                     {
110409                                         // a constant.POLICY_ERROR policy should have been handled by the dispatch
110410                                         return cb(new common.InternalError(
110411                                                     'unexpected conflictPolicy: %s', '' + policy));
110412                                     }
110413                             }
110414                                     }
110415                             );
110416
110417                         };
110418
110419                         get_item_id(function(err) {
110420                             if ( err )
110421                             return cb(err);
110422                         store.agent.deleteItem(itemID, function(err) {
110423                             if ( err )
110424                             return cb(err);
110425                         dsstate.stats.hereDel += 1;
110426                         store.registerChange(
110427                             itemID, constant.ITEM_DELETED, {excludePeerID: session.peer.id},
110428                             function(err) {
110429                                 if ( err )
110430                             return cb(err);
110431                         return cb(null, [state.makeCommand({
110432                             name       : constant.CMD_STATUS,
110433                                cmdID      : session.nextCmdID(),
110434                                msgRef     : cmd.msgID,
110435                                cmdRef     : cmd.cmdID,
110436                                targetRef  : cmd.target,
110437                                sourceRef  : cmd.source,
110438                                statusOf   : cmd.name,
110439                                // todo: should this return DELETE_WITHOUT_ARCHIVE instead of OK?...
110440                                // statusCode = constant.STATUS_DELETE_WITHOUT_ARCHIVE,
110441                                statusCode : status
110442                         })]);
110443                             }
110444                             );
110445                         });
110446                         });
110447
110448                     },
110449
110450                     //-------------------------------------------------------------------------
110451                     _reaction_map: function(session, command, cb) {
110452                         var peerStore = session.peer.getStore(command.source);
110453                         if ( command.target != peerStore._getBinding().uri )
110454                             return cb(new common.NoSuchRoute(
110455                                         'unexpected "Map" event for unbound stores (local: "'
110456                                             + command.target + ', remote: "' + command.source + '")'));
110457                         common.cascade(command.items, function(item, cb) {
110458                             // todo: support hierarchical sync...
110459                             peerStore._setMapping(item.target, item.source, cb);
110460                         }, function(err) {
110461                             if ( err )
110462                             return cb(err);
110463                         return cb(null, [state.makeCommand({
110464                             name       : constant.CMD_STATUS,
110465                                cmdID      : session.nextCmdID(),
110466                                msgRef     : command.msgID,
110467                                cmdRef     : command.cmdID,
110468                                targetRef  : command.target,
110469                                sourceRef  : command.source,
110470                                statusOf   : command.name,
110471                                statusCode : constant.STATUS_OK
110472                         })]);
110473                         });
110474                     },
110475
110476                     //-------------------------------------------------------------------------
110477                     // SYNCHRONIZATION PHASE: SETTLE
110478                     //-------------------------------------------------------------------------
110479
110480                     //-------------------------------------------------------------------------
110481                     settle: function(session, cmd, chkcmd, xnode, cb) {
110482
110483                         // TODO: remove the "xnode" parameter... it is a hack so that i can
110484                         //       call badStatus() the same way as in protocol.js
110485                         // todo: there is a bit of a disconnect between how action and reaction
110486                         //       phases are called (for a list of commands), whereas the settle
110487                         //       phase is called on a per-item basis... not ideal, but the protocol
110488                         //       is really set up that way :(
110489                         // TODO: check all valid values of ``data``...
110490                         // todo: anything else in common?...
110491                         // todo: trap errors...
110492
110493                         var func = this['_settle_' + cmd.name.toLowerCase()];
110494                         if ( ! func )
110495                             return cb(new common.ProtocolError('unexpected settle command "' + cmd.name + '"'));
110496                         return func.call(this, session, cmd, chkcmd, xnode, cb);
110497                     },
110498
110499                     //-------------------------------------------------------------------------
110500                     _settle_add: function(session, cmd, chkcmd, xnode, cb) {
110501                         switch ( cmd.data )
110502                         {
110503                             default:
110504                                 {
110505                                     return cb(badStatus(xnode));
110506                                 }
110507                             case constant.STATUS_OK:
110508                             case constant.STATUS_ITEM_ADDED:
110509                             case constant.STATUS_CONFLICT_RESOLVED_DUPLICATE:
110510                                 {
110511                                     session.info.dsstates[chkcmd.uri].stats.peerAdd += 1;
110512                                     break;
110513                                 }
110514                             case constant.STATUS_ALREADY_EXISTS:
110515                             case constant.STATUS_CONFLICT_RESOLVED_MERGE:
110516                                 // todo: should this conflict-resolved-merge status be stored so
110517                                 //       that only this item can have a non-"ADD" during initial
110518                                 //       sync?...
110519                             case constant.STATUS_CONFLICT_RESOLVED_CLIENT_DATA:
110520                                 {
110521                                     session.info.dsstates[chkcmd.uri].stats.merged += 1;
110522                                     break;
110523                                 }
110524                         }
110525
110526                         var peerStore = session.peer.getStore(
110527                                 session.context.router.getTargetUri(
110528                                     session.adapter, session.peer, chkcmd.uri));
110529
110530                         peerStore._delChange({
110531                             itemID: chkcmd.source,
110532                             state: constant.ITEM_ADDED
110533                         }, cb);
110534                     },
110535
110536                     //-------------------------------------------------------------------------
110537                     _settle_replace: function(session, cmd, chkcmd, xnode, cb) {
110538
110539                         var self = this;
110540                         var dsstate = session.info.dsstates[chkcmd.uri];
110541
110542                         if ( ! session.isServer && cmd.data == constant.STATUS_UPDATE_CONFLICT )
110543                         {
110544                             dsstate.stats.hereErr   += 1;
110545                             dsstate.stats.conflicts += 1;
110546                             return cb();
110547                         }
110548                         if ( cmd.data != constant.STATUS_OK
110549                                 && cmd.data != constant.STATUS_CONFLICT_RESOLVED_MERGE
110550                                 && cmd.data != constant.STATUS_CONFLICT_RESOLVED_CLIENT_DATA
110551                                 && cmd.data != constant.STATUS_CONFLICT_RESOLVED_SERVER_DATA )
110552                             return cb(badStatus(xnode));
110553                         if ( cmd.data == constant.STATUS_CONFLICT_RESOLVED_MERGE
110554                                 || cmd.data == constant.STATUS_CONFLICT_RESOLVED_CLIENT_DATA
110555                                 || cmd.data == constant.STATUS_CONFLICT_RESOLVED_SERVER_DATA )
110556                             dsstate.stats.merged += 1;
110557                         if ( cmd.data != constant.STATUS_CONFLICT_RESOLVED_SERVER_DATA )
110558                             dsstate.stats.peerMod += 1;
110559
110560                         var peerStore = session.peer.getStore(
110561                                 session.context.router.getTargetUri(
110562                                     session.adapter, session.peer, chkcmd.uri));
110563
110564                         var get_item_id = ( ! session.isServer ) ? function(cb) {
110565                             return cb(null, chkcmd.source);
110566                         } : function(cb) {
110567                             // if not isinstance(locItemID, basestring):
110568                             //   return locItemID
110569
110570                             self.getSourceMapping(
110571                                     session, constant.CMD_STATUS, cmd, peerStore, chkcmd.target,
110572                                     function(err, guid) { return cb(err, guid); }
110573                                     );
110574                         };
110575
110576                         get_item_id(function(err, locItemID) {
110577
110578                             if ( err )
110579                             return cb(err);
110580
110581                         // todo: this is *technically* subject to a race condition... but the
110582                         //       same peer should really not be synchronizing at the same time...
110583                         // todo: also potentially check Change.registered...
110584                         // TODO: this could be solved by:
110585                         //         a) never updating a Change record (only deleting and replacing)
110586                         //         b) deleting Change records by ID instead of by store/item/state...
110587
110588                         peerStore._delChange({
110589                             itemID    : locItemID,
110590                             state     : constant.ITEM_MODIFIED,
110591                         }, cb);
110592
110593                         });
110594
110595                     },
110596
110597                     //-------------------------------------------------------------------------
110598                     _settle_delete: function(session, cmd, chkcmd, xnode, cb) {
110599                         var self    = this;
110600                         var dsstate = session.info.dsstates[chkcmd.uri];
110601                         if ( ! session.isServer && cmd.data == constant.STATUS_UPDATE_CONFLICT )
110602                         {
110603                             dsstate.stats.hereErr   += 1;
110604                             dsstate.stats.conflicts += 1;
110605                             return cb();
110606                         }
110607                         if ( ! session.isServer && cmd.data == constant.STATUS_CONFLICT_RESOLVED_MERGE )
110608                         {
110609                             dsstate.stats.hereDel   += 1;
110610                             dsstate.stats.peerDel   += 1;
110611                             dsstate.stats.merged    += 1;
110612                         }
110613                         else if ( ! session.isServer && cmd.data == constant.STATUS_CONFLICT_RESOLVED_CLIENT_DATA )
110614                         {
110615                             dsstate.stats.peerDel   += 1;
110616                             dsstate.stats.merged    += 1;
110617                         }
110618                         else if ( ! session.isServer && cmd.data == constant.STATUS_CONFLICT_RESOLVED_SERVER_DATA )
110619                             dsstate.stats.merged    += 1;
110620                         else if ( cmd.data == constant.STATUS_ITEM_NOT_DELETED )
110621                         {
110622                             // note: the reason that this *may* be ok is that some servers (funambol)
110623                             //       will report ITEM_NOT_DELETED when the item did not exist, thus this
110624                             //       is "alright"...
110625                             // todo: perhaps this should be raised as an error if the
110626                             //       remote peer != funambol?...
110627                         }
110628                         else if ( cmd.data == constant.STATUS_OK )
110629                             dsstate.stats.peerDel += 1;
110630                         else
110631                             return cb(badStatus(xnode));
110632
110633                         var peerStore = session.peer.getStore(
110634                                 session.context.router.getTargetUri(
110635                                     session.adapter, session.peer, chkcmd.uri));
110636
110637                         // todo: handle hierarchical sync...
110638                         var get_locItemID = ( ! chkcmd.target ) ? function(cb) {
110639                             cb(null, chkcmd.source);
110640                         } : function(cb) {
110641                             self.getSourceMapping(
110642                                     session, constant.CMD_STATUS, cmd, peerStore, chkcmd.target,
110643                                     function(err, guid) { return cb(err, guid); }
110644                                     );
110645                         };
110646
110647                         // todo: this is *technically* subject to a race condition... but the
110648                         //       same peer should really not be synchronizing at the same time...
110649                         // todo: also potentially check Change.registered...
110650                         // TODO: this could be solved by:
110651                         //         a) never updating a Change record (only deleting and replacing)
110652                         //         b) deleting Change records by ID instead of by store/item/state...
110653
110654                         get_locItemID(function(err, locItemID) {
110655                             if ( err )
110656                             return cb(err);
110657                         peerStore._delChange({
110658                             itemID    : locItemID,
110659                             state     : constant.ITEM_DELETED,
110660                         }, cb);
110661                         });
110662
110663                     }
110664
110665     });
110666
110667     return exports;
110668
110669 })();
110670
110671 module.exports = _self;
110672
110673 });
110674 define('ripple/platform/tizen/2.0/syncml-js-lib/store', function (require, exports, module) {
110675 // -*- coding: utf-8 -*-
110676 //-----------------------------------------------------------------------------
110677 // file: $Id$
110678 // lib:  syncml-js.store
110679 // auth: griffin <griffin@uberdev.org>
110680 // date: 2012/11/04
110681 // copy: (C) CopyLoose 2012 UberDev <hardcore@uberdev.org>, No Rights Reserved.
110682 //-----------------------------------------------------------------------------
110683
110684
110685 var common = require('ripple/platform/tizen/2.0/syncml-js-lib/common'),
110686     constant = require('ripple/platform/tizen/2.0/syncml-js-lib/constant'),
110687     ctype = require('ripple/platform/tizen/2.0/syncml-js-lib/ctype'),
110688     storage = require('ripple/platform/tizen/2.0/syncml-js-lib/storage'),
110689     ET = require('ripple/platform/tizen/2.0/syncml-js-lib/elementtree');
110690
110691
110692 var _self = (function () {
110693     var exports = {};
110694
110695     //---------------------------------------------------------------------------
110696     exports.Store = common.Base.extend({
110697
110698         //-------------------------------------------------------------------------
110699         constructor: function(adapter, options) {
110700
110701             // todo: some of these attributes should be modifiable...
110702
110703             //: for local stores, specifies the agent that will implement
110704             //: the actual item operations -- it must implement the
110705             //: syncml-js.Agent API.
110706             this.agent = options.agent || null;
110707
110708             //: [read-only] specifies the SyncML URI that this store is bound to.
110709             this.uri = ( adapter ? adapter.normUri(options.uri) : options.uri ) || null;
110710
110711             //: [read-only] specifies the human-readable name for this store.
110712             //: if undefined, defaults to URI.
110713             this.displayName = options.displayName || this.uri || null;
110714
110715             //: [read-only] specifies the maximum GUID size for items in this store.
110716             //: if undefined, defaults to adapter setting.
110717             this.maxGuidSize = options.maxGuidSize || null;
110718
110719             //: [read-only] specifies the maximum object size for items in this store.
110720             //: if undefined, defaults to adapter setting.
110721             this.maxObjSize = options.maxObjSize || null;
110722
110723             //: [read-only] specifies conflict resolution policy for this store.
110724             //: if undefined, defaults to adapter setting.
110725             this.conflictPolicy = options.conflictPolicy || null;
110726
110727             //: [read-only] specifies which syncTypes this store supports.
110728             //: (defaults to all.)
110729             this.syncTypes = options.syncTypes;
110730             if ( this.syncTypes == undefined || this.syncTypes.length <= 0 )
110731             {
110732                 this.syncTypes = [
110733                     constant.SYNCTYPE_TWO_WAY,
110734                     constant.SYNCTYPE_SLOW_SYNC,
110735                     constant.SYNCTYPE_ONE_WAY_FROM_CLIENT,
110736                     constant.SYNCTYPE_REFRESH_FROM_CLIENT,
110737                     constant.SYNCTYPE_ONE_WAY_FROM_SERVER,
110738                     constant.SYNCTYPE_REFRESH_FROM_SERVER,
110739                     constant.SYNCTYPE_SERVER_ALERTED
110740                 ];
110741             }
110742
110743             ctypes = options.contentTypes;
110744             if ( ! ctypes && options.agent )
110745                 ctypes = options.agent.getContentTypes();
110746
110747             this.contentTypes = _.map(ctypes, function(e) {
110748                 if ( e instanceof ctype.ContentTypeInfo ) {
110749                     return e;
110750                 }
110751                 return ctype.ContentTypeInfo.fromStruct(e);
110752             });
110753
110754             // --- private attributes
110755             this.id       = options.id || common.makeID();
110756             this._a       = adapter;
110757         },
110758
110759         //-------------------------------------------------------------------------
110760         _load: function(cb) {
110761             cb();
110762         },
110763
110764         //-------------------------------------------------------------------------
110765         _getModel: function() {
110766             var self = this;
110767             var uri  = self._a.normUri(self.uri);
110768             return _.find(this._a._getModel().stores,
110769                     function(s) { return self._a.normUri(s.uri) == uri; });
110770         },
110771
110772         //-------------------------------------------------------------------------
110773         _updateModel: function(cb) {
110774             if ( ! this._a._model || ! this._a._model.stores )
110775                 return cb('store created on un-initialized adapter');
110776             // TODO: this squashes any data that may already be there, such
110777             //       as *BINDING* info!...
110778             this._a._model.stores = _.filter(this._a._model.stores, function(e) {
110779                 return e.uri != this.uri;
110780             }, this);
110781             this._a._model.stores.push({
110782                 id              : this.id,
110783                 uri             : this.uri,
110784                 displayName     : this.displayName,
110785                 syncTypes       : this.syncTypes,
110786                 maxGuidSize     : this.maxGuidSize,
110787                 maxObjSize      : this.maxObjSize,
110788                 conflictPolicy  : this.conflictPolicy,
110789                 contentTypes    : _.map(this.contentTypes, function(e) { return e.toStruct(); })
110790             });
110791             cb();
110792         },
110793
110794         //-------------------------------------------------------------------------
110795         _getBinding: function() {
110796             return this._getModel().binding;
110797         },
110798
110799         //-------------------------------------------------------------------------
110800         _setBinding: function(binding) {
110801             this._getModel().binding = binding;
110802         },
110803
110804         //-------------------------------------------------------------------------
110805         getContentTypes: function() {
110806             if ( this.agent != undefined ) {
110807                 return this.agent.getContentTypes();
110808             }
110809             return this.contentTypes;
110810         },
110811
110812         //-------------------------------------------------------------------------
110813         getPeerStore: function(peer) {
110814             var peerUri = null;
110815             if ( this._a.isLocal ) {
110816                 peerUri = this._a._c.router.getTargetUri(this._a, peer, this.uri);
110817             }
110818             else {
110819                 var binding = this.getBinding();
110820                 peerUri = binding ? binding.uri : null;
110821             }
110822             if ( ! peerUri ) {
110823                 return null;
110824             }
110825             return peer.getStore(peerUri);
110826         },
110827
110828         //-------------------------------------------------------------------------
110829         merge: function(store, cb) {
110830             if ( this.uri != store.uri )
110831                 return cb(new common.InternalError(
110832                                 'unexpected merging of stores with different URIs ("' + this.uri
110833                                     + '" != "' + store.uri + '")'));
110834             if ( ! _.isEqual(this.contentTypes, store.contentTypes) )
110835             {
110836                 // todo: this is a bit drastic... perhaps have an operational setting
110837                 //       which controls how paranoid to be?...
110838                 this._setBinding(null);
110839             }
110840             this.displayName    = store.displayName;
110841             this.contentTypes   = _.rest(store.contentTypes, 0);
110842             this.syncTypes      = _.rest(store.syncTypes, 0);
110843             this.maxGuidSize    = store.maxGuidSize;
110844             this.maxObjSize     = store.maxObjSize;
110845             this.agent          = store.agent;
110846             this.conflictPolicy = store.conflictPolicy;
110847             return cb();
110848         },
110849
110850         //-------------------------------------------------------------------------
110851         _clearAllMappings: function(cb) {
110852             if ( this._a.isLocal )
110853                 return cb(new common.InternalError(
110854                             'unexpected mapping request for local store'));
110855             var mapping = this._a._c._txn().objectStore('mapping');
110856             storage.deleteAll(mapping, {store_id: this.id}, cb);
110857         },
110858
110859         //-------------------------------------------------------------------------
110860         _setMapping: function(guid, luid, cb) {
110861             var self = this;
110862             if ( this._a.isLocal )
110863                 return cb(new common.InternalError(
110864                             'unexpected mapping request for local store'));
110865             // delete all previous mappings for this guid/store (there should
110866             // be at most one)... but paranoia rules.
110867             var mapping = this._a._c._txn().objectStore('mapping');
110868             storage.deleteAll(mapping, {store_id: this.id, guid: guid}, function(err) {
110869                 if ( err ) {
110870                     return cb(err);
110871                 }
110872                 storage.put(mapping, {store_id: self.id, guid: guid, luid: luid}, function(err) {
110873                     if ( err ) {
110874                         return cb(err);
110875                     }
110876                     cb();
110877                 });
110878             });
110879         },
110880
110881         //-------------------------------------------------------------------------
110882         _getMapping: function(guid, cb) {
110883             if ( this._a.isLocal )
110884                 return cb(new common.InternalError(
110885                             'unexpected mapping request for local store'));
110886             // todo: there must be a way to use IndexedDB since i have everything
110887             //       needed to generate the keyPath!... eg:
110888             //         objectStore.get({store_id:X,guid:Y})?...
110889             var mapdb = this._a._c._txn().objectStore('mapping').index('store_id');
110890             storage.getAll(this._a._c, mapdb, {only: this.id}, function(err, list) {
110891                 if ( err ) {
110892                     return cb(err);
110893                 }
110894                 var item = _.find(list, function(item) {
110895                     return item.guid == guid;
110896                 });
110897                 return cb(null, item ? item.luid : null);
110898             });
110899         },
110900
110901         //-------------------------------------------------------------------------
110902         _getMappings: function(cb) {
110903             if ( this._a.isLocal )
110904                 return cb(new common.InternalError(
110905                             'unexpected mapping request for local store'));
110906             var mapdb = this._a._c._txn().objectStore('mapping').index('store_id');
110907             storage.getAll(this._a._c, mapdb, {only: this.id}, function(err, list) {
110908                 if ( err )
110909                     return cb(err);
110910                 return cb(null, _.map(list, function(item) {
110911                     return [item.guid, item.luid];
110912                 }));
110913             });
110914         },
110915
110916         //-------------------------------------------------------------------------
110917         _getReverseMapping: function(luid, cb) {
110918             if ( this._a.isLocal )
110919                 return cb(new common.InternalError(
110920                             'unexpected mapping request for local store'));
110921             // todo: there must be a way to use IndexedDB since i have everything
110922             //       needed to generate the keyPath!... eg:
110923             //         objectStore.get({store_id:X,guid:Y})?...
110924             var mapdb = this._a._c._txn().objectStore('mapping').index('store_id');
110925             storage.getAll(this._a._c, mapdb, {only: this.id}, function(err, list) {
110926                 if ( err )
110927                     return cb(err);
110928                 var item = _.find(list, function(item) {
110929                     return item.luid == luid;
110930                 });
110931                 return cb(null, item ? item.guid : null);
110932             });
110933         },
110934
110935         //-------------------------------------------------------------------------
110936         registerChange: function(itemID, state, options, cb) {
110937             // options can include:
110938             //   - changeSpec (string)
110939             //   - excludePeerID (string)
110940
110941             if ( ! _.contains([constant.ITEM_ADDED, constant.ITEM_MODIFIED,
110942                         constant.ITEM_DELETED], state) )
110943                 return cb(new common.TypeError(
110944                             'registerChange: invalid state "' + state + '"'));
110945
110946             options = options || {};
110947             var self = this;
110948             if ( self._a.isLocal )
110949             {
110950                 // TODO: THIS NEEDS TO BE SIGNIFICANTLY OPTIMIZED!... either:
110951                 //         a) optimize this reverse lookup, or
110952                 //         b) use a query that targets exactly the set of stores needed
110953                 //       note that a pre-emptive model.session.flush() may be necessary.
110954                 common.cascade(self._a.getPeers(), function(peer, cb) {
110955                     if ( options.excludePeerID && options.excludePeerID == peer.id )
110956                         return cb();
110957                     common.cascade(peer.getStores(), function(store, cb) {
110958                         var binding = store._getBinding()
110959                         if ( ! binding || binding.uri != self.uri )
110960                             return cb();
110961                         store.registerChange(itemID, state, options, cb);
110962                     }, cb);
110963                 }, cb);
110964                 return;
110965             }
110966
110967             // todo: a non-ADD change event for an ID that has never been
110968             // seen does not create an error... should it??? that would mean
110969             // that syncml-js needs to track that. not a good idea.
110970
110971             itemID = '' + itemID;
110972             var handled = false;
110973
110974             // paranoia
110975             if ( options.changeSpec && state != constant.ITEM_MODIFIED )
110976             {
110977                 options.changeSpec = null;
110978             }
110979
110980             var check_update = function(cb) {
110981                 self._getChange(itemID, function(err, change) {
110982                     if ( err )
110983                         return cb(err);
110984                     if ( ! change)
110985                         return cb();
110986                     var badstate = function(action) {
110987                     };
110988                 // note: many of the following change.state / state combinations
110989                 // should never occur. the following tries to recover gracefully.
110990                 // todo: should i raise an error for "illogical" conditions?
110991                     switch ( change.state )
110992                     {
110993                     case constant.ITEM_ADDED:
110994                     {
110995                         if ( state != constant.ITEM_DELETED )
110996                         {
110997                             // ADD + anything except DELETE stays ADD
110998                             handled = true;
110999                             return cb();
111000                         }
111001                         // ADD + DELETE cancels out
111002                         handled = true;
111003                         var changeTab = self._a._c._txn().objectStore('change');
111004                         storage.deleteAll(changeTab, change, function(err) {
111005                             if ( err )
111006                                 return cb(err);
111007                             return cb();
111008                         });
111009                         return;
111010                     }
111011                     case constant.ITEM_MODIFIED:
111012                     {
111013                         if ( state == constant.ITEM_ADDED )
111014                         {
111015                             badstate('squelching changeSpec');
111016                             delete change.changeSpec;
111017                             break;
111018                         }
111019                         if ( state == constant.ITEM_DELETED )
111020                         {
111021                             change.state = state;
111022                             delete change.changeSpec;
111023                             break;
111024                         }
111025                         if ( change.changeSpec )
111026                         {
111027                             if ( options.changeSpec )
111028                                 change.changeSpec += ';' + options.changeSpec;
111029                             else
111030                                 delete change.changeSpec;
111031                         }
111032                         break;
111033                     }
111034                     case constant.ITEM_DELETED:
111035                     {
111036                         if ( state == constant.ITEM_DELETED )
111037                         {
111038                             badstate('ignoring');
111039                             handled = true;
111040                             return cb();
111041                         }
111042                         badstate('reverting to modified');
111043                         change.state = constant.ITEM_MODIFIED;
111044                         delete change.changeSpec;
111045                         break;
111046                     }
111047                     default:
111048                     {
111049                         return cb(new common.InternalError(
111050                                     'unexpected recorded change state "' + change.state
111051                                     + '" for item ID "' + itemID + '"'));
111052                     }
111053                     }
111054                     // update the change
111055                     // todo: do i need to delete it first?
111056                     handled = true;
111057                     return storage.put(
111058                         self._a._c._txn().objectStore('change'),
111059                         change,
111060                         cb);
111061                 });
111062             };
111063
111064             var check_mapping = ( self._a._isMapper() || state == constant.ITEM_ADDED )
111065                 ? common.noop
111066                 : function(cb) {
111067                     // doing a `_getMapping` for non-add events to make sure that
111068                     // the remote peer actually has this object before we tell it
111069                     // to modify or delete an item...
111070                     self._getMapping(itemID, function(err, luid) {
111071                         if ( err )
111072                         return cb(err);
111073                     if ( luid )
111074                         return cb();
111075                     // this item does not exist as (or has not been mapped to) an
111076                     // item on the remote peer and is not an `ADD` event, so can
111077                     // therefore be ignored - mark it as "handled".
111078                     handled = true;
111079                     return cb();
111080                     });
111081                 };
111082
111083             // todo: there is a weirdness here wrt `handled` in the case
111084             //       of check_mapping and deletes... ie. there is a bit of
111085             //       a responsibility violation (handled does not actually
111086             //       mean handled...)
111087
111088             check_update(function(err) {
111089                 if ( err )
111090                     return cb(err);
111091                 if ( handled )
111092                     return cb();
111093                 check_mapping(function(err) {
111094                     if ( err )
111095                         return cb(err);
111096                     if ( handled && state != constant.ITEM_DELETED )
111097                         return cb();
111098                     // note: if it is a delete event, and it has not been mapped
111099                     // yet, so does not yet exist on the peer, therefore
111100                     // propagate nothing -- continuing just to execute the
111101                     // deleteAll().
111102                     var changeTab = self._a._c._txn().objectStore('change');
111103                     change = {store_id: self.id, item_id: itemID};
111104                     // todo: is this deleteAll really necessary?... paranoia rules!
111105                     storage.deleteAll(changeTab, change, function(err) {
111106                         if ( err )
111107                             return cb(err);
111108                         if ( handled )
111109                             return cb();
111110                         change.state = state;
111111                         change.changeSpec = options.changeSpec;
111112                         storage.put(changeTab, change, cb);
111113                     });
111114                 });
111115             });
111116         },
111117
111118         //-------------------------------------------------------------------------
111119         _getChange: function(itemID, cb) {
111120             // returns cb(null, CHANGE)
111121             // change ::= { store_id: ID, item_id: GUID, state: STATE, changeSpec: SPEC }
111122             itemID = '' + itemID;
111123             var self = this;
111124             // todo: there must be a way to use IndexedDB since i have everything
111125             //       needed to generate the keyPath!... eg:
111126             //         objectStore.get({store_id:X,guid:Y})?...
111127             var changedb = self._a._c._txn().objectStore('change').index('store_id');
111128             storage.getAll(self._a._c, changedb, {only: self.id}, function(err, changes) {
111129                 if ( err )
111130                     return cb(err);
111131                 var change = _.find(changes, function(change) {
111132                     return change.item_id == itemID;
111133                 });
111134                 return cb(null, change);
111135             });
111136         },
111137
111138         //-------------------------------------------------------------------------
111139         _delChange: function(options, cb) {
111140             // - if options is null/empty, delete all changes recorded
111141             //   for this store
111142
111143             // // todo: this is *technically* subject to a race condition... but the
111144             // //       same peer should really not be synchronizing at the same time...
111145             // // todo: also potentially check Change.registered...
111146             // // TODO: this could be solved by:
111147             // //         a) never updating a Change record (only deleting and replacing)
111148             // //         b) deleting Change records by ID instead of by store/item/state...
111149
111150             // var objstore = session.context._txn().objectStore('change');
111151             // storage.iterateCursor(
111152             //   objstore.index('store_id').openCursor(peerStore.id),
111153             //   function(value, key, cb) {
111154             //     if ( value.itemID != chkcmd.source || value.state != constant.ITEM_ADDED )
111155             //       return;
111156             //     storage.delete(objstore, key, cb);
111157             //   }, cb);
111158
111159             var dbstore = this._a._c._txn().objectStore('change');
111160             var matches = {store_id: this.id};
111161             if ( options.itemID )
111162                 matches.item_id = options.itemID;
111163             if ( options.state )
111164                 matches.state = options.state;
111165             storage.deleteAll(dbstore, matches, cb);
111166         },
111167
111168         //-------------------------------------------------------------------------
111169         toSyncML: function() {
111170             var xstore = ET.Element('DataStore');
111171             if ( this.uri )
111172                 ET.SubElement(xstore, 'SourceRef').text = this.uri;
111173             if ( this.displayName )
111174                 ET.SubElement(xstore, 'DisplayName').text = this.displayName;
111175             if ( this.maxGuidSize )
111176             {
111177                 // todo: this should ONLY be sent by the client... (according to the
111178                 //       spec, but not according to funambol behavior...)
111179                 ET.SubElement(xstore, 'MaxGUIDSize').text = this.maxGuidSize;
111180             }
111181             if ( this.maxObjSize )
111182                 ET.SubElement(xstore, 'MaxObjSize').text = this.maxObjSize;
111183
111184             var ctypes = this.getContentTypes();
111185
111186             if ( ctypes && ctypes.length > 0 )
111187             {
111188                 var pref = _.filter(ctypes, function(ct) { return ct.receive && ct.preferred; });
111189
111190                 // todo: should i just take the first one?...
111191                 if ( pref.length > 1 )
111192                     throw new Error('agents can prefer at most one receive content-type');
111193
111194                 if ( pref.length == 1 )
111195                 {
111196                     pref = pref[0].toSyncML('Rx', true);
111197                     pref[0].tag = 'Rx-Pref';
111198                     _.each(pref, function(xnode) { xstore.append(xnode); });
111199                 }
111200
111201                 _.each(
111202                         _.filter(ctypes, function(ct) { return ct.receive && ! ct.preferred; }),
111203                         function(ct) {
111204                             _.each(ct.toSyncML('Rx', true), function(xnode) {
111205                                 xstore.append(xnode);
111206                             });
111207                         });
111208
111209                 var pref = _.filter(ctypes, function(ct) { return ct.transmit && ct.preferred; });
111210
111211                 // todo: should i just take the first one?...
111212                 if ( pref.length > 1 )
111213                     throw new Error('agents can prefer at most one transmit content-type');
111214
111215                 if ( pref.length == 1 )
111216                 {
111217                     pref = pref[0].toSyncML('Tx', true);
111218                     pref[0].tag = 'Tx-Pref';
111219                     _.each(pref, function(xnode) { xstore.append(xnode); });
111220                 }
111221
111222                 _.each(
111223                         _.filter(ctypes, function(ct) { return ct.transmit && ! ct.preferred; }),
111224                         function(ct) {
111225                             _.each(ct.toSyncML('Tx', true), function(xnode) {
111226                                 xstore.append(xnode);
111227                             });
111228                         });
111229
111230             }
111231
111232             if ( this.syncTypes && this.syncTypes.length > 0 )
111233             {
111234                 var xcap = ET.SubElement(xstore, 'SyncCap');
111235                 for ( var idx=0 ; idx<this.syncTypes.length ; idx++ )
111236                     ET.SubElement(xcap, 'SyncType').text = this.syncTypes[idx];
111237             }
111238             return xstore;
111239
111240         },
111241
111242         //-------------------------------------------------------------------------
111243         describe: function(stream, cb) {
111244             stream.writeln('URI: ' + this.uri);
111245             stream.writeln('Max ID size: ' + ( this.maxGuidSize || '(none)' ));
111246             stream.writeln('Max object size: ' + ( this.maxObjSize || '(none)' ));
111247             stream.writeln('Sync types: ' + this.syncTypes.join(', '));
111248             var cts = this.getContentTypes();
111249             if ( cts.length <= 0 )
111250             {
111251                 stream.writeln('Capabilities: (none)');
111252                 return cb();
111253             }
111254             stream.writeln('Capabilities:');
111255             var s1 = new common.IndentStream(stream);
111256             common.cascade(cts, function(ct, cb) {
111257                 s1.write('- ');
111258                 ct.describe(s1);
111259                 return cb();
111260             }, cb);
111261         }
111262     }, {
111263
111264         //-------------------------------------------------------------------------
111265         fromSyncML: function(xnode) {
111266             var options = {
111267                 uri          : xnode.findtext('SourceRef'),
111268                 displayName  : xnode.findtext('DisplayName'),
111269                 maxGuidSize  : common.int(xnode.findtext('MaxGUIDSize')),
111270                 maxObjSize   : common.int(xnode.findtext('MaxObjSize')),
111271                 contentTypes : [],
111272                 syncTypes    : _.map(xnode.findall('SyncCap/SyncType'), function(e) {
111273                     return common.int(e.text);
111274                 })
111275             };
111276             _.each(xnode.getchildren(), function(child) {
111277                 if ( _.indexOf(['Rx-Pref', 'Rx', 'Tx-Pref', 'Tx'], child.tag) < 0 )
111278                 return;
111279             var cti = ctype.ContentTypeInfo.fromSyncML(child);
111280             var merged = false;
111281             _.each(options.contentTypes, function(ct) {
111282                 if ( merged )
111283                 return;
111284             if ( ct.merge(cti) )
111285                 merged = true;
111286             });
111287             if ( ! merged )
111288                 options.contentTypes.push(cti);
111289             });
111290             return new exports.Store(null, options);
111291         },
111292     });
111293
111294     return exports;
111295
111296 })();
111297
111298 module.exports = _self;
111299
111300 });
111301 define('ripple/platform/tizen/2.0/syncml-js-lib/matcher', function (require, exports, module) {
111302 // -*- coding: utf-8 -*-
111303 //-----------------------------------------------------------------------------
111304 // file: $Id$
111305 // lib:  syncml-js.matcher
111306 // auth: griffin <griffin@uberdev.org>
111307 // date: 2012/12/05
111308 // copy: (C) CopyLoose 2012 UberDev <hardcore@uberdev.org>, No Rights Reserved.
111309 //-----------------------------------------------------------------------------
111310
111311 var common = require('ripple/platform/tizen/2.0/syncml-js-lib/common'),
111312     _self;
111313
111314 _self = (function () {
111315
111316     var exports = {};
111317
111318     //---------------------------------------------------------------------------
111319     exports._cntpref = function(source, target) {
111320         return ( source.preferred ? 1 : 0 ) + ( target.preferred ? 1 : 0 );
111321     };
111322
111323     //---------------------------------------------------------------------------
111324     exports._pickTransmitContentType = function(source, target, prefcnt, checkVersion) {
111325         for ( var sidx=0 ; sidx<source.length ; sidx++ )
111326 {
111327     var sct = source[sidx];
111328     for ( var tidx=0 ; tidx<target.length ; tidx++ )
111329 {
111330     var tct = target[tidx];
111331     if ( sct.ctype != tct.ctype )
111332     continue;
111333 if ( ! checkVersion )
111334 {
111335     if ( exports._cntpref(sct, tct) >= prefcnt )
111336         return [sct.ctype, sct.versions[sct.versions.length - 1]];
111337     continue;
111338 }
111339 for ( var svidx=sct.versions.length ; svidx>0 ; svidx-- )
111340 {
111341     var sv = sct.versions[svidx - 1]
111342         for ( var tvidx=tct.versions.length ; tvidx>0 ; tvidx-- )
111343         {
111344             var tv = tct.versions[tvidx - 1]
111345                 if ( sv != tv )
111346                     continue;
111347             if ( exports._cntpref(sct, tct) >= prefcnt )
111348                 return [sct.ctype, sv];
111349         }
111350 }
111351 }
111352 }
111353 return null;
111354 };
111355
111356 //---------------------------------------------------------------------------
111357 exports.pickTransmitContentType = function(source, target) {
111358
111359     // TODO: this is probably not the most efficient algorithm!...
111360     //       (but it works... ;-)
111361
111362     // order of preference:
111363     //   - transmit => receive, BOTH preferred, VERSION match
111364     //   - transmit => receive, ONE preferred, VERSION match
111365     //   - transmit => receive, neither preferred, VERSION match
111366     //   - transmit => receive, BOTH preferred, no version match
111367     //   - transmit => receive, ONE preferred, no version match
111368     //   - transmit => receive, neither preferred, no version match
111369     //   - tx/rx => tx/rx, BOTH preferred, VERSION match
111370     //   - tx/rx => tx/rx, ONE preferred, VERSION match
111371     //   - tx/rx => tx/rx, neither preferred, VERSION match
111372     //   - tx/rx => tx/rx, BOTH preferred, no version match
111373     //   - tx/rx => tx/rx, ONE preferred, no version match
111374     //   - tx/rx => tx/rx, neither preferred, no version match
111375
111376     // todo: make it explicit (or overrideable) that i am depending on the ordering
111377     //       of the versions supported to give an indicator of preference...
111378
111379     var sct = source.getContentTypes();
111380     var tct = target.getContentTypes();
111381
111382     var fct = function(cts, transmit) {
111383         return _.filter(cts, function(ct) {
111384             return transmit ? ct.transmit : ct.receive;
111385         });
111386     };
111387
111388     return exports._pickTransmitContentType(fct(sct, true), fct(tct, false), 2, true)
111389         || exports._pickTransmitContentType(fct(sct, true), fct(tct, false), 1, true)
111390         || exports._pickTransmitContentType(fct(sct, true), fct(tct, false), 0, true)
111391         || exports._pickTransmitContentType(fct(sct, true), fct(tct, false), 2, false)
111392         || exports._pickTransmitContentType(fct(sct, true), fct(tct, false), 1, false)
111393         || exports._pickTransmitContentType(fct(sct, true), fct(tct, false), 0, false)
111394         || exports._pickTransmitContentType(sct, tct, 2, true)
111395         || exports._pickTransmitContentType(sct, tct, 1, true)
111396         || exports._pickTransmitContentType(sct, tct, 0, true)
111397         || exports._pickTransmitContentType(sct, tct, 2, false)
111398         || exports._pickTransmitContentType(sct, tct, 1, false)
111399         || exports._pickTransmitContentType(sct, tct, 0, false)
111400         || null;
111401
111402 };
111403
111404 // TODO: OH MY GOD.
111405 //       this is insanely inefficient.
111406 //       i'm embarrassed.
111407 //       fortunately, it's hidden really low-level...
111408 //       but now you know, doh! please don't blackmail me!... ;-)
111409
111410 // TODO: this currently requires that both tx and rx match in both
111411 //       directions with the same velocity... it should prioritize
111412 //       that, but then fallback to giving simplex matches priority.
111413
111414 //---------------------------------------------------------------------------
111415 var has_ct = function(a, b, checkVersion, transmit, wildcard) {
111416     a = _.filter(a, function(e) { return transmit ? e.transmit : e.receive });
111417     b = _.filter(b, function(e) { return transmit ? e.transmit : e.receive });
111418     for ( var aidx=0 ; aidx<a.length ; aidx++ )
111419     {
111420         var ct_a = a[aidx];
111421         for ( var bidx=0 ; bidx<b.length ; bidx++ )
111422         {
111423             var ct_b = b[bidx];
111424             if ( ct_a.ctype != ct_b.ctype )
111425                 continue;
111426             if ( ! checkVersion )
111427                 return true;
111428             for ( var vaidx=0 ; vaidx<ct_a.versions.length ; vaidx++ )
111429             {
111430                 var va = ct_a.versions[vaidx];
111431                 for ( var vbidx=0 ; vbidx<ct_b.length ; vbidx++ )
111432                 {
111433                     var vb = ct_b.versions[vbidx];
111434                     if ( va == vb )
111435                         return true;
111436                 }
111437             }
111438         }
111439     } 
111440     return false;
111441 };
111442
111443 //---------------------------------------------------------------------------
111444 var has_ct_both = function(a, b, checkVersion, wildcard) {
111445     return has_ct(a, b, checkVersion, true, wildcard)
111446         && has_ct(a, b, checkVersion, false, wildcard);
111447 };
111448
111449 //---------------------------------------------------------------------------
111450 var cmpStore_ct_set_crit = function(base, ds1, ds2, checkVersion, wildcard) {
111451     var bds1 = has_ct_both(base, ds1, checkVersion, wildcard);
111452     var bds2 = has_ct_both(base, ds2, checkVersion, wildcard);
111453     if ( bds1 && bds2 )
111454         return 0;
111455     if ( bds1 )
111456         return -1;
111457     if ( bds2 )
111458         return 1;
111459     return 0;
111460 };
111461
111462 //---------------------------------------------------------------------------
111463 var cmpStore_ct_set = function(base, ds1, ds2) {
111464     var ret = cmpStore_ct_set_crit(base, ds1, ds2, true, false);
111465     if ( ret != 0 )
111466         return ret;
111467     ret = cmpStore_ct_set_crit(base, ds1, ds2, false, false);
111468     if ( ret != 0 )
111469         return ret;
111470     ret = cmpStore_ct_set_crit(base, ds1, ds2, true, true);
111471     if ( ret != 0 )
111472         return ret;
111473     ret = cmpStore_ct_set_crit(base, ds1, ds2, false, true);
111474     if ( ret != 0 )
111475         return ret;
111476     return 0;
111477 };
111478
111479 //---------------------------------------------------------------------------
111480 var getct = function(store) {
111481     return store.getContentTypes ? store.getContentTypes() : store.contentTypes;
111482 };
111483
111484 //---------------------------------------------------------------------------
111485 var cmpStore_ct_pref = function(base, ds1, ds2) {
111486     var basect = _.filter(getct(base), function(ct) { return ct.preferred; });
111487     var ds1ct  = _.filter(getct(ds1), function(ct) { return ct.preferred; });
111488     var ds2ct  = _.filter(getct(ds2), function(ct) { return ct.preferred; });
111489     return cmpStore_ct_set(basect, ds1ct, ds2ct);
111490 };
111491
111492 //---------------------------------------------------------------------------
111493 var cmpStore_ct_all = function(base, ds1, ds2) {
111494     return cmpStore_ct_set(getct(base), getct(ds1), getct(ds2));
111495 };
111496
111497 //---------------------------------------------------------------------------
111498 var cmpStore_ct = function(base, ds1, ds2) {
111499     var ret = cmpStore_ct_pref(base, ds1, ds2)
111500         if ( ret != 0 )
111501             return ret;
111502     return cmpStore_ct_all(base, ds1, ds2);
111503 };
111504
111505 //---------------------------------------------------------------------------
111506 var cmpStore_uri = function(base, ds1, ds2) {
111507     var ret = difflib.getCloseMatches(base.uri, [ds1.uri, ds2.uri], 1, 0.5);
111508     if ( ret.length <= 0 )
111509         return 0;
111510     if ( ret[0] == ds1.uri )
111511         return -1;
111512     return 1;
111513 };
111514
111515 //---------------------------------------------------------------------------
111516 exports.cmpStore = function(base, ds1, ds2) {
111517     var ret = cmpStore_ct(base, ds1, ds2);
111518     if ( ret != 0 )
111519         return ret;
111520     return cmpStore_uri(base, ds1, ds2);
111521 };
111522
111523 return exports;
111524
111525 })();
111526
111527 module.exports = _self;
111528
111529
111530 });
111531 define('ripple/platform/tizen/2.0/NDEFMessage', function (require, exports, module) {
111532 /*
111533  *  Copyright 2013 Intel Corporation
111534  *
111535  * Licensed under the Apache License, Version 2.0 (the "License");
111536  * you may not use this file except in compliance with the License.
111537  * You may obtain a copy of the License at
111538  *
111539  * http://www.apache.org/licenses/LICENSE-2.0
111540  *
111541  * Unless required by applicable law or agreed to in writing, software
111542  * distributed under the License is distributed on an "AS IS" BASIS,
111543  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
111544  * See the License for the specific language governing permissions and
111545  * limitations under the License.
111546  */
111547
111548 var t = require('ripple/platform/tizen/2.0/typecast'),
111549     NDEFRecord = require('ripple/platform/tizen/2.0/NDEFRecord'),
111550     NDEFRecordText = require('ripple/platform/tizen/2.0/NDEFRecordText'),
111551     NDEFRecordURI = require('ripple/platform/tizen/2.0/NDEFRecordURI'),
111552     NDEFRecordMedia = require('ripple/platform/tizen/2.0/NDEFRecordMedia'),
111553     NDEFRecordFactory,
111554     NDEFMessage;
111555
111556 NDEFRecordFactory = function (ndefRecord) {
111557     var record;
111558
111559     if (ndefRecord instanceof NDEFRecordText) {
111560         record = new NDEFRecordText(ndefRecord.text, ndefRecord.languageCode,
111561                 ndefRecord.encoding || null);
111562     } else if (ndefRecord instanceof NDEFRecordURI) {
111563         record = new NDEFRecordURI(ndefRecord.url);
111564     } else if (ndefRecord instanceof NDEFRecordMedia) {
111565         record = new NDEFRecordMedia(ndefRecord.mimeType, ndefRecord.payload);
111566     } else {
111567         record = new NDEFRecord(ndefRecord.tnf, ndefRecord.type,
111568                 ndefRecord.payload, ndefRecord.id || null);
111569     }
111570
111571     return record;
111572 };
111573
111574 NDEFMessage = function () {
111575     var voc, records = [];
111576
111577     // private
111578     function construct() {
111579         this.__defineGetter__("recordCount", function () {
111580             return this.records.length;
111581         });
111582
111583         this.__defineGetter__("records", function () {
111584             return records;
111585         });
111586
111587         this.__defineSetter__("records", function (val) {
111588             try {
111589                 t.NDEFRecord(val, "[]");
111590                 records = val;
111591             } catch (e) {
111592             }
111593         });
111594
111595         this.toByte = function () {
111596             var result = [], i, j, space = " ".charCodeAt(0);
111597
111598             for (i in this.records) {
111599                 for (j = 0; j < this.records[i].payload.length; j++) {
111600                     result.push(this.records[i].payload.charCodeAt(j));
111601                 }
111602                 if (i < this.records.length - 1) {
111603                     result.push(space);
111604                 }
111605             }
111606
111607             return result;
111608         };
111609     }
111610
111611     // constructor
111612     function NDEFMessage_NDEFRecords(ndefRecords) {
111613         var i;
111614
111615         construct.apply(this);
111616
111617         for (i = 0; i < ndefRecords.length; i++) {
111618             records[i] = new NDEFRecordFactory(ndefRecords[i]);
111619         }
111620     }
111621
111622     function NDEFMessage_bytes(rawData) {
111623         //TODO: NDEFMessage doesn't support rawData constructor
111624         construct.apply(this);
111625     }
111626
111627     function NDEFMessage_void() {
111628         construct.apply(this);
111629     }
111630
111631     voc = [NDEFMessage_NDEFRecords, NDEFMessage_bytes, NDEFMessage_void];
111632     t.NDEFMessage(arguments, this, voc);
111633 };
111634
111635 module.exports = NDEFMessage;
111636
111637 });
111638 define('ripple/platform/tizen/2.0/bluetooth', function (require, exports, module) {
111639 /*
111640  *  Copyright 2013 Intel Corporation.
111641  *
111642  * Licensed under the Apache License, Version 2.0 (the "License");
111643  * you may not use this file except in compliance with the License.
111644  * You may obtain a copy of the License at
111645  *
111646  * http://www.apache.org/licenses/LICENSE-2.0
111647  *
111648  * Unless required by applicable law or agreed to in writing, software
111649  * distributed under the License is distributed on an "AS IS" BASIS,
111650  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
111651  * See the License for the specific language governing permissions and
111652  * limitations under the License.
111653  */
111654
111655 var utils = require('ripple/utils'),
111656     db = require('ripple/db'),
111657     event = require('ripple/event'),
111658     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
111659     t = require('ripple/platform/tizen/2.0/typecast'),
111660     WebAPIError = require('ripple/platform/tizen/2.0/WebAPIError'),
111661     WebAPIException = require('ripple/platform/tizen/2.0/WebAPIException'),
111662     BluetoothDevice = require('ripple/platform/tizen/2.0/BluetoothDevice'),
111663     BluetoothClassDeviceMajor = require('ripple/platform/tizen/2.0/BluetoothClassDeviceMajor'),
111664     BluetoothClassDeviceMinor = require('ripple/platform/tizen/2.0/BluetoothClassDeviceMinor'),
111665     BluetoothClassDeviceService = require('ripple/platform/tizen/2.0/BluetoothClassDeviceService'),
111666     BluetoothServiceHandler = require('ripple/platform/tizen/2.0/BluetoothServiceHandler'),
111667     BluetoothAdapter,
111668     _data = {
111669         DB_BLUETOOTH_KEY: "tizen1-db-bluetooth_adapter-name",
111670         DEFAULT_ADAPTER_NAME: "Tizen BT Adapter",
111671         DEFAULT_ADAPTER_ADDRESS: "12:34:56:78:90:AB",
111672         availableDevsChanging: false,
111673         DEFAULT_VISIBLE_TIME: 180000,
111674         DISCOVER_TIME: 10000,
111675         DISCOVER_INTERVAL: 1000,
111676         bluetoothClassDeviceMajor: {},
111677         bluetoothClassDeviceMinor: {},
111678         bluetoothClassDeviceService: {},
111679         adapter: {},
111680         historyDevs: {},
111681         availableDevs: {},
111682         localServices: {}
111683     },
111684     _security = {
111685         "http://tizen.org/privilege/bluetoothmanager": ["setVisible"],
111686         "http://tizen.org/privilege/bluetooth.admin": ["setName", "setPowered"],
111687         "http://tizen.org/privilege/bluetooth.gap": ["getDefaultAdapter",
111688                 "discoverDevices", "stopDiscovery", "getKnownDevices",
111689                 "getDevice", "createBonding", "destroyBonding", "hasService"],
111690         "http://tizen.org/privilege/bluetooth.spp":
111691                 ["registerRFCOMMServiceByUUID", "connectToServiceByUUID",
111692                 "writeData", "readData", "close", "unregister"]
111693     },
111694     _self;
111695
111696 function _initialize() {
111697     var adapterName, devs;
111698
111699     _data.bluetoothClassDeviceMajor = new BluetoothClassDeviceMajor();
111700     _data.bluetoothClassDeviceMinor = new BluetoothClassDeviceMinor();
111701     _data.bluetoothClassDeviceService = new BluetoothClassDeviceService();
111702     adapterName = db.retrieveObject(_data.DB_BLUETOOTH_KEY) ||
111703             _data.DEFAULT_ADAPTER_NAME;
111704     _data.adapter = new BluetoothAdapter(adapterName,
111705             _data.DEFAULT_ADAPTER_ADDRESS);
111706
111707     // get defalt nearby devices
111708     devs = db.retrieveObject("bt-simulated-devices");
111709     utils.forEach(devs, function (item) {
111710         if (!_data.availableDevs[item.address]) {
111711             _data.availableDevs[item.address] = new BluetoothDevice({
111712                 name: item.name,
111713                 address: item.address,
111714                 deviceClass: item.deviceClass,
111715                 isBonded: false,
111716                 isTrusted: item.isTrusted,
111717                 isConnected: false,
111718                 services: item.services,
111719                 metaData: _security
111720             });
111721         }
111722     });
111723 }
111724
111725 BluetoothAdapter = function (devName, devAddress) {
111726     var adapter,
111727         timeoutVar,
111728         _devName = devName,
111729         _devAddress = devAddress,
111730         _devPowered = false,
111731         _devVisible = false,
111732         _isDiscovering = false,
111733         discoverInterval;
111734
111735     // private
111736     function updateVisibleStatus(status, time) {
111737         if (!_devPowered)
111738             return;
111739
111740         _devVisible = status;
111741         event.trigger("bt-adapter-visible-changed", [_devVisible]);
111742         if (_devVisible) {
111743             if (time > 0) {
111744                 timeoutVar = window.setTimeout(function () {
111745                     _devVisible = false;
111746                     event.trigger("bt-adapter-visible-changed", [_devVisible]);
111747                 }, time);
111748             }
111749         } else {
111750             window.clearTimeout(timeoutVar);
111751         }
111752     }
111753
111754     function updatePowerStatus(status) {
111755         if (_devPowered === status) {
111756             return;
111757         }
111758         if (!status) {
111759             updateVisibleStatus(false);
111760             utils.forEach(_data.historyDevs, function (dev) {
111761                 event.trigger("bt-service-state-update", [dev.address, false]);
111762                 event.trigger("bt-device-bonded-changed", [dev.address, false]);
111763                 jQuery("#service-transfer-textarea-" + dev.address.replace(/:/g, "")).val("");
111764                 jQuery("#service-receive-textarea-" + dev.address.replace(/:/g, "")).html("");
111765             });
111766         }
111767         _devPowered = status;
111768         event.trigger("bt-adapter-power-changed", [_devPowered]);
111769     }
111770
111771     // public
111772     function setName(name, successCallback, errorCallback) {
111773         if (!_security.setName) {
111774             throw new WebAPIException(errorcode.SECURITY_ERR);
111775         }
111776
111777         t.BluetoothAdapter("setName", arguments);
111778
111779         window.setTimeout(function () {
111780             if (!_devPowered) {
111781                 if (errorCallback) {
111782                     errorCallback(new WebAPIError(
111783                             errorcode.SERVICE_NOT_AVAILABLE_ERR));
111784                 }
111785                 return;
111786             }
111787
111788             _devName = name;
111789             db.saveObject(_data.DB_BLUETOOTH_KEY, _devName);
111790             event.trigger("bt-adapter-name-changed", [_devName]);
111791             if (successCallback) {
111792                 successCallback();
111793             }
111794         }, 1);
111795     }
111796
111797     function setPowered(state, successCallback, errorCallback) {
111798         if (!_security.setPowered) {
111799             throw new WebAPIException(errorcode.SECURITY_ERR);
111800         }
111801
111802         t.BluetoothAdapter("setPowered", arguments);
111803
111804         window.setTimeout(function () {
111805             updatePowerStatus(state);
111806             if (successCallback) {
111807                 successCallback();
111808             }
111809         }, 1);
111810     }
111811
111812     function setVisible(mode, successCallback, errorCallback, timeout) {
111813         if (!_security.setVisible) {
111814             throw new WebAPIException(errorcode.SECURITY_ERR);
111815         }
111816
111817         t.BluetoothAdapter("setVisible", arguments);
111818
111819         window.setTimeout(function () {
111820             var time;
111821
111822             if (!_devPowered) {
111823                 if (errorCallback) {
111824                     errorCallback(new WebAPIError(
111825                             errorcode.SERVICE_NOT_AVAILABLE_ERR));
111826                 }
111827                 return;
111828             }
111829
111830             if (typeof timeout === "number") {
111831                 if (timeout < 0) {
111832                     time = _data.DEFAULT_VISIBLE_TIME;
111833                 } else {
111834                     time = timeout * 1000;
111835                 }
111836             } else {
111837                 time = _data.DEFAULT_VISIBLE_TIME;
111838             }
111839             updateVisibleStatus(mode, time);
111840
111841             if (successCallback) {
111842                 successCallback();
111843             }
111844         }, 1);
111845     }
111846
111847     function discoverDevices(successCallback, errorCallback) {
111848         if (!_security.discoverDevices) {
111849             throw new WebAPIException(errorcode.SECURITY_ERR);
111850         }
111851
111852         t.BluetoothAdapter("discoverDevices", arguments);
111853
111854         window.setTimeout(function () {
111855             var interval;
111856
111857             if (!_devPowered) {
111858                 if (errorCallback) {
111859                     errorCallback(new WebAPIError(
111860                             errorcode.SERVICE_NOT_AVAILABLE_ERR));
111861                 }
111862                 return;
111863             }
111864
111865             // already discovering
111866             if (_isDiscovering) {
111867                 return;
111868             }
111869
111870             _isDiscovering = true;
111871             _data.historyDevs = {};
111872
111873             successCallback.onstarted();
111874
111875             _data.availableDevsChanging = false;
111876             utils.forEach(_data.availableDevs, function (item) {
111877                 _data.historyDevs[item.address] = item;
111878                 successCallback.ondevicefound(item);
111879             });
111880
111881             discoverInterval = window.setTimeout(function () {
111882                 var devs = [];
111883
111884                 window.clearInterval(interval);
111885                 utils.forEach(_data.historyDevs, function (item) {
111886                     devs.push(item);
111887                 });
111888                 successCallback.onfinished(devs);
111889                 _isDiscovering = false;
111890             }, _data.DISCOVER_TIME);
111891
111892             interval = window.setInterval(function () {
111893                 var removeList = [], i;
111894
111895                 if (!_isDiscovering) {
111896                     window.clearInterval(interval);
111897                     return;
111898                 }
111899
111900                 if (_data.availableDevsChanging) {
111901                     _data.availableDevsChanging = false;
111902                     utils.forEach(_data.historyDevs, function (item) {
111903                         if (!_data.availableDevs[item.address]) {
111904                             removeList.push(item.address);
111905                         }
111906                     });
111907                     for (i in removeList) {
111908                         successCallback.ondevicedisappeared(removeList[i]);
111909                         delete _data.historyDevs[removeList[i]];
111910                     }
111911                     utils.forEach(_data.availableDevs, function (item) {
111912                         if (!_data.historyDevs[item.address]) {
111913                             _data.historyDevs[item.address] = item;
111914                             successCallback.ondevicefound(item);
111915                         }
111916                     });
111917                 }
111918             }, _data.DISCOVER_INTERVAL);
111919         }, 1);
111920     }
111921
111922     function stopDiscovery(successCallback, errorCallback) {
111923         if (!_security.stopDiscovery) {
111924             throw new WebAPIException(errorcode.SECURITY_ERR);
111925         }
111926
111927         t.BluetoothAdapter("stopDiscovery", arguments);
111928
111929         window.setTimeout(function () {
111930             if (!_devPowered) {
111931                 if (errorCallback) {
111932                     errorCallback(new WebAPIError(
111933                             errorcode.SERVICE_NOT_AVAILABLE_ERR));
111934                 }
111935                 return;
111936             }
111937
111938             if (_isDiscovering) {
111939                 window.clearTimeout(discoverInterval);
111940             }
111941             _isDiscovering = false;
111942             if (successCallback) {
111943                 successCallback();
111944             }
111945         }, 1);
111946     }
111947
111948     function getKnownDevices(successCallback, errorCallback) {
111949         if (!_security.getKnownDevices) {
111950             throw new WebAPIException(errorcode.SECURITY_ERR);
111951         }
111952
111953         t.BluetoothAdapter("getKnownDevices", arguments);
111954
111955         window.setTimeout(function () {
111956             var devs = [];
111957
111958             if (!_devPowered) {
111959                 if (errorCallback) {
111960                     errorCallback(new WebAPIError(
111961                             errorcode.SERVICE_NOT_AVAILABLE_ERR));
111962                 }
111963                 return;
111964             }
111965             utils.forEach(_data.historyDevs, function (item) {
111966                 devs.push(new BluetoothDevice({
111967                     name: item.name,
111968                     address: item.address,
111969                     deviceClass: item.deviceClass,
111970                     isBonded: false,
111971                     isTrusted: item.isTrusted,
111972                     isConnected: false,
111973                     services: item.services,
111974                     metaData: _security
111975                 }));
111976             });
111977             successCallback(devs);
111978         }, 1);
111979     }
111980
111981     function getDevice(address, successCallback, errorCallback) {
111982         if (!_security.getDevice) {
111983             throw new WebAPIException(errorcode.SECURITY_ERR);
111984         }
111985
111986         t.BluetoothAdapter("getDevice", arguments);
111987
111988         window.setTimeout(function () {
111989             if (!_devPowered) {
111990                 if (errorCallback) {
111991                     errorCallback(new WebAPIError(
111992                             errorcode.SERVICE_NOT_AVAILABLE_ERR));
111993                 }
111994                 return;
111995             }
111996
111997             if (!_data.historyDevs[address]) {
111998                 if (!_data.availableDevs[address]) {
111999                     if (errorCallback) {
112000                         errorCallback(new WebAPIError(errorcode.NOT_FOUND_ERR));
112001                     }
112002                     return;
112003                 }
112004
112005                 _data.historyDevs[address] = _data.availableDevs[address];
112006             }
112007
112008             successCallback(_data.historyDevs[address]);
112009         }, 1);
112010     }
112011
112012     function createBonding(address, successCallback, errorCallback) {
112013         if (!_security.createBonding) {
112014             throw new WebAPIException(errorcode.SECURITY_ERR);
112015         }
112016
112017         t.BluetoothAdapter("createBonding", arguments);
112018
112019         window.setTimeout(function () {
112020             if (!_devPowered) {
112021                 if (errorCallback) {
112022                     errorCallback(new WebAPIError(
112023                             errorcode.SERVICE_NOT_AVAILABLE_ERR));
112024                 }
112025                 return;
112026             }
112027
112028             if (!_data.historyDevs[address]) {
112029                 if (!_data.availableDevs[address]) {
112030                     if (errorCallback) {
112031                         errorCallback(new WebAPIError(errorcode.NOT_FOUND_ERR));
112032                     }
112033                     return;
112034                 }
112035
112036                 _data.historyDevs[address] = _data.availableDevs[address];
112037             }
112038
112039             event.trigger("bt-device-bonded-changed", [address, true]);
112040             successCallback(_data.historyDevs[address]);
112041         }, 1);
112042     }
112043
112044     function destroyBonding(address, successCallback, errorCallback) {
112045         if (!_security.destroyBonding) {
112046             throw new WebAPIException(errorcode.SECURITY_ERR);
112047         }
112048
112049         t.BluetoothAdapter("destroyBonding", arguments);
112050
112051         window.setTimeout(function () {
112052             if (!_devPowered) {
112053                 if (errorCallback) {
112054                     errorCallback(new WebAPIError(
112055                             errorcode.SERVICE_NOT_AVAILABLE_ERR));
112056                 }
112057                 return;
112058             }
112059
112060             if (!_data.historyDevs[address]) {
112061                 if (!_data.availableDevs[address]) {
112062                     if (errorCallback) {
112063                         errorCallback(new WebAPIError(errorcode.NOT_FOUND_ERR));
112064                     }
112065                     return;
112066                 }
112067
112068                 _data.historyDevs[address] = _data.availableDevs[address];
112069             }
112070
112071             event.trigger("bt-service-state-update", [address, false]);
112072             event.trigger("bt-device-bonded-changed", [address, false]);
112073             if (successCallback) {
112074                 successCallback();
112075             }
112076         }, 1);
112077     }
112078
112079     function registerRFCOMMServiceByUUID(uuid, name, successCallback,
112080             errorCallback, securityLevel) {
112081         if (!_security.registerRFCOMMServiceByUUID) {
112082             throw new WebAPIException(errorcode.SECURITY_ERR);
112083         }
112084
112085         t.BluetoothAdapter("registerRFCOMMServiceByUUID", arguments);
112086
112087         window.setTimeout(function () {
112088             if (!_devPowered) {
112089                 if (errorCallback) {
112090                     errorCallback(new WebAPIError(
112091                             errorcode.SERVICE_NOT_AVAILABLE_ERR));
112092                 }
112093                 return;
112094             }
112095
112096             _data.localServices[uuid] = new BluetoothServiceHandler({
112097                 uuid: uuid,
112098                 name: name,
112099                 isConnected: false,
112100                 metaData: _security
112101             });
112102             successCallback(_data.localServices[uuid]);
112103         }, 1);
112104     }
112105
112106     event.on("bt-simulated-devices-changed", function () {
112107         var devs = db.retrieveObject("bt-simulated-devices");
112108         utils.forEach(_data.availableDevs, function (item) {
112109             if (!devs[item.address]) {
112110                 delete _data.availableDevs[item.address];
112111             }
112112         });
112113         utils.forEach(devs, function (item) {
112114             if (!_data.availableDevs[item.address]) {
112115                 _data.availableDevs[item.address] = new BluetoothDevice({
112116                     name: item.name,
112117                     address: item.address,
112118                     deviceClass: item.deviceClass,
112119                     isBonded: false,
112120                     isTrusted: item.isTrusted,
112121                     isConnected: false,
112122                     services: item.services,
112123                     metaData: _security
112124                 });
112125             }
112126         });
112127         _data.availableDevsChanging = true;
112128     });
112129
112130     event.on("bt-unregister-service", function (uuid, successCallback, errorCallback) {
112131         if (!_data.localServices[uuid]) {
112132             if (errorCallback) {
112133                 errorCallback(new WebAPIError(errorcode.UNKNOWN_ERR));
112134             }
112135             return;
112136         }
112137         delete _data.localServices[uuid];
112138         if (successCallback) {
112139             successCallback();
112140         }
112141     });
112142
112143     event.on("bt-power-setting", function (status) {
112144         updatePowerStatus(status);
112145     });
112146
112147     adapter = {
112148         setName:                     setName,
112149         setPowered:                  setPowered,
112150         setVisible:                  setVisible,
112151         discoverDevices:             discoverDevices,
112152         stopDiscovery:               stopDiscovery,
112153         getKnownDevices:             getKnownDevices,
112154         getDevice:                   getDevice,
112155         createBonding:               createBonding,
112156         destroyBonding:              destroyBonding,
112157         registerRFCOMMServiceByUUID: registerRFCOMMServiceByUUID
112158     };
112159
112160     adapter.__defineGetter__("name", function () {
112161         return _devName;
112162     });
112163
112164     adapter.__defineGetter__("address", function () {
112165         return _devAddress;
112166     });
112167
112168     adapter.__defineGetter__("powered", function () {
112169         return _devPowered;
112170     });
112171
112172     adapter.__defineGetter__("visible", function () {
112173         return _devVisible;
112174     });
112175
112176     return adapter;
112177 };
112178
112179 _self = function () {
112180     var bluetooth;
112181
112182     function getDefaultAdapter() {
112183         if (!_security.getDefaultAdapter) {
112184             throw new WebAPIException(errorcode.SECURITY_ERR);
112185         }
112186
112187         if (!_data.adapter) {
112188             throw new WebAPIException(errorcode.UNKNOWN_ERR);
112189         }
112190
112191         return _data.adapter;
112192     }
112193
112194     function handleSubFeatures(subFeatures) {
112195         var i, subFeature;
112196
112197         for (subFeature in subFeatures) {
112198             for (i in _security[subFeature]) {
112199                 _security[_security[subFeature][i]] = true;
112200             }
112201         }
112202     }
112203
112204     bluetooth = {
112205         getDefaultAdapter: getDefaultAdapter,
112206         handleSubFeatures: handleSubFeatures
112207     };
112208
112209     bluetooth.__defineGetter__("deviceMajor", function () {
112210         return _data.bluetoothClassDeviceMajor;
112211     });
112212
112213     bluetooth.__defineGetter__("deviceMinor", function () {
112214         return _data.bluetoothClassDeviceMinor;
112215     });
112216
112217     bluetooth.__defineGetter__("deviceService", function () {
112218         return _data.bluetoothClassDeviceService;
112219     });
112220
112221     return bluetooth;
112222 };
112223
112224 _initialize();
112225
112226 module.exports = _self;
112227
112228 });
112229 define('ripple/platform/tizen/2.0/contact', function (require, exports, module) {
112230 /*
112231  *  Copyright 2013 Intel Corporation.
112232  *
112233  * Licensed under the Apache License, Version 2.0 (the "License");
112234  * you may not use this file except in compliance with the License.
112235  * You may obtain a copy of the License at
112236  *
112237  * http://www.apache.org/licenses/LICENSE-2.0
112238  *
112239  * Unless required by applicable law or agreed to in writing, software
112240  * distributed under the License is distributed on an "AS IS" BASIS,
112241  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
112242  * See the License for the specific language governing permissions and
112243  * limitations under the License.
112244  */
112245
112246 var db = require('ripple/db'),
112247     decorator = require('ripple/platform/tizen/2.0/decorator'),
112248     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
112249     t = require('ripple/platform/tizen/2.0/typecast'),
112250     tizen1_utils = require('ripple/platform/tizen/2.0/tizen1_utils'),
112251     utils = require('ripple/utils'),
112252     ContactName = require('ripple/platform/tizen/2.0/ContactName'),
112253     ContactAddress = require('ripple/platform/tizen/2.0/ContactAddress'),
112254     ContactPhoneNumber = require('ripple/platform/tizen/2.0/ContactPhoneNumber'),
112255     ContactEmailAddress = require('ripple/platform/tizen/2.0/ContactEmailAddress'),
112256     ContactAnniversary = require('ripple/platform/tizen/2.0/ContactAnniversary'),
112257     ContactOrganization = require('ripple/platform/tizen/2.0/ContactOrganization'),
112258     ContactWebSite = require('ripple/platform/tizen/2.0/ContactWebSite'),
112259     WebAPIError = require('ripple/platform/tizen/2.0/WebAPIError'),
112260     WebAPIException = require('ripple/platform/tizen/2.0/WebAPIException'),
112261     AddressBook,
112262     AddressBookData,
112263     AddressBookStorage,
112264     Contact,
112265     ContactData,
112266     ContactInternal,
112267     ContactGroup,
112268     Person,
112269     PersonBuilder,
112270     _data = {
112271         DB_CONTACT_KEY: "tizen1-contact",
112272         addressBooks:   [],
112273         contacts:       {},
112274         persons:        {},
112275         contactData:    {},
112276         dbStorage:      {}
112277     },
112278     _security = {
112279         "http://tizen.org/privilege/contact.read": ["getAddressBooks",
112280                 "getUnifiedAddressBook", "getDefaultAddressBook",
112281                 "getAddressBook", "get", "find", "addChangeListener",
112282                 "removeChangeListener", "getGroup", "getGroups", "clone"],
112283         "http://tizen.org/privilege/contact.write": ["add", "addBatch",
112284                 "update", "updateBatch", "remove", "removeBatch", "addGroup",
112285                 "updateGroup", "removeGroup", "link", "unlink"]
112286     },
112287     _self;
112288
112289 function _get() {
112290     _data.dbStorage = db.retrieveObject(_data.DB_CONTACT_KEY) ||
112291             {addressBooks: [], persons: {}};
112292 }
112293
112294 function _save() {
112295     db.saveObject(_data.DB_CONTACT_KEY, _data.dbStorage);
112296 }
112297
112298 function _serialize(obj) {
112299     var i, dbObj = {};
112300
112301     for (i in obj) {
112302         if (typeof obj[i] !== "function")
112303             dbObj[i] = utils.copy(obj[i]);
112304     }
112305
112306     return dbObj;
112307 }
112308
112309 /* check filter type (it's a recursive function)
112310    0: It is not a filter
112311    1: CompositeFilter
112312    2: AttributeFilter
112313    3: AttributeRangeFilter
112314  */
112315 function _filterType(filter) {
112316     var i = 0, ret;
112317
112318     if (Object.prototype.toString.call(filter) !== "[object Object]") {
112319         return 0; // 0: it is not a filter
112320     }
112321
112322     /* check if it is CompositFilter or not */
112323     if (filter.type !== null && filter.type !== undefined) {
112324         /* attribute 'type' of CompositeFilter must be "UNION" or "INTERSECTION" */
112325         if (filter.type === "UNION" || filter.type === "INTERSECTION") {
112326             /*attribute 'filters' of CompositeFilter must be AbstractFilter array */
112327             if (tizen1_utils.isValidArray(filter.filters)) {
112328                 for (i = 0; i < filter.filters.length; i++) {
112329                     /* recursive call */
112330                     if (_filterType(filter.filters[i]) === 0) {
112331                         return 0; // 0: it is not a filter
112332                     }
112333                 }
112334             } else {
112335                 return 0; // 0: it is not a filter
112336             }
112337         } else {
112338             return 0; // 0: it is not a filter
112339         }
112340         return 1; // CompositeFilter
112341     }
112342
112343     /* AttributeFilter or AttributeRangeFilter must have attributeName */
112344     if (filter.attributeName === null || filter.attributeName === undefined) {
112345         return 0; // 0: it is not a filter
112346     } else {
112347         ret = 2; // assume it is an AttributeFilter
112348         if ((filter.initialValue !== null && filter.initialValue !== undefined) ||
112349             (filter.endValue !== null && filter.endValue !== undefined)) {
112350             ret = 3; // AttributeRangeFilter
112351         }
112352         return ret;
112353     }
112354 }
112355
112356 function _sort(objects, sortMode) {
112357     function getValue(obj, key) {
112358         var keys = key.split("."),
112359             value = obj[keys[0]],
112360             i;
112361
112362         for (i = 1; i < keys.length; i++) {
112363             if (value[keys[i]]) {
112364                 value = value[keys[i]];
112365             }
112366         }
112367
112368         return value;
112369     }
112370
112371     objects.sort(function (a, b) {
112372         return (sortMode.order === "ASC") ?
112373             (getValue(a, sortMode.attributeName) < getValue(b, sortMode.attributeName) ? -1 : 1):
112374             (getValue(a, sortMode.attributeName) > getValue(b, sortMode.attributeName) ? -1 : 1);
112375     });
112376
112377     return objects;
112378 }
112379
112380 function _replacePerson(oldId, newId) {
112381     var contact, dbAddressBook, idab, idc, i;
112382
112383     for (idab in _data.contacts) {
112384         for (idc in _data.contacts[idab]) {
112385             contact = _data.contacts[idab][idc];
112386             if (contact.personId === oldId) {
112387                 if (newId === null) {
112388                     delete _data.contacts[idab][idc];
112389                 } else {
112390                     contact.personId = newId;
112391                 }
112392             }
112393         }
112394     }
112395
112396     if (_data.persons[oldId]) {
112397         delete _data.persons[oldId];
112398     }
112399
112400     for (i in _data.dbStorage.addressBooks) {
112401         dbAddressBook = _data.dbStorage.addressBooks[i];
112402         for (idc in dbAddressBook.contacts) {
112403             contact = dbAddressBook.contacts[idc];
112404             if (contact.personId === oldId) {
112405                 if (newId === null) {
112406                     delete dbAddressBook.contacts[idc];
112407                 } else {
112408                     contact.personId = newId;
112409                 }
112410             }
112411         }
112412     }
112413
112414     if (_data.dbStorage.persons[oldId]) {
112415         delete _data.dbStorage.persons[oldId];
112416     }
112417 }
112418
112419 _self = function () {
112420     var contact;
112421
112422     // private
112423     function loadAddressBooks() {
112424         var i;
112425
112426         _get();
112427
112428         if (_data.dbStorage.addressBooks.length === 0) {
112429             // Initialize default address books if database is empty
112430             _data.dbStorage.addressBooks = [
112431                 new AddressBookStorage(Math.uuid(null, 16), "Phone address book", false, {}, []),
112432                 new AddressBookStorage(Math.uuid(null, 16), "SIM address book", false, {}, [])
112433             ];
112434         }
112435
112436         utils.forEach(_data.dbStorage.addressBooks, function (addressBook) {
112437             _data.addressBooks.push(new AddressBook(addressBook.id, addressBook.name,
112438                 addressBook.readOnly, addressBook.contacts, addressBook.groups));
112439         });
112440
112441         for (i in _data.dbStorage.persons) {
112442             _data.persons[i] = new Person(_data.dbStorage.persons[i]);
112443         }
112444     }
112445
112446     // public
112447     // Address Book Methods
112448     function getAddressBooks(successCallback, errorCallback) {
112449         if (!_security.getAddressBooks) {
112450             throw new WebAPIException(errorcode.SECURITY_ERR);
112451         }
112452
112453         t.ContactManager("getAddressBooks", arguments);
112454
112455         window.setTimeout(function () {
112456             if (_data.addressBooks.length === 0) {
112457                 loadAddressBooks();
112458             }
112459             successCallback(_data.addressBooks);
112460         }, 1);
112461     }
112462
112463     function getUnifiedAddressBook() {
112464         if (!_security.getUnifiedAddressBook) {
112465             throw new WebAPIException(errorcode.SECURITY_ERR);
112466         }
112467         if (_data.addressBooks.length === 0) {
112468             loadAddressBooks();
112469         }
112470         return _data.addressBooks[0];
112471     }
112472
112473     function getDefaultAddressBook() {
112474         if (!_security.getDefaultAddressBook) {
112475             throw new WebAPIException(errorcode.SECURITY_ERR);
112476         }
112477         if (_data.addressBooks.length === 0) {
112478             loadAddressBooks();
112479         }
112480         return _data.addressBooks[0];
112481     }
112482
112483     function getAddressBook(addressBookId) {
112484         var i;
112485
112486         if (!_security.getAddressBook) {
112487             throw new WebAPIException(errorcode.SECURITY_ERR);
112488         }
112489
112490         t.ContactManager("getAddressBook", arguments);
112491
112492         if (_data.addressBooks.length === 0) {
112493             loadAddressBooks();
112494         }
112495         for (i in _data.addressBooks) {
112496             if (_data.addressBooks[i].id === addressBookId) {
112497                 return _data.addressBooks[i];
112498             }
112499         }
112500
112501         /* Cannot found */
112502         throw new WebAPIException(errorcode.NOT_FOUND_ERR);
112503     }
112504
112505     // Person Methods
112506     function get(personId) {
112507         if (!_security.get) {
112508             throw new WebAPIException(errorcode.SECURITY_ERR);
112509         }
112510
112511         t.ContactManager("get", arguments);
112512
112513         if (_data.persons[personId] === undefined) {
112514             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
112515         }
112516
112517         return new Person(_data.persons[personId]);
112518     }
112519
112520     function update(person) {
112521         var updated;
112522
112523         if (!_security.update) {
112524             throw new WebAPIException(errorcode.SECURITY_ERR);
112525         }
112526
112527         t.ContactManager("update", arguments);
112528
112529         if (!person.id) {
112530             throw new WebAPIException(errorcode.INVALID_VALUES_ERR);
112531         }
112532         if (_data.persons[person.id] === undefined) {
112533             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
112534         }
112535
112536         updated = new Person(person);
112537
112538         _data.persons[updated.id] = updated;
112539         _data.dbStorage.persons[updated.id] = _serialize(updated);
112540         _save();
112541
112542         window.setTimeout(function () {
112543             utils.forEach(_data.contactData.listeners, function (listener) {
112544                 listener.onpersonsupdated([new Person(updated)]);
112545             });
112546         }, 1);
112547     }
112548
112549     function updateBatch(persons, successCallback, errorCallback) {
112550         if (!_security.updateBatch) {
112551             throw new WebAPIException(errorcode.SECURITY_ERR);
112552         }
112553
112554         t.ContactManager("updateBatch", arguments, true);
112555
112556         window.setTimeout(function () {
112557             var i, updated;
112558
112559             if (persons.length === 0) {
112560                 if (errorCallback) {
112561                     errorCallback(new WebAPIError(errorcode.INVALID_VALUES_ERR));
112562                 }
112563                 return;
112564             }
112565
112566             for (i in persons) {
112567                 if (!persons[i].id) {
112568                     if (errorCallback) {
112569                         errorCallback(new WebAPIError(errorcode.INVALID_VALUES_ERR));
112570                     }
112571                     return;
112572                 }
112573                 if (_data.persons[persons[i].id] === undefined) {
112574                     if (errorCallback) {
112575                         errorCallback(new WebAPIError(errorcode.NOT_FOUND_ERR));
112576                     }
112577                     return;
112578                 }
112579             }
112580             for (i in persons) {
112581                 updated = new Person(persons[i]);
112582
112583                 _data.persons[updated.id] = updated;
112584                 _data.dbStorage.persons[updated.id] = _serialize(updated);
112585             }
112586             _save();
112587             if (successCallback) {
112588                 successCallback();
112589             }
112590
112591             utils.forEach(_data.contactData.listeners, function (listener) {
112592                 var i, watched = [];
112593
112594                 for (i in persons) {
112595                     watched.push(new Person(_data.persons[persons[i].id]));
112596                 }
112597                 listener.onpersonsupdated(watched);
112598             });
112599         }, 1);
112600     }
112601
112602     function remove(personId) {
112603         if (!_security.remove) {
112604             throw new WebAPIException(errorcode.SECURITY_ERR);
112605         }
112606
112607         t.ContactManager("remove", arguments);
112608
112609         if (_data.persons[personId] === undefined) {
112610             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
112611         }
112612         _replacePerson(personId, null);
112613         _save();
112614
112615         window.setTimeout(function () {
112616             utils.forEach(_data.contactData.listeners, function (listener) {
112617                 listener.onpersonsremoved([personId]);
112618             });
112619         }, 1);
112620     }
112621
112622     function removeBatch(personIds, successCallback, errorCallback) {
112623         if (!_security.removeBatch) {
112624             throw new WebAPIException(errorcode.SECURITY_ERR);
112625         }
112626
112627         t.ContactManager("removeBatch", arguments, true);
112628
112629         window.setTimeout(function () {
112630             var i;
112631
112632             if (personIds.length === 0) {
112633                 if (errorCallback) {
112634                     errorCallback(new WebAPIError(errorcode.INVALID_VALUES_ERR));
112635                 }
112636                 return;
112637             }
112638
112639             for (i in personIds) {
112640                 if (!personIds[i]) {
112641                     if (errorCallback) {
112642                         errorCallback(new WebAPIError(errorcode.INVALID_VALUES_ERR));
112643                     }
112644                     return;
112645                 }
112646                 if (_data.persons[personIds[i]] === undefined) {
112647                     if (errorCallback) {
112648                         errorCallback(new WebAPIError(errorcode.NOT_FOUND_ERR));
112649                     }
112650                     return;
112651                 }
112652             }
112653             for (i in personIds) {
112654                 _replacePerson(personIds[i], null);
112655             }
112656             _save();
112657             if (successCallback) {
112658                 successCallback();
112659             }
112660
112661             utils.forEach(_data.contactData.listeners, function (listener) {
112662                 listener.onpersonsremoved(utils.copy(personIds));
112663             });
112664         }, 1);
112665     }
112666
112667     function find(successCallback, errorCallback, filter, sortMode) {
112668         if (!_security.find) {
112669             throw new WebAPIException(errorcode.SECURITY_ERR);
112670         }
112671
112672         t.ContactManager("find", arguments, true);
112673
112674         window.setTimeout(function () {
112675             var i, matched = [], result = [];
112676
112677             if (filter) {
112678                 switch (_filterType(filter)) {
112679                 case 0:
112680                     if (errorCallback) {
112681                         errorCallback(new WebAPIError(errorcode.INVALID_VALUES_ERR));
112682                     }
112683                     return;
112684
112685                 case 1:
112686                     //TODO:
112687                     //"compositeFilter doesn't support"
112688                     if (errorCallback) {
112689                         errorCallback(new WebAPIError(errorcode.NOT_SUPPORTED_ERR));
112690                     }
112691                     return;
112692
112693                 case 2:
112694                 case 3:
112695                     break;
112696                 }
112697             }
112698
112699             if (filter === null || filter === undefined) {
112700                 utils.forEach(_data.persons, function (person) {
112701                     matched.push(person);
112702                 });
112703             } else {
112704                 switch (filter.attributeName) {
112705                 case "id":
112706                 case "displayName":
112707                 case "photoURI":
112708                 case "ringtoneURI":
112709                 case "displayContactId":
112710                     matched = tizen1_utils.matchAttributeFilter(_data.persons,
112711                             filter.attributeName, filter.matchFlag, filter.matchValue);
112712                     break;
112713
112714                 case "contactCount":
112715                     if ((filter.matchFlag !== "EXACTLY") ||
112716                             (typeof filter.matchValue !== "number")) {
112717                         if (errorCallback) {
112718                             errorCallback(new WebAPIError(errorcode.INVALID_VALUES_ERR));
112719                         }
112720                         return;
112721                     }
112722                     matched = tizen1_utils.matchAttributeFilter(_data.persons,
112723                             filter.attributeName, filter.matchFlag, filter.matchValue);
112724                     break;
112725
112726                 case "hasPhoneNumber":
112727                 case "hasEmail":
112728                 case "isFavorite":
112729                     if ((filter.matchFlag !== "EXACTLY") ||
112730                             (typeof filter.matchValue !== "boolean")) {
112731                         if (errorCallback) {
112732                             errorCallback(new WebAPIError(errorcode.INVALID_VALUES_ERR));
112733                         }
112734                         return;
112735                     }
112736                     matched = tizen1_utils.matchAttributeBooleanFilter(_data.persons,
112737                             filter.attributeName, filter.matchValue);
112738                     break;
112739
112740                 default:
112741                     if (errorCallback) {
112742                         errorCallback(new WebAPIError(errorcode.INVALID_VALUES_ERR));
112743                     }
112744                     return;
112745                 }
112746             }
112747
112748             if (sortMode) {
112749                 _sort(matched, sortMode);
112750             }
112751
112752             for (i in matched) {
112753                 result.push(new Person(matched[i]));
112754             }
112755
112756             successCallback(result);
112757         }, 1);
112758     }
112759
112760     function addChangeListener(successCallback) {
112761         var id;
112762
112763         if (!_security.addChangeListener) {
112764             throw new WebAPIException(errorcode.SECURITY_ERR);
112765         }
112766
112767         t.ContactManager("addChangeListener", arguments);
112768
112769         id = ++_data.contactData.nListener;
112770         _data.contactData.listeners[id] = successCallback;
112771
112772         return id;
112773     }
112774
112775     function removeChangeListener(watchId) {
112776         if (!_security.removeChangeListener) {
112777             throw new WebAPIException(errorcode.SECURITY_ERR);
112778         }
112779
112780         if (!_data.contactData.listeners[watchId])
112781             return;
112782
112783         delete _data.contactData.listeners[watchId];
112784     }
112785
112786     function handleSubFeatures(subFeatures) {
112787         var i, subFeature;
112788
112789         for (subFeature in subFeatures) {
112790             for (i in _security[subFeature]) {
112791                 _security[_security[subFeature][i]] = true;
112792             }
112793         }
112794     }
112795
112796     _data.contactData = new ContactData();
112797
112798     contact = {
112799         getAddressBooks:       getAddressBooks,
112800         getUnifiedAddressBook: getUnifiedAddressBook,
112801         getDefaultAddressBook: getDefaultAddressBook,
112802         getAddressBook:        getAddressBook,
112803
112804         get:                   get,
112805         update:                update,
112806         updateBatch:           updateBatch,
112807         remove:                remove,
112808         removeBatch:           removeBatch,
112809         find:                  find,
112810         addChangeListener:     addChangeListener,
112811         removeChangeListener:  removeChangeListener,
112812         handleSubFeatures:     handleSubFeatures
112813     };
112814
112815     return contact;
112816 };
112817
112818 AddressBook = function (id, name, readOnly, dbContacts, dbGroups) {
112819     var addressBook,
112820         privateData = new AddressBookData(dbContacts, dbGroups);
112821
112822     // private
112823     function addNewContact(contact, external) {
112824         var added, person;
112825
112826         added = new ContactInternal(contact);
112827         privateData.contacts[added.id] = added;
112828
112829         person = new PersonBuilder(added);
112830         _data.persons[person.id] = person;
112831
112832         added.personId = person.id;
112833         added.addressBookId = id;
112834
112835         dbContacts[added.id] = _serialize(added);
112836         _data.dbStorage.persons[person.id] = _serialize(_data.persons[person.id]);
112837
112838         decorator.Contact(external, added);
112839     }
112840
112841     // public
112842     function get(id) {
112843         if (!_security.get) {
112844             throw new WebAPIException(errorcode.SECURITY_ERR);
112845         }
112846
112847         t.AddressBook("get", arguments);
112848
112849         if (privateData.contacts[id] === undefined) {
112850             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
112851         }
112852         return new Contact(privateData.contacts[id]);
112853     }
112854
112855     function add(contact) {
112856         var external = contact;
112857
112858         if (!_security.add) {
112859             throw new WebAPIException(errorcode.SECURITY_ERR);
112860         }
112861         if (addressBook.readOnly) {
112862             throw new WebAPIException(errorcode.SECURITY_ERR);
112863         }
112864
112865         t.AddressBook("add", arguments, true);
112866
112867         addNewContact(contact, external);
112868         _save();
112869
112870         window.setTimeout(function () {
112871             utils.forEach(privateData.listeners, function (listener) {
112872                 listener.oncontactsadded([new Contact(external)]);
112873             });
112874             utils.forEach(_data.contactData.listeners, function (listener) {
112875                 listener.onpersonsadded([new Person(_data.persons[external.personId])]);
112876             });
112877         }, 1);
112878     }
112879
112880     function addBatch(contacts, successCallback, errorCallback) {
112881         var external = contacts;
112882         if (!_security.addBatch) {
112883             throw new WebAPIException(errorcode.SECURITY_ERR);
112884         }
112885         if (addressBook.readOnly) {
112886             throw new WebAPIException(errorcode.SECURITY_ERR);
112887         }
112888
112889         t.AddressBook("addBatch", arguments, true);
112890
112891         window.setTimeout(function () {
112892             var i, personIds = [];
112893
112894             if (contacts.length === 0) {
112895                 if (errorCallback) {
112896                     errorCallback(new WebAPIError(errorcode.INVALID_VALUES_ERR));
112897                 }
112898                 return;
112899             }
112900
112901             for (i in contacts) {
112902                 addNewContact(contacts[i], external[i]);
112903                 personIds.push(external[i].personId);
112904             }
112905             _save();
112906             if (successCallback) {
112907                 successCallback(external);
112908             }
112909
112910             utils.forEach(privateData.listeners, function (listener) {
112911                 var i, watched = [];
112912
112913                 for (i in contacts) {
112914                     watched.push(new Contact(external[i]));
112915                 }
112916                 listener.oncontactsadded(watched);
112917             });
112918             utils.forEach(_data.contactData.listeners, function (listener) {
112919                 var i, watched = [];
112920
112921                 for (i in personIds) {
112922                     watched.push(new Person(_data.persons[personIds[i]]));
112923                 }
112924                 listener.onpersonsadded(watched);
112925             });
112926         }, 1);
112927     }
112928
112929     function update(contact) {
112930         var updated;
112931
112932         if (!_security.update) {
112933             throw new WebAPIException(errorcode.SECURITY_ERR);
112934         }
112935         if (addressBook.readOnly) {
112936             throw new WebAPIException(errorcode.SECURITY_ERR);
112937         }
112938
112939         t.AddressBook("update", arguments);
112940
112941         if (!contact.id) {
112942             throw new WebAPIException(errorcode.INVALID_VALUES_ERR);
112943         }
112944         if (privateData.contacts[contact.id] === undefined) {
112945             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
112946         }
112947
112948         updated = new ContactInternal(contact);
112949
112950         privateData.contacts[updated.id] = updated;
112951         dbContacts[updated.id] = _serialize(updated);
112952         _save();
112953
112954         window.setTimeout(function () {
112955             utils.forEach(privateData.listeners, function (listener) {
112956                 listener.oncontactsupdated([new Contact(updated)]);
112957             });
112958         }, 1);
112959     }
112960
112961     function updateBatch(contacts, successCallback, errorCallback) {
112962         if (!_security.updateBatch) {
112963             throw new WebAPIException(errorcode.SECURITY_ERR);
112964         }
112965         if (addressBook.readOnly) {
112966             throw new WebAPIException(errorcode.SECURITY_ERR);
112967         }
112968
112969         t.AddressBook("updateBatch", arguments, true);
112970
112971         window.setTimeout(function () {
112972             var i, updated;
112973
112974             if (contacts.length === 0) {
112975                 if (errorCallback) {
112976                     errorCallback(new WebAPIError(errorcode.INVALID_VALUES_ERR));
112977                 }
112978                 return;
112979             }
112980
112981             for (i in contacts) {
112982                 if (!contacts[i].id) {
112983                     if (errorCallback) {
112984                         errorCallback(new WebAPIError(errorcode.INVALID_VALUES_ERR));
112985                     }
112986                     return;
112987                 }
112988                 if (privateData.contacts[contacts[i].id] === undefined) {
112989                     if (errorCallback) {
112990                         errorCallback(new WebAPIError(errorcode.NOT_FOUND_ERR));
112991                     }
112992                     return;
112993                 }
112994             }
112995             for (i in contacts) {
112996                 updated = new ContactInternal(contacts[i]);
112997
112998                 privateData.contacts[updated.id] = updated;
112999                 dbContacts[updated.id] = _serialize(updated);
113000             }
113001             _save();
113002             if (successCallback) {
113003                 successCallback();
113004             }
113005
113006             utils.forEach(privateData.listeners, function (listener) {
113007                 var i, watched = [];
113008
113009                 for (i in contacts) {
113010                     watched.push(new Contact(
113011                         privateData.contacts[contacts[i].id]));
113012                 }
113013                 listener.oncontactsupdated(watched);
113014             });
113015         }, 1);
113016     }
113017
113018     function remove(id) {
113019         if (!_security.remove) {
113020             throw new WebAPIException(errorcode.SECURITY_ERR);
113021         }
113022         if (addressBook.readOnly) {
113023             throw new WebAPIException(errorcode.SECURITY_ERR);
113024         }
113025
113026         t.AddressBook("remove", arguments);
113027
113028         if (privateData.contacts[id] === undefined) {
113029             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
113030         }
113031
113032         delete privateData.contacts[id];
113033         if (dbContacts[id]) {
113034             delete dbContacts[id];
113035         }
113036         _save();
113037
113038         window.setTimeout(function () {
113039             utils.forEach(privateData.listeners, function (listener) {
113040                 listener.oncontactsremoved([id]);
113041             });
113042         }, 1);
113043     }
113044
113045     function removeBatch(ids, successCallback, errorCallback) {
113046         if (!_security.removeBatch) {
113047             throw new WebAPIException(errorcode.SECURITY_ERR);
113048         }
113049         if (addressBook.readOnly) {
113050             throw new WebAPIException(errorcode.SECURITY_ERR);
113051         }
113052
113053         t.AddressBook("removeBatch", arguments, true);
113054
113055         window.setTimeout(function () {
113056             var i;
113057
113058             if (ids.length === 0) {
113059                 if (errorCallback) {
113060                     errorCallback(new WebAPIError(errorcode.INVALID_VALUES_ERR));
113061                 }
113062                 return;
113063             }
113064
113065             for (i in ids) {
113066                 if (!ids[i]) {
113067                     if (errorCallback) {
113068                         errorCallback(new WebAPIError(errorcode.INVALID_VALUES_ERR));
113069                     }
113070                     return;
113071                 }
113072                 if (privateData.contacts[ids[i]] === undefined) {
113073                     if (errorCallback) {
113074                         errorCallback(new WebAPIError(errorcode.NOT_FOUND_ERR));
113075                     }
113076                     return;
113077                 }
113078             }
113079             for (i in ids) {
113080                 delete privateData.contacts[ids[i]];
113081                 if (dbContacts[ids[i]]) {
113082                     delete dbContacts[ids[i]];
113083                 }
113084             }
113085             _save();
113086             if (successCallback) {
113087                 successCallback();
113088             }
113089
113090             utils.forEach(privateData.listeners, function (listener) {
113091                 listener.oncontactsremoved(utils.copy(ids));
113092             });
113093         }, 1);
113094     }
113095
113096     function find(successCallback, errorCallback, filter, sortMode) {
113097         if (!_security.find) {
113098             throw new WebAPIException(errorcode.SECURITY_ERR);
113099         }
113100
113101         t.AddressBook("find", arguments, true);
113102
113103         window.setTimeout(function () {
113104             var result = [], begin, end, i, atr, _re, errFlag = false,
113105                 _rangeMatch, low, high, matched, _existMatch, _arrayMatch;
113106
113107             if (filter) {
113108                 switch (_filterType(filter)) {
113109                 case 0:
113110                     if (errorCallback) {
113111                         errorCallback(new WebAPIError(errorcode.INVALID_VALUES_ERR));
113112                     }
113113                     return;
113114
113115                 case 1:
113116                     //TODO:
113117                     //"compositeFilter doesn't support"
113118                     if (errorCallback) {
113119                         errorCallback(new WebAPIError(errorcode.NOT_SUPPORTED_ERR));
113120                     }
113121                     return;
113122
113123                 case 2:
113124                 case 3:
113125                     break;
113126                 }
113127             }
113128
113129             /* return all contacts if no filter argument */
113130             if (filter === null || filter === undefined) {
113131                 utils.forEach(privateData.contacts, function (contact) {
113132                     result.push(new Contact(contact));
113133                 });
113134
113135                 successCallback(result);
113136                 return;
113137             }
113138
113139             /* check composition of filter.attributeName */
113140             switch (filter.attributeName) {
113141             case "id" :
113142             case "personId" :
113143             case "addressBookId" :
113144             case "name.prefix" :
113145             case "name.suffix" :
113146             case "name.firstName" :
113147             case "name.middleName" :
113148             case "name.lastName" :
113149             case "name.phoneticFirstName" :
113150             case "name.phoneticLastName" :
113151             case "name.displayName" :
113152             case "account.accountServiceId" :
113153             case "account.contactURI" :
113154             case "photoURI" :
113155             case "ringtoneURI" :
113156                 matched = tizen1_utils.matchAttributeFilter(privateData.contacts,
113157                         filter.attributeName, filter.matchFlag, filter.matchValue);
113158                 break;
113159
113160             case "name.nicknames" :
113161             case "notes" :
113162             case "groupIds" :
113163                 matched = tizen1_utils.matchAttributeArrayFilter(privateData.contacts,
113164                         filter.attributeName, filter.matchFlag, filter.matchValue);
113165                 break;
113166
113167             case "addresses.country" :
113168             case "addresses.region" :
113169             case "addresses.city" :
113170             case "addresses.streetAddress" :
113171             case "addresses.additionalInformation" :
113172             case "addresses.postalCode" :
113173             case "phoneNumbers.number" :
113174             case "emails.email" :
113175             case "anniversaries.label" :
113176             case "organizations.name" :
113177             case "organizations.department" :
113178             case "organizations.title" :
113179             case "organizations.role" :
113180             case "organizations.logoURI" :
113181             case "urls.url" :
113182             case "urls.type" :
113183                 atr = filter.attributeName.split(".");
113184                 _existMatch = function (obj) {
113185                     return (obj[atr[0]] !== undefined);
113186                 };
113187
113188                 if (filter.matchValue === undefined || filter.matchFlag === "EXISTS") {
113189                     matched = utils.filter(privateData.contacts, _existMatch);
113190                     break;
113191                 }
113192
113193                 errFlag = false;
113194
113195                 switch (filter.matchFlag)
113196                 {
113197                 case "EXACTLY":
113198                     _re = new RegExp("^" + filter.matchValue + "$");
113199                     break;
113200                 case "FULLSTRING":
113201                     _re = new RegExp("^" + filter.matchValue + "$", "i");
113202                     break;
113203                 case "CONTAINS":
113204                     _re = new RegExp(filter.matchValue, "i");
113205                     break;
113206                 case "STARTSWITH":
113207                     _re = new RegExp("^" + filter.matchValue, "i");
113208                     break;
113209                 case "ENDSWITH":
113210                     _re = new RegExp(filter.matchValue + "$", "i");
113211                     break;
113212                 default:
113213                     errFlag = true;
113214                 }
113215
113216                 if (errFlag) {
113217                     matched = [];
113218                     break;
113219                 }
113220
113221                 _arrayMatch = function (obj) {
113222                     return (obj[atr[0]].some(function (o) {
113223                         if (typeof o[atr[1]] !== "string") {
113224                             return false;
113225                         } else {
113226                             return (o[atr[1]].search(_re) !== -1);
113227                         }
113228                     }));
113229                 };
113230
113231                 matched = utils.filter(privateData.contacts, _arrayMatch);
113232                 break;
113233
113234             case "addresses.types" :
113235             case "phoneNumbers.types" :
113236             case "emails.types" :
113237                 atr = filter.attributeName.split(".");
113238                 _existMatch = function (obj) {
113239                     return (obj[atr[0]].some(function (o) {
113240                         return (o[atr[1]] !== undefined);
113241                     }));
113242                 };
113243
113244                 if (filter.matchValue === undefined || filter.matchFlag === "EXISTS") {
113245                     matched = utils.filter(privateData.contacts, _existMatch);
113246                     break;
113247                 }
113248
113249                 errFlag = false;
113250
113251                 switch (filter.matchFlag) {
113252                 case "EXACTLY":
113253                     _re = new RegExp("^" + filter.matchValue + "$");
113254                     break;
113255                 case "FULLSTRING":
113256                     _re = new RegExp("^" + filter.matchValue + "$", "i");
113257                     break;
113258                 case "CONTAINS":
113259                     _re = new RegExp(filter.matchValue, "i");
113260                     break;
113261                 case "STARTSWITH":
113262                     _re = new RegExp("^" + filter.matchValue, "i");
113263                     break;
113264                 case "ENDSWITH":
113265                     _re = new RegExp(filter.matchValue + "$", "i");
113266                     break;
113267                 default:
113268                     errFlag = true;
113269                 }
113270
113271                 if (errFlag) {
113272                     matched = [];
113273                     break;
113274                 }
113275
113276                 _arrayMatch = function (obj) {
113277                     return (obj[atr[0]].some(function (o) {
113278                         if (!tizen1_utils.isValidArray(o[atr[1]])) {
113279                             return false;
113280                         } else {
113281                             return (o[atr[1]].some(function (t) {
113282                                 return (t.search(_re) !== -1);
113283                             }));
113284                         }
113285                     }));
113286                 };
113287
113288                 matched = utils.filter(privateData.contacts, _arrayMatch);
113289                 break;
113290
113291             case "anniversaries.date" :
113292                 low = filter.initialValue;
113293                 high = filter.endValue;
113294                 atr = filter.attributeName.split(".");
113295
113296                 _rangeMatch = function (obj) {
113297                     var isMatched = true;
113298                     if (low !== null && low !== undefined) {
113299                         if (!tizen1_utils.isValidArray(obj[atr[0]])) {
113300                             isMatched = false;
113301                         } else {
113302                             isMatched = (obj[atr[0]].some(function (o) {
113303                                 return (o[atr[1]] >= low);
113304                             }));
113305                         }
113306                     }
113307                     if (isMatched && (high !== null && high !== undefined)) {
113308                         if (!tizen1_utils.isValidArray(obj[atr[0]])) {
113309                             isMatched = false;
113310                         } else {
113311                             isMatched = (obj[atr[0]].some(function (o) {
113312                                 return (o[atr[1]] <= high);
113313                             }));
113314                         }
113315                     }
113316                     return isMatched;
113317                 };
113318
113319                 matched = utils.filter(privateData.contacts, _rangeMatch);
113320                 break;
113321
113322             case "addresses.isDefault" :
113323             case "phoneNumbers.isDefault" :
113324             case "emails.isDefault" :
113325                 break;
113326
113327             case "isFavorite" :
113328                 if (filter.matchFlag !== "EXACTLY" || typeof filter.matchValue !== "boolean") {
113329                     if (errorCallback) {
113330                         errorCallback(new WebAPIError(errorcode.INVALID_VALUES_ERR));
113331                     }
113332                     return;
113333                 } else {
113334                     matched = tizen1_utils.matchAttributeBooleanFilter(privateData.contacts,
113335                             filter.attributeName, filter.matchValue);
113336                 }
113337                 break;
113338
113339             case "birthday" :
113340                 begin = filter.initialValue;
113341                 end = filter.endValue;
113342
113343                 matched = tizen1_utils.matchAttributeRangeFilter(privateData.contacts,
113344                         filter.attributeName, begin, end);
113345                 break;
113346
113347             default:
113348                 if (errorCallback) {
113349                     errorCallback(new WebAPIError(errorcode.INVALID_VALUES_ERR));
113350                 }
113351                 return;
113352             }
113353
113354             if (sortMode) {
113355                 _sort(matched, sortMode);
113356             }
113357
113358             for (i in matched) {
113359                 result.push(new Contact(matched[i]));
113360             }
113361
113362             successCallback(result);
113363         }, 1);
113364     }
113365
113366     function addChangeListener(successCallback, errorCallback) {
113367         var id;
113368
113369         if (!_security.addChangeListener) {
113370             throw new WebAPIException(errorcode.SECURITY_ERR);
113371         }
113372
113373         t.AddressBook("addChangeListener", arguments);
113374
113375         id = ++privateData.nListener;
113376         privateData.listeners[id] = successCallback;
113377
113378         return id;
113379     }
113380
113381     function removeChangeListener(watchId) {
113382         if (!_security.removeChangeListener) {
113383             throw new WebAPIException(errorcode.SECURITY_ERR);
113384         }
113385
113386         if (!privateData.listeners[watchId])
113387             return;
113388
113389         delete privateData.listeners[watchId];
113390     }
113391
113392     function getGroup(groupId) {
113393         var i;
113394
113395         if (!_security.getGroup) {
113396             throw new WebAPIException(errorcode.SECURITY_ERR);
113397         }
113398
113399         t.AddressBook("getGroup", arguments);
113400
113401         for (i in privateData.groups) {
113402             if (privateData.groups[i].id === groupId)
113403                 break;
113404         }
113405         if (privateData.groups[i] === undefined) {
113406             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
113407         }
113408
113409         return new ContactGroup(privateData.groups[i]);
113410     }
113411
113412     function addGroup(group) {
113413         var external = group;
113414
113415         if (!_security.addGroup) {
113416             throw new WebAPIException(errorcode.SECURITY_ERR);
113417         }
113418
113419         t.AddressBook("addGroup", arguments, true);
113420
113421         group.id            = Math.uuid(null, 16);
113422         group.addressBookId = id;
113423
113424         external.__defineGetter__("id", function () {
113425             return group.id;
113426         });
113427
113428         external.__defineGetter__("addressBookId", function () {
113429             return group.addressBookId;
113430         });
113431
113432         privateData.groups.push(group);
113433         _save();
113434     }
113435
113436     function updateGroup(group) {
113437         var i;
113438
113439         if (!_security.updateGroup) {
113440             throw new WebAPIException(errorcode.SECURITY_ERR);
113441         }
113442
113443         t.AddressBook("updateGroup", arguments);
113444
113445         if (!group.id) {
113446             throw new WebAPIException(errorcode.INVALID_VALUES_ERR);
113447         }
113448         for (i in privateData.groups) {
113449             if (privateData.groups[i].id === group.id)
113450                 break;
113451         }
113452         if (privateData.groups[i].id === undefined) {
113453             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
113454         }
113455         if (privateData.groups[i].readOnly) {
113456             throw new WebAPIException(errorcode.SECURITY_ERR);
113457         }
113458         privateData.groups[i] = utils.copy(group);
113459         _save();
113460     }
113461
113462     function removeGroup(groupId) {
113463         var i;
113464
113465         if (!_security.removeGroup) {
113466             throw new WebAPIException(errorcode.SECURITY_ERR);
113467         }
113468
113469         t.AddressBook("removeGroup", arguments);
113470
113471         for (i in privateData.groups) {
113472             if (privateData.groups[i].id === groupId)
113473                 break;
113474         }
113475         if (privateData.groups[i].id === undefined) {
113476             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
113477         }
113478         if (privateData.groups[i].readOnly) {
113479             throw new WebAPIException(errorcode.SECURITY_ERR);
113480         }
113481
113482         privateData.groups.splice(i, 1);
113483         _save();
113484     }
113485
113486     function getGroups() {
113487         var groups = [], i;
113488
113489         if (!_security.getGroups) {
113490             throw new WebAPIException(errorcode.SECURITY_ERR);
113491         }
113492
113493         for (i in privateData.groups) {
113494             groups.push(new ContactGroup(privateData.groups[i]));
113495         }
113496         return groups;
113497     }
113498
113499     privateData.load();
113500     // Make private contacts accessible for Person methods
113501     _data.contacts[id] = privateData.contacts;
113502
113503     addressBook = {
113504         get:                  get,
113505         add:                  add,
113506         addBatch:             addBatch,
113507         update:               update,
113508         updateBatch:          updateBatch,
113509         remove:               remove,
113510         removeBatch:          removeBatch,
113511         find:                 find,
113512         addChangeListener:    addChangeListener,
113513         removeChangeListener: removeChangeListener,
113514
113515         getGroup:             getGroup,
113516         addGroup:             addGroup,
113517         updateGroup:          updateGroup,
113518         removeGroup:          removeGroup,
113519         getGroups:            getGroups
113520     };
113521
113522     addressBook.__defineGetter__("id", function () {
113523         return id;
113524     });
113525
113526     addressBook.__defineGetter__("name", function () {
113527         return name;
113528     });
113529
113530     addressBook.__defineGetter__("readOnly", function () {
113531         return readOnly;
113532     });
113533
113534     return addressBook;
113535 };
113536
113537 AddressBookData = function (contacts, groups) {
113538     var addressBookData;
113539
113540     // private
113541     function loadContacts() {
113542         for (var i in contacts) {
113543             addressBookData.contacts[i] = new ContactInternal(contacts[i]);
113544         }
113545     }
113546
113547     function loadGroups() {
113548         addressBookData.groups = groups;
113549     }
113550
113551     // public
113552     function load() {
113553         loadContacts();
113554         loadGroups();
113555     }
113556
113557     addressBookData = {
113558         contacts:  {},
113559         groups:    [],
113560         listeners: {},
113561         nListener: 0,
113562         load:      load
113563     };
113564
113565     return addressBookData;
113566 };
113567
113568 AddressBookStorage = function (id, name, readOnly, contacts, groups) {
113569     this.id       = id;
113570     this.name     = name;
113571     this.readOnly = readOnly;
113572     this.contacts = contacts;
113573     this.groups   = groups;
113574 };
113575
113576 Contact = function (contact) {
113577     var i, attr, arr;
113578
113579     this.name          = null;
113580     this.addresses     = [];
113581     this.photoURI      = null;
113582     this.phoneNumbers  = [];
113583     this.emails        = [];
113584     this.birthday      = null;
113585     this.anniversaries = [];
113586     this.organizations = [];
113587     this.notes         = [];
113588     this.urls          = [];
113589     this.ringtoneURI   = null;
113590     this.groupIds      = [];
113591
113592     for (attr in contact) {
113593         switch (attr) {
113594         case "name":
113595             this[attr] = new ContactName(contact[attr]);
113596             break;
113597
113598         case "addresses":
113599             arr = contact[attr];
113600             if (arr) {
113601                 for (i in arr) {
113602                     this[attr][i] = new ContactAddress(arr[i]);
113603                 }
113604             }
113605             break;
113606
113607         case "phoneNumbers":
113608             arr = contact[attr];
113609             if (arr) {
113610                 for (i in arr) {
113611                     this[attr][i] = new ContactPhoneNumber(arr[i].number,
113612                             arr[i].types || null, arr[i].isDefault || null);
113613                 }
113614             }
113615             break;
113616
113617         case "emails":
113618             arr = contact[attr];
113619             if (arr) {
113620                 for (i in arr) {
113621                     this[attr][i] = new ContactEmailAddress(arr[i].email,
113622                             arr[i].types || null, arr[i].isDefault || null);
113623                 }
113624             }
113625             break;
113626
113627         case "birthday":
113628             this[attr] = new Date(contact[attr]);
113629             break;
113630
113631         case "anniversaries":
113632             arr = contact[attr];
113633             if (arr) {
113634                 for (i in arr) {
113635                     if (!tizen1_utils.isValidDate(arr[i].date)) {
113636                         arr[i].date = new Date(arr[i].date);
113637                     }
113638                     this[attr][i] = new ContactAnniversary(arr[i].date,
113639                             arr[i].label || null);
113640                 }
113641             }
113642             break;
113643
113644         case "organizations":
113645             arr = contact[attr];
113646             if (arr) {
113647                 for (i in arr) {
113648                     this[attr][i] = new ContactOrganization(arr[i]);
113649                 }
113650             }
113651             break;
113652
113653         case "notes":
113654         case "groupIds":
113655             arr = contact[attr];
113656             if (arr) {
113657                 for (i in arr) {
113658                     this[attr][i] = arr[i];
113659                 }
113660             }
113661             break;
113662
113663         case "urls":
113664             arr = contact[attr];
113665             if (arr) {
113666                 for (i in arr) {
113667                     this[attr][i] = new ContactWebSite(arr[i].url,
113668                             arr[i].type || null);
113669                 }
113670             }
113671             break;
113672
113673         default:
113674             this[attr] = contact[attr];
113675             break;
113676         }
113677     }
113678
113679     decorator.Contact(this, contact);
113680     this.__proto__ = tizen.Contact.prototype;
113681 };
113682
113683 ContactInternal = function (contact) {
113684     var attr;
113685
113686     for (attr in contact) {
113687         this[attr] = contact[attr];
113688     }
113689
113690     if (!contact.id) {
113691         this.id = Math.uuid(null, 16);
113692         this.lastUpdated = new Date();
113693     } else {
113694         this.lastUpdated = new Date(contact.lastUpdated);
113695     }
113696
113697     if (this.name) {
113698         this.name.__defineGetter__("displayName", function () {
113699             var displayName = "";
113700
113701             if (!this)
113702                 return "";
113703
113704             if ((this.firstName !== null) &&
113705                 (this.lastName !== null)) {
113706                 displayName = [this.firstName, this.middleName, this.lastName];
113707                 displayName = displayName.join(" ").replace(/ +/g, " ").trim();
113708             } else if (this.nicknames.length !== 0) {
113709                 this.nicknames.some(function (nickname) {
113710                     displayName = nickname;
113711                     return displayName;
113712                 });
113713             }
113714
113715             return displayName;
113716         });
113717     }
113718 };
113719
113720 ContactData = function () {
113721     this.listeners = {};
113722     this.nListener = 0;
113723 };
113724
113725 ContactGroup = function (groupInitDict) {
113726     var id, addressBookId, readOnly;
113727
113728     this.__defineGetter__("id", function () {
113729         return id;
113730     });
113731
113732     this.__defineGetter__("addressBookId", function () {
113733         return addressBookId;
113734     });
113735
113736     this.__defineGetter__("readOnly", function () {
113737         return readOnly;
113738     });
113739
113740     id               = groupInitDict.id || null;
113741     addressBookId    = groupInitDict.addressBookId || null;
113742     readOnly         = groupInitDict.readOnly || false;
113743
113744     this.name        = groupInitDict.name || "";
113745     this.ringtoneURI = groupInitDict.ringtoneURI || null;
113746     this.photoURI    = groupInitDict.photoURI || null;
113747
113748     this.__proto__ = tizen.ContactGroup.prototype;
113749 };
113750
113751 Person = function (personInitDict) {
113752     var person = {};
113753
113754     function hasContactMethod(method) {
113755         var idab, idc, contact, count = 0;
113756
113757         for (idab in _data.contacts) {
113758             for (idc in _data.contacts[idab]) {
113759                 contact = _data.contacts[idab][idc];
113760                 if (contact.personId === person.id) {
113761                     count += contact[method].length;
113762                 }
113763             }
113764         }
113765
113766         return (count !== 0);
113767     }
113768
113769     person.id               = personInitDict.id || Math.uuid(null, 16);
113770     person.isFavorite       = personInitDict.isFavorite || false;
113771     person.photoURI         = personInitDict.photoURI || null;
113772     person.ringtoneURI      = personInitDict.ringtoneURI || null;
113773     person.displayContactId = personInitDict.displayContactId;
113774
113775     this.__defineGetter__("id", function () {
113776         return person.id;
113777     });
113778
113779     this.__defineGetter__("displayName", function () {
113780         var idab, contact, displayName = "";
113781
113782         for (idab in _data.contacts) {
113783             contact = _data.contacts[idab][this.displayContactId];
113784
113785             if (contact !== undefined) {
113786                 if (contact.name && contact.name.displayName) {
113787                     displayName = contact.name.displayName;
113788                 }
113789                 break;
113790             }
113791         }
113792
113793         return displayName;
113794     });
113795
113796     this.__defineGetter__("contactCount", function () {
113797         var idab, idc, contactCount = 0;
113798
113799         for (idab in _data.contacts) {
113800             for (idc in _data.contacts[idab]) {
113801                 if (_data.contacts[idab][idc].personId === person.id) {
113802                     ++contactCount;
113803                 }
113804             }
113805         }
113806
113807         return contactCount;
113808     });
113809
113810     this.__defineGetter__("hasPhoneNumber", function () {
113811         return hasContactMethod("phoneNumbers");
113812     });
113813
113814     this.__defineGetter__("hasEmail", function () {
113815         return hasContactMethod("emails");
113816     });
113817
113818     this.__defineGetter__("isFavorite", function () {
113819         return person.isFavorite;
113820     });
113821     this.__defineSetter__("isFavorite", function (val) {
113822         try {
113823             person.isFavorite = t.boolean(val);
113824         } catch (e) {
113825         }
113826     });
113827
113828     this.__defineGetter__("photoURI", function () {
113829         return person.photoURI;
113830     });
113831     this.__defineSetter__("photoURI", function (val) {
113832         try {
113833             person.photoURI = t.DOMString(val, "?");
113834         } catch (e) {
113835         }
113836     });
113837
113838     this.__defineGetter__("ringtoneURI", function () {
113839         return person.ringtoneURI;
113840     });
113841     this.__defineSetter__("ringtoneURI", function (val) {
113842         try {
113843             person.ringtoneURI = t.DOMString(val, "?");
113844         } catch (e) {
113845         }
113846     });
113847
113848     this.__defineGetter__("displayContactId", function () {
113849         return person.displayContactId;
113850     });
113851     this.__defineSetter__("displayContactId", function (val) {
113852         try {
113853             person.displayContactId = t.ContactId(val);
113854         } catch (e) {
113855         }
113856     });
113857
113858     this.link = function (personId) {
113859         if (!_security.link) {
113860             throw new WebAPIException(errorcode.SECURITY_ERR);
113861         }
113862
113863         t.Person("link", arguments);
113864
113865         if (_data.persons[personId] === undefined) {
113866             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
113867         }
113868
113869         _replacePerson(personId, person.id);
113870         _save();
113871     };
113872
113873     this.unlink = function (contactId) {
113874         var idab, contact, separated, i, dbAddressBook;
113875
113876         if (!_security.unlink) {
113877             throw new WebAPIException(errorcode.SECURITY_ERR);
113878         }
113879
113880         t.Person("unlink", arguments);
113881
113882         for (idab in _data.contacts) {
113883             if (_data.contacts[idab][contactId] !== undefined) {
113884                 contact = _data.contacts[idab][contactId];
113885                 break;
113886             }
113887         }
113888
113889         if (contact === undefined) {
113890             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
113891         }
113892         if (contact.personId !== person.id) {
113893             throw new WebAPIException(errorcode.UNKNOWN_ERR);
113894         }
113895
113896         separated = new PersonBuilder(contact);
113897         _data.persons[separated.id] = separated;
113898         contact.personId = separated.id;
113899
113900         _data.dbStorage.persons[separated.id] = _serialize(separated);
113901         for (i in _data.dbStorage.addressBooks) {
113902             dbAddressBook = _data.dbStorage.addressBooks[i];
113903             if (dbAddressBook.id === idab) {
113904                 dbAddressBook.contacts[contact.id].personId = separated.id;
113905                 break;
113906             }
113907         }
113908         _save();
113909
113910         return separated;
113911     };
113912 };
113913
113914 PersonBuilder = function (contact) {
113915     var person, personInitDict = {};
113916
113917     personInitDict.displayContactId = contact.id;
113918     person = new Person(personInitDict);
113919
113920     return person;
113921 };
113922
113923 module.exports = _self;
113924
113925 });
113926 define('ripple/platform/tizen/2.0/NDEFRecordText', function (require, exports, module) {
113927 /*
113928  *  Copyright 2013 Intel Corporation
113929  *
113930  * Licensed under the Apache License, Version 2.0 (the "License");
113931  * you may not use this file except in compliance with the License.
113932  * You may obtain a copy of the License at
113933  *
113934  * http://www.apache.org/licenses/LICENSE-2.0
113935  *
113936  * Unless required by applicable law or agreed to in writing, software
113937  * distributed under the License is distributed on an "AS IS" BASIS,
113938  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
113939  * See the License for the specific language governing permissions and
113940  * limitations under the License.
113941  */
113942
113943 var t = require('ripple/platform/tizen/2.0/typecast'),
113944     NDEFRecordInternal = require('ripple/platform/tizen/2.0/NDEFRecordInternal'),
113945     NDEFRecordText;
113946
113947 NDEFRecordText = function (text, languageCode, encoding) {
113948     var payload = [], i;
113949
113950     t.NDEFRecordText(arguments, this);
113951
113952     encoding = encoding || "UTF8";
113953
113954     // Store languageCode in payload
113955     payload.push(languageCode.length);
113956     for (i = 0; i < languageCode.length; i++) {
113957         payload.push(languageCode.charCodeAt(i));
113958     }
113959
113960     // Store text in payload
113961     for (i = 0; i < text.length; i++) {
113962         payload.push(text.charCodeAt(i));
113963     }
113964
113965     NDEFRecordInternal.call(this, tizen.nfc.NFC_RECORD_TNF_WELL_KNOWN,
113966             ["T".charCodeAt(0)], payload, []);
113967
113968     this.__defineGetter__("text", function () {
113969         return text;
113970     });
113971
113972     this.__defineGetter__("languageCode", function () {
113973         return languageCode;
113974     });
113975
113976     this.__defineGetter__("encoding", function () {
113977         return encoding;
113978     });
113979 };
113980
113981 module.exports = NDEFRecordText;
113982
113983 });
113984 define('ripple/platform/tizen/2.0/ContactOrganization', function (require, exports, module) {
113985 /*
113986  *  Copyright 2013 Intel Corporation.
113987  *
113988  * Licensed under the Apache License, Version 2.0 (the "License");
113989  * you may not use this file except in compliance with the License.
113990  * You may obtain a copy of the License at
113991  *
113992  * http://www.apache.org/licenses/LICENSE-2.0
113993  *
113994  * Unless required by applicable law or agreed to in writing, software
113995  * distributed under the License is distributed on an "AS IS" BASIS,
113996  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
113997  * See the License for the specific language governing permissions and
113998  * limitations under the License.
113999  */
114000
114001 var t = require('ripple/platform/tizen/2.0/typecast'),
114002     ContactOrganization;
114003
114004 ContactOrganization = function (orgInitDict) {
114005     var contactOrganization = {}, attr;
114006
114007     t.ContactOrganization(arguments, this);
114008
114009     contactOrganization.name       = null;
114010     contactOrganization.department = null;
114011     contactOrganization.title      = null;
114012     contactOrganization.role       = null;
114013     contactOrganization.logoURI    = null;
114014
114015     this.__defineGetter__("name", function () {
114016         return contactOrganization.name;
114017     });
114018     this.__defineSetter__("name", function (val) {
114019         try {
114020             contactOrganization.name = t.DOMString(val, "?");
114021         } catch (e) {
114022         }
114023     });
114024
114025     this.__defineGetter__("department", function () {
114026         return contactOrganization.department;
114027     });
114028     this.__defineSetter__("department", function (val) {
114029         try {
114030             contactOrganization.department = t.DOMString(val, "?");
114031         } catch (e) {
114032         }
114033     });
114034
114035     this.__defineGetter__("title", function () {
114036         return contactOrganization.title;
114037     });
114038     this.__defineSetter__("title", function (val) {
114039         try {
114040             contactOrganization.title = t.DOMString(val, "?");
114041         } catch (e) {
114042         }
114043     });
114044
114045     this.__defineGetter__("role", function () {
114046         return contactOrganization.role;
114047     });
114048     this.__defineSetter__("role", function (val) {
114049         try {
114050             contactOrganization.role = t.DOMString(val, "?");
114051         } catch (e) {
114052         }
114053     });
114054
114055     this.__defineGetter__("logoURI", function () {
114056         return contactOrganization.logoURI;
114057     });
114058     this.__defineSetter__("logoURI", function (val) {
114059         try {
114060             contactOrganization.logoURI = t.DOMString(val, "?");
114061         } catch (e) {
114062         }
114063     });
114064
114065     if (orgInitDict) {
114066         for (attr in orgInitDict) {
114067             contactOrganization[attr] = orgInitDict[attr];
114068         }
114069     }
114070 };
114071
114072 module.exports = ContactOrganization;
114073
114074 });
114075 define('ripple/platform/tizen/2.0/MessageFolder', function (require, exports, module) {
114076 /*
114077  *  Copyright 2012 Intel Corporation.
114078  *
114079  * Licensed under the Apache License, Version 2.0 (the "License");
114080  * you may not use this file except in compliance with the License.
114081  * You may obtain a copy of the License at
114082  *
114083  * http://www.apache.org/licenses/LICENSE-2.0
114084  *
114085  * Unless required by applicable law or agreed to in writing, software
114086  * distributed under the License is distributed on an "AS IS" BASIS,
114087  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
114088  * See the License for the specific language governing permissions and
114089  * limitations under the License.
114090  */
114091
114092 module.exports = function (opt) {
114093     var folder = {}, _id = opt.id, _parentId = null, _serviceId = opt.serviceId,
114094         _contentType = opt.contentType, _name = opt.id, _path = opt.path,
114095         _type = opt.type, _synchronizable = opt.synchronizable;
114096
114097     folder.name = _name;
114098     folder.synchronizable = _synchronizable;
114099     
114100     folder.__defineGetter__("id", function () {
114101         return _id;
114102     });
114103     folder.__defineGetter__("parentId", function () {
114104         return _parentId;
114105     });
114106     folder.__defineGetter__("serviceId", function () {
114107         return _serviceId;
114108     });
114109     folder.__defineGetter__("contentType", function () {
114110         return _contentType;
114111     });
114112     folder.__defineGetter__("path", function () {
114113         return _path;
114114     });
114115     folder.__defineGetter__("type", function () {
114116         return _type;
114117     });
114118     return folder;
114119 };
114120
114121 });
114122 define('ripple/platform/tizen/2.0/touchEvent', function (require, exports, module) {
114123 /*
114124  *  Copyright 2012 Intel Corporation
114125  *
114126  * Licensed under the Apache License, Version 2.0 (the "License");
114127  * you may not use this file except in compliance with the License.
114128  * You may obtain a copy of the License at
114129  *
114130  * http://www.apache.org/licenses/LICENSE-2.0
114131  *
114132  * Unless required by applicable law or agreed to in writing, software
114133  * distributed under the License is distributed on an "AS IS" BASIS,
114134  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
114135  * See the License for the specific language governing permissions and
114136  * limitations under the License.
114137  */
114138
114139 var emulatorBridge = require('ripple/emulatorBridge'),
114140     event = require('ripple/event'),
114141     tizen1_utils = require('ripple/platform/tizen/2.0/tizen1_utils'),
114142     Touch,
114143     TouchList,
114144     TouchEvent,
114145     _touchCanvasElements = [],
114146     _dataEnlargeRatio = 4,
114147     _self;
114148
114149 function _isValidTouch(touches) {
114150     var touche, _touches = [], i;
114151     if (!touches) {
114152         return false;
114153     }
114154     if (!tizen1_utils.isValidArray(touches)) {
114155         _touches = [touches];
114156     }
114157
114158     for (i = 0; i < _touches.length; i++) {
114159         touche = _touches[i];
114160         if ((touche !== undefined) &&
114161             ((typeof touche !== "object") ||
114162             (typeof touche.target !== "object") ||
114163             (touche.identifier !== undefined) && (typeof touche.identifier !== "number") ||
114164             (touche.screenX !== undefined) && (typeof touche.screenX !== "number") ||
114165             (touche.screenY !== undefined) && (typeof touche.screenY !== "number") ||
114166             (touche.clientX !== undefined) && (typeof touche.clientX !== "number") ||
114167             (touche.clientY !== undefined) && (typeof touche.clientY !== "number") ||
114168             (touche.pageX !== undefined) && (typeof touche.pageX !== "number") ||
114169             (touche.pageY !== undefined) && (typeof touche.pageY !== "number")))
114170             return false;
114171     }
114172     return true;
114173 }
114174
114175 function _dispatchAllEvents(event) {
114176     _touchCanvasElements.forEach(function (value) {
114177         if (value !== undefined) {
114178             value.dispatchEvent(event);
114179         }
114180     });
114181 }
114182
114183 function _touchMove(event) {
114184     var data = event.data,
114185         touches = [],
114186         removedTouches = [],
114187         touchList,
114188         simulatedEvent,
114189         dataId,
114190         ids = [],
114191         intervalId,
114192         currentIndex,
114193         item = {};
114194
114195     if (_touchCanvasElements.length === 0)
114196         return;
114197
114198     for (dataId in data) {
114199         if (!data[dataId].length || data[dataId].length === 0)
114200             return;
114201
114202         ids.push(dataId);
114203         item = data[dataId][0];
114204         touches.push(new Touch(item.target, dataId, item.pageX * _dataEnlargeRatio, item.pageY * _dataEnlargeRatio, item.screenX * _dataEnlargeRatio,
114205                                item.screenY * _dataEnlargeRatio, item.offsetX * _dataEnlargeRatio, item.offsetY * _dataEnlargeRatio));
114206     }
114207
114208     // touch start
114209     touchList = new TouchList(touches);
114210     simulatedEvent = new TouchEvent("touchstart", true, true, touchList, touchList, touchList, event.altKey, event.metaKey, event.ctrlKey, event.shiftKey);
114211     _dispatchAllEvents(simulatedEvent);
114212     currentIndex = 0;
114213
114214     // touch move and touch end
114215     intervalId = setInterval(function () {
114216         touches = [];
114217         removedTouches = [];
114218
114219         ids.forEach(function (id) {
114220             var points = data[id],
114221                 touchItem, removedItem;
114222
114223             if (currentIndex < points.length) {
114224                 touchItem = points[currentIndex];
114225             } else {
114226                 removedItem = points[points.length - 1];
114227             }
114228
114229             if (touchItem)
114230                 touches.push(new Touch(touchItem.target, id, touchItem.pageX * _dataEnlargeRatio, touchItem.pageY * _dataEnlargeRatio, touchItem.screenX * _dataEnlargeRatio,
114231                                        touchItem.screenY * _dataEnlargeRatio, touchItem.offsetX * _dataEnlargeRatio, touchItem.offsetY * _dataEnlargeRatio));
114232             if (removedItem)
114233                 removedTouches.push(new Touch(removedItem.target, id, removedItem.pageX * _dataEnlargeRatio, removedItem.pageY * _dataEnlargeRatio, removedItem.screenX * _dataEnlargeRatio,
114234                                     removedItem.screenY * _dataEnlargeRatio, removedItem.offsetX * _dataEnlargeRatio, removedItem.offsetY * _dataEnlargeRatio));
114235         });
114236
114237         if (touches.length > 0) {
114238             simulatedEvent = new TouchEvent("touchmove", true, true, new TouchList(touches), new TouchList(touches), new TouchList(touches),
114239                 event.altKey, event.metaKey, event.ctrlKey, event.shiftKey);
114240             _dispatchAllEvents(simulatedEvent);
114241         } else {
114242             clearInterval(intervalId);
114243         }
114244
114245         if (removedTouches.length > 0) {
114246             simulatedEvent = new TouchEvent("touchend", true, true, new TouchList(removedTouches), new TouchList(removedTouches), new TouchList(removedTouches),
114247                 event.altKey, event.metaKey, event.ctrlKey, event.shiftKey);
114248             _dispatchAllEvents(simulatedEvent);
114249         }
114250         currentIndex++;
114251     }, 50);
114252 }
114253
114254 function _touchCancel(event) {
114255     var mousedownEvent = event.touchEvent,
114256         simulatedEvent;
114257
114258     simulatedEvent = new TouchEvent("touchcancel", true, true, new TouchList([]), new TouchList([]), new TouchList([]),
114259         event.altKey, event.metaKey, event.ctrlKey, event.shiftKey);
114260     _dispatchAllEvents(simulatedEvent);
114261 }
114262
114263 function _initialize() {
114264     event.on("touchCancel", _touchCancel);
114265     event.on("touchEvent", _touchMove);
114266 }
114267
114268 Touch = function (target, identifier, pageX, pageY, screenX, screenY, clientX, clientY) {
114269     var _identifier = Number(identifier) || 0,
114270         _screenX = Number(screenX) || 0,
114271         _screenY = Number(screenY) || 0,
114272         _clientX = Number(clientX) || 0,
114273         _clientY = Number(clientY) || 0,
114274         _pageX = Number(pageX) || 0,
114275         _pageY = Number(pageY) || 0;
114276
114277     this.__defineGetter__("identifier", function () {
114278         return _identifier;
114279     });
114280     this.__defineGetter__("target", function () {
114281         return target;
114282     });
114283     this.__defineGetter__("screenX", function () {
114284         return _screenX;
114285     });
114286     this.__defineGetter__("screenY", function () {
114287         return _screenY;
114288     });
114289     this.__defineGetter__("clientX", function () {
114290         return _clientX;
114291     });
114292     this.__defineGetter__("clientY", function () {
114293         return _clientY;
114294     });
114295     this.__defineGetter__("pageX", function () {
114296         return _pageX;
114297     });
114298     this.__defineGetter__("pageY", function () {
114299         return _pageY;
114300     });
114301 };
114302
114303 TouchList = function (touches) {
114304     var _touches = _isValidTouch(touches) ? tizen1_utils.copy(touches) : [],
114305         i, _self;
114306
114307     _self = {
114308         item : function (index) {
114309             if (typeof index !== "number") {
114310                 return null;
114311             }
114312             if (index.toString().indexOf(".") !== -1) {
114313                 return null;
114314             }
114315             if (/^\\d+$/.test(index) || index >= _touches.length) {
114316                 return null;
114317             }
114318             if (!_touches) {
114319                 return null;
114320             }
114321             return _touches[index];
114322         },
114323
114324         identifiedTouch : function (identifier) {
114325             if (typeof identifier !== "number") {
114326                 return null;
114327             }
114328             if (!_touches) {
114329                 return null;
114330             }
114331             for (var i in _touches) {
114332                 if (_touches[i].identifier === identifier) {
114333                     return _touches[i];
114334                 }
114335             }
114336             return null;
114337         }
114338     };
114339
114340     for (i = 0; i < _touches.length; i++) {
114341         _self.__defineGetter__(i, (function (index) {
114342             return function () {
114343                 return _touches[index];
114344             };
114345         }(i)));
114346     }
114347
114348     _self.__defineGetter__("length", function () {
114349         return _touches.length;
114350     });
114351
114352     return _self;
114353 };
114354
114355 TouchEvent = function (type, canBubble, cancelable, touches, targetTouches, changedTouches, altKey, metaKey, ctrlKey, shiftKey) {
114356     var touchEvent = emulatorBridge.document().createEvent("UIEvents");
114357     touchEvent.initUIEvent(type, canBubble, cancelable, emulatorBridge.window(), 1);
114358
114359     touchEvent.__defineGetter__("touches", function () {
114360         return touches;
114361     });
114362     touchEvent.__defineGetter__("targetTouches", function () {
114363         return targetTouches;
114364     });
114365     touchEvent.__defineGetter__("changedTouches", function () {
114366         return changedTouches;
114367     });
114368     touchEvent.__defineGetter__("altKey", function () {
114369         return altKey;
114370     });
114371     touchEvent.__defineGetter__("metaKey", function () {
114372         return metaKey;
114373     });
114374     touchEvent.__defineGetter__("ctrlKey", function () {
114375         return ctrlKey;
114376     });
114377     touchEvent.__defineGetter__("shiftKey", function () {
114378         return shiftKey;
114379     });
114380     return touchEvent;
114381 };
114382
114383 _self = {
114384     mask: function (frame) {
114385         frame.addEventListener("DOMContentLoaded", function () {
114386             /*
114387             var widgetDocument = frame.contentDocument,
114388                 getElementByIdOri = widgetDocument.getElementById;
114389
114390             widgetDocument.getElementById = function () {
114391                 var element, addEventListenerOri;
114392
114393                 element = getElementByIdOri.apply(widgetDocument, Array.prototype.slice.call(arguments));
114394
114395                 if (element) {
114396                     addEventListenerOri = element.addEventListener;
114397                     element.addEventListener = function (event, callback, useCapture) {
114398                         if (event === "touchstart") {
114399                             _touchCanvasElements.push(element);
114400                         }
114401                         addEventListenerOri.apply(element, arguments);
114402                     };
114403                 }
114404                 return element;
114405             };
114406
114407             widgetDocument.createTouch = function (view, target, identifier, pageX, pageY, screenX, screenY) {
114408                 return new Touch(view, target, identifier, pageX, pageY, screenX, screenY);
114409             };
114410
114411             widgetDocument.createTouchList = function (pattern) {
114412                 if (arguments.length !== 1) {
114413                     return null;
114414                 }
114415                 return new TouchList(pattern);
114416             };
114417             */
114418         });
114419     }
114420 };
114421
114422 _initialize();
114423
114424 module.exports = _self;
114425
114426 });
114427 define('ripple/platform/tizen/2.0/AttributeFilter', function (require, exports, module) {
114428 /*
114429  *  Copyright 2013 Intel Corporation.
114430  *
114431  * Licensed under the Apache License, Version 2.0 (the "License");
114432  * you may not use this file except in compliance with the License.
114433  * You may obtain a copy of the License at
114434  *
114435  * http://www.apache.org/licenses/LICENSE-2.0
114436  *
114437  * Unless required by applicable law or agreed to in writing, software
114438  * distributed under the License is distributed on an "AS IS" BASIS,
114439  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
114440  * See the License for the specific language governing permissions and
114441  * limitations under the License.
114442  */
114443
114444 var t = require('ripple/platform/tizen/2.0/typecast'),
114445     AttributeFilter;
114446
114447 AttributeFilter = function (attributeName, matchFlag, matchValue) {
114448     var attributeFilter = {};
114449
114450     t.AttributeFilter(arguments, this);
114451
114452     attributeFilter.attributeName = attributeName;
114453     attributeFilter.matchFlag     = matchFlag || "EXACTLY";
114454     attributeFilter.matchValue    = (matchFlag === "EXISTS") ? null :
114455             matchValue || null;
114456
114457     this.__defineGetter__("attributeName", function () {
114458         return attributeFilter.attributeName;
114459     });
114460     this.__defineSetter__("attributeName", function (val) {
114461         try {
114462             attributeFilter.attributeName = t.DOMString(val);
114463         } catch (e) {
114464         }
114465     });
114466
114467     this.__defineGetter__("matchFlag", function () {
114468         return attributeFilter.matchFlag;
114469     });
114470     this.__defineSetter__("matchFlag", function (val) {
114471         try {
114472             attributeFilter.matchFlag = t.FilterMatchFlag(val);
114473         } catch (e) {
114474         }
114475     });
114476
114477     this.__defineGetter__("matchValue", function () {
114478         return attributeFilter.matchValue;
114479     });
114480     this.__defineSetter__("matchValue", function (val) {
114481         try {
114482             if (attributeFilter.matchFlag === "EXISTS") {
114483                 return;
114484             }
114485             attributeFilter.matchValue = t.any(val, "?");
114486         } catch (e) {
114487         }
114488     });
114489 };
114490
114491 module.exports = AttributeFilter;
114492
114493 });
114494 define('ripple/platform/tizen/2.0/AccountService', function (require, exports, module) {
114495 /*
114496  *  Copyright 2012 Intel Corporation.
114497  *
114498  * Licensed under the Apache License, Version 2.0 (the "License");
114499  * you may not use this file except in compliance with the License.
114500  * You may obtain a copy of the License at
114501  *
114502  * http://www.apache.org/licenses/LICENSE-2.0
114503  *
114504  * Unless required by applicable law or agreed to in writing, software
114505  * distributed under the License is distributed on an "AS IS" BASIS,
114506  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
114507  * See the License for the specific language governing permissions and
114508  * limitations under the License.
114509  */
114510
114511 module.exports = function (serviceName, serviceType, tag, displayName, icon, settings) {
114512     var _self,
114513         _id = Math.uuid(null, 16);
114514
114515     _self = {
114516         serviceName : serviceName || "",
114517         serviceType : serviceType || "",
114518         displayName : displayName || null,
114519         icon : icon || null,
114520         settings : settings || null,
114521         tag : tag || []
114522     };
114523
114524     _self.__defineGetter__("id", function () {
114525         return _id;
114526     });
114527
114528     return _self;
114529 };
114530
114531 });
114532 define('ripple/platform/tizen/2.0/nfc', function (require, exports, module) {
114533 /*
114534  *  Copyright 2013 Intel Corporation
114535  *
114536  * Licensed under the Apache License, Version 2.0 (the "License");
114537  * you may not use this file except in compliance with the License.
114538  * You may obtain a copy of the License at
114539  *
114540  * http://www.apache.org/licenses/LICENSE-2.0
114541  *
114542  * Unless required by applicable law or agreed to in writing, software
114543  * distributed under the License is distributed on an "AS IS" BASIS,
114544  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
114545  * See the License for the specific language governing permissions and
114546  * limitations under the License.
114547  */
114548
114549 var db = require('ripple/db'),
114550     event = require('ripple/event'),
114551     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
114552     t = require('ripple/platform/tizen/2.0/typecast'),
114553     WebAPIError = require('ripple/platform/tizen/2.0/WebAPIError'),
114554     WebAPIException = require('ripple/platform/tizen/2.0/WebAPIException'),
114555     NDEFRecord = require('ripple/platform/tizen/2.0/NDEFRecord'),
114556     NDEFMessage = require('ripple/platform/tizen/2.0/NDEFMessage'),
114557     NFCAdapter,
114558     NFCAdapterPrototype,
114559     NFCTag,
114560     NFCPeer,
114561     _data = {
114562         DB_NFC_TAG: "tizen1.0-nfc-tag",
114563         DB_NFC_PEER: "tizen1.0-nfc-peer",
114564         DB_NFC_OUTPUT_MESSAGE: "tizen1.0-nfc-output-message",
114565         INTERVAL: 1000,
114566         listener: {
114567             onCardEmulationChanged: null,
114568             onTagDetected: null,
114569             onPeerDetected: null,
114570             onNDEFReceived: null
114571         },
114572         pairedNFC: null,
114573         nfcAdapter: {},
114574         nfcCardEmulation: {},
114575         nfcTags: [],
114576         nfcTag: {},
114577         nfcPeer: null,
114578         isNear: false,      // Identify the device is whether near
114579         isDetectTag: false, // Identify NFC tag is detected
114580         isPeerConnected: false,
114581         connectedState: false
114582     },
114583     _security = {
114584         "http://tizen.org/privilege/nfc.admin": ["setPowered"],
114585         "http://tizen.org/privilege/nfc.common": ["getDefaultAdapter",
114586                 "setExclusiveMode", "getCachedMessage"],
114587         "http://tizen.org/privilege/nfc.p2p": ["setPeerListener",
114588                 "unsetPeerListener", "setReceiveNDEFListener",
114589                 "unsetReceiveNDEFListener", "sendNDEF"],
114590         "http://tizen.org/privilege/nfc.tag": ["setTagListener",
114591                 "unsetTagListener", "readNDEF", "writeNDEF", "transceive"]
114592     },
114593     _self;
114594
114595 _self = function () {
114596     var nfc, _exclusiveMode = false;
114597
114598     function getDefaultAdapter() {
114599         if (!_security.getDefaultAdapter) {
114600             throw new WebAPIException(errorcode.SECURITY_ERR);
114601         }
114602
114603         t.NFCManager("getDefaultAdapter", arguments);
114604
114605         if (!_data.nfcAdapter) {
114606             throw new WebAPIException(errorcode.UNKNOWN_ERR);
114607         }
114608
114609         return _data.nfcAdapter;
114610     }
114611
114612     /* API Description:
114613      *   If it gets priority and it is in foreground, system doesn't
114614      *   send app controls that are usually sent when detecting NFC Tag
114615      *   or receiving NDEF Message from the connected NFC peer-to-peer target
114616      *
114617      * Implementation detail:
114618      *   due to simulator only support single running instance and doesn't have
114619      *   other app controls which be called by design. we just put some system
114620      *   exclusive mode info on the 'System Summary' panel
114621      */
114622     function setExclusiveMode(mode) {
114623         if (!_security.setExclusiveMode) {
114624             throw new WebAPIException(errorcode.SECURITY_ERR);
114625         }
114626
114627         t.NFCManager("setExclusiveMode", arguments);
114628
114629         _exclusiveMode = mode;
114630         jQuery("#NFCExclusiveModeValue").text(_exclusiveMode);
114631     }
114632
114633     function handleSubFeatures(subFeatures) {
114634         var i, subFeature;
114635
114636         for (subFeature in subFeatures) {
114637             for (i in _security[subFeature]) {
114638                 _security[_security[subFeature][i]] = true;
114639             }
114640         }
114641     }
114642
114643     nfc = {
114644         getDefaultAdapter: getDefaultAdapter,
114645         setExclusiveMode:  setExclusiveMode,
114646         handleSubFeatures: handleSubFeatures
114647     };
114648
114649     nfc.__defineGetter__("NFC_RECORD_TNF_EMPTY", function () {
114650         return 0;
114651     });
114652
114653     nfc.__defineGetter__("NFC_RECORD_TNF_WELL_KNOWN", function () {
114654         return 1;
114655     });
114656
114657     nfc.__defineGetter__("NFC_RECORD_TNF_MIME_MEDIA", function () {
114658         return 2;
114659     });
114660
114661     nfc.__defineGetter__("NFC_RECORD_TNF_URI", function () {
114662         return 3;
114663     });
114664
114665     nfc.__defineGetter__("NFC_RECORD_TNF_EXTERNAL_RTD", function () {
114666         return 4;
114667     });
114668
114669     nfc.__defineGetter__("NFC_RECORD_TNF_UNKNOWN", function () {
114670         return 5;
114671     });
114672
114673     nfc.__defineGetter__("NFC_RECORD_TNF_UNCHANGED", function () {
114674         return 6;
114675     });
114676
114677     return nfc;
114678 };
114679
114680 NFCAdapterPrototype = function () {
114681     var nfcAdapterPrototype,
114682         interval,
114683         powered = false, // Identify the device on or off
114684         polling = false; // Identify the device is polled
114685
114686     event.trigger("nfc-power-changed", [powered]);
114687     event.on("nfc-power-setting", function (status) {
114688         updatePowerStatus(status);
114689     });
114690     event.on("nfc-attach-setting", function (type, isAttached) {
114691         var isDetectTag;
114692
114693         isDetectTag = (type === "Tag");
114694         updateIsNear(isDetectTag, isAttached);
114695     });
114696     event.on("nfc-tag-send", function (status) {
114697         var tag;
114698
114699         if (status) {
114700             tag = db.retrieveObject(_data.DB_NFC_TAG);
114701             if (tag.isSupportedNDEF) {
114702                 _data.nfcTag = new NFCTag(tag.type, tag.isSupportedNDEF,
114703                         tag.ndefSize, null, true, tag.ndefs);
114704             } else {
114705                 _data.nfcTag = new NFCTag(tag.type, tag.isSupportedNDEF,
114706                         tag.ndefSize, null, true, tag.rawData);
114707             }
114708             if (_data.listener.onTagDetected) {
114709                 _data.listener.onTagDetected.onattach(_data.nfcTag);
114710             }
114711         } else {
114712             tag = {};
114713             if (_data.listener.onTagDetected) {
114714                 _data.listener.onTagDetected.ondetach();
114715             }
114716         }
114717     });
114718     event.on("nfc-peer-send", function (status) {
114719         if (status) {
114720             if (!_data.nfcPeer) {
114721                 _data.nfcPeer = new NFCPeer(true);
114722             }
114723             _data.isPeerConnected = true;
114724             if (_data.listener.onPeerDetected) {
114725                 _data.listener.onPeerDetected.onattach(_data.nfcPeer);
114726             }
114727         } else {
114728             _data.isPeerConnected = false;
114729             if (_data.listener.onPeerDetected) {
114730                 _data.listener.onPeerDetected.ondetach();
114731             }
114732         }
114733     });
114734     event.on("nfc-peer-sending-ndef", function () {
114735         var peer, _records = [], rec, _ndef, i;
114736
114737         if (_data.isPeerConnected) {
114738             peer = db.retrieveObject(_data.DB_NFC_PEER);
114739             for (i in peer.ndef.records) {
114740                 rec = peer.ndef.records[i];
114741                 _records.push(new NDEFRecord(rec.tnf, rec.type, rec.payload,
114742                         rec.id));
114743             }
114744             _ndef = new NDEFMessage(_records);
114745             if (_data.listener.onNDEFReceived) {
114746                 _data.listener.onNDEFReceived(_ndef);
114747             }
114748         }
114749     });
114750
114751     // private
114752     function updatePowerStatus(status) {
114753         if (powered === status) {
114754             return;
114755         }
114756         if (!status) {
114757             updateIsNear(_data.isDetectTag, false);
114758             if (_data.listener.onTagDetected) {
114759                 _data.listener.onTagDetected.ondetach();
114760             }
114761
114762             if (_data.listener.onPeerDetected) {
114763                 _data.listener.onPeerDetected.ondetach();
114764             }
114765         }
114766         powered = status;
114767         updatePollingStatus(status);
114768
114769         event.trigger("nfc-power-changed", [powered]);
114770     }
114771
114772     function updatePollingStatus(status) {
114773         if (!powered)
114774             return;
114775         if (polling === status) {
114776             return;
114777         }
114778         polling = status;
114779         event.trigger("nfc-polling-changed", [polling]);
114780         if (polling) {
114781             interval = setInterval(poll, _data.INTERVAL);
114782         } else {
114783             clearInterval(interval);
114784         }
114785     }
114786
114787     function updateIsNear(isDetectTag, isAttached) {
114788         _data.isDetectTag = isDetectTag;
114789         _data.isNear = isAttached;
114790         if (!_data.isNear) {
114791             _data.connectedState = false;
114792             event.trigger("nfc-connectedState-changed", [false]);
114793         }
114794     }
114795
114796     function poll() {
114797         if (!_data.isNear) {
114798             return;
114799         }
114800         if (!_data.connectedState) {
114801             _data.connectedState = true;
114802             event.trigger("nfc-connectedState-changed", [true]);
114803         }
114804     }
114805
114806     // public
114807     // Turns NFC adapter on or off.
114808     function setPowered(state, successCallback, errorCallback) {
114809         if (!_security.setPowered) {
114810             throw new WebAPIException(errorcode.SECURITY_ERR);
114811         }
114812
114813         t.NFCAdapter("setPowered", arguments);
114814
114815         window.setTimeout(function () {
114816             updatePowerStatus(state);
114817             if (successCallback) {
114818                 successCallback();
114819             }
114820         }, 1);
114821     }
114822
114823     // Registers a callback function to invoke when NFC tag is detected.
114824     function setTagListener(detectCallback, tagFilter) {
114825         if (!_security.setTagListener) {
114826             throw new WebAPIException(errorcode.SECURITY_ERR);
114827         }
114828
114829         t.NFCAdapter("setTagListener", arguments);
114830
114831         //TODO: tagFilter support
114832         _data.listener.onTagDetected = detectCallback;
114833     }
114834
114835     // Registers a callback function to be invoked when NFC peer-to-peer target is detected.
114836     function setPeerListener(detectCallback) {
114837         if (!_security.setPeerListener) {
114838             throw new WebAPIException(errorcode.SECURITY_ERR);
114839         }
114840
114841         t.NFCAdapter("setPeerListener", arguments);
114842
114843         _data.listener.onPeerDetected = detectCallback;
114844     }
114845
114846     // Unregisters the listener for detecting an NFC tag.
114847     function unsetTagListener() {
114848         if (!_security.unsetTagListener) {
114849             throw new WebAPIException(errorcode.SECURITY_ERR);
114850         }
114851
114852         if (!_data.listener.onTagDetected) {
114853             return;
114854         }
114855
114856         _data.listener.onTagDetected = null;
114857     }
114858
114859     // Unregisters the listener for detecting an NFC peer-to-peer target.
114860     function unsetPeerListener() {
114861         if (!_security.unsetPeerListener) {
114862             throw new WebAPIException(errorcode.SECURITY_ERR);
114863         }
114864
114865         if (!_data.listener.onPeerDetected) {
114866             return;
114867         }
114868
114869         _data.listener.onPeerDetected = null;
114870     }
114871
114872     // Gets NDEF message cached when the tag is detected.
114873     function getCachedMessage() {
114874         if (!_security.getCachedMessage) {
114875             throw new WebAPIException(errorcode.SECURITY_ERR);
114876         }
114877
114878         t.NFCAdapter("getCachedMessage", arguments);
114879
114880         return _data.pairedNFC || new NDEFMessage([]);
114881     }
114882
114883     nfcAdapterPrototype = {
114884         setPowered:        setPowered,
114885         setTagListener:    setTagListener,
114886         setPeerListener:   setPeerListener,
114887         unsetTagListener:  unsetTagListener,
114888         unsetPeerListener: unsetPeerListener,
114889         getCachedMessage:  getCachedMessage
114890     };
114891
114892     nfcAdapterPrototype.__defineGetter__("powered", function () {
114893         return powered;
114894     });
114895
114896     return nfcAdapterPrototype;
114897 };
114898
114899 NFCAdapter = function () {
114900     this.__defineGetter__("powered", function () {
114901         return this.__proto__.powered;
114902     });
114903 };
114904
114905 NFCAdapter.prototype = new NFCAdapterPrototype();
114906
114907 NFCTag = function (type, isSupportedNDEF, ndefSize, properties, isConnected, ndefs) {
114908     var nfcTag, i, j, _ndefs, rec, _records, _ndefs_index = 0;
114909
114910     type = type || null;
114911     isSupportedNDEF = isSupportedNDEF || false;
114912     ndefSize = ndefSize || 1;
114913     properties = null;
114914     isConnected = isConnected || false;
114915
114916     _ndefs = [];
114917     for (i in ndefs) {
114918         _records = [];
114919         for (j in ndefs[i].records) {
114920             rec = ndefs[i].records[j];
114921             _records.push(new NDEFRecord(rec.tnf, rec.type, rec.payload,
114922                     rec.id));
114923         }
114924         _ndefs.push(new NDEFMessage(_records));
114925     }
114926
114927     // Reads NDEF data.
114928     function readNDEF(readCallback, errorCallback) {
114929         if (!_security.readNDEF) {
114930             throw new WebAPIException(errorcode.SECURITY_ERR);
114931         }
114932
114933         t.NFCTag("readNDEF", arguments);
114934
114935         window.setTimeout(function () {
114936             if (!_data.isNear || !isSupportedNDEF ||
114937                     (_ndefs_index >= ndefSize)) {
114938                 if (errorCallback) {
114939                     errorCallback(new WebAPIError(errorcode.UNKNOWN_ERR));
114940                 }
114941                 return;
114942             }
114943             _data.pairedNFC = _ndefs[_ndefs_index];
114944             readCallback(_ndefs[_ndefs_index]);
114945             _ndefs_index++;
114946         }, 1);
114947     }
114948
114949     // Writes NDEF data.
114950     function writeNDEF(ndefMessage, successCallback, errorCallback) {
114951         if (!_security.writeNDEF) {
114952             throw new WebAPIException(errorcode.SECURITY_ERR);
114953         }
114954
114955         t.NFCTag("writeNDEF", arguments, true);
114956
114957         window.setTimeout(function () {
114958             if (!_data.isNear || !isSupportedNDEF) {
114959                 if (errorCallback) {
114960                     errorCallback(new WebAPIError(errorcode.UNKNOWN_ERR));
114961                 }
114962                 return;
114963             }
114964             db.saveObject(_data.DB_NFC_OUTPUT_MESSAGE, ndefMessage);
114965             event.trigger("nfc-output-msg", []);
114966             if (successCallback) {
114967                 successCallback();
114968             }
114969         }, 1);
114970     }
114971
114972     // Access the raw format card.
114973     function transceive(data, dataCallback, errorCallback) {
114974         if (!_security.transceive) {
114975             throw new WebAPIException(errorcode.SECURITY_ERR);
114976         }
114977
114978         t.NFCTag("transceive", arguments, true);
114979
114980         window.setTimeout(function () {
114981             if (!_data.isNear || isSupportedNDEF) {
114982                 if (errorCallback) {
114983                     errorCallback(new WebAPIError(errorcode.UNKNOWN_ERR));
114984                 }
114985                 return;
114986             }
114987             db.saveObject(_data.DB_NFC_OUTPUT_MESSAGE, data);
114988             event.trigger("nfc-output-msg", []);
114989             dataCallback(ndefs);
114990         }, 1);
114991     }
114992
114993     // Formats the detected tag that can store NDEF messages.
114994     /*
114995     function formatNDEF(successCallback, errorCallback, key) {
114996
114997         tizen1_utils.validateCallbackType(successCallback, errorCallback);
114998
114999         if (key) {
115000             tizen1_utils.validateArgumentType(key, "array",
115001                 new WebAPIError(errorcode.TYPE_MISMATCH_ERR));
115002         }
115003
115004         if (!isConnected || !isSupportedNDEF) {
115005             if (errorCallback) {
115006                 errorCallback(new WebAPIError(errorcode.UNKNOWN_ERR));
115007             }
115008             return;
115009         }
115010
115011         successCallback();
115012     }
115013     */
115014
115015     nfcTag = {
115016         readNDEF:   readNDEF,
115017         writeNDEF:  writeNDEF,
115018         transceive: transceive
115019         //formatNDEF: formatNDEF
115020     };
115021
115022     nfcTag.__defineGetter__("type", function () {
115023         return type;
115024     });
115025
115026     nfcTag.__defineGetter__("isSupportedNDEF", function () {
115027         return isSupportedNDEF;
115028     });
115029
115030     nfcTag.__defineGetter__("ndefSize", function () {
115031         return ndefSize;
115032     });
115033
115034     nfcTag.__defineGetter__("properties", function () {
115035         return properties;
115036     });
115037
115038     nfcTag.__defineGetter__("isConnected", function () {
115039         return _data.isNear;
115040     });
115041
115042     return nfcTag;
115043 };
115044
115045 NFCPeer = function (isConnected) {
115046     var nfcPeer;
115047
115048     isConnected = isConnected || false;
115049
115050     // Registers a callback function to be invoked when NDEF message is received from NFC peer-to-peer target connected.
115051     function setReceiveNDEFListener(successCallback) {
115052         if (!_security.setReceiveNDEFListener) {
115053             throw new WebAPIException(errorcode.SECURITY_ERR);
115054         }
115055
115056         t.NFCPeer("setReceiveNDEFListener", arguments);
115057
115058         if (!_data.isPeerConnected) {
115059             return;
115060         }
115061         _data.listener.onNDEFReceived = successCallback;
115062     }
115063
115064     // Unregisters the listener for receiving NDEFMessage from NFC peer-to-peer target connected.
115065     function unsetReceiveNDEFListener() {
115066         if (!_security.unsetReceiveNDEFListener) {
115067             throw new WebAPIException(errorcode.SECURITY_ERR);
115068         }
115069
115070         _data.listener.onNDEFReceived = null;
115071     }
115072
115073     // Sends data to NFC peer-to-peer target.
115074     function sendNDEF(ndefMessage, successCallback, errorCallback) {
115075         if (!_security.sendNDEF) {
115076             throw new WebAPIException(errorcode.SECURITY_ERR);
115077         }
115078
115079         t.NFCPeer("sendNDEF", arguments, true);
115080
115081         window.setTimeout(function () {
115082             if (!_data.isPeerConnected) {
115083                 if (errorCallback) {
115084                     errorCallback(new WebAPIError(errorcode.UNKNOWN_ERR));
115085                 }
115086                 return;
115087             }
115088
115089             db.saveObject(_data.DB_NFC_OUTPUT_MESSAGE, ndefMessage);
115090             event.trigger("nfc-output-msg", []);
115091             if (successCallback) {
115092                 successCallback();
115093             }
115094         }, 1);
115095     }
115096
115097     nfcPeer = {
115098         setReceiveNDEFListener:   setReceiveNDEFListener,
115099         unsetReceiveNDEFListener: unsetReceiveNDEFListener,
115100         sendNDEF:                 sendNDEF
115101     };
115102
115103     nfcPeer.__defineGetter__("isConnected", function () {
115104         return _data.isPeerConnected;
115105     });
115106
115107     return nfcPeer;
115108 };
115109
115110 function _initialize() {
115111     _data.nfcAdapter = new NFCAdapter();
115112 }
115113
115114 _initialize();
115115
115116 module.exports = _self;
115117
115118 });
115119 define('ripple/platform/tizen/2.0/power', function (require, exports, module) {
115120 /*
115121  *  Copyright 2012 Intel Corporation.
115122  *
115123  * Licensed under the Apache License, Version 2.0 (the "License");
115124  * you may not use this file except in compliance with the License.
115125  * You may obtain a copy of the License at
115126  *
115127  * http://www.apache.org/licenses/LICENSE-2.0
115128  *
115129  * Unless required by applicable law or agreed to in writing, software
115130  * distributed under the License is distributed on an "AS IS" BASIS,
115131  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
115132  * See the License for the specific language governing permissions and
115133  * limitations under the License.
115134  */
115135 var event = require('ripple/event'),
115136     constants = require('ripple/constants'),
115137     deviceSettings = require('ripple/deviceSettings'),
115138     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
115139     WebAPIError = require('ripple/platform/tizen/2.0/WebAPIError'),
115140     tizen1_utils = require('ripple/platform/tizen/2.0/tizen1_utils'),
115141     _POWER_RESOURCE = constants.POWER_RESOURCE,
115142     _SCREEN_STATE = constants.POWER_RESOURCE.SCREEN.STATE,
115143     ScreenState = {"previous" : null, "current" : null},
115144     _listeners = [],
115145     _isScreenResourceOccupied = false,
115146     _originalBrightness,
115147     _isCPUAwake = false,
115148     _isScreenOn = true,
115149     _normalBrightness,
115150     _minimal_screen_state = null,
115151     _security = {
115152         "http://tizen.org/privilege/power": ["request", "setScreenBrightness", "turnScreenOn", "turnScreenOff"]
115153     },
115154     _self;
115155
115156 /**initialize**/
115157 function initState() {
115158     _normalBrightness = deviceSettings.retrieve("DISPLAY.brightness");
115159     updateResourceState();
115160 }
115161
115162 function getResourceState(value) {
115163     var state;
115164     value = Number(value);
115165     if (value <=  _SCREEN_STATE.SCREEN_OFF.MAX) {
115166         state = _SCREEN_STATE.SCREEN_OFF.NAME;
115167     } else if (value < _SCREEN_STATE.SCREEN_DIM.MAX) {
115168         state = _SCREEN_STATE.SCREEN_DIM.NAME;
115169     } else if (value < _SCREEN_STATE.SCREEN_NORMAL.MAX) {
115170         state = _SCREEN_STATE.SCREEN_NORMAL.NAME;
115171     } else {
115172         state = _SCREEN_STATE.SCREEN_BRIGHT.NAME;
115173     }
115174     return state;
115175 }
115176
115177 function updateResourceState() {
115178     var brightness, actualState;
115179     brightness = deviceSettings.retrieve("DISPLAY.brightness");
115180     actualState = getResourceState(brightness);
115181     ScreenState.previous = ScreenState.current;
115182     ScreenState.current = actualState;
115183 }
115184
115185 function callListeners(listeners, previousState, changedState) {
115186     listeners.forEach(function (listener) {
115187         setTimeout(function () {
115188             listener(previousState, changedState);
115189         }, 1);
115190     });
115191 }
115192
115193 function triggerListenerCB(stateObj) {
115194     if (stateObj.previous !== stateObj.current) {
115195         callListeners(_listeners, stateObj.previous, stateObj.current);
115196     }
115197 }
115198
115199 _self = function () {
115200     function request(resource, state) {
115201         if (!_security.request) {
115202             throw new WebAPIError(errorcode.SECURITY_ERR);
115203         }
115204         if (typeof resource !== 'string' || typeof state !== 'string') {
115205             throw new WebAPIError(errorcode.TYPE_MISMATCH_ERR);
115206         }
115207         //Check resource
115208         if (!_POWER_RESOURCE.hasOwnProperty(resource)) {
115209             throw new WebAPIError(errorcode.INVALID_VALUES_ERR);
115210         }
115211         //Check state
115212         if (!_POWER_RESOURCE[resource].STATE.hasOwnProperty(state)) {
115213             throw new WebAPIError(errorcode.INVALID_VALUES_ERR);
115214         }
115215         // Exception check: SCREEN_OFF is a state cannot be requested
115216         if (resource === "SCREEN" && state === "SCREEN_OFF") {
115217             throw new WebAPIError(errorcode.INVALID_VALUES_ERR);
115218         }
115219         switch (resource) {
115220         case "SCREEN" :
115221             if ((_minimal_screen_state === null) ||
115222                (_minimal_screen_state === "SCREEN_DIM" && (state === "SCREEN_NORMAL" || state === "SCREEN_BRIGHT")) ||
115223                (_minimal_screen_state === "SCREEN_NORMAL" && state === "SCREEN_BRIGHT")) {
115224                 _minimal_screen_state = state;
115225             }
115226             break;
115227         case "CPU" :
115228             _isCPUAwake = true;
115229             break;
115230         default:
115231             break;
115232         }
115233     }
115234
115235     function release(resource) {
115236         switch (resource) {
115237         case "SCREEN" :
115238             if (_isScreenResourceOccupied) {
115239                 _isScreenResourceOccupied = false;
115240                 deviceSettings.persist("DISPLAY.brightness", _originalBrightness);
115241                 event.trigger("DisplayBrightnessChangedByPower", [_originalBrightness]);
115242                 updateResourceState();
115243                 triggerListenerCB(ScreenState);
115244             }
115245             _minimal_screen_state = null;
115246             break;
115247         case "CPU" :
115248             _isCPUAwake = false;
115249             break;
115250         default:
115251             if (typeof resource === "string") {
115252                 throw (new WebAPIError(errorcode.INVALID_VALUES_ERR));
115253             } else  {
115254                 throw (new WebAPIError(errorcode.TYPE_MISMATCH_ERR));
115255             }
115256         }
115257     }
115258
115259     function setScreenStateChangeListener(listener) {
115260         tizen1_utils.validateArgumentType(listener, "function",
115261                 new WebAPIError(errorcode.TYPE_MISMATCH_ERR));
115262         _listeners.push(listener);
115263     }
115264
115265     function unsetScreenStateChangeListener() {
115266         _listeners = [];
115267     }
115268
115269     function getScreenBrightness() {
115270         var brightness = deviceSettings.retrieve("DISPLAY.brightness");
115271         return brightness;
115272     }
115273
115274     function setScreenBrightness(brightness) {
115275         if (!_security.setScreenBrightness) {
115276             throw new WebAPIError(errorcode.SECURITY_ERR);
115277         }
115278         if (typeof brightness !== 'number') {
115279             throw new WebAPIError(errorcode.TYPE_MISMATCH_ERR);
115280         }
115281         if (brightness < 0 || brightness > 1) {
115282             throw new WebAPIError(errorcode.INVALID_VALUES_ERR);
115283         }
115284         if (!_isScreenResourceOccupied) {
115285             _originalBrightness = deviceSettings.retrieve("DISPLAY.brightness");
115286             _isScreenResourceOccupied = true;
115287         }
115288         deviceSettings.persist("DISPLAY.brightness", brightness);
115289         event.trigger("DisplayBrightnessChangedByPower", [brightness]);
115290         updateResourceState();
115291         triggerListenerCB(ScreenState);
115292     }
115293
115294     function isScreenOn() {
115295         return _isScreenOn;
115296     }
115297
115298     function restoreScreenBrightness() {
115299         if (_isScreenResourceOccupied) {
115300             _isScreenResourceOccupied = false;
115301             deviceSettings.persist("DISPLAY.brightness", _originalBrightness);
115302             event.trigger("DisplayBrightnessChangedByPower", [_originalBrightness]);
115303             updateResourceState();
115304             triggerListenerCB(ScreenState);
115305         }
115306     }
115307
115308     function turnScreenOn() {
115309         var brightness, value, flag = false;
115310         if (!_security.turnScreenOn) {
115311             throw new WebAPIError(errorcode.SECURITY_ERR);
115312         }
115313         brightness = deviceSettings.retrieve("DISPLAY.brightness");
115314         switch (_minimal_screen_state) {
115315         case "SCREEN_DIM":
115316             if (brightness <= _SCREEN_STATE.SCREEN_OFF.VALUE) {
115317                 if (!_isScreenResourceOccupied) {
115318                     _originalBrightness = brightness;
115319                     _isScreenResourceOccupied = true;
115320                 }
115321                 value = _SCREEN_STATE.SCREEN_DIM.VALUE;
115322                 flag = true;
115323             }
115324             break;
115325         case "SCREEN_NORMAL":
115326             if (brightness < _SCREEN_STATE.SCREEN_NORMAL.MIN) {
115327                 if (!_isScreenResourceOccupied) {
115328                     _originalBrightness = brightness;
115329                     _isScreenResourceOccupied = true;
115330                 }
115331                 value = _normalBrightness;
115332                 flag = true;
115333             }
115334             break;
115335         case "SCREEN_BRIGHT":
115336             if (brightness < _SCREEN_STATE.SCREEN_BRIGHT.MIN) {
115337                 if (!_isScreenResourceOccupied) {
115338                     _originalBrightness = brightness;
115339                     _isScreenResourceOccupied = true;
115340                 }
115341                 value = _SCREEN_STATE.SCREEN_BRIGHT.VALUE;
115342                 flag = true;
115343             }
115344             break;
115345         }
115346         if (flag) {
115347             deviceSettings.persist("DISPLAY.brightness", value);
115348             event.trigger("DisplayBrightnessChangedByPower", [value]);
115349             updateResourceState();
115350             triggerListenerCB(ScreenState);
115351         }
115352         _isScreenOn = true;
115353     }
115354
115355     function turnScreenOff() {
115356         if (!_security.turnScreenOff) {
115357             throw new WebAPIError(errorcode.SECURITY_ERR);
115358         }
115359         _isScreenOn = false;
115360     }
115361
115362     function handleSubFeatures(subFeatures) {
115363         var i, subFeature;
115364
115365         for (subFeature in subFeatures) {
115366             for (i in _security[subFeature]) {
115367                 _security[_security[subFeature][i]] = true;
115368             }
115369         }
115370     }
115371
115372     var power = {
115373         request: request,
115374         release: release,
115375         setScreenStateChangeListener: setScreenStateChangeListener,
115376         unsetScreenStateChangeListener: unsetScreenStateChangeListener,
115377         getScreenBrightness: getScreenBrightness,
115378         setScreenBrightness: setScreenBrightness,
115379         isScreenOn: isScreenOn,
115380         restoreScreenBrightness: restoreScreenBrightness,
115381         turnScreenOn: turnScreenOn,
115382         turnScreenOff: turnScreenOff,
115383         handleSubFeatures : handleSubFeatures
115384     };
115385
115386     return power;
115387 };
115388
115389 initState();
115390 event.on("CpuLoadChanged", function (value) {
115391     var load;
115392     if (_isCPUAwake && Number(value) === 0) {
115393         load = _POWER_RESOURCE.CPU.STATE.CPU_AWAKE.DEFAULT_VALUE;
115394         deviceSettings.persist("CPU.load", load);
115395         event.trigger("CpuLoadChangedByPower", [load]);
115396     }
115397 });
115398 event.on("DisplayBrightnessChanged", function () {
115399     _normalBrightness = deviceSettings.retrieve("DISPLAY.brightness");
115400     updateResourceState();
115401     triggerListenerCB(ScreenState);
115402 });
115403
115404 module.exports = _self;
115405
115406 });
115407 define('ripple/platform/tizen/2.0/SimpleCoordinates', function (require, exports, module) {
115408 /*
115409  *  Copyright 2013 Intel Corporation.
115410  *
115411  * Licensed under the Apache License, Version 2.0 (the "License");
115412  * you may not use this file except in compliance with the License.
115413  * You may obtain a copy of the License at
115414  *
115415  * http://www.apache.org/licenses/LICENSE-2.0
115416  *
115417  * Unless required by applicable law or agreed to in writing, software
115418  * distributed under the License is distributed on an "AS IS" BASIS,
115419  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
115420  * See the License for the specific language governing permissions and
115421  * limitations under the License.
115422  */
115423
115424 var t = require('ripple/platform/tizen/2.0/typecast'),
115425     SimpleCoordinates;
115426
115427 SimpleCoordinates = function (latitude, longitude) {
115428     var simpleCoordinates = {};
115429
115430     t.SimpleCoordinates(arguments, this);
115431
115432     this.__defineGetter__("latitude", function () {
115433         return simpleCoordinates.latitude;
115434     });
115435     this.__defineSetter__("latitude", function (val) {
115436         try {
115437             simpleCoordinates.latitude = t.double(val);
115438         } catch (e) {
115439         }
115440     });
115441
115442     this.__defineGetter__("longitude", function () {
115443         return simpleCoordinates.longitude;
115444     });
115445     this.__defineSetter__("longitude", function (val) {
115446         try {
115447             simpleCoordinates.longitude = t.double(val);
115448         } catch (e) {
115449         }
115450     });
115451
115452     simpleCoordinates.latitude  = latitude;
115453     simpleCoordinates.longitude = longitude;
115454 };
115455
115456 module.exports = SimpleCoordinates;
115457
115458 });
115459 define('ripple/platform/tizen/2.0/MessageBody', function (require, exports, module) {
115460 /*
115461  *  Copyright 2012 Intel Corporation.
115462  *
115463  * Licensed under the Apache License, Version 2.0 (the "License");
115464  * you may not use this file except in compliance with the License.
115465  * You may obtain a copy of the License at
115466  *
115467  * http://www.apache.org/licenses/LICENSE-2.0
115468  *
115469  * Unless required by applicable law or agreed to in writing, software
115470  * distributed under the License is distributed on an "AS IS" BASIS,
115471  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
115472  * See the License for the specific language governing permissions and
115473  * limitations under the License.
115474  */
115475
115476 module.exports = function (id, isloaded, _plainbody, _htmlbody, inlineattachments) {
115477     var msgbody, _id = id, _loaded = isloaded;
115478     msgbody = {
115479         plainBody: _plainbody,
115480         htmlBody: _htmlbody,
115481         inlineAttachments: [] // TODO: not support attachment yet
115482     };
115483     msgbody.__defineGetter__("messageId", function () {
115484         return _id;
115485     });
115486     msgbody.__defineGetter__("loaded", function () {
115487         return _loaded;
115488     });
115489     return msgbody;
115490 };
115491
115492 });
115493 define('ripple/platform/tizen/2.0/NotificationDetailInfo', function (require, exports, module) {
115494 /*
115495  *  Copyright 2013 Intel Corporation.
115496  *
115497  * Licensed under the Apache License, Version 2.0 (the "License");
115498  * you may not use this file except in compliance with the License.
115499  * You may obtain a copy of the License at
115500  *
115501  * http://www.apache.org/licenses/LICENSE-2.0
115502  *
115503  * Unless required by applicable law or agreed to in writing, software
115504  * distributed under the License is distributed on an "AS IS" BASIS,
115505  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
115506  * See the License for the specific language governing permissions and
115507  * limitations under the License.
115508  */
115509
115510 var t = require('ripple/platform/tizen/2.0/typecast'),
115511     NotificationDetailInfo;
115512
115513 NotificationDetailInfo = function (mainText, subText) {
115514     var notificationDetailInfo = {};
115515
115516     t.NotificationDetailInfo(arguments, this);
115517
115518     notificationDetailInfo.mainText = mainText;
115519     notificationDetailInfo.subText  = subText || null;
115520
115521     this.__defineGetter__("mainText", function () {
115522         return notificationDetailInfo.mainText;
115523     });
115524     this.__defineSetter__("mainText", function (val) {
115525         try {
115526             notificationDetailInfo.mainText = t.DOMString(val);
115527         } catch (e) {
115528         }
115529     });
115530
115531     this.__defineGetter__("subText", function () {
115532         return notificationDetailInfo.subText;
115533     });
115534     this.__defineSetter__("subText", function (val) {
115535         try {
115536             notificationDetailInfo.subText = t.DOMString(val, "?");
115537         } catch (e) {
115538         }
115539     });
115540 };
115541
115542 module.exports = NotificationDetailInfo;
115543
115544 });
115545 define('ripple/platform/tizen/2.0/PrivMessage', function (require, exports, module) {
115546 /*
115547  *  Copyright 2012 Intel Corporation.
115548  *
115549  * Licensed under the Apache License, Version 2.0 (the "License"),
115550  * you may not use this file except in compliance with the License.
115551  * You may obtain a copy of the License at
115552  *
115553  * http://www.apache.org/licenses/LICENSE-2.0
115554  *
115555  * Unless required by applicable law or agreed to in writing, software
115556  * distributed under the License is distributed on an "AS IS" BASIS,
115557  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
115558  * See the License for the specific language governing permissions and
115559  * limitations under the License.
115560  */
115561 var utils = require('ripple/utils');
115562
115563 module.exports = function (m, opt) {
115564     return {
115565 // readonly begin
115566         priv: {id: opt.id,
115567                serviceId: opt.serviceId,
115568                conversationId: opt.conversationId,
115569                folderId: opt.folderId,
115570                type: opt.type,
115571                timestamp: new Date(opt.timestamp),
115572                from: opt.from,
115573                hasAttachment: opt.hasAttachment,
115574                messageStatus: opt.messageStatus
115575         },
115576 // readonly end
115577         to: m.to.slice(0),
115578         cc: m.cc.slice(0),
115579         bcc: m.bcc.slice(0),
115580         body: utils.copy(m.body),
115581         isRead: m.isRead,
115582         isHighPriority: m.isHighPriority,
115583         subject: m.subject,
115584         inResponseTo: m.inResponseTo,
115585         attachments: utils.copy(m.attachments)
115586     };
115587 };
115588
115589 });
115590 define('ripple/platform/tizen/2.0/GeoRectBounds', function (require, exports, module) {
115591 /*
115592  *  Copyright 2012 Intel Corporation.
115593  *
115594  * Licensed under the Apache License, Version 2.0 (the "License");
115595  * you may not use this file except in compliance with the License.
115596  * You may obtain a copy of the License at
115597  *
115598  * http://www.apache.org/licenses/LICENSE-2.0
115599  *
115600  * Unless required by applicable law or agreed to in writing, software
115601  * distributed under the License is distributed on an "AS IS" BASIS,
115602  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
115603  * See the License for the specific language governing permissions and
115604  * limitations under the License.
115605  */
115606
115607 module.exports = function (_southWest, _northEast) {
115608     var southWest, northEast;
115609     southWest = _southWest || null;
115610     northEast = _northEast || null;
115611
115612     this.__defineGetter__("southWest", function () {
115613         return southWest;
115614     });
115615
115616     this.__defineGetter__("northEast", function () {
115617         return northEast;
115618     });
115619 };
115620
115621 });
115622 define('ripple/platform/tizen/2.0/calendar', function (require, exports, module) {
115623 /*
115624  *  Copyright 2013 Intel Corporation.
115625  *
115626  * Licensed under the Apache License, Version 2.0 (the "License");
115627  * you may not use this file except in compliance with the License.
115628  * You may obtain a copy of the License at
115629  *
115630  * http://www.apache.org/licenses/LICENSE-2.0
115631  *
115632  * Unless required by applicable law or agreed to in writing, software
115633  * distributed under the License is distributed on an "AS IS" BASIS,
115634  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
115635  * See the License for the specific language governing permissions and
115636  * limitations under the License.
115637  */
115638
115639 var utils = require('ripple/utils'),
115640     db = require('ripple/db'),
115641     t = require('ripple/platform/tizen/2.0/typecast'),
115642     tizen1_utils = require('ripple/platform/tizen/2.0/tizen1_utils'),
115643     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
115644     WebAPIError = require('ripple/platform/tizen/2.0/WebAPIError'),
115645     WebAPIException = require('ripple/platform/tizen/2.0/WebAPIException'),
115646     TZDate = require('ripple/platform/tizen/2.0/TZDate'),
115647     TDur = require('ripple/platform/tizen/2.0/TimeDuration'),
115648     CalendarItem = require('ripple/platform/tizen/2.0/CalendarItem'),
115649     CalendarEvent = require('ripple/platform/tizen/2.0/CalendarEvent'),
115650     CalendarEventId = require('ripple/platform/tizen/2.0/CalendarEventId'),
115651     CalendarTask = require('ripple/platform/tizen/2.0/CalendarTask'),
115652     Calendar,
115653     CalendarStorage,
115654     CalendarItemsStorage,
115655     _DB_CALENDARS_KEY = "tizen1-db-calendars",
115656     _watchers = [],
115657     _calendars = {
115658         EVENT: {},
115659         TASK: {}
115660     },
115661     _calendarsStorage,
115662     _security = {
115663         "http://tizen.org/privilege/calendar.read": ["getCalendars",
115664                 "getUnifiedCalendar", "getDefaultCalendar", "getCalendar",
115665                 "get", "find", "addChangeListener", "removeChangeListener",
115666                 "expandRecurrence", "convertToString", "clone"],
115667         "http://tizen.org/privilege/calendar.write": ["add", "addBatch",
115668                 "update", "updateBatch", "remove", "removeBatch"]
115669     },
115670     _self;
115671
115672 function _isValidId(id) {
115673     return (/[a-z]|[A-Z]|[0-9]|[\-]/).test(id);
115674 }
115675
115676 function retrieveCalendars() {
115677     _calendarsStorage = db.retrieveObject(_DB_CALENDARS_KEY) || {EVENT: {}, TASK: {}};
115678 }
115679
115680 function saveCalendars() {
115681     db.saveObject(_DB_CALENDARS_KEY, _calendarsStorage);
115682 }
115683
115684 _self = function () {
115685     var calendarManager;
115686
115687     // private
115688     function loadCalendars(type) {
115689         var calsStorage, defCalendar, id, i, item;
115690
115691         retrieveCalendars();
115692         calsStorage = _calendarsStorage[type];
115693
115694         if (tizen1_utils.isEmptyObject(calsStorage)) {
115695             defCalendar = new Calendar(type, "Default " + type.toLowerCase() + " calendar");
115696
115697             _calendars[type][defCalendar.id] = defCalendar;
115698             calsStorage[defCalendar.id] = new CalendarStorage(defCalendar);
115699         } else {
115700             for (id in calsStorage) {
115701                 for (i in calsStorage[id].items) {
115702                     item = calsStorage[id].items[i];
115703                 }
115704                 _calendars[type][id] = new Calendar(type, calsStorage[id].name,
115705                         calsStorage[id].items, id);
115706             }
115707         }
115708     }
115709
115710     // public
115711     function getCalendars(type, successCallback, errorCallback) {
115712         if (!_security.getCalendars) {
115713             throw new WebAPIException(errorcode.SECURITY_ERR);
115714         }
115715
115716         t.CalendarManager("getCalendars", arguments);
115717
115718         window.setTimeout(function () {
115719             var i, result = [];
115720
115721             if (tizen1_utils.isEmptyObject(_calendars[type])) {
115722                 loadCalendars(type);
115723             }
115724
115725             if (_calendars.length !== 0) {
115726                 for (i in _calendars[type]) {
115727                     result.push(_calendars[type][i]);
115728                 }
115729                 successCallback(result);
115730             } else if (errorCallback) {
115731                 errorCallback(new WebAPIError(errorcode.UNKNOWN_ERR));
115732             }
115733         }, 1);
115734     }
115735
115736     function getUnifiedCalendar(type) {
115737         var id, calendar;
115738
115739         if (!_security.getUnifiedCalendar) {
115740             throw new WebAPIException(errorcode.SECURITY_ERR);
115741         }
115742
115743         t.CalendarManager("getUnifiedCalendar", arguments);
115744
115745         if (tizen1_utils.isEmptyObject(_calendars[type])) {
115746             loadCalendars(type);
115747         }
115748
115749         for (id in _calendars[type]) {
115750             calendar = _calendars[type][id];
115751             break;
115752         }
115753
115754         if (calendar === undefined)
115755             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
115756
115757         return calendar;
115758     }
115759
115760     function getDefaultCalendar(type) {
115761         var id, calendar;
115762
115763         if (!_security.getDefaultCalendar) {
115764             throw new WebAPIException(errorcode.SECURITY_ERR);
115765         }
115766
115767         t.CalendarManager("getDefaultCalendar", arguments);
115768
115769         if (tizen1_utils.isEmptyObject(_calendars[type])) {
115770             loadCalendars(type);
115771         }
115772
115773         for (id in _calendars[type]) {
115774             calendar = _calendars[type][id];
115775             break;
115776         }
115777
115778         if (calendar === undefined)
115779             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
115780
115781         return calendar;
115782     }
115783
115784     function getCalendar(type, id) {
115785         var calendar;
115786
115787         if (!_security.getCalendar) {
115788             throw new WebAPIException(errorcode.SECURITY_ERR);
115789         }
115790
115791         t.CalendarManager("getCalendar", arguments);
115792
115793         if (tizen1_utils.isEmptyObject(_calendars[type])) {
115794             loadCalendars(type);
115795         }
115796
115797         calendar = _calendars[type][id];
115798         if (calendar === undefined)
115799             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
115800
115801         return calendar;
115802     }
115803
115804     function handleSubFeatures(subFeatures) {
115805         var i, subFeature;
115806
115807         for (subFeature in subFeatures) {
115808             for (i in _security[subFeature]) {
115809                 _security[_security[subFeature][i]] = true;
115810             }
115811         }
115812     }
115813
115814     calendarManager = {
115815         getCalendars:       getCalendars,
115816         getUnifiedCalendar: getUnifiedCalendar,
115817         getDefaultCalendar: getDefaultCalendar,
115818         getCalendar:        getCalendar,
115819         handleSubFeatures:  handleSubFeatures
115820     };
115821
115822     return calendarManager;
115823 };
115824
115825 Calendar = function (type, name, storageItems, calendarId) {
115826     var privateItems = {},
115827         defaultWatchId = 0;
115828     calendarId = calendarId || Math.uuid(null, 16);
115829
115830     // private
115831     function createCalendarItem() {
115832         var calendarItem = null;
115833
115834         switch (type) {
115835         case "EVENT":
115836             calendarItem = new CalendarEvent();
115837             break;
115838
115839         case "TASK":
115840             calendarItem = new CalendarTask();
115841             break;
115842
115843         default:
115844             break;
115845         }
115846
115847         return calendarItem;
115848     }
115849
115850     function isValidCalendarItemId(itemId) {
115851         var i;
115852
115853         if (!_isValidId(itemId))
115854             return false;
115855
115856         for (i in privateItems) {
115857             if (i === itemId)
115858                 return true;
115859         }
115860
115861         return false;
115862     }
115863
115864     function loadCalendarItemInit(calendarItem, storageItem) {
115865         calendarItem.description    = utils.copy(storageItem.description);
115866         calendarItem.summary        = utils.copy(storageItem.summary);
115867         calendarItem.isAllDay       = utils.copy(storageItem.isAllDay);
115868         calendarItem.startDate      = storageItem.startDate;
115869         if (storageItem.startDate instanceof TZDate) {
115870             calendarItem.startDate      = storageItem.startDate.addDuration(new TDur(0, 'MSECS'));
115871         }
115872         if (typeof storageItem.startDate === 'string') {
115873             calendarItem.startDate      = new TZDate(new Date(storageItem.startDate));
115874         }
115875
115876         calendarItem.duration       = utils.copy(storageItem.duration);
115877         calendarItem.location       = utils.copy(storageItem.location);
115878         calendarItem.geolocation    = utils.copy(storageItem.geolocation);
115879         calendarItem.organizer      = utils.copy(storageItem.organizer);
115880         calendarItem.visibility     = utils.copy(storageItem.visibility);
115881         calendarItem.status         = utils.copy(storageItem.status);
115882         calendarItem.priority       = utils.copy(storageItem.priority);
115883         calendarItem.alarms         = utils.copy(storageItem.alarms);
115884         calendarItem.categories     = utils.copy(storageItem.categories);
115885         calendarItem.attendees      = utils.copy(storageItem.attendees);
115886     }
115887
115888     function loadCalendarEventInit(calendarItem, storageItem) {
115889         loadCalendarItemInit(calendarItem, storageItem);
115890
115891         calendarItem.endDate = storageItem.endDate;
115892         if (storageItem.endDate instanceof TZDate) {
115893             calendarItem.endDate = storageItem.endDate.addDuration(new TDur(0, 'MSECS'));
115894         }
115895         if (typeof storageItem.endDate === 'string') {
115896             calendarItem.endDate = new TZDate(new Date(storageItem.endDate));
115897         }
115898         calendarItem.availability = utils.copy(storageItem.availability);
115899         calendarItem.recurrenceRule = utils.copy(storageItem.recurrenceRule);
115900         calendarItem.expandRecurrence = function (startDate, endDate, successCallback, errorCallback) {
115901             if (!_security.expandRecurrence) {
115902                 throw new WebAPIException(errorcode.SECURITY_ERR);
115903             }
115904
115905             calendarItem.startDate = startDate;
115906             calendarItem.endDate   = endDate;
115907
115908             if (errorCallback) {
115909                 window.setTimeout(function () {
115910                     errorCallback(new WebAPIError(errorcode.NOT_SUPPORTED_ERR));
115911                 }, 1);
115912             }
115913         };
115914         calendarItem.frequency       = utils.copy(storageItem.frequency);
115915         calendarItem.interval        = utils.copy(storageItem.interval);
115916         calendarItem.untilDate = storageItem.untilDate;
115917         if (storageItem.untilDate instanceof TZDate) {
115918             calendarItem.untilDate = storageItem.untilDate.addDuration(new TDur(0, 'MSECS'));
115919         }
115920         if (typeof storageItem.untilDate === 'string') {
115921             calendarItem.untilDate = new TZDate(new Date(storageItem.untilDate));
115922         }
115923         calendarItem.occurrenceCount = utils.copy(storageItem.occurrenceCount);
115924         calendarItem.daysOfTheWeek   = utils.copy(storageItem.daysOfTheWeek);
115925         calendarItem.setPositions    = utils.copy(storageItem.setPositions);
115926         calendarItem.exceptions      = utils.copy(storageItem.exceptions);
115927     }
115928
115929     function loadCalendarTaskInit(calendarItem, storageItem) {
115930         loadCalendarItemInit(calendarItem, storageItem);
115931
115932         calendarItem.dueDate = storageItem.dueDate;
115933         if (storageItem.dueDate instanceof TZDate) {
115934             calendarItem.dueDate = storageItem.dueDate.addDuration(new TDur(0, 'MSECS'));
115935         }
115936         if (typeof storageItem.dueDate === 'string') {
115937             calendarItem.dueDate = new TZDate(new Date(storageItem.dueDate));
115938         }
115939         calendarItem.completeDate = storageItem.completeDate;
115940         if (storageItem.completeDate instanceof TZDate) {
115941             calendarItem.completeDate = storageItem.completeDate.addDuration(new TDur(0, 'MSECS'));
115942         }
115943         if (typeof storageItem.completeDate === 'string') {
115944             calendarItem.completeDate = new TZDate(new Date(storageItem.completeDate));
115945         }
115946         calendarItem.progress      = utils.copy(storageItem.progress);
115947     }
115948
115949     function loadCalendarItems() {
115950         var i, calendarItem;
115951
115952         if (storageItems === undefined)
115953             return;
115954
115955         for (i in storageItems) {
115956             calendarItem = new CalendarItem(type, i, storageItems[i].lastModificationDate? new TZDate(new Date(storageItems[i].lastModificationDate)) : null, _security);
115957
115958             if (type === "EVENT") {
115959                 loadCalendarEventInit(calendarItem, storageItems[i]);
115960             } else {
115961                 loadCalendarTaskInit(calendarItem, storageItems[i]);
115962             }
115963
115964             privateItems[i] = calendarItem;
115965         }
115966     }
115967
115968     function saveCalendarItems() {
115969         _calendarsStorage[type][calendarId] ||  (_calendarsStorage[type][calendarId] = {});
115970         _calendarsStorage[type][calendarId].items = new CalendarItemsStorage(privateItems);
115971         saveCalendars();
115972     }
115973
115974     // public
115975     function get(id) {
115976         var item, uid, CalendarItemType, external = {};
115977
115978         if (!_security.get) {
115979             throw new WebAPIException(errorcode.SECURITY_ERR);
115980         }
115981
115982         t.Calendar("get", arguments);
115983
115984         if (type === "EVENT") {
115985             t.CalendarEventId(id);
115986             uid = id.uid;
115987             CalendarItemType = CalendarEvent;
115988         } else {
115989             t.CalendarTaskId(id);
115990             uid = id;
115991             CalendarItemType = CalendarTask;
115992         }
115993
115994         if (!isValidCalendarItemId(uid))
115995             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
115996
115997         item = new CalendarItemType(privateItems[uid]);
115998         external.id                   = privateItems[uid].id;
115999         external.lastModificationDate = privateItems[uid].lastModificationDate;
116000
116001         item.__defineGetter__("calendarId", function () {
116002             return calendarId;
116003         });
116004
116005         item.__defineGetter__("id", function () {
116006             return external.id;
116007         });
116008
116009         item.__defineGetter__("lastModificationDate", function () {
116010             return external.lastModificationDate;
116011         });
116012
116013         return item;
116014     }
116015
116016     function add(item) {
116017         var uid, external = {};
116018
116019         if (!_security.add) {
116020             throw new WebAPIException(errorcode.SECURITY_ERR);
116021         }
116022
116023         t.Calendar("add", arguments);
116024
116025         uid = Math.uuid(null, 16);
116026         privateItems[uid] = t.CalendarItem(item, "+");
116027         if (type === "EVENT") {
116028             privateItems[uid].id = new CalendarEventId(uid);
116029         } else {
116030             privateItems[uid].id = uid;
116031         }
116032         privateItems[uid].lastModificationDate = new TZDate();
116033
116034         external.id = privateItems[uid].id;
116035         external.lastModificationDate = privateItems[uid].lastModificationDate;
116036
116037         saveCalendarItems();
116038
116039         // set the calendarId of the item
116040         item.__defineGetter__("calendarId", function () {
116041             return calendarId;
116042         });
116043
116044         item.__defineGetter__("id", function () {
116045             return external.id;
116046         });
116047
116048         item.__defineGetter__("lastModificationDate", function () {
116049             return external.lastModificationDate;
116050         });
116051
116052         window.setTimeout(function () {
116053             for (var i in _watchers) {
116054                 _watchers[i].onitemsadded([item]);
116055             }
116056         }, 1);
116057     }
116058
116059     function addBatch(items, successCallback, errorCallback) {
116060         if (!_security.addBatch) {
116061             throw new WebAPIException(errorcode.SECURITY_ERR);
116062         }
116063
116064         t.Calendar("addBatch", arguments, true);
116065
116066         window.setTimeout(function () {
116067             var i, j, uid, external = [];
116068
116069             for (i in items) {
116070                 uid = Math.uuid(null, 16);
116071                 privateItems[uid] = utils.copy(items[i]);
116072
116073                 if (type === "EVENT") {
116074                     privateItems[uid].id = new CalendarEventId(uid);
116075                 } else {
116076                     privateItems[uid].id = uid;
116077                 }
116078
116079                 external[i] = {};
116080                 external[i].id = privateItems[uid].id;
116081                 external[i].lastModificationDate = new TZDate();
116082
116083                 items[i].__defineGetter__("calendarId", function () {
116084                     return calendarId;
116085                 });
116086
116087                 items[i].__defineGetter__("id", function () {
116088                     return external[i].id;
116089                 });
116090
116091                 items[i].__defineGetter__("lastModificationDate", function () {
116092                     return external[i].lastModificationDate;
116093                 });
116094             }
116095
116096             saveCalendarItems();
116097
116098             if (successCallback) {
116099                 successCallback(items);
116100             }
116101             for (j in _watchers) {
116102                 _watchers[j].onitemsadded(items);
116103             }
116104         }, 1);
116105     }
116106
116107     function update(item, updateAllInstances) {
116108         var calendarItem, attr, uid;
116109
116110         if (!_security.update) {
116111             throw new WebAPIException(errorcode.SECURITY_ERR);
116112         }
116113
116114         t.Calendar("update", arguments);
116115
116116         uid = (type === "EVENT") ? item.id.uid : item.id;
116117         if (!isValidCalendarItemId(uid))
116118             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
116119
116120         if (updateAllInstances === undefined || updateAllInstances === null) {
116121             updateAllInstances = true;
116122         }
116123
116124         if ((type === "EVENT") && !updateAllInstances) {
116125             calendarItem = createCalendarItem();
116126
116127             for (attr in privateItems[uid]) {
116128                 if (attr !== "id" && attr !== "lastModificationDate") {
116129                     if (item[attr] !== undefined)
116130                         calendarItem[attr] = utils.copy(item[attr]);
116131                     else
116132                         calendarItem[attr] = utils.copy(privateItems[uid][attr]);
116133                 }
116134             }
116135
116136             add(calendarItem);
116137         } else {
116138             for (attr in privateItems[uid]) {
116139                 if ((attr !== "id") && (attr !== "lastModificationDate") && (item[attr] !== undefined))
116140                     privateItems[uid][attr] = utils.copy(item[attr]);
116141             }
116142             window.setTimeout(function () {
116143                 var i;
116144
116145                 for (i in _watchers) {
116146                     _watchers[i].onitemsupdated([utils.copy(privateItems[uid])]);
116147                 }
116148             }, 1);
116149         }
116150         saveCalendarItems();
116151     }
116152
116153     function updateBatch(items, successCallback, errorCallback,
116154             updateAllInstances) {
116155         if (!_security.updateBatch) {
116156             throw new WebAPIException(errorcode.SECURITY_ERR);
116157         }
116158
116159         t.Calendar("updateBatch", arguments, true);
116160
116161         window.setTimeout(function () {
116162             var i, j, attr, calendarItem, updatedItems = [], uid;
116163
116164             for (i in items) {
116165                 uid = (type === "EVENT") ? items[i].id.uid : items[i].id;
116166                 if (!uid || !privateItems[uid]) {
116167                     if (errorCallback) {
116168                         errorCallback(new WebAPIError(errorcode.NOT_FOUND_ERR));
116169                     }
116170                     return;
116171                 }
116172             }
116173
116174             if (updateAllInstances) {
116175                 for (i in privateItems) {
116176                     for (j in items) {
116177                         uid = (type === "EVENT") ? items[j].id.uid : items[j].id;
116178                         if (i === uid) {
116179                             for (attr in privateItems[i]) {
116180                                 if (attr !== "id" && attr !== "lastModificationDate" && items[j][attr] !== undefined)
116181                                     privateItems[i][attr] = utils.copy(items[j][attr]);
116182                             }
116183                             saveCalendarItems();
116184                             updatedItems.push(utils.copy(privateItems[i]));
116185                         }
116186                     }
116187                 }
116188             } else {
116189                 for (i in items) {
116190                     calendarItem = createCalendarItem();
116191
116192                     uid = (type === "EVENT") ? items[i].id.uid : items[i].id;
116193                     for (attr in privateItems[uid]) {
116194                         if (attr !== "id" && attr !== "lastModificationDate") {
116195                             if (items[i][attr] !== undefined)
116196                                 calendarItem[attr] = utils.copy(items[i][attr]);
116197                             else
116198                                 calendarItem[attr] = utils.copy(privateItems[uid][attr]);
116199                         }
116200                     }
116201
116202                     add(calendarItem);
116203                     updatedItems.push(utils.copy(calendarItem));
116204                 }
116205             }
116206
116207             saveCalendarItems();
116208             if (successCallback) {
116209                 successCallback();
116210             }
116211             for (i in _watchers) {
116212                 _watchers[i].onitemsupdated(utils.copy(updatedItems));
116213             }
116214         }, 1);
116215     }
116216
116217     function remove(id) {
116218         var isFound = false, i, uid;
116219
116220         if (!_security.remove) {
116221             throw new WebAPIException(errorcode.SECURITY_ERR);
116222         }
116223
116224         t.Calendar("remove", arguments);
116225
116226         if (type === "EVENT") {
116227             t.CalendarEventId(id);
116228             uid = id.uid;
116229         } else {
116230             t.CalendarTaskId(id);
116231             uid = id;
116232         }
116233
116234         for (i in privateItems) {
116235             if (i === uid) {
116236                 delete privateItems[i];
116237                 isFound = true;
116238                 break;
116239             }
116240         }
116241
116242         if (!isFound)
116243             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
116244
116245         saveCalendarItems();
116246
116247         window.setTimeout(function () {
116248             var i;
116249
116250             for (i in _watchers) {
116251                 _watchers[i].onitemsremoved([id]);
116252             }
116253         }, 1);
116254     }
116255
116256     function removeBatch(ids, successCallback, errorCallback) {
116257         if (!_security.removeBatch) {
116258             throw new WebAPIException(errorcode.SECURITY_ERR);
116259         }
116260
116261         t.Calendar("removeBatch", arguments, true);
116262
116263         window.setTimeout(function () {
116264             var i, uid;
116265
116266             for (i in ids) {
116267                 uid = (type === "EVENT") ? ids[i].uid : ids[i];
116268
116269                 if (!privateItems[uid]) {
116270                     if (errorCallback) {
116271                         errorCallback(new WebAPIError(errorcode.NOT_FOUND_ERR));
116272                     }
116273                     return;
116274                 }
116275             }
116276
116277             for (i in ids) {
116278                 uid = (type === "EVENT") ? ids[i].uid : ids[i];
116279                 delete privateItems[uid];
116280             }
116281             saveCalendarItems();
116282             if (successCallback) {
116283                 successCallback();
116284             }
116285
116286             for (i in _watchers) {
116287                 _watchers[i].onitemsremoved(utils.copy(ids));
116288             }
116289         }, 1);
116290     }
116291
116292     function find(successCallback, errorCallback, filter, sortMode) {
116293         if (!_security.find) {
116294             throw new WebAPIException(errorcode.SECURITY_ERR);
116295         }
116296
116297         t.Calendar("find", arguments, true);
116298
116299         window.setTimeout(function () {
116300             var i, calendarItems = [], result = [];
116301
116302             for (i in privateItems) {
116303                 calendarItems.push(privateItems[i]);
116304             }
116305             if (calendarItems.length > 0) {
116306                 result = tizen1_utils.query(calendarItems, filter, sortMode);
116307             }
116308             successCallback(result);
116309         }, 1);
116310     }
116311
116312     function addChangeListener(successCallback) {
116313         var watchId;
116314
116315         if (!_security.addChangeListener) {
116316             throw new WebAPIException(errorcode.SECURITY_ERR);
116317         }
116318
116319         t.Calendar("addChangeListener", arguments);
116320
116321         watchId = ++defaultWatchId;
116322         _watchers[watchId] = successCallback;
116323
116324         return watchId;
116325     }
116326
116327     function removeChangeListener(watchId) {
116328         if (!_security.removeChangeListener) {
116329             throw new WebAPIException(errorcode.SECURITY_ERR);
116330         }
116331
116332         if (!_watchers[watchId])
116333             return;
116334
116335         delete _watchers[watchId];
116336     }
116337
116338     loadCalendarItems(type, privateItems, storageItems);
116339
116340     this.__defineGetter__("id", function () {
116341         return calendarId;
116342     });
116343     this.__defineGetter__("name", function () {
116344         return name;
116345     });
116346
116347     this.get                  = get;
116348     this.add                  = add;
116349     this.addBatch             = addBatch;
116350     this.update               = update;
116351     this.updateBatch          = updateBatch;
116352     this.remove               = remove;
116353     this.removeBatch          = removeBatch;
116354     this.find                 = find;
116355     this.addChangeListener    = addChangeListener;
116356     this.removeChangeListener = removeChangeListener;
116357 };
116358
116359 CalendarStorage = function (calendar) {
116360     this.id   = calendar.id;
116361     this.name = calendar.name;
116362 };
116363
116364 CalendarItemsStorage = function (privateItems) {
116365     var itemsStorage = {}, i, attr;
116366
116367     for (i in privateItems) {
116368         itemsStorage[i] = {};
116369         for (attr in privateItems[i]) {
116370             //TODO: should be
116371             //      if (privateItems[i][attr] instanceof TZDate) {
116372             //But, we used "utils.copy" before store the item to privateItems list.
116373             //So the constructor information all lost
116374             if ((attr === "startDate" || attr === "endDate" || attr === "dueDate" || attr === "completedDate" || attr === "lastModificationDate") &&
116375                 (privateItems[i][attr])) {
116376
116377                 itemsStorage[i][attr] = privateItems[i][attr].toString();
116378             } else if (typeof privateItems[i] !== "function") {
116379                 itemsStorage[i][attr] = privateItems[i][attr];
116380             }
116381         }
116382     }
116383
116384     return itemsStorage;
116385 };
116386
116387 module.exports = _self;
116388
116389 });
116390 define('ripple/platform/tizen/2.0/DownloadRequest', function (require, exports, module) {
116391 /*
116392  *  Copyright 2013 Intel Corporation.
116393  *
116394  * Licensed under the Apache License, Version 2.0 (the "License");
116395  * you may not use this file except in compliance with the License.
116396  * You may obtain a copy of the License at
116397  *
116398  * http://www.apache.org/licenses/LICENSE-2.0
116399  *
116400  * Unless required by applicable law or agreed to in writing, software
116401  * distributed under the License is distributed on an "AS IS" BASIS,
116402  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
116403  * See the License for the specific language governing permissions and
116404  * limitations under the License.
116405  */
116406
116407 var t = require('ripple/platform/tizen/2.0/typecast'),
116408     DownloadRequest;
116409
116410 DownloadRequest = function (url, destination, fileName, networkType,
116411         httpHeader) {
116412     var downloadRequest = {};
116413
116414     t.DownloadRequest(arguments, this);
116415
116416     this.__defineGetter__("url", function () {
116417         return downloadRequest.url;
116418     });
116419     this.__defineSetter__("url", function (val) {
116420         try {
116421             downloadRequest.url = t.DOMString(val);
116422         } catch (e) {
116423         }
116424     });
116425
116426     this.__defineGetter__("networkType", function () {
116427         return downloadRequest.networkType;
116428     });
116429     this.__defineSetter__("networkType", function (val) {
116430         try {
116431             downloadRequest.networkType = t.DownloadNetworkType(val, "?");
116432         } catch (e) {
116433         }
116434     });
116435
116436     this.destination            = destination || "";
116437     this.fileName               = fileName || "";
116438     this.httpHeader             = httpHeader || {};
116439
116440     downloadRequest.url         = url;
116441     downloadRequest.networkType = networkType || "ALL";
116442 };
116443
116444 module.exports = DownloadRequest;
116445
116446 });
116447 define('ripple/platform/tizen/2.0/networkbearerselection', function (require, exports, module) {
116448 /*
116449  *  Copyright 2013 Intel Corporation.
116450  *
116451  * Licensed under the Apache License, Version 2.0 (the "License");
116452  * you may not use this file except in compliance with the License.
116453  * You may obtain a copy of the License at
116454  *
116455  * http://www.apache.org/licenses/LICENSE-2.0
116456  *
116457  * Unless required by applicable law or agreed to in writing, software
116458  * distributed under the License is distributed on an "AS IS" BASIS,
116459  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
116460  * See the License for the specific language governing permissions and
116461  * limitations under the License.
116462  */
116463
116464 var event = require('ripple/event'),
116465     t = require('ripple/platform/tizen/2.0/typecast'),
116466     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
116467     WebAPIError = require('ripple/platform/tizen/2.0/WebAPIError'),
116468     WebAPIException = require('ripple/platform/tizen/2.0/WebAPIException'),
116469     TypeCoerce = require('ripple/platform/tizen/2.0/typecoerce'),
116470     _security = {
116471         "http://tizen.org/privilege/networkbearerselection":
116472             ["requestRouteToHost", "releaseRouteToHost"]
116473     },
116474     _self;
116475
116476 _self = function () {
116477     var networkBearerSelection;
116478
116479     function requestRouteToHost(networkType, domainName, successCallback, errorCallback) {
116480         var evNetworkOpened       = "NO_" + networkType + "_" + domainName,
116481             evNetworkDisconnected = "ND_" + networkType + "_" + domainName;
116482
116483         if (!_security.requestRouteToHost) {
116484             throw new WebAPIException(errorcode.SECURITY_ERR);
116485         }
116486
116487         t.NetworkBearerSelection("requestRouteToHost", arguments);
116488         
116489         if (!domainName) {
116490             if (errorCallback) {
116491                 errorCallback(new WebAPIError(errorcode.INVALID_VALUES_ERR));
116492             }
116493             return;
116494         }
116495
116496         event.once(evNetworkOpened, function (isOpened) {
116497             if (!isOpened)
116498                 return;
116499
116500             successCallback.onsuccess();
116501         });
116502         event.once(evNetworkDisconnected, successCallback.ondisconnected);
116503         event.trigger("NetworkRequest", [networkType, domainName]);
116504     }
116505
116506     function releaseRouteToHost(networkType, domainName, successCallback, errorCallback) {
116507         var evNetworkDisconnected = "ND_" + networkType + "_" + domainName;
116508
116509         if (!_security.releaseRouteToHost) {
116510             throw new WebAPIException(errorcode.SECURITY_ERR);
116511         }
116512
116513         t.NetworkBearerSelection("releaseRouteToHost", arguments);
116514        
116515         if (!domainName) {
116516             if (errorCallback) {
116517                 errorCallback(new WebAPIError(errorcode.INVALID_VALUES_ERR));
116518             }
116519             return;
116520         }
116521
116522         event.once(evNetworkDisconnected, successCallback);
116523         event.trigger("NetworkRelease", [networkType, domainName]);
116524     }
116525
116526     function handleSubFeatures(subFeatures) {
116527         var i, subFeature;
116528
116529         for (subFeature in subFeatures) {
116530             for (i in _security[subFeature]) {
116531                 _security[_security[subFeature][i]] = true;
116532             }
116533         }
116534     }
116535
116536     networkBearerSelection = {
116537         requestRouteToHost: requestRouteToHost,
116538         releaseRouteToHost: releaseRouteToHost,
116539         handleSubFeatures:  handleSubFeatures
116540     };
116541
116542     return networkBearerSelection;
116543 };
116544
116545 module.exports = _self;
116546
116547 });
116548 define('ripple/platform/tizen/2.0/geoBackend_local', function (require, exports, module) {
116549 /*
116550  *  Copyright 2012 Intel Corporation.
116551  *
116552  * Licensed under the Apache License, Version 2.0 (the "License");
116553  * you may not use this file except in compliance with the License.
116554  * You may obtain a copy of the License at
116555  *
116556  * http://www.apache.org/licenses/LICENSE-2.0
116557  *
116558  * Unless required by applicable law or agreed to in writing, software
116559  * distributed under the License is distributed on an "AS IS" BASIS,
116560  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
116561  * See the License for the specific language governing permissions and
116562  * limitations under the License.
116563  */
116564
116565 var db = require('ripple/db'),
116566     utils = require('ripple/utils'),
116567     lbs = require('ripple/platform/tizen/2.0/lbs_utils'),
116568     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
116569     WebAPIError = require('ripple/platform/tizen/2.0/WebAPIError'),
116570     tizen1_utils = require('ripple/platform/tizen/2.0/tizen1_utils'),
116571     PendingObject = require('ripple/platform/tizen/2.0/pendingObject'),
116572     PendingOperation = require('ripple/platform/tizen/2.0/pendingoperation'),
116573     GeocodeResult = require('ripple/platform/tizen/2.0/GeocodeResult'),
116574     _GEO_OBJECTS = "tizen1.0-geocode-objects",
116575     _get, _save, _geoList_init, GeoEntry,
116576     _checkAddressType, _transAddressStr,
116577     _geocodeByString, _findCoordsByString, _geocodeByAddress,
116578     _reverseGeocodeBySimple, _reverseGeocodeByGeo, _checkCoordsType,
116579     _geoList = [],
116580     _PENDING_TIME = 10;
116581
116582 function _get() {
116583     var geoList = [],
116584         data = db.retrieveObject(_GEO_OBJECTS);
116585
116586     utils.forEach(data, function (geo) {
116587         geoList.push(geo);
116588     });
116589     return geoList;
116590 }
116591
116592 function _save() {
116593     db.saveObject(_GEO_OBJECTS, _geoList);
116594 }
116595
116596 function _geoList_init() {
116597     var entry;
116598     _geoList = _get();
116599
116600     /* Put some default data if database is empty */
116601     if (_geoList.length === 0) {
116602         entry = new GeoEntry(new lbs.StructuredAddress({
116603             country : "UK",
116604             region : "London",
116605             county : "Lambeth",
116606             city : "London",
116607             street : "Westminster Bridge Road",
116608             streetNumber : "1",
116609             premises : "Riverside Building",
116610             additionalInformation : "London Eye",
116611             postalCode : "SE1 7PB"
116612         }),
116613             new lbs.GeoCoordinates({
116614             latitude : 51.510452,
116615             longitude : -0.119820,
116616             altitude : 0,
116617             accuracy : 0,
116618             altitudeAccuracy : 0,
116619             heading : 0,
116620             speed : 0
116621         }));
116622         _geoList.push(entry);
116623         entry = new GeoEntry(new lbs.StructuredAddress({
116624             country : "UK",
116625             city : "London",
116626             street : "Baker Street",
116627             streetNumber : "221B",
116628             postalCode : "NW1 6XE"
116629         }),
116630             new lbs.GeoCoordinates({
116631             latitude : 51.524552,
116632             longitude : -0.158615,
116633             altitude : 0,
116634             accuracy : 0,
116635             altitudeAccuracy : 0,
116636             heading : 0,
116637             speed : 0
116638         }));
116639         _geoList.push(entry);
116640         entry = new GeoEntry(new lbs.StructuredAddress({
116641             country : "US",
116642             region : "OR",
116643             city : "Portland",
116644             street : "SE Water Ave",
116645             streetNumber : "1945",
116646             additionalInformation : "OMSI",
116647         }),
116648             new lbs.GeoCoordinates({
116649             latitude : 45.508490,
116650             longitude : -122.665953,
116651             altitude : 0,
116652             accuracy : 0,
116653             altitudeAccuracy : 0,
116654             heading : 0,
116655             speed : 0
116656         }));
116657         _geoList.push(entry);
116658         entry = new GeoEntry(new lbs.StructuredAddress({
116659             country : "US",
116660             region : "OR",
116661             city : "Portland",
116662             street : "NW Pittock Drive",
116663             streetNumber : "3229",
116664             additionalInformation : "Pittock Mansion",
116665         }),
116666             new lbs.GeoCoordinates({
116667             latitude : 45.531365,
116668             longitude : -122.716255,
116669             altitude : 0,
116670             accuracy : 0,
116671             altitudeAccuracy : 0,
116672             heading : 0,
116673             speed : 0
116674         }));
116675         _geoList.push(entry);
116676         entry = new GeoEntry(new lbs.StructuredAddress({
116677             region : "OR",
116678             city : "Hillsboro",
116679             street : "NE 25th St",
116680             streetNumber : "2111",
116681             postalCode : "97124"
116682         }),
116683             new lbs.GeoCoordinates({
116684             latitude : 45.543479,
116685             longitude : -122.9621601,
116686             altitude : 0,
116687             accuracy : 0,
116688             altitudeAccuracy : 0,
116689             heading : 0,
116690             speed : 0
116691         }));
116692         _geoList.push(entry);
116693         _save();
116694     }
116695 }
116696
116697 function _pendingOperate(operate) {
116698     var pendingObj, pendingOperation, i, argumentVector = [];
116699
116700     for (i = 0; i < arguments.length - 1; i++)
116701         argumentVector[i] = arguments[i + 1];
116702
116703     pendingObj = new PendingObject();
116704
116705     pendingObj.pendingID = window.setTimeout(function () {
116706         pendingObj.setCancelFlag(false);
116707         operate.apply(this, argumentVector);
116708     }, _PENDING_TIME);
116709
116710     pendingOperation = new PendingOperation(pendingObj);
116711
116712     return pendingOperation;
116713 }
116714
116715 function GeoEntry(addr, coord) {
116716     var _self;
116717     _self = {
116718         address : addr || null,
116719         coordinate : coord || null
116720     };
116721     return _self;
116722 }
116723
116724 function SortMode() {
116725     var _self;
116726     _self = {
116727         attributeName : "",
116728         order : "ASC"
116729     };
116730     return _self;
116731 }
116732
116733 function _transAddressStr(addr) {
116734     var str = "";
116735     if (addr.additionalInformation !== null && addr.additionalInformation !== undefined)
116736         str = str + addr.additionalInformation + ", ";
116737     if (addr.premises !== null && addr.premises !== undefined)
116738         str = str + addr.premises + ", ";
116739     if (addr.streetNumber !== null && addr.streetNumber !== undefined)
116740         str = str + addr.streetNumber + " ";
116741     if (addr.street !== null && addr.street !== undefined)
116742         str = str + addr.street + ", ";
116743     if (addr.city !== null && addr.city !== undefined)
116744         str = str + addr.city + ", ";
116745     if (addr.county !== null && addr.county !== undefined)
116746         str = str + addr.county + ", ";
116747     if (addr.region !== null && addr.region !== undefined)
116748         str = str + addr.region + ", ";
116749     if (addr.country !== null && addr.country !== undefined)
116750         str = str + addr.country + ", ";
116751     if (addr.postalCode !== null && addr.postalCode !== undefined)
116752         str = str + addr.postalCode;
116753
116754     if (str.lastIndexOf(", ") === str.length - 2)
116755         str = str.slice(0, -2);
116756     return str;
116757 }
116758
116759 function _concatAddress(addr) {
116760     var str = "";
116761     if (addr.additionalInformation !== null && addr.additionalInformation !== undefined)
116762         str = str + addr.additionalInformation + " ";
116763     if (addr.premises !== null && addr.premises !== undefined)
116764         str = str + addr.premises + " ";
116765     if (addr.streetNumber !== null && addr.streetNumber !== undefined)
116766         str = str + addr.streetNumber + " ";
116767     if (addr.street !== null && addr.street !== undefined)
116768         str = str + addr.street + " ";
116769     if (addr.city !== null && addr.city !== undefined)
116770         str = str + addr.city + " ";
116771     if (addr.county !== null && addr.county !== undefined)
116772         str = str + addr.county + " ";
116773     if (addr.region !== null && addr.region !== undefined)
116774         str = str + addr.region + " ";
116775     if (addr.country !== null && addr.country !== undefined)
116776         str = str + addr.country + " ";
116777     if (addr.postalCode !== null && addr.postalCode !== undefined)
116778         str = str + addr.postalCode;
116779
116780     return str;
116781 }
116782
116783 function _findCoordsByString(address) {
116784     var array = [], reg, str, searchAddr, pieces, i;
116785     if (address.length === 0)
116786         return array;
116787
116788     pieces = address.split(",");
116789     searchAddr = "";
116790     for (i = 0; i < pieces.length; i++) {
116791         searchAddr = searchAddr + pieces[i];
116792     }
116793     reg = new RegExp(searchAddr, "i");
116794
116795     utils.forEach(_geoList, function (item) {
116796         str = _concatAddress(item.address);
116797         if (str.search(reg) !== -1)
116798             array.push(new GeocodeResult(item.coordinate.latitude, item.coordinate.longitude));
116799     });
116800
116801     return array;
116802 }
116803
116804 function _geocodeByString(address, successCB, errorCB, options) {
116805     var array;
116806     array = _findCoordsByString(address);
116807     successCB(array);
116808 }
116809
116810 function _findCoordsByAddress(addr) {
116811     var array = [], select = false, i;
116812     for (i = 0; i < _geoList.length; i++) {
116813         select = false;
116814         if (addr.country !== null && addr.country !== undefined) {
116815             if (addr.country === _geoList[i].address.country)
116816                 select = true;
116817             else
116818                 continue;
116819         }
116820
116821         if (addr.region !== null && addr.region !== undefined) {
116822             if (addr.region === _geoList[i].address.region)
116823                 select = true;
116824             else
116825                 continue;
116826         }
116827
116828         if (addr.county !== null && addr.county !== undefined) {
116829             if (addr.county === _geoList[i].address.county)
116830                 select = true;
116831             else
116832                 continue;
116833         }
116834
116835         if (addr.city !== null && addr.city !== undefined) {
116836             if (addr.city === _geoList[i].address.city)
116837                 select = true;
116838             else
116839                 continue;
116840         }
116841
116842         if (addr.street !== null && addr.street !== undefined) {
116843             if (addr.street === _geoList[i].address.street)
116844                 select = true;
116845             else
116846                 continue;
116847         }
116848
116849         if (addr.streetNumber !== null && addr.streetNumber !== undefined) {
116850             if (addr.streetNumber === _geoList[i].address.streetNumber)
116851                 select = true;
116852             else
116853                 continue;
116854         }
116855
116856         if (addr.premises !== null && addr.premises !== undefined) {
116857             if (addr.premises === _geoList[i].address.premises)
116858                 select = true;
116859             else
116860                 continue;
116861         }
116862
116863         if (addr.additionalInformation !== null &&
116864             addr.additionalInformation !== undefined) {
116865             if (addr.additionalInformation === _geoList[i].address.additionalInformation)
116866                 select = true;
116867             else
116868                 continue;
116869         }
116870
116871         if (addr.postalCode !== null && addr.postalCode !== undefined) {
116872             if (addr.postalCode === _geoList[i].address.postalCode)
116873                 select = true;
116874             else
116875                 continue;
116876         }
116877
116878         if (select === true) {
116879             array.push(new GeocodeResult(_geoList[i].coordinate.latitude, _geoList[i].coordinate.longitude));
116880         }
116881     }
116882
116883     return array;
116884 }
116885
116886 function _geocodeByAddress(address, successCB, errorCB, options) {
116887     var array;
116888     array = _findCoordsByAddress(address);
116889     successCB(array);
116890 }
116891
116892 function _checkAddressType(address) {
116893     var str;
116894     if (typeof address === "string") {
116895         str = "string";
116896     } else if (typeof address === "object") {
116897         str = "StructuredAddress";
116898     } else {
116899         str = "typeMismatch";
116900     }
116901     return str;
116902 }
116903
116904 function _checkCoordsType(coord) {
116905     var str;
116906     /* SimpleCoordinates is a subset of GeoCoordinates.
116907        SimpleCoordinates includes latitude, longitude as mandatory fields only.
116908        GeoCoordinates not only includes latitude, longitude as mandatory fields
116909        but also at least includes one more other optional fields */
116910     if (typeof coord !== "object") {
116911         str = "typeMismatch";
116912     } else if (typeof coord.latitude === "number" &&
116913                 typeof coord.longitude === "number") {
116914         str = "simpleCoordinates";
116915         if (typeof coord.altitude === "number" ||
116916             typeof coord.accuracy === "number" ||
116917             typeof coord.altitudeAccuracy === "number" ||
116918             typeof coord.heading === "number" ||
116919             typeof coord.speed === "number") {
116920             str = "geoCoordinates";
116921         }
116922     } else {
116923         str = "typeMismatch";
116924     }
116925
116926     return str;
116927 }
116928
116929 function _findReverseGeocode(coords, options) {
116930     var array = [], _isStructured = false, i;
116931     if (options !== null && options !== undefined) {
116932         if (options.resultType === "STRUCTURED") {
116933             _isStructured = true;
116934         }
116935     }
116936     for (i = 0; i < _geoList.length; i++) {
116937         if (_geoList[i].coordinate.latitude === coords.latitude &&
116938             _geoList[i].coordinate.longitude === coords.longitude) {
116939             if (coords.altitude) {
116940                 if (_geoList[i].coordinate.altitude !== coords.altitude)
116941                     continue;
116942             }
116943             if (coords.accuracy) {
116944                 if (_geoList[i].coordinate.accuracy !== coords.accuracy)
116945                     continue;
116946             }
116947             if (coords.altitudeAccuracy) {
116948                 if (_geoList[i].coordinate.altitudeAccuracy !== coords.altitudeAccuracy)
116949                     continue;
116950             }
116951             if (coords.heading) {
116952                 if (_geoList[i].coordinate.heading !== coords.heading)
116953                     continue;
116954             }
116955             if (coords.speed) {
116956                 if (_geoList[i].coordinate.speed !== coords.speed)
116957                     continue;
116958             }
116959
116960             if (_isStructured === true) {
116961                 array.push(new lbs.StructuredAddress(_geoList[i].address));
116962             } else {
116963                 array.push(_transAddressStr(_geoList[i].address));
116964             }
116965         }
116966     }
116967     return array;
116968 }
116969
116970 function _reverseGeocodeByGeo(coordinates, successCB, errorCB, options) {
116971     var array, coord;
116972     coord = new lbs.GeoCoordinates(coordinates);
116973     array = _findReverseGeocode(coord, options);
116974     return successCB(array);
116975 }
116976
116977 function _reverseGeocodeBySimple(coordinates, successCB, errorCB, options) {
116978     var array, coord;
116979     coord = new lbs.GeoCoordinates({
116980             latitude : coordinates.latitude,
116981             longitude : coordinates.longitude
116982         });
116983     array = _findReverseGeocode(coord, options);
116984     return successCB(array);
116985 }
116986
116987 module.exports = function (prop) {
116988     var _self = new lbs.LocationServiceProvider(prop);
116989     _geoList_init();
116990
116991     _self.geocode = function (address, successCB, errorCB, options) {
116992         function _geocode() {
116993             var ret;
116994
116995             ret = _pendingOperate(function () {
116996                 /* address: its type is AbstractAddress.
116997                    It could be StructuredAddress or String */
116998                 if (_checkAddressType(address) === "string") {
116999                     _geocodeByString(address, successCB, errorCB, options);
117000                 } else if (_checkAddressType(address) === "StructuredAddress") {
117001                     _geocodeByAddress(address, successCB, errorCB, options);
117002                 } else {
117003                     throw (new WebAPIError(errorcode.TYPE_MISMATCH_ERR));
117004                 }
117005             });
117006         }
117007
117008         tizen1_utils.validateTypeMismatch(successCB, errorCB, "geocode", _geocode);
117009     };
117010
117011     _self.reverseGeocode = function (coordinates, successCB, errorCB, options) {
117012         function _reverseGeocode() {
117013             var ret;
117014
117015             ret = _pendingOperate(function () {
117016                 /* coordinates: Its type is AbstractCoordinates.
117017                    It could be SimpleCoordinates or GeoCoordinates */
117018                 if (_checkCoordsType(coordinates) === "simpleCoordinates") {
117019                     _reverseGeocodeBySimple(coordinates, successCB, errorCB, options);
117020                 } else if (_checkCoordsType(coordinates) === "geoCoordinates") {
117021                     _reverseGeocodeByGeo(coordinates, successCB, errorCB, options);
117022                 } else {
117023                     throw (new WebAPIError(errorcode.TYPE_MISMATCH_ERR));
117024                 }
117025             });
117026         }
117027
117028         tizen1_utils.validateTypeMismatch(successCB, errorCB, "reverseGeocode", _reverseGeocode);
117029     };
117030
117031     return _self;
117032 };
117033
117034
117035 });
117036 define('ripple/platform/tizen/2.0/package', function (require, exports, module) {
117037 /*
117038  *  Copyright 2013 Intel Corporation.
117039  *
117040  * Licensed under the Apache License, Version 2.0 (the "License");
117041  * you may not use this file except in compliance with the License.
117042  * You may obtain a copy of the License at
117043  *
117044  * http://www.apache.org/licenses/LICENSE-2.0
117045  *
117046  * Unless required by applicable law or agreed to in writing, software
117047  * distributed under the License is distributed on an "AS IS" BASIS,
117048  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
117049  * See the License for the specific language governing permissions and
117050  * limitations under the License.
117051  */
117052
117053 var db = require('ripple/db'),
117054     app = require('ripple/app'),
117055     event = require('ripple/event'),
117056     utils = require('ripple/utils'),
117057     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
117058     t = require('ripple/platform/tizen/2.0/typecast'),
117059     WebAPIError = require('ripple/platform/tizen/2.0/WebAPIError'),
117060     WebAPIException = require('ripple/platform/tizen/2.0/WebAPIException'),
117061     PackageInformation = require('ripple/platform/tizen/2.0/PackageInformation'),
117062     _security = {
117063         "http://tizen.org/privilege/packagemanager.install": ["install", "uninstall"],
117064         "http://tizen.org/privilege/package.info": ["getPackagesInfo", "getPackageInfo",
117065                     "setPackageInfoEventListener", "unsetPackageInfoEventListener"]
117066     },
117067     DB_PACKAGE_KEY = "tizen-db-package",
117068     _listeners = [],
117069     _data = {
117070         packageList: {},
117071         installedList: {}
117072     },
117073     INTERVAL = 1000, // INTERVAL = 1sec
117074     INSTALL_AMOUNT = 3072, // installation speed amount = 3072 (KB/sec)
117075     PSEUDO_PACKAGE_ID = "pseudopack00",
117076     PSEUDO_APP_ID = "pseudoapp00",
117077     _self;
117078
117079 function _get() {
117080     _data = db.retrieveObject(DB_PACKAGE_KEY);
117081 }
117082
117083 function _save() {
117084     db.saveObject(DB_PACKAGE_KEY, _data);
117085 }
117086
117087 function _exec(callback, name, id, arg1) {
117088     switch (name) {
117089     case "onprogress":
117090         callback[name](id, arg1);
117091         break;
117092     case "oncomplete":
117093         callback[name](id);
117094         break;
117095     default:
117096         break;
117097     }
117098 }
117099
117100 function _setupCurrentPackage() {
117101     var info, id, item, tizenAppId;
117102     info = app.getInfo();
117103     tizenAppId = info.tizenAppId || PSEUDO_APP_ID;
117104     id = info.tizenPackageId;
117105     if (id !== undefined) {
117106         if (_data.installedList[id]) {
117107             // already installed
117108             return;
117109         }
117110
117111         item = null;
117112         utils.forEach(_data.packageList, function (p) {
117113             if (p.id === id) {
117114                 item = p;
117115             }
117116         });
117117
117118         if (item) {
117119             _data.installedList[item.id] = new PackageInformation(
117120                 item.id, item.name, item.iconPath, item.version,
117121                 item.totalSize, item.dataSize, new Date(),
117122                 item.author, item.description, item.appIds
117123             );
117124             event.trigger("install-current-package", [_data.installedList[item.id]]);
117125         } else {
117126             _data.installedList[id] = new PackageInformation(
117127                 id, "Tizen pseudo package", "icon.png", "2.2",
117128                 8264, 50, new Date(),
117129                 "TizenDev", "This is a description which is used in tests.", [tizenAppId]
117130             );
117131             event.trigger("install-current-package", [_data.installedList[id]]);
117132         }
117133     } else {
117134         _data.installedList[PSEUDO_PACKAGE_ID] = new PackageInformation(
117135             PSEUDO_PACKAGE_ID, "Tizen pseudo package", "icon.png", "2.2",
117136             8264, 50, new Date(),
117137             "TizenDev", "This is a description which is used in tests.", [tizenAppId]
117138         );
117139         event.trigger("install-current-package", [_data.installedList[PSEUDO_PACKAGE_ID]]);
117140     }
117141 }
117142
117143 function _updatePackage(path, updateFlag) {
117144     var item, p, info;
117145
117146     if (!_data.packageList[path]) {
117147         return;
117148     }
117149     _get();
117150     p = _data.packageList[path];
117151     item = _data.installedList[p.id];
117152     utils.forEach(_listeners, function (listener) {
117153         info = new PackageInformation(
117154             item.id, item.name, item.iconPath, item.version,
117155             item.totalSize, item.dataSize, item.lastModified,
117156             item.author, item.description, item.appIds);
117157         if (!updateFlag) {
117158             listener.oninstalled(info);
117159         } else {
117160             listener.onupdated(info);
117161         }
117162     });
117163 }
117164
117165 function _initialize() {
117166     _get();
117167
117168     if (!_data)
117169         return;
117170
117171     utils.forEach(_data.installedList, function (item) {
117172         item.lastModified = new Date(item.lastModified);
117173     });
117174
117175     _setupCurrentPackage();
117176
117177     event.on("install-packge", function (path) {
117178         _updatePackage(path, false);
117179     });
117180     event.on("update-package", function (path) {
117181         _updatePackage(path, true);
117182     });
117183
117184     event.on("uninstall-package", function (id) {
117185         _get();
117186         utils.forEach(_listeners, function (listener) {
117187             listener.onuninstalled(id);
117188         });
117189     });
117190 }
117191
117192 _self = function () {
117193     var package;
117194
117195     // public
117196     function install(path, progressCallback, errorCallback) {
117197         if (!_security.install) {
117198             throw new WebAPIException(errorcode.SECURITY_ERR);
117199         }
117200
117201         t.PackageManager("install", arguments);
117202
117203         window.setTimeout(function () {
117204             var intervalId, installedSize = 0, packageSize, updateFlag = false,
117205                 item, info, progress;
117206
117207             if (!_data.packageList[path]) {
117208                 if (errorCallback) {
117209                     errorCallback(new WebAPIError(errorcode.NOT_FOUND_ERR));
117210                 }
117211                 return;
117212             }
117213             item = _data.packageList[path];
117214             if (_data.installedList[item.id]) {
117215                 updateFlag = true;
117216             }
117217             packageSize = item.totalSize;
117218             intervalId = setInterval(function () {
117219                 if (installedSize >= packageSize) {
117220                     // Install complete
117221                     _data.installedList[item.id] = new PackageInformation(
117222                         item.id, item.name, item.iconPath, item.version,
117223                         item.totalSize, item.dataSize, new Date(),
117224                         item.author, item.description, item.appIds
117225                     );
117226                     event.trigger("install-apps", [item.appIds]);
117227                     _save();
117228                     _exec(progressCallback, "oncomplete", item.id);
117229                     clearInterval(intervalId);
117230                     item = _data.installedList[item.id];
117231                     utils.forEach(_listeners, function (listener) {
117232                         info = new PackageInformation(
117233                             item.id, item.name, item.iconPath, item.version,
117234                             item.totalSize, item.dataSize, item.lastModified,
117235                             item.author, item.description, item.appIds);
117236                         if (!updateFlag) {
117237                             listener.oninstalled(info);
117238                         } else {
117239                             listener.onupdated(info);
117240                         }
117241                     });
117242                     event.trigger("installedList-updated");
117243                 } else {
117244                     installedSize += INSTALL_AMOUNT;
117245                     progress = (installedSize > packageSize) ? 100 :
117246                             Math.floor(installedSize * 100 / packageSize);
117247                     _exec(progressCallback, "onprogress", item.id, progress);
117248                 }
117249             }, INTERVAL);
117250         }, 1);
117251     }
117252
117253     function uninstall(id, progressCallback, errorCallback) {
117254         if (!_security.uninstall) {
117255             throw new WebAPIException(errorcode.SECURITY_ERR);
117256         }
117257
117258         t.PackageManager("uninstall", arguments);
117259
117260         window.setTimeout(function () {
117261             var intervalId, removedSize = 0, packageSize, item, progress;
117262
117263             if (!_data.installedList[id]) {
117264                 if (errorCallback) {
117265                     errorCallback(new WebAPIError(errorcode.NOT_FOUND_ERR));
117266                 }
117267                 return;
117268             }
117269             item = _data.installedList[id];
117270             packageSize = item.totalSize;
117271             intervalId = setInterval(function () {
117272                 if (removedSize >= packageSize) {
117273                     utils.forEach(_data.packageList, function (package) {
117274                         if (package.id === id) {
117275                             event.trigger("remove-apps", [package.appIds]);
117276                         }
117277                     });
117278                     delete _data.installedList[item.id];
117279                     _save();
117280                     _exec(progressCallback, "oncomplete", item.id);
117281                     clearInterval(intervalId);
117282                     item = _data.installedList[item.id];
117283                     utils.forEach(_listeners, function (listener) {
117284                         listener.onuninstalled(id);
117285                     });
117286                     event.trigger("installedList-updated");
117287                 } else {
117288                     removedSize += INSTALL_AMOUNT * 10;
117289                     progress = (removedSize > packageSize) ? 100 :
117290                             Math.floor(removedSize * 100 / packageSize);
117291                     _exec(progressCallback, "onprogress", item.id, progress);
117292                 }
117293             }, INTERVAL);
117294         }, 1);
117295     }
117296
117297     function getPackagesInfo(successCallback, errorCallback) {
117298         if (!_security.getPackagesInfo) {
117299             throw new WebAPIException(errorcode.SECURITY_ERR);
117300         }
117301
117302         t.PackageManager("getPackagesInfo", arguments);
117303
117304         window.setTimeout(function () {
117305             var packageArray = [];
117306
117307             utils.forEach(_data.installedList, function (item) {
117308                 var i;
117309                 i = new PackageInformation(
117310                         item.id, item.name, item.iconPath, item.version,
117311                         item.totalSize, item.dataSize, item.lastModified,
117312                         item.author, item.description, item.appIds
117313                     );
117314                 packageArray.push(i);
117315             });
117316             successCallback(packageArray);
117317         }, 1);
117318     }
117319
117320     function getPackageInfo(id) {
117321         var p, item;
117322
117323         if (!_security.getPackageInfo) {
117324             throw new WebAPIException(errorcode.SECURITY_ERR);
117325         }
117326
117327         t.PackageManager("getPackageInfo", arguments);
117328
117329         id = id || "api1pack00";
117330
117331         if (!_data.installedList[id]) {
117332             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
117333         }
117334         item = _data.installedList[id];
117335         p = new PackageInformation(item.id, item.name, item.iconPath,
117336                 item.version, item.totalSize, item.dataSize, item.lastModified,
117337                 item.author, item.description, item.appIds);
117338
117339         return p;
117340     }
117341
117342     function setPackageInfoEventListener(eventCallback) {
117343         if (!_security.setPackageInfoEventListener) {
117344             throw new WebAPIException(errorcode.SECURITY_ERR);
117345         }
117346
117347         t.PackageManager("setPackageInfoEventListener", arguments);
117348
117349         _listeners.push(eventCallback);
117350     }
117351
117352     function unsetPackageInfoEventListener() {
117353         if (!_security.unsetPackageInfoEventListener) {
117354             throw new WebAPIException(errorcode.SECURITY_ERR);
117355         }
117356
117357         t.PackageManager("unsetPackageInfoEventListener", arguments);
117358
117359         _listeners = [];
117360     }
117361
117362     function handleSubFeatures(subFeatures) {
117363         var i, subFeature;
117364
117365         for (subFeature in subFeatures) {
117366             for (i in _security[subFeature]) {
117367                 _security[_security[subFeature][i]] = true;
117368             }
117369         }
117370     }
117371
117372     package = {
117373         install:                       install,
117374         uninstall:                     uninstall,
117375         getPackagesInfo:               getPackagesInfo,
117376         getPackageInfo:                getPackageInfo,
117377         setPackageInfoEventListener:   setPackageInfoEventListener,
117378         unsetPackageInfoEventListener: unsetPackageInfoEventListener,
117379         handleSubFeatures:             handleSubFeatures
117380     };
117381
117382     return package;
117383 };
117384
117385 _initialize();
117386
117387 module.exports = _self;
117388
117389 });
117390 define('ripple/platform/tizen/2.0/application', function (require, exports, module) {
117391 /*
117392  *  Copyright 2013 Intel Corporation.
117393  *
117394  * Licensed under the Apache License, Version 2.0 (the "License");
117395  * you may not use this file except in compliance with the License.
117396  * You may obtain a copy of the License at
117397  *
117398  * http://www.apache.org/licenses/LICENSE-2.0
117399  *
117400  * Unless required by applicable law or agreed to in writing, software
117401  * distributed under the License is distributed on an "AS IS" BASIS,
117402  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
117403  * See the License for the specific language governing permissions and
117404  * limitations under the License.
117405  */
117406
117407 var utils = require('ripple/utils'),
117408     event = require('ripple/event'),
117409     app = require('ripple/app'),
117410     db = require('ripple/db'),
117411     t = require('ripple/platform/tizen/2.0/typecast'),
117412     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
117413     WebAPIError = require('ripple/platform/tizen/2.0/WebAPIError'),
117414     WebAPIException = require('ripple/platform/tizen/2.0/WebAPIException'),
117415     ApplicationControl = require('ripple/platform/tizen/2.0/ApplicationControl'),
117416     Application,
117417     ApplicationInformation,
117418     ApplicationContext,
117419     ApplicationCertificate,
117420     RequestedApplicationControl,
117421     _DB_APPLICATION_KEY = "tizen1-db-application",
117422     PSEUDO_PACKAGE_ID = "pseudopack00",
117423     PSEUDO_APP_ID = "pseudoapp00",
117424     _security = {
117425         "http://tizen.org/privilege/application.launch": ["launch", "launchAppControl"],
117426         "http://tizen.org/privilege/appmanager.kill": ["kill"],
117427         "http://tizen.org/privilege/appmanager.certificate": ["getAppCerts"]
117428     },
117429     _data = {
117430         applications : {},
117431         applicationContexts : {},
117432         activeApp : null,
117433         listeners : {}
117434     },
117435     _appDialogTemplate = jQuery("#app-dialog-template").html(),
117436     _appDialogTemplate_short = jQuery("#app-dialog2-template").html(),
117437     _appDialogTemplate_exit_hide = jQuery("#app-dialog3-template").html(),
117438     reasonable_mimetype = {
117439         "application"   : true,
117440         "text"          : true,
117441         "video"         : true,
117442         "audio"         : true,
117443         "image"         : true
117444     },
117445     _self;
117446
117447 function _setupCurrentApp() {
117448     var info, contextId, packageId, appId;
117449     info = app.getInfo();
117450     packageId = info.tizenPackageId || PSEUDO_PACKAGE_ID;
117451     appId = info.tizenAppId || PSEUDO_APP_ID;
117452     contextId = Math.uuid(null, 16);
117453     _data.applications[appId] = {
117454         id: appId,
117455         name: info.name,
117456         iconPath: info.icon,
117457         version: info.version,
117458         show: true,
117459         categories: [],
117460         installDate: new Date(),
117461         size: 1024,
117462         packageId: packageId,
117463         sharedURI: "/usr/local/share/",
117464         operation: "",
117465         appControl: {
117466             uri: "",
117467             mime: "",
117468             category: "",
117469             data: []
117470         },
117471         type: "AUTHOR_ROOT",
117472         value: ""
117473     };
117474     event.trigger("install-current-app", [_data.applications[appId]]);
117475     _data.applicationContexts[contextId] = {id: contextId, appId: appId};
117476     _data.activeApp = _data.applicationContexts[contextId];
117477 }
117478
117479 function _translate(apps) {
117480     // translate string to Date after retrieving from DB,
117481     // it is a temporary sulusion
117482     var i;
117483     for (i in apps) {
117484         if (typeof apps[i].installDate === 'string') {
117485             apps[i].installDate = new Date(apps[i].installDate);
117486         }
117487     }
117488     return apps;
117489 }
117490
117491 function _initialize() {
117492     _data = {
117493         applications : {},
117494         applicationContexts : {},
117495         activeApp : null,
117496         listeners : {}
117497     };
117498
117499     if (!db.retrieveObject(_DB_APPLICATION_KEY))
117500         return;
117501
117502     _data.applications = _translate(db.retrieveObject(_DB_APPLICATION_KEY).installedAppList);
117503     _setupCurrentApp();
117504     $("#app-dialog").dialog({
117505         resizable: false,
117506         draggable: false,
117507         modal: true,
117508         autoOpen: false,
117509         position: 'center',
117510         minWidth: '500',
117511         minHeight: '262',
117512         open: function () { $(".ui-dialog-titlebar-close", $(this).parent()).hide(); }
117513     });
117514 }
117515
117516 _self = function () {
117517     // private
117518     function getHandle() {
117519         var handle;
117520         do {
117521             handle = Math.uuid(8, 10);
117522         } while (handle.toString().indexOf('0') === 0);
117523
117524         return parseInt(handle, 10);
117525     }
117526
117527     // public
117528     function getCurrentApplication() {
117529         var application, innerApp;
117530
117531         t.ApplicationManager("getCurrentApplication", arguments);
117532
117533         /* activeApp update (by WidgetInformationUpdate event) sometime will late after user calling getCurrentApplication()
117534            for example: load other application by omnibar */
117535         if (app.getInfo().id !== _data.activeApp.appId) {
117536             _data.applications = db.retrieveObject(_DB_APPLICATION_KEY).installedAppList;
117537             utils.forEach(_data.applications, function(item) {
117538                 item.installDate = new Date(item.installDate);
117539             });
117540             _setupCurrentApp();
117541         }
117542         innerApp = _data.applications[_data.activeApp.appId];
117543         application = new Application(
117544                 new ApplicationInformation(
117545                     innerApp.id,
117546                     innerApp.name,
117547                     innerApp.iconPath,
117548                     innerApp.version,
117549                     innerApp.show,
117550                     innerApp.categories,
117551                     innerApp.installDate,
117552                     innerApp.size,
117553                     innerApp.packageId),
117554                 _data.activeApp.id, innerApp);
117555         return application;
117556     }
117557
117558     function kill(contextId, successCallback, errorCallback) {
117559         if (!_security.kill) {
117560             throw new WebAPIException(errorcode.SECURITY_ERR);
117561         }
117562
117563         t.ApplicationManager("kill", arguments);
117564
117565         window.setTimeout(function () {
117566             if (!_data.applicationContexts[contextId]) {
117567                 if (errorCallback) {
117568                     errorCallback(new WebAPIError(errorcode.NOT_FOUND_ERR));
117569                 }
117570                 return;
117571             }
117572
117573             if (_data.activeApp && (_data.activeApp.id === contextId)) {
117574                 if (errorCallback) {
117575                     errorCallback(new WebAPIError(errorcode.INVALID_VALUES_ERR));
117576                 }
117577                 return;
117578             }
117579
117580             delete _data.applicationContexts[contextId];
117581             if (successCallback) {
117582                 successCallback();
117583             }
117584         }, 1);
117585     }
117586
117587     function launch(id, successCallback, errorCallback) {
117588         if (!_security.launch) {
117589             throw new WebAPIException(errorcode.SECURITY_ERR);
117590         }
117591
117592         t.ApplicationManager("launch", arguments);
117593
117594         window.setTimeout(function () {
117595             var htmlContent;
117596
117597             if (!_data.applications[id]) {
117598                 if (errorCallback) {
117599                     errorCallback(new WebAPIError(errorcode.NOT_FOUND_ERR));
117600                 }
117601                 return;
117602             }
117603
117604             htmlContent = _appDialogTemplate_short.replace(/#application-name/, _data.applications[id].name)
117605                 .replace(/#application-id/, id);
117606             jQuery("#app-dialog-box").html(htmlContent);
117607             $("#app-dialog").dialog("open");
117608
117609             if (successCallback) {
117610                 successCallback();
117611             }
117612         }, 1);
117613     }
117614
117615     function launchAppControl(appControl, id, successCallback, errorCallback, replyCallback) {
117616         if (!_security.launchAppControl) {
117617             throw new WebAPIException(errorcode.SECURITY_ERR);
117618         }
117619
117620         t.ApplicationManager("launchAppControl", arguments, true);
117621
117622         window.setTimeout(function () {
117623             var isFound = false, appId, htmlContent;
117624
117625             if (id) {
117626                 if (!_data.applications[id]) {
117627                     if (errorCallback) {
117628                         errorCallback(new WebAPIError(errorcode.NOT_FOUND_ERR));
117629                     }
117630                     return;
117631                 }
117632                 htmlContent = _appDialogTemplate.replace(/#application-name/, _data.applications[appId].name)
117633                     .replace(/#appControl-operation/, _data.applications[appId].operation)
117634                     .replace(/#appControl-uri/, _data.applications[appId].appControl.uri)
117635                     .replace(/#appControl-mime/, _data.applications[appId].appControl.mime)
117636                     .replace(/#appControl-category/, _data.applications[appId].appControl.category)
117637                     .replace(/#appControl-data/, JSON.stringify(_data.applications[appId].appControl.data));
117638                 jQuery("#app-dialog-box").html(htmlContent);
117639                 $("#app-dialog").dialog("open");
117640
117641                 _data.activeApp.replyCallback = replyCallback;
117642
117643                 if (successCallback) {
117644                     successCallback();
117645                 }
117646             } else {
117647                 utils.forEach(_data.applications, function (application) {
117648                     if (application.operation === appControl.operation) {
117649                         if (appControl.mime && (typeof appControl.mime === "string")) {
117650                             if (!reasonable_mimetype[appControl.mime.split("/")[0]]) {
117651                                 return;
117652                             }
117653                         }
117654                         appId = application.id;
117655                         isFound = true;
117656                     }
117657                 });
117658
117659                 if (!isFound) {
117660                     if (errorCallback) {
117661                         errorCallback(new WebAPIError(errorcode.NOT_FOUND_ERR));
117662                     }
117663                     return;
117664                 }
117665
117666                 htmlContent = _appDialogTemplate.replace(/#application-name/,
117667                         _data.applications[appId].name)
117668                     .replace(/#appControl-operation/, _data.applications[appId].operation)
117669                     .replace(/#appControl-uri/, _data.applications[appId].appControl.uri)
117670                     .replace(/#appControl-mime/, _data.applications[appId].appControl.mime)
117671                     .replace(/#appControl-category/, _data.applications[appId].appControl.category)
117672                     .replace(/#appControl-data/, JSON.stringify(_data.applications[appId].appControl.data));
117673                 jQuery("#app-dialog-box").html(htmlContent);
117674                 $("#app-dialog").dialog("open");
117675
117676                 _data.activeApp.replyCallback = replyCallback;
117677
117678                 if (successCallback) {
117679                     successCallback();
117680                 }
117681             }
117682         }, 1);
117683     }
117684
117685     function findAppControl(appControl, successCallback, errorCallback) {
117686         var appControlExternal = appControl;
117687
117688         t.ApplicationManager("findAppControl", arguments, true);
117689
117690         window.setTimeout(function () {
117691             var informationArray = [];
117692
117693             utils.forEach(_data.applications, function (application) {
117694                 if (application.operation === appControl.operation) {
117695                     informationArray.push(new ApplicationInformation(
117696                             application.id,
117697                             application.name,
117698                             application.iconPath,
117699                             application.version,
117700                             application.show,
117701                             application.categories,
117702                             application.installDate,
117703                             application.size,
117704                             application.packageId));
117705                 }
117706             });
117707
117708             successCallback(informationArray, appControlExternal);
117709         }, 1);
117710     }
117711
117712     function getAppsContext(successCallback, errorCallback) {
117713         t.ApplicationManager("getAppsContext", arguments);
117714
117715         window.setTimeout(function () {
117716             var contexts = [];
117717
117718             utils.forEach(_data.applicationContexts, function (context) {
117719                 contexts.push(new ApplicationContext(context.id, context.appId));
117720             });
117721
117722             successCallback(contexts);
117723         }, 1);
117724     }
117725
117726     function getAppContext(contextId) {
117727         var appContext;
117728
117729         if (contextId === null || contextId === undefined) {
117730             appContext = new ApplicationContext(_data.activeApp.id, _data.activeApp.appId);
117731             return (appContext);
117732         }
117733
117734         t.ApplicationManager("getAppContext", arguments);
117735
117736         if (_data.applicationContexts[contextId]) {
117737             appContext = new ApplicationContext(contextId, _data.applicationContexts[contextId].appId);
117738             return (appContext);
117739         }
117740         throw new WebAPIException(errorcode.NOT_FOUND_ERR);
117741     }
117742
117743     function getAppsInfo(successCallback, errorCallback) {
117744         t.ApplicationManager("getAppsInfo", arguments);
117745
117746         window.setTimeout(function () {
117747             var applications = [];
117748
117749             utils.forEach(_data.applications, function (application) {
117750                 applications.push(new ApplicationInformation(
117751                         application.id,
117752                         application.name,
117753                         application.iconPath,
117754                         application.version,
117755                         application.show,
117756                         application.categories,
117757                         application.installDate,
117758                         application.size,
117759                         application.packageId));
117760             });
117761
117762             successCallback(applications);
117763         }, 1);
117764     }
117765
117766     function getAppInfo(id) {
117767         var appId, appInfo, theApp;
117768
117769         t.ApplicationManager("getAppInfo", arguments);
117770
117771         if (arguments.length === 0) {
117772             appId = _data.activeApp.appId;
117773             theApp = _data.applications[appId];
117774
117775             appInfo = new ApplicationInformation(
117776                     theApp.id,
117777                     theApp.name,
117778                     theApp.iconPath,
117779                     theApp.version,
117780                     theApp.show,
117781                     theApp.categories,
117782                     theApp.installDate,
117783                     theApp.size,
117784                     theApp.packageId);
117785             return appInfo;
117786         }
117787
117788         if (!_data.applications[id]) {
117789             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
117790         }
117791
117792         theApp = _data.applications[id];
117793         appInfo = new ApplicationInformation(
117794                     theApp.id,
117795                     theApp.name,
117796                     theApp.iconPath,
117797                     theApp.version,
117798                     theApp.show,
117799                     theApp.categories,
117800                     theApp.installDate,
117801                     theApp.size,
117802                     theApp.packageId);
117803         return appInfo;
117804     }
117805
117806     function getAppCerts(id) {
117807         var certs = [];
117808
117809         if (!_security.getAppCerts) {
117810             throw new WebAPIException(errorcode.SECURITY_ERR);
117811         }
117812
117813         t.ApplicationManager("getAppCerts", arguments);
117814
117815         if (arguments.length === 0) {
117816             id = _data.activeApp.appId;
117817             certs.push(new ApplicationCertificate(_data.applications[id].type, _data.applications[id].value));
117818             return certs;
117819         }
117820
117821         if (!_data.applications[id]) {
117822             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
117823         }
117824         certs.push(new ApplicationCertificate(_data.applications[id].type, _data.applications[id].value));
117825         return certs;
117826     }
117827
117828     function getAppSharedURI(id) {
117829         var appId;
117830
117831         t.ApplicationManager("getAppSharedURI", arguments);
117832
117833         if (id === null || id === undefined) {
117834             appId = _data.activeApp.appId;
117835             return _data.applications[appId].sharedURI;
117836         }
117837
117838         if (!_data.applications[id]) {
117839             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
117840         }
117841
117842         return _data.applications[id].sharedURI;
117843     }
117844
117845     function addAppInfoEventListener(eventCallback) {
117846         var handle;
117847
117848         t.ApplicationManager("addAppInfoEventListener", arguments);
117849
117850         handle = getHandle();
117851         _data.listeners[handle] = eventCallback;
117852
117853         return handle;
117854     }
117855
117856     function removeAppInfoEventListener(listenerID) {
117857         if (!_data.listeners[listenerID])
117858             return;
117859
117860         delete _data.listeners[listenerID];
117861     }
117862
117863     function handleSubFeatures(subFeatures) {
117864         var i, subFeature;
117865
117866         for (subFeature in subFeatures) {
117867             for (i in _security[subFeature]) {
117868                 _security[_security[subFeature][i]] = true;
117869             }
117870         }
117871     }
117872
117873     var application = {
117874         getCurrentApplication : getCurrentApplication,
117875         kill : kill,
117876         launch : launch,
117877         launchAppControl : launchAppControl,
117878         findAppControl : findAppControl,
117879         getAppsContext : getAppsContext,
117880         getAppContext : getAppContext,
117881         getAppsInfo : getAppsInfo,
117882         getAppInfo : getAppInfo,
117883         getAppCerts : getAppCerts,
117884         getAppSharedURI: getAppSharedURI,
117885         addAppInfoEventListener : addAppInfoEventListener,
117886         removeAppInfoEventListener : removeAppInfoEventListener,
117887         handleSubFeatures : handleSubFeatures
117888     };
117889
117890     return application;
117891 };
117892
117893 Application = function (appInfo, contextId, metaData) {
117894     var application = {}, requestedAppControl;
117895
117896     application.appInfo   = appInfo;
117897     application.contextId = contextId;
117898
117899     requestedAppControl = new RequestedApplicationControl(
117900             new ApplicationControl(metaData.operation, metaData.appControl.uri,
117901                     metaData.appControl.mime, metaData.appControl.category,
117902                     metaData.appControl.data), application.appInfo.id);
117903
117904     this.__defineGetter__("appInfo", function () {
117905         return application.appInfo;
117906     });
117907
117908     this.__defineGetter__("contextId", function () {
117909         return application.contextId;
117910     });
117911
117912     this.exit = function () {
117913         event.trigger("tizen-application-exit", [contextId]);
117914     };
117915
117916     this.hide = function () {
117917         event.trigger("tizen-application-hide", [contextId]);
117918     };
117919
117920     this.getRequestedAppControl = function () {
117921         return requestedAppControl;
117922     };
117923 };
117924
117925 ApplicationInformation = function (id, name, iconPath, version, show,
117926         categories, installDate, size, packageId) {
117927     this.__defineGetter__("id", function () {
117928         return id;
117929     });
117930
117931     this.__defineGetter__("name", function () {
117932         return name;
117933     });
117934
117935     this.__defineGetter__("iconPath", function () {
117936         return iconPath;
117937     });
117938
117939     this.__defineGetter__("version", function () {
117940         return version;
117941     });
117942
117943     this.__defineGetter__("show", function () {
117944         return show;
117945     });
117946
117947     this.__defineGetter__("categories", function () {
117948         return categories;
117949     });
117950
117951     this.__defineGetter__("installDate", function () {
117952         return installDate;
117953     });
117954
117955     this.__defineGetter__("size", function () {
117956         return size;
117957     });
117958
117959     this.__defineGetter__("packageId", function () {
117960         return packageId;
117961     });
117962 };
117963
117964 ApplicationContext = function (id, appId) {
117965     this.__defineGetter__("id", function () {
117966         return id;
117967     });
117968
117969     this.__defineGetter__("appId", function () {
117970         return appId;
117971     });
117972 };
117973
117974 RequestedApplicationControl = function (appControl, callerAppId) {
117975     this.__defineGetter__("appControl", function () {
117976         return appControl;
117977     });
117978
117979     this.__defineGetter__("callerAppId", function () {
117980         return callerAppId;
117981     });
117982
117983     this.replyResult = function (data) {
117984         t.RequestedApplicationControl("replyResult", arguments);
117985
117986         event.trigger("appServiceReplied", "Result: " + data);
117987     };
117988
117989     this.replyFailure = function () {
117990         event.trigger("appServiceReplied", "Failure");
117991     };
117992 };
117993
117994 ApplicationCertificate = function (type, value) {
117995     this.__defineGetter__("type", function () {
117996         return type;
117997     });
117998
117999     this.__defineGetter__("value", function () {
118000         return value;
118001     });
118002 };
118003
118004 jQuery("#app-dialog-return-btn").live("click", function () {
118005     $("#app-dialog").dialog("close");
118006 });
118007
118008 jQuery("#app-dialog-reload-btn").live("click", function () {
118009     $("#app-dialog").dialog("close");
118010     window.tinyHipposReload = true;
118011     location.reload();
118012 });
118013
118014 jQuery("#app-dialog-generate-reply").live("click", function () {
118015     var type, data, ret = [];
118016     type = jQuery('input:radio[name="app-dialog-reply-type"]:checked').val();
118017     data = jQuery("#app-dialog-reply-json").val();
118018     $("#app-dialog").dialog("close");
118019     if (_data.activeApp.replyCallback) {
118020         switch (type) {
118021         case "replyResult":
118022             if (_data.activeApp.replyCallback.onsuccess) {
118023                 if (data === "") {
118024                     _data.activeApp.replyCallback.onsuccess();
118025                 } else {
118026                     try {
118027                         ret = JSON.parse(data);
118028                         _data.activeApp.replyCallback.onsuccess(ret);
118029                     } catch (e) {
118030                         console.log("replyResult: JSON parsing error: " + e.message);
118031                         _data.activeApp.replyCallback.onsuccess();
118032                     }
118033                 }
118034             }
118035             break;
118036         case "replyFailure":
118037             if (_data.activeApp.replyCallback.onfailure) {
118038                 _data.activeApp.replyCallback.onfailure();
118039             }
118040             break;
118041         }
118042     }
118043 });
118044
118045 event.on("ApplicationLoad", function () {
118046     _initialize();
118047 });
118048
118049 event.on("tizen-application-exit", function () {
118050     var htmlContent;
118051     htmlContent = _appDialogTemplate_exit_hide.replace(/#application-name/, _data.applications[_data.activeApp.appId].name)
118052         .replace(/#application-id/, _data.applications[_data.activeApp.appId].id)
118053         .replace(/#application-operation/g, "exit")
118054         .replace(/#application-verb/, "launch")
118055         .replace(/#next-command/g, "Launch")
118056         .replace(/#application-btn/, "app-dialog-reload-btn");
118057     jQuery("#app-dialog-box").html(htmlContent);
118058     $("#app-dialog").dialog("open");
118059 });
118060
118061 event.on("tizen-application-hide", function () {
118062     var htmlContent;
118063     htmlContent = _appDialogTemplate_exit_hide.replace(/#application-name/, _data.applications[_data.activeApp.appId].name)
118064         .replace(/#application-id/, _data.applications[_data.activeApp.appId].id)
118065         .replace(/#application-operation/g, "hide")
118066         .replace(/#application-verb/, "show")
118067         .replace(/#next-command/g, "Show")
118068         .replace(/#application-btn/, "app-dialog-return-btn");
118069     jQuery("#app-dialog-box").html(htmlContent);
118070     $("#app-dialog").dialog("open");
118071 });
118072
118073 event.on("programChanged", function (status, id) {
118074     var callback, data, innerApp;
118075     _data.applications = db.retrieveObject(_DB_APPLICATION_KEY).installedAppList;
118076     utils.forEach(_data.applications, function(item) {
118077         item.installDate = new Date(item.installDate);
118078     });
118079     _setupCurrentApp();
118080     switch (status) {
118081     case "installed":
118082     case "updated":
118083         innerApp = _data.applications[id];
118084         data = new ApplicationInformation(
118085                         innerApp.id,
118086                         innerApp.name,
118087                         innerApp.iconPath,
118088                         innerApp.version,
118089                         innerApp.show,
118090                         innerApp.categories,
118091                         innerApp.installDate,
118092                         innerApp.size,
118093                         innerApp.packageId);
118094         break;
118095     case "uninstalled":
118096         data = id;
118097         break;
118098
118099     default:
118100         return;
118101     }
118102     callback = "on" + status;
118103     utils.forEach(_data.listeners, function (listener) {
118104         listener[callback](data);
118105     });
118106 });
118107
118108 _initialize();
118109
118110 module.exports = _self;
118111
118112 });
118113 define('ripple/platform/tizen/2.0/ContactRef', function (require, exports, module) {
118114 /*
118115  *  Copyright 2013 Intel Corporation.
118116  *
118117  * Licensed under the Apache License, Version 2.0 (the "License");
118118  * you may not use this file except in compliance with the License.
118119  * You may obtain a copy of the License at
118120  *
118121  * http://www.apache.org/licenses/LICENSE-2.0
118122  *
118123  * Unless required by applicable law or agreed to in writing, software
118124  * distributed under the License is distributed on an "AS IS" BASIS,
118125  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
118126  * See the License for the specific language governing permissions and
118127  * limitations under the License.
118128  */
118129
118130 var t = require('ripple/platform/tizen/2.0/typecast'),
118131     ContactRef;
118132
118133 ContactRef = function (addressBookId, contactId) {
118134     var contactRef = {};
118135
118136     t.ContactRef(arguments, this);
118137
118138     contactRef.addressBookId = addressBookId;
118139     contactRef.contactId     = contactId;
118140
118141     this.__defineGetter__("addressBookId", function () {
118142         return contactRef.addressBookId;
118143     });
118144     this.__defineSetter__("addressBookId", function (val) {
118145         try {
118146             contactRef.addressBookId = t.AddressBookId(val);
118147         } catch (e) {
118148         }
118149     });
118150
118151     this.__defineGetter__("contactId", function () {
118152         return contactRef.contactId;
118153     });
118154     this.__defineSetter__("contactId", function (val) {
118155         try {
118156             contactRef.contactId = t.ContactId(val);
118157         } catch (e) {
118158         }
118159     });
118160 };
118161
118162 module.exports = ContactRef;
118163
118164 });
118165 define('ripple/platform/tizen/2.0/CalendarEventId', function (require, exports, module) {
118166 /*
118167  *  Copyright 2013 Intel Corporation.
118168  *
118169  * Licensed under the Apache License, Version 2.0 (the "License");
118170  * you may not use this file except in compliance with the License.
118171  * You may obtain a copy of the License at
118172  *
118173  * http://www.apache.org/licenses/LICENSE-2.0
118174  *
118175  * Unless required by applicable law or agreed to in writing, software
118176  * distributed under the License is distributed on an "AS IS" BASIS,
118177  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
118178  * See the License for the specific language governing permissions and
118179  * limitations under the License.
118180  */
118181
118182 var t = require('ripple/platform/tizen/2.0/typecast'),
118183     CalendarEventId;
118184
118185 CalendarEventId = function (uid, rid) {
118186     var calendarEventId = {};
118187
118188     t.CalendarEventId(arguments, this);
118189
118190     calendarEventId.uid = uid;
118191     calendarEventId.rid = rid || null;
118192
118193     this.__defineGetter__("uid", function () {
118194         return calendarEventId.uid;
118195     });
118196     this.__defineSetter__("uid", function (val) {
118197         try {
118198             calendarEventId.uid = t.DOMString(val);
118199         } catch (e) {
118200         }
118201     });
118202
118203     this.__defineGetter__("rid", function () {
118204         return calendarEventId.rid;
118205     });
118206     this.__defineSetter__("rid", function (val) {
118207         try {
118208             calendarEventId.rid = t.DOMString(val, "?");
118209         } catch (e) {
118210         }
118211     });
118212 };
118213
118214 module.exports = CalendarEventId;
118215
118216 });
118217 define('ripple/platform/tizen/2.0/content', function (require, exports, module) {
118218 /*
118219  *  Copyright 2013 Intel Corporation
118220  *
118221  * Licensed under the Apache License, Version 2.0 (the "License");
118222  * you may not use this file except in compliance with the License.
118223  * You may obtain a copy of the License at
118224  *
118225  * http://www.apache.org/licenses/LICENSE-2.0
118226  *
118227  * Unless required by applicable law or agreed to in writing, software
118228  * distributed under the License is distributed on an "AS IS" BASIS,
118229  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
118230  * See the License for the specific language governing permissions and
118231  * limitations under the License.
118232  */
118233
118234 var db = require('ripple/db'),
118235     utils = require('ripple/utils'),
118236     dbfs = require('ripple/platform/tizen/2.0/dbfs'),
118237     dbinit = require('ripple/platform/tizen/2.0/dbinit'),
118238     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
118239     t = require('ripple/platform/tizen/2.0/typecast'),
118240     tizen1_utils = require('ripple/platform/tizen/2.0/tizen1_utils'),
118241     SimpleCoordinates = require('ripple/platform/tizen/2.0/SimpleCoordinates'),
118242     WebAPIError = require('ripple/platform/tizen/2.0/WebAPIError'),
118243     WebAPIException = require('ripple/platform/tizen/2.0/WebAPIException'),
118244     Content,
118245     ContentDirectory,
118246     ContentFactory,
118247     ContentStorage,
118248     AudioContent,
118249     ImageContent,
118250     VideoContent,
118251     ContentInternal,
118252     ContentDirectoryInternal,
118253     AudioContentInternal,
118254     ImageContentInternal,
118255     VideoContentInternal,
118256     AudioContentLyrics,
118257     _data = {
118258         DB_CONTENT_KEY: "tizen1-db-content",
118259         content:        {},
118260         listener:       null,
118261         dbStorage:      null
118262     },
118263     _security = {
118264         "http://tizen.org/privilege/content.read": ["find",
118265             "setChangeListener", "unsetChangeListener"],
118266         "http://tizen.org/privilege/content.write": ["update", "updateBatch",
118267             "scanFile"]
118268     },
118269     _self;
118270
118271 function _get() {
118272     _data.dbStorage = db.retrieveObject(_data.DB_CONTENT_KEY) || dbinit.Content;
118273 }
118274
118275 function _save() {
118276     db.saveObject(_data.DB_CONTENT_KEY, _data.dbStorage);
118277 }
118278
118279 function _initialize() {
118280     _get();
118281
118282     if (!_data.dbStorage)
118283         return;
118284
118285     utils.forEach(_data.dbStorage, function (content) {
118286         _data.content[content.directoryURI] = new ContentStorage(content);
118287     });
118288
118289     _data.dbStorage = _data.content;
118290     _save();
118291 }
118292
118293 _self = function () {
118294     var content;
118295
118296     // private
118297     function getType(file) {
118298         var extName, type;
118299
118300         extName = file.substr(file.lastIndexOf(".") + 1).toLowerCase();
118301
118302         switch (extName) {
118303         case "bmp":
118304         case "gif":
118305         case "jpeg":
118306         case "jpg":
118307         case "png":
118308             type = "IMAGE";
118309             break;
118310
118311         case "avi":
118312         case "mpeg":
118313         case "mpg":
118314         case "wmv":
118315         case "mp4":
118316             type = "VIDEO";
118317             break;
118318
118319         case "wav":
118320         case "mp3":
118321             type = "AUDIO";
118322             break;
118323
118324         default:
118325             type = "OTHER";
118326             break;
118327         }
118328
118329         return type;
118330     }
118331
118332     function getMimeType(file) {
118333         var mimeTypeTab = {
118334             IMAGE: "image/x-msimage",
118335             VIDEO: "video/x-msvideo",
118336             AUDIO: "audio/x-msaudio",
118337             OTHER: "other/unknown"
118338         };
118339
118340         return mimeTypeTab[getType(file)];
118341     }
118342
118343     function getTitle(file) {
118344         var title;
118345
118346         title = file.substr(0, file.lastIndexOf("."));
118347         title = title.charAt(0).toUpperCase() + title.substr(1).toLowerCase();
118348
118349         return title;
118350     }
118351
118352     function getDirectoryURI(contentURI) {
118353         return contentURI.slice(0, contentURI.lastIndexOf("/") + 1)
118354                 .replace(/file:\/\//, "");
118355     }
118356
118357     function extractProperties(entry) {
118358         var contentInitDict = {};
118359
118360         contentInitDict.editableAttributes = ["name", "title", "description",
118361                 "rating"];
118362         contentInitDict.name               = entry.name;
118363         contentInitDict.type               = getType(entry.name);
118364         contentInitDict.mimeType           = getMimeType(entry.name);
118365         contentInitDict.title              = getTitle(entry.name);
118366         contentInitDict.contentURI         = entry.fullPath ?
118367                 "file://" + entry.fullPath : entry.fullPath;
118368         contentInitDict.thumbnailURIs      = [entry.fullPath];
118369         contentInitDict.releaseDate        = entry.lastModifiedDate;
118370         contentInitDict.modifiedDate       = entry.lastModifiedDate;
118371         contentInitDict.size               = 1048576;
118372
118373         return contentInitDict;
118374     }
118375
118376     function updateContents(contents, successCallback, errorCallback) {
118377         var i, isFound = false, dir, matched = [];
118378
118379         for (i in contents) {
118380             dir = getDirectoryURI(contents[i].contentURI);
118381
118382             isFound = ((dir in _data.content) && (contents[i].contentURI in
118383                     _data.content[dir].contents));
118384
118385             if (!isFound)
118386                 break;
118387
118388             matched.push(dir);
118389         }
118390
118391         if (!isFound) {
118392             if (errorCallback) {
118393                 errorCallback(new WebAPIError(errorcode.UNKNOWN_ERR));
118394             }
118395             return;
118396         }
118397
118398         for (i in matched) {
118399             _data.content[matched[i]].contents[contents[i].contentURI] =
118400                     new ContentFactory(contents[i], true);
118401         }
118402
118403         _save();
118404
118405         if (successCallback) {
118406             successCallback();
118407         }
118408
118409         if (_data.listener !== null) {
118410             for (i in matched) {
118411                 _data.listener.oncontentupdated(new ContentFactory(_data
118412                         .content[matched[i]].contents[contents[i].contentURI],
118413                         false));
118414             }
118415         }
118416     }
118417
118418     // public
118419     function update(content) {
118420         if (!_security.update) {
118421             throw new WebAPIException(errorcode.SECURITY_ERR);
118422         }
118423
118424         t.ContentManager("update", arguments);
118425
118426         updateContents([content]);
118427     }
118428
118429     function updateBatch(contents, successCallback, errorCallback) {
118430         if (!_security.updateBatch) {
118431             throw new WebAPIException(errorcode.SECURITY_ERR);
118432         }
118433
118434         t.ContentManager("updateBatch", arguments, true);
118435
118436         window.setTimeout(function () {
118437             updateContents(contents, successCallback, errorCallback);
118438         }, 1);
118439     }
118440
118441     function getDirectories(successCallback, errorCallback) {
118442         t.ContentManager("getDirectories", arguments);
118443
118444         window.setTimeout(function () {
118445             var i, directories = [];
118446
118447             for (i in _data.content) {
118448                 directories.push(new ContentDirectory(_data.content[i]));
118449             }
118450
118451             if (directories.length === 0) {
118452                 if (errorCallback) {
118453                     errorCallback(new WebAPIError(errorcode.NOT_FOUND_ERR));
118454                 }
118455                 return;
118456             }
118457
118458             successCallback(directories);
118459         }, 1);
118460     }
118461
118462     function find(successCallback, errorCallback, directoryId, filter, sortMode,
118463             count, offset) {
118464         if (!_security.find) {
118465             throw new WebAPIException(errorcode.SECURITY_ERR);
118466         }
118467
118468         t.ContentManager("find", arguments, true);
118469
118470         window.setTimeout(function () {
118471             var i, dir, contents = [], results = [], matchedDir;
118472
118473             if (!directoryId) {
118474                 for (dir in _data.content) {
118475                     for (i in _data.content[dir].contents) {
118476                         contents.push(_data.content[dir].contents[i]);
118477                     }
118478                 }
118479             } else {
118480                 for (dir in _data.content) {
118481                     if (_data.content[dir].id === directoryId) {
118482                         matchedDir = dir;
118483                         break;
118484                     }
118485                 }
118486
118487                 if (!matchedDir) {
118488                     if (errorCallback) {
118489                         errorCallback(new WebAPIError(errorcode.UNKNOWN_ERR));
118490                     }
118491                     return;
118492                 }
118493
118494                 for (i in _data.content[matchedDir].contents) {
118495                     contents.push(_data.content[matchedDir].contents[i]);
118496                 }
118497             }
118498
118499             if (contents.length === 0) {
118500                 if (errorCallback) {
118501                     errorCallback(new WebAPIError(errorcode.UNKNOWN_ERR));
118502                 }
118503                 return;
118504             }
118505
118506             contents = tizen1_utils.query(contents, filter, sortMode, count,
118507                     offset);
118508
118509             contents.forEach(function (content) {
118510                 results.push(new ContentFactory(content, false));
118511             });
118512
118513             successCallback(results);
118514         }, 1);
118515     }
118516
118517     function scanFile(contentURI, successCallback, errorCallback) {
118518         var dir, isFound;
118519
118520         function onStatSuccess(entry) {
118521             var contentInitDict, content;
118522
118523             if (isFound) {
118524                 content = new ContentFactory(_data.content[dir]
118525                         .contents[contentURI], true);
118526             } else {
118527                 contentInitDict = extractProperties(entry);
118528                 content = new ContentFactory(contentInitDict, true);
118529                 _data.content[dir].contents[contentURI] = content;
118530             }
118531
118532             _save();
118533
118534             if (successCallback) {
118535                 successCallback(contentURI);
118536             }
118537
118538             if (_data.listener !== null) {
118539                 if (isFound) {
118540                     _data.listener.oncontentupdated(
118541                             new ContentFactory(content, false));
118542                 } else {
118543                     _data.listener.oncontentadded(
118544                             new ContentFactory(content, false));
118545                 }
118546             }
118547         }
118548
118549         function onStatError() {
118550             if (isFound) {
118551                 delete _data.content[dir].contents[contentURI];
118552                 _save();
118553
118554                 if (successCallback) {
118555                     successCallback(contentURI);
118556                 }
118557
118558                 if (_data.listener !== null) {
118559                     _data.listener.oncontentremoved(_data.content[dir]
118560                             .contents[contentURI].id);
118561                 }
118562             } else if (errorCallback) {
118563                 errorCallback(new WebAPIError(errorcode.UNKNOWN_ERR));
118564             }
118565         }
118566
118567         if (!_security.scanFile) {
118568             throw new WebAPIException(errorcode.SECURITY_ERR);
118569         }
118570
118571         t.ContentManager("scanFile", arguments);
118572
118573         window.setTimeout(function () {
118574             dir = getDirectoryURI(contentURI);
118575
118576             isFound = ((dir in _data.content) &&
118577                     (contentURI in _data.content[dir].contents));
118578
118579             dbfs.stat(contentURI.replace(/file:\/\//, ""), onStatSuccess,
118580                     onStatError);
118581         }, 1);
118582     }
118583
118584     function setChangeListener(changeCallback) {
118585         if (!_security.setChangeListener) {
118586             throw new WebAPIException(errorcode.SECURITY_ERR);
118587         }
118588
118589         t.ContentManager("setChangeListener", arguments);
118590
118591         _data.listener = changeCallback;
118592     }
118593
118594     function unsetChangeListener() {
118595         if (!_security.unsetChangeListener) {
118596             throw new WebAPIException(errorcode.SECURITY_ERR);
118597         }
118598
118599         _data.listener = null;
118600     }
118601
118602     function handleSubFeatures(subFeatures) {
118603         var i, subFeature;
118604
118605         for (subFeature in subFeatures) {
118606             for (i in _security[subFeature]) {
118607                 _security[_security[subFeature][i]] = true;
118608             }
118609         }
118610     }
118611
118612     content = {
118613         update:              update,
118614         updateBatch:         updateBatch,
118615         getDirectories:      getDirectories,
118616         find:                find,
118617         scanFile:            scanFile,
118618         setChangeListener:   setChangeListener,
118619         unsetChangeListener: unsetChangeListener,
118620         handleSubFeatures:   handleSubFeatures
118621     };
118622
118623     return content;
118624 };
118625
118626 ContentDirectoryInternal = function (contentDirectoryInitDict) {
118627     this.id           = contentDirectoryInitDict.id || null;
118628     this.directoryURI = contentDirectoryInitDict.directoryURI || null;
118629     this.title        = contentDirectoryInitDict.title || "";
118630     this.storageType  = contentDirectoryInitDict.storageType || "INTERNAL";
118631     this.modifiedDate = contentDirectoryInitDict.modifiedDate ?
118632             new Date(contentDirectoryInitDict.modifiedDate) : null;
118633 };
118634
118635 ContentDirectory = function (contentDirectoryInitDict) {
118636     var contentDirectory = {};
118637
118638     contentDirectory.id           = contentDirectoryInitDict.id || null;
118639     contentDirectory.directoryURI = contentDirectoryInitDict.directoryURI || null;
118640     contentDirectory.title        = contentDirectoryInitDict.title || "";
118641     contentDirectory.storageType  = contentDirectoryInitDict.storageType || "INTERNAL";
118642     contentDirectory.modifiedDate = contentDirectoryInitDict.modifiedDate ?
118643             new Date(contentDirectoryInitDict.modifiedDate) : null;
118644
118645     this.__defineGetter__("id", function () {
118646         return contentDirectory.id;
118647     });
118648
118649     this.__defineGetter__("directoryURI", function () {
118650         return contentDirectory.directoryURI;
118651     });
118652
118653     this.__defineGetter__("title", function () {
118654         return contentDirectory.title;
118655     });
118656
118657     this.__defineGetter__("storageType", function () {
118658         return contentDirectory.storageType;
118659     });
118660
118661     this.__defineGetter__("modifiedDate", function () {
118662         return contentDirectory.modifiedDate;
118663     });
118664 };
118665
118666 ContentInternal = function (contentInitDict) {
118667     this.editableAttributes = contentInitDict.editableAttributes || [];
118668     this.id                 = contentInitDict.id || Math.uuid(null, 16);
118669     this.type               = contentInitDict.type || "IMAGE";
118670     this.mimeType           = contentInitDict.mimeType || "";
118671     this.title              = contentInitDict.title || "";
118672     this.contentURI         = contentInitDict.contentURI || "";
118673     this.thumbnailURIs      = contentInitDict.thumbnailURIs || null;
118674     this.releaseDate        = contentInitDict.releaseDate ?
118675             new Date(contentInitDict.releaseDate) : null;
118676     this.modifiedDate       = contentInitDict.modifiedDate ?
118677             new Date(contentInitDict.modifiedDate) : null;
118678     this.size               = contentInitDict.size || 0;
118679     this.name               = contentInitDict.name || "";
118680     this.description        = contentInitDict.description || null;
118681     this.rating             = contentInitDict.rating || 0;
118682 };
118683
118684 Content = function (contentInitDict) {
118685     var content = {};
118686
118687     content.editableAttributes = contentInitDict.editableAttributes || [];
118688     content.id                 = contentInitDict.id || Math.uuid(null, 16);
118689     content.name               = contentInitDict.name || "";
118690     content.type               = contentInitDict.type || "IMAGE";
118691     content.mimeType           = contentInitDict.mimeType || "";
118692     content.title              = contentInitDict.title || "";
118693     content.contentURI         = contentInitDict.contentURI || "";
118694     content.thumbnailURIs      = contentInitDict.thumbnailURIs || null;
118695     content.releaseDate        = contentInitDict.releaseDate ?
118696             new Date(contentInitDict.releaseDate) : null;
118697     content.modifiedDate       = contentInitDict.modifiedDate ?
118698             new Date(contentInitDict.modifiedDate) : null;
118699     content.size               = contentInitDict.size || 0;
118700     content.description        = contentInitDict.description || null;
118701     content.rating             = contentInitDict.rating || 0;
118702
118703     this.__defineGetter__("editableAttributes", function () {
118704         return content.editableAttributes;
118705     });
118706
118707     this.__defineGetter__("id", function () {
118708         return content.id;
118709     });
118710
118711     this.__defineGetter__("name", function () {
118712         return content.name;
118713     });
118714     this.__defineSetter__("name", function (val) {
118715         try {
118716             content.name = t.DOMString(val);
118717         } catch (e) {
118718         }
118719     });
118720
118721     this.__defineGetter__("type", function () {
118722         return content.type;
118723     });
118724
118725     this.__defineGetter__("mimeType", function () {
118726         return content.mimeType;
118727     });
118728
118729     this.__defineGetter__("title", function () {
118730         return content.title;
118731     });
118732
118733     this.__defineGetter__("contentURI", function () {
118734         return content.contentURI;
118735     });
118736
118737     this.__defineGetter__("thumbnailURIs", function () {
118738         return content.thumbnailURIs;
118739     });
118740
118741     this.__defineGetter__("releaseDate", function () {
118742         return content.releaseDate;
118743     });
118744
118745     this.__defineGetter__("modifiedDate", function () {
118746         return content.modifiedDate;
118747     });
118748
118749     this.__defineGetter__("size", function () {
118750         return content.size;
118751     });
118752
118753     this.__defineGetter__("description", function () {
118754         return content.description;
118755     });
118756     this.__defineSetter__("description", function (val) {
118757         try {
118758             content.description = t.DOMString(val, "?");
118759         } catch (e) {
118760         }
118761     });
118762
118763     this.__defineGetter__("rating", function () {
118764         return content.rating;
118765     });
118766     this.__defineSetter__("rating", function (val) {
118767         try {
118768             val = t.unsigned_long(val);
118769             if ((val < 0) || (val > 10))
118770                 return;
118771             content.rating = val;
118772         } catch (e) {
118773         }
118774     });
118775 };
118776
118777 VideoContentInternal = function (videoContentInitDict) {
118778     ContentInternal.call(this, videoContentInitDict);
118779
118780     this.album       = videoContentInitDict.album || null;
118781     this.artists     = videoContentInitDict.artists || null;
118782     this.duration    = videoContentInitDict.duration || 0;
118783     this.width       = videoContentInitDict.width || 0;
118784     this.height      = videoContentInitDict.height || 0;
118785     this.geolocation = null;
118786
118787     if (videoContentInitDict.geolocation) {
118788         this.geolocation = new SimpleCoordinates(
118789                 videoContentInitDict.geolocation.latitude || null,
118790                 videoContentInitDict.geolocation.longitude || null);
118791     }
118792 };
118793
118794 VideoContent = function (videoContentInitDict) {
118795     var videoContent = {};
118796
118797     Content.call(this, videoContentInitDict);
118798
118799     videoContent.album       = videoContentInitDict.album || null;
118800     videoContent.artists     = videoContentInitDict.artists || null;
118801     videoContent.duration    = videoContentInitDict.duration || 0;
118802     videoContent.width       = videoContentInitDict.width || 0;
118803     videoContent.height      = videoContentInitDict.height || 0;
118804     videoContent.geolocation = null;
118805
118806     if (videoContentInitDict.geolocation) {
118807         videoContent.geolocation = new SimpleCoordinates(
118808                 videoContentInitDict.geolocation.latitude,
118809                 videoContentInitDict.geolocation.longitude);
118810     }
118811
118812     this.__defineGetter__("geolocation", function () {
118813         return videoContent.geolocation;
118814     });
118815     this.__defineSetter__("geolocation", function (val) {
118816         try {
118817             videoContent.geolocation = t.SimpleCoordinates(val, "?");
118818         } catch (e) {
118819         }
118820     });
118821
118822     this.__defineGetter__("album", function () {
118823         return videoContent.album;
118824     });
118825
118826     this.__defineGetter__("artists", function () {
118827         return videoContent.artists;
118828     });
118829
118830     this.__defineGetter__("duration", function () {
118831         return videoContent.duration;
118832     });
118833
118834     this.__defineGetter__("width", function () {
118835         return videoContent.width;
118836     });
118837
118838     this.__defineGetter__("height", function () {
118839         return videoContent.height;
118840     });
118841 };
118842
118843 AudioContentInternal = function (audioContentInitDict) {
118844     ContentInternal.call(this, audioContentInitDict);
118845
118846     this.album       = audioContentInitDict.album || null;
118847     this.genres      = audioContentInitDict.genres || null;
118848     this.artists     = audioContentInitDict.artists || null;
118849     this.composers   = audioContentInitDict.composers || null;
118850     this.lyrics      = audioContentInitDict.lyrics ?
118851             new AudioContentLyrics(audioContentInitDict.lyrics) : null;
118852     this.copyright   = audioContentInitDict.copyright || null;
118853     this.bitrate     = audioContentInitDict.bitrate || 0;
118854     this.trackNumber = audioContentInitDict.trackNumber || null;
118855     this.duration    = audioContentInitDict.duration || 0;
118856 };
118857
118858 AudioContentLyrics = function (lyrics) {
118859     var audioContentLyrics = {};
118860
118861     audioContentLyrics.type       = lyrics.type;
118862     audioContentLyrics.texts      = lyrics.texts;
118863     audioContentLyrics.timestamps = (lyrics.type === "SYNCHRONIZED") ?
118864             lyrics.timestamps : undefined;
118865
118866     this.__defineGetter__("type", function () {
118867         return audioContentLyrics.type;
118868     });
118869
118870     this.__defineGetter__("texts", function () {
118871         return audioContentLyrics.texts;
118872     });
118873
118874     this.__defineGetter__("timestamps", function () {
118875         return audioContentLyrics.timestamps;
118876     });
118877 };
118878
118879 AudioContent = function (audioContentInitDict) {
118880     var audioContent = {};
118881
118882     Content.call(this, audioContentInitDict);
118883
118884     audioContent.album       = audioContentInitDict.album || null;
118885     audioContent.genres      = audioContentInitDict.genres || null;
118886     audioContent.artists     = audioContentInitDict.artists || null;
118887     audioContent.composers   = audioContentInitDict.composers || null;
118888     audioContent.lyrics      = audioContentInitDict.lyrics ?
118889             new AudioContentLyrics(audioContentInitDict.lyrics) : null;
118890     audioContent.copyright   = audioContentInitDict.copyright || null;
118891     audioContent.bitrate     = audioContentInitDict.bitrate || 0;
118892     audioContent.trackNumber = audioContentInitDict.trackNumber || null;
118893     audioContent.duration    = audioContentInitDict.duration || 0;
118894
118895     this.__defineGetter__("album", function () {
118896         return audioContent.album;
118897     });
118898
118899     this.__defineGetter__("genres", function () {
118900         return audioContent.genres;
118901     });
118902
118903     this.__defineGetter__("artists", function () {
118904         return audioContent.artists;
118905     });
118906
118907     this.__defineGetter__("composers", function () {
118908         return audioContent.composers;
118909     });
118910
118911     this.__defineGetter__("lyrics", function () {
118912         return audioContent.lyrics;
118913     });
118914
118915     this.__defineGetter__("copyright", function () {
118916         return audioContent.copyright;
118917     });
118918
118919     this.__defineGetter__("bitrate", function () {
118920         return audioContent.bitrate;
118921     });
118922
118923     this.__defineGetter__("trackNumber", function () {
118924         return audioContent.trackNumber;
118925     });
118926
118927     this.__defineGetter__("duration", function () {
118928         return audioContent.duration;
118929     });
118930 };
118931
118932 ImageContentInternal = function (imageContentInitDict) {
118933     ContentInternal.call(this, imageContentInitDict);
118934
118935     this.geolocation = null;
118936     this.width       = imageContentInitDict.width || 0;
118937     this.height      = imageContentInitDict.height || 0;
118938     this.orientation = imageContentInitDict.orientation || "NORMAL";
118939
118940     if (imageContentInitDict.geolocation) {
118941         this.geolocation = new SimpleCoordinates(
118942                 imageContentInitDict.geolocation.latitude,
118943                 imageContentInitDict.geolocation.longitude);
118944     }
118945 };
118946
118947 ImageContent = function (imageContentInitDict) {
118948     var imageContent = {};
118949
118950     Content.call(this, imageContentInitDict);
118951
118952     imageContent.width       = imageContentInitDict.width || 0;
118953     imageContent.height      = imageContentInitDict.height || 0;
118954     imageContent.geolocation = null;
118955     imageContent.orientation = imageContentInitDict.orientation || "NORMAL";
118956
118957     if (imageContentInitDict.geolocation) {
118958         imageContent.geolocation = new SimpleCoordinates(
118959                 imageContentInitDict.geolocation.latitude,
118960                 imageContentInitDict.geolocation.longitude);
118961     }
118962
118963     this.__defineGetter__("geolocation", function () {
118964         return imageContent.geolocation;
118965     });
118966     this.__defineSetter__("geolocation", function (val) {
118967         try {
118968             imageContent.geolocation = t.SimpleCoordinates(val, "?");
118969         } catch (e) {
118970         }
118971     });
118972
118973     this.__defineGetter__("width", function () {
118974         return imageContent.width;
118975     });
118976
118977     this.__defineGetter__("height", function () {
118978         return imageContent.height;
118979     });
118980
118981     this.__defineGetter__("orientation", function () {
118982         return imageContent.orientation;
118983     });
118984     this.__defineSetter__("orientation", function (val) {
118985         try {
118986             imageContent.orientation = t.ImageContentOrientation(val);
118987         } catch (e) {
118988         }
118989     });
118990 };
118991
118992 ContentFactory = function (contentInitDict, isInternal) {
118993     var ContentType;
118994
118995     switch (contentInitDict.type) {
118996     case "IMAGE":
118997         ContentType = isInternal ? ImageContentInternal : ImageContent;
118998         break;
118999
119000     case "VIDEO":
119001         ContentType = isInternal ? VideoContentInternal : VideoContent;
119002         break;
119003
119004     case "AUDIO":
119005         ContentType = isInternal ? AudioContentInternal : AudioContent;
119006         break;
119007
119008     default:
119009         ContentType = isInternal ? ContentInternal : Content;
119010         break;
119011     }
119012
119013     return new ContentType(contentInitDict);
119014 };
119015
119016 ContentStorage = function (content) {
119017     var i;
119018
119019     ContentDirectoryInternal.call(this, content);
119020     this.contents = {};
119021
119022     for (i in content.contents) {
119023         this.contents[i] = new ContentFactory(content.contents[i], true);
119024     }
119025 };
119026
119027 _initialize();
119028
119029 module.exports = _self;
119030
119031 });
119032 define('ripple/platform/tizen/2.0/GeoCircleBounds', function (require, exports, module) {
119033 /*
119034  *  Copyright 2012 Intel Corporation.
119035  *
119036  * Licensed under the Apache License, Version 2.0 (the "License");
119037  * you may not use this file except in compliance with the License.
119038  * You may obtain a copy of the License at
119039  *
119040  * http://www.apache.org/licenses/LICENSE-2.0
119041  *
119042  * Unless required by applicable law or agreed to in writing, software
119043  * distributed under the License is distributed on an "AS IS" BASIS,
119044  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
119045  * See the License for the specific language governing permissions and
119046  * limitations under the License.
119047  */
119048
119049 module.exports = function (_center, _radius) {
119050     var center, radius;
119051     center = _center || null;
119052     radius = _radius || 0;
119053
119054     this.__defineGetter__("center", function () {
119055         return center;
119056     });
119057
119058     this.__defineGetter__("radius", function () {
119059         return radius;
119060     });
119061 };
119062
119063 });
119064 define('ripple/platform/tizen/2.0/BluetoothServiceHandler', function (require, exports, module) {
119065 /*
119066  *  Copyright 2013 Intel Corporation
119067  *
119068  * Licensed under the Apache License, Version 2.0 (the "License");
119069  * you may not use this file except in compliance with the License.
119070  * You may obtain a copy of the License at
119071  *
119072  * http://www.apache.org/licenses/LICENSE-2.0
119073  *
119074  * Unless required by applicable law or agreed to in writing, software
119075  * distributed under the License is distributed on an "AS IS" BASIS,
119076  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
119077  * See the License for the specific language governing permissions and
119078  * limitations under the License.
119079  */
119080
119081 var event = require('ripple/event'),
119082     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
119083     t = require('ripple/platform/tizen/2.0/typecast'),
119084     WebAPIException = require('ripple/platform/tizen/2.0/WebAPIException'),
119085     BluetoothServiceHandler,
119086     _security;
119087
119088 BluetoothServiceHandler = function (prop) {
119089     var bluetoothServiceHandler = {};
119090
119091     _security = prop.metaData;
119092
119093     bluetoothServiceHandler.uuid        = prop.uuid || "";
119094     bluetoothServiceHandler.name        = prop.name || "";
119095     bluetoothServiceHandler.isConnected = prop.isConnected || false;
119096     bluetoothServiceHandler.onconnect   = null;
119097
119098     this.__defineGetter__("uuid", function () {
119099         return bluetoothServiceHandler.uuid;
119100     });
119101
119102     this.__defineGetter__("name", function () {
119103         return bluetoothServiceHandler.name;
119104     });
119105
119106     this.__defineGetter__("isConnected", function () {
119107         return bluetoothServiceHandler.isConnected;
119108     });
119109
119110     this.__defineGetter__("onconnect", function () {
119111         return bluetoothServiceHandler.onconnect;
119112     });
119113     this.__defineSetter__("onconnect", function (val) {
119114         try {
119115             bluetoothServiceHandler.onconnect =
119116                     t.BluetoothSocketSuccessCallback(val, "?");
119117         } catch (e) {
119118         }
119119     });
119120
119121     this.unregister = function (successCallback, errorCallback) {
119122         if (!_security.unregister) {
119123             throw new WebAPIException(errorcode.SECURITY_ERR);
119124         }
119125
119126         t.BluetoothServiceHandler("unregister", arguments);
119127
119128         event.trigger("bt-unregister-service", [bluetoothServiceHandler.uuid,
119129                 successCallback, errorCallback]);
119130     };
119131 };
119132
119133 module.exports = BluetoothServiceHandler;
119134
119135 });
119136 define('ripple/platform/tizen/2.0/GeometryFilter', function (require, exports, module) {
119137 /*
119138  *  Copyright 2012 Intel Corporation.
119139  *
119140  * Licensed under the Apache License, Version 2.0 (the "License");
119141  * you may not use this file except in compliance with the License.
119142  * You may obtain a copy of the License at
119143  *
119144  * http://www.apache.org/licenses/LICENSE-2.0
119145  *
119146  * Unless required by applicable law or agreed to in writing, software
119147  * distributed under the License is distributed on an "AS IS" BASIS,
119148  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
119149  * See the License for the specific language governing permissions and
119150  * limitations under the License.
119151  */
119152
119153 module.exports = function (criteria, geometry) {
119154     var _self;
119155
119156     _self = {
119157         criteria: criteria,
119158         geometry: geometry
119159     };
119160
119161     return _self;
119162 };
119163
119164 });
119165 define('ripple/platform/tizen/2.0/bookmark', function (require, exports, module) {
119166 /*
119167  *  Copyright 2013 Intel Corporation.
119168  *
119169  * Licensed under the Apache License, Version 2.0 (the "License");
119170  * you may not use this file except in compliance with the License.
119171  * You may obtain a copy of the License at
119172  *
119173  * http://www.apache.org/licenses/LICENSE-2.0
119174  *
119175  * Unless required by applicable law or agreed to in writing, software
119176  * distributed under the License is distributed on an "AS IS" BASIS,
119177  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
119178  * See the License for the specific language governing permissions and
119179  * limitations under the License.
119180  */
119181
119182 var db = require('ripple/db'),
119183     utils = require('ripple/utils'),
119184     t = require('ripple/platform/tizen/2.0/typecast'),
119185     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
119186     WebAPIException = require('ripple/platform/tizen/2.0/WebAPIException'),
119187     BookmarkFolder = require('ripple/platform/tizen/2.0/BookmarkFolder'),
119188     BookmarkItem = require('ripple/platform/tizen/2.0/BookmarkItem'),
119189     BookmarkExternal,
119190     BookmarkInternal,
119191     BookmarkStorage,
119192     _data = {
119193         DB_BOOKMARK_KEY: "tizen1-bookmark",
119194         bookmarks:       [],
119195         dbStorage:       []
119196     },
119197     _security = {
119198         "http://tizen.org/privilege/bookmark.read": ["get"],
119199         "http://tizen.org/privilege/bookmark.write": ["add", "remove"]
119200     },
119201     _self;
119202
119203 function _get() {
119204     _data.dbStorage = db.retrieveObject(_data.DB_BOOKMARK_KEY) || [];
119205 }
119206
119207 function _save() {
119208     db.saveObject(_data.DB_BOOKMARK_KEY, _data.dbStorage);
119209 }
119210
119211 function _initialize() {
119212     _get();
119213
119214     utils.forEach(_data.dbStorage, function (bookmark) {
119215         _data.bookmarks.push(new BookmarkInternal(bookmark, null));
119216     });
119217 }
119218
119219 function _persist() {
119220     _data.dbStorage = [];
119221
119222     utils.forEach(_data.bookmarks, function (bookmark) {
119223         _data.dbStorage.push(new BookmarkStorage(bookmark));
119224     });
119225
119226     _save();
119227 }
119228
119229 function _isFolder(bookmark) {
119230     return !bookmark.url;
119231 }
119232
119233 function _isExternal(bookmark) {
119234     return !("children" in bookmark);
119235 }
119236
119237 function _getChildren(bookmark, BookmarkType, parent) {
119238     var i, children = [];
119239
119240     if (!_isExternal(bookmark)) {
119241         for (i in bookmark.children) {
119242             children.push(new BookmarkType(bookmark.children[i], parent));
119243         }
119244     }
119245
119246     return children;
119247 }
119248
119249 _self = function () {
119250     var bookmark;
119251
119252     // private
119253     /*
119254      * map
119255      *    Map the external bookmark to the internal one in the tree
119256      *
119257      * bookmarkExternal
119258      *    External bookmark Object
119259      *
119260      * callback
119261      *    callback(index, peers). Optional.
119262      *
119263      *          Root    Bookmark        Not Found
119264      * ------------------------------------------
119265      *  index   0       index           -1
119266      *  peers   null    peers           null
119267      *
119268      * Return   null    peers[index]    undefined
119269      */
119270
119271     function map(bookmarkExternal, callback) {
119272         var trace = [], it, i, peers = null;
119273
119274         if (!bookmarkExternal) {
119275             if (callback) {
119276                 callback(0, null);
119277             }
119278             return null;
119279         }
119280
119281         for (it = bookmarkExternal; it; it = it.parent) {
119282             trace.push(it);
119283         }
119284
119285         for (it = _data.bookmarks; trace.length !== 0; it = it[i].children) {
119286             bookmarkExternal = trace.pop();
119287             peers = null;
119288
119289             if (it.length === 0)
119290                 break;
119291
119292             for (i in it) {
119293                 if (it[i].external === bookmarkExternal) {
119294                     peers = it;
119295                     break;
119296                 }
119297             }
119298         }
119299
119300         if (callback) {
119301             return callback((peers !== null) ? i : -1, peers);
119302         }
119303
119304         return (peers !== null) ? peers[i] : undefined;
119305     }
119306
119307     function traverse(bookmarks, trace, level) {
119308         for (var i in bookmarks) {
119309             trace.push(bookmarks[i].external);
119310             if ((level !== 0) && bookmarks[i].children) {
119311                 traverse(bookmarks[i].children, trace, --level);
119312             }
119313         }
119314     }
119315
119316     function findUrl(bookmarks, url) {
119317         var i, isFound = false;
119318
119319         for (i in bookmarks) {
119320             if (_isFolder(bookmarks[i])) {
119321                 isFound = findUrl(bookmarks[i].children, url);
119322             } else {
119323                 isFound = (bookmarks[i].url === url);
119324             }
119325
119326             if (isFound)
119327                 break;
119328         }
119329
119330         return isFound;
119331     }
119332
119333     function isExisting(bookmark, peers) {
119334         var i;
119335
119336         if (!_isFolder(bookmark)) {
119337             return findUrl(_data.bookmarks, bookmark.url);
119338         }
119339
119340         for (i in peers) {
119341             if (_isFolder(peers[i]) && (peers[i].title === bookmark.title)) {
119342                 return true;
119343             }
119344         }
119345
119346         return false;
119347     }
119348
119349     // public
119350     function get(parentFolder, recursive) {
119351         var bookmarks = [], parent, peers;
119352
119353         if (!_security.get) {
119354             throw new WebAPIException(errorcode.SECURITY_ERR);
119355         }
119356
119357         t.BookmarkManager("get", arguments);
119358
119359         parent = map(parentFolder);
119360         if ((parent === undefined) || (parent && !_isFolder(parent))) {
119361             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
119362         }
119363         peers = parent ? parent.children : _data.bookmarks;
119364         traverse(peers, bookmarks, recursive ? -1 : 0);
119365
119366         return bookmarks;
119367     }
119368
119369     function add(bookmark, parentFolder) {
119370         var parent, peers;
119371
119372         if (!_security.add) {
119373             throw new WebAPIException(errorcode.SECURITY_ERR);
119374         }
119375
119376         t.BookmarkManager("add", arguments);
119377
119378         parent = map(parentFolder);
119379         if ((parent === undefined) || (parent && !_isFolder(parent))) {
119380             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
119381         }
119382         peers = parent ? parent.children : _data.bookmarks;
119383         if (isExisting(bookmark, peers)) {
119384             throw new WebAPIException(errorcode.INVALID_VALUES_ERR);
119385         }
119386
119387         peers.push(new BookmarkInternal(bookmark));
119388
119389         _persist();
119390
119391         bookmark.__defineGetter__("parent", function () {
119392             return parent ? parent.external : null;
119393         });
119394     }
119395
119396     function remove(bookmark) {
119397         if (!_security.remove) {
119398             throw new WebAPIException(errorcode.SECURITY_ERR);
119399         }
119400
119401         t.BookmarkManager("remove", arguments);
119402
119403         if (!bookmark) {
119404             _data.bookmarks = [];
119405         } else {
119406             map(bookmark, function (index, peers) {
119407                 if (index === -1) {
119408                     throw new WebAPIException(errorcode.NOT_FOUND_ERR);
119409                 }
119410                 peers.splice(index, 1);
119411             });
119412
119413             bookmark.__defineGetter__("parent", function () {
119414                 return undefined;
119415             });
119416         }
119417
119418         _persist();
119419     }
119420
119421     function handleSubFeatures(subFeatures) {
119422         var i, subFeature;
119423
119424         for (subFeature in subFeatures) {
119425             for (i in _security[subFeature]) {
119426                 _security[_security[subFeature][i]] = true;
119427             }
119428         }
119429     }
119430
119431     bookmark = {
119432         get:               get,
119433         add:               add,
119434         remove:            remove,
119435         handleSubFeatures: handleSubFeatures
119436     };
119437
119438     return bookmark;
119439 };
119440
119441 /*
119442  * BookmarkInternal     BookmarkStorage     BookmarkExternal
119443  * ---------------------------------------------------------
119444  * title                title               title
119445  * url                  url                 url/-
119446  * children             children            -
119447  * external             -                   -
119448  * -                    -                   parent
119449  */
119450
119451 BookmarkInternal = function (bookmark, parent) {
119452     this.title    = bookmark.title;
119453     this.url      = _isFolder(bookmark) ? null : bookmark.url;
119454     this.children = _isFolder(bookmark) ?
119455         _getChildren(bookmark, BookmarkInternal, this) : null;
119456     this.external = _isExternal(bookmark) ? bookmark :
119457         new BookmarkExternal(bookmark, parent);
119458 };
119459
119460 BookmarkStorage = function (bookmark) {
119461     this.title    = bookmark.title;
119462     this.url      = _isFolder(bookmark) ? null : bookmark.url;
119463     this.children = _isFolder(bookmark) ?
119464         _getChildren(bookmark, BookmarkStorage) : null;
119465 };
119466
119467 BookmarkExternal = function (bookmark, parent) {
119468     var self;
119469
119470     if (_isFolder(bookmark)) {
119471         self = new BookmarkFolder(bookmark.title);
119472     } else {
119473         self = new BookmarkItem(bookmark.title, bookmark.url);
119474     }
119475
119476     self.__defineGetter__("parent", function () {
119477         return parent ? parent.external : null;
119478     });
119479
119480     return self;
119481 };
119482
119483 _initialize();
119484
119485 module.exports = _self;
119486
119487 });
119488 define('ripple/platform/tizen/2.0/CalendarItem', function (require, exports, module) {
119489 /*
119490  *  Copyright 2013 Intel Corporation.
119491  *
119492  * Licensed under the Apache License, Version 2.0 (the "License");
119493  * you may not use this file except in compliance with the License.
119494  * You may obtain a copy of the License at
119495  *
119496  * http://www.apache.org/licenses/LICENSE-2.0
119497  *
119498  * Unless required by applicable law or agreed to in writing, software
119499  * distributed under the License is distributed on an "AS IS" BASIS,
119500  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
119501  * See the License for the specific language governing permissions and
119502  * limitations under the License.
119503  */
119504
119505 var t = require('ripple/platform/tizen/2.0/typecast'),
119506     tizen1_utils = require('ripple/platform/tizen/2.0/tizen1_utils'),
119507     typedef = require('ripple/platform/tizen/2.0/typedef'),
119508     CalendarItem;
119509
119510 CalendarItem = function (itemInitDict) {
119511     var calendarItem = {}, attr;
119512
119513     // private
119514     function toDigit(number) {
119515         return ((number >= 10) ? "" : "0") + number;
119516     }
119517
119518     // public
119519     function convertToString(format) {
119520         var header = "BEGIN:VCALENDAR\r\nPRODID:-//Tizen.org//Tizen Calendar//EN\r\nVERSION:2.0\r\n",
119521             end = "END:VCALENDAR\r\n", str = "", pri, i, date, before, y, m, d,
119522             hh, mm, ss, dateStart = "", dateEnd = "";
119523
119524         t.CalendarItem("convertToString", arguments);
119525
119526         //TODO: vcalendar 1.0 doesn't support yet
119527         if (format === "VCALENDAR_10") {
119528             return;
119529         }
119530
119531         str = header + "BEGIN:#TYPE#\r\n";
119532
119533         if (this.isAllDay) {
119534             if (this.startDate) {
119535                 date = this.startDate;
119536                 y = date.getFullYear();
119537                 m = toDigit(date.getMonth() + 1);
119538                 d = toDigit(date.getDate());
119539                 str += "DTSTART;VALUE=DATE:" + y + m + d + "\r\n";
119540                 dateStart = "" + y + m + d + "T000000Z";
119541                 if (this.duration) {
119542                     date = date.addDuration(this.duration);
119543                     y = date.getFullYear();
119544                     m = toDigit(date.getMonth() + 1);
119545                     d = toDigit(date.getDate());
119546                     str += "DTEND;VALUE=DATE:" + y + m + d + "\r\n";
119547                     dateEnd = "" + y + m + d + "T000000Z";
119548                 }
119549             }
119550         } else {
119551             if (this.startDate) {
119552                 date = this.startDate;
119553                 y = date.getFullYear();
119554                 m = toDigit(date.getMonth() + 1);
119555                 d = toDigit(date.getDate());
119556                 hh = toDigit(date.getHours());
119557                 mm = toDigit(date.getMinutes());
119558                 ss = toDigit(date.getSeconds());
119559                 str += "DTSTART:" + y + m + d + "T" + hh + mm + ss + "Z" + "\r\n";
119560                 dateStart = "" + y + m + d + "T" + hh + mm + ss + "Z";
119561                 if (this.duration && this.duration.length && this.duration.unit) {
119562                     date = date.addDuration(this.duration);
119563                     y = date.getFullYear();
119564                     m = toDigit(date.getMonth() + 1);
119565                     d = toDigit(date.getDate());
119566                     hh = toDigit(date.getHours());
119567                     mm = toDigit(date.getMinutes());
119568                     ss = toDigit(date.getSeconds());
119569                     str += "DTEND:" + y + m + d + "T" + hh + mm + ss + "Z" + "\r\n";
119570                     dateEnd = "" + y + m + d + "T" + hh + mm + ss + "Z";
119571                 }
119572             }
119573         }
119574
119575         if (this.description) {
119576             str += "DESCRIPTION:" + this.description + "\r\n";
119577         }
119578         if (this.summary) {
119579             str += "SUMMARY:" + this.summary + "\r\n";
119580         }
119581         if (this.location) {
119582             str += "LOCATION:" + this.location + "\r\n";
119583         }
119584         if (this.geolocation) {
119585             // Don't need to check latitude and longitude due to they are mandatory attributes
119586             str += "GEO:" + this.geolocation.latitude + "," + this.geolocation.longitude + "\r\n";
119587         }
119588         if (this.organizer) {
119589             str += "ORGANIZER:" + this.organizer + "\r\n";
119590         }
119591         if (this.visibility) {
119592             str += "CLASS:" + this.visibility + "\r\n";
119593         }
119594         if (this.status) {
119595             str += "STATUS:" + this.status + "\r\n";
119596         }
119597         if (this.priority) {
119598             switch (this.priority) {
119599             case "HIGH":
119600                 pri = 2;
119601                 break;
119602             case "MEDIUM":
119603                 pri = 5;
119604                 break;
119605             case "LOW":
119606                 pri = 7;
119607                 break;
119608             }
119609             str += "PRIORITY:" + pri + "\r\n";
119610         }
119611         if (tizen1_utils.isValidArray(this.alarms)) {
119612             for (i = 0; i < this.alarms.length; i++) {
119613                 str += "BEGIN:VALARM\r\n";
119614                 // Don't need to check this.alarms[i].method due to it is a mandatory attribute
119615                 str += "ACTION:" + this.alarms[i].method + "\r\n";
119616                 if (this.alarms[i].description) {
119617                     str += "DESCRIPTION:" + this.alarms[i].description + "\r\n";
119618                 } else {
119619                     // description property MUST included if action is DISPLAY (RFC5545 3.6.6)
119620                     str += "DESCRIPTION:This is a reminder\r\n";
119621                 }
119622                 if (this.alarms[i].absoluteDate) {
119623                     date = this.alarms[i].absoluteDate;
119624                     y = date.getFullYear();
119625                     m = toDigit(date.getMonth() + 1);
119626                     d = toDigit(date.getDate());
119627                     hh = toDigit(date.getHours());
119628                     mm = toDigit(date.getMinutes());
119629                     ss = toDigit(date.getSeconds());
119630                     str += "TRIGGER;VALUE=DATE-TIME:" + y + m + d + "T" + hh + mm + ss + "Z" + "\r\n";
119631                 } else {
119632                     //it must be included before attribute
119633                     before = this.alarms[i].before;
119634                     switch (before.unit) {
119635                     case "DAYS":
119636                         str += "TRIGGER:-P" + before.length + "D" + "\r\n";
119637                         break;
119638                     case "HOURS":
119639                         str += "TRIGGER:-P0DT" + before.length + "H0M0S" + "\r\n";
119640                         break;
119641                     case "MINS":
119642                         str += "TRIGGER:-P0DT0H" + before.length + "M0S" + "\r\n";
119643                         break;
119644                     case "SECS":
119645                         str += "TRIGGER:-P0DT0H0M" + before.length + "S" + "\r\n";
119646                         break;
119647                     }
119648                 }
119649                 str += "END:VALARM\r\n";
119650             }
119651         }
119652         if (tizen1_utils.isValidArray(this.categories)) {
119653             str += "CATEGORIES:";
119654             for (i = 0; i < this.categories.length; i++) {
119655                 str += this.categories[i] + ",";
119656             }
119657             str = str.slice(0, -1);
119658             str += "\r\n";
119659         }
119660         if (tizen1_utils.isValidArray(this.attendees)) {
119661             for (i = 0; i < this.attendees.length; i++) {
119662                 //TODO: basic implementation
119663                 str += "ATTENDEE:mailto:" + this.attendees[i].uri + "\r\n";
119664             }
119665         }
119666
119667         if ((dateStart !== "") && (dateEnd !== "")) {
119668             str += "#AVAILABILITY#:" + dateStart + "/" + dateEnd + "\r\n";
119669         }
119670
119671         str += "#ENDDATE##RECURRENCERULE#";
119672         str += "#DUEDATE##COMPLETEDDATE##PROGRESS#";
119673         str += "END:#TYPE#\r\n" + end;
119674
119675         return str;
119676     }
119677
119678     calendarItem.description = "";
119679     calendarItem.summary     = "";
119680     calendarItem.isAllDay    = false;
119681     calendarItem.startDate   = null;
119682     calendarItem.duration    = null;
119683     calendarItem.location    = "";
119684     calendarItem.geolocation = null;
119685     calendarItem.organizer   = "";
119686     calendarItem.visibility  = "PUBLIC";
119687     calendarItem.status      = "TENTATIVE";
119688     calendarItem.priority    = "LOW";
119689     calendarItem.alarms      = [];
119690     calendarItem.categories  = [];
119691     calendarItem.attendees   = [];
119692
119693     if (itemInitDict) {
119694         for (attr in itemInitDict) {
119695             if (!(attr in typedef.CalendarItemInit))
119696                 continue;
119697
119698             switch (attr) {
119699             case "alarms":
119700                 calendarItem.alarms = t.CalendarAlarm(itemInitDict.alarms,
119701                         "[]+");
119702                 break;
119703
119704             case "categories":
119705                 calendarItem.categories = t.DOMString(itemInitDict.categories,
119706                         "[]+");
119707                 break;
119708
119709             case "attendees":
119710                 calendarItem.attendees = t.CalendarAttendee(
119711                         itemInitDict.attendees, "[]+");
119712                 break;
119713
119714             default:
119715                 calendarItem[attr] = itemInitDict[attr];
119716                 break;
119717             }
119718         }
119719     }
119720
119721     this.__defineGetter__("id", function () {
119722         return null;
119723     });
119724
119725     this.__defineGetter__("calendarId", function () {
119726         return null;
119727     });
119728
119729     this.__defineGetter__("lastModificationDate", function () {
119730         return null;
119731     });
119732
119733     this.__defineGetter__("description", function () {
119734         return calendarItem.description;
119735     });
119736     this.__defineSetter__("description", function (val) {
119737         try {
119738             calendarItem.description = t.DOMString(val, "?");
119739         } catch (e) {
119740         }
119741     });
119742
119743     this.__defineGetter__("summary", function () {
119744         return calendarItem.summary;
119745     });
119746     this.__defineSetter__("summary", function (val) {
119747         try {
119748             calendarItem.summary = t.DOMString(val, "?");
119749         } catch (e) {
119750         }
119751     });
119752
119753     this.__defineGetter__("isAllDay", function () {
119754         return calendarItem.isAllDay;
119755     });
119756     this.__defineSetter__("isAllDay", function (val) {
119757         try {
119758             calendarItem.isAllDay = t.boolean(val);
119759         } catch (e) {
119760         }
119761     });
119762
119763     this.__defineGetter__("startDate", function () {
119764         return calendarItem.startDate;
119765     });
119766     this.__defineSetter__("startDate", function (val) {
119767         try {
119768             calendarItem.startDate = t.TZDate(val, "?");
119769         } catch (e) {
119770         }
119771     });
119772
119773     this.__defineGetter__("duration", function () {
119774         return calendarItem.duration;
119775     });
119776     this.__defineSetter__("duration", function (val) {
119777         try {
119778             calendarItem.duration = t.TimeDuration(val, "?");
119779         } catch (e) {
119780         }
119781     });
119782
119783     this.__defineGetter__("location", function () {
119784         return calendarItem.location;
119785     });
119786     this.__defineSetter__("location", function (val) {
119787         try {
119788             calendarItem.location = t.DOMString(val, "?");
119789         } catch (e) {
119790         }
119791     });
119792
119793     this.__defineGetter__("geolocation", function () {
119794         return calendarItem.geolocation;
119795     });
119796     this.__defineSetter__("geolocation", function (val) {
119797         try {
119798             calendarItem.geolocation = t.SimpleCoordinates(val, "?");
119799         } catch (e) {
119800         }
119801     });
119802
119803     this.__defineGetter__("organizer", function () {
119804         return calendarItem.organizer;
119805     });
119806     this.__defineSetter__("organizer", function (val) {
119807         try {
119808             calendarItem.organizer = t.DOMString(val, "?");
119809         } catch (e) {
119810         }
119811     });
119812
119813     this.__defineGetter__("visibility", function () {
119814         return calendarItem.visibility;
119815     });
119816     this.__defineSetter__("visibility", function (val) {
119817         try {
119818             calendarItem.visibility = t.CalendarItemVisibility(val);
119819         } catch (e) {
119820         }
119821     });
119822
119823     this.__defineGetter__("status", function () {
119824         return calendarItem.status;
119825     });
119826     this.__defineSetter__("status", function (val) {
119827         try {
119828             calendarItem.status = t.CalendarItemStatus(val);
119829         } catch (e) {
119830         }
119831     });
119832
119833     this.__defineGetter__("priority", function () {
119834         return calendarItem.priority;
119835     });
119836     this.__defineSetter__("priority", function (val) {
119837         try {
119838             calendarItem.priority = t.CalendarItemPriority(val);
119839         } catch (e) {
119840         }
119841     });
119842
119843     this.__defineGetter__("alarms", function () {
119844         return calendarItem.alarms;
119845     });
119846     this.__defineSetter__("alarms", function (val) {
119847         try {
119848             calendarItem.alarms = t.CalendarAlarm(val, "[]");
119849         } catch (e) {
119850         }
119851     });
119852
119853     this.__defineGetter__("categories", function () {
119854         return calendarItem.categories;
119855     });
119856     this.__defineSetter__("categories", function (val) {
119857         try {
119858             calendarItem.categories = t.DOMString(val, "[]");
119859         } catch (e) {
119860         }
119861     });
119862
119863     this.__defineGetter__("attendees", function () {
119864         return calendarItem.attendees;
119865     });
119866     this.__defineSetter__("attendees", function (val) {
119867         try {
119868             calendarItem.attendees = t.CalendarAttendee(val, "[]");
119869         } catch (e) {
119870         }
119871     });
119872
119873     this.convertToString = convertToString;
119874 };
119875
119876 module.exports = CalendarItem;
119877
119878 });
119879 define('ripple/platform/tizen/2.0/BluetoothClassDeviceMinor', function (require, exports, module) {
119880 /*
119881  *  Copyright 2013 Intel Corporation.
119882  *
119883  * Licensed under the Apache License, Version 2.0 (the "License");
119884  * you may not use this file except in compliance with the License.
119885  * You may obtain a copy of the License at
119886  *
119887  * http://www.apache.org/licenses/LICENSE-2.0
119888  *
119889  * Unless required by applicable law or agreed to in writing, software
119890  * distributed under the License is distributed on an "AS IS" BASIS,
119891  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
119892  * See the License for the specific language governing permissions and
119893  * limitations under the License.
119894  */
119895
119896 var BluetoothClassDeviceMinor = function () {
119897     // COMPUTER
119898     this.__defineGetter__("COMPUTER_UNCATEGORIZED", function () {
119899         return 0x00;
119900     });
119901
119902     this.__defineGetter__("COMPUTER_DESKTOP", function () {
119903         return 0x01;
119904     });
119905
119906     this.__defineGetter__("COMPUTER_SERVER", function () {
119907         return 0x02;
119908     });
119909
119910     this.__defineGetter__("COMPUTER_LAPTOP", function () {
119911         return 0x03;
119912     });
119913
119914     this.__defineGetter__("COMPUTER_HANDHELD_PC_OR_PDA", function () {
119915         return 0x04;
119916     });
119917
119918     this.__defineGetter__("COMPUTER_PALM_PC_OR_PDA", function () {
119919         return 0x05;
119920     });
119921
119922     this.__defineGetter__("COMPUTER_WEARABLE", function () {
119923         return 0x06;
119924     });
119925
119926     // PHONE
119927     this.__defineGetter__("PHONE_UNCATEGORIZED", function () {
119928         return 0x00;
119929     });
119930
119931     this.__defineGetter__("PHONE_CELLULAR", function () {
119932         return 0x01;
119933     });
119934
119935     this.__defineGetter__("PHONE_CORDLESS", function () {
119936         return 0x02;
119937     });
119938
119939     this.__defineGetter__("PHONE_SMARTPHONE", function () {
119940         return 0x03;
119941     });
119942
119943     this.__defineGetter__("PHONE_MODEM_OR_GATEWAY", function () {
119944         return 0x04;
119945     });
119946
119947     this.__defineGetter__("PHONE_ISDN", function () {
119948         return 0x05;
119949     });
119950
119951     // AUDIO_VIDEO
119952     this.__defineGetter__("AV_UNRECOGNIZED", function () {
119953         return 0x00;
119954     });
119955
119956     this.__defineGetter__("AV_WEARABLE_HEADSET", function () {
119957         return 0x01;
119958     });
119959
119960     this.__defineGetter__("AV_HANDSFREE", function () {
119961         return 0x02;
119962     });
119963
119964     this.__defineGetter__("AV_MICROPHONE", function () {
119965         return 0x04;
119966     });
119967
119968     this.__defineGetter__("AV_LOUDSPEAKER", function () {
119969         return 0x05;
119970     });
119971
119972     this.__defineGetter__("AV_HEADPHONES", function () {
119973         return 0x06;
119974     });
119975
119976     this.__defineGetter__("AV_PORTABLE_AUDIO", function () {
119977         return 0x07;
119978     });
119979
119980     this.__defineGetter__("AV_CAR_AUDIO", function () {
119981         return 0x08;
119982     });
119983
119984     this.__defineGetter__("AV_SETTOP_BOX", function () {
119985         return 0x09;
119986     });
119987
119988     this.__defineGetter__("AV_HIFI", function () {
119989         return 0x0a;
119990     });
119991
119992     this.__defineGetter__("AV_VCR", function () {
119993         return 0x0b;
119994     });
119995
119996     this.__defineGetter__("AV_VIDEO_CAMERA", function () {
119997         return 0x0c;
119998     });
119999
120000     this.__defineGetter__("AV_CAMCORDER", function () {
120001         return 0x0d;
120002     });
120003
120004     this.__defineGetter__("AV_MONITOR", function () {
120005         return 0x0e;
120006     });
120007
120008     this.__defineGetter__("AV_DISPLAY_AND_LOUDSPEAKER", function () {
120009         return 0x0f;
120010     });
120011
120012     this.__defineGetter__("AV_VIDEO_CONFERENCING", function () {
120013         return 0x10;
120014     });
120015
120016     this.__defineGetter__("AV_GAMING_TOY", function () {
120017         return 0x12;
120018     });
120019
120020     // PERIPHERAL
120021     this.__defineGetter__("PERIPHERAL_UNCATEGORIZED", function () {
120022         return 0;
120023     });
120024
120025     this.__defineGetter__("PERIPHERAL_KEYBOARD", function () {
120026         return 0x10;
120027     });
120028
120029     this.__defineGetter__("PERIPHERAL_POINTING_DEVICE", function () {
120030         return 0x20;
120031     });
120032
120033     this.__defineGetter__("PERIPHERAL_KEYBOARD_AND_POINTING_DEVICE", function () {
120034         return 0x30;
120035     });
120036
120037     this.__defineGetter__("PERIPHERAL_JOYSTICK", function () {
120038         return 0x01;
120039     });
120040
120041     this.__defineGetter__("PERIPHERAL_GAMEPAD", function () {
120042         return 0x02;
120043     });
120044
120045     this.__defineGetter__("PERIPHERAL_REMOTE_CONTROL", function () {
120046         return 0x03;
120047     });
120048
120049     this.__defineGetter__("PERIPHERAL_SENSING_DEVICE", function () {
120050         return 0x04;
120051     });
120052
120053     this.__defineGetter__("PERIPHERAL_DEGITIZER_TABLET", function () {
120054         return 0x05;
120055     });
120056
120057     this.__defineGetter__("PERIPHERAL_CARD_READER", function () {
120058         return 0x06;
120059     });
120060
120061     this.__defineGetter__("PERIPHERAL_DIGITAL_PEN", function () {
120062         return 0x07;
120063     });
120064
120065     this.__defineGetter__("PERIPHERAL_HANDHELD_SCANNER", function () {
120066         return 0x08;
120067     });
120068
120069     this.__defineGetter__("PERIPHERAL_HANDHELD_INPUT_DEVICE", function () {
120070         return 0x09;
120071     });
120072
120073     // IMAGING
120074     this.__defineGetter__("IMAGING_UNCATEGORIZED", function () {
120075         return 0x00;
120076     });
120077
120078     this.__defineGetter__("IMAGING_DISPLAY", function () {
120079         return 0x04;
120080     });
120081
120082     this.__defineGetter__("IMAGING_CAMERA", function () {
120083         return 0x08;
120084     });
120085
120086     this.__defineGetter__("IMAGING_SCANNER", function () {
120087         return 0x10;
120088     });
120089
120090     this.__defineGetter__("IMAGING_PRINTER", function () {
120091         return 0x20;
120092     });
120093
120094     // WEARABLE
120095     this.__defineGetter__("WEARABLE_WRITST_WATCH", function () {
120096         return 0x01;
120097     });
120098
120099     this.__defineGetter__("WEARABLE_PAGER", function () {
120100         return 0x02;
120101     });
120102
120103     this.__defineGetter__("WEARABLE_JACKET", function () {
120104         return 0x03;
120105     });
120106
120107     this.__defineGetter__("WEARABLE_HELMET", function () {
120108         return 0x04;
120109     });
120110
120111     this.__defineGetter__("WEARABLE_GLASSES", function () {
120112         return 0x05;
120113     });
120114
120115     // TOY
120116     this.__defineGetter__("TOY_ROBOT", function () {
120117         return 0x01;
120118     });
120119
120120     this.__defineGetter__("TOY_VEHICLE", function () {
120121         return 0x02;
120122     });
120123
120124     this.__defineGetter__("TOY_DOLL", function () {
120125         return 0x03;
120126     });
120127
120128     this.__defineGetter__("TOY_CONTROLLER", function () {
120129         return 0x04;
120130     });
120131
120132     this.__defineGetter__("TOY_GAME", function () {
120133         return 0x05;
120134     });
120135
120136     // HEALTH
120137     this.__defineGetter__("HEALTH_UNDEFINED", function () {
120138         return 0x00;
120139     });
120140
120141     this.__defineGetter__("HEALTH_BLOOD_PRESSURE_MONITOR", function () {
120142         return 0x01;
120143     });
120144
120145     this.__defineGetter__("HEALTH_THERMOMETER", function () {
120146         return 0x02;
120147     });
120148
120149     this.__defineGetter__("HEALTH_WEIGHING_SCALE", function () {
120150         return 0x03;
120151     });
120152
120153     this.__defineGetter__("HEALTH_GLUCOSE_METER", function () {
120154         return 0x04;
120155     });
120156
120157     this.__defineGetter__("HEALTH_PULSE_OXIMETER", function () {
120158         return 0x05;
120159     });
120160
120161     this.__defineGetter__("HEALTH_PULSE_RATE_MONITOR", function () {
120162         return 0x06;
120163     });
120164
120165     this.__defineGetter__("HEALTH_DATA_DISPLAY", function () {
120166         return 0x07;
120167     });
120168
120169     this.__defineGetter__("HEALTH_STEP_COUNTER", function () {
120170         return 0x08;
120171     });
120172
120173     this.__defineGetter__("HEALTH_BODY_COMPOSITION_ANALYZER", function () {
120174         return 0x09;
120175     });
120176
120177     this.__defineGetter__("HEALTH_PEAK_FLOW_MONITOR", function () {
120178         return 0x0a;
120179     });
120180
120181     this.__defineGetter__("HEALTH_MEDICATION_MONITOR", function () {
120182         return 0x0b;
120183     });
120184
120185     this.__defineGetter__("HEALTH_KNEE_PROSTHESIS", function () {
120186         return 0x0c;
120187     });
120188
120189     this.__defineGetter__("HEALTH_ANKLE_PROSTHESIS", function () {
120190         return 0x0d;
120191     });
120192 };
120193
120194 module.exports = BluetoothClassDeviceMinor;
120195
120196 });
120197 define('ripple/platform/tizen/2.0/geocoder', function (require, exports, module) {
120198 /*
120199  *  Copyright 2012 Intel Corporation.
120200  *
120201  * Licensed under the Apache License, Version 2.0 (the "License");
120202  * you may not use this file except in compliance with the License.
120203  * You may obtain a copy of the License at
120204  *
120205  * http://www.apache.org/licenses/LICENSE-2.0
120206  *
120207  * Unless required by applicable law or agreed to in writing, software
120208  * distributed under the License is distributed on an "AS IS" BASIS,
120209  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
120210  * See the License for the specific language governing permissions and
120211  * limitations under the License.
120212  */
120213
120214 var SimpleCoordinates = require('ripple/platform/tizen/2.0/SimpleCoordinates'),
120215     ProviderLocal = require('ripple/platform/tizen/2.0/geoBackend_local'),
120216     ProviderNominatim = require('ripple/platform/tizen/2.0/geoBackend_nominatim'), // Nominatim geocode service
120217     _getProviders,
120218     _providers,
120219     _self;
120220
120221 function _initialize() {
120222     _providers = [new ProviderNominatim({name : "Nominatim", connectivity : "ONLINE"})
120223                   /* ,new ProviderLocal({name : "Tizen Database", connectivity : "OFFLINE"}) */];
120224 }
120225
120226 _initialize();
120227
120228 _self = {
120229     getDefaultProvider : function () {
120230         return _providers[0];
120231     },
120232     getProviders : function () {
120233         return _providers;
120234     }
120235 };
120236
120237 module.exports = _self;
120238
120239 });
120240 define('ripple/platform/tizen/2.0/timezone_info', function (require, exports, module) {
120241 /*
120242  *  Copyright 2012 Intel Corporation.
120243  *
120244  * Licensed under the Apache License, Version 2.0 (the "License");
120245  * you may not use this file except in compliance with the License.
120246  * You may obtain a copy of the License at
120247  *
120248  * http://www.apache.org/licenses/LICENSE-2.0
120249  *
120250  * Unless required by applicable law or agreed to in writing, software
120251  * distributed under the License is distributed on an "AS IS" BASIS,
120252  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
120253  * See the License for the specific language governing permissions and
120254  * limitations under the License.
120255  */
120256
120257 var _timezone_data = {
120258     "UTC": {diff: 0, abbr: "UTC"},
120259     "Africa/Cairo": {diff: 2, abbr: "EET"},
120260     "Africa/Casablanca": {diff: 0, abbr: "UTC"},
120261     "Africa/Dakar": {diff: 0, abbr: "UTC"},
120262     "Africa/Freetown": {diff: 0, abbr: "UTC"},
120263     "Africa/Johannesburg": {diff: 2, abbr: "SAST"},
120264     "Africa/Luanda": {diff: 1, abbr: "WAT"},
120265     "America/Anchorage": {diff: -9, abbr: "AKDT"},
120266     "America/Antigua": {diff: -4, abbr: "AST"},
120267     "America/Aruba": {diff: -4, abbr: "AST"},
120268     "America/Barbados": {diff: -4, abbr: "AST"},
120269     "America/Belize": {diff: -6, abbr: "CST"},
120270     "America/Bogota": {diff: -5, abbr: "COT"},
120271     "America/Buenos_Aires": {diff: -3, abbr: "ART"},
120272     "America/Cancun": {diff: -6, abbr: "CDT"},
120273     "America/Cayenne": {diff: -3, abbr: "GFT"},
120274     "America/Cayman": {diff: -5, abbr: "EST"},
120275     "America/Chicago": {diff: -6, abbr: "CST"},
120276     "America/Chihuahua": {diff: -7, abbr: "MST"},
120277     "America/Costa_Rica": {diff: -6, abbr: "CST"},
120278     "America/Denver": {diff: -7, abbr: "MST"},
120279     "America/Detroit": {diff: -5, abbr: "EST"},
120280     "America/Dominica": {diff: -4, abbr: "AST"},
120281     "America/Edmonton": {diff: -7, abbr: "MST"},
120282     "America/El_Salvador": {diff: -6, abbr: "CST"},
120283     "America/Guatemala": {diff: -6, abbr: "CST"},
120284     "America/Havana": {diff: -5, abbr: "CST"},
120285     "America/Indianapolis": {diff: -5, abbr: "EST"},
120286     "America/Jamaica": {diff: -5, abbr: "EST"},
120287     "America/Lima": {diff: -5, abbr: "PET"},
120288     "America/Los_Angeles": {diff: -8, abbr: "PST"},
120289     "America/Louisville": {diff: -5, abbr: "EST"},
120290     "America/Mexico_City": {diff: -6, abbr: "CST"},
120291     "America/Montevideo": {diff: -2, abbr: "UYST"},
120292     "America/Montreal": {diff: -5, abbr: "EST"},
120293     "America/New_York": {diff: -5, abbr: "EST"},
120294     "America/Panama": {diff: -5, abbr: "EST"},
120295     "America/Phoenix": {diff: -7, abbr: "MST"},
120296     "America/Puerto_Rico": {diff: -4, abbr: "AST"},
120297     "America/Santiago": {diff: -3, abbr: "CLST"},
120298     "America/Santo_Domingo": {diff: -4, abbr: "AST"},
120299     "America/Sao_Paulo": {diff: -4, abbr: "AST"},
120300     "America/Tijuana": {diff: -8, abbr: "PST"},
120301     "America/Vancouver": {diff: -8, abbr: "PST"},
120302     "America/Winnipeg": {diff: -6, abbr: "CST"},
120303     "Antarctica/South_Pole": {diff: 13, abbr: "NZDT"},
120304     "Arctic/Longyearbyen": {diff: 13, abbr: "CET"},
120305     "Asia/Amman": {diff: 2, abbr: "EET"},
120306     "Asia/Baghdad": {diff: 3, abbr: "AST"},
120307     "Asia/Bahrain": {diff: 3, abbr: "AST"},
120308     "Asia/Bangkok": {diff: 7, abbr: "ICT"},
120309     "Asia/Beirut": {diff: 2, abbr: "EET"},
120310     "Asia/Chungking": {diff: 8, abbr: "CST"},
120311     "Asia/Dubai": {diff: 4, abbr: "GST", desc:"GMT+0400 United Arab Emirates Time"},
120312     "Asia/Harbin": {diff: 8, abbr: "CST"},
120313     "Asia/Ho_Chi_Minh": {diff: 7, abbr: "IST"},
120314     "Asia/Hong_Kong": {diff: 8, abbr: "HKT"},
120315     "Asia/Istanbul": {diff: 2, abbr: "EET"},
120316     "Asia/Jakarta": {diff: 7, abbr: "WIT"},
120317     "Asia/Jerusalem": {diff: 2, abbr: "IST"},
120318     "Asia/Karachi": {diff: 5, abbr: "PKT"},
120319     "Asia/Kuala_Lumpur": {diff: 8, abbr: "MYT"},
120320     "Asia/Kuwait": {diff: 3, abbr: "AST"},
120321     "Asia/Macao": {diff: 8, abbr: "CST"},
120322     "Asia/Manila": {diff: 8, abbr: "PHT"},
120323     "Asia/Pyongyang": {diff: 9, abbr: "KST"},
120324     "Asia/Qatar": {diff: 3, abbr: "AST"},
120325     "Asia/Saigon": {diff: 7, abbr: "ICT"},
120326     "Asia/Seoul": {diff: 9, abbr: "KST", desc:"GMT+0900 South Korea Time"},
120327     "Asia/Shanghai": {diff: 8, abbr: "CST"},
120328     "Asia/Singapore": {diff: 8, abbr: "SGT"},
120329     "Asia/Taipei": {diff: 8, abbr: "CST"},
120330     "Asia/Tel_Aviv": {diff: 2, abbr: "IST"},
120331     "Asia/Tokyo": {diff: 9, abbr: "JST"},
120332     "Asia/Urumqi": {diff: 8, abbr: "CST"},
120333     "Atlantic/Bermuda": {diff: -4, abbr: "AST"},
120334     "Atlantic/Canary": {diff: 0, abbr: "WET"},
120335     "Atlantic/Cape_Verde": {diff: -1, abbr: "CVT"},
120336     "Atlantic/Reykjavik": {diff: 0, abbr: "GMT"},
120337     "Australia/Brisbane": {diff: 10, abbr: "EST"},
120338     "Australia/Canberra": {diff: 11, abbr: "EST"},
120339     "Australia/Darwin": {diff: 9.5, abbr: "CST"},
120340     "Australia/Melbourne": {diff: 11, abbr: "EST"},
120341     "Australia/North": {diff: 9.5, abbr: "CST"},
120342     "Australia/Perth": {diff: 8, abbr: "WST"},
120343     "Australia/Queensland": {diff: 10, abbr: "EST"},
120344     "Australia/South": {diff: 10.5, abbr: "CST"},
120345     "Australia/Sydney": {diff: 11, abbr: "EST"},
120346     "Australia/West": {diff: 8, abbr: "WST"},
120347     "Australia/Victoria": {diff: 11, abbr: "EST"},
120348     "Europe/Amsterdam": {diff: 1, abbr: "CET"},
120349     "Europe/Athens": {diff: 2, abbr: "EET"},
120350     "Europe/Belgrade": {diff: 1, abbr: "CET"},
120351     "Europe/Berlin": {diff: 1, abbr: "CET"},
120352     "Europe/Brussels": {diff: 1, abbr: "CET"},
120353     "Europe/Bucharest": {diff: 2, abbr: "EET"},
120354     "Europe/Budapest": {diff: 1, abbr: "CET"},
120355     "Europe/Copenhagen": {diff: 1, abbr: "CET"},
120356     "Europe/Dublin": {diff: 0, abbr: "GMT"},
120357     "Europe/Helsinki": {diff: 2, abbr: "EET"},
120358     "Europe/Istanbul": {diff: 2, abbr: "EET"},
120359     "Europe/Kaliningrad": {diff: 3, abbr: "FET"},
120360     "Europe/Kiev": {diff: 2, abbr: "EET"},
120361     "Europe/Lisbon": {diff: 0, abbr: "WET"},
120362     "Europe/London": {diff: 0, abbr: "GMT"},
120363     "Europe/Luxembourg": {diff: 1, abbr: "CET"},
120364     "Europe/Madrid": {diff: 1, abbr: "CET"},
120365     "Europe/Minsk": {diff: 3, abbr: "FET"},
120366     "Europe/Monaco": {diff: 1, abbr: "CET"},
120367     "Europe/Moscow": {diff: 4, abbr: "MSK"},
120368     "Europe/Oslo": {diff: 1, abbr: "CET"},
120369     "Europe/Paris": {diff: 1, abbr: "CET"},
120370     "Europe/Prague": {diff: 1, abbr: "CET"},
120371     "Europe/Rome": {diff: 1, abbr: "CET"},
120372     "Europe/San_Marino": {diff: 1, abbr: "CET"},
120373     "Europe/Sarajevo": {diff: 1, abbr: "CET"},
120374     "Europe/Stockholm": {diff: 1, abbr: "CET"},
120375     "Europe/Vatican": {diff: 1, abbr: "CET"},
120376     "Europe/Vienna": {diff: 1, abbr: "CET"},
120377     "Europe/Warsaw": {diff: 1, abbr: "CET"},
120378     "Europe/Zurich": {diff: 2, abbr: "EET"},
120379     "Indian/Christmas": {diff: 7, abbr: "CXT"},
120380     "Indian/Maldives": {diff: 5, abbr: "MVT"},
120381     "Pacific/Auckland": {diff: 12, abbr: "NZST"},
120382     "Pacific/Easter": {diff: -6, abbr: "EAST"},
120383     "Pacific/Fiji": {diff: 12, abbr: "FJT"},
120384     "Pacific/Guam": {diff: 10, abbr: "ChST"},
120385     "Pacific/Honolulu": {diff: -10, abbr: "HST"},
120386     "Pacific/Midway": {diff: -11, abbr: "SST"},
120387     "Pacific/Saipan": {diff: 10, abbr: "ChST"},
120388     "Pacific/Samoa": {diff: -11, abbr: "SST"},
120389     "Pacific/Tahiti": {diff: -10, abbr: "TAHT"},
120390     "UCT": {diff: 0, abbr: "UCT"},
120391     "SST": {diff: 0, abbr: "SST"},
120392     "GMT": {diff: 0, abbr: "GMT"},
120393     "Greenwich": {diff: 0, abbr: "GMT"},
120394     "US/Alaska": {diff: -9, abbr: "AKST"},
120395     "US/Eastern": {diff: -5, abbr: "EST"},
120396     "US/Central": {diff: -6, abbr: "CST"},
120397     "US/Mountain": {diff: -7, abbr: "MST"},
120398     "US/Pacific": {diff: -8, abbr: "PST"},
120399     "Universal": {diff: 0, abbr: "UTC"},
120400     "Zulu": {diff: 0, abbr: "UTC"},
120401     "Etc/GMT": {diff: 0, abbr: "Etc/GMT"},
120402     "Etc/GMT+0": {diff: 0, abbr: "Etc/GMT+0"},
120403     "Etc/GMT+1": {diff: -1, abbr: "Etc/GMT+1"},
120404     "Etc/GMT+10": {diff: -10, abbr: "Etc/GMT+10"},
120405     "Etc/GMT+11": {diff: -11, abbr: "Etc/GMT+11"},
120406     "Etc/GMT+12": {diff: -12, abbr: "Etc/GMT+12"},
120407     "Etc/GMT+2": {diff: -2, abbr: "Etc/GMT+2"},
120408     "Etc/GMT+3": {diff: -3, abbr: "Etc/GMT+3"},
120409     "Etc/GMT+4": {diff: -4, abbr: "Etc/GMT+4"},
120410     "Etc/GMT+5": {diff: -5, abbr: "Etc/GMT+5"},
120411     "Etc/GMT+6": {diff: -6, abbr: "Etc/GMT+6"},
120412     "Etc/GMT+7": {diff: -7, abbr: "Etc/GMT+7"},
120413     "Etc/GMT+8": {diff: -8, abbr: "Etc/GMT+8"},
120414     "Etc/GMT+9": {diff: -9, abbr: "Etc/GMT+9"},
120415     "Etc/GMT-0": {diff: 0, abbr: "Etc/GMT-0"},
120416     "Etc/GMT-1": {diff: 1, abbr: "Etc/GMT-1"},
120417     "Etc/GMT-10": {diff: 10, abbr: "Etc/GMT-10"},
120418     "Etc/GMT-11": {diff: 11, abbr: "Etc/GMT-11"},
120419     "Etc/GMT-12": {diff: 12, abbr: "Etc/GMT-12"},
120420     "Etc/GMT-13": {diff: 13, abbr: "Etc/GMT-13"},
120421     "Etc/GMT-14": {diff: 14, abbr: "Etc/GMT-14"},
120422     "Etc/GMT-2": {diff: 2, abbr: "Etc/GMT-2"},
120423     "Etc/GMT-3": {diff: 3, abbr: "Etc/GMT-3"},
120424     "Etc/GMT-4": {diff: 4, abbr: "Etc/GMT-4"},
120425     "Etc/GMT-5": {diff: 5, abbr: "Etc/GMT-5"},
120426     "Etc/GMT-6": {diff: 6, abbr: "Etc/GMT-6"},
120427     "Etc/GMT-7": {diff: 7, abbr: "Etc/GMT-7"},
120428     "Etc/GMT-8": {diff: 8, abbr: "Etc/GMT-8"},
120429     "Etc/GMT-9": {diff: 9, abbr: "Etc/GMT-9"},
120430     "Etc/GMT0": {diff: 0, abbr: "Etc/GMT0"},
120431     "Etc/Greenwich": {diff: 0, abbr: "GMT"}
120432 };
120433
120434 module.exports = {
120435     getAllTimezone: function () {
120436         var i, ret = [];
120437         for (i in _timezone_data)
120438             ret.push(i);
120439         return ret;
120440     },
120441     getTimezoneDiff: function (zone) {
120442         return _timezone_data[zone].diff;
120443     },
120444     getTimezoneAbbr: function (zone) {
120445         return _timezone_data[zone].abbr;
120446     },
120447     getTimezoneDesc: function (zone) {
120448         if (_timezone_data[zone].desc) {
120449             return _timezone_data[zone].desc;
120450         } else {
120451             return null;
120452         }
120453     },
120454     isValidTimezone: function (zone) {
120455         return (_timezone_data[zone] === undefined) ? false : true;
120456     }
120457 };
120458
120459
120460 });
120461 define('ripple/platform/tizen/2.0/lbs_utils', function (require, exports, module) {
120462 /*
120463  *  Copyright 2012 Intel Corporation.
120464  *
120465  * Licensed under the Apache License, Version 2.0 (the "License");
120466  * you may not use this file except in compliance with the License.
120467  * You may obtain a copy of the License at
120468  *
120469  * http://www.apache.org/licenses/LICENSE-2.0
120470  *
120471  * Unless required by applicable law or agreed to in writing, software
120472  * distributed under the License is distributed on an "AS IS" BASIS,
120473  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
120474  * See the License for the specific language governing permissions and
120475  * limitations under the License.
120476  */
120477
120478 var tizen1_utils = require('ripple/platform/tizen/2.0/tizen1_utils'),
120479     _self;
120480
120481 function CoordinateProperties(prop) {
120482     var _self;
120483     _self = {
120484         latitude : prop.latitude || 0,
120485         longitude : prop.longitude || 0,
120486         altitude : prop.altitude || 0,
120487         accuracy : prop.accuracy || 0,
120488         altitudeAccuracy : prop.altitudeAccuracy || 0,
120489         heading : prop.heading || 0,
120490         speed : prop.speed || 0
120491     };
120492     return _self;
120493 }
120494
120495 function _checkAddressProperties(p, dst) {
120496     if (p.country !== null && p.country !== undefined)
120497         dst.country = String(p.country);
120498     if (p.region !== null && p.region !== undefined)
120499         dst.region = String(p.region);
120500     if (p.county !== null && p.county !== undefined)
120501         dst.county = String(p.county);
120502     if (p.city !== null && p.city !== undefined)
120503         dst.city = String(p.city);
120504     if (p.street !== null && p.street !== undefined)
120505         dst.street = String(p.street);
120506     if (p.streetNumber !== null && p.streetNumber !== undefined)
120507         dst.streetNumber = String(p.streetNumber);
120508     if (p.premises !== null && p.premises !== undefined)
120509         dst.premises = String(p.premises);
120510     if (p.additionalInformation !== null &&
120511         p.additionalInformation !== undefined)
120512         dst.additionalInformation = String(p.additionalInformation);
120513     if (p.postalCode !== null && p.postalCode !== undefined)
120514         dst.postalCode = String(p.postalCode);
120515 }
120516
120517 function AddressProperties(prop) {
120518     var _self;
120519     _self = {
120520         country : null,
120521         region : null,
120522         county : null,
120523         city : null,
120524         street : null,
120525         streetNumber : null,
120526         premises : null,
120527         additionalInformation : null,
120528         postalCode : null
120529     };
120530     if (prop) {
120531         if (_checkAddressProperties(prop, _self) === false)
120532             return undefined;
120533     }
120534     return _self;
120535 }
120536
120537 _self = {
120538     LocationServiceProvider : function (prop) {
120539         var _self;
120540         _self = {
120541             name : "",
120542             metaData : Object,
120543             attribution : "",
120544             supportedOptions : [],
120545             setOptions : function (options, successCB, errorCB) {},
120546             connectivity : "" // "ONLINE" "OFFLINE" "HYBRID"
120547         };
120548
120549         if (prop.name !== null && prop.name !== undefined)
120550             _self.name = String(prop.name);
120551         if (prop.metaData !== null && prop.metaData !== undefined)
120552             _self.metaData = prop.metaData;
120553
120554         if (prop.attribution !== null && prop.attribution !== undefined)
120555             _self.attribution = String(prop.attribution);
120556
120557         if (prop.supportedOptions !== null && prop.supportedOptions !== undefined)
120558             _self.supportedOptions = [prop.supportedOptions];
120559
120560         if (prop.setOptions !== null && prop.setOptions !== undefined)
120561             _self.setOptions = prop.setOptions;
120562
120563         if (prop.connectivity !== null && prop.connectivity !== undefined)
120564             _self.connectivity = String(prop.connectivity);
120565
120566         return _self;
120567     },
120568
120569     GeoCoordinates : function (prop) {
120570         var _self = new CoordinateProperties(prop);
120571         if (tizen1_utils.isEmptyObject(_self)) {
120572             return undefined;
120573         }
120574
120575         return _self;
120576     },
120577
120578     StructuredAddress : function (prop) {
120579         var _self;
120580         _self = new AddressProperties(prop);
120581         if (tizen1_utils.isEmptyObject(_self)) {
120582             return undefined;
120583         }
120584
120585         return _self;
120586     }
120587 };
120588
120589 module.exports = _self;
120590
120591 });
120592 define('ripple/platform/tizen/2.0/AccountBase', function (require, exports, module) {
120593 /*
120594  *  Copyright 2012 Intel Corporation.
120595  *
120596  * Licensed under the Apache License, Version 2.0 (the "License");
120597  * you may not use this file except in compliance with the License.
120598  * You may obtain a copy of the License at
120599  *
120600  * http://www.apache.org/licenses/LICENSE-2.0
120601  *
120602  * Unless required by applicable law or agreed to in writing, software
120603  * distributed under the License is distributed on an "AS IS" BASIS,
120604  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
120605  * See the License for the specific language governing permissions and
120606  * limitations under the License.
120607  */
120608
120609 module.exports = function (appId, userName, displayName, service) {
120610     var _self,
120611         _id = Math.uuid(null, 16);
120612
120613     _self = {
120614         appId : appId || "",
120615         userName : userName || "",
120616         displayName : displayName || "",
120617         service : service || {}
120618     };
120619
120620     _self.__defineGetter__("id", function () {
120621         return _id;
120622     });
120623
120624     return _self;
120625 };
120626
120627 });
120628 define('ripple/platform/tizen/2.0/AlarmAbsolute', function (require, exports, module) {
120629 /*
120630  *  Copyright 2012 Intel Corporation.
120631  *
120632  * Licensed under the Apache License, Version 2.0 (the "License");
120633  * you may not use this file except in compliance with the License.
120634  * You may obtain a copy of the License at
120635  *
120636  * http://www.apache.org/licenses/LICENSE-2.0
120637  *
120638  * Unless required by applicable law or agreed to in writing, software
120639  * distributed under the License is distributed on an "AS IS" BASIS,
120640  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
120641  * See the License for the specific language governing permissions and
120642  * limitations under the License.
120643  */
120644
120645 var AlarmBase = require('ripple/platform/tizen/2.0/AlarmBase'),
120646     t = require('ripple/platform/tizen/2.0/typecast'),
120647     _byDayValue = ["SU", "MO", "TU", "WE", "TH", "FR", "SA"],
120648     PERIOD_WEEK = (7 * 24 * 60 * 60), MILLI_SECOND = 1000,
120649     AlarmAbsolute;
120650
120651 AlarmAbsolute = function () {
120652     var alarm, period = null, daysOfTheWeek = [], ascDays = [], voc, date;
120653
120654     function getScheduleDateByPeriod(current, date, period) {
120655         var diff = period * MILLI_SECOND,
120656             triggerDate = new Date(date);
120657
120658         while (current > (triggerDate - MILLI_SECOND)) { // In advance 1s - MILLI_SECOND
120659             triggerDate.setTime(triggerDate.getTime() + diff);
120660         }
120661         return triggerDate;
120662     }
120663
120664     function getSchedulteDateByDay(current, triggerTime, startDay, endDay) {
120665         startDay = (7 + (endDay - startDay)) % 7;
120666         current.setHours(triggerTime.getHours());
120667         current.setMinutes(triggerTime.getMinutes());
120668         current.setSeconds(triggerTime.getSeconds());
120669         current.setMilliseconds(triggerTime.getMilliseconds());
120670         current.setDate(current.getDate() + startDay);
120671         return current;
120672     }
120673
120674     function getAscDays() { // Get asc order array
120675         for (var i in daysOfTheWeek) {
120676             ascDays.push(_byDayValue.lastIndexOf(daysOfTheWeek[i]));
120677         }
120678         return ascDays.sort();
120679     }
120680
120681     /*
120682      * Return
120683      *     true:  A is bigger than B
120684      *     false: otherwise
120685      */
120686     function compareTime(current, triggerTime) {
120687         var diff = current.getHours() - triggerTime.getHours();
120688         if (diff !== 0)
120689             return (diff > 0);
120690
120691         diff = current.getMinutes() - triggerTime.getMinutes();
120692         if (diff !== 0)
120693             return (diff > 0);
120694
120695         diff = current.getSeconds() - triggerTime.getSeconds();
120696         if (diff < -1) // Delay 1s
120697             return false;
120698
120699         return true;
120700     }
120701
120702     alarm = new AlarmBase(this);
120703
120704     voc = [
120705         function (_date, _daysOfTheWeek) {
120706             date = _date;
120707             daysOfTheWeek = _daysOfTheWeek;
120708             period = PERIOD_WEEK;
120709         },
120710         function (_date, _period) {
120711             date = _date;
120712             period = _period;
120713         },
120714         function (_date) {
120715             date = _date;
120716         }
120717     ];
120718
120719     t.AlarmAbsolute(arguments, this, voc);
120720
120721     this.getNextScheduledDate = function () {
120722         var current = new Date(),
120723             diff, isPass, today, total, i, nextDate;
120724
120725         diff = current - date;
120726         if (diff < -1000) // Advance 1s
120727             return date; // Before first trigger, return date
120728
120729         if (period === null)
120730             return null;
120731
120732         if (period !== PERIOD_WEEK)
120733             return getScheduleDateByPeriod(current, date, period); // Repeat by period
120734
120735         today = current.getDay(); // 0~6
120736         ascDays = getAscDays();
120737         total = ascDays.length;
120738
120739         if ((ascDays[0] <= today) && (today <= ascDays[total - 1])) { // Today out of ascDays
120740             for (i in ascDays) { // Today in ascDays
120741                 if (ascDays[i] < today) {
120742                     continue;
120743                 } else if (ascDays[i] > today) {
120744                     nextDate = ascDays[i];
120745                     break;
120746                 } else {
120747                     isPass = compareTime(current, date); // Is triggerTime pass
120748                     if (isPass) {
120749                         nextDate = ascDays[(i < total - 1) ? (parseInt(i, 10) + 1) : 0];
120750                     } else {
120751                         nextDate = today;
120752                     }
120753                     break;
120754                 }
120755             }
120756         } else {
120757             nextDate = ascDays[0];
120758         }
120759
120760         return getSchedulteDateByDay(current, date, today, nextDate);
120761     };
120762
120763     this.__defineGetter__("date", function () {
120764         return new Date(date);
120765     });
120766
120767     this.__defineGetter__("period", function () {
120768         return period;
120769     });
120770
120771     this.__defineGetter__("daysOfTheWeek", function () {
120772         return daysOfTheWeek;
120773     });
120774 };
120775
120776 module.exports = AlarmAbsolute;
120777
120778 });
120779 define('ripple/platform/tizen/2.0/ContactPhoneNumber', function (require, exports, module) {
120780 /*
120781  *  Copyright 2013 Intel Corporation.
120782  *
120783  * Licensed under the Apache License, Version 2.0 (the "License");
120784  * you may not use this file except in compliance with the License.
120785  * You may obtain a copy of the License at
120786  *
120787  * http://www.apache.org/licenses/LICENSE-2.0
120788  *
120789  * Unless required by applicable law or agreed to in writing, software
120790  * distributed under the License is distributed on an "AS IS" BASIS,
120791  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
120792  * See the License for the specific language governing permissions and
120793  * limitations under the License.
120794  */
120795
120796 var t = require('ripple/platform/tizen/2.0/typecast'),
120797     ContactPhoneNumber;
120798
120799 ContactPhoneNumber = function (number, types, isDefault) {
120800     var contactPhoneNumber = {};
120801
120802     t.ContactPhoneNumber(arguments, this);
120803
120804     contactPhoneNumber.number    = number;
120805     contactPhoneNumber.isDefault = isDefault || false;
120806     contactPhoneNumber.types     = (types && types[0]) ? types : ["VOICE"];
120807
120808     this.__defineGetter__("number", function () {
120809         return contactPhoneNumber.number;
120810     });
120811     this.__defineSetter__("number", function (val) {
120812         try {
120813             contactPhoneNumber.number = t.DOMString(val);
120814         } catch (e) {
120815         }
120816     });
120817
120818     this.__defineGetter__("isDefault", function () {
120819         return contactPhoneNumber.isDefault;
120820     });
120821     this.__defineSetter__("isDefault", function (val) {
120822         try {
120823             contactPhoneNumber.isDefault = t.boolean(val);
120824         } catch (e) {
120825         }
120826     });
120827
120828     this.__defineGetter__("types", function () {
120829         return contactPhoneNumber.types;
120830     });
120831     this.__defineSetter__("types", function (val) {
120832         try {
120833             contactPhoneNumber.types = t.DOMString(val, "[]");
120834         } catch (e) {
120835         }
120836     });
120837 };
120838
120839 module.exports = ContactPhoneNumber;
120840
120841 });
120842 define('ripple/platform/tizen/2.0/SyncInfo', function (require, exports, module) {
120843 /*
120844  *  Copyright 2013 Intel Corporation.
120845  *
120846  * Licensed under the Apache License, Version 2.0 (the "License");
120847  * you may not use this file except in compliance with the License.
120848  * You may obtain a copy of the License at
120849  *
120850  * http://www.apache.org/licenses/LICENSE-2.0
120851  *
120852  * Unless required by applicable law or agreed to in writing, software
120853  * distributed under the License is distributed on an "AS IS" BASIS,
120854  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
120855  * See the License for the specific language governing permissions and
120856  * limitations under the License.
120857  */
120858
120859 var db = require('ripple/db'),
120860     t = require('ripple/platform/tizen/2.0/typecast'),
120861     SyncInfo,
120862     _accounts = {},
120863     _counter = 0;
120864
120865 SyncInfo = function () {
120866     var voc, syncInfo = {}, index;
120867
120868     function save() {
120869         _accounts[index] = {
120870             id:       syncInfo.id,
120871             password: syncInfo.password
120872         };
120873         db.saveObject("save-syncinfo", _accounts);
120874     }
120875
120876     function construct(url, id, password, mode) {
120877         syncInfo.url      = url;
120878         syncInfo.id       = id;
120879         syncInfo.password = password;
120880         syncInfo.mode     = mode;
120881         syncInfo.type     = null;
120882         syncInfo.interval = null;
120883
120884         this.__defineGetter__("url", function () {
120885             return syncInfo.url;
120886         });
120887         this.__defineSetter__("url", function (url) {
120888             try {
120889                 syncInfo.url = t.DOMString(url);
120890             } catch (e) {
120891             }
120892         });
120893
120894         this.__defineGetter__("id", function () {
120895             return null;
120896         });
120897         this.__defineSetter__("id", function (id) {
120898             try {
120899                 syncInfo.id = t.DOMString(id);
120900                 save();
120901             } catch (e) {
120902             }
120903         });
120904
120905         this.__defineGetter__("password", function () {
120906             return null;
120907         });
120908         this.__defineSetter__("password", function (password) {
120909             try {
120910                 syncInfo.password = t.DOMString(password);
120911                 save();
120912             } catch (e) {
120913             }
120914         });
120915
120916         this.__defineGetter__("mode", function () {
120917             return syncInfo.mode;
120918         });
120919         this.__defineSetter__("mode", function (mode) {
120920             try {
120921                 syncInfo.mode = t.SyncMode(mode);
120922             } catch (e) {
120923             }
120924         });
120925
120926         this.__defineGetter__("type", function () {
120927             return syncInfo.type;
120928         });
120929         this.__defineSetter__("type", function (type) {
120930             if (mode !== "MANUAL") {
120931                 return;
120932             }
120933             try {
120934                 syncInfo.type = t.SyncType(type);
120935             } catch (e) {
120936             }
120937         });
120938
120939         this.__defineGetter__("interval", function () {
120940             return syncInfo.interval;
120941         });
120942         this.__defineSetter__("interval", function (interval) {
120943             if (mode !== "PERIODIC") {
120944                 return;
120945             }
120946             try {
120947                 syncInfo.interval = t.SyncInterval(interval);
120948             } catch (e) {
120949             }
120950         });
120951     }
120952
120953     voc = [
120954         function (url, id, password, mode, type) {
120955             construct.apply(this, arguments);
120956
120957             if (mode === "MANUAL") {
120958                 syncInfo.type = type;
120959             }
120960         },
120961         function (url, id, password, mode, interval) {
120962             construct.apply(this, arguments);
120963
120964             if (mode === "PERIODIC") {
120965                 syncInfo.interval = interval;
120966             }
120967         },
120968         function (url, id, password, mode) {
120969             construct.apply(this, arguments);
120970         }
120971     ];
120972
120973     t.SyncInfo(arguments, this, voc);
120974
120975     index = _counter++;
120976     Object.defineProperty(this, "__syncInfoID__", {
120977         "configurable": false,
120978         "enumerable":   false,
120979         "get": (function (_id_) {
120980             return function () { return _id_; };
120981         })(index)
120982     });
120983     save();
120984 };
120985
120986 module.exports = SyncInfo;
120987
120988 });
120989 define('ripple/platform/tizen/2.0/alarm', function (require, exports, module) {
120990 /*
120991  *  Copyright 2012 Intel Corporation.
120992  *
120993  * Licensed under the Apache License, Version 2.0 (the "License");
120994  * you may not use this file except in compliance with the License.
120995  * You may obtain a copy of the License at
120996  *
120997  * http://www.apache.org/licenses/LICENSE-2.0
120998  *
120999  * Unless required by applicable law or agreed to in writing, software
121000  * distributed under the License is distributed on an "AS IS" BASIS,
121001  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
121002  * See the License for the specific language governing permissions and
121003  * limitations under the License.
121004  */
121005
121006 var db = require('ripple/db'),
121007     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
121008     event = require('ripple/event'),
121009     utils = require('ripple/utils'),
121010     t = require('ripple/platform/tizen/2.0/typecast'),
121011     WebAPIException = require('ripple/platform/tizen/2.0/WebAPIException'),
121012     AlarmRelative = require('ripple/platform/tizen/2.0/AlarmRelative'),
121013     AlarmAbsolute = require('ripple/platform/tizen/2.0/AlarmAbsolute'),
121014     AlarmStore,
121015     _DB_ALARMS_KEY = "tizen1.0-db-alarms",
121016     PERIOD_MINUTE = 60,
121017     PERIOD_HOUR   = 60 * PERIOD_MINUTE,
121018     PERIOD_DAY    = 24 * PERIOD_HOUR,
121019     PERIOD_WEEK   = 7 * PERIOD_DAY,
121020     _alarms = {}, _alarmStack = [],
121021     _security = {
121022         "http://tizen.org/privilege/alarm": ["add", "remove", "removeAll"]
121023     },
121024     _isInitialized = false, _self;
121025
121026 function _initialize() {
121027     _alarms = db.retrieveObject(_DB_ALARMS_KEY);
121028     utils.forEach(_alarms, function (alarmStore) {
121029         alarmStore.date = new Date(alarmStore.date);
121030         _alarmStack.push(alarmStore);
121031     });
121032     _isInitialized = true;
121033 }
121034
121035 function _get() {
121036     if (!_isInitialized) {
121037         _initialize();
121038     }
121039 }
121040
121041 function _save() {
121042     db.saveObject(_DB_ALARMS_KEY, _alarmStack);
121043 }
121044
121045 function _updateDB(alarmStore) {
121046     _alarmStack.push(alarmStore);
121047     _save();
121048 }
121049
121050 function _getCurrentAppId() {
121051     return db.retrieve("current-url");
121052 }
121053
121054 function _checkTriggerAlarm(alarm) {
121055     var remainingTime, nextTriggerDate;
121056
121057     if (alarm.delay !== undefined) { // Alarm is relative
121058         if (alarm.period !== null)
121059             return false;
121060
121061         remainingTime = alarm.getRemainingSeconds();
121062         if (remainingTime === null)
121063             return true; // This alarm is triggered, remove it
121064     } else if (alarm.period !== undefined) { // Alarm is absolute,no repeat
121065         nextTriggerDate = alarm.getNextScheduledDate();
121066         if (nextTriggerDate === null)
121067             return true; // Already triggered
121068     }
121069
121070     return false; // Alarm is repeat, not expired
121071 }
121072
121073 function _convertToAlarm(alarmStore) {
121074     var alarm, frequency;
121075
121076     if (alarmStore.delay !== null) { // AlarmRelative
121077         alarm = new AlarmRelative(alarmStore.delay, alarmStore.period);
121078         alarm.date = alarmStore.date;
121079     } else { // AlarmAbsolute
121080         if (alarmStore.period !== null && alarmStore.period !== PERIOD_WEEK) {
121081             frequency = alarmStore.period;
121082         } else if (alarmStore.period === PERIOD_WEEK) {
121083             frequency = alarmStore.daysOfTheWeek;
121084         }
121085         alarm = new AlarmAbsolute(alarmStore.date, frequency);
121086     }
121087
121088     alarm.__defineGetter__("id", function () {
121089         return alarmStore.id;
121090     });
121091
121092     return alarm;
121093 }
121094
121095 function _eventCheckAlarm(id) {
121096     var alarm, diff;
121097
121098     _get();
121099     utils.forEach(_alarmStack, function (alarmStore) {
121100         if (alarmStore.id !== id)
121101             return;
121102
121103         alarm = _convertToAlarm(alarmStore);
121104         if (alarm.delay !== undefined) {
121105             diff = alarm.getRemainingSeconds();
121106             if (0 < diff && diff < 2) {
121107                 event.trigger("SendTriggerAppId", [alarmStore.applicationId]);
121108             }
121109         } else {
121110             diff = (new Date()) - alarm.getNextScheduledDate();
121111             if (-2000 < diff && diff < 2000) {
121112                 event.trigger("SendTriggerAppId", [alarmStore.applicationId]);
121113             }
121114         }
121115     });
121116 }
121117
121118
121119 _self = function () {
121120     var currentAppId, alarm;
121121
121122     alarm = {
121123         add: function (alarm, applicationId, appControl) {
121124             var id, alarmStore;
121125
121126             if (!_security.add) {
121127                 throw new WebAPIException(errorcode.SECURITY_ERR);
121128             }
121129
121130             t.AlarmManager("add", arguments);
121131
121132             alarm.__defineGetter__("id", function () {
121133                 return id;
121134             });
121135
121136             id = Math.uuid(null, 16);
121137             currentAppId = _getCurrentAppId(); // Update The Current URL.
121138             alarmStore = new AlarmStore(alarm, applicationId, currentAppId, appControl);
121139             _updateDB(alarmStore);
121140         },
121141
121142         remove: function (id) {
121143             var isFound = false, i;
121144
121145             if (!_security.remove) {
121146                 throw new WebAPIException(errorcode.SECURITY_ERR);
121147             }
121148
121149             t.AlarmManager("remove", arguments);
121150
121151             for (i in _alarmStack) {
121152                 if (_alarmStack[i].id !== id)
121153                     continue;
121154
121155                 _alarmStack.splice(i, 1);
121156                 _save();
121157                 isFound = true;
121158             }
121159
121160             if (!isFound) {
121161                 throw new WebAPIException(errorcode.NOT_FOUND_ERR);
121162             }
121163         },
121164
121165         removeAll: function () {
121166             var availableStack = [], i;
121167
121168             if (!_security.removeAll)
121169                 throw new WebAPIException(errorcode.SECURITY_ERR);
121170
121171             t.AlarmManager("removeAll", arguments);
121172
121173             for (i in _alarmStack) {
121174                 if (_alarmStack[i].currentAppId === currentAppId)
121175                     continue;
121176
121177                 availableStack.push(_alarmStack[i]);
121178             }
121179             _alarmStack = availableStack;
121180             _save();
121181         },
121182
121183         get: function (id) {
121184             var isFound = false, item, isExpired, alarm;
121185
121186             t.AlarmManager("get", arguments);
121187
121188             for (item in _alarmStack) {
121189                 if (_alarmStack[item].id === id) {
121190                     alarm = _convertToAlarm(_alarmStack[item]);
121191                     isExpired = _checkTriggerAlarm(alarm);
121192                     if (isExpired) {
121193                         _alarmStack.splice(item, 1);
121194                         _save();
121195                     } else {
121196                         isFound = true;
121197                     }
121198                     break;
121199                 }
121200             }
121201             if (!isFound) {
121202                 throw new WebAPIException(errorcode.NOT_FOUND_ERR);
121203             }
121204
121205             return alarm;
121206         },
121207
121208         getAll: function () {
121209             var availableStack = [], backAlarms = [], isExpired, alarm, i;
121210
121211             t.AlarmManager("getAll", arguments);
121212
121213             for (i in _alarmStack) {
121214                 alarm = _convertToAlarm(_alarmStack[i]); // alarmStore --> alarm
121215                 isExpired = _checkTriggerAlarm(alarm); // Check if the alarm is expired
121216                 if (isExpired)
121217                     continue;
121218
121219                 availableStack.push(_alarmStack[i]);
121220                 if (_alarmStack[i].currentAppId === currentAppId)
121221                     backAlarms.push(alarm);
121222             }
121223             _alarmStack = availableStack;
121224             _save();
121225             return backAlarms;
121226         },
121227
121228         handleSubFeatures: function (subFeatures) {
121229             var i, subFeature;
121230
121231             for (subFeature in subFeatures) {
121232                 for (i in _security[subFeature]) {
121233                     _security[_security[subFeature][i]] = true;
121234                 }
121235             }
121236         }
121237     };
121238
121239     currentAppId = _getCurrentAppId();
121240     _get();
121241
121242     alarm.__defineGetter__("PERIOD_MINUTE", function () {
121243         return PERIOD_MINUTE;
121244     });
121245
121246     alarm.__defineGetter__("PERIOD_HOUR", function () {
121247         return PERIOD_HOUR;
121248     });
121249
121250     alarm.__defineGetter__("PERIOD_DAY", function () {
121251         return PERIOD_DAY;
121252     });
121253
121254     alarm.__defineGetter__("PERIOD_WEEK", function () {
121255         return PERIOD_WEEK;
121256     });
121257
121258     return alarm;
121259 };
121260
121261 AlarmStore = function (alarmObject, applicationId, currentAppId, appControl) {
121262     var _self;
121263     _self = {
121264         id: alarmObject.id,
121265         delay: alarmObject.delay || null,
121266         date: alarmObject.date || null,
121267         period: alarmObject.period || null,
121268         daysOfTheWeek: alarmObject.daysOfTheWeek || null,
121269         applicationId: applicationId,
121270         currentAppId: currentAppId,
121271         appControl: appControl || null
121272     };
121273     return _self;
121274 };
121275
121276 event.on("CheckAlarm", function (id) {
121277     _eventCheckAlarm(id);
121278 });
121279
121280 module.exports = _self;
121281
121282 });
121283 define('ripple/platform/tizen/2.0/CalendarEvent', function (require, exports, module) {
121284 /*
121285  *  Copyright 2013 Intel Corporation.
121286  *
121287  * Licensed under the Apache License, Version 2.0 (the "License");
121288  * you may not use this file except in compliance with the License.
121289  * You may obtain a copy of the License at
121290  *
121291  * http://www.apache.org/licenses/LICENSE-2.0
121292  *
121293  * Unless required by applicable law or agreed to in writing, software
121294  * distributed under the License is distributed on an "AS IS" BASIS,
121295  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
121296  * See the License for the specific language governing permissions and
121297  * limitations under the License.
121298  */
121299
121300 var t = require('ripple/platform/tizen/2.0/typecast'),
121301     typedef = require('ripple/platform/tizen/2.0/typedef'),
121302     CalendarItem = require('ripple/platform/tizen/2.0/CalendarItem'),
121303     CalendarEvent;
121304
121305 CalendarEvent = function () {
121306     var voc, calendarEvent = {};
121307
121308     // private
121309     function construct(eventInitDict) {
121310         CalendarItem.call(this, eventInitDict);
121311
121312         this.status = "CONFIRMED";
121313
121314         calendarEvent.convertToString  = this.convertToString;
121315         calendarEvent.isDetached       = false;
121316         calendarEvent.endDate          = null;
121317         calendarEvent.availability     = "BUSY";
121318         calendarEvent.recurrenceRule   = null;
121319
121320         this.__defineGetter__("isDetached", function () {
121321             return calendarEvent.isDetached;
121322         });
121323
121324         this.__defineGetter__("endDate", function () {
121325             return calendarEvent.endDate;
121326         });
121327         this.__defineSetter__("endDate", function (val) {
121328             try {
121329                 calendarEvent.endDate = t.TZDate(val, "?");
121330             } catch (e) {
121331             }
121332         });
121333
121334         this.__defineGetter__("availability", function () {
121335             return calendarEvent.availability;
121336         });
121337         this.__defineSetter__("availability", function (val) {
121338             try {
121339                 calendarEvent.availability = t.EventAvailability(val);
121340             } catch (e) {
121341             }
121342         });
121343
121344         this.__defineGetter__("recurrenceRule", function () {
121345             return calendarEvent.recurrenceRule;
121346         });
121347         this.__defineSetter__("recurrenceRule", function (val) {
121348             try {
121349                 calendarEvent.recurrenceRule = t.CalendarRecurrenceRule(val,
121350                         "?");
121351             } catch (e) {
121352             }
121353         });
121354
121355         this.convertToString  = convertToString;
121356         this.clone            = clone(this);
121357         this.expandRecurrence = expandRecurrence;
121358     }
121359
121360     function clone(self) {
121361         return function () {
121362             return new CalendarEvent(self);
121363         };
121364     }
121365
121366     // public
121367     function convertToString(format) {
121368         var str;
121369
121370         str = calendarEvent.convertToString.call(this, format);
121371         str = str.replace(/#TYPE#/g, "VEVENT");
121372
121373         // TODO: endDate is not supported
121374         // TODO: recurrenceRule is not supported
121375         str = str.replace(/#AVAILABILITY#/g, "FREEBUSY;FBTYPE=" +
121376                 calendarEvent.availability);
121377
121378         str = str.replace(/#[^#]*#/g, "");
121379
121380         return str;
121381     }
121382
121383     function expandRecurrence(startDate, endDate, successCallback,
121384             errorCallback) {
121385     }
121386
121387     // Constructor
121388     function CalendarEvent_CalendarEventInit(eventInitDict) {
121389         var attr;
121390
121391         construct.call(this, eventInitDict);
121392
121393         if (eventInitDict) {
121394             for (attr in eventInitDict) {
121395                 if (attr in typedef.CalendarEventInit) {
121396                     calendarEvent[attr] = eventInitDict[attr];
121397                 }
121398             }
121399         }
121400     }
121401
121402     function CalendarEvent_DOMString_CalendarTextFormat(stringRepresentation,
121403             format) {
121404     }
121405
121406     voc = [CalendarEvent_CalendarEventInit,
121407            CalendarEvent_DOMString_CalendarTextFormat];
121408     t.CalendarEvent(arguments, this, voc);
121409 };
121410
121411 module.exports = CalendarEvent;
121412
121413 });
121414 define('ripple/platform/tizen/2.0/ContactBase', function (require, exports, module) {
121415 /*
121416  *  Copyright 2013 Intel Corporation.
121417  *
121418  * Licensed under the Apache License, Version 2.0 (the "License");
121419  * you may not use this file except in compliance with the License.
121420  * You may obtain a copy of the License at
121421  *
121422  * http://www.apache.org/licenses/LICENSE-2.0
121423  *
121424  * Unless required by applicable law or agreed to in writing, software
121425  * distributed under the License is distributed on an "AS IS" BASIS,
121426  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
121427  * See the License for the specific language governing permissions and
121428  * limitations under the License.
121429  */
121430
121431 var decorator = require('ripple/platform/tizen/2.0/decorator'),
121432     t = require('ripple/platform/tizen/2.0/typecast'),
121433     ContactName = require('ripple/platform/tizen/2.0/ContactName'),
121434     ContactAddress = require('ripple/platform/tizen/2.0/ContactAddress'),
121435     ContactPhoneNumber = require('ripple/platform/tizen/2.0/ContactPhoneNumber'),
121436     ContactEmailAddress = require('ripple/platform/tizen/2.0/ContactEmailAddress'),
121437     ContactAnniversary = require('ripple/platform/tizen/2.0/ContactAnniversary'),
121438     ContactOrganization = require('ripple/platform/tizen/2.0/ContactOrganization'),
121439     ContactWebSite = require('ripple/platform/tizen/2.0/ContactWebSite'),
121440     Contact;
121441
121442 Contact = function () {
121443     var voc;
121444
121445     // private
121446     function construct() {
121447         this.name          = null;
121448         this.addresses     = [];
121449         this.photoURI      = null;
121450         this.phoneNumbers  = [];
121451         this.emails        = [];
121452         this.birthday      = null;
121453         this.anniversaries = [];
121454         this.organizations = [];
121455         this.notes         = [];
121456         this.urls          = [];
121457         this.ringtoneURI   = null;
121458         this.groupIds      = [];
121459     }
121460
121461     // Constructor
121462     function Contact_ContactInit(contactInitDict) {
121463         var i, attr, arr;
121464
121465         construct.apply(this);
121466
121467         for (attr in contactInitDict) {
121468             switch (attr) {
121469             case "name":
121470                 this[attr] = new ContactName(contactInitDict[attr]);
121471                 break;
121472
121473             case "addresses":
121474                 arr = contactInitDict[attr];
121475                 if (arr) {
121476                     for (i in arr) {
121477                         this[attr][i] = new ContactAddress(arr[i]);
121478                     }
121479                 }
121480                 break;
121481
121482             case "phoneNumbers":
121483                 arr = contactInitDict[attr];
121484                 if (arr) {
121485                     for (i in arr) {
121486                         this[attr][i] = new ContactPhoneNumber(arr[i].number,
121487                                 arr[i].types || null, arr[i].isDefault || null);
121488                     }
121489                 }
121490                 break;
121491
121492             case "emails":
121493                 arr = contactInitDict[attr];
121494                 if (arr) {
121495                     for (i in arr) {
121496                         this[attr][i] = new ContactEmailAddress(arr[i].email,
121497                                 arr[i].types || null, arr[i].isDefault || null);
121498                     }
121499                 }
121500                 break;
121501
121502             case "birthday":
121503                 this[attr] = new Date(contactInitDict[attr]);
121504                 break;
121505
121506             case "anniversaries":
121507                 arr = contactInitDict[attr];
121508                 if (arr) {
121509                     for (i in arr) {
121510                         this[attr][i] = new ContactAnniversary(arr[i].date,
121511                                 arr[i].label || null);
121512                     }
121513                 }
121514                 break;
121515
121516             case "organizations":
121517                 arr = contactInitDict[attr];
121518                 if (arr) {
121519                     for (i in arr) {
121520                         this[attr][i] = new ContactOrganization(arr[i]);
121521                     }
121522                 }
121523                 break;
121524
121525             case "notes":
121526             case "groupIds":
121527                 arr = contactInitDict[attr];
121528                 if (arr) {
121529                     for (i in arr) {
121530                         this[attr][i] = arr[i];
121531                     }
121532                 }
121533                 break;
121534
121535             case "urls":
121536                 arr = contactInitDict[attr];
121537                 if (arr) {
121538                     for (i in arr) {
121539                         this[attr][i] = new ContactWebSite(arr[i].url,
121540                                 arr[i].type || null);
121541                     }
121542                 }
121543                 break;
121544
121545             default:
121546                 this[attr] = contactInitDict[attr];
121547                 break;
121548             }
121549         }
121550
121551         decorator.Contact(this);
121552     }
121553
121554     function Contact_DOMString(stringRepresentation) {
121555     }
121556
121557     voc = [Contact_ContactInit, Contact_DOMString];
121558     t.Contact(arguments, this, voc);
121559 };
121560
121561 module.exports = Contact;
121562
121563 });
121564 define('ripple/platform/tizen/2.0/ContactAnniversary', function (require, exports, module) {
121565 /*
121566  *  Copyright 2013 Intel Corporation.
121567  *
121568  * Licensed under the Apache License, Version 2.0 (the "License");
121569  * you may not use this file except in compliance with the License.
121570  * You may obtain a copy of the License at
121571  *
121572  * http://www.apache.org/licenses/LICENSE-2.0
121573  *
121574  * Unless required by applicable law or agreed to in writing, software
121575  * distributed under the License is distributed on an "AS IS" BASIS,
121576  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
121577  * See the License for the specific language governing permissions and
121578  * limitations under the License.
121579  */
121580
121581 var t = require('ripple/platform/tizen/2.0/typecast'),
121582     ContactAnniversary;
121583
121584 ContactAnniversary = function (date, label) {
121585     var contactAnniversary = {};
121586
121587     t.ContactAnniversary(arguments, this);
121588
121589     contactAnniversary.date  = date;
121590     contactAnniversary.label = label || null;
121591
121592     this.__defineGetter__("date", function () {
121593         return contactAnniversary.date;
121594     });
121595     this.__defineSetter__("date", function (val) {
121596         try {
121597             contactAnniversary.date = t.Date(val);
121598         } catch (e) {
121599         }
121600     });
121601
121602     this.__defineGetter__("label", function () {
121603         return contactAnniversary.label;
121604     });
121605     this.__defineSetter__("label", function (val) {
121606         try {
121607             contactAnniversary.label = t.DOMString(val, "?");
121608         } catch (e) {
121609         }
121610     });
121611 };
121612
121613 module.exports = ContactAnniversary;
121614
121615 });
121616 define('ripple/platform/tizen/2.0/SortMode', function (require, exports, module) {
121617 /*
121618  *  Copyright 2013 Intel Corporation.
121619  *
121620  * Licensed under the Apache License, Version 2.0 (the "License");
121621  * you may not use this file except in compliance with the License.
121622  * You may obtain a copy of the License at
121623  *
121624  * http://www.apache.org/licenses/LICENSE-2.0
121625  *
121626  * Unless required by applicable law or agreed to in writing, software
121627  * distributed under the License is distributed on an "AS IS" BASIS,
121628  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
121629  * See the License for the specific language governing permissions and
121630  * limitations under the License.
121631  */
121632
121633 var t = require('ripple/platform/tizen/2.0/typecast'),
121634     SortMode;
121635
121636 SortMode = function (attributeName, order) {
121637     var sortMode = {};
121638
121639     t.SortMode(arguments, this);
121640
121641     this.__defineGetter__("attributeName", function () {
121642         return sortMode.attributeName;
121643     });
121644     this.__defineSetter__("attributeName", function (val) {
121645         try {
121646             sortMode.attributeName = t.DOMString(val);
121647         } catch (e) {
121648         }
121649     });
121650
121651     this.__defineGetter__("order", function () {
121652         return sortMode.order;
121653     });
121654     this.__defineSetter__("order", function (val) {
121655         try {
121656             sortMode.order = t.SortModeOrder(val);
121657         } catch (e) {
121658         }
121659     });
121660
121661     sortMode.attributeName = attributeName;
121662     sortMode.order         = order || "ASC";
121663 };
121664
121665 module.exports = SortMode;
121666
121667 });
121668 define('ripple/platform/tizen/2.0/AlarmRelative', function (require, exports, module) {
121669 /*
121670  *  Copyright 2012 Intel Corporation.
121671  *
121672  * Licensed under the Apache License, Version 2.0 (the "License");
121673  * you may not use this file except in compliance with the License.
121674  * You may obtain a copy of the License at
121675  *
121676  * http://www.apache.org/licenses/LICENSE-2.0
121677  *
121678  * Unless required by applicable law or agreed to in writing, software
121679  * distributed under the License is distributed on an "AS IS" BASIS,
121680  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
121681  * See the License for the specific language governing permissions and
121682  * limitations under the License.
121683  */
121684
121685 var AlarmBase = require('ripple/platform/tizen/2.0/AlarmBase'),
121686     t = require('ripple/platform/tizen/2.0/typecast'),
121687     AlarmRelative;
121688
121689 AlarmRelative = function (delay, period) {
121690     var alarm, date;
121691
121692     t.AlarmRelative(arguments, this);
121693
121694     alarm  = new AlarmBase(this);
121695     period = period || null;
121696     date   = new Date(); // Alarm settime
121697
121698     this.getRemainingSeconds = function () {
121699         var current, diff, triggerDate, MILLI_SECOND = 1000;
121700         current     = new Date();
121701         triggerDate = new Date(delay * MILLI_SECOND + date.getTime()); // First triggerDate
121702         diff        = Math.round((triggerDate - current) / MILLI_SECOND);
121703
121704         if (diff > 0) // Before first trigger
121705             return diff;
121706
121707         if (period === null)
121708             return null; // Alarm is expired
121709
121710         while (current - triggerDate >= 0) { // Trigger repeatly
121711             triggerDate = new Date(period * MILLI_SECOND + triggerDate.getTime());
121712         }
121713         diff = Math.round(((triggerDate - current) / MILLI_SECOND));
121714         return diff;
121715     };
121716
121717     this.__defineGetter__("delay", function () {
121718         return delay;
121719     });
121720
121721     this.__defineGetter__("period", function () {
121722         return period;
121723     });
121724 };
121725
121726 module.exports = AlarmRelative;
121727
121728 });
121729 define('ripple/platform/tizen/2.0/DeviceMotionEvent', function (require, exports, module) {
121730 /*
121731  *  Copyright 2012 Intel Corporation.
121732  *
121733  * Licensed under the Apache License, Version 2.0 (the "License");
121734  * you may not use this file except in compliance with the License.
121735  * You may obtain a copy of the License at
121736  *
121737  * http://www.apache.org/licenses/LICENSE-2.0
121738  *
121739  * Unless required by applicable law or agreed to in writing, software
121740  * distributed under the License is distributed on an "AS IS" BASIS,
121741  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
121742  * See the License for the specific language governing permissions and
121743  * limitations under the License.
121744  */
121745
121746 var utils = require('ripple/utils'),
121747     Event = require('ripple/platform/tizen/2.0/EventBase');
121748
121749 module.exports = function () {
121750     var _self = {
121751             acceleration: {
121752                 x: null,
121753                 y: null,
121754                 z: null
121755             },
121756             accelerationIncludingGravity: {
121757                 x: null,
121758                 y: null,
121759                 z: null
121760             },
121761             rotationRate: {
121762                 alpha: null,
121763                 beta: null,
121764                 gamma: null
121765             },
121766             interval: 0
121767         };
121768
121769     Event.call(this);
121770
121771     this.__defineGetter__("acceleration", function () {
121772         return _self.acceleration;
121773     });
121774
121775     this.__defineGetter__("accelerationIncludingGravity", function () {
121776         return _self.accelerationIncludingGravity;
121777     });
121778
121779     this.__defineGetter__("rotationRate", function () {
121780         return _self.rotationRate;
121781     });
121782
121783     this.__defineGetter__("interval", function () {
121784         return _self.interval;
121785     });
121786
121787     this.initAccelerometerEvent = function (accelerometerType, accelerometerBubbles, accelerometerCancelable,
121788                                             accelerationData, accelerationGData, rotationRateData, intervalValue) {
121789         this.initEvent(accelerometerType, accelerometerBubbles, accelerometerCancelable);
121790
121791         _self.acceleration = utils.copy(accelerationData);
121792         _self.accelerationIncludingGravity = utils.copy(accelerationGData);
121793         _self.rotationRate = utils.copy(rotationRateData);
121794         _self.interval = intervalValue;
121795     };
121796 };
121797
121798
121799 });
121800 define('ripple/platform/tizen/2.0/sensors', function (require, exports, module) {
121801 /*
121802  *  Copyright 2012 Intel Corporation.
121803  *
121804  * Licensed under the Apache License, Version 2.0 (the "License");
121805  * you may not use this file except in compliance with the License.
121806  * You may obtain a copy of the License at
121807  *
121808  * http://www.apache.org/licenses/LICENSE-2.0
121809  *
121810  * Unless required by applicable law or agreed to in writing, software
121811  * distributed under the License is distributed on an "AS IS" BASIS,
121812  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
121813  * See the License for the specific language governing permissions and
121814  * limitations under the License.
121815  */
121816
121817 var utils = require('ripple/utils'),
121818     sensors = require('ripple/platform/tizen/2.0/spec/sensor'),
121819     _sensors = ["Accelerometer", "MagneticField", "Rotation", "Orientation"],
121820     _permission = true,
121821     _isWriteable = false,
121822     _self;
121823
121824 function SensorError(code, msg) {
121825     this.__defineGetter__("message", function () {
121826         return msg;
121827     });
121828     this.__defineGetter__("code", function () {
121829         return code;
121830     });
121831
121832     this.PERMISSION_DENIED = -100;
121833 }
121834
121835 function SensorRequest() {
121836     var _self = {
121837         result: [],
121838         error: null,
121839         readyState: "processing"
121840     };
121841
121842     this.__defineGetter__("result", function () {
121843         return _self.result;
121844     });
121845     this.__defineSetter__("result", function (resultData) {
121846         if (_isWriteable) {
121847             _self.result = utils.copy(resultData);
121848             _isWriteable = false;
121849             return;
121850         }
121851     });
121852
121853     this.__defineGetter__("error", function () {
121854         return _self.error;
121855     });
121856     this.__defineSetter__("error", function (errorData) {
121857         if (_isWriteable) {
121858             _self.error = utils.copy(errorData);
121859             _isWriteable = false;
121860             return;
121861         }
121862     });
121863
121864     this.__defineGetter__("readyState", function () {
121865         return _self.readyState;
121866     });
121867     this.__defineSetter__("readyState", function (readyStateData) {
121868         if (_isWriteable) {
121869             _self.readyState = readyStateData;
121870             _isWriteable = false;
121871             return;
121872         }
121873     });
121874 }
121875
121876 _self = {
121877     findSensors: function (type) {
121878         var sensorRequest = new SensorRequest(), index, sensorName = "";
121879
121880         setTimeout(function () {
121881             if (_permission) {
121882                 for (index = 0; index < _sensors.length; index++) {
121883                     sensorName = _sensors[index];
121884                     if (type === null || type === undefined || type === sensorName) {
121885                         _isWriteable = true;
121886                         sensorRequest.result.push(sensors[sensorName]);
121887                     }
121888                 }
121889
121890                 _isWriteable = true;
121891                 sensorRequest.readyState = "done";
121892
121893                 if (sensorRequest.onsuccess) {
121894                     sensorRequest.onsuccess();
121895                 }
121896             }
121897             else {
121898                 // error event on the request with error code PERMISSION_DENIED must be fired.
121899                 sensorRequest.error = new SensorError(-100, "permission denied!");
121900                 if (sensorRequest.onerror) {
121901                     sensorRequest.onerror();
121902                 }
121903             }
121904         }, 1);
121905
121906         return sensorRequest;
121907     }
121908 };
121909
121910 module.exports = _self;
121911
121912
121913 });
121914 define('ripple/platform/tizen/2.0/callHistory', function (require, exports, module) {
121915 /*
121916  *  Copyright 2012 Intel Corporation.
121917  *
121918  * Licensed under the Apache License, Version 2.0 (the "License");
121919  * you may not use this file except in compliance with the License.
121920  * You may obtain a copy of the License at
121921  *
121922  * http://www.apache.org/licenses/LICENSE-2.0
121923  *
121924  * Unless required by applicable law or agreed to in writing, software
121925  * distributed under the License is distributed on an "AS IS" BASIS,
121926  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
121927  * See the License for the specific language governing permissions and
121928  * limitations under the License.
121929  */
121930
121931 var utils = require('ripple/utils'),
121932     db = require('ripple/db'),
121933     event = require('ripple/event'),
121934     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
121935     WebAPIError = require('ripple/platform/tizen/2.0/WebAPIError'),
121936     WebAPIException = require('ripple/platform/tizen/2.0/WebAPIException'),
121937     t = require('ripple/platform/tizen/2.0/typecast'),
121938     TypeCoerce = require('ripple/platform/tizen/2.0/typecoerce'),
121939     tizen1_utils = require('ripple/platform/tizen/2.0/tizen1_utils'),
121940     _DB_CALL_KEY = "tizen1-db-callhistory",
121941     _data = {
121942         observers: {},
121943         callHistory: []
121944     },
121945     _security = {
121946         "http://tizen.org/privilege/callhistory.read": ["find", "addChangeListener", "removeChangeListener"],
121947         "http://tizen.org/privilege/callhistory.write": ["remove", "removeBatch", "removeAll"]
121948     },
121949     _self;
121950
121951 function _getValue(inputValue, key) {
121952     var keys = key.split("."),
121953         value = inputValue[keys[0]],
121954         index;
121955
121956     for (index = 1; index < keys.length; index++) {
121957         if (value[keys[index]]) {
121958             value = value[keys[index]];
121959         }
121960     }
121961
121962     return value;
121963 }
121964
121965 function _filter(inputArray, filter) {
121966     var index, filterResults = [], compositeResultArray;
121967
121968     if (filter === null || filter === undefined) {
121969         return inputArray;
121970     }
121971
121972     if (filter.type && filter.filters) {
121973         filterResults = _filter(inputArray, filter.filters[0]);
121974         for (index = 1; index < filter.filters.length; index++) {
121975             compositeResultArray = _filter(inputArray, filter.filters[index]);
121976
121977             filterResults = tizen1_utils.arrayComposite(filter.type, filterResults, compositeResultArray);
121978         }
121979         return filterResults;
121980     }
121981
121982     if (filter.attributeName === null || filter.attributeName === undefined) {
121983         throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
121984     }
121985
121986     if (filter.matchFlag) {
121987         if (filter.attributeName === 'features') {
121988             filterResults = tizen1_utils.matchAttributeArrayFilter(inputArray, filter.attributeName, filter.matchFlag, filter.matchValue);
121989         } else {
121990             filterResults = tizen1_utils.matchAttributeFilter(inputArray, filter.attributeName, filter.matchFlag, filter.matchValue);
121991         }
121992     }
121993     else if (filter.initialValue || filter.endValue) {
121994         filterResults = tizen1_utils.matchAttributeRangeFilter(inputArray, filter.attributeName, filter.initialValue, filter.endValue);
121995     }
121996
121997     return filterResults;
121998 }
121999
122000 function _sort(inputArray, sortMode) {
122001     if (sortMode.attributeName === null || sortMode.attributeName === undefined) {
122002         throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
122003     }
122004
122005     inputArray.sort(function (a, b) {
122006         return sortMode.order === "ASC" ? _getValue(a, sortMode.attributeName) - _getValue(b, sortMode.attributeName) :
122007                _getValue(b, sortMode.attributeName) - _getValue(a, sortMode.attributeName);
122008     });
122009
122010     return inputArray;
122011 }
122012
122013 function _save() {
122014     db.saveObject(_DB_CALL_KEY, _data.callHistory);
122015 }
122016
122017 function _retrieve() {
122018     var index;
122019
122020     _data.callHistory = db.retrieveObject(_DB_CALL_KEY) || [];
122021
122022     for (index = 0; index < _data.callHistory.length; index++) {
122023         _data.callHistory[index].startTime = new Date(_data.callHistory[index].startTime);
122024     }
122025 }
122026
122027 function _isValidCallHistoryEntry(arg) {
122028     return arg && arg.hasOwnProperty("uid") && arg.hasOwnProperty("type") &&
122029            arg.hasOwnProperty("features") && arg.hasOwnProperty("remoteParties") &&
122030            arg.hasOwnProperty("startTime") && arg.hasOwnProperty("duration") &&
122031            arg.hasOwnProperty("direction");
122032 }
122033
122034 function _rtnRmtPty(pty) {
122035     var _remoteParty = pty.remoteParty,
122036         _personId = pty.personId,
122037         _self = {};
122038     _self.__defineGetter__("remoteParty", function () {
122039         return _remoteParty;
122040     });
122041     _self.__defineGetter__("personId", function () {
122042         return _personId;
122043     });
122044     return _self;
122045 }
122046
122047 function _rtnEntry(entry) {
122048     var _uid = entry.uid,
122049         _type = entry.type,
122050         _features = tizen1_utils.copy(entry.features),
122051         _remoteParties = [],
122052         _startTime = new Date(entry.startTime),
122053         _duration = entry.duration,
122054         _direction = entry.direction,
122055         _self = {}, i;
122056
122057     for (i = 0; i < entry.remoteParties.length; i++) {
122058         _remoteParties.push(_rtnRmtPty(entry.remoteParties[i]));
122059     }
122060     _self.__defineGetter__("uid", function () {
122061         return _uid;
122062     });
122063     _self.__defineGetter__("type", function () {
122064         return _type;
122065     });
122066     _self.__defineGetter__("features", function () {
122067         return _features;
122068     });
122069     _self.__defineGetter__("remoteParties", function () {
122070         return _remoteParties;
122071     });
122072     _self.__defineGetter__("startTime", function () {
122073         return _startTime;
122074     });
122075     _self.__defineGetter__("duration", function () {
122076         return _duration;
122077     });
122078     _self.direction = _direction;
122079
122080     return _self;
122081 }
122082
122083 function _initialize() {
122084     _retrieve();
122085
122086     event.on("CallInProgress", function () {
122087     });
122088
122089     event.on("CallRecorded", function (record) {
122090         var historyEntry = tizen1_utils.copy(record);
122091         historyEntry.uid = Math.uuid(8, 16);
122092
122093         _data.callHistory.push(historyEntry);
122094         _save();
122095
122096         utils.forEach(_data.observers, function (observer) {
122097             observer.onadded([historyEntry]);
122098         });
122099     });
122100 }
122101
122102 _self = function () {
122103     this.find = function (successCallback, errorCallback, filter, sortMode, limit, offset) {
122104         var i, rtn = [],
122105             filterResults,
122106             limitValue = limit | 0,
122107             offsetValue = offset | 0;
122108
122109         if (!_security.find) {
122110             throw new WebAPIException(errorcode.SECURITY_ERR);
122111         }
122112
122113         t.CallHistory("find", arguments);
122114
122115         filterResults = tizen1_utils.copy(_data.callHistory);
122116         if (filter !== null && filter !== undefined) {
122117             filterResults = _filter(filterResults, filter);
122118         }
122119
122120         if (sortMode !== null && sortMode !== undefined) {
122121             _sort(filterResults, sortMode);
122122         }
122123
122124         setTimeout(function () {
122125             if (limitValue > 0) {
122126                 offsetValue = offsetValue > 0 ? offsetValue : 0;
122127                 filterResults = filterResults.slice(offsetValue, limitValue);
122128             }
122129
122130             for (i = 0; i < filterResults.length; i++) {
122131                 rtn.push(_rtnEntry(filterResults[i]));
122132             }
122133             successCallback(rtn);
122134         }, 1);
122135     };
122136     this.remove = function (entry) {
122137         var isFound = false, rtn = [];
122138
122139         if (!_security.remove) {
122140             throw new WebAPIException(errorcode.SECURITY_ERR);
122141         }
122142
122143         t.CallHistory("remove", arguments);
122144
122145         _data.callHistory = _data.callHistory.filter(function (element) {
122146             return utils.some(element, function (value, key) {
122147                 if (tizen1_utils.isEqual(entry[key], value)) {
122148                     isFound = true;
122149                     return false;
122150                 }
122151                 return true;
122152             });
122153         });
122154
122155         if (!isFound) {
122156             throw new WebAPIException(errorcode.NOT_FOUND_ERR);
122157         }
122158
122159         _save();
122160         rtn.push(_rtnEntry(entry));
122161         utils.forEach(_data.observers, function (observer) {
122162             observer.onchanged(rtn);
122163         });
122164
122165     };
122166     this.removeBatch = function (entries, successCallback, errorCallback) {
122167         var isFound = false, i, rtn = [];
122168
122169         if (!_security.removeBatch) {
122170             throw new WebAPIException(errorcode.SECURITY_ERR);
122171         }
122172
122173         t.CallHistory("removeBatch", arguments);
122174
122175         setTimeout(function () {
122176             isFound = entries.every(function (element) {
122177                 return _data.callHistory.some(function (callHistory) {
122178                     return element.uid === callHistory.uid;
122179                 });
122180             });
122181
122182             if (!isFound) {
122183                 if (errorCallback) {
122184                     errorCallback(new WebAPIError(errorcode.NOT_FOUND_ERR));
122185                 }
122186                 return;
122187             }
122188
122189             _data.callHistory = _data.callHistory.filter(function (element) {
122190                 return !entries.some(function (entryValue, entryIndex) {
122191                     return tizen1_utils.isEqual(element, entryValue);
122192                 });
122193             });
122194
122195             _save();
122196
122197             if (successCallback) {
122198                 successCallback();
122199             }
122200             for (i = 0; i < entries.length; i++) {
122201                 rtn.push(_rtnEntry(entries[i]));
122202             }
122203             utils.forEach(_data.observers, function (observer) {
122204                 observer.onchanged(rtn);
122205             });
122206         }, 1);
122207     };
122208     this.removeAll = function (successCallback, errorCallback) {
122209         var i, rtn = [];
122210
122211         if (!_security.removeAll) {
122212             throw new WebAPIException(errorcode.SECURITY_ERR);
122213         }
122214
122215         t.CallHistory("removeAll", arguments);
122216
122217         for (i = 0; i < _data.callHistory.length; i++) {
122218             rtn.push(_rtnEntry(_data.callHistory[i]));
122219         }
122220
122221         _data.callHistory = [];
122222         _save();
122223
122224         utils.forEach(_data.observers, function (observer) {
122225             observer.onchanged(rtn);
122226         });
122227
122228         if (successCallback) {
122229             setTimeout(function () {
122230                 successCallback();
122231             }, 1);
122232         }
122233
122234     };
122235     this.addChangeListener = function (observerObj) {
122236         var handle = Number(Math.uuid(8, 10));
122237
122238         if (!_security.addChangeListener) {
122239             throw new WebAPIException(errorcode.SECURITY_ERR);
122240         }
122241
122242         t.CallHistory("addChangeListener", arguments);
122243
122244         _data.observers[handle] = observerObj;
122245
122246         return handle;
122247     };
122248     this.removeChangeListener = function (handle) {
122249         if (!_security.removeChangeListener) {
122250             throw new WebAPIException(errorcode.SECURITY_ERR);
122251         }
122252
122253         if (!_data.observers[handle])
122254             return;
122255
122256         delete _data.observers[handle];
122257     };
122258     this.handleSubFeatures = function (subFeatures) {
122259         function setSecurity(method) {
122260             _security[method] = true;
122261         }
122262
122263         for (var subFeature in subFeatures) {
122264             utils.forEach(_security[subFeature], setSecurity);
122265         }
122266     };
122267 };
122268
122269 _initialize();
122270
122271 module.exports = _self;
122272
122273 });
122274 define('ripple/platform/tizen/2.0/filesystem', function (require, exports, module) {
122275 /*
122276  *  Copyright 2012 Intel Corporation.
122277  *
122278  * Licensed under the Apache License, Version 2.0 (the "License");
122279  * you may not use this file except in compliance with the License.
122280  * You may obtain a copy of the License at
122281  *
122282  * http://www.apache.org/licenses/LICENSE-2.0
122283  *
122284  * Unless required by applicable law or agreed to in writing, software
122285  * distributed under the License is distributed on an "AS IS" BASIS,
122286  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
122287  * See the License for the specific language governing permissions and
122288  * limitations under the License.
122289  */
122290
122291 var event = require('ripple/event'),
122292     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
122293     WebAPIError = require('ripple/platform/tizen/2.0/WebAPIError'),
122294     WebAPIException = require('ripple/platform/tizen/2.0/WebAPIException'),
122295     utils = require('ripple/utils'),
122296     dbfs  = require('ripple/platform/tizen/2.0/dbfs'),
122297     tizen1_utils = require('ripple/platform/tizen/2.0/tizen1_utils'),
122298     _maxPathLength = 256,
122299     _virtualRoots = ["documents", "images", "music", "videos", "downloads", "wgt-package", "wgt-private", "wgt-private-tmp", "removable", "attachments"],
122300     _security = {
122301         "http://tizen.org/privilege/filesystem": [],
122302         "http://tizen.org/privilege/filesystem.read": ["copyTo", "moveTo", "createDirectory", "createFile", "deleteDirectory", "deleteFile", "openStreamR"],
122303         "http://tizen.org/privilege/filesystem.write": ["readAsText", "openStreamW"],
122304         all: true
122305     },
122306     _realRoots = dbfs.roots,
122307     _r2vmap = {},
122308     _v2rmap = {},
122309     _initialized = false,
122310     _readOnly  = false,
122311     _writeOnly = false,
122312     _defaultMode = "rw",
122313     _storages = [], // filesystem storages
122314     _observers = [],
122315     File,
122316     FileStream,
122317     FileFilter,
122318     FileSystemStorage;
122319
122320 function _isValidChar(c) {
122321     return  (c >= '0' && c <= '9') ||
122322         (c >= 'a' && c <= 'z') ||
122323         (c >= 'A' && c <= 'Z') ||
122324         (c === ' ') ||
122325         (c === '_') ||
122326         (c === '-') ||
122327         (c === '.');
122328 }
122329
122330 function _isValidFileName(name) {
122331     var _valid = true,
122332         _c;
122333
122334     if (name === '' || name === '.' || name === '..' || (name.length > _maxPathLength)) {
122335         _valid = false;
122336     } else {
122337         for (_c = 0; _c < name.length; _c++) {
122338             if (!_isValidChar(name[_c])) {
122339                 _valid = false;
122340                 break;
122341             }
122342         }
122343     }
122344
122345     return _valid;
122346 }
122347
122348 function _initialize() {
122349     var _i;
122350
122351     _storages.push(FileSystemStorage("InternalFlash", "INTERNAL", "MOUNTED" ));
122352     _storages.push(FileSystemStorage("MMC", "EXTERNAL", "REMOVED"));
122353     dbfs.initialize();
122354
122355     // set up the map between real path and virtual path
122356     for (_i = 0; _i < _virtualRoots.length; _i++) {
122357         _r2vmap[_realRoots[_i]] = _virtualRoots[_i];
122358     }
122359
122360     utils.forEach(_r2vmap, function (value, key) {
122361         _v2rmap[value] = key;
122362     });
122363 }
122364
122365 function _resolveSync(srcLocation, onSuccess, onError, accessMode) {
122366     var _parts = srcLocation.replace(/\/$/, '').split("/"),
122367         _header, _fullPath,
122368         _i;
122369
122370     // TODO: Initialize at bootstrap and emulatorBridge.link
122371     if (!_initialized) {
122372         _initialize();
122373         _initialized = true;
122374     }
122375
122376     for (_i = 0; _i < _parts.length; _i++) {
122377         if (!_isValidFileName(_parts[_i])) {
122378             if (onError) {
122379                 onError(new WebAPIError(errorcode.INVALID_VALUES_ERR));
122380             }
122381             return;
122382         }
122383     }
122384
122385     _header = _v2rmap[_parts[0]];
122386     if (_header === undefined) {
122387         if (onError) {
122388             onError(new WebAPIError(errorcode.NOT_FOUND_ERR));
122389         }
122390         return;
122391     }
122392
122393     if (_parts.length === 1) {
122394         _fullPath = _header;
122395     } else {
122396         _fullPath = _header + "/" + _parts.splice(1, _parts.length - 1).join("/");
122397     }
122398
122399     dbfs.stat(_fullPath,
122400             function (entry) {
122401                 onSuccess(new File(entry, accessMode));
122402             },
122403             function () {
122404                 if (onError) {
122405                     onError(new WebAPIError(errorcode.NOT_FOUND_ERR));
122406                 }
122407             });
122408 }
122409
122410 function _resolveAsync(onSuccess, onError, srcLocation, accessMode) {
122411     _resolveSync(srcLocation,
122412                 function (file) {
122413                     setTimeout(function () {
122414                         onSuccess(file);
122415                     }, 1);
122416                 },
122417                 function (e) {
122418                     setTimeout(function () {
122419                         onError(e);
122420                     }, 1);
122421                 },
122422                 accessMode);
122423 }
122424
122425 File = function (entry, mode) {
122426     var _entry = entry,
122427         _mode = mode,
122428         _parent,
122429         _self;
122430
122431     function _r2v(rpath) {
122432         var i, v, r, regExp;
122433
122434         for (i = 0; i < _virtualRoots.length; i++) {
122435             v = _virtualRoots[i];
122436             r = _v2rmap[v];
122437             if (rpath.match("^" + r)) {
122438                 regExp = new RegExp("^" + r);
122439                 return rpath.replace(regExp, v);
122440             }
122441         }
122442
122443         return "";
122444     }
122445
122446     function _v2r(vpath) {
122447         var i, v, r, regExp;
122448
122449         for (i = 0; i < _virtualRoots.length; i++) {
122450             v = _virtualRoots[i];
122451             r = _v2rmap[v];
122452             if (vpath.match("^" + v)) {
122453                 regExp = new RegExp("^" + v);
122454                 return vpath.replace(regExp, r);
122455             }
122456         }
122457
122458         return "";
122459     }
122460
122461     function _copyMoveInternal(onSuccess, onError, src, dst, overwrite, func) {
122462         var _srcName = String(src),
122463             _dstName = String(dst),
122464             _src = null,
122465             _dst = null,
122466             _error = false,
122467             _dstParent = null,
122468             _dstParts  = _dstName.split("/"),
122469             _dstParentName = _dstParts.splice(0, _dstParts.length - 1).join("/");
122470
122471         if (!_entry.isDirectory) {
122472             if (onError) {
122473                 setTimeout(function () {
122474                     onError(new WebAPIError(errorcode.IO_ERR));
122475                 }, 1);
122476             }
122477             return undefined;
122478         }
122479
122480         _resolveSync(_srcName,
122481                 function (file) {
122482                     _src = file;
122483                 },
122484                 function (e) {
122485                     setTimeout(function () {
122486                         onError(e);
122487                     }, 1);
122488                 },
122489                 _mode);
122490
122491         if (_src) {
122492             if (_src.parent.fullPath === _self.fullPath) {
122493                 if (!_readOnly && _mode !== "r") {
122494                     _resolveSync(_dstParentName,
122495                             function (file) {
122496                                 _dstParent = file;
122497                             },
122498                             function (e) {
122499                                 setTimeout(function () {
122500                                     onError(e);
122501                                 }, 1);
122502                             },
122503                             _mode);
122504
122505                     if (_dstParent === null) {
122506                         return undefined;
122507                     }
122508
122509                     _resolveSync(_dstName,
122510                             function (file) {
122511                                 _dst = file;
122512                             },
122513                             function (e) {
122514                                 if (e.code !== errorcode.NOT_FOUND_ERR) {
122515                                     setTimeout(function () {
122516                                         onError(e);
122517                                     }, 1);
122518                                     _error = true;
122519                                 }
122520                             },
122521                             _mode);
122522
122523                     if (_error) {
122524                         return undefined;
122525                     }
122526
122527                     if (_src.isFile) {
122528                         if (_dst === null) {
122529                             func(_v2r(_srcName), _v2r(_dstName),
122530                                     function () {
122531                                         setTimeout(function () {
122532                                             onSuccess();
122533                                         }, 1);
122534                                     },
122535                                     function () {});
122536                             return null;
122537                         } else {
122538                             if (_dst.isFile && Boolean(overwrite) && (_srcName !== _dstName)) {
122539                                 func(_v2r(_srcName), _v2r(_dstName),
122540                                         function () {
122541                                             setTimeout(function () {
122542                                                 onSuccess();
122543                                             }, 1);
122544                                         },
122545                                         function () {});
122546                                 return null;
122547                             } else {
122548                                 setTimeout(function () {
122549                                     onError(new WebAPIError(errorcode.IO_ERR));
122550                                 }, 1);
122551                             }
122552                         }
122553                     } else {
122554                         if (_dst === null) {
122555                             func(_v2r(_srcName), _v2r(_dstName),
122556                                 function () {
122557                                     setTimeout(function () {
122558                                         onSuccess();
122559                                     }, 1);
122560                                 },
122561                                 function () {});
122562                             return null;
122563                         } else {
122564                             setTimeout(function () {
122565                                 onError(new WebAPIError(errorcode.IO_ERR));
122566                             }, 1);
122567                         }
122568                     }
122569                 } else {
122570                     if (onError) {
122571                         setTimeout(function () {
122572                             onError(new WebAPIError(errorcode.SECURITY_ERR));
122573                         }, 1);
122574                     }
122575                 }
122576             } else {
122577                 if (onError) {
122578                     setTimeout(function () {
122579                         onError(new WebAPIError(errorcode.IO_ERR));
122580                     }, 1);
122581                 }
122582             }
122583         }
122584
122585         return undefined;
122586     }
122587
122588     _self = {
122589         toURI: function () {
122590             return "file://" + _entry.fullPath;
122591         },
122592         listFiles: function (onSuccess, onError, filter) {
122593             var _filter, _filterName, _startCreated, _endCreated, _startModified, _endModified;
122594
122595             if (filter !== null && filter !== undefined) {
122596
122597                 if (typeof filter === 'number' || typeof filter === 'string') {
122598                     throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
122599                 }
122600                 _filter = filter;
122601                 _filterName = _filter.name;
122602                 _startModified = _filter.startModified;
122603                 _endModified   = _filter.endModified;
122604                 _startCreated = _filter.startCreated;
122605                 _endCreated   = _filter.endCreated;
122606
122607             }
122608             if ((_filterName !== undefined && typeof _filterName !== 'string') ||
122609                 (_startModified !== undefined && !tizen1_utils.isValidDate(_startModified)) ||
122610                 (_endModified !== undefined && !tizen1_utils.isValidDate(_endModified)) ||
122611                 (_endCreated !== undefined && !tizen1_utils.isValidDate(_endCreated)) ||
122612                 (_startCreated !== undefined && !tizen1_utils.isValidDate(_startCreated))) {
122613                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
122614             }
122615
122616             function _matchName(fileName) {
122617                 var _matched = true,
122618                     _name1 = String(_filterName).toLowerCase(),
122619                     _name2 = fileName.toLowerCase(),
122620                     _pattern;
122621
122622                 if (_filterName !== undefined && _filterName !== null) {
122623                     if (!_name1.match("\\\\%")) {
122624                         if (_name1.match("%")) {
122625                             _pattern = new RegExp("^" + _name1.replace(/%/g, ".*") + "$");
122626                             _matched = _name2.match(_pattern) ? true : false;
122627                         } else {
122628                             _matched = (_name1 === _name2);
122629                         }
122630                     } else {
122631                         // % is not allowed as a part of file name
122632                         _matched = false;
122633                     }
122634                 }
122635
122636                 return _matched;
122637             }
122638
122639             function _matchDate(date) {
122640                 var _matched = true;
122641
122642                 if (date === undefined) return true;
122643
122644                 if (_startModified !== undefined && _startModified !== null) {
122645                     _matched = (date.getTime() >= _startModified.getTime());
122646                 }
122647
122648                 if (_matched && (_endModified !== undefined && _endModified !== null)) {
122649                     _matched = (date.getTime() <= _endModified.getTime());
122650                 }
122651
122652                 return _matched;
122653             }
122654
122655             function _matchFilter(entry) {
122656                 return _matchName(entry.name) && _matchDate(entry.lastModifiedDate) && _matchDate(entry.createdDate);
122657             }
122658
122659             function _listFiles() {
122660                 var _files = [];
122661
122662                 if (!_entry.isDirectory) {
122663                     if (onError) {
122664                         setTimeout(function () {
122665                             onError(new WebAPIError(errorcode.IO_ERR));
122666                         }, 1);
122667                     }
122668                     return undefined;
122669                 }
122670
122671                 utils.forEach(_entry.children, function (child) {
122672                     if (_matchFilter(child)) {
122673                         _files.push(new File(child, _mode));
122674                     }
122675                 });
122676
122677                 setTimeout(function () {
122678                     onSuccess(_files);
122679                 }, 1);
122680
122681                 return null;
122682             }
122683
122684             return tizen1_utils.validateTypeMismatch(onSuccess, onError, "listFiles", _listFiles);
122685         },
122686         openStream: function (mode, onSuccess, onError, encoding) {
122687             function _openStream() {
122688                 var  _openMode = String(mode),
122689                     _encoding = encoding ? String(encoding) : "UTF-8";
122690
122691                 if (_openMode !== "r" && _openMode !== "w" && _openMode !== "a") {
122692                     if (onError) {
122693                         setTimeout(function () {
122694                             onError(new WebAPIError(errorcode.INVALID_VALUES_ERR));
122695                         }, 1);
122696                     }
122697                     return undefined;
122698                 }
122699
122700                 if (!_security.all && ((!_security.openStreamR && _openMode === "r") || (!_security.openStreamW && _openMode === "w"))) {
122701                     throw new WebAPIException(errorcode.SECURITY_ERR);
122702                 }
122703
122704                 if (_encoding !== "UTF-8" && _encoding !== "ISO-8859-1") {
122705                     if (onError) {
122706                         setTimeout(function () {
122707                             onError(new WebAPIError(errorcode.INVALID_VALUES_ERR));
122708                         }, 1);
122709                     }
122710                     return undefined;
122711                 }
122712
122713                 if (((_readOnly || _mode === "r") && (_openMode === "w" || _openMode === "a")) ||
122714                     (_writeOnly && _openMode === "r")) {
122715                     if (onError) {
122716                         setTimeout(function () {
122717                             onError(new WebAPIError(errorcode.SECURITY_ERR));
122718                         }, 1);
122719                     }
122720                     return undefined;
122721                 }
122722
122723                 setTimeout(function () {
122724                     onSuccess(new FileStream(_entry, _openMode, _encoding));
122725                 }, 1);
122726
122727                 return null;
122728             }
122729
122730             return tizen1_utils.validateTypeMismatch(onSuccess, onError, "openStream", _openStream);
122731         },
122732         readAsText: function (onSuccess, onError, encoding) {
122733             if (!_security.all && !_security.readAsText) {
122734                 throw new WebAPIException(errorcode.SECURITY_ERR);
122735             }
122736
122737             function _readAsText() {
122738                 var _encoding = encoding ? String(encoding) : "UTF-8";
122739                 if (_encoding !== "UTF-8" && _encoding !== "ISO-8859-1") {
122740                     if (onError) {
122741                         setTimeout(function () {
122742                             onError(new WebAPIError(errorcode.INVALID_VALUES_ERR));
122743                         }, 1);
122744                     }
122745                     return undefined;
122746                 }
122747
122748                 if (_writeOnly) {
122749                     if (onError) {
122750                         setTimeout(function () {
122751                             onError(new WebAPIError(errorcode.SECURITY_ERR));
122752                         }, 1);
122753                     }
122754                     return undefined;
122755                 }
122756
122757                 if (_self.isFile) {
122758                     dbfs.read(_entry.fullPath,
122759                             function (data) {
122760                                 setTimeout(function () {
122761                                     onSuccess(data);
122762                                 }, 1);
122763                             },
122764                             function () {});
122765                     return null;
122766                 } else {
122767                     if (onError) {
122768                         setTimeout(function () {
122769                             onError(new WebAPIError(errorcode.IO_ERR));
122770                         }, 1);
122771                     }
122772                 }
122773
122774                 return undefined;
122775             }
122776
122777             return tizen1_utils.validateTypeMismatch(onSuccess, onError, "readAsText", _readAsText);
122778         },
122779         copyTo: function (src, dst, overwrite, onSuccess, onError) {
122780             if (!_security.all && !_security.copyTo) {
122781                 throw new WebAPIException(errorcode.SECURITY_ERR);
122782             }
122783
122784             function _copyTo() {
122785                 return _copyMoveInternal(onSuccess, onError, src, dst, overwrite, dbfs.cp);
122786             }
122787
122788             return tizen1_utils.validateTypeMismatch(onSuccess, onError, "copyTo", _copyTo);
122789         },
122790         moveTo: function (src, dst, overwrite, onSuccess, onError) {
122791             if (!_security.all && !_security.moveTo) {
122792                 throw new WebAPIException(errorcode.SECURITY_ERR);
122793             }
122794
122795             function _moveTo() {
122796                 return _copyMoveInternal(onSuccess, onError, src, dst, overwrite, dbfs.mv);
122797             }
122798
122799             return tizen1_utils.validateTypeMismatch(onSuccess, onError, "moveTo", _moveTo);
122800         },
122801         createDirectory: function (dirPath) {
122802             var _path  = String(dirPath),
122803                 _parts = _path.replace(/\/$/, "").split("/"),
122804                 _dir   = null,
122805                 _exist = null,
122806                 _current = _entry.fullPath,
122807                 _i;
122808
122809             if (!_security.all && !_security.createDirectory) {
122810                 throw new WebAPIException(errorcode.SECURITY_ERR);
122811             }
122812
122813             function onSuccess(entry) {
122814                 _dir = entry;
122815             }
122816
122817             for (_i = 0; _i < _parts.length; _i++) {
122818                 if (!_isValidFileName(_parts[_i])) {
122819                     throw new WebAPIException(errorcode.INVALID_VALUES_ERR);
122820                 }
122821             }
122822
122823             if (!entry.isDirectory) {
122824                 throw new WebAPIException(errorcode.IO_ERR);
122825             }
122826
122827             _exist = _parts.reduce(function (obj, token) {
122828                 return token === "" ? obj : (obj.children ? obj.children[token] || null : null);
122829             }, _entry);
122830
122831             if (_exist) {
122832                 throw new WebAPIException(errorcode.IO_ERR);
122833             }
122834
122835             if (_readOnly || _mode === "r") {
122836                 throw new WebAPIException(errorcode.SECURITY_ERR);
122837             }
122838
122839             for (_i = 0; _i < _parts.length; _i++) {
122840                 _current = _current + "/" + _parts[_i];
122841                 dbfs.mkdir(_current, onSuccess);
122842             }
122843
122844             return new File(_dir, _mode);
122845         },
122846         createFile: function (filePath) {
122847             var _name = String(filePath),
122848                 _file = null;
122849
122850             if (!_security.all && !_security.createFile) {
122851                 throw new WebAPIException(errorcode.SECURITY_ERR);
122852             }
122853
122854             if (!_isValidFileName(_name)) {
122855                 throw new WebAPIException(errorcode.INVALID_VALUES_ERR);
122856             }
122857
122858             if (!entry.isDirectory || (_entry.children && _entry.children[_name])) {
122859                 throw new WebAPIException(errorcode.IO_ERR);
122860             }
122861
122862             if (_readOnly || _mode === "r") {
122863                 throw new WebAPIException(errorcode.SECURITY_ERR);
122864             }
122865
122866             dbfs.touch(_entry.fullPath + "/" + _name,
122867                         function (entry) {
122868                             _file = new File(entry, _mode);
122869                         },
122870                         function () {});
122871
122872             return _file;
122873         },
122874         resolve: function (filePath) {
122875             var _fullPath = _self.fullPath + "/" + String(filePath),
122876                 _file = null;
122877
122878             if (!_entry.isDirectory) {
122879                 throw new WebAPIException(errorcode.IO_ERR);
122880             }
122881
122882             _resolveSync(_fullPath,
122883                     function (file) {
122884                         _file = file;
122885                     },
122886                     function (e) {
122887                         throw (e);
122888                     },
122889                     _mode);
122890
122891             return _file;
122892         },
122893         deleteDirectory: function (directory, recursive, onSuccess, onError) {
122894             if (!_security.all && !_security.deleteDirectory) {
122895                 throw new WebAPIException(errorcode.SECURITY_ERR);
122896             }
122897
122898             function _deleteDirectory() {
122899                 var _dir = null,
122900                     _dirName = String(directory);
122901                 _resolveSync(_dirName,
122902                         function (file) {
122903                             _dir = file;
122904                         },
122905                         function (e) {
122906                             setTimeout(function () {
122907                                 onError(e);
122908                             }, 1);
122909                         },
122910                         _mode);
122911
122912                 if (_dir) {
122913                     if (_dir.isDirectory &&
122914                         _dir.parent.fullPath === _self.fullPath &&
122915                         (!recursive && _dir.length === 0)) {
122916                         if (!_readOnly && _mode !== "r") {
122917                             dbfs.rmdir(_v2r(_dirName),
122918                                     function () {
122919                                         setTimeout(function () {
122920                                             onSuccess();
122921                                         }, 1);
122922                                     },
122923                                     function () {});
122924                             return null;
122925                         } else {
122926                             if (onError) {
122927                                 setTimeout(function () {
122928                                     onError(new WebAPIError(errorcode.SECURITY_ERR));
122929                                 }, 1);
122930                             }
122931                         }
122932                     } else {
122933                         if (onError) {
122934                             setTimeout(function () {
122935                                 onError(new WebAPIError(errorcode.IO_ERR));
122936                             }, 1);
122937                         }
122938                     }
122939                 }
122940
122941                 return undefined;
122942             }
122943
122944             return tizen1_utils.validateTypeMismatch(onSuccess, onError, "deleteDirectory", _deleteDirectory);
122945         },
122946         deleteFile: function (fileName, onSuccess, onError) {
122947             if (!_security.all && !_security.deleteFile) {
122948                 throw new WebAPIException(errorcode.SECURITY_ERR);
122949             }
122950
122951             function _deleteFile() {
122952                 var _file = null;
122953                 _resolveSync(String(fileName),
122954                         function (file) {
122955                             _file = file;
122956                         },
122957                         function (e) {
122958                             if (onError) {
122959                                 setTimeout(function () {
122960                                     onError(e);
122961                                 }, 1);
122962                             }
122963                         },
122964                         _mode);
122965
122966                 if (_file) {
122967                     if (_file.isFile && _file.parent.fullPath === _self.fullPath) {
122968                         if (!_readOnly && _mode !== "r") {
122969                             dbfs.rm(_v2r(fileName),
122970                                     function () {
122971                                         setTimeout(function () {
122972                                             onSuccess();
122973                                         }, 1);
122974                                     },
122975                                     function () {});
122976                             return null;
122977                         } else {
122978                             if (onError) {
122979                                 setTimeout(function () {
122980                                     onError(new WebAPIError(errorcode.SECURITY_ERR));
122981                                 }, 1);
122982                             }
122983                         }
122984                     } else {
122985                         if (onError) {
122986                             setTimeout(function () {
122987                                 onError(new WebAPIError(errorcode.IO_ERR));
122988                             }, 1);
122989                         }
122990                     }
122991                 }
122992
122993                 return undefined;
122994             }
122995
122996             return tizen1_utils.validateTypeMismatch(onSuccess, onError, "deleteFile", _deleteFile);
122997         }
122998     };
122999
123000     _self.__defineGetter__("parent", function () {
123001         var _parts = _self.fullPath.split("/");
123002
123003         if (_parent === undefined) {
123004             if (_parts.length === 1) {
123005                 // virtual root's parent is null
123006                 _parent = null;
123007             } else {
123008                 _resolveSync(_parts.splice(0, _parts.length - 1).join("/"),
123009                         function (file) {
123010                             _parent = file;
123011                         },
123012                         function () {},
123013                         _mode);
123014             }
123015             return _parent;
123016         } else {
123017             return _parent;
123018         }
123019     });
123020
123021     _self.__defineGetter__("readOnly", function () {
123022         return false;
123023     });
123024
123025     _self.__defineGetter__("isFile", function () {
123026         return !_entry.isDirectory;
123027     });
123028
123029     _self.__defineGetter__("isDirectory", function () {
123030         return _entry.isDirectory;
123031     });
123032
123033     _self.__defineGetter__("created", function () {
123034         return _entry.createdDate;
123035     });
123036
123037     _self.__defineGetter__("modified", function () {
123038         return _entry.lastModifiedDate;
123039     });
123040
123041     _self.__defineGetter__("path", function () {
123042         var _parts = _self.fullPath.split("/");
123043
123044         if (_parts.length === 1) {
123045             // virtual root
123046             return _parts.join("");
123047         } else {
123048             return _parts.splice(0, _parts.length - 1).join("/") + "/";
123049         }
123050     });
123051
123052     _self.__defineGetter__("name", function () {
123053         return _entry.name;
123054     });
123055
123056     _self.__defineGetter__("fullPath", function () {
123057         return _r2v(_entry.fullPath);
123058     });
123059
123060     _self.__defineGetter__("fileSize", function () {
123061         if (_entry.isDirectory) {
123062             return undefined;
123063         } else {
123064             return _entry.data.length;
123065         }
123066     });
123067
123068     _self.__defineGetter__("length", function () {
123069         var _l = 0;
123070         if (_entry.isDirectory) {
123071             utils.forEach(_entry.children, function () {
123072                 _l++;
123073             });
123074             return _l;
123075         } else {
123076             return undefined;
123077         }
123078     });
123079
123080     return _self;
123081 };
123082
123083 FileStream = function (entry, mode, encoding) {
123084     var _entry = entry,
123085         _data = entry.data,
123086         _mode = mode,
123087         _position = (_mode === "a" ? _data.length : 0),
123088         _self;
123089
123090     _self = {
123091         close: function () {
123092             var _element;
123093             if (mode === "a" || mode === "w") {
123094                 dbfs.write(_entry.fullPath, _data, function () {}, function () {});
123095             }
123096             for (_element in _self) {
123097                 delete _self[_element];
123098             }
123099         },
123100         read: function (charCount) {
123101             var _count  = charCount | 0,
123102                 _substr = _data.substring(_position, _position + _count);
123103
123104             if (_position + _count > _data.length) {
123105                 _position = _data.length;
123106             } else {
123107                 _position += _count;
123108             }
123109
123110             return _substr;
123111         },
123112         readBytes: function (byteCount) {
123113             var _substr = _self.read(byteCount),
123114                 _bytes = [],
123115                 _i;
123116
123117             for (_i = 0; _i < _substr.length; _i++) {
123118                 _bytes.push(_substr.charCodeAt(_i));
123119             }
123120
123121             return _bytes;
123122         },
123123         readBase64: function (byteCount) {
123124             var _substr = _self.read(byteCount);
123125
123126             return window.atob(_substr);
123127         },
123128         write: function (stringData) {
123129             var _stringData = String(stringData),
123130                 _substr = _data.substring(0, _position);
123131
123132             _data = _substr.concat(_stringData);
123133             _position = _data.length;
123134         },
123135         writeBytes: function (byteData) {
123136             _self.write(String.fromCharCode.apply(String, byteData));
123137         },
123138         writeBase64: function (base64Data) {
123139             _self.write(window.btoa(String(base64Data)));
123140         }
123141     };
123142
123143     _self.__defineGetter__("eof", function () {
123144         return _position === _data.length;
123145     });
123146
123147     _self.__defineGetter__("position", function () {
123148         return _position;
123149     });
123150
123151     _self.__defineSetter__("position", function (value) {
123152         var _value = value | 0;
123153
123154         if (_value >= 0 && _value <= _data.length) {
123155             _position = _value;
123156         } else {
123157             throw new WebAPIException(errorcode.INVALID_VALUES_ERR);
123158         }
123159     });
123160
123161     _self.__defineGetter__("bytesAvailable", function () {
123162         return (_data.length - _position) || -1;
123163     });
123164
123165     return _self;
123166 };
123167
123168 FileFilter = function (name, startModified, endModified, startCreated, endCreated) {
123169     var _self = {
123170         name: name,
123171         startModified: utils.copy(startModified),
123172         endModified: utils.copy(endModified),
123173         endCreated: utils.copy(endCreated)
123174     };
123175
123176     return _self;
123177 };
123178
123179 FileSystemStorage = function (label, type, state) {
123180     var _self = {
123181         label: label,
123182         type: type,
123183         state: state
123184     };
123185
123186     return _self;
123187 };
123188
123189 module.exports = {
123190     maxPathLength: _maxPathLength,
123191     resolve: function (srcLocation, onSuccess, onError, accessMode) {
123192         function _resolve() {
123193             var _mode = accessMode ? String(accessMode) : _defaultMode;
123194
123195             if (_mode === "r" || _mode === "rw") {
123196                 _resolveAsync(onSuccess, onError, String(srcLocation), _mode);
123197                 return null;
123198             } else {
123199                 if (onError) {
123200                     setTimeout(function () {
123201                         onError(new WebAPIError(errorcode.INVALID_VALUES_ERR));
123202                     }, 1);
123203                 }
123204             }
123205             return undefined;
123206         }
123207
123208         return tizen1_utils.validateTypeMismatch(onSuccess, onError, "resolve", _resolve);
123209     },
123210
123211     getStorage: function (label, onSuccess, onError) {
123212         var storage = null, _label = String(label);
123213
123214         _storages.some(function (value) {
123215             if (value.label === _label) {
123216                 storage = utils.copy(value);
123217                 setTimeout(function () {
123218                     onSuccess(storage);
123219                 }, 1);
123220                 return true;
123221             }
123222         });
123223
123224         if (!storage) {
123225             if(onError) {
123226                 setTimeout(function () {
123227                     onError(new WebAPIError(errorcode.NOT_FOUND_ERR));
123228                 }, 1);
123229
123230             } else {
123231                 throw new WebAPIException(errorcode.NOT_FOUND_ERR);
123232             }
123233         }
123234     },
123235
123236     listStorages: function (onSuccess, onError) {
123237         function _listStorages() {
123238             setTimeout(function () {
123239                 onSuccess(utils.copy(_storages));
123240             }, 1);
123241         }
123242
123243         return tizen1_utils.validateTypeMismatch(onSuccess, onError, "listStorages", _listStorages);
123244     },
123245
123246     addStorageStateChangeListener: function(onSuccess, onError) {
123247         function _addStorageStateChangeListener() {
123248             var watchId = (new Date()).getTime() || 0;
123249                 _observers[watchId] = function(storage) {//storage is which state is changed
123250                 onSuccess(storage);
123251             };
123252
123253             // This event should be triggered from outside
123254             event.on("StateChange", _observers[watchId]);
123255             return Number(watchId);
123256         }
123257
123258         return tizen1_utils.validateTypeMismatch(onSuccess, onError, "addStorageStateChangeListener", _addStorageStateChangeListener);
123259     },
123260
123261     removeStorageStateChangeListener: function (watchId) {
123262         if (!_observers[watchId])
123263             return;
123264
123265         event.deleteEventHandler("StateChange", _observers[watchId]);
123266         delete _observers[watchId];
123267     },
123268
123269     handleSubFeatures: function (subFeatures) {
123270         function setSecurity(_security) {
123271             return function (method) {
123272                 _security[method] = true;
123273             };
123274         }
123275
123276         for (var subFeature in subFeatures) {
123277             if (_security[subFeature].length === 0) {
123278                 _security.all = true;
123279                 return;
123280             }
123281             _security.all = false;
123282             utils.forEach(_security[subFeature], setSecurity);
123283         }
123284     }
123285 };
123286
123287
123288 });
123289 define('ripple/platform/tizen/2.0/ContactName', function (require, exports, module) {
123290 /*
123291  *  Copyright 2013 Intel Corporation.
123292  *
123293  * Licensed under the Apache License, Version 2.0 (the "License");
123294  * you may not use this file except in compliance with the License.
123295  * You may obtain a copy of the License at
123296  *
123297  * http://www.apache.org/licenses/LICENSE-2.0
123298  *
123299  * Unless required by applicable law or agreed to in writing, software
123300  * distributed under the License is distributed on an "AS IS" BASIS,
123301  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
123302  * See the License for the specific language governing permissions and
123303  * limitations under the License.
123304  */
123305
123306 var t = require('ripple/platform/tizen/2.0/typecast'),
123307     ContactName;
123308
123309 ContactName = function (nameInitDict) {
123310     var contactName = {}, attr;
123311
123312     t.ContactName(arguments, this);
123313
123314     contactName.prefix            = null;
123315     contactName.suffix            = null;
123316     contactName.firstName         = null;
123317     contactName.middleName        = null;
123318     contactName.lastName          = null;
123319     contactName.nicknames         = [];
123320     contactName.phoneticFirstName = null;
123321     contactName.phoneticLastName  = null;
123322
123323     this.__defineGetter__("prefix", function () {
123324         return contactName.prefix;
123325     });
123326     this.__defineSetter__("prefix", function (val) {
123327         try {
123328             contactName.prefix = t.DOMString(val, "?");
123329         } catch (e) {
123330         }
123331     });
123332
123333     this.__defineGetter__("suffix", function () {
123334         return contactName.suffix;
123335     });
123336     this.__defineSetter__("suffix", function (val) {
123337         try {
123338             contactName.suffix = t.DOMString(val, "?");
123339         } catch (e) {
123340         }
123341     });
123342
123343     this.__defineGetter__("firstName", function () {
123344         return contactName.firstName;
123345     });
123346     this.__defineSetter__("firstName", function (val) {
123347         try {
123348             contactName.firstName = t.DOMString(val, "?");
123349         } catch (e) {
123350         }
123351     });
123352
123353     this.__defineGetter__("middleName", function () {
123354         return contactName.middleName;
123355     });
123356     this.__defineSetter__("middleName", function (val) {
123357         try {
123358             contactName.middleName = t.DOMString(val, "?");
123359         } catch (e) {
123360         }
123361     });
123362
123363     this.__defineGetter__("lastName", function () {
123364         return contactName.lastName;
123365     });
123366     this.__defineSetter__("lastName", function (val) {
123367         try {
123368             contactName.lastName = t.DOMString(val, "?");
123369         } catch (e) {
123370         }
123371     });
123372
123373     this.__defineGetter__("nicknames", function () {
123374         return contactName.nicknames;
123375     });
123376     this.__defineSetter__("nicknames", function (val) {
123377         try {
123378             contactName.nicknames = t.DOMString(val, "[]");
123379         } catch (e) {
123380         }
123381     });
123382
123383     this.__defineGetter__("phoneticFirstName", function () {
123384         return contactName.phoneticFirstName;
123385     });
123386     this.__defineSetter__("phoneticFirstName", function (val) {
123387         try {
123388             contactName.phoneticFirstName = t.DOMString(val, "?");
123389         } catch (e) {
123390         }
123391     });
123392
123393     this.__defineGetter__("phoneticLastName", function () {
123394         return contactName.phoneticLastName;
123395     });
123396     this.__defineSetter__("phoneticLastName", function (val) {
123397         try {
123398             contactName.phoneticLastName = t.DOMString(val, "?");
123399         } catch (e) {
123400         }
123401     });
123402
123403     this.__defineGetter__("displayName", function () {
123404         return null;
123405     });
123406
123407     if (nameInitDict) {
123408         for (attr in nameInitDict) {
123409             contactName[attr] = nameInitDict[attr];
123410         }
123411     }
123412 };
123413
123414 module.exports = ContactName;
123415
123416 });
123417 define('ripple/platform/tizen/2.0/Conversation', function (require, exports, module) {
123418 /*
123419  *  Copyright 2012 Intel Corporation.
123420  *
123421  * Licensed under the Apache License, Version 2.0 (the "License"),
123422  * you may not use this file except in compliance with the License.
123423  * You may obtain a copy of the License at
123424  *
123425  * http://www.apache.org/licenses/LICENSE-2.0
123426  *
123427  * Unless required by applicable law or agreed to in writing, software
123428  * distributed under the License is distributed on an "AS IS" BASIS,
123429  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
123430  * See the License for the specific language governing permissions and
123431  * limitations under the License.
123432  */
123433 var utils = require('ripple/utils');
123434
123435 module.exports = function (opt) {
123436     var conv = {}, priv = utils.copy(opt);
123437
123438     conv.__defineGetter__("id", function () {
123439         return priv.id;
123440     });
123441     conv.__defineGetter__("type", function () {
123442         return priv.type;
123443     });
123444     conv.__defineGetter__("timestamp", function () {
123445         return priv.timestamp;
123446     });
123447     conv.__defineGetter__("messageCount", function () {
123448         return priv.messageCount;
123449     });
123450     conv.__defineGetter__("unreadMessages", function () {
123451         return priv.unreadMessages;
123452     });
123453     conv.__defineGetter__("preview", function () {
123454         return priv.preview;
123455     });
123456     conv.__defineGetter__("subject", function () {
123457         return priv.subject;
123458     });
123459     conv.__defineGetter__("isRead", function () {
123460         return priv.isRead;
123461     });
123462     conv.__defineGetter__("from", function () {
123463         return priv.from;
123464     });
123465     conv.__defineGetter__("to", function () {
123466         return priv.to;
123467     });
123468     conv.__defineGetter__("cc", function () {
123469         return priv.cc;
123470     });
123471     conv.__defineGetter__("bcc", function () {
123472         return priv.bcc;
123473     });
123474     conv.__defineGetter__("lastMessageId", function () {
123475         return priv.lastMessageId;
123476     });
123477     return conv;
123478 };
123479
123480 });
123481 define('ripple/platform/tizen/2.0/push', function (require, exports, module) {
123482 /*
123483  *  Copyright 2013 Intel Corporation.
123484  *
123485  * Licensed under the Apache License, Version 2.0 (the "License");
123486  * you may not use this file except in compliance with the License.
123487  * You may obtain a copy of the License at
123488  *
123489  * http://www.apache.org/licenses/LICENSE-2.0
123490  *
123491  * Unless required by applicable law or agreed to in writing, software
123492  * distributed under the License is distributed on an "AS IS" BASIS,
123493  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
123494  * See the License for the specific language governing permissions and
123495  * limitations under the License.
123496  */
123497
123498 var event = require('ripple/event'),
123499     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
123500     t = require('ripple/platform/tizen/2.0/typecast'),
123501     Notification = require('ripple/platform/tizen/2.0/notification'),
123502     StatusNotification = require('ripple/platform/tizen/2.0/StatusNotification'),
123503     WebAPIError = require('ripple/platform/tizen/2.0/WebAPIError'),
123504     WebAPIException = require('ripple/platform/tizen/2.0/WebAPIException'),
123505     PushMessage,
123506     _data = {
123507         service: {
123508 /*          "ID_APPLICATION_0": {
123509  *              appId:          null,
123510  *              registrationId: null,
123511  *              appControl:     null,
123512  *              isRegistered:   false,
123513  *              isConnected:    false,
123514  *              onpushed:       null
123515  *          }
123516  */
123517         }
123518     },
123519     _security = {
123520         "http://tizen.org/privilege/push": ["registerService",
123521             "unregisterService", "connectService", "disconnectService",
123522             "getRegistrationId"]
123523     },
123524     _self;
123525
123526 function _initialize() {
123527     event.on("PushNotified", function (appId, pushMessage) {
123528         var appService, notificationDict, statusNotification, notification;
123529
123530         appService = _data.service[appId];
123531
123532         if (!appService)
123533             return;
123534
123535         if (appService.isConnected) {
123536             appService.onpushed(new PushMessage(pushMessage));
123537         } else {
123538             notificationDict = {
123539                 content: pushMessage.appData,
123540                 appControl: appService.appControl,
123541                 appId: appId
123542             };
123543             statusNotification = new StatusNotification("SIMPLE",
123544                 pushMessage.alertMessage, notificationDict);
123545             notification = new Notification();
123546
123547             notification.post(statusNotification);
123548         }
123549     });
123550 }
123551
123552 function _getCurrentApplicationId() {
123553     return "ID_APPLICATION_0";
123554 }
123555
123556 _self = function () {
123557     var push;
123558
123559     function registerService(appControl, successCallback, errorCallback) {
123560         if (!_security.registerService) {
123561             throw new WebAPIException(errorcode.SECURITY_ERR);
123562         }
123563
123564         t.PushManager("registerService", arguments, true);
123565
123566         window.setTimeout(function () {
123567             var appId, appService;
123568
123569             appId = _getCurrentApplicationId();
123570             appService = {
123571                 appId:          appId,
123572                 registrationId: null,
123573                 appControl:     appControl,
123574                 isRegistered:   false
123575             };
123576             _data.service[appId] = appService;
123577
123578             event.trigger("PushRequest", ["REGISTER", appService], true);
123579
123580             if (appService.registrationId === null) {
123581                 if (errorCallback) {
123582                     errorCallback(new WebAPIError(errorcode.UNKNOWN_ERR));
123583                 }
123584                 return;
123585             }
123586
123587             appService.isRegistered = true;
123588             successCallback(appService.registrationId);
123589         }, 1);
123590     }
123591
123592     function unregisterService(successCallback, errorCallback) {
123593         if (!_security.unregisterService) {
123594             throw new WebAPIException(errorcode.SECURITY_ERR);
123595         }
123596
123597         t.PushManager("unregisterService", arguments);
123598
123599         window.setTimeout(function () {
123600             var appId;
123601
123602             appId = _getCurrentApplicationId();
123603             delete _data.service[appId];
123604             event.trigger("PushRequest", ["UNREGISTER", appId]);
123605             if (successCallback) {
123606                 successCallback();
123607             }
123608         }, 1);
123609     }
123610
123611     function connectService(notificationCallback) {
123612         var appId, appService;
123613
123614         if (!_security.connectService) {
123615             throw new WebAPIException(errorcode.SECURITY_ERR);
123616         }
123617
123618         t.PushManager("connectService", arguments);
123619
123620         appId = _getCurrentApplicationId();
123621         appService = _data.service[appId];
123622         if (!appService || !appService.isRegistered) {
123623             throw new WebAPIException(errorcode.UNKNOWN_ERR);
123624         }
123625
123626         appService.isConnected = true;
123627         appService.onpushed    = notificationCallback;
123628         event.trigger("PushRequest", ["CONNECT", appId]);
123629     }
123630
123631     function disconnectService() {
123632         var appId, appService;
123633
123634         if (!_security.disconnectService) {
123635             throw new WebAPIException(errorcode.SECURITY_ERR);
123636         }
123637
123638         t.PushManager("disconnectService", arguments);
123639
123640         appId = _getCurrentApplicationId();
123641         appService = _data.service[appId];
123642         if (!appService || !appService.isRegistered ||
123643                 !appService.isConnected) {
123644             return;
123645         }
123646
123647         appService.onpushed    = null;
123648         appService.isConnected = false;
123649         event.trigger("PushRequest", ["DISCONNECT", appId]);
123650     }
123651
123652     function getRegistrationId() {
123653         var appService;
123654
123655         if (!_security.getRegistrationId) {
123656             throw new WebAPIException(errorcode.SECURITY_ERR);
123657         }
123658
123659         t.PushManager("getRegistrationId", arguments);
123660
123661         appService = _data.service[_getCurrentApplicationId()];
123662         if (!appService || !appService.isRegistered) {
123663             return null;
123664         }
123665
123666         return appService.registrationId;
123667     }
123668
123669     function handleSubFeatures(subFeatures) {
123670         var i, subFeature;
123671
123672         for (subFeature in subFeatures) {
123673             for (i in _security[subFeature]) {
123674                 _security[_security[subFeature][i]] = true;
123675             }
123676         }
123677     }
123678
123679     push = {
123680         registerService:   registerService,
123681         unregisterService: unregisterService,
123682         connectService:    connectService,
123683         disconnectService: disconnectService,
123684         getRegistrationId: getRegistrationId,
123685         handleSubFeatures: handleSubFeatures
123686     };
123687
123688     return push;
123689 };
123690
123691 _initialize();
123692
123693 PushMessage = function (pushMessageInitDict) {
123694     var appData, alertMessage, date;
123695
123696     this.__defineGetter__("appData", function () {
123697         return appData;
123698     });
123699
123700     this.__defineGetter__("alertMessage", function () {
123701         return alertMessage;
123702     });
123703
123704     this.__defineGetter__("date", function () {
123705         return date;
123706     });
123707
123708     appData      = pushMessageInitDict.appData || "";
123709     alertMessage = pushMessageInitDict.alertMessage || "";
123710     date         = pushMessageInitDict.date || new Date();
123711 };
123712
123713 module.exports = _self;
123714
123715 });
123716 define('ripple/platform/tizen/2.0/routeBackend_navigation', function (require, exports, module) {
123717 /*
123718  *  Copyright 2012 Intel Corporation.
123719  *
123720  * Licensed under the Apache License, Version 2.0 (the "License");
123721  * you may not use this file except in compliance with the License.
123722  * You may obtain a copy of the License at
123723  *
123724  * http://www.apache.org/licenses/LICENSE-2.0
123725  *
123726  * Unless required by applicable law or agreed to in writing, software
123727  * distributed under the License is distributed on an "AS IS" BASIS,
123728  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
123729  * See the License for the specific language governing permissions and
123730  * limitations under the License.
123731  */
123732
123733 var tizen1_utils = require('ripple/platform/tizen/2.0/tizen1_utils'),
123734     lbs_utils = require('ripple/platform/tizen/2.0/lbs_utils'),
123735     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
123736     WebAPIError = require('ripple/platform/tizen/2.0/WebAPIError'),
123737     SimpleCoordinates = require('ripple/platform/tizen/2.0/SimpleCoordinates'),
123738     RouteWaypoint,
123739     RouteDistance,
123740     RouteDuration,
123741     RouteStep,
123742     RouteSegment,
123743     RouteRequestOptions,
123744     RouteResultSummary,
123745     RouteResult,
123746     _data = {
123747         positionDistance: {},
123748         positionDuration: {},
123749         routeProvider: {},
123750         routes: [],
123751         RouteDistanceUnit: ["M", "KM", "MI", "FT"],
123752         providers: [],
123753         path: []
123754     },
123755     _self;
123756
123757 // The RouteWaypoint object
123758 RouteWaypoint = function () {
123759     return {
123760         position: {
123761             latitude: 0,
123762             longitude: 0
123763         },
123764         isStopover: true
123765     };
123766 };
123767
123768 // The RouteDistance object
123769 RouteDistance = function () {
123770     return {
123771         text : "Distance",
123772         value : "0",
123773         unit : "KM "
123774     };
123775 };
123776
123777 // The RouteDuration object
123778 RouteDuration = function () {
123779     return {
123780         text : "Duration",
123781         value : "0" // The duration in a seconds
123782     };
123783 };
123784
123785 // The RouteStep object
123786 RouteStep = function () {
123787     var _self = {
123788         mode: "",        // The way of the travel, for example: car, bike, foot
123789         instruction: "", // The instruction of this step
123790         points: []       // The points of this step
123791     };
123792
123793     _self.origin      = new SimpleCoordinates(0, 0);
123794     _self.destination = new SimpleCoordinates(0, 0);
123795     _self.distance    = new RouteDistance();
123796     _self.duration    = new RouteDuration();
123797
123798     return _self;
123799 };
123800 // The RouteSegment object
123801 RouteSegment = function () {
123802     var _self = {
123803         steps: []
123804     };
123805
123806     _self.origin      = new SimpleCoordinates(0, 0);
123807     _self.destination = new SimpleCoordinates(0, 0);
123808     _self.distance    = new RouteDistance();
123809     _self.duration    = new RouteDuration();
123810
123811     return _self;
123812 };
123813
123814 // The RouteRequestOptions object
123815 RouteRequestOptions = function () {
123816     return {
123817         mode: "", // CAR, BIKE
123818         unit: "KM",
123819         routeGoal: "SHORTEST",
123820         constraints: ["HIGHWAY", "TOLL", "UNPAVED"],
123821         wayPoints: [],
123822         maxResults: 1
123823     };
123824 };
123825
123826 // The RouteResultSummary object
123827 RouteResultSummary = function () {
123828     var _self = {};
123829
123830     _self.origin        = new SimpleCoordinates(0, 0);
123831     _self.destination   = new SimpleCoordinates(0, 0);
123832     _self.totalDistance = new RouteDistance();
123833     _self.totalDuration = new RouteDuration();
123834
123835     return _self;
123836 };
123837
123838 // The RouteResult object
123839 RouteResult = function () {
123840     var _self, jsonStr, jsonObj;
123841     jsonObj = {
123842             "type" : "Point",
123843             "coordinates" : []
123844         };
123845     jsonStr = JSON.stringify(jsonObj);
123846     _self = {
123847         segments : [],
123848         toGeoJSON : function () {
123849                 return jsonStr;
123850             }
123851     };
123852     _self.summary = new RouteResultSummary();
123853     return _self;
123854 };
123855
123856 function calcDegree(distance) {
123857     return distance * Math.PI / 180.0;
123858 }
123859
123860 //calcute the distance
123861 function  calculateDistance(lat1, lat2, lon1, lon2) {
123862     var R = 6371, dLat, dLon, a, c, distance; // km
123863     dLat = calcDegree(parseFloat(lat2) - parseFloat(lat1));
123864     dLon = calcDegree(parseFloat(lon2) - parseFloat(lon1));
123865
123866     lat1 = calcDegree(lat1);
123867     lat2 = calcDegree(lat2);
123868
123869     a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
123870              Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);
123871     c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
123872     distance = R * c;
123873     return distance;
123874 }
123875
123876 function calculateDuration(mode, distance) {
123877     var duration, v;
123878     switch (mode) {
123879     case "motorcar" :
123880         v = 50;
123881         duration = distance / v;
123882         break;
123883     case "bicycle" :
123884         v = 20;
123885         duration = distance / v;
123886         break;
123887     case "foot" :
123888         v = 5;
123889         duration = distance / v;
123890         break;
123891     default:
123892         duration = 0;
123893     }
123894     return duration;
123895 }
123896
123897 function optimalWay(points, mode) {
123898     var steps = [], startLatitude, startLongitude, originLocation, endLatitude, endLongitude,
123899     destinationLocation, step, distance, i, routeDistance, routeDuration;
123900     for (i = 0;i < points.length - 1;i++) {
123901         startLatitude       = points[i].lat;
123902         startLongitude      = points[i].lon;
123903         originLocation      = new SimpleCoordinates(startLatitude, startLongitude);
123904         endLatitude         = points[i + 1].lat;
123905         endLongitude        = points[i + 1].lon;
123906         destinationLocation = new SimpleCoordinates(endLatitude, endLongitude);
123907         step                = new RouteStep();
123908         step.origin         = originLocation;
123909         step.destination    = destinationLocation;
123910         distance            = calculateDistance(startLatitude, endLatitude, startLongitude, endLongitude);
123911         routeDistance       = new RouteDistance();
123912         routeDistance.value = distance;
123913         routeDistance.unit  = "km";
123914         step.distance       = routeDistance;
123915         routeDuration       = new RouteDuration();
123916         routeDuration.value = calculateDuration(mode, distance);
123917         step.duration       = routeDuration;
123918         steps.push(step);
123919     }
123920     return steps;
123921 }
123922
123923 function existInSupports(str, array) {
123924     for (var i in array) {
123925         if (str === array[i]) {
123926             return true;
123927         }
123928     }
123929     return false;
123930 }
123931
123932 function navigation(searchStr, flat, flon, tlat, tlon, v, fast) {
123933     var positions = [];
123934
123935     _data.positionDistance = {};
123936     _data.positionDuration = {};
123937     jQuery.ajax({
123938         type : "get",
123939         async : false,
123940         url : searchStr,
123941         data : {
123942             flat : flat,
123943             flon : flon,
123944             tlat : tlat,
123945             tlon : tlon,
123946             v : v,
123947             fast : fast,
123948             layer : 'mapnik',
123949             format : "geojson"
123950         },
123951         contentType : "application/json; charset=utf-8",
123952         dataType : "json",
123953         cache : false,
123954         success : function (data) {
123955             $.each(data.coordinates, function (i, item) {
123956                 var point = {};
123957                 point.lon = item[0];
123958                 point.lat = item[1];
123959                 positions.push(point);
123960             });
123961             $.each(data.properties, function (i, item) {
123962                 if (typeof item === "number") {
123963                     _data.positionDistance = new RouteDistance();
123964                     _data.positionDistance.value = item;
123965                     _data.positionDistance.unit = "km";
123966                     _data.positionDuration = new RouteDuration();
123967                     _data.positionDuration.value = calculateDuration(v, item);
123968                 }
123969             });
123970         },
123971         error : function (errorCB) {
123972             if (errorCB) {
123973                 setTimeout(function () {
123974                     errorCB(new WebAPIError(errorcode.NETWORK_ERR));
123975                 }, 1);
123976             }
123977         }
123978     });
123979     return positions;
123980 }
123981
123982
123983 function filterWaypoints(routeWaypoints) {
123984     var mathWaypoints = [], i;
123985     for (i in routeWaypoints) {
123986         if (routeWaypoints[i].position.latitude !== "" &&
123987             routeWaypoints[i].position.latitude !== undefined &&
123988             routeWaypoints[i].position.latitude !== null &&
123989             routeWaypoints[i].position.longitude !== null &&
123990             routeWaypoints[i].position.longitude !== "" &&
123991             routeWaypoints[i].position.longitude !== undefined) {
123992             mathWaypoints.push(routeWaypoints[i]);
123993         }
123994     }
123995     return mathWaypoints;
123996 }
123997
123998 module.exports = function (prop) {
123999     var _self = new lbs_utils.LocationServiceProvider(prop);
124000
124001     _self.supportedGoals       = ["SHORTEST", "FASTEST", "MOST_SCENIC", "SIMPLEST", "CHEAPEST", "SAFEST" ];
124002     _self.supportedModes       = ["motorcar", "bicycle", "foot"];
124003     _self.supportedConstraints = ["HIGHWAY", "TOLL", "UNPAVED", "BORDER", "GRAVEL_PAVING", "TUNNEL", "BRIDGE", "LEFT_TURN", "CARPOOL", "HAZARDOUS_CARGO" ];
124004     _self.supportsWayPoints    = true;
124005     _self.find = function (origin, destination, successCallback, errorCallback, options) {
124006         function _find() {
124007             var flat, flon, tlat, tlon, v, fast, searchStr, result,
124008                 routeWaypoints = [],
124009                 segmentPositions = [],
124010                 positions = [],
124011                 segments = [],
124012                 totalDistances = 0, totalDurations = 0,
124013                 k, key, segment, startPosition, endPosition,
124014                 summary, distance, duration;
124015
124016             v = options.mode;
124017             //init
124018             if (!existInSupports(v, _self.supportedModes)) {
124019                 throw new WebAPIError(errorcode.TYPE_MISMATCH_ERR);
124020             }
124021             if (!existInSupports(options.routeGoal, _self.supportedGoals)) {
124022                 throw new WebAPIError(errorcode.TYPE_MISMATCH_ERR);
124023             }
124024             switch (options.routeGoal) {
124025             case "SHORTEST":
124026                 fast = 0;
124027                 break;
124028
124029             case "FASTEST":
124030                 fast = 1;
124031                 break;
124032
124033             case "SIMPLEST":
124034                 break;
124035
124036             case "MOST_SCENIC":
124037                 break;
124038
124039             case "CHEAPEST":
124040                 break;
124041
124042             case "SAFEST":
124043                 break;
124044
124045             default:
124046                 fast = 0;
124047             }
124048             searchStr      = "http://www.yournavigation.org/api/dev/gosmore.php";
124049             routeWaypoints = options.wayPoints;
124050             routeWaypoints = filterWaypoints(routeWaypoints);
124051             segmentPositions.push(origin);
124052
124053             if (routeWaypoints.length > 0) {
124054                 for (k in routeWaypoints) {
124055                     segmentPositions.push(routeWaypoints[k].position);
124056                 }
124057             }
124058             segmentPositions.push(destination);
124059
124060             for (key = 0; key < segmentPositions.length - 1; key++) {
124061                 segment             = new RouteSegment();
124062                 startPosition       = segmentPositions[key];
124063                 endPosition         = segmentPositions[key + 1];
124064                 segment.origin      = startPosition;
124065                 segment.destination = endPosition;
124066                 flat                = startPosition.latitude;
124067                 flon                = startPosition.longitude;
124068                 tlat                = endPosition.latitude;
124069                 tlon                = endPosition.longitude;
124070                 positions           = navigation(searchStr, flat, flon, tlat, tlon, v, fast);
124071                 segment.steps       = optimalWay(positions, v);
124072                 segment.distance    = _data.positionDistance;
124073                 totalDistances     += _data.positionDistance.value;
124074                 segment.duration    = _data.positionDuration;
124075                 totalDurations     += _data.positionDuration.value;
124076                 segments.push(segment);
124077             }
124078             result                = new RouteResult();
124079             summary               = new RouteResultSummary();
124080             summary.origin        = segmentPositions[0];
124081             summary.destination   = segmentPositions[segmentPositions.length - 1];
124082             distance              = new RouteDistance();
124083             distance.value        = totalDistances;
124084             distance.unit         = "km";
124085             summary.totalDistance = distance;
124086             duration              = new RouteDuration();
124087             duration.value        = totalDurations;
124088             summary.totalDuration = duration;
124089             result.segments       = segments;
124090             result.summary        = summary;
124091             successCallback(result);
124092         }
124093
124094         tizen1_utils.validateTypeMismatch(successCallback, errorCallback, "find", _find);
124095     };
124096
124097     return _self;
124098 };
124099
124100 });
124101 define('ripple/platform/tizen/2.0/GeocodeOptions', function (require, exports, module) {
124102 /*      
124103  *  Copyright 2012 Intel Corporation.
124104  *  
124105  * Licensed under the Apache License, Version 2.0 (the "License");
124106  * you may not use this file except in compliance with the License.
124107  * You may obtain a copy of the License at
124108  *  
124109  * http://www.apache.org/licenses/LICENSE-2.0
124110  *  
124111  * Unless required by applicable law or agreed to in writing, software
124112  * distributed under the License is distributed on an "AS IS" BASIS,
124113  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
124114  * See the License for the specific language governing permissions and
124115  * limitations under the License.
124116  */
124117
124118 var errorcode = require('ripple/platform/tizen/2.0/errorcode'),
124119     WebAPIError = require('ripple/platform/tizen/2.0/WebAPIError'),
124120     SortMode = require('ripple/platform/tizen/2.0/SortMode');
124121
124122 module.exports = function (_sortMode, _maxResults) {
124123     var _self;
124124     if (_sortMode !== null && _sortMode !== undefined) {
124125         if (typeof _sortMode !== "object") {
124126             throw (new WebAPIError(errorcode.TYPE_MISMATCH_ERR));
124127         }
124128         try {
124129             new SortMode(_sortMode.attributeName, _sortMode.order);
124130         } catch (e) {
124131             throw (new WebAPIError(errorcode.TYPE_MISMATCH_ERR));
124132         }
124133     }
124134     if (_maxResults !== null && _maxResults !== undefined) {
124135         if (typeof _maxResults !== "number") {
124136             throw (new WebAPIError(errorcode.TYPE_MISMATCH_ERR));
124137         }
124138     }
124139
124140     _self = {
124141         sortMode : _sortMode,
124142         maxResults : _maxResults || 0
124143     };
124144
124145     return _self;
124146 };
124147
124148
124149 });
124150 define('ripple/platform/tizen/2.0/tizen1_utils', function (require, exports, module) {
124151 /*
124152  *  Copyright 2011 Intel Corporation.
124153  *
124154  * Licensed under the Apache License, Version 2.0 (the "License");
124155  * you may not use this file except in compliance with the License.
124156  * You may obtain a copy of the License at
124157  *
124158  * http://www.apache.org/licenses/LICENSE-2.0
124159  *
124160  * Unless required by applicable law or agreed to in writing, software
124161  * distributed under the License is distributed on an "AS IS" BASIS,
124162  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
124163  * See the License for the specific language governing permissions and
124164  * limitations under the License.
124165  */
124166
124167 var self,
124168     utils = require('ripple/utils'),
124169     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
124170     WebAPIException = require('ripple/platform/tizen/2.0/WebAPIException');
124171
124172 self = module.exports = {
124173     _wac2_regexSanitize: function (regexString) {
124174         var escapePattern = /([^\\]|^)(%)/g, percentPattern = /\\%/g;
124175         return regexString.replace("^", "\\^")
124176                 .replace("$", "\\$")
124177                 .replace("(", "\\(")
124178                 .replace(")", "\\)")
124179                 .replace("<", "\\<")
124180                 .replace("[", "\\[")
124181                 .replace("{", "\\{")
124182                 .replace(/\\([^%])/, "\\\\$1")    /* don't replace \\% */
124183                 .replace("|", "\\|")
124184                 .replace(">", "\\>")
124185                 .replace(".", "\\.")
124186                 .replace("*", "\\*")
124187                 .replace("+", "\\+")
124188                 .replace("?", "\\?")
124189                 .replace(escapePattern, "$1.*")  /* replace % with .* */
124190                 .replace(percentPattern, "%");   /* strip excape of % */
124191     },
124192
124193     isValidDate: function (d) {
124194         if (Object.prototype.toString.call(d) !== "[object Date]")
124195             return false;
124196         return !isNaN(d.getTime());
124197     },
124198     isValidTZDate: function (d) {
124199         if (d &&  (d instanceof tizen.TZDate)) {
124200             return true;
124201         }
124202         return false;
124203     },
124204     isValidArray: function (a) {
124205         return (Object.prototype.toString.call(a) === "[object Array]");
124206     },
124207
124208     matchOptionArrayString: function (src, attr, pattern) {
124209         /* src.obj[attr] is a StringArray */
124210         var _pattern, re, _stringMatch;
124211         _pattern = this._wac2_regexSanitize(pattern);
124212         re = new RegExp("^" + _pattern + "$", "i");
124213
124214         _stringMatch = function (obj, index) {
124215             if (pattern.search(/^%*$/i) === 0)
124216                 return true;
124217             if (obj[attr] === undefined || obj[attr] === null)
124218                 return false;
124219             return obj[attr].some(function (f) {
124220                 return f.search(re) !== -1;
124221             });
124222         };
124223         return utils.filter(src, _stringMatch);
124224     },
124225
124226     matchAttributeBooleanFilter: function (src, attr, value) {
124227         // only support EXACTLY matchFlag
124228         var _booleanMatch, atr = attr.split(".");
124229
124230         if (atr.length === 2) {
124231             _booleanMatch = function (obj, index) {
124232                 if (!obj[atr[0]])
124233                     return false;
124234
124235                 return (obj[atr[0]][atr[1]] === value);
124236             };
124237         } else {
124238             _booleanMatch = function (obj, index) {
124239                 return (obj[attr] === value);
124240             };
124241         }
124242
124243         return utils.filter(src, _booleanMatch);
124244     },
124245
124246     matchAttributeArrayFilter: function (src, attr, matchFlag, value) {
124247         var _re, _arrayMatch, atr = attr.split("."), _existMatch;
124248
124249         if (atr.length === 2) {
124250             _existMatch = function (obj, index) {
124251                 if (!obj[atr[0]])
124252                     return false;
124253
124254                 return (obj[atr[0]][atr[1]] !== undefined);
124255             };
124256         } else {
124257             _existMatch = function (obj, index) {
124258                 return (obj[attr] !== undefined);
124259             };
124260         }
124261
124262         if (value === undefined || value === null) {
124263             return utils.filter(src, _existMatch);
124264         }
124265
124266         switch (matchFlag)
124267         {
124268         case "EXACTLY":
124269             _re = new RegExp("^" + value + "$");
124270             break;
124271         case "FULLSTRING":
124272             _re = new RegExp("^" + value + "$", "i");
124273             break;
124274         case "CONTAINS":
124275             _re = new RegExp(value, "i");
124276             break;
124277         case "STARTSWITH":
124278             _re = new RegExp("^" + value, "i");
124279             break;
124280         case "ENDSWITH":
124281             _re = new RegExp(value + "$", "i");
124282             break;
124283         case "EXISTS":
124284             return utils.filter(src, _existMatch);
124285         default:
124286             return [];
124287         }
124288
124289         if (atr.length === 2) {
124290             _arrayMatch = function (obj, index) {
124291                 if (!obj[atr[0]])
124292                     return false;
124293
124294                 return (obj[atr[0]][atr[1]] && obj[atr[0]][atr[1]].some(function (o) {
124295                     return (o.search(_re) !== -1);
124296                 }));
124297             };
124298         } else {
124299             _arrayMatch = function (obj, index) {
124300                 return (obj[attr] && obj[attr].some(function (o) {
124301                     return (o.search(_re) !== -1);
124302                 }));
124303             };
124304         }
124305
124306         return utils.filter(src, _arrayMatch);
124307     },
124308
124309     matchAttributeRangeFilter: function (src, attr, low, high) {
124310         var _rangeMatch, atr = attr.split(".");
124311
124312         if (atr.length === 2) {
124313             _rangeMatch = function (obj, index) {
124314                 var matched = true;
124315
124316                 if (!obj[atr[0]])
124317                     return false;
124318
124319                 if (low !== null && low !== undefined) {
124320                     matched = (obj[atr[0]][atr[1]] >= low);
124321                 }
124322                 if (matched && (high !== null && high !== undefined)) {
124323                     matched = (obj[atr[0]][atr[1]] <= high);
124324                 }
124325                 return matched;
124326             };
124327         } else {
124328             _rangeMatch = function (obj, index) {
124329                 var matched = true;
124330
124331                 if (low !== null && low !== undefined) {
124332                     matched = (obj[attr] >= low);
124333                 }
124334                 if (matched && (high !== null && high !== undefined)) {
124335                     matched = (obj[attr] <= high);
124336                 }
124337                 return matched;
124338             };
124339         }
124340         return utils.filter(src, _rangeMatch);
124341     },
124342
124343     matchAttributeFilter: function (src, attr, matchFlag, value) {
124344         var _re, _stringMatch, atr = attr.split("."),
124345             _existMatch;
124346
124347         if (atr.length === 2) {
124348             _existMatch = function (obj, index) {
124349                 if (!obj[atr[0]])
124350                     return false;
124351
124352                 return (obj[atr[0]][atr[1]] !== undefined);
124353             };
124354         } else {
124355             _existMatch = function (obj, index) {
124356                 return (obj[attr] !== undefined);
124357             };
124358         }
124359
124360         if (value === undefined || value === null) {
124361             return utils.filter(src, _existMatch);
124362         }
124363
124364         switch (matchFlag)
124365         {
124366         case "EXACTLY":
124367             _re = new RegExp("^" + value + "$");
124368             break;
124369         case "FULLSTRING":
124370             _re = new RegExp("^" + value + "$", "i");
124371             break;
124372         case "CONTAINS":
124373             _re = new RegExp(value, "i");
124374             break;
124375         case "STARTSWITH":
124376             _re = new RegExp("^" + value, "i");
124377             break;
124378         case "ENDSWITH":
124379             _re = new RegExp(value + "$", "i");
124380             break;
124381         case "EXISTS":
124382             return utils.filter(src, _existMatch);
124383         default:
124384             return [];
124385         }
124386         if (atr.length === 2) {
124387             _stringMatch = function (obj, index) {
124388                 if (!obj[atr[0]])
124389                     return false;
124390
124391                 if (matchFlag === "EXACTLY") {
124392                     return (obj[atr[0]][atr[1]] === value);
124393                 } else if (typeof obj[atr[0]][atr[1]] !== 'string') {
124394                     return false;
124395                 }
124396
124397                 return (obj[atr[0]][atr[1]].search(_re) !== -1);
124398             };
124399         } else {
124400             _stringMatch = function (obj, index) {
124401                 if (matchFlag === "EXACTLY") {
124402                     return (obj[attr] === value);
124403                 } else if (typeof obj[attr] !== 'string') {
124404                     return false;
124405                 }
124406
124407                 return (obj[attr].search(_re) !== -1);
124408             };
124409         }
124410         return utils.filter(src, _stringMatch);
124411     },
124412
124413     matchOptionString: function (src, attr, pattern) {
124414         /* src.obj[attr] is a string */
124415         var _stringMatch, _pattern, _re;
124416         _pattern = this._wac2_regexSanitize(pattern);
124417         _re = new RegExp("^" + _pattern + "$", "mi");
124418
124419         _stringMatch = function (obj, index) {
124420             return (obj[attr].search(_re) !== -1);
124421         };
124422         return utils.filter(src, _stringMatch);
124423     },
124424
124425     matchOptionDate: function (src, attr, filterStart, filterEnd) {
124426         var _dateMatch;
124427         _dateMatch = function (obj, index) {
124428             var matched = true, valueDate = obj[attr];
124429
124430             if (filterStart !== undefined && filterStart !== null) {
124431                 matched = (valueDate.getTime() >= filterStart.getTime());
124432             }
124433             if (matched && (filterEnd !== undefined && filterEnd !== null)) {
124434                 matched = (valueDate.getTime() <= filterEnd.getTime());
124435             }
124436             return matched;
124437         };
124438         return utils.filter(src, _dateMatch);
124439     },
124440
124441     matchOptionShortArray: function (src, attr, filterArray) {
124442         /* src.obj[attr] is a short, filterArray is an array
124443            i.e. find status is [CONFRIMED or TENTATIVE] */
124444         var arraySome = function (obj, index) {
124445             return filterArray.some(function (f) {
124446                 return f === obj[attr];
124447             });
124448         };
124449         return utils.filter(src, arraySome);
124450     },
124451
124452     validateArgumentType: function (arg, argType, errorObj) {
124453         var invalidArg = false;
124454
124455         switch (argType) {
124456         case "array":
124457             if (!arg instanceof Array) {
124458                 invalidArg = true;
124459             }
124460             break;
124461         case "date":
124462             if (!arg instanceof Date) {
124463                 invalidArg = true;
124464             }
124465             break;
124466         case "integer":
124467             if (typeof Number(arg) !== "number" || Number(arg) !== Math.floor(arg)) {
124468                 invalidArg = true;
124469             }
124470             break;
124471         default:
124472             if (typeof arg !== argType) {
124473                 invalidArg = true;
124474             }
124475             break;
124476         }
124477
124478         if (invalidArg) {
124479             throw errorObj;
124480         }
124481     },
124482
124483     validateCallbackType: function (successCallback, errorCallback) {
124484         if (successCallback) {
124485             this.validateArgumentType(successCallback, "function",
124486                 new WebAPIException(errorcode.TYPE_MISMATCH_ERR));
124487         }
124488         if (errorCallback) {
124489             this.validateArgumentType(errorCallback, "function",
124490                 new WebAPIException(errorcode.TYPE_MISMATCH_ERR));
124491         }
124492     },
124493
124494     validateEqualArrays: function (arrayOne, arrayTwo) {
124495         var isEqual = false, i;
124496
124497         if (Object.prototype.toString.call(arrayTwo) === "[object Array]" &&
124498             Object.prototype.toString.call(arrayTwo) === "[object Array]" &&
124499             arrayOne.length === arrayTwo.length) {
124500             isEqual = true;
124501             for (i in arrayOne) {
124502                 if (arrayOne[i] !== arrayTwo[i]) {
124503                     isEqual = false;
124504                     break;
124505                 }
124506             }
124507         }
124508         return isEqual;
124509     },
124510
124511     validateTypeMismatch: function (onSuccess, onError, name, callback) {
124512
124513         if (onSuccess === undefined || onSuccess === null) {
124514             throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
124515         }
124516         this.validateArgumentType(onSuccess, "function",
124517                                   new WebAPIException(errorcode.TYPE_MISMATCH_ERR));
124518         if (onError !== null && onError !== undefined) {
124519             this.validateArgumentType(onError, "function",
124520                                       new WebAPIException(errorcode.TYPE_MISMATCH_ERR));
124521         }
124522
124523         return callback && callback();
124524     },
124525
124526     isEmptyObject: function (obj) {
124527         var prop;
124528
124529         for (prop in obj) {
124530             return false;
124531         }
124532         return true;
124533     },
124534
124535     arrayComposite: function (mode, arrayA, arrayB) {
124536         var combinedArray = arrayA.concat(arrayB),
124537             intersectionArray = arrayA.filter(function (value) {
124538                 if (utils.arrayContains(arrayB, value)) {
124539                     return true;
124540                 }
124541
124542                 return false;
124543             });
124544
124545         switch (mode) {
124546         case "AND":
124547         case "INTERSECTION":
124548             return intersectionArray;
124549         case "OR":
124550         case "UNION":
124551             return intersectionArray.concat(combinedArray.filter(function (value) {
124552                 if (utils.arrayContains(intersectionArray, value)) {
124553                     return false;
124554                 }
124555
124556                 return true;
124557             }));
124558         default:
124559             return undefined;
124560         }
124561     },
124562
124563     isEqual: function (srcObj, aimObj) {
124564         var i;
124565
124566         if (typeof srcObj !== typeof aimObj) {
124567             return false;
124568         }
124569
124570         if (srcObj === null || srcObj === undefined || typeof srcObj === 'number' ||
124571             typeof srcObj === 'string' || typeof srcObj === 'boolean') {
124572             return srcObj === aimObj;
124573         }
124574
124575         for (i in srcObj) {
124576             if (!aimObj.hasOwnProperty(i) || !self.isEqual(srcObj[i], aimObj[i])) {
124577                 return false;
124578             }
124579         }
124580
124581         return true;
124582     },
124583
124584     query: function (objects, filter, sortMode, count, offset) {
124585         function isCompositeFilter(filter) {
124586             return (filter.type) ? true : false;
124587         }
124588
124589         function isAttributeFilter(filter) {
124590             return (filter.matchFlag) ? true : false;
124591         }
124592
124593         function getValue(obj, key) {
124594             var keys = key.split("."),
124595                 value = obj[keys[0]],
124596                 i;
124597
124598             for (i = 1; i < keys.length; i++) {
124599                 if (value[keys[i]]) {
124600                     value = value[keys[i]];
124601                 }
124602             }
124603
124604             return value;
124605         }
124606
124607         function _filter(objects, filter) {
124608             var i, results, eachResult, filterFunc;
124609
124610             if (isCompositeFilter(filter)) {
124611                 for (i in filter.filters) {
124612                     eachResult = _filter(objects, filter.filters[i]);
124613                     results = (results === undefined) ? eachResult : self.arrayComposite(filter.type, results, eachResult);
124614                 }
124615                 return results;
124616             }
124617
124618             if (isAttributeFilter(filter)) {
124619                 for (i in objects) {
124620                     if (filter.attributeName in objects[i])
124621                         break;
124622                 }
124623                 filterFunc = self.isValidArray(objects[i][filter.attributeName]) ? self.matchAttributeArrayFilter : self.matchAttributeFilter;
124624                 results = filterFunc(objects, filter.attributeName, filter.matchFlag, filter.matchValue);
124625             } else {
124626                 results = self.matchAttributeRangeFilter(objects, filter.attributeName, filter.initialValue, filter.endValue);
124627             }
124628
124629             return results;
124630         }
124631
124632         function _sort(objects, sortMode) {
124633             objects.sort(function (a, b) {
124634                 return (sortMode.order === "ASC") ?
124635                     (getValue(a, sortMode.attributeName) < getValue(b, sortMode.attributeName) ? -1 : 1):
124636                     (getValue(a, sortMode.attributeName) > getValue(b, sortMode.attributeName) ? -1 : 1);
124637             });
124638
124639             return objects;
124640         }
124641
124642         var res = objects;
124643
124644         if (filter) {
124645             res = _filter(res, filter);
124646         }
124647
124648         if (sortMode) {
124649             _sort(res, sortMode);
124650         }
124651
124652         if (offset || count) {
124653             offset = (offset > 0) ? offset : 0;
124654             res = (count > 0) ? res.slice(offset, offset + count) : res.slice(offset);
124655         }
124656
124657         return res;
124658     },
124659
124660     copyString: function (str) {
124661         var newStr, charConvert = [], i;
124662
124663         if (typeof str !== 'string') {
124664             return str;
124665         }
124666         for (i = 0; i < str.length; i++) {
124667             charConvert[i] = str.charAt(i);
124668         }
124669         newStr = charConvert.join("");
124670
124671         return newStr;
124672     },
124673
124674     copy: function (obj) {
124675         var i,
124676             newObj = jQuery.isArray(obj) ? [] : {};
124677
124678         if (typeof obj === 'number' ||
124679             typeof obj === 'string' ||
124680             typeof obj === 'boolean' ||
124681             obj === null ||
124682             obj === undefined) {
124683             return obj;
124684         }
124685
124686         if (obj instanceof Date) {
124687             return new Date(obj);
124688         }
124689
124690         if (obj instanceof RegExp) {
124691             return new RegExp(obj);
124692         }
124693
124694         for (i in obj) {
124695             if (obj.hasOwnProperty(i)) {
124696                 if (obj.__lookupGetter__(i)) {
124697                     newObj.__defineGetter__(i, (function (key) {
124698                         return function () {
124699                             return self.copy(obj[key]);
124700                         };
124701                     }(i)));
124702                 }
124703                 else {
124704                     newObj[i] = self.copy(obj[i]);
124705                 }
124706             }
124707         }
124708
124709         return newObj;
124710     }
124711 };
124712
124713 });
124714 define('ripple/platform/tizen/2.0/typecoerce', function (require, exports, module) {
124715 /*
124716  *  Copyright 2013 Intel Corporation.
124717  *
124718  * Licensed under the Apache License, Version 2.0 (the "License");
124719  * you may not use this file except in compliance with the License.
124720  * You may obtain a copy of the License at
124721  *
124722  * http://www.apache.org/licenses/LICENSE-2.0
124723  *
124724  * Unless required by applicable law or agreed to in writing, software
124725  * distributed under the License is distributed on an "AS IS" BASIS,
124726  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
124727  * See the License for the specific language governing permissions and
124728  * limitations under the License.
124729  */
124730
124731 var t = require('ripple/platform/tizen/2.0/typedef'),
124732     _MAX_INT_BITS = 53,
124733     _MAX_INT = Math.pow(2, _MAX_INT_BITS) - 1,
124734     _self;
124735
124736 _self = function (pattern) {
124737     var typeCoerce, typeOfPattern;
124738
124739     // private
124740     function getExtendedType(val) {
124741         var type = Object.prototype.toString.call(val), attr;
124742
124743         switch (type) {
124744         case "[object Array]":
124745             if ((typeof val[0] === "string") && (val[0].length > 0)) {
124746                 type = "enum";
124747             } else {
124748                 type = "Union";
124749             }
124750             return type;
124751
124752         case "[object Object]":
124753             if ("_dictionary" in val) {
124754                 return "dictionary";
124755             }
124756
124757             type = "Object";
124758
124759             for (attr in val) {
124760                 if (attr === "0") {
124761                     type = "Arguments";
124762                 } else if (val[attr] === "Callback") {
124763                     type = "Callback";
124764                 }
124765                 break;
124766             }
124767
124768             return type;
124769         }
124770
124771         switch (val) {
124772         case "Callback":
124773             type = "Function";
124774             break;
124775
124776         case "TZDate":
124777         case "any":
124778         case "byte":
124779         case "float":
124780         case "long":
124781         case "long long":
124782         case "octet":
124783         case "short":
124784         case "unsigned long":
124785         case "unsigned long long":
124786         case "unsigned short":
124787             type = val;
124788             break;
124789
124790         case "double":
124791             type = "float";
124792             break;
124793
124794         default:    // Derivative type name: e.g., "AbstractFilter"
124795             type = "";
124796             break;
124797         }
124798
124799         return type;
124800     }
124801
124802     function getType(val, isPattern) {
124803         var type = Object.prototype.toString.call(val);
124804
124805         switch (type) {
124806         case "[object Array]":
124807             type = (isPattern && (val.length > 1)) ? getExtendedType(val) :
124808                     "Array";
124809             break;
124810
124811         case "[object Arguments]":
124812             type = "Arguments";
124813             break;
124814
124815         case "[object Boolean]":
124816             type = "boolean";
124817             break;
124818
124819         case "[object Date]":
124820             type = "Date";
124821             break;
124822
124823         case "[object Function]":
124824             type = "Function";
124825             break;
124826
124827         case "[object Number]":
124828             type = "Number";
124829             break;
124830
124831         case "[object Object]":
124832             type = isPattern ? getExtendedType(val) : "Object";
124833             break;
124834
124835         case "[object String]":
124836             type = (isPattern && !!val) ? getExtendedType(val) : "DOMString";
124837             break;
124838         }
124839
124840         return type;
124841     }
124842
124843     function isConstructed(obj) {
124844         if (!("_constructor" in pattern))
124845             return true;
124846
124847         if (obj instanceof window.tizen[pattern._constructor])
124848             return true;
124849
124850         if ("_derived" in pattern)
124851             return true;
124852
124853         return false;
124854     }
124855
124856     function toInteger(x) {
124857         return (x < 0) ? Math.ceil(x) : Math.floor(x);
124858     }
124859
124860     function isBitsOverflowed(bits) {
124861         return (bits >= _MAX_INT_BITS);
124862     }
124863
124864     function toJsInt(x, isUnsigned) {
124865         var min, max;
124866
124867         min = isUnsigned ? 0 : -_MAX_INT;
124868         max = _MAX_INT;
124869
124870         if ((x < min) || (x > max))
124871             return null;
124872
124873         return toInteger(x);
124874     }
124875
124876     function modulo(a, b) {
124877         return (a - Math.floor(a / b) * b);
124878     }
124879
124880     function toInt(x, bits) {
124881         var p;
124882
124883         x = Number(x);
124884
124885         if (isNaN(x) || !isFinite(x))
124886             return null;
124887
124888         if (isBitsOverflowed(bits))
124889             return toJsInt(x, false);
124890
124891         p = Math.pow(2, bits);
124892         x = modulo(toInteger(x), p);
124893
124894         return (x >= Math.pow(2, bits - 1)) ? (x - p) : x;
124895     }
124896
124897     function toUInt(x, bits) {
124898         x = Number(x);
124899
124900         if (isNaN(x) || !isFinite(x))
124901             return null;
124902
124903         if (isBitsOverflowed(bits))
124904             return toJsInt(x, true);
124905
124906         return modulo(toInteger(x), Math.pow(2, bits));
124907     }
124908
124909     function toInt8(x) {
124910         return toInt(x, 8);
124911     }
124912
124913     function toInt16(x) {
124914         return toInt(x, 16);
124915     }
124916
124917     function toInt32(x) {
124918         return toInt(x, 32);
124919     }
124920
124921     function toInt64(x) {
124922         return toInt(x, 64);
124923     }
124924
124925     function toUInt8(x) {
124926         return toUInt(x, 8);
124927     }
124928
124929     function toUInt16(x) {
124930         return toUInt(x, 16);
124931     }
124932
124933     function toUInt32(x) {
124934         return toUInt(x, 32);
124935     }
124936
124937     function toUInt64(x) {
124938         return toUInt(x, 64);
124939     }
124940
124941     // public
124942     function cast(obj) {
124943         var typeMap,
124944             typeOfObj = getType(obj, false);
124945
124946         typeMap = {
124947             "Arguments": function () {
124948                 var i, isNullable, ret;
124949
124950                 for (i in pattern) {
124951                     if (i === "_optional")
124952                         continue;
124953
124954                     isNullable = !!(pattern._optional && pattern._optional[i]);
124955
124956                     if (i > obj.length - 1) {
124957                         if (!isNullable) {
124958                             return null;
124959                         }
124960                         break;
124961                     }
124962
124963                     if (!isNullable || (obj[i] !== null)) {
124964                         ret = _self(pattern[i]).cast(obj[i]);
124965                         if (ret === null) {
124966                             return null;
124967                         }
124968                         obj[i] = ret;
124969                     }
124970                 }
124971
124972                 return obj;
124973             },
124974
124975             "Array": function () {
124976                 var elementType, i, ret;
124977
124978                 if (typeOfObj !== typeOfPattern) {
124979                     return null;
124980                 }
124981
124982                 elementType = _self(pattern[0]);
124983                 for (i in obj) {
124984                     ret = elementType.cast(obj[i]);
124985                     if (ret === null) {
124986                         return null;
124987                     }
124988                     obj[i] = ret;
124989                 }
124990
124991                 return obj;
124992             },
124993
124994             "Callback": function () {
124995                 var attr;
124996
124997                 if (typeOfObj !== "Object") {
124998                     return null;
124999                 }
125000
125001                 for (attr in pattern) {
125002                     if (attr in obj) {
125003                         obj[attr] = _self(pattern[attr]).cast(obj[attr]);
125004                         if (obj[attr] === null) {
125005                             return null;
125006                         }
125007                     }
125008                 }
125009
125010                 return obj;
125011             },
125012
125013             "DOMString": function () {
125014                 switch (typeOfObj) {
125015                 case "DOMString":
125016                 case "Date":
125017                 case "Number":
125018                 case "boolean":
125019                     obj = String(obj);
125020                     break;
125021
125022                 default:
125023                     if ((obj === null) || (obj === undefined)) {
125024                         obj = String(obj);
125025                     } else {
125026                         obj = null;
125027                     }
125028                     break;
125029                 }
125030
125031                 return obj;
125032             },
125033
125034             "Date": function () {
125035                 return (typeOfObj === typeOfPattern) ? obj : null;
125036             },
125037
125038             "Function": function () {
125039                 return (typeOfObj === typeOfPattern) ? obj : null;
125040             },
125041
125042             "Object": function () {
125043                 var ret, attr, i;
125044
125045                 if (typeOfObj !== typeOfPattern) {
125046                     if ((obj === null) || (obj === undefined)) {
125047                         return null;
125048                     }
125049                     if (!("_derived" in pattern)) {
125050                         return null;
125051                     }
125052                 }
125053
125054                 if (!isConstructed(obj)) {
125055                     return null;
125056                 }
125057
125058                 for (attr in pattern) {
125059                     switch (attr) {
125060                     case "_optional":
125061                     case "_constructor":
125062                         break;
125063
125064                     case "_derived":
125065                         for (i in pattern._derived) {
125066                             ret = _self(pattern._derived[i]).cast(obj);
125067                             if (ret !== null)
125068                                 break;
125069                         }
125070                         if (ret === null) {
125071                             if ("_constructor" in pattern)
125072                                 break;
125073
125074                             return null;
125075                         }
125076                         break;
125077
125078                     default:
125079                         if (!pattern._optional || !pattern._optional[attr] ||
125080                                 (obj[attr] !== undefined) &&
125081                                 (obj[attr] !== null)) {
125082                             ret = _self(pattern[attr]).cast(obj[attr]);
125083                             if (ret === null) {
125084                                 return null;
125085                             }
125086                             obj[attr] = ret;
125087                         }
125088                         break;
125089                     }
125090                 }
125091
125092                 return obj;
125093             },
125094
125095             "TZDate": function () {
125096                 if (typeOfObj !== "Object") {
125097                     return null;
125098                 }
125099                 return (obj instanceof window.tizen.TZDate) ? obj : null;
125100             },
125101
125102             "Union": function () {
125103                 var ret, i;
125104
125105                 for (i in pattern) {
125106                     ret = _self(pattern[i]).cast(obj);
125107                     if (ret !== null)
125108                         break;
125109                 }
125110
125111                 return ret;
125112             },
125113
125114             "any": function () {
125115                 return obj;
125116             },
125117
125118             "boolean": function () {
125119                 return (typeOfObj === typeOfPattern) ? obj : null;
125120             },
125121
125122             "byte": function () {
125123                 return toInt8(obj);
125124             },
125125
125126             "dictionary": function () {
125127                 var attr, ret;
125128
125129                 if (typeOfObj !== "Object") {
125130                     return null;
125131                 }
125132
125133                 for (attr in pattern) {
125134                     switch (attr) {
125135                     case "_dictionary":
125136                         if (pattern._dictionary !== null) {
125137                             ret = _self(pattern._dictionary).cast(obj);
125138                             if (ret === null) {
125139                                 return null;
125140                             }
125141                         }
125142                         break;
125143
125144                     default:
125145                         if ((attr in obj) && (obj[attr] !== null) &&
125146                                 (obj[attr] !== undefined)) {
125147                             ret = _self(pattern[attr]).cast(obj[attr]);
125148                             if (ret === null) {
125149                                 return null;
125150                             }
125151                             obj[attr] = ret;
125152                         }
125153                         break;
125154                     }
125155                 }
125156
125157                 return obj;
125158             },
125159
125160             "enum": function () {
125161                 var i;
125162
125163                 obj = String(obj).trim();
125164                 for (i in pattern) {
125165                     if (obj === pattern[i]) {
125166                         return obj;
125167                     }
125168                 }
125169
125170                 return null;
125171             },
125172
125173             "float": function () {
125174                 var f = parseFloat(obj, 10);
125175
125176                 return (isNaN(f) ? null : f);
125177             },
125178
125179             "long": function () {
125180                 return toInt32(obj);
125181             },
125182
125183             "long long": function () {
125184                 return toInt64(obj);
125185             },
125186
125187             "octet": function () {
125188                 return toUInt8(obj);
125189             },
125190
125191             "short": function () {
125192                 return toInt16(obj);
125193             },
125194
125195             "unsigned long": function () {
125196                 return toUInt32(obj);
125197             },
125198
125199             "unsigned long long": function () {
125200                 return toUInt64(obj);
125201             },
125202
125203             "unsigned short": function () {
125204                 return toUInt16(obj);
125205             },
125206
125207             "": function () {
125208                 return _self(t[pattern]).cast(obj);
125209             }
125210         };
125211
125212         return typeMap[typeOfPattern]();
125213     }
125214
125215     function copy(obj) {
125216         var typeMap,
125217             typeOfObj = getType(obj, false);
125218
125219         typeMap = {
125220             "Arguments": function () {
125221                 var i, isNullable, ret = [];
125222
125223                 for (i in pattern) {
125224                     if (i === "_optional")
125225                         continue;
125226
125227                     isNullable = !!(pattern._optional && pattern._optional[i]);
125228
125229                     if (i > obj.length - 1) {
125230                         if (!isNullable) {
125231                             return null;
125232                         }
125233                         break;
125234                     }
125235
125236                     if (!isNullable || (obj[i] !== null)) {
125237                         ret[i] = _self(pattern[i]).copy(obj[i]);
125238                         if (ret[i] === null) {
125239                             return null;
125240                         }
125241                     }
125242                 }
125243
125244                 for (i in ret) {
125245                     obj[i] = ret[i];
125246                 }
125247
125248                 return obj;
125249             },
125250
125251             "Array": function () {
125252                 var arr = [], elementType, i;
125253
125254                 if (typeOfObj !== typeOfPattern) {
125255                     return null;
125256                 }
125257
125258                 elementType = _self(pattern[0]);
125259                 for (i in obj) {
125260                     if (obj[i] !== undefined) {
125261                         arr[i] = elementType.copy(obj[i]);
125262                         if (arr[i] === null)
125263                             return null;
125264                     }
125265                 }
125266
125267                 return arr;
125268             },
125269
125270             "Callback": function () {
125271                 var ret = {}, attr;
125272
125273                 if (typeOfObj !== "Object") {
125274                     return null;
125275                 }
125276
125277                 for (attr in pattern) {
125278                     if (attr in obj) {
125279                         ret[attr] = _self(pattern[attr]).copy(obj[attr]);
125280                         if (ret[attr] === null) {
125281                             return null;
125282                         }
125283                     }
125284                 }
125285
125286                 return ret;
125287             },
125288
125289             "Object": function () {
125290                 var ret = {}, attr, i, derived;
125291
125292                 if (typeOfObj !== typeOfPattern) {
125293                     if ((obj === null) || (obj === undefined)) {
125294                         return null;
125295                     }
125296                     if (!("_derived" in pattern)) {
125297                         return null;
125298                     }
125299                 }
125300
125301                 if (!isConstructed(obj)) {
125302                     return null;
125303                 }
125304                 if ("_constructor" in pattern) {
125305                     ret.__proto__ = window.tizen[pattern._constructor].prototype;
125306                 }
125307
125308                 for (attr in pattern) {
125309                     switch (attr) {
125310                     case "_optional":
125311                     case "_constructor":
125312                         break;
125313
125314                     case "_derived":
125315                         for (i in pattern._derived) {
125316                             derived = _self(pattern._derived[i]).copy(obj);
125317                             if (derived !== null)
125318                                 break;
125319                         }
125320                         if (derived === null) {
125321                             if ("_constructor" in pattern)
125322                                 break;
125323
125324                             return null;
125325                         }
125326                         for (attr in derived) {
125327                             ret[attr] = derived[attr];
125328                         }
125329                         break;
125330
125331                     default:
125332                         if (!pattern._optional || !pattern._optional[attr] ||
125333                                 (obj[attr] !== undefined) &&
125334                                 (obj[attr] !== null)) {
125335                             ret[attr] = _self(pattern[attr]).copy(obj[attr]);
125336                             if (ret[attr] === null) {
125337                                 return null;
125338                             }
125339                         }
125340                         break;
125341                     }
125342                 }
125343
125344                 return ret;
125345             },
125346
125347             "Union": function () {
125348                 var ret, i;
125349
125350                 for (i in pattern) {
125351                     ret = _self(pattern[i]).copy(obj);
125352                     if (ret !== null)
125353                         break;
125354                 }
125355
125356                 return ret;
125357             },
125358
125359             "dictionary": function () {
125360                 var ret = {}, attr, base, i;
125361
125362                 if (typeOfObj !== "Object") {
125363                     return null;
125364                 }
125365
125366                 for (attr in pattern) {
125367                     switch (attr) {
125368                     case "_dictionary":
125369                         if (pattern._dictionary !== null) {
125370                             base = _self(pattern._dictionary).copy(obj);
125371                             if (base === null) {
125372                                 return null;
125373                             }
125374                             for (i in base) {
125375                                 ret[i] = base[i];
125376                             }
125377                         }
125378                         break;
125379
125380                     default:
125381                         if ((attr in obj) && (obj[attr] !== null) &&
125382                                 (obj[attr] !== undefined)) {
125383                             ret[attr] = _self(pattern[attr]).copy(obj[attr]);
125384                             if (ret[attr] === null) {
125385                                 return null;
125386                             }
125387                         }
125388                         break;
125389                     }
125390                 }
125391
125392                 return ret;
125393             },
125394
125395             "": function () {
125396                 return _self(t[pattern]).copy(obj);
125397             }
125398         };
125399
125400         return (typeOfPattern in typeMap) ? typeMap[typeOfPattern]() :
125401                 cast(obj);
125402     }
125403
125404     function match(obj) {
125405         var typeMap,
125406             typeOfObj = getType(obj, false);
125407
125408         typeMap = {
125409             "Array": function () {
125410                 var elementType, i;
125411
125412                 if (typeOfObj !== typeOfPattern)
125413                     return false;
125414
125415                 elementType = _self(pattern[0]);
125416                 for (i in obj) {
125417                     if (!elementType.match(obj[i])) {
125418                         return false;
125419                     }
125420                 }
125421
125422                 return true;
125423             },
125424
125425             "Callback": function () {
125426                 var attr, isMatched = true;
125427
125428                 if (typeOfObj !== "Object") {
125429                     return false;
125430                 }
125431
125432                 for (attr in pattern) {
125433                     if (attr in obj) {
125434                         isMatched = _self(pattern[attr]).match(obj[attr]);
125435                         if (!isMatched) {
125436                             break;
125437                         }
125438                     }
125439                 }
125440
125441                 return isMatched;
125442             },
125443
125444             "DOMString": function () {
125445                 return (typeOfObj === typeOfPattern);
125446             },
125447
125448             "Date": function () {
125449                 return (typeOfObj === typeOfPattern);
125450             },
125451
125452             "Function": function () {
125453                 return (typeOfObj === typeOfPattern);
125454             },
125455
125456             "Object": function () {
125457                 var attr, isMatched = false, i;
125458
125459                 if (typeOfObj !== typeOfPattern) {
125460                     if ((obj === null) || (obj === undefined)) {
125461                         return false;
125462                     }
125463                     if (!("_derived" in pattern)) {
125464                         return false;
125465                     }
125466                     return false;
125467                 }
125468
125469                 if (!isConstructed(obj)) {
125470                     return false;
125471                 }
125472
125473                 for (attr in pattern) {
125474                     switch (attr) {
125475                     case "_optional":
125476                     case "_constructor":
125477                         break;
125478
125479                     case "_derived":
125480                         for (i in pattern._derived) {
125481                             isMatched = _self(pattern._derived[i]).match(obj);
125482                             if (isMatched)
125483                                 break;
125484                         }
125485                         break;
125486
125487                     default:
125488                         if (pattern._optional && pattern._optional[attr]) {
125489                             isMatched = ((obj[attr] === null) ||
125490                                     (obj[attr] === undefined) ||
125491                                     _self(pattern[attr]).match(obj[attr]));
125492                         } else {
125493                             isMatched = (obj[attr] !== undefined) &&
125494                                     _self(pattern[attr]).match(obj[attr]);
125495                         }
125496                         break;
125497                     }
125498
125499                     if (!isMatched)
125500                         break;
125501                 }
125502
125503                 /*// Check if verbose attributes are present
125504                 if (isMatched) {
125505                     for (attr in obj) {
125506                         if (pattern[attr] === undefined) {
125507                             isMatched = false;
125508                             break;
125509                         }
125510                     }
125511                 }*/
125512
125513                 return isMatched;
125514             },
125515
125516             "Union": function () {
125517                 var isMatched, i;
125518
125519                 for (i in pattern) {
125520                     isMatched = _self(pattern[i]).match(obj);
125521                     if (isMatched)
125522                         break;
125523                 }
125524
125525                 return isMatched;
125526             },
125527
125528             "any": function () {
125529                 return true;
125530             },
125531
125532             "boolean": function () {
125533                 return (typeOfObj === typeOfPattern);
125534             },
125535
125536             "byte": function () {
125537                 return (obj === toInt8(obj));
125538             },
125539
125540             "dictionary": function () {
125541                 var attr, isMatched = true;
125542
125543                 if (typeOfObj !== "Object") {
125544                     return false;
125545                 }
125546
125547                 for (attr in pattern) {
125548                     switch (attr) {
125549                     case "_dictionary":
125550                         if (pattern._dictionary !== null) {
125551                             isMatched = _self(pattern._dictionary).match(obj);
125552                             if (!isMatched)
125553                                 break;
125554                         }
125555                         break;
125556
125557                     default:
125558                         if ((attr in obj) && (obj[attr] !== null) &&
125559                                 (obj[attr] !== undefined)) {
125560                             isMatched = _self(pattern[attr]).match(obj[attr]);
125561                             if (!isMatched)
125562                                 break;
125563                         }
125564                         break;
125565                     }
125566                 }
125567
125568                 return isMatched;
125569             },
125570
125571             "enum": function () {
125572                 for (var i in pattern) {
125573                     if (obj === pattern[i]) {
125574                         return true;
125575                     }
125576                 }
125577
125578                 return false;
125579             },
125580
125581             "float": function () {
125582                 return (typeOfObj === "Number");
125583             },
125584
125585             "long": function () {
125586                 return (obj === toInt32(obj));
125587             },
125588
125589             "long long": function () {
125590                 return (obj === toInt64(obj));
125591             },
125592
125593             "octet": function () {
125594                 return (obj === toUInt8(obj));
125595             },
125596
125597             "short": function () {
125598                 return (obj === toInt16(obj));
125599             },
125600
125601             "unsigned long": function () {
125602                 return (obj === toUInt32(obj));
125603             },
125604
125605             "unsigned long long": function () {
125606                 return (obj === toUInt64(obj));
125607             },
125608
125609             "unsigned short": function () {
125610                 return (obj === toUInt16(obj));
125611             },
125612
125613             "Arguments": function () {
125614                 return true;
125615             },
125616
125617             "": function () {
125618                 return _self(t[pattern]).match(obj);
125619             }
125620         };
125621
125622         return typeMap[typeOfPattern]();
125623     }
125624
125625     typeOfPattern = getType(pattern, true);
125626
125627     typeCoerce = {
125628         cast:  cast,
125629         copy:  copy,
125630         match: match
125631     };
125632
125633     return typeCoerce;
125634 };
125635
125636 module.exports = _self;
125637
125638 });
125639 define('ripple/platform/tizen/2.0/SyncProfileInfo', function (require, exports, module) {
125640 /*
125641  *  Copyright 2013 Intel Corporation.
125642  *
125643  * Licensed under the Apache License, Version 2.0 (the "License");
125644  * you may not use this file except in compliance with the License.
125645  * You may obtain a copy of the License at
125646  *
125647  * http://www.apache.org/licenses/LICENSE-2.0
125648  *
125649  * Unless required by applicable law or agreed to in writing, software
125650  * distributed under the License is distributed on an "AS IS" BASIS,
125651  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
125652  * See the License for the specific language governing permissions and
125653  * limitations under the License.
125654  */
125655
125656 var t = require('ripple/platform/tizen/2.0/typecast'),
125657     SyncProfileInfo;
125658
125659 SyncProfileInfo = function (profileName, syncInfo, serviceInfo) {
125660     var syncProfileInfo = {};
125661
125662     t.SyncProfileInfo(arguments, this);
125663
125664     syncProfileInfo.profileName = profileName;
125665     syncProfileInfo.syncInfo    = syncInfo;
125666     syncProfileInfo.serviceInfo = serviceInfo;
125667
125668     this.__defineGetter__("profileId", function () {
125669         return null;
125670     });
125671
125672     this.__defineGetter__("profileName", function () {
125673         return syncProfileInfo.profileName;
125674     });
125675     this.__defineSetter__("profileName", function (profileName) {
125676         try {
125677             syncProfileInfo.profileName = t.DOMString(profileName);
125678         } catch (e) {
125679         }
125680     });
125681
125682     this.__defineGetter__("syncInfo", function () {
125683         return syncProfileInfo.syncInfo;
125684     });
125685     this.__defineSetter__("syncInfo", function (syncInfo) {
125686         try {
125687             t.SyncInfo(syncInfo);
125688             syncProfileInfo.syncInfo = syncInfo;
125689         } catch (e) {
125690         }
125691     });
125692
125693     this.__defineGetter__("serviceInfo", function () {
125694         return syncProfileInfo.serviceInfo;
125695     });
125696     this.__defineSetter__("serviceInfo", function (serviceInfo) {
125697         try {
125698             t.SyncServiceInfo(serviceInfo, "[]?");
125699             syncProfileInfo.serviceInfo = serviceInfo;
125700         } catch (e) {
125701         }
125702     });
125703 };
125704
125705 module.exports = SyncProfileInfo;
125706
125707 });
125708 define('ripple/platform/tizen/2.0/typecast', function (require, exports, module) {
125709 /*
125710  *  Copyright 2013 Intel Corporation.
125711  *
125712  * Licensed under the Apache License, Version 2.0 (the "License");
125713  * you may not use this file except in compliance with the License.
125714  * You may obtain a copy of the License at
125715  *
125716  * http://www.apache.org/licenses/LICENSE-2.0
125717  *
125718  * Unless required by applicable law or agreed to in writing, software
125719  * distributed under the License is distributed on an "AS IS" BASIS,
125720  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
125721  * See the License for the specific language governing permissions and
125722  * limitations under the License.
125723  */
125724
125725 var typedef = require('ripple/platform/tizen/2.0/typedef'),
125726     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
125727     WebAPIException = require('ripple/platform/tizen/2.0/WebAPIException'),
125728     TypeCoerce = require('ripple/platform/tizen/2.0/typecoerce'),
125729     _self = {};
125730
125731 function _cast(pattern, obj, isDuplicate) {
125732     var tc, tcFunc;
125733
125734     if (pattern === null)
125735         return;
125736
125737     tc = new TypeCoerce(pattern);
125738     tcFunc = isDuplicate ? tc.copy : tc.cast;
125739
125740     if ((obj = tcFunc(obj)) === null) {
125741         throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
125742     }
125743
125744     return obj;
125745 }
125746
125747 function _castType(pattern) {
125748     /*
125749      * Type cast for each known type. The function name is the exact name of the
125750      * corresponding type.
125751      *
125752      * obj
125753      *    Variable to be casted
125754      *
125755      * aux
125756      *    Auxiliary descriptor of obj. It can be any one or combination of below
125757      *    strings, or ignored in most cases.
125758      *
125759      *    "?"     Nullable types
125760      *    "[]"    Array
125761      *    "+"     Deep copy
125762      *
125763      * Return
125764      *    Casted or duplicated object.
125765      */
125766
125767     return function (obj, aux) {
125768         var type, isNullable, isDuplicate;
125769
125770         aux = aux ? String(aux) : "";
125771         type = (aux.indexOf("[]") !== -1) ? [pattern] : pattern;
125772         isNullable = (aux.indexOf("?") !== -1);
125773         isDuplicate = (aux.indexOf("+") !== -1);
125774
125775         if (isNullable && ((obj === null) || (obj === undefined))) {
125776             return obj;
125777         }
125778
125779         return _cast(type, obj, isDuplicate);
125780     };
125781 }
125782
125783 function _castConstructor(name) {
125784     var constructors, hook, vtc, isOverloaded, castConstructor;
125785
125786     /*
125787      * Type cast for constructor. The function name is the exact name of the
125788      * object type.
125789      *
125790      * argv
125791      *    arguments. The keyword 'arguments' will always be passed in.
125792      */
125793
125794     function castUnique(argv) {
125795         _cast(constructors, argv, false);
125796     }
125797
125798     /*
125799      * Type cast for overloaded constructors. The function name is the exact
125800      * name of the object type.
125801      *
125802      * argv
125803      *    arguments. The keyword 'arguments' will always be passed in.
125804      *
125805      * scope
125806      *    'this' of the original constructor.
125807      *
125808      * voc
125809      *    Array of overloaded constructors callback
125810      */
125811
125812     function castOverload(argv, scope, voc) {
125813         var iOverload;
125814
125815         if (!vtc) {
125816             vtc = [];
125817             constructors.forEach(function (c) {
125818                 vtc.push((c === null) ? null : new TypeCoerce(c));
125819             });
125820         }
125821
125822         vtc.some(function (tc, index) {
125823             if (tc && (tc.cast(argv) === null))
125824                 return false;
125825
125826             iOverload = index;
125827             return true;
125828         });
125829
125830         if (iOverload === undefined) {
125831             throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
125832         }
125833
125834         return (voc && voc[iOverload].apply(scope, argv));
125835     }
125836
125837     constructors = typedef.constructor[name];
125838
125839     if (name in _self) {
125840         hook = _self[name];
125841     }
125842
125843     isOverloaded = (Object.prototype.toString.call(constructors) ===
125844             "[object Array]");
125845     castConstructor = isOverloaded ? castOverload : castUnique;
125846
125847     return function (argv, scope) {
125848         if (Object.prototype.toString.call(argv) !== "[object Arguments]") {
125849             return (hook && hook.apply(this, arguments));
125850         }
125851
125852         if (!(scope instanceof argv.callee)) {
125853             throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR, null, "TypeError");
125854         }
125855
125856         castConstructor.apply(this, arguments);
125857     };
125858 }
125859
125860 function _castInterface(name) {
125861     var interface, hook;
125862
125863     interface = typedef.interface[name];
125864
125865     if (name in _self) {
125866         hook = _self[name];
125867     }
125868
125869     /*
125870      * Type cast for each known method of interface. The function name is the
125871      * exact name of the corresponding interface.
125872      *
125873      * method
125874      *    String of method name
125875      *
125876      * argv
125877      *    arguments. The keyword 'arguments' will always be passed in.
125878      *
125879      * isDuplicate
125880      *    A boolean value to indicate whether arguments will be copied or not.
125881      */
125882
125883     return function (method, argv, isDuplicate) {
125884         if ((typeof method !== "string") || (typeof argv !== "object")) {
125885             return (hook && hook.apply(this, arguments));
125886         }
125887
125888         _cast(interface[method], argv, isDuplicate);
125889     };
125890 }
125891
125892 (function () {
125893     var i;
125894
125895     for (i in typedef) {
125896         _self[i] = _castType(typedef[i]);
125897     }
125898
125899     for (i in typedef.constructor) {
125900         _self[i] = _castConstructor(i);
125901         typedef[i]._constructor = i;
125902     }
125903
125904     for (i in typedef.interface) {
125905         _self[i] = _castInterface(i);
125906     }
125907 }());
125908
125909 module.exports = _self;
125910
125911 });
125912 define('ripple/platform/tizen/2.0/poi', function (require, exports, module) {
125913 /*
125914  *  Copyright 2012 Intel Corporation.
125915  *
125916  * Licensed under the Apache License, Version 2.0 (the "License");
125917  * you may not use this file except in compliance with the License.
125918  * You may obtain a copy of the License at
125919  *
125920  * http://www.apache.org/licenses/LICENSE-2.0
125921  *
125922  * Unless required by applicable law or agreed to in writing, software
125923  * distributed under the License is distributed on an "AS IS" BASIS,
125924  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
125925  * See the License for the specific language governing permissions and
125926  * limitations under the License.
125927  */
125928
125929 var OpenMapQuestProvider = require('ripple/platform/tizen/2.0/poiBackend_openmapquest'), // opne.MapQuest.xapi service
125930     _providers,
125931     _security = {
125932         "http://tizen.org/api/poi": [],
125933         "http://tizen.org/api/poi.read": ["find"],
125934         "http://tizen.org/api/poi.write": ["add", "remove", "update"],
125935         all: true
125936     },
125937     _self;
125938
125939 function _initialize() {
125940     _providers = [new OpenMapQuestProvider({name : "MapQuest", connectivity : "ONLINE", metaData : _security})];
125941 }
125942
125943 _self = function () {
125944     var poi;
125945
125946     poi = {
125947         getDefaultProvider : function () {
125948             return _providers[0];
125949         },
125950         getProviders : function () {
125951             return _providers;
125952         },
125953         handleSubFeatures: function (subFeatures) {
125954             var i, subFeature;
125955             for (subFeature in subFeatures) {
125956                 if (_security[subFeature].length === 0) {
125957                     _security.all = true;
125958                     break;
125959                 }
125960                 _security.all = false;
125961                 for (i = 0; i < _security[subFeature].length; i++) {
125962                     _security[_security[subFeature][i]] = true;
125963                 }
125964             }
125965             _initialize();
125966         }
125967     };
125968
125969     return poi;
125970 };
125971
125972 module.exports = _self;
125973
125974 });
125975 define('ripple/platform/tizen/2.0/ContactGroup', function (require, exports, module) {
125976 /*
125977  *  Copyright 2013 Intel Corporation.
125978  *
125979  * Licensed under the Apache License, Version 2.0 (the "License");
125980  * you may not use this file except in compliance with the License.
125981  * You may obtain a copy of the License at
125982  *
125983  * http://www.apache.org/licenses/LICENSE-2.0
125984  *
125985  * Unless required by applicable law or agreed to in writing, software
125986  * distributed under the License is distributed on an "AS IS" BASIS,
125987  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
125988  * See the License for the specific language governing permissions and
125989  * limitations under the License.
125990  */
125991
125992 var t = require('ripple/platform/tizen/2.0/typecast'),
125993     ContactGroup;
125994
125995 ContactGroup = function (name, ringtoneURI, photoURI) {
125996     var contactGroup = {};
125997
125998     t.ContactGroup(arguments, this);
125999
126000     contactGroup.name        = name;
126001     contactGroup.ringtoneURI = ringtoneURI || null;
126002     contactGroup.photoURI    = photoURI || null;
126003
126004     this.__defineGetter__("id", function () {
126005         return null;
126006     });
126007
126008     this.__defineGetter__("addressBookId", function () {
126009         return null;
126010     });
126011
126012     this.__defineGetter__("name", function () {
126013         return contactGroup.name;
126014     });
126015     this.__defineSetter__("name", function (val) {
126016         try {
126017             contactGroup.name = t.DOMString(val);
126018         } catch (e) {
126019         }
126020     });
126021
126022     this.__defineGetter__("ringtoneURI", function () {
126023         return contactGroup.ringtoneURI;
126024     });
126025     this.__defineSetter__("ringtoneURI", function (val) {
126026         try {
126027             contactGroup.ringtoneURI = t.DOMString(val, "?");
126028         } catch (e) {
126029         }
126030     });
126031
126032     this.__defineGetter__("photoURI", function () {
126033         return contactGroup.photoURI;
126034     });
126035     this.__defineSetter__("photoURI", function (val) {
126036         try {
126037             contactGroup.photoURI = t.DOMString(val, "?");
126038         } catch (e) {
126039         }
126040     });
126041
126042     this.__defineGetter__("readOnly", function () {
126043         return false;
126044     });
126045 };
126046
126047 module.exports = ContactGroup;
126048
126049 });
126050 define('ripple/platform/tizen/2.0/ContactWebSite', function (require, exports, module) {
126051 /*
126052  *  Copyright 2013 Intel Corporation.
126053  *
126054  * Licensed under the Apache License, Version 2.0 (the "License");
126055  * you may not use this file except in compliance with the License.
126056  * You may obtain a copy of the License at
126057  *
126058  * http://www.apache.org/licenses/LICENSE-2.0
126059  *
126060  * Unless required by applicable law or agreed to in writing, software
126061  * distributed under the License is distributed on an "AS IS" BASIS,
126062  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
126063  * See the License for the specific language governing permissions and
126064  * limitations under the License.
126065  */
126066
126067 var t = require('ripple/platform/tizen/2.0/typecast'),
126068     ContactWebSite;
126069
126070 ContactWebSite = function (url, type) {
126071     var contactWebSite = {};
126072
126073     t.ContactWebSite(arguments, this);
126074
126075     contactWebSite.url  = url;
126076     contactWebSite.type = type || "HOMEPAGE";
126077
126078     this.__defineGetter__("url", function () {
126079         return contactWebSite.url;
126080     });
126081     this.__defineSetter__("url", function (val) {
126082         try {
126083             contactWebSite.url = t.DOMString(val);
126084         } catch (e) {
126085         }
126086     });
126087
126088     this.__defineGetter__("type", function () {
126089         return contactWebSite.type;
126090     });
126091     this.__defineSetter__("type", function (val) {
126092         try {
126093             contactWebSite.type = t.DOMString(val);
126094         } catch (e) {
126095         }
126096     });
126097 };
126098
126099 module.exports = ContactWebSite;
126100
126101 });
126102 define('ripple/platform/tizen/2.0/DeviceOrientationEvent', function (require, exports, module) {
126103 /*
126104  *  Copyright 2012 Intel Corporation.
126105  *
126106  * Licensed under the Apache License, Version 2.0 (the "License");
126107  * you may not use this file except in compliance with the License.
126108  * You may obtain a copy of the License at
126109  *
126110  * http://www.apache.org/licenses/LICENSE-2.0
126111  *
126112  * Unless required by applicable law or agreed to in writing, software
126113  * distributed under the License is distributed on an "AS IS" BASIS,
126114  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
126115  * See the License for the specific language governing permissions and
126116  * limitations under the License.
126117  */
126118
126119 var Event = require('ripple/platform/tizen/2.0/EventBase');
126120
126121 module.exports = function () {
126122     var _self = {
126123             alpha: null,
126124             beta: null,
126125             gamma: null,
126126             absolute: false,
126127         };
126128
126129     Event.call(this);
126130
126131     this.__defineGetter__("alpha", function () {
126132         return _self.alpha;
126133     });
126134
126135     this.__defineGetter__("beta", function () {
126136         return _self.beta;
126137     });
126138
126139     this.__defineGetter__("gamma", function () {
126140         return _self.gamma;
126141     });
126142
126143     this.__defineGetter__("absolute", function () {
126144         return _self.absolute;
126145     });
126146
126147     this.initDeviceOrientationEvent = function (orientationType, orientationBubbles, orientationCancelable,
126148                                                alphaData, betaData, gammaData, isAbsolute) {
126149         this.initEvent(orientationType, orientationBubbles, orientationCancelable);
126150
126151         _self.alpha    = alphaData;
126152         _self.beta     = betaData;
126153         _self.gamma    = gammaData;
126154         _self.absolute = isAbsolute;
126155     };
126156 };
126157
126158
126159 });
126160 define('ripple/platform/tizen/2.0/CompositeFilter', function (require, exports, module) {
126161 /*
126162  *  Copyright 2013 Intel Corporation.
126163  *
126164  * Licensed under the Apache License, Version 2.0 (the "License");
126165  * you may not use this file except in compliance with the License.
126166  * You may obtain a copy of the License at
126167  *
126168  * http://www.apache.org/licenses/LICENSE-2.0
126169  *
126170  * Unless required by applicable law or agreed to in writing, software
126171  * distributed under the License is distributed on an "AS IS" BASIS,
126172  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
126173  * See the License for the specific language governing permissions and
126174  * limitations under the License.
126175  */
126176
126177 var t = require('ripple/platform/tizen/2.0/typecast'),
126178     CompositeFilter;
126179
126180 CompositeFilter = function (type, filters) {
126181     var compositeFilter = {};
126182
126183     t.CompositeFilter(arguments, this);
126184
126185     this.__defineGetter__("type", function () {
126186         return compositeFilter.type;
126187     });
126188     this.__defineSetter__("type", function (val) {
126189         try {
126190             compositeFilter.type = t.CompositeFilterType(val);
126191         } catch (e) {
126192         }
126193     });
126194
126195     this.__defineGetter__("filters", function () {
126196         return compositeFilter.filters;
126197     });
126198     this.__defineSetter__("filters", function (val) {
126199         try {
126200             compositeFilter.filters = t.AbstractFilter(val, "[]");
126201         } catch (e) {
126202         }
126203     });
126204
126205     compositeFilter.type    = type;
126206     compositeFilter.filters = filters || [];
126207 };
126208
126209 module.exports = CompositeFilter;
126210
126211 });
126212 define('ripple/platform/tizen/2.0/GeocodeResult', function (require, exports, module) {
126213 /*      
126214  *  Copyright 2012 Intel Corporation.
126215  *  
126216  * Licensed under the Apache License, Version 2.0 (the "License");
126217  * you may not use this file except in compliance with the License.
126218  * You may obtain a copy of the License at
126219  *  
126220  * http://www.apache.org/licenses/LICENSE-2.0
126221  *  
126222  * Unless required by applicable law or agreed to in writing, software
126223  * distributed under the License is distributed on an "AS IS" BASIS,
126224  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
126225  * See the License for the specific language governing permissions and
126226  * limitations under the License.
126227  */
126228
126229 var SimpleCoordinates = require('ripple/platform/tizen/2.0/SimpleCoordinates');
126230
126231 module.exports = function (lat, lon) {
126232     var _self, _coordinates, jsonStr, jsonObj;
126233
126234     _coordinates = new SimpleCoordinates(lat, lon);
126235
126236     jsonObj = {
126237         "type" : "Point",
126238         "coordinates" : [lat, lon]
126239     };
126240
126241     jsonStr = JSON.stringify(jsonObj);
126242
126243     _self = {
126244         coordinates : _coordinates,
126245         toGeoJSON : function () {
126246             return jsonStr;
126247         }
126248     };
126249     return _self;
126250 };
126251
126252
126253 });
126254 define('ripple/platform/tizen/2.0/TimeDuration', function (require, exports, module) {
126255 /*
126256  *  Copyright 2012 Intel Corporation.
126257  *
126258  * Licensed under the Apache License, Version 2.0 (the "License");
126259  * you may not use this file except in compliance with the License.
126260  * You may obtain a copy of the License at
126261  *
126262  * http://www.apache.org/licenses/LICENSE-2.0
126263  *
126264  * Unless required by applicable law or agreed to in writing, software
126265  * distributed under the License is distributed on an "AS IS" BASIS,
126266  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
126267  * See the License for the specific language governing permissions and
126268  * limitations under the License.
126269  */
126270
126271 var t = require('ripple/platform/tizen/2.0/typecast'),
126272     errorcode = require('ripple/platform/tizen/2.0/errorcode'),
126273     WebAPIException = require('ripple/platform/tizen/2.0/WebAPIException'),
126274     TimeDuration;
126275
126276 TimeDuration = function (_length, _unit) {
126277     var timeDuration = {},
126278         TimeDurationUnit = {"MSECS": 1,
126279                             "SECS": 1000,
126280                             "MINS": 60 * 1000,
126281                             "HOURS": 60 * 60 * 1000,
126282                             "DAYS": 24 * 60 * 60 * 1000
126283                            },
126284         _simplifyDuration = function (ms) {
126285             var TDur = require('ripple/platform/tizen/2.0/TimeDuration'),
126286                 uni = "MSECS";
126287             if ((ms % 1000) === 0) {
126288                 ms = ms / 1000;
126289                 uni = "SECS";
126290                 if ((ms % 60) === 0) {
126291                     ms = ms / 60;
126292                     uni = "MINS";
126293                     if ((ms % 60) === 0) {
126294                         ms = ms / 60;
126295                         uni = "HOURS";
126296                         if ((ms % 24) === 0) {
126297                             ms = ms / 24;
126298                             uni = "DAYS";
126299                         }
126300                     }
126301                 }
126302             }
126303             return (new TDur(ms, uni));
126304         },
126305         _toMSECS = function (unit) {
126306             if (TimeDurationUnit[unit] === undefined) {
126307                 throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
126308             } else {
126309                 return TimeDurationUnit[unit];
126310             }
126311         };
126312
126313     t.TimeDuration(arguments, this);
126314
126315     this.__defineGetter__("length", function () {
126316         return timeDuration.length;
126317     });
126318     this.__defineSetter__("length", function (val) {
126319         try {
126320             timeDuration.length = t.double(val);
126321         } catch (e) {
126322         }
126323     });
126324
126325     this.__defineGetter__("unit", function () {
126326         return timeDuration.unit;
126327     });
126328     this.__defineSetter__("unit", function (val) {
126329         try {
126330             timeDuration.unit = t.TimeDurationUnit(val);
126331         } catch (e) {
126332         }
126333     });
126334
126335     timeDuration.length = _length;
126336     timeDuration.unit = _unit || "MSECS";
126337
126338     this.difference = function (o) {
126339
126340         t.TimeDuration("difference", arguments);
126341
126342         var thisMS = timeDuration.length * _toMSECS(timeDuration.unit),
126343             otherMS = o.length * _toMSECS(o.unit);
126344         return _simplifyDuration(thisMS - otherMS);
126345     };
126346     this.equalsTo = function (o) {
126347
126348         t.TimeDuration("equalsTo", arguments);
126349
126350         var thisMS = timeDuration.length * _toMSECS(timeDuration.unit),
126351             otherMS = o.length * _toMSECS(o.unit);
126352         return (thisMS === otherMS);
126353     };
126354     this.lessThan = function (o) {
126355
126356         t.TimeDuration("lessThan", arguments);
126357
126358         var thisMS = timeDuration.length * _toMSECS(timeDuration.unit),
126359             otherMS = o.length * _toMSECS(o.unit);
126360         return (thisMS < otherMS);
126361     };
126362     this.greaterThan = function (o) {
126363
126364         t.TimeDuration("greaterThan", arguments);
126365
126366         var thisMS = timeDuration.length * _toMSECS(timeDuration.unit),
126367             otherMS = o.length * _toMSECS(o.unit);
126368         return (thisMS > otherMS);
126369     };
126370 };
126371
126372 module.exports = TimeDuration;
126373
126374 });
126375 define('ripple/platform/tizen/2.0/ApplicationControl', function (require, exports, module) {
126376 /*
126377  *  Copyright 2013 Intel Corporation.
126378  *
126379  * Licensed under the Apache License, Version 2.0 (the "License");
126380  * you may not use this file except in compliance with the License.
126381  * You may obtain a copy of the License at
126382  *
126383  * http://www.apache.org/licenses/LICENSE-2.0
126384  *
126385  * Unless required by applicable law or agreed to in writing, software
126386  * distributed under the License is distributed on an "AS IS" BASIS,
126387  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
126388  * See the License for the specific language governing permissions and
126389  * limitations under the License.
126390  */
126391
126392 var t = require('ripple/platform/tizen/2.0/typecast'),
126393     ApplicationControlData = require('ripple/platform/tizen/2.0/ApplicationControlData');
126394
126395 var ApplicationControl = function (operation, uri, mime, category, data) {
126396     var applicationControl = {}, i;
126397
126398     t.ApplicationControl(arguments, this);
126399
126400     applicationControl.operation = operation;
126401     applicationControl.uri       = uri || null;
126402     applicationControl.mime      = mime || null;
126403     applicationControl.category  = category || null;
126404     applicationControl.data      = [];
126405
126406     if (data) {
126407         for (i in data) {
126408             applicationControl.data[i] = new ApplicationControlData(data[i].key,
126409                     data[i].value);
126410         }
126411     }
126412
126413     this.__defineGetter__("operation", function () {
126414         return applicationControl.operation;
126415     });
126416     this.__defineSetter__("operation", function (val) {
126417         try {
126418             applicationControl.operation = t.DOMString(val);
126419         } catch (e) {
126420         }
126421     });
126422
126423     this.__defineGetter__("uri", function () {
126424         return applicationControl.uri;
126425     });
126426     this.__defineSetter__("uri", function (val) {
126427         try {
126428             applicationControl.uri = t.DOMString(val, "?");
126429         } catch (e) {
126430         }
126431     });
126432
126433     this.__defineGetter__("mime", function () {
126434         return applicationControl.mime;
126435     });
126436     this.__defineSetter__("mime", function (val) {
126437         try {
126438             applicationControl.mime = t.DOMString(val, "?");
126439         } catch (e) {
126440         }
126441     });
126442
126443     this.__defineGetter__("category", function () {
126444         return applicationControl.category;
126445     });
126446     this.__defineSetter__("category", function (val) {
126447         try {
126448             applicationControl.category = t.DOMString(val, "?");
126449         } catch (e) {
126450         }
126451     });
126452
126453     this.__defineGetter__("data", function () {
126454         return applicationControl.data;
126455     });
126456     this.__defineSetter__("data", function (val) {
126457         var i;
126458
126459         try {
126460             t.ApplicationControlData(val, "[]");
126461             for (i in val) {
126462                 applicationControl.data[i] = new ApplicationControlData(
126463                         val[i].key, val[i].value);
126464             }
126465         } catch (e) {
126466         }
126467     });
126468 };
126469
126470 module.exports = ApplicationControl;
126471
126472 });
126473 define('ripple/platform/ivi/3.0/errorcode', function (require, exports, module) {
126474 /*
126475  *  Copyright 2013 Intel Corporation.
126476  *
126477  * Licensed under the Apache License, Version 2.0 (the "License"),
126478  * you may not use this file except in compliance with the License.
126479  * You may obtain a copy of the License at
126480  *
126481  * http://www.apache.org/licenses/LICENSE-2.0
126482  *
126483  * Unless required by applicable law or agreed to in writing, software
126484  * distributed under the License is distributed on an "AS IS" BASIS,
126485  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
126486  * See the License for the specific language governing permissions and
126487  * limitations under the License.
126488  */
126489
126490 var _self = {};
126491
126492 _self.__defineGetter__("PERMISSION_DENIED", function () {
126493     return 1;
126494 });
126495
126496 _self.__defineGetter__("PROPERTY_UNAVAILABLE", function () {
126497     return 2;
126498 });
126499
126500 _self.__defineGetter__("TIMEOUT", function () {
126501     return 3;
126502 });
126503
126504 _self.__defineGetter__("UNKNOWN", function () {
126505     return 10;
126506 });
126507
126508 module.exports = _self;
126509
126510 });
126511 define('ripple/platform/ivi/3.0/speech', function (require, exports, module) {
126512 /*
126513  *  Copyright 2014 Intel Corporation.
126514  *
126515  * Licensed under the Apache License, Version 2.0 (the "License");
126516  * you may not use this file except in compliance with the License.
126517  * You may obtain a copy of the License at
126518  *
126519  * http://www.apache.org/licenses/LICENSE-2.0
126520  *
126521  * Unless required by applicable law or agreed to in writing, software
126522  * distributed under the License is distributed on an "AS IS" BASIS,
126523  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
126524  * See the License for the specific language governing permissions and
126525  * limitations under the License.
126526  */
126527
126528 var t = require('ripple/platform/ivi/3.0/typecast'),
126529     _security = {
126530         "http://tizen.org/privilege/speech": []
126531     },
126532     _self;
126533
126534 function _initialize () {
126535 }
126536
126537 _self = function () {
126538     var speech;
126539
126540     function vocalizeString (speakString) {
126541         t.SpeechManager("vocalizeString", arguments);
126542
126543         meSpeak.speak(speakString);
126544     }
126545
126546     function handleSubFeatures (subFeatures) {
126547         var i, subFeature;
126548
126549         for (subFeature in subFeatures) {
126550             for (i in _security[subFeature]) {
126551                 _security[_security[subFeature][i]] = true;
126552             }
126553         }
126554     }
126555
126556     speech = {
126557         vocalizeString: vocalizeString,
126558         handleSubFeatures: handleSubFeatures
126559     };
126560
126561     return speech;
126562 };
126563
126564 _initialize();
126565
126566 module.exports = _self;
126567
126568 });
126569 define('ripple/platform/ivi/3.0/VehiclePanelEngine', function (require, exports, module) {
126570
126571 /*
126572  *  Copyright 2013 Intel Corporation.
126573  *
126574  * Licensed under the Apache License, Version 2.0 (the "License");
126575  * you may not use this file except in compliance with the License.
126576  * You may obtain a copy of the License at
126577  *
126578  * http://www.apache.org/licenses/LICENSE-2.0
126579  *
126580  * Unless required by applicable law or agreed to in writing, software
126581  * distributed under the License is distributed on an "AS IS" BASIS,
126582  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
126583  * See the License for the specific language governing permissions and
126584  * limitations under the License.
126585  */
126586
126587 var utils = require('ripple/utils'),
126588     db = require('ripple/db'),
126589     dbinit = require('ripple/platform/ivi/3.0/dbinit'),
126590     _vehicleMapStack = {},
126591     _databaseName = "ivi-vehicle-database",
126592     VehiclePanelEngine;
126593
126594 function _save (data) {
126595     db.saveObject(_databaseName, data);
126596 }
126597
126598 function _get () {
126599     var database = db.retrieveObject(_databaseName);
126600
126601     if (!database) {
126602         db.saveObject(_databaseName, dbinit.Vehicle);
126603         database = db.retrieveObject(_databaseName);
126604     }
126605
126606     return database;
126607 }
126608
126609 VehiclePanelEngine = function () {
126610     var _CONFIGURATION = "configuration", _AUTO = "auto",
126611         _database,
126612         _configuration, _currentConfiguration,
126613         _supported, _settings, _autoRunning;
126614
126615     function _init () {
126616         _database = _get();
126617
126618         _settings = _database.settingData;
126619
126620         _configuration = _database.configurationData;
126621         _currentConfiguration = _database.currentConfiguration;
126622
126623         _supported = _database.supported;
126624
126625         _autoRunning = _database.autoRunningData;
126626     }
126627
126628     this.saveData = function (supported, currentConfiguration, configuration, settings, autoRunning) {
126629         _database.supported = supported;
126630         _database.currentConfiguration = currentConfiguration;
126631         _database.settingData = settings;
126632         _database.configurationData[currentConfiguration] = configuration;
126633         _database.autoRunningData[0] = autoRunning;
126634
126635         _save(_database);
126636     };
126637
126638     function _formatVehicleDB (map, db) {
126639         var formatSettings = {},
126640             VehicleMap = map, vehicleData = db,
126641             property, name, item, i = 0;
126642
126643         for (property in VehicleMap) {
126644             name = property.split("-")[0];
126645             item = property.split("-")[1];
126646
126647             if (!formatSettings[name]) {
126648                 formatSettings[name] = {};
126649             }
126650
126651             formatSettings[name][item] = utils.copy(VehicleMap[property]);
126652             formatSettings[name][item].value = vehicleData[i];
126653
126654             i++;
126655         }
126656
126657         return formatSettings;
126658     }
126659
126660     /**
126661      * get
126662      * @return {Object}
126663      */
126664     this.getConfiguration = function () {
126665         var configuration = {}, i, j, dataIndex, tempArray,
126666             configurationMap = _vehicleMapStack.vehicleConfigurationMap,
126667             configurationData = _configuration;
126668
126669         for (j = 0; j < configurationData.length; j++) {
126670             dataIndex = _CONFIGURATION + j;
126671             configuration[dataIndex] = {};
126672
126673             for (i = 0; i < configurationMap.length; i++) {
126674                 tempArray = configurationMap[i].split("-");
126675
126676                 if (!configuration[dataIndex][tempArray[0]]) {
126677                     configuration[dataIndex][tempArray[0]] = {};
126678                 }
126679                 configuration[dataIndex][tempArray[0]][tempArray[1]] = configurationData[j][i];
126680             }
126681         }
126682
126683         return configuration;
126684     };
126685
126686     /**
126687      * get
126688      * @return {String}
126689      */
126690     this.getCurrentConfiguration = function () {
126691         return _CONFIGURATION + _currentConfiguration;
126692     };
126693
126694     /**
126695      * get
126696      * @return {Array}
126697      */
126698     this.getProperties = function () {
126699         return _vehicleMapStack.vehicleProperties;
126700     };
126701
126702     /**
126703      * get supported vehicle properties name.
126704      * @return {Array}
126705      */
126706     this.getSupported = function () {
126707         return _supported;
126708     };
126709
126710     /**
126711      * get property unit.
126712      * @param property
126713      * @param item
126714      * @return {String}
126715      */
126716     this.getPropertyUnit = function (property, item) {
126717         var unitKey = property + "-" + item,
126718             propertyUnitMap = _vehicleMapStack.vehiclePropertyUnitsMap;
126719
126720         return !propertyUnitMap[unitKey] ? "" : "(" + propertyUnitMap[unitKey] + ")";
126721     };
126722
126723     this.getPropertyRange = function (property, item) {
126724         var rangeKey = property + "-" + item,
126725             propertyRangeMap = _vehicleMapStack.vehiclePropertyRangeMap;
126726
126727         return !propertyRangeMap[rangeKey] ? false : propertyRangeMap[rangeKey];
126728     };
126729
126730     /**
126731      * get
126732      * @param property
126733      * @param item
126734      * @return {*}
126735      */
126736     this.getPropertyConstant = function (property, item) {
126737         var propertyConstants = _vehicleMapStack.vehiclePropertyConstantsMap;
126738
126739         return !propertyConstants[property] ? null : propertyConstants[property][item];
126740     };
126741
126742     this.getSettings = function () {
126743         return _formatVehicleDB(_vehicleMapStack.vehicleSettingMap, _settings);
126744     };
126745
126746     this.getAutoRunning = function () {
126747         var autoRunning = {}, i,
126748             autoRunningMap = _vehicleMapStack.vehicleAutoRunningMap,
126749             autoRunningData = _autoRunning;
126750
126751         for (i = 0; i < _autoRunning.length; i++) {
126752             autoRunning[_AUTO + i] = _formatVehicleDB(autoRunningMap, autoRunningData[i]);
126753         }
126754         return autoRunning;
126755     };
126756
126757     _init();
126758 };
126759
126760 //can support all properties.
126761 _vehicleMapStack.vehicleProperties = [
126762     "VehicleSpeed", "EngineSpeed", "VehiclePowerMode", "TripMeter",
126763     "Acceleration", "Transmission", "CruiseControlStatus", "WheelBrake",
126764     "LightStatus", "InteriorLightStatus", "Horn", "Fuel", "EngineOil",
126765     "Location", "ExteriorBrightness", "Temperature", "RainSensor",
126766     "WindshieldWiper", "HVAC", "WindowStatus", "Sunroof", "ConvertibleRoof",
126767     "VehicleId", "Size", "FuelInfo", "VehicleType", "Doors",
126768     "TransmissionGearType", "WheelInformation", "Odometer", "Fluid", "Battery",
126769     "TirePressure", "TireTemperature", "SecurityAlert", "ParkingBrake",
126770     "ParkingLight", "HazardLight", "AntilockBrakingSystem", "TractionControlSystem",
126771     "VehicleTopSpeedLimit", "AirbagStatus", "DoorStatus", "SeatBeltStatus",
126772     "OccupantStatus", "ObstacleDistance", "NightMode", "DrivingMode",
126773     "TurnSignal", "ButtonEvent"
126774 ];
126775
126776 //Vehicle Configuration
126777 _vehicleMapStack.vehicleConfigurationMap = [
126778     "VehicleId-WMI", "VehicleId-VIN",
126779     "Size-width", "Size-height", "Size-length",
126780     "FuelInfo-type", "FuelInfo-refuelPosition",
126781     "VehicleType-type",
126782     "Doors-doorsPerRow",
126783     "TransmissionGearType-transmissionGearType",
126784     "WheelInformation-frontWheelRadius", "WheelInformation-rearWheelRadius", "WheelInformation-wheelTrack", "WheelInformation-ABS"
126785 ];
126786
126787 //all ranged attributes' min. max and step.
126788 _vehicleMapStack.vehiclePropertyRangeMap = {
126789     "VehicleSpeed-vehicleSpeed": [0, 400, 1],
126790     "EngineSpeed-engineSpeed": [0, 10000, 20],
126791     "Acceleration-x": [0, 200, 1],
126792     "Acceleration-y": [0, 200, 1],
126793     "Acceleration-z": [0, 200, 1],
126794     "Fuel-level": [0, 100, 1],
126795     "Fuel-range": [0, 1000, 1],
126796     "Fuel-instantConsumption": [0, 100, 1],
126797     "Fuel-instantEconomy": [0, 100, 1],
126798     "Fuel-averageEconomy": [0, 100, 1],
126799     "EngineOil-remaining": [0, 100, 1],
126800     "EngineOil-temperature": [0, 100, 1],
126801     "EngineOil-pressure": [0, 1000, 1],
126802     "Location-latitude": [-180, 180, 1],
126803     "Location-longitude": [-19, 90, 1],
126804     "Location-altitude": [0, 100, 1],
126805     "Location-direction": [0, 360, 1],
126806     "ExteriorBrightness-exteriorBrightness": [0, 100, 1],
126807     "Temperature-interior": [-5, 35, 1],
126808     "Temperature-exterior": [-40, 60, 1],
126809     "Odometer-odometer": [0, 10000, 10],
126810     "CruiseControlStatus-speed": [1, 100, 1],
126811     "HVAC-targetTemperature": [0, 35, 7],
126812     "Sunroof-openness": [0, 100, 1],
126813     "Sunroof-tilt": [0, 100, 1],
126814     "ConvertibleRoof-openness": [0, 100, 1],
126815     "WindowStatus-openness": [0, 100, 1],
126816     "VehicleTopSpeedLimit-vehicleTopSpeedLimit": [0, 400, 1],
126817     "ObstacleDistance-obstacleDistance": [0, 120, 1],
126818     "Fluid-transmission": [0, 100, 1],
126819     "Fluid-brake": [0, 100, 1],
126820     "Fluid-washer": [0, 100, 1],
126821     "Battery-voltage": [0, 12, 1],
126822     "Battery-current": [0, 200, 1],
126823     "TirePressure-leftFront": [0, 500, 1],
126824     "TirePressure-rightFront": [0, 500, 1],
126825     "TirePressure-leftRear": [0, 500, 1],
126826     "TirePressure-rightRear": [0, 500, 1],
126827     "TireTemperature-leftFront": [0, 60, 1],
126828     "TireTemperature-rightFront": [0, 60, 1],
126829     "TireTemperature-leftRear": [0, 60, 1],
126830     "TireTemperature-rightRear": [0, 60, 1],
126831     "TurnSignal-turnSignal": [0, 100, 1],
126832     "ButtonEvent-buttonEvent": [0, 100, 1]
126833 };
126834
126835 //simulate car running attributes' controller-types.
126836 _vehicleMapStack.vehicleAutoRunningMap = {
126837     "VehicleSpeed-vehicleSpeed": {
126838         "type": "range"
126839     },
126840     "EngineSpeed-engineSpeed": {
126841         "type": "range"
126842     },
126843     "VehiclePowerMode-vehiclePowerMode": {
126844         "type": "select",
126845         "options": [{"OFF": 0},{"ACCESSORY1": 1},{"ACCESSORY2": 2},{"RUN": 3}]
126846     },
126847     "TripMeter-tripMeters": {
126848         "type": "text"
126849     },
126850     "Acceleration-x": {
126851         "type": "range"
126852     },
126853     "Acceleration-y": {
126854         "type": "range"
126855     },
126856     "Acceleration-z": {
126857         "type": "range"
126858     },
126859     "Fuel-level": {
126860         "type": "range"
126861     },
126862     "Fuel-range": {
126863         "type": "range"
126864     },
126865     "Fuel-instantConsumption": {
126866         "type": "range"
126867     },
126868     "Fuel-instantEconomy": {
126869         "type": "range"
126870     },
126871     "Fuel-averageEconomy": {
126872         "type": "range"
126873     },
126874     "EngineOil-remaining": {
126875         "type": "range"
126876     },
126877     "EngineOil-temperature": {
126878         "type": "range"
126879     },
126880     "EngineOil-pressure": {
126881         "type": "range"
126882     },
126883     "Location-latitude": {
126884         "type": "range"
126885     },
126886     "Location-longitude": {
126887         "type": "range"
126888     },
126889     "Location-altitude": {
126890         "type": "range"
126891     },
126892     "Location-direction": {
126893         "type": "range"
126894     },
126895     "ExteriorBrightness-exteriorBrightness": {
126896         "type": "range"
126897     },
126898     "Temperature-interior": {
126899         "type": "range"
126900     },
126901     "Temperature-exterior": {
126902         "type": "range"
126903     },
126904     "RainSensor-rainSensor": {
126905         "type": "select",
126906         "options": [{"No Rain": 0},{"Rain 1": 1},{"Rain 2": 2},{"Rain 3": 3},{"Rain 4": 4},{"Rain 5": 5},
126907             {"Rain 6": 6},{"Rain 7": 7},{"Rain 8": 8},{"Rain 9": 9},{"Heaviest": 10}]
126908     },
126909     "Odometer-odometer": {
126910         "type": "range"
126911     },
126912     "TurnSignal-turnSignal": {
126913         "type": "range"
126914     },
126915     "ButtonEvent-buttonEvent": {
126916         "type": "range"
126917     }
126918 };
126919
126920 //Vehicle Setting attributes' controller-types.
126921 _vehicleMapStack.vehicleSettingMap = {
126922     "Transmission-gearPosition": {
126923         "type": "select",
126924         "options": [{"NEUTRAL": 0},{"FIRST": 1},{"SECOND": 2},{"THIRD": 3}, {"FORTH": 4},{"FIFTH": 5},
126925             {"SIXTH": 6},{"SEVENTH": 7}, {"EIGHTH": 8},{"NINTH": 9},{"TENTH": 10},{"CVT": 64},
126926             {"REVERSE": 128},{"PARK": 255}]
126927     },
126928     "Transmission-mode": {
126929         "type": "select",
126930         "options": [{"NORMAL": 0},{"SPORT": 1},{"ECONOMY": 2}, {"OEMCUSTOM1": 3},{"OEMCUSTOM2": 4}]
126931     },
126932     "CruiseControlStatus-activated": {
126933         "type": "radio",
126934         "options": [{"Active": true}, {"Inactive": false}]
126935     },
126936     "CruiseControlStatus-speed": {
126937         "type": "range"
126938     },
126939     "WheelBrake-engaged": {
126940         "type": "radio",
126941         "options": [{"Engaged": true}, {"Disengaged": false}]
126942     },
126943     "LightStatus-head": {
126944         "type": "radio",
126945         "options": [{"On": true}, {"Off": false}]
126946     },
126947     "LightStatus-rightTurn": {
126948         "type": "radio",
126949         "options": [{"On": true}, {"Off": false}]
126950     },
126951     "LightStatus-leftTurn": {
126952         "type": "radio",
126953         "options": [{"On": true}, {"Off": false}]
126954     },
126955     "LightStatus-brake": {
126956         "type": "radio",
126957         "options": [{"On": true}, {"Off": false}]
126958     },
126959     "LightStatus-fog": {
126960         "type": "radio",
126961         "options": [{"On": true}, {"Off": false}]
126962     },
126963     "LightStatus-hazard": {
126964         "type": "radio",
126965         "options": [{"On": true}, {"Off": false}]
126966     },
126967     "LightStatus-parking": {
126968         "type": "radio",
126969         "options": [{"On": true}, {"Off": false}]
126970     },
126971     "LightStatus-highBeam": {
126972         "type": "radio",
126973         "options": [{"On": true}, {"Off": false}]
126974     },
126975     "InteriorLightStatus-passenger": {
126976         "type": "radio",
126977         "options": [{"On": true}, {"Off": false}]
126978     },
126979     "InteriorLightStatus-driver": {
126980         "type": "radio",
126981         "options": [{"On": true}, {"Off": false}]
126982     },
126983     "InteriorLightStatus-center": {
126984         "type": "radio",
126985         "options": [{"On": true}, {"Off": false}]
126986     },
126987     "Horn-on": {
126988         "type": "radio",
126989         "options": [{"On": true}, {"Off": false}]
126990     },
126991     "WindshieldWiper-windshieldWiper": {
126992         "type": "select",
126993         "options": [{"OFF": 0},{"SLOWEST": 1},{"FASTEST": 5},{"AUTO": 10}]
126994     },
126995     "HVAC-airflowDirection": {
126996         "type": "select",
126997         "options": [{"FRONTPANEL": 0},{"FLOORDUCT": 1},{"FRONT": 0x02}, {"DEFROSTER": 0x04}]
126998     },
126999     "HVAC-fanSpeed": {
127000         "type": "select",
127001         "options": [{"0": 0},{"1": 1},{"2": 2},{"3": 3},{"4": 4},{"5": 5}, {"6": 6},{"7": 7}]
127002     },
127003     "HVAC-targetTemperature": {
127004         "type": "range"
127005     },
127006     "HVAC-airConditioning": {
127007         "type": "radio",
127008         "options": [{"On": true}, {"Off": false}]
127009     },
127010     "HVAC-airRecirculation": {
127011         "type": "radio",
127012         "options": [{"On": true}, {"Off": false}]
127013     },
127014     "HVAC-heater": {
127015         "type": "radio",
127016         "options": [{"On": true}, {"Off": false}]
127017     },
127018     "HVAC-steeringWheelHeater": {
127019         "type": "radio",
127020         "options": [{"On": true}, {"Off": false}]
127021     },
127022     "HVAC-seatHeater": {
127023         "type": "radio",
127024         "options": [{"On": true}, {"Off": false}]
127025     },
127026     "HVAC-seatCooler": {
127027         "type": "radio",
127028         "options": [{"On": true}, {"Off": false}]
127029     },
127030     "Sunroof-openness": {
127031         "type": "range"
127032     },
127033     "Sunroof-tilt": {
127034         "type": "range"
127035     },
127036     "ConvertibleRoof-openness": {
127037         "type": "range"
127038     },
127039     "SecurityAlert-securityAlert": {
127040         "type": "radio",
127041         "options": [{"On": true}, {"Off": false}]
127042     },
127043     "ParkingBrake-parkingBrake": {
127044         "type": "radio",
127045         "options": [{"Engaged": true}, {"Disengaged": false}]
127046     },
127047     "ParkingLight-parkingLight": {
127048         "type": "radio",
127049         "options": [{"Engaged": true}, {"Disengaged": false}]
127050     },
127051     "HazardLight-hazardLight": {
127052         "type": "radio",
127053         "options": [{"Engaged": true}, {"Disengaged": false}]
127054     },
127055     "AntilockBrakingSystem-antilockBrakingSystem": {
127056         "type": "radio",
127057         "options":[{"Engaged": true}, {"Idle": false}]
127058     },
127059     "TractionControlSystem-tractionControlSystem": {
127060         "type": "radio",
127061         "options": [{"On": true}, {"Off": false}]
127062     },
127063     "VehicleTopSpeedLimit-vehicleTopSpeedLimit": {
127064         "type": "range"
127065     },
127066     "WindowStatus-openness": {
127067         "type": "range"
127068     },
127069     "WindowStatus-defrost": {
127070         "type": "radio",
127071         "options": [{"On": true}, {"Off": false}]
127072     },
127073     "AirbagStatus-airbagStatus": {
127074         "type": "select",
127075         "options": [{"INACTIVE": 0},{"ACTIVE": 1},{"DEPLOYED": 2}]
127076     },
127077     "DoorStatus-doorStatus": {
127078         "type": "select",
127079         "options": [{"CLOSED": 0},{"OPEN": 1},{"AJAR": 2}]
127080     },
127081     "DoorStatus-doorLockStatus": {
127082         "type": "radio",
127083         "options": [{"Locked": true}, {"Unlocked": false}]
127084     },
127085     "DoorStatus-childLockStatus": {
127086         "type": "radio",
127087         "options": [{"On": true}, {"Off": false}]
127088     },
127089     "SeatBeltStatus-seatBeltStatus": {
127090         "type": "radio",
127091         "options": [{"Fasten": true}, {"Unfastened": false}]
127092     },
127093     "OccupantStatus-occupantStatus": {
127094         "type": "select",
127095         "options": [{"VACANT": 0},{"CHILD": 1},{"ADULT": 2}]
127096     },
127097     "ObstacleDistance-obstacleDistance": {
127098         "type": "range"
127099     },
127100     "NightMode-nightMode": {
127101         "type": "radio",
127102         "options": [{"Night": true}, {"Day": false}]
127103     },
127104     "DrivingMode-drivingMode": {
127105         "type": "select",
127106         "options": [{"Not Driving": 0},{"Driving": 1}]
127107     },
127108     "Fluid-transmission": {
127109         "type": "range"
127110     },
127111     "Fluid-brake": {
127112         "type": "range"
127113     },
127114     "Fluid-washer": {
127115         "type": "range"
127116     },
127117     "Battery-voltage": {
127118         "type": "range"
127119     },
127120     "Battery-current": {
127121         "type": "range"
127122     },
127123     "TirePressure-leftFront": {
127124         "type": "range"
127125     },
127126     "TirePressure-rightFront": {
127127         "type": "range"
127128     },
127129     "TirePressure-leftRear": {
127130         "type": "range"
127131     },
127132     "TirePressure-rightRear": {
127133         "type": "range"
127134     },
127135     "TireTemperature-leftFront": {
127136         "type": "range"
127137     },
127138     "TireTemperature-rightFront": {
127139         "type": "range"
127140     },
127141     "TireTemperature-leftRear": {
127142         "type": "range"
127143     },
127144     "TireTemperature-rightRear": {
127145         "type": "range"
127146     }
127147 };
127148
127149 //attributes units
127150 _vehicleMapStack.vehiclePropertyUnitsMap = {
127151     "VehicleSpeed-vehicleSpeed": "kph",
127152     "EngineSpeed-engineSpeed": "rpm",
127153     "TripMeter-tripMeters": "[m,...]",
127154     "CruiseControlStatus-speed": "kph",
127155     "Fuel-level": "%",
127156     "Fuel-instantConsumption": "ml/s",
127157     "Fuel-instantEconomy": "km/l",
127158     "Fuel-averageEconomy": "km/l",
127159     "EngineOil-remaining": "%",
127160     "EngineOil-temperature": "C",
127161     "EngineOil-pressure": "kpa",
127162     "ExteriorBrightness-exteriorBrightness": "lux",
127163     "Temperature-interior": "C",
127164     "Temperature-exterior": "C",
127165     "HVAC-targetTemperature": "C",
127166     "Sunroof-openness": "%",
127167     "Sunroof-tilt": "%",
127168     "ConvertibleRoof-openness": "%",
127169     "WindowStatus-openness": "%",
127170     "ObstacleDistance-obstacleDistance": "m",
127171     "Size-width": "mm",
127172     "Size-height": "mm",
127173     "Size-length": "mm",
127174     "WheelInformation-frontWheelRadius": "mm",
127175     "WheelInformation-rearWheelRadius": "mm",
127176     "WheelInformation-wheelTrack": "mm",
127177     "Odometer-odometer": "km",
127178     "Fluid-transmission": "%",
127179     "Fluid-brake": "%",
127180     "Fluid-washer": "%",
127181     "Battery-voltage": "V",
127182     "Battery-current": "A",
127183     "TirePressure-leftFront": "kpa",
127184     "TirePressure-rightFront": "kpa",
127185     "TirePressure-leftRear": "kpa",
127186     "TirePressure-rightRear": "kpa",
127187     "TireTemperature-leftFront": "C",
127188     "TireTemperature-rightFront": "C",
127189     "TireTemperature-leftRear": "C",
127190     "TireTemperature-rightRear": "C",
127191     "VehicleTopSpeedLimit-vehicleTopSpeedLimit": "kph"
127192 };
127193
127194 //key and value of select types in attributes
127195 _vehicleMapStack.vehiclePropertyConstantsMap = {
127196     "FuelInfo": {
127197         "type": {
127198             "val0": "GASOLINE",
127199             "val1": "HIGH_OCTANE",
127200             "val2": "DIESEL",
127201             "val3": "ELECTRIC",
127202             "val4": "HYDROGEN"
127203         },
127204         "refuelPosition": {
127205             "val0": "LEFT",
127206             "val1": "RIGHT",
127207             "val2": "FRONT",
127208             "val3": "REAR"
127209         }
127210     },
127211     "VehicleType": {
127212         "type": {
127213             "val0": "SEDAN",
127214             "val1": "COUPE",
127215             "val2": "CABRIOLE",
127216             "val3": "ROADSTER",
127217             "val4": "SUV",
127218             "val5": "TRUCK"
127219         }
127220     },
127221     "TransmissionGearType": {
127222         "transmissionGearType": {
127223             "val0": "AUTO",
127224             "val1": "MANUAL",
127225             "val2": "CV"
127226         }
127227     },
127228     "VehiclePowerMode": {
127229         "vehiclePowerMode": {
127230             "val0": "OFF",
127231             "val1": "ACCESSORY1",
127232             "val2": "ACCESSORY2",
127233             "val3": "RUN"
127234         }
127235     }
127236 };
127237
127238 exports.VehiclePanelEngine = new VehiclePanelEngine();
127239
127240 });
127241 define('ripple/platform/ivi/3.0/spec', function (require, exports, module) {
127242 /*
127243  *  Copyright 2012 Intel Corporation.
127244  *
127245  * Licensed under the Apache License, Version 2.0 (the "License");
127246  * you may not use this file except in compliance with the License.
127247  * You may obtain a copy of the License at
127248  *
127249  * http://www.apache.org/licenses/LICENSE-2.0
127250  *
127251  * Unless required by applicable law or agreed to in writing, software
127252  * distributed under the License is distributed on an "AS IS" BASIS,
127253  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
127254  * See the License for the specific language governing permissions and
127255  * limitations under the License.
127256  */
127257
127258 module.exports = {
127259
127260     id: "ivi",
127261     version: "3.0",
127262     name: "IVI",
127263
127264     persistencePrefix: "ivi3-",
127265
127266     config: require('ripple/platform/ivi/3.0/spec/config'),
127267     ui: require('ripple/platform/ivi/3.0/spec/ui'),
127268     device: require('ripple/platform/ivi/3.0/spec/device'),
127269     sensor: require('ripple/platform/ivi/3.0/spec/sensor'),
127270     DeviceMotionEvent: require('ripple/platform/tizen/2.0/DeviceMotionEvent'),
127271     DeviceOrientationEvent: require('ripple/platform/tizen/2.0/DeviceOrientationEvent'),
127272
127273     objects: {
127274         Coordinates: {
127275             path: "w3c/1.0/Coordinates"
127276         },
127277         Position: {
127278             path: "w3c/1.0/Position"
127279         },
127280         PositionError: {
127281             path: "w3c/1.0/PositionError"
127282         },
127283         SensorConnection: {
127284             path: "w3c/1.0/SensorConnection"
127285         },
127286         SpeechRecognition: {
127287             path: "ivi/3.0/SpeechRecognition"
127288         },
127289         navigator: {
127290             path: "tizen/2.0/navigator",
127291             children: {
127292                 geolocation: {
127293                     path: "wac/2.0/geolocation"
127294                 },
127295                 battery: {
127296                     path: "tizen/2.0/battery"
127297                 }
127298             }
127299         },
127300         tizen: {
127301             feature: "http://tizen.org/privilege/tizen",
127302             children: {
127303                 AlarmAbsolute: {
127304                     path: "tizen/2.0/AlarmAbsolute"
127305                 },
127306                 AlarmRelative: {
127307                     path: "tizen/2.0/AlarmRelative"
127308                 },
127309                 ApplicationControl: {
127310                     path: "tizen/2.0/ApplicationControl"
127311                 },
127312                 ApplicationControlData: {
127313                     path: "tizen/2.0/ApplicationControlData"
127314                 },
127315                 AttributeFilter: {
127316                     path: "tizen/2.0/AttributeFilter"
127317                 },
127318                 AttributeRangeFilter: {
127319                     path: "tizen/2.0/AttributeRangeFilter"
127320                 },
127321                 BookmarkFolder: {
127322                     path: "tizen/2.0/BookmarkFolder"
127323                 },
127324                 BookmarkItem: {
127325                     path: "tizen/2.0/BookmarkItem"
127326                 },
127327                 CalendarAlarm: {
127328                     path: "tizen/2.0/CalendarAlarm"
127329                 },
127330                 CalendarAttendee: {
127331                     path: "tizen/2.0/CalendarAttendee"
127332                 },
127333                 CalendarEvent: {
127334                     path: "tizen/2.0/CalendarEvent"
127335                 },
127336                 CalendarEventId: {
127337                     path: "tizen/2.0/CalendarEventId"
127338                 },
127339                 CalendarRecurrenceRule: {
127340                     path: "tizen/2.0/CalendarRecurrenceRule"
127341                 },
127342                 CalendarTask: {
127343                     path: "tizen/2.0/CalendarTask"
127344                 },
127345                 CompositeFilter: {
127346                     path: "tizen/2.0/CompositeFilter"
127347                 },
127348                 Contact: {
127349                     path: "tizen/2.0/ContactBase"
127350                 },
127351                 ContactAddress: {
127352                     path: "tizen/2.0/ContactAddress"
127353                 },
127354                 ContactAnniversary: {
127355                     path: "tizen/2.0/ContactAnniversary"
127356                 },
127357                 ContactEmailAddress: {
127358                     path: "tizen/2.0/ContactEmailAddress"
127359                 },
127360                 ContactGroup: {
127361                     path: "tizen/2.0/ContactGroup"
127362                 },
127363                 ContactName: {
127364                     path: "tizen/2.0/ContactName"
127365                 },
127366                 ContactOrganization: {
127367                     path: "tizen/2.0/ContactOrganization"
127368                 },
127369                 ContactPhoneNumber: {
127370                     path: "tizen/2.0/ContactPhoneNumber"
127371                 },
127372                 ContactRef: {
127373                     path: "tizen/2.0/ContactRef"
127374                 },
127375                 ContactWebSite: {
127376                     path: "tizen/2.0/ContactWebSite"
127377                 },
127378                 DownloadRequest: {
127379                     path: "tizen/2.0/DownloadRequest"
127380                 },
127381                 Message: {
127382                     path: "tizen/2.0/Message"
127383                 },
127384                 NDEFMessage: {
127385                     path: "tizen/2.0/NDEFMessage"
127386                 },
127387                 NDEFRecord: {
127388                     path: "tizen/2.0/NDEFRecord"
127389                 },
127390                 NDEFRecordMedia: {
127391                     path: "tizen/2.0/NDEFRecordMedia"
127392                 },
127393                 NDEFRecordText: {
127394                     path: "tizen/2.0/NDEFRecordText"
127395                 },
127396                 NDEFRecordURI: {
127397                     path: "tizen/2.0/NDEFRecordURI"
127398                 },
127399                 NotificationDetailInfo: {
127400                     path: "tizen/2.0/NotificationDetailInfo"
127401                 },
127402                 SimpleCoordinates: {
127403                     path: "tizen/2.0/SimpleCoordinates"
127404                 },
127405                 SortMode: {
127406                     path: "tizen/2.0/SortMode"
127407                 },
127408                 StatusNotification: {
127409                     path: "tizen/2.0/StatusNotification"
127410                 },
127411                 SyncInfo: {
127412                     path: "tizen/2.0/SyncInfo"
127413                 },
127414                 SyncServiceInfo: {
127415                     path: "tizen/2.0/SyncServiceInfo"
127416                 },
127417                 SyncProfileInfo: {
127418                     path: "tizen/2.0/SyncProfileInfo"
127419                 },
127420                 TZDate: {
127421                     path: "tizen/2.0/TZDate"
127422                 },
127423                 TimeDuration: {
127424                     path: "tizen/2.0/TimeDuration"
127425                 },
127426                 alarm: {
127427                     path: "tizen/2.0/alarm",
127428                     feature: "http://tizen.org/privilege/alarm",
127429                     handleSubfeatures: true
127430                 },
127431                 application: {
127432                     path: "tizen/2.0/application",
127433                     feature: "http://tizen.org/privilege/application.launch|http://tizen.org/privilege/appmanager.kill|http://tizen.org/privilege/appmanager.certificate",
127434                     handleSubfeatures: true
127435                 },
127436                 bluetooth: {
127437                     path: "tizen/2.0/bluetooth",
127438                     feature: "http://tizen.org/privilege/bluetoothmanager|http://tizen.org/privilege/bluetooth.admin|http://tizen.org/privilege/bluetooth.gap|http://tizen.org/privilege/bluetooth.spp",
127439                     handleSubfeatures: true
127440                 },
127441                 bookmark: {
127442                     path: "tizen/2.0/bookmark",
127443                     feature: "http://tizen.org/privilege/bookmark.read|http://tizen.org/privilege/bookmark.write",
127444                     handleSubfeatures: true
127445                 },
127446                 callhistory: {
127447                     path: "tizen/2.0/callHistory",
127448                     feature: "http://tizen.org/privilege/callhistory|http://tizen.org/privilege/callhistory.read|http://tizen.org/privilege/callhistory.write",
127449                     handleSubfeatures: true
127450                 },
127451                 calendar: {
127452                     path: "tizen/2.0/calendar",
127453                     feature: "http://tizen.org/privilege/calendar.read|http://tizen.org/privilege/calendar.write",
127454                     handleSubfeatures: true
127455                 },
127456                 contact: {
127457                     path: "tizen/2.0/contact",
127458                     feature: "http://tizen.org/privilege/contact.read|http://tizen.org/privilege/contact.write",
127459                     handleSubfeatures: true
127460                 },
127461                 content: {
127462                     path: "tizen/2.0/content",
127463                     feature: "http://tizen.org/privilege/content.read|http://tizen.org/privilege/content.write",
127464                     handleSubfeatures: true
127465                 },
127466                 datacontrol: {
127467                     path: "tizen/2.0/datacontrol",
127468                     feature: "http://tizen.org/privilege/datacontrol.consumer",
127469                     handleSubfeatures: true
127470                 },
127471                 datasync: {
127472                     path: "tizen/2.0/datasync",
127473                     feature: "http://tizen.org/privilege/datasync",
127474                     handleSubfeatures: true
127475                 },
127476                 download: {
127477                     path: "tizen/2.0/download",
127478                     feature: "http://tizen.org/privilege/download",
127479                     handleSubfeatures: true
127480                 },
127481                 filesystem: {
127482                     path: "tizen/2.0/filesystem",
127483                     feature: "http://tizen.org/privilege/filesystem.read|http://tizen.org/privilege/filesystem.write"
127484                 },
127485                 messageport: {
127486                     path: "tizen/2.0/messageport"
127487                 },
127488                 messaging: {
127489                     path: "tizen/2.0/messaging",
127490                     feature: "http://tizen.org/privilege/messaging.send|http://tizen.org/privilege/messaging.read|http://tizen.org/privilege/messaging.write",
127491                     handleSubfeatures: true
127492                 },
127493                 networkbearerselection: {
127494                     path: "tizen/2.0/networkbearerselection",
127495                     feature: "http://tizen.org/privilege/networkbearerselection",
127496                     handleSubfeatures: true
127497                 },
127498                 nfc: {
127499                     path: "tizen/2.0/nfc",
127500                     feature: "http://tizen.org/privilege/nfc.common|http://tizen.org/privilege/nfc.admin|http://tizen.org/privilege/nfc.tag|http://tizen.org/privilege/nfc.p2p",
127501                     handleSubfeatures: true
127502                 },
127503                 notification: {
127504                     path: "tizen/2.0/notification",
127505                     feature: "http://tizen.org/privilege/notification",
127506                     handleSubfeatures: true
127507                 },
127508                 package: {
127509                     path: "tizen/2.0/package",
127510                     feature: "http://tizen.org/privilege/packagemanager.install|http://tizen.org/privilege/package.info",
127511                     handleSubfeatures: true
127512                 },
127513                 power: {
127514                     path: "tizen/2.0/power",
127515                     feature: "http://tizen.org/privilege/power",
127516                     handleSubfeatures: true
127517                 },
127518                 push: {
127519                     path: "tizen/2.0/push",
127520                     feature: "http://tizen.org/privilege/push",
127521                     handleSubfeatures: true
127522                 },
127523                 seService: {
127524                     path: "tizen/2.0/secureelement",
127525                     feature: "http://tizen.org/privilege/secureelement",
127526                     handleSubfeatures: true
127527                 },
127528                 systeminfo: {
127529                     path: "tizen/2.0/systeminfo",
127530                     feature: "http://tizen.org/privilege/system|http://tizen.org/privilege/systemmanager",
127531                     handleSubfeatures: true
127532                 },
127533                 systemsetting: {
127534                     path: "tizen/2.0/systemsetting",
127535                     feature: "http://tizen.org/privilege/setting",
127536                     handleSubfeatures: true
127537                 },
127538                 time: {
127539                     path: "tizen/2.0/time",
127540                     feature: "http://tizen.org/privilege/time",
127541                     handleSubfeatures: true
127542                 },
127543                 websetting: {
127544                     path: "tizen/2.0/websetting",
127545                     feature: "http://tizen.org/privilege/websetting",
127546                     handleSubfeatures: true
127547                 },
127548                 mediaserver: {
127549                     path: "ivi/3.0/mediaserver",
127550                     feature: "http://tizen.org/privilege/mediaserver",
127551                     handleSubfeatures: true
127552                 },
127553                 speech: {
127554                     path: "ivi/3.0/speech",
127555                     feature: "http://tizen.org/privilege/speech",
127556                     handleSubfeatures: true
127557                 },
127558                 vehicle: {
127559                     path: "ivi/3.0/vehicle",
127560                     feature: "http://tizen.org/privilege/vehicle",
127561                     handleSubfeatures: true
127562                 }
127563             }
127564         }
127565     }
127566 };
127567
127568 });
127569 define('ripple/platform/ivi/3.0/dbinit', function (require, exports, module) {
127570 /*
127571  *  Copyright 2013 Intel Corporation.
127572  *
127573  * Licensed under the Apache License, Version 2.0 (the "License");
127574  * you may not use this file except in compliance with the License.
127575  * You may obtain a copy of the License at
127576  *
127577  * http://www.apache.org/licenses/LICENSE-2.0
127578  *
127579  * Unless required by applicable law or agreed to in writing, software
127580  * distributed under the License is distributed on an "AS IS" BASIS,
127581  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
127582  * See the License for the specific language governing permissions and
127583  * limitations under the License.
127584  */
127585
127586 var exception = require('ripple/exception'),
127587     DBBuilder,
127588     _data = {
127589         dbBuilder: null
127590     },
127591     _self = {};
127592
127593 function _initialize() {
127594     _data.dbBuilder = new DBBuilder();
127595
127596     _data.dbBuilder.register("Vehicle", "dbvehicle.json");
127597     _data.dbBuilder.register("MediaServer", "dbmediaserver.json");
127598 }
127599
127600 DBBuilder = function () {
127601     var self;
127602
127603     // private
127604     function formatString(str) {
127605         return str.replace(/^\s+|[\t\n\r\v]+|\s+$/g, "").replace(/\s+/g, "");
127606     }
127607
127608     // private
127609     function formatHex(str) {
127610         return str.replace(/,(0x[0-9a-fA-F]+?),/g, ',"$1",');
127611     }
127612
127613     // public
127614     function register(type, dbFile, Extension) {
127615         _data[type] = Extension ? new Extension() : {};
127616
127617         if (!dbFile)
127618             return;
127619
127620         _self.__defineGetter__(type, function () {
127621             var fnInit;
127622
127623             if (!_data[type].db) {
127624                 fnInit = _data[type].initdb || initdb;
127625                 _data[type].db = fnInit(dbFile);
127626             }
127627
127628             return _data[type].db;
127629         });
127630     }
127631
127632     function initdb(dbFile) {
127633         var xmlHttp, res;
127634
127635         try {
127636             xmlHttp = new XMLHttpRequest();
127637             xmlHttp.open("GET", "dbsamples/" + dbFile, false);
127638             xmlHttp.send();
127639         } catch (e) {
127640             exception.handle(e);
127641         }
127642
127643         if (!xmlHttp.responseText) {
127644             return null;
127645         }
127646
127647         res = formatHex(formatString(xmlHttp.responseText));
127648
127649         return JSON.parse(res);
127650     }
127651
127652     self = {
127653         register: register,
127654         initdb:   initdb
127655     };
127656
127657     return self;
127658 };
127659
127660 _initialize();
127661
127662 module.exports = _self;
127663
127664 });
127665 define('ripple/platform/ivi/3.0/spec/config', function (require, exports, module) {
127666 /*
127667  *  Copyright 2011 Research In Motion Limited.
127668  *  Copyright 2011 Intel Corporation.
127669  *
127670  * Licensed under the Apache License, Version 2.0 (the "License");
127671  * you may not use this file except in compliance with the License.
127672  * You may obtain a copy of the License at
127673  *
127674  * http://www.apache.org/licenses/LICENSE-2.0
127675  *
127676  * Unless required by applicable law or agreed to in writing, software
127677  * distributed under the License is distributed on an "AS IS" BASIS,
127678  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
127679  * See the License for the specific language governing permissions and
127680  * limitations under the License.
127681  */
127682 var utils = require('ripple/utils'),
127683     db = require('ripple/db'),
127684     constants = require('ripple/constants');
127685
127686 module.exports = {
127687     fileName: "config.xml",
127688     validateVersion: function (configValidationObject) {
127689         var valid = true;
127690         // no xmlns:JIL in wac 2.0 spec
127691         valid = !!configValidationObject.widget.validationResult[0].attributes.xmlns.valid;
127692
127693         return valid;
127694     },
127695     extractInfo: function (configValidationObject) {
127696         if (!configValidationObject) {
127697             return null;
127698         }
127699
127700         var widgetInfo = {},
127701             configFeatures,
127702             configPreferences,
127703             preferenceName,
127704             platform, rst, i, j,
127705             settingRst = {
127706                 'screen-orientation': 'portrait',
127707                 'context-menu': 'enable',
127708                 'background-support': 'disable',
127709                 encryption: 'disable',
127710                 'install-location': 'auto',
127711                 'hwkey-event': 'enable'
127712             };
127713
127714         widgetInfo.id = configValidationObject.widget.validationResult[0].attributes.id.value || "";
127715         widgetInfo.name = configValidationObject.widget.children.name.validationResult[0].value;
127716         widgetInfo.icon = configValidationObject.widget.children.icon.validationResult[0].attributes.src.value;
127717         widgetInfo.version = configValidationObject.widget.validationResult[0].attributes.version.value;
127718         if (configValidationObject.widget.children.application.validationResult[0].valid) {
127719             widgetInfo.tizenAppId = configValidationObject.widget.children.application.validationResult[0].attributes.id.value;
127720             widgetInfo.tizenPackageId = configValidationObject.widget.children.application.validationResult[0].attributes.package.value;
127721         }
127722
127723         widgetInfo.features = {};
127724
127725         if (configValidationObject.widget.children.setting.hasOwnProperty('validationResult') === true) {
127726             rst = configValidationObject.widget.children.setting.validationResult;
127727             // the first one has higher priority per platform implementation
127728             for (i = rst.length -1 ; i >= 0; i--) {
127729                 if (rst[i].valid === true) {
127730                     for (j in rst[i].attributes) {
127731                         if (rst[i].attributes[j].value !== undefined) {
127732                             settingRst[j] = rst[i].attributes[j].value;
127733                         }
127734                     }
127735                 }
127736             }
127737             db.save("layout", settingRst["screen-orientation"]);
127738         }
127739
127740         configFeatures = configValidationObject.widget.children.feature.validationResult;
127741         utils.forEach(configFeatures, function (f) {
127742             if (f.valid === true) {
127743                 var feature = {id: f.attributes.name.value,
127744                          required: f.attributes.required.valid};
127745                 widgetInfo.features[feature.id] = feature;
127746             }
127747         });
127748
127749         widgetInfo.preferences = {};
127750
127751         configPreferences = configValidationObject.widget.children.preference.validationResult;
127752
127753         platform = require('ripple/platform');
127754         utils.forEach(configPreferences, function (preference) {
127755             preferenceName = preference.attributes.name.value;
127756             if (preferenceName) {
127757                 widgetInfo.preferences[preferenceName] = {
127758                     "key": preferenceName,
127759                     "value": preference.attributes.value.value || "",
127760                     "readonly": preference.attributes.readonly.value === "true"
127761                 };
127762
127763                 db.save(preferenceName,
127764                         widgetInfo.preferences[preferenceName].value,
127765                         platform.getPersistencePrefix(widgetInfo.id));
127766             }
127767         });
127768
127769         return widgetInfo;
127770     },
127771     schema: {
127772         rootElement: "widget",
127773         widget: {
127774             nodeName: "widget",
127775             required: true,
127776             occurrence: 1,
127777             helpText: "\"widget\" element describes widget information in configuration documents and serves as a container for other elements. It must be used in the configuration document and may have the following child elments: name,description,icon,author,license,content,feature and preference.The \"widget\" element MAY have following attributes: id,version,height,width, defaultlocale, xml:lang and dir",
127778             attributes: {
127779                 xmlns: {
127780                     attributeName: "xmlns",
127781                     required: true,
127782                     type: "list",
127783                     listValues: ["http://www.w3.org/ns/widgets"]
127784                 },
127785                 "xmlns:tizen": {
127786                     attributeName: "xmlns:tizen",
127787                     required: false,
127788                     type: "list",
127789                     listValues: ["http://tizen.org/ns/widgets"]
127790                 },
127791                 "xml:lang": {
127792                     attributeName: "xml:lang",
127793                     required: false,
127794                     type: "iso-language"
127795                 },
127796                 dir: {
127797                     attributeName: "dir",
127798                     required: false,
127799                     type: "list",
127800                     listValues: ["ltr", "rtl", "lro", "rlo"]
127801                 },
127802                 id: {
127803                     attributeName: "id",
127804                     required: false,
127805                     type: "string"
127806                 },
127807                 version: {
127808                     attributeName: "version",
127809                     required: false,
127810                     type: "string"
127811                 },
127812                 height: {
127813                     attributeName: "height",
127814                     required: false,
127815                     type: "integer"
127816                 },
127817                 width: {
127818                     attributeName: "width",
127819                     required: false,
127820                     type: "integer"
127821                 },
127822                 viewmodes: {
127823                     attributeName: "viewmodes",
127824                     required: false,
127825                     type: "list",
127826                     listValues: ["windowed", "floating", "fullscreen", "maximized", "minimized"]
127827                 },
127828                 defaultlocale: {
127829                     attributeName: "defaultlocale",
127830                     required: false,
127831                     type: "iso-language"
127832                 }
127833             },
127834             children: {
127835                 name: {
127836                     nodeName: "name",
127837                     required: false,
127838                     occurrence: 0,
127839                     type: "string",
127840                     attributes: {
127841                         "xml:lang": {
127842                             attributeName: "xml:lang",
127843                             required: false,
127844                             type: "iso-language",
127845                             unique: true
127846                         },
127847                         dir: {
127848                             attributeName: "dir",
127849                             required: false,
127850                             type: "list",
127851                             listValues: ["ltr", "rtl", "lro", "rlo"]
127852                         },
127853                         "short": {
127854                             attributeName: "short",
127855                             required: false,
127856                             type: "string"
127857                         }
127858                     },
127859                     children: {
127860                         span: {
127861                             nodeName: "span",
127862                             required: false,
127863                             type: "string",
127864                             attributes: {
127865                                 "xml:lang": {
127866                                     attributeName: "xml:lang",
127867                                     required: false,
127868                                     type: "iso-language",
127869                                     unique: true
127870                                 },
127871                                 dir: {
127872                                     attributeName: "dir",
127873                                     required: false,
127874                                     type: "list",
127875                                     listValues: ["ltr", "rtl", "lro", "rlo"]
127876                                 }
127877                             }
127878                         }
127879                     }
127880                 },
127881                 description: {
127882                     nodeName: "description",
127883                     required: false,
127884                     occurrence: 0,
127885                     type: "string",
127886                     attributes: {
127887                         "xml:lang": {
127888                             attributeName: "xml:lang",
127889                             required: false,
127890                             type: "iso-language",
127891                             unique: true
127892                         },
127893                         dir: {
127894                             attributeName: "dir",
127895                             required: false,
127896                             type: "list",
127897                             listValues: ["ltr", "rtl", "lro", "rlo"]
127898                         }
127899                     },
127900                     children: {
127901                         span: {
127902                             nodeName: "span",
127903                             required: false,
127904                             type: "string",
127905                             attributes: {
127906                                 "xml:lang": {
127907                                     attributeName: "xml:lang",
127908                                     required: false,
127909                                     type: "iso-language",
127910                                     unique: true
127911                                 },
127912                                 dir: {
127913                                     attributeName: "dir",
127914                                     required: false,
127915                                     type: "list",
127916                                     listValues: ["ltr", "rtl", "lro", "rlo"]
127917                                 }
127918                             }
127919                         }
127920                     }
127921                 },
127922                 author: {
127923                     nodeName: "author",
127924                     required: false,
127925                     occurrence: 0,
127926                     type: "string",
127927                     attributes: {
127928                         "xml:lang": {
127929                             attributeName: "xml:lang",
127930                             required: false,
127931                             type: "iso-language"
127932                         },
127933                         dir: {
127934                             attributeName: "dir",
127935                             required: false,
127936                             type: "list",
127937                             listValues: ["ltr", "rtl", "lro", "rlo"]
127938                         },
127939                         href: {
127940                             attributeName: "href",
127941                             required: false,
127942                             type: "regex",
127943                             regex: constants.REGEX.URL
127944                         },
127945                         email: {
127946                             attributeName: "email",
127947                             required: false,
127948                             type: "regex",
127949                             regex: constants.REGEX.EMAIL
127950                         }
127951                     },
127952                     children: {
127953                         span: {
127954                             nodeName: "span",
127955                             required: false,
127956                             type: "string",
127957                             attributes: {
127958                                 "xml:lang": {
127959                                     attributeName: "xml:lang",
127960                                     required: false,
127961                                     type: "iso-language",
127962                                     unique: true
127963                                 },
127964                                 dir: {
127965                                     attributeName: "dir",
127966                                     required: false,
127967                                     type: "list",
127968                                     listValues: ["ltr", "rtl", "lro", "rlo"]
127969                                 }
127970                             }
127971                         }
127972                     }
127973                 },
127974                 license: {
127975                     nodeName: "license",
127976                     required: false,
127977                     occurrence: 0,
127978                     type: "string",
127979                     attributes: {
127980                         "xml:lang": {
127981                             attributeName: "xml:lang",
127982                             required: false,
127983                             type: "iso-language"
127984                         },
127985                         dir: {
127986                             attributeName: "dir",
127987                             required: false,
127988                             type: "list",
127989                             listValues: ["ltr", "rtl", "lro", "rlo"]
127990                         },
127991                         href: {
127992                             attributeName: "href",
127993                             type: "regex",
127994                             required: false,
127995                             regex: constants.REGEX.URL
127996                         }
127997                     },
127998                     children: {
127999                         span: {
128000                             nodeName: "span",
128001                             required: false,
128002                             type: "string",
128003                             attributes: {
128004                                 "xml:lang": {
128005                                     attributeName: "xml:lang",
128006                                     required: false,
128007                                     type: "iso-language",
128008                                     unique: true
128009                                 },
128010                                 dir: {
128011                                     attributeName: "dir",
128012                                     required: false,
128013                                     type: "list",
128014                                     listValues: ["ltr", "rtl", "lro", "rlo"]
128015                                 }
128016                             }
128017                         }
128018                     }
128019                 },
128020                 icon: {
128021                     nodeName: "icon",
128022                     required: false,
128023                     occurrence: 0,
128024                     attributes: {
128025                         "xml:lang": {
128026                             attributeName: "xml:lang",
128027                             required: false,
128028                             type: "iso-language"
128029                         },
128030                         dir: {
128031                             attributeName: "dir",
128032                             required: false,
128033                             type: "list",
128034                             listValues: ["ltr", "rtl", "lro", "rlo"]
128035                         },
128036                         src: {
128037                             attributeName: "src",
128038                             required: true,
128039                             type: "string"
128040                         },
128041                         width: {
128042                             attributeName: "width",
128043                             required: false,
128044                             type: "integer"
128045                         },
128046                         height: {
128047                             attributeName: "height",
128048                             required: false,
128049                             type: "integer"
128050                         }
128051                     }
128052                 },
128053                 content: {
128054                     nodeName: "content",
128055                     required: false,
128056                     occurrence: 1,
128057                     attributes: {
128058                         "xml:lang": {
128059                             attributeName: "xml:lang",
128060                             required: false,
128061                             type: "iso-language",
128062                             unique: true
128063                         },
128064                         dir: {
128065                             attributeName: "dir",
128066                             required: false,
128067                             type: "list",
128068                             listValues: ["ltr", "rtl", "lro", "rlo"]
128069                         },
128070                         src: {
128071                             attributeName: "src",
128072                             required: true,
128073                             type: "string"
128074                         },
128075                         encoding: {
128076                             attributeName: "encoding",
128077                             required: false,
128078                             type: "string"
128079                         },
128080                         type: {
128081                             attributeName: "type",
128082                             required: false,
128083                             type: "string"
128084                         }
128085                     }
128086                 },
128087                 setting: {
128088                     nodeName: "tizen:setting",
128089                     required: false,
128090                     occurrence: 0,
128091                     attributes: {
128092                         'screen-orientation': {
128093                             attributeName: "screen-orientation",
128094                             required: false,
128095                             type: "list",
128096                             listValues: ['portrait', 'landscape', 'auto']
128097                         },
128098                         'context-menu': {
128099                             attributeName: "context-menu",
128100                             required: false,
128101                             type: "list",
128102                             listValues: ['enable', 'disable']
128103                         },
128104                         'background-support': {
128105                             attributeName: "background-support",
128106                             required: false,
128107                             type: "list",
128108                             listValues: ['enable', 'disable']
128109                         },
128110                         'encryption': {
128111                             attributeName: "encryption",
128112                             required: false,
128113                             type: "list",
128114                             listValues: ['enable', 'disable']
128115                         },
128116                         'install-location': {
128117                             attributeName: "install-location",
128118                             required: false,
128119                             type: "list",
128120                             listValues: ['auto', 'internal-only', 'perfer-external']
128121                         },
128122                         'hwkey-event': {
128123                             attributeName: "hwkey-event",
128124                             required: false,
128125                             type: "list",
128126                             listValues: ['enable', 'disable']
128127                         }
128128                     }
128129                 },
128130                 application: {
128131                     nodeName: "tizen:application",
128132                     required: true,
128133                     occurrence: 1,
128134                     attributes: {
128135                         id: {
128136                             attributeName: "id",
128137                             required: true,
128138                             type: "string"
128139                         },
128140                         required_version: {
128141                             attributeName: "required_version",
128142                             required: true,
128143                             type: "list",
128144                             listValues: ['1.0', '2.0', '2.1', '2.2']
128145                         },
128146                         package: {
128147                             attributeName: "package",
128148                             required: false,
128149                             type: "string"
128150                         }
128151                     }
128152                 },
128153                 "tizen:content": {
128154                     nodeName: "tizen:content",
128155                     required: false,
128156                     occurrence: 1,
128157                     attributes: {
128158                         src: {
128159                             attributeName: "src",
128160                             required: true,
128161                             type: "string"
128162                         }
128163                     }
128164                 },
128165                 control: {
128166                     nodeName: "tizen:app-control",
128167                     required: false,
128168                     occurrence: 0,
128169                     children: {
128170                         src: {
128171                             nodeName: "tizen:src",
128172                             required: true,
128173                             occurence: 0,
128174                             attributes: {
128175                                 name: {
128176                                     attributeName: "name",
128177                                     required: false,
128178                                     type: "string"
128179                                 }
128180                             }
128181                         },
128182                         operation: {
128183                             nodeName: "tizen:operation",
128184                             required: true,
128185                             occurence: 0,
128186                             attributes: {
128187                                 name: {
128188                                     attributeName: "name",
128189                                     required: false,
128190                                     type: "string"
128191                                 }
128192                             }
128193                         },
128194                         uri: {
128195                             nodeName: "tizen:uri",
128196                             required: false,
128197                             occurence: 0,
128198                             attributes: {
128199                                 name: {
128200                                     attributeName: "name",
128201                                     required: false,
128202                                     type: "string"
128203                                 }
128204                             }
128205                         },
128206                         mime: {
128207                             nodeName: "tizen:mime",
128208                             required: false,
128209                             occurence: 0,
128210                             attributes: {
128211                                 name: {
128212                                     attributeName: "name",
128213                                     required: false,
128214                                     type: "string"
128215                                 }
128216                             }
128217                         }
128218                     }
128219                 },
128220                 "app-widget": {
128221                     nodeName: "tizen:app-widget",
128222                     required: false,
128223                     occurrence: 0,
128224                     attributes: {
128225                         id: {
128226                             attributeName: "id",
128227                             required: true,
128228                             type: "string"
128229                         },
128230                         primary: {
128231                             attributeName: "primary",
128232                             required: true,
128233                             type: "list",
128234                             listValues: ['true', 'false']
128235                         },
128236                         "auto-launch": {
128237                             attributeName: "auto-launch",
128238                             required: false,
128239                             type: "list",
128240                             listValues: ['true', 'false']
128241                         },
128242                         "update-period": {
128243                             attributeName: "update-period",
128244                             required: false,
128245                             type: "integer"
128246                         }
128247                     },
128248                     children: {
128249                         "box-label": {
128250                             nodeName: "tizen:box-label",
128251                             required: true,
128252                             occurence: 1
128253                         },
128254                         "box-icon": {
128255                             nodeName: "tizen:box-icon",
128256                             required: true,
128257                             occurence: 1,
128258                             attributes: {
128259                                 src: {
128260                                     attributeName: "src",
128261                                     required: true,
128262                                     type: "string"
128263                                 }
128264                             }
128265                         },
128266                         "box-content": {
128267                             nodeName: "tizen:box-content",
128268                             required: true,
128269                             occurence: 1,
128270                             attributes: {
128271                                 src: {
128272                                     attributeName: "src",
128273                                     required: true,
128274                                     type: "string"
128275                                 },
128276                                 "mouse-event": {
128277                                     attributeName: "mouse-event",
128278                                     required: false,
128279                                     type: "string"
128280                                 },
128281                                 "touch-event": {
128282                                     attributeName: "touch-event",
128283                                     required: false,
128284                                     type: "string"
128285                                 }
128286                             },
128287                             children: {
128288                                 "box-size": {
128289                                     nodeName: "tizen:box-size",
128290                                     required: false,
128291                                     occurence: 1,
128292                                     attributes: {
128293                                         "preview": {
128294                                             attributeName: "preview",
128295                                             required: false,
128296                                             type: "string"
128297                                         }
128298                                     }
128299                                 },
128300                                 pd: {
128301                                     nodeName: "tizen:pd",
128302                                     required: false,
128303                                     occurence: 1,
128304                                     attributes: {
128305                                         "src": {
128306                                             attributeName: "src",
128307                                             required: true,
128308                                             type: "string"
128309                                         },
128310                                         "width": {
128311                                             attributeName: "width",
128312                                             required: true,
128313                                             type: "integer"
128314                                         },
128315                                         "height": {
128316                                             attributeName: "height",
128317                                             required: true,
128318                                             type: "integer"
128319                                         }
128320                                     }
128321                                 }
128322                             }
128323                         }
128324                     }
128325                 },
128326                 account: {
128327                     nodeName: "tizen:account",
128328                     required: false,
128329                     occurrence: 0,
128330                     attributes: {
128331                         "multiple-account-support": {
128332                             attributeName: "multiple-account-support",
128333                             required: true,
128334                             type: "list",
128335                             listValues: ['true', 'false']
128336                         }
128337                     },
128338                     children: {
128339                         icon: {
128340                             nodeName: "tizen:icon",
128341                             required: false,
128342                             occurence: 1,
128343                             attributes: {
128344                                 section: {
128345                                     attributeName: "section",
128346                                     required: true,
128347                                     type: "string"
128348                                 }
128349                             }
128350                         },
128351                         "display-name": {
128352                             nodeName: "tizen:display-name",
128353                             required: false,
128354                             occurence: 1,
128355                             attributes: {
128356                                 "xml:lang": {
128357                                     attributeName: "xml:lang",
128358                                     required: false,
128359                                     type: "string"
128360                                 }
128361                             }
128362                         },
128363                         capability: {
128364                             nodeName: "capability",
128365                             required: false,
128366                             occurence: 1
128367                         }
128368                     }
128369                 },
128370                 feature: {
128371                     nodeName: "tizen:privilege",
128372                     required: false,
128373                     occurrence: 0,
128374                     attributes: {
128375                         "xml:lang": {
128376                             attributeName: "xml:lang",
128377                             required: false,
128378                             type: "iso-language"
128379                         },
128380                         dir: {
128381                             attributeName: "dir",
128382                             required: false,
128383                             type: "list",
128384                             listValues: ["ltr", "rtl", "lro", "rlo"]
128385                         },
128386                         name: {
128387                             attributeName: "name",
128388                             required: true,
128389                             type: "list",
128390                             listValues: ["http://www.w3.org/TR/battery-status/",
128391                                          "http://www.w3.org/TR/geolocation-API/",
128392                                          "http://www.w3.org/TR/touch-events/",
128393                                          "http://www.w3.org/TR/vibration/",
128394                                          "http://tizen.org/privilege/tizen",
128395                                          "http://tizen.org/privilege/alarm",
128396                                          "http://tizen.org/privilege/application.launch",
128397                                          "http://tizen.org/privilege/appmanager.kill", "http://tizen.org/privilege/appmanager.certificate",
128398                                          "http://tizen.org/privilege/bluetoothmanager", "http://tizen.org/privilege/bluetooth.admin",
128399                                          "http://tizen.org/privilege/bluetooth.gap", "http://tizen.org/privilege/bluetooth.spp",
128400                                          "http://tizen.org/privilege/bookmark.read", "http://tizen.org/privilege/bookmark.write",
128401                                          "http://tizen.org/privilege/calendar.read", "http://tizen.org/privilege/calendar.write",
128402                                          "http://tizen.org/privilege/callhistory.read", "http://tizen.org/privilege/callhistory.write",
128403                                          "http://tizen.org/privilege/contact.read", "http://tizen.org/privilege/contact.write",
128404                                          "http://tizen.org/privilege/content.read", "http://tizen.org/privilege/content.write",
128405                                          "http://tizen.org/privilege/datacontrol.consumer",
128406                                          "http://tizen.org/privilege/datasync",
128407                                          "http://tizen.org/privilege/download",
128408                                          "http://tizen.org/privilege/filesystem.read", "http://tizen.org/privilege/filesystem.write",
128409                                          "http://tizen.org/privilege/mediaserver",
128410                                          "http://tizen.org/privilege/messaging.read", "http://tizen.org/privilege/messaging.write",
128411                                          "http://tizen.org/privilege/networkbearerselection",
128412                                          "http://tizen.org/privilege/nfc.common", "http://tizen.org/privilege/nfc.admin",
128413                                          "http://tizen.org/privilege/nfc.tag", "http://tizen.org/privilege/nfc.p2p",
128414                                          "http://tizen.org/privilege/notification",
128415                                          "http://tizen.org/privilege/packagemanager.install", "http://tizen.org/privilege/package.info",
128416                                          "http://tizen.org/privilege/power",
128417                                          "http://tizen.org/privilege/push",
128418                                          "http://tizen.org/privilege/secureelement",
128419                                          "http://tizen.org/privilege/setting",
128420                                          "http://tizen.org/privilege/speech",
128421                                          "http://tizen.org/privilege/system", "http://tizen.org/privilege/systemmanager",
128422                                          "http://tizen.org/privilege/time",
128423                                          "http://tizen.org/privilege/vehicle",
128424                                          "http://tizen.org/privilege/websetting"]
128425                         },
128426                         required: {
128427                             attributeName: "required",
128428                             type: "boolean",
128429                             required: false
128430                         }
128431                     },
128432                     children: {
128433                         param: {
128434                             nodeName: "param",
128435                             required: false,
128436                             occurrence: 0,
128437                             attributes: {
128438                                 "xml:lang": {
128439                                     attributeName: "xml:lang",
128440                                     required: false,
128441                                     type: "iso-language"
128442                                 },
128443                                 dir: {
128444                                     attributeName: "dir",
128445                                     required: false,
128446                                     type: "list",
128447                                     listValues: ["ltr", "rtl", "lro", "rlo"]
128448                                 },
128449                                 name: {
128450                                     attributeName: "name",
128451                                     required: true,
128452                                     type: "string"
128453                                 },
128454                                 value: {
128455                                     attributeName: "value",
128456                                     required: true,
128457                                     type: "string"
128458                                 }
128459                             }
128460                         }
128461                     }
128462                 },
128463                 preference: {
128464                     nodeName: "preference",
128465                     required: false,
128466                     occurrence: 0,
128467                     attributes: {
128468                         "xml:lang": {
128469                             attributeName: "xml:lang",
128470                             required: false,
128471                             type: "iso-language"
128472                         },
128473                         dir: {
128474                             attributeName: "dir",
128475                             required: false,
128476                             type: "list",
128477                             listValues: ["ltr", "rtl", "lro", "rlo"]
128478                         },
128479                         name: {
128480                             attributeName: "name",
128481                             required: true,
128482                             type: "string"
128483                         },
128484                         value: {
128485                             type: "string",
128486                             required: false,
128487                             attributeName: "value"
128488                         },
128489                         readonly: {
128490                             attributeName: "readonly",
128491                             type: "boolean",
128492                             required: false
128493                         }
128494                     }
128495                 }
128496             }
128497         }
128498     }
128499 };
128500
128501 });
128502 define('ripple/platform/ivi/3.0/spec/device', function (require, exports, module) {
128503 /*
128504  *  Copyright 2011 Intel Corporation.
128505  *
128506  * Licensed under the Apache License, Version 2.0 (the "License");
128507  * you may not use this file except in compliance with the License.
128508  * You may obtain a copy of the License at
128509  *
128510  * http://www.apache.org/licenses/LICENSE-2.0
128511  *
128512  * Unless required by applicable law or agreed to in writing, software
128513  * distributed under the License is distributed on an "AS IS" BASIS,
128514  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
128515  * See the License for the specific language governing permissions and
128516  * limitations under the License.
128517  */
128518 var event = require('ripple/event'),
128519     utils = require('ripple/utils'),
128520     StorageTypeTable = {
128521         "UNKNOWN": "UNKNOWN",
128522         "INTERNAL": "INTERNAL",
128523         "MMC": "MMC",
128524         "USB_HOST": "USB_HOST"
128525     },
128526     NetworkTypeTable = {
128527         "NONE": "NONE",
128528         "2G": "2G",
128529         "2.5G": "2.5G",
128530         "3G": "3G",
128531         "4G": "4G",
128532         "WIFI": "WIFI",
128533         "ETHERNET": "ETHERNET",
128534         "UNKNOWN": "UNKNOWN"
128535     },
128536     LocaleTable = {
128537         "eng_USA": "eng_USA",
128538         "eng_CAN": "eng_CAN",
128539         "deu_DEU": "deu_DEU",
128540         "jpn_JPN": "jpn_JPN",
128541         "zho_CHN": "zho_CHN",
128542         "UNKNOWN": "UNKNOWN"
128543     },
128544     SimStateTable = {
128545         "ABSENT": "ABSENT",
128546         "INITIALIZING": "INITIALIZING",
128547         "READY": "READY",
128548         "PIN_REQUIRED": "PIN_REQUIRED",
128549         "PUK_REQUIRED":"PUK_REQUIRED",
128550         "NETWORK_LOCKED": "NETWORK_LOCKED",
128551         "SIM_LOCKED": "SIM_LOCKED",
128552         "UNKNOWN": "UNKNOWN"
128553     };
128554
128555 function deviceStatusEventTrigger(setting) {
128556     event.trigger("DeviceStatusChanged", [setting]);
128557 }
128558
128559 module.exports = {
128560     "Config": {
128561         "vibratingMode": {
128562             "name": "Vibrator",
128563             "control": {
128564                 "type": "checkbox",
128565                 "value": true
128566             },
128567             "callback": function (setting) {
128568                 event.trigger("VibratingModeChanged", [setting]);
128569             }
128570         },
128571         "lockScreen": {
128572             "name": "Lock Screen",
128573             "control": {
128574                 "type": "checkbox",
128575                 "value": false
128576             },
128577             "callback": function (setting) {
128578                 event.trigger("LockScreenChanged", [setting]);
128579             }
128580         }
128581     },
128582     "DEVICE_ORIENTATION": {
128583         "status": {
128584             "name": "Status",
128585             "control": {
128586                 "type": "label",
128587                 "innertext": "PORTRAIT_PRIMARY",
128588                 "value": "PORTRAIT_PRIMARY"
128589             },
128590             "event": "LayoutChanged"
128591         },
128592         "isAutoRotation": {
128593             "name": "Is Auto Rotation",
128594             "control": {
128595                 "type": "label",
128596                 "value": false
128597             }
128598         }
128599     },
128600     "CPU": {
128601         "load": {
128602             "name": "Load",
128603             "control": {
128604                 "type": "number",
128605                 "value": 0.1
128606             },
128607             "event": "CpuLoadChanged",
128608             "callback": function (setting) {
128609                 if (setting > 1) setting = 1;
128610                 if (setting < 0) setting = 0;
128611                 event.trigger("CpuLoadChanged", [setting]);
128612             }
128613         }
128614     },
128615     "STORAGE": {
128616         "type": {
128617             "name": "Type",
128618             "control": {
128619                 "type": "select",
128620                 "value": StorageTypeTable["INTERNAL"]
128621             },
128622             "options": (function () {
128623                 var optionList = {};
128624                 utils.forEach(StorageTypeTable, function (key, value) {
128625                     optionList[key] = StorageTypeTable[value];
128626                 });
128627
128628                 return optionList;
128629             }())
128630         },
128631         "capacity": {
128632             "name": "Capacity(bytes)",
128633             "control": {
128634                 "type": "label",
128635                 "value": 16000000000
128636             }
128637         },
128638         "availableCapacity": {
128639             "name": "AvailableCapacity(bytes)",
128640             "control": {
128641                 "type": "number",
128642                 "value": 12000000000
128643             },
128644             "callback": function (setting) {
128645                 event.trigger("AvailCapacityChanged", [setting]);
128646             }
128647         },
128648         "isRemovable": {
128649             "name": "IsRemovable",
128650             "control": {
128651                 "type": "checkbox",
128652                 "value": true
128653             }
128654         }
128655     },
128656     "BUILD": {
128657         "model": {
128658             "name": "Model",
128659             "control": {
128660                 "type": "label",
128661                 "innertext": "tizen-2.2 build",
128662                 "value": "tizen-2.2 build"
128663             }
128664         },
128665         "manufacturer": {
128666             "name": "Manufacturer",
128667             "control": {
128668                 "type": "label",
128669                 "innertext": "Tizen",
128670                 "value": "Tizen"
128671             }
128672         },
128673         "buildVersion": {
128674             "name": "Build Version",
128675             "control": {
128676                 "type": "label",
128677                 "innertext": "TIZEN_WEB_SIMULATOR_000001",
128678                 "value": "TIZEN_WEB_SIMULATOR_000001"
128679             }
128680         }
128681     },
128682     "LOCALE": {
128683         "language": {
128684             "name": "Language",
128685             "control": {
128686                 "type": "select",
128687                 "value": LocaleTable["eng_USA"]
128688             },
128689             "options": (function () {
128690                 var optionList = {};
128691                 utils.forEach(LocaleTable, function (key, value) {
128692                     optionList[key] = LocaleTable[value];
128693                 });
128694
128695                 return optionList;
128696             }())
128697         },
128698         "country": {
128699             "name": "Country",
128700             "control": {
128701                 "type": "select",
128702                 "value": LocaleTable["eng_USA"]
128703             },
128704             "options": (function () {
128705                 var optionList = {};
128706                 utils.forEach(LocaleTable, function (key, value) {
128707                     optionList[key] = LocaleTable[value];
128708                 });
128709
128710                 return optionList;
128711             }())
128712         }
128713     },
128714     "DISPLAY": {
128715         "resolutionWidth": {
128716             "name": "Resolution Width(pixels)",
128717             "control": {
128718                 "type": "label",
128719                 "value": 0
128720             }
128721         },
128722         "resolutionHeight": {
128723             "name": "Resolution Height(pixels)",
128724             "control": {
128725                 "type": "label",
128726                 "value": 0
128727             }
128728         },
128729         "dotsPerInchWidth": {
128730             "name": "DPI-X",
128731             "control": {
128732                 "type": "label",
128733                 "value": 0
128734             }
128735         },
128736         "dotsPerInchHeight": {
128737             "name": "DPI-Y",
128738             "control": {
128739                 "type": "label",
128740                 "value": 0
128741             }
128742         },
128743         "physicalWidth": {
128744             "name": "Physical Width(millimeters)",
128745             "control": {
128746                 "type": "label",
128747                 "value": 0
128748             }
128749         },
128750         "physicalHeight": {
128751             "name": "Physical Height(millimeters)",
128752             "control": {
128753                 "type": "label",
128754                 "value": 0
128755             }
128756         },
128757         "brightness": {
128758             "name": "Brightness",
128759             "control": {
128760                 "type": "number",
128761                 "value": 1
128762             },
128763             "event": "DisplayBrightnessChanged",
128764             "callback": function (setting) {
128765                 if (setting > 1) setting = 1;
128766                 if (setting < 0) setting = 0;
128767                 event.trigger("DisplayBrightnessChanged", [setting]);
128768             }
128769         }
128770     },
128771     "NETWORK": {
128772         "networkType": {
128773             "name": "Network Type",
128774             "control" : {
128775                 "type": "select",
128776                 "value": NetworkTypeTable["NONE"]
128777             },
128778             "options": (function () {
128779                 var optionList = {};
128780                 utils.forEach(NetworkTypeTable, function (key, value) {
128781                     optionList[key] = NetworkTypeTable[value];
128782                 });
128783
128784                 return optionList;
128785             }())
128786         }
128787     },
128788     "WIFI_NETWORK": {
128789         "status": {
128790             "name": "Status",
128791             "control": {
128792                 "type": "checkbox",
128793                 "value": false
128794             },
128795             "event": "WiFiNetworkStatusChanged",
128796             "callback": function (setting) {
128797                 event.trigger("WiFiNetworkStatusChanged", [setting]);
128798             }
128799         },
128800         "ssid": {
128801             "name": "SSID",
128802             "control": {
128803                 "type": "text",
128804                 "value": "Tizen WiFi"
128805             }
128806         },
128807         "ipAddress": {
128808             "name": "IP Address",
128809             "control": {
128810                 "type": "text",
128811                 "value": "192.168.0.1"
128812             }
128813         },
128814         "ipv6Address": {
128815             "name": "IPv6 Address",
128816             "control": {
128817                 "type": "text",
128818                 "value": "2001:db8:85a3:0:0:0:70:7334"
128819             }
128820         },
128821         "signalStrength": {
128822             "name": "Signal Strength",
128823             "control": {
128824                 "type": "select",
128825                 "value": 0
128826             },
128827             "options": (function () {
128828                 var i,
128829                     optionList = {};
128830
128831                 for (i = 0; i <= 10; i++) {
128832                     optionList[i] = i;
128833                 }
128834
128835                 return optionList;
128836             }())
128837         }
128838     },
128839     "CELLULAR_NETWORK": {
128840         "status": {
128841             "name": "Status",
128842             "control": {
128843                 "type": "checkbox",
128844                 "value": true
128845             },
128846             "event": "CellularNetworkStatusChanged",
128847             "callback": function (setting) {
128848                 event.trigger("CellularNetworkStatusChanged", [setting]);
128849             }
128850         },
128851         "apn": {
128852             "name": "APN",
128853             "control": {
128854                 "type": "text",
128855                 "value": "Tizen"
128856             }
128857         },
128858         "ipAddress": {
128859             "name": "IP Address",
128860             "control": {
128861                 "type": "text",
128862                 "value": "10.0.2.16"
128863             }
128864         },
128865         "ipv6Address": {
128866             "name": "IPv6 Address",
128867             "control": {
128868                 "type": "text",
128869                 "value": "2001:db8:85a3:0:0:0:70:7334"
128870             }
128871         },
128872         "mcc": {
128873             "name": "MCC",
128874             "control": {
128875                 "type": "number",
128876                 "value": 460
128877             }
128878         },
128879         "mnc": {
128880             "name": "MNC",
128881             "control": {
128882                 "type": "number",
128883                 "value": 0
128884             }
128885         },
128886         "cellId": {
128887             "name": "Cell ID",
128888             "control": {
128889                 "type": "number",
128890                 "value": 0
128891             }
128892         },
128893         "lac": {
128894             "name": "LAC",
128895             "control": {
128896                 "type": "number",
128897                 "value": 0
128898             }
128899         },
128900         "isRoaming": {
128901             "name": "Roaming",
128902             "control": {
128903                 "type": "checkbox",
128904                 "value": true
128905             }
128906         },
128907         "isFlightMode": {
128908             "name": "Flight Mode",
128909             "control": {
128910                 "type": "checkbox",
128911                 "value": false
128912             },
128913             "callback": function (setting) {
128914                 event.trigger("FlightModeChanged", [setting]);
128915             }
128916         },
128917         "imei": {
128918             "name": "IMEI",
128919             "control": {
128920                 "type": "text",
128921                 "value": "012417005203000"
128922             }
128923         }
128924     },
128925     "SIM": {
128926         "state": {
128927             "name": "State",
128928             "control": {
128929                 "type": "select",
128930                 "value": SimStateTable["READY"]
128931             },
128932             "options": (function () {
128933                 var optionList = {};
128934                 utils.forEach(SimStateTable, function (key, value) {
128935                     optionList[key] = SimStateTable[value];
128936                 });
128937
128938                 return optionList;
128939             }())
128940         },
128941         "operatorName": {
128942             "name": "Operator Name",
128943             "control": {
128944                 "type": "text",
128945                 "value": "Tizen"
128946             }
128947         },
128948         "msisdn": {
128949             "name": "MSISDN",
128950             "control": {
128951                 "type": "text",
128952                 "value": "088123456789"
128953             }
128954         },
128955         "iccid": {
128956             "name": "ICCID",
128957             "control": {
128958                 "type": "text",
128959                 "value": "123000MFSSYYGXXXXXXP"
128960             }
128961         },
128962         "mcc": {
128963             "name": "MCC",
128964             "control": {
128965                 "type": "number",
128966                 "value": 460
128967             }
128968         },
128969         "mnc": {
128970             "name": "MNC",
128971             "control": {
128972                 "type": "number",
128973                 "value": 0
128974             }
128975         },
128976         "msin": {
128977             "name": "MSIN",
128978             "control": {
128979                 "type": "text",
128980                 "value": "H1 H2 H3 S 12345"
128981             }
128982         },
128983         "spn": {
128984             "name": "SPN",
128985             "control": {
128986                 "type": "text",
128987                 "value": "TizenSPN"
128988             }
128989         }
128990     },
128991     "PERIPHERAL": {
128992         "isVideoOutputOn": {
128993             "name": "Video Output",
128994             "control": {
128995                 "type": "checkbox",
128996                 "value": false
128997             }
128998         }
128999     }
129000 };
129001
129002 });
129003 define('ripple/platform/ivi/3.0/spec/sensor', function (require, exports, module) {
129004 /*
129005  *  Copyright 2012 Intel Corporation.
129006  *
129007  * Licensed under the Apache License, Version 2.0 (the "License");
129008  * you may not use this file except in compliance with the License.
129009  * You may obtain a copy of the License at
129010  *
129011  * http://www.apache.org/licenses/LICENSE-2.0
129012  *
129013  * Unless required by applicable law or agreed to in writing, software
129014  * distributed under the License is distributed on an "AS IS" BASIS,
129015  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
129016  * See the License for the specific language governing permissions and
129017  * limitations under the License.
129018  */
129019 var event = require('ripple/event');
129020
129021 function sensorStatusEventTrigger(setting) {
129022     event.trigger("SensorStatusChanged", [setting]);
129023 }
129024
129025 module.exports = {
129026     "Accelerometer": {
129027         "resolution": 0.039239998906850815,
129028         "minDelay": 20,
129029         "range": 20.051639556884766,
129030         "name": "Accelerometer",
129031         "type": "Accelerometer"
129032     },
129033     "MagneticField": {
129034         "x": {
129035             "name": "X",
129036             "control": {
129037                 "type": "range",
129038                 "value": 100.0000000000000000,
129039                 "min": 0.0000000000000000,
129040                 "max": 200.0000000000000000,
129041                 "step": 0.0000000000000001
129042             },
129043             "callback": function (setting) {
129044                 event.trigger("MagneticField-xChanged", [setting]);
129045             }
129046         },
129047
129048         "y": {
129049             "name": "Y",
129050             "control": {
129051                 "type": "range",
129052                 "value": 100.0000000000000000,
129053                 "min": 0.0000000000000000,
129054                 "max": 200.0000000000000000,
129055                 "step": 0.0000000000000001
129056             },
129057             "callback": function (setting) {
129058                 event.trigger("MagneticField-yChanged", [setting]);
129059             }
129060         },
129061
129062         "z": {
129063             "name": "Z",
129064             "control": {
129065                 "type": "range",
129066                 "value": 100.0000000000000000,
129067                 "min": 0.0000000000000000,
129068                 "max": 200.0000000000000000,
129069                 "step": 0.0000000000000001
129070             },
129071             "callback": function (setting) {
129072                 event.trigger("MagneticField-zChanged", [setting]);
129073             }
129074         },
129075
129076         "resolution": 1,
129077         "minDelay": 20,
129078         "range": 359,
129079         "name": "MagneticField",
129080         "type": "MagneticField"
129081     },
129082     "Rotation": {
129083         "resolution": 1,
129084         "minDelay": 20,
129085         "range": 359,
129086         "name": "Rotation",
129087         "type": "Rotation"
129088     },
129089     "Orientation": {
129090         "resolution": 1,
129091         "minDelay": 20,
129092         "range": 359,
129093         "name": "Orientation",
129094         "type": "Orientation"
129095     }
129096 };
129097
129098 });
129099 define('ripple/platform/ivi/3.0/spec/ui', function (require, exports, module) {
129100 /*
129101  *  Copyright 2011 Intel Corporation.
129102  *
129103  * Licensed under the Apache License, Version 2.0 (the "License");
129104  * you may not use this file except in compliance with the License.
129105  * You may obtain a copy of the License at
129106  *
129107  * http://www.apache.org/licenses/LICENSE-2.0
129108  *
129109  * Unless required by applicable law or agreed to in writing, software
129110  * distributed under the License is distributed on an "AS IS" BASIS,
129111  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
129112  * See the License for the specific language governing permissions and
129113  * limitations under the License.
129114  */
129115 module.exports = {
129116     plugins: [
129117         "vehicle",
129118         "sensors",
129119         "communication",
129120         "geoView",
129121         "widgetConfig",
129122         "deviceSettings",
129123         "application",
129124         "network",
129125         "power",
129126         "download",
129127         "notifications",
129128         "package",
129129         "messagePort",
129130         "secureElement"
129131     ]
129132 };
129133
129134 });
129135 define('ripple/platform/ivi/3.0/WebAPIError', function (require, exports, module) {
129136 /*
129137  *  Copyright 2013 Intel Corporation.
129138  *
129139  * Licensed under the Apache License, Version 2.0 (the "License");
129140  * you may not use this file except in compliance with the License.
129141  * You may obtain a copy of the License at
129142  *
129143  * http://www.apache.org/licenses/LICENSE-2.0
129144  *
129145  * Unless required by applicable law or agreed to in writing, software
129146  * distributed under the License is distributed on an "AS IS" BASIS,
129147  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
129148  * See the License for the specific language governing permissions and
129149  * limitations under the License.
129150  */
129151
129152 var errorcode = require('ripple/platform/ivi/3.0/errorcode');
129153
129154 var msg = {
129155     1: "Permission denied.",
129156     2: "Unsupported property.",
129157     3: "Timeout.",
129158     10: "Unknown."
129159 },
129160     errType = {
129161     1: "PermissionDeniedError",
129162     2: "PropertyUnavailableError",
129163     3: "TimeoutError",
129164     10: "UnknownError"
129165 };
129166
129167 module.exports = function (code, message, name) {
129168     var _code, _message, _name;
129169
129170     if (typeof code !== 'number') {
129171         _code = errorcode.UNKNOWN;
129172         _message = msg[_code];
129173         _name = errType[_code];
129174     } else {
129175         _code = code;
129176         if (typeof message === 'string') {
129177             _message = message;
129178         } else {
129179             _message = msg[_code];
129180         }
129181         if (typeof name === 'string') {
129182             _name = name;
129183         } else {
129184             _name = errType[_code];
129185         }
129186     }
129187
129188     this.__defineGetter__("code", function () {
129189         return _code;
129190     });
129191     this.__defineGetter__("message", function () {
129192         return _message;
129193     });
129194     this.__defineGetter__("name", function () {
129195         return _name;
129196     });
129197 };
129198
129199 });
129200 define('ripple/platform/ivi/3.0/typedef', function (require, exports, module) {
129201 /*
129202  *  Copyright 2013 Intel Corporation.
129203  *
129204  * Licensed under the Apache License, Version 2.0 (the "License");
129205  * you may not use this file except in compliance with the License.
129206  * You may obtain a copy of the License at
129207  *
129208  * http://www.apache.org/licenses/LICENSE-2.0
129209  *
129210  * Unless required by applicable law or agreed to in writing, software
129211  * distributed under the License is distributed on an "AS IS" BASIS,
129212  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
129213  * See the License for the specific language governing permissions and
129214  * limitations under the License.
129215  */
129216
129217 var _t, _c, _i;
129218
129219 /*
129220  * Primitive type definition
129221  */
129222
129223 _t = {
129224     // Basic
129225     Callback:                           "Callback",
129226     DOMString:                          "",
129227     Date:                               new Date(),
129228     Function:                           function () {},
129229     TZDate:                             "TZDate",
129230     any:                                "any",
129231     boolean:                            false,
129232     byte:                               "byte",
129233     double:                             "double",
129234     float:                              "float",
129235     long:                               "long",
129236     octet:                              "octet",
129237     short:                              "short",
129238     long_long:                          "long long",
129239     unsigned_long:                      "unsigned long",
129240     unsigned_long_long:                 "unsigned long long",
129241     unsigned_short:                     "unsigned short"
129242 };
129243
129244 /*
129245  * Derivative type definition
129246  */
129247
129248 /*
129249  * Object attributes
129250  *     Contruct a prototype of an object. Specify a primitive type for each attribute.
129251  *
129252  * _optional
129253  *     Optional attributes table, which consists of two types of attributes,
129254  *
129255  *     nullable
129256  *         Nullable attributes, marked as '?' in IDL.
129257  *
129258  *     undefined
129259  *         Array type attributes, that not definitely specified to be
129260  *         initialized as an empty array, i.e., undefined-initialized array.
129261  *
129262  * _derived
129263  *     Derived types, which used in two cases of definition,
129264  *
129265  *     Subtype list
129266  *         An array consists of derived subtypes. It exists in the definition of
129267  *         a base type.
129268  *
129269  *     Union types
129270  *         An array consists of member types. It exists in the definition of
129271  *         a union type.
129272  *
129273  * _dictionary
129274  *     Dictionary type, which indicates that the object is a dictionary type.
129275  */
129276
129277 /*
129278  * Media Server
129279  */
129280 _t.MediaServerFoundServerCallback = _t.Function;
129281 _t.MediaServerBrowseFindCallback = _t.Function;
129282 _t.MediaServerErrorCallback = _t.Function;
129283
129284 /*
129285  * Vehicle
129286  */
129287 _t.SupportedPropertiesSuccessCallback = _t.Function;
129288
129289 _t.VehiclePropertyErrorCallback = _t.Function;
129290
129291 _t.VehiclePropertyCallback = _t.Function;
129292
129293 _t.VehiclePropertyListCallback = _t.Function;
129294
129295 /*
129296  * VehicleSpeed
129297  */
129298 _t.VehicleSpeed = {
129299     vehicleSpeed: _t.unsigned_long
129300 };
129301
129302 /*
129303  * EngineSpeed
129304  */
129305 _t.EngineSpeed = {
129306     engineSpeed: _t.unsigned_long
129307 };
129308
129309 /*
129310  * VehiclePowerMode
129311  */
129312 _t.VehiclePowerMode = {
129313     vehiclePowerMode: _t.octet
129314 };
129315
129316 /*
129317  * TripMeters
129318  */
129319 _t.TripMeter = {
129320     tripMeters: [_t.unsigned_long]
129321 };
129322
129323 /*
129324  * Acceleration
129325  */
129326 _t.Acceleration = {
129327     x: _t.unsigned_long,
129328     y: _t.unsigned_long,
129329     z: _t.unsigned_long
129330 };
129331
129332 /*
129333  * Transmission
129334  */
129335 _t.Transmission = {
129336     gearPosition: _t.octet,
129337     mode: _t.octet
129338 };
129339
129340 /*
129341  * CruiseControlStatus
129342  */
129343 _t.CruiseControlStatus = {
129344     activated: _t.boolean,
129345     speed: _t.unsigned_short
129346 };
129347 /*
129348  * WheelBrake
129349  */
129350 _t.WheelBrake = {
129351     engaged: _t.boolean
129352 };
129353
129354 /*
129355  * LightStatus
129356  */
129357 _t.LightStatus = {
129358     head: _t.boolean,
129359     rightTurn: _t.boolean,
129360     leftTurn: _t.boolean,
129361     brake: _t.boolean,
129362     fog: _t.boolean,
129363     hazard: _t.boolean,
129364     parking: _t.boolean,
129365     highBeam: _t.boolean
129366 };
129367
129368 /*
129369  * InteriorLightStatus
129370  */
129371 _t.InteriorLightStatus = {
129372     passenger: _t.boolean,
129373     driver: _t.boolean,
129374     center: _t.boolean
129375 };
129376
129377 /*
129378  * Horn
129379  */
129380 _t.Horn = {
129381     on: _t.boolean
129382 };
129383
129384 /*
129385  * Fuel
129386  */
129387 _t.Fuel = {
129388     level: _t.unsigned_short,
129389     range: _t.unsigned_short,
129390     instantConsumption: _t.unsigned_short,
129391     instantEconomy: _t.unsigned_short,
129392     averageEconomy: _t.unsigned_short
129393 };
129394
129395 /*
129396  * EngineOil
129397  */
129398 _t.EngineOil = {
129399     remaining: _t.unsigned_short,
129400     temperature: _t.long,
129401     pressure: _t.unsigned_short
129402 };
129403
129404 /*
129405  * Location
129406  */
129407 _t.Location = {
129408     latitude: _t.double,
129409     longitude: _t.double,
129410     altitude: _t.double,
129411     direction: _t.unsigned_short
129412 };
129413
129414 /*
129415  * ExteriorBrightness
129416  */
129417 _t.ExteriorBrightness = {
129418     exteriorBrightness: _t.unsigned_long
129419 };
129420
129421 /*
129422  * Temperature
129423  */
129424 _t.Temperature = {
129425     interior: _t.short,
129426     exterior: _t.short
129427 };
129428
129429 /*
129430  * RainSensor
129431  */
129432 _t.RainSensor = {
129433     rainSensor: _t.unsigned_short
129434 };
129435
129436 /*
129437  * WindshieldWiper
129438  */
129439 _t.WindshieldWiper = {
129440     windshieldWiper: _t.unsigned_short
129441 };
129442
129443 /*
129444  * DefrostDictionary
129445  */
129446 _t.DefrostDictionary = {
129447     window: _t.unsigned_short,
129448     defrost: _t.boolean,
129449
129450     _dictionary: true
129451 };
129452
129453 /*
129454  * HVAC
129455  */
129456 _t.HVAC = {
129457     airflowDirection: _t.unsigned_short,
129458     fanSpeed: _t.unsigned_short,
129459     targetTemperature: _t.unsigned_short,
129460     airConditioning: _t.boolean,
129461     airRecirculation: _t.boolean,
129462     heater: _t.boolean,
129463     steeringWheelHeater: _t.boolean,
129464     seatHeater: _t.boolean,
129465     seatCooler: _t.boolean
129466 };
129467
129468 /*
129469  * WindowStatus
129470  */
129471 _t.WindowStatus = {
129472     openness: _t.unsigned_short,
129473     defrost: _t.boolean
129474 };
129475
129476 /*
129477  * Sunroof
129478  */
129479 _t.Sunroof = {
129480     openness: _t.unsigned_short,
129481     tilt: _t.unsigned_short
129482 };
129483
129484 /*
129485  * ConvertibleRoof
129486  */
129487 _t.ConvertibleRoof = {
129488     openness: _t.unsigned_short
129489 };
129490
129491 /*
129492  * VehicleId
129493  */
129494 _t.VehicleId = {
129495     WMI: _t.DOMString,
129496     VIN: _t.DOMString
129497 };
129498
129499 /*
129500  * Size
129501  */
129502 _t.Size = {
129503     width: _t.unsigned_long,
129504     height: _t.unsigned_long,
129505     length: _t.unsigned_long
129506 };
129507
129508 /*
129509  * FuelInfo
129510  */
129511 _t.FuelInfo = {
129512     type: _t.unsigned_short,
129513     refuelPosition: _t.unsigned_short
129514 };
129515
129516 /*
129517  * VehicleType
129518  */
129519 _t.VehicleType = {
129520     type: _t.unsigned_short
129521 };
129522
129523 /*
129524  * Doors
129525  */
129526 _t.Doors = {
129527     doorsPerRow: [_t.unsigned_short]
129528 };
129529
129530 /*
129531  * TransmissionGearType
129532  */
129533 _t.TransmissionGearType = {
129534     transmissionGearType: _t.unsigned_short
129535 };
129536
129537 /*
129538  * WheelInformation
129539  */
129540 _t.WheelInformation = {
129541     frontWheelRadius: _t.unsigned_short,
129542     rearWheelRadius: _t.unsigned_short,
129543     wheelTrack: _t.unsigned_long,
129544     ABS: _t.boolean
129545 };
129546
129547 /*
129548  * Odometer
129549  */
129550 _t.Odometer = {
129551     odometer: _t.unsigned_long
129552 };
129553
129554 /*
129555  * Fluid
129556  */
129557 _t.Fluid = {
129558     transmission: _t.unsigned_short,
129559     brake: _t.unsigned_short,
129560     washer: _t.unsigned_short
129561 };
129562
129563 /*
129564  * Battery
129565  */
129566 _t.Battery = {
129567     voltage: _t.double,
129568     current: _t.double
129569 };
129570
129571 /*
129572  * TirePressure
129573  */
129574 _t.TirePressure = {
129575     leftFront: _t.double,
129576     rightFront: _t.double,
129577     leftRear: _t.double,
129578     rightRear: _t.double
129579 };
129580
129581 /*
129582  * TireTemperature
129583  */
129584 _t.TireTemperature = {
129585     leftFront: _t.double,
129586     rightFront: _t.double,
129587     leftRear: _t.double,
129588     rightRear: _t.double
129589 };
129590
129591 /*
129592  * SecurityAlert
129593  */
129594 _t.SecurityAlert = {
129595     securityAlert: _t.boolean
129596 };
129597
129598 /*
129599  * ParkingBrake
129600  */
129601 _t.ParkingBrake = {
129602     parkingBrake: _t.boolean
129603 };
129604
129605 /*
129606  * ParkingLight
129607  */
129608 _t.ParkingLight = {
129609     parkingLight: _t.boolean
129610 };
129611
129612 /*
129613  * HazardLight
129614  */
129615 _t.HazardLight = {
129616     hazardLight: _t.boolean
129617 };
129618
129619 /*
129620  * AntilockBrakingSystem
129621  */
129622 _t.AntilockBrakingSystem = {
129623     antilockBrakingSystem: _t.boolean
129624 };
129625
129626 /*
129627  * TractionControlSystem
129628  */
129629 _t.TractionControlSystem = {
129630     tractionControlSystem: _t.boolean
129631 };
129632
129633 /*
129634  * VehicleTopSpeedLimit
129635  */
129636 _t.VehicleTopSpeedLimit = {
129637     vehicleTopSpeedLimit: _t.unsigned_short
129638 };
129639
129640 /*
129641  * AirbagStatus
129642  */
129643 _t.AirbagStatus = {
129644     airbagStatus: _t.unsigned_short
129645 };
129646
129647 /*
129648  * DoorStatus
129649  */
129650 _t.DoorStatus = {
129651     doorStatus: _t.unsigned_short,
129652     doorLockStatus: _t.boolean,
129653     childLockStatus: _t.boolean
129654 };
129655
129656 /*
129657  * SeatBeltStatus
129658  */
129659 _t.SeatBeltStatus = {
129660     seatBeltStatus: _t.boolean
129661 };
129662
129663 /*
129664  * OccupantStatus
129665  */
129666 _t.OccupantStatus = {
129667     occupantStatus: _t.unsigned_short
129668 };
129669
129670 /*
129671  * ObstacleDistance
129672  */
129673 _t.ObstacleDistance = {
129674     obstacleDistance: _t.double
129675 };
129676
129677 /*
129678  * NightMode
129679  */
129680 _t.NightMode = {
129681     nightMode: _t.boolean
129682 };
129683
129684 /*
129685  * DrivingMode
129686  */
129687 _t.DrivingMode = {
129688     drivingMode: _t.unsigned_short
129689 };
129690
129691 /*
129692  * TurnSignal
129693  */
129694 _t.TurnSignal = {
129695     turnSignal: _t.unsigned_short
129696 };
129697
129698 /*
129699  * ButtonEvent
129700  */
129701 _t.ButtonEvent = {
129702     buttonEvent: _t.unsigned_short
129703 };
129704
129705 /*
129706  * VehiclePropertyType
129707  */
129708 _t.VehiclePropertyType = {
129709     time: _t.unsigned_long_long,
129710     zone: _t.short,
129711     source: _t.DOMString,
129712
129713     _derived: [_t.VehicleSpeed, _t.EngineSpeed, _t.VehiclePowerMode,
129714         _t.TripMeter, _t.Acceleration, _t.Transmission,
129715         _t.CruiseControlStatus, _t.WheelBrake, _t.LightStatus,
129716         _t.InteriorLightStatus, _t.Horn, _t.Fuel, _t.EngineOil, _t.Location,
129717         _t.ExteriorBrightness, _t.Temperature, _t.RainSensor,
129718         _t.WindshieldWiper, _t.HVAC, _t.WindowStatus, _t.Sunroof,
129719         _t.ConvertibleRoof, _t.VehicleId, _t.Size, _t.FuelInfo, _t.VehicleType,
129720         _t.Doors, _t.TransmissionGearType, _t.WheelInformation, _t.Odometer,
129721         _t.Fluid, _t.Battery, _t.TirePressure, _t.TireTemperature,
129722         _t.SecurityAlert, _t.ParkingBrake, _t.ParkingLight, _t.HazardLight,
129723         _t.AntilockBrakingSystem, _t.TractionControlSystem,
129724         _t.VehicleTopSpeedLimit, _t.AirbagStatus, _t.DoorStatus,
129725         _t.SeatBeltStatus, _t.OccupantStatus, _t.ObstacleDistance,
129726         _t.NightMode, _t.TurnSignal, _t.ButtonEvent]
129727 };
129728
129729 /*
129730  * Constructor list definition
129731  */
129732
129733 /*
129734  * Generic constructor
129735  *     Construct a prototype of constructor. A fake array of arguments type is
129736  *     specified for constructor.
129737  *
129738  * Overloaded constructors
129739  *     Construct an array of prototype of constructor. Each array element is
129740  *     specified for one of constructors. The constructor with extra arguments
129741  *     are recommended to be defined ahead of the one with fewer same arguments
129742  *     for exact match.
129743  */
129744
129745 _c = {};
129746
129747 /*
129748  * Interface prototype definition
129749  */
129750
129751 _i = {
129752     // Media Server
129753     MediaServerManager: {},
129754     MediaServer:        {},
129755     MediaContainer:     {},
129756
129757     // Speech
129758     SpeechManager:      {},
129759
129760     // Vehicle
129761     Vehicle:            {}
129762 };
129763
129764 // Media Server
129765 _i.MediaServerManager.scanNetwork = {
129766     0: _t.MediaServerFoundServerCallback,
129767     1: _t.MediaServerErrorCallback,
129768
129769     _optional: {
129770         // nullable
129771         1: true
129772     }
129773 };
129774
129775 _i.MediaServer.upload = {
129776     0: _t.DOMString
129777 };
129778
129779 _i.MediaServer.createFolder = {
129780     0: _t.DOMString
129781 };
129782
129783 _i.MediaServer.browse = {
129784     0: _t.DOMString,
129785     1: _t.DOMString,
129786     2: _t.unsigned_long,
129787     3: _t.unsigned_long,
129788     4: _t.MediaServerBrowseFindCallback,
129789     5: _t.MediaServerErrorCallback,
129790
129791     _optional: {
129792         // nullable
129793         5: true
129794     }
129795 };
129796
129797 _i.MediaServer.find = {
129798     0: _t.DOMString,
129799     1: _t.DOMString,
129800     2: _t.DOMString,
129801     3: _t.unsigned_long,
129802     4: _t.unsigned_long,
129803     5: _t.MediaServerBrowseFindCallback,
129804     6: _t.MediaServerErrorCallback,
129805
129806     _optional: {
129807         // nullable
129808         6: true
129809     }
129810 };
129811
129812 _i.MediaContainer.upload = {
129813     0: _t.DOMString,
129814     1: _t.DOMString
129815 };
129816
129817 _i.MediaContainer.createFolder = {
129818     0: _t.DOMString
129819 };
129820
129821 // Speech
129822 _i.SpeechManager.vocalizeString = {
129823     0: _t.DOMString
129824 };
129825
129826 // Vehicle
129827 _i.Vehicle.get = {
129828     0: _t.DOMString,
129829     1: _t.short,
129830
129831     _optional: {
129832         // nullable
129833         1: true
129834     }
129835 };
129836
129837 _i.Vehicle.getAsync = {
129838     0: _t.DOMString,
129839     1: _t.VehiclePropertyCallback,
129840     2: _t.VehiclePropertyErrorCallback,
129841     3: _t.short,
129842
129843     _optional: {
129844         // nullable
129845         2: true,
129846         3: true
129847     }
129848 };
129849
129850 _i.Vehicle.subscribe = {
129851     0: _t.DOMString,
129852     1: _t.VehiclePropertyCallback,
129853     2: _t.short,
129854     3: _t.VehiclePropertyErrorCallback,
129855
129856     _optional: {
129857         // nullable
129858         2: true,
129859         3: true
129860     }
129861 };
129862
129863 _i.Vehicle.set = {
129864     0: _t.DOMString,
129865     1: _t.VehiclePropertyType,
129866     2: _t.VehiclePropertyErrorCallback,
129867
129868     _optional: {
129869         // nullable
129870         2: true
129871     }
129872 };
129873
129874 _i.Vehicle.getHistory = {
129875     0: _t.DOMString,
129876     1: _t.short,
129877     2: _t.Date,
129878     3: _t.Date,
129879     4: _t.VehiclePropertyListCallback,
129880     5: _t.VehiclePropertyErrorCallback,
129881
129882     _optional: {
129883         // nullable
129884         5: true
129885     }
129886 };
129887
129888 _i.Vehicle.listZones = {
129889     0: _t.DOMString
129890 };
129891
129892 // Exports
129893 _t.constructor = _c;
129894 _t.interface   = _i;
129895
129896 module.exports = _t;
129897
129898 });
129899 define('ripple/platform/ivi/3.0/WebAPIException', function (require, exports, module) {
129900 /*
129901  *  Copyright 2013 Intel Corporation.
129902  *
129903  * Licensed under the Apache License, Version 2.0 (the "License");
129904  * you may not use this file except in compliance with the License.
129905  * You may obtain a copy of the License at
129906  *
129907  * http://www.apache.org/licenses/LICENSE-2.0
129908  *
129909  * Unless required by applicable law or agreed to in writing, software
129910  * distributed under the License is distributed on an "AS IS" BASIS,
129911  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
129912  * See the License for the specific language governing permissions and
129913  * limitations under the License.
129914  */
129915
129916 var errorcode = require('ripple/platform/ivi/3.0/errorcode');
129917
129918 var msg = {
129919         1: "Permission denied.",
129920         2: "Unsupported property.",
129921         3: "Timeout.",
129922         10: "Unknown."
129923     },
129924     errType = {
129925         1: "PermissionDeniedError",
129926         2: "PropertyUnavailableError",
129927         3: "TimeoutError",
129928         10: "UnknownError"
129929     };
129930
129931 module.exports = function (code, message, name) {
129932     var g, c, _code, _message, _name;
129933
129934     for (c in errorcode) {
129935         g = errorcode.__lookupGetter__(c);
129936         if (g) {
129937             this.__defineGetter__(c, g);
129938         }
129939     }
129940
129941     if (typeof code !== 'number') {
129942         _code = errorcode.UNKNOWN;
129943         _message = msg[_code];
129944         _name = errType[_code];
129945     } else {
129946         _code = code;
129947         if (typeof message === 'string') {
129948             _message = message;
129949         } else {
129950             _message = msg[_code];
129951         }
129952         if (typeof name === 'string') {
129953             _name = name;
129954         } else {
129955             _name = errType[_code];
129956         }
129957     }
129958
129959     this.__defineGetter__("code", function () {
129960         return _code;
129961     });
129962     this.__defineGetter__("message", function () {
129963         return _message;
129964     });
129965     this.__defineGetter__("name", function () {
129966         return _name;
129967     });
129968 };
129969
129970 });
129971 define('ripple/platform/ivi/3.0/ivi_utils', function (require, exports, module) {
129972 /*
129973  *  Copyright 2011 Intel Corporation.
129974  *
129975  * Licensed under the Apache License, Version 2.0 (the "License");
129976  * you may not use this file except in compliance with the License.
129977  * You may obtain a copy of the License at
129978  *
129979  * http://www.apache.org/licenses/LICENSE-2.0
129980  *
129981  * Unless required by applicable law or agreed to in writing, software
129982  * distributed under the License is distributed on an "AS IS" BASIS,
129983  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
129984  * See the License for the specific language governing permissions and
129985  * limitations under the License.
129986  */
129987
129988 var self,
129989     utils = require('ripple/utils'),
129990     errorcode = require('ripple/platform/ivi/3.0/errorcode'),
129991     WebAPIException = require('ripple/platform/ivi/3.0/WebAPIException');
129992
129993 self = module.exports = {
129994     _wac2_regexSanitize: function (regexString) {
129995         var escapePattern = /([^\\]|^)(%)/g, percentPattern = /\\%/g;
129996         return regexString.replace("^", "\\^")
129997                 .replace("$", "\\$")
129998                 .replace("(", "\\(")
129999                 .replace(")", "\\)")
130000                 .replace("<", "\\<")
130001                 .replace("[", "\\[")
130002                 .replace("{", "\\{")
130003                 .replace(/\\([^%])/, "\\\\$1")    /* don't replace \\% */
130004                 .replace("|", "\\|")
130005                 .replace(">", "\\>")
130006                 .replace(".", "\\.")
130007                 .replace("*", "\\*")
130008                 .replace("+", "\\+")
130009                 .replace("?", "\\?")
130010                 .replace(escapePattern, "$1.*")  /* replace % with .* */
130011                 .replace(percentPattern, "%");   /* strip excape of % */
130012     },
130013
130014     isValidDate: function (d) {
130015         if (Object.prototype.toString.call(d) !== "[object Date]")
130016             return false;
130017         return !isNaN(d.getTime());
130018     },
130019     isValidTZDate: function (d) {
130020         if (d &&  (d instanceof tizen.TZDate)) {
130021             return true;
130022         }
130023         return false;
130024     },
130025     isValidArray: function (a) {
130026         return (Object.prototype.toString.call(a) === "[object Array]");
130027     },
130028
130029     matchOptionArrayString: function (src, attr, pattern) {
130030         /* src.obj[attr] is a StringArray */
130031         var _pattern, re, _stringMatch;
130032         _pattern = this._wac2_regexSanitize(pattern);
130033         re = new RegExp("^" + _pattern + "$", "i");
130034
130035         _stringMatch = function (obj, index) {
130036             if (pattern.search(/^%*$/i) === 0)
130037                 return true;
130038             if (obj[attr] === undefined || obj[attr] === null)
130039                 return false;
130040             return obj[attr].some(function (f) {
130041                 return f.search(re) !== -1;
130042             });
130043         };
130044         return utils.filter(src, _stringMatch);
130045     },
130046
130047     matchAttributeBooleanFilter: function (src, attr, value) {
130048         // only support EXACTLY matchFlag
130049         var _booleanMatch, atr = attr.split(".");
130050
130051         if (atr.length === 2) {
130052             _booleanMatch = function (obj, index) {
130053                 if (!obj[atr[0]])
130054                     return false;
130055
130056                 return (obj[atr[0]][atr[1]] === value);
130057             };
130058         } else {
130059             _booleanMatch = function (obj, index) {
130060                 return (obj[attr] === value);
130061             };
130062         }
130063
130064         return utils.filter(src, _booleanMatch);
130065     },
130066
130067     matchAttributeArrayFilter: function (src, attr, matchFlag, value) {
130068         var _re, _arrayMatch, atr = attr.split("."), _existMatch;
130069
130070         if (atr.length === 2) {
130071             _existMatch = function (obj, index) {
130072                 if (!obj[atr[0]])
130073                     return false;
130074
130075                 return (obj[atr[0]][atr[1]] !== undefined);
130076             };
130077         } else {
130078             _existMatch = function (obj, index) {
130079                 return (obj[attr] !== undefined);
130080             };
130081         }
130082
130083         if (value === undefined || value === null) {
130084             return utils.filter(src, _existMatch);
130085         }
130086
130087         switch (matchFlag)
130088         {
130089         case "EXACTLY":
130090             _re = new RegExp("^" + value + "$");
130091             break;
130092         case "FULLSTRING":
130093             _re = new RegExp("^" + value + "$", "i");
130094             break;
130095         case "CONTAINS":
130096             _re = new RegExp(value, "i");
130097             break;
130098         case "STARTSWITH":
130099             _re = new RegExp("^" + value, "i");
130100             break;
130101         case "ENDSWITH":
130102             _re = new RegExp(value + "$", "i");
130103             break;
130104         case "EXISTS":
130105             return utils.filter(src, _existMatch);
130106         default:
130107             return [];
130108         }
130109
130110         if (atr.length === 2) {
130111             _arrayMatch = function (obj, index) {
130112                 if (!obj[atr[0]])
130113                     return false;
130114
130115                 return (obj[atr[0]][atr[1]] && obj[atr[0]][atr[1]].some(function (o) {
130116                     return (o.search(_re) !== -1);
130117                 }));
130118             };
130119         } else {
130120             _arrayMatch = function (obj, index) {
130121                 return (obj[attr] && obj[attr].some(function (o) {
130122                     return (o.search(_re) !== -1);
130123                 }));
130124             };
130125         }
130126
130127         return utils.filter(src, _arrayMatch);
130128     },
130129
130130     matchAttributeRangeFilter: function (src, attr, low, high) {
130131         var _rangeMatch, atr = attr.split(".");
130132
130133         if (atr.length === 2) {
130134             _rangeMatch = function (obj, index) {
130135                 var matched = true;
130136
130137                 if (!obj[atr[0]])
130138                     return false;
130139
130140                 if (low !== null && low !== undefined) {
130141                     matched = (obj[atr[0]][atr[1]] >= low);
130142                 }
130143                 if (matched && (high !== null && high !== undefined)) {
130144                     matched = (obj[atr[0]][atr[1]] <= high);
130145                 }
130146                 return matched;
130147             };
130148         } else {
130149             _rangeMatch = function (obj, index) {
130150                 var matched = true;
130151
130152                 if (low !== null && low !== undefined) {
130153                     matched = (obj[attr] >= low);
130154                 }
130155                 if (matched && (high !== null && high !== undefined)) {
130156                     matched = (obj[attr] <= high);
130157                 }
130158                 return matched;
130159             };
130160         }
130161         return utils.filter(src, _rangeMatch);
130162     },
130163
130164     matchAttributeFilter: function (src, attr, matchFlag, value) {
130165         var _re, _stringMatch, atr = attr.split("."),
130166             _existMatch;
130167
130168         if (atr.length === 2) {
130169             _existMatch = function (obj, index) {
130170                 if (!obj[atr[0]])
130171                     return false;
130172
130173                 return (obj[atr[0]][atr[1]] !== undefined);
130174             };
130175         } else {
130176             _existMatch = function (obj, index) {
130177                 return (obj[attr] !== undefined);
130178             };
130179         }
130180
130181         if (value === undefined || value === null) {
130182             return utils.filter(src, _existMatch);
130183         }
130184
130185         switch (matchFlag)
130186         {
130187         case "EXACTLY":
130188             _re = new RegExp("^" + value + "$");
130189             break;
130190         case "FULLSTRING":
130191             _re = new RegExp("^" + value + "$", "i");
130192             break;
130193         case "CONTAINS":
130194             _re = new RegExp(value, "i");
130195             break;
130196         case "STARTSWITH":
130197             _re = new RegExp("^" + value, "i");
130198             break;
130199         case "ENDSWITH":
130200             _re = new RegExp(value + "$", "i");
130201             break;
130202         case "EXISTS":
130203             return utils.filter(src, _existMatch);
130204         default:
130205             return [];
130206         }
130207         if (atr.length === 2) {
130208             _stringMatch = function (obj, index) {
130209                 if (!obj[atr[0]])
130210                     return false;
130211
130212                 if (matchFlag === "EXACTLY") {
130213                     return (obj[atr[0]][atr[1]] === value);
130214                 } else if (typeof obj[atr[0]][atr[1]] !== 'string') {
130215                     return false;
130216                 }
130217
130218                 return (obj[atr[0]][atr[1]].search(_re) !== -1);
130219             };
130220         } else {
130221             _stringMatch = function (obj, index) {
130222                 if (matchFlag === "EXACTLY") {
130223                     return (obj[attr] === value);
130224                 } else if (typeof obj[attr] !== 'string') {
130225                     return false;
130226                 }
130227
130228                 return (obj[attr].search(_re) !== -1);
130229             };
130230         }
130231         return utils.filter(src, _stringMatch);
130232     },
130233
130234     matchOptionString: function (src, attr, pattern) {
130235         /* src.obj[attr] is a string */
130236         var _stringMatch, _pattern, _re;
130237         _pattern = this._wac2_regexSanitize(pattern);
130238         _re = new RegExp("^" + _pattern + "$", "mi");
130239
130240         _stringMatch = function (obj, index) {
130241             return (obj[attr].search(_re) !== -1);
130242         };
130243         return utils.filter(src, _stringMatch);
130244     },
130245
130246     matchOptionDate: function (src, attr, filterStart, filterEnd) {
130247         var _dateMatch;
130248         _dateMatch = function (obj, index) {
130249             var matched = true, valueDate = obj[attr];
130250
130251             if (filterStart !== undefined && filterStart !== null) {
130252                 matched = (valueDate.getTime() >= filterStart.getTime());
130253             }
130254             if (matched && (filterEnd !== undefined && filterEnd !== null)) {
130255                 matched = (valueDate.getTime() <= filterEnd.getTime());
130256             }
130257             return matched;
130258         };
130259         return utils.filter(src, _dateMatch);
130260     },
130261
130262     matchOptionShortArray: function (src, attr, filterArray) {
130263         /* src.obj[attr] is a short, filterArray is an array
130264            i.e. find status is [CONFRIMED or TENTATIVE] */
130265         var arraySome = function (obj, index) {
130266             return filterArray.some(function (f) {
130267                 return f === obj[attr];
130268             });
130269         };
130270         return utils.filter(src, arraySome);
130271     },
130272
130273     validateArgumentType: function (arg, argType, errorObj) {
130274         var invalidArg = false;
130275
130276         switch (argType) {
130277         case "array":
130278             if (!arg instanceof Array) {
130279                 invalidArg = true;
130280             }
130281             break;
130282         case "date":
130283             if (!arg instanceof Date) {
130284                 invalidArg = true;
130285             }
130286             break;
130287         case "integer":
130288             if (typeof Number(arg) !== "number" || Number(arg) !== Math.floor(arg)) {
130289                 invalidArg = true;
130290             }
130291             break;
130292         default:
130293             if (typeof arg !== argType) {
130294                 invalidArg = true;
130295             }
130296             break;
130297         }
130298
130299         if (invalidArg) {
130300             throw errorObj;
130301         }
130302     },
130303
130304     validateCallbackType: function (successCallback, errorCallback) {
130305         if (successCallback) {
130306             this.validateArgumentType(successCallback, "function",
130307                 new WebAPIException(errorcode.TYPE_MISMATCH_ERR));
130308         }
130309         if (errorCallback) {
130310             this.validateArgumentType(errorCallback, "function",
130311                 new WebAPIException(errorcode.TYPE_MISMATCH_ERR));
130312         }
130313     },
130314
130315     validateEqualArrays: function (arrayOne, arrayTwo) {
130316         var isEqual = false, i;
130317
130318         if (Object.prototype.toString.call(arrayTwo) === "[object Array]" &&
130319             Object.prototype.toString.call(arrayTwo) === "[object Array]" &&
130320             arrayOne.length === arrayTwo.length) {
130321             isEqual = true;
130322             for (i in arrayOne) {
130323                 if (arrayOne[i] !== arrayTwo[i]) {
130324                     isEqual = false;
130325                     break;
130326                 }
130327             }
130328         }
130329         return isEqual;
130330     },
130331
130332     validateTypeMismatch: function (onSuccess, onError, name, callback) {
130333
130334         if (onSuccess === undefined || onSuccess === null) {
130335             throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
130336         }
130337         this.validateArgumentType(onSuccess, "function",
130338                                   new WebAPIException(errorcode.TYPE_MISMATCH_ERR));
130339         if (onError !== null && onError !== undefined) {
130340             this.validateArgumentType(onError, "function",
130341                                       new WebAPIException(errorcode.TYPE_MISMATCH_ERR));
130342         }
130343
130344         return callback && callback();
130345     },
130346
130347     isEmptyObject: function (obj) {
130348         var prop;
130349
130350         for (prop in obj) {
130351             return false;
130352         }
130353         return true;
130354     },
130355
130356     arrayComposite: function (mode, arrayA, arrayB) {
130357         var combinedArray = arrayA.concat(arrayB),
130358             intersectionArray = arrayA.filter(function (value) {
130359                 if (utils.arrayContains(arrayB, value)) {
130360                     return true;
130361                 }
130362
130363                 return false;
130364             });
130365
130366         switch (mode) {
130367         case "AND":
130368         case "INTERSECTION":
130369             return intersectionArray;
130370         case "OR":
130371         case "UNION":
130372             return intersectionArray.concat(combinedArray.filter(function (value) {
130373                 if (utils.arrayContains(intersectionArray, value)) {
130374                     return false;
130375                 }
130376
130377                 return true;
130378             }));
130379         default:
130380             return undefined;
130381         }
130382     },
130383
130384     isEqual: function (srcObj, aimObj) {
130385         var i;
130386
130387         if (typeof srcObj !== typeof aimObj) {
130388             return false;
130389         }
130390
130391         if (srcObj === null || srcObj === undefined || typeof srcObj === 'number' ||
130392             typeof srcObj === 'string' || typeof srcObj === 'boolean') {
130393             return srcObj === aimObj;
130394         }
130395
130396         for (i in srcObj) {
130397             if (!aimObj.hasOwnProperty(i) || !self.isEqual(srcObj[i], aimObj[i])) {
130398                 return false;
130399             }
130400         }
130401
130402         return true;
130403     },
130404
130405     query: function (objects, filter, sortMode, count, offset) {
130406         function isCompositeFilter(filter) {
130407             return (filter.type) ? true : false;
130408         }
130409
130410         function isAttributeFilter(filter) {
130411             return (filter.matchFlag) ? true : false;
130412         }
130413
130414         function getValue(obj, key) {
130415             var keys = key.split("."),
130416                 value = obj[keys[0]],
130417                 i;
130418
130419             for (i = 1; i < keys.length; i++) {
130420                 if (value[keys[i]]) {
130421                     value = value[keys[i]];
130422                 }
130423             }
130424
130425             return value;
130426         }
130427
130428         function _filter(objects, filter) {
130429             var i, results, eachResult, filterFunc;
130430
130431             if (isCompositeFilter(filter)) {
130432                 for (i in filter.filters) {
130433                     eachResult = _filter(objects, filter.filters[i]);
130434                     results = (results === undefined) ? eachResult : self.arrayComposite(filter.type, results, eachResult);
130435                 }
130436                 return results;
130437             }
130438
130439             if (isAttributeFilter(filter)) {
130440                 for (i in objects) {
130441                     if (filter.attributeName in objects[i])
130442                         break;
130443                 }
130444                 filterFunc = self.isValidArray(objects[i][filter.attributeName]) ? self.matchAttributeArrayFilter : self.matchAttributeFilter;
130445                 results = filterFunc(objects, filter.attributeName, filter.matchFlag, filter.matchValue);
130446             } else {
130447                 results = self.matchAttributeRangeFilter(objects, filter.attributeName, filter.initialValue, filter.endValue);
130448             }
130449
130450             return results;
130451         }
130452
130453         function _sort(objects, sortMode) {
130454             objects.sort(function (a, b) {
130455                 return (sortMode.order === "ASC") ?
130456                     (getValue(a, sortMode.attributeName) < getValue(b, sortMode.attributeName) ? -1 : 1):
130457                     (getValue(a, sortMode.attributeName) > getValue(b, sortMode.attributeName) ? -1 : 1);
130458             });
130459
130460             return objects;
130461         }
130462
130463         var res = objects;
130464
130465         if (filter) {
130466             res = _filter(res, filter);
130467         }
130468
130469         if (sortMode) {
130470             _sort(res, sortMode);
130471         }
130472
130473         if (offset || count) {
130474             offset = (offset > 0) ? offset : 0;
130475             res = (count > 0) ? res.slice(offset, offset + count) : res.slice(offset);
130476         }
130477
130478         return res;
130479     },
130480
130481     copyString: function (str) {
130482         var newStr, charConvert = [], i;
130483
130484         if (typeof str !== 'string') {
130485             return str;
130486         }
130487         for (i = 0; i < str.length; i++) {
130488             charConvert[i] = str.charAt(i);
130489         }
130490         newStr = charConvert.join("");
130491
130492         return newStr;
130493     },
130494
130495     copy: function (obj) {
130496         var i,
130497             newObj = jQuery.isArray(obj) ? [] : {};
130498
130499         if (typeof obj === 'number' ||
130500             typeof obj === 'string' ||
130501             typeof obj === 'boolean' ||
130502             obj === null ||
130503             obj === undefined) {
130504             return obj;
130505         }
130506
130507         if (obj instanceof Date) {
130508             return new Date(obj);
130509         }
130510
130511         if (obj instanceof RegExp) {
130512             return new RegExp(obj);
130513         }
130514
130515         for (i in obj) {
130516             if (obj.hasOwnProperty(i)) {
130517                 if (obj.__lookupGetter__(i)) {
130518                     newObj.__defineGetter__(i, (function (key) {
130519                         return function () {
130520                             return self.copy(obj[key]);
130521                         };
130522                     }(i)));
130523                 }
130524                 else {
130525                     newObj[i] = self.copy(obj[i]);
130526                 }
130527             }
130528         }
130529
130530         return newObj;
130531     }
130532 };
130533
130534 });
130535 define('ripple/platform/ivi/3.0/vehicle', function (require, exports, module) {
130536 /*
130537  *  Copyright 2013 Intel Corporation.
130538  *
130539  * Licensed under the Apache License, Version 2.0 (the "License");
130540  * you may not use this file except in compliance with the License.
130541  * You may obtain a copy of the License at
130542  *
130543  * http://www.apache.org/licenses/LICENSE-2.0
130544  *
130545  * Unless required by applicable law or agreed to in writing, software
130546  * distributed under the License is distributed on an "AS IS" BASIS,
130547  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130548  * See the License for the specific language governing permissions and
130549  * limitations under the License.
130550  */
130551
130552 var utils = require('ripple/utils'),
130553     event = require('ripple/event'),
130554     t = require('ripple/platform/ivi/3.0/typecast'),
130555     errorcode = require('ripple/platform/ivi/3.0/errorcode'),
130556     WebAPIError = require('ripple/platform/ivi/3.0/WebAPIError'),
130557     WebAPIException = require('ripple/platform/ivi/3.0/WebAPIException'),
130558     VehiclePropertyType,
130559     VehicleSpeed,
130560     EngineSpeed,
130561     VehiclePowerMode,
130562     TripMeter,
130563     Acceleration,
130564     Transmission,
130565     CruiseControlStatus,
130566     WheelBrake,
130567     LightStatus,
130568     InteriorLightStatus,
130569     Horn,
130570     Fuel,
130571     EngineOil,
130572     Location,
130573     ExteriorBrightness,
130574     Temperature,
130575     RainSensor,
130576     WindshieldWiper,
130577     HVAC,
130578     WindowStatus,
130579     Sunroof,
130580     ConvertibleRoof,
130581     VehicleId,
130582     Size,
130583     FuelInfo,
130584     VehicleType,
130585     Doors,
130586     TransmissionGearType,
130587     WheelInformation,
130588     Odometer,
130589     Fluid,
130590     Battery,
130591     TirePressure,
130592     TireTemperature,
130593     SecurityAlert,
130594     ParkingBrake,
130595     ParkingLight,
130596     HazardLight,
130597     AntilockBrakingSystem,
130598     TractionControlSystem,
130599     VehicleTopSpeedLimit,
130600     AirbagStatus,
130601     DoorStatus,
130602     SeatBeltStatus,
130603     OccupantStatus,
130604     ObstacleDistance,
130605     NightMode,
130606     DrivingMode,
130607     TurnSignal,
130608     ButtonEvent,
130609     VehicleFactory,
130610     _vehicleCacheData = {
130611         supported: null,
130612         data: null
130613     },
130614     _vehicleEvent = {subscribe: {}},
130615     _security = {
130616         "http://tizen.org/privilege/vehicle": ["supported", "get", "getAsync",
130617                 "set", "getHistory", "subscribe", "listZones"]
130618     },
130619     _self;
130620
130621 function _initialize () {
130622     event.on("vehicle-cache-refresh", function (supported, data) {
130623         _vehicleCacheData.supported = supported;
130624         _vehicleCacheData.data = data;
130625     });
130626
130627     event.trigger("vehicle-cache-request", [_vehicleCacheData]);
130628 }
130629
130630 _self = function () {
130631     var vehicle;
130632
130633     function supported () {
130634         if (!_security.supported) {
130635             throw new WebAPIException(errorcode.PERMISSION_DENIED);
130636         }
130637
130638         return _vehicleCacheData.supported;
130639     }
130640
130641     function get (property, zone) {
130642         if (!_security.get) {
130643             throw new WebAPIException(errorcode.PERMISSION_DENIED);
130644         }
130645
130646         t.Vehicle("get", arguments);
130647
130648         if (_vehicleCacheData.supported.indexOf(property) === -1) {
130649             throw new WebAPIException(errorcode.PROPERTY_UNAVAILABLE);
130650         }
130651
130652         return new VehicleFactory(property, _vehicleCacheData.data[property]);
130653     }
130654
130655     function getAsync (property, successCallback, errorCallback, zone) {
130656         if (!_security.getAsync) {
130657             throw new WebAPIException(errorcode.PERMISSION_DENIED);
130658         }
130659
130660         t.Vehicle("getAsync", arguments);
130661
130662         if (_vehicleCacheData.supported.indexOf(property) === -1) {
130663             throw new WebAPIException(errorcode.PROPERTY_UNAVAILABLE);
130664         }
130665
130666         window.setTimeout(function () {
130667             successCallback(new VehicleFactory(property,
130668                     _vehicleCacheData.data[property]));
130669         }, 1);
130670     }
130671
130672     function subscribe (property, successCallback, zone, errorCallback) {
130673         if (!_security.subscribe) {
130674             throw new WebAPIException(errorcode.PERMISSION_DENIED);
130675         }
130676
130677         t.Vehicle("subscribe", arguments);
130678
130679         if (_vehicleCacheData.supported.indexOf(property) === -1) {
130680             throw new WebAPIException(errorcode.PROPERTY_UNAVAILABLE);
130681         }
130682
130683         _vehicleEvent.subscribe[property] = {
130684             successCallback: successCallback,
130685             errorCallback: errorCallback
130686         };
130687
130688         window.setTimeout(function () {
130689             if (! _vehicleEvent["vehicle-subscribe-response"]) {
130690                 event.on("vehicle-subscribe-response", function (propertyObj) {
130691                     var propertySub = _vehicleEvent.subscribe[propertyObj.type],
130692                         success = propertySub.successCallback,
130693                         error = propertySub.errorCallback;
130694
130695                     if (!propertyObj.supported) {
130696                         if (error) {
130697                             error(new WebAPIError(
130698                                     errorcode.PROPERTY_UNAVAILABLE));
130699                         }
130700                         return;
130701                     }
130702
130703                     success(new VehicleFactory(propertyObj.type,
130704                             propertyObj.val));
130705
130706                 });
130707                 _vehicleEvent["vehicle-subscribe-response"] = true;
130708             }
130709             event.trigger("vehicle-subscribe-request", [property, true, zone]);
130710         }, 1);
130711     }
130712
130713     function set (property, value, errorCallback) {
130714         var val = utils.copy(value);
130715
130716         if (!_security.set) {
130717             throw new WebAPIException(errorcode.PERMISSION_DENIED);
130718         }
130719
130720         t.Vehicle("set", arguments);
130721
130722         if (_vehicleCacheData.supported.indexOf(property) === -1) {
130723             throw new WebAPIException(errorcode.PROPERTY_UNAVAILABLE);
130724         }
130725
130726         window.setTimeout(function () {
130727             event.once("vehicle-set-response", function (status) {
130728                 if (!status) {
130729                     if (errorCallback) {
130730                         errorCallback(new WebAPIError(
130731                                 errorcode.PROPERTY_UNAVAILABLE));
130732                     }
130733                 }
130734             });
130735             event.trigger("vehicle-set-request", [property, val]);
130736         }, 1);
130737     }
130738
130739     function getHistory (property, zone, startTime, endTime, successCallback,
130740             errorCallback) {
130741         var properties = [], i;
130742
130743         if (!_security.getHistory) {
130744             throw new WebAPIException(errorcode.PERMISSION_DENIED);
130745         }
130746
130747         t.Vehicle("getHistory", arguments);
130748
130749         if (_vehicleCacheData.supported.indexOf(property) === -1) {
130750             throw new WebAPIException(errorcode.PROPERTY_UNAVAILABLE);
130751         }
130752
130753         startTime = startTime.getTime();
130754         endTime = endTime.getTime();
130755
130756         window.setTimeout(function () {
130757             event.once("vehicle-history-response", function (values, status) {
130758                 if (!status) {
130759                     if (errorCallback) {
130760                         errorCallback(new WebAPIError(
130761                                 errorcode.PROPERTY_UNAVAILABLE));
130762                     }
130763                     return;
130764                 }
130765
130766                 for (i = 0; i < values.length; i++) {
130767                     properties.push(new VehicleFactory(property, values[i]));
130768                 }
130769                 successCallback(properties);
130770             });
130771             event.trigger("vehicle-history-request", [property, zone,
130772                     startTime, endTime]);
130773         }, 1);
130774     }
130775
130776     function listZones (property) {
130777         if (!_security.listZones) {
130778             throw new WebAPIException(errorcode.PERMISSION_DENIED);
130779         }
130780
130781         t.Vehicle("listZones", arguments);
130782
130783         return [0];
130784     }
130785
130786     function handleSubFeatures (subFeatures) {
130787         var i, subFeature;
130788
130789         for (subFeature in subFeatures) {
130790             for (i in _security[subFeature]) {
130791                 _security[_security[subFeature][i]] = true;
130792             }
130793         }
130794     }
130795
130796     vehicle = {
130797         supported: supported,
130798         get: get,
130799         getAsync: getAsync,
130800         subscribe: subscribe,
130801         set: set,
130802         getHistory: getHistory,
130803         listZones: listZones,
130804         handleSubFeatures: handleSubFeatures
130805     };
130806
130807     vehicle.__defineGetter__("ZONE_None", function () {
130808         return 0;
130809     });
130810
130811     vehicle.__defineGetter__("ZONE_Front", function () {
130812         return 0x01;
130813     });
130814
130815     vehicle.__defineGetter__("ZONE_Middle", function () {
130816         return 0x02;
130817     });
130818
130819     vehicle.__defineGetter__("ZONE_Right", function () {
130820         return 0x04;
130821     });
130822
130823     vehicle.__defineGetter__("ZONE_Left", function () {
130824         return 0x08;
130825     });
130826
130827     vehicle.__defineGetter__("ZONE_Rear", function () {
130828         return 0x10;
130829     });
130830
130831     vehicle.__defineGetter__("ZONE_Center", function () {
130832         return 0x20;
130833     });
130834
130835     return vehicle;
130836 };
130837
130838 VehicleFactory = function (vehicleType, value) {
130839     var instanceType;
130840
130841     switch (vehicleType) {
130842     case "VehicleSpeed":
130843         instanceType = new VehicleSpeed(value);
130844         break;
130845     case "EngineSpeed":
130846         instanceType = new EngineSpeed(value);
130847         break;
130848     case "VehiclePowerMode":
130849         instanceType = new VehiclePowerMode(value);
130850         break;
130851     case "TripMeter":
130852         instanceType = new TripMeter(value);
130853         break;
130854     case "Acceleration":
130855         instanceType = new Acceleration(value);
130856         break;
130857     case "Transmission":
130858         instanceType = new Transmission(value);
130859         break;
130860     case "CruiseControlStatus":
130861         instanceType = new CruiseControlStatus(value);
130862         break;
130863     case "WheelBrake":
130864         instanceType = new WheelBrake(value);
130865         break;
130866     case "LightStatus":
130867         instanceType = new LightStatus(value);
130868         break;
130869     case "InteriorLightStatus":
130870         instanceType = new InteriorLightStatus(value);
130871         break;
130872     case "Horn":
130873         instanceType = new Horn(value);
130874         break;
130875     case "Fuel":
130876         instanceType = new Fuel(value);
130877         break;
130878     case "EngineOil":
130879         instanceType = new EngineOil(value);
130880         break;
130881     case "Location":
130882         instanceType = new Location(value);
130883         break;
130884     case "ExteriorBrightness":
130885         instanceType = new ExteriorBrightness(value);
130886         break;
130887     case "Temperature":
130888         instanceType = new Temperature(value);
130889         break;
130890     case "RainSensor":
130891         instanceType = new RainSensor(value);
130892         break;
130893     case "WindshieldWiper":
130894         instanceType = new WindshieldWiper(value);
130895         break;
130896     case "HVAC":
130897         instanceType = new HVAC(value);
130898         break;
130899     case "WindowStatus":
130900         instanceType = new WindowStatus(value);
130901         break;
130902     case "Sunroof":
130903         instanceType = new Sunroof(value);
130904         break;
130905     case "ConvertibleRoof":
130906         instanceType = new ConvertibleRoof(value);
130907         break;
130908     case "VehicleId":
130909         instanceType = new VehicleId(value);
130910         break;
130911     case "Size":
130912         instanceType = new Size(value);
130913         break;
130914     case "FuelInfo":
130915         instanceType = new FuelInfo(value);
130916         break;
130917     case "VehicleType":
130918         instanceType = new VehicleType(value);
130919         break;
130920     case "Doors":
130921         instanceType = new Doors(value);
130922         break;
130923     case "TransmissionGearType":
130924         instanceType = new TransmissionGearType(value);
130925         break;
130926     case "WheelInformation":
130927         instanceType = new WheelInformation(value);
130928         break;
130929     case "Odometer":
130930         instanceType = new Odometer(value);
130931         break;
130932     case "Fluid":
130933         instanceType = new Fluid(value);
130934         break;
130935     case "Battery":
130936         instanceType = new Battery(value);
130937         break;
130938     case "TirePressure":
130939         instanceType = new TirePressure(value);
130940         break;
130941     case "TireTemperature":
130942         instanceType = new TireTemperature(value);
130943         break;
130944     case "SecurityAlert":
130945         instanceType = new SecurityAlert(value);
130946         break;
130947     case "ParkingBrake":
130948         instanceType = new ParkingBrake(value);
130949         break;
130950     case "ParkingLight":
130951         instanceType = new ParkingLight(value);
130952         break;
130953     case "HazardLight":
130954         instanceType = new HazardLight(value);
130955         break;
130956     case "AntilockBrakingSystem":
130957         instanceType = new AntilockBrakingSystem(value);
130958         break;
130959     case "TractionControlSystem":
130960         instanceType = new TractionControlSystem(value);
130961         break;
130962     case "VehicleTopSpeedLimit":
130963         instanceType = new VehicleTopSpeedLimit(value);
130964         break;
130965     case "AirbagStatus":
130966         instanceType = new AirbagStatus(value);
130967         break;
130968     case "DoorStatus":
130969         instanceType = new DoorStatus(value);
130970         break;
130971     case "SeatBeltStatus":
130972         instanceType = new SeatBeltStatus(value);
130973         break;
130974     case "OccupantStatus":
130975         instanceType = new OccupantStatus(value);
130976         break;
130977     case "ObstacleDistance":
130978         instanceType = new ObstacleDistance(value);
130979         break;
130980     case "NightMode":
130981         instanceType = new NightMode(value);
130982         break;
130983     case "DrivingMode":
130984         instanceType = new DrivingMode(value);
130985         break;
130986     case "TurnSignal":
130987         instanceType = new TurnSignal(value);
130988         break;
130989     case "ButtonEvent":
130990         instanceType = new ButtonEvent(value);
130991         break;
130992     }
130993
130994     function _construct () {
130995         var val;
130996
130997         for (val in value) {
130998             instanceType[val] = value[val];
130999         }
131000         return instanceType;
131001     }
131002
131003     return _construct();
131004 };
131005
131006 VehiclePropertyType = function (propertyTypes) {
131007     var vehiclePropertyType = {};
131008
131009     vehiclePropertyType.time = propertyTypes.time || undefined;
131010     vehiclePropertyType.zone = propertyTypes.zone || 0;
131011     vehiclePropertyType.source = propertyTypes.source || "";
131012
131013     this.__defineGetter__("time", function () {
131014         return vehiclePropertyType.time;
131015     });
131016
131017     this.__defineSetter__("time", function (val) {
131018         try {
131019             vehiclePropertyType.time = t.unsigned_long_long(val);
131020         } catch (err) {
131021         }
131022     });
131023
131024     this.__defineGetter__("zone", function () {
131025         return vehiclePropertyType.zone;
131026     });
131027
131028     this.__defineSetter__("zone", function (val) {
131029         try {
131030             vehiclePropertyType.zone = t.short(val);
131031         } catch (err) {
131032         }
131033     });
131034
131035     this.__defineGetter__("source", function () {
131036         return vehiclePropertyType.source;
131037     });
131038
131039     this.__defineSetter__("source", function (val) {
131040         try {
131041             vehiclePropertyType.source = t.DOMString(val);
131042         } catch (err) {
131043         }
131044     });
131045 };
131046
131047 VehicleSpeed = function (propertyTypes) {
131048     var vehicleSpeed = {};
131049
131050     VehiclePropertyType.call(this, propertyTypes);
131051
131052     vehicleSpeed.vehicleSpeed = propertyTypes.vehicleSpeed || 0;
131053
131054     this.__defineGetter__("vehicleSpeed", function () {
131055         return vehicleSpeed.vehicleSpeed;
131056     });
131057
131058     this.__defineSetter__("vehicleSpeed", function (val) {
131059         try {
131060             vehicleSpeed.vehicleSpeed = t.unsigned_long(val);
131061         } catch (err) {
131062         }
131063     });
131064 };
131065
131066 EngineSpeed = function (propertyTypes) {
131067     var engineSpeed = {};
131068
131069     VehiclePropertyType.call(this, propertyTypes);
131070
131071     engineSpeed.engineSpeed = propertyTypes.engineSpeed || 0;
131072
131073     this.__defineGetter__("engineSpeed", function () {
131074         return engineSpeed.engineSpeed;
131075     });
131076
131077     this.__defineSetter__("engineSpeed", function (val) {
131078         try {
131079             engineSpeed.engineSpeed = t.unsigned_long(val);
131080         } catch (err) {
131081         }
131082     });
131083 };
131084
131085 VehiclePowerMode = function (propertyTypes) {
131086     var vehiclePowerMode = {};
131087
131088     VehiclePropertyType.call(this, propertyTypes);
131089
131090     vehiclePowerMode.vehiclePowerMode = propertyTypes.vehiclePowerMode || 0;
131091
131092     this.__defineGetter__("VEHICLEPOWERMODE_OFF", function () {
131093         return 0;
131094     });
131095
131096     this.__defineGetter__("VEHICLEPOWERMODE_ACCESSORY1", function () {
131097         return 1;
131098     });
131099
131100     this.__defineGetter__("VEHICLEPOWERMODE_ACCESSORY2", function () {
131101         return 2;
131102     });
131103
131104     this.__defineGetter__("VEHICLEPOWERMODE_RUN", function () {
131105         return 3;
131106     });
131107
131108     this.__defineGetter__("vehiclePowerMode", function () {
131109         return vehiclePowerMode.vehiclePowerMode;
131110     });
131111
131112     this.__defineSetter__("vehiclePowerMode", function (val) {
131113         try {
131114             val = t.octet(val);
131115             if (val < 0 || val > 3) {
131116                 return;
131117             }
131118             vehiclePowerMode.vehiclePowerMode = val;
131119         } catch (err) {
131120         }
131121     });
131122 };
131123
131124 TripMeter = function (propertyTypes) {
131125     var tripMeter = {};
131126
131127     VehiclePropertyType.call(this, propertyTypes);
131128
131129     tripMeter.tripMeters = propertyTypes.tripMeters || [];
131130
131131     this.__defineGetter__("tripMeters", function () {
131132         return tripMeter.tripMeters;
131133     });
131134
131135     this.__defineSetter__("tripMeters", function (val) {
131136         try {
131137         //Changing any items in the array will reset the item's value to '0';
131138             tripMeter.tripMeters = t.unsigned_long(val, "[]");
131139         }
131140         catch (err) {
131141         }
131142     });
131143 };
131144
131145 Acceleration = function (propertyTypes) {
131146     var acceleration = {};
131147
131148     VehiclePropertyType.call(this, propertyTypes);
131149
131150     acceleration.x = propertyTypes.x || 0;
131151     acceleration.y = propertyTypes.y || 0;
131152     acceleration.z = propertyTypes.z || 0;
131153
131154     this.__defineGetter__("x", function () {
131155         return acceleration.x;
131156     });
131157
131158     this.__defineSetter__("x", function (val) {
131159         try {
131160             acceleration.x = t.unsigned_long(val);
131161         }
131162         catch (err) {
131163         }
131164     });
131165
131166     this.__defineGetter__("y", function () {
131167         return acceleration.y;
131168     });
131169
131170     this.__defineSetter__("y", function (val) {
131171         try {
131172             acceleration.y = t.unsigned_long(val);
131173         }
131174         catch (err) {
131175         }
131176     });
131177
131178     this.__defineGetter__("z", function () {
131179         return acceleration.z;
131180     });
131181
131182     this.__defineSetter__("z", function (val) {
131183         try {
131184             acceleration.z = t.unsigned_long(val);
131185         } catch (err) {
131186         }
131187     });
131188 };
131189
131190 Transmission = function (propertyTypes) {
131191     var transmission = {};
131192
131193     VehiclePropertyType.call(this, propertyTypes);
131194
131195     transmission.gearPosition = propertyTypes.gearPosition || 0;
131196     transmission.mode = propertyTypes.mode || 0;
131197
131198     this.__defineGetter__("TRANSMISSIONPOSITION_NEUTRAL", function () {
131199         return 0;
131200     });
131201
131202     this.__defineGetter__("TRANSMISSIONPOSITION_FIRST", function () {
131203         return 1;
131204     });
131205
131206     this.__defineGetter__("TRANSMISSIONPOSITION_SECOND", function () {
131207         return 2;
131208     });
131209
131210     this.__defineGetter__("TRANSMISSIONPOSITION_THIRD", function () {
131211         return 3;
131212     });
131213
131214     this.__defineGetter__("TRANSMISSIONPOSITION_FORTH", function () {
131215         return 4;
131216     });
131217
131218     this.__defineGetter__("TRANSMISSIONPOSITION_FIFTH", function () {
131219         return 5;
131220     });
131221
131222     this.__defineGetter__("TRANSMISSIONPOSITION_SIXTH", function () {
131223         return 6;
131224     });
131225
131226     this.__defineGetter__("TRANSMISSIONPOSITION_SEVENTH", function () {
131227         return 7;
131228     });
131229
131230     this.__defineGetter__("TRANSMISSIONPOSITION_EIGHTH", function () {
131231         return 8;
131232     });
131233
131234     this.__defineGetter__("TRANSMISSIONPOSITION_NINTH", function () {
131235         return 9;
131236     });
131237
131238     this.__defineGetter__("TRANSMISSIONPOSITION_TENTH", function () {
131239         return 10;
131240     });
131241
131242     this.__defineGetter__("TRANSMISSIONPOSITION_CVT", function () {
131243         return 64;
131244     });
131245
131246     this.__defineGetter__("TRANSMISSIONPOSITION_REVERSE", function () {
131247         return 128;
131248     });
131249
131250     this.__defineGetter__("TRANSMISSIONPOSITION_PARK", function () {
131251         return 255;
131252     });
131253
131254     this.__defineGetter__("TRANSMISSIONMODE_NORMAL", function () {
131255         return 0;
131256     });
131257
131258     this.__defineGetter__("TRANSMISSIONMODE_SPORT", function () {
131259         return 1;
131260     });
131261
131262     this.__defineGetter__("TRANSMISSIONMODE_ECONOMY", function () {
131263         return 2;
131264     });
131265
131266     this.__defineGetter__("TRANSMISSIONMODE_OEMCUSTOM1", function () {
131267         return 3;
131268     });
131269
131270     this.__defineGetter__("TRANSMISSIONMODE_OEMCUSTOM2", function () {
131271         return 4;
131272     });
131273
131274     this.__defineGetter__("gearPosition", function () {
131275         return transmission.gearPosition;
131276     });
131277
131278     this.__defineSetter__("gearPosition", function (val) {
131279         try {
131280             val = t.octet(val);
131281             if ((val >= 0 && val <= 10) || val === 64 || val === 128 ||
131282                 val === 255) {
131283                 transmission.gearPosition = val;
131284             }
131285         } catch (err) {
131286         }
131287     });
131288
131289     this.__defineGetter__("mode", function () {
131290         return transmission.mode;
131291     });
131292
131293     this.__defineSetter__("mode", function (val) {
131294         try {
131295             val = t.octet(val);
131296             if (val < 0 || val > 4) {
131297                 return;
131298             }
131299             transmission.mode = val;
131300         } catch (err) {
131301         }
131302     });
131303 };
131304
131305 CruiseControlStatus = function (propertyTypes) {
131306     var cruiseControlStatus = {};
131307
131308     VehiclePropertyType.call(this, propertyTypes);
131309
131310     cruiseControlStatus.activated = propertyTypes.activated || false;
131311     cruiseControlStatus.speed = propertyTypes.speed || 0;
131312
131313     this.__defineGetter__("activated", function () {
131314         return cruiseControlStatus.activated;
131315     });
131316
131317     this.__defineSetter__("activated", function (val) {
131318         try {
131319             cruiseControlStatus.activated = t.boolean(val);
131320         } catch (err) {
131321         }
131322     });
131323
131324     this.__defineGetter__("speed", function () {
131325         return cruiseControlStatus.speed;
131326     });
131327
131328     this.__defineSetter__("speed", function (val) {
131329         try {
131330             cruiseControlStatus.speed = t.unsigned_short(val);
131331         } catch (err) {
131332         }
131333     });
131334 };
131335
131336 WheelBrake = function (propertyTypes) {
131337     var wheelBrake = {};
131338
131339     VehiclePropertyType.call(this, propertyTypes);
131340
131341     wheelBrake.engaged = propertyTypes.engaged || false;
131342
131343     this.__defineGetter__("engaged", function () {
131344         return wheelBrake.engaged;
131345     });
131346
131347     this.__defineSetter__("engaged", function (val) {
131348         try {
131349             wheelBrake.engaged = t.boolean(val);
131350         } catch (err) {
131351         }
131352     });
131353 };
131354
131355 LightStatus = function (propertyTypes) {
131356     var lightStatus = {};
131357
131358     VehiclePropertyType.call(this, propertyTypes);
131359
131360     lightStatus.head = propertyTypes.head || false;
131361     lightStatus.rightTurn = propertyTypes.rightTurn || false;
131362     lightStatus.leftTurn = propertyTypes.leftTurn || false;
131363     lightStatus.brake = propertyTypes.brake || false;
131364     lightStatus.fog = propertyTypes.fog || false;
131365     lightStatus.hazard = propertyTypes.hazard || false;
131366     lightStatus.parking = propertyTypes.parking || false;
131367     lightStatus.highBeam = propertyTypes.highBeam || false;
131368
131369     this.__defineGetter__("head", function () {
131370         return lightStatus.head;
131371     });
131372
131373     this.__defineSetter__("head", function (val) {
131374         try {
131375             lightStatus.head = t.boolean(val);
131376         } catch (err) {
131377         }
131378     });
131379
131380     this.__defineGetter__("rightTurn", function () {
131381         return lightStatus.rightTurn;
131382     });
131383
131384     this.__defineSetter__("rightTurn", function (val) {
131385         try {
131386             lightStatus.rightTurn = t.boolean(val);
131387         } catch (err) {
131388         }
131389     });
131390
131391     this.__defineGetter__("leftTurn", function () {
131392         return lightStatus.leftTurn;
131393     });
131394
131395     this.__defineSetter__("leftTurn", function (val) {
131396         try {
131397             lightStatus.leftTurn = t.boolean(val);
131398         } catch (err) {
131399         }
131400     });
131401
131402     this.__defineGetter__("brake", function () {
131403         return lightStatus.brake;
131404     });
131405
131406     this.__defineSetter__("brake", function (val) {
131407         try {
131408             lightStatus.brake = t.boolean(val);
131409         } catch (err) {
131410         }
131411     });
131412
131413     this.__defineGetter__("fog", function () {
131414         return lightStatus.fog;
131415     });
131416
131417     this.__defineSetter__("fog", function (val) {
131418         try {
131419             lightStatus.fog = t.boolean(val);
131420         } catch (err) {
131421         }
131422     });
131423
131424     this.__defineGetter__("hazard", function () {
131425         return lightStatus.hazard;
131426     });
131427
131428     this.__defineSetter__("hazard", function (val) {
131429         try {
131430             lightStatus.hazard = t.boolean(val);
131431         } catch (err) {
131432         }
131433     });
131434
131435     this.__defineGetter__("parking", function () {
131436         return lightStatus.parking;
131437     });
131438
131439     this.__defineSetter__("parking", function (val) {
131440         try {
131441             lightStatus.parking = t.boolean(val);
131442         } catch (err) {
131443         }
131444     });
131445
131446     this.__defineGetter__("highBeam", function () {
131447         return lightStatus.highBeam;
131448     });
131449
131450     this.__defineSetter__("highBeam", function (val) {
131451         try {
131452             lightStatus.highBeam = t.boolean(val);
131453         } catch (err) {
131454         }
131455     });
131456 };
131457
131458 InteriorLightStatus = function (propertyTypes) {
131459     var interiorLightStatus = {};
131460
131461     VehiclePropertyType.call(this, propertyTypes);
131462
131463     interiorLightStatus.passenger = propertyTypes.passenger || false;
131464     interiorLightStatus.driver = propertyTypes.driver || false;
131465     interiorLightStatus.center = propertyTypes.center || false;
131466
131467     this.__defineGetter__("passenger", function () {
131468         return interiorLightStatus.passenger;
131469     });
131470
131471     this.__defineSetter__("passenger", function (val) {
131472         try {
131473             interiorLightStatus.passenger = t.boolean(val);
131474         } catch (err) {
131475         }
131476     });
131477
131478     this.__defineGetter__("driver", function () {
131479         return interiorLightStatus.driver;
131480     });
131481
131482     this.__defineSetter__("driver", function (val) {
131483         try {
131484             interiorLightStatus.driver = t.boolean(val);
131485         } catch (err) {
131486         }
131487     });
131488
131489     this.__defineGetter__("center", function () {
131490         return interiorLightStatus.center;
131491     });
131492
131493     this.__defineSetter__("center", function (val) {
131494         try {
131495             interiorLightStatus.center = t.boolean(val);
131496         } catch (err) {
131497         }
131498     });
131499 };
131500
131501 Horn = function (propertyTypes) {
131502     var horn = {};
131503
131504     VehiclePropertyType.call(this, propertyTypes);
131505
131506     horn.on = propertyTypes.on || false;
131507
131508     this.__defineGetter__("on", function () {
131509         return horn.on;
131510     });
131511
131512     this.__defineSetter__("on", function (val) {
131513         try {
131514             horn.on = t.boolean(val);
131515         } catch (err) {
131516         }
131517     });
131518 };
131519
131520 Fuel = function (propertyTypes) {
131521     var fuel = {};
131522
131523     VehiclePropertyType.call(this, propertyTypes);
131524
131525     fuel.level = propertyTypes.level || 0;
131526     fuel.range = propertyTypes.range || 0;
131527     fuel.instantConsumption = propertyTypes.instantConsumption || 0;
131528     fuel.instantEconomy = propertyTypes.instantEconomy || 0;
131529     fuel.averageEconomy = propertyTypes.averageEconomy || 0;
131530
131531     this.__defineGetter__("level", function () {
131532         return fuel.level;
131533     });
131534
131535     this.__defineSetter__("level", function (val) {
131536         try {
131537             fuel.level = t.unsigned_short(val);
131538         } catch (err) {
131539         }
131540     });
131541
131542     this.__defineGetter__("range", function () {
131543         return fuel.range;
131544     });
131545
131546     this.__defineSetter__("range", function (val) {
131547         try {
131548             fuel.range = t.unsigned_short(val);
131549         } catch (err) {
131550         }
131551     });
131552
131553     this.__defineGetter__("instantConsumption", function () {
131554         return fuel.instantConsumption;
131555     });
131556
131557     this.__defineSetter__("instantConsumption", function (val) {
131558         try {
131559             fuel.instantConsumption = t.unsigned_short(val);
131560         } catch (err) {
131561         }
131562     });
131563
131564     this.__defineGetter__("instantEconomy", function () {
131565         return fuel.instantEconomy;
131566     });
131567
131568     this.__defineSetter__("instantEconomy", function (val) {
131569         try {
131570             fuel.instantEconomy = t.unsigned_short(val);
131571         } catch (err) {
131572         }
131573     });
131574
131575     this.__defineGetter__("averageEconomy", function () {
131576         return fuel.averageEconomy;
131577     });
131578
131579     this.__defineSetter__("averageEconomy", function (val) {
131580         try {
131581             //Setting this to any value should reset the counter to '0'
131582             fuel.averageEconomy = t.unsigned_short(val);
131583         } catch (err) {
131584         }
131585     });
131586 };
131587
131588 EngineOil = function (propertyTypes) {
131589     var engineOil = {};
131590
131591     VehiclePropertyType.call(this, propertyTypes);
131592
131593     engineOil.remaining = propertyTypes.remaining || 0;
131594     engineOil.temperature = propertyTypes.temperature || 0;
131595     engineOil.pressure = propertyTypes.Pressure || 0;
131596
131597     this.__defineGetter__("remaining", function () {
131598         return engineOil.remaining;
131599     });
131600
131601     this.__defineSetter__("remaining", function (val) {
131602         try {
131603             engineOil.remaining = t.unsigned_short(val);
131604         } catch (err) {
131605         }
131606     });
131607
131608     this.__defineGetter__("temperature", function () {
131609         return engineOil.temperature;
131610     });
131611
131612     this.__defineSetter__("temperature", function (val) {
131613         try {
131614             engineOil.temperature = t.long(val);
131615         } catch (err) {
131616         }
131617     });
131618
131619     this.__defineGetter__("pressure", function () {
131620         return engineOil.pressure;
131621     });
131622
131623     this.__defineSetter__("pressure", function (val) {
131624         try {
131625             engineOil.pressure = t.unsigned_short(val);
131626         } catch (err) {
131627         }
131628     });
131629 };
131630
131631 Location = function (propertyTypes) {
131632     var location = {};
131633
131634     VehiclePropertyType.call(this, propertyTypes);
131635
131636     location.latitude = propertyTypes.latitude || 0;
131637     location.longitude = propertyTypes.longitude || 0;
131638     location.altitude = propertyTypes.altitude || 0;
131639     location.direction = propertyTypes.direction || 0;
131640
131641     this.__defineGetter__("latitude", function () {
131642         return location.latitude;
131643     });
131644
131645     this.__defineSetter__("latitude", function (val) {
131646         try {
131647             val = t.double(val);
131648             if (val >= -180 && val <= 180) {
131649                 location.latitude = val;
131650             }
131651         } catch (err) {
131652         }
131653     });
131654
131655     this.__defineGetter__("longitude", function () {
131656         return location.longitude;
131657     });
131658
131659     this.__defineSetter__("longitude", function (val) {
131660         try {
131661             val = t.double(val);
131662             if (val >= -90 && val <= 90) {
131663                 location.longitude = val;
131664             }
131665         } catch (err) {
131666         }
131667     });
131668
131669     this.__defineGetter__("altitude", function () {
131670         return location.altitude;
131671     });
131672
131673     this.__defineSetter__("altitude", function (val) {
131674         try {
131675             val = t.double(val);
131676             if (val >= 0) {
131677                 location.altitude = val;
131678             }
131679         } catch (err) {
131680         }
131681     });
131682
131683     this.__defineGetter__("direction", function () {
131684         return location.direction;
131685     });
131686
131687     this.__defineSetter__("direction", function (val) {
131688         try {
131689             val = t.unsigned_short(val);
131690             if (val >= 0 && val < 360) {
131691                 location.direction = val;
131692             }
131693         } catch (err) {
131694         }
131695     });
131696 };
131697
131698 ExteriorBrightness = function (propertyTypes) {
131699     var eb = {};
131700
131701     VehiclePropertyType.call(this, propertyTypes);
131702
131703     eb.exteriorBrightness = propertyTypes.exteriorBrightness || 0;
131704
131705     this.__defineGetter__("exteriorBrightness", function () {
131706         return eb.exteriorBrightness;
131707     });
131708
131709     this.__defineSetter__("exteriorBrightness", function (val) {
131710         try {
131711             eb.exteriorBrightness = t.unsigned_long(val);
131712         } catch (err) {
131713         }
131714     });
131715 };
131716
131717 Temperature = function (propertyTypes) {
131718     var temperature = {};
131719
131720     VehiclePropertyType.call(this, propertyTypes);
131721
131722     temperature.interior = propertyTypes.interior || 0;
131723     temperature.exterior = propertyTypes.exterior || 0;
131724
131725     this.__defineGetter__("interior", function () {
131726         return temperature.interior;
131727     });
131728
131729     this.__defineSetter__("interior", function (val) {
131730         try {
131731             temperature.interior = t.short(val);
131732         } catch (err) {
131733         }
131734     });
131735
131736     this.__defineGetter__("exterior", function () {
131737         return temperature.exterior;
131738     });
131739
131740     this.__defineSetter__("exterior", function (val) {
131741         try {
131742             temperature.exterior = t.short(val);
131743         } catch (err) {
131744         }
131745     });
131746 };
131747
131748 RainSensor = function (propertyTypes) {
131749     var rainSensor = {};
131750
131751     VehiclePropertyType.call(this, propertyTypes);
131752
131753     rainSensor.rainSensor = propertyTypes.rainSensor || 0;
131754
131755     this.__defineGetter__("rainSensor", function () {
131756         return rainSensor.rainSensor;
131757     });
131758
131759     this.__defineSetter__("rainSensor", function (val) {
131760         try {
131761             val = t.unsigned_short(val);
131762             if (val >= 0 && val <= 10) {
131763                 rainSensor.rainSensor = val;
131764             }
131765         } catch (err) {
131766         }
131767     });
131768 };
131769
131770 WindshieldWiper = function (propertyTypes) {
131771     var windshieldWiper = {};
131772
131773     VehiclePropertyType.call(this, propertyTypes);
131774
131775     windshieldWiper.windshieldWiper = propertyTypes.windshieldWiper || 0;
131776
131777     this.__defineGetter__("WIPERSPEED_OFF", function () {
131778         return 0;
131779     });
131780
131781     this.__defineGetter__("WIPERSPEED_SLOWEST", function () {
131782         return 1;
131783     });
131784
131785     this.__defineGetter__("WIPERSPEED_FASTEST", function () {
131786         return 5;
131787     });
131788
131789     this.__defineGetter__("WIPERSPEED_AUTO", function () {
131790         return 10;
131791     });
131792
131793     this.__defineGetter__("windshieldWiper", function () {
131794         return windshieldWiper.windshieldWiper;
131795     });
131796
131797     this.__defineSetter__("windshieldWiper", function (val) {
131798         try {
131799             val = t.unsigned_short(val);
131800             if (val === 0 || val === 1 || val === 5 || val === 10) {
131801                 windshieldWiper.windshieldWiper = val;
131802             }
131803         } catch (err) {
131804         }
131805     });
131806 };
131807
131808 HVAC = function (propertyTypes) {
131809     var hvac = {};
131810
131811     VehiclePropertyType.call(this, propertyTypes);
131812
131813     hvac.airflowDirection = propertyTypes.airflowDirection || 0;
131814     hvac.fanSpeed = propertyTypes.fanSpeed || 0;
131815     hvac.targetTemperature = propertyTypes.targetTemperature || 0;
131816     hvac.airConditioning = propertyTypes.airConditioning || false;
131817     hvac.airRecirculation = propertyTypes.airRecirculation || false;
131818     hvac.heater = propertyTypes.heater || false;
131819     hvac.steeringWheelHeater = propertyTypes.steeringWheelHeater || false;
131820     hvac.seatHeater = propertyTypes.seatHeater || false;
131821     hvac.seatCooler = propertyTypes.seatCooler || false;
131822
131823     this.__defineGetter__("AIRFLOWDIRECTION_FRONTPANEL", function () {
131824         return 0;
131825     });
131826
131827     this.__defineGetter__("AIRFLOWDIRECTION_FLOORDUCT", function () {
131828         return 1;
131829     });
131830
131831     this.__defineGetter__("AIRFLOWDIRECTION_FRONT", function () {
131832         return 0x02;
131833     });
131834
131835     this.__defineGetter__("AIRFLOWDIRECTION_DEFROSTER", function () {
131836         return 0x04;
131837     });
131838
131839     this.__defineGetter__("airflowDirection", function () {
131840         return hvac.airflowDirection;
131841     });
131842
131843     this.__defineSetter__("airflowDirection", function (val) {
131844         try {
131845             val = t.unsigned_short(val);
131846             if (val === 0 || val === 1 || val === 0x02 || val === 0x04) {
131847                 hvac.airflowDirection = val;
131848             }
131849         } catch (err) {
131850         }
131851     });
131852
131853     this.__defineGetter__("fanSpeed", function () {
131854         return hvac.fanSpeed;
131855     });
131856
131857     this.__defineSetter__("fanSpeed", function (val) {
131858         try {
131859             val = t.unsigned_short(val);
131860             if (val >= 0 && val <= 7) {
131861                 hvac.fanSpeed = val;
131862             }
131863         } catch (err) {
131864         }
131865     });
131866
131867     this.__defineGetter__("targetTemperature", function () {
131868         return hvac.targetTemperature;
131869     });
131870
131871     this.__defineSetter__("targetTemperature", function (val) {
131872         try {
131873             hvac.targetTemperature = t.unsigned_short(val);
131874         } catch (err) {
131875         }
131876     });
131877
131878     this.__defineGetter__("airConditioning", function () {
131879         return hvac.airConditioning;
131880     });
131881
131882     this.__defineSetter__("airConditioning", function (val) {
131883         try {
131884             hvac.airConditioning = t.boolean(val);
131885         } catch (err) {
131886         }
131887     });
131888
131889     this.__defineGetter__("airRecirculation", function () {
131890         return hvac.airRecirculation;
131891     });
131892
131893     this.__defineSetter__("airRecirculation", function (val) {
131894         try {
131895             hvac.airRecirculation = t.boolean(val);
131896         } catch (err) {
131897         }
131898     });
131899
131900     this.__defineGetter__("heater", function () {
131901         return hvac.heater;
131902     });
131903
131904     this.__defineSetter__("heater", function (val) {
131905         try {
131906             hvac.heater = t.boolean(val);
131907         } catch (err) {
131908         }
131909     });
131910
131911     this.__defineGetter__("steeringWheelHeater", function () {
131912         return hvac.steeringWheelHeater;
131913     });
131914
131915     this.__defineSetter__("steeringWheelHeater", function (val) {
131916         try {
131917             hvac.steeringWheelHeater = t.boolean(val);
131918         } catch (err) {
131919         }
131920     });
131921
131922     this.__defineGetter__("seatHeater", function () {
131923         return hvac.seatHeater;
131924     });
131925
131926     this.__defineSetter__("seatHeater", function (val) {
131927         try {
131928             hvac.seatHeater = t.boolean(val);
131929         } catch (err) {
131930         }
131931     });
131932
131933     this.__defineGetter__("seatCooler", function () {
131934         return hvac.seatCooler;
131935     });
131936
131937     this.__defineSetter__("seatCooler", function (val) {
131938         try {
131939             hvac.seatCooler = t.boolean(val);
131940         } catch (err) {
131941         }
131942     });
131943 };
131944
131945 WindowStatus = function (propertyTypes) {
131946     var windowStatus = {};
131947
131948     VehiclePropertyType.call(this, propertyTypes);
131949
131950     windowStatus.openness = propertyTypes.openness || 0;
131951     windowStatus.defrost = propertyTypes.defrost || false;
131952
131953     this.__defineGetter__("WINDOWLOCATION_DRIVER", function () {
131954         return 0;
131955     });
131956
131957     this.__defineGetter__("WINDOWLOCATION_PASSENGER", function () {
131958         return 1;
131959     });
131960
131961     this.__defineGetter__("WINDOWLOCATION_LEFTREAR", function () {
131962         return 2;
131963     });
131964
131965     this.__defineGetter__("WINDOWLOCATION_RIGHTREAR", function () {
131966         return 3;
131967     });
131968
131969     this.__defineGetter__("WINDOWLOCATION_REAR", function () {
131970         return 4;
131971     });
131972
131973     this.__defineGetter__("openness", function () {
131974         return windowStatus.openness;
131975     });
131976
131977     this.__defineSetter__("openness", function (val) {
131978         try {
131979             val = t.unsigned_short(val);
131980             if (val >= 0 && val <= 100) {
131981                 windowStatus.openness = val;
131982             }
131983         } catch (err) {
131984         }
131985     });
131986
131987     this.__defineGetter__("defrost", function () {
131988         return windowStatus.defrost;
131989     });
131990
131991     this.__defineSetter__("defrost", function (val) {
131992         try {
131993             windowStatus.defrost = t.boolean(val);
131994         } catch (err) {
131995         }
131996     });
131997 };
131998
131999 Sunroof = function (propertyTypes) {
132000     var sunroof = {};
132001
132002     VehiclePropertyType.call(this, propertyTypes);
132003
132004     sunroof.openness = propertyTypes.openness || 0;
132005     sunroof.tilt = propertyTypes.tilt || 0;
132006
132007     this.__defineGetter__("openness", function () {
132008         return sunroof.openness;
132009     });
132010
132011     this.__defineSetter__("openness", function (val) {
132012         try {
132013             sunroof.openness = t.unsigned_short(val);
132014         } catch (err) {
132015         }
132016     });
132017
132018     this.__defineGetter__("tilt", function () {
132019         return sunroof.tilt;
132020     });
132021
132022     this.__defineSetter__("tilt", function (val) {
132023         try {
132024             sunroof.tilt = t.unsigned_short(val);
132025         } catch (err) {
132026         }
132027     });
132028 };
132029
132030 ConvertibleRoof = function (propertyTypes) {
132031     var convertibleRoof = {};
132032
132033     VehiclePropertyType.call(this, propertyTypes);
132034
132035     convertibleRoof.openness = propertyTypes.openness || 0;
132036
132037     this.__defineGetter__("openness", function () {
132038         return convertibleRoof.openness;
132039     });
132040
132041     this.__defineSetter__("openness", function (val) {
132042         try {
132043             convertibleRoof.openness = t.unsigned_short(val);
132044         } catch (err) {
132045         }
132046     });
132047 };
132048
132049 VehicleId = function (propertyTypes) {
132050     var vehicleId = {};
132051
132052     VehiclePropertyType.call(this, propertyTypes);
132053
132054     vehicleId.WMI = propertyTypes.WMI || "";
132055     vehicleId.VIN = propertyTypes.VIN || "";
132056
132057     this.__defineGetter__("WMI", function () {
132058         return vehicleId.WMI;
132059     });
132060
132061     this.__defineSetter__("WMI", function (val) {
132062         try {
132063             //?
132064             vehicleId.WMI = t.DOMString(val);
132065         } catch (err) {
132066         }
132067     });
132068
132069     this.__defineGetter__("VIN", function () {
132070         return vehicleId.VIN;
132071     });
132072
132073     this.__defineSetter__("VIN", function (val) {
132074         try {
132075             //?
132076             vehicleId.VIN = t.DOMString(val);
132077         } catch (err) {
132078         }
132079     });
132080 };
132081
132082 Size = function (propertyTypes) {
132083     var size = {};
132084
132085     VehiclePropertyType.call(this, propertyTypes);
132086
132087     size.width = propertyTypes.width || 0;
132088     size.height = propertyTypes.height || 0;
132089     size.length = propertyTypes.length || 0;
132090
132091     this.__defineGetter__("width", function () {
132092         return size.width;
132093     });
132094
132095     this.__defineSetter__("width", function (val) {
132096         try {
132097             size.width = t.unsigned_long(val);
132098         } catch (err) {
132099         }
132100     });
132101
132102     this.__defineGetter__("height", function () {
132103         return size.height;
132104     });
132105
132106     this.__defineSetter__("height", function (val) {
132107         try {
132108             size.height = t.unsigned_long(val);
132109         } catch (err) {
132110         }
132111     });
132112
132113     this.__defineGetter__("length", function () {
132114         return size.length;
132115     });
132116
132117     this.__defineSetter__("length", function (val) {
132118         try {
132119             size.length = t.unsigned_long(val);
132120         } catch (err) {
132121         }
132122     });
132123 };
132124
132125 FuelInfo = function (propertyTypes) {
132126     var fuelInfo = {};
132127
132128     VehiclePropertyType.call(this, propertyTypes);
132129
132130     fuelInfo.type = propertyTypes.type || 0;
132131     fuelInfo.refuelPosition = propertyTypes.refuelPosition || 0;
132132
132133     this.__defineGetter__("FUELTYPE_GASOLINE", function () {
132134         return 0;
132135     });
132136
132137     this.__defineGetter__("FUELTYPE_HIGH_OCTANE", function () {
132138         return 1;
132139     });
132140
132141     this.__defineGetter__("FUELTYPE_DIESEL", function () {
132142         return 2;
132143     });
132144
132145     this.__defineGetter__("FUELTYPE_ELECTRIC", function () {
132146         return 3;
132147     });
132148
132149     this.__defineGetter__("FUELTYPE_HYDROGEN", function () {
132150         return 4;
132151     });
132152
132153     this.__defineGetter__("REFUELPOSITION_LEFT", function () {
132154         return 0;
132155     });
132156
132157     this.__defineGetter__("REFUELPOSITION_RIGHT", function () {
132158         return 1;
132159     });
132160
132161     this.__defineGetter__("REFUELPOSITION_FRONT", function () {
132162         return 2;
132163     });
132164
132165     this.__defineGetter__("REFUELPOSITION_REAR", function () {
132166         return 3;
132167     });
132168
132169     this.__defineGetter__("type", function () {
132170         return fuelInfo.type;
132171     });
132172
132173     this.__defineSetter__("type", function (val) {
132174         try {
132175             val = t.unsigned_short(val);
132176             if (val >= 0 && val <= 4) {
132177                 fuelInfo.type = val;
132178             }
132179         } catch (err) {
132180         }
132181     });
132182
132183     this.__defineGetter__("refuelPosition", function () {
132184         return fuelInfo.refuelPosition;
132185     });
132186
132187     this.__defineSetter__("refuelPosition", function (val) {
132188         try {
132189             val = t.unsigned_short(val);
132190             if (val >= 0 && val <= 3) {
132191                 fuelInfo.refuelPosition = val;
132192             }
132193         } catch (err) {
132194         }
132195     });
132196 };
132197
132198 VehicleType = function (propertyTypes) {
132199     var vehicleType = {};
132200
132201     VehiclePropertyType.call(this, propertyTypes);
132202
132203     vehicleType.type = propertyTypes.type || 0;
132204
132205     this.__defineGetter__("VEHICLETYPE_SEDAN", function () {
132206         return 0;
132207     });
132208
132209     this.__defineGetter__("VEHICLETYPE_COUPE", function () {
132210         return 1;
132211     });
132212
132213     this.__defineGetter__("VEHICLETYPE_CABRIOLE", function () {
132214         return 2;
132215     });
132216
132217     this.__defineGetter__("VEHICLETYPE_ROADSTER", function () {
132218         return 3;
132219     });
132220
132221     this.__defineGetter__("VEHICLETYPE_SUV", function () {
132222         return 4;
132223     });
132224
132225     this.__defineGetter__("VEHICLETYPE_TRUCK", function () {
132226         return 5;
132227     });
132228
132229     this.__defineGetter__("type", function () {
132230         return vehicleType.type;
132231     });
132232
132233     this.__defineSetter__("type", function (val) {
132234         try {
132235             val = t.unsigned_short(val);
132236             if (val >= 0 && val <= 5) {
132237                 vehicleType.type = val;
132238             }
132239         } catch (err) {
132240         }
132241     });
132242 };
132243
132244 Doors = function (propertyTypes) {
132245     var doors = {};
132246
132247     VehiclePropertyType.call(this, propertyTypes);
132248
132249     doors.doorsPerRow = propertyTypes.doorsPerRow || [];
132250
132251     this.__defineGetter__("doorsPerRow", function () {
132252         return doors.doorsPerRow;
132253     });
132254
132255     this.__defineSetter__("doorsPerRow", function (val) {
132256         try {
132257             doors.doorsPerRow = t.unsigned_short(val, "[]");
132258         } catch (err) {
132259         }
132260     });
132261 };
132262
132263 TransmissionGearType = function (propertyTypes) {
132264     var trans = {};
132265
132266     VehiclePropertyType.call(this, propertyTypes);
132267
132268     trans.transmissionGearType = propertyTypes.transmissionGearType || 0;
132269
132270     this.__defineGetter__("TRANSMISSIONGEARTYPE_AUTO", function () {
132271         return 0;
132272     });
132273
132274     this.__defineGetter__("TRANSMISSIONGEARTYPE_MANUAL", function () {
132275         return 1;
132276     });
132277
132278     this.__defineGetter__("TRANSMISSIONGEARTYPE_CV", function () {
132279         return 2;
132280     });
132281
132282     this.__defineGetter__("transmissionGearType", function () {
132283         return trans.transmissionGearType;
132284     });
132285
132286     this.__defineSetter__("transmissionGearType", function (val) {
132287         try {
132288             val = t.unsigned_short(val);
132289             if (val >= 0 && val <= 2) {
132290                 trans.transmissionGearType = val;
132291             }
132292         } catch (err) {
132293         }
132294     });
132295 };
132296
132297 WheelInformation = function (propertyTypes) {
132298     var wheelInfo = {};
132299
132300     VehiclePropertyType.call(this, propertyTypes);
132301
132302     wheelInfo.frontWheelRadius = propertyTypes.frontWheelRadius || 0;
132303     wheelInfo.rearWheelRadius = propertyTypes.rearWheelRadius || 0;
132304     wheelInfo.wheelTrack = propertyTypes.wheelTrack || 0;
132305     wheelInfo.ABS = propertyTypes.ABS || false;
132306
132307     this.__defineGetter__("frontWheelRadius", function () {
132308         return wheelInfo.frontWheelRadius;
132309     });
132310
132311     this.__defineSetter__("frontWheelRadius", function (val) {
132312         try {
132313             wheelInfo.frontWheelRadius =t.unsigned_short(val);
132314         } catch (err) {
132315         }
132316     });
132317
132318     this.__defineGetter__("rearWheelRadius", function () {
132319         return wheelInfo.rearWheelRadius;
132320     });
132321
132322     this.__defineSetter__("rearWheelRadius", function (val) {
132323         try {
132324             wheelInfo.rearWheelRadius =t.unsigned_short(val);
132325         } catch (err) {
132326         }
132327     });
132328
132329     this.__defineGetter__("wheelTrack", function () {
132330         return wheelInfo.wheelTrack;
132331     });
132332
132333     this.__defineSetter__("wheelTrack", function (val) {
132334         try {
132335             wheelInfo.wheelTrack =t.unsigned_long(val);
132336         } catch (err) {
132337         }
132338     });
132339
132340     this.__defineGetter__("ABS", function () {
132341         return wheelInfo.ABS;
132342     });
132343
132344     this.__defineSetter__("ABS", function (val) {
132345         try {
132346             wheelInfo.ABS =t.boolean(val);
132347         } catch (err) {
132348         }
132349     });
132350 };
132351
132352 Odometer = function (propertyTypes) {
132353     var odm = {};
132354
132355     VehiclePropertyType.call(this, propertyTypes);
132356
132357     odm.odometer = propertyTypes.odometer || 0;
132358
132359     this.__defineGetter__("odometer", function () {
132360         return odm.odometer;
132361     });
132362
132363     this.__defineSetter__("odometer", function (val) {
132364         try {
132365             odm.odometer = t.unsigned_long(val);
132366         } catch (err) {
132367         }
132368     });
132369 };
132370
132371 Fluid = function (propertyTypes) {
132372     var fluid = {};
132373
132374     VehiclePropertyType.call(this, propertyTypes);
132375
132376     fluid.transmission = propertyTypes.transmission || 0;
132377     fluid.brake = propertyTypes.brake || 0;
132378     fluid.washer = propertyTypes.washer || 0;
132379
132380     this.__defineGetter__("transmission", function () {
132381         return fluid.transmission;
132382     });
132383
132384     this.__defineSetter__("transmission", function (val) {
132385         try {
132386             val = t.unsigned_short(val);
132387             if (val >= 0 && val <= 100) {
132388                 fluid.transmission = val;
132389             }
132390         } catch (err) {
132391         }
132392     });
132393
132394     this.__defineGetter__("brake", function () {
132395         return fluid.brake;
132396     });
132397
132398     this.__defineSetter__("brake", function (val) {
132399         try {
132400             val = t.unsigned_short(val);
132401             if (val >= 0 && val <= 100) {
132402                 fluid.brake = val;
132403             }
132404         } catch (err) {
132405         }
132406     });
132407
132408     this.__defineGetter__("washer", function () {
132409         return fluid.washer;
132410     });
132411
132412     this.__defineSetter__("washer", function (val) {
132413         try {
132414             val = t.unsigned_short(val);
132415             if (val >= 0 && val <= 100) {
132416                 fluid.washer = val;
132417             }
132418         } catch (err) {
132419         }
132420     });
132421 };
132422
132423 Battery = function (propertyTypes) {
132424     var battery = {};
132425
132426     VehiclePropertyType.call(this, propertyTypes);
132427
132428     battery.voltage = propertyTypes.voltage || 0;
132429     battery.current = propertyTypes.current || 0;
132430
132431     this.__defineGetter__("voltage", function () {
132432         return battery.voltage;
132433     });
132434
132435     this.__defineSetter__("voltage", function (val) {
132436         try {
132437             battery.voltage = t.double(val);
132438         } catch (err) {
132439         }
132440     });
132441
132442     this.__defineGetter__("current", function () {
132443         return battery.current;
132444     });
132445
132446     this.__defineSetter__("current", function (val) {
132447         try {
132448             battery.current = t.double(val);
132449         } catch (err) {
132450         }
132451     });
132452 };
132453
132454 TirePressure = function (propertyTypes) {
132455     var tirePressure = {};
132456
132457     VehiclePropertyType.call(this, propertyTypes);
132458
132459     tirePressure.leftFront = propertyTypes.leftFront || 0;
132460     tirePressure.rightFront = propertyTypes.rightFront || 0;
132461     tirePressure.leftRear = propertyTypes.leftRear || 0;
132462     tirePressure.rightRear = propertyTypes.rightRear || 0;
132463
132464     this.__defineGetter__("leftFront", function () {
132465         return tirePressure.leftFront;
132466     });
132467
132468     this.__defineSetter__("leftFront", function (val) {
132469         try {
132470             tirePressure.leftFront = t.double(val);
132471         } catch (err) {
132472         }
132473     });
132474
132475     this.__defineGetter__("rightFront", function () {
132476         return tirePressure.rightFront;
132477     });
132478
132479     this.__defineSetter__("rightFront", function (val) {
132480         try {
132481             tirePressure.rightFront = t.double(val);
132482         } catch (err) {
132483         }
132484     });
132485
132486     this.__defineGetter__("leftRear", function () {
132487         return tirePressure.leftRear;
132488     });
132489
132490     this.__defineSetter__("leftRear", function (val) {
132491         try {
132492             tirePressure.leftRear = t.double(val);
132493         } catch (err) {
132494         }
132495     });
132496
132497     this.__defineGetter__("rightRear", function () {
132498         return tirePressure.rightRear;
132499     });
132500
132501     this.__defineSetter__("rightRear", function (val) {
132502         try {
132503             tirePressure.rightRear = t.double(val);
132504         } catch (err) {
132505         }
132506     });
132507 };
132508
132509 TireTemperature = function (propertyTypes) {
132510     var tireTemperature = {};
132511
132512     VehiclePropertyType.call(this, propertyTypes);
132513
132514     tireTemperature.leftFront = propertyTypes.leftFront || 0;
132515     tireTemperature.rightFront = propertyTypes.rightFront || 0;
132516     tireTemperature.leftRear = propertyTypes.leftRear || 0;
132517     tireTemperature.rightRear = propertyTypes.rightRear || 0;
132518
132519     this.__defineGetter__("leftFront", function () {
132520         return tireTemperature.leftFront;
132521     });
132522
132523     this.__defineSetter__("leftFront", function (val) {
132524         try {
132525             tireTemperature.leftFront = t.double(val);
132526         } catch (err) {
132527         }
132528     });
132529
132530     this.__defineGetter__("rightFront", function () {
132531         return tireTemperature.rightFront;
132532     });
132533
132534     this.__defineSetter__("rightFront", function (val) {
132535         try {
132536             tireTemperature.rightFront = t.double(val);
132537         } catch (err) {
132538         }
132539     });
132540
132541     this.__defineGetter__("leftRear", function () {
132542         return tireTemperature.leftRear;
132543     });
132544
132545     this.__defineSetter__("leftRear", function (val) {
132546         try {
132547             tireTemperature.leftRear = t.double(val);
132548         } catch (err) {
132549         }
132550     });
132551
132552     this.__defineGetter__("rightRear", function () {
132553         return tireTemperature.rightRear;
132554     });
132555
132556     this.__defineSetter__("rightRear", function (val) {
132557         try {
132558             tireTemperature.rightRear = t.double(val);
132559         } catch (err) {
132560         }
132561     });
132562 };
132563
132564 SecurityAlert = function (propertyTypes) {
132565     var securityAlert = {};
132566
132567     VehiclePropertyType.call(this, propertyTypes);
132568
132569     securityAlert.securityAlert = propertyTypes.securityAlert || false;
132570
132571     this.__defineGetter__("securityAlert", function () {
132572         return securityAlert.securityAlert;
132573     });
132574
132575     this.__defineSetter__("securityAlert", function (val) {
132576         try {
132577             securityAlert.securityAlert = t.boolean(val);
132578         } catch (err) {
132579         }
132580     });
132581 };
132582
132583 ParkingBrake = function (propertyTypes) {
132584     var parkingBrake = {};
132585
132586     VehiclePropertyType.call(this, propertyTypes);
132587
132588     parkingBrake.parkingBrake = propertyTypes.parkingBrake || false;
132589
132590     this.__defineGetter__("parkingBrake", function () {
132591         return parkingBrake.parkingBrake;
132592     });
132593
132594     this.__defineSetter__("parkingBrake", function (val) {
132595         try {
132596             parkingBrake.parkingBrake = t.boolean(val);
132597         } catch (err) {
132598         }
132599     });
132600 };
132601
132602 ParkingLight = function (propertyTypes) {
132603     var parkingLight = {};
132604
132605     VehiclePropertyType.call(this, propertyTypes);
132606
132607     parkingLight.parkingLight = propertyTypes.parkingLight || false;
132608
132609     this.__defineGetter__("parkingLight", function () {
132610         return parkingLight.parkingLight;
132611     });
132612
132613     this.__defineSetter__("parkingLight", function (val) {
132614         try {
132615             parkingLight.parkingLight = t.boolean(val);
132616         } catch (err) {
132617         }
132618     });
132619 };
132620
132621 HazardLight = function (propertyTypes) {
132622     var hazardLight = {};
132623
132624     VehiclePropertyType.call(this, propertyTypes);
132625
132626     hazardLight.hazardLight = propertyTypes.hazardLight || false;
132627
132628     this.__defineGetter__("hazardLight", function () {
132629         return hazardLight.hazardLight;
132630     });
132631
132632     this.__defineSetter__("hazardLight", function (val) {
132633         try {
132634             hazardLight.hazardLight = t.boolean(val);
132635         } catch (err) {
132636         }
132637     });
132638 };
132639
132640 AntilockBrakingSystem = function (propertyTypes) {
132641     var abs = {};
132642
132643     VehiclePropertyType.call(this, propertyTypes);
132644
132645     abs.antilockBrakingSystem = propertyTypes.antilockBrakingSystem || false;
132646
132647     this.__defineGetter__("antilockBrakingSystem", function () {
132648         return abs.antilockBrakingSystem;
132649     });
132650
132651     this.__defineSetter__("antilockBrakingSystem", function (val) {
132652         try {
132653             abs.antilockBrakingSystem = t.boolean(val);
132654         } catch (err) {
132655         }
132656     });
132657 };
132658
132659 TractionControlSystem = function (propertyTypes) {
132660     var tcs = {};
132661
132662     VehiclePropertyType.call(this, propertyTypes);
132663
132664     tcs.tractionControlSystem = propertyTypes.tractionControlSystem || false;
132665
132666     this.__defineGetter__("tractionControlSystem", function () {
132667         return tcs.tractionControlSystem;
132668     });
132669
132670     this.__defineSetter__("tractionControlSystem", function (val) {
132671         try {
132672             tcs.tractionControlSystem = t.boolean(val);
132673         } catch (err) {
132674         }
132675     });
132676 };
132677
132678 VehicleTopSpeedLimit = function (propertyTypes) {
132679     var vtl = {};
132680
132681     VehiclePropertyType.call(this, propertyTypes);
132682
132683     vtl.vehicleTopSpeedLimit = propertyTypes.vehicleTopSpeedLimit || false;
132684
132685     this.__defineGetter__("vehicleTopSpeedLimit", function () {
132686         return vtl.vehicleTopSpeedLimit;
132687     });
132688
132689     this.__defineSetter__("vehicleTopSpeedLimit", function (val) {
132690         try {
132691             vtl.vehicleTopSpeedLimit = t.unsigned_short(val);
132692         } catch (err) {
132693         }
132694     });
132695 };
132696
132697 AirbagStatus = function (propertyTypes) {
132698     var airbagStatus = {};
132699
132700     VehiclePropertyType.call(this, propertyTypes);
132701
132702     airbagStatus.airbagStatus = propertyTypes.airbagStatus || 0;
132703
132704     this.__defineGetter__("AIRBAGSTATUS_INACTIVE", function () {
132705         return 0;
132706     });
132707
132708     this.__defineGetter__("AIRBAGSTATUS_ACTIVE", function () {
132709         return 1;
132710     });
132711
132712     this.__defineGetter__("AIRBAGSTATUS_DEPLOYED", function () {
132713         return 2;
132714     });
132715
132716     this.__defineGetter__("airbagStatus", function () {
132717         return airbagStatus.airbagStatus;
132718     });
132719
132720     this.__defineSetter__("airbagStatus", function (val) {
132721         try {
132722             val = t.unsigned_short(val);
132723             if (val === 0 || val === 1 || val === 2) {
132724                 airbagStatus.airbagStatus = val;
132725             }
132726         } catch (err) {
132727         }
132728     });
132729 };
132730
132731 DoorStatus = function (propertyTypes) {
132732     var doorStatus = {};
132733
132734     VehiclePropertyType.call(this, propertyTypes);
132735
132736     doorStatus.doorStatus = propertyTypes.doorStatus || 0;
132737     doorStatus.doorLockStatus = propertyTypes.doorLockStatus || false;
132738     doorStatus.childLockStatus = propertyTypes.childLockStatus || false;
132739
132740     this.__defineGetter__("DOORSTATUS_CLOSED", function () {
132741         return 0;
132742     });
132743
132744     this.__defineGetter__("DOORSTATUS_OPEN", function () {
132745         return 1;
132746     });
132747
132748     this.__defineGetter__("DOORSTATUS_AJAR", function () {
132749         return 2;
132750     });
132751
132752     this.__defineGetter__("doorStatus", function () {
132753         return doorStatus.doorStatus;
132754     });
132755
132756     this.__defineSetter__("doorStatus", function (val) {
132757         try {
132758             val = t.unsigned_short(val);
132759             if (val === 0 || val === 1 || val === 2) {
132760                 doorStatus.doorStatus = val;
132761             }
132762         } catch (err) {
132763         }
132764     });
132765
132766     this.__defineGetter__("doorLockStatus", function () {
132767         return doorStatus.doorLockStatus;
132768     });
132769
132770     this.__defineSetter__("doorLockStatus", function (val) {
132771         try {
132772             doorStatus.doorLockStatus = t.boolean(val);
132773         } catch (err) {
132774         }
132775     });
132776
132777     this.__defineGetter__("childLockStatus", function () {
132778         return doorStatus.childLockStatus;
132779     });
132780
132781     this.__defineSetter__("childLockStatus", function (val) {
132782         try {
132783             doorStatus.childLockStatus = t.boolean(val);
132784         } catch (err) {
132785         }
132786     });
132787 };
132788
132789 SeatBeltStatus = function (propertyTypes) {
132790     var seatBeltStatus = {};
132791
132792     VehiclePropertyType.call(this, propertyTypes);
132793
132794     seatBeltStatus.seatBeltStatus = propertyTypes.seatBeltStatus || false;
132795
132796     this.__defineGetter__("seatBeltStatus", function () {
132797         return seatBeltStatus.seatBeltStatus;
132798     });
132799
132800     this.__defineSetter__("seatBeltStatus", function (val) {
132801         try {
132802             seatBeltStatus.seatBeltStatus = t.boolean(val);
132803         } catch (err) {
132804         }
132805     });
132806 };
132807
132808 OccupantStatus = function (propertyTypes) {
132809     var occupantStatus = {};
132810
132811     VehiclePropertyType.call(this, propertyTypes);
132812
132813     occupantStatus.occupantStatus = propertyTypes.occupantStatus || 0;
132814
132815     this.__defineGetter__("OCCUPANTSTATUS_VACANT", function () {
132816         return 0;
132817     });
132818
132819     this.__defineGetter__("OCCUPANTSTATUS_CHILD", function () {
132820         return 1;
132821     });
132822
132823     this.__defineGetter__("OCCUPANTSTATUS_ADULT", function () {
132824         return 2;
132825     });
132826
132827     this.__defineGetter__("occupantStatus", function () {
132828         return occupantStatus.occupantStatus;
132829     });
132830
132831     this.__defineSetter__("occupantStatus", function (val) {
132832         try {
132833             val = t.unsigned_short(val);
132834             if (val === 0 || val === 1 || val === 2) {
132835                 occupantStatus.occupantStatus = val;
132836             }
132837         } catch (err) {
132838         }
132839     });
132840 };
132841
132842 ObstacleDistance = function (propertyTypes) {
132843     var obstacleDistance = {};
132844
132845     VehiclePropertyType.call(this, propertyTypes);
132846
132847     obstacleDistance.obstacleDistance = propertyTypes.obstacleDistance || 0;
132848
132849     this.__defineGetter__("DISTANCESENSORLOCATION_LEFTFRONT", function () {
132850         return 0;
132851     });
132852
132853     this.__defineGetter__("DISTANCESENSORLOCATION_RIGHTFRONT", function () {
132854         return 1;
132855     });
132856
132857     this.__defineGetter__("DISTANCESENSORLOCATION_LEFTREAR", function () {
132858         return 2;
132859     });
132860
132861     this.__defineGetter__("DISTANCESENSORLOCATION_RIGHTREAR", function () {
132862         return 3;
132863     });
132864
132865     this.__defineGetter__("DISTANCESENSORLOCATION_LEFTBLINDSPOT",
132866             function () {
132867         return 4;
132868     });
132869
132870     this.__defineGetter__("DISTANCESENSORLOCATION_RIGHTBLINDSPOT",
132871             function () {
132872         return 5;
132873     });
132874
132875     this.__defineGetter__("obstacleDistance", function () {
132876         return obstacleDistance.obstacleDistance;
132877     });
132878
132879     this.__defineSetter__("obstacleDistance", function (val) {
132880         try {
132881             obstacleDistance.obstacleDistance = t.double(val);
132882         } catch (err) {
132883         }
132884     });
132885 };
132886
132887 NightMode = function (propertyTypes) {
132888     var nightMode = {};
132889
132890     VehiclePropertyType.call(this, propertyTypes);
132891
132892     nightMode.nightMode = propertyTypes.nightMode || false;
132893
132894     this.__defineGetter__("nightMode", function () {
132895         return nightMode.nightMode;
132896     });
132897
132898     this.__defineSetter__("nightMode", function (val) {
132899         try {
132900             nightMode.nightMode = t.boolean(val);
132901         } catch (err) {
132902         }
132903     });
132904 };
132905
132906 DrivingMode = function (propertyTypes) {
132907     var drivingMode = {};
132908
132909     VehiclePropertyType.call(this, propertyTypes);
132910
132911     drivingMode.drivingMode = propertyTypes.drivingMode || 0;
132912
132913     this.__defineGetter__("drivingMode", function () {
132914         return drivingMode.drivingMode;
132915     });
132916
132917     this.__defineSetter__("drivingMode", function (val) {
132918         try {
132919             val = t.unsigned_short(val);
132920             if (val === 0 || val === 1) {
132921                 drivingMode.drivingMode = val;
132922             }
132923         } catch (err) {
132924         }
132925     });
132926 };
132927
132928 TurnSignal = function (propertyTypes) {
132929     var turnSignal = {};
132930
132931     VehiclePropertyType.call(this, propertyTypes);
132932
132933     turnSignal.turnSignal = propertyTypes.turnSignal || 0;
132934
132935     this.__defineGetter__("turnSignal", function () {
132936         return turnSignal.turnSignal;
132937     });
132938
132939     this.__defineSetter__("turnSignal", function (val) {
132940         try {
132941             turnSignal.turnSignal = t.unsigned_short(val);
132942         } catch (err) {
132943         }
132944     });
132945 };
132946
132947 ButtonEvent = function (propertyTypes) {
132948     var buttonEvent = {};
132949
132950     VehiclePropertyType.call(this, propertyTypes);
132951
132952     buttonEvent.buttonEvent = propertyTypes.buttonEvent || 0;
132953
132954     this.__defineGetter__("buttonEvent", function () {
132955         return buttonEvent.buttonEvent;
132956     });
132957
132958     this.__defineSetter__("buttonEvent", function (val) {
132959         try {
132960             buttonEvent.buttonEvent = t.unsigned_short(val);
132961         } catch (err) {
132962         }
132963     });
132964 };
132965
132966 _initialize();
132967
132968 module.exports = _self;
132969
132970 });
132971 define('ripple/platform/ivi/3.0/mediaserver', function (require, exports, module) {
132972 /*
132973  *  Copyright 2014 Intel Corporation.
132974  *
132975  * Licensed under the Apache License, Version 2.0 (the "License");
132976  * you may not use this file except in compliance with the License.
132977  * You may obtain a copy of the License at
132978  *
132979  * http://www.apache.org/licenses/LICENSE-2.0
132980  *
132981  * Unless required by applicable law or agreed to in writing, software
132982  * distributed under the License is distributed on an "AS IS" BASIS,
132983  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132984  * See the License for the specific language governing permissions and
132985  * limitations under the License.
132986  */
132987
132988 var dbinit = require('ripple/platform/ivi/3.0/dbinit'),
132989     ivi_utils = require('ripple/platform/ivi/3.0/ivi_utils'),
132990     t = require('ripple/platform/ivi/3.0/typecast'),
132991     errorcode = require('ripple/platform/ivi/3.0/errorcode'),
132992     WebAPIError = require('ripple/platform/ivi/3.0/WebAPIError'),
132993     WebAPIException = require('ripple/platform/ivi/3.0/WebAPIException'),
132994     MediaFactory,
132995     MediaObject,
132996     MediaContainer,
132997     MediaItem,
132998     MediaVideo,
132999     MediaAudio,
133000     MediaImage,
133001     MediaServer,
133002     _security = {
133003         "http://tizen.org/privilege/mediaserver": []
133004     },
133005     _data = {
133006         root: "",
133007         mediaServer: {}
133008     },
133009     _self;
133010
133011 function _initialize() {
133012     var db = dbinit.MediaServer,
133013         server = db.server,
133014         containers = db.containers,
133015         items = db.items,
133016         i;
133017
133018     for (i = 0; i < containers.length; i++) {
133019         if (containers[i].Path === "/") {
133020             server.root = new MediaContainer(containers[i]);
133021             break;
133022         }
133023     }
133024
133025     _data.root = _setRoot();
133026
133027     for (i = 0; i < items.length; i++) {
133028         items[i].URLs = [_data.root + items[i].Path];
133029         items[i].ThumbnailURIs = _data.root + items[i].Path;
133030     }
133031
133032     _data.mediaServer.server = server;
133033     _data.mediaServer.containers = containers;
133034     _data.mediaServer.items = items;
133035 }
133036
133037 function _setRoot() {
133038     return location.pathname.replace("ripple.html", "resources/media");
133039 }
133040
133041 function _formatSortMode(sortMode) {
133042     var order, attributeName,
133043         attributes = ["Type", "Path", "DisplayName", "URLs", "ThumbnailURIs",
133044                 "MIMEType", "Rating", "Size", "Duration", "Album", "Genre",
133045                 "Artists", "Width", "Height", "SampleRate"];
133046
133047     order = sortMode.match(/[+|-]/g);
133048     if (order.length > 1) {
133049         return null;
133050     }
133051
133052     attributeName = sortMode.match(/[A-Za-z]+/)[0];
133053     if (attributes.indexOf(attributeName) === -1) {
133054         return null;
133055     }
133056
133057     return {
133058         order: (order[0] === "-") ? "DESC" : "ASC",
133059         attributeName: attributeName
133060     };
133061 }
133062
133063 function _replacedQuoteSpace(filter) {
133064     var match = filter.match(/\"([a-z0-9A-Z]+)(\s+)([a-z0-9A-Z]+)\"/g);
133065
133066     for (var i = 0; match && i < match.length; i++) {
133067         filter = filter.replace(match[i], match[i].replace(/\s+/g, "__"));
133068     }
133069
133070     return filter.replace(/\"/g, "");
133071 }
133072
133073 function _goFiltering(filter, items) {
133074     var str = _replacedQuoteSpace(filter),
133075         keyArray, tempArray, tempItems = [], results = [],
133076         cells = [], conditions = [], property, condition, value, i, p;
133077
133078     keyArray = str.split(/\s+/);
133079
133080     if ((keyArray.length + 1) % 4 !== 0) {
133081         return null;
133082     }
133083
133084     while (keyArray.length > 0) {
133085         property = keyArray.shift();
133086         condition = keyArray.shift();
133087         value = keyArray.shift().replace("__", "");
133088         tempArray = [property, condition, value];
133089
133090         if ((keyArray.indexOf("and") === 0) ||
133091                 (keyArray.indexOf("or") === 0)) {
133092             conditions.push(keyArray.shift());
133093         }
133094
133095         switch (condition) {
133096         case "contains":
133097             for (i = 0; i < items.length; i++) {
133098                 if (items[i][property].indexOf(value) > -1) {
133099                     tempItems.push(items[i].Path);
133100                 }
133101             }
133102             break;
133103
133104         case "doesNotContain":
133105             for (i = 0; i < items.length; i++) {
133106                 if (items[i][property].indexOf(value) === -1) {
133107                     tempItems.push(items[i].Path);
133108                 }
133109             }
133110             break;
133111
133112         case "exists":
133113             for (i = 0; i < items.length; i++) {
133114                 if ((tempArray[2] === "true") ||
133115                     (tempArray[2] === true)) {
133116                     if (items[i][tempArray[0]]) {
133117                         tempItems.push(items[i].Path);
133118                     }
133119                 } else if ((tempArray[2] === "false") ||
133120                     (tempArray[2] === false)) {
133121                     if (!items[i][tempArray[0]]) {
133122                         tempItems.push(items[i].Path);
133123                     }
133124                 }
133125             }
133126             break;
133127
133128         case "=":
133129             for (i = 0; i < items.length; i++) {
133130                 if (items[i][property] === value) {
133131                     tempItems.push(items[i].Path);
133132                 }
133133             }
133134             break;
133135
133136         case "!=":
133137             for (i = 0; i < items.length; i++) {
133138                 if (items[i][property] !== value) {
133139                     tempItems.push(items[i].Path);
133140                 }
133141             }
133142             break;
133143
133144         case "<":
133145             for (i = 0; i < items.length; i++) {
133146                 if (items[i][property] < value) {
133147                     tempItems.push(items[i].Path);
133148                 }
133149             }
133150             break;
133151
133152         case "<=":
133153             for (i = 0; i < items.length; i++) {
133154                 if (items[i][property] <= value) {
133155                     tempItems.push(items[i].Path);
133156                 }
133157             }
133158             break;
133159
133160         case ">":
133161             for (i = 0; i < items.length; i++) {
133162                 if (items[i][property] > value) {
133163                     tempItems.push(items[i].Path);
133164                 }
133165             }
133166             break;
133167
133168         case ">=":
133169             for (i = 0; i < items.length; i++) {
133170                 if (items[i][property] >= value) {
133171                     tempItems.push(items[i].Path);
133172                 }
133173             }
133174             break;
133175
133176         default:
133177             return null;
133178         }
133179
133180         cells.push(ivi_utils.copy(tempItems));
133181         tempArray.length = 0;
133182         tempItems.length = 0;
133183     }
133184
133185     while (true) {
133186         p = conditions.indexOf("and");
133187         if (p === -1)
133188             break;
133189         for (i = 0; i < cells[p + 1].length; i++) {
133190             if (cells[p].indexOf(cells[p + 1][i]) > -1) {
133191                 results.push(cells[p + 1][i]);
133192             }
133193         }
133194
133195         conditions.shift();
133196         cells.shift();
133197         cells.splice(0, 1, ivi_utils.copy(results));
133198         results.length = 0;
133199     }
133200
133201     while (true) {
133202         p = conditions.indexOf("or");
133203         if (p === -1)
133204             break;
133205         results = [].concat(cells[p]);
133206         for (i = 0; i < cells[p + 1].length; i++) {
133207             if (cells[p].indexOf(cells[p + 1][i]) === -1) {
133208                 results.push(cells[p + 1][i]);
133209             }
133210         }
133211
133212         conditions.shift();
133213         cells.shift();
133214         cells.splice(0, 1, ivi_utils.copy(results));
133215         results.length = 0;
133216     }
133217
133218     return cells[0];
133219 }
133220
133221 function _filter(searchFilter, items) {
133222     var pp = [], index = 0, lpIndex, rpIndex, temp, i, results = [];
133223
133224     searchFilter = searchFilter.trim();
133225     if (searchFilter === "*") {
133226         return items;
133227     }
133228
133229     lpIndex = searchFilter.indexOf("(", index);
133230     if (lpIndex > -1) {
133231         pp.push(lpIndex);
133232         index = lpIndex;
133233
133234         while (++index < searchFilter.length) {
133235             lpIndex = searchFilter.indexOf("(", index);
133236             rpIndex = searchFilter.indexOf(")", index);
133237             if ((lpIndex < rpIndex) && (lpIndex > -1)) {
133238                 pp.push(lpIndex);
133239                 index = lpIndex + 1;
133240             } else if ((lpIndex < rpIndex) && (lpIndex === -1)) {
133241                 lpIndex = pp.pop();
133242                 index = rpIndex + 1;
133243                 temp = searchFilter.substring(lpIndex + 1, rpIndex);
133244                 results = results.concat(_goFiltering(temp, items));
133245                 break;
133246             } else if (lpIndex > rpIndex) {
133247                 lpIndex = pp.pop();
133248                 index = rpIndex + 1;
133249                 temp = searchFilter.substring(lpIndex + 1, rpIndex);
133250                 results = results.concat(_goFiltering(temp, items));
133251             } else {
133252                 break;
133253             }
133254         }
133255     } else {
133256         temp = searchFilter;
133257         results = _goFiltering(temp, items);
133258     }
133259
133260     if (results === null) return null;
133261     if (results.length === 0) return [];
133262
133263     for (i = 0; i < items.length; i++) {
133264         if (results.indexOf(items[i].Path) === -1) {
133265             items.splice(i, 1);
133266             i--;
133267         }
133268     }
133269
133270     return items;
133271 }
133272
133273 _self = function () {
133274     var mediaserver;
133275
133276     function scanNetwork(successCallback, errorCallback) {
133277         t.MediaServerManager("scanNetwork", arguments);
133278
133279         window.setTimeout(function () {
133280             if (!_data.mediaServer.server) {
133281                 if (errorCallback) {
133282                     errorCallback(new WebAPIError(errorcode.UNKNOWN));
133283                 }
133284                 return;
133285             }
133286
133287             successCallback(new MediaServer(_data.mediaServer.server));
133288         }, 1);
133289     }
133290
133291     function handleSubFeatures(subFeatures) {
133292         var i, subFeature;
133293
133294         for (subFeature in subFeatures) {
133295             for (i in _security[subFeature]) {
133296                 _security[_security[subFeature][i]] = true;
133297             }
133298         }
133299     }
133300
133301     mediaserver = {
133302         scanNetwork: scanNetwork,
133303         handleSubFeatures: handleSubFeatures
133304     };
133305
133306     return mediaserver;
133307 };
133308
133309 MediaServer = function (obj) {
133310     var mediaServer = {};
133311
133312     mediaServer.id = obj.id || "";
133313     mediaServer.friendlyName = obj.friendlyName || "";
133314     mediaServer.manufacturer = obj.manufacturer || "";
133315     mediaServer.manufacturerURL = obj.manufacturerURL || "";
133316     mediaServer.modelDescription = obj.modelDescription || "";
133317     mediaServer.modelName = obj.modelName || "";
133318     mediaServer.modelNumber = obj.modelNumber || "";
133319     mediaServer.serialNumber = obj.serialNumber || "";
133320     mediaServer.UDN = obj.UDN || "";
133321     mediaServer.presentationURL = obj.presentationURL || "";
133322     mediaServer.iconURL = obj.iconURL || "";
133323     mediaServer.deviceType = obj.deviceType || "";
133324     mediaServer.root = obj.root || null;
133325     mediaServer.canCreateContainer = obj.canCreateContainer || false;
133326     mediaServer.canUpload = obj.canUpload || false;
133327     mediaServer.searchAttrs = obj.searchAttrs || [];
133328     mediaServer.sortAttrs = obj.sortAttrs || [];
133329
133330     this.__defineGetter__("id", function () {
133331         return mediaServer.id;
133332     });
133333
133334     this.__defineGetter__("friendlyName", function () {
133335         return mediaServer.friendlyName;
133336     });
133337
133338     this.__defineGetter__("manufacturer", function () {
133339         return mediaServer.manufacturer;
133340     });
133341
133342     this.__defineGetter__("manufacturerURL", function () {
133343         return mediaServer.manufacturerURL;
133344     });
133345
133346     this.__defineGetter__("modelDescription", function () {
133347         return mediaServer.modelDescription;
133348     });
133349
133350     this.__defineGetter__("modelName", function () {
133351         return mediaServer.modelName;
133352     });
133353
133354     this.__defineGetter__("modelNumber", function () {
133355         return mediaServer.modelNumber;
133356     });
133357
133358     this.__defineGetter__("serialNumber", function () {
133359         return mediaServer.serialNumber;
133360     });
133361
133362     this.__defineGetter__("UDN", function () {
133363         return mediaServer.UDN;
133364     });
133365
133366     this.__defineGetter__("presentationURL", function () {
133367         return mediaServer.presentationURL;
133368     });
133369
133370     this.__defineGetter__("iconURL", function () {
133371         return mediaServer.iconURL;
133372     });
133373
133374     this.__defineGetter__("deviceType", function () {
133375         return mediaServer.deviceType;
133376     });
133377
133378     this.__defineGetter__("root", function () {
133379         return mediaServer.root;
133380     });
133381
133382     this.__defineGetter__("canCreateContainer", function () {
133383         return mediaServer.canCreateContainer;
133384     });
133385
133386     this.__defineGetter__("canUpload", function () {
133387         return mediaServer.canUpload;
133388     });
133389
133390     this.__defineGetter__("searchAttrs", function () {
133391         return mediaServer.searchAttrs;
133392     });
133393
133394     this.__defineGetter__("sortAttrs", function () {
133395         return mediaServer.sortAttrs;
133396     });
133397
133398     this.upload = function (path) {
133399         if (!this.canUpload) {
133400             throw new WebAPIException(errorcode.PERMISSION_DENIED);
133401         }
133402
133403         t.MediaServer("upload", arguments);
133404
133405         // upload
133406     };
133407
133408     this.createFolder = function (title) {
133409         if (!this.canCreateContainer) {
133410             throw new WebAPIException(errorcode.PERMISSION_DENIED);
133411         }
133412
133413         t.MediaServer("createFolder", arguments);
133414
133415         // createFolder
133416     };
133417
133418     this.cancel = function () {
133419         // cancel
133420     };
133421
133422     this.browse = function (containerId, sortMode, count, offset,
133423             successCallback, errorCallback) {
133424         t.MediaServer("browse", arguments);
133425
133426         window.setTimeout(function () {
133427             var i, j, results, container = "", mediaFiles = [],
133428                 paths = _data.mediaServer.containers,
133429                 medias = _data.mediaServer.items,
133430                 sort = _formatSortMode(sortMode);
133431
133432             if (!containerId) {
133433                 if (errorCallback)
133434                     errorCallback(new WebAPIError(errorcode.UNKNOWN));
133435                 return;
133436             }
133437
133438             for (i = 0; i < paths.length; i++) {
133439                 if (paths[i].id === containerId) {
133440                     container = paths[i].Path;
133441                     continue;
133442                 }
133443
133444                 if ((paths[i].Path.indexOf(containerId) === 0) &&
133445                         (paths[i].Path !== containerId)) {
133446                     mediaFiles.push(new MediaFactory(paths[i].Type,
133447                         paths[i]));
133448                 }
133449             }
133450
133451             if (!container) {
133452                 if (errorCallback)
133453                     errorCallback(new WebAPIError(errorcode.UNKNOWN));
133454                 return;
133455             }
133456
133457             for (i = 0; i < paths.length; i++) {
133458                 if ((paths[i].Path.indexOf(container) === 0) &&
133459                         (paths[i].Path !== container)) {
133460                     mediaFiles.push(new MediaFactory(paths[i].Type,
133461                         paths[i]));
133462                 }
133463             }
133464
133465             for (j = 0; j < medias.length; j++) {
133466                 if (medias[j].Path.indexOf(container) === 0) {
133467                     mediaFiles.push(new MediaFactory(medias[j].Type,
133468                             medias[j]));
133469                 }
133470             }
133471
133472             results = ivi_utils.query(mediaFiles, false, sort, count, offset);
133473             successCallback(results);
133474         }, 1);
133475     };
133476
133477     this.find = function (containerId, searchFilter, sortMode, count,
133478             offset, successCallback, errorCallback) {
133479         t.MediaServer("find", arguments);
133480
133481         window.setTimeout(function () {
133482             var i, j, results, container = "", mediaFiles = [],
133483                 paths = _data.mediaServer.containers,
133484                 medias = _data.mediaServer.items,
133485                 sort = _formatSortMode(sortMode);
133486
133487             if (!containerId) {
133488                 if (errorCallback)
133489                     errorCallback(new WebAPIError(errorcode.UNKNOWN));
133490                 return;
133491             }
133492
133493             for (i = 0; i < paths.length; i++) {
133494                 if (paths[i].id === containerId) {
133495                     container = paths[i].Path;
133496                     continue;
133497                 }
133498
133499                 if ((paths[i].Path.indexOf(containerId) === 0) &&
133500                         (paths[i].Path !== containerId)) {
133501                     mediaFiles.push(new MediaFactory(paths[i].Type,
133502                             paths[i]));
133503                 }
133504             }
133505
133506             if (!container) {
133507                 if (errorCallback)
133508                     errorCallback(new WebAPIError(errorcode.UNKNOWN));
133509                 return;
133510             }
133511
133512             for (i = 0; i < paths.length; i++) {
133513                 if ((paths[i].Path.indexOf(container) === 0) &&
133514                         (paths[i].Path !== container)) {
133515                     mediaFiles.push(new MediaFactory(paths[i].Type,
133516                             paths[i]));
133517                 }
133518             }
133519
133520             for (j = 0; j < medias.length; j++) {
133521                 if (medias[j].Path.indexOf(container) === 0) {
133522                     mediaFiles.push(new MediaFactory(medias[j].Type,
133523                             medias[j]));
133524                 }
133525             }
133526
133527             mediaFiles = _filter(searchFilter, mediaFiles);
133528             if (mediaFiles === null) {
133529                 if (errorCallback)
133530                     errorCallback(new WebAPIError(errorcode.UNKNOWN));
133531                 return;
133532             }
133533
133534             results = ivi_utils.query(_filter(searchFilter, mediaFiles), false,
133535                     sort, count, offset);
133536             successCallback(results);
133537         }, 1);
133538     };
133539 };
133540
133541 MediaFactory = function (type, property) {
133542     var MediaType;
133543
133544     switch (type) {
133545         case "image":
133546             MediaType = MediaImage;
133547             break;
133548         case "video":
133549             MediaType = MediaVideo;
133550             break;
133551         case "music":
133552         case "audio":
133553             MediaType = MediaAudio;
133554             break;
133555         case "container":
133556             MediaType = MediaObject;
133557             break;
133558     }
133559
133560     return new MediaType(property);
133561 };
133562
133563 MediaObject = function (property) {
133564     var mediaObject = {};
133565
133566     mediaObject.id = property.id || "";
133567     mediaObject.Path = property.Path || "";
133568     mediaObject.DisplayName = property.DisplayName || "";
133569     mediaObject.Type = property.Type || "";
133570
133571     this.__defineGetter__("Path", function () {
133572         return mediaObject.Path;
133573     });
133574
133575     this.__defineGetter__("DisplayName", function () {
133576         return mediaObject.DisplayName;
133577     });
133578
133579     this.__defineGetter__("Type", function () {
133580         return mediaObject.Type;
133581     });
133582
133583     this.__defineGetter__("id", function () {
133584         return mediaObject.id;
133585     });
133586 };
133587
133588 MediaContainer = function (property) {
133589     var mediaContainer = {};
133590
133591     MediaObject.call(this, property);
133592
133593     mediaContainer.childCount = property.childCount || 0;
133594     mediaContainer.canCreateContainer = property.canCreateContainer || false;
133595     mediaContainer.canDelete = property.canDelete || false;
133596     mediaContainer.canUpload = property.canUpload || false;
133597     mediaContainer.canRename = property.canRename || false;
133598
133599     this.__defineGetter__("childCount", function () {
133600         return mediaContainer.childCount;
133601     });
133602
133603     this.__defineGetter__("canCreateContainer", function () {
133604         return mediaContainer.canCreateContainer;
133605     });
133606
133607     this.__defineGetter__("canDelete", function () {
133608         return mediaContainer.canDelete;
133609     });
133610
133611     this.__defineGetter__("canUpload", function () {
133612         return mediaContainer.canUpload;
133613     });
133614
133615     this.__defineGetter__("canRename", function () {
133616         return mediaContainer.canRename;
133617     });
133618
133619     this.upload = function (title, path) {
133620         if (!this.canUpload) {
133621             throw new WebAPIException(errorcode.PERMISSION_DENIED);
133622         }
133623
133624         t.MediaContainer("upload", arguments);
133625
133626         // upload
133627     };
133628
133629     this.createFolder = function (title) {
133630         if (!this.canCreateContainer) {
133631             throw new WebAPIException(errorcode.PERMISSION_DENIED);
133632         }
133633
133634         t.MediaContainer("createFolder", arguments);
133635
133636         // createFolder
133637     };
133638 };
133639
133640 MediaItem = function (property) {
133641     var mediaItem = {};
133642
133643     MediaObject.call(this, property);
133644
133645     mediaItem.MIMEType = property.MIMEType || "";
133646     mediaItem.URLs = property.URLs || [];
133647     mediaItem.Size = property.Size || 0;
133648
133649     this.__defineGetter__("MIMEType", function () {
133650         return mediaItem.MIMEType;
133651     });
133652
133653     this.__defineGetter__("URLs", function () {
133654         return mediaItem.URLs;
133655     });
133656
133657     this.__defineGetter__("Size", function () {
133658         return mediaItem.Size;
133659     });
133660 };
133661
133662 MediaVideo = function (property) {
133663     var mediaVideo = {};
133664
133665     MediaItem.call(this, property);
133666
133667     mediaVideo.Album = property.Album || "";
133668     mediaVideo.Artist = property.Artist || [];
133669     mediaVideo.Duration = property.Duration || 0;
133670     mediaVideo.Width = property.Width || 0;
133671     mediaVideo.Height = property.Height || 0;
133672
133673     this.__defineGetter__("Album", function () {
133674         return mediaVideo.Album;
133675     });
133676
133677     this.__defineGetter__("Artist", function () {
133678         return mediaVideo.Artist;
133679     });
133680
133681     this.__defineGetter__("Duration", function () {
133682         return mediaVideo.Duration;
133683     });
133684
133685     this.__defineGetter__("Width", function () {
133686         return mediaVideo.Width;
133687     });
133688
133689     this.__defineGetter__("Height", function () {
133690         return mediaVideo.Height;
133691     });
133692 };
133693
133694 MediaAudio = function (property) {
133695     var mediaAudio = {};
133696
133697     MediaItem.call(this, property);
133698
133699     mediaAudio.Album = property.Album || "";
133700     mediaAudio.Artist = property.Artist || [];
133701     mediaAudio.Genre = property.Genre || [];
133702     mediaAudio.SampleRate = property.SampleRate || 0;
133703     mediaAudio.Duration = property.Duration || 0;
133704
133705     this.__defineGetter__("Album", function () {
133706         return mediaAudio.Album;
133707     });
133708
133709     this.__defineGetter__("Artist", function () {
133710         return mediaAudio.Artist;
133711     });
133712
133713     this.__defineGetter__("Genre", function () {
133714         return mediaAudio.Genre;
133715     });
133716
133717     this.__defineGetter__("SampleRate", function () {
133718         return mediaAudio.SampleRate;
133719     });
133720
133721     this.__defineGetter__("Duration", function () {
133722         return mediaAudio.Duration;
133723     });
133724 };
133725
133726 MediaImage = function (property) {
133727     var mediaImage = {};
133728
133729     MediaItem.call(this, property);
133730
133731     mediaImage.Width = property.Width || 0;
133732     mediaImage.Height = property.Height || 0;
133733
133734     this.__defineGetter__("Width", function () {
133735         return mediaImage.Width;
133736     });
133737
133738     this.__defineGetter__("Height", function () {
133739         return mediaImage.Height;
133740     });
133741 };
133742
133743 _initialize();
133744
133745 module.exports = _self;
133746
133747 });
133748 define('ripple/platform/ivi/3.0/SpeechRecognition', function (require, exports, module) {
133749 /*
133750  *  Copyright 2014 Intel Corporation.
133751  *
133752  * Licensed under the Apache License, Version 2.0 (the "License");
133753  * you may not use this file except in compliance with the License.
133754  * You may obtain a copy of the License at
133755  *
133756  * http://www.apache.org/licenses/LICENSE-2.0
133757  *
133758  * Unless required by applicable law or agreed to in writing, software
133759  * distributed under the License is distributed on an "AS IS" BASIS,
133760  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133761  * See the License for the specific language governing permissions and
133762  * limitations under the License.
133763  */
133764
133765 var SpeechRecognition = window.webkitSpeechRecognition;
133766
133767 module.exports = SpeechRecognition;
133768
133769 });
133770 define('ripple/platform/ivi/3.0/typecoerce', function (require, exports, module) {
133771 /*
133772  *  Copyright 2013 Intel Corporation.
133773  *
133774  * Licensed under the Apache License, Version 2.0 (the "License");
133775  * you may not use this file except in compliance with the License.
133776  * You may obtain a copy of the License at
133777  *
133778  * http://www.apache.org/licenses/LICENSE-2.0
133779  *
133780  * Unless required by applicable law or agreed to in writing, software
133781  * distributed under the License is distributed on an "AS IS" BASIS,
133782  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133783  * See the License for the specific language governing permissions and
133784  * limitations under the License.
133785  */
133786
133787 var t = require('ripple/platform/ivi/3.0/typedef'),
133788     _MAX_INT_BITS = 53,
133789     _MAX_INT = Math.pow(2, _MAX_INT_BITS) - 1,
133790     _self;
133791
133792 _self = function (pattern) {
133793     var typeCoerce, typeOfPattern;
133794
133795     // private
133796     function getExtendedType(val) {
133797         var type = Object.prototype.toString.call(val), attr;
133798
133799         switch (type) {
133800         case "[object Array]":
133801             if ((typeof val[0] === "string") && (val[0].length > 0)) {
133802                 type = "enum";
133803             } else {
133804                 type = "Union";
133805             }
133806             return type;
133807
133808         case "[object Object]":
133809             if ("_dictionary" in val) {
133810                 return "dictionary";
133811             }
133812
133813             type = "Object";
133814
133815             for (attr in val) {
133816                 if (attr === "0") {
133817                     type = "Arguments";
133818                 } else if (val[attr] === "Callback") {
133819                     type = "Callback";
133820                 }
133821                 break;
133822             }
133823
133824             return type;
133825         }
133826
133827         switch (val) {
133828         case "Callback":
133829             type = "Function";
133830             break;
133831
133832         case "TZDate":
133833         case "any":
133834         case "byte":
133835         case "float":
133836         case "long":
133837         case "long long":
133838         case "octet":
133839         case "short":
133840         case "unsigned long":
133841         case "unsigned long long":
133842         case "unsigned short":
133843             type = val;
133844             break;
133845
133846         case "double":
133847             type = "float";
133848             break;
133849
133850         default:    // Derivative type name: e.g., "AbstractFilter"
133851             type = "";
133852             break;
133853         }
133854
133855         return type;
133856     }
133857
133858     function getType(val, isPattern) {
133859         var type = Object.prototype.toString.call(val);
133860
133861         switch (type) {
133862         case "[object Array]":
133863             type = (isPattern && (val.length > 1)) ? getExtendedType(val) :
133864                     "Array";
133865             break;
133866
133867         case "[object Arguments]":
133868             type = "Arguments";
133869             break;
133870
133871         case "[object Boolean]":
133872             type = "boolean";
133873             break;
133874
133875         case "[object Date]":
133876             type = "Date";
133877             break;
133878
133879         case "[object Function]":
133880             type = "Function";
133881             break;
133882
133883         case "[object Number]":
133884             type = "Number";
133885             break;
133886
133887         case "[object Object]":
133888             type = isPattern ? getExtendedType(val) : "Object";
133889             break;
133890
133891         case "[object String]":
133892             type = (isPattern && !!val) ? getExtendedType(val) : "DOMString";
133893             break;
133894         }
133895
133896         return type;
133897     }
133898
133899     function isConstructed(obj) {
133900         if (!("_constructor" in pattern))
133901             return true;
133902
133903         if (obj instanceof window.tizen[pattern._constructor])
133904             return true;
133905
133906         if ("_derived" in pattern)
133907             return true;
133908
133909         return false;
133910     }
133911
133912     function toInteger(x) {
133913         return (x < 0) ? Math.ceil(x) : Math.floor(x);
133914     }
133915
133916     function isBitsOverflowed(bits) {
133917         return (bits >= _MAX_INT_BITS);
133918     }
133919
133920     function toJsInt(x, isUnsigned) {
133921         var min, max;
133922
133923         min = isUnsigned ? 0 : -_MAX_INT;
133924         max = _MAX_INT;
133925
133926         if ((x < min) || (x > max))
133927             return null;
133928
133929         return toInteger(x);
133930     }
133931
133932     function modulo(a, b) {
133933         return (a - Math.floor(a / b) * b);
133934     }
133935
133936     function toInt(x, bits) {
133937         var p;
133938
133939         x = Number(x);
133940
133941         if (isNaN(x) || !isFinite(x))
133942             return null;
133943
133944         if (isBitsOverflowed(bits))
133945             return toJsInt(x, false);
133946
133947         p = Math.pow(2, bits);
133948         x = modulo(toInteger(x), p);
133949
133950         return (x >= Math.pow(2, bits - 1)) ? (x - p) : x;
133951     }
133952
133953     function toUInt(x, bits) {
133954         x = Number(x);
133955
133956         if (isNaN(x) || !isFinite(x))
133957             return null;
133958
133959         if (isBitsOverflowed(bits))
133960             return toJsInt(x, true);
133961
133962         return modulo(toInteger(x), Math.pow(2, bits));
133963     }
133964
133965     function toInt8(x) {
133966         return toInt(x, 8);
133967     }
133968
133969     function toInt16(x) {
133970         return toInt(x, 16);
133971     }
133972
133973     function toInt32(x) {
133974         return toInt(x, 32);
133975     }
133976
133977     function toInt64(x) {
133978         return toInt(x, 64);
133979     }
133980
133981     function toUInt8(x) {
133982         return toUInt(x, 8);
133983     }
133984
133985     function toUInt16(x) {
133986         return toUInt(x, 16);
133987     }
133988
133989     function toUInt32(x) {
133990         return toUInt(x, 32);
133991     }
133992
133993     function toUInt64(x) {
133994         return toUInt(x, 64);
133995     }
133996
133997     // public
133998     function cast(obj) {
133999         var typeMap,
134000             typeOfObj = getType(obj, false);
134001
134002         typeMap = {
134003             "Arguments": function () {
134004                 var i, isNullable, ret;
134005
134006                 for (i in pattern) {
134007                     if (i === "_optional")
134008                         continue;
134009
134010                     isNullable = !!(pattern._optional && pattern._optional[i]);
134011
134012                     if (i > obj.length - 1) {
134013                         if (!isNullable) {
134014                             return null;
134015                         }
134016                         break;
134017                     }
134018
134019                     if (!isNullable || (obj[i] !== null)) {
134020                         ret = _self(pattern[i]).cast(obj[i]);
134021                         if (ret === null) {
134022                             return null;
134023                         }
134024                         obj[i] = ret;
134025                     }
134026                 }
134027
134028                 return obj;
134029             },
134030
134031             "Array": function () {
134032                 var elementType, i, ret;
134033
134034                 if (typeOfObj !== typeOfPattern) {
134035                     return null;
134036                 }
134037
134038                 elementType = _self(pattern[0]);
134039                 for (i in obj) {
134040                     ret = elementType.cast(obj[i]);
134041                     if (ret === null) {
134042                         return null;
134043                     }
134044                     obj[i] = ret;
134045                 }
134046
134047                 return obj;
134048             },
134049
134050             "Callback": function () {
134051                 var attr;
134052
134053                 if (typeOfObj !== "Object") {
134054                     return null;
134055                 }
134056
134057                 for (attr in pattern) {
134058                     if (attr in obj) {
134059                         obj[attr] = _self(pattern[attr]).cast(obj[attr]);
134060                         if (obj[attr] === null) {
134061                             return null;
134062                         }
134063                     }
134064                 }
134065
134066                 return obj;
134067             },
134068
134069             "DOMString": function () {
134070                 switch (typeOfObj) {
134071                 case "DOMString":
134072                 case "Date":
134073                 case "Number":
134074                 case "boolean":
134075                     obj = String(obj);
134076                     break;
134077
134078                 default:
134079                     if ((obj === null) || (obj === undefined)) {
134080                         obj = String(obj);
134081                     } else {
134082                         obj = null;
134083                     }
134084                     break;
134085                 }
134086
134087                 return obj;
134088             },
134089
134090             "Date": function () {
134091                 return (typeOfObj === typeOfPattern) ? obj : null;
134092             },
134093
134094             "Function": function () {
134095                 return (typeOfObj === typeOfPattern) ? obj : null;
134096             },
134097
134098             "Object": function () {
134099                 var ret, attr, i;
134100
134101                 if (typeOfObj !== typeOfPattern) {
134102                     if ((obj === null) || (obj === undefined)) {
134103                         return null;
134104                     }
134105                     if (!("_derived" in pattern)) {
134106                         return null;
134107                     }
134108                 }
134109
134110                 if (!isConstructed(obj)) {
134111                     return null;
134112                 }
134113
134114                 for (attr in pattern) {
134115                     switch (attr) {
134116                     case "_optional":
134117                     case "_constructor":
134118                         break;
134119
134120                     case "_derived":
134121                         for (i in pattern._derived) {
134122                             ret = _self(pattern._derived[i]).cast(obj);
134123                             if (ret !== null)
134124                                 break;
134125                         }
134126                         if (ret === null) {
134127                             if ("_constructor" in pattern)
134128                                 break;
134129
134130                             return null;
134131                         }
134132                         break;
134133
134134                     default:
134135                         if (!pattern._optional || !pattern._optional[attr] ||
134136                                 (obj[attr] !== undefined) &&
134137                                 (obj[attr] !== null)) {
134138                             ret = _self(pattern[attr]).cast(obj[attr]);
134139                             if (ret === null) {
134140                                 return null;
134141                             }
134142                             obj[attr] = ret;
134143                         }
134144                         break;
134145                     }
134146                 }
134147
134148                 return obj;
134149             },
134150
134151             "TZDate": function () {
134152                 if (typeOfObj !== "Object") {
134153                     return null;
134154                 }
134155                 return (obj instanceof window.tizen.TZDate) ? obj : null;
134156             },
134157
134158             "Union": function () {
134159                 var ret, i;
134160
134161                 for (i in pattern) {
134162                     ret = _self(pattern[i]).cast(obj);
134163                     if (ret !== null)
134164                         break;
134165                 }
134166
134167                 return ret;
134168             },
134169
134170             "any": function () {
134171                 return obj;
134172             },
134173
134174             "boolean": function () {
134175                 return (typeOfObj === typeOfPattern) ? obj : null;
134176             },
134177
134178             "byte": function () {
134179                 return toInt8(obj);
134180             },
134181
134182             "dictionary": function () {
134183                 var attr, ret;
134184
134185                 if (typeOfObj !== "Object") {
134186                     return null;
134187                 }
134188
134189                 for (attr in pattern) {
134190                     switch (attr) {
134191                     case "_dictionary":
134192                         if (pattern._dictionary !== null) {
134193                             ret = _self(pattern._dictionary).cast(obj);
134194                             if (ret === null) {
134195                                 return null;
134196                             }
134197                         }
134198                         break;
134199
134200                     default:
134201                         if ((attr in obj) && (obj[attr] !== null) &&
134202                                 (obj[attr] !== undefined)) {
134203                             ret = _self(pattern[attr]).cast(obj[attr]);
134204                             if (ret === null) {
134205                                 return null;
134206                             }
134207                             obj[attr] = ret;
134208                         }
134209                         break;
134210                     }
134211                 }
134212
134213                 return obj;
134214             },
134215
134216             "enum": function () {
134217                 var i;
134218
134219                 obj = String(obj).trim();
134220                 for (i in pattern) {
134221                     if (obj === pattern[i]) {
134222                         return obj;
134223                     }
134224                 }
134225
134226                 return null;
134227             },
134228
134229             "float": function () {
134230                 var f = parseFloat(obj, 10);
134231
134232                 return (isNaN(f) ? null : f);
134233             },
134234
134235             "long": function () {
134236                 return toInt32(obj);
134237             },
134238
134239             "long long": function () {
134240                 return toInt64(obj);
134241             },
134242
134243             "octet": function () {
134244                 return toUInt8(obj);
134245             },
134246
134247             "short": function () {
134248                 return toInt16(obj);
134249             },
134250
134251             "unsigned long": function () {
134252                 return toUInt32(obj);
134253             },
134254
134255             "unsigned long long": function () {
134256                 return toUInt64(obj);
134257             },
134258
134259             "unsigned short": function () {
134260                 return toUInt16(obj);
134261             },
134262
134263             "": function () {
134264                 return _self(t[pattern]).cast(obj);
134265             }
134266         };
134267
134268         return typeMap[typeOfPattern]();
134269     }
134270
134271     function copy(obj) {
134272         var typeMap,
134273             typeOfObj = getType(obj, false);
134274
134275         typeMap = {
134276             "Arguments": function () {
134277                 var i, isNullable, ret = [];
134278
134279                 for (i in pattern) {
134280                     if (i === "_optional")
134281                         continue;
134282
134283                     isNullable = !!(pattern._optional && pattern._optional[i]);
134284
134285                     if (i > obj.length - 1) {
134286                         if (!isNullable) {
134287                             return null;
134288                         }
134289                         break;
134290                     }
134291
134292                     if (!isNullable || (obj[i] !== null)) {
134293                         ret[i] = _self(pattern[i]).copy(obj[i]);
134294                         if (ret[i] === null) {
134295                             return null;
134296                         }
134297                     }
134298                 }
134299
134300                 for (i in ret) {
134301                     obj[i] = ret[i];
134302                 }
134303
134304                 return obj;
134305             },
134306
134307             "Array": function () {
134308                 var arr = [], elementType, i;
134309
134310                 if (typeOfObj !== typeOfPattern) {
134311                     return null;
134312                 }
134313
134314                 elementType = _self(pattern[0]);
134315                 for (i in obj) {
134316                     if (obj[i] !== undefined) {
134317                         arr[i] = elementType.copy(obj[i]);
134318                         if (arr[i] === null)
134319                             return null;
134320                     }
134321                 }
134322
134323                 return arr;
134324             },
134325
134326             "Callback": function () {
134327                 var ret = {}, attr;
134328
134329                 if (typeOfObj !== "Object") {
134330                     return null;
134331                 }
134332
134333                 for (attr in pattern) {
134334                     if (attr in obj) {
134335                         ret[attr] = _self(pattern[attr]).copy(obj[attr]);
134336                         if (ret[attr] === null) {
134337                             return null;
134338                         }
134339                     }
134340                 }
134341
134342                 return ret;
134343             },
134344
134345             "Object": function () {
134346                 var ret = {}, attr, i, derived;
134347
134348                 if (typeOfObj !== typeOfPattern) {
134349                     if ((obj === null) || (obj === undefined)) {
134350                         return null;
134351                     }
134352                     if (!("_derived" in pattern)) {
134353                         return null;
134354                     }
134355                 }
134356
134357                 if (!isConstructed(obj)) {
134358                     return null;
134359                 }
134360                 if ("_constructor" in pattern) {
134361                     ret.__proto__ = window.tizen[pattern._constructor].prototype;
134362                 }
134363
134364                 for (attr in pattern) {
134365                     switch (attr) {
134366                     case "_optional":
134367                     case "_constructor":
134368                         break;
134369
134370                     case "_derived":
134371                         for (i in pattern._derived) {
134372                             derived = _self(pattern._derived[i]).copy(obj);
134373                             if (derived !== null)
134374                                 break;
134375                         }
134376                         if (derived === null) {
134377                             if ("_constructor" in pattern)
134378                                 break;
134379
134380                             return null;
134381                         }
134382                         for (attr in derived) {
134383                             ret[attr] = derived[attr];
134384                         }
134385                         break;
134386
134387                     default:
134388                         if (!pattern._optional || !pattern._optional[attr] ||
134389                                 (obj[attr] !== undefined) &&
134390                                 (obj[attr] !== null)) {
134391                             ret[attr] = _self(pattern[attr]).copy(obj[attr]);
134392                             if (ret[attr] === null) {
134393                                 return null;
134394                             }
134395                         }
134396                         break;
134397                     }
134398                 }
134399
134400                 return ret;
134401             },
134402
134403             "Union": function () {
134404                 var ret, i;
134405
134406                 for (i in pattern) {
134407                     ret = _self(pattern[i]).copy(obj);
134408                     if (ret !== null)
134409                         break;
134410                 }
134411
134412                 return ret;
134413             },
134414
134415             "dictionary": function () {
134416                 var ret = {}, attr, base, i;
134417
134418                 if (typeOfObj !== "Object") {
134419                     return null;
134420                 }
134421
134422                 for (attr in pattern) {
134423                     switch (attr) {
134424                     case "_dictionary":
134425                         if (pattern._dictionary !== null) {
134426                             base = _self(pattern._dictionary).copy(obj);
134427                             if (base === null) {
134428                                 return null;
134429                             }
134430                             for (i in base) {
134431                                 ret[i] = base[i];
134432                             }
134433                         }
134434                         break;
134435
134436                     default:
134437                         if ((attr in obj) && (obj[attr] !== null) &&
134438                                 (obj[attr] !== undefined)) {
134439                             ret[attr] = _self(pattern[attr]).copy(obj[attr]);
134440                             if (ret[attr] === null) {
134441                                 return null;
134442                             }
134443                         }
134444                         break;
134445                     }
134446                 }
134447
134448                 return ret;
134449             },
134450
134451             "": function () {
134452                 return _self(t[pattern]).copy(obj);
134453             }
134454         };
134455
134456         return (typeOfPattern in typeMap) ? typeMap[typeOfPattern]() :
134457                 cast(obj);
134458     }
134459
134460     function match(obj) {
134461         var typeMap,
134462             typeOfObj = getType(obj, false);
134463
134464         typeMap = {
134465             "Array": function () {
134466                 var elementType, i;
134467
134468                 if (typeOfObj !== typeOfPattern)
134469                     return false;
134470
134471                 elementType = _self(pattern[0]);
134472                 for (i in obj) {
134473                     if (!elementType.match(obj[i])) {
134474                         return false;
134475                     }
134476                 }
134477
134478                 return true;
134479             },
134480
134481             "Callback": function () {
134482                 var attr, isMatched = true;
134483
134484                 if (typeOfObj !== "Object") {
134485                     return false;
134486                 }
134487
134488                 for (attr in pattern) {
134489                     if (attr in obj) {
134490                         isMatched = _self(pattern[attr]).match(obj[attr]);
134491                         if (!isMatched) {
134492                             break;
134493                         }
134494                     }
134495                 }
134496
134497                 return isMatched;
134498             },
134499
134500             "DOMString": function () {
134501                 return (typeOfObj === typeOfPattern);
134502             },
134503
134504             "Date": function () {
134505                 return (typeOfObj === typeOfPattern);
134506             },
134507
134508             "Function": function () {
134509                 return (typeOfObj === typeOfPattern);
134510             },
134511
134512             "Object": function () {
134513                 var attr, isMatched = false, i;
134514
134515                 if (typeOfObj !== typeOfPattern) {
134516                     if ((obj === null) || (obj === undefined)) {
134517                         return false;
134518                     }
134519                     if (!("_derived" in pattern)) {
134520                         return false;
134521                     }
134522                     return false;
134523                 }
134524
134525                 if (!isConstructed(obj)) {
134526                     return false;
134527                 }
134528
134529                 for (attr in pattern) {
134530                     switch (attr) {
134531                     case "_optional":
134532                     case "_constructor":
134533                         break;
134534
134535                     case "_derived":
134536                         for (i in pattern._derived) {
134537                             isMatched = _self(pattern._derived[i]).match(obj);
134538                             if (isMatched)
134539                                 break;
134540                         }
134541                         break;
134542
134543                     default:
134544                         if (pattern._optional && pattern._optional[attr]) {
134545                             isMatched = ((obj[attr] === null) ||
134546                                     (obj[attr] === undefined) ||
134547                                     _self(pattern[attr]).match(obj[attr]));
134548                         } else {
134549                             isMatched = (obj[attr] !== undefined) &&
134550                                     _self(pattern[attr]).match(obj[attr]);
134551                         }
134552                         break;
134553                     }
134554
134555                     if (!isMatched)
134556                         break;
134557                 }
134558
134559                 /*// Check if verbose attributes are present
134560                 if (isMatched) {
134561                     for (attr in obj) {
134562                         if (pattern[attr] === undefined) {
134563                             isMatched = false;
134564                             break;
134565                         }
134566                     }
134567                 }*/
134568
134569                 return isMatched;
134570             },
134571
134572             "Union": function () {
134573                 var isMatched, i;
134574
134575                 for (i in pattern) {
134576                     isMatched = _self(pattern[i]).match(obj);
134577                     if (isMatched)
134578                         break;
134579                 }
134580
134581                 return isMatched;
134582             },
134583
134584             "any": function () {
134585                 return true;
134586             },
134587
134588             "boolean": function () {
134589                 return (typeOfObj === typeOfPattern);
134590             },
134591
134592             "byte": function () {
134593                 return (obj === toInt8(obj));
134594             },
134595
134596             "dictionary": function () {
134597                 var attr, isMatched = true;
134598
134599                 if (typeOfObj !== "Object") {
134600                     return false;
134601                 }
134602
134603                 for (attr in pattern) {
134604                     switch (attr) {
134605                     case "_dictionary":
134606                         if (pattern._dictionary !== null) {
134607                             isMatched = _self(pattern._dictionary).match(obj);
134608                             if (!isMatched)
134609                                 break;
134610                         }
134611                         break;
134612
134613                     default:
134614                         if ((attr in obj) && (obj[attr] !== null) &&
134615                                 (obj[attr] !== undefined)) {
134616                             isMatched = _self(pattern[attr]).match(obj[attr]);
134617                             if (!isMatched)
134618                                 break;
134619                         }
134620                         break;
134621                     }
134622                 }
134623
134624                 return isMatched;
134625             },
134626
134627             "enum": function () {
134628                 for (var i in pattern) {
134629                     if (obj === pattern[i]) {
134630                         return true;
134631                     }
134632                 }
134633
134634                 return false;
134635             },
134636
134637             "float": function () {
134638                 return (typeOfObj === "Number");
134639             },
134640
134641             "long": function () {
134642                 return (obj === toInt32(obj));
134643             },
134644
134645             "long long": function () {
134646                 return (obj === toInt64(obj));
134647             },
134648
134649             "octet": function () {
134650                 return (obj === toUInt8(obj));
134651             },
134652
134653             "short": function () {
134654                 return (obj === toInt16(obj));
134655             },
134656
134657             "unsigned long": function () {
134658                 return (obj === toUInt32(obj));
134659             },
134660
134661             "unsigned long long": function () {
134662                 return (obj === toUInt64(obj));
134663             },
134664
134665             "unsigned short": function () {
134666                 return (obj === toUInt16(obj));
134667             },
134668
134669             "Arguments": function () {
134670                 return true;
134671             },
134672
134673             "": function () {
134674                 return _self(t[pattern]).match(obj);
134675             }
134676         };
134677
134678         return typeMap[typeOfPattern]();
134679     }
134680
134681     typeOfPattern = getType(pattern, true);
134682
134683     typeCoerce = {
134684         cast:  cast,
134685         copy:  copy,
134686         match: match
134687     };
134688
134689     return typeCoerce;
134690 };
134691
134692 module.exports = _self;
134693
134694 });
134695 define('ripple/platform/ivi/3.0/typecast', function (require, exports, module) {
134696 /*
134697  *  Copyright 2013 Intel Corporation.
134698  *
134699  * Licensed under the Apache License, Version 2.0 (the "License");
134700  * you may not use this file except in compliance with the License.
134701  * You may obtain a copy of the License at
134702  *
134703  * http://www.apache.org/licenses/LICENSE-2.0
134704  *
134705  * Unless required by applicable law or agreed to in writing, software
134706  * distributed under the License is distributed on an "AS IS" BASIS,
134707  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134708  * See the License for the specific language governing permissions and
134709  * limitations under the License.
134710  */
134711
134712 var typedef = require('ripple/platform/ivi/3.0/typedef'),
134713     errorcode = require('ripple/platform/ivi/3.0/errorcode'),
134714     WebAPIException = require('ripple/platform/ivi/3.0/WebAPIException'),
134715     TypeCoerce = require('ripple/platform/ivi/3.0/typecoerce'),
134716     _self = {};
134717
134718 function _cast(pattern, obj, isDuplicate) {
134719     var tc, tcFunc;
134720
134721     if (pattern === null)
134722         return;
134723
134724     tc = new TypeCoerce(pattern);
134725     tcFunc = isDuplicate ? tc.copy : tc.cast;
134726
134727     if ((obj = tcFunc(obj)) === null) {
134728         throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
134729     }
134730
134731     return obj;
134732 }
134733
134734 function _castType(pattern) {
134735     /*
134736      * Type cast for each known type. The function name is the exact name of the
134737      * corresponding type.
134738      *
134739      * obj
134740      *    Variable to be casted
134741      *
134742      * aux
134743      *    Auxiliary descriptor of obj. It can be any one or combination of below
134744      *    strings, or ignored in most cases.
134745      *
134746      *    "?"     Nullable types
134747      *    "[]"    Array
134748      *    "+"     Deep copy
134749      *
134750      * Return
134751      *    Casted or duplicated object.
134752      */
134753
134754     return function (obj, aux) {
134755         var type, isNullable, isDuplicate;
134756
134757         aux = aux ? String(aux) : "";
134758         type = (aux.indexOf("[]") !== -1) ? [pattern] : pattern;
134759         isNullable = (aux.indexOf("?") !== -1);
134760         isDuplicate = (aux.indexOf("+") !== -1);
134761
134762         if (isNullable && ((obj === null) || (obj === undefined))) {
134763             return obj;
134764         }
134765
134766         return _cast(type, obj, isDuplicate);
134767     };
134768 }
134769
134770 function _castConstructor(name) {
134771     var constructors, hook, vtc, isOverloaded, castConstructor;
134772
134773     /*
134774      * Type cast for constructor. The function name is the exact name of the
134775      * object type.
134776      *
134777      * argv
134778      *    arguments. The keyword 'arguments' will always be passed in.
134779      */
134780
134781     function castUnique(argv) {
134782         _cast(constructors, argv, false);
134783     }
134784
134785     /*
134786      * Type cast for overloaded constructors. The function name is the exact
134787      * name of the object type.
134788      *
134789      * argv
134790      *    arguments. The keyword 'arguments' will always be passed in.
134791      *
134792      * scope
134793      *    'this' of the original constructor.
134794      *
134795      * voc
134796      *    Array of overloaded constructors callback
134797      */
134798
134799     function castOverload(argv, scope, voc) {
134800         var iOverload;
134801
134802         if (!vtc) {
134803             vtc = [];
134804             constructors.forEach(function (c) {
134805                 vtc.push((c === null) ? null : new TypeCoerce(c));
134806             });
134807         }
134808
134809         vtc.some(function (tc, index) {
134810             if (tc && (tc.cast(argv) === null))
134811                 return false;
134812
134813             iOverload = index;
134814             return true;
134815         });
134816
134817         if (iOverload === undefined) {
134818             throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR);
134819         }
134820
134821         return (voc && voc[iOverload].apply(scope, argv));
134822     }
134823
134824     constructors = typedef.constructor[name];
134825
134826     if (name in _self) {
134827         hook = _self[name];
134828     }
134829
134830     isOverloaded = (Object.prototype.toString.call(constructors) ===
134831             "[object Array]");
134832     castConstructor = isOverloaded ? castOverload : castUnique;
134833
134834     return function (argv, scope) {
134835         if (Object.prototype.toString.call(argv) !== "[object Arguments]") {
134836             return (hook && hook.apply(this, arguments));
134837         }
134838
134839         if (!(scope instanceof argv.callee)) {
134840             throw new WebAPIException(errorcode.TYPE_MISMATCH_ERR, null, "TypeError");
134841         }
134842
134843         castConstructor.apply(this, arguments);
134844     };
134845 }
134846
134847 function _castInterface(name) {
134848     var interface, hook;
134849
134850     interface = typedef.interface[name];
134851
134852     if (name in _self) {
134853         hook = _self[name];
134854     }
134855
134856     /*
134857      * Type cast for each known method of interface. The function name is the
134858      * exact name of the corresponding interface.
134859      *
134860      * method
134861      *    String of method name
134862      *
134863      * argv
134864      *    arguments. The keyword 'arguments' will always be passed in.
134865      *
134866      * isDuplicate
134867      *    A boolean value to indicate whether arguments will be copied or not.
134868      */
134869
134870     return function (method, argv, isDuplicate) {
134871         if ((typeof method !== "string") || (typeof argv !== "object")) {
134872             return (hook && hook.apply(this, arguments));
134873         }
134874
134875         _cast(interface[method], argv, isDuplicate);
134876     };
134877 }
134878
134879 (function () {
134880     var i;
134881
134882     for (i in typedef) {
134883         _self[i] = _castType(typedef[i]);
134884     }
134885
134886     for (i in typedef.constructor) {
134887         _self[i] = _castConstructor(i);
134888         typedef[i]._constructor = i;
134889     }
134890
134891     for (i in typedef.interface) {
134892         _self[i] = _castInterface(i);
134893     }
134894 }());
134895
134896 module.exports = _self;
134897
134898 });
134899 define('ripple/platform/spec', function (require, exports, module) {
134900 /*
134901  *  Copyright 2011 Research In Motion Limited.
134902  *
134903  * Licensed under the Apache License, Version 2.0 (the "License");
134904  * you may not use this file except in compliance with the License.
134905  * You may obtain a copy of the License at
134906  *
134907  * http://www.apache.org/licenses/LICENSE-2.0
134908  *
134909  * Unless required by applicable law or agreed to in writing, software
134910  * distributed under the License is distributed on an "AS IS" BASIS,
134911  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134912  * See the License for the specific language governing permissions and
134913  * limitations under the License.
134914  */
134915 module.exports = {
134916     //"phonegap": {"1.0.0": require('ripple/platform/phonegap/1.0.0/spec')},
134917     "tizen": {"2.0": require('ripple/platform/tizen/2.0/spec')},
134918     "ivi": {"3.0": require('ripple/platform/ivi/3.0/spec')},
134919     //"cordova": {"2.0.0": require('ripple/platform/cordova/2.0.0/spec')},
134920     //"webworks.bb10": {"1.0.0": require('ripple/platform/webworks.bb10/1.0.0/spec')},
134921     //"webworks.handset": {"2.0.0": require('ripple/platform/webworks.handset/2.0.0/spec')},
134922     //"webworks.tablet": {"2.0.0": require('ripple/platform/webworks.tablet/2.0.0/spec')},
134923     //"web": {"default": require('ripple/platform/web/default/spec')},
134924
134925     "get": function (name, version) {
134926         var platform = module.exports[name] || {};
134927         return (platform[version] || platform[Object.keys(platform)[0]]);
134928     }
134929 };
134930
134931 });
134932 define('ripple/platform/builder', function (require, exports, module) {
134933 /*
134934  *  Copyright 2011 Research In Motion Limited.
134935  *
134936  * Licensed under the Apache License, Version 2.0 (the "License");
134937  * you may not use this file except in compliance with the License.
134938  * You may obtain a copy of the License at
134939  *
134940  * http://www.apache.org/licenses/LICENSE-2.0
134941  *
134942  * Unless required by applicable law or agreed to in writing, software
134943  * distributed under the License is distributed on an "AS IS" BASIS,
134944  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134945  * See the License for the specific language governing permissions and
134946  * limitations under the License.
134947  */
134948
134949 var utils = require('ripple/utils'),
134950     app = require('ripple/app');
134951
134952 function _objectFactory(context, objects/*, allowed*/) {
134953     utils.forEach(objects, function (obj, key) {
134954         var result = {}, objFeatures = {}, rst, f, widgetFeatures;
134955
134956 //        if (allowed(obj)) {
134957         result = obj.path ? require('ripple/platform/' + obj.path) : {};
134958         if (typeof result === "function" && obj.handleSubfeatures && obj.handleSubfeatures === true) {
134959             rst = new result();
134960             if (obj.feature) {
134961                 objFeatures = obj.feature.split('|');
134962                 if (rst.handleSubFeatures) {
134963                     widgetFeatures = app.getInfo().features; // features in config.xml
134964                     f = {};
134965                     utils.forEach(objFeatures, function (o) {
134966                         if (widgetFeatures && !!widgetFeatures[o]) {
134967                             f[widgetFeatures[o].id] = widgetFeatures[o];
134968                         }
134969                     });
134970                     rst.handleSubFeatures(f);
134971                     delete rst.handleSubFeatures;
134972                 }
134973             }
134974             result = rst;
134975         }
134976 //        }
134977
134978         if (obj.children) {
134979             _objectFactory(result, obj.children/*, allowed*/);
134980         }
134981
134982         context.__defineGetter__(key, function () {
134983             return result;
134984         });
134985         // inject into the context if it is allowed or it has children that were allowed
134986 //        if (allowed(obj) || utils.count(result)) {
134987 //        context[key] = result;
134988 //        }
134989 //        else {
134990 //            if (context.hasOwnProperty(key))
134991 //                console.log("delete " + key);
134992 //            delete context[key];
134993 //        }
134994     });
134995 }
134996
134997 module.exports = {
134998     build: function (objects) {
134999         return {
135000             into: function (sandbox) {
135001 /*                var features = utils.copy(app.getInfo().features);
135002                     allowed = function (obj) {
135003                         var contains = function (requirements) {
135004                             return requirements.split('|').some(function (feature) {
135005                                 return !!features[feature];
135006                             });
135007                         };
135008                         //object is allowed if:
135009                         // 1. it has no feature requirement
135010                         // 2. the config file doesn't exist (features collection is null)
135011                         // 3. the feature exists in the defined features
135012                         return !obj.feature || !features || (features && contains(obj.feature));
135013                     };
135014 */
135015
135016                 _objectFactory(sandbox, objects/*, allowed*/);
135017             }
135018         };
135019     }
135020 };
135021
135022 });
135023 define('ripple/platform/w3c/1.0/Rotation', function (require, exports, module) {
135024 module.exports = function (alpha, beta, gamma) {
135025     return {
135026         alpha: alpha || 0,    //Rotation about the 'z' axis expressed in degrees [0, 360].    (Number)
135027         beta: beta || 0,      //Rotation about the 'x' axis expressed in degrees [-180, 180]. (Number)
135028         gamma: gamma || 0     //Rotation about the 'y' axis expressed in degrees [-90, 90].   (Number)
135029     };
135030 };
135031
135032 });
135033 define('ripple/platform/w3c/1.0/navigator', function (require, exports, module) {
135034 /*
135035  *  Copyright 2011 Research In Motion Limited.
135036  *
135037  * Licensed under the Apache License, Version 2.0 (the "License");
135038  * you may not use this file except in compliance with the License.
135039  * You may obtain a copy of the License at
135040  *
135041  * http://www.apache.org/licenses/LICENSE-2.0
135042  *
135043  * Unless required by applicable law or agreed to in writing, software
135044  * distributed under the License is distributed on an "AS IS" BASIS,
135045  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135046  * See the License for the specific language governing permissions and
135047  * limitations under the License.
135048  */
135049 var _original = window.navigator,
135050     utils = require('ripple/utils'),
135051     devices = require('ripple/devices'),
135052     constants = require('ripple/constants'),
135053     _self = {};
135054
135055 (function () {
135056     var key,
135057         nav = window.navigator;
135058
135059     function _handle(obj, key) {
135060         return typeof obj[key] !== "function" ? obj[key] : function () {
135061             return obj[key].apply(obj, Array.prototype.slice.call(arguments));
135062         };
135063     }
135064
135065     for (key in nav) {
135066         _self[key] = _handle(nav, key);
135067     }
135068 }());
135069
135070 _self.__defineGetter__('userAgent', function () {
135071     var currentUserAgent = devices.getCurrentDevice().userAgent;
135072
135073     return currentUserAgent === constants.COMMON.USER_AGENT_DEFAULT ?
135074         _original.userAgent : currentUserAgent;
135075 });
135076
135077 module.exports = _self;
135078
135079 });
135080 define('ripple/platform/w3c/1.0/SensorConnection', function (require, exports, module) {
135081 /*
135082  *  Copyright 2012 Intel Corporation.
135083  *
135084  * Licensed under the Apache License, Version 2.0 (the "License");
135085  * you may not use this file except in compliance with the License.
135086  * You may obtain a copy of the License at
135087  *
135088  * http://www.apache.org/licenses/LICENSE-2.0
135089  *
135090  * Unless required by applicable law or agreed to in writing, software
135091  * distributed under the License is distributed on an "AS IS" BASIS,
135092  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135093  * See the License for the specific language governing permissions and
135094  * limitations under the License.
135095  */
135096
135097 var utils = require('ripple/utils'),
135098     platform = require('ripple/platform'),
135099     event = require('ripple/event'),
135100     sensorSettings = require('ripple/sensorSettings'),
135101     accelerometer = require('ripple/accelerometer'),
135102     exception = require('ripple/exception'),
135103
135104     _permission = true,
135105     _self;
135106
135107 function ErrorMsg() {
135108     this.__defineGetter__("UNKNOWN_ERROR", function () {
135109         return "An unknown error has occurred.";
135110     });
135111
135112     this.__defineGetter__("TYPE_MISMATCH_ERROR", function () {
135113         return "The object type is incompatible with the expected type.";
135114     });
135115
135116     this.__defineGetter__("INVALID_VALUES_ERROR", function () {
135117         return "The content of an object does not contain valid values.";
135118     });
135119
135120     this.__defineGetter__("ILLEGAL_STATE", function () {
135121         return "The status of connection is illegal.";
135122     });
135123 }
135124
135125 // TODO: Should be replaced by a global object in tizen 1.0
135126 function ErrorCode() {
135127     this.__defineGetter__("UNKNOWN_ERR", function () {
135128         return 0;
135129     });
135130
135131     this.__defineGetter__("INVALID_VALUES_ERROR", function () {
135132         return 1;
135133     });
135134
135135     this.__defineGetter__("TYPE_MISMATCH_ERROR", function () {
135136         return 2;
135137     });
135138
135139     this.__defineGetter__("ILLEGAL_STATE", function () {
135140         return 3;
135141     });
135142 }
135143
135144 function SensorError(code, msg) {
135145     this.__defineGetter__("message", function () {
135146         return msg;
135147     });
135148     this.__defineGetter__("code", function () {
135149         return code;
135150     });
135151
135152     this.PERMISSION_DENIED = -100;
135153 }
135154
135155 function Event() {
135156     var _self = {
135157         CAPTURING_PHASE: 1,
135158         AT_TARGET:  2,
135159         BUBBLING_PHASE: 3,
135160
135161         type: '',
135162         target: null, //new EventTarget(),
135163         currentTarget: null, //new EventTarget(),
135164         eventPhase: 0,
135165         bubbles: false,
135166         cancelable: false,
135167         timeStamp: 0
135168     };
135169         
135170     this.__defineGetter__("type", function () {
135171         return _self.type;
135172     });
135173
135174     this.__defineGetter__("target", function () {
135175         return _self.target;
135176     });
135177
135178     this.__defineGetter__("currentTarget", function () {
135179         return _self.currentTarget;
135180     });
135181
135182     this.__defineGetter__("eventPhase", function () {
135183         return _self.eventPhase;
135184     });    
135185
135186     this.__defineGetter__("bubbles", function () {
135187         return _self.bubbles;
135188     });
135189
135190     this.__defineGetter__("cancelable", function () {
135191         return _self.cancelable;
135192     });
135193     
135194     this.__defineGetter__("timeStamp", function () {
135195         return _self.timeStamp;
135196     });
135197
135198     this.stopPropagation = function () {};
135199
135200     this.preventDefault = function () {};
135201
135202     this.initEvent = function (eventTypeArg, canBubbleArg, cancelableArg) {
135203         _self.type = eventTypeArg;
135204         _self.bubbles = canBubbleArg;
135205         _self.cancelable = cancelableArg;
135206     };
135207
135208     return _self;
135209 }
135210
135211 function SensorDataEvent() {
135212     var _self = {
135213         data: 0,
135214         accuracy: 0,
135215         timestamp: 0,
135216         reason: ''
135217     };
135218
135219     // This type of event inherit from Event
135220     Event.call(this);
135221
135222     this.__defineGetter__("data", function () {
135223         return _self.data;
135224     });
135225
135226     this.__defineGetter__("accuracy", function () {
135227         return _self.accuracy;
135228     });
135229
135230     this.__defineGetter__("timestamp", function () {
135231         return _self.timestamp;
135232     });
135233
135234     this.__defineGetter__("reason", function () {
135235         return _self.reason;
135236     });
135237
135238     this.initSensorDataEvent = function (type, bubbles, cancelable, reason, timestamp, accuracy, data) {
135239         this.initEvent(type, bubbles, cancelable);
135240
135241         _self.reason = reason;
135242         _self.timestamp = timestamp;
135243         _self.accuracy = accuracy;
135244         
135245         // If the data has only one part, just return the value, not the data object    
135246         if (utils.count(data) === 1) {
135247             utils.forEach(data, function (section, key) {
135248                 _self.data = data[key];
135249             });
135250         }
135251         else {
135252             _self.data = utils.copy(data);
135253         }
135254     };
135255 }
135256
135257 // As only one sensor will be used during the simulation with a SensorConnection object,
135258 // we can get that sensor object first and then the following read or write operations will be simplified
135259 function _getSensorObj(type, name) {
135260     var settings = platform.current().sensor, _sensor;
135261
135262     utils.forEach(settings, function (settingSection, settingType) {
135263         if (settingSection.type === type) {
135264
135265             if (settingSection.name && settingSection.name !== name) {
135266                 return;
135267             }
135268
135269             _sensor = utils.copy(settingSection);
135270         }
135271     });
135272
135273     return _sensor;
135274 }
135275
135276 function _getAccelerometerData(dataType) {
135277     var accelerometerData, data = {};
135278
135279     switch (dataType) {
135280     case "Accelerometer":
135281         accelerometerData = accelerometer.getInfo();
135282         data = {
135283             x: accelerometerData.acceleration.x,
135284             y: accelerometerData.acceleration.y,
135285             z: accelerometerData.acceleration.z
135286         };
135287         break;
135288     case "Rotation":
135289         accelerometerData = accelerometer.getInfo();
135290         data = {
135291             x: accelerometerData.orientation.alpha,
135292             y: accelerometerData.orientation.beta,
135293             z: accelerometerData.orientation.gamma
135294         };
135295         break;
135296     case "Orientation":
135297         accelerometerData = accelerometer.getInfo();
135298         data = {
135299             alpha: accelerometerData.orientation.alpha,
135300             beta: accelerometerData.orientation.beta,
135301             gamma: accelerometerData.orientation.gamma
135302         };
135303         break;
135304     default:
135305         break;
135306     }
135307
135308     return data;
135309 }
135310
135311 // The parameter of event callback is an object that contains the latest value, not the value itself,
135312 // so we need a function to create such object.
135313 function _getSensorData(sensorType, sensor, onerror) {
135314     var data = {}, value;
135315
135316     if (sensorType === "Accelerometer" || sensorType === "Rotation" || sensorType === "Orientation") {
135317         return _getAccelerometerData(sensorType);
135318     }
135319
135320     utils.forEach(sensor, function (sensorSection, key) {
135321         try {
135322             value = sensorSettings.retrieve(sensorType + "." + key);
135323         }
135324         catch (e) {
135325             if (onerror) {
135326                 onerror(e);
135327             }
135328         }
135329         
135330         if (value) {
135331             data[key] = value;
135332         }                    
135333     });
135334     
135335     return data;
135336 }
135337
135338 // As the event type in sensor.js file are named in this way, so we can get it with this function.
135339 function _getSensorEventTypes(type, sensor) {
135340     var types = [];
135341
135342     if (type === "Accelerometer" || type === "Rotation" || type === "Orientation") {
135343         return ["AccelerometerInfoChangedEvent"];
135344     }
135345
135346     utils.forEach(sensor, function (sensorSection, sensorType) {
135347         if (typeof sensorSection === "object") {
135348             types.push(type + "-" + sensorType + "Changed");
135349         }
135350     });
135351
135352     return types;
135353 }
135354
135355 function _onEventCallback(type, options, currentSensor, length, eventCallback, onerror) {
135356     return function (values) {
135357         var sensorEvent = new SensorDataEvent();
135358
135359         // Only the sensor that has one attribute could be compared with the threshold
135360         if (options && options.threshold && length === 1 && values[0] < options.threshold) {
135361             return;
135362         }
135363
135364         if (eventCallback) {
135365             sensorEvent.initSensorDataEvent(type, false, false, "read", (new Date()).getTime(), 
135366                                             currentSensor.resolution, _getSensorData(type, currentSensor, onerror));
135367
135368             eventCallback(sensorEvent);
135369         }
135370     };
135371 }
135372
135373 function _bind(name, obj) {
135374     var callback = null;
135375
135376     obj.__defineGetter__(name, function () {
135377         return callback;
135378     });
135379
135380     obj.__defineSetter__(name, function (cb) {
135381         callback = cb;
135382     });
135383
135384     return {
135385         get: function () {
135386             return callback;
135387         },
135388         set: function (value) {
135389             callback = value;
135390         },
135391         exec: function (arg) {
135392             return callback && callback(arg);
135393         },
135394         unbind: function (cb) {
135395             callback = cb === callback ? null : callback;
135396         }
135397     };
135398 }
135399
135400 function SensorConnection(type, name) {
135401     var _self,
135402         currentSensor = _getSensorObj(type, name),
135403         sensorEvent = new SensorDataEvent(),
135404         sensorEventTypes = _getSensorEventTypes(type, currentSensor),
135405         watches = [],
135406         _errorCode = new ErrorCode(),
135407         _errorMsg = new ErrorMsg(),
135408         sensorListener;
135409
135410     if (currentSensor) {
135411         _self = {
135412             sensor: {
135413                 resolution: currentSensor.resolution,
135414                 minDelay: currentSensor.minDelay,
135415                 range: currentSensor.range,
135416                 name: currentSensor.name,
135417                 type: currentSensor.type
135418             },
135419             status: "open",
135420             error: null,
135421             read: function () {
135422
135423                 if (_self.status !== "open" && _self.status !== "watching") {
135424                     exception.raise(exception.types.Argument, "illegal state", new SensorError(_errorCode.ILLEGAL_STATE, _errorMsg.ILLEGAL_STATE));
135425                     return;
135426                 }                
135427
135428                 setTimeout(function () {
135429                     if (sensorListener.get()) {
135430                         sensorEvent.initSensorDataEvent(type, false, false, "read", (new Date()).getTime(), 
135431                                                         currentSensor.resolution, _getSensorData(type, currentSensor, _self.onerror));
135432
135433                         sensorListener.exec(sensorEvent);
135434                     }
135435                 }, 1);  
135436
135437                 return;
135438             },
135439
135440             startWatch: function (options) {
135441                 var index, watchId, watchObj = {};
135442
135443                 if (_self.status !== "open") {
135444                     exception.raise(exception.types.Argument, "illegal state", new SensorError(_errorCode.ILLEGAL_STATE, _errorMsg.ILLEGAL_STATE));
135445                     return;
135446                 }
135447                     
135448                 if (typeof options !== "object") {
135449                     if (_self.onerror) {
135450                         _self.onerror(new SensorError(_errorCode.TYPE_MISMATCH_ERROR, _errorMsg.TYPE_MISMATCH_ERROR));
135451                     }
135452                 }
135453
135454                 setTimeout(function () {
135455                     watchId = (new Date()).getTime();   
135456
135457                     // As there will be many attributes for some sensor, each of them is needed to be watched.
135458                     for (index = 0; index < sensorEventTypes.length; index++) {
135459                         watchObj = {
135460                             eventType: sensorEventTypes[index],
135461                             onEvent: _onEventCallback(type, options, currentSensor, sensorEventTypes.length, sensorListener.get(), _self.onerror),
135462                         };
135463
135464                         watches.push(watchObj);
135465                         if (watchObj.eventType) {
135466                             event.on(watchObj.eventType, watchObj.onEvent);                                               
135467                         }
135468                     }
135469
135470                     
135471                     if (options && options.interval) {
135472                         watchObj.intervalId = setInterval(_onEventCallback(type, options, currentSensor, sensorEventTypes.length, sensorListener.get(), _self.onerror), 
135473                                                           options.interval);
135474                     }
135475
135476                     _self.status = "watching";
135477                     if (_self.onstatuschange) {
135478                         _self.onstatuschange();
135479                     }
135480                                                                                                         
135481                 }, 1);  
135482
135483                 return;
135484             },
135485
135486             endWatch: function () {
135487                 var index, watchObj;
135488
135489                 if (_self.status !== "watching") {
135490                     exception.raise(exception.types.Argument, "illegal state", new SensorError(_errorCode.ILLEGAL_STATE, _errorMsg.ILLEGAL_STATE));
135491                     return;
135492                 }
135493
135494                 for (index = 0; index < watches.length; index++) {
135495                     watchObj = watches[index];
135496
135497                     try {
135498                         event.deleteEventHandler(watchObj.eventType, watchObj.onEvent);  
135499                     }
135500                     catch (e) {
135501                         if (_self.onerror) {
135502                             _self.onerror(e);
135503                         }
135504                     }
135505
135506                     if (watchObj.intervalId) {
135507                         clearInterval(watchObj.intervalId);
135508                     }                
135509                 }
135510
135511                 watches = [];
135512
135513                 _self.status = "open";
135514                 if (_self.onstatuschange) {
135515                     _self.onstatuschange();
135516                 }
135517             },
135518
135519             // These functions are inherited from the EventTarget object
135520             addEventListener: function (eventType, callback, useCapture) {
135521                 var sensorEvent;
135522                 
135523                 if (eventType === "sensordata") {
135524                     sensorListener.set(callback);  
135525
135526                     event.on("sensordata", function (data) {
135527                         sensorEvent = new SensorDataEvent();        
135528                         sensorEvent.initSensorDataEvent("sensordata", false, false, "read", (new Date()).getTime(), 
135529                                                         currentSensor.resolution, _getSensorData(type, currentSensor, _self.onerror));           
135530
135531                         sensorListener.exec(sensorEvent);
135532                     });             
135533                 }               
135534             },
135535
135536             removeEventListener: function (eventType, callback) {
135537                 event.clear(eventType, callback);
135538                 sensorListener.unbind(callback);                                
135539             },
135540
135541             dispatchEvent: function (evt) {
135542                 event.trigger("sensordata", evt);
135543             }
135544         };
135545
135546         sensorListener = _bind("onsensordata", _self);
135547     }    
135548
135549     return _self;
135550 }
135551
135552 module.exports = function (option) {
135553  
135554     var connectionObj,
135555         _errorCode = new ErrorCode(),
135556         _errorMsg = new ErrorMsg();
135557
135558     if (option === null || option === undefined) {
135559         return null;
135560     }
135561
135562     // There are two ways to construct an object
135563     if (typeof option === "object") {
135564         if ((option.type === null || option.type === undefined) &&
135565             (option.name === null || option.name === undefined)) {
135566             // Spec: If none of the dictionary members are defined then raise an instantiation exception    
135567             exception.raise(exception.types.Argument, "type illegal", new SensorError(_errorCode.ILLEGAL_TYPE, _errorMsg.ILLEGAL_TYPE));             
135568         }
135569
135570         connectionObj = new SensorConnection(option.type, option.name);
135571     }
135572     else if (typeof option === "string") {
135573         connectionObj = new SensorConnection(option, option);
135574     }
135575
135576     return connectionObj;
135577 };
135578
135579 });
135580 define('ripple/platform/w3c/1.0/geolocation', function (require, exports, module) {
135581 /*
135582  *  Copyright 2011 Research In Motion Limited.
135583  *
135584  * Licensed under the Apache License, Version 2.0 (the "License");
135585  * you may not use this file except in compliance with the License.
135586  * You may obtain a copy of the License at
135587  *
135588  * http://www.apache.org/licenses/LICENSE-2.0
135589  *
135590  * Unless required by applicable law or agreed to in writing, software
135591  * distributed under the License is distributed on an "AS IS" BASIS,
135592  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135593  * See the License for the specific language governing permissions and
135594  * limitations under the License.
135595  */
135596 var geo = require('ripple/geo'),
135597     Position = require('ripple/platform/w3c/1.0/Position'),
135598     PositionError = require('ripple/platform/w3c/1.0/PositionError'),
135599     _watches = {},
135600     _self;
135601
135602 function createPosition() {
135603     var position = new Position(),
135604         positionInfo = geo.getPositionInfo();
135605
135606     position.coords.latitude = positionInfo.latitude;
135607     position.coords.longitude = positionInfo.longitude;
135608     position.coords.altitude = positionInfo.altitude;
135609     position.coords.altitudeAccuracy = positionInfo.altitudeAccuracy;
135610     position.coords.accuracy = positionInfo.accuracy;
135611     position.coords.heading = positionInfo.heading;
135612     position.coords.speed = positionInfo.speed;
135613     position.timestamp = positionInfo.timeStamp.getTime();
135614
135615     return position;
135616 }
135617
135618 _self = {
135619     getCurrentPosition: function (onSuccess, onError) {
135620         var delay = ((geo.delay || 0) * 1000) || 1,
135621             timeout = geo.timeout;
135622
135623         window.setTimeout(function () {
135624             if (timeout) {
135625                 var error = new PositionError();
135626                 error.code = PositionError.TIMEOUT;
135627                 error.message = "postion timed out";
135628
135629                 onError(error);
135630             }
135631             else {
135632                 // TODO: build facility to trigger onError() from emulator
135633                 // see pivotal item: https://www.pivotaltracker.com/story/show/7040343
135634                 _self.lastPosition = createPosition();
135635                 onSuccess(_self.lastPosition);
135636             }
135637         }, delay);
135638     },
135639
135640     watchPosition: function (geolocationSuccess, geolocationError, geolocationOptions) {
135641         var watchId = (new Date()).getTime().toString(),
135642             watchObj = {},
135643             timeout;
135644
135645         if (geolocationOptions) {
135646             timeout = geolocationOptions.timeout || 10000;
135647
135648             watchObj = {
135649                 onSuccess: geolocationSuccess,
135650                 onError: geolocationError,
135651                 interval: timeout
135652             };
135653
135654             _watches[watchId] = watchObj;
135655
135656             _watches[watchId].intervalId = window.setInterval(function () {
135657                 _self.getCurrentPosition(_watches[watchId].onSuccess, _watches[watchId].onError);
135658             }, timeout);
135659
135660         }
135661         else {
135662             if (typeof geolocationError === "function") {
135663                 window.setTimeout(function () {
135664                     geolocationError();
135665                 }, 1);
135666             }
135667         }
135668
135669         return watchId;
135670     },
135671
135672     lastPosition: null,
135673
135674     clearWatch: function (watchId) {
135675         window.clearInterval(_watches[watchId].intervalId);
135676         delete _watches[watchId];
135677     }
135678 };
135679
135680 module.exports = _self;
135681
135682 });
135683 define('ripple/platform/w3c/1.0/Coordinates', function (require, exports, module) {
135684 /*
135685  *  Copyright 2011 Research In Motion Limited.
135686  *
135687  * Licensed under the Apache License, Version 2.0 (the "License");
135688  * you may not use this file except in compliance with the License.
135689  * You may obtain a copy of the License at
135690  *
135691  * http://www.apache.org/licenses/LICENSE-2.0
135692  *
135693  * Unless required by applicable law or agreed to in writing, software
135694  * distributed under the License is distributed on an "AS IS" BASIS,
135695  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135696  * See the License for the specific language governing permissions and
135697  * limitations under the License.
135698  */
135699 module.exports = function (latitude, longitude, altitude, accuracy, altitudeAccuracy, heading, speed) {
135700     return {
135701         latitude: latitude || 0,                    //Latitude in decimal degrees. (Number)
135702         longitude: longitude || 0,                  //Longitude in decimal degrees. (Number)
135703         altitude: altitude || 0,                    //Height of the position in meters above the ellipsoid. (Number)
135704         accuracy: accuracy || 0,                    //Accuracy level of the latitude and longitude coordinates in meters. (Number)
135705         altitudeAccuracy: altitudeAccuracy || 0,    //Accuracy level of the altitude coordinate in meters. (Number)
135706         heading: heading || 0,                      //Direction of travel, specified in degrees counting clockwise relative to the true north. (Number)
135707         speed: speed || 0                           //Current ground speed of the device, specified in meters per second. (Number)
135708     };
135709 };
135710
135711 });
135712 define('ripple/platform/w3c/1.0/Position', function (require, exports, module) {
135713 /*
135714  *  Copyright 2011 Research In Motion Limited.
135715  *
135716  * Licensed under the Apache License, Version 2.0 (the "License");
135717  * you may not use this file except in compliance with the License.
135718  * You may obtain a copy of the License at
135719  *
135720  * http://www.apache.org/licenses/LICENSE-2.0
135721  *
135722  * Unless required by applicable law or agreed to in writing, software
135723  * distributed under the License is distributed on an "AS IS" BASIS,
135724  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135725  * See the License for the specific language governing permissions and
135726  * limitations under the License.
135727  */
135728 var Coordinates = require('ripple/platform/w3c/1.0/Coordinates');
135729
135730 module.exports = function () {
135731     return {
135732         coords: new Coordinates(),
135733         timestamp: new Date().getTime()
135734     };
135735 };
135736
135737 });
135738 define('ripple/platform/w3c/1.0/Acceleration', function (require, exports, module) {
135739 module.exports = function (x, y, z) {
135740     return {
135741         x: x || 0,    //Acceleration in the 'x' expressed in m/s^2. (Number)
135742         y: y || 0,    //Acceleration in the 'y' expressed in m/s^2. (Number)
135743         z: z || 0     //Acceleration in the 'z' expressed in m/s^2. (Number)
135744     };
135745 };
135746
135747 });
135748 define('ripple/platform/w3c/1.0/PositionError', function (require, exports, module) {
135749 /*
135750  *  Copyright 2011 Research In Motion Limited.
135751  *
135752  * Licensed under the Apache License, Version 2.0 (the "License");
135753  * you may not use this file except in compliance with the License.
135754  * You may obtain a copy of the License at
135755  *
135756  * http://www.apache.org/licenses/LICENSE-2.0
135757  *
135758  * Unless required by applicable law or agreed to in writing, software
135759  * distributed under the License is distributed on an "AS IS" BASIS,
135760  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135761  * See the License for the specific language governing permissions and
135762  * limitations under the License.
135763  */
135764 var _self = function () {
135765     return {
135766         code: undefined,
135767         message: undefined
135768     };
135769 };
135770
135771 _self.PERMISSION_DENIED = "PERMISSION_DENIED";
135772 _self.POSITION_UNAVAILABLE = "POSITION_UNAVAILABLE";
135773 _self.TIMEOUT = "TIMEOUT";
135774
135775 module.exports = _self;
135776
135777 });
135778 define('ripple/platform/webworks.tablet/2.0.0/XMLHttpRequest', function (require, exports, module) {
135779 /*
135780  *  Copyright 2011 Research In Motion Limited.
135781  *
135782  * Licensed under the Apache License, Version 2.0 (the "License");
135783  * you may not use this file except in compliance with the License.
135784  * You may obtain a copy of the License at
135785  *
135786  * http://www.apache.org/licenses/LICENSE-2.0
135787  *
135788  * Unless required by applicable law or agreed to in writing, software
135789  * distributed under the License is distributed on an "AS IS" BASIS,
135790  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135791  * See the License for the specific language governing permissions and
135792  * limitations under the License.
135793  */
135794
135795 var xhr = require("ripple/platform/webworks.core/2.0.0/XMLHttpRequest");
135796 module.exports = xhr.create("ripple/platform/webworks.tablet/2.0.0/server");
135797
135798 });
135799 define('ripple/platform/webworks.tablet/2.0.0/spec', function (require, exports, module) {
135800 /*
135801  *  Copyright 2011 Research In Motion Limited.
135802  *
135803  * Licensed under the Apache License, Version 2.0 (the "License");
135804  * you may not use this file except in compliance with the License.
135805  * You may obtain a copy of the License at
135806  *
135807  * http://www.apache.org/licenses/LICENSE-2.0
135808  *
135809  * Unless required by applicable law or agreed to in writing, software
135810  * distributed under the License is distributed on an "AS IS" BASIS,
135811  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135812  * See the License for the specific language governing permissions and
135813  * limitations under the License.
135814  */
135815 module.exports = {
135816
135817     id: "webworks.tablet",
135818     version: "2.0.0",
135819     name: "WebWorks-TabletOS",
135820
135821     persistencePrefix: "rim-tablet-",
135822
135823     ui: require('ripple/platform/webworks.tablet/2.0.0/spec/ui'),
135824     device: require('ripple/platform/webworks.tablet/2.0.0/spec/device'),
135825     config: require('ripple/platform/webworks.core/2.0.0/spec/config'),
135826     events: require('ripple/platform/webworks.tablet/2.0.0/spec/events'),
135827
135828     initialize: function () {},
135829
135830     objects: {
135831         XMLHttpRequest: {
135832             path: "webworks.tablet/2.0.0/XMLHttpRequest"
135833         },
135834         Coordinates: {
135835             path: "w3c/1.0/Coordinates"
135836         },
135837         Position: {
135838             path: "w3c/1.0/Position"
135839         },
135840         PositionError: {
135841             path: "w3c/1.0/PositionError"
135842         },
135843         navigator: {
135844             path: "w3c/1.0/navigator",
135845             children: {
135846                 geolocation: {
135847                     path: "w3c/1.0/geolocation"
135848                 }
135849             }
135850         },
135851         blackberry: {
135852             children: {
135853                 transport: {
135854                     path: "webworks.core/2.0.0/client/transport"
135855                 },
135856                 events: {
135857                     path: "webworks.core/2.0.0/client/events"
135858                 },
135859                 app: {
135860                     path: "webworks.tablet/2.0.0/client/app",
135861                     feature: "blackberry.app",
135862                     children: {
135863                         event: {
135864                             path: "webworks.tablet/2.0.0/client/appEvent",
135865                             feature: "blackberry.app.event"
135866                         }
135867                     }
135868                 },
135869                 invoke: {
135870                     path: "webworks.tablet/2.0.0/client/invoke",
135871                     feature: "blackberry.invoke",
135872                     children: {
135873                         BrowserArguments: {
135874                             path: "webworks.tablet/2.0.0/client/BrowserArguments",
135875                             feature: "blackberry.invoke.BrowserArguments"
135876                         },
135877                         CameraArguments: {
135878                             path: "webworks.tablet/2.0.0/client/CameraArguments",
135879                             feature: "blackberry.invoke.CameraArguments"
135880                         }
135881                     }
135882                 },
135883                 identity: {
135884                     path: "webworks.tablet/2.0.0/client/identity",
135885                     feature: "blackberry.identity"
135886                 },
135887                 system: {
135888                     path: "webworks.tablet/2.0.0/client/system",
135889                     children: {
135890                         event: {
135891                             path: "webworks.tablet/2.0.0/client/systemEvent"
135892                         }
135893                     }
135894                 },
135895                 ui: {
135896                     children: {
135897                         dialog: {
135898                             path: "webworks.core/2.0.0/client/dialog",
135899                             feature: "blackberry.ui.dialog"
135900                         }
135901                     }
135902                 },
135903                 utils: {
135904                     path: "webworks.core/2.0.0/client/utils",
135905                     feature: "blackberry.utils"
135906                 },
135907                 io: {
135908                     children: {
135909                         dir: {
135910                             path: "webworks.tablet/2.0.0/client/io/dir",
135911                             feature: "blackberry.io.dir"
135912                         },
135913                         file: {
135914                             path: "webworks.core/2.0.0/client/io/file",
135915                             feature: "blackberry.io.file"
135916                         }
135917                     }
135918                 }
135919             }
135920         }
135921     }
135922 };
135923
135924 });
135925 define('ripple/platform/webworks.tablet/2.0.0/client/CameraArguments', function (require, exports, module) {
135926 /*
135927  *  Copyright 2011 Research In Motion Limited.
135928  *
135929  * Licensed under the Apache License, Version 2.0 (the "License");
135930  * you may not use this file except in compliance with the License.
135931  * You may obtain a copy of the License at
135932  *
135933  * http://www.apache.org/licenses/LICENSE-2.0
135934  *
135935  * Unless required by applicable law or agreed to in writing, software
135936  * distributed under the License is distributed on an "AS IS" BASIS,
135937  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135938  * See the License for the specific language governing permissions and
135939  * limitations under the License.
135940  */
135941 //blackberry.invoke.CameraArguments ( )
135942 var _self = function () {
135943     return {
135944         //readwrite  property  Number   view
135945         view: 0
135946     };
135947 };
135948
135949 //const Number  VIEW_CAMERA  = 0
135950 _self.__defineGetter__("VIEW_CAMERA", function () {
135951     return 0;
135952 });
135953 //const Number  VIEW_RECORDER  = 1
135954 _self.__defineGetter__("VIEW_RECORDER", function () {
135955     return 1;
135956 });
135957
135958 module.exports = _self;
135959
135960 });
135961 define('ripple/platform/webworks.tablet/2.0.0/client/io/dir', function (require, exports, module) {
135962 /*
135963  * Copyright 2011 Research In Motion Limited.
135964  *
135965  * Licensed under the Apache License, Version 2.0 (the "License");
135966  * you may not use this file except in compliance with the License.
135967  * You may obtain a copy of the License at
135968  *
135969  *     http://www.apache.org/licenses/LICENSE-2.0
135970  *
135971  * Unless required by applicable law or agreed to in writing, software
135972  * distributed under the License is distributed on an "AS IS" BASIS,
135973  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135974  * See the License for the specific language governing permissions and
135975  * limitations under the License.
135976  */
135977 var dir = require('ripple/platform/webworks.core/2.0.0/client/io/dir'),
135978     utils = require('ripple/utils'),
135979     _self = {};
135980
135981 utils.mixin({
135982     appDirs: {
135983         "app": {
135984             "storage" : {
135985                 "path" : "file:///accounts/1000/appdata/emulatedapp/data"
135986             }
135987         },
135988         "shared": {
135989             "bookmarks": {
135990                 "path" : "file:///accounts/1000/appdata/emulatedapp/shared/bookmarks"
135991             },
135992             "books": {
135993                 "path" : "file:///accounts/1000/appdata/emulatedapp/shared/books"
135994             },
135995             "camera": {
135996                 "path" : "file:///accounts/1000/appdata/emulatedapp/shared/camera"
135997             },
135998             "documents": {
135999                 "path" : "file:///accounts/1000/appdata/emulatedapp/shared/documents"
136000             },
136001             "downloads": {
136002                 "path" : "file:///accounts/1000/appdata/emulatedapp/shared/downloads"
136003             },
136004             "misc": {
136005                 "path" : "file:///accounts/1000/appdata/emulatedapp/shared/misc"
136006             },
136007             "music": {
136008                 "path" : "file:///accounts/1000/appdata/emulatedapp/shared/music"
136009             },
136010             "photos": {
136011                 "path" : "file:///accounts/1000/appdata/emulatedapp/shared/photos"
136012             },
136013             "print": {
136014                 "path" : "file:///accounts/1000/appdata/emulatedapp/shared/print"
136015             },
136016             "videos": {
136017                 "path" : "file:///accounts/1000/appdata/emulatedapp/shared/videos"
136018             },
136019             "voice": {
136020                 "path" : "file:///accounts/1000/appdata/emulatedapp/shared/voice"
136021             }
136022         }
136023     }
136024 }, _self);
136025
136026 utils.mixin(dir, _self);
136027
136028 module.exports = _self;
136029
136030 });
136031 define('ripple/platform/webworks.tablet/2.0.0/client/BrowserArguments', function (require, exports, module) {
136032 /*
136033  *  Copyright 2011 Research In Motion Limited.
136034  *
136035  * Licensed under the Apache License, Version 2.0 (the "License");
136036  * you may not use this file except in compliance with the License.
136037  * You may obtain a copy of the License at
136038  *
136039  * http://www.apache.org/licenses/LICENSE-2.0
136040  *
136041  * Unless required by applicable law or agreed to in writing, software
136042  * distributed under the License is distributed on an "AS IS" BASIS,
136043  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136044  * See the License for the specific language governing permissions and
136045  * limitations under the License.
136046  */
136047 //blackberry.invoke.BrowserArguments ( url : String ,  [transport : blackberry.identity.Transport ] )
136048 module.exports = function (url, transport) {
136049     return {
136050         url: url
136051     };
136052 };
136053
136054 });
136055 define('ripple/platform/webworks.tablet/2.0.0/client/identity', function (require, exports, module) {
136056 /*
136057  *  Copyright 2011 Research In Motion Limited.
136058  *
136059  * Licensed under the Apache License, Version 2.0 (the "License");
136060  * you may not use this file except in compliance with the License.
136061  * You may obtain a copy of the License at
136062  *
136063  * http://www.apache.org/licenses/LICENSE-2.0
136064  *
136065  * Unless required by applicable law or agreed to in writing, software
136066  * distributed under the License is distributed on an "AS IS" BASIS,
136067  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136068  * See the License for the specific language governing permissions and
136069  * limitations under the License.
136070  */
136071 var transport = require('ripple/platform/webworks.core/2.0.0/client/transport'),
136072     _uri = "blackberry/identity/",
136073     _self = {};
136074
136075 _self.__defineGetter__("PIN", function () {
136076     return transport.call(_uri + "PIN");
136077 });
136078
136079 module.exports = _self;
136080
136081 });
136082 define('ripple/platform/webworks.tablet/2.0.0/client/system', function (require, exports, module) {
136083 /*
136084  *  Copyright 2011 Research In Motion Limited.
136085  *
136086  * Licensed under the Apache License, Version 2.0 (the "License");
136087  * you may not use this file except in compliance with the License.
136088  * You may obtain a copy of the License at
136089  *
136090  * http://www.apache.org/licenses/LICENSE-2.0
136091  *
136092  * Unless required by applicable law or agreed to in writing, software
136093  * distributed under the License is distributed on an "AS IS" BASIS,
136094  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136095  * See the License for the specific language governing permissions and
136096  * limitations under the License.
136097  */
136098 var utils = require('ripple/utils'),
136099     transport = require('ripple/platform/webworks.core/2.0.0/client/transport'),
136100     system = require('ripple/platform/webworks.core/2.0.0/client/system'),
136101     _uri = "blackberry/system/";
136102
136103 system.__defineGetter__("scriptApiVersion", function () {
136104     return transport.call(_uri + "softwareVersion");
136105 });
136106
136107
136108 module.exports = system;
136109
136110 });
136111 define('ripple/platform/webworks.tablet/2.0.0/client/app', function (require, exports, module) {
136112 /*
136113  *  Copyright 2011 Research In Motion Limited.
136114  *
136115  * Licensed under the Apache License, Version 2.0 (the "License");
136116  * you may not use this file except in compliance with the License.
136117  * You may obtain a copy of the License at
136118  *
136119  * http://www.apache.org/licenses/LICENSE-2.0
136120  *
136121  * Unless required by applicable law or agreed to in writing, software
136122  * distributed under the License is distributed on an "AS IS" BASIS,
136123  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136124  * See the License for the specific language governing permissions and
136125  * limitations under the License.
136126  */
136127 var transport = require('ripple/platform/webworks.core/2.0.0/client/transport'),
136128     _uri = "blackberry/app/",
136129     _self;
136130
136131 _self = {
136132     exit: function () {
136133         transport.call(_uri + "exit", {async: true});
136134     }
136135 };
136136
136137 _self.__defineGetter__("author", function () {
136138     return transport.call(_uri + "author");
136139 });
136140
136141 _self.__defineGetter__("authorEmail", function () {
136142     return transport.call(_uri + "authorEmail");
136143 });
136144
136145 _self.__defineGetter__("authorURL", function () {
136146     return transport.call(_uri + "authorURL");
136147 });
136148
136149 _self.__defineGetter__("copyright", function () {
136150     return transport.call(_uri + "copyright");
136151 });
136152
136153 _self.__defineGetter__("description", function () {
136154     return transport.call(_uri + "description");
136155 });
136156
136157 _self.__defineGetter__("id", function () {
136158     return transport.call(_uri + "id");
136159 });
136160
136161 _self.__defineGetter__("license", function () {
136162     return transport.call(_uri + "license");
136163 });
136164
136165 _self.__defineGetter__("licenseURL", function () {
136166     return transport.call(_uri + "licenseURL");
136167 });
136168
136169 _self.__defineGetter__("name", function () {
136170     return transport.call(_uri + "name");
136171 });
136172
136173 _self.__defineGetter__("version", function () {
136174     return transport.call(_uri + "version");
136175 });
136176
136177 module.exports = _self;
136178
136179 });
136180 define('ripple/platform/webworks.tablet/2.0.0/client/invoke', function (require, exports, module) {
136181 /*\r
136182  *  Copyright 2011 Research In Motion Limited.\r
136183  *\r
136184  * Licensed under the Apache License, Version 2.0 (the "License");\r
136185  * you may not use this file except in compliance with the License.\r
136186  * You may obtain a copy of the License at\r
136187  *\r
136188  * http://www.apache.org/licenses/LICENSE-2.0\r
136189  *\r
136190  * Unless required by applicable law or agreed to in writing, software\r
136191  * distributed under the License is distributed on an "AS IS" BASIS,\r
136192  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
136193  * See the License for the specific language governing permissions and\r
136194  * limitations under the License.\r
136195  */\r
136196 var _uri = "blackberry/invoke/invoke",\r
136197     APP_TYPE = "appType",\r
136198     APP_URL_CAMERA = "camera://",\r
136199     APP_URL_CAMERA_VIDEO = "camera://video",\r
136200     APP_URL_MAP = "map://",\r
136201     APP_URL_MUSIC = "music://",\r
136202     APP_URL_PHOTOS = "photos://",\r
136203     APP_URL_VIDEOS = "videos://",\r
136204     APP_URL_APPWORLD = "appworld://",\r
136205     APP_URL_UPDATE = "update://",\r
136206     APP_TYPE_ERROR = "appType not supported",\r
136207     APP_BROWSER_ERROR = "Protocol specified in the url is not supported.",\r
136208     transport = require('ripple/platform/webworks.core/2.0.0/client/transport'),\r
136209     _self;\r
136210 \r
136211 _self = {\r
136212     invoke: function (appType, args) {\r
136213         var get = {};\r
136214 \r
136215         switch (appType) {\r
136216 \r
136217         //Camera\r
136218         case 4:\r
136219             if (!args || args.view === 1) {\r
136220                 get.appType = APP_URL_CAMERA_VIDEO;\r
136221             } else {\r
136222                 get.appType = APP_URL_CAMERA;\r
136223             }\r
136224             break;\r
136225 \r
136226         //Maps\r
136227         case 5:\r
136228             get.appType = APP_URL_MAP;\r
136229             break;\r
136230 \r
136231         //Browser\r
136232         case 11:\r
136233 \r
136234             if (!args) {\r
136235                 get.appType = "http://";\r
136236             }\r
136237             else {\r
136238                 get.appType = args.url.split("://");\r
136239 \r
136240                 if (get.appType.length === 1) {\r
136241                     get.appType = "http://" + get.appType[0];\r
136242                 }\r
136243                 else if (get.appType.length === 2) {\r
136244                     if (get.appType[0].indexOf("http") !== 0) {\r
136245                         throw APP_BROWSER_ERROR;\r
136246                     }\r
136247                     else {\r
136248                         get.appType = args.url;\r
136249                     }\r
136250                 }\r
136251             }\r
136252             break;\r
136253 \r
136254         //Music\r
136255         case 13:\r
136256             get.appType = APP_URL_MUSIC;\r
136257             break;\r
136258 \r
136259         //Photos\r
136260         case 14:\r
136261             get.appType = APP_URL_PHOTOS;\r
136262             break;\r
136263 \r
136264         //Videos\r
136265         case 15:\r
136266             get.appType = APP_URL_VIDEOS;\r
136267             break;\r
136268 \r
136269         //AppWorld\r
136270         case 16:\r
136271             get.appType = APP_URL_APPWORLD;\r
136272             break;\r
136273 \r
136274         //Update\r
136275         case 17:\r
136276             get.appType = APP_URL_UPDATE;\r
136277             break;\r
136278 \r
136279         default:\r
136280             throw APP_TYPE_ERROR;\r
136281         }\r
136282 \r
136283         transport.call(_uri, {\r
136284             get: get,\r
136285             async: true\r
136286         });\r
136287     }\r
136288 };\r
136289 \r
136290 _self.__defineGetter__("APP_CAMERA", function () {\r
136291     return 4;\r
136292 });\r
136293 _self.__defineGetter__("APP_MAPS", function () {\r
136294     return 5;\r
136295 });\r
136296 _self.__defineGetter__("APP_BROWSER", function () {\r
136297     return 11;\r
136298 });\r
136299 _self.__defineGetter__("APP_MUSIC", function () {\r
136300     return 13;\r
136301 });\r
136302 _self.__defineGetter__("APP_PHOTOS", function () {\r
136303     return 14;\r
136304 });\r
136305 _self.__defineGetter__("APP_VIDEOS", function () {\r
136306     return 15;\r
136307 });\r
136308 _self.__defineGetter__("APP_APPWORLD", function () {\r
136309     return 16;\r
136310 });\r
136311 \r
136312 module.exports = _self;\r
136313
136314 });
136315 define('ripple/platform/webworks.tablet/2.0.0/client/systemEvent', function (require, exports, module) {
136316 /*
136317  *  Copyright 2011 Research In Motion Limited.
136318  *
136319  * Licensed under the Apache License, Version 2.0 (the "License");
136320  * you may not use this file except in compliance with the License.
136321  * You may obtain a copy of the License at
136322  *
136323  * http://www.apache.org/licenses/LICENSE-2.0
136324  *
136325  * Unless required by applicable law or agreed to in writing, software
136326  * distributed under the License is distributed on an "AS IS" BASIS,
136327  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136328  * See the License for the specific language governing permissions and
136329  * limitations under the License.
136330  */
136331 var transport = require('ripple/platform/webworks.core/2.0.0/client/transport'),
136332     api = "blackberry/system/event/";
136333
136334 function _poll(evt, handler) {
136335     transport.poll(api + evt, {}, function (data, response) {
136336         if (handler) {
136337             handler(data);
136338         }
136339         return !!handler;
136340     });
136341 }
136342
136343 module.exports = {
136344     deviceBatteryLevelChange: function (handler) {
136345         _poll("deviceBatteryLevelChange", handler);
136346     },
136347     deviceBatteryStateChange: function (handler) {
136348         _poll("deviceBatteryStateChange", handler);
136349     }
136350 };
136351
136352 });
136353 define('ripple/platform/webworks.tablet/2.0.0/client/appEvent', function (require, exports, module) {
136354 /*
136355  *  Copyright 2011 Research In Motion Limited.
136356  *
136357  * Licensed under the Apache License, Version 2.0 (the "License");
136358  * you may not use this file except in compliance with the License.
136359  * You may obtain a copy of the License at
136360  *
136361  * http://www.apache.org/licenses/LICENSE-2.0
136362  *
136363  * Unless required by applicable law or agreed to in writing, software
136364  * distributed under the License is distributed on an "AS IS" BASIS,
136365  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136366  * See the License for the specific language governing permissions and
136367  * limitations under the License.
136368  */
136369 var transport = require('ripple/platform/webworks.core/2.0.0/client/transport'),
136370     _callbacks = {},
136371     _self;
136372
136373 function _poll(evt, handler) {
136374     _callbacks[evt] = handler;
136375
136376     transport.poll("blackberry/app/event/" + evt, {}, function () {
136377         var func = _callbacks[evt];
136378
136379         if (func) {
136380             func();
136381         }
136382
136383         return !!func;
136384     });
136385 }
136386
136387 _self = {
136388     onBackground: function (handler) {
136389         _poll("onBackground", handler);
136390     },
136391
136392     onForeground: function (handler) {
136393         _poll("onForeground", handler);
136394     },
136395
136396     onSwipeDown: function (handler) {
136397         _poll("onSwipeDown", handler);
136398     },
136399
136400     onSwipeStart: function (handler) {
136401         _poll("onSwipeStart", handler);
136402     }
136403 };
136404
136405 module.exports = _self;
136406
136407 });
136408 define('ripple/platform/webworks.tablet/2.0.0/spec/device', function (require, exports, module) {
136409 /*
136410  *  Copyright 2011 Research In Motion Limited.
136411  *
136412  * Licensed under the Apache License, Version 2.0 (the "License");
136413  * you may not use this file except in compliance with the License.
136414  * You may obtain a copy of the License at
136415  *
136416  * http://www.apache.org/licenses/LICENSE-2.0
136417  *
136418  * Unless required by applicable law or agreed to in writing, software
136419  * distributed under the License is distributed on an "AS IS" BASIS,
136420  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136421  * See the License for the specific language governing permissions and
136422  * limitations under the License.
136423  */
136424 var event = require('ripple/event');
136425
136426 module.exports = {
136427     "transports": {
136428         "TCPCellular": {
136429             "name": "Cellular TCP",
136430             "control": {
136431                 "type": "checkbox",
136432                 "value": true
136433             }
136434         },
136435         "WAP": {
136436             "name": "WAP",
136437             "control": {
136438                 "type": "checkbox",
136439                 "value": false
136440             }
136441         },
136442         "WAP2": {
136443             "name": "WAP 2.0",
136444             "control": {
136445                 "type": "checkbox",
136446                 "value": false
136447             }
136448         },
136449         "MDS": {
136450             "name": "MDS",
136451             "control": {
136452                 "type": "checkbox",
136453                 "value": true
136454             }
136455         },
136456         "BISB": {
136457             "name": "BIS B",
136458             "control": {
136459                 "type": "checkbox",
136460                 "value": true
136461             }
136462         },
136463         "Unite": {
136464             "name": "Unite!",
136465             "control": {
136466                 "type": "checkbox",
136467                 "value": false
136468             }
136469         },
136470         "TCPWifi": {
136471             "name": "Wifi TCP",
136472             "control": {
136473                 "type": "checkbox",
136474                 "value": true
136475             }
136476         }
136477     },
136478     "identity": {
136479         "PIN": {
136480             "name": "PIN",
136481             "control": {
136482                 "type": "text",
136483                 "value": "43A8C489"
136484             }
136485         }
136486     },
136487     "battery": {
136488         "state": {
136489             "name": "Handset is Charging",
136490             "control": {
136491                 "type": "checkbox",
136492                 "value": true
136493             },
136494             "callback": function (setting) {
136495                 event.trigger("DeviceBatteryStateChanged", [setting]);
136496             }
136497         },
136498         "level":  {
136499             "name": "Charge Level (% remaining)",
136500             "control": {
136501                 "type": "select",
136502                 "value": 100
136503             },
136504             "options": (function () {
136505                 var i,
136506                     optionList = {};
136507
136508                 for (i = 0; i <= 100; i++) {
136509                     optionList[i] = i;
136510                 }
136511
136512                 return optionList;
136513             }()),
136514             "callback": function (setting) {
136515                 event.trigger("DeviceBatteryLevelChanged", [setting]);
136516             }
136517         }
136518     },
136519     "system": {
136520         "isMassStorageActive": {
136521             "name": "Mass Storage Is Connected",
136522             "control": {
136523                 "type": "checkbox",
136524                 "value": true
136525             }
136526         },
136527         "hasDataCoverage": {
136528             "name": "Has Data Coverage",
136529             "control": {
136530                 "type": "checkbox",
136531                 "value": true
136532             },
136533             "callback": function (setting) {
136534                 event.trigger("CoverageChange");
136535                 require('ripple/bus').send("network", setting);
136536             }
136537         },
136538         "lag": {
136539             "name": "Lag the network",
136540             "control": {
136541                 type: "checkbox",
136542                 value: false
136543             },
136544             "callback": function (setting) {
136545                 require('ripple/bus').send("lag", setting);
136546             }
136547         },
136548         "network": {
136549             "name": "Data Network",
136550             "control": {
136551                 "type": "select",
136552                 "value": "3GPP"
136553             },
136554             "options": {
136555                 "3GPP" : "3GPP",
136556                 "CDMA": "CDMA",
136557                 "iDEN": "iDEN",
136558                 "Wi-Fi": "Wi-Fi"
136559             },
136560             "callback": function (setting) {
136561                 event.trigger("CoverageChange");
136562             }
136563         }
136564     }
136565 };
136566
136567 });
136568 define('ripple/platform/webworks.tablet/2.0.0/spec/events', function (require, exports, module) {
136569 /*
136570  *  Copyright 2011 Research In Motion Limited.
136571  *
136572  * Licensed under the Apache License, Version 2.0 (the "License");
136573  * you may not use this file except in compliance with the License.
136574  * You may obtain a copy of the License at
136575  *
136576  * http://www.apache.org/licenses/LICENSE-2.0
136577  *
136578  * Unless required by applicable law or agreed to in writing, software
136579  * distributed under the License is distributed on an "AS IS" BASIS,
136580  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136581  * See the License for the specific language governing permissions and
136582  * limitations under the License.
136583  */
136584 var _self,
136585     utils = require('ripple/utils'),
136586     event = require('ripple/event'),
136587     events = require('ripple/platform/webworks.core/2.0.0/spec/events');
136588
136589 _self = {
136590     "app.event.onSwipeDown": {
136591         callback: function () {
136592             event.trigger("AppSwipeDown");
136593         }
136594     },
136595     "app.event.onSwipeStart": {
136596         callback: function () {
136597             event.trigger("AppSwipeStart");
136598         }
136599     }
136600 };
136601
136602 utils.mixin(events, _self);
136603
136604 module.exports = _self;
136605
136606 });
136607 define('ripple/platform/webworks.tablet/2.0.0/spec/ui', function (require, exports, module) {
136608 /*
136609  *  Copyright 2011 Research In Motion Limited.
136610  *
136611  * Licensed under the Apache License, Version 2.0 (the "License");
136612  * you may not use this file except in compliance with the License.
136613  * You may obtain a copy of the License at
136614  *
136615  * http://www.apache.org/licenses/LICENSE-2.0
136616  *
136617  * Unless required by applicable law or agreed to in writing, software
136618  * distributed under the License is distributed on an "AS IS" BASIS,
136619  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136620  * See the License for the specific language governing permissions and
136621  * limitations under the License.
136622  */
136623 module.exports = {
136624     plugins: [
136625         "accelerometer",
136626         "deviceSettings",
136627         "geoView",
136628         "platformEvents",
136629         "widgetConfig",
136630         "build"
136631     ]
136632 };
136633
136634 });
136635 define('ripple/platform/webworks.tablet/2.0.0/server', function (require, exports, module) {
136636 /*
136637  *  Copyright 2011 Research In Motion Limited.
136638  *
136639  * Licensed under the Apache License, Version 2.0 (the "License");
136640  * you may not use this file except in compliance with the License.
136641  * You may obtain a copy of the License at
136642  *
136643  * http://www.apache.org/licenses/LICENSE-2.0
136644  *
136645  * Unless required by applicable law or agreed to in writing, software
136646  * distributed under the License is distributed on an "AS IS" BASIS,
136647  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136648  * See the License for the specific language governing permissions and
136649  * limitations under the License.
136650  */
136651 var utils = require('ripple/utils'),
136652     platform = "ripple/platform/webworks.tablet/2.0.0/server/",
136653     core = "ripple/platform/webworks.core/2.0.0/server/",
136654     systemEvent = require(platform + 'systemEvent'),
136655     system = {};
136656
136657 // ugh, thanks to the spec...
136658 system.event = systemEvent;
136659 utils.mixin(require(core + "system"), system);
136660
136661 module.exports = {
136662     blackberry: {
136663         identity: require(platform + "identity"),
136664         app: require(platform + "app"),
136665         invoke: require(platform + "invoke"),
136666         system: system,
136667         ui: {
136668             dialog: require(core + "dialog")
136669         },
136670         io: {
136671             dir: require(core + "io/dir"),
136672             file: require(core + "io/file")
136673         }
136674     }
136675 };
136676
136677 });
136678 define('ripple/platform/webworks.tablet/2.0.0/server/identity', function (require, exports, module) {
136679 /*
136680  *  Copyright 2011 Research In Motion Limited.
136681  *
136682  * Licensed under the Apache License, Version 2.0 (the "License");
136683  * you may not use this file except in compliance with the License.
136684  * You may obtain a copy of the License at
136685  *
136686  * http://www.apache.org/licenses/LICENSE-2.0
136687  *
136688  * Unless required by applicable law or agreed to in writing, software
136689  * distributed under the License is distributed on an "AS IS" BASIS,
136690  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136691  * See the License for the specific language governing permissions and
136692  * limitations under the License.
136693  */
136694 var deviceSettings = require('ripple/deviceSettings');
136695
136696 module.exports = {
136697     PIN: function () {
136698         return {code: 1, data: deviceSettings.retrieve("identity.PIN")};
136699     }
136700 };
136701
136702 });
136703 define('ripple/platform/webworks.tablet/2.0.0/server/app', function (require, exports, module) {
136704 /*
136705  *  Copyright 2011 Research In Motion Limited.
136706  *
136707  * Licensed under the Apache License, Version 2.0 (the "License");
136708  * you may not use this file except in compliance with the License.
136709  * You may obtain a copy of the License at
136710  *
136711  * http://www.apache.org/licenses/LICENSE-2.0
136712  *
136713  * Unless required by applicable law or agreed to in writing, software
136714  * distributed under the License is distributed on an "AS IS" BASIS,
136715  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136716  * See the License for the specific language governing permissions and
136717  * limitations under the License.
136718  */
136719 var event = require('ripple/event'),
136720     app = require('ripple/app'),
136721     _self;
136722
136723 _self = {
136724     event: require('ripple/platform/webworks.tablet/2.0.0/server/appEvent'),
136725
136726     exit: function () {
136727         event.trigger("AppExit");
136728         return {code: 1};
136729     },
136730
136731     author: function () {
136732         return {code: 1, data: app.getInfo().author};
136733     },
136734
136735     authorEmail: function () {
136736         return {code: 1, data: app.getInfo().authorEmail};
136737     },
136738
136739     authorURL: function () {
136740         return {code: 1, data: app.getInfo().authorURL};
136741     },
136742
136743     copyright: function () {
136744         return {code: 1, data: app.getInfo().copyright};
136745     },
136746
136747     description: function () {
136748         return {code: 1, data: app.getInfo().description};
136749     },
136750
136751     id: function () {
136752         return {code: 1, data: app.getInfo().id};
136753     },
136754
136755     license: function () {
136756         return {code: 1, data: app.getInfo().license};
136757     },
136758
136759     licenseURL: function () {
136760         return {code: 1, data: app.getInfo().licenseURL};
136761     },
136762
136763     name: function () {
136764         return {code: 1, data: app.getInfo().name};
136765     },
136766
136767     version: function () {
136768         return {code: 1, data: app.getInfo().version};
136769     }
136770 };
136771
136772 module.exports = _self;
136773
136774 });
136775 define('ripple/platform/webworks.tablet/2.0.0/server/invoke', function (require, exports, module) {
136776 /*
136777  *  Copyright 2011 Research In Motion Limited.
136778  *
136779  * Licensed under the Apache License, Version 2.0 (the "License");
136780  * you may not use this file except in compliance with the License.
136781  * You may obtain a copy of the License at
136782  *
136783  * http://www.apache.org/licenses/LICENSE-2.0
136784  *
136785  * Unless required by applicable law or agreed to in writing, software
136786  * distributed under the License is distributed on an "AS IS" BASIS,
136787  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136788  * See the License for the specific language governing permissions and
136789  * limitations under the License.
136790  */
136791 var notifications = require('ripple/notifications'),
136792     constants = require('ripple/constants'),
136793     type = "normal",
136794     name = {
136795         "camera://": "Camera",
136796         "camera://video": "Video Camera",
136797         "map://": "Maps",
136798         "http://": "Browser",
136799         "music://": "Music",
136800         "photos://": "Photos",
136801         "videos://": "Videos",
136802         "appworld://": "App World",
136803         "update://": "Update"
136804     };
136805
136806 module.exports = {
136807     invoke: function (opts) {
136808         var app = name[opts.appType];
136809         if (app === undefined && opts.appType && opts.appType.match(/^http/i)) {
136810             app = "Browser";
136811         }
136812
136813         notifications.openNotification(type,
136814            "Requested to launch: " + app + " application.");
136815         return {code: 1};
136816     }
136817 };
136818
136819 });
136820 define('ripple/platform/webworks.tablet/2.0.0/server/systemEvent', function (require, exports, module) {
136821 /*
136822  *  Copyright 2011 Research In Motion Limited.
136823  *
136824  * Licensed under the Apache License, Version 2.0 (the "License");
136825  * you may not use this file except in compliance with the License.
136826  * You may obtain a copy of the License at
136827  *
136828  * http://www.apache.org/licenses/LICENSE-2.0
136829  *
136830  * Unless required by applicable law or agreed to in writing, software
136831  * distributed under the License is distributed on an "AS IS" BASIS,
136832  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136833  * See the License for the specific language governing permissions and
136834  * limitations under the License.
136835  */
136836 var event = require('ripple/event'),
136837     _onBatteryStateChange,
136838     _onBatteryLevelChange,
136839     _states = {
136840         UNKNOWN: 0,
136841         FULL: 1,
136842         CHARGING: 2,
136843         UNPLUGGED: 3
136844     },
136845     _battery = {
136846         state: _states.UNKNOWN,
136847         charging: null,
136848         level: null
136849     };
136850
136851 function _getState() {
136852     return _battery.level === 100 ? _states.FULL :
136853            _battery.charging ? _states.CHARGING : _states.UNPLUGGED;
136854 }
136855
136856 function _pass(baton, data) {
136857     if (baton) {
136858         baton.pass({code: 1, data: data});
136859     }
136860 }
136861
136862 event.on("DeviceBatteryStateChanged", function (charging) {
136863     _battery.charging = charging;
136864     _battery.state = _getState();
136865     _pass(_onBatteryStateChange, _battery.state);
136866 });
136867
136868 event.on("DeviceBatteryLevelChanged", function (level) {
136869     level = parseInt(level, 10);
136870
136871     _battery.level = level;
136872     _pass(_onBatteryLevelChange, level);
136873
136874     if (level === 100) {
136875         _battery.state = _getState();
136876         _pass(_onBatteryStateChange, _battery.state);
136877     }
136878 });
136879
136880 module.exports = {
136881     deviceBatteryLevelChange: function (get, post, baton) {
136882         baton.take();
136883         _onBatteryLevelChange = baton;
136884     },
136885     deviceBatteryStateChange: function (get, post, baton) {
136886         baton.take();
136887         _onBatteryStateChange = baton;
136888     }
136889 };
136890
136891 });
136892 define('ripple/platform/webworks.tablet/2.0.0/server/appEvent', function (require, exports, module) {
136893 /*
136894  *  Copyright 2011 Research In Motion Limited.
136895  *
136896  * Licensed under the Apache License, Version 2.0 (the "License");
136897  * you may not use this file except in compliance with the License.
136898  * You may obtain a copy of the License at
136899  *
136900  * http://www.apache.org/licenses/LICENSE-2.0
136901  *
136902  * Unless required by applicable law or agreed to in writing, software
136903  * distributed under the License is distributed on an "AS IS" BASIS,
136904  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136905  * See the License for the specific language governing permissions and
136906  * limitations under the License.
136907  */
136908 var event = require('ripple/event'),
136909     notifications = require('ripple/notifications'),
136910     _bg,
136911     _fg,
136912     _swipeDown,
136913     _swipeStart,
136914     _exit;
136915
136916 event.on("AppExit", function () {
136917     var baton = _exit;
136918     _exit = null;
136919     notifications.openNotification("normal", "blackberry.app.exit() as called, in the real world your app will exit, here... you get this notification");
136920     return baton && baton.pass({code: 1});
136921 });
136922
136923 event.on("AppRequestBackground", function () {
136924     var baton = _bg;
136925     _bg = null;
136926     return baton && baton.pass({code: 1});
136927 });
136928
136929 event.on("AppRequestForeground", function () {
136930     var baton = _fg;
136931     _fg = null;
136932     return baton && baton.pass({code: 1});
136933 });
136934
136935 event.on("AppSwipeDown", function () {
136936     var baton = _swipeDown;
136937     _swipeDown = null;
136938     return baton && baton.pass({code: 1});
136939 });
136940
136941 event.on("AppSwipeStart", function () {
136942     var baton = _swipeStart;
136943     _swipeStart = null;
136944     return baton && baton.pass({code: 1});
136945 });
136946
136947 module.exports = {
136948     onBackground: function (get, post, baton) {
136949         baton.take();
136950         _bg = baton;
136951         return {code: 1};
136952     },
136953
136954     onForeground: function (get, post, baton) {
136955         baton.take();
136956         _fg = baton;
136957         return {code: 1};
136958     },
136959
136960     onSwipeDown: function (get, post, baton) {
136961         baton.take();
136962         _swipeDown = baton;
136963         return {code: 1};
136964     },
136965
136966     onSwipeStart: function (get, post, baton) {
136967         baton.take();
136968         _swipeStart = baton;
136969         return {code: 1};
136970     }
136971 };
136972
136973 });
136974 define('ripple/platform/webworks.handset/2.0.0/XMLHttpRequest', function (require, exports, module) {
136975 /*
136976  *  Copyright 2011 Research In Motion Limited.
136977  *
136978  * Licensed under the Apache License, Version 2.0 (the "License");
136979  * you may not use this file except in compliance with the License.
136980  * You may obtain a copy of the License at
136981  *
136982  * http://www.apache.org/licenses/LICENSE-2.0
136983  *
136984  * Unless required by applicable law or agreed to in writing, software
136985  * distributed under the License is distributed on an "AS IS" BASIS,
136986  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136987  * See the License for the specific language governing permissions and
136988  * limitations under the License.
136989  */
136990
136991 var xhr = require("ripple/platform/webworks.core/2.0.0/XMLHttpRequest");
136992 module.exports = xhr.create("ripple/platform/webworks.handset/2.0.0/server");
136993
136994 });
136995 define('ripple/platform/webworks.handset/2.0.0/spec', function (require, exports, module) {
136996 /*
136997  *  Copyright 2011 Research In Motion Limited.
136998  *
136999  * Licensed under the Apache License, Version 2.0 (the "License");
137000  * you may not use this file except in compliance with the License.
137001  * You may obtain a copy of the License at
137002  *
137003  * http://www.apache.org/licenses/LICENSE-2.0
137004  *
137005  * Unless required by applicable law or agreed to in writing, software
137006  * distributed under the License is distributed on an "AS IS" BASIS,
137007  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137008  * See the License for the specific language governing permissions and
137009  * limitations under the License.
137010  */
137011 module.exports = {
137012
137013     id: "webworks.handset",
137014     version: "2.0.0",
137015     name: "WebWorks",
137016
137017     persistencePrefix: "rim-handset-",
137018
137019     ui: require('ripple/platform/webworks.handset/2.0.0/spec/ui'),
137020     device: require('ripple/platform/webworks.handset/2.0.0/spec/device'),
137021     config: require('ripple/platform/webworks.core/2.0.0/spec/config'),
137022     events: require('ripple/platform/webworks.handset/2.0.0/spec/events'),
137023
137024     initialize: function () {},
137025
137026     objects: {
137027         XMLHttpRequest: {
137028             path: "webworks.handset/2.0.0/XMLHttpRequest"
137029         },
137030         Coordinates: {
137031             path: "w3c/1.0/Coordinates"
137032         },
137033         Position: {
137034             path: "w3c/1.0/Position"
137035         },
137036         PositionError: {
137037             path: "w3c/1.0/PositionError"
137038         },
137039         navigator: {
137040             path: "w3c/1.0/navigator",
137041             children: {
137042                 geolocation: {
137043                     path: "w3c/1.0/geolocation"
137044                 }
137045             }
137046         },
137047         blackberry: {
137048             path: "webworks.handset/2.0.0/client/blackberry",
137049             children: {
137050                 pim: {
137051                     path: "webworks.handset/2.0.0/client/pim",
137052                     feature: "blackberry.pim.category|blackberry.pim.Task|blackberry.pim.Recurrence|blackberry.pim.Reminder|blackberry.pim.Appointment|blackberry.pim.Address|blackberry.pim.Attendee|blackberry.pim.Memo|blackberry.pim.Contact",
137053                     children: {
137054                         category: {
137055                             path: "webworks.handset/2.0.0/client/category",
137056                             feature: "blackberry.pim.category"
137057                         },
137058                         Task: {
137059                             path: "webworks.handset/2.0.0/client/Task",
137060                             feature: "blackberry.pim.Task"
137061                         },
137062                         Recurrence: {
137063                             path: "webworks.handset/2.0.0/client/Recurrence",
137064                             feature: "blackberry.pim.Recurrence"
137065                         },
137066                         Reminder: {
137067                             path: "webworks.handset/2.0.0/client/Reminder",
137068                             feature: "blackberry.pim.Reminder"
137069                         },
137070                         Appointment: {
137071                             path: "webworks.handset/2.0.0/client/Appointment",
137072                             feature: "blackberry.pim.Appointment"
137073                         },
137074                         Address: {
137075                             path: "webworks.handset/2.0.0/client/Address",
137076                             feature: "blackberry.pim.Address"
137077                         },
137078                         Attendee: {
137079                             path: "webworks.handset/2.0.0/client/Attendee",
137080                             feature: "blackberry.pim.Attendee"
137081                         },
137082                         Memo: {
137083                             path: "webworks.handset/2.0.0/client/Memo",
137084                             feature: "blackberry.pim.Memo"
137085                         },
137086                         Contact: {
137087                             path: "webworks.handset/2.0.0/client/Contact",
137088                             feature: "blackberry.pim.Contact"
137089                         }
137090                     }
137091                 },
137092                 phone: {
137093                     children: {
137094                         Phone: {
137095                             path: "webworks.handset/2.0.0/client/Phone",
137096                             feature: "blackberry.phone.Phone"
137097                         },
137098                         PhoneLogs: {
137099                             path: "webworks.handset/2.0.0/client/PhoneLogs",
137100                             feature: "blackberry.phone.PhoneLogs|blackberry.phone.Find",
137101                             children: {
137102                                 CallLog: {
137103                                     path: "webworks.handset/2.0.0/client/CallLog"
137104                                 }
137105                             }
137106                         },
137107                         Find: {
137108                             children: {
137109                                 FilterExpression: {
137110                                     path: "webworks.handset/2.0.0/client/FilterExpression",
137111                                     feature: "blackberry.phone.Find"
137112                                 }
137113                             }
137114                         }
137115                     }
137116                 },
137117                 message: {
137118                     path: "webworks.handset/2.0.0/client/messaging",
137119                     feature: "blackberry.message.sms|blackberry.message",
137120                     children: {
137121                         sms: {
137122                             path: "webworks.handset/2.0.0/client/sms",
137123                             feature: "blackberry.message.sms"
137124                         },
137125                         Message: {
137126                             path: "webworks.handset/2.0.0/client/Message",
137127                             feature: "blackberry.message"
137128                         }
137129                     }
137130                 },
137131                 transport: {
137132                     path: "webworks.core/2.0.0/client/transport"
137133                 },
137134                 events: {
137135                     path: "webworks.core/2.0.0/client/events"
137136                 },
137137                 app: {
137138                     path: "webworks.handset/2.0.0/client/app",
137139                     feature: "blackberry.app",
137140                     children: {
137141                         event: {
137142                             path: "webworks.handset/2.0.0/client/appEvent",
137143                             feature: "blackberry.app.event"
137144                         }
137145                     }
137146                 },
137147                 invoke: {
137148                     path: "webworks.handset/2.0.0/client/invoke",
137149                     feature: "blackberry.invoke",
137150                     children: {
137151                         AddressBookArguments: {
137152                             path: "webworks.handset/2.0.0/client/AddressBookArguments",
137153                             feature: "blackberry.invoke.AddressBookArguments"
137154                         },
137155                         BrowserArguments: {
137156                             path: "webworks.handset/2.0.0/client/BrowserArguments",
137157                             feature: "blackberry.invoke.BrowserArguments"
137158                         },
137159                         CameraArguments: {
137160                             path: "webworks.handset/2.0.0/client/CameraArguments",
137161                             feature: "blackberry.invoke.CameraArguments"
137162                         },
137163                         CalendarArguments: {
137164                             path: "webworks.handset/2.0.0/client/CalendarArguments",
137165                             feature: "blackberry.invoke.CalendarArguments"
137166                         },
137167                         JavaArguments: {
137168                             path: "webworks.handset/2.0.0/client/JavaArguments",
137169                             feature: "blackberry.invoke.JavaArguments"
137170                         },
137171                         MapsArguments: {
137172                             path: "webworks.handset/2.0.0/client/MapsArguments",
137173                             feature: "blackberry.invoke.MapsArguments"
137174                         },
137175                         MemoArguments: {
137176                             path: "webworks.handset/2.0.0/client/MemoArguments",
137177                             feature: "blackberry.invoke.MemoArguments"
137178                         },
137179                         MessageArguments: {
137180                             path: "webworks.handset/2.0.0/client/MessageArguments",
137181                             feature: "blackberry.invoke.MessageArguments"
137182                         },
137183                         PhoneArguments: {
137184                             path: "webworks.handset/2.0.0/client/PhoneArguments",
137185                             feature: "blackberry.invoke.PhoneArguments"
137186                         },
137187                         SearchArguments: {
137188                             path: "webworks.handset/2.0.0/client/SearchArguments",
137189                             feature: "blackberry.invoke.SearchArguments"
137190                         },
137191                         TaskArguments: {
137192                             path: "webworks.handset/2.0.0/client/TaskArguments",
137193                             feature: "blackberry.invoke.TaskArguments"
137194                         }
137195                     }
137196                 },
137197                 identity: {
137198                     path: "webworks.handset/2.0.0/client/identity",
137199                     feature: "blackberry.identity",
137200                     children: {
137201                         Transport: {
137202                             path: "webworks.handset/2.0.0/client/identity/Transport",
137203                             feature: "blackberry.identity"
137204                         },
137205                         Service: {
137206                             path: "webworks.handset/2.0.0/client/identity/Service",
137207                             feature: "blackberry.identity"
137208                         },
137209                         phone: {
137210                             path: "webworks.handset/2.0.0/client/identity/phone",
137211                             feature: "blackberry.identity.phone"
137212                         }
137213                     }
137214                 },
137215                 system: {
137216                     path: "webworks.handset/2.0.0/client/system",
137217                     feature: "blackberry.system",
137218                     children: {
137219                         event: {
137220                             path: "webworks.handset/2.0.0/client/systemEvent",
137221                             feature: "blackberry.system.event"
137222                         }
137223                     }
137224                 },
137225                 ui: {
137226                     children: {
137227                         dialog: {
137228                             path: "webworks.core/2.0.0/client/dialog",
137229                             feature: "blackberry.ui.dialog"
137230                         },
137231                         menu: {
137232                             path: "webworks.handset/2.0.0/client/menu",
137233                             children: {
137234                                 MenuItem: {
137235                                     path: "webworks.handset/2.0.0/client/MenuItem"
137236                                 }
137237                             }
137238                         }
137239                     }
137240                 },
137241                 utils: {
137242                     path: "webworks.core/2.0.0/client/utils",
137243                     feature: "blackberry.utils"
137244                 },
137245                 find: {
137246                     feature: "blackberry.find",
137247                     children: {
137248                         FilterExpression: {
137249                             path: "webworks.handset/2.0.0/client/FilterExpression",
137250                             feature: "blackberry.find"
137251                         }
137252                     }
137253                 },
137254                 push: {
137255                     path: "webworks.handset/2.0.0/client/push",
137256                     feature: "blackberry.push"
137257                 },
137258                 audio: {
137259                     path: "webworks.handset/2.0.0/client/audio",
137260                     feature: "blackberry.audio",
137261                     children: {
137262                         Player: {
137263                             path: "webworks.handset/2.0.0/client/AudioPlayer",
137264                             feature: "blackberry.audio.Player"
137265                         }
137266                     }
137267                 },
137268                 io: {
137269                     children: {
137270                         dir: {
137271                             path: "webworks.handset/2.0.0/client/io/dir",
137272                             feature: "blackberry.io.dir"
137273                         },
137274                         file: {
137275                             path: "webworks.core/2.0.0/client/io/file",
137276                             feature: "blackberry.io.file"
137277                         }
137278                     }
137279                 }
137280             }
137281         }
137282     }
137283 };
137284
137285 });
137286 define('ripple/platform/webworks.handset/2.0.0/client/CalendarArguments', function (require, exports, module) {
137287 /*
137288  *  Copyright 2011 Research In Motion Limited.
137289  *
137290  * Licensed under the Apache License, Version 2.0 (the "License");
137291  * you may not use this file except in compliance with the License.
137292  * You may obtain a copy of the License at
137293  *
137294  * http://www.apache.org/licenses/LICENSE-2.0
137295  *
137296  * Unless required by applicable law or agreed to in writing, software
137297  * distributed under the License is distributed on an "AS IS" BASIS,
137298  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137299  * See the License for the specific language governing permissions and
137300  * limitations under the License.
137301  */
137302 //blackberry.invoke.CalendarArguments ( )
137303 //blackberry.invoke.CalendarArguments ( date : Date )
137304 //blackberry.invoke.CalendarArguments ( appointment : blackberry.pim.Appointment )
137305 var _self = function () {
137306     //readonly  property  Appointment   appointment
137307     //readonly  property  Date   date
137308     //readwrite  property  Number   view
137309     return {
137310         appointment: undefined,
137311         date: undefined,
137312         view: 0
137313     };
137314 };
137315
137316 //const Number  VIEW_NEW  = 0
137317 _self.__defineGetter__("VIEW_NEW", function () {
137318     return 0;
137319 });
137320 //const Number  VIEW_VIEW  = 1
137321 _self.__defineGetter__("VIEW_VIEW", function () {
137322     return 1;
137323 });
137324 //const Number  VIEW_AGENDA  = 2
137325 _self.__defineGetter__("VIEW_AGENDA", function () {
137326     return 2;
137327 });
137328 //const Number  VIEW_DAY  = 3
137329 _self.__defineGetter__("VIEW_DAY", function () {
137330     return 3;
137331 });
137332 //const Number  VIEW_DEFAULT  = 4
137333 _self.__defineGetter__("VIEW_DEFAULT", function () {
137334     return 4;
137335 });
137336 //const Number  VIEW_MONTH  = 5
137337 _self.__defineGetter__("VIEW_MONTH", function () {
137338     return 5;
137339 });
137340 //const Number  VIEW_WEEK  = 6
137341 _self.__defineGetter__("VIEW_WEEK", function () {
137342     return 6;
137343 });
137344
137345 module.exports = _self;
137346
137347 });
137348 define('ripple/platform/webworks.handset/2.0.0/client/Appointment', function (require, exports, module) {
137349 /*
137350  *  Copyright 2011 Research In Motion Limited.
137351  *
137352  * Licensed under the Apache License, Version 2.0 (the "License");
137353  * you may not use this file except in compliance with the License.
137354  * You may obtain a copy of the License at
137355  *
137356  * http://www.apache.org/licenses/LICENSE-2.0
137357  *
137358  * Unless required by applicable law or agreed to in writing, software
137359  * distributed under the License is distributed on an "AS IS" BASIS,
137360  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137361  * See the License for the specific language governing permissions and
137362  * limitations under the License.
137363  */
137364 var transport = require('ripple/platform/webworks.core/2.0.0/client/transport'),
137365     utils = require('ripple/utils'),
137366     _uri = "blackberry/pim/appointment/";
137367
137368 function Appointment(service) {
137369     var _self = {
137370         allDay: false,
137371         attendees: [],
137372         end: null,
137373         freeBusy: null,
137374         location: null,
137375         note: null,
137376         recurrence: null,
137377         reminder: null,
137378         start: null,
137379         summary: null,
137380         uid: null,
137381         remove: function () {
137382             transport.call(_uri + "remove", {get: {uid: _self.uid}});
137383         },
137384         save: function () {
137385             if (_self.uid === null) {
137386                 _self.uid  = Number(Math.uuid(8, 10));
137387             }
137388             transport.call(_uri + "save", {post: {appointment: _self}});
137389         }
137390     };
137391
137392     return _self;
137393 }
137394
137395 function _massage(property, name) {
137396     if (name === "recurrence" && property) {
137397         if (property.end) {
137398             property.end = new Date(property.end);
137399         }
137400     }
137401     if (name === "reminder" && property) {
137402         if (property.date) {
137403             property.date = new Date(property.date);
137404         }
137405     }
137406     if ((name === "end" || name === "start") && property) {
137407         property = new Date(property);
137408     }
137409     return property;
137410 }
137411
137412 Appointment.find = function (filter, orderBy, maxReturn, service, isAscending) {
137413     var opts = {
137414         post: {
137415             filter: filter,
137416             orderBy: orderBy,
137417             maxReturn: maxReturn,
137418             service: service,
137419             isAscending: isAscending
137420         }
137421     };
137422
137423     return transport.call(_uri + "find", opts).map(function (obj) {
137424         var appt = new Appointment();
137425         appt.allDay = obj.allDay;
137426         appt.attendees = obj.attendees;
137427         appt.end = _massage(obj.end, "end");
137428         appt.freeBusy = obj.freeBusy;
137429         appt.location = obj.location;
137430         appt.note = obj.note;
137431         appt.recurrence = _massage(obj.recurrence, "recurrence");
137432         appt.reminder = _massage(obj.reminder, "reminder");
137433         appt.start = _massage(obj.start, "start");
137434         appt.summary = obj.summary;
137435         appt.uid = obj.uid;
137436         return appt;
137437     });
137438 };
137439
137440 Appointment.__defineGetter__("FREE", function () {
137441     return 0;
137442 });
137443 Appointment.__defineGetter__("TENTATIVE", function () {
137444     return 1;
137445 });
137446 Appointment.__defineGetter__("BUSY", function () {
137447     return 2;
137448 });
137449 Appointment.__defineGetter__("OUT_OF_OFFICE", function () {
137450     return 3;
137451 });
137452
137453 module.exports = Appointment;
137454
137455 });
137456 define('ripple/platform/webworks.handset/2.0.0/client/messaging', function (require, exports, module) {
137457 /*
137458  *  Copyright 2011 Research In Motion Limited.
137459  *
137460  * Licensed under the Apache License, Version 2.0 (the "License");
137461  * you may not use this file except in compliance with the License.
137462  * You may obtain a copy of the License at
137463  *
137464  * http://www.apache.org/licenses/LICENSE-2.0
137465  *
137466  * Unless required by applicable law or agreed to in writing, software
137467  * distributed under the License is distributed on an "AS IS" BASIS,
137468  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137469  * See the License for the specific language governing permissions and
137470  * limitations under the License.
137471  */
137472 module.exports = {};
137473
137474 });
137475 define('ripple/platform/webworks.handset/2.0.0/client/CameraArguments', function (require, exports, module) {
137476 /*
137477  *  Copyright 2011 Research In Motion Limited.
137478  *
137479  * Licensed under the Apache License, Version 2.0 (the "License");
137480  * you may not use this file except in compliance with the License.
137481  * You may obtain a copy of the License at
137482  *
137483  * http://www.apache.org/licenses/LICENSE-2.0
137484  *
137485  * Unless required by applicable law or agreed to in writing, software
137486  * distributed under the License is distributed on an "AS IS" BASIS,
137487  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137488  * See the License for the specific language governing permissions and
137489  * limitations under the License.
137490  */
137491 //blackberry.invoke.CameraArguments ( )
137492 var _self = function () {
137493     return {
137494         //readwrite  property  Number   view
137495         view: 0
137496     };
137497 };
137498
137499 //const Number  VIEW_CAMERA  = 0
137500 _self.__defineGetter__("VIEW_CAMERA", function () {
137501     return 0;
137502 });
137503 //const Number  VIEW_RECORDER  = 1
137504 _self.__defineGetter__("VIEW_RECORDER", function () {
137505     return 1;
137506 });
137507
137508 module.exports = _self;
137509
137510 });
137511 define('ripple/platform/webworks.handset/2.0.0/client/io/dir', function (require, exports, module) {
137512 /*
137513  * Copyright 2011 Research In Motion Limited.
137514  *
137515  * Licensed under the Apache License, Version 2.0 (the "License");
137516  * you may not use this file except in compliance with the License.
137517  * You may obtain a copy of the License at
137518  *
137519  *     http://www.apache.org/licenses/LICENSE-2.0
137520  *
137521  * Unless required by applicable law or agreed to in writing, software
137522  * distributed under the License is distributed on an "AS IS" BASIS,
137523  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137524  * See the License for the specific language governing permissions and
137525  * limitations under the License.
137526  */
137527 var transport = require('ripple/platform/webworks.core/2.0.0/client/transport'),
137528     dir = require('ripple/platform/webworks.core/2.0.0/client/io/dir'),
137529     utils = require('ripple/utils'),
137530     _uri = "blackberry/io/dir/",
137531     FILE = "file://",
137532     _self = {};
137533
137534 function _prunePrefix(path) {
137535     return path.replace(new RegExp("^" + FILE), '');
137536 }
137537
137538 utils.mixin({
137539     getFreeSpaceForRoot: function (path) {
137540         return transport.call(_uri + "getFreeSpaceForRoot", {
137541             post: {path: _prunePrefix(path)}
137542         });
137543     },
137544     getRootDirs: function () {
137545         return transport.call(_uri + "getRootDirs", {}).map(function (dir) {
137546             return FILE + dir;
137547         });
137548     }
137549 }, _self);
137550
137551 utils.mixin(dir, _self);
137552
137553 module.exports = _self;
137554
137555 });
137556 define('ripple/platform/webworks.handset/2.0.0/client/TaskArguments', function (require, exports, module) {
137557 /*
137558  *  Copyright 2011 Research In Motion Limited.
137559  *
137560  * Licensed under the Apache License, Version 2.0 (the "License");
137561  * you may not use this file except in compliance with the License.
137562  * You may obtain a copy of the License at
137563  *
137564  * http://www.apache.org/licenses/LICENSE-2.0
137565  *
137566  * Unless required by applicable law or agreed to in writing, software
137567  * distributed under the License is distributed on an "AS IS" BASIS,
137568  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137569  * See the License for the specific language governing permissions and
137570  * limitations under the License.
137571  */
137572 //blackberry.invoke.TaskArguments ( [task : blackberry.pim.Task ] )
137573 var _self = function (task) {
137574     return {
137575         view: 0,
137576         task: task
137577     };
137578 };
137579
137580 //const Number  VIEW_NEW  = 0
137581 _self.__defineGetter__("VIEW_NEW", function () {
137582     return 0;
137583 });
137584 //const Number  VIEW_EDIT  = 1
137585 _self.__defineGetter__("VIEW_EDIT", function () {
137586     return 1;
137587 });
137588
137589 module.exports = _self;
137590
137591 });
137592 define('ripple/platform/webworks.handset/2.0.0/client/identity/Service', function (require, exports, module) {
137593 /*
137594  *  Copyright 2011 Research In Motion Limited.
137595  *
137596  * Licensed under the Apache License, Version 2.0 (the "License");
137597  * you may not use this file except in compliance with the License.
137598  * You may obtain a copy of the License at
137599  *
137600  * http://www.apache.org/licenses/LICENSE-2.0
137601  *
137602  * Unless required by applicable law or agreed to in writing, software
137603  * distributed under the License is distributed on an "AS IS" BASIS,
137604  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137605  * See the License for the specific language governing permissions and
137606  * limitations under the License.
137607  */
137608 function Service() {
137609     return {
137610         emailAddress: null,
137611         isDefault: null,
137612         name: null,
137613         type: null
137614     };
137615 }
137616
137617 Service.__defineGetter__("TYPE_EMAIL", function () {
137618     return 0;
137619 });
137620
137621 Service.__defineGetter__("TYPE_CALENDAR", function () {
137622     return 1;
137623 });
137624
137625 Service.__defineGetter__("TYPE_CONTACT", function () {
137626     return 2;
137627 });
137628
137629 module.exports = Service;
137630
137631 });
137632 define('ripple/platform/webworks.handset/2.0.0/client/identity/Transport', function (require, exports, module) {
137633 /*
137634  *  Copyright 2011 Research In Motion Limited.
137635  *
137636  * Licensed under the Apache License, Version 2.0 (the "License");
137637  * you may not use this file except in compliance with the License.
137638  * You may obtain a copy of the License at
137639  *
137640  * http://www.apache.org/licenses/LICENSE-2.0
137641  *
137642  * Unless required by applicable law or agreed to in writing, software
137643  * distributed under the License is distributed on an "AS IS" BASIS,
137644  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137645  * See the License for the specific language governing permissions and
137646  * limitations under the License.
137647  */
137648 function Transport(name, type) {
137649     this.__defineGetter__("name", function () {
137650         return name || "";
137651     });
137652     this.__defineGetter__("type", function () {
137653         return type || "";
137654     });
137655 }
137656
137657 module.exports = Transport;
137658
137659 });
137660 define('ripple/platform/webworks.handset/2.0.0/client/identity/phone', function (require, exports, module) {
137661 /*
137662  *  Copyright 2011 Research In Motion Limited.
137663  *
137664  * Licensed under the Apache License, Version 2.0 (the "License");
137665  * you may not use this file except in compliance with the License.
137666  * You may obtain a copy of the License at
137667  *
137668  * http://www.apache.org/licenses/LICENSE-2.0
137669  *
137670  * Unless required by applicable law or agreed to in writing, software
137671  * distributed under the License is distributed on an "AS IS" BASIS,
137672  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137673  * See the License for the specific language governing permissions and
137674  * limitations under the License.
137675  */
137676 var transport = require('ripple/platform/webworks.core/2.0.0/client/transport'),
137677     _uri = "blackberry/identity/phone/",
137678     _self;
137679
137680 _self = {
137681     getLineIds: function () {
137682         return transport.call(_uri + "getLineIds");
137683     },
137684     getLineLabel: function (id) {
137685         return transport.call(_uri + "getLineLabel", {get: {id: id}});
137686     },
137687     getLineNumber: function (id) {
137688         return transport.call(_uri + "getLineNumber", {get: {id: id}});
137689     },
137690     getLineType: function (id) {
137691         return transport.call(_uri + "getLineType", {get: {id: id}});
137692     }
137693 };
137694
137695 module.exports = _self;
137696
137697 });
137698 define('ripple/platform/webworks.handset/2.0.0/client/PhoneArguments', function (require, exports, module) {
137699 /*
137700  *  Copyright 2011 Research In Motion Limited.
137701  *
137702  * Licensed under the Apache License, Version 2.0 (the "License");
137703  * you may not use this file except in compliance with the License.
137704  * You may obtain a copy of the License at
137705  *
137706  * http://www.apache.org/licenses/LICENSE-2.0
137707  *
137708  * Unless required by applicable law or agreed to in writing, software
137709  * distributed under the License is distributed on an "AS IS" BASIS,
137710  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137711  * See the License for the specific language governing permissions and
137712  * limitations under the License.
137713  */
137714 //blackberry.invoke.PhoneArguments ( [dialString : String ] ,  [smartDialing : Boolean ] ,  [lineId : Number ] )
137715 var _self = function (dialString, smartDialing, lineId) {
137716     return {
137717         dialString: dialString,
137718         smartDialing: smartDialing,
137719         lineId: (lineId ? lineId : -1),
137720         view: 0
137721     };
137722 };
137723
137724 //const Number  VIEW_NEW  = 0
137725 _self.__defineGetter__("VIEW_CALL", function () {
137726     return 0;
137727 });
137728 //const Number  VIEW_DEFAULT  = 1
137729 _self.__defineGetter__("VIEW_VOICEMAIL", function () {
137730     return 1;
137731 });
137732
137733 module.exports = _self;
137734
137735 });
137736 define('ripple/platform/webworks.handset/2.0.0/client/BrowserArguments', function (require, exports, module) {
137737 /*
137738  *  Copyright 2011 Research In Motion Limited.
137739  *
137740  * Licensed under the Apache License, Version 2.0 (the "License");
137741  * you may not use this file except in compliance with the License.
137742  * You may obtain a copy of the License at
137743  *
137744  * http://www.apache.org/licenses/LICENSE-2.0
137745  *
137746  * Unless required by applicable law or agreed to in writing, software
137747  * distributed under the License is distributed on an "AS IS" BASIS,
137748  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137749  * See the License for the specific language governing permissions and
137750  * limitations under the License.
137751  */
137752 //blackberry.invoke.BrowserArguments ( url : String ,  [transport : blackberry.identity.Transport ] )
137753 module.exports = function (url, transport) {
137754     return {
137755         url: url
137756     };
137757 };
137758
137759 });
137760 define('ripple/platform/webworks.handset/2.0.0/client/AudioPlayer', function (require, exports, module) {
137761 /*
137762  *  Copyright 2011 Research In Motion Limited.
137763  *
137764  * Licensed under the Apache License, Version 2.0 (the "License");
137765  * you may not use this file except in compliance with the License.
137766  * You may obtain a copy of the License at
137767  *
137768  * http://www.apache.org/licenses/LICENSE-2.0
137769  *
137770  * Unless required by applicable law or agreed to in writing, software
137771  * distributed under the License is distributed on an "AS IS" BASIS,
137772  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137773  * See the License for the specific language governing permissions and
137774  * limitations under the License.
137775  */
137776 var transport = require('ripple/platform/webworks.core/2.0.0/client/transport'),
137777     _uri = "blackberry/audio/player/";
137778
137779 function Player(locator, type, async) {
137780     //we can't use the async prop since we need the ID before we can do anything else.
137781     var _id = transport.call(_uri + "create", {
137782             get: {locator: locator, type: type},
137783             async: false
137784         }),
137785         _listener,
137786         _closed,
137787         _self,
137788         _poll = function (path) {
137789             transport.poll(_uri + path, {
137790                 get: {id: _id}
137791             }, function (response) {
137792                 if (_listener) {
137793                     _listener(_self, response.event, response.eventData);
137794                 }
137795
137796                 return !!_listener;
137797             });
137798         };
137799
137800     _self = {
137801         addPlayerListener: function (callback) {
137802             if (!_closed && callback) {
137803                 _listener = callback;
137804                 _poll("onStart");
137805                 _poll("onStopped");
137806                 _poll("onBufferingStarted");
137807                 _poll("onBufferingStopped");
137808                 _poll("onDurationUpdated");
137809                 _poll("onEnd");
137810                 _poll("onError");
137811                 _poll("onVolumeChange");
137812                 _poll("onClose");
137813             }
137814             else {
137815                 _listener = null;
137816             }
137817
137818             return !_closed;
137819         },
137820
137821         close: function () {
137822             _listener = null;
137823             _closed = true;
137824             return transport.call(_uri + "close", {get: {id: _id}});
137825         },
137826
137827         pause: function () {
137828             return transport.call(_uri + "pause", {get: {id: _id}});
137829         },
137830
137831         play: function () {
137832             return transport.call(_uri + "play", {get: {id: _id}});
137833         }
137834     };
137835
137836     _self.__defineGetter__("duration", function () {
137837         return transport.call(_uri + "getDuration", {get: {id: _id}});
137838     });
137839
137840     _self.__defineGetter__("mediaTime", function () {
137841         return transport.call(_uri + "getMediaTime", {get: {id: _id}});
137842     });
137843
137844     _self.__defineSetter__("mediaTime", function (val) {
137845         transport.call(_uri + "setMediaTime", {get: {id: _id, value: val}});
137846     });
137847
137848     _self.__defineGetter__("state", function () {
137849         return transport.call(_uri + "getState", {get: {id: _id}});
137850     });
137851
137852     _self.__defineGetter__("volumeLevel", function () {
137853         return transport.call(_uri + "getVolumeLevel", {get: {id: _id}});
137854     });
137855
137856     _self.__defineSetter__("volumeLevel", function (val) {
137857         transport.call(_uri + "setVolumeLevel", {get: {id: _id, value: val}});
137858     });
137859
137860     _self.__defineGetter__("EVENT_BUFFERING_STARTED", function () {
137861         return "EVENT_BUFFERING_STARTED";
137862     });
137863     _self.__defineGetter__("EVENT_BUFFERING_STOPPED", function () {
137864         return "EVENT_BUFFERING_STOPPED";
137865     });
137866     _self.__defineGetter__("EVENT_CLOSED", function () {
137867         return "EVENT_CLOSED";
137868     });
137869     _self.__defineGetter__("EVENT_DEVICE_AVAILABLE", function () {
137870         return "EVENT_DEVICE_AVAILABLE";
137871     });
137872     _self.__defineGetter__("EVENT_DEVICE_UNAVAILABLE", function () {
137873         return "EVENT_DEVICE_UNAVAILABLE";
137874     });
137875     _self.__defineGetter__("EVENT_DURATION_UPDATED", function () {
137876         return "EVENT_DURATION_UPDATED";
137877     });
137878     _self.__defineGetter__("EVENT_END_OF_MEDIA", function () {
137879         return "EVENT_END_OF_MEDIA";
137880     });
137881     _self.__defineGetter__("EVENT_ERROR", function () {
137882         return "EVENT_ERROR";
137883     });
137884     _self.__defineGetter__("EVENT_RECORD_ERROR", function () {
137885         return "EVENT_ERROR";
137886     });
137887     _self.__defineGetter__("EVENT_RECORD_STARTED", function () {
137888         return "EVENT_RECORD_STARTED";
137889     });
137890     _self.__defineGetter__("EVENT_RECORD_STOPPED", function () {
137891         return "EVENT_RECORD_STOPPED";
137892     });
137893     _self.__defineGetter__("EVENT_SIZE_CHANGED", function () {
137894         return "EVENT_SIZE_CHANGED";
137895     });
137896     _self.__defineGetter__("EVENT_STARTED", function () {
137897         return "EVENT_STARTED";
137898     });
137899     _self.__defineGetter__("EVENT_STOPPED", function () {
137900         return "EVENT_STOPPED";
137901     });
137902     _self.__defineGetter__("EVENT_STOPPED_AT_TIME", function () {
137903         return "EVENT_STOPPED_AT_TIME";
137904     });
137905     _self.__defineGetter__("EVENT_VOLUME_CHANGED", function () {
137906         return "EVENT_VOLUME_CHANGED";
137907     });
137908
137909     return _self;
137910 }
137911
137912 Player.__defineGetter__("TIME_UNKNOWN", function () {
137913     return -1;
137914 });
137915 Player.__defineGetter__("CLOSED", function () {
137916     return 0;
137917 });
137918 Player.__defineGetter__("UNREALIZED", function () {
137919     return 100;
137920 });
137921 Player.__defineGetter__("REALIZED", function () {
137922     return 200;
137923 });
137924 Player.__defineGetter__("PREFETCHED", function () {
137925     return 300;
137926 });
137927 Player.__defineGetter__("STARTED", function () {
137928     return 400;
137929 });
137930
137931 module.exports = Player;
137932
137933 });
137934 define('ripple/platform/webworks.handset/2.0.0/client/category', function (require, exports, module) {
137935 /*
137936  *  Copyright 2011 Research In Motion Limited.
137937  *
137938  * Licensed under the Apache License, Version 2.0 (the "License");
137939  * you may not use this file except in compliance with the License.
137940  * You may obtain a copy of the License at
137941  *
137942  * http://www.apache.org/licenses/LICENSE-2.0
137943  *
137944  * Unless required by applicable law or agreed to in writing, software
137945  * distributed under the License is distributed on an "AS IS" BASIS,
137946  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137947  * See the License for the specific language governing permissions and
137948  * limitations under the License.
137949  */
137950 var transport = require('ripple/platform/webworks.core/2.0.0/client/transport'),
137951     _uri = "blackberry/pim/category/",
137952     _self;
137953
137954 _self = {
137955     addCategory: function (categoryName) {
137956         transport.call(_uri + "addCategory", {
137957             get: {categoryName: categoryName}
137958         });
137959     },
137960     deleteCategory: function (categoryName) {
137961         transport.call(_uri + "deleteCategory", {
137962             get: {categoryName: categoryName}
137963         });
137964     },
137965     getCategories: function () {
137966         return transport.call(_uri + "getCategories");
137967     }
137968 };
137969
137970 module.exports = _self;
137971
137972 });
137973 define('ripple/platform/webworks.handset/2.0.0/client/PushData', function (require, exports, module) {
137974 /*
137975  *  Copyright 2011 Research In Motion Limited.
137976  *
137977  * Licensed under the Apache License, Version 2.0 (the "License");
137978  * you may not use this file except in compliance with the License.
137979  * You may obtain a copy of the License at
137980  *
137981  * http://www.apache.org/licenses/LICENSE-2.0
137982  *
137983  * Unless required by applicable law or agreed to in writing, software
137984  * distributed under the License is distributed on an "AS IS" BASIS,
137985  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137986  * See the License for the specific language governing permissions and
137987  * limitations under the License.
137988  */
137989 function PushData(data, port) {
137990     this.port = port;
137991     this.data = data;
137992
137993     this.getHeaderField = function (field) {
137994         if (field === undefined || field === null) {
137995             throw "no field specified";
137996         }
137997         else if (!(typeof field === 'number' && field >= 0) && typeof field !== 'string') {
137998             throw "field is not valid";
137999         }
138000
138001         return data.headerField[field];
138002     };
138003
138004     this.getRequestURI =  function () {
138005         return data.requestURI;
138006     };
138007
138008     this.getSource = function () {
138009         return data.source;
138010     };
138011
138012     this.isChannelEncrypted = data.isChannelEncrypted;
138013
138014     this.payload = data.payload;
138015
138016     this.__defineGetter__("ACCEPT", function () {
138017         return 0;
138018     });
138019     this.__defineGetter__("DECLINE_USERDCR", function () {
138020         return 1;
138021     });
138022     this.__defineGetter__("DECLINE_USERDCU", function () {
138023         return 2;
138024     });
138025     this.__defineGetter__("DECLINE_USERPND", function () {
138026         return 3;
138027     });
138028     this.__defineGetter__("DECLINE_USERREQ", function () {
138029         return 4;
138030     });
138031     this.__defineGetter__("DECLINE_USERRFS", function () {
138032         return 5;
138033     });
138034 }
138035
138036 module.exports = PushData;
138037
138038 });
138039 define('ripple/platform/webworks.handset/2.0.0/client/identity', function (require, exports, module) {
138040 /*
138041  *  Copyright 2011 Research In Motion Limited.
138042  *
138043  * Licensed under the Apache License, Version 2.0 (the "License");
138044  * you may not use this file except in compliance with the License.
138045  * You may obtain a copy of the License at
138046  *
138047  * http://www.apache.org/licenses/LICENSE-2.0
138048  *
138049  * Unless required by applicable law or agreed to in writing, software
138050  * distributed under the License is distributed on an "AS IS" BASIS,
138051  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138052  * See the License for the specific language governing permissions and
138053  * limitations under the License.
138054  */
138055 var transport = require('ripple/platform/webworks.core/2.0.0/client/transport'),
138056     _uri = "blackberry/identity/",
138057     _self;
138058
138059 _self = {
138060     getDefaultService: function () {
138061         return transport.call(_uri + "getDefaultService");
138062     },
138063     getServiceList: function () {
138064         return transport.call(_uri + "getServiceList");
138065     },
138066     getTransportList: function () {
138067         return transport.call(_uri + "getTransportList");
138068     }
138069 };
138070
138071 _self.__defineGetter__("IMEI", function () {
138072     return transport.call(_uri + "IMEI");
138073 });
138074
138075 _self.__defineGetter__("IMSI", function () {
138076     return transport.call(_uri + "IMSI");
138077 });
138078
138079 _self.__defineGetter__("PIN", function () {
138080     return transport.call(_uri + "PIN");
138081 });
138082
138083 module.exports = _self;
138084
138085 });
138086 define('ripple/platform/webworks.handset/2.0.0/client/JavaArguments', function (require, exports, module) {
138087 /*
138088  *  Copyright 2011 Research In Motion Limited.
138089  *
138090  * Licensed under the Apache License, Version 2.0 (the "License");
138091  * you may not use this file except in compliance with the License.
138092  * You may obtain a copy of the License at
138093  *
138094  * http://www.apache.org/licenses/LICENSE-2.0
138095  *
138096  * Unless required by applicable law or agreed to in writing, software
138097  * distributed under the License is distributed on an "AS IS" BASIS,
138098  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138099  * See the License for the specific language governing permissions and
138100  * limitations under the License.
138101  */
138102 //blackberry.invoke.JavaArguments ( uri : String ,  [params : String [ ] ] )
138103 var _self = function (uri, params) {
138104     return {
138105         uri: uri,
138106         params: params,
138107         args: arguments
138108     };
138109 };
138110
138111 module.exports = _self;
138112
138113 });
138114 define('ripple/platform/webworks.handset/2.0.0/client/FilterExpression', function (require, exports, module) {
138115 /*
138116  *  Copyright 2011 Research In Motion Limited.
138117  *
138118  * Licensed under the Apache License, Version 2.0 (the "License");
138119  * you may not use this file except in compliance with the License.
138120  * You may obtain a copy of the License at
138121  *
138122  * http://www.apache.org/licenses/LICENSE-2.0
138123  *
138124  * Unless required by applicable law or agreed to in writing, software
138125  * distributed under the License is distributed on an "AS IS" BASIS,
138126  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138127  * See the License for the specific language governing permissions and
138128  * limitations under the License.
138129  */
138130 //blackberry.find.FilterExpression ( leftField  : object ,  operator  : object ,  rightField : object ,  [negate : Boolean ] )
138131 var FilterExpression = function (leftField, operator, rightField, negate) {
138132     this.__defineGetter__("leftField", function () {
138133         return leftField;
138134     });
138135
138136     this.__defineGetter__("operator", function () {
138137         return operator;
138138     });
138139
138140     this.__defineGetter__("rightField", function () {
138141         return rightField;
138142     });
138143
138144     this.__defineGetter__("negate", function () {
138145         return negate ? true : false;
138146     });
138147 };
138148
138149 module.exports = FilterExpression;
138150
138151 });
138152 define('ripple/platform/webworks.handset/2.0.0/client/system', function (require, exports, module) {
138153 /*
138154  *  Copyright 2011 Research In Motion Limited.
138155  *
138156  * Licensed under the Apache License, Version 2.0 (the "License");
138157  * you may not use this file except in compliance with the License.
138158  * You may obtain a copy of the License at
138159  *
138160  * http://www.apache.org/licenses/LICENSE-2.0
138161  *
138162  * Unless required by applicable law or agreed to in writing, software
138163  * distributed under the License is distributed on an "AS IS" BASIS,
138164  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138165  * See the License for the specific language governing permissions and
138166  * limitations under the License.
138167  */
138168 var utils = require('ripple/utils'),
138169     transport = require('ripple/platform/webworks.core/2.0.0/client/transport'),
138170     system = require('ripple/platform/webworks.core/2.0.0/client/system'),
138171     _uri = "blackberry/system/",
138172     _self;
138173
138174 _self = {
138175     setHomeScreenBackground: function (filePath) {
138176         transport.call(_uri + "setHomeScreenBackground", {
138177             get: {filePath: filePath},
138178             async: true
138179         });
138180     },
138181 };
138182
138183 (function () {
138184     // HACK: can't type check if system[key] is a function, sets off getters
138185     // also can't use utils.mixin or forEach for the same reason
138186     function get(i) {
138187         return function () {
138188             return system[i];
138189         };
138190     }
138191
138192     for (var key in system) {
138193         if (system.hasOwnProperty(key)) {
138194             _self.__defineGetter__(key, get(key));
138195         }
138196     }
138197 }());
138198
138199 module.exports = _self;
138200
138201 });
138202 define('ripple/platform/webworks.handset/2.0.0/client/Recurrence', function (require, exports, module) {
138203 /*
138204  *  Copyright 2011 Research In Motion Limited.
138205  *
138206  * Licensed under the Apache License, Version 2.0 (the "License");
138207  * you may not use this file except in compliance with the License.
138208  * You may obtain a copy of the License at
138209  *
138210  * http://www.apache.org/licenses/LICENSE-2.0
138211  *
138212  * Unless required by applicable law or agreed to in writing, software
138213  * distributed under the License is distributed on an "AS IS" BASIS,
138214  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138215  * See the License for the specific language governing permissions and
138216  * limitations under the License.
138217  */
138218 function Recurrence() {
138219     return {
138220         //readwrite  property  Number   count
138221         //readwrite  property  Number   dayInMonth
138222         //readwrite  property  Number   dayInWeek
138223         //readwrite  property  Number   dayInYear
138224         //readwrite  property  Date   end
138225         //readwrite  property  Number   frequency
138226         //readwrite  property  Number   interval
138227         //readwrite  property  Number   monthInYear
138228         //readwrite  property  Number   weekInMonth
138229
138230         count: null,
138231         dayInMonth: null,
138232         dayInWeek: null,
138233         dayInYear: null,
138234         end: null,
138235         frequency: null,
138236         interval: null,
138237         monthInYear: null,
138238         weekInMonth: null
138239     };
138240 }
138241
138242 Recurrence.__defineGetter__("NO_REPEAT", function () {
138243     return 0;
138244 });
138245 Recurrence.__defineGetter__("DAILY", function () {
138246     return 1;
138247 });
138248 Recurrence.__defineGetter__("WEEKLY", function () {
138249     return 2;
138250 });
138251 Recurrence.__defineGetter__("MONTHLY", function () {
138252     return 3;
138253 });
138254 Recurrence.__defineGetter__("YEARLY", function () {
138255     return 4;
138256 });
138257 Recurrence.__defineGetter__("JANUARY", function () {
138258     return 0x20000;
138259 });
138260 Recurrence.__defineGetter__("FEBRUARY", function () {
138261     return 0x40000;
138262 });
138263 Recurrence.__defineGetter__("MARCH", function () {
138264     return 0x80000;
138265 });
138266 Recurrence.__defineGetter__("APRIL", function () {
138267     return 0x100000;
138268 });
138269 Recurrence.__defineGetter__("MAY", function () {
138270     return 0x200000;
138271 });
138272 Recurrence.__defineGetter__("JUNE", function () {
138273     return 0x400000;
138274 });
138275 Recurrence.__defineGetter__("JULY", function () {
138276     return 0x800000;
138277 });
138278 Recurrence.__defineGetter__("AUGUST", function () {
138279     return 0x1000000;
138280 });
138281 Recurrence.__defineGetter__("SEPTEMBER", function () {
138282     return 0x2000000;
138283 });
138284 Recurrence.__defineGetter__("OCTOBER", function () {
138285     return 0x4000000;
138286 });
138287 Recurrence.__defineGetter__("NOVEMBER", function () {
138288     return 0x8000000;
138289 });
138290 Recurrence.__defineGetter__("DECEMBER", function () {
138291     return 0x10000000;
138292 });
138293 Recurrence.__defineGetter__("FIRST", function () {
138294     return 0x1;
138295 });
138296 Recurrence.__defineGetter__("SECOND", function () {
138297     return 0x2;
138298 });
138299 Recurrence.__defineGetter__("THIRD", function () {
138300     return 0x4;
138301 });
138302 Recurrence.__defineGetter__("FOURTH", function () {
138303     return 0x8;
138304 });
138305 Recurrence.__defineGetter__("FIFTH", function () {
138306     return 0x10;
138307 });
138308 Recurrence.__defineGetter__("LAST", function () {
138309     return 0x20;
138310 });
138311 Recurrence.__defineGetter__("SECONDLAST", function () {
138312     return 0x40;
138313 });
138314 Recurrence.__defineGetter__("THIRDLAST", function () {
138315     return 0x80;
138316 });
138317 Recurrence.__defineGetter__("FOURTHLAST", function () {
138318     return 0x100;
138319 });
138320 Recurrence.__defineGetter__("FIFTHLAST", function () {
138321     return 0x200;
138322 });
138323 Recurrence.__defineGetter__("SUNDAY", function () {
138324     return 0x10000;
138325 });
138326 Recurrence.__defineGetter__("MONDAY", function () {
138327     return 0x8000;
138328 });
138329 Recurrence.__defineGetter__("TUESDAY", function () {
138330     return 0x4000;
138331 });
138332 Recurrence.__defineGetter__("WEDNESDAY", function () {
138333     return 0x2000;
138334 });
138335 Recurrence.__defineGetter__("THURSDAY", function () {
138336     return 0x1000;
138337 });
138338 Recurrence.__defineGetter__("FRIDAY", function () {
138339     return 0x800;
138340 });
138341 Recurrence.__defineGetter__("SATURDAY", function () {
138342     return 0x400;
138343 });
138344
138345 module.exports = Recurrence;
138346
138347 });
138348 define('ripple/platform/webworks.handset/2.0.0/client/Message', function (require, exports, module) {
138349 /*
138350  *  Copyright 2011 Research In Motion Limited.
138351  *
138352  * Licensed under the Apache License, Version 2.0 (the "License");
138353  * you may not use this file except in compliance with the License.
138354  * You may obtain a copy of the License at
138355  *
138356  * http://www.apache.org/licenses/LICENSE-2.0
138357  *
138358  * Unless required by applicable law or agreed to in writing, software
138359  * distributed under the License is distributed on an "AS IS" BASIS,
138360  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138361  * See the License for the specific language governing permissions and
138362  * limitations under the License.
138363  */
138364 var utils = require('ripple/platform/webworks.core/2.0.0/client/utils'),
138365     identity = require('ripple/platform/webworks.handset/2.0.0/client/identity'),
138366     transport = require('ripple/platform/webworks.core/2.0.0/client/transport'),
138367     Service = require('ripple/platform/webworks.handset/2.0.0/client/identity/Service'),
138368     select = require('ripple/platform/webworks.core/2.0.0/select'),
138369     _uri = "blackberry/message/message/";
138370
138371 function Message(service) {
138372     var _service = service,
138373         _msg = {
138374             uid: 0,
138375             status: Message.STATUS_DRAFT,
138376             from: "",
138377             folder: Message.FOLDER_DRAFT,
138378             replyTo: "",
138379             bccRecipients: "",
138380             body: "",
138381             ccRecipients: "",
138382             priority: Message.PRIORITY_MEDIUM, //default to med priority
138383             subject: "",
138384             toRecipients: "",
138385
138386             remove: function () {
138387                 _msg.folder = Message.FOLDER_DELETED;
138388                 transport.call(_uri + "remove", {
138389                     get: {uid: _msg.uid}
138390                 });
138391             },
138392
138393             save: function () {
138394                 if (_msg.uid === 0) {
138395                     _msg.uid = Number(Math.uuid(8, 10));
138396                 }
138397
138398                 _msg.replyTo  = _msg.from = _service.emailAddress;
138399                 _msg.status =  Message.STATUS_SAVED;
138400                 transport.call(_uri + "save", {
138401                     post: {message: _msg}
138402                 });
138403             },
138404
138405             send: function () {
138406                 if (_msg.toRecipients) {
138407                     if (_msg.uid === 0) {
138408                         _msg.uid = Number(Math.uuid(8, 10));
138409                     }
138410
138411                     _msg.folder = Message.FOLDER_DRAFT;
138412                     _msg.status = Message.STATUS_UNKNOWN;
138413                     transport.call(_uri + "send", {
138414                         get: {message: _msg}
138415                     });
138416                 } else {
138417                     throw "message has no recipients";
138418                 }
138419             }
138420         };
138421
138422     if (!_service) {
138423         _service = identity.getDefaultService().reduce(function (email, service) {
138424             return service.type === Service.TYPE_EMAIL ? service : email;
138425         }, null);
138426     }
138427
138428     return _msg;
138429 }
138430
138431 Message.find = function (filter, maxReturn, service) {
138432     var opts = {
138433         post: {
138434             filter: filter,
138435             maxReturn: maxReturn,
138436             service: service
138437         }
138438     };
138439
138440     return transport.call(_uri + "find", opts).map(function (obj) {
138441         var msg = new Message();
138442
138443         msg.uid = obj.uid;
138444         msg.status = obj.status;
138445         msg.from = obj.from;
138446         msg.folder = obj.folder;
138447         msg.replyTo = obj.replyTo;
138448         msg.bccRecipients = obj.bccRecipients;
138449         msg.body = obj.body;
138450         msg.ccRecipients = obj.ccRecipients;
138451         msg.priority = obj.priority;
138452         msg.subject = obj.subject;
138453         msg.toRecipients = obj.toRecipients;
138454
138455         return msg;
138456     });
138457 };
138458
138459
138460 Message.__defineGetter__("STATUS_UNKNOWN", function () {
138461     return -1;
138462 });
138463 Message.__defineGetter__("STATUS_SAVED", function () {
138464     return 0;
138465 });
138466 Message.__defineGetter__("STATUS_DRAFT", function () {
138467     return 1;
138468 });
138469 Message.__defineGetter__("STATUS_SENT", function () {
138470     return 2;
138471 });
138472 Message.__defineGetter__("STATUS_ERROR_OCCURED", function () {
138473     return 3;
138474 });
138475 Message.__defineGetter__("PRIORITY_HIGH", function () {
138476     return 0;
138477 });
138478 Message.__defineGetter__("PRIORITY_MEDIUM", function () {
138479     return 1;
138480 });
138481 Message.__defineGetter__("PRIORITY_LOW", function () {
138482     return 2;
138483 });
138484 Message.__defineGetter__("FOLDER_INBOX", function () {
138485     return 0;
138486 });
138487 Message.__defineGetter__("FOLDER_SENT", function () {
138488     return 1;
138489 });
138490 Message.__defineGetter__("FOLDER_DRAFT", function () {
138491     return 2;
138492 });
138493 Message.__defineGetter__("FOLDER_OUTBOX", function () {
138494     return 3;
138495 });
138496 Message.__defineGetter__("FOLDER_DELETED", function () {
138497     return 4;
138498 });
138499 Message.__defineGetter__("FOLDER_OTHER", function () {
138500     return 5;
138501 });
138502
138503 module.exports = Message;
138504
138505 });
138506 define('ripple/platform/webworks.handset/2.0.0/client/menu', function (require, exports, module) {
138507 /*
138508  *  Copyright 2011 Research In Motion Limited.
138509  *
138510  * Licensed under the Apache License, Version 2.0 (the "License");
138511  * you may not use this file except in compliance with the License.
138512  * You may obtain a copy of the License at
138513  *
138514  * http://www.apache.org/licenses/LICENSE-2.0
138515  *
138516  * Unless required by applicable law or agreed to in writing, software
138517  * distributed under the License is distributed on an "AS IS" BASIS,
138518  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138519  * See the License for the specific language governing permissions and
138520  * limitations under the License.
138521  */
138522 var transport = require('ripple/platform/webworks.core/2.0.0/client/transport'),
138523     MenuItem = require('ripple/platform/webworks.handset/2.0.0/client/MenuItem'),
138524     utils = require('ripple/utils'),
138525     onSelect,
138526     _items = {},
138527     _uri = "blackberry/ui/menu/",
138528     _self;
138529
138530 _self = {
138531     addMenuItem: function (menuItem) {
138532         _items[menuItem.id] = menuItem;
138533
138534         transport.call(_uri + "addMenuItem", {
138535             get: {"item": menuItem}
138536         });
138537
138538         if (utils.count(_items) === 1) {
138539             transport.poll(_uri + "onSelect", {}, function (response) {
138540                 var item = _items[response];
138541
138542                 if (item && item.callback) {
138543                     item.callback();
138544                 }
138545
138546                 return !!utils.count(_items);
138547             });
138548         }
138549     },
138550
138551     clearMenuItems: function () {
138552         _items = {};
138553         transport.call(_uri + "clearMenuItems");
138554     },
138555
138556     getMenuItems: function () {
138557         return utils.map(_items, function (item) {
138558             var menuItem = new MenuItem(item.isSeparator, item.ordinal, item.caption, item.callback);
138559             menuItem.id = item.id;
138560             menuItem.isDefault = item.isDefault;
138561             return menuItem;
138562         });
138563     },
138564
138565     hasMenuItem: function (menuItem) {
138566         return !!_items[menuItem.id];
138567     },
138568
138569     open: function () {
138570         transport.call(_uri + "open", {async: true});
138571     },
138572
138573     removeMenuItem: function (menuItem) {
138574         delete _items[menuItem.id];
138575         transport.call(_uri + "removeMenuItem", {
138576             get: {item: menuItem}
138577         });
138578     },
138579
138580     setDefaultMenuItem: function (menuItem) {
138581         utils.forEach(_items, function (item) {
138582             item.isDefault = false;
138583         });
138584
138585         _items[menuItem.id].isDefault = true;
138586
138587         transport.call(_uri + "setDefaultMenuItem", {
138588             get: {id: menuItem.id}
138589         });
138590     }
138591 };
138592
138593 module.exports = _self;
138594
138595 });
138596 define('ripple/platform/webworks.handset/2.0.0/client/MessageArguments', function (require, exports, module) {
138597 /*
138598  *  Copyright 2011 Research In Motion Limited.
138599  *
138600  * Licensed under the Apache License, Version 2.0 (the "License");
138601  * you may not use this file except in compliance with the License.
138602  * You may obtain a copy of the License at
138603  *
138604  * http://www.apache.org/licenses/LICENSE-2.0
138605  *
138606  * Unless required by applicable law or agreed to in writing, software
138607  * distributed under the License is distributed on an "AS IS" BASIS,
138608  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138609  * See the License for the specific language governing permissions and
138610  * limitations under the License.
138611  */
138612 //blackberry.invoke.MessageArguments ( )
138613 //blackberry.invoke.MessageArguments ( message : blackberry.message.Message )
138614 //blackberry.invoke.MessageArguments ( to : String ,  subject : String ,  body : String )
138615 var _self = function () {
138616     return {
138617         view: 1
138618     };
138619 };
138620
138621 //const Number  VIEW_NEW  = 0
138622 _self.__defineGetter__("VIEW_NEW", function () {
138623     return 0;
138624 });
138625 //const Number  VIEW_DEFAULT  = 1
138626 _self.__defineGetter__("VIEW_DEFAULT", function () {
138627     return 1;
138628 });
138629 //const Number  VIEW_SAVED  = 2
138630 _self.__defineGetter__("VIEW_SAVED", function () {
138631     return 2;
138632 });
138633 //const Number  VIEW_SEARCH  = 3
138634 _self.__defineGetter__("VIEW_SEARCH", function () {
138635     return 3;
138636 });
138637
138638 module.exports = _self;
138639
138640 });
138641 define('ripple/platform/webworks.handset/2.0.0/client/app', function (require, exports, module) {
138642 /*\r
138643  *  Copyright 2011 Research In Motion Limited.\r
138644  *\r
138645  * Licensed under the Apache License, Version 2.0 (the "License");\r
138646  * you may not use this file except in compliance with the License.\r
138647  * You may obtain a copy of the License at\r
138648  *\r
138649  * http://www.apache.org/licenses/LICENSE-2.0\r
138650  *\r
138651  * Unless required by applicable law or agreed to in writing, software\r
138652  * distributed under the License is distributed on an "AS IS" BASIS,\r
138653  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
138654  * See the License for the specific language governing permissions and\r
138655  * limitations under the License.\r
138656  */\r
138657 var transport = require('ripple/platform/webworks.core/2.0.0/client/transport'),\r
138658     _uri = "blackberry/app/",\r
138659     _self;\r
138660 \r
138661 _self = {\r
138662     exit: function () {\r
138663         transport.call(_uri + "exit", {async: true});\r
138664     },\r
138665 \r
138666     setHomeScreenIcon: function (uri, hover) {\r
138667         transport.call(_uri + "setHomeScreenIcon", {\r
138668             get: {\r
138669                 uri: uri,\r
138670                 hover: hover\r
138671             },\r
138672             async: true\r
138673         });\r
138674 \r
138675         return true;\r
138676     },\r
138677 \r
138678     setHomeScreenName: function (text) {\r
138679         transport.call(_uri + "setHomeScreenName", {\r
138680             get: {text: text},\r
138681             async: true\r
138682         });\r
138683 \r
138684         return true;\r
138685     },\r
138686 \r
138687     requestForeground: function () {\r
138688         transport.call(_uri + "requestForeground", {async: true});\r
138689     },\r
138690 \r
138691     requestBackground: function () {\r
138692         transport.call(_uri + "requestBackground", {async: true});\r
138693     },\r
138694 \r
138695     removeBannerIndicator: function () {\r
138696         transport.call(_uri + "removeBannerIndicator", {async: true});\r
138697     },\r
138698 \r
138699     showBannerIndicator: function (icon, count) {\r
138700         transport.call(_uri + "showBannerIndicator", {\r
138701             get: {\r
138702                 icon: icon,\r
138703                 count: count\r
138704             },\r
138705             async: true\r
138706         });\r
138707     },\r
138708 };\r
138709 \r
138710 _self.__defineGetter__("author", function () {\r
138711     return transport.call(_uri + "author");\r
138712 });\r
138713 \r
138714 _self.__defineGetter__("authorEmail", function () {\r
138715     return transport.call(_uri + "authorEmail");\r
138716 });\r
138717 \r
138718 _self.__defineGetter__("authorURL", function () {\r
138719     return transport.call(_uri + "authorURL");\r
138720 });\r
138721 \r
138722 _self.__defineGetter__("copyright", function () {\r
138723     return transport.call(_uri + "copyright");\r
138724 });\r
138725 \r
138726 _self.__defineGetter__("description", function () {\r
138727     return transport.call(_uri + "description");\r
138728 });\r
138729 \r
138730 _self.__defineGetter__("id", function () {\r
138731     return transport.call(_uri + "id");\r
138732 });\r
138733 \r
138734 _self.__defineGetter__("isForeground", function () {\r
138735     return transport.call(_uri + "isForeground");\r
138736 });\r
138737 \r
138738 _self.__defineGetter__("license", function () {\r
138739     return transport.call(_uri + "license");\r
138740 });\r
138741 \r
138742 _self.__defineGetter__("licenseURL", function () {\r
138743     return transport.call(_uri + "licenseURL");\r
138744 });\r
138745 \r
138746 _self.__defineGetter__("name", function () {\r
138747     return transport.call(_uri + "name");\r
138748 });\r
138749 \r
138750 _self.__defineGetter__("version", function () {\r
138751     return transport.call(_uri + "version");\r
138752 });\r
138753 \r
138754 module.exports = _self;\r
138755
138756 });
138757 define('ripple/platform/webworks.handset/2.0.0/client/Reminder', function (require, exports, module) {
138758 /*
138759  *  Copyright 2011 Research In Motion Limited.
138760  *
138761  * Licensed under the Apache License, Version 2.0 (the "License");
138762  * you may not use this file except in compliance with the License.
138763  * You may obtain a copy of the License at
138764  *
138765  * http://www.apache.org/licenses/LICENSE-2.0
138766  *
138767  * Unless required by applicable law or agreed to in writing, software
138768  * distributed under the License is distributed on an "AS IS" BASIS,
138769  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138770  * See the License for the specific language governing permissions and
138771  * limitations under the License.
138772  */
138773 var Reminder = function () {
138774
138775     return {
138776         //readwrite  property  Date   date
138777         //readwrite  property  Number   relativeHours
138778         //readwrite  property  Number   type
138779
138780         date: null,
138781         relativeHours: null,
138782         type: null
138783
138784     };
138785
138786 };
138787
138788 Reminder.__defineGetter__("DATE", function () {
138789     return 0;
138790 });
138791
138792 Reminder.__defineGetter__("RELATIVE", function () {
138793     return 1;
138794 });
138795
138796 module.exports = Reminder;
138797
138798 });
138799 define('ripple/platform/webworks.handset/2.0.0/client/invoke', function (require, exports, module) {
138800 /*\r
138801  *  Copyright 2011 Research In Motion Limited.\r
138802  *\r
138803  * Licensed under the Apache License, Version 2.0 (the "License");\r
138804  * you may not use this file except in compliance with the License.\r
138805  * You may obtain a copy of the License at\r
138806  *\r
138807  * http://www.apache.org/licenses/LICENSE-2.0\r
138808  *\r
138809  * Unless required by applicable law or agreed to in writing, software\r
138810  * distributed under the License is distributed on an "AS IS" BASIS,\r
138811  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
138812  * See the License for the specific language governing permissions and\r
138813  * limitations under the License.\r
138814  */\r
138815 var _uri = "blackberry/invoke/invoke",\r
138816     APP_URL_CAMERA = "camera://",\r
138817     APP_URL_CAMERA_VIDEO = "camera://video",\r
138818     APP_URL_MAP = "map://",\r
138819     APP_URL_MUSIC = "music://",\r
138820     APP_URL_PHOTOS = "photos://",\r
138821     APP_URL_VIDEOS = "videos://",\r
138822     APP_URL_APPWORLD = "appworld://",\r
138823     APP_URL_UPDATE = "update://",\r
138824     APP_BROWSER_ERROR = "Protocol specified in the url is not supported.",\r
138825     APP_ADDRESSBOOK_ERROR = "Invalid arguments specified",\r
138826     transport = require('ripple/platform/webworks.core/2.0.0/client/transport'),\r
138827     _self;\r
138828 \r
138829 _self = {\r
138830     invoke: function (appType, args) {\r
138831         var get = {};\r
138832 \r
138833         switch (appType) {\r
138834 \r
138835         //AddressBook\r
138836         case 0:\r
138837             if (args) {\r
138838                 if (args.view === 1 && args.contact) {\r
138839                     throw APP_ADDRESSBOOK_ERROR; //contact cannot be used with this view\r
138840                 }\r
138841                 else if (args.view === 2 && !args.contact) {\r
138842                     throw APP_ADDRESSBOOK_ERROR; //need contact for this view\r
138843                 }\r
138844             }\r
138845 \r
138846             get.appType = appType;\r
138847             break;\r
138848 \r
138849         //Bluetooth Config\r
138850         case 1:\r
138851             get.appType = appType;\r
138852             break;\r
138853 \r
138854         //Calculator\r
138855         case 2:\r
138856             get.appType = appType;\r
138857             break;\r
138858 \r
138859         //Calendar\r
138860         case 3:\r
138861             get.appType = appType;\r
138862             break;\r
138863 \r
138864         //Camera\r
138865         case 4:\r
138866             if (!args || args.view === 1) {\r
138867                 get.appType = APP_URL_CAMERA_VIDEO;\r
138868             } else {\r
138869                 get.appType = APP_URL_CAMERA;\r
138870             }\r
138871             break;\r
138872 \r
138873         //Maps\r
138874         case 5:\r
138875             get.appType = APP_URL_MAP;\r
138876             break;\r
138877 \r
138878         //Memopad\r
138879         case 6:\r
138880             get.appType = appType;\r
138881             break;\r
138882 \r
138883         //Messages\r
138884         case 7:\r
138885             get.appType = appType;\r
138886             break;\r
138887 \r
138888         //Phone\r
138889         case 8:\r
138890             get.appType = appType;\r
138891             break;\r
138892 \r
138893         //Search\r
138894         case 9:\r
138895             get.appType = appType;\r
138896             break;\r
138897 \r
138898         //Tasks\r
138899         case 10:\r
138900             get.appType = appType;\r
138901             break;\r
138902 \r
138903         //Browser\r
138904         case 11:\r
138905 \r
138906             if (!args) {\r
138907                 get.appType = "http://";\r
138908             } else {\r
138909                 if (args.url && !args.url.match(/^https?:\/\//)) {\r
138910                     throw APP_BROWSER_ERROR;\r
138911                 }\r
138912                 get.appType = args.url;\r
138913             }\r
138914 \r
138915             break;\r
138916 \r
138917         //Java\r
138918         case 12:\r
138919             get.appType = appType;\r
138920             break;\r
138921 \r
138922         default:\r
138923             throw "appType not supported";\r
138924         }\r
138925 \r
138926         transport.call(_uri, {\r
138927             get: get,\r
138928             async: true\r
138929         });\r
138930     }\r
138931 };\r
138932 \r
138933 _self.__defineGetter__("APP_ADDRESSBOOK", function () {\r
138934     return 0;\r
138935 });\r
138936 _self.__defineGetter__("APP_BLUETOOTH_CONFIG", function () {\r
138937     return 1;\r
138938 });\r
138939 _self.__defineGetter__("APP_CALCULATOR", function () {\r
138940     return 2;\r
138941 });\r
138942 _self.__defineGetter__("APP_CALENDAR", function () {\r
138943     return 3;\r
138944 });\r
138945 _self.__defineGetter__("APP_CAMERA", function () {\r
138946     return 4;\r
138947 });\r
138948 _self.__defineGetter__("APP_MAPS", function () {\r
138949     return 5;\r
138950 });\r
138951 _self.__defineGetter__("APP_MEMOPAD", function () {\r
138952     return 6;\r
138953 });\r
138954 _self.__defineGetter__("APP_MESSAGES", function () {\r
138955     return 7;\r
138956 });\r
138957 _self.__defineGetter__("APP_PHONE", function () {\r
138958     return 8;\r
138959 });\r
138960 _self.__defineGetter__("APP_SEARCH", function () {\r
138961     return 9;\r
138962 });\r
138963 _self.__defineGetter__("APP_TASKS", function () {\r
138964     return 10;\r
138965 });\r
138966 _self.__defineGetter__("APP_BROWSER", function () {\r
138967     return 11;\r
138968 });\r
138969 _self.__defineGetter__("APP_JAVA", function () {\r
138970     return 12;\r
138971 });\r
138972 \r
138973 module.exports = _self;\r
138974
138975 });
138976 define('ripple/platform/webworks.handset/2.0.0/client/AddressBookArguments', function (require, exports, module) {
138977 /*
138978  *  Copyright 2011 Research In Motion Limited.
138979  *
138980  * Licensed under the Apache License, Version 2.0 (the "License");
138981  * you may not use this file except in compliance with the License.
138982  * You may obtain a copy of the License at
138983  *
138984  * http://www.apache.org/licenses/LICENSE-2.0
138985  *
138986  * Unless required by applicable law or agreed to in writing, software
138987  * distributed under the License is distributed on an "AS IS" BASIS,
138988  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138989  * See the License for the specific language governing permissions and
138990  * limitations under the License.
138991  */
138992 //blackberry.invoke.AddressBookArguments ( [contact : blackberry.pim.Contact ] )
138993 var _self = function (contact) {
138994     return {
138995         contact: contact,
138996         //readwrite  property  Number   view
138997         view: 0
138998     };
138999 };
139000
139001 //const Number  VIEW_NEW  = 0
139002 _self.__defineGetter__("VIEW_NEW", function () {
139003     return 0;
139004 });
139005 //const Number  VIEW_COMPOSE  = 1
139006 _self.__defineGetter__("VIEW_COMPOSE", function () {
139007     return 1;
139008 });
139009 //const Number  VIEW_DISPLAY  = 2
139010 _self.__defineGetter__("VIEW_DISPLAY", function () {
139011     return 2;
139012 });
139013
139014 module.exports = _self;
139015
139016 });
139017 define('ripple/platform/webworks.handset/2.0.0/client/Phone', function (require, exports, module) {
139018 /*
139019  *  Copyright 2011 Research In Motion Limited.
139020  *
139021  * Licensed under the Apache License, Version 2.0 (the "License");
139022  * you may not use this file except in compliance with the License.
139023  * You may obtain a copy of the License at
139024  *
139025  * http://www.apache.org/licenses/LICENSE-2.0
139026  *
139027  * Unless required by applicable law or agreed to in writing, software
139028  * distributed under the License is distributed on an "AS IS" BASIS,
139029  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139030  * See the License for the specific language governing permissions and
139031  * limitations under the License.
139032  */
139033 var transport = require('ripple/platform/webworks.core/2.0.0/client/transport'),
139034     _uri = "blackberry/phone/",
139035     _listeners = {},
139036     _self;
139037
139038 _self = {
139039     activeCalls: function () {
139040         return transport.call(_uri + "activeCalls");
139041     },
139042
139043     addPhoneListener: function (callback, eventType) {
139044         var assigned = false;
139045
139046         if (callback && typeof eventType === "number") {
139047             _listeners[eventType] = callback;
139048             assigned = true;
139049         } else if (eventType && callback === null) {
139050             delete _listeners[eventType];
139051         } else {
139052             _listeners = {};
139053         }
139054
139055         transport.poll(_uri + "onPhoneEvent", {
139056             get: {eventType: eventType}
139057         }, function (response) {
139058             var func = _listeners[eventType];
139059
139060             if (func) {
139061                 func(response.callId, response.error);
139062             }
139063
139064             return !!func;
139065         });
139066
139067         // hackish (return true that event was assigned, this is a disconnect between transport poll api and server)
139068         return assigned;
139069     },
139070
139071     inActiveCall: function () {
139072         return transport.call(_uri + "inActiveCall");
139073     }
139074 };
139075
139076 _self.__defineGetter__("CB_CALL_INITIATED", function () {
139077     return 0;
139078 });
139079 _self.__defineGetter__("CB_CALL_WAITING", function () {
139080     return 1;
139081 });
139082 _self.__defineGetter__("CB_CALL_INCOMING", function () {
139083     return 2;
139084 });
139085 _self.__defineGetter__("CB_CALL_ANSWERED", function () {
139086     return 3;
139087 });
139088 _self.__defineGetter__("CB_CALL_CONNECTED", function () {
139089     return 4;
139090 });
139091 _self.__defineGetter__("CB_CALL_CONFERENCECALL_ESTABLISHED", function () {
139092     return 5;
139093 });
139094 _self.__defineGetter__("CB_CONFERENCECALL_DISCONNECTED", function () {
139095     return 6;
139096 });
139097 _self.__defineGetter__("CB_CALL_DISCONNECTED", function () {
139098     return 7;
139099 });
139100 _self.__defineGetter__("CB_CALL_DIRECTCONNECT_CONNECTED", function () {
139101     return 8;
139102 });
139103 _self.__defineGetter__("CB_CALL_DIRECTCONNECT_DISCONNECTED", function () {
139104     return 9;
139105 });
139106 _self.__defineGetter__("CB_CALL_ENDED_BYUSER", function () {
139107     return 10;
139108 });
139109 _self.__defineGetter__("CB_CALL_FAILED", function () {
139110     return 11;
139111 });
139112 _self.__defineGetter__("CB_CALL_RESUMED", function () {
139113     return 12;
139114 });
139115 _self.__defineGetter__("CB_CALL_HELD", function () {
139116     return 13;
139117 });
139118 _self.__defineGetter__("CB_CALL_ADDED", function () {
139119     return 14;
139120 });
139121 _self.__defineGetter__("CB_CALL_REMOVED", function () {
139122     return 15;
139123 });
139124 _self.__defineGetter__("CALL_ERROR_SUBSCRIBER_BUSY", function () {
139125     return 1;
139126 });
139127 _self.__defineGetter__("CALL_ERROR_CONGESTION", function () {
139128     return 2;
139129 });
139130 _self.__defineGetter__("CALL_ERROR_RADIO_PATH_UNAVAILABLE", function () {
139131     return 3;
139132 });
139133 _self.__defineGetter__("CALL_ERROR_NUMBER_UNOBTAINABLE", function () {
139134     return 4;
139135 });
139136 _self.__defineGetter__("CALL_ERROR_AUTHORIZATION_FAILURE", function () {
139137     return 5;
139138 });
139139 _self.__defineGetter__("CALL_ERROR_EMERGENCY_CALLS_ONLY", function () {
139140     return 6;
139141 });
139142 _self.__defineGetter__("CALL_ERROR_HOLD_ERROR", function () {
139143     return 7;
139144 });
139145 _self.__defineGetter__("CALL_ERROR_OUTGOING_CALLS_BARRED", function () {
139146     return 8;
139147 });
139148 _self.__defineGetter__("CALL_ERROR_GENERAL", function () {
139149     return 9;
139150 });
139151 _self.__defineGetter__("CALL_ERROR_MAINTENANCE_REQUIRED", function () {
139152     return 10;
139153 });
139154 _self.__defineGetter__("CALL_ERROR_SERVICE_NOT_AVAILABLE", function () {
139155     return 11;
139156 });
139157 _self.__defineGetter__("CALL_ERROR_DUE_TO_FADING", function () {
139158     return 12;
139159 });
139160 _self.__defineGetter__("CALL_ERROR_LOST_DUE_TO_FADING", function () {
139161     return 13;
139162 });
139163 _self.__defineGetter__("CALL_ERROR_TRY_AGAIN", function () {
139164     return 14;
139165 });
139166 _self.__defineGetter__("CALL_ERROR_FDN_MISMATCH", function () {
139167     return 15;
139168 });
139169 _self.__defineGetter__("CALL_ERROR_CONNECTION_DENIED_BY_NETWORK", function () {
139170     return 16;
139171 });
139172 _self.__defineGetter__("CALL_ERROR_NUMBER_NOT_IN_SERVICE", function () {
139173     return 17;
139174 });
139175 _self.__defineGetter__("CALL_ERROR_PLEASE_TRY_LATER", function () {
139176     return 18;
139177 });
139178 _self.__defineGetter__("CALL_ERROR_SERVICE_CONFLICT", function () {
139179     return 19;
139180 });
139181 _self.__defineGetter__("CALL_ERROR_SYSTEM_BUSY_TRY_LATER", function () {
139182     return 20;
139183 });
139184 _self.__defineGetter__("CALL_ERROR_USER_BUSY_IN_PRIVATE", function () {
139185     return 21;
139186 });
139187 _self.__defineGetter__("CALL_ERROR_USER_BUSY_IN_DATA", function () {
139188     return 22;
139189 });
139190 _self.__defineGetter__("CALL_ERROR_USER_NOT_AUTHORIZED", function () {
139191     return 23;
139192 });
139193 _self.__defineGetter__("CALL_ERROR_USER_NOT_AVAILABLE", function () {
139194     return 24;
139195 });
139196 _self.__defineGetter__("CALL_ERROR_USER_UNKNOWN", function () {
139197     return 25;
139198 });
139199 _self.__defineGetter__("CALL_ERROR_USER_NOT_REACHABLE", function () {
139200     return 26;
139201 });
139202 _self.__defineGetter__("CALL_ERROR_INCOMING_CALL_BARRED", function () {
139203     return 27;
139204 });
139205 _self.__defineGetter__("CALL_ERROR_CALL_REPLACED_BY_STK", function () {
139206     return 28;
139207 });
139208 _self.__defineGetter__("CALL_ERROR_STK_CALL_NOT_ALLOWED", function () {
139209     return 29;
139210 });
139211
139212 module.exports = _self;
139213
139214 });
139215 define('ripple/platform/webworks.handset/2.0.0/client/audio', function (require, exports, module) {
139216 /*
139217  *  Copyright 2011 Research In Motion Limited.
139218  *
139219  * Licensed under the Apache License, Version 2.0 (the "License");
139220  * you may not use this file except in compliance with the License.
139221  * You may obtain a copy of the License at
139222  *
139223  * http://www.apache.org/licenses/LICENSE-2.0
139224  *
139225  * Unless required by applicable law or agreed to in writing, software
139226  * distributed under the License is distributed on an "AS IS" BASIS,
139227  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139228  * See the License for the specific language governing permissions and
139229  * limitations under the License.
139230  */
139231 module.exports = {
139232     supportedContentTypes: function (protocol) {
139233         return protocol === 'rtsp' ?
139234             ['audio/amr', 'audio/mp4', 'audio/aac'] :
139235             ['audio/midi', 'mpeg', 'x-wav', 'amr', 'basic', 'x-gsm', 'mp4', 'aac', 'x-ms-wma', 'flac', 'ogg'];
139236     },
139237     supportedProtocols: function (contentType) {
139238         return ['http', 'file', 'rtsp'];
139239     }
139240 };
139241
139242 });
139243 define('ripple/platform/webworks.handset/2.0.0/client/MapsArguments', function (require, exports, module) {
139244 /*
139245  *  Copyright 2011 Research In Motion Limited.
139246  *
139247  * Licensed under the Apache License, Version 2.0 (the "License");
139248  * you may not use this file except in compliance with the License.
139249  * You may obtain a copy of the License at
139250  *
139251  * http://www.apache.org/licenses/LICENSE-2.0
139252  *
139253  * Unless required by applicable law or agreed to in writing, software
139254  * distributed under the License is distributed on an "AS IS" BASIS,
139255  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139256  * See the License for the specific language governing permissions and
139257  * limitations under the License.
139258  */
139259 //blackberry.invoke.MapsArguments ( )
139260 //blackberry.invoke.MapsArguments ( latitude : Number ,  longitude : Number )
139261 //blackberry.invoke.MapsArguments ( locationDocument : Document ) - Supported in 5.0.0 only
139262 //blackberry.invoke.MapsArguments ( locationDocument : String ) - Supported in 6.0.0 only
139263 //blackberry.invoke.MapsArguments ( address : blackberry.pim.Address )
139264 var _self = function () {
139265     return {};
139266 };
139267
139268 module.exports = _self;
139269
139270 });
139271 define('ripple/platform/webworks.handset/2.0.0/client/Address', function (require, exports, module) {
139272 /*
139273  *  Copyright 2011 Research In Motion Limited.
139274  *
139275  * Licensed under the Apache License, Version 2.0 (the "License");
139276  * you may not use this file except in compliance with the License.
139277  * You may obtain a copy of the License at
139278  *
139279  * http://www.apache.org/licenses/LICENSE-2.0
139280  *
139281  * Unless required by applicable law or agreed to in writing, software
139282  * distributed under the License is distributed on an "AS IS" BASIS,
139283  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139284  * See the License for the specific language governing permissions and
139285  * limitations under the License.
139286  */
139287 function Address() {
139288     return {
139289         //readwrite  property  String   address1
139290         //readwrite  property  String   address2
139291         //readwrite  property  String   city
139292         //readwrite  property  String   country
139293         //readwrite  property  String   stateProvince
139294         //readwrite  property  String   zipPostal
139295
139296         address1: null,
139297         address2: null,
139298         city: null,
139299         country: null,
139300         stateProvince: null,
139301         zipPostal: null
139302     };
139303 }
139304
139305 module.exports = Address;
139306
139307 });
139308 define('ripple/platform/webworks.handset/2.0.0/client/PhoneLogs', function (require, exports, module) {
139309 /*
139310  *  Copyright 2011 Research In Motion Limited.
139311  *
139312  * Licensed under the Apache License, Version 2.0 (the "License");
139313  * you may not use this file except in compliance with the License.
139314  * You may obtain a copy of the License at
139315  *
139316  * http://www.apache.org/licenses/LICENSE-2.0
139317  *
139318  * Unless required by applicable law or agreed to in writing, software
139319  * distributed under the License is distributed on an "AS IS" BASIS,
139320  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139321  * See the License for the specific language governing permissions and
139322  * limitations under the License.
139323  */
139324 var transport = require('ripple/platform/webworks.core/2.0.0/client/transport'),
139325     CallLog = require('ripple/platform/webworks.handset/2.0.0/client/CallLog'),
139326     utils = require('ripple/utils'),
139327     _onCallLog = {
139328         Added: null,
139329         Removed: null,
139330         Updated: null,
139331         Reset: null,
139332     },
139333     _uri = "blackberry/phone/logs/",
139334     _self;
139335
139336 function _massage(property, name) {
139337     if (name === "date" && property) {
139338         return new Date(property);
139339     }
139340     return property;
139341 }
139342
139343 function _toCallLog(log) {
139344     var callLog = new CallLog(),
139345         prop;
139346     for (prop in log) {
139347         if (log.hasOwnProperty(prop)) {
139348             callLog[prop] = _massage(log[prop], prop);
139349         }
139350     }
139351     return callLog;
139352 }
139353
139354 function handle(evt) {
139355     return function (response) {
139356         var func = _onCallLog[evt], args;
139357
139358         if (func) {
139359             args = utils.map(response, function (value) {
139360                 return _toCallLog(value);
139361             });
139362             func.apply(null, args);
139363         }
139364
139365         return !!func;
139366     };
139367 }
139368
139369 function poll(path) {
139370     transport.poll(_uri + path, {}, handle(path.replace("onCallLog", "")));
139371 }
139372
139373 _self = {
139374     addPhoneLogListener: function (onCallLogAdded, onCallLogRemoved, onCallLogUpdated, onCallLogReset) {
139375         _onCallLog.Added = onCallLogAdded;
139376         _onCallLog.Removed = onCallLogRemoved;
139377         _onCallLog.Updated = onCallLogUpdated;
139378         _onCallLog.Reset = onCallLogReset;
139379
139380         if (onCallLogAdded) {
139381             poll("onCallLogAdded");
139382         }
139383
139384         if (onCallLogRemoved) {
139385             poll("onCallLogRemoved");
139386         }
139387
139388         if (onCallLogUpdated) {
139389             poll("onCallLogUpdated");
139390         }
139391
139392         if (onCallLogReset) {
139393             poll("onCallLogReset");
139394         }
139395
139396         return !!(onCallLogAdded || onCallLogRemoved ||
139397                   onCallLogUpdated || onCallLogRemoved);
139398     },
139399
139400     callAt: function (index, folderID) {
139401         var log = transport.call(_uri + "callAt", {
139402             get: {
139403                 index: index,
139404                 folderID: folderID
139405             }
139406         });
139407
139408         if (log && log.date) {
139409             log.date = new Date(log.date);
139410         }
139411
139412         return log;
139413     },
139414
139415     deleteCallAt: function (index, folderID) {
139416         return transport.call(_uri + "deleteCallAt", {
139417             get: {
139418                 index: index,
139419                 folderID: folderID
139420             }
139421         });
139422     },
139423
139424     find: function (filter, folderID, orderBy, maxReturn, isAscending) {
139425         return transport.call(_uri + "find", {
139426             post: {
139427                 filter: filter,
139428                 folderID: folderID,
139429                 orderBy: orderBy,
139430                 maxReturn: maxReturn,
139431                 isAscending: isAscending
139432             }
139433         }).map(_toCallLog);
139434     },
139435
139436     numberOfCalls: function (folderID) {
139437         return transport.call(_uri + "numberOfCalls", {
139438             get: {
139439                 folderID: folderID
139440             }
139441         });
139442     }
139443 };
139444
139445 _self.__defineGetter__("FOLDER_MISSED_CALLS", function () {
139446     return 0;
139447 });
139448
139449 _self.__defineGetter__("FOLDER_NORMAL_CALLS", function () {
139450     return 1;
139451 });
139452
139453 module.exports = _self;
139454
139455 });
139456 define('ripple/platform/webworks.handset/2.0.0/client/systemEvent', function (require, exports, module) {
139457 /*
139458  *  Copyright 2011 Research In Motion Limited.
139459  *
139460  * Licensed under the Apache License, Version 2.0 (the "License");
139461  * you may not use this file except in compliance with the License.
139462  * You may obtain a copy of the License at
139463  *
139464  * http://www.apache.org/licenses/LICENSE-2.0
139465  *
139466  * Unless required by applicable law or agreed to in writing, software
139467  * distributed under the License is distributed on an "AS IS" BASIS,
139468  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139469  * See the License for the specific language governing permissions and
139470  * limitations under the License.
139471  */
139472 var transport = require('ripple/platform/webworks.core/2.0.0/client/transport'),
139473     utils = require('ripple/utils'),
139474     _self,
139475         _callbacks = {};
139476
139477 function _poll(evt, args, callback) {
139478     _callbacks[evt + args.key] = callback;
139479
139480     transport.poll("blackberry/system/event/" + evt, {get: args}, function () {
139481         var func = _callbacks[evt + args.key];
139482
139483         if (func) {
139484             func();
139485         }
139486
139487         return !!func;
139488     });
139489 }
139490
139491 _self = {
139492     onCoverageChange: function (callback) {
139493         _poll("onCoverageChange", {}, callback);
139494     },
139495
139496     onHardwareKey: function (key, callback) {
139497         _poll("onHardwareKey", {key: key}, callback);
139498     }
139499 };
139500
139501 _self.__defineGetter__("KEY_BACK", function () {
139502     return 0;
139503 });
139504 _self.__defineGetter__("KEY_MENU", function () {
139505     return 1;
139506 });
139507 _self.__defineGetter__("KEY_CONVENIENCE_1", function () {
139508     return 2;
139509 });
139510 _self.__defineGetter__("KEY_CONVENIENCE_2", function () {
139511     return 3;
139512 });
139513 _self.__defineGetter__("KEY_STARTCALL", function () {
139514     return 4;
139515 });
139516 _self.__defineGetter__("KEY_ENDCALL", function () {
139517     return 5;
139518 });
139519 _self.__defineGetter__("KEY_VOLUMEDOWN", function () {
139520     return 6;
139521 });
139522 _self.__defineGetter__("KEY_VOLUMEUP", function () {
139523     return 7;
139524 });
139525
139526 module.exports = _self;
139527
139528 });
139529 define('ripple/platform/webworks.handset/2.0.0/client/SearchArguments', function (require, exports, module) {
139530 /*
139531  *  Copyright 2011 Research In Motion Limited.
139532  *
139533  * Licensed under the Apache License, Version 2.0 (the "License");
139534  * you may not use this file except in compliance with the License.
139535  * You may obtain a copy of the License at
139536  *
139537  * http://www.apache.org/licenses/LICENSE-2.0
139538  *
139539  * Unless required by applicable law or agreed to in writing, software
139540  * distributed under the License is distributed on an "AS IS" BASIS,
139541  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139542  * See the License for the specific language governing permissions and
139543  * limitations under the License.
139544  */
139545 //blackberry.invoke.SearchArguments ( )
139546 //blackberry.invoke.SearchArguments ( text : String ,  name : String )
139547 var _self = function (text, name) {
139548
139549     return {
139550         text: text,
139551         name: name
139552     };
139553
139554 };
139555
139556 module.exports = _self;
139557
139558 });
139559 define('ripple/platform/webworks.handset/2.0.0/client/Memo', function (require, exports, module) {
139560 /*
139561  *  Copyright 2011 Research In Motion Limited.
139562  *
139563  * Licensed under the Apache License, Version 2.0 (the "License");
139564  * you may not use this file except in compliance with the License.
139565  * You may obtain a copy of the License at
139566  *
139567  * http://www.apache.org/licenses/LICENSE-2.0
139568  *
139569  * Unless required by applicable law or agreed to in writing, software
139570  * distributed under the License is distributed on an "AS IS" BASIS,
139571  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139572  * See the License for the specific language governing permissions and
139573  * limitations under the License.
139574  */
139575 var transport = require('ripple/platform/webworks.core/2.0.0/client/transport'),
139576     _uri = "blackberry/pim/memo/";
139577
139578 function Memo() {
139579     var _self = {
139580         categories: [],
139581         note: null,
139582         title: null,
139583         uid: null,
139584         remove: function () {
139585             transport.call(_uri + "remove", {
139586                 get: {uid: _self.uid}
139587             });
139588         },
139589         save: function () {
139590             if (_self.uid  === null) {
139591                 _self.uid  = Number(Math.uuid(8, 10));
139592             }
139593             transport.call(_uri + "save", {
139594                 post: {memo: _self}
139595             });
139596         }
139597     };
139598
139599     return _self;
139600 }
139601
139602 Memo.find = function (filter, orderBy, maxReturn, service, isAscending) {
139603     var opts = {
139604         post: {
139605             filter: filter,
139606             orderBy: orderBy,
139607             maxReturn: maxReturn,
139608             isAscending: isAscending,
139609             service: service
139610         }
139611     };
139612
139613     return transport.call(_uri + "find", opts).map(function (obj) {
139614         var memo = new Memo();
139615         memo.uid = obj.uid;
139616         memo.categories = obj.categories || [];
139617         memo.note = obj.note;
139618         memo.title = obj.title;
139619         return memo;
139620     });
139621 };
139622
139623 module.exports = Memo;
139624
139625 });
139626 define('ripple/platform/webworks.handset/2.0.0/client/push', function (require, exports, module) {
139627 /*
139628  *  Copyright 2011 Research In Motion Limited.
139629  *
139630  * Licensed under the Apache License, Version 2.0 (the "License");
139631  * you may not use this file except in compliance with the License.
139632  * You may obtain a copy of the License at
139633  *
139634  * http://www.apache.org/licenses/LICENSE-2.0
139635  *
139636  * Unless required by applicable law or agreed to in writing, software
139637  * distributed under the License is distributed on an "AS IS" BASIS,
139638  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139639  * See the License for the specific language governing permissions and
139640  * limitations under the License.
139641  */
139642 var transport = require('ripple/platform/webworks.core/2.0.0/client/transport'),
139643     _self,
139644     _uri = "blackberry/push/onPush",
139645     callbacks = {},
139646     PushData = require('ripple/platform/webworks.handset/2.0.0/client/PushData');
139647
139648 _self = {
139649     openPushListener: function (callback, port, bbTransport, maxQueueCap) {
139650         callbacks["onPush" + port] = callback;
139651
139652         transport.poll(_uri, {
139653             get: {
139654                 port: port,
139655                 bbTransport: bbTransport,
139656                 maxQueueCap: maxQueueCap
139657             }
139658         }, function (response) {
139659             var func = callbacks["onPush" + port];
139660
139661             if (func) {
139662                 func(new PushData(response, port));
139663             }
139664
139665             return !!func;
139666         });
139667     },
139668
139669     closePushListener: function (port) {
139670         delete callbacks["onPush" + port];
139671     }
139672 };
139673
139674 module.exports = _self;
139675
139676 });
139677 define('ripple/platform/webworks.handset/2.0.0/client/pim', function (require, exports, module) {
139678 /*
139679  *  Copyright 2011 Research In Motion Limited.
139680  *
139681  * Licensed under the Apache License, Version 2.0 (the "License");
139682  * you may not use this file except in compliance with the License.
139683  * You may obtain a copy of the License at
139684  *
139685  * http://www.apache.org/licenses/LICENSE-2.0
139686  *
139687  * Unless required by applicable law or agreed to in writing, software
139688  * distributed under the License is distributed on an "AS IS" BASIS,
139689  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139690  * See the License for the specific language governing permissions and
139691  * limitations under the License.
139692  */
139693 module.exports = {};
139694
139695 });
139696 define('ripple/platform/webworks.handset/2.0.0/client/MemoArguments', function (require, exports, module) {
139697 /*
139698  *  Copyright 2011 Research In Motion Limited.
139699  *
139700  * Licensed under the Apache License, Version 2.0 (the "License");
139701  * you may not use this file except in compliance with the License.
139702  * You may obtain a copy of the License at
139703  *
139704  * http://www.apache.org/licenses/LICENSE-2.0
139705  *
139706  * Unless required by applicable law or agreed to in writing, software
139707  * distributed under the License is distributed on an "AS IS" BASIS,
139708  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139709  * See the License for the specific language governing permissions and
139710  * limitations under the License.
139711  */
139712 //blackberry.invoke.MemoArguments ( [memo : blackberry.pim.Memo ] )
139713 var _self = function (memo) {
139714     return {
139715         memo: memo,
139716         view: 0
139717     };
139718 };
139719
139720 //const Number  VIEW_NEW  = 0
139721 _self.__defineGetter__("VIEW_NEW", function () {
139722     return 0;
139723 });
139724 //const Number  VIEW_EDIT  = 1
139725 _self.__defineGetter__("VIEW_EDIT", function () {
139726     return 1;
139727 });
139728
139729 module.exports = _self;
139730
139731 });
139732 define('ripple/platform/webworks.handset/2.0.0/client/Attendee', function (require, exports, module) {
139733 /*
139734  *  Copyright 2011 Research In Motion Limited.
139735  *
139736  * Licensed under the Apache License, Version 2.0 (the "License");
139737  * you may not use this file except in compliance with the License.
139738  * You may obtain a copy of the License at
139739  *
139740  * http://www.apache.org/licenses/LICENSE-2.0
139741  *
139742  * Unless required by applicable law or agreed to in writing, software
139743  * distributed under the License is distributed on an "AS IS" BASIS,
139744  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139745  * See the License for the specific language governing permissions and
139746  * limitations under the License.
139747  */
139748 function Attendee() {
139749     return {
139750         //readwrite  property  String   address
139751         //readwrite  property  Number   type
139752
139753         address: null,
139754         type: null
139755     };
139756 }
139757
139758 Attendee.__defineGetter__("ORGANIZER", function () {
139759     return 0;
139760 });
139761
139762 Attendee.__defineGetter__("INVITED", function () {
139763     return 1;
139764 });
139765
139766 Attendee.__defineGetter__("ACCEPTED", function () {
139767     return 2;
139768 });
139769
139770 Attendee.__defineGetter__("DECLINED", function () {
139771     return 3;
139772 });
139773
139774 Attendee.__defineGetter__("TENTATIVE", function () {
139775     return 4;
139776 });
139777
139778 module.exports =  Attendee;
139779
139780 });
139781 define('ripple/platform/webworks.handset/2.0.0/client/appEvent', function (require, exports, module) {
139782 /*
139783  *  Copyright 2011 Research In Motion Limited.
139784  *
139785  * Licensed under the Apache License, Version 2.0 (the "License");
139786  * you may not use this file except in compliance with the License.
139787  * You may obtain a copy of the License at
139788  *
139789  * http://www.apache.org/licenses/LICENSE-2.0
139790  *
139791  * Unless required by applicable law or agreed to in writing, software
139792  * distributed under the License is distributed on an "AS IS" BASIS,
139793  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139794  * See the License for the specific language governing permissions and
139795  * limitations under the License.
139796  */
139797 var transport = require('ripple/platform/webworks.core/2.0.0/client/transport'),
139798     _callbacks = {},
139799     _self;
139800
139801 function _poll(evt, handler) {
139802     _callbacks[evt] = handler;
139803
139804     transport.poll("blackberry/app/event/" + evt, {}, function () {
139805         var func = _callbacks[evt];
139806
139807         if (func) {
139808             func();
139809         }
139810
139811         return !!func;
139812     });
139813 }
139814
139815 _self = {
139816     onBackground: function (handler) {
139817         _poll("onBackground", handler);
139818     },
139819
139820     onForeground: function (handler) {
139821         _poll("onForeground", handler);
139822     },
139823
139824     onExit: function (handler) {
139825         _poll("onExit", handler);
139826     }
139827 };
139828
139829 module.exports = _self;
139830
139831 });
139832 define('ripple/platform/webworks.handset/2.0.0/client/blackberry', function (require, exports, module) {
139833 /*
139834  * Copyright 2011 Research In Motion Limited.
139835  *
139836  * Licensed under the Apache License, Version 2.0 (the "License");
139837  * you may not use this file except in compliance with the License.
139838  * You may obtain a copy of the License at
139839  *
139840  *     http://www.apache.org/licenses/LICENSE-2.0
139841  *
139842  * Unless required by applicable law or agreed to in writing, software
139843  * distributed under the License is distributed on an "AS IS" BASIS,
139844  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139845  * See the License for the specific language governing permissions and
139846  * limitations under the License.
139847  */
139848 var blackberry = {},
139849     transport = require('ripple/platform/webworks.core/2.0.0/client/transport');
139850
139851 blackberry.__defineGetter__("network", function () {
139852     return transport.call("blackberry/system/network");
139853 });
139854
139855 module.exports = blackberry;
139856
139857 });
139858 define('ripple/platform/webworks.handset/2.0.0/client/CallLog', function (require, exports, module) {
139859 /*
139860  *  Copyright 2011 Research In Motion Limited.
139861  *
139862  * Licensed under the Apache License, Version 2.0 (the "License");
139863  * you may not use this file except in compliance with the License.
139864  * You may obtain a copy of the License at
139865  *
139866  * http://www.apache.org/licenses/LICENSE-2.0
139867  *
139868  * Unless required by applicable law or agreed to in writing, software
139869  * distributed under the License is distributed on an "AS IS" BASIS,
139870  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139871  * See the License for the specific language governing permissions and
139872  * limitations under the License.
139873  */
139874 function CallLog() {
139875     // readwrite  property  String   addressBookNumber
139876     // readwrite  property  String   addressBookType
139877     // readwrite  property  Date   date
139878     // readwrite  property  Number   duration
139879     // readwrite  property  String   name
139880     // readwrite  property  String   notes
139881     // readwrite  property  String   number
139882     // readwrite  property  Number   status
139883     // readwrite  property  Number   type
139884     this.addressBookNumber = null;
139885     this.addressBookType = null;
139886     this.date = null;
139887     this.duration = null;
139888     this.name = null;
139889     this.notes = null;
139890     this.number = null;
139891     this.status = null;
139892     this.type = null;
139893 }
139894
139895 function _get(val) {
139896     return function () {
139897         return val;
139898     };
139899 }
139900
139901 CallLog.__defineGetter__("STATUS_NORMAL", _get(0));
139902 CallLog.__defineGetter__("STATUS_BUSY", _get(1));
139903 CallLog.__defineGetter__("STATUS_CONGESTION", _get(2));
139904 CallLog.__defineGetter__("STATUS_PATH_UNAVAILABLE", _get(3));
139905 CallLog.__defineGetter__("STATUS_NUMBER_UNOBTAINABLE", _get(4));
139906 CallLog.__defineGetter__("STATUS_AUTHENTICATION_FAILURE", _get(5));
139907 CallLog.__defineGetter__("STATUS_EMERGENCY_CALLS_ONLY", _get(6));
139908 CallLog.__defineGetter__("STATUS_HOLD_ERROR", _get(7));
139909 CallLog.__defineGetter__("STATUS_OUTGOING_CALLS_BARRED", _get(8));
139910 CallLog.__defineGetter__("STATUS_GENERAL_ERROR", _get(9));
139911 CallLog.__defineGetter__("STATUS_MAINTENANCE_REQUIRED", _get(10));
139912 CallLog.__defineGetter__("STATUS_SERVICE_NOT_AVAILABLE", _get(11));
139913 CallLog.__defineGetter__("STATUS_CALL_FAIL_DUE_TO_FADING", _get(12));
139914 CallLog.__defineGetter__("STATUS_CALL_LOST_DUE_TO_FADING", _get(13));
139915 CallLog.__defineGetter__("STATUS_CALL_FAILED_TRY_AGAIN", _get(14));
139916 CallLog.__defineGetter__("STATUS_FDN_MISMATCH", _get(15));
139917 CallLog.__defineGetter__("STATUS_CONNECTION_DENIED", _get(16));
139918 CallLog.__defineGetter__("STATUS_INCOMING_CALL_BARRED", _get(17));
139919 CallLog.__defineGetter__("TYPE_RECEIVED_CALL", _get(0));
139920 CallLog.__defineGetter__("TYPE_PLACED_CALL", _get(1));
139921 CallLog.__defineGetter__("TYPE_MISSED_CALL_UNOPENED", _get(2));
139922 CallLog.__defineGetter__("TYPE_MISSED_CALL_OPENED", _get(3));
139923
139924 module.exports = CallLog;
139925
139926 });
139927 define('ripple/platform/webworks.handset/2.0.0/client/sms', function (require, exports, module) {
139928 /*
139929  *  Copyright 2011 Research In Motion Limited.
139930  *
139931  * Licensed under the Apache License, Version 2.0 (the "License");
139932  * you may not use this file except in compliance with the License.
139933  * You may obtain a copy of the License at
139934  *
139935  * http://www.apache.org/licenses/LICENSE-2.0
139936  *
139937  * Unless required by applicable law or agreed to in writing, software
139938  * distributed under the License is distributed on an "AS IS" BASIS,
139939  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139940  * See the License for the specific language governing permissions and
139941  * limitations under the License.
139942  */
139943 var transport = require('ripple/platform/webworks.core/2.0.0/client/transport'),
139944     _uri = "blackberry/message/sms/",
139945     onReceive,
139946     _self;
139947
139948 _self = {
139949     addReceiveListener: function (callback) {
139950         onReceive = callback;
139951         transport.poll(_uri + "onReceive", {}, function (response) {
139952             if (onReceive) {
139953                 onReceive(response.body, response.from, response.time);
139954             }
139955             return !!onReceive;
139956         });
139957     },
139958
139959     removeReceiveListener: function () {
139960         if (onReceive) {
139961             onReceive = null;
139962             return true;
139963         }
139964
139965         return false;
139966     },
139967
139968     send: function (message, address) {
139969         transport.call(_uri + "send", {
139970             get: {
139971                 message: message,
139972                 address: address
139973             },
139974             async: true
139975         });
139976     }
139977 };
139978
139979 _self.__defineGetter__("isListeningForMessage", function () {
139980     return transport.call(_uri + "isListeningForMessage", {async: false});
139981 });
139982
139983 _self.__defineSetter__("isListeningForMessage", function (value) {
139984     transport.call(_uri + "isListeningForMessage", {
139985         async: false,
139986         get: {isListeningForMessage: value}
139987     });
139988 });
139989
139990 module.exports = _self;
139991
139992 });
139993 define('ripple/platform/webworks.handset/2.0.0/client/MenuItem', function (require, exports, module) {
139994 /*
139995  *  Copyright 2011 Research In Motion Limited.
139996  *
139997  * Licensed under the Apache License, Version 2.0 (the "License");
139998  * you may not use this file except in compliance with the License.
139999  * You may obtain a copy of the License at
140000  *
140001  * http://www.apache.org/licenses/LICENSE-2.0
140002  *
140003  * Unless required by applicable law or agreed to in writing, software
140004  * distributed under the License is distributed on an "AS IS" BASIS,
140005  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
140006  * See the License for the specific language governing permissions and
140007  * limitations under the License.
140008  */
140009 var transport = require('ripple/platform/webworks.core/2.0.0/client/transport'),
140010     event = require('ripple/event');
140011
140012 function MenuItem(isSeparator, ordinal, caption, callback) {
140013     var _isDefault = false,
140014         id = Math.uuid();
140015
140016     if (ordinal < 0) {
140017         throw "Ordinal cannot be less than 0";
140018     } else if (isSeparator) {
140019         if (caption !== undefined) {
140020             throw "caption must not be supplied";
140021         } else if (callback !== undefined) {
140022             throw "callback must not be supplied";
140023         }
140024     } else if (!isSeparator) {
140025         if (caption === undefined) {
140026             throw "caption must be supplied";
140027         }
140028     }
140029
140030     this.callback = callback;
140031
140032     this.__defineSetter__("id", function (i) {
140033         id = i;
140034     });
140035
140036     this.__defineGetter__("id", function () {
140037         return id;
140038     });
140039
140040     this.__defineSetter__("caption", function (c) {
140041         caption = c;
140042         event.trigger("MenuItemChanged", [this]);
140043     });
140044
140045     this.__defineGetter__("caption", function () {
140046         return caption;
140047     });
140048
140049     this.__defineSetter__("ordinal", function (o) {
140050         ordinal = o;
140051         event.trigger("MenuItemChanged", [this]);
140052     });
140053
140054     this.__defineGetter__("ordinal", function () {
140055         return ordinal;
140056     });
140057
140058     this.__defineGetter__("isSeparator", function () {
140059         return isSeparator;
140060     });
140061
140062     this.__defineSetter__("isDefault", function (d) {
140063         _isDefault = d;
140064         event.trigger("MenuItemChanged", [this]);
140065     });
140066
140067     this.__defineGetter__("isDefault", function () {
140068         return _isDefault;
140069     });
140070
140071     this.__defineGetter__("id", function () {
140072         return id;
140073     });
140074 }
140075
140076 module.exports = MenuItem;
140077
140078 });
140079 define('ripple/platform/webworks.handset/2.0.0/client/Contact', function (require, exports, module) {
140080 /*
140081  *  Copyright 2011 Research In Motion Limited.
140082  *
140083  * Licensed under the Apache License, Version 2.0 (the "License");
140084  * you may not use this file except in compliance with the License.
140085  * You may obtain a copy of the License at
140086  *
140087  * http://www.apache.org/licenses/LICENSE-2.0
140088  *
140089  * Unless required by applicable law or agreed to in writing, software
140090  * distributed under the License is distributed on an "AS IS" BASIS,
140091  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
140092  * See the License for the specific language governing permissions and
140093  * limitations under the License.
140094  */
140095 var transport = require('ripple/platform/webworks.core/2.0.0/client/transport'),
140096     _uri = "blackberry/pim/contact/";
140097
140098 function Contact(service) {
140099     var _self = {
140100         anniversary: null,
140101         birthday: null,
140102         categories: [],
140103         company: null,
140104         email1: "",
140105         email2: "",
140106         email3: "",
140107         faxPhone: null,
140108         firstName: null,
140109         homeAddress: null,
140110         homePhone: null,
140111         homePhone2: null,
140112         jobTitle: null,
140113         lastName: null,
140114         mobilePhone: null,
140115         note: null,
140116         otherPhone: null,
140117         pagerPhone: null,
140118         picture: null,
140119         pin: null,
140120         title: null,
140121         uid: null,
140122         user1: null,
140123         user2: null,
140124         user3: null,
140125         user4: null,
140126         webpage: null,
140127         workAddress: null,
140128         workPhone: null,
140129         workPhone2: null,
140130         remove: function () {
140131             if (!_self.uid) {
140132                 throw "task has not yet been saved (has no uid)";
140133             }
140134             transport.call(_uri + "remove", {
140135                 get: { id: _self.uid }
140136             });
140137         },
140138         save: function () {
140139             if (!_self.uid) {
140140                 _self.uid = Math.uuid(null, 16);
140141             }
140142             transport.call(_uri + "save", {
140143                 post: { contact: _self }
140144             });
140145         },
140146         setPicture: function (picture) {
140147             throw "not implemented";
140148         }
140149     };
140150
140151     return _self;
140152 }
140153
140154 function _massage(property, name) {
140155     if ((name === "anniversary" || name === "birthday") && property) {
140156         return new Date(property);
140157     }
140158     return property;
140159 }
140160
140161 Contact.find = function (fieldFilter, orderBy, maxReturn, service, isAscending) {
140162     return transport.call(_uri + "find", {
140163         post: {
140164             fieldFilter: fieldFilter,
140165             orderBy: orderBy,
140166             maxReturn: maxReturn,
140167             service: service,
140168             isAscending: isAscending
140169         }
140170     }).map(function (properties) {
140171         var contact = new Contact(),
140172             key;
140173         for (key in properties) {
140174             if (contact.hasOwnProperty(key)) {
140175                 contact[key] = _massage(properties[key], key);
140176             }
140177         }
140178         return contact;
140179     });
140180 };
140181
140182 module.exports = Contact;
140183
140184 });
140185 define('ripple/platform/webworks.handset/2.0.0/client/PhoneCall', function (require, exports, module) {
140186 /*
140187  *  Copyright 2011 Research In Motion Limited.
140188  *
140189  * Licensed under the Apache License, Version 2.0 (the "License");
140190  * you may not use this file except in compliance with the License.
140191  * You may obtain a copy of the License at
140192  *
140193  * http://www.apache.org/licenses/LICENSE-2.0
140194  *
140195  * Unless required by applicable law or agreed to in writing, software
140196  * distributed under the License is distributed on an "AS IS" BASIS,
140197  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
140198  * See the License for the specific language governing permissions and
140199  * limitations under the License.
140200  */
140201 function PhoneCall(onhold) {
140202     return {
140203         //Boolean   isOnHold ( )
140204         //readonly  property  Boolean   outgoing
140205         //readonly  property  String   recipientName
140206         //readonly  property  String   recipientNumber
140207
140208         outgoing: false,
140209         recipientName: null,
140210         recipientNumber: null,
140211
140212         isOnHold: function () {
140213             return onhold;
140214         }
140215     };
140216 }
140217
140218 module.exports = PhoneCall;
140219
140220 });
140221 define('ripple/platform/webworks.handset/2.0.0/client/Task', function (require, exports, module) {
140222 /*
140223  *  Copyright 2011 Research In Motion Limited.
140224  *
140225  * Licensed under the Apache License, Version 2.0 (the "License");
140226  * you may not use this file except in compliance with the License.
140227  * You may obtain a copy of the License at
140228  *
140229  * http://www.apache.org/licenses/LICENSE-2.0
140230  *
140231  * Unless required by applicable law or agreed to in writing, software
140232  * distributed under the License is distributed on an "AS IS" BASIS,
140233  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
140234  * See the License for the specific language governing permissions and
140235  * limitations under the License.
140236  */
140237 var transport = require('ripple/platform/webworks.core/2.0.0/client/transport'),
140238     _uri = "blackberry/pim/Task/";
140239
140240 function Task() {
140241     var _self = {
140242         save: function () {
140243             if (!_self.uid) {
140244                 _self.uid = Math.uuid(null, 16);
140245             }
140246             transport.call(_uri + "save",  {
140247                 post: {
140248                     task: _self
140249                 }
140250             });
140251         },
140252         remove: function () {
140253             if (!_self.uid) {
140254                 throw "task has not yet been saved (has no uid)";
140255             }
140256             transport.call(_uri + "remove", {
140257                 get: {
140258                     id: _self.uid
140259                 }
140260             });
140261         },
140262         uid: null,
140263         categories: [],
140264         due: null,
140265         note: "",
140266         priority: Task.PRIORITY_NORMAL,
140267         recurrence: null,
140268         reminder: null,
140269         status: Task.NOT_STARTED,
140270         summary: ""
140271     };
140272
140273     return _self;
140274 }
140275
140276 function _massage(property, name) {
140277     if (name === "recurrence" && property) {
140278         if (property.end) {
140279             property.end = new Date(property.end);
140280         }
140281     }
140282     if (name === "reminder" && property) {
140283         if (property.date) {
140284             property.date = new Date(property.date);
140285         }
140286     }
140287     if (name === "due" && property) {
140288         property = new Date(property);
140289     }
140290     return property;
140291 }
140292
140293 Task.find = function (filter, orderBy, maxReturn, isAscending) {
140294     return transport.call(_uri + "find", {
140295         post: {
140296             filter: filter,
140297             orderBy: orderBy,
140298             maxReturn: maxReturn,
140299             isAscending: isAscending
140300         }
140301     }).map(function (properties) {
140302         var task = new Task(),
140303             key;
140304         for (key in properties) {
140305             if (task.hasOwnProperty(key)) {
140306                 task[key] = _massage(properties[key], key);
140307             }
140308         }
140309         return task;
140310     });
140311 };
140312
140313 Task.__defineGetter__("NOT_STARTED", function () {
140314     return 0;
140315 });
140316
140317 Task.__defineGetter__("IN_PROGRESS", function () {
140318     return 1;
140319 });
140320
140321 Task.__defineGetter__("COMPLETED", function () {
140322     return 2;
140323 });
140324
140325 Task.__defineGetter__("WAITING", function () {
140326     return 3;
140327 });
140328
140329 Task.__defineGetter__("DEFERRED", function () {
140330     return 4;
140331 });
140332
140333 Task.__defineGetter__("PRIORITY_HIGH", function () {
140334     return 0;
140335 });
140336
140337 Task.__defineGetter__("PRIORITY_NORMAL", function () {
140338     return 1;
140339 });
140340
140341 Task.__defineGetter__("PRIORITY_LOW", function () {
140342     return 2;
140343 });
140344
140345 module.exports = Task;
140346
140347 });
140348 define('ripple/platform/webworks.handset/2.0.0/spec/device', function (require, exports, module) {
140349 /*
140350  *  Copyright 2011 Research In Motion Limited.
140351  *
140352  * Licensed under the Apache License, Version 2.0 (the "License");
140353  * you may not use this file except in compliance with the License.
140354  * You may obtain a copy of the License at
140355  *
140356  * http://www.apache.org/licenses/LICENSE-2.0
140357  *
140358  * Unless required by applicable law or agreed to in writing, software
140359  * distributed under the License is distributed on an "AS IS" BASIS,
140360  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
140361  * See the License for the specific language governing permissions and
140362  * limitations under the License.
140363  */
140364 var event = require('ripple/event');
140365
140366 module.exports = {
140367     "transports": {
140368         "TCP Cellular": {
140369             "name": "Cellular TCP",
140370             "control": {
140371                 "type": "checkbox",
140372                 "value": true
140373             }
140374         },
140375         "Wap": {
140376             "name": "WAP",
140377             "control": {
140378                 "type": "checkbox",
140379                 "value": false
140380             }
140381         },
140382         "Wap 2.0": {
140383             "name": "WAP 2.0",
140384             "control": {
140385                 "type": "checkbox",
140386                 "value": false
140387             }
140388         },
140389         "MDS": {
140390             "name": "MDS",
140391             "control": {
140392                 "type": "checkbox",
140393                 "value": true
140394             }
140395         },
140396         "Bis B": {
140397             "name": "BIS B",
140398             "control": {
140399                 "type": "checkbox",
140400                 "value": true
140401             }
140402         },
140403         "Unite!": {
140404             "name": "Unite",
140405             "control": {
140406                 "type": "checkbox",
140407                 "value": false
140408             }
140409         },
140410         "TCP Wifi": {
140411             "name": "Wifi TCP",
140412             "control": {
140413                 "type": "checkbox",
140414                 "value": true
140415             }
140416         }
140417     },
140418     "identity": {
140419         "IMEI": {
140420             "name": "IMEI",
140421             "control": {
140422                 "type": "text",
140423                 "value": "123456786543210"
140424             }
140425         },
140426         "IMSI": {
140427             "name": "IMSI",
140428             "control": {
140429                 "type": "text",
140430                 "value": "310150123456789"
140431             }
140432         },
140433         "PIN": {
140434             "name": "PIN",
140435             "control": {
140436                 "type": "text",
140437                 "value": "43A8C489"
140438             }
140439         }
140440     },
140441     "system": {
140442         "isMassStorageActive": {
140443             "name": "Mass Storage Is Connected",
140444             "control": {
140445                 "type": "checkbox",
140446                 "value": true
140447             }
140448         },
140449         "hasDataCoverage": {
140450             "name": "Has Data Coverage",
140451             "control": {
140452                 "type": "checkbox",
140453                 "value": true
140454             },
140455             "callback": function (setting) {
140456                 event.trigger("CoverageChange");
140457                 require('ripple/bus').send("network", setting);
140458             }
140459         },
140460         "lag": {
140461             "name": "Lag the network",
140462             "control": {
140463                 type: "checkbox",
140464                 value: false
140465             },
140466             "callback": function (setting) {
140467                 require('ripple/bus').send("lag", setting);
140468             }
140469         },
140470         "network": {
140471             "name": "Data Network",
140472             "control": {
140473                 "type": "select",
140474                 "value": "3GPP"
140475             },
140476             "options": {
140477                 "3GPP" : "3GPP",
140478                 "CDMA": "CDMA",
140479                 "iDEN": "iDEN",
140480                 "Wi-Fi": "Wi-Fi"
140481             },
140482             "callback": function (setting) {
140483                 event.trigger("CoverageChange");
140484             }
140485         }
140486     }
140487 };
140488
140489 });
140490 define('ripple/platform/webworks.handset/2.0.0/spec/events', function (require, exports, module) {
140491 /*
140492  *  Copyright 2011 Research In Motion Limited.
140493  *
140494  * Licensed under the Apache License, Version 2.0 (the "License");
140495  * you may not use this file except in compliance with the License.
140496  * You may obtain a copy of the License at
140497  *
140498  * http://www.apache.org/licenses/LICENSE-2.0
140499  *
140500  * Unless required by applicable law or agreed to in writing, software
140501  * distributed under the License is distributed on an "AS IS" BASIS,
140502  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
140503  * See the License for the specific language governing permissions and
140504  * limitations under the License.
140505  */
140506 var _self,
140507     utils = require('ripple/utils'),
140508     event = require('ripple/event'),
140509     events = require('ripple/platform/webworks.core/2.0.0/spec/events');
140510
140511 _self = {
140512     "system.event.onExit": {
140513         callback: function () {
140514             event.trigger("AppExit");
140515         }
140516     },
140517     "system.event.onCoverageChange": {
140518         callback: function () {
140519             event.trigger("CoverageChange");
140520         }
140521     },
140522     "system.event.onHardwareKey": {
140523         args: [
140524             "Back",
140525             "Menu",
140526             "Convenience 1",
140527             "Convenience 2",
140528             "Start Call",
140529             "End Call",
140530             "Volume Down",
140531             "Volume Up"
140532         ],
140533         callback: function (key) {
140534             event.trigger("HardwareKey", [key]);
140535         }
140536     }
140537 };
140538
140539 utils.mixin(events, _self);
140540
140541 module.exports = _self;
140542
140543 });
140544 define('ripple/platform/webworks.handset/2.0.0/spec/ui', function (require, exports, module) {
140545 /*
140546  *  Copyright 2011 Research In Motion Limited.
140547  *
140548  * Licensed under the Apache License, Version 2.0 (the "License");
140549  * you may not use this file except in compliance with the License.
140550  * You may obtain a copy of the License at
140551  *
140552  * http://www.apache.org/licenses/LICENSE-2.0
140553  *
140554  * Unless required by applicable law or agreed to in writing, software
140555  * distributed under the License is distributed on an "AS IS" BASIS,
140556  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
140557  * See the License for the specific language governing permissions and
140558  * limitations under the License.
140559  */
140560 module.exports = {
140561     plugins: [
140562         "accelerometer",
140563         "deviceSettings",
140564         "geoView",
140565         "platformEvents",
140566         "widgetConfig",
140567         "messaging",
140568         "push",
140569         "phone",
140570         "build"
140571     ]
140572 };
140573
140574 });
140575 define('ripple/platform/webworks.handset/2.0.0/server', function (require, exports, module) {
140576 /*
140577  *  Copyright 2011 Research In Motion Limited.
140578  *
140579  * Licensed under the Apache License, Version 2.0 (the "License");
140580  * you may not use this file except in compliance with the License.
140581  * You may obtain a copy of the License at
140582  *
140583  * http://www.apache.org/licenses/LICENSE-2.0
140584  *
140585  * Unless required by applicable law or agreed to in writing, software
140586  * distributed under the License is distributed on an "AS IS" BASIS,
140587  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
140588  * See the License for the specific language governing permissions and
140589  * limitations under the License.
140590  */
140591 var utils = require('ripple/utils'),
140592     platform = "ripple/platform/webworks.handset/2.0.0/server/",
140593     core = "ripple/platform/webworks.core/2.0.0/server/",
140594     systemEvent = require(platform + 'systemEvent'),
140595     system = {};
140596
140597 // ugh, thanks to the spec...
140598 system.event = systemEvent;
140599 utils.mixin(require(core + "system"), system);
140600
140601 module.exports = {
140602     blackberry: {
140603         invoke: require(platform + "invoke"),
140604         system: system,
140605         app: require(platform + "app"),
140606         identity: require(platform + "identity"),
140607         message: {
140608             sms: require(platform + "sms"),
140609             message: require(platform + "message")
140610         },
140611         push: require(platform + "push"),
140612         pim: {
140613             Task: require(platform + "Task"),
140614             category: require(platform + "category"),
140615             memo: require(platform + "memo"),
140616             appointment: require(platform + "appointment"),
140617             contact: require(platform + "contact")
140618         },
140619         audio: {
140620             player: require(platform + "audioPlayer")
140621         },
140622         ui: {
140623             menu: require(platform + "menu"),
140624             dialog: require(core + "dialog")
140625         },
140626         phone: require(platform + "phone"),
140627         io: {
140628             dir: require(platform + "io/dir"),
140629             file: require(core + "io/file")
140630         }
140631     }
140632 };
140633
140634 });
140635 define('ripple/platform/webworks.handset/2.0.0/server/audioPlayer', function (require, exports, module) {
140636 /*
140637  *  Copyright 2011 Research In Motion Limited.
140638  *
140639  * Licensed under the Apache License, Version 2.0 (the "License");
140640  * you may not use this file except in compliance with the License.
140641  * You may obtain a copy of the License at
140642  *
140643  * http://www.apache.org/licenses/LICENSE-2.0
140644  *
140645  * Unless required by applicable law or agreed to in writing, software
140646  * distributed under the License is distributed on an "AS IS" BASIS,
140647  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
140648  * See the License for the specific language governing permissions and
140649  * limitations under the License.
140650  */
140651 //create my dom collection node in UI
140652
140653 var utils = require('ripple/utils'),
140654     constants = require('ripple/constants'),
140655     notifications = require('ripple/notifications'),
140656     Player = require('ripple/platform/webworks.handset/2.0.0/client/AudioPlayer'),
140657     _handlers = {
140658         loadstart: {},
140659         canplaythrough: {},
140660         durationchange: {},
140661         ended: {},
140662         error: {},
140663         play: {},
140664         pause: {},
140665         volumechange: {},
140666         close: {}
140667     },
140668     extract = {
140669         time: function (audio) {
140670             return audio.currentTime;
140671         },
140672         duration: function (audio) {
140673             return audio.duration;
140674         },
140675         error: function (audio) {
140676             return audio.error;
140677         },
140678         nothing: function (audio) {
140679             return null;
140680         }
140681     },
140682     container;
140683
140684 container = utils.createElement("section", {
140685     id: "webworks-audio-players"
140686 });
140687
140688 document.getElementById("ui").appendChild(container);
140689
140690 function _errClosed(method) {
140691     notifications.openNotification("error",
140692        "attempted to call " + method + " on a player that is already closed. This is a very bad thing to do :)");
140693     return false;
140694 }
140695
140696 function _removeHandler(type, id) {
140697     var audio = document.getElementById(id);
140698
140699     if (audio && _handlers[type][id]) {
140700         audio.removeEventListener(type, _handlers[type][id]);
140701         delete _handlers[type][id];
140702     }
140703 }
140704
140705 function _addHandler(type, id, callback) {
140706     var audio = document.getElementById(id);
140707
140708     if (audio) {
140709         _removeHandler(type, id);
140710         audio.addEventListener(type, callback);
140711         _handlers[type][id] = callback;
140712     }
140713 }
140714
140715 function proxyEvent(from, map) {
140716     var audio = document.getElementById(map.id);
140717
140718     if (audio) {
140719         map.baton.take();
140720         _addHandler(from, map.id, function () {
140721             _removeHandler(from, map.id);
140722             map.baton.pass({code: 1, data: {
140723                 event: map.target,
140724                 eventData: map.data(this)
140725             }});
140726         });
140727     }
140728     else {
140729         return {code: -1, data: {event: "EVENT_ERROR", eventData: 5}};
140730     }
140731 }
140732
140733 module.exports = {
140734
140735     create: function (args) {
140736         var id = Math.uuid(),
140737             audio = utils.createElement("audio", {
140738                 id: id
140739             });
140740
140741         audio.setAttribute("src", args.locator);
140742
140743         if (args.type) {
140744             audio.setAttribute("type", args.type);
140745         }
140746
140747         container.appendChild(audio);
140748         audio.load();
140749
140750         if (audio.error) {
140751             throw "there was a problem opening the audio file";
140752         }
140753
140754         return {code: 1, data: id};
140755     },
140756
140757     play: function (args) {
140758         var audio = document.getElementById(args.id),
140759             playing;
140760
140761         if (audio) {
140762             audio.play();
140763             audio.rimState = Player.STARTED;
140764             playing = !!!audio.error;
140765         }
140766         else {
140767             playing = _errClosed("play");
140768         }
140769
140770         return {code: 1, data: playing};
140771     },
140772
140773     pause: function (args) {
140774         var audio = document.getElementById(args.id),
140775             paused;
140776
140777         if (audio) {
140778             audio.pause();
140779             paused = !!!audio.error;
140780         } else {
140781             paused = _errClosed("pause");
140782         }
140783
140784         return {code: 1, data: paused};
140785     },
140786
140787     close: function (args) {
140788         var audio = document.getElementById(args.id),
140789             callback = _handlers["close"][args.id],
140790             closed = true;
140791
140792         if (audio) {
140793             if (callback) {
140794                 callback();
140795             }
140796             container.removeChild(audio);
140797         }
140798         else {
140799             closed = _errClosed("close");
140800         }
140801
140802         return {code: 1, data: closed};
140803     },
140804
140805     onStart: function (args, post, baton) {
140806         return proxyEvent("play", {
140807             id: args.id,
140808             baton: baton,
140809             target: "EVENT_START",
140810             data: extract.time
140811         });
140812     },
140813
140814     onStopped: function (args, post, baton) {
140815         return proxyEvent("pause", {
140816             id: args.id,
140817             baton: baton,
140818             target: "EVENT_STOPPED",
140819             data: extract.time
140820         });
140821     },
140822
140823     onBufferingStarted: function (args, post, baton) {
140824         return proxyEvent("loadstart", {
140825             id: args.id,
140826             baton: baton,
140827             target: "EVENT_BUFFERING_STARTED",
140828             data: extract.time
140829         });
140830     },
140831
140832     onBufferingStopped: function (args, post, baton) {
140833         return proxyEvent("canplaythrough", {
140834             id: args.id,
140835             baton: baton,
140836             target: "EVENT_BUFFERING_STOPPED",
140837             data: extract.time
140838         });
140839     },
140840
140841     onDurationUpdated: function (args, post, baton) {
140842         return proxyEvent("durationchange", {
140843             id: args.id,
140844             baton: baton,
140845             target: "EVENT_DURATION_UPDATED",
140846             data: extract.duration
140847         });
140848     },
140849
140850     onEnd: function (args, post, baton) {
140851         return proxyEvent("ended", {
140852             id: args.id,
140853             baton: baton,
140854             target: "EVENT_END_OF_MEDIA",
140855             data: extract.duration
140856         });
140857     },
140858
140859     onError: function (args, post, baton) {
140860         return proxyEvent("error", {
140861             id: args.id,
140862             baton: baton,
140863             target: "EVENT_ERROR",
140864             data: extract.error
140865         });
140866     },
140867
140868     onVolumeChange: function (args, post, baton) {
140869         return proxyEvent("volumechange", {
140870             id: args.id,
140871             baton: baton,
140872             target: "EVENT_VOLUME_CHANGED",
140873             data: extract.nothing
140874         });
140875     },
140876
140877     onClose: function (args, post, baton) {
140878         return proxyEvent("close", {
140879             id: args.id,
140880             baton: baton,
140881             target: "EVENT_CLOSED",
140882             data: extract.nothing
140883         });
140884     },
140885
140886     getDuration: function (args) {
140887         var audio = document.getElementById(args.id),
140888             duration;
140889
140890         if (audio) {
140891             duration = audio.duration;
140892         }
140893         else {
140894             _errClosed("getDuration");
140895             duration = -1;
140896         }
140897
140898         return {code: 1, data: duration};
140899     },
140900
140901     getMediaTime: function (args) {
140902         var audio = document.getElementById(args.id),
140903             time;
140904
140905         if (audio) {
140906             time = audio.currentTime;
140907         }
140908         else {
140909             _errClosed("getMediaTime");
140910             time = -1;
140911         }
140912
140913         return {code: 1, data: time};
140914     },
140915
140916     setMediaTime: function (args) {
140917         var audio = document.getElementById(args.id);
140918
140919         if (audio) {
140920             audio.currentTime = args.value;
140921         }
140922         else {
140923             _errClosed("setMediaTime");
140924         }
140925
140926         return {code: 1};
140927     },
140928
140929     getVolumeLevel: function (args) {
140930         var audio = document.getElementById(args.id),
140931             level;
140932
140933         if (audio) {
140934             level = audio.volume * 100;
140935         }
140936         else {
140937             _errClosed("getVolumeLevel");
140938             level = -1;
140939         }
140940
140941         return {code: 1, data: level};
140942     },
140943
140944     setVolumeLevel: function (args) {
140945         var audio = document.getElementById(args.id);
140946
140947         if (audio) {
140948             audio.volume = args.value / 100;
140949         }
140950         else {
140951             _errClosed("setVolumeLevel");
140952         }
140953
140954         return {code: 1};
140955     },
140956
140957     getState: function (args) {
140958         var audio = document.getElementById(args.id),
140959             state = audio ? audio.rimState || Player.PREFETCHED : Player.CLOSED;
140960         return {code: 1, data: state};
140961     }
140962 };
140963
140964 });
140965 define('ripple/platform/webworks.handset/2.0.0/server/io/dir', function (require, exports, module) {
140966 /*
140967  * Copyright 2011 Research In Motion Limited.
140968  *
140969  * Licensed under the Apache License, Version 2.0 (the "License");
140970  * you may not use this file except in compliance with the License.
140971  * You may obtain a copy of the License at
140972  *
140973  *     http://www.apache.org/licenses/LICENSE-2.0
140974  *
140975  * Unless required by applicable law or agreed to in writing, software
140976  * distributed under the License is distributed on an "AS IS" BASIS,
140977  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
140978  * See the License for the specific language governing permissions and
140979  * limitations under the License.
140980  */
140981 var cache = require('ripple/platform/webworks.core/2.0.0/fsCache'),
140982     dir = require('ripple/platform/webworks.core/2.0.0/server/io/dir'),
140983     utils = require('ripple/utils'),
140984     _self = {};
140985
140986 function _packet(data) {
140987     return {
140988         code: 1,
140989         data: data
140990     };
140991 }
140992
140993 utils.mixin({
140994     getFreeSpaceForRoot: function (get, post, baton) {
140995         return _packet(cache.dir.getFreeSpaceForRoot(post.path));
140996     },
140997     getRootDirs: function (get, post, baton) {
140998         return _packet(cache.dir.getRootDirs());
140999     }
141000 }, _self);
141001
141002 utils.mixin(dir, _self);
141003
141004 module.exports = _self;
141005
141006 });
141007 define('ripple/platform/webworks.handset/2.0.0/server/identity/phone', function (require, exports, module) {
141008 /*
141009  *  Copyright 2011 Research In Motion Limited.
141010  *
141011  * Licensed under the Apache License, Version 2.0 (the "License");
141012  * you may not use this file except in compliance with the License.
141013  * You may obtain a copy of the License at
141014  *
141015  * http://www.apache.org/licenses/LICENSE-2.0
141016  *
141017  * Unless required by applicable law or agreed to in writing, software
141018  * distributed under the License is distributed on an "AS IS" BASIS,
141019  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
141020  * See the License for the specific language governing permissions and
141021  * limitations under the License.
141022  */
141023 var _lines = [
141024         {id: 1, number: 12345678910, label: "rogers", type: 1},
141025         {id: 2, number: 10987654321, label: "mystery", type: 0}
141026     ],
141027     _self;
141028
141029 function _filterLines(args) {
141030
141031     var result = _lines;
141032
141033     if (args && typeof args.id === "number") {
141034         result = _lines.filter(function (line) {
141035             return line.id === args.id;
141036         });
141037
141038         if (result.length === 0) {
141039             throw "invalid line id: " + args.id;
141040         }
141041     }
141042
141043     return result;
141044 }
141045
141046 _self = {
141047     getLineIds: function () {
141048         var lines = _lines.map(function (line) {
141049             return line.id;
141050         });
141051         return {
141052             code: 1,
141053             data: lines
141054         };
141055     },
141056     getLineLabel: function (args) {
141057         return {
141058             code: 1,
141059             data: _filterLines(args)[0].label
141060         };
141061     },
141062     getLineNumber: function (args) {
141063         return {
141064             code: 1,
141065             data: _filterLines(args)[0].number
141066         };
141067     },
141068     getLineType: function (args) {
141069         return {
141070             code: 1,
141071             data: _filterLines(args)[0].type
141072         };
141073     }
141074 };
141075
141076 module.exports = _self;
141077
141078 });
141079 define('ripple/platform/webworks.handset/2.0.0/server/category', function (require, exports, module) {
141080 /*
141081  *  Copyright 2011 Research In Motion Limited.
141082  *
141083  * Licensed under the Apache License, Version 2.0 (the "License");
141084  * you may not use this file except in compliance with the License.
141085  * You may obtain a copy of the License at
141086  *
141087  * http://www.apache.org/licenses/LICENSE-2.0
141088  *
141089  * Unless required by applicable law or agreed to in writing, software
141090  * distributed under the License is distributed on an "AS IS" BASIS,
141091  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
141092  * See the License for the specific language governing permissions and
141093  * limitations under the License.
141094  */
141095 var db = require('ripple/db'),
141096     _KEY = "blackberry-pim-category",
141097     _self;
141098
141099 function _get() {
141100     return db.retrieveObject(_KEY) || [];
141101 }
141102
141103 function _save(category) {
141104     var categories = _get();
141105     if (!categories.some(function (item) {
141106         return item === category;
141107     })) {
141108         categories.push(category);
141109         db.saveObject(_KEY, categories);
141110     }
141111 }
141112
141113 function _remove(category) {
141114     var categories = _get(),
141115         index = categories.indexOf(category);
141116
141117     if (index >= 0) {
141118         categories.splice(index, 1);
141119         db.saveObject(_KEY, categories);
141120     }
141121 }
141122
141123 _self = {
141124     addCategory: function (args) {
141125         _save(args.categoryName);
141126         return {code: 1};
141127     },
141128     deleteCategory: function (args) {
141129         _remove(args.categoryName);
141130         return {code: 1};
141131     },
141132     getCategories: function () {
141133         return {code: 1, data: _get()};
141134     }
141135 };
141136
141137 module.exports = _self;
141138
141139 });
141140 define('ripple/platform/webworks.handset/2.0.0/server/identity', function (require, exports, module) {
141141 /*
141142  *  Copyright 2011 Research In Motion Limited.
141143  *
141144  * Licensed under the Apache License, Version 2.0 (the "License");
141145  * you may not use this file except in compliance with the License.
141146  * You may obtain a copy of the License at
141147  *
141148  * http://www.apache.org/licenses/LICENSE-2.0
141149  *
141150  * Unless required by applicable law or agreed to in writing, software
141151  * distributed under the License is distributed on an "AS IS" BASIS,
141152  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
141153  * See the License for the specific language governing permissions and
141154  * limitations under the License.
141155  */
141156 var _self,
141157     Service = require('ripple/platform/webworks.handset/2.0.0/client/identity/Service'),
141158     Transport = require('ripple/platform/webworks.handset/2.0.0/client/identity/Transport'),
141159     utils = require('ripple/utils'),
141160     platform = require('ripple/platform'),
141161     deviceSettings = require('ripple/deviceSettings'),
141162     _transportTypes = [
141163         {name: "TCP Cellular", type: "TCP Cellular"},
141164         {name: "Wap", type: "Wap"},
141165         {name: "Wap 2.0", type: "Wap 2.0"},
141166         {name: "MDS", type: "MDS"},
141167         {name: "BIS B", type: "Bis B"},
141168         {name: "Unite!", type: "Unite!"},
141169         {name: "TCP Wifi", type: "TCP Wifi"},
141170     ],
141171     _services = [
141172         new Service(),
141173         new Service()
141174     ];
141175
141176 function _isTransportAvailable(transport) {
141177     return deviceSettings.retrieveAsBoolean("transports." + transport.type);
141178 }
141179
141180 utils.mixin({
141181     name: "Super Dave Osborne",
141182     emailAddress: "dave@stunt.com",
141183     isDefault: true,
141184     type: Service.TYPE_EMAIL
141185 }, _services[0]);
141186
141187 utils.mixin({
141188     name: "Fred Penner",
141189     emailAddress: "fred@fredpenner.com",
141190     isDefault: false,
141191     type: Service.TYPE_CONTACT
141192 }, _services[1]);
141193
141194 _self = {
141195     getDefaultService: function () {
141196         var serices = _services.filter(function (service) {
141197             return service.isDefault === true;
141198         });
141199         return {code: 1, data: serices};
141200     },
141201     getServiceList: function () {
141202         return {code: 1, data: _services};
141203     },
141204     getTransportList: function () {
141205         var transports = _transportTypes.filter(function (transport) {
141206             return _isTransportAvailable(transport);
141207         }).map(function (transport) {
141208             return new Transport(transport.name, transport.type);
141209         });
141210         return {code: 1, data: transports};
141211     },
141212     IMEI: function () {
141213         return {code: 1, data: deviceSettings.retrieve("identity.IMEI")};
141214     },
141215     IMSI: function () {
141216         return {code: 1, data: deviceSettings.retrieve("identity.IMSI")};
141217     },
141218     PIN: function () {
141219         return {code: 1, data: deviceSettings.retrieve("identity.PIN")};
141220     },
141221     phone: require('ripple/platform/webworks.handset/2.0.0/server/identity/phone')
141222 };
141223
141224 module.exports = _self;
141225
141226 });
141227 define('ripple/platform/webworks.handset/2.0.0/server/menu', function (require, exports, module) {
141228 /*
141229  *  Copyright 2011 Research In Motion Limited.
141230  *
141231  * Licensed under the Apache License, Version 2.0 (the "License");
141232  * you may not use this file except in compliance with the License.
141233  * You may obtain a copy of the License at
141234  *
141235  * http://www.apache.org/licenses/LICENSE-2.0
141236  *
141237  * Unless required by applicable law or agreed to in writing, software
141238  * distributed under the License is distributed on an "AS IS" BASIS,
141239  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
141240  * See the License for the specific language governing permissions and
141241  * limitations under the License.
141242  */
141243 var _menuItems = {},
141244     event = require('ripple/event'),
141245     events = require('ripple/platform/webworks.core/2.0.0/client/events'),
141246     ui = require('ripple/ui'),
141247     devices = require('ripple/devices'),
141248     utils = require('ripple/utils'),
141249     tooltip = require('ripple/ui/plugins/tooltip'),
141250     _self,
141251     isMenuOpen = false,
141252     _baton,
141253     menuWindow = document ? document.getElementById("menu-window") : undefined;
141254
141255 if (menuWindow) {
141256     menuWindow.addEventListener("click", function () {
141257         _self.close();
141258     });
141259 }
141260
141261 event.on("LayoutChanged", function () {
141262     if (isMenuOpen) {
141263         _self.close();
141264         //Used to resize menu on orientation change
141265         _self.open();
141266     }
141267 });
141268
141269 event.on("HardwareKeyDefault", function (key) {
141270     if (key === 1 || key === "1") { //menu button key
141271         if (isMenuOpen) {
141272             _self.close();
141273         }
141274         else {
141275             _self.open();
141276         }
141277     }
141278 });
141279
141280 event.on("MenuItemSelected", function (menuItem) {
141281     var baton = _baton;
141282     _baton = null;
141283     return baton && baton.pass({code: 1, data: menuItem});
141284 });
141285
141286 event.on("MenuItemChanged", function (menuItem) {
141287     _menuItems[menuItem.id] = menuItem;
141288 });
141289
141290 _self = {
141291
141292     onSelect : function (args, post, baton) {
141293         baton.take();
141294         _baton = baton;
141295     },
141296
141297     addMenuItem: function (args) {
141298         if (!args) {
141299             throw "item not found";
141300         }
141301         _menuItems[args.item.id] = args.item;
141302         event.trigger("MenuChanged", [_menuItems]);
141303         return {code: 1};
141304     },
141305
141306     clearMenuItems: function () {
141307         _menuItems = {};
141308         event.trigger("MenuChanged", [utils.copy(_menuItems)]);
141309         return {code: 1};
141310     },
141311
141312     open: function () {
141313         function _return() {
141314             return {code: 1};
141315         }
141316
141317         if (utils.count(_menuItems) === 0) {
141318             _return();
141319         }
141320
141321         ui.showOverlay("menu-window", function (menu) {
141322             var container = document.getElementById("viewport-container"),
141323                 height = window.getComputedStyle(container, null).getPropertyValue("height"),
141324                 width = window.getComputedStyle(container, null).getPropertyValue("width"),
141325                 menuButtons = document.getElementById("menu-buttons"),
141326                 sorted,
141327                 menuItem;
141328
141329             if (!menuButtons) {
141330                 _return();
141331             }
141332
141333             menu.setAttribute("style", "display:block;height:" + height + "; width:" + width + ";");
141334             isMenuOpen = true;
141335
141336             sorted = utils.map(_menuItems, function (item) {
141337                 return item;
141338             }).sort(function (a, b) {
141339                 return a.ordinal - b.ordinal;
141340             });
141341
141342             menuButtons.innerHTML = "";
141343             sorted.forEach(function (item) {
141344                 if (!item.isSeparator) {
141345                     if (item.isDefault) {
141346                         menuItem = utils.createElement("div", {
141347                             "class": "overlay-menu-item-default",
141348                             "id": "default-menu-item"
141349                         });
141350                     }
141351                     else {
141352                         menuItem = utils.createElement("div", {
141353                             "class": "overlay-menu-item"
141354                         });
141355                     }
141356                     menuItem.innerHTML = item.caption;
141357
141358                     menuItem.addEventListener("click", function () {
141359                         _baton.pass({code: 1, data: item.id});
141360                     });
141361                 }
141362                 else {
141363                     menuItem = utils.createElement("hr", {});
141364                 }
141365                 menuButtons.appendChild(menuItem);
141366                 tooltip.create("#default-menu-item", "Default Item");
141367             });
141368         }, true);
141369
141370         event.trigger("MenuOpened", []);
141371
141372         _return();
141373     },
141374
141375     close: function () {
141376         ui.hideOverlay("menu-window", function (menu) {
141377             var menuButtons = document.getElementById("menu-buttons");
141378             menuButtons.innerHTML = "";
141379             isMenuOpen = false;
141380             menu.setAttribute("style", "display:none;");
141381
141382         });
141383         return {code: 1};
141384     },
141385
141386     removeMenuItem: function (args) {
141387         delete _menuItems[args.item.id];
141388         event.trigger("MenuChanged", [_menuItems]);
141389         return {code: 1};
141390     },
141391
141392     setDefaultMenuItem: function (args) {
141393
141394         utils.forEach(_menuItems, function (item) {
141395             item.isDefault = false;
141396         });
141397
141398         _menuItems[args.id].isDefault = true;
141399
141400         event.trigger("DefaultItemChanged", [_menuItems[args.id]]);
141401         return {code: 1};
141402     }
141403 };
141404
141405 module.exports = _self;
141406
141407 });
141408 define('ripple/platform/webworks.handset/2.0.0/server/app', function (require, exports, module) {
141409 /*
141410  *  Copyright 2011 Research In Motion Limited.
141411  *
141412  * Licensed under the Apache License, Version 2.0 (the "License");
141413  * you may not use this file except in compliance with the License.
141414  * You may obtain a copy of the License at
141415  *
141416  * http://www.apache.org/licenses/LICENSE-2.0
141417  *
141418  * Unless required by applicable law or agreed to in writing, software
141419  * distributed under the License is distributed on an "AS IS" BASIS,
141420  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
141421  * See the License for the specific language governing permissions and
141422  * limitations under the License.
141423  */
141424 var event = require('ripple/event'),
141425     app = require('ripple/app'),
141426     notifications = require('ripple/notifications'),
141427     constants = require('ripple/constants'),
141428     ui = require('ripple/ui'),
141429     _isForeground = true,
141430     _self;
141431
141432 _self = {
141433     event: require('ripple/platform/webworks.handset/2.0.0/server/appEvent'),
141434
141435     exit: function () {
141436         event.trigger("AppExit");
141437         return {code: 1};
141438     },
141439
141440     author: function () {
141441         return {code: 1, data: app.getInfo().author};
141442     },
141443
141444     authorEmail: function () {
141445         return {code: 1, data: app.getInfo().authorEmail};
141446     },
141447
141448     authorURL: function () {
141449         return {code: 1, data: app.getInfo().authorURL};
141450     },
141451
141452     copyright: function () {
141453         return {code: 1, data: app.getInfo().copyright};
141454     },
141455
141456     description: function () {
141457         return {code: 1, data: app.getInfo().description};
141458     },
141459
141460     isForeground: function () {
141461         return {code: 1, data: _isForeground};
141462     },
141463
141464     id: function () {
141465         return {code: 1, data: app.getInfo().id};
141466     },
141467
141468     license: function () {
141469         return {code: 1, data: app.getInfo().license};
141470     },
141471
141472     licenseURL: function () {
141473         return {code: 1, data: app.getInfo().licenseURL};
141474     },
141475
141476     name: function () {
141477         return {code: 1, data: app.getInfo().name};
141478     },
141479
141480     version: function () {
141481         return {code: 1, data: app.getInfo().version};
141482     },
141483
141484     requestBackground: function () {
141485         ui.showOverlay("background-window", function (background) {
141486             var button = background.children["background-return"];
141487
141488             if (button) {
141489                 button.addEventListener("click", _self.requestForeground);
141490             }
141491             _isForeground = false;
141492             event.trigger("AppRequestBackground");
141493         });
141494
141495         return {code: 1};
141496     },
141497
141498     requestForeground: function () {
141499         ui.hideOverlay("background-window", function (background) {
141500             var button = background.children["background-return"];
141501
141502             if (button) {
141503                 button.removeEventListener("click", _self.requestForeground);
141504             }
141505             _isForeground = true;
141506             event.trigger("AppRequestForeground");
141507         });
141508
141509         return {code: 1};
141510     },
141511
141512     setHomeScreenIcon: function (args) {
141513         if (args.uri) {
141514             var msg = "The application set the home screen" +
141515                (args.hover ? " hover " : " ") +
141516                "icon to " + args.uri;
141517
141518             notifications.openNotification("normal", msg);
141519             return {code: 1};
141520         }
141521         else {
141522             return {code: 0};
141523         }
141524     },
141525
141526     setHomeScreenName: function (args) {
141527         if (args.text) {
141528             var msg = "The application set the home screen name to " + args.text;
141529             notifications.openNotification("normal", msg);
141530             return {code: 1};
141531         }
141532         else {
141533             return {code: 1};
141534         }
141535     },
141536
141537     removeBannerIndicator: function () {
141538         event.trigger("BannerUpdated", ["", 0]);
141539         return {code: 1};
141540     },
141541
141542     showBannerIndicator: function (args) {
141543         event.trigger("BannerUpdated", [args.icon, args.count]);
141544         return {code: 1};
141545     },
141546
141547 };
141548
141549 module.exports = _self;
141550
141551 });
141552 define('ripple/platform/webworks.handset/2.0.0/server/invoke', function (require, exports, module) {
141553 /*
141554  *  Copyright 2011 Research In Motion Limited.
141555  *
141556  * Licensed under the Apache License, Version 2.0 (the "License");
141557  * you may not use this file except in compliance with the License.
141558  * You may obtain a copy of the License at
141559  *
141560  * http://www.apache.org/licenses/LICENSE-2.0
141561  *
141562  * Unless required by applicable law or agreed to in writing, software
141563  * distributed under the License is distributed on an "AS IS" BASIS,
141564  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
141565  * See the License for the specific language governing permissions and
141566  * limitations under the License.
141567  */
141568 var notifications = require('ripple/notifications'),
141569     constants = require('ripple/constants'),
141570     type = "normal",
141571     name = {
141572         "0": "Address Book",
141573         "1": "Bluetooth Config",
141574         "2": "Calculator",
141575         "3": "Calendar",
141576         "camera://": "Camera",
141577         "camera://video": "Video Camera",
141578         "map://": "Maps",
141579         "6": "Memopad",
141580         "7": "Messages",
141581         "8": "Phone",
141582         "9": "Search",
141583         "10": "Tasks",
141584         "11": "Browser",
141585         "http://": "Browser",
141586         "12": "Java",
141587     };
141588
141589 module.exports = {
141590     invoke: function (opts) {
141591         var app = name[opts.appType];
141592         if (app === undefined && opts.appType && opts.appType.match(/^http/i)) {
141593             app = "Browser";
141594         }
141595
141596         notifications.openNotification(type,
141597            "Requested to launch: " + app + " application.");
141598         return {code: 1};
141599     }
141600 };
141601
141602 });
141603 define('ripple/platform/webworks.handset/2.0.0/server/contact', function (require, exports, module) {
141604 /*
141605  *  Copyright 2011 Research In Motion Limited.
141606  *
141607  * Licensed under the Apache License, Version 2.0 (the "License");
141608  * you may not use this file except in compliance with the License.
141609  * You may obtain a copy of the License at
141610  *
141611  * http://www.apache.org/licenses/LICENSE-2.0
141612  *
141613  * Unless required by applicable law or agreed to in writing, software
141614  * distributed under the License is distributed on an "AS IS" BASIS,
141615  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
141616  * See the License for the specific language governing permissions and
141617  * limitations under the License.
141618  */
141619 var select = require('ripple/platform/webworks.core/2.0.0/select'),
141620     db = require('ripple/db'),
141621     utils = require('ripple/utils'),
141622     _KEY = "blackberry-pim-contacts",
141623     _self;
141624
141625 function _defaultContacts() {
141626     var id1 = Math.uuid(null, 16),
141627         id2 = Math.uuid(null, 16),
141628         id3 = Math.uuid(null, 16),
141629         id4 = Math.uuid(null, 16),
141630         contacts = {};
141631
141632     contacts[id1] = {
141633         uuid: id1,
141634         firstName: "Leonardo",
141635         homePhone: "4567892345",
141636         email1: "leo@underground.com"
141637     };
141638     contacts[id2] = {
141639         uuid: id2,
141640         firstName: "Raphael",
141641         homePhone: "4563457890",
141642         email1: "raph@underground.com"
141643     };
141644     contacts[id3] = {
141645         uuid: id3,
141646         firstName: "Michelangelo",
141647         homePhone: "4563453425",
141648         email1: "mike@underground.com"
141649     };
141650     contacts[id4] = {
141651         uuid: id4,
141652         firstName: "Donatello",
141653         homePhone: "4563453425",
141654         email1: "don@undergound.com"
141655     };
141656
141657     return contacts;
141658 }
141659
141660 function _get() {
141661     return db.retrieveObject(_KEY) || _defaultContacts();
141662 }
141663
141664 function _save(contacts) {
141665     db.saveObject(_KEY, contacts);
141666 }
141667
141668 _self = {
141669     save: function (get, post) {
141670         var contacts = _get();
141671
141672         contacts[post.contact.uid] = post.contact;
141673         _save(contacts);
141674         return {code: 1};
141675     },
141676     remove: function (get, post) {
141677         var contacts = _get(),
141678             id = get.id;
141679
141680         delete contacts[id];
141681         _save(contacts);
141682         return {code: 1};
141683     },
141684     find: function (get, post) {
141685         var contacts = _get(),
141686             match = select.from(contacts);
141687
141688         if (post.orderBy) {
141689             match.orderBy(post.orderBy, post.isAscending === false ? "desc" : "asc");
141690         }
141691
141692         if (post.maxReturn) {
141693             match.max(post.maxReturn);
141694         }
141695
141696         return {code: 1, data: match.where(post.fieldFilter)};
141697     }
141698 };
141699
141700 module.exports = _self;
141701
141702 });
141703 define('ripple/platform/webworks.handset/2.0.0/server/systemEvent', function (require, exports, module) {
141704 /*
141705  *  Copyright 2011 Research In Motion Limited.
141706  *
141707  * Licensed under the Apache License, Version 2.0 (the "License");
141708  * you may not use this file except in compliance with the License.
141709  * You may obtain a copy of the License at
141710  *
141711  * http://www.apache.org/licenses/LICENSE-2.0
141712  *
141713  * Unless required by applicable law or agreed to in writing, software
141714  * distributed under the License is distributed on an "AS IS" BASIS,
141715  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
141716  * See the License for the specific language governing permissions and
141717  * limitations under the License.
141718  */
141719 var event = require('ripple/event'),
141720     _onCoverageChange,
141721     _onHardwareKey = {};
141722
141723 event.on("CoverageChange", function () {
141724     var baton = _onCoverageChange;
141725     _onCoverageChange = null;
141726     return baton && baton.pass({code: 1});
141727 });
141728
141729 event.on("HardwareKey", function (key) {
141730     var baton = _onHardwareKey["key_" + key];
141731     delete _onHardwareKey["key_" + key];
141732
141733     if (baton) {
141734         baton.pass({code: 1});
141735     }
141736     else {
141737         event.trigger("HardwareKeyDefault", [key]);
141738     }
141739 });
141740
141741 module.exports = {
141742     onCoverageChange: function (args, post, baton) {
141743         baton.take();
141744         _onCoverageChange = baton;
141745     },
141746
141747     onHardwareKey: function (args, post, baton) {
141748         baton.take();
141749         _onHardwareKey["key_" + args.key] = baton;
141750     }
141751 };
141752
141753 });
141754 define('ripple/platform/webworks.handset/2.0.0/server/push', function (require, exports, module) {
141755 /*
141756  *  Copyright 2011 Research In Motion Limited.
141757  *
141758  * Licensed under the Apache License, Version 2.0 (the "License");
141759  * you may not use this file except in compliance with the License.
141760  * You may obtain a copy of the License at
141761  *
141762  * http://www.apache.org/licenses/LICENSE-2.0
141763  *
141764  * Unless required by applicable law or agreed to in writing, software
141765  * distributed under the License is distributed on an "AS IS" BASIS,
141766  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
141767  * See the License for the specific language governing permissions and
141768  * limitations under the License.
141769  */
141770 var event = require('ripple/event'),
141771     utils = require('ripple/utils'),
141772     _handlers = {},
141773     _self;
141774
141775 function listenersChanged() {
141776     var ports = utils.map(_handlers, function (handler) {
141777         return handler.port;
141778     });
141779     event.trigger("PushListenersChanged", [ports]);
141780 }
141781
141782 event.on("Push", function (data, port) {
141783     var handler = _handlers["port_" + port];
141784     delete _handlers["port_" + port];
141785     window.setTimeout(function () {
141786         if (!_handlers["port_" + port]) {
141787             //doesn't look like they are coming back ;)
141788             listenersChanged();
141789         }
141790     }, 100);
141791     return handler && handler.baton.pass({code: 1, data: data});
141792 });
141793
141794 _self = {
141795
141796     onPush: function (args, post, baton) {
141797         if (!args.port) {
141798             throw "no port specified";
141799         }
141800         else if (typeof args.port !== 'number') {
141801             throw "port is not a number";
141802         }
141803         baton.take();
141804         _handlers["port_" + args.port] = {
141805             port: args.port,
141806             baton: baton
141807         };
141808         listenersChanged();
141809     }
141810 };
141811
141812 module.exports = _self;
141813
141814 });
141815 define('ripple/platform/webworks.handset/2.0.0/server/memo', function (require, exports, module) {
141816 /*
141817  *  Copyright 2011 Research In Motion Limited.
141818  *
141819  * Licensed under the Apache License, Version 2.0 (the "License");
141820  * you may not use this file except in compliance with the License.
141821  * You may obtain a copy of the License at
141822  *
141823  * http://www.apache.org/licenses/LICENSE-2.0
141824  *
141825  * Unless required by applicable law or agreed to in writing, software
141826  * distributed under the License is distributed on an "AS IS" BASIS,
141827  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
141828  * See the License for the specific language governing permissions and
141829  * limitations under the License.
141830  */
141831 var db = require('ripple/db'),
141832     select = require('ripple/platform/webworks.core/2.0.0/select'),
141833     _self;
141834
141835 function _get() {
141836     return db.retrieveObject("webworks-pim-memo-list") || {};
141837 }
141838
141839 function _do(func) {
141840     var memos = _get();
141841     func(memos);
141842     db.saveObject("webworks-pim-memo-list", memos);
141843 }
141844
141845 _self = {
141846     find: function (get, post) {
141847         var memos = select.from(_get())
141848                     .orderBy(post.orderBy, post.isAscending === false ? "desc" : "asc")
141849                     .max(post.maxReturn)
141850                     .where(post.filter);
141851         return {code: 1, data: memos};
141852     },
141853     remove: function (get, post) {
141854         _do(function (memos) {
141855             if (!memos[get.uid]) {
141856                 throw "attempting to delete a non existant memo with uid: " + get.uid;
141857             }
141858             delete memos[get.uid];
141859         });
141860         return {code: 1};
141861     },
141862     save: function (get, post) {
141863         _do(function (memos) {
141864             memos[post.memo.uid] = post.memo;
141865         });
141866         return {code: 1};
141867     }
141868 };
141869
141870 module.exports = _self;
141871
141872 });
141873 define('ripple/platform/webworks.handset/2.0.0/server/appEvent', function (require, exports, module) {
141874 /*
141875  *  Copyright 2011 Research In Motion Limited.
141876  *
141877  * Licensed under the Apache License, Version 2.0 (the "License");
141878  * you may not use this file except in compliance with the License.
141879  * You may obtain a copy of the License at
141880  *
141881  * http://www.apache.org/licenses/LICENSE-2.0
141882  *
141883  * Unless required by applicable law or agreed to in writing, software
141884  * distributed under the License is distributed on an "AS IS" BASIS,
141885  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
141886  * See the License for the specific language governing permissions and
141887  * limitations under the License.
141888  */
141889 var event = require('ripple/event'),
141890     notifications = require('ripple/notifications'),
141891     _bg,
141892     _fg,
141893     _exit;
141894
141895 event.on("AppRequestBackground", function () {
141896     var baton = _bg;
141897     _bg = null;
141898     return baton && baton.pass({code: 1});
141899 });
141900
141901 event.on("AppRequestForeground", function () {
141902     var baton = _fg;
141903     _fg = null;
141904     return baton && baton.pass({code: 1});
141905 });
141906
141907 event.on("AppExit", function () {
141908     var baton = _exit;
141909     _exit = null;
141910     notifications.openNotification("normal", "blackberry.app.exit() as called, in the real world your app will exit, here... you get this notification");
141911     return baton && baton.pass({code: 1});
141912 });
141913
141914 module.exports = {
141915     onBackground: function (get, post, baton) {
141916         baton.take();
141917         _bg = baton;
141918         return {code: 1};
141919     },
141920
141921     onForeground: function (get, post, baton) {
141922         baton.take();
141923         _fg = baton;
141924         return {code: 1};
141925     },
141926
141927     onExit: function (get, post, baton) {
141928         baton.take();
141929         _exit = baton;
141930         return {code: 1};
141931     }
141932 };
141933
141934 });
141935 define('ripple/platform/webworks.handset/2.0.0/server/appointment', function (require, exports, module) {
141936 /*
141937  *  Copyright 2011 Research In Motion Limited.
141938  *
141939  * Licensed under the Apache License, Version 2.0 (the "License");
141940  * you may not use this file except in compliance with the License.
141941  * You may obtain a copy of the License at
141942  *
141943  * http://www.apache.org/licenses/LICENSE-2.0
141944  *
141945  * Unless required by applicable law or agreed to in writing, software
141946  * distributed under the License is distributed on an "AS IS" BASIS,
141947  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
141948  * See the License for the specific language governing permissions and
141949  * limitations under the License.
141950  */
141951 var db = require('ripple/db'),
141952     select = require('ripple/platform/webworks.core/2.0.0/select'),
141953     _self;
141954
141955 function _get() {
141956     return db.retrieveObject("webworks-pim-appointment-list") || {};
141957 }
141958
141959 function _do(func) {
141960     var appointments = _get();
141961     func(appointments);
141962     db.saveObject("webworks-pim-appointment-list", appointments);
141963 }
141964
141965 _self = {
141966     find: function (get, post) {
141967         var appointments = _get(),
141968             data = select.from(appointments)
141969                     .orderBy(post.orderBy, post.isAscending === false ? "desc" : "asc")
141970                     .max(post.maxReturn)
141971                     .where(post.filter);
141972
141973         return {code: 1, data: data};
141974     },
141975
141976     remove: function (get) {
141977         _do(function (appointments) {
141978             if (!appointments[get.uid]) {
141979                 throw "attempting to delete a non existant appointment with uid: " + get.uid;
141980             }
141981             delete appointments[get.uid];
141982         });
141983
141984         return {code: 1};
141985     },
141986
141987     save: function (get, post) {
141988         _do(function (appointments) {
141989             appointments[post.appointment.uid] = post.appointment;
141990         });
141991
141992         return {code: 1};
141993     }
141994 };
141995
141996 module.exports = _self;
141997
141998 });
141999 define('ripple/platform/webworks.handset/2.0.0/server/sms', function (require, exports, module) {
142000 /*
142001  *  Copyright 2011 Research In Motion Limited.
142002  *
142003  * Licensed under the Apache License, Version 2.0 (the "License");
142004  * you may not use this file except in compliance with the License.
142005  * You may obtain a copy of the License at
142006  *
142007  * http://www.apache.org/licenses/LICENSE-2.0
142008  *
142009  * Unless required by applicable law or agreed to in writing, software
142010  * distributed under the License is distributed on an "AS IS" BASIS,
142011  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
142012  * See the License for the specific language governing permissions and
142013  * limitations under the License.
142014  */
142015 var _listener,
142016     _isListening = false,
142017     notifications = require('ripple/notifications'),
142018     constants = require('ripple/constants'),
142019     event = require('ripple/event'),
142020     _console = require('ripple/console'),
142021     _onReceive,
142022     _self;
142023
142024 event.on("MessageReceived", function (message) {
142025     if (!_isListening || message.type !== 'sms') {
142026         return;
142027     }
142028
142029     var baton = _onReceive;
142030     _onReceive = null;
142031     _isListening = false;
142032     return baton && baton.pass({code: 1, data: message});
142033 });
142034
142035 _self = {
142036     onReceive: function (args, post, baton) {
142037         baton.take();
142038         _onReceive = baton;
142039         _isListening = !!_onReceive;
142040     },
142041
142042     send: function (args) {
142043         var msg = "To " + args.address + ": " + args.message;
142044         notifications.openNotification("normal", msg);
142045         _console.log(msg);
142046         return {code: 1};
142047     },
142048
142049     isListeningForMessage: function (get, post, baton) {
142050         if (get && typeof get.isListeningForMessage === "boolean") {
142051             _isListening = get.isListeningForMessage;
142052         }
142053
142054         return {code: 1, data: _isListening};
142055     }
142056 };
142057
142058 module.exports = _self;
142059
142060 });
142061 define('ripple/platform/webworks.handset/2.0.0/server/phone', function (require, exports, module) {
142062 /*
142063  *  Copyright 2011 Research In Motion Limited.
142064  *
142065  * Licensed under the Apache License, Version 2.0 (the "License");
142066  * you may not use this file except in compliance with the License.
142067  * You may obtain a copy of the License at
142068  *
142069  * http://www.apache.org/licenses/LICENSE-2.0
142070  *
142071  * Unless required by applicable law or agreed to in writing, software
142072  * distributed under the License is distributed on an "AS IS" BASIS,
142073  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
142074  * See the License for the specific language governing permissions and
142075  * limitations under the License.
142076  */
142077 var PhoneCall = require('ripple/platform/webworks.handset/2.0.0/client/PhoneCall'),
142078     PhoneLogs = require('ripple/platform/webworks.handset/2.0.0/client/PhoneLogs'),
142079     CallLog = require('ripple/platform/webworks.handset/2.0.0/client/CallLog'),
142080     select = require('ripple/platform/webworks.core/2.0.0/select'),
142081     event = require('ripple/event'),
142082     utils = require('ripple/utils'),
142083     db = require('ripple/db'),
142084     _KEY = "blackberry-phone-logs",
142085     _onPhoneEventListeners = {},
142086     _activeCalls = {},
142087     _onCallLogAdded,
142088     _onCallLogRemoved,
142089     _onCallLogUpdated,
142090     _onCallLogReset,
142091     _self;
142092
142093 function _defaultLogs() {
142094     var n1 = new CallLog(),
142095         n2 = new CallLog(),
142096         m1 = new CallLog(),
142097         m2 = new CallLog();
142098
142099     n1.number = "12344567";
142100     n1.name = "larry";
142101     n1.type = CallLog.TYPE_PLACED_CALL;
142102     n1.status = CallLog.STATUS_NORMAL;
142103
142104     n2.number = "14567890";
142105     n2.name = "curly";
142106     n2.type = CallLog.TYPE_RECEIVED_CALL;
142107     n2.status = CallLog.STATUS_NORMAL;
142108
142109     m1.number = "17659800";
142110     m1.name = "moe";
142111     m1.type = CallLog.TYPE_MISSED_CALL_UNOPENED;
142112     m1.status = CallLog.STATUS_NORMAL;
142113
142114     m2.number = "14567896";
142115     m2.name = "snarf";
142116     m2.type = CallLog.TYPE_MISSED_CALL_OPENED;
142117     m2.status = CallLog.STATUS_NORMAL;
142118
142119     return {
142120         normal: [n1, n2],
142121         missed: [m1, m2]
142122     };
142123 }
142124
142125 function _getLogs(folderID) {
142126     var logs = db.retrieveObject(_KEY) || _defaultLogs();
142127     return folderID === undefined || folderID === null ?
142128         logs : logs[folderID !== PhoneLogs.FOLDER_NORMAL_CALLS ? "missed" : "normal"];
142129 }
142130
142131 function _saveLogs(logs) {
142132     db.saveObject(_KEY, logs);
142133 }
142134
142135 function _isMissedCall(log) {
142136     return (log.type === CallLog.TYPE_MISSED_CALL_UNOPENED ||
142137             log.type === CallLog.TYPE_MISSED_CALL_OPENED) ? true : false;
142138 }
142139
142140 function _isNormalCall(log) {
142141     return (log.type === CallLog.TYPE_RECEIVED_CALL ||
142142             log.type === CallLog.TYPE_PLACED_CALL) ? true : false;
142143 }
142144
142145 event.on("PhoneEvent", function (type, callId, error) {
142146     var baton = _onPhoneEventListeners[type];
142147     delete _onPhoneEventListeners[type];
142148
142149     return baton && baton.pass({code: 1, data: {callId: callId, error: error}});
142150 });
142151
142152 event.on("PhoneCallLogAdded", function (log) {
142153     var logs = _getLogs(),
142154         baton = _onCallLogAdded;
142155
142156     logs[_isMissedCall(log) ? "missed" : "normal"].push(log);
142157     _saveLogs(logs);
142158
142159     _onCallLogAdded = null;
142160     return baton && baton.pass({code: 1, data: {log: log}});
142161 });
142162
142163 event.on("PhoneCallLogRemoved", function (log) {
142164     // TODO: make this be the only one responsible for deletion (instead of triggering internally)
142165     var baton = _onCallLogRemoved;
142166     _onCallLogRemoved = null;
142167     return baton && baton.pass({code: 1, data: {log: log}});
142168 });
142169
142170 event.on("PhoneCallLogUpdated", function (newLog, oldLog) {
142171     // TODO: implement way to update with just this event
142172     var baton = _onCallLogUpdated;
142173     _onCallLogUpdated = null;
142174     return baton && baton.pass({code: 1, data: {
142175         newLog: newLog,
142176         oldLog: oldLog
142177     }});
142178 });
142179
142180 event.on("PhoneCallLogReset", function () {
142181     _saveLogs(_defaultLogs());
142182     var baton = _onCallLogReset;
142183     _onCallLogReset = null;
142184     return baton && baton.pass({code: 1});
142185 });
142186
142187 event.on("PhoneCallInitiated", function (call) {
142188     _activeCalls[call.id] = call;
142189 });
142190
142191 event.on("PhoneCallEnded", function (call) {
142192     delete _activeCalls[call.id];
142193 });
142194
142195 _self = {
142196     logs: {
142197         onCallLogAdded: function (get, post, baton) {
142198             baton.take();
142199             _onCallLogAdded = baton;
142200         },
142201
142202         onCallLogRemoved: function (get, post, baton) {
142203             baton.take();
142204             _onCallLogRemoved = baton;
142205         },
142206
142207         onCallLogUpdated: function (get, post, baton) {
142208             baton.take();
142209             _onCallLogUpdated = baton;
142210         },
142211
142212         onCallLogReset: function (get, post, baton) {
142213             baton.take();
142214             _onCallLogReset = baton;
142215         },
142216
142217         callAt: function (get) {
142218             var logs = _getLogs(get.folderID !== null && get.folderID !== undefined ?
142219                                         get.folderID : PhoneLogs.FOLDER_MISSED_CALLS);
142220             return {code: 1, data: logs.length > get.index ? logs[get.index] : null};
142221         },
142222
142223         deleteCallAt: function (get) {
142224             var logs = _getLogs(),
142225                 subLog = _getLogs(get.folderID),
142226                 deleted = false,
142227                 type, log;
142228
142229             if (subLog.length > get.index &&
142230                (type = _isNormalCall(subLog[get.index]) ? "normal" : "missed") &&
142231                (log = logs[type].splice(get.index, 1))) {
142232                 event.trigger("PhoneCallLogRemoved", [log]);
142233                 _saveLogs(logs);
142234                 deleted = true;
142235             }
142236
142237             return {code: 1, data: deleted};
142238         },
142239
142240         find: function (get, post) {
142241             var data = select.from(_getLogs(post.folderID !== null && post.folderID !== undefined ?
142242                                         post.folderID : PhoneLogs.FOLDER_MISSED_CALLS))
142243                     .orderBy(post.orderBy, post.isAscending === false ? "desc" : "asc")
142244                     .max(post.maxReturn)
142245                     .where(post.filter, select.ops.phone);
142246             return {code: 1, data: data};
142247         },
142248
142249         numberOfCalls: function (get) {
142250             return {code: 1, data: _getLogs(get.folderID !== null && get.folderID !== undefined ?
142251                                         get.folderID : PhoneLogs.FOLDER_MISSED_CALLS).length};
142252         }
142253     },
142254
142255     onPhoneEvent: function (get, post, baton) {
142256         baton.take();
142257         _onPhoneEventListeners[get.eventType] = baton;
142258     },
142259
142260     activeCalls: function () {
142261         var data = utils.map(_activeCalls, function (callItem) {
142262             var call = new PhoneCall(callItem.onhold);
142263             call.outgoing = callItem.outgoing;
142264             call.recipientName = callItem.recipient.name;
142265             call.recipientNumber = callItem.recipient.number;
142266             return call;
142267         });
142268         return {code: 1, data: data};
142269     },
142270
142271     inActiveCall: function () {
142272         return {code: 1, data: utils.count(_activeCalls) > 0 ? true : false};
142273     }
142274 };
142275
142276 module.exports = _self;
142277
142278 });
142279 define('ripple/platform/webworks.handset/2.0.0/server/message', function (require, exports, module) {
142280 /*
142281  *  Copyright 2011 Research In Motion Limited.
142282  *
142283  * Licensed under the Apache License, Version 2.0 (the "License");
142284  * you may not use this file except in compliance with the License.
142285  * You may obtain a copy of the License at
142286  *
142287  * http://www.apache.org/licenses/LICENSE-2.0
142288  *
142289  * Unless required by applicable law or agreed to in writing, software
142290  * distributed under the License is distributed on an "AS IS" BASIS,
142291  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
142292  * See the License for the specific language governing permissions and
142293  * limitations under the License.
142294  */
142295 var db = require('ripple/db'),
142296     utils = require('ripple/utils'),
142297     select = require('ripple/platform/webworks.core/2.0.0/select'),
142298     Message = require('ripple/platform/webworks.handset/2.0.0/client/Message'),
142299     _self;
142300
142301 function _get() {
142302     return db.retrieveObject("webworks-message-list") || {};
142303 }
142304
142305 function _do(func) {
142306     var messages = _get();
142307     func(messages);
142308     db.saveObject("webworks-message-list", messages);
142309 }
142310
142311 _self = {
142312     find: function (get, post) {
142313         var data = select
142314                 .from(_get())
142315                 .max(post.maxReturn)
142316                 .where(post.filter);
142317         return {code: 1, data: data};
142318     },
142319
142320     remove: function (get, post) {
142321         _do(function (messages) {
142322             if (!messages[get.uid]) {
142323                 throw "attempting to delete a non existant message with uid: " + get.uid;
142324             }
142325             delete messages[get.uid];
142326         });
142327         return {code: 1};
142328     },
142329
142330     save: function (get, post) {
142331         _do(function (messages) {
142332             var orig = messages[post.message.uid],
142333                 updated = utils.copy(post.message);
142334
142335             updated.folder = orig ? orig.folder : Message.FOLDER_DRAFT;
142336             updated.status = orig ? orig.status : Message.STATUS_DRAFT;
142337
142338             messages[post.message.uid] = updated;
142339         });
142340         return {code: 1};
142341     },
142342
142343     send: function (get, post) {
142344         _do(function (messages) {
142345             var updated = utils.copy(get.message);
142346
142347             updated.folder = Message.FOLDER_SENT;
142348             updated.status = Message.STATUS_SENT;
142349
142350             messages[updated.uid] = updated;
142351         });
142352         return {code: 1};
142353     }
142354 };
142355
142356 module.exports = _self;
142357
142358 });
142359 define('ripple/platform/webworks.handset/2.0.0/server/Task', function (require, exports, module) {
142360 /*
142361  *  Copyright 2011 Research In Motion Limited.
142362  *
142363  * Licensed under the Apache License, Version 2.0 (the "License");
142364  * you may not use this file except in compliance with the License.
142365  * You may obtain a copy of the License at
142366  *
142367  * http://www.apache.org/licenses/LICENSE-2.0
142368  *
142369  * Unless required by applicable law or agreed to in writing, software
142370  * distributed under the License is distributed on an "AS IS" BASIS,
142371  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
142372  * See the License for the specific language governing permissions and
142373  * limitations under the License.
142374  */
142375 var select = require('ripple/platform/webworks.core/2.0.0/select'),
142376     db = require('ripple/db'),
142377     utils = require('ripple/utils'),
142378     _KEY = "blackberry-pim-task",
142379     _self;
142380
142381 function _get() {
142382     return db.retrieveObject(_KEY) || {};
142383 }
142384
142385 function _save(tasks) {
142386     db.saveObject(_KEY, tasks);
142387 }
142388
142389 _self = {
142390     save: function (get, post) {
142391         var tasks = _get(),
142392             properties = post.task,
142393             id = properties.uid;
142394
142395         if (tasks[id]) {
142396             utils.mixin(properties, tasks[id]);
142397         } else {
142398             tasks[id] = properties;
142399         }
142400
142401         _save(tasks);
142402
142403         return {code: 1};
142404     },
142405
142406     remove: function (get, post) {
142407         var tasks = _get(),
142408             id = get.id;
142409
142410         delete tasks[id];
142411
142412         _save(tasks);
142413
142414         return {code: 1};
142415     },
142416
142417     find: function (get, post) {
142418         var tasks = _get(),
142419             match = select.from(tasks);
142420
142421         if (post.orderBy) {
142422             match.orderBy(post.orderBy, post.isAscending === false ? "desc" : "asc");
142423         }
142424
142425         if (post.maxReturn) {
142426             match.max(post.maxReturn);
142427         }
142428
142429         return {code: 1, data: match.where(post.filter)};
142430     }
142431 };
142432
142433 module.exports = _self;
142434
142435 });
142436 define('ripple/platform/web/default/spec', function (require, exports, module) {
142437 /*
142438  *  Copyright 2011 Research In Motion Limited.
142439  *
142440  * Licensed under the Apache License, Version 2.0 (the "License");
142441  * you may not use this file except in compliance with the License.
142442  * You may obtain a copy of the License at
142443  *
142444  * http://www.apache.org/licenses/LICENSE-2.0
142445  *
142446  * Unless required by applicable law or agreed to in writing, software
142447  * distributed under the License is distributed on an "AS IS" BASIS,
142448  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
142449  * See the License for the specific language governing permissions and
142450  * limitations under the License.
142451  */
142452
142453 module.exports = {
142454
142455     id: "web",
142456     version: "default",
142457     name: "Mobile Web",
142458
142459     ui: require('ripple/platform/web/default/spec/ui'),
142460     device: {},
142461
142462     persistencePrefix: "tinyhippos-",
142463
142464     initialize: function () {},
142465
142466     objects: {
142467         Coordinates: {
142468             path: "w3c/1.0/Coordinates"
142469         },
142470         Position: {
142471             path: "w3c/1.0/Position"
142472         },
142473         PositionError: {
142474             path: "w3c/1.0/PositionError"
142475         },
142476         navigator: {
142477             path: "w3c/1.0/navigator",
142478             children: {
142479                 geolocation: {
142480                     path: "w3c/1.0/geolocation"
142481                 }
142482             }
142483         },
142484         device: {
142485             path: "web/default/device"
142486         }
142487     },
142488 };
142489
142490 });
142491 define('ripple/platform/web/default/device', function (require, exports, module) {
142492 /*
142493  *  Copyright 2011 Research In Motion Limited.
142494  *
142495  * Licensed under the Apache License, Version 2.0 (the "License");
142496  * you may not use this file except in compliance with the License.
142497  * You may obtain a copy of the License at
142498  *
142499  * http://www.apache.org/licenses/LICENSE-2.0
142500  *
142501  * Unless required by applicable law or agreed to in writing, software
142502  * distributed under the License is distributed on an "AS IS" BASIS,
142503  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
142504  * See the License for the specific language governing permissions and
142505  * limitations under the License.
142506  */
142507 window.addEventListener("load", function () {
142508     var event = require('ripple/event');
142509
142510     event.on("HardwareKey", function (key) {
142511         event.trigger("HardwareKeyDefault", [key]);
142512     });
142513
142514     //HACK: Remove this guy from namespace since we are just hacking this in as a bootstrapper
142515     delete window.device;
142516 });
142517
142518 });
142519 define('ripple/platform/web/default/spec/ui', function (require, exports, module) {
142520 module.exports = {
142521     plugins: [
142522         "accelerometer",
142523         "geoView"
142524     ]
142525 };
142526
142527 });
142528 define('ripple/platform/phonegap/1.0.0/CameraAttributes', function (require, exports, module) {
142529 /*
142530  *  Copyright 2011 Research In Motion Limited.
142531  *
142532  * Licensed under the Apache License, Version 2.0 (the "License");
142533  * you may not use this file except in compliance with the License.
142534  * You may obtain a copy of the License at
142535  *
142536  * http://www.apache.org/licenses/LICENSE-2.0
142537  *
142538  * Unless required by applicable law or agreed to in writing, software
142539  * distributed under the License is distributed on an "AS IS" BASIS,
142540  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
142541  * See the License for the specific language governing permissions and
142542  * limitations under the License.
142543  */
142544 module.exports = function (supportsVideo, hasFlash, sensorPixels, maxZoomFactor) {
142545     return {
142546         supportsVideo: supportsVideo,
142547         hasFlash: hasFlash,
142548         sensorPixels: sensorPixels,
142549         maxZoomFactor: maxZoomFactor
142550     };
142551
142552 };
142553
142554 });
142555 define('ripple/platform/phonegap/1.0.0/map', function (require, exports, module) {
142556 /*
142557  *  Copyright 2011 Research In Motion Limited.
142558  *
142559  * Licensed under the Apache License, Version 2.0 (the "License");
142560  * you may not use this file except in compliance with the License.
142561  * You may obtain a copy of the License at
142562  *
142563  * http://www.apache.org/licenses/LICENSE-2.0
142564  *
142565  * Unless required by applicable law or agreed to in writing, software
142566  * distributed under the License is distributed on an "AS IS" BASIS,
142567  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
142568  * See the License for the specific language governing permissions and
142569  * limitations under the License.
142570  */
142571 module.exports = {
142572     show: function () {
142573         throw "not implemented";
142574     }
142575 };
142576
142577 });
142578 define('ripple/platform/phonegap/1.0.0/NetworkAttributes', function (require, exports, module) {
142579 /*
142580  *  Copyright 2011 Research In Motion Limited.
142581  *
142582  * Licensed under the Apache License, Version 2.0 (the "License");
142583  * you may not use this file except in compliance with the License.
142584  * You may obtain a copy of the License at
142585  *
142586  * http://www.apache.org/licenses/LICENSE-2.0
142587  *
142588  * Unless required by applicable law or agreed to in writing, software
142589  * distributed under the License is distributed on an "AS IS" BASIS,
142590  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
142591  * See the License for the specific language governing permissions and
142592  * limitations under the License.
142593  */
142594 module.exports = function (info, id, activeConnections) {
142595     return {
142596         info: info,
142597         id: id,
142598         activeConnections: activeConnections || []
142599     };
142600 };
142601
142602 });
142603 define('ripple/platform/phonegap/1.0.0/AVCodecsAttributes', function (require, exports, module) {
142604 /*
142605  *  Copyright 2011 Research In Motion Limited.
142606  *
142607  * Licensed under the Apache License, Version 2.0 (the "License");
142608  * you may not use this file except in compliance with the License.
142609  * You may obtain a copy of the License at
142610  *
142611  * http://www.apache.org/licenses/LICENSE-2.0
142612  *
142613  * Unless required by applicable law or agreed to in writing, software
142614  * distributed under the License is distributed on an "AS IS" BASIS,
142615  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
142616  * See the License for the specific language governing permissions and
142617  * limitations under the License.
142618  */
142619 module.exports = function (info, id, audioCodecs, videoCodecs) {
142620     return {
142621         info: info,
142622         id: id,
142623         audioCodecs: audioCodecs,
142624         videoCodecs: videoCodecs
142625     };
142626 };
142627
142628 });
142629 define('ripple/platform/phonegap/1.0.0/ContactField', function (require, exports, module) {
142630 /*
142631  *  Copyright 2011 Research In Motion Limited.
142632  *
142633  * Licensed under the Apache License, Version 2.0 (the "License");
142634  * you may not use this file except in compliance with the License.
142635  * You may obtain a copy of the License at
142636  *
142637  * http://www.apache.org/licenses/LICENSE-2.0
142638  *
142639  * Unless required by applicable law or agreed to in writing, software
142640  * distributed under the License is distributed on an "AS IS" BASIS,
142641  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
142642  * See the License for the specific language governing permissions and
142643  * limitations under the License.
142644  */
142645 module.exports = function (type, value, pref) {
142646     return {
142647         type: type,
142648         value: value,
142649         pref: pref || false
142650     };
142651 };
142652
142653 });
142654 define('ripple/platform/phonegap/1.0.0/ContactAccount', function (require, exports, module) {
142655 /*
142656  *  Copyright 2011 Research In Motion Limited.
142657  *
142658  * Licensed under the Apache License, Version 2.0 (the "License");
142659  * you may not use this file except in compliance with the License.
142660  * You may obtain a copy of the License at
142661  *
142662  * http://www.apache.org/licenses/LICENSE-2.0
142663  *
142664  * Unless required by applicable law or agreed to in writing, software
142665  * distributed under the License is distributed on an "AS IS" BASIS,
142666  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
142667  * See the License for the specific language governing permissions and
142668  * limitations under the License.
142669  */
142670 module.exports = function (domain, username, userid) {
142671     return {
142672         domain: domain,
142673         username: username,
142674         userid: userid
142675     };
142676 };
142677
142678 });
142679 define('ripple/platform/phonegap/1.0.0/NetworkStatus', function (require, exports, module) {
142680 /*
142681  *  Copyright 2011 Research In Motion Limited.
142682  *
142683  * Licensed under the Apache License, Version 2.0 (the "License");
142684  * you may not use this file except in compliance with the License.
142685  * You may obtain a copy of the License at
142686  *
142687  * http://www.apache.org/licenses/LICENSE-2.0
142688  *
142689  * Unless required by applicable law or agreed to in writing, software
142690  * distributed under the License is distributed on an "AS IS" BASIS,
142691  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
142692  * See the License for the specific language governing permissions and
142693  * limitations under the License.
142694  */
142695 module.exports = {
142696     NOT_REACHABLE: 0,
142697     REACHABLE_VIA_CARRIER_DATA_NETWORK: 1,
142698     REACHABLE_VIA_WIFI_NETWORK: 2
142699 };
142700
142701 });
142702 define('ripple/platform/phonegap/1.0.0/spec', function (require, exports, module) {
142703 module.exports = {
142704     id: "phonegap",
142705     version: "1.0.0",
142706     name: "PhoneGap",
142707     type: "platform",
142708
142709     persistencePrefix: "phonegap-",
142710
142711     config: require('ripple/platform/phonegap/1.0.0/spec/config'),
142712     device: require('ripple/platform/phonegap/1.0.0/spec/device'),
142713     ui: require('ripple/platform/phonegap/1.0.0/spec/ui'),
142714     events: require('ripple/platform/phonegap/1.0.0/spec/events'),
142715
142716     initialize: function () { },
142717
142718     objects: {
142719         PhoneGap: {
142720             path: "phonegap/1.0.0/PhoneGap"
142721         },
142722         Coordinates: {
142723             path: "w3c/1.0/Coordinates"
142724         },
142725         Position: {
142726             path: "w3c/1.0/Position"
142727         },
142728         PositionError: {
142729             path: "w3c/1.0/PositionError"
142730         },
142731         Acceleration: {
142732             path: "phonegap/1.0.0/Acceleration"
142733         },
142734         navigator: {
142735             path: "phonegap/1.0.0/navigator",
142736             children: {
142737                 accelerometer: {
142738                     path: "phonegap/1.0.0/accelerometer"
142739                 },
142740                 geolocation: {
142741                     path: "w3c/1.0/geolocation"
142742                 },
142743                 notification: {
142744                     path: "phonegap/1.0.0/notification"
142745                 },
142746                 contacts: {
142747                     path: "phonegap/1.0.0/contacts"
142748                 },
142749                 network: {
142750                     path: "phonegap/1.0.0/network"
142751                 },
142752                 camera: {
142753                     path: "phonegap/1.0.0/camera"
142754                 },
142755                 sms: {
142756                     path: "phonegap/1.0.0/sms"
142757                 },
142758                 telephony: {
142759                     path: "phonegap/1.0.0/telephony"
142760                 },
142761                 map: {
142762                     path: "phonegap/1.0.0/map"
142763                 },
142764                 orientation: {
142765                     path: "phonegap/1.0.0/orientation"
142766                 },
142767                 system: {
142768                     path: "phonegap/1.0.0/system"
142769                 },
142770                 compass: {
142771                     path: "phonegap/1.0.0/compass"
142772                 }
142773             }
142774         },
142775         ContactError: {
142776             path: "phonegap/1.0.0/ContactError"
142777         },
142778         Contact: {
142779             path: "phonegap/1.0.0/Contact"
142780         },
142781         ContactName: {
142782             path: "phonegap/1.0.0/ContactName"
142783         },
142784         ContactAccount: {
142785             path: "phonegap/1.0.0/ContactAccount"
142786         },
142787         ContactAddress: {
142788             path: "phonegap/1.0.0/ContactAddress"
142789         },
142790         ContactOrganization: {
142791             path: "phonegap/1.0.0/ContactOrganization"
142792         },
142793         ContactFindOptions: {
142794             path: "phonegap/1.0.0/ContactFindOptions"
142795         },
142796         ContactField: {
142797             path: "phonegap/1.0.0/ContactField"
142798         },
142799         NetworkStatus: {
142800             path: "phonegap/1.0.0/NetworkStatus"
142801         },
142802         device: {
142803             path: "phonegap/1.0.0/device"
142804         },
142805         SystemInfoOptions: {
142806             path: "phonegap/1.0.0/SystemInfoOptions"
142807         },
142808         PowerAttributes: {
142809             path: "phonegap/1.0.0/PowerAttributes"
142810         },
142811         CPUAttributes: {
142812             path: "phonegap/1.0.0/CPUAttributes"
142813         },
142814         ThermalAttributes: {
142815             path: "phonegap/1.0.0/ThermalAttributes"
142816         },
142817         NetworkAttributes: {
142818             path: "phonegap/1.0.0/NetworkAttributes"
142819         },
142820         Connection: {
142821             path: "phonegap/1.0.0/Connection"
142822         },
142823         ConnectionAttributes: {
142824             path: "phonegap/1.0.0/ConnectionAttributes"
142825         },
142826         SensorAttributes: {
142827             path: "phonegap/1.0.0/SensorAttributes"
142828         },
142829         AVCodecsAttributes: {
142830             path: "phonegap/1.0.0/AVCodecsAttributes"
142831         },
142832         AudioCodecAttributes: {
142833             path: "phonegap/1.0.0/AudioCodecAttributes"
142834         },
142835         VideoCodecAttributes: {
142836             path: "phonegap/1.0.0/VideoCodecAttributes"
142837         },
142838         StorageUnitAttributes: {
142839             path: "phonegap/1.0.0/StorageUnitAttributes"
142840         },
142841         InputDevicesAttributes: {
142842             path: "phonegap/1.0.0/InputDevicesAttributes"
142843         },
142844         OutputDevicesAttributes: {
142845             path: "phonegap/1.0.0/OutputDevicesAttributes"
142846         },
142847         DisplayDeviceAttributes: {
142848             path: "phonegap/1.0.0/DisplayDeviceAttributes"
142849         },
142850         AudioDeviceAttributes: {
142851             path: "phonegap/1.0.0/AudioDeviceAttributes"
142852         },
142853         PrintingDeviceAttributes: {
142854             path: "phonegap/1.0.0/PrintingDeviceAttributes"
142855         },
142856         BrailleDeviceAttributes: {
142857             path: "phonegap/1.0.0/BrailleDeviceAttributes"
142858         },
142859         PointerAttributes: {
142860             path: "phonegap/1.0.0/PointerAttributes"
142861         },
142862         KeyboardAttributes: {
142863             path: "phonegap/1.0.0/KeyboardAttributes"
142864         },
142865         CameraAttributes: {
142866             path: "phonegap/1.0.0/CameraAttributes"
142867         },
142868         MicrophoneAttributes: {
142869             path: "phonegap/1.0.0/MicrophoneAttributes"
142870         }
142871     }
142872
142873 };
142874
142875 });
142876 define('ripple/platform/phonegap/1.0.0/ContactFindOptions', function (require, exports, module) {
142877 /*
142878  *  Copyright 2011 Research In Motion Limited.
142879  *
142880  * Licensed under the Apache License, Version 2.0 (the "License");
142881  * you may not use this file except in compliance with the License.
142882  * You may obtain a copy of the License at
142883  *
142884  * http://www.apache.org/licenses/LICENSE-2.0
142885  *
142886  * Unless required by applicable law or agreed to in writing, software
142887  * distributed under the License is distributed on an "AS IS" BASIS,
142888  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
142889  * See the License for the specific language governing permissions and
142890  * limitations under the License.
142891  */
142892 module.exports = function (filter, multiple, updatedSince) {
142893     return {
142894         filter: filter || "",
142895         multiple: multiple || false,
142896         updatedSince: updatedSince || ""
142897     };
142898 };
142899
142900 });
142901 define('ripple/platform/phonegap/1.0.0/SensorAttributes', function (require, exports, module) {
142902 /*
142903  *  Copyright 2011 Research In Motion Limited.
142904  *
142905  * Licensed under the Apache License, Version 2.0 (the "License");
142906  * you may not use this file except in compliance with the License.
142907  * You may obtain a copy of the License at
142908  *
142909  * http://www.apache.org/licenses/LICENSE-2.0
142910  *
142911  * Unless required by applicable law or agreed to in writing, software
142912  * distributed under the License is distributed on an "AS IS" BASIS,
142913  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
142914  * See the License for the specific language governing permissions and
142915  * limitations under the License.
142916  */
142917 module.exports = function (value, min, max, normalizedValue) {
142918     return {
142919         value: value,
142920         min: min,
142921         max: max,
142922         normalizedValue: normalizedValue
142923     };
142924 };
142925
142926 });
142927 define('ripple/platform/phonegap/1.0.0/PhoneGap', function (require, exports, module) {
142928 /*
142929  *  Copyright 2011 Research In Motion Limited.
142930  *
142931  * Licensed under the Apache License, Version 2.0 (the "License");
142932  * you may not use this file except in compliance with the License.
142933  * You may obtain a copy of the License at
142934  *
142935  * http://www.apache.org/licenses/LICENSE-2.0
142936  *
142937  * Unless required by applicable law or agreed to in writing, software
142938  * distributed under the License is distributed on an "AS IS" BASIS,
142939  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
142940  * See the License for the specific language governing permissions and
142941  * limitations under the License.
142942  */
142943 module.exports = {
142944     available: true
142945 };
142946
142947 });
142948 define('ripple/platform/phonegap/1.0.0/SystemInfoOptions', function (require, exports, module) {
142949 /*
142950  *  Copyright 2011 Research In Motion Limited.
142951  *
142952  * Licensed under the Apache License, Version 2.0 (the "License");
142953  * you may not use this file except in compliance with the License.
142954  * You may obtain a copy of the License at
142955  *
142956  * http://www.apache.org/licenses/LICENSE-2.0
142957  *
142958  * Unless required by applicable law or agreed to in writing, software
142959  * distributed under the License is distributed on an "AS IS" BASIS,
142960  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
142961  * See the License for the specific language governing permissions and
142962  * limitations under the License.
142963  */
142964 module.exports = function (highThreshold, lowThreshold, thresholdTarget, timeout, id) {
142965     return {
142966         highThreshold: highThreshold,
142967         lowThreshold: lowThreshold,
142968         thresholdTarget: thresholdTarget,
142969         timeout: timeout,
142970         id: id
142971     };
142972 };
142973
142974 });
142975 define('ripple/platform/phonegap/1.0.0/navigator', function (require, exports, module) {
142976 /*
142977  *  Copyright 2011 Research In Motion Limited.
142978  *
142979  * Licensed under the Apache License, Version 2.0 (the "License");
142980  * you may not use this file except in compliance with the License.
142981  * You may obtain a copy of the License at
142982  *
142983  * http://www.apache.org/licenses/LICENSE-2.0
142984  *
142985  * Unless required by applicable law or agreed to in writing, software
142986  * distributed under the License is distributed on an "AS IS" BASIS,
142987  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
142988  * See the License for the specific language governing permissions and
142989  * limitations under the License.
142990  */
142991 var nav = require('ripple/platform/w3c/1.0/navigator'),
142992     event = require('ripple/event'),
142993     _console = require('ripple/console'),
142994     utils = require('ripple/utils'),
142995     emulatorBridge = require('ripple/emulatorBridge'),
142996     _self = {};
142997
142998 event.on("TinyHipposLoaded", function () {
142999     var doc = emulatorBridge.document(),
143000         evt = doc.createEvent("Events");
143001     evt.initEvent("deviceready", true, true);
143002     doc.dispatchEvent(evt);
143003     _console.log("fired deviceready event!");
143004 });
143005
143006 utils.mixin(nav, _self);
143007
143008 module.exports = _self;
143009
143010 });
143011 define('ripple/platform/phonegap/1.0.0/device', function (require, exports, module) {
143012 /*
143013  *  Copyright 2011 Research In Motion Limited.
143014  *
143015  * Licensed under the Apache License, Version 2.0 (the "License");
143016  * you may not use this file except in compliance with the License.
143017  * You may obtain a copy of the License at
143018  *
143019  * http://www.apache.org/licenses/LICENSE-2.0
143020  *
143021  * Unless required by applicable law or agreed to in writing, software
143022  * distributed under the License is distributed on an "AS IS" BASIS,
143023  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
143024  * See the License for the specific language governing permissions and
143025  * limitations under the License.
143026  */
143027 var _self = {},
143028     event = require('ripple/event'),
143029     devices = require('ripple/devices');
143030
143031
143032 event.on("HardwareKey", function (key) {
143033     event.trigger("HardwareKeyDefault", [key]);
143034 });
143035
143036 _self.__defineGetter__("name", function () {
143037     return devices.getCurrentDevice().name;
143038 });
143039
143040 _self.__defineGetter__("platform", function () {
143041     return devices.getCurrentDevice().osName;
143042 });
143043
143044 _self.__defineGetter__("uuid", function () {
143045     return devices.getCurrentDevice().uuid;
143046 });
143047
143048 _self.__defineGetter__("version", function () {
143049     return devices.getCurrentDevice().osVersion;
143050 });
143051
143052 _self.phonegap = "placeholder string";
143053
143054 module.exports = _self;
143055
143056 });
143057 define('ripple/platform/phonegap/1.0.0/AudioCodecAttributes', function (require, exports, module) {
143058 /*
143059  *  Copyright 2011 Research In Motion Limited.
143060  *
143061  * Licensed under the Apache License, Version 2.0 (the "License");
143062  * you may not use this file except in compliance with the License.
143063  * You may obtain a copy of the License at
143064  *
143065  * http://www.apache.org/licenses/LICENSE-2.0
143066  *
143067  * Unless required by applicable law or agreed to in writing, software
143068  * distributed under the License is distributed on an "AS IS" BASIS,
143069  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
143070  * See the License for the specific language governing permissions and
143071  * limitations under the License.
143072  */
143073 module.exports = function (info, id, compFormats, encode, decode) {
143074     return {
143075         info: info,
143076         id: id,
143077         compFormats: compFormats,
143078         encode: encode,
143079         decode: decode
143080     };
143081 };
143082
143083 });
143084 define('ripple/platform/phonegap/1.0.0/spec/config', function (require, exports, module) {
143085 /*
143086  *  Copyright 2011 Research In Motion Limited.
143087  *
143088  * Licensed under the Apache License, Version 2.0 (the "License");
143089  * you may not use this file except in compliance with the License.
143090  * You may obtain a copy of the License at
143091  *
143092  * http://www.apache.org/licenses/LICENSE-2.0
143093  *
143094  * Unless required by applicable law or agreed to in writing, software
143095  * distributed under the License is distributed on an "AS IS" BASIS,
143096  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
143097  * See the License for the specific language governing permissions and
143098  * limitations under the License.
143099  */
143100 var constants = require('ripple/constants');
143101
143102 module.exports = {
143103     fileName: "config.xml",
143104     validateVersion: function (configValidationObject) {
143105         var valid = true;
143106         valid = !((!configValidationObject.widget.validationResult[0].attributes.xmlns.valid) ||
143107             (!configValidationObject.widget.validationResult[0].attributes["xmlns:gap"].valid));
143108
143109         return valid;
143110     },
143111     extractInfo: function (configValidationObject) {
143112         if (!configValidationObject) {
143113             return null;
143114         }
143115
143116         var widgetInfo = {};
143117
143118         widgetInfo.id = configValidationObject.widget.validationResult[0].attributes.id.value || "";
143119         widgetInfo.name = configValidationObject.widget.children.name.validationResult[0].value;
143120         widgetInfo.icon = configValidationObject.widget.children.icon.validationResult[0].attributes.src.value;
143121         widgetInfo.version = configValidationObject.widget.validationResult[0].attributes.version.value;
143122
143123         return widgetInfo;
143124     },
143125     schema: {
143126         rootElement: "widget",
143127         widget: {
143128             nodeName: "widget",
143129             required: true,
143130             occurrence: 1,
143131             attributes: {
143132                 xmlns: {
143133                     attributeName: "xmlns",
143134                     required: true,
143135                     type: "list",
143136                     listValues: ["http://www.w3.org/ns/widgets"]
143137                 },
143138                 "xmlns:gap": {
143139                     attributeName: "xmlns:gap",
143140                     required: true,
143141                     type: "list",
143142                     listValues: ["http://phonegap.com/ns/1.0"]
143143                 },
143144                 "xml:lang": {
143145                     attributeName: "xml:lang",
143146                     required: false,
143147                     type: "iso-language"
143148                 },
143149                 dir: {
143150                     attributeName: "dir",
143151                     required: false,
143152                     type: "list",
143153                     listValues: ["ltr", "rtl", "lro", "rlo"]
143154                 },
143155                 id: {
143156                     attributeName: "id",
143157                     required: false,
143158                     type: "string"
143159                 },
143160                 version: {
143161                     attributeName: "version",
143162                     required: false,
143163                     type: "string"
143164                 },
143165                 height: {
143166                     attributeName: "height",
143167                     required: false,
143168                     type: "integer"
143169                 },
143170                 width: {
143171                     attributeName: "width",
143172                     required: false,
143173                     type: "integer"
143174                 },
143175                 viewmodes: {
143176                     attributeName: "viewmodes",
143177                     required: false,
143178                     type: "list",
143179                     listValues: ["floating", "fullscreen"]
143180                 }
143181             },
143182             children: {
143183                 name: {
143184                     nodeName: "name",
143185                     required: false,
143186                     occurrence: 0,
143187                     type: "string",
143188                     attributes: {
143189                         "short": {
143190                             attributeName: "short",
143191                             type: "string",
143192                             required: false
143193                         },
143194                         "xml:lang": {
143195                             attributeName: "xml:lang",
143196                             type: "string",
143197                             required: false,
143198                             unique: true
143199                         }
143200                     }
143201                 },
143202                 description: {
143203                     nodeName: "description",
143204                     required: false,
143205                     occurrence: 0,
143206                     type: "string",
143207                     attributes: {
143208                         "xml:lang": {
143209                             attributeName: "xml:lang",
143210                             type: "string",
143211                             required: false,
143212                             unique: true
143213                         }
143214                     }
143215                 },
143216                 author: {
143217                     nodeName: "author",
143218                     required: false,
143219                     occurrence: 1,
143220                     type: "string",
143221                     attributes: {
143222                         email: {
143223                             attributeName: "email",
143224                             type: "regex",
143225                             required: false,
143226                             regex: constants.REGEX.EMAIL
143227                         },
143228                         href: {
143229                             attributeName: "href",
143230                             type: "regex",
143231                             required: false,
143232                             regex: constants.REGEX.URL
143233                         }
143234                     }
143235                 },
143236                 license: {
143237                     nodeName: "license",
143238                     required: false,
143239                     occurrence: 1,
143240                     type: "string",
143241                     attributes: {
143242                         href: {
143243                             attributeName: "href",
143244                             type: "regex",
143245                             required: false,
143246                             regex: constants.REGEX.URL
143247                         },
143248                         "xml:lang": {
143249                             attributeName: "xml:lang",
143250                             type: "string",
143251                             required: false,
143252                             unique: true
143253                         }
143254                     }
143255                 },
143256                 icon: {
143257                     nodeName: "icon",
143258                     required: false,
143259                     occurrence: 0,
143260                     attributes: {
143261                         src: {
143262                             attributeName: "src",
143263                             type: "string",
143264                             required: true
143265                         },
143266                         height: {
143267                             attributeName: "height",
143268                             required: false,
143269                             type: "integer"
143270                         },
143271                         width: {
143272                             attributeName: "width",
143273                             required: false,
143274                             type: "integer"
143275                         }
143276                     }
143277                 },
143278                 content: {
143279                     nodeName: "content",
143280                     required: false,
143281                     occurrence: 1,
143282                     attributes: {
143283                         src: {
143284                             attributeName: "src",
143285                             type: "string",
143286                             required: true
143287                         },
143288                         encoding: {
143289                             attributeName: "encoding",
143290                             type: "string",
143291                             required: false
143292                         },
143293                         type: {
143294                             attributeName: "type",
143295                             type: "string",
143296                             required: false
143297                         }
143298                     }
143299                 },
143300                 feature: {
143301                     nodeName: "feature",
143302                     required: false,
143303                     occurrence: 0,
143304                     attributes: {
143305                         name: {
143306                             attributeName: "name",
143307                             type: "list",
143308                             required: true,
143309                             listValues: ["http://api.phonegap.com/1.0/accelerometer", "http://api.phonegap.com/1.0/camera",
143310                                 "http://api.phonegap.com/1.0/compass", "http://api.phonegap.com/1.0/contacts", "http://api.phonegap.com/1.0/device",
143311                                 "http://api.phonegap.com/1.0/events", "http://api.phonegap.com/1.0/file", "http://api.phonegap.com/1.0/geolocation",
143312                                 "http://api.phonegap.com/1.0/media", "http://api.phonegap.com/1.0/network", "http://api.phonegap.com/1.0/notification",
143313                                 "http://api.phonegap.com/1.0/storage"]
143314                         },
143315                         required: {
143316                             attributeName: "required",
143317                             type: "boolean",
143318                             required: false
143319                         }
143320                     }
143321                 },
143322                 preference: {
143323                     nodeName: "preference",
143324                     required: false,
143325                     occurrence: 0,
143326                     attributes: {
143327                         name: {
143328                             attributeName: "name",
143329                             type: "string",
143330                             required: true
143331                         },
143332                         value: {
143333                             type: "string",
143334                             attributeName: "value",
143335                             required: false
143336                         },
143337                         readonly: {
143338                             attributeName: "readonly",
143339                             type: "boolean",
143340                             required: false
143341                         }
143342                     }
143343                 }
143344             }
143345         }
143346     }
143347 };
143348
143349 });
143350 define('ripple/platform/phonegap/1.0.0/spec/device', function (require, exports, module) {
143351 /*
143352  *  Copyright 2011 Research In Motion Limited.
143353  *
143354  * Licensed under the Apache License, Version 2.0 (the "License");
143355  * you may not use this file except in compliance with the License.
143356  * You may obtain a copy of the License at
143357  *
143358  * http://www.apache.org/licenses/LICENSE-2.0
143359  *
143360  * Unless required by applicable law or agreed to in writing, software
143361  * distributed under the License is distributed on an "AS IS" BASIS,
143362  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
143363  * See the License for the specific language governing permissions and
143364  * limitations under the License.
143365  */
143366 var event = require('ripple/event');
143367
143368 module.exports = {
143369     "NetworkStatus": {
143370         "connectionType": {
143371             "name": "Connection Type",
143372             "control": {
143373                 "type": "select",
143374                 "value": "ethernet"
143375             },
143376             "options": {
143377                 "unknown": "UNKNOWN",
143378                 "ethernet": "ETHERNET",
143379                 "wifi": "WIFI",
143380                 "2g": "CELL_2G",
143381                 "3g": "CELL_3G",
143382                 "4g": "CELL_4G",
143383                 "none": "none"
143384             },
143385             "callback": function (setting) {
143386                 var connected = setting !== "none";
143387                 require('ripple/bus').send("network", connected);
143388             }
143389         },
143390         "lag": {
143391             "name": "Lag the network",
143392             "control": {
143393                 type: "checkbox",
143394                 value: false
143395             },
143396             "callback": function (setting) {
143397                 require('ripple/bus').send("lag", setting);
143398             }
143399         },
143400     }
143401 };
143402
143403 });
143404 define('ripple/platform/phonegap/1.0.0/spec/events', function (require, exports, module) {
143405 function _fires(name, data) {
143406     return function () {
143407         var doc = require("ripple/emulatorBridge").document(),
143408             evt = doc.createEvent("Events");
143409
143410         evt.initEvent(name, true, false);
143411         doc.dispatchEvent(evt);
143412     };
143413 }
143414
143415 module.exports = {
143416     "deviceready": {
143417         callback: _fires("deviceready")
143418     },
143419     "backbutton": {
143420         callback: _fires("backbutton")
143421     },
143422     "menubutton": {
143423         callback: _fires("menubutton")
143424     },
143425     "pause": {
143426         callback: _fires("pause")
143427     },
143428     "resume": {
143429         callback: _fires("resume")
143430     },
143431     "searchbutton": {
143432         callback: _fires("searchbutton")
143433     },
143434     "online": {
143435         callback: _fires("online")
143436     },
143437     "offline": {
143438         callback: _fires("offline")
143439     }
143440 };
143441
143442 });
143443 define('ripple/platform/phonegap/1.0.0/spec/ui', function (require, exports, module) {
143444 /*
143445  *  Copyright 2011 Research In Motion Limited.
143446  *
143447  * Licensed under the Apache License, Version 2.0 (the "License");
143448  * you may not use this file except in compliance with the License.
143449  * You may obtain a copy of the License at
143450  *
143451  * http://www.apache.org/licenses/LICENSE-2.0
143452  *
143453  * Unless required by applicable law or agreed to in writing, software
143454  * distributed under the License is distributed on an "AS IS" BASIS,
143455  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
143456  * See the License for the specific language governing permissions and
143457  * limitations under the License.
143458  */
143459 module.exports = {
143460     plugins: [
143461         "accelerometer",
143462         "deviceSettings",
143463         "geoView",
143464         "widgetConfig",
143465         "platformEvents"
143466     ]
143467 };
143468
143469 });
143470 define('ripple/platform/phonegap/1.0.0/VideoCodecAttributes', function (require, exports, module) {
143471 /*
143472  *  Copyright 2011 Research In Motion Limited.
143473  *
143474  * Licensed under the Apache License, Version 2.0 (the "License");
143475  * you may not use this file except in compliance with the License.
143476  * You may obtain a copy of the License at
143477  *
143478  * http://www.apache.org/licenses/LICENSE-2.0
143479  *
143480  * Unless required by applicable law or agreed to in writing, software
143481  * distributed under the License is distributed on an "AS IS" BASIS,
143482  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
143483  * See the License for the specific language governing permissions and
143484  * limitations under the License.
143485  */
143486 module.exports = function (info, id, compFormats, containerFormats, hwAccel, profiles, frameTypes, rateTypes) {
143487     return {
143488         info: info,
143489         id: id,
143490         compFormats: compFormats,
143491         containerFormats: containerFormats,
143492         hwAccel: hwAccel,
143493         profiles: profiles,
143494         frameTypes: frameTypes,
143495         rateTypes: rateTypes
143496     };
143497 };
143498
143499 });
143500 define('ripple/platform/phonegap/1.0.0/Connection', function (require, exports, module) {
143501 /*
143502  *  Copyright 2011 Research In Motion Limited.
143503  *
143504  * Licensed under the Apache License, Version 2.0 (the "License");
143505  * you may not use this file except in compliance with the License.
143506  * You may obtain a copy of the License at
143507  *
143508  * http://www.apache.org/licenses/LICENSE-2.0
143509  *
143510  * Unless required by applicable law or agreed to in writing, software
143511  * distributed under the License is distributed on an "AS IS" BASIS,
143512  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
143513  * See the License for the specific language governing permissions and
143514  * limitations under the License.
143515  */
143516 module.exports = {
143517     UNKNOWN: "unknown",
143518     ETHERNET: "ethernet",
143519     WIFI: "wifi",
143520     CELL_2G: "2g",
143521     CELL_3G: "3g",
143522     CELL_4G: "4g",
143523     NONE: "none"
143524 };
143525
143526 });
143527 define('ripple/platform/phonegap/1.0.0/notification', function (require, exports, module) {
143528 /*
143529  *  Copyright 2011 Research In Motion Limited.
143530  *
143531  * Licensed under the Apache License, Version 2.0 (the "License");
143532  * you may not use this file except in compliance with the License.
143533  * You may obtain a copy of the License at
143534  *
143535  * http://www.apache.org/licenses/LICENSE-2.0
143536  *
143537  * Unless required by applicable law or agreed to in writing, software
143538  * distributed under the License is distributed on an "AS IS" BASIS,
143539  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
143540  * See the License for the specific language governing permissions and
143541  * limitations under the License.
143542  */
143543 var notifications = require('ripple/notifications'),
143544     constants = require('ripple/constants'),
143545     _console = require('ripple/console'),
143546     ui = require('ripple/ui'),
143547     goodVibrations = require('ripple/ui/plugins/goodVibrations');
143548
143549 module.exports = {
143550     alert: function (message, title, buttonName) {
143551         notifications.openNotification("normal", message);
143552     },
143553
143554     beep: function (times) {
143555         for (var i = times; i > 0; i--) {
143556             _console.log("beep!");
143557         }
143558         notifications.openNotification("normal", "BEEP x " + times);
143559     },
143560
143561     vibrate: function (milliseconds) {
143562         milliseconds = milliseconds || 500;
143563         goodVibrations.vibrateDevice(milliseconds);
143564     }
143565 };
143566
143567 });
143568 define('ripple/platform/phonegap/1.0.0/telephony', function (require, exports, module) {
143569 /*
143570  *  Copyright 2011 Research In Motion Limited.
143571  *
143572  * Licensed under the Apache License, Version 2.0 (the "License");
143573  * you may not use this file except in compliance with the License.
143574  * You may obtain a copy of the License at
143575  *
143576  * http://www.apache.org/licenses/LICENSE-2.0
143577  *
143578  * Unless required by applicable law or agreed to in writing, software
143579  * distributed under the License is distributed on an "AS IS" BASIS,
143580  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
143581  * See the License for the specific language governing permissions and
143582  * limitations under the License.
143583  */
143584 module.exports = {
143585     send: function () {
143586         throw "not implemented";
143587     }
143588 };
143589
143590 });
143591 define('ripple/platform/phonegap/1.0.0/system', function (require, exports, module) {
143592 module.exports = {
143593     get: function () {
143594         throw "not implemented";
143595     },
143596     has: function () {
143597         throw "not implemented";
143598     },
143599     monitor: function () {
143600         throw "not implemented";
143601     }
143602 };
143603
143604 });
143605 define('ripple/platform/phonegap/1.0.0/contacts', function (require, exports, module) {
143606 /*
143607  *  Copyright 2011 Research In Motion Limited.
143608  *
143609  * Licensed under the Apache License, Version 2.0 (the "License");
143610  * you may not use this file except in compliance with the License.
143611  * You may obtain a copy of the License at
143612  *
143613  * http://www.apache.org/licenses/LICENSE-2.0
143614  *
143615  * Unless required by applicable law or agreed to in writing, software
143616  * distributed under the License is distributed on an "AS IS" BASIS,
143617  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
143618  * See the License for the specific language governing permissions and
143619  * limitations under the License.
143620  */
143621 var Contact = require('./Contact'),
143622     ContactName = require('./ContactName'),
143623     ContactError = require('./ContactError'),
143624     ContactField = require('./ContactField'),
143625     utils = require('ripple/utils'),
143626     db = require('ripple/db'),
143627     event = require('ripple/event'),
143628     _defaultContacts = 
143629     [{
143630         "id": Math.uuid(undefined, 16),
143631         "name": new ContactName("Brent Lintner"),
143632         "displayName": "Brent Lintner",
143633         "emails": [new ContactField("work", "brent@tinyhippos.com", false)]
143634     }, {
143635         "id": Math.uuid(undefined, 16),
143636         "name": new ContactName("PJ Lowe"),
143637         "displayName": "PJ Lowe",
143638         "emails": [new ContactField("work", "pj@tinyhippos.com", false)]
143639     }, {
143640         "id": Math.uuid(undefined, 16),
143641         "name": new ContactName("Dan Silivestru"),
143642         "displayName": "Dan Silivestru",
143643         "emails": [new ContactField("work", "dan@tinyhippos.com", false)]
143644     }, {
143645         "id": Math.uuid(undefined, 16),
143646         "name": new ContactName("Gord Tanner"),
143647         "displayName": "Gord Tanner",
143648         "emails": [new ContactField("work", "gord@tinyhippos.com", true)]
143649     }, {
143650         "id": Math.uuid(undefined, 16),
143651         "name": new ContactName("Mark McArdle"),
143652         "displayName": "Mark McArdle",
143653         "emails": [new ContactField("work", "mark@tinyhippos.com", false)]
143654     }],
143655     self;
143656
143657 function _error(callback, code, msg) {
143658     var e = new ContactError();
143659     e.code = code;
143660     e.message = msg;
143661     window.setTimeout(function () {
143662         callback(e);
143663     }, 1);
143664 }
143665
143666
143667 function _getContacts() {
143668     return db.retrieveObject("phonegap-contacts") || 
143669         _defaultContacts.map(function (person) {
143670             var contact = new Contact();
143671             contact.updated = new Date();
143672             utils.forEach(person, function (value, prop) {
143673                 contact[prop] = value;
143674             });
143675
143676             return contact;
143677         });
143678 }
143679
143680 function _saveContacts(contacts) {
143681     db.saveObject("phonegap-contacts", contacts);
143682 }
143683
143684 function _filtered(compare, options) {
143685     // this could be done a lot better..
143686     var found = false;
143687     if (!options.filter || options.filter === "") {
143688         found = true;
143689     } else if (typeof compare === "string" &&
143690               compare.match(new RegExp(".*" + options.filter + ".*", "i"))) {
143691         found = true;
143692     } else if (typeof compare === "object" || compare instanceof Array) {
143693         utils.forEach(compare, function (value) {
143694             if (!found) {
143695                 found = _filtered(value, options);
143696             }
143697         });
143698     }
143699     return found;
143700 }
143701
143702 event.on("phonegap-contact-save", function (contactProperties, success, error) {
143703     var contacts = _getContacts(),
143704         existsIndex = contacts.reduce(function (result, value, index) {
143705             return value.id === contactProperties.id ? index : result;
143706         }, -1),
143707         contact = existsIndex >= 0 ? contacts[existsIndex] : new Contact();
143708
143709     utils.mixin(contactProperties, contact);
143710     if (existsIndex < 0) {
143711         contacts.push(contact);
143712     }
143713     _saveContacts(contacts);
143714     success(contact);
143715 });
143716
143717 event.on("phonegap-contact-remove", function (id, success, error) {
143718     if (!id) {
143719         _error(error, ContactError.NOT_FOUND_ERROR, "id is falsy (" + id + ")");
143720     } else {
143721         var contacts = _getContacts(),
143722             toDelete = contacts.reduce(function (result, current, index) {
143723                 return current.id === id ? index : result;
143724             }, -1);
143725
143726         if (toDelete >= 0) {
143727             contacts.splice(toDelete, 1);
143728             _saveContacts(contacts);
143729             success();
143730         } else {
143731             _error(error, ContactError.NOT_FOUND_ERROR, "could not find contact with id (" + id + ")");
143732         }
143733     }
143734 });
143735
143736 self = module.exports = {
143737     create: function (properties) {
143738         var contact = new Contact();
143739         utils.forEach(properties, function (value, key) {
143740             contact[key] = value;
143741         });
143742         return contact;
143743     },
143744     find: function (fields, success, error, options) {
143745         var foundContacts = [],
143746             tempContact = self.create(),
143747             contacts = _getContacts(),
143748             errorFlag = false;
143749
143750         options = options || {};
143751
143752         // not a fan of error handling at the moment
143753         if (!fields || !("forEach" in fields)) {
143754             errorFlag = true;
143755             _error(error, ContactError.INVALID_ARGUMENT_ERROR, "missing contact fields array");
143756             return;
143757         }
143758
143759         // handle special case of ["*"] to return all fields
143760         if (fields.length === 1 && fields[0] === "*") {
143761             fields = utils.map(tempContact, function (v, k) {
143762                 return k;
143763             });
143764         }
143765
143766         fields.forEach(function (prop) {
143767             if (!(tempContact.hasOwnProperty(prop))) {
143768                 errorFlag = true;
143769                 _error(error, ContactError.INVALID_ARGUMENT_ERROR, "invalid contact field (" + prop + ")");
143770             }
143771         });
143772
143773         if (typeof success !== "function" && !errorFlag) {
143774             errorFlag = true;
143775             _error(error, ContactError.INVALID_ARGUMENT_ERROR, "missing success callback");
143776         }
143777
143778         if (errorFlag) {
143779             return;
143780         }
143781
143782         if (fields.length > 0) {
143783             contacts.forEach(function (contact, index) {
143784                 var newContact = utils.copy(contact);
143785
143786                 if (options && (!_filtered(contact, options) ||
143787                         options.updatedSince && contact.updated && contact.updated.getTime() < options.updatedSince.getTime())) {
143788                     return;
143789                 }
143790
143791                 utils.forEach(newContact, function (value, prop) {
143792                     if (typeof newContact[prop] !== "function" && prop !== "id" &&
143793                         !fields.some(function (field) {
143794                             return field === prop;
143795                         })) {
143796                         delete newContact[prop];
143797                     }
143798                 });
143799
143800                 foundContacts.push(newContact);
143801             });
143802         }
143803
143804         window.setTimeout(function () {
143805             // TODO: don't loop over entire db just to slice the array
143806             if (options.multiple === false) {
143807                 foundContacts = foundContacts.splice(0, 1);
143808             }
143809             success(foundContacts);
143810         }, 1);
143811     }
143812 };
143813
143814 });
143815 define('ripple/platform/phonegap/1.0.0/PointerAttributes', function (require, exports, module) {
143816 /*
143817  *  Copyright 2011 Research In Motion Limited.
143818  *
143819  * Licensed under the Apache License, Version 2.0 (the "License");
143820  * you may not use this file except in compliance with the License.
143821  * You may obtain a copy of the License at
143822  *
143823  * http://www.apache.org/licenses/LICENSE-2.0
143824  *
143825  * Unless required by applicable law or agreed to in writing, software
143826  * distributed under the License is distributed on an "AS IS" BASIS,
143827  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
143828  * See the License for the specific language governing permissions and
143829  * limitations under the License.
143830  */
143831 module.exports = function (type, supportsMultiTouch, info) {
143832     return {
143833         type: type,
143834         supportsMultiTouch: supportsMultiTouch,
143835         info: info
143836     };
143837 };
143838
143839 });
143840 define('ripple/platform/phonegap/1.0.0/AudioDeviceAttributes', function (require, exports, module) {
143841 /*
143842  *  Copyright 2011 Research In Motion Limited.
143843  *
143844  * Licensed under the Apache License, Version 2.0 (the "License");
143845  * you may not use this file except in compliance with the License.
143846  * You may obtain a copy of the License at
143847  *
143848  * http://www.apache.org/licenses/LICENSE-2.0
143849  *
143850  * Unless required by applicable law or agreed to in writing, software
143851  * distributed under the License is distributed on an "AS IS" BASIS,
143852  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
143853  * See the License for the specific language governing permissions and
143854  * limitations under the License.
143855  */
143856 module.exports = function (type, freqRangeLow, freqRangeHigh, volumeLevel, info) {
143857     return {
143858         type: type,
143859         freqRangeLow: freqRangeLow,
143860         freqRangeHigh: freqRangeHigh,
143861         volumeLevel: volumeLevel,
143862         info: info
143863     };
143864
143865 };
143866
143867 });
143868 define('ripple/platform/phonegap/1.0.0/DisplayDeviceAttributes', function (require, exports, module) {
143869 /*
143870  *  Copyright 2011 Research In Motion Limited.
143871  *
143872  * Licensed under the Apache License, Version 2.0 (the "License");
143873  * you may not use this file except in compliance with the License.
143874  * You may obtain a copy of the License at
143875  *
143876  * http://www.apache.org/licenses/LICENSE-2.0
143877  *
143878  * Unless required by applicable law or agreed to in writing, software
143879  * distributed under the License is distributed on an "AS IS" BASIS,
143880  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
143881  * See the License for the specific language governing permissions and
143882  * limitations under the License.
143883  */
143884 module.exports = function (orientation, brightness, contrast, blanked, dotsPerInchW, dotsPerInchH, physicalWidth, physicalHeight, info) {
143885     return {
143886         orientation: orientation,
143887         brightness: brightness,
143888         contrast: contrast,
143889         blanked: blanked,
143890         dotsPerInchW: dotsPerInchW,
143891         dotsPerInchH: dotsPerInchH,
143892         physicalWidth: physicalWidth,
143893         physicalHeight: physicalHeight,
143894         info: info
143895     };
143896 };
143897
143898 });
143899 define('ripple/platform/phonegap/1.0.0/InputDevicesAttributes', function (require, exports, module) {
143900 /*
143901  *  Copyright 2011 Research In Motion Limited.
143902  *
143903  * Licensed under the Apache License, Version 2.0 (the "License");
143904  * you may not use this file except in compliance with the License.
143905  * You may obtain a copy of the License at
143906  *
143907  * http://www.apache.org/licenses/LICENSE-2.0
143908  *
143909  * Unless required by applicable law or agreed to in writing, software
143910  * distributed under the License is distributed on an "AS IS" BASIS,
143911  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
143912  * See the License for the specific language governing permissions and
143913  * limitations under the License.
143914  */
143915 module.exports = function (info, id, pointingDevices, activePointingDevices, keyboards, activeKeyboards, cameras, activeCameras, microphones, activeMicrophones) {
143916     return {
143917         info: info,
143918         id: id,
143919         pointingDevices: pointingDevices,
143920         activePointingDevices: activePointingDevices,
143921         keyboards: keyboards,
143922         activeKeyboards: activeKeyboards,
143923         cameras: cameras,
143924         activeCameras: activeCameras,
143925         microphones: microphones,
143926         activeMicrophones: activeMicrophones
143927     };
143928
143929 };
143930
143931 });
143932 define('ripple/platform/phonegap/1.0.0/camera', function (require, exports, module) {
143933 /*
143934  *  Copyright 2011 Research In Motion Limited.
143935  *
143936  * Licensed under the Apache License, Version 2.0 (the "License");
143937  * you may not use this file except in compliance with the License.
143938  * You may obtain a copy of the License at
143939  *
143940  * http://www.apache.org/licenses/LICENSE-2.0
143941  *
143942  * Unless required by applicable law or agreed to in writing, software
143943  * distributed under the License is distributed on an "AS IS" BASIS,
143944  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
143945  * See the License for the specific language governing permissions and
143946  * limitations under the License.
143947  */
143948 module.exports = {
143949     getPicture: function (cameraSuccess, cameraError, cameraOptions) {
143950         if (cameraError) {
143951             cameraError.apply(null, ["not implemented"]);
143952         }
143953         else {
143954             throw "not implemented";
143955         }
143956     }
143957 };
143958
143959 });
143960 define('ripple/platform/phonegap/1.0.0/network', function (require, exports, module) {
143961 /*
143962  *  Copyright 2011 Research In Motion Limited.
143963  *
143964  * Licensed under the Apache License, Version 2.0 (the "License");
143965  * you may not use this file except in compliance with the License.
143966  * You may obtain a copy of the License at
143967  *
143968  * http://www.apache.org/licenses/LICENSE-2.0
143969  *
143970  * Unless required by applicable law or agreed to in writing, software
143971  * distributed under the License is distributed on an "AS IS" BASIS,
143972  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
143973  * See the License for the specific language governing permissions and
143974  * limitations under the License.
143975  */
143976 var deviceSettings = require('ripple/deviceSettings'),
143977     _self = {
143978         connection: {
143979         }
143980     };
143981
143982 _self.connection.__defineGetter__("type", function () {
143983     return deviceSettings.retrieve("NetworkStatus.connectionType");
143984 });
143985
143986 module.exports = _self;
143987
143988 });
143989 define('ripple/platform/phonegap/1.0.0/KeyboardAttributes', function (require, exports, module) {
143990 /*
143991  *  Copyright 2011 Research In Motion Limited.
143992  *
143993  * Licensed under the Apache License, Version 2.0 (the "License");
143994  * you may not use this file except in compliance with the License.
143995  * You may obtain a copy of the License at
143996  *
143997  * http://www.apache.org/licenses/LICENSE-2.0
143998  *
143999  * Unless required by applicable law or agreed to in writing, software
144000  * distributed under the License is distributed on an "AS IS" BASIS,
144001  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
144002  * See the License for the specific language governing permissions and
144003  * limitations under the License.
144004  */
144005 module.exports = function (type, isHardware, info) {
144006     return {
144007         type: type,
144008         isHardware: isHardware,
144009         info: info
144010     };
144011 };
144012
144013 });
144014 define('ripple/platform/phonegap/1.0.0/ContactAddress', function (require, exports, module) {
144015 /*
144016  *  Copyright 2011 Research In Motion Limited.
144017  *
144018  * Licensed under the Apache License, Version 2.0 (the "License");
144019  * you may not use this file except in compliance with the License.
144020  * You may obtain a copy of the License at
144021  *
144022  * http://www.apache.org/licenses/LICENSE-2.0
144023  *
144024  * Unless required by applicable law or agreed to in writing, software
144025  * distributed under the License is distributed on an "AS IS" BASIS,
144026  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
144027  * See the License for the specific language governing permissions and
144028  * limitations under the License.
144029  */
144030 module.exports = function (pref, type, formatted, streetAddress, locality, region, postalCode, country, id) {
144031     return {
144032         pref: pref || null,
144033         type: type || null,
144034         formatted: formatted || null,
144035         streetAddress: streetAddress || null,
144036         locality: locality || null,
144037         region: region || null,
144038         postalCode: postalCode || null,
144039         country: country || null,
144040         id: id || null
144041     };
144042 };
144043
144044 });
144045 define('ripple/platform/phonegap/1.0.0/BrailleDeviceAttributes', function (require, exports, module) {
144046 /*
144047  *  Copyright 2011 Research In Motion Limited.
144048  *
144049  * Licensed under the Apache License, Version 2.0 (the "License");
144050  * you may not use this file except in compliance with the License.
144051  * You may obtain a copy of the License at
144052  *
144053  * http://www.apache.org/licenses/LICENSE-2.0
144054  *
144055  * Unless required by applicable law or agreed to in writing, software
144056  * distributed under the License is distributed on an "AS IS" BASIS,
144057  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
144058  * See the License for the specific language governing permissions and
144059  * limitations under the License.
144060  */
144061 module.exports = function (nbCells, info) {
144062     return {
144063         nbCells: nbCells,
144064         info: info
144065     };
144066
144067 };
144068
144069 });
144070 define('ripple/platform/phonegap/1.0.0/CPUAttributes', function (require, exports, module) {
144071 /*
144072  *  Copyright 2011 Research In Motion Limited.
144073  *
144074  * Licensed under the Apache License, Version 2.0 (the "License");
144075  * you may not use this file except in compliance with the License.
144076  * You may obtain a copy of the License at
144077  *
144078  * http://www.apache.org/licenses/LICENSE-2.0
144079  *
144080  * Unless required by applicable law or agreed to in writing, software
144081  * distributed under the License is distributed on an "AS IS" BASIS,
144082  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
144083  * See the License for the specific language governing permissions and
144084  * limitations under the License.
144085  */
144086 module.exports = function (info, id, usage) {
144087     return {
144088         info: info,
144089         id: id,
144090         usage: usage
144091     };
144092 };
144093
144094 });
144095 define('ripple/platform/phonegap/1.0.0/ThermalAttributes', function (require, exports, module) {
144096 /*
144097  *  Copyright 2011 Research In Motion Limited.
144098  *
144099  * Licensed under the Apache License, Version 2.0 (the "License");
144100  * you may not use this file except in compliance with the License.
144101  * You may obtain a copy of the License at
144102  *
144103  * http://www.apache.org/licenses/LICENSE-2.0
144104  *
144105  * Unless required by applicable law or agreed to in writing, software
144106  * distributed under the License is distributed on an "AS IS" BASIS,
144107  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
144108  * See the License for the specific language governing permissions and
144109  * limitations under the License.
144110  */
144111 module.exports = function (info, id, state) {
144112     return {
144113         info: info,
144114         id: id,
144115         state: state
144116     };
144117 };
144118
144119 });
144120 define('ripple/platform/phonegap/1.0.0/ContactOrganization', function (require, exports, module) {
144121 /*
144122  *  Copyright 2011 Research In Motion Limited.
144123  *
144124  * Licensed under the Apache License, Version 2.0 (the "License");
144125  * you may not use this file except in compliance with the License.
144126  * You may obtain a copy of the License at
144127  *
144128  * http://www.apache.org/licenses/LICENSE-2.0
144129  *
144130  * Unless required by applicable law or agreed to in writing, software
144131  * distributed under the License is distributed on an "AS IS" BASIS,
144132  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
144133  * See the License for the specific language governing permissions and
144134  * limitations under the License.
144135  */
144136 module.exports = function (pref, type, name, dept, title) {
144137     return {
144138         pref: pref || null,
144139         type: type || null,
144140         name: name || null,
144141         department: dept || null,
144142         title: title || null
144143     };
144144 };
144145
144146 });
144147 define('ripple/platform/phonegap/1.0.0/orientation', function (require, exports, module) {
144148 /*
144149  *  Copyright 2011 Research In Motion Limited.
144150  *
144151  * Licensed under the Apache License, Version 2.0 (the "License");
144152  * you may not use this file except in compliance with the License.
144153  * You may obtain a copy of the License at
144154  *
144155  * http://www.apache.org/licenses/LICENSE-2.0
144156  *
144157  * Unless required by applicable law or agreed to in writing, software
144158  * distributed under the License is distributed on an "AS IS" BASIS,
144159  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
144160  * See the License for the specific language governing permissions and
144161  * limitations under the License.
144162  */
144163 module.exports = {
144164     currentOrientation: null,
144165     getCurrentOrientation: function (onSuccess, onFail) {
144166         throw "not implemented";
144167     },
144168     watchOrientation: function () {
144169         throw "not implemented";
144170     }
144171 };
144172
144173 });
144174 define('ripple/platform/phonegap/1.0.0/compass', function (require, exports, module) {
144175 /*
144176  *  Copyright 2011 Research In Motion Limited.
144177  *
144178  * Licensed under the Apache License, Version 2.0 (the "License");
144179  * you may not use this file except in compliance with the License.
144180  * You may obtain a copy of the License at
144181  *
144182  * http://www.apache.org/licenses/LICENSE-2.0
144183  *
144184  * Unless required by applicable law or agreed to in writing, software
144185  * distributed under the License is distributed on an "AS IS" BASIS,
144186  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
144187  * See the License for the specific language governing permissions and
144188  * limitations under the License.
144189  */
144190 var geo = require('ripple/geo');
144191
144192 function _getHeading() {
144193     return geo.getPositionInfo().heading;
144194 }
144195
144196 module.exports = {
144197     getCurrentHeading: function (compassSuccess, compassError, compassOptions) {
144198         setTimeout(function () {
144199             compassSuccess(_getHeading());
144200         }, 1);
144201     },
144202     watchHeading: function (compassSuccess, compassError, compassOptions) {
144203         compassOptions = compassOptions || {};
144204         return setInterval(function () {
144205             compassSuccess(_getHeading());
144206         }, compassOptions.frequency || 100);
144207     },
144208     clearWatch: function (watchId) {
144209         clearInterval(watchId);
144210     }
144211 };
144212
144213 });
144214 define('ripple/platform/phonegap/1.0.0/ContactError', function (require, exports, module) {
144215 /*
144216  *  Copyright 2011 Research In Motion Limited.
144217  *
144218  * Licensed under the Apache License, Version 2.0 (the "License");
144219  * you may not use this file except in compliance with the License.
144220  * You may obtain a copy of the License at
144221  *
144222  * http://www.apache.org/licenses/LICENSE-2.0
144223  *
144224  * Unless required by applicable law or agreed to in writing, software
144225  * distributed under the License is distributed on an "AS IS" BASIS,
144226  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
144227  * See the License for the specific language governing permissions and
144228  * limitations under the License.
144229  */
144230 function ContactError(code) {
144231     this.code = code || null;
144232 }
144233
144234 ContactError.UNKNOWN_ERROR = 0;
144235 ContactError.INVALID_ARGUMENT_ERROR = 1;
144236 ContactError.NOT_FOUND_ERROR = 2;
144237 ContactError.TIMEOUT_ERROR = 3;
144238 ContactError.PENDING_OPERATION_ERROR = 4;
144239 ContactError.IO_ERROR = 5;
144240 ContactError.NOT_SUPPORTED_ERROR = 6;
144241 ContactError.PERMISSION_DENIED_ERROR = 20;
144242
144243 module.exports = ContactError;
144244
144245 });
144246 define('ripple/platform/phonegap/1.0.0/OutputDevicesAttributes', function (require, exports, module) {
144247 /*
144248  *  Copyright 2011 Research In Motion Limited.
144249  *
144250  * Licensed under the Apache License, Version 2.0 (the "License");
144251  * you may not use this file except in compliance with the License.
144252  * You may obtain a copy of the License at
144253  *
144254  * http://www.apache.org/licenses/LICENSE-2.0
144255  *
144256  * Unless required by applicable law or agreed to in writing, software
144257  * distributed under the License is distributed on an "AS IS" BASIS,
144258  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
144259  * See the License for the specific language governing permissions and
144260  * limitations under the License.
144261  */
144262 module.exports = function (info, id, displayDevices, activeDisplayDevices, printingDevices, activePrintingDevice, brailleDevices, activeBrailleDevice, audioDevices, activeAudioDevices) {
144263     return {
144264         info: info,
144265         id: id,
144266         displayDevices: displayDevices,
144267         activeDisplayDevices: activeDisplayDevices,
144268         printingDevices: printingDevices,
144269         activePrintingDevice: activePrintingDevice,
144270         brailleDevices: brailleDevices,
144271         activeBrailleDevice: activeBrailleDevice,
144272         audioDevices: audioDevices,
144273         activeAudioDevices: activeAudioDevices
144274     };
144275 };
144276
144277 });
144278 define('ripple/platform/phonegap/1.0.0/MicrophoneAttributes', function (require, exports, module) {
144279 /*
144280  *  Copyright 2011 Research In Motion Limited.
144281  *
144282  * Licensed under the Apache License, Version 2.0 (the "License");
144283  * you may not use this file except in compliance with the License.
144284  * You may obtain a copy of the License at
144285  *
144286  * http://www.apache.org/licenses/LICENSE-2.0
144287  *
144288  * Unless required by applicable law or agreed to in writing, software
144289  * distributed under the License is distributed on an "AS IS" BASIS,
144290  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
144291  * See the License for the specific language governing permissions and
144292  * limitations under the License.
144293  */
144294 module.exports = function (type, freqRangeLow, freqRangeHigh, info, name, types) {
144295     return {
144296         type: type,
144297         freqRangeLow: freqRangeLow,
144298         freqRangeHigh: freqRangeHigh,
144299         info: info,
144300         name: name,
144301         types: types
144302     };
144303 };
144304
144305 });
144306 define('ripple/platform/phonegap/1.0.0/ContactName', function (require, exports, module) {
144307 /*
144308  *  Copyright 2011 Research In Motion Limited.
144309  *
144310  * Licensed under the Apache License, Version 2.0 (the "License");
144311  * you may not use this file except in compliance with the License.
144312  * You may obtain a copy of the License at
144313  *
144314  * http://www.apache.org/licenses/LICENSE-2.0
144315  *
144316  * Unless required by applicable law or agreed to in writing, software
144317  * distributed under the License is distributed on an "AS IS" BASIS,
144318  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
144319  * See the License for the specific language governing permissions and
144320  * limitations under the License.
144321  */
144322 module.exports = function (formatted, familyName, givenName, middleName, honorificPrefix, honorificSuffix) {
144323     return {
144324         formatted: formatted,
144325         familyName: familyName,
144326         givenName: givenName,
144327         middleName: middleName,
144328         honorificPrefix: honorificPrefix,
144329         honorificSuffix: honorificSuffix
144330     };
144331 };
144332
144333 });
144334 define('ripple/platform/phonegap/1.0.0/StorageUnitAttributes', function (require, exports, module) {
144335 /*
144336  *  Copyright 2011 Research In Motion Limited.
144337  *
144338  * Licensed under the Apache License, Version 2.0 (the "License");
144339  * you may not use this file except in compliance with the License.
144340  * You may obtain a copy of the License at
144341  *
144342  * http://www.apache.org/licenses/LICENSE-2.0
144343  *
144344  * Unless required by applicable law or agreed to in writing, software
144345  * distributed under the License is distributed on an "AS IS" BASIS,
144346  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
144347  * See the License for the specific language governing permissions and
144348  * limitations under the License.
144349  */
144350 module.exports = function (info, id, type, isWritable, capacity, availableCapacity, isRemoveable) {
144351     return {
144352         info: info,
144353         id: id,
144354         type: type,
144355         isWritable: isWritable,
144356         capacity: capacity,
144357         availableCapacity: availableCapacity,
144358         isRemoveable: isRemoveable
144359     };
144360 };
144361
144362 });
144363 define('ripple/platform/phonegap/1.0.0/Acceleration', function (require, exports, module) {
144364 /*
144365  *  Copyright 2011 Research In Motion Limited.
144366  *
144367  * Licensed under the Apache License, Version 2.0 (the "License");
144368  * you may not use this file except in compliance with the License.
144369  * You may obtain a copy of the License at
144370  *
144371  * http://www.apache.org/licenses/LICENSE-2.0
144372  *
144373  * Unless required by applicable law or agreed to in writing, software
144374  * distributed under the License is distributed on an "AS IS" BASIS,
144375  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
144376  * See the License for the specific language governing permissions and
144377  * limitations under the License.
144378  */
144379 module.exports = function (x, y, z) {
144380     return {
144381         x: x || 0,
144382         y: y || 0,
144383         z: z || 0,
144384         timestamp: new Date().getTime()
144385     };
144386 };
144387
144388 });
144389 define('ripple/platform/phonegap/1.0.0/accelerometer', function (require, exports, module) {
144390 /*
144391  *  Copyright 2011 Research In Motion Limited.
144392  *
144393  * Licensed under the Apache License, Version 2.0 (the "License");
144394  * you may not use this file except in compliance with the License.
144395  * You may obtain a copy of the License at
144396  *
144397  * http://www.apache.org/licenses/LICENSE-2.0
144398  *
144399  * Unless required by applicable law or agreed to in writing, software
144400  * distributed under the License is distributed on an "AS IS" BASIS,
144401  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
144402  * See the License for the specific language governing permissions and
144403  * limitations under the License.
144404  */
144405 var Acceleration = require('ripple/platform/phonegap/1.0.0/Acceleration'),
144406     utils = require('ripple/utils'),
144407     event = require('ripple/event'),
144408     _accelerometerInfo = new Acceleration(),
144409     _watches = {},
144410     self;
144411
144412 module.exports = self = {
144413     getCurrentAcceleration: function (onSuccess, onError) {
144414         // TODO: implement error call if accelerometer is not available, to be driven by behaviours?
144415
144416         if (typeof onSuccess === "function") {
144417             setTimeout(function () {
144418                 // TODO: build facility to trigger onError() from emulator
144419                 // see pivotal item: https://www.pivotaltracker.com/story/show/7040343
144420                 onSuccess(utils.copy(_accelerometerInfo));
144421             }, 1);
144422         }
144423
144424     },
144425
144426     watchAcceleration: function (accelerometerSuccess, accelerometerError, accelerometerOptions) {
144427         var watchId = (new Date()).getTime().toString(),
144428             watchObj = {};
144429
144430
144431         if (accelerometerOptions &&
144432                 accelerometerOptions.frequency && typeof
144433                 accelerometerOptions.frequency === "number" &&
144434                 accelerometerOptions.frequency === Math.floor(accelerometerOptions.frequency)) {
144435
144436             watchObj = {
144437                 onSuccess: accelerometerSuccess,
144438                 onError: accelerometerError,
144439                 interval: accelerometerOptions.frequency
144440             };
144441
144442             _watches[watchId] = watchObj;
144443
144444             _watches[watchId].intervalId = setInterval(function () {
144445                 self.getCurrentAcceleration(_watches[watchId].onSuccess, _watches[watchId].onError);
144446             }, accelerometerOptions.frequency);
144447
144448         }
144449         else {
144450             if (typeof accelerometerError === "function") {
144451                 setTimeout(function () {
144452                     accelerometerError();
144453                 }, 1);
144454             }
144455         }
144456
144457         return watchId;
144458     },
144459
144460     clearWatch: function (watchId) {
144461         clearInterval(_watches[watchId].intervalId);
144462     }
144463 };
144464
144465 event.on("AccelerometerInfoChangedEvent", function (accelerometerInfo) {
144466     _accelerometerInfo.x = accelerometerInfo.accelerationIncludingGravity.x / 9.8;
144467     _accelerometerInfo.y = accelerometerInfo.accelerationIncludingGravity.y / 9.8;
144468     _accelerometerInfo.z = accelerometerInfo.accelerationIncludingGravity.z / 9.8;
144469     _accelerometerInfo.timestamp = (new Date()).getTime();
144470 });
144471
144472 });
144473 define('ripple/platform/phonegap/1.0.0/ConnectionAttributes', function (require, exports, module) {
144474 /*
144475  *  Copyright 2011 Research In Motion Limited.
144476  *
144477  * Licensed under the Apache License, Version 2.0 (the "License");
144478  * you may not use this file except in compliance with the License.
144479  * You may obtain a copy of the License at
144480  *
144481  * http://www.apache.org/licenses/LICENSE-2.0
144482  *
144483  * Unless required by applicable law or agreed to in writing, software
144484  * distributed under the License is distributed on an "AS IS" BASIS,
144485  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
144486  * See the License for the specific language governing permissions and
144487  * limitations under the License.
144488  */
144489 module.exports = function (info, id, type, currentOrientation, currentUploadBandwidth, maxDownloadBandwidth, maxUploadBandwidth, currentSignalStrength, roaming) {
144490     return {
144491         info: info,
144492         id: id,
144493         type: type,
144494         currentDownloadBandwidth: currentOrientation,
144495         currentUploadBandwidth: currentUploadBandwidth,
144496         maxDownloadBandwidth: maxDownloadBandwidth,
144497         maxUploadBandwidth: maxUploadBandwidth,
144498         currentSignalStrength: currentSignalStrength,
144499         roaming: roaming
144500     };
144501 };
144502
144503 });
144504 define('ripple/platform/phonegap/1.0.0/PowerAttributes', function (require, exports, module) {
144505 /*
144506  *  Copyright 2011 Research In Motion Limited.
144507  *
144508  * Licensed under the Apache License, Version 2.0 (the "License");
144509  * you may not use this file except in compliance with the License.
144510  * You may obtain a copy of the License at
144511  *
144512  * http://www.apache.org/licenses/LICENSE-2.0
144513  *
144514  * Unless required by applicable law or agreed to in writing, software
144515  * distributed under the License is distributed on an "AS IS" BASIS,
144516  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
144517  * See the License for the specific language governing permissions and
144518  * limitations under the License.
144519  */
144520 module.exports = function (info, id, level, timeRemaining, isBattery, isCharging) {
144521     return {
144522         info: info,
144523         id: id,
144524         level: level,
144525         timeRemaining: timeRemaining,
144526         isBattery: isBattery,
144527         isCharging: isCharging
144528     };
144529 };
144530
144531 });
144532 define('ripple/platform/phonegap/1.0.0/sms', function (require, exports, module) {
144533 /*
144534  *  Copyright 2011 Research In Motion Limited.
144535  *
144536  * Licensed under the Apache License, Version 2.0 (the "License");
144537  * you may not use this file except in compliance with the License.
144538  * You may obtain a copy of the License at
144539  *
144540  * http://www.apache.org/licenses/LICENSE-2.0
144541  *
144542  * Unless required by applicable law or agreed to in writing, software
144543  * distributed under the License is distributed on an "AS IS" BASIS,
144544  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
144545  * See the License for the specific language governing permissions and
144546  * limitations under the License.
144547  */
144548 module.exports = {
144549     send: function () {
144550         throw "not implemented";
144551     }
144552 };
144553
144554 });
144555 define('ripple/platform/phonegap/1.0.0/service', function (require, exports, module) {
144556 /*
144557  *  Copyright 2011 Research In Motion Limited.
144558  *
144559  * Licensed under the Apache License, Version 2.0 (the "License");
144560  * you may not use this file except in compliance with the License.
144561  * You may obtain a copy of the License at
144562  *
144563  * http://www.apache.org/licenses/LICENSE-2.0
144564  *
144565  * Unless required by applicable law or agreed to in writing, software
144566  * distributed under the License is distributed on an "AS IS" BASIS,
144567  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
144568  * See the License for the specific language governing permissions and
144569  * limitations under the License.
144570  */
144571 // for form, but could probably just delete
144572 module.exports = {};
144573
144574 });
144575 define('ripple/platform/phonegap/1.0.0/PrintingDeviceAttributes', function (require, exports, module) {
144576 /*
144577  *  Copyright 2011 Research In Motion Limited.
144578  *
144579  * Licensed under the Apache License, Version 2.0 (the "License");
144580  * you may not use this file except in compliance with the License.
144581  * You may obtain a copy of the License at
144582  *
144583  * http://www.apache.org/licenses/LICENSE-2.0
144584  *
144585  * Unless required by applicable law or agreed to in writing, software
144586  * distributed under the License is distributed on an "AS IS" BASIS,
144587  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
144588  * See the License for the specific language governing permissions and
144589  * limitations under the License.
144590  */
144591 module.exports = function (type, resolution, color, info) {
144592     return {
144593         type: type,
144594         resolution: resolution,
144595         color: color,
144596         info: info
144597     };
144598 };
144599
144600 });
144601 define('ripple/platform/phonegap/1.0.0/Contact', function (require, exports, module) {
144602 /*
144603  *  Copyright 2011 Research In Motion Limited.
144604  *
144605  * Licensed under the Apache License, Version 2.0 (the "License");
144606  * you may not use this file except in compliance with the License.
144607  * You may obtain a copy of the License at
144608  *
144609  * http://www.apache.org/licenses/LICENSE-2.0
144610  *
144611  * Unless required by applicable law or agreed to in writing, software
144612  * distributed under the License is distributed on an "AS IS" BASIS,
144613  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
144614  * See the License for the specific language governing permissions and
144615  * limitations under the License.
144616  */
144617 var utils = require('ripple/utils'),
144618     event = require('ripple/event');
144619
144620 function _properties(obj) {
144621     var prop, newObj = {};
144622     for (prop in obj) {
144623         if (Object.prototype.hasOwnProperty.call(obj, prop)) {
144624             if (typeof obj[prop] !== "function") {
144625                 newObj[prop] = utils.copy(obj[prop]);
144626             }
144627         }
144628     }
144629     return newObj;
144630 }
144631
144632 module.exports = function (
144633         id,
144634         displayName,
144635         name,
144636         nickname,
144637         phoneNumbers,
144638         emails,
144639         addresses,
144640         ims,
144641         organizations,
144642         birthday,
144643         note,
144644         photos,
144645         categories,
144646         urls
144647 ) {
144648
144649     return {
144650         id: id || Math.uuid(undefined, 16),
144651         displayName: displayName || null,
144652         name: name || null,
144653         nickname: nickname || null,
144654         phoneNumbers: phoneNumbers || null,
144655         emails: emails || null,
144656         addresses: addresses || null,
144657         ims: ims || null,
144658         organizations: organizations || null,
144659         birthday: birthday || null,
144660         note: note || null,
144661         photos: photos || null,
144662         categories: categories || null,
144663         urls: urls || null,
144664         save: function (success, error) {
144665             var _self = this,
144666                 lastUpdated = this.updated; // hackish
144667
144668             this.updated = new Date();
144669
144670             if (!this.id) {
144671                 this.id = Math.uuid(undefined, 16);
144672             }
144673
144674             event.trigger("phonegap-contact-save", [_properties(this), success, function (e) {
144675                 _self.updated = lastUpdated;
144676                 error(e);
144677             }]);
144678         },
144679         remove: function (success, error) {
144680             event.trigger("phonegap-contact-remove", [this.id, success, error]);
144681         },
144682         clone: function () {
144683             var copy = utils.copy(this);
144684             copy.id = null;
144685             return copy;
144686         }
144687     };
144688 };
144689
144690 });
144691 define('ripple/platform/webworks.bb10/1.0.0/spec', function (require, exports, module) {
144692 /*
144693  *  Copyright 2011 Research In Motion Limited.
144694  *
144695  * Licensed under the Apache License, Version 2.0 (the "License");
144696  * you may not use this file except in compliance with the License.
144697  * You may obtain a copy of the License at
144698  *
144699  * http://www.apache.org/licenses/LICENSE-2.0
144700  *
144701  * Unless required by applicable law or agreed to in writing, software
144702  * distributed under the License is distributed on an "AS IS" BASIS,
144703  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
144704  * See the License for the specific language governing permissions and
144705  * limitations under the License.
144706  */
144707 module.exports = {
144708
144709     id: "webworks.bb10",
144710     version: "1.0.0",
144711     name: "BlackBerry 10 WebWorks",
144712
144713     persistencePrefix: "rim-bb10-",
144714
144715     ui: require('ripple/platform/webworks.bb10/1.0.0/spec/ui'),
144716     device: require('ripple/platform/webworks.bb10/1.0.0/spec/device'),
144717     config: require('ripple/platform/webworks.bb10/1.0.0/spec/config'),
144718     events: require('ripple/platform/webworks.bb10/1.0.0/spec/events'),
144719
144720     initialize: function () {
144721         var event = require('ripple/event'),
144722             _console = require('ripple/console'),
144723             emulatorBridge = require('ripple/emulatorBridge');
144724
144725         event.on("TinyHipposLoaded", function () {
144726             var doc = emulatorBridge.document(),
144727                 evt = doc.createEvent("Events");
144728             evt.initEvent("webworksready", true, true);
144729             doc.dispatchEvent(evt);
144730             _console.log("fired webworksready event!");
144731         });
144732     },
144733
144734     objects: {
144735         Coordinates: {
144736             path: "w3c/1.0/Coordinates"
144737         },
144738         Position: {
144739             path: "w3c/1.0/Position"
144740         },
144741         PositionError: {
144742             path: "w3c/1.0/PositionError"
144743         },
144744         navigator: {
144745             path: "webworks.bb10/1.0.0/navigator",
144746             children: {
144747                 geolocation: {
144748                     path: "w3c/1.0/geolocation"
144749                 }
144750             }
144751         },
144752         blackberry: {
144753             children: {
144754                 event: {
144755                     path: "webworks.bb10/1.0.0/event"
144756                 },
144757                 app: {
144758                     path: "webworks.bb10/1.0.0/app",
144759                     feature: "blackberry.app"
144760                 },
144761                 invoke: {
144762                     path: "webworks.bb10/1.0.0/invoke",
144763                     feature: "blackberry.invoke"
144764                 },
144765                 identity: {
144766                     path: "webworks.bb10/1.0.0/identity",
144767                     feature: "blackberry.identity"
144768                 },
144769                 system: {
144770                     path: "webworks.bb10/1.0.0/system"
144771                 },
144772                 connection: {
144773                     path: "webworks.bb10/1.0.0/connection"
144774                 },
144775                 ui: {
144776                     children: {
144777                         dialog: {
144778                             path: "webworks.bb10/1.0.0/dialog",
144779                             feature: "blackberry.ui.dialog"
144780                         }
144781                     }
144782                 },
144783             }
144784         }
144785     }
144786 };
144787
144788 });
144789 define('ripple/platform/webworks.bb10/1.0.0/connection', function (require, exports, module) {
144790 /*
144791  *  Copyright 2011 Research In Motion Limited.
144792  *
144793  * Licensed under the Apache License, Version 2.0 (the "License");
144794  * you may not use this file except in compliance with the License.
144795  * You may obtain a copy of the License at
144796  *
144797  * http://www.apache.org/licenses/LICENSE-2.0
144798  *
144799  * Unless required by applicable law or agreed to in writing, software
144800  * distributed under the License is distributed on an "AS IS" BASIS,
144801  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
144802  * See the License for the specific language governing permissions and
144803  * limitations under the License.
144804  */
144805 var deviceSettings = require('ripple/deviceSettings'),
144806     _self = {};
144807
144808 _self.__defineGetter__("type", function () {
144809     return deviceSettings.retrieve("NetworkStatus.connectionType");
144810 });
144811
144812 _self.__defineGetter__("UNKNOWN", function () { return "unknown"; });
144813 _self.__defineGetter__("ETHERNET", function () { return "ethernet"; });
144814 _self.__defineGetter__("WIFI", function () { return "wifi"; });
144815 _self.__defineGetter__("BLUETOOTH_DUN", function () { return "bluetooth_dun"; });
144816 _self.__defineGetter__("USB", function () { return "usb"; });
144817 _self.__defineGetter__("VPN", function () { return "vpn"; });
144818 _self.__defineGetter__("BB", function () { return "rim-bb"; });
144819 _self.__defineGetter__("CELL_2G", function () { return "2g"; });
144820 _self.__defineGetter__("CELL_3G", function () { return "3g"; });
144821 _self.__defineGetter__("CELL_4G", function () { return "4g"; });
144822 _self.__defineGetter__("NONE", function () { return "none"; });
144823
144824 module.exports = _self;
144825
144826 });
144827 define('ripple/platform/webworks.bb10/1.0.0/event', function (require, exports, module) {
144828 /*
144829  *  Copyright 2011 Research In Motion Limited.
144830  *
144831  * Licensed under the Apache License, Version 2.0 (the "License");
144832  * you may not use this file except in compliance with the License.
144833  * You may obtain a copy of the License at
144834  *
144835  * http://www.apache.org/licenses/LICENSE-2.0
144836  *
144837  * Unless required by applicable law or agreed to in writing, software
144838  * distributed under the License is distributed on an "AS IS" BASIS,
144839  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
144840  * See the License for the specific language governing permissions and
144841  * limitations under the License.
144842  */
144843
144844 var event = require('ripple/event'),
144845     settings = require('ripple/deviceSettings'),
144846     app = require('ripple/app'),
144847     cons = require('ripple/console'),
144848     utils = require('ripple/utils'),
144849     events = {
144850         batterystatus: {
144851             callbacks: [],
144852             feature: 'blackberry.system' 
144853         },
144854         batterylow: {
144855             callbacks: [],
144856             feature: 'blackberry.system'
144857         },
144858         batterycritical: {
144859             callbacks: [],
144860             feature: 'blackberry.system'
144861         },
144862         connectionchange: {
144863             callbacks: [],
144864             feature: 'blackberry.connection'
144865         },
144866         invoked: {
144867             callbacks: [],
144868             feature: 'blackberry.invoked'
144869         },
144870         swipedown: {
144871             callbacks: [],
144872             feature: 'blackberry.app'
144873         },
144874         resume: {
144875             callbacks: [],
144876             feature: 'blackberry.app'
144877         },
144878         pause: {
144879             callbacks: [],
144880             feature: 'blackberry.app'
144881         },
144882         languagechange: {
144883             callbacks: [],
144884             feature: "blackberry.system"
144885         },
144886         regionchange: {
144887             callbacks: [],
144888             feature: "blackberry.system"
144889         }
144890     };
144891
144892 function _apply(eventName, args) {
144893     events[eventName].callbacks.forEach(function (cb) {
144894         cb.apply(null, args);
144895     });
144896 }
144897
144898 event.on('DeviceBatteryStateChanged', function (charging) {
144899     var info = {
144900         isPlugged: charging,
144901         level: parseInt(settings.retrieve('battery.level'), 10)
144902     };
144903
144904     _apply('batterystatus', [info]);
144905 });
144906
144907 event.on('DeviceBatteryLevelChanged', function (level) {
144908     var info = {
144909         isPlugged: settings.retrieve('battery.state'),
144910         level: parseInt(level, 10)
144911     };
144912
144913     _apply('batterystatus', [info]);
144914     
144915     if (level === '14') {
144916         _apply('batterylow', [info]);
144917     }
144918
144919     if (level === '4') {
144920         _apply('batterycritical', [info]);
144921     }
144922 });
144923
144924 event.on('DeviceConnectionChanged', function (info) {
144925     _apply('connectionchange', [info]);
144926 });
144927
144928 event.on("LanguageChanged", function (lang) {
144929     _apply("languagechange", [lang]);
144930 });
144931
144932 event.on("RegionChanged", function (lang) {
144933     _apply("regionchange", [lang]);
144934 });
144935
144936 event.on("AppInvoke", function (invokeInfo) {
144937     var invokeTargets = app.getInfo().invokeTargets;
144938
144939     if (!invokeTargets) {
144940         cons.log("The application cannot be invoked, please add a rim:invoke-target node in config.xml");
144941         return;
144942     }
144943
144944     if (invokeTargets.some(function (target) {
144945         return target.filter.some(function (filter) {
144946             return (
144947                 (!filter.property ||
144948                 (filter.property && filter.property[0]["@attributes"].var === "exts" && filter.property[0]["@attributes"].value.split(",").some(function (value) {
144949                     return invokeInfo.extension.match(value);
144950                 })) ||
144951                 (filter.property && filter.property[0]["@attributes"].var === "uris" && filter.property[0]["@attributes"].value.split(",").some(function (value) {
144952                     return invokeInfo.uri.match(value);
144953                 }))) &&
144954                 filter.action.some(function (action) {
144955                     return invokeInfo.action.match(action["#text"][0].replace("*", ""));
144956                 }) &&
144957                 filter["mime-type"].some(function (type) {
144958                     return invokeInfo.type.match(type["#text"][0].replace("*", ""));
144959                 })
144960             );
144961         });
144962     })) {
144963         _apply('invoked', [invokeInfo]);
144964     }
144965     else {
144966         cons.log("Cannot invoke application, values enter to not match values in rim:invoke-target in config.xml");
144967     }
144968 });
144969
144970 event.on('AppSwipeDown', function () {
144971     _apply('swipedown');
144972 });
144973
144974 event.on('AppResume', function () {
144975     _apply('resume');
144976 });
144977
144978 event.on('AppPause', function () {
144979     _apply('pause');
144980 });
144981
144982 module.exports = {
144983     addEventListener: function (type, func) {
144984         this.removeEventListener(type, func);
144985
144986         if (!app.getInfo().features || app.getInfo().features[events[type].feature]) {
144987             events[type].callbacks.push(func);
144988         }
144989         else {
144990             throw ("Cannot register a hanlder for the " + type + " event. Please add the '" + 
144991                   events[type].feature + "' to your config.xml.");
144992         }
144993     },
144994
144995     removeEventListener: function (type, func) {
144996         var idx = events[type].callbacks.indexOf(func);
144997         if (idx >= 0) {
144998             delete events[type].callbacks[idx];
144999         }
145000     }
145001 };
145002
145003 });
145004 define('ripple/platform/webworks.bb10/1.0.0/navigator', function (require, exports, module) {
145005 /*
145006  *  Copyright 2011 Research In Motion Limited.
145007  *
145008  * Licensed under the Apache License, Version 2.0 (the "License");
145009  * you may not use this file except in compliance with the License.
145010  * You may obtain a copy of the License at
145011  *
145012  * http://www.apache.org/licenses/LICENSE-2.0
145013  *
145014  * Unless required by applicable law or agreed to in writing, software
145015  * distributed under the License is distributed on an "AS IS" BASIS,
145016  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145017  * See the License for the specific language governing permissions and
145018  * limitations under the License.
145019  */
145020 var nav = require('ripple/platform/w3c/1.0/navigator'),
145021     utils = require('ripple/utils'),
145022     deviceSettings = require('ripple/deviceSettings'),
145023     _self = {};
145024
145025 utils.mixin(nav, _self);
145026
145027 _self.__defineGetter__("language", function () {
145028     return deviceSettings.retrieve("system.language");
145029 });
145030
145031 module.exports = _self;
145032
145033 });
145034 define('ripple/platform/webworks.bb10/1.0.0/device', function (require, exports, module) {
145035 /*
145036  *  Copyright 2011 Research In Motion Limited.
145037  *
145038  * Licensed under the Apache License, Version 2.0 (the "License");
145039  * you may not use this file except in compliance with the License.
145040  * You may obtain a copy of the License at
145041  *
145042  * http://www.apache.org/licenses/LICENSE-2.0
145043  *
145044  * Unless required by applicable law or agreed to in writing, software
145045  * distributed under the License is distributed on an "AS IS" BASIS,
145046  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145047  * See the License for the specific language governing permissions and
145048  * limitations under the License.
145049  */
145050 var devices = require('ripple/devices'),
145051     _self = {};
145052
145053 _self.__defineGetter__("softwareVersion", function () {
145054     return devices.getCurrentDevice().osVersion;
145055 });
145056
145057 _self.__defineGetter__("hardwareId", function () {
145058     return devices.getCurrentDevice().hardwareId;
145059 });
145060 module.exports = _self;
145061
145062 });
145063 define('ripple/platform/webworks.bb10/1.0.0/spec/config', function (require, exports, module) {
145064 /*
145065  *  Copyright 2011 Research In Motion Limited.
145066  *
145067  * Licensed under the Apache License, Version 2.0 (the "License");
145068  * you may not use this file except in compliance with the License.
145069  * You may obtain a copy of the License at
145070  *
145071  * http://www.apache.org/licenses/LICENSE-2.0
145072  *
145073  * Unless required by applicable law or agreed to in writing, software
145074  * distributed under the License is distributed on an "AS IS" BASIS,
145075  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145076  * See the License for the specific language governing permissions and
145077  * limitations under the License.
145078  */
145079 var utils = require('ripple/utils');
145080
145081 module.exports = {
145082     fileName: "config.xml",
145083     validateVersion: function (config) {
145084         return true;
145085     },
145086     extractInfo: function (config) {
145087         if (!config) {
145088             return null;
145089         }
145090
145091         var widgetInfo = {},
145092             widgetFeatures = config.widget.children.feature.validationResult,
145093             accessUrls = config.widget.children.access.validationResult,
145094             invokeTargets = config.rawJSON.widget[0]["rim:invoke-target"],
145095             accessFeatures = config.widget.children.access.children.feature.validationResult,
145096             toFeature = function (validationResult) {
145097                 return {
145098                     id: validationResult.attributes.id.value,
145099                     required: !validationResult.attributes.required || validationResult.attributes.required.value,
145100                     URIs: []
145101                 };
145102             };
145103
145104         widgetInfo.id = config.widget.validationResult[0].attributes.id.value;
145105         widgetInfo.name = config.widget.children.name.validationResult[0].value;
145106         widgetInfo.icon = config.widget.children.icon.validationResult[0].attributes.src.value;
145107         widgetInfo.version = config.widget.validationResult[0].attributes.version.value;
145108         widgetInfo.author = config.widget.children.author.validationResult[0].value;
145109         widgetInfo.authorEmail = config.widget.children.author.validationResult[0].attributes.email.value;
145110         widgetInfo.authorURL = config.widget.children.author.validationResult[0].attributes.href.value;
145111         widgetInfo.copyright = config.widget.children.author.validationResult[0].attributes["rim:copyright"].value;
145112         widgetInfo.description = config.widget.children.description.validationResult[0].value;
145113         widgetInfo.invokeTargets = invokeTargets;
145114         if (config.widget.children.license.validationResult[0]) {
145115             widgetInfo.license = config.widget.children.license.validationResult[0].value;
145116             widgetInfo.licenseURL = config.widget.children.license.validationResult[0].attributes.href.value;
145117         }
145118
145119         widgetInfo.features = widgetFeatures.reduce(function (features, validationResult) {
145120             if (validationResult.valid) {
145121                 var feature = toFeature(validationResult);
145122                 feature.URIs.push({
145123                     value: utils.location().href,
145124                     subdomains: true
145125                 });
145126                 features = features || {};
145127                 features[feature.id] = feature;
145128             }
145129             return features;
145130         }, {});
145131
145132         widgetInfo.features = accessUrls.map(function (access) {
145133             return {
145134                 uri: access.attributes.uri.value,
145135                 subdomains: access.attributes.subdomains.value,
145136                 features: accessFeatures ? accessFeatures.filter(function (f) {
145137                     return f.node && f.node.parentNode && f.node.parentNode.attributes.uri.value === access.attributes.uri.value;
145138                 }) : null
145139             };
145140         }).reduce(function (result, access) {
145141             return access.features ? access.features.reduce(function (features, validationResult) {
145142                 var feature = features[validationResult.attributes.id.value] || toFeature(validationResult);
145143                 feature.URIs.push({
145144                     value: access.uri,
145145                     subdomains: access.subdomains
145146                 });
145147                 features[feature.id] = feature;
145148                 return features;
145149             }, result) : result;
145150         }, widgetInfo.features);
145151
145152         return widgetInfo;
145153     },
145154     schema: {
145155         rootElement: "widget",
145156         widget: {
145157             nodeName: "widget",
145158             required: true,
145159             occurrence: 1,
145160             attributes: {
145161                 xmlns: {
145162                     attributeName: "xmlns",
145163                     required: true,
145164                     type: "list",
145165                     listValues: ["http://www.w3.org/ns/widgets"]
145166                 },
145167                 "xmlns:rim": {
145168                     attributeName: "xmlns:rim",
145169                     required: true,
145170                     type: "list",
145171                     listValues: ["http://www.blackberry.com/ns/widgets"]
145172                 },
145173                 "xml:lang": {
145174                     attributeName: "xml:lang",
145175                     required: false,
145176                     type: "iso-language"
145177                 },
145178                 id: {
145179                     attributeName: "id",
145180                     required: false,
145181                     type: "string"
145182                 },
145183                 version: {
145184                     attributeName: "version",
145185                     required: false,
145186                     type: "string"
145187                 },
145188                 "rim:header": {
145189                     attributeName: "rim:header",
145190                     required: false,
145191                     type: "string"
145192                 },
145193                 "rim:backButton": {
145194                     attributeName: "rim:backButton",
145195                     required: false,
145196                     type: "string"
145197                 }
145198             },
145199             children: {
145200                 name: {
145201                     nodeName: "name",
145202                     required: true,
145203                     occurrence: 1,
145204                     attributes: {
145205                         "xml:lang": {
145206                             attributeName: "xml:lang",
145207                             required: false,
145208                             type: "iso-language"
145209                         },
145210                         "its:dir": {
145211                             attributeName: "its:dir",
145212                             required: false,
145213                             type: "list",
145214                             listValues: ["rtl", "ltr", "lro", "rlo"]
145215                         }
145216                     }
145217                 },
145218                 description: {
145219                     nodeName: "description",
145220                     required: false,
145221                     occurrence: 1,
145222                     attributes: {
145223                         "xml:lang": {
145224                             attributeName: "xml:lang",
145225                             required: false,
145226                             type: "iso-language"
145227                         },
145228                         "its:dir": {
145229                             attributeName: "its:dir",
145230                             required: false,
145231                             type: "list",
145232                             listValues: ["rtl", "ltr", "lro", "rlo"]
145233                         }
145234                     }
145235                 },
145236                 icon: {
145237                     nodeName: "icon",
145238                     required: false,
145239                     occurrence: 0,
145240                     attributes: {
145241                         src: {
145242                             attributeName: "src",
145243                             type: "string",
145244                             required: true
145245                         },
145246                         "rim:hover": {
145247                             attributeName: "rim:hover",
145248                             type: "boolean",
145249                             required: false
145250                         }
145251                     }
145252                 },
145253                 author: {
145254                     nodeName: "author",
145255                     required: false,
145256                     occurrence: 1,
145257                     attributes: {
145258                         href: {
145259                             attributeName: "href",
145260                             type: "string",
145261                             required: false
145262                         },
145263                         "rim:copyright": {
145264                             attributeName: "rim:copyright",
145265                             type: "string",
145266                             required: false
145267                         },
145268                         email: {
145269                             attributeName: "email",
145270                             type: "string",
145271                             required: false
145272                         },
145273                         "xml:lang": {
145274                             attributeName: "xml:lang",
145275                             required: false,
145276                             type: "iso-language"
145277                         },
145278                         "its:dir": {
145279                             attributeName: "its:dir",
145280                             required: false,
145281                             type: "list",
145282                             listValues: ["rtl", "ltr", "lro", "rlo"]
145283                         }
145284                     }
145285                 },
145286                 license: {
145287                     nodeName: "license",
145288                     required: false,
145289                     occurrence: 1,
145290                     attributes : {
145291                         href: {
145292                             attributeName: "href",
145293                             type: "string",
145294                             required: false
145295                         },
145296                         "xml:lang": {
145297                             attributeName: "xml:lang",
145298                             required: false,
145299                             type: "iso-language"
145300                         },
145301                         "its:dir": {
145302                             attributeName: "its:dir",
145303                             required: false,
145304                             type: "list",
145305                             listValues: ["rtl", "ltr", "lro", "rlo"]
145306                         }
145307                     }
145308                 },
145309                 "rim:cache": {
145310                     nodeName: "rim:cache",
145311                     required: false,
145312                     occurrence: 1,
145313                     attributes: {
145314                         disableAllCache: {
145315                             attributeName: "disableAllCache",
145316                             required: false,
145317                             type: "boolean"
145318                         },
145319                         aggressiveCacheAge: {
145320                             attributeName: "aggressiveCacheAge",
145321                             required: false,
145322                             type: "number"
145323                         },
145324                         maxCacheSizeTotal: {
145325                             attributeName: "maxCacheSizeTotal",
145326                             required: false,
145327                             type: "number"
145328                         },
145329                         maxCacheSizeItem: {
145330                             attributeName: "maxCacheSizeItem",
145331                             required: false,
145332                             type: "number"
145333                         }
145334                     }
145335                 },
145336                 access: {
145337                     nodeName: "access",
145338                     required: false,
145339                     occurrence: 0,
145340                     attributes: {
145341                         uri: {
145342                             attributeName: "uri",
145343                             required: true,
145344                             type: "string"
145345                         },
145346                         subdomains: {
145347                             attributeName: "subdomains",
145348                             required: false,
145349                             type: "boolean"
145350                         }
145351                     },
145352                     children: {
145353                         feature: {
145354                             nodeName: "feature",
145355                             required: false,
145356                             occurrence: 0,
145357                             attributes: {
145358                                 id: {
145359                                     attributeName: "id",
145360                                     required: true,
145361                                     //TODO: this should be a list
145362                                     type: "string"
145363                                 },
145364                                 required: {
145365                                     attributeName: "required",
145366                                     required: false,
145367                                     type: "boolean"
145368                                 },
145369                                 version: {
145370                                     attributeName: "version",
145371                                     required: false,
145372                                     type: "string"
145373                                 }
145374                             }
145375                         }
145376                     }
145377                 },
145378                 feature: {
145379                     nodeName: "feature",
145380                     required: false,
145381                     occurrence: 0,
145382                     attributes: {
145383                         id: {
145384                             attributeName: "id",
145385                             required: true,
145386                             //TODO: this should be a list
145387                             type: "string"
145388                         },
145389                         required: {
145390                             attributeName: "required",
145391                             required: false,
145392                             type: "boolean"
145393                         },
145394                         version: {
145395                             attributeName: "version",
145396                             required: false,
145397                             type: "string"
145398                         }
145399                     }
145400                 },
145401                 "rim:loadingScreen": {
145402                     nodeName: "rim:loadingScreen",
145403                     required: false,
145404                     occurrence: 1,
145405                     attributes: {
145406                         backgroundColor: {
145407                             attributeName: "backgroundColor",
145408                             required: false,
145409                             type: "string"
145410                         },
145411                         backgroundImage: {
145412                             attributeName: "backgroundImage",
145413                             required: false,
145414                             type: "string"
145415                         },
145416                         foregroundImage: {
145417                             attributeName: "foregroundImage",
145418                             required: false,
145419                             type: "string"
145420                         },
145421                         onRemotePageLoad: {
145422                             attributeName: "onRemotePageLoad",
145423                             required: false,
145424                             type: "boolean"
145425                         },
145426                         onLocalPageLoad: {
145427                             attributeName: "onLocalPageLoad",
145428                             required : false,
145429                             type: "boolean"
145430                         },
145431                         onFirstLaunch: {
145432                             attributeName: "onFirstLaunch",
145433                             required: false,
145434                             type: "boolean"
145435                         }
145436                     },
145437                     children: {
145438                         "rim:transitionEffect": {
145439                             nodeName: "rim:transitionEffect",
145440                             required: false,
145441                             occurrence: 1,
145442                             attributes: {
145443                                 "type": {
145444                                     attributeName: "type",
145445                                     required: true,
145446                                     type: "list",
145447                                     listValues: ["slidePush", "slideOver", "fadeIn", "fadeOut", "wipeIn", "wipeOut", "zoomIn", "zoomOut"]
145448                                 },
145449                                 duration: {
145450                                     attributeName: "duration",
145451                                     required: false,
145452                                     type: "number"
145453                                 },
145454                                 direction: {
145455                                     attributeName: "direction",
145456                                     required: false,
145457                                     type: "list",
145458                                     listValues: ["left", "right", "up", "down"]
145459                                 }
145460                             }
145461                         }
145462                     }
145463                 },
145464                 "rim:invoke-target": {
145465                     nodeName: "rim:invoke-target",
145466                     required: false,
145467                     occurrence: 0,
145468                     attributes: {
145469                         id: {
145470                             attributeName: "id",
145471                             required: true,
145472                             type: "string"
145473                         }
145474                     },
145475                     children: {
145476                         "type": {
145477                             nodeName: "type",
145478                             required: true,
145479                             occurrence: 1
145480                         },
145481                         "require-source-permissions": {
145482                             nodeName: "require-source-permissions",
145483                             required: false,
145484                             occurence: 0
145485                         },
145486                         "filter": {
145487                             nodeName: "filter",
145488                             required: false,
145489                             occurence: 0,
145490                             children: {
145491                                 "action": {
145492                                     nodeName: "action",
145493                                     required: true,
145494                                     occurence: 0
145495                                 },
145496                                 "mime-type": {
145497                                     nodeName: "mime-type",
145498                                     required: true,
145499                                     occurence: 0
145500                                 },
145501                                 "property": {
145502                                     nodeName: "property",
145503                                     required: false,
145504                                     occurenc: 0,
145505                                     attributes: {
145506                                         "var": {
145507                                             attributeName: "var",
145508                                             required: false,
145509                                             type: "string"
145510                                         },
145511                                         "value": {
145512                                             attributeName: "value",
145513                                             required: false,
145514                                             type: "string"
145515                                         }
145516                                     }
145517                                 }
145518                             },
145519                         }
145520                     }
145521                 },
145522                 "rim:connection": {
145523                     nodeName: "rim:connection",
145524                     required: false,
145525                     occurrence: 1,
145526                     attributes: {
145527                         timeout: {
145528                             attributeName: "timeout",
145529                             required: false,
145530                             type: "number"
145531                         }
145532                     },
145533                     children: {
145534                         id: {
145535                             nodeName: "id",
145536                             required: false,
145537                             occurrence: 0
145538                         }
145539                     }
145540                 },
145541                 "rim:navigation": {
145542                     nodeName: "rim:navigation",
145543                     required: false,
145544                     occurrence: 1,
145545                     attributes: {
145546                         mode: {
145547                             attributeName: "mode",
145548                             required: false,
145549                             type: "list",
145550                             listValues: ["focus"]
145551                         }
145552                     }
145553                 },
145554                 "content": {
145555                     nodeName: "content",
145556                     required: true,
145557                     occurrence: 1,
145558                     attributes: {
145559                         src: {
145560                             attributeName: "src",
145561                             required: true,
145562                             type: "string"
145563                         },
145564                         type: {
145565                             attributeName: "type",
145566                             required: false,
145567                             type: "string"
145568                         },
145569                         charset: {
145570                             attributeName: "charset",
145571                             required: false,
145572                             type: "string"
145573                         }
145574                     }
145575                 }
145576             }
145577         }
145578     }
145579 };
145580
145581 });
145582 define('ripple/platform/webworks.bb10/1.0.0/spec/device', function (require, exports, module) {
145583 /*
145584  *  Copyright 2011 Research In Motion Limited.
145585  *
145586  * Licensed under the Apache License, Version 2.0 (the "License");
145587  * you may not use this file except in compliance with the License.
145588  * You may obtain a copy of the License at
145589  *
145590  * http://www.apache.org/licenses/LICENSE-2.0
145591  *
145592  * Unless required by applicable law or agreed to in writing, software
145593  * distributed under the License is distributed on an "AS IS" BASIS,
145594  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145595  * See the License for the specific language governing permissions and
145596  * limitations under the License.
145597  */
145598 var event = require('ripple/event');
145599
145600 module.exports = {
145601     "NetworkStatus": {
145602         "connectionType": {
145603             "name": "Connection Type",
145604             "control": {
145605                 "type": "select",
145606                 "value": "ethernet"
145607             },
145608             "options": {
145609                 "unknown": "UNKNOWN",
145610                 "ethernet": "ETHERNET",
145611                 "wifi": "WIFI",
145612                 "bluetooth_dun": "BLUETOOTH_DUN",
145613                 "usb": "USB",
145614                 "vpn": "VPN",
145615                 "rim-bb": "BB",
145616                 "2g": "CELL_2G",
145617                 "3g": "CELL_3G",
145618                 "4g": "CELL_4G",
145619                 "none": "NONE"
145620             },
145621             "callback": function (setting, oldSetting) {
145622                 event.trigger("DeviceConnectionChanged", [{oldType: oldSetting, newType: setting}]);
145623             }
145624         }
145625     },
145626     "identity": {
145627         "uuid": {
145628             "name": "uuid",
145629             "control": {
145630                 "type": "text",
145631                 "value": "43A8C489"
145632             }
145633         }
145634     },
145635     "system": {
145636         "language": {
145637             "name": "language",
145638             "control": {
145639                 "type": "text",
145640                 "value": "en_US"
145641             },
145642             "callback": function (setting) {
145643                 event.trigger("LanguageChanged", [setting]);
145644             }
145645         },
145646         "region": {
145647             "name": "region",
145648             "control": {
145649                 "type": "text",
145650                 "value": "en_CA"
145651             },
145652             "callback": function (setting) {
145653                 event.trigger("RegionChanged", [setting]);
145654             }
145655         }
145656     },
145657     "battery": {
145658         "state": {
145659             "name": "Handset is Charging",
145660             "control": {
145661                 "type": "checkbox",
145662                 "value": true
145663             },
145664             "callback": function (setting) {
145665                 event.trigger("DeviceBatteryStateChanged", [setting]);
145666             }
145667         },
145668         "level":  {
145669             "name": "Charge Level (% remaining)",
145670             "control": {
145671                 "type": "select",
145672                 "value": 100
145673             },
145674             "options": (function () {
145675                 var i,
145676                     optionList = {};
145677
145678                 for (i = 0; i <= 100; i++) {
145679                     optionList[i] = i;
145680                 }
145681
145682                 return optionList;
145683             }()),
145684             "callback": function (setting) {
145685                 event.trigger("DeviceBatteryLevelChanged", [setting]);
145686             }
145687         }
145688     },
145689     "Perimeters": {
145690         "perimeter": {
145691             "name": "Perimeter",
145692             "control": {
145693                 "type": "select",
145694                 "value": "Consumer"
145695             },
145696             "options": {
145697                 "Enterprise": "Enterprise",
145698                 "Consumer": "Consumer"
145699             }
145700         }
145701     }
145702 };
145703
145704 });
145705 define('ripple/platform/webworks.bb10/1.0.0/spec/events', function (require, exports, module) {
145706 /*
145707  *  Copyright 2011 Research In Motion Limited.
145708  *
145709  * Licensed under the Apache License, Version 2.0 (the "License");
145710  * you may not use this file except in compliance with the License.
145711  * You may obtain a copy of the License at
145712  *
145713  * http://www.apache.org/licenses/LICENSE-2.0
145714  *
145715  * Unless required by applicable law or agreed to in writing, software
145716  * distributed under the License is distributed on an "AS IS" BASIS,
145717  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145718  * See the License for the specific language governing permissions and
145719  * limitations under the License.
145720  */
145721 var _self,
145722     event = require('ripple/event');
145723
145724 module.exports = {
145725     "blackberry.event.swipedown": {
145726         callback: function () {
145727             event.trigger("AppSwipeDown");
145728         }
145729     },
145730     "blackberry.event.resume": {
145731         callback: function () {
145732             event.trigger("AppResume");
145733         }
145734     },
145735     "blackberry.event.pause": {
145736         callback: function () {
145737             event.trigger("AppPause");
145738         }
145739     }
145740 };
145741
145742 });
145743 define('ripple/platform/webworks.bb10/1.0.0/spec/ui', function (require, exports, module) {
145744 /*
145745  *  Copyright 2011 Research In Motion Limited.
145746  *
145747  * Licensed under the Apache License, Version 2.0 (the "License");
145748  * you may not use this file except in compliance with the License.
145749  * You may obtain a copy of the License at
145750  *
145751  * http://www.apache.org/licenses/LICENSE-2.0
145752  *
145753  * Unless required by applicable law or agreed to in writing, software
145754  * distributed under the License is distributed on an "AS IS" BASIS,
145755  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145756  * See the License for the specific language governing permissions and
145757  * limitations under the License.
145758  */
145759 module.exports = {
145760     plugins: [
145761         "accelerometer",
145762         "deviceSettings",
145763         "geoView",
145764         "platformEvents",
145765         "widgetConfig",
145766         "build",
145767         "invoke"
145768     ]
145769 };
145770
145771 });
145772 define('ripple/platform/webworks.bb10/1.0.0/identity', function (require, exports, module) {
145773 /*
145774  *  Copyright 2011 Research In Motion Limited.
145775  *
145776  * Licensed under the Apache License, Version 2.0 (the "License");
145777  * you may not use this file except in compliance with the License.
145778  * You may obtain a copy of the License at
145779  *
145780  * http://www.apache.org/licenses/LICENSE-2.0
145781  *
145782  * Unless required by applicable law or agreed to in writing, software
145783  * distributed under the License is distributed on an "AS IS" BASIS,
145784  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145785  * See the License for the specific language governing permissions and
145786  * limitations under the License.
145787  */
145788 var deviceSettings = require('ripple/deviceSettings'),
145789     _self = {};
145790
145791 _self.__defineGetter__("uuid", function () {
145792     return deviceSettings.retrieve("identity.uuid");
145793 });
145794
145795 module.exports = _self;
145796
145797 });
145798 define('ripple/platform/webworks.bb10/1.0.0/system', function (require, exports, module) {
145799 /*\r
145800  *  Copyright 2011 Research In Motion Limited.\r
145801  *\r
145802  * Licensed under the Apache License, Version 2.0 (the "License");\r
145803  * you may not use this file except in compliance with the License.\r
145804  * You may obtain a copy of the License at\r
145805  *\r
145806  * http://www.apache.org/licenses/LICENSE-2.0\r
145807  *\r
145808  * Unless required by applicable law or agreed to in writing, software\r
145809  * distributed under the License is distributed on an "AS IS" BASIS,\r
145810  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
145811  * See the License for the specific language governing permissions and\r
145812  * limitations under the License.\r
145813  */\r
145814 var deviceSettings = require('ripple/deviceSettings'),\r
145815     devices = require('ripple/devices'),\r
145816     app = require('ripple/app'),\r
145817     utils = require('ripple/utils'),\r
145818     _self;\r
145819 \r
145820 function _is(feature) {\r
145821     return {\r
145822         allowedFor: function (location) {\r
145823             return feature && feature.URIs.some(function (uri) {\r
145824                 return uri.value === location ||\r
145825                       (location.indexOf(uri.value) >= 0 && uri.subdomains);\r
145826             });\r
145827         }\r
145828     };\r
145829 }\r
145830 \r
145831 _self = {\r
145832     hasCapability: function (capability) {\r
145833         var capabilities = devices.getCurrentDevice().capabilities;\r
145834         return capabilities ? capabilities.some(function (type) {\r
145835                 return type === capability;\r
145836             }) : false;\r
145837     },\r
145838     hasPermission: function (desiredModule) {\r
145839         var info = app.getInfo(),\r
145840             feature = info.features ? info.features[desiredModule] : null;\r
145841 \r
145842         return feature === null || _is(feature).allowedFor(utils.location().href) ? _self.ALLOW : _self.DENY;\r
145843     }\r
145844 };\r
145845 \r
145846 _self.__defineGetter__("ALLOW", function () {\r
145847     return 0;\r
145848 });\r
145849 \r
145850 _self.__defineGetter__("DENY", function () {\r
145851     return 1;\r
145852 });\r
145853 \r
145854 _self.__defineGetter__("softwareVersion", function () {\r
145855     return devices.getCurrentDevice().osVersion;\r
145856 });\r
145857 \r
145858 _self.__defineGetter__("hardwareId", function () {\r
145859     return devices.getCurrentDevice().hardwareId;\r
145860 });\r
145861 \r
145862 _self.__defineGetter__("language", function () {\r
145863     return deviceSettings.retrieve("system.language");\r
145864 });\r
145865 \r
145866 _self.__defineGetter__("region", function () {\r
145867     return deviceSettings.retrieve("system.region");\r
145868 });\r
145869 \r
145870 module.exports = _self;\r
145871
145872 });
145873 define('ripple/platform/webworks.bb10/1.0.0/app', function (require, exports, module) {
145874 /*
145875  *  Copyright 2011 Research In Motion Limited.
145876  *
145877  * Licensed under the Apache License, Version 2.0 (the "License");
145878  * you may not use this file except in compliance with the License.
145879  * You may obtain a copy of the License at
145880  *
145881  * http://www.apache.org/licenses/LICENSE-2.0
145882  *
145883  * Unless required by applicable law or agreed to in writing, software
145884  * distributed under the License is distributed on an "AS IS" BASIS,
145885  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145886  * See the License for the specific language governing permissions and
145887  * limitations under the License.
145888  */
145889 var transport = require('ripple/platform/webworks.core/2.0.0/client/transport'),
145890     app = require('ripple/app'),
145891     notifications = require('ripple/notifications'),
145892     _uri = "blackberry/app/",
145893     _self;
145894
145895 _self = {
145896     exit: function () {
145897         notifications.openNotification("normal", "blackberry.app.exit() was called, in the real world your app will exit, here... you get this notification");
145898     }
145899 };
145900
145901 _self.__defineGetter__("author", function () {
145902     return app.getInfo().author;
145903 });
145904
145905 _self.__defineGetter__("authorEmail", function () {
145906     return app.getInfo().authorEmail;
145907 });
145908
145909 _self.__defineGetter__("authorURL", function () {
145910     return app.getInfo().authorURL;
145911 });
145912
145913 _self.__defineGetter__("copyright", function () {
145914     return app.getInfo().copyright;
145915 });
145916
145917 _self.__defineGetter__("description", function () {
145918     return app.getInfo().description;
145919 });
145920
145921 _self.__defineGetter__("id", function () {
145922     return app.getInfo().id;
145923 });
145924
145925 _self.__defineGetter__("license", function () {
145926     return app.getInfo().license;
145927 });
145928
145929 _self.__defineGetter__("licenseURL", function () {
145930     return app.getInfo().licenseURL;
145931 });
145932
145933 _self.__defineGetter__("name", function () {
145934     return app.getInfo().name;
145935 });
145936
145937 _self.__defineGetter__("version", function () {
145938     return app.getInfo().version;
145939 });
145940
145941 module.exports = _self;
145942
145943 });
145944 define('ripple/platform/webworks.bb10/1.0.0/invoke', function (require, exports, module) {
145945 /*\r
145946  *  Copyright 2011 Research In Motion Limited.\r
145947  *\r
145948  * Licensed under the Apache License, Version 2.0 (the "License");\r
145949  * you may not use this file except in compliance with the License.\r
145950  * You may obtain a copy of the License at\r
145951  *\r
145952  * http://www.apache.org/licenses/LICENSE-2.0\r
145953  *\r
145954  * Unless required by applicable law or agreed to in writing, software\r
145955  * distributed under the License is distributed on an "AS IS" BASIS,\r
145956  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
145957  * See the License for the specific language governing permissions and\r
145958  * limitations under the License.\r
145959  */\r
145960 \r
145961 var notifications = require('ripple/notifications'),\r
145962     utils = require('ripple/utils'),\r
145963     _self = {};\r
145964 \r
145965 function _fail(onError) {\r
145966     if (onError && typeof onError === "function") {\r
145967         onError("invalid invocation request");\r
145968     }\r
145969 }\r
145970 \r
145971 _self.invoke = function (request, onSuccess, onError) {\r
145972     var argsString = "";\r
145973 \r
145974     if (!request) { // is this check even needed?\r
145975         _fail(onError);\r
145976         return;\r
145977     } else {\r
145978         if (request) {\r
145979             utils.forEach(request, function (arg, key) {\r
145980                 argsString += key + " = " + arg + "</br>";\r
145981             });\r
145982 \r
145983             notifications.openNotification("normal", "Requested to invoke external application with the following arguments:</br> " +\r
145984                                            argsString + "</br>");\r
145985         }\r
145986         else {\r
145987             _fail(onError);\r
145988             return;\r
145989         }\r
145990     }\r
145991 };\r
145992 \r
145993 _self.__defineGetter__("ACTION_OPEN", function () {\r
145994     return "bb.action.OPEN";\r
145995 });\r
145996 _self.__defineGetter__("ACTION_VIEW", function () { \r
145997     return "bb.action.VIEW"; \r
145998 });\r
145999 _self.__defineGetter__("ACTION_SHARE", function () {\r
146000     return "bb.action.SHARE";\r
146001 });\r
146002 \r
146003 module.exports = _self;\r
146004
146005 });
146006 define('ripple/platform/webworks.bb10/1.0.0/dialog', function (require, exports, module) {
146007 /*
146008  *  Copyright 2011 Research In Motion Limited.
146009  *
146010  * Licensed under the Apache License, Version 2.0 (the "License");
146011  * you may not use this file except in compliance with the License.
146012  * You may obtain a copy of the License at
146013  *
146014  * http://www.apache.org/licenses/LICENSE-2.0
146015  *
146016  * Unless required by applicable law or agreed to in writing, software
146017  * distributed under the License is distributed on an "AS IS" BASIS,
146018  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
146019  * See the License for the specific language governing permissions and
146020  * limitations under the License.
146021  */
146022 var _self,
146023     ui = require('ripple/ui'),
146024     event = require('ripple/event'),
146025     isDialogVisible = false,
146026     visibleDialogArgs,
146027     utils = require('ripple/utils');
146028
146029 function getButtonsForDialogType(dialogType) {
146030     switch (dialogType) {
146031     case _self.D_OK:
146032         return ["Ok"];
146033     case _self.D_SAVE:
146034         return ["Save", "Discard"];
146035     case _self.D_DELETE:
146036         return ["Delete", "Cancel"];
146037     case _self.D_YES_NO:
146038         return ["Yes", "No"];
146039     case _self.D_OK_CANCEL:
146040         return ["Ok", "Cancel"];
146041     default:
146042         throw new Error("Invalid dialog type: " + dialogType);
146043     }
146044 }
146045
146046 event.on("LayoutChanged", function () {
146047     if (isDialogVisible) {
146048         closeDialog();
146049         //Used to resize dialog on orientation change
146050         _self.ask(visibleDialogArgs);
146051     }
146052 });
146053
146054 function closeDialog() {
146055     var buttonsDiv = document.getElementById("dialog-buttons"),
146056         messageDiv = document.getElementById("dialog-message");
146057
146058     ui.hideOverlay("dialog-window", function (dialog) {
146059         buttonsDiv.innerHTML = "";
146060         messageDiv.innerHTML = "";
146061         isDialogVisible = false;
146062     });
146063 }
146064
146065 function ask(args, callback) {
146066     if (!args) {
146067         throw ("No arguments provided");
146068     } else if (!args.buttons || !args.message) {
146069         throw ("Invalid arguments");
146070     }
146071     visibleDialogArgs = args;
146072
146073     ui.showOverlay("dialog-window", function (dialog) {
146074         var container = document.getElementById("viewport-container"),
146075             height = window.getComputedStyle(container, null).getPropertyValue("height"),
146076             width = window.getComputedStyle(container, null).getPropertyValue("width"),
146077             sizeDiv = document.getElementById("dialog-wrapper"),
146078             positionDiv = document.getElementById("dialog-window"),
146079             titleDiv = document.getElementById("dialog-title"),
146080             buttonsDiv = document.getElementById("dialog-buttons"),
146081             messageDiv = document.getElementById("dialog-message"),
146082             position, size;
146083
146084         if (!messageDiv || !buttonsDiv) {
146085             return;
146086         }
146087
146088         dialog.setAttribute("style", "display:-webkit-box;height:" + height + "; width:" + width + ";");
146089
146090         position = "overlay-dialog";
146091         size = "overlay-dialog-wrapper";
146092
146093         if (args.settings && args.settings.position) {
146094             position += " overlay-dialog-" + args.settings.position;
146095         }
146096
146097         if (args.settings && args.settings.size) {
146098             size += " overlay-dialog-wrapper-" + args.settings.size;
146099         }
146100
146101         positionDiv.setAttribute("class", position);
146102         sizeDiv.setAttribute("class", size);
146103
146104         titleDiv.innerHTML = args.settings && args.settings.title ? args.settings.title : "";
146105         messageDiv.innerHTML = args.message;
146106         isDialogVisible = true;
146107
146108         args.buttons.forEach(function (button) {
146109             var buttonElement = utils.createElement("input", {
146110                 "type": "button",
146111                 "value": button
146112             });
146113             buttonElement.addEventListener("click", function () {
146114                 var buttonIndex = args.buttons.indexOf(button);
146115                 closeDialog();
146116                 callback(buttonIndex);
146117             });
146118             buttonsDiv.appendChild(buttonElement);
146119         });
146120     }, true);
146121 }
146122
146123 _self = {
146124     customAskAsync: function (message, choices, callback, settings) {
146125         ask({
146126             message: message,
146127             buttons: choices,
146128             settings: settings
146129         }, function (response) {
146130             if (callback) {
146131                 callback(response);
146132             }
146133         });
146134     },
146135
146136     standardAskAsync: function (message, type, callback, settings) {
146137         var choices = getButtonsForDialogType(type);
146138         ask({ 
146139             message: message, 
146140             buttons: choices, 
146141             settings: settings
146142         }, function (response) {
146143             if (callback) {
146144                 callback(response);
146145             }
146146         });
146147     }
146148 };
146149
146150 _self.__defineGetter__("D_OK", function () {
146151     return 0;
146152 });
146153
146154 _self.__defineGetter__("D_SAVE", function () {
146155     return 1;
146156 });
146157
146158 _self.__defineGetter__("D_DELETE", function () {
146159     return 2;
146160 });
146161
146162 _self.__defineGetter__("D_YES_NO", function () {
146163     return 3;
146164 });
146165
146166 _self.__defineGetter__("D_OK_CANCEL", function () {
146167     return 4;
146168 });
146169
146170 _self.__defineGetter__("BOTTOM", function () {
146171     return "bottomCenter";
146172 });
146173
146174 _self.__defineGetter__("CENTER", function () {
146175     return "middleCenter";
146176 });
146177
146178 _self.__defineGetter__("TOP", function () {
146179     return "topCenter";
146180 });
146181
146182 _self.__defineGetter__("SIZE_FULL", function () {
146183     return "full";
146184 });
146185
146186 _self.__defineGetter__("SIZE_LARGE", function () {
146187     return "large";
146188 });
146189
146190 _self.__defineGetter__("SIZE_MEDIUM", function () {
146191     return "medium";
146192 });
146193
146194 _self.__defineGetter__("SIZE_SMALL", function () {
146195     return "small";
146196 });
146197
146198 _self.__defineGetter__("SIZE_TALL", function () {
146199     return "tall";
146200 });
146201
146202 module.exports = _self;
146203
146204 });
146205 define('ripple/platform/webworks.core/2.0.0/fsCache', function (require, exports, module) {
146206 /*
146207  * Copyright 2011 Research In Motion Limited.
146208  *
146209  * Licensed under the Apache License, Version 2.0 (the "License");
146210  * you may not use this file except in compliance with the License.
146211  * You may obtain a copy of the License at
146212  *
146213  *     http://www.apache.org/licenses/LICENSE-2.0
146214  *
146215  * Unless required by applicable law or agreed to in writing, software
146216  * distributed under the License is distributed on an "AS IS" BASIS,
146217  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
146218  * See the License for the specific language governing permissions and
146219  * limitations under the License.
146220  */
146221 var fs = require('ripple/dbfs'),
146222     utils = require('ripple/utils'),
146223     _console = require('ripple/console'),
146224     constants = require('ripple/constants'),
146225     event = require('ripple/event'),
146226     bbUtils = require('ripple/platform/webworks.core/2.0.0/client/utils'),
146227     FileProperties = require('ripple/platform/webworks.core/2.0.0/client/FileProperties'),
146228     _cache = {},
146229     _self;
146230
146231 function _createPath(path) {
146232     var parts = path.replace(/^\//, '').replace(/\/$/, '').split("/"),
146233         workflow = jWorkflow.order();
146234
146235     parts.forEach(function (part, index) {
146236         var dir = "/" + utils.copy(parts).splice(0, index + 1).join("/");
146237
146238         workflow.andThen(function (prev, baton) {
146239             baton.take();
146240             fs.mkdir(dir, baton.pass, baton.pass);
146241         });
146242     });
146243
146244     workflow.start(_self.refresh);
146245 }
146246 event.on("FileSystemInitialized", function () {
146247     _createPath("/SDCard");
146248     _createPath("/store/home/user/music");
146249     _createPath("/store/home/user/pictures");
146250     _createPath("/store/home/user/videos");
146251     _createPath("/store/home/user/videos");
146252     _createPath("/accounts/1000/appdata/emulatedapp/data");
146253     _createPath("/accounts/1000/appdata/emulatedapp/shared/bookmarks");
146254     _createPath("/accounts/1000/appdata/emulatedapp/shared/books");
146255     _createPath("/accounts/1000/appdata/emulatedapp/shared/camera");
146256     _createPath("/accounts/1000/appdata/emulatedapp/shared/documents");
146257     _createPath("/accounts/1000/appdata/emulatedapp/shared/downloads");
146258     _createPath("/accounts/1000/appdata/emulatedapp/shared/misc");
146259     _createPath("/accounts/1000/appdata/emulatedapp/shared/music");
146260     _createPath("/accounts/1000/appdata/emulatedapp/shared/photos");
146261     _createPath("/accounts/1000/appdata/emulatedapp/shared/print");
146262     _createPath("/accounts/1000/appdata/emulatedapp/shared/videos");
146263     _createPath("/accounts/1000/appdata/emulatedapp/shared/voice");
146264 });
146265
146266 function _fsError(e) {
146267     _self.refresh();
146268     if (e.code !== 1) { // suppress file not found error
146269         _console.error("FileSystem error (code " + e.code + ")");
146270     }
146271 }
146272
146273 function _walk(path, parent) {
146274     fs.ls(path, function (entries) {
146275         parent.children = parent.children || {};
146276
146277         entries.forEach(function (entry) {
146278             parent.children[entry.name] = entry;
146279             parent.children[entry.name].properties = {};
146280
146281             if (entry.isDirectory) {
146282                 _walk(entry.fullPath, entry);
146283             } else {
146284                 entry.file(function (file) {
146285                     utils.mixin(file, parent.children[entry.name].properties);
146286                 });
146287                 fs.read(entry.fullPath, function (data) {
146288                     parent.children[entry.name].data = data;
146289                 }, function (e) {
146290                     console.error(e);
146291                 });
146292             }
146293         });
146294     }, function (e) {
146295         console.error(e);
146296     });
146297 }
146298
146299 function _get(path) {
146300     return path.replace(/^\//, '').split("/").reduce(function (obj, token) {
146301         return token === "" ? obj : (obj && obj.children ? obj.children[token] || null : null);
146302     }, _cache);
146303 }
146304
146305 function _getInfo(path) {
146306     var parent = ("/" + path.replace(/^\//, '').replace(/\/$/, '')).split("/"),
146307         name = parent.splice(parent.length - 1, 1).join(""),
146308         ext = name.split(".");
146309
146310     return {
146311         name: name,
146312         extension: ext.length > 1 ? ext[ext.length - 1] : "",
146313         hidden: (name.length > 0 && name[0] === ".") || false,
146314         parent: parent.join("/") || "/"
146315     };
146316 }
146317
146318 function _set(path, obj) {
146319     var parent = _cache,
146320         tokens = path.replace(/^\//, '').replace(/\/$/, '').split("/"),
146321         child = tokens.splice(tokens.length - 1, 1).join("");
146322
146323     tokens.forEach(function (token) {
146324         parent = parent.children[token];
146325     });
146326
146327     parent.children = parent.children || {};
146328     obj.properties = obj.properties || {};
146329     parent.children[child] = obj;
146330 }
146331
146332 function _delete(path) {
146333     var parent = _cache,
146334         tokens = path.replace(/^\//, '').replace(/\/$/, '').split("/"),
146335         child = tokens.splice(tokens.length - 1, 1).join("");
146336
146337     tokens.forEach(function (token) {
146338         parent = parent.children[token];
146339     });
146340
146341     delete parent.children[child];
146342 }
146343
146344 // TODO: handle exceptions so that any respective fs command can error out
146345 // TODO: dateCreated is always dateModified
146346
146347 _self = {
146348     refresh: function () {
146349         _cache = {};
146350         _walk("/", _cache);
146351     },
146352     file: {
146353         exists: function (path) {
146354             var entry = _get(path);
146355             return !!(entry && !entry.isDirectory);
146356         },
146357
146358         deleteFile: function (path) {
146359             _delete(path);
146360             fs.rm(path, function () {}, _fsError);
146361         },
146362
146363         copy: function (from, to) {
146364             var fromEntry = _get(from);
146365
146366             _set(to, {
146367                 fullPath: to,
146368                 properties: fromEntry.properties,
146369                 data: fromEntry.data
146370             });
146371
146372             fs.cp(from, to, function (entry) {
146373                 entry.file(function (file) {
146374                     entry.properties = entry.properties || {};
146375                     utils.mixin(file, entry.properties);
146376                     _set(to, entry);
146377                 });
146378             }, _fsError);
146379         },
146380
146381         getFileProperties: function (path) {
146382             var entry = _get(path),
146383                 info = _getInfo(path);
146384
146385             fs.stat(path, function () {}, _fsError);
146386
146387             return new FileProperties({
146388                 //HACK: not sure where these should come from so check both for now.
146389                 dateCreated: entry.properties.lastModifiedDate || entry.lastModifiedDate,
146390                 dateModified: entry.properties.lastModifiedDate || entry.lastModifiedDate,
146391                 directory: info.parent,
146392                 fileExtension: info.extension,
146393                 isHidden: info.hidden,
146394                 isReadonly: false,
146395                 mimeType: entry.properties.type,
146396                 size: entry.properties.size
146397             });
146398         },
146399
146400         rename: function (path, newName) {
146401             _self.dir.rename(path, newName);
146402         },
146403
146404         readFile: function (path, success, async) {
146405             var entry = _get(path);
146406
146407             async = async === false ? async : true;
146408
146409             if (!async) {
146410                 success(bbUtils.stringToBlob(entry.data));
146411             }
146412             else {
146413                 fs.read(path, function (data) {
146414                     var blob = bbUtils.stringToBlob(data);
146415                     if (async) {
146416                         success(blob);
146417                     }
146418                     entry.data = data;
146419                     _set(path, entry);
146420                 }, _fsError);
146421             }
146422         },
146423
146424         saveFile: function (path, blob) {
146425             var data = bbUtils.blobToString(blob);
146426
146427             _set(path, {
146428                 lastModifiedDate: new Date(),
146429                 fullPath: path,
146430                 isDirectory: false,
146431                 properties: {
146432                     type: "",
146433                     size: blob.size
146434                 },
146435                 data: data
146436             });
146437
146438             fs.write(path, data, function (entry) {
146439                 entry.data = data;
146440                 entry.file(function (file) {
146441                     entry.properties = entry.properties || {};
146442                     utils.mixin(file, entry.properties);
146443                     _set(path, entry);
146444                 });
146445             }, _fsError);
146446         }
146447     },
146448     dir: {
146449         createNewDir: function (path) {
146450             var entry = _get(path),
146451                 info = _getInfo(path);
146452
146453             if (!entry) {
146454                 _set(path, {
146455                     name: info.name,
146456                     isDirectory: true,
146457                     fullPath: path
146458                 });
146459             }
146460
146461             fs.mkdir(path, function (entry) {
146462                 _set(path, entry);
146463             }, _fsError);
146464         },
146465
146466         deleteDirectory: function (path, recursive) {
146467             _delete(path);
146468             if (recursive) {
146469                 fs.rm(path, function () {}, _fsError, {recursive: recursive});
146470             } else {
146471                 fs.rmdir(path, function () {}, _fsError);
146472             }
146473         },
146474
146475         exists: function (path) {
146476             var entry = _get(path);
146477             return !!(entry && entry.isDirectory);
146478         },
146479
146480         getFreeSpaceForRoot: function (path) {
146481             function _du(obj, size) {
146482                 utils.forEach(obj, function (child, key) {
146483                     if (child.isDirectory && child.children) {
146484                         size += _du(child.children, size);
146485                     } else if (child.properties && child.properties.size) {
146486                         size += child.properties.size;
146487                     }
146488                 });
146489                 return size;
146490             }
146491
146492             return constants.FS_SIZE - _du(_cache.children, 0);
146493         },
146494
146495         getParentDirectory: function (path) {
146496             path = "/" + path.replace(/^\//, '').replace(/\/$/, '');
146497
146498             var entry = _get(path),
146499                 array = path.split("/");
146500
146501             return entry ? array.splice(0, array.length - 1).join("/") || "/" : null;
146502         },
146503
146504         listDirectories: function (path) {
146505             var dir = _get(path),
146506                 directories = [];
146507
146508             utils.forEach(dir.children, function (item) {
146509                 if (item.isDirectory) {
146510                     directories.push(item.name);
146511                 }
146512             });
146513
146514             fs.ls(path, function () {}, _fsError);
146515
146516             return directories;
146517         },
146518
146519         listFiles: function (path) {
146520             var dir = _get(path),
146521                 files = [];
146522
146523             if (dir) {
146524                 utils.forEach(dir.children, function (item) {
146525                     if (!item.isDirectory) {
146526                         files.push(item.name);
146527                     }
146528                 });
146529             }
146530
146531             fs.ls(path, function () {}, _fsError);
146532
146533             return files;
146534         },
146535
146536         rename: function (path, newName) {
146537             var info = _getInfo(path),
146538                 parent = info.parent,
146539                 oldName = info.name,
146540                 from = (parent === "/" ? "" : parent) + "/" + oldName,
146541                 to =  (parent === "/" ? "" : parent) + "/" + newName;
146542
146543             _delete(from);
146544             _set(to, {
146545                 name: info.name,
146546                 fullPath: path
146547             });
146548
146549             fs.mv(from, to, function (entry) {
146550                 _set(to, entry);
146551             }, _fsError);
146552         },
146553
146554         getRootDirs: function () {
146555             return _self.dir.listDirectories("/");
146556         }
146557     }
146558 };
146559
146560 module.exports = _self;
146561
146562 });
146563 define('ripple/platform/webworks.core/2.0.0/XMLHttpRequest', function (require, exports, module) {
146564 /*
146565  *  Copyright 2011 Research In Motion Limited.
146566  *
146567  * Licensed under the Apache License, Version 2.0 (the "License");
146568  * you may not use this file except in compliance with the License.
146569  * You may obtain a copy of the License at
146570  *
146571  * http://www.apache.org/licenses/LICENSE-2.0
146572  *
146573  * Unless required by applicable law or agreed to in writing, software
146574  * distributed under the License is distributed on an "AS IS" BASIS,
146575  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
146576  * See the License for the specific language governing permissions and
146577  * limitations under the License.
146578  */
146579 module.exports = {
146580     create: function (server) {
146581         var XHR = window.XMLHttpRequest,
146582             webworks = require(server);
146583
146584         return function () {
146585             var _url,
146586                 _async,
146587                 xhr = new XHR(),
146588                 origMethods = {
146589                     open: xhr.open,
146590                     send: xhr.send,
146591                     setRequestHeader: xhr.setRequestHeader
146592                 };
146593
146594             function onreadystatechange() {
146595                 if (typeof xhr.onreadystatechange === "function") {
146596                     xhr.onreadystatechange();
146597                 }
146598             }
146599
146600             function statemachine(getResult) {
146601                 var state = 0,
146602                     incState = function (prev, baton) {
146603                         state++;
146604                         if (_async) {
146605                             baton.take();
146606                             window.setTimeout(baton.pass, 1);
146607                         }
146608                     },
146609                     setResponse = function (result) {
146610                         xhr.__defineGetter__("status", function () {
146611                             return 200;
146612                         });
146613
146614                         xhr.__defineGetter__("responseText", function () {
146615                             return result !== null && result !== undefined ?
146616                                 JSON.stringify(result) : null;
146617                         });
146618                     };
146619
146620                 xhr.__defineGetter__("readyState", function () {
146621                     return state;
146622                 });
146623
146624                 jWorkflow.order(incState)
146625                          .andThen(onreadystatechange)
146626                          .andThen(incState)
146627                          .andThen(onreadystatechange)
146628                          .andThen(incState)
146629                          .andThen(onreadystatechange)
146630                          .andThen(getResult)
146631                          .andThen(setResponse)
146632                          .andThen(incState)
146633                          .andThen(onreadystatechange)
146634                          .start();
146635             }
146636
146637             xhr.setRequestHeader = function (header, value) {
146638                 if (!_url.match(/^webworks:\/\//)) {
146639                     origMethods.setRequestHeader.apply(xhr, Array.prototype.slice.call(arguments));
146640                 }
146641             };
146642
146643             xhr.open = function (method, url, async, user, password) {
146644                 _url = url;
146645                 _async = async;
146646
146647                 if (!_url.match(/^webworks:\/\//)) {
146648                     origMethods.open.apply(xhr, Array.prototype.slice.call(arguments));
146649                 }
146650             };
146651
146652             xhr.send = function (post) {
146653                 if (!_url.match(/^webworks:\/\//)) {
146654                     origMethods.send.apply(xhr, Array.prototype.slice.call(arguments));
146655                     return;
146656                 }
146657
146658                 var params = _url.match(/\?(.*)$/),
146659                     objPath = _url.match(/^webworks:\/\/([^\?]*)/)[1].split("/"),
146660                     apiMethod = objPath.reduce(function (obj, name) {
146661                         return obj[name];
146662                     }, webworks),
146663                     postParams = {},
146664                     get = {};
146665
146666                 if (params) {
146667                     params[1].split("&").forEach(function (param) {
146668                             var pair = param.split("="),
146669                                 key = decodeURIComponent(pair[0]),
146670                                 value = decodeURIComponent(pair[1]);
146671                             // parsing undefied with JSON throws exception
146672                             get[key] = value === "undefined" ? undefined : JSON.parse(value);
146673                         });
146674                 }
146675
146676                 if (post) {
146677                     post.split("&").forEach(function (param) {
146678                             var pair = param.split("="),
146679                                 value;
146680                             try {
146681                                 value = JSON.parse(decodeURIComponent(pair[1]));
146682                             } catch (e) {
146683                                 value = pair[1] === "undefined" ? undefined : pair[1];
146684                             }
146685
146686                             postParams[pair[0]] = value;
146687                         });
146688                 }
146689
146690                 statemachine(function (prev, baton) {
146691                     return apiMethod(get, postParams, baton);
146692                 });
146693             };
146694
146695             return xhr;
146696         };
146697     }
146698 };
146699
146700 });
146701 define('ripple/platform/webworks.core/2.0.0/client/io/file', function (require, exports, module) {
146702 /*
146703  * Copyright 2011 Research In Motion Limited.
146704  *
146705  * Licensed under the Apache License, Version 2.0 (the "License");
146706  * you may not use this file except in compliance with the License.
146707  * You may obtain a copy of the License at
146708  *
146709  *     http://www.apache.org/licenses/LICENSE-2.0
146710  *
146711  * Unless required by applicable law or agreed to in writing, software
146712  * distributed under the License is distributed on an "AS IS" BASIS,
146713  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
146714  * See the License for the specific language governing permissions and
146715  * limitations under the License.
146716  */
146717 var transport = require('ripple/platform/webworks.core/2.0.0/client/transport'),
146718     _uri = "blackberry/io/file/",
146719     FILE = "file://",
146720     _onFileOpened;
146721
146722 function _prunePrefix(path) {
146723     return path.replace(new RegExp("^" + FILE), '');
146724 }
146725
146726 module.exports = {
146727     copy: function (from, to) {
146728         transport.call(_uri + "copy", {
146729             post: {from: _prunePrefix(from), to: _prunePrefix(to)}
146730         });
146731     },
146732     deleteFile: function (path) {
146733         transport.call(_uri + "deleteFile", {
146734             post: {path: _prunePrefix(path)}
146735         });
146736     },
146737     exists: function (path) {
146738         return transport.call(_uri + "exists", {
146739             post: {path: _prunePrefix(path)}
146740         });
146741     },
146742     getFileProperties: function (path) {
146743         var properties = transport.call(_uri + "getFileProperties", {
146744             post: {path: _prunePrefix(path)}
146745         });
146746         properties.directory = FILE + properties.directory;
146747         return properties;
146748     },
146749     open: function (path, newName) {
146750         transport.call(_uri + "open", {
146751             post: {path: _prunePrefix(path)}
146752         });
146753     },
146754     readFile: function (path, onFileOpened, async) {
146755         async = async === false ? false : true;
146756
146757         var uri = _uri + "readFile",
146758             args = {
146759                 post: {path: _prunePrefix(path), async: async}
146760             },
146761             callResult;
146762
146763         _onFileOpened = onFileOpened;
146764
146765         if (async) {
146766             transport.poll(uri, args, function (data, res) {
146767                 if (_onFileOpened) {
146768                     _onFileOpened(FILE + data.fullPath, data.blobData);
146769                 }
146770                 return false;
146771             });
146772         } else {
146773             callResult = transport.call(uri, args);
146774             _onFileOpened(FILE + callResult.fullPath, callResult.blobData);
146775         }
146776     },
146777     rename: function (path, newName) {
146778         transport.call(_uri + "rename", {
146779             post: {path: _prunePrefix(path), newName: newName}
146780         });
146781     },
146782     saveFile: function (path, blob) {
146783         transport.call(_uri + "saveFile", {
146784             post: {path: _prunePrefix(path), blob: blob}
146785         });
146786     }
146787 };
146788
146789 });
146790 define('ripple/platform/webworks.core/2.0.0/client/io/dir', function (require, exports, module) {
146791 /*
146792  * Copyright 2011 Research In Motion Limited.
146793  *
146794  * Licensed under the Apache License, Version 2.0 (the "License");
146795  * you may not use this file except in compliance with the License.
146796  * You may obtain a copy of the License at
146797  *
146798  *     http://www.apache.org/licenses/LICENSE-2.0
146799  *
146800  * Unless required by applicable law or agreed to in writing, software
146801  * distributed under the License is distributed on an "AS IS" BASIS,
146802  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
146803  * See the License for the specific language governing permissions and
146804  * limitations under the License.
146805  */
146806 var transport = require('ripple/platform/webworks.core/2.0.0/client/transport'),
146807     _uri = "blackberry/io/dir/",
146808     FILE = "file://";
146809
146810 function _prunePrefix(path) {
146811     return path.replace(new RegExp("^" + FILE), '');
146812 }
146813
146814 function _addPrefix(path) {
146815     return FILE + path;
146816 }
146817
146818 module.exports = {
146819     createNewDir: function (path) {
146820         transport.call(_uri + "createNewDir", {
146821             post: {path: _prunePrefix(path)}
146822         });
146823     },
146824     deleteDirectory: function (path, recursive) {
146825         transport.call(_uri + "deleteDirectory", {
146826             post: {path: _prunePrefix(path), recursive: recursive}
146827         });
146828     },
146829     exists: function (path) {
146830         return transport.call(_uri + "exists", {
146831             post: {path: _prunePrefix(path)}
146832         });
146833     },
146834     getParentDirectory: function (path) {
146835         return _addPrefix(transport.call(_uri + "getParentDirectory", {
146836             post: {path: _prunePrefix(path)}
146837         }));
146838     },
146839     listDirectories: function (path) {
146840         return transport.call(_uri + "listDirectories", {
146841             post: {path: _prunePrefix(path)}
146842         });
146843     },
146844     listFiles: function (path) {
146845         return transport.call(_uri + "listFiles", {
146846             post: {path: _prunePrefix(path)}
146847         });
146848     },
146849     rename: function (path, newName) {
146850         transport.call(_uri + "rename", {
146851             post: {path: _prunePrefix(path), newName: newName}
146852         });
146853     }
146854 };
146855
146856 });
146857 define('ripple/platform/webworks.core/2.0.0/client/transport', function (require, exports, module) {
146858 /*
146859  * Copyright 2011 Research In Motion Limited.
146860  *
146861  * Licensed under the Apache License, Version 2.0 (the "License");
146862  * you may not use this file except in compliance with the License.
146863  * You may obtain a copy of the License at
146864  *
146865  *     http://www.apache.org/licenses/LICENSE-2.0
146866  *
146867  * Unless required by applicable law or agreed to in writing, software
146868  * distributed under the License is distributed on an "AS IS" BASIS,
146869  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
146870  * See the License for the specific language governing permissions and
146871  * limitations under the License.
146872  */
146873 var _self;
146874
146875 function RemoteFunctionCall(functionUri) {
146876     var params = {},
146877         postString = "",
146878         postParams = {};
146879
146880     function composeUri() {
146881         var uri = "webworks://" + functionUri,
146882             paramCount = 1,
146883             param;
146884
146885         for (param in params) {
146886             if (params.hasOwnProperty(param)) {
146887                 if (paramCount === 1) {
146888                     uri += "?";
146889                 } else {
146890                     uri += "&";
146891                 }
146892                 uri += param + "=" + params[param];
146893                 paramCount++;
146894             }
146895
146896             uri = uri.replace(/\&$/, "");
146897         }
146898
146899         return uri;
146900     }
146901
146902     function createXhrRequest(uri, isAsync) {
146903         var request = new XMLHttpRequest(),
146904             paramCount = 1,
146905             param;
146906
146907         for (param in postParams) {
146908             if (postParams.hasOwnProperty(param)) {
146909                 postString += param + "=" + postParams[param] + "&";
146910                 paramCount++;
146911             }
146912         }
146913
146914         postString = postString.replace(/\&$/, "");
146915
146916         // TODO: make get/post
146917         request.open("POST", uri, isAsync);
146918         request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
146919
146920         return request;
146921     }
146922
146923     this.addParam = function (name, value) {
146924         params[name] = encodeURIComponent(JSON.stringify(value));
146925     };
146926
146927     this.addPostParam = function (name, value) {
146928         postParams[name] = encodeURIComponent(JSON.stringify(value));
146929     };
146930
146931     this.makeSyncCall = function (success, error) {
146932         var requestUri = composeUri(),
146933             request = createXhrRequest(requestUri, false),
146934             response, errored, cb, data;
146935
146936         request.send(postString);
146937
146938         response = JSON.parse(request.responseText || "null");
146939         errored = response.code < 0;
146940         cb = errored ? error : success;
146941         data = errored ? response.msg : response.data;
146942
146943         if (cb) {
146944             cb(data, response);
146945         }
146946         else if (errored) {
146947             throw data;
146948         }
146949
146950         return data;
146951     };
146952
146953     this.makeAsyncCall = function (success, error) {
146954         var requestUri = composeUri(),
146955             request = createXhrRequest(requestUri, true);
146956
146957         request.onreadystatechange = function () {
146958             if (request.readyState === 4 && request.status === 200) {
146959                 var response = JSON.parse(request.responseText || "null"),
146960                     cb = response.code < 0 ? error : success,
146961                     data = response.code < 0 ? response.msg : response.data;
146962
146963                 return cb && cb(data, response);
146964             }
146965         };
146966
146967         request.send(postString);
146968     };
146969 }
146970
146971 _self = {
146972     call: function (url, opts, success, error) {
146973         var request = new RemoteFunctionCall(url),
146974             name;
146975
146976         opts = opts || {};
146977
146978         if (opts.get) {
146979             for (name in opts.get) {
146980                 if (Object.hasOwnProperty.call(opts.get, name)) {
146981                     request.addParam(name, opts.get[name]);
146982                 }
146983             }
146984         }
146985
146986         if (opts.post) {
146987             for (name in opts.post) {
146988                 if (Object.hasOwnProperty.call(opts.post, name)) {
146989                     request.addPostParam(name, opts.post[name]);
146990                 }
146991             }
146992         }
146993
146994         return opts.async ? request.makeAsyncCall(success, error) : request.makeSyncCall(success, error);
146995     },
146996
146997     poll: function (url, opts, callback) {
146998         opts = opts || {};
146999         opts.async = true;
147000
147001         _self.call(url, opts, function (data, response) {
147002             if (callback(data, response)) {
147003                 _self.poll(url, opts, callback);
147004             }
147005         });
147006     }
147007 };
147008
147009 module.exports = _self;
147010
147011 });
147012 define('ripple/platform/webworks.core/2.0.0/client/system', function (require, exports, module) {
147013 /*\r
147014  *  Copyright 2011 Research In Motion Limited.\r
147015  *\r
147016  * Licensed under the Apache License, Version 2.0 (the "License");\r
147017  * you may not use this file except in compliance with the License.\r
147018  * You may obtain a copy of the License at\r
147019  *\r
147020  * http://www.apache.org/licenses/LICENSE-2.0\r
147021  *\r
147022  * Unless required by applicable law or agreed to in writing, software\r
147023  * distributed under the License is distributed on an "AS IS" BASIS,\r
147024  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
147025  * See the License for the specific language governing permissions and\r
147026  * limitations under the License.\r
147027  */\r
147028 var transport = require('ripple/platform/webworks.core/2.0.0/client/transport'),\r
147029     _uri = "blackberry/system/",\r
147030     _self;\r
147031 \r
147032 _self = {\r
147033     hasCapability: function (capability) {\r
147034         return transport.call(_uri + "hasCapability", {\r
147035             get: {capability: capability}\r
147036         });\r
147037     },\r
147038 \r
147039     hasDataCoverage: function () {\r
147040         return transport.call(_uri + "hasDataCoverage");\r
147041     },\r
147042 \r
147043     hasPermission: function (desiredModule) {\r
147044         return transport.call(_uri + "hasPermission", {\r
147045             get: {desiredModule: desiredModule}\r
147046         });\r
147047     },\r
147048 \r
147049     isMassStorageActive: function () {\r
147050         return transport.call(_uri + "isMassStorageActive");\r
147051     }\r
147052 };\r
147053 \r
147054 _self.__defineGetter__("model", function () {\r
147055     return transport.call(_uri + "model");\r
147056 });\r
147057 _self.__defineGetter__("scriptApiVersion", function () {\r
147058     return transport.call(_uri + "scriptApiVersion");\r
147059 });\r
147060 _self.__defineGetter__("softwareVersion", function () {\r
147061     return transport.call(_uri + "softwareVersion");\r
147062 });\r
147063 \r
147064 _self.__defineGetter__("ALLOW", function () {\r
147065     return 0;\r
147066 });\r
147067 _self.__defineGetter__("DENY", function () {\r
147068     return 1;\r
147069 });\r
147070 _self.__defineGetter__("PROMPT", function () {\r
147071     return 2;\r
147072 });\r
147073 _self.__defineGetter__("NOT_SET", function () {\r
147074     return 3;\r
147075 });\r
147076 \r
147077 module.exports = _self;\r
147078
147079 });
147080 define('ripple/platform/webworks.core/2.0.0/client/dialog', function (require, exports, module) {
147081 /*\r
147082  *  Copyright 2011 Research In Motion Limited.\r
147083  *\r
147084  * Licensed under the Apache License, Version 2.0 (the "License");\r
147085  * you may not use this file except in compliance with the License.\r
147086  * You may obtain a copy of the License at\r
147087  *\r
147088  * http://www.apache.org/licenses/LICENSE-2.0\r
147089  *\r
147090  * Unless required by applicable law or agreed to in writing, software\r
147091  * distributed under the License is distributed on an "AS IS" BASIS,\r
147092  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
147093  * See the License for the specific language governing permissions and\r
147094  * limitations under the License.\r
147095  */\r
147096 var transport = require('ripple/platform/webworks.core/2.0.0/client/transport'),\r
147097     _uri = "blackberry/ui/dialog/",\r
147098     _self;\r
147099 \r
147100 function getButtonsForDialogType(dialogType) {\r
147101     switch (dialogType) {\r
147102     case _self.D_OK:\r
147103         return ["Ok"];\r
147104     case _self.D_SAVE:\r
147105         return ["Save", "Discard"];\r
147106     case _self.D_DELETE:\r
147107         return ["Delete", "Cancel"];\r
147108     case _self.D_YES_NO:\r
147109         return ["Yes", "No"];\r
147110     case _self.D_OK_CANCEL:\r
147111         return ["Ok", "Cancel"];\r
147112     default:\r
147113         throw new Error("Invalid dialog type: " + dialogType);\r
147114     }\r
147115 }\r
147116 \r
147117 _self = {\r
147118     customAskAsync: function (message, choices, callback, settings) {\r
147119         return transport.call(_uri + "ask", {\r
147120             async: true,\r
147121             get: {\r
147122                 message: message,\r
147123                 buttons: choices,\r
147124                 settings: settings\r
147125             }\r
147126         }, function (response) {\r
147127             if (callback) {\r
147128                 callback(response);\r
147129             }\r
147130         });\r
147131     },\r
147132 \r
147133     standardAskAsync: function (message, type, callback, settings) {\r
147134         var choices = getButtonsForDialogType(type);\r
147135         return transport.call(_uri + "ask", {\r
147136             async: true,\r
147137             get: {\r
147138                 message: message,\r
147139                 buttons: choices,\r
147140                 settings: settings\r
147141             }\r
147142         }, function (response) {\r
147143             if (callback) {\r
147144                 callback(response);\r
147145             }\r
147146         });\r
147147     }\r
147148 };\r
147149 \r
147150 _self.__defineGetter__("D_OK", function () {\r
147151     return 0;\r
147152 });\r
147153 \r
147154 _self.__defineGetter__("D_SAVE", function () {\r
147155     return 1;\r
147156 });\r
147157 \r
147158 _self.__defineGetter__("D_DELETE", function () {\r
147159     return 2;\r
147160 });\r
147161 \r
147162 _self.__defineGetter__("D_YES_NO", function () {\r
147163     return 3;\r
147164 });\r
147165 \r
147166 _self.__defineGetter__("D_OK_CANCEL", function () {\r
147167     return 4;\r
147168 });\r
147169 \r
147170 _self.__defineGetter__("BOTTOM", function () {\r
147171     return "bottomCenter";\r
147172 });\r
147173 \r
147174 _self.__defineGetter__("CENTER", function () {\r
147175     return "middleCenter";\r
147176 });\r
147177 \r
147178 _self.__defineGetter__("TOP", function () {\r
147179     return "topCenter";\r
147180 });\r
147181 \r
147182 _self.__defineGetter__("SIZE_FULL", function () {\r
147183     return "full";\r
147184 });\r
147185 \r
147186 _self.__defineGetter__("SIZE_LARGE", function () {\r
147187     return "large";\r
147188 });\r
147189 \r
147190 _self.__defineGetter__("SIZE_MEDIUM", function () {\r
147191     return "medium";\r
147192 });\r
147193 \r
147194 _self.__defineGetter__("SIZE_SMALL", function () {\r
147195     return "small";\r
147196 });\r
147197 \r
147198 _self.__defineGetter__("SIZE_TALL", function () {\r
147199     return "tall";\r
147200 });\r
147201 \r
147202 module.exports = _self;\r
147203
147204 });
147205 define('ripple/platform/webworks.core/2.0.0/client/events', function (require, exports, module) {
147206 /*
147207  * Copyright 2011 Research In Motion Limited.
147208  *
147209  * Licensed under the Apache License, Version 2.0 (the "License");
147210  * you may not use this file except in compliance with the License.
147211  * You may obtain a copy of the License at
147212  *
147213  *     http://www.apache.org/licenses/LICENSE-2.0
147214  *
147215  * Unless required by applicable law or agreed to in writing, software
147216  * distributed under the License is distributed on an "AS IS" BASIS,
147217  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
147218  * See the License for the specific language governing permissions and
147219  * limitations under the License.
147220  */
147221 var _handlers = [],
147222     _self;
147223
147224 _self = {
147225     eventsMap: {
147226         getHandlerById: function (handlerId) {
147227             return _handlers[handlerId];
147228         },
147229         addHandler: function (handler) {
147230             _handlers.push(handler);
147231             return _handlers.length - 1;
147232         },
147233         removeHandler: function (handlerId) {
147234             if (handlerId > -1 && handlerId < _handlers.length) {
147235                 delete _handlers[handlerId]; //cannot splice because all published IDs would refer to the wrong handler
147236             }
147237         }
147238     },
147239
147240     registerEventHandler : function (eventName, eventCallback, eventParams) {
147241         return _self.eventsMap.addHandler(eventCallback);
147242     },
147243
147244     getEventHandler : function (handlerId) {
147245         return _self.eventsMap.getHandlerById(handlerId);
147246     }
147247 };
147248
147249 module.exports = _self;
147250
147251 });
147252 define('ripple/platform/webworks.core/2.0.0/client/utils', function (require, exports, module) {
147253 /*
147254  * Copyright 2011 Research In Motion Limited.
147255  *
147256  * Licensed under the Apache License, Version 2.0 (the "License");
147257  * you may not use this file except in compliance with the License.
147258  * You may obtain a copy of the License at
147259  *
147260  *     http://www.apache.org/licenses/LICENSE-2.0
147261  *
147262  * Unless required by applicable law or agreed to in writing, software
147263  * distributed under the License is distributed on an "AS IS" BASIS,
147264  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
147265  * See the License for the specific language governing permissions and
147266  * limitations under the License.
147267  */
147268 var _blobs = {};
147269
147270 function _blobBuilder() {
147271     var BlobBuilder = BlobBuilder || WebKitBlobBuilder;
147272     return new BlobBuilder();
147273 }
147274
147275 module.exports = {
147276     parseURL: function (theUrl) {
147277         /********START IDEA BORROWING*******/
147278         // parseUri 1.2.2
147279         // (c) Steven Levithan <stevenlevithan.com>
147280         // MIT License
147281
147282         function parseUri(str) {
147283             var o   = parseUri.options,
147284                 m   = o.parser[o.strictMode ? "strict" : "loose"].exec(str),
147285                 uri = {},
147286                 i   = 14;
147287
147288             while (i--) {
147289                 uri[o.key[i]] = m[i] || "";
147290             }
147291
147292             uri[o.q.name] = {};
147293             uri[o.q.arrayName] = [];
147294             uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {
147295                 if ($1) {
147296                     uri[o.q.name][$1] = $2;
147297                     uri[o.q.arrayName].push($2);
147298                 }
147299             });
147300
147301             return uri;
147302         }
147303
147304         parseUri.options = {
147305                 strictMode: false,
147306                 key: ["source", "protocol", "authority", "userInfo", "user", "password", "host", "port", "relative", "path", "directory", "file", "query", "anchor"],
147307                 q:   {
147308                     name:   "queryKey",
147309                     arrayName:   "queryArray",
147310                     parser: /(?:^|&)([^&=]*)=?([^&]*)/g
147311                 },
147312                 parser: {
147313                     strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
147314                     loose:  /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
147315                 }
147316             };
147317         /********END IDEA BORROWING*******/
147318
147319         parseUri.strictMode = "strict";
147320         var uri = parseUri(theUrl),
147321             retVal = {
147322                 getURLParameter : function (key) {
147323                     return uri.queryKey[key];
147324                 },
147325
147326                 getURLParameterByIndex : function (index) {
147327                     return uri.queryArray[index];
147328                 }
147329             };
147330
147331         //Add default values for the http/https port if they weren't specified in the URL. The above parser returns undefined. We need the values
147332         //to be compatible with the BB version of API.
147333         if (uri["port"] === "") {
147334             if (uri["protocol"] === "http") {
147335                 uri["port"] = "80";
147336             }
147337             else if (uri["protocol"] === "https") {
147338                 uri["port"] = "443";
147339             }
147340             else {
147341                 uri["port"] = "0";
147342             }
147343         }
147344
147345         retVal.__defineGetter__("host", function () {
147346             return uri["host"];
147347         });
147348         retVal.__defineGetter__("port", function () {
147349             return parseInt(uri["port"], 10);
147350         });
147351
147352         return retVal;
147353     },
147354
147355     generateUniqueId: function () {
147356         return Math.floor(Math.random() * Number.MAX_VALUE);
147357     },
147358
147359     blobToString: function (blob, encoding) {
147360         return _blobs[blob.id];
147361     },
147362
147363     stringToBlob: function (string, encoding) {
147364         var id = Math.uuid(undefined, 16),
147365             blob = _blobBuilder(),
147366             finalBlob;
147367
147368         _blobs[id] = string;
147369         blob.append(string);
147370
147371         finalBlob = blob.getBlob();
147372         finalBlob.id = id;
147373         finalBlob.length = finalBlob.size;
147374
147375         return finalBlob;
147376     }
147377 };
147378
147379 });
147380 define('ripple/platform/webworks.core/2.0.0/client/FileProperties', function (require, exports, module) {
147381 /*
147382  * Copyright 2011 Research In Motion Limited.
147383  *
147384  * Licensed under the Apache License, Version 2.0 (the "License");
147385  * you may not use this file except in compliance with the License.
147386  * You may obtain a copy of the License at
147387  *
147388  *     http://www.apache.org/licenses/LICENSE-2.0
147389  *
147390  * Unless required by applicable law or agreed to in writing, software
147391  * distributed under the License is distributed on an "AS IS" BASIS,
147392  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
147393  * See the License for the specific language governing permissions and
147394  * limitations under the License.
147395  */
147396 function FileProperties(props) {
147397     props = props || {};
147398
147399     function _get(val) {
147400         return function () {
147401             return props[val];
147402         };
147403     }
147404
147405     this.__defineGetter__("dateCreated", _get("dateCreated")); //tablet only
147406     this.__defineGetter__("dateModified", _get("dateModified"));
147407     this.__defineGetter__("directory", _get("directory"));
147408     this.__defineGetter__("fileExtension", _get("fileExtension"));
147409     this.__defineGetter__("isHidden", _get("isHidden"));
147410     this.__defineGetter__("isReadonly", _get("isReadonly")); //handset only
147411     this.__defineGetter__("mimeType", _get("mimeType")); //handset only
147412     this.__defineGetter__("size", _get("size"));
147413 }
147414
147415 module.exports = FileProperties;
147416
147417 });
147418 define('ripple/platform/webworks.core/2.0.0/select', function (require, exports, module) {
147419 /*
147420  *  Copyright 2011 Research In Motion Limited.
147421  *
147422  * Licensed under the Apache License, Version 2.0 (the "License");
147423  * you may not use this file except in compliance with the License.
147424  * You may obtain a copy of the License at
147425  *
147426  * http://www.apache.org/licenses/LICENSE-2.0
147427  *
147428  * Unless required by applicable law or agreed to in writing, software
147429  * distributed under the License is distributed on an "AS IS" BASIS,
147430  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
147431  * See the License for the specific language governing permissions and
147432  * limitations under the License.
147433  */
147434 var utils = require('ripple/utils'),
147435     _select,
147436     _predicates = {
147437         "==": function (left, right) {
147438             return left === right;
147439         },
147440         "!=": function (left, right) {
147441             return left !== right;
147442         },
147443         "<": function (left, right) {
147444             return left < right;
147445         },
147446         ">": function (left, right) {
147447             return left > right;
147448         },
147449         "<=": function (left, right) {
147450             return left <= right;
147451         },
147452         ">=": function (left, right) {
147453             return left >= right;
147454         },
147455         "REGEX": function (left, right) {
147456             return left && left.match(new RegExp(right));
147457         },
147458         "CONTAINS": function (left, right) {
147459             return left.indexOf(right) >= 0;
147460         }
147461     };
147462
147463 function isFilter(field) {
147464     return field && field.operator !== undefined && field.operator !== null;
147465 }
147466
147467 function extractValue(item, field) {
147468     return field.split(".").reduce(function (value, prop) {
147469         return value[prop];
147470     }, item);
147471 }
147472
147473 function copy(items) {
147474     //use a reduce to ensure that we always just return an array
147475     //not the most performant but will whitewash the result
147476     return utils.reduce(items, function (array, item) {
147477         array.push(item);
147478         return array;
147479     }, []);
147480 }
147481
147482 _select = {
147483     ops: {
147484         find: {
147485             0: "!=",
147486             1: "==",
147487             2: "<",
147488             3: "<=",
147489             4: ">",
147490             5: ">=",
147491             8: "REGEX",
147492             16: "AND",
147493             32: "OR",
147494             64: "CONTAINS"
147495         },
147496         phone: {
147497             0: "!=",
147498             1: "==",
147499             2: "<",
147500             3: "<=",
147501             4: ">",
147502             5: ">=",
147503             8: "AND",
147504             16: "OR",
147505             32: "CONTAINS"
147506         }
147507     },
147508     from: function (items) {
147509         var _getPredicate = function (filter, operators) {
147510
147511                 var noOp = function () {
147512                         return false;
147513                     },
147514                     operator = (function () {
147515                         var result = operators[filter.operator] || filter.operator,
147516                             exists = function (op) {
147517                                 return result === op;
147518                             };
147519
147520                         return utils.some(operators, exists) ? result : "";
147521                     }());
147522
147523                 return function (item) {
147524                     var left = extractValue(item, filter.leftField),
147525                         right = filter.rightField,
147526                         predicate = _predicates[operator] || noOp;
147527
147528                     return filter.negate ? !predicate(left, right) : predicate(left, right);
147529                 };
147530
147531             },
147532             _applyFilter = function (filter, operators) {
147533                 var result = [],
147534                     left,
147535                     right,
147536                     op;
147537
147538                 if (isFilter(filter.leftField) && isFilter(filter.rightField)) {
147539
147540                     left = _select.from(items).where(filter.leftField);
147541                     right = _select.from(items).where(filter.rightField);
147542                     op = operators[filter.operator] || filter.operator;
147543
147544                     switch (op) {
147545                     case "AND":
147546                         result = left.filter(function (item) {
147547                             return right.indexOf(item) >= 0;
147548                         });
147549                         break;
147550                     case "OR":
147551                         result = left.concat(right.filter(function (item) {
147552                             return left.indexOf(item) < 0;
147553                         }));
147554                         break;
147555                     }
147556
147557                     if (filter.negate) {
147558                         //reverse the result set.
147559                         result = utils.filter(items, function (item) {
147560                             return result.indexOf(item) < 0;
147561                         });
147562                     }
147563                 }
147564                 else {
147565                     result = utils.filter(items, _getPredicate(filter, operators));
147566                 }
147567
147568                 return result;
147569             },
147570             _orderBy,
147571             _max,
147572             _direction,
147573             _self = {
147574                 orderBy: function (prop, dir) {
147575                     _orderBy = prop;
147576                     _direction = dir || "asc";
147577                     return _self;
147578                 },
147579                 max: function (max) {
147580                     _max = max;
147581                     return _self;
147582                 },
147583                 where: function (filter, ops) {
147584                     var result = isFilter(filter) ? _applyFilter(filter, ops || _select.ops.find) : copy(items);
147585
147586                     result.sort(function (a, b) {
147587                         if (a[_orderBy] < b[_orderBy]) {
147588                             return _direction === "asc" ? -1 : 1;
147589                         }
147590                         else if (a[_orderBy] > b[_orderBy]) {
147591                             return _direction === "asc" ? 1: -1;
147592                         }
147593                         return 0;
147594                     });
147595
147596                     return result.slice(0, _max === null || _max === -1 ? undefined : _max); // slice in V8 returns empty array if null
147597                 }
147598             };
147599
147600         return _self;
147601     }
147602 };
147603
147604 module.exports = _select;
147605
147606 });
147607 define('ripple/platform/webworks.core/2.0.0/spec/config', function (require, exports, module) {
147608 /*
147609  *  Copyright 2011 Research In Motion Limited.
147610  *
147611  * Licensed under the Apache License, Version 2.0 (the "License");
147612  * you may not use this file except in compliance with the License.
147613  * You may obtain a copy of the License at
147614  *
147615  * http://www.apache.org/licenses/LICENSE-2.0
147616  *
147617  * Unless required by applicable law or agreed to in writing, software
147618  * distributed under the License is distributed on an "AS IS" BASIS,
147619  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
147620  * See the License for the specific language governing permissions and
147621  * limitations under the License.
147622  */
147623 var utils = require('ripple/utils');
147624
147625 module.exports = {
147626     fileName: "config.xml",
147627     validateVersion: function (config) {
147628         return true;
147629     },
147630     extractInfo: function (config) {
147631         if (!config) {
147632             return null;
147633         }
147634
147635         var widgetInfo = {},
147636             widgetFeatures = config.widget.children.feature.validationResult,
147637             accessUrls = config.widget.children.access.validationResult,
147638             accessFeatures = config.widget.children.access.children.feature.validationResult,
147639             toFeature = function (validationResult) {
147640                 return {
147641                     id: validationResult.attributes.id.value,
147642                     required: !validationResult.attributes.required || validationResult.attributes.required.value,
147643                     URIs: []
147644                 };
147645             };
147646
147647         widgetInfo.id = config.widget.validationResult[0].attributes.id.value;
147648         widgetInfo.name = config.widget.children.name.validationResult[0].value;
147649         widgetInfo.icon = config.widget.children.icon.validationResult[0].attributes.src.value;
147650         widgetInfo.version = config.widget.validationResult[0].attributes.version.value;
147651         widgetInfo.author = config.widget.children.author.validationResult[0].value;
147652         widgetInfo.authorEmail = config.widget.children.author.validationResult[0].attributes.email.value;
147653         widgetInfo.authorURL = config.widget.children.author.validationResult[0].attributes.href.value;
147654         widgetInfo.copyright = config.widget.children.author.validationResult[0].attributes["rim:copyright"].value;
147655         widgetInfo.description = config.widget.children.description.validationResult[0].value;
147656         if (config.widget.children.license.validationResult[0]) {
147657             widgetInfo.license = config.widget.children.license.validationResult[0].value;
147658             widgetInfo.licenseURL = config.widget.children.license.validationResult[0].attributes.href.value;
147659         }
147660
147661         widgetInfo.features = widgetFeatures.reduce(function (features, validationResult) {
147662             if (validationResult.valid) {
147663                 var feature = toFeature(validationResult);
147664                 feature.URIs.push({
147665                     value: utils.location().href,
147666                     subdomains: true
147667                 });
147668                 features = features || {};
147669                 features[feature.id] = feature;
147670             }
147671             return features;
147672         }, {});
147673
147674         widgetInfo.features = accessUrls.map(function (access) {
147675             return {
147676                 uri: access.attributes.uri.value,
147677                 subdomains: access.attributes.subdomains.value,
147678                 features: accessFeatures ? accessFeatures.filter(function (f) {
147679                     return f.node && f.node.parentNode && f.node.parentNode.attributes.uri.value === access.attributes.uri.value;
147680                 }) : null
147681             };
147682         }).reduce(function (result, access) {
147683             return access.features ? access.features.reduce(function (features, validationResult) {
147684                 var feature = features[validationResult.attributes.id.value] || toFeature(validationResult);
147685                 feature.URIs.push({
147686                     value: access.uri,
147687                     subdomains: access.subdomains
147688                 });
147689                 features[feature.id] = feature;
147690                 return features;
147691             }, result) : result;
147692         }, widgetInfo.features);
147693
147694         return widgetInfo;
147695     },
147696     schema: {
147697         rootElement: "widget",
147698         widget: {
147699             nodeName: "widget",
147700             required: true,
147701             occurrence: 1,
147702             attributes: {
147703                 xmlns: {
147704                     attributeName: "xmlns",
147705                     required: true,
147706                     type: "list",
147707                     listValues: ["http://www.w3.org/ns/widgets"]
147708                 },
147709                 "xmlns:rim": {
147710                     attributeName: "xmlns:rim",
147711                     required: true,
147712                     type: "list",
147713                     listValues: ["http://www.blackberry.com/ns/widgets"]
147714                 },
147715                 "xml:lang": {
147716                     attributeName: "xml:lang",
147717                     required: false,
147718                     type: "iso-language"
147719                 },
147720                 id: {
147721                     attributeName: "id",
147722                     required: false,
147723                     type: "string"
147724                 },
147725                 version: {
147726                     attributeName: "version",
147727                     required: false,
147728                     type: "string"
147729                 },
147730                 "rim:header": {
147731                     attributeName: "rim:header",
147732                     required: false,
147733                     type: "string"
147734                 },
147735                 "rim:backButton": {
147736                     attributeName: "rim:backButton",
147737                     required: false,
147738                     type: "string"
147739                 }
147740             },
147741             children: {
147742                 name: {
147743                     nodeName: "name",
147744                     required: true,
147745                     occurrence: 1,
147746                     attributes: {
147747                         "xml:lang": {
147748                             attributeName: "xml:lang",
147749                             required: false,
147750                             type: "iso-language"
147751                         },
147752                         "its:dir": {
147753                             attributeName: "its:dir",
147754                             required: false,
147755                             type: "list",
147756                             listValues: ["rtl", "ltr", "lro", "rlo"]
147757                         }
147758                     }
147759                 },
147760                 description: {
147761                     nodeName: "description",
147762                     required: false,
147763                     occurrence: 1,
147764                     attributes: {
147765                         "xml:lang": {
147766                             attributeName: "xml:lang",
147767                             required: false,
147768                             type: "iso-language"
147769                         },
147770                         "its:dir": {
147771                             attributeName: "its:dir",
147772                             required: false,
147773                             type: "list",
147774                             listValues: ["rtl", "ltr", "lro", "rlo"]
147775                         }
147776                     }
147777                 },
147778                 icon: {
147779                     nodeName: "icon",
147780                     required: false,
147781                     occurrence: 0,
147782                     attributes: {
147783                         src: {
147784                             attributeName: "src",
147785                             type: "string",
147786                             required: true
147787                         },
147788                         "rim:hover": {
147789                             attributeName: "rim:hover",
147790                             type: "boolean",
147791                             required: false
147792                         }
147793                     }
147794                 },
147795                 author: {
147796                     nodeName: "author",
147797                     required: false,
147798                     occurrence: 1,
147799                     attributes: {
147800                         href: {
147801                             attributeName: "href",
147802                             type: "string",
147803                             required: false
147804                         },
147805                         "rim:copyright": {
147806                             attributeName: "rim:copyright",
147807                             type: "string",
147808                             required: false
147809                         },
147810                         email: {
147811                             attributeName: "email",
147812                             type: "string",
147813                             required: false
147814                         },
147815                         "xml:lang": {
147816                             attributeName: "xml:lang",
147817                             required: false,
147818                             type: "iso-language"
147819                         },
147820                         "its:dir": {
147821                             attributeName: "its:dir",
147822                             required: false,
147823                             type: "list",
147824                             listValues: ["rtl", "ltr", "lro", "rlo"]
147825                         }
147826                     }
147827                 },
147828                 license: {
147829                     nodeName: "license",
147830                     required: false,
147831                     occurrence: 1,
147832                     attributes : {
147833                         href: {
147834                             attributeName: "href",
147835                             type: "string",
147836                             required: false
147837                         },
147838                         "xml:lang": {
147839                             attributeName: "xml:lang",
147840                             required: false,
147841                             type: "iso-language"
147842                         },
147843                         "its:dir": {
147844                             attributeName: "its:dir",
147845                             required: false,
147846                             type: "list",
147847                             listValues: ["rtl", "ltr", "lro", "rlo"]
147848                         }
147849                     }
147850                 },
147851                 "rim:cache": {
147852                     nodeName: "rim:cache",
147853                     required: false,
147854                     occurrence: 1,
147855                     attributes: {
147856                         disableAllCache: {
147857                             attributeName: "disableAllCache",
147858                             required: false,
147859                             type: "boolean"
147860                         },
147861                         aggressiveCacheAge: {
147862                             attributeName: "aggressiveCacheAge",
147863                             required: false,
147864                             type: "number"
147865                         },
147866                         maxCacheSizeTotal: {
147867                             attributeName: "maxCacheSizeTotal",
147868                             required: false,
147869                             type: "number"
147870                         },
147871                         maxCacheSizeItem: {
147872                             attributeName: "maxCacheSizeItem",
147873                             required: false,
147874                             type: "number"
147875                         }
147876                     }
147877                 },
147878                 access: {
147879                     nodeName: "access",
147880                     required: false,
147881                     occurrence: 0,
147882                     attributes: {
147883                         uri: {
147884                             attributeName: "uri",
147885                             required: true,
147886                             type: "string"
147887                         },
147888                         subdomains: {
147889                             attributeName: "subdomains",
147890                             required: false,
147891                             type: "boolean"
147892                         }
147893                     },
147894                     children: {
147895                         feature: {
147896                             nodeName: "feature",
147897                             required: false,
147898                             occurrence: 0,
147899                             attributes: {
147900                                 id: {
147901                                     attributeName: "id",
147902                                     required: true,
147903                                     //TODO: this should be a list
147904                                     type: "string"
147905                                 },
147906                                 required: {
147907                                     attributeName: "required",
147908                                     required: false,
147909                                     type: "boolean"
147910                                 },
147911                                 version: {
147912                                     attributeName: "version",
147913                                     required: false,
147914                                     type: "string"
147915                                 }
147916                             }
147917                         }
147918                     }
147919                 },
147920                 feature: {
147921                     nodeName: "feature",
147922                     required: false,
147923                     occurrence: 0,
147924                     attributes: {
147925                         id: {
147926                             attributeName: "id",
147927                             required: true,
147928                             //TODO: this should be a list
147929                             type: "string"
147930                         },
147931                         required: {
147932                             attributeName: "required",
147933                             required: false,
147934                             type: "boolean"
147935                         },
147936                         version: {
147937                             attributeName: "version",
147938                             required: false,
147939                             type: "string"
147940                         }
147941                     }
147942                 },
147943                 "rim:loadingScreen": {
147944                     nodeName: "rim:loadingScreen",
147945                     required: false,
147946                     occurrence: 1,
147947                     attributes: {
147948                         backgroundColor: {
147949                             attributeName: "backgroundColor",
147950                             required: false,
147951                             type: "string"
147952                         },
147953                         backgroundImage: {
147954                             attributeName: "backgroundImage",
147955                             required: false,
147956                             type: "string"
147957                         },
147958                         foregroundImage: {
147959                             attributeName: "foregroundImage",
147960                             required: false,
147961                             type: "string"
147962                         },
147963                         onRemotePageLoad: {
147964                             attributeName: "onRemotePageLoad",
147965                             required: false,
147966                             type: "boolean"
147967                         },
147968                         onLocalPageLoad: {
147969                             attributeName: "onLocalPageLoad",
147970                             required : false,
147971                             type: "boolean"
147972                         },
147973                         onFirstLaunch: {
147974                             attributeName: "onFirstLaunch",
147975                             required: false,
147976                             type: "boolean"
147977                         }
147978                     },
147979                     children: {
147980                         "rim:transitionEffect": {
147981                             nodeName: "rim:transitionEffect",
147982                             required: false,
147983                             occurrence: 1,
147984                             attributes: {
147985                                 "type": {
147986                                     attributeName: "type",
147987                                     required: true,
147988                                     type: "list",
147989                                     listValues: ["slidePush", "slideOver", "fadeIn", "fadeOut", "wipeIn", "wipeOut", "zoomIn", "zoomOut"]
147990                                 },
147991                                 duration: {
147992                                     attributeName: "duration",
147993                                     required: false,
147994                                     type: "number"
147995                                 },
147996                                 direction: {
147997                                     attributeName: "direction",
147998                                     required: false,
147999                                     type: "list",
148000                                     listValues: ["left", "right", "up", "down"]
148001                                 }
148002                             }
148003                         }
148004                     }
148005                 },
148006                 "rim:connection": {
148007                     nodeName: "rim:connection",
148008                     required: false,
148009                     occurrence: 1,
148010                     attributes: {
148011                         timeout: {
148012                             attributeName: "timeout",
148013                             required: false,
148014                             type: "number"
148015                         }
148016                     },
148017                     children: {
148018                         id: {
148019                             nodeName: "id",
148020                             required: false,
148021                             occurrence: 0
148022                         }
148023                     }
148024                 },
148025                 "rim:navigation": {
148026                     nodeName: "rim:navigation",
148027                     required: false,
148028                     occurrence: 1,
148029                     attributes: {
148030                         mode: {
148031                             attributeName: "mode",
148032                             required: false,
148033                             type: "list",
148034                             listValues: ["focus"]
148035                         }
148036                     }
148037                 },
148038                 "content": {
148039                     nodeName: "content",
148040                     required: true,
148041                     occurrence: 1,
148042                     attributes: {
148043                         src: {
148044                             attributeName: "src",
148045                             required: true,
148046                             type: "string"
148047                         },
148048                         type: {
148049                             attributeName: "type",
148050                             required: false,
148051                             type: "string"
148052                         },
148053                         charset: {
148054                             attributeName: "charset",
148055                             required: false,
148056                             type: "string"
148057                         }
148058                     }
148059                 }
148060             }
148061         }
148062     }
148063 };
148064
148065 });
148066 define('ripple/platform/webworks.core/2.0.0/spec/events', function (require, exports, module) {
148067 /*
148068  *  Copyright 2011 Research In Motion Limited.
148069  *
148070  * Licensed under the Apache License, Version 2.0 (the "License");
148071  * you may not use this file except in compliance with the License.
148072  * You may obtain a copy of the License at
148073  *
148074  * http://www.apache.org/licenses/LICENSE-2.0
148075  *
148076  * Unless required by applicable law or agreed to in writing, software
148077  * distributed under the License is distributed on an "AS IS" BASIS,
148078  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
148079  * See the License for the specific language governing permissions and
148080  * limitations under the License.
148081  */
148082 var event = require('ripple/event');
148083
148084 module.exports = {
148085     "app.event.onBackground": {
148086         callback: function () {
148087             event.trigger("AppRequestBackground");
148088         }
148089     },
148090     "app.event.onForeground": {
148091         callback: function () {
148092             event.trigger("AppRequestForeground");
148093         }
148094     }
148095 };
148096
148097 });
148098 define('ripple/platform/webworks.core/2.0.0/server/io/file', function (require, exports, module) {
148099 /*
148100  *  Copyright 2011 Research In Motion Limited.
148101  *
148102  * Licensed under the Apache License, Version 2.0 (the "License");
148103  * you may not use this file except in compliance with the License.
148104  * You may obtain a copy of the License at
148105  *
148106  * http://www.apache.org/licenses/LICENSE-2.0
148107  *
148108  * Unless required by applicable law or agreed to in writing, software
148109  * distributed under the License is distributed on an "AS IS" BASIS,
148110  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
148111  * See the License for the specific language governing permissions and
148112  * limitations under the License.
148113  */
148114 var cache = require('ripple/platform/webworks.core/2.0.0/fsCache'),
148115     constants = require('ripple/constants'),
148116     notifications = require('ripple/notifications');
148117
148118 function _packet(data) {
148119     return {
148120         code: 1,
148121         data: data
148122     };
148123 }
148124
148125 module.exports = {
148126     copy: function (get, post, baton) {
148127         cache.file.copy(post.from, post.to);
148128         return _packet();
148129     },
148130     deleteFile: function (get, post, baton) {
148131         cache.file.deleteFile(post.path);
148132         return _packet();
148133     },
148134     exists: function (get, post, baton) {
148135         return _packet(cache.file.exists(post.path));
148136     },
148137     getFileProperties: function (get, post, baton) {
148138         return _packet(cache.file.getFileProperties(post.path));
148139     },
148140     open: function (get, post, baton) {
148141         var msg = "Attempting to open file: " + post.path;
148142         notifications.openNotification("normal", msg);
148143         return _packet(cache.file.exists(post.path));
148144     },
148145     readFile: function (get, post, baton) {
148146         var val;
148147
148148         if (post.async) {
148149             baton.take();
148150         }
148151
148152         cache.file.readFile(post.path, function (data) {
148153             if (post.async) {
148154                 baton.pass(_packet({
148155                     fullPath: post.path,
148156                     blobData: data
148157                 }));
148158             } else {
148159                 val = data;
148160             }
148161         }, post.async);
148162
148163         if (!post.async) {
148164             return _packet({
148165                 fullPath: post.path,
148166                 blobData: val
148167             });
148168         }
148169     },
148170     rename: function (get, post, baton) {
148171         cache.file.rename(post.path, post.newName);
148172         return _packet();
148173     },
148174     saveFile: function (get, post, baton) {
148175         cache.file.saveFile(post.path, post.blob);
148176         return _packet();
148177     }
148178 };
148179
148180 });
148181 define('ripple/platform/webworks.core/2.0.0/server/io/dir', function (require, exports, module) {
148182 /*
148183  * Copyright 2011 Research In Motion Limited.
148184  *
148185  * Licensed under the Apache License, Version 2.0 (the "License");
148186  * you may not use this file except in compliance with the License.
148187  * You may obtain a copy of the License at
148188  *
148189  *     http://www.apache.org/licenses/LICENSE-2.0
148190  *
148191  * Unless required by applicable law or agreed to in writing, software
148192  * distributed under the License is distributed on an "AS IS" BASIS,
148193  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
148194  * See the License for the specific language governing permissions and
148195  * limitations under the License.
148196  */
148197 var cache = require('ripple/platform/webworks.core/2.0.0/fsCache');
148198
148199 function _packet(data) {
148200     return {
148201         code: 1,
148202         data: data
148203     };
148204 }
148205
148206 module.exports = {
148207     createNewDir: function (get, post, baton) {
148208         cache.dir.createNewDir(post.path);
148209         return _packet();
148210     },
148211     deleteDirectory: function (get, post, baton) {
148212         cache.dir.deleteDirectory(post.path, post.recursive);
148213         return _packet();
148214     },
148215     exists: function (get, post, baton) {
148216         return _packet(cache.dir.exists(post.path));
148217     },
148218     getParentDirectory: function (get, post, baton) {
148219         return _packet(cache.dir.getParentDirectory(post.path));
148220     },
148221     listDirectories: function (get, post, baton) {
148222         return _packet(cache.dir.listDirectories(post.path));
148223     },
148224     listFiles: function (get, post, baton) {
148225         return _packet(cache.dir.listFiles(post.path));
148226     },
148227     rename: function (get, post, baton) {
148228         cache.dir.rename(post.path, post.newName);
148229         return _packet();
148230     }
148231 };
148232
148233 });
148234 define('ripple/platform/webworks.core/2.0.0/server/system', function (require, exports, module) {
148235 /*
148236  *  Copyright 2011 Research In Motion Limited.
148237  *
148238  * Licensed under the Apache License, Version 2.0 (the "License");
148239  * you may not use this file except in compliance with the License.
148240  * You may obtain a copy of the License at
148241  *
148242  * http://www.apache.org/licenses/LICENSE-2.0
148243  *
148244  * Unless required by applicable law or agreed to in writing, software
148245  * distributed under the License is distributed on an "AS IS" BASIS,
148246  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
148247  * See the License for the specific language governing permissions and
148248  * limitations under the License.
148249  */
148250 var deviceSettings = require('ripple/deviceSettings'),
148251     devices = require('ripple/devices'),
148252     app = require('ripple/app'),
148253     client = require('ripple/platform/webworks.core/2.0.0/client/system'),
148254     utils = require('ripple/utils'),
148255     notifications = require('ripple/notifications'),
148256     constants = require('ripple/constants'),
148257     platform = require('ripple/platform'),
148258     _self;
148259
148260 function _is(feature) {
148261     return {
148262         allowedFor: function (location) {
148263             return feature && feature.URIs.some(function (uri) {
148264                 return uri.value === location ||
148265                       (location.indexOf(uri.value) >= 0 && uri.subdomains);
148266             });
148267         }
148268     };
148269 }
148270
148271 _self = {
148272     hasCapability: function (args) {
148273         var capabilities = devices.getCurrentDevice().capabilities;
148274         return {
148275             code: 1,
148276             data: capabilities ? capabilities.some(function (type) {
148277                 return type === args.capability;
148278             }) : false
148279         };
148280     },
148281     isMassStorageActive: function () {
148282         return {code: 1, data: deviceSettings.retrieveAsBoolean("system.isMassStorageActive")};
148283     },
148284     hasDataCoverage: function () {
148285         return {code: 1, data: deviceSettings.retrieveAsBoolean("system.hasDataCoverage")};
148286     },
148287     softwareVersion: function () {
148288         return {code: 1, data: devices.getCurrentDevice().osVersion};
148289     },
148290     model: function () {
148291         return {code: 1, data: devices.getCurrentDevice().model};
148292     },
148293     scriptApiVersion: function () {
148294         return {code: 1, data: platform.current().version};
148295     },
148296     setHomeScreenBackground: function (args) {
148297         var path = args.filePath,
148298             msg = "Set home screen background to " + path + ".";
148299         notifications.openNotification("normal", msg);
148300         return {code: 1};
148301     },
148302     hasPermission: function (args) {
148303         var info = app.getInfo(),
148304             feature = info.features ? info.features[args.desiredModule] : null;
148305
148306         return {code: 1, data: feature === null || _is(feature).allowedFor(utils.location().href) ? client.ALLOW : client.DENY};
148307     },
148308     network: function () {
148309         return {code: 1, data: deviceSettings.retrieve("system.network")};
148310     }
148311 };
148312
148313 module.exports = _self;
148314
148315 });
148316 define('ripple/platform/webworks.core/2.0.0/server/dialog', function (require, exports, module) {
148317 /*
148318  *  Copyright 2011 Research In Motion Limited.
148319  *
148320  * Licensed under the Apache License, Version 2.0 (the "License");
148321  * you may not use this file except in compliance with the License.
148322  * You may obtain a copy of the License at
148323  *
148324  * http://www.apache.org/licenses/LICENSE-2.0
148325  *
148326  * Unless required by applicable law or agreed to in writing, software
148327  * distributed under the License is distributed on an "AS IS" BASIS,
148328  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
148329  * See the License for the specific language governing permissions and
148330  * limitations under the License.
148331  */
148332 var event = require('ripple/event'),
148333     devices = require('ripple/devices'),
148334     ui = require('ripple/ui'),
148335     utils = require('ripple/utils'),
148336     isDialogVisible = false,
148337     visibleDialogArgs,
148338     _self;
148339
148340 function closeDialog() {
148341     var buttonsDiv = document.getElementById("dialog-buttons"),
148342         messageDiv = document.getElementById("dialog-message");
148343
148344     ui.hideOverlay("dialog-window", function (dialog) {
148345         buttonsDiv.innerHTML = "";
148346         messageDiv.innerHTML = "";
148347         isDialogVisible = false;
148348     });
148349 }
148350
148351 event.on("LayoutChanged", function () {
148352     if (isDialogVisible) {
148353         closeDialog();
148354         //Used to resize dialog on orientation change
148355         _self.ask(visibleDialogArgs);
148356     }
148357 });
148358
148359 _self = {
148360
148361     ask: function (args, post, baton) {
148362         if (!args) {
148363             throw ("No arguments provided");
148364         } else if (!args.buttons || !args.message) {
148365             throw ("Invalid arguments");
148366         }
148367         baton.take();
148368         visibleDialogArgs = args;
148369
148370         ui.showOverlay("dialog-window", function (dialog) {
148371             var container = document.getElementById("viewport-container"),
148372                 height = window.getComputedStyle(container, null).getPropertyValue("height"),
148373                 width = window.getComputedStyle(container, null).getPropertyValue("width"),
148374                 sizeDiv = document.getElementById("dialog-wrapper"),
148375                 positionDiv = document.getElementById("dialog-window"),
148376                 titleDiv = document.getElementById("dialog-title"),
148377                 buttonsDiv = document.getElementById("dialog-buttons"),
148378                 messageDiv = document.getElementById("dialog-message"),
148379                 position, size;
148380
148381             if (!messageDiv || !buttonsDiv) {
148382                 return;
148383             }
148384
148385             dialog.setAttribute("style", "display:-webkit-box;height:" + height + "; width:" + width + ";");
148386
148387             position = "overlay-dialog";
148388             size = "overlay-dialog-wrapper";
148389
148390             if (args.settings && args.settings.position) {
148391                 position += " overlay-dialog-" + args.settings.position;
148392             }
148393
148394             if (args.settings && args.settings.size) {
148395                 size += " overlay-dialog-wrapper-" + args.settings.size;
148396             }
148397
148398             positionDiv.setAttribute("class", position);
148399             sizeDiv.setAttribute("class", size);
148400
148401             titleDiv.innerHTML = args.settings && args.settings.title ? args.settings.title : "";
148402             messageDiv.innerHTML = args.message;
148403             isDialogVisible = true;
148404
148405             args.buttons.forEach(function (button) {
148406                 var buttonElement = utils.createElement("input", {
148407                     "type": "button",
148408                     "value": button
148409                 });
148410                 buttonElement.addEventListener("click", function () {
148411                     var buttonIndex = args.buttons.indexOf(button);
148412                     closeDialog();
148413                     baton.pass({code: 1, data: buttonIndex});
148414                 });
148415                 buttonsDiv.appendChild(buttonElement);
148416             });
148417         }, true);
148418     }
148419 };
148420
148421 module.exports = _self;
148422
148423 });
148424 define('ripple/platform/wac/1.0/CallRecordTypes', function (require, exports, module) {
148425 /*
148426  *  Copyright 2011 Research In Motion Limited.
148427  *
148428  * Licensed under the Apache License, Version 2.0 (the "License");
148429  * you may not use this file except in compliance with the License.
148430  * You may obtain a copy of the License at
148431  *
148432  * http://www.apache.org/licenses/LICENSE-2.0
148433  *
148434  * Unless required by applicable law or agreed to in writing, software
148435  * distributed under the License is distributed on an "AS IS" BASIS,
148436  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
148437  * See the License for the specific language governing permissions and
148438  * limitations under the License.
148439  */
148440 module.exports = {
148441     RECEIVED: "received",
148442     OUTGOING: "outgoing",
148443     MISSED: "missed"
148444 };
148445
148446 });
148447 define('ripple/platform/wac/1.0/ApplicationTypes', function (require, exports, module) {
148448 /*
148449  *  Copyright 2011 Research In Motion Limited.
148450  *
148451  * Licensed under the Apache License, Version 2.0 (the "License");
148452  * you may not use this file except in compliance with the License.
148453  * You may obtain a copy of the License at
148454  *
148455  * http://www.apache.org/licenses/LICENSE-2.0
148456  *
148457  * Unless required by applicable law or agreed to in writing, software
148458  * distributed under the License is distributed on an "AS IS" BASIS,
148459  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
148460  * See the License for the specific language governing permissions and
148461  * limitations under the License.
148462  */
148463 var utils = require('ripple/utils'),
148464     constants = require('ripple/constants'),
148465     _self = {};
148466
148467 utils.forEach(constants.PLATFORMS.WAC.APPLICATIONS, function (application) {
148468     _self.__defineGetter__(application, function () {
148469         return application;
148470     });
148471 });
148472
148473 module.exports = _self;
148474
148475 });
148476 define('ripple/platform/wac/1.0/Device', function (require, exports, module) {
148477 /*
148478  *  Copyright 2011 Research In Motion Limited.
148479  *
148480  * Licensed under the Apache License, Version 2.0 (the "License");
148481  * you may not use this file except in compliance with the License.
148482  * You may obtain a copy of the License at
148483  *
148484  * http://www.apache.org/licenses/LICENSE-2.0
148485  *
148486  * Unless required by applicable law or agreed to in writing, software
148487  * distributed under the License is distributed on an "AS IS" BASIS,
148488  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
148489  * See the License for the specific language governing permissions and
148490  * limitations under the License.
148491  */
148492 var constants = require('ripple/constants'),
148493     exception = require('ripple/exception'),
148494     _console = require('ripple/console'),
148495     utils = require('ripple/utils'),
148496     notifications = require('ripple/notifications'),
148497     ApplicationTypes = require('ripple/platform/wac/1.0/ApplicationTypes'),
148498     Exception = require('ripple/platform/wac/1.0/Exception'),
148499     ExceptionTypes = require('ripple/platform/wac/1.0/ExceptionTypes'),
148500     _applicationTypes = {
148501         FILES: "FILES",
148502         MEDIAPLAYER: "MEDIAPLAYER",
148503         PHONECALL: "PHONECALL",
148504         PICTURES: "PICTURES"
148505     },
148506     _self;
148507
148508 function _throwUnsupportedException(method) {
148509     exception.raise(ExceptionTypes.UNSUPPORTED, "Method not supported." + (method || ""), new Exception());
148510 }
148511
148512 _self = {
148513     // Properties
148514     clipboardString: undefined,
148515     widgetEngineName: undefined,
148516     widgetEngineProvider: undefined,
148517     widgetEngineVersion: undefined,
148518
148519     // Methods
148520     getAvailableApplications: function () {
148521         return constants.PLATFORMS.WAC.APPLICATIONS || [];
148522     },
148523
148524     getDirectoryFileNames: function () {
148525         _throwUnsupportedException("Device.getDirectoryFileNames");
148526     },
148527     getFile: function () {
148528         _throwUnsupportedException("Device.getFile");
148529     },
148530
148531     launchApplication: function launchApplication(application, startParameter) {
148532         if (!application || typeof(application) !== "string") {
148533             exception.raise(ExceptionTypes.INVALID_PARAMETER,
148534                     "Invalid argument 'application' at Device.launchApplication(): expected to be of type 'string' but was of type: " + (application ? typeof(application) : "null"),
148535                     Exception);
148536         }
148537
148538         if (startParameter && typeof(startParameter) !== "string") {
148539             exception.raise(ExceptionTypes.INVALID_PARAMETER,
148540                     "Invalid argument 'startParameter' at Device.launchApplication(): expected to be 'string' but was : " + typeof(startParameter),
148541                     Exception);
148542         }
148543
148544         // rudimentary implementation for now
148545         var message = "The widget has requested application: '" + application + "' to be launched. \n\n";
148546
148547         if (startParameter) {
148548             message += "The following start parameter was sent in: " + startParameter + "\n\n";
148549         }
148550
148551         if (_applicationTypes[application] && !startParameter) {
148552             message += "Launching this application can also be done with an optional startParameter which was not provided" + "\n\n";
148553         }
148554
148555         if (!ApplicationTypes[application]) {
148556             message += "Note: the application requested is not part of the common values specified by the WAC API.";
148557         }
148558
148559         notifications.openNotification("normal", message);
148560         _console.log(message);
148561     },
148562
148563     copyFile: function () {
148564         _throwUnsupportedException("Device.copyFile");
148565     },
148566     deleteFile: function () {
148567         _throwUnsupportedException("Device.deleteFile");
148568     },
148569     findFiles: function () {
148570         _throwUnsupportedException("Device.findFiles");
148571     },
148572     getFileSystemRoots: function () {
148573         _throwUnsupportedException("Device.getFileSystemRoots");
148574     },
148575     getFileSystemSize: function () {
148576         _throwUnsupportedException("Device.getFileSystemSize");
148577     },
148578     moveFile: function () {
148579         _throwUnsupportedException("Device.moveFile");
148580     },
148581     onFilesFound: function () {
148582         _throwUnsupportedException("Device.onFilesFound");
148583     },
148584     setRingtone: function () {
148585         _throwUnsupportedException("Device.setRingtone");
148586     },
148587
148588     vibrate: function (duration) {
148589         utils.validateArgumentType(duration, "number", ExceptionTypes.INVALID_PARAMETER, "duration paramter is not a number", new Exception());
148590         notifications.openNotification("normal", "Vibrating for " + duration + " second(s).");
148591     }
148592
148593 };
148594
148595 _self.__defineGetter__("widgetEngineName", function () {
148596     return constants.PLATFORMS.WAC.DEVICE.WIDGET_ENGINE_NAME;
148597 });
148598
148599 _self.__defineGetter__("widgetEngineProvider", function () {
148600     return constants.PLATFORMS.WAC.DEVICE.WIDGET_ENGINE_PROVIDER;
148601 });
148602
148603 _self.__defineGetter__("widgetEngineVersion", function () {
148604     return constants.PLATFORMS.WAC.DEVICE.WIDGET_ENGINE_VERSION;
148605 });
148606
148607 module.exports = _self;
148608
148609 });
148610 define('ripple/platform/wac/1.0/Account', function (require, exports, module) {
148611 /*
148612  *  Copyright 2011 Research In Motion Limited.
148613  *
148614  * Licensed under the Apache License, Version 2.0 (the "License");
148615  * you may not use this file except in compliance with the License.
148616  * You may obtain a copy of the License at
148617  *
148618  * http://www.apache.org/licenses/LICENSE-2.0
148619  *
148620  * Unless required by applicable law or agreed to in writing, software
148621  * distributed under the License is distributed on an "AS IS" BASIS,
148622  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
148623  * See the License for the specific language governing permissions and
148624  * limitations under the License.
148625  */
148626 var deviceSettings = require('ripple/deviceSettings'),
148627     _self;
148628
148629 _self = {
148630     accountName: undefined,
148631     accountId: undefined
148632 };
148633
148634 _self.__defineGetter__("accountName", function () {
148635     return deviceSettings.retrieve("Account.accountName");
148636 });
148637
148638 _self.__defineGetter__("accountId", function () {
148639     return deviceSettings.retrieve("Account.accountId");
148640 });
148641
148642 module.exports = _self;
148643
148644 });
148645 define('ripple/platform/wac/1.0/AccountInfo', function (require, exports, module) {
148646 /*
148647  *  Copyright 2011 Research In Motion Limited.
148648  *
148649  * Licensed under the Apache License, Version 2.0 (the "License");
148650  * you may not use this file except in compliance with the License.
148651  * You may obtain a copy of the License at
148652  *
148653  * http://www.apache.org/licenses/LICENSE-2.0
148654  *
148655  * Unless required by applicable law or agreed to in writing, software
148656  * distributed under the License is distributed on an "AS IS" BASIS,
148657  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
148658  * See the License for the specific language governing permissions and
148659  * limitations under the License.
148660  */
148661 var deviceSettings = require('ripple/deviceSettings'),
148662     _self = {
148663         phoneUserUniqueId: undefined,
148664         phoneMSISDN: undefined,
148665         phoneOperatorName: undefined,
148666         userAccountBalance: undefined,
148667         userSubscriptionType: undefined
148668     };
148669
148670 _self.__defineGetter__("phoneUserUniqueId", function () {
148671     return deviceSettings.retrieve("AccountInfo.phoneUserUniqueId");
148672 });
148673
148674 _self.__defineGetter__("phoneMSISDN", function () {
148675     return deviceSettings.retrieve("AccountInfo.phoneMSISDN");
148676 });
148677
148678 _self.__defineGetter__("phoneOperatorName", function () {
148679     return deviceSettings.retrieve("AccountInfo.phoneOperatorName");
148680 });
148681
148682 _self.__defineGetter__("userAccountBalance", function () {
148683     return deviceSettings.retrieve("AccountInfo.userAccountBalance");
148684 });
148685
148686 _self.__defineGetter__("userSubscriptionType", function () {
148687     return deviceSettings.retrieve("AccountInfo.userSubscriptionType");
148688 });
148689
148690 module.exports = _self;
148691
148692 });
148693 define('ripple/platform/wac/1.0/DataNetworkInfo', function (require, exports, module) {
148694 /*
148695  *  Copyright 2011 Research In Motion Limited.
148696  *
148697  * Licensed under the Apache License, Version 2.0 (the "License");
148698  * you may not use this file except in compliance with the License.
148699  * You may obtain a copy of the License at
148700  *
148701  * http://www.apache.org/licenses/LICENSE-2.0
148702  *
148703  * Unless required by applicable law or agreed to in writing, software
148704  * distributed under the License is distributed on an "AS IS" BASIS,
148705  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
148706  * See the License for the specific language governing permissions and
148707  * limitations under the License.
148708  */
148709 var event = require('ripple/event'),
148710     utils = require('ripple/utils'),
148711     _console = require('ripple/console'),
148712     deviceSettings = require('ripple/deviceSettings'),
148713     DataNetworkConnectionTypes = require('ripple/platform/wac/1.0/DataNetworkConnectionTypes'),
148714     Exception = require('ripple/platform/wac/1.0/Exception'),
148715     ExceptionTypes = require('ripple/platform/wac/1.0/ExceptionTypes'),
148716
148717 _self = {
148718     isDataNetworkConnected: undefined,
148719     networkConnectionType: undefined,
148720     onNetworkConnectionChanged: undefined,
148721
148722     getNetworkConnectionName: function (networkConnectionType) {
148723         var foundConnectionType;
148724         utils.validateArgumentType(networkConnectionType, "string", ExceptionTypes.INVALID_PARAMETER, "networkConnectionType is invalid, expected a string", new Exception());
148725         foundConnectionType = DataNetworkConnectionTypes[networkConnectionType.toUpperCase()];
148726         return foundConnectionType || null;
148727     }
148728 };
148729
148730 event.on("DataNetworkConnectionChanged", function (newConnectionName) {
148731     var callback = _self.onNetworkConnectionChanged,
148732         msg = "Fired onNetworkConnectionChanged with newConnectionName: " + newConnectionName;
148733
148734     if (callback && typeof callback === "function") {
148735         callback.apply(null, [newConnectionName]);
148736     }
148737     else {
148738         msg += " --> BUT there was no registered callback found.";
148739     }
148740
148741     _console.log(msg);
148742 });
148743
148744 _self.__defineGetter__("isDataNetworkConnected", function () {
148745     return deviceSettings.retrieveAsBoolean("DataNetworkInfo.isDataNetworkConnected");
148746 });
148747
148748 _self.__defineGetter__("networkConnectionType", function () {
148749     var value = deviceSettings.retrieve("DataNetworkInfo.networkConnectionType");
148750     return value instanceof Array ? value : [value];
148751 });
148752
148753 module.exports = _self;
148754
148755 });
148756 define('ripple/platform/wac/1.0/MessageTypes', function (require, exports, module) {
148757 /*
148758  *  Copyright 2011 Research In Motion Limited.
148759  *
148760  * Licensed under the Apache License, Version 2.0 (the "License");
148761  * you may not use this file except in compliance with the License.
148762  * You may obtain a copy of the License at
148763  *
148764  * http://www.apache.org/licenses/LICENSE-2.0
148765  *
148766  * Unless required by applicable law or agreed to in writing, software
148767  * distributed under the License is distributed on an "AS IS" BASIS,
148768  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
148769  * See the License for the specific language governing permissions and
148770  * limitations under the License.
148771  */
148772 module.exports = {
148773     EmailMessage: "email",
148774     MMSMessage: "mms",
148775     SMSMessage: "sms"
148776 };
148777
148778 });
148779 define('ripple/platform/wac/1.0/MessageFolderTypes', function (require, exports, module) {
148780 /*
148781  *  Copyright 2011 Research In Motion Limited.
148782  *
148783  * Licensed under the Apache License, Version 2.0 (the "License");
148784  * you may not use this file except in compliance with the License.
148785  * You may obtain a copy of the License at
148786  *
148787  * http://www.apache.org/licenses/LICENSE-2.0
148788  *
148789  * Unless required by applicable law or agreed to in writing, software
148790  * distributed under the License is distributed on an "AS IS" BASIS,
148791  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
148792  * See the License for the specific language governing permissions and
148793  * limitations under the License.
148794  */
148795 module.exports = {
148796     DRAFTS: "drafts",
148797     INBOX: "inbox",
148798     OUTBOX: "outbox",
148799     SENTBOX: "sentbox"
148800 };
148801
148802 });
148803 define('ripple/platform/wac/1.0/spec', function (require, exports, module) {
148804 module.exports = {
148805
148806     id: "wac",
148807     version: "1.0",
148808     name: "WAC",
148809     type: "plaform",
148810
148811     persistencePrefix: "wac-",
148812
148813     config: require('ripple/platform/wac/1.0/spec/config'),
148814     device: require('ripple/platform/wac/1.0/spec/device'),
148815     ui: require('ripple/platform/wac/1.0/spec/ui'),
148816     events: require('ripple/platform/wac/1.0/spec/events'),
148817
148818     objects: {
148819         navigator: {
148820             path: "w3c/1.0/navigator"
148821         },
148822         WidgetManager: {
148823             path: "wac/1.0/WidgetManager",
148824             feature: "http://jil.org/jil/api/1.1.1/widgetmanager"
148825         },
148826         Widget: {
148827             path: "wac/1.0/Widget",
148828             feature: "http://jil.org/jil/api/1.1/widget",
148829             children: {
148830                 Device: {
148831                     path: "wac/1.0/Device",
148832                     feature: "http://jil.org/jil/api/1.1/device",
148833                     children: {
148834                         AccountInfo: {
148835                             path: "wac/1.0/AccountInfo",
148836                             feature: "http://jil.org/jil/api/1.1/accountinfo"
148837                         },
148838                         ApplicationTypes: {
148839                             path: "wac/1.0/ApplicationTypes",
148840                             feature: "http://jil.org/jil/api/1.1.5/applicationtypes"
148841                         },
148842                         DataNetworkInfo: {
148843                             path: "wac/1.0/DataNetworkInfo",
148844                             feature: "http://jil.org/jil/api/1.1.1/datanetworkinfo",
148845                             children: {
148846                                 DataNetworkConnectionTypes: {
148847                                     path: "wac/1.0/DataNetworkConnectionTypes"
148848                                 }
148849                             }
148850                         },
148851                         DeviceInfo: {
148852                             path: "wac/1.0/DeviceInfo",
148853                             feature: "http://jil.org/jil/api/1.1/deviceinfo"
148854                         },
148855                         DeviceStateInfo: {
148856                             path: "wac/1.0/DeviceStateInfo",
148857                             feature: "http://jil.org/jil/api/1.1/devicestateinfo",
148858                             children: {
148859                                 Config: {
148860                                     path: "wac/1.0/Config",
148861                                     feature: "http://jil.org/jil/api/1.1/config"
148862                                 },
148863                                 AccelerometerInfo: {
148864                                     path: "wac/1.0/AccelerometerInfo",
148865                                     feature: "http://jil.org/jil/api/1.1/accelerometerinfo"
148866                                 }
148867                             }
148868                         },
148869                         File: {
148870                             path: "wac/1.0/File",
148871                             feature: "http://jil.org/jil/api/1.1.1/file"
148872                         },
148873                         PositionInfo: {
148874                             path: "wac/1.0/PositionInfo",
148875                             feature: "http://jil.org/jil/api/1.1/positioninfo"
148876                         },
148877                         RadioInfo: {
148878                             path: "wac/1.0/RadioInfo",
148879                             feature: "http://jil.org/jil/api/1.1.1/radioinfo",
148880                             children: {
148881                                 RadioSignalSourceTypes: {
148882                                     path: "wac/1.0/RadioSignalSourceTypes",
148883                                     feature: "http://jil.org/jil/api/1.1.5/radiosignalsourcetypes"
148884                                 }
148885                             }
148886                         },
148887                         PowerInfo: {
148888                             path: "wac/1.0/PowerInfo",
148889                             feature: "http://jil.org/jil/api/1.1/powerinfo"
148890                         }
148891                     }
148892                 },
148893                 ExceptionTypes: {
148894                     path: "wac/1.0/ExceptionTypes",
148895                     feature: "http://jil.org/jil/api/1.1.5/exceptiontypes"
148896                 },
148897                 Exception: {
148898                     path: "wac/1.0/Exception",
148899                     feature: "http://jil.org/jil/api/1.1.5/exception"
148900                 },
148901                 Multimedia: {
148902                     path: "wac/1.0/Multimedia",
148903                     feature: "http://jil.org/jil/api/1.1/multimedia",
148904                     children: {
148905                         Camera: {
148906                             path: "wac/1.0/Camera",
148907                             feature: "http://jil.org/jil/api/1.1.2/camera"
148908                         },
148909                         AudioPlayer: {
148910                             path: "wac/1.0/AudioPlayer",
148911                             feature: "http://jil.org/jil/api/1.1/audioplayer"
148912                         },
148913                         VideoPlayer: {
148914                             path: "wac/1.0/VideoPlayer",
148915                             feature: "http://jil.org/jil/api/1.1.2/videoplayer"
148916                         }
148917                     }
148918                 },
148919                 Telephony: {
148920                     path: "wac/1.0/Telephony",
148921                     feature: "http://jil.org/jil/api/1.1.1/telephony",
148922                     children: {
148923                         CallRecord: {
148924                             path: "wac/1.0/CallRecord",
148925                             feature: "http://jil.org/jil/api/1.1/callrecord"
148926                         },
148927                         CallRecordTypes: {
148928                             path: "wac/1.0/CallRecordTypes",
148929                             feature: "http://jil.org/jil/api/1.1.1/callrecordtypes"
148930                         }
148931                     }
148932                 },
148933                 PIM: {
148934                     path: "wac/1.0/PIM",
148935                     feature: "http://jil.org/jil/api/1.1.1/pim",
148936                     children: {
148937                         AddressBookItem: {
148938                             path: "wac/1.0/AddressBookItem",
148939                             feature: "http://jil.org/jil/api/1.1/addressbookitem"
148940                         },
148941                         CalendarItem: {
148942                             path: "wac/1.0/CalendarItem",
148943                             feature: "http://jil.org/jil/api/1.1/calendaritem"
148944                         },
148945                         EventRecurrenceTypes: {
148946                             path: "wac/1.0/EventRecurrenceTypes",
148947                             feature: "http://jil.org/jil/api/1.1/eventrecurrencetypes"
148948                         }
148949                     }
148950                 },
148951                 Messaging: {
148952                     path: "wac/1.0/Messaging",
148953                     feature: "http://jil.org/jil/api/1.1/messaging",
148954                     children: {
148955                         Account: {
148956                             path: "wac/1.0/Account",
148957                             feature: "http://jil.org/jil/api/1.1/account"
148958                         },
148959                         Attachment: {
148960                             path: "wac/1.0/Attachment",
148961                             feature: "http://jil.org/jil/api/1.1/attachment"
148962                         },
148963                         Message: {
148964                             path: "wac/1.0/Message",
148965                             feature: "http://jil.org/jil/api/1.1/message"
148966                         },
148967                         MessageFolderTypes: {
148968                             path: "wac/1.0/MessageFolderTypes",
148969                             feature: "http://jil.org/jil/api/1.1.4/messagefoldertypes"
148970                         },
148971                         MessageQuantities: {
148972                             path: "wac/1.0/MessageQuantities",
148973                             feature: "http://jil.org/jil/api/1.1/messagequantities"
148974                         },
148975                         MessageTypes: {
148976                             path: "wac/1.0/MessageTypes",
148977                             feature: "http://jil.org/jil/api/1.1/messagetypes"
148978                         }
148979                     }
148980                 }
148981             }
148982         }
148983     }
148984
148985 };
148986
148987 });
148988 define('ripple/platform/wac/1.0/PIM', function (require, exports, module) {
148989 /*
148990  *  Copyright 2011 Research In Motion Limited.
148991  *
148992  * Licensed under the Apache License, Version 2.0 (the "License");
148993  * you may not use this file except in compliance with the License.
148994  * You may obtain a copy of the License at
148995  *
148996  * http://www.apache.org/licenses/LICENSE-2.0
148997  *
148998  * Unless required by applicable law or agreed to in writing, software
148999  * distributed under the License is distributed on an "AS IS" BASIS,
149000  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
149001  * See the License for the specific language governing permissions and
149002  * limitations under the License.
149003  */
149004 var _self,
149005     exception = require('ripple/exception'),
149006     Exception = require('ripple/platform/wac/1.0/Exception'),
149007     ExceptionTypes = require('ripple/platform/wac/1.0/ExceptionTypes'),
149008     AddressBookItem = require('ripple/platform/wac/1.0/AddressBookItem'),
149009     CalendarItem = require('ripple/platform/wac/1.0/CalendarItem'),
149010     utils = require('ripple/utils'),
149011     db = require('ripple/db'),
149012     constants = require('ripple/constants');
149013
149014 function _throwUnsupportedException(method) {
149015     exception.raise(ExceptionTypes.UNSUPPORTED, "Method not supported." + (method || ""), new Exception());
149016 }
149017
149018 function _toAddressBookItem(contact) {
149019     if (!contact) {
149020         return null;
149021     }
149022
149023     var addressBookItem = new AddressBookItem();
149024
149025     utils.forEach(contact, function (prop, key) {
149026         addressBookItem[key] = contact[key];
149027     });
149028
149029     return addressBookItem;
149030 }
149031
149032 function _toCalendarItem(item) {
149033     if (!item) {
149034         return null;
149035     }
149036
149037     var calendarItem = new CalendarItem();
149038
149039     utils.forEach(item, function (prop, key) {
149040         calendarItem[key] = item[key];
149041     });
149042
149043     return calendarItem;
149044 }
149045
149046 function _getData(type) {
149047     var data = db.retrieveObject(type) || [];
149048     return data;
149049 }
149050
149051 function _saveData(type, items) {
149052     db.saveObject(type, items);
149053 }
149054
149055 function _getContacts() {
149056     var contacts = _getData(constants.PIM.ADDRESS_LIST_KEY),
149057         gord,
149058         dan,
149059         brent,
149060         pj,
149061         mark;
149062
149063     if (contacts.length === 0) {
149064
149065         gord = new AddressBookItem();
149066         gord.addressBookItemId = "0";
149067         gord.fullName = "Gord Tanner";
149068         gord.eMail = "gord@tinyHippos.com";
149069         gord.company = "tinyHippos Inc";
149070         gord.title = "Code Poet";
149071         gord.address = "121 Charles Street W, Kitchener, Ontario, Canada";
149072
149073         dan = new AddressBookItem();
149074         dan.addressBookItemId = "1";
149075         dan.fullName = "Dan Silivestru";
149076         dan.eMail = "dan@tinyHippos.com";
149077         dan.company = "tinyHippos Inc";
149078         dan.title = "Co-Founder And Chief Technology Officer";
149079         dan.address = "121 Charles Street W, Kitchener, Ontario, Canada";
149080
149081         pj = new AddressBookItem();
149082         pj.addressBookItemId = "2";
149083         pj.fullName = "PJ Lowe";
149084         pj.eMail = "pj@tinyHippos.com";
149085         pj.company = "tinyHippos Inc";
149086         pj.title = "Co-Founder And Chief Operations Officer";
149087         pj.address = "121 Charles Street W, Kitchener, Ontario, Canada";
149088
149089         brent = new AddressBookItem();
149090         brent.addressBookItemId = "2";
149091         brent.fullName = "Brent Lintner";
149092         brent.eMail = "brent@tinyHippos.com";
149093         brent.company = "tinyHippos Inc";
149094         brent.title = "Co-Founder And Chief Operations Officer";
149095         brent.address = "121 Charles Street W, Kitchener, Ontario, Canada";
149096
149097         mark = new AddressBookItem();
149098         mark.addressBookItemId = "3";
149099         mark.fullName = "Mark McArdle";
149100         mark.eMail = "mark@tinyHippos.com";
149101         mark.company = "tinyHippos Inc";
149102         mark.title = "Chief Executive Officer";
149103         mark.address = "121 Charles Street W, Kitchener, Ontario, Canada";
149104
149105         contacts.push(gord);
149106         contacts.push(dan);
149107         contacts.push(pj);
149108         contacts.push(brent);
149109         contacts.push(mark);
149110
149111         _saveData(constants.PIM.ADDRESS_LIST_KEY, contacts);
149112     }
149113     return contacts.map(_toAddressBookItem);
149114 }
149115
149116 function _getEvents() {
149117     var events = _getData(constants.PIM.CALENDAR_LIST_KEY);
149118     return events.map(_toCalendarItem);
149119 }
149120
149121 function _get(type, id, fetchIDFunc) {
149122     var items = _getData(type);
149123     return items.reduceRight(function (match, item) {
149124         return fetchIDFunc(item) === id ? item : match;
149125     }, null);
149126 }
149127
149128 function _getAddressBookID(item) {
149129     return item.addressBookItemId;
149130 }
149131
149132 function _getCalendarID(item) {
149133     return item.calendarItemId;
149134 }
149135
149136 function _getContact(id) {
149137     return _toAddressBookItem(_get(constants.PIM.ADDRESS_LIST_KEY, id, _getAddressBookID));
149138 }
149139
149140 function _getEvent(id) {
149141     return _toCalendarItem(_get(constants.PIM.CALENDAR_LIST_KEY, id, _getCalendarID));
149142 }
149143
149144 function _add(type, item, idProp) {
149145     var items = _getData(type);
149146
149147     if (!item[idProp]) {
149148         item[idProp] = Math.uuid(undefined, 16);
149149     }
149150
149151     items.push(item);
149152     _saveData(type, items);
149153 }
149154
149155 function _delete(type, id, fetchIDFunc) {
149156     var items = _getData(type);
149157
149158     _saveData(type, items.filter(function (item) {
149159         return fetchIDFunc(item) !== id;
149160     }));
149161 }
149162
149163 function _validateArgs(min, max, len) {
149164     utils.validateNumberOfArguments(min, max, len,
149165         ExceptionTypes.INVALID_PARAMETER, "invalid number of parameters", new Exception());
149166 }
149167
149168 function _validateType(arg, argType) {
149169     utils.validateArgumentType(arg, argType,
149170         ExceptionTypes.INVALID_PARAMETER,  "argument of wrong type provided",
149171         new Exception());
149172 }
149173
149174 function _validateAddressBookItem(item) {
149175     if ((item instanceof AddressBookItem) === false) {
149176         exception.raise(ExceptionTypes.INVALID_PARAMETER, "invalid contact, not instance of AddressBookItem.", new Exception());
149177     }
149178 }
149179
149180 _self = {
149181     addAddressBookItem: function (contact) {
149182         _validateArgs(1, 1, arguments.length);
149183         _validateAddressBookItem(contact);
149184
149185         _add(constants.PIM.ADDRESS_LIST_KEY, contact, "addressBookItemId");
149186     },
149187     createAddressBookGroup: function (groupName) {
149188         _throwUnsupportedException("Widget.PIM.createAddressBookGroup");
149189     },
149190     createAddressBookItem: function () {
149191         return new AddressBookItem();
149192     },
149193     deleteAddressBookItem: function (contactid) {
149194         _validateArgs(1, 1, arguments.length);
149195         _validateType(contactid, "string");
149196         _delete(constants.PIM.ADDRESS_LIST_KEY, contactid, _getAddressBookID);
149197     },
149198     deleteAddressBookGroup: function (groupName) {
149199         _throwUnsupportedException("Widget.PIM.deleteAddressBookGroup");
149200     },
149201     getAddressBookItem: function (contactid) {
149202         _validateArgs(1, 1, arguments.length);
149203         _validateType(contactid, "string");
149204         return _getContact(contactid);
149205     },
149206     getAddressBookItemsCount: function () {
149207         _validateArgs(0, 0, arguments.length);
149208         var items = _getContacts();
149209         return items.length;
149210     },
149211     getAvailableAddressGroupNames: function () {
149212         _throwUnsupportedException("Widget.PIM.getAvailableAddressGroupNames");
149213     },
149214     getAddressBookGroupMembers: function (groupName) {
149215         _throwUnsupportedException("Widget.PIM.getAddressBookGroupMembers");
149216     },
149217     findAddressBookItems: function (comparisonContact, startInx, endInx) {
149218         _validateArgs(3, 3, arguments.length);
149219         utils.validateMultipleArgumentTypes([comparisonContact, startInx, endInx], ["object", "number", "number"], ExceptionTypes.INVALID_PARAMETER,  "argument of wrong type provided",
149220             new Exception());
149221
149222         if (endInx < 0) {
149223             exception.raise(ExceptionTypes.INVALID_PARAMETER, "invalid number of parameters", new Exception());
149224         }
149225
149226         startInx = startInx < 0 ? 0 : startInx;
149227
149228         var contacts = _getContacts();
149229         utils.find(comparisonContact, contacts, startInx, endInx, _self.onAddressBookItemsFound);
149230     },
149231
149232     addCalendarItem: function (calendarItem) {
149233         _validateArgs(1, 1, arguments.length);
149234         _add(constants.PIM.CALENDAR_LIST_KEY, calendarItem, "calendarItemId");
149235     },
149236     deleteCalendarItem: function (calendarId) {
149237         _validateArgs(1, 1, arguments.length);
149238         _delete(constants.PIM.CALENDAR_LIST_KEY, calendarId, _getCalendarID);
149239     },
149240     getCalendarItem: function (calendarId) {
149241         _validateArgs(1, 1, arguments.length);
149242         return _getEvent(calendarId);
149243     },
149244     findCalendarItems: function (itemToMatch, startInx, endInx) {
149245         _validateArgs(1, 3, arguments.length);
149246         var events = _getEvents();
149247         utils.find(itemToMatch, events, startInx, endInx, _self.onCalendarItemsFound);
149248     },
149249     getCalendarItems: function (startTime, endTime) {
149250         var events = _getEvents();
149251
149252         return events.reduce(function (matches, event) {
149253             if (event.eventStartTime >= startTime && event.eventStartTime <= endTime) {
149254                 matches.push(event);
149255             }
149256             return matches;
149257         }, []);
149258     },
149259     exportAsVCard: function (addressBookItems) {
149260         _throwUnsupportedException("Widget.PIM.exportAsVCard");
149261     },
149262
149263     onAddressBookItemsFound: undefined, // function (addressBookItemsFound) { }
149264     onCalendarItemsFound: undefined, // function (calendarItemsFound) { }
149265     onCalendarItemAlert: undefined, // function (calendarItem) { }
149266     onVCardExportingFinish: undefined // function (vCardFilePath) { }
149267 };
149268
149269 module.exports = _self;
149270
149271 });
149272 define('ripple/platform/wac/1.0/AudioPlayer', function (require, exports, module) {
149273 /*
149274  *  Copyright 2011 Research In Motion Limited.
149275  *
149276  * Licensed under the Apache License, Version 2.0 (the "License");
149277  * you may not use this file except in compliance with the License.
149278  * You may obtain a copy of the License at
149279  *
149280  * http://www.apache.org/licenses/LICENSE-2.0
149281  *
149282  * Unless required by applicable law or agreed to in writing, software
149283  * distributed under the License is distributed on an "AS IS" BASIS,
149284  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
149285  * See the License for the specific language governing permissions and
149286  * limitations under the License.
149287  */
149288 var constants = require('ripple/constants'),
149289     event = require('ripple/event'),
149290     exception = require('ripple/exception'),
149291     utils = require('ripple/utils'),
149292     fileSystem = require('ripple/fileSystem'),
149293     _console = require('ripple/console'),
149294     Exception = require('ripple/platform/wac/1.0/Exception'),
149295     ExceptionTypes = require('ripple/platform/wac/1.0/ExceptionTypes'),
149296     _self,
149297     _state = null,
149298     _STATES = constants.MULTIMEDIA.AUDIO_STATES,
149299     _currentAudioFile,
149300     _audio, _loopCount;
149301
149302 event.on("MultimediaAudioStateChanged", function updateAudioState(state) {
149303     _state = state;
149304     if (typeof _self.onStateChange === 'function') {
149305         _self.onStateChange.apply(_self, arguments);
149306     }
149307 });
149308
149309 _audio = utils.createElement("audio", {
149310     "id": "multimedia-audio"
149311 });
149312
149313 _audio.addEventListener('error', function () {
149314     _console.warn("AudioPlayer encountered an error: " + _audio.error.code);
149315     if (_audio.error.code === 4) {
149316         _console.warn("AudioPlayer error 4 could be caused by missing codecs");
149317     }
149318     _state = null;
149319     event.trigger("MultimediaAudioStateChanged", [null], true);
149320 });
149321
149322 _audio.addEventListener('ended', function handleAudioEnded() {
149323     event.trigger("MultimediaAudioStateChanged", [_STATES.COMPLETED], true);
149324     if (_loopCount > 1) {
149325         _self.open(_currentAudioFile);
149326         _self.play(_loopCount--);
149327     }
149328 });
149329
149330 document.getElementById("ui").appendChild(_audio);
149331
149332 function _validateAndSet(state, validStates, callbackBeforeSuccess) {
149333     var i, valid = false;
149334
149335     for (i = 0; i < validStates.length; i++) {
149336         if (validStates[i] === _state) {
149337             valid = true;
149338         }
149339     }
149340
149341     if (!valid) {
149342         _console.warn("Attempted to initiate AudioPlayer." + state +
149343             " in invalid state. current state: " + _state);
149344     } else {
149345         if (typeof(callbackBeforeSuccess) === "function") {
149346             callbackBeforeSuccess.apply();
149347         }
149348         event.trigger("MultimediaAudioStateChanged", [state], true);
149349     }
149350
149351     return valid;
149352 }
149353
149354 function _validateAudioType(fileUrl) {
149355     var matched = fileUrl.match(/\.(\w*)$/),
149356         type = matched ? matched[1] : "";
149357
149358     if (_audio && _audio.canPlayType("audio/" + type) === "") {
149359         _console.warn("Attempting to load an audio that might not work in the current browser [" + fileUrl + "]");
149360     }
149361 }
149362
149363 _self = {
149364     onStateChange: undefined,
149365
149366     open: function (fileUrl) {
149367         utils.validateNumberOfArguments(1, 1, arguments.length, ExceptionTypes.INVALID_PARAMETER, "Multimedia.js.AudioPlayer.open wrong number of arguments", new Exception());
149368         utils.validateArgumentType(fileUrl, "string", ExceptionTypes.INVALID_PARAMETER, "Multimedia.js.AudioPlayer.open invalid parameter! expected string, fileUrl: " +
149369             fileUrl, new Exception());
149370
149371         if (fileUrl.match(/^rtsp:\/\//)) {
149372             exception.raise(exception.types.MethodNotImplemented, "rtsp:// scheme not yet supported. sorry :(");
149373         }
149374
149375         _validateAndSet(_STATES.OPENED, [_STATES.OPENED, _STATES.STOPPED, _STATES.COMPLETED, null], function () {
149376             _validateAudioType(fileUrl);
149377             _currentAudioFile = fileSystem.getURI(fileUrl);
149378             _audio.setAttribute("src", _currentAudioFile);
149379             _audio.load();
149380         });
149381     },
149382
149383     play: function (repeatTimes) {
149384         utils.validateNumberOfArguments(1, 1, arguments.length, ExceptionTypes.INVALID_PARAMETER, "Multimedia.js.AudioPlayer.play wrong number of arguments", new Exception());
149385         utils.validateArgumentType(repeatTimes, "integer", ExceptionTypes.INVALID_PARAMETER, "Multimedia.js.AudioPlayer.play invalid parameter! expected integer, repeatTimes: " + repeatTimes, new Exception());
149386
149387         if (repeatTimes < 0) {
149388             exception.raise(ExceptionTypes.INVALID_PARAMETER, "value of repeatTimes must be greater than 0", new Exception());
149389         }
149390
149391         if (repeatTimes !== 0) {
149392             _validateAndSet(_STATES.PLAYING, [_STATES.OPENED, _STATES.STOPPED, _STATES.COMPLETED], function () {
149393                 _loopCount = repeatTimes;
149394                 _audio.play();
149395             });
149396         }
149397     },
149398
149399     pause: function () {
149400         _validateAndSet(_STATES.PAUSED, [_STATES.PLAYING], function () {
149401             _audio.pause();
149402         });
149403     },
149404
149405     resume: function () {
149406         _validateAndSet(_STATES.PLAYING, [_STATES.PAUSED], function () {
149407             _audio.play();
149408         });
149409     },
149410
149411     stop: function () {
149412         _validateAndSet(_STATES.STOPPED, [_STATES.PAUSED, _STATES.PLAYING], function () {
149413             try {
149414                 _audio.pause();
149415                 _audio.currentTime = 0;
149416             } catch (e) {
149417                 //HACK: do nothing, this could throw a dom exception 11 sometimes when playing an mp3 or before the file has loaded.
149418                 //see http://developer.palm.com/distribution/viewtopic.php?f=11&t=7568
149419             }
149420         });
149421     }
149422 };
149423
149424 module.exports = _self;
149425
149426 });
149427 define('ripple/platform/wac/1.0/PositionInfo', function (require, exports, module) {
149428 /*
149429  *  Copyright 2011 Research In Motion Limited.
149430  *
149431  * Licensed under the Apache License, Version 2.0 (the "License");
149432  * you may not use this file except in compliance with the License.
149433  * You may obtain a copy of the License at
149434  *
149435  * http://www.apache.org/licenses/LICENSE-2.0
149436  *
149437  * Unless required by applicable law or agreed to in writing, software
149438  * distributed under the License is distributed on an "AS IS" BASIS,
149439  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
149440  * See the License for the specific language governing permissions and
149441  * limitations under the License.
149442  */
149443 var geo = require('ripple/geo'),
149444     event = require('ripple/event'),
149445     exception = require('ripple/exception'),
149446     utils = require('ripple/utils'),
149447     _self = {
149448         latitude: undefined,
149449         longitude: undefined,
149450         altitude: undefined,
149451         cellID: undefined,
149452         accuracy: undefined,
149453         altitudeAccuracy: undefined,
149454         timeStamp: undefined
149455     };
149456
149457 utils.forEach(_self, function (value, property) {
149458     _self.__defineGetter__(property, function () {
149459         return geo.getPositionInfo()[property];
149460     });
149461 });
149462
149463 module.exports = _self;
149464
149465 });
149466 define('ripple/platform/wac/1.0/spec/config', function (require, exports, module) {
149467 /*
149468  *  Copyright 2011 Research In Motion Limited.
149469  *
149470  * Licensed under the Apache License, Version 2.0 (the "License");
149471  * you may not use this file except in compliance with the License.
149472  * You may obtain a copy of the License at
149473  *
149474  * http://www.apache.org/licenses/LICENSE-2.0
149475  *
149476  * Unless required by applicable law or agreed to in writing, software
149477  * distributed under the License is distributed on an "AS IS" BASIS,
149478  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
149479  * See the License for the specific language governing permissions and
149480  * limitations under the License.
149481  */
149482 var platform = require('ripple/platform'),
149483     utils = require('ripple/utils'),
149484     db = require('ripple/db'),
149485     constants = require('ripple/constants');
149486
149487 module.exports = {
149488     fileName: "config.xml",
149489     validateVersion: function (configValidationObject) {
149490         var valid = true;
149491         valid = !((!configValidationObject.widget.validationResult[0].attributes.xmlns.valid) ||
149492             (!configValidationObject.widget.validationResult[0].attributes["xmlns:JIL"].valid));
149493
149494         return valid;
149495     },
149496     extractInfo: function (configValidationObject) {
149497         if (!configValidationObject) {
149498             return null;
149499         }
149500
149501         var widgetInfo = {},
149502             configFeatures,
149503             configPreferences,
149504             preferenceName,
149505             platform;
149506
149507         widgetInfo.id = configValidationObject.widget.validationResult[0].attributes.id.value || "";
149508         widgetInfo.name = configValidationObject.widget.children.name.validationResult[0].value;
149509         widgetInfo.icon = configValidationObject.widget.children.icon.validationResult[0].attributes.src.value;
149510         widgetInfo.version = configValidationObject.widget.validationResult[0].attributes.version.value;
149511
149512         widgetInfo.features = {};
149513
149514         configFeatures = configValidationObject.widget.children.feature.validationResult;
149515         utils.forEach(configFeatures, function (f) {
149516             if (f.valid === true) {
149517                 var feature = {id: f.attributes.name.value,
149518                          required: f.attributes.required.valid};
149519                 widgetInfo.features[feature.id] = feature;
149520             }
149521         });
149522
149523         widgetInfo.preferences = {};
149524
149525         configPreferences = configValidationObject.widget.children.preference.validationResult;
149526
149527         platform = require('ripple/platform');
149528         utils.forEach(configPreferences, function (preference) {
149529             preferenceName = preference.attributes.name.value;
149530             if (preferenceName) {
149531                 widgetInfo.preferences[preferenceName] = {
149532                     "key": preferenceName,
149533                     "value": preference.attributes.value.value || "",
149534                     "readonly": preference.attributes.readonly.value === "true"
149535                 };
149536
149537                 db.save(preferenceName,
149538                         widgetInfo.preferences[preferenceName].value,
149539                         platform.getPersistencePrefix(widgetInfo.id));
149540             }
149541         });
149542
149543         return widgetInfo;
149544     },
149545     schema: {
149546         rootElement: "widget",
149547         widget: {
149548             nodeName: "widget",
149549             required: true,
149550             occurrence: 1,
149551             helpText: "\"widget\" element describes widget information in configuration documents and serves as a container for other elements. It must be used in configuration document and may have following child elments: name,description,icon,author,license,content,maximum_display_mode,update,feature,access,billing. \"widget\" element MAY have following attributes: id,version,height,width,xml:lang",
149552             attributes: {
149553                 xmlns: {
149554                     attributeName: "xmlns",
149555                     required: true,
149556                     type: "list",
149557                     listValues: ["http://www.w3.org/ns/widgets"]
149558                 },
149559                 "xmlns:JIL": {
149560                     attributeName: "xmlns:JIL",
149561                     required: true,
149562                     type: "list",
149563                     listValues: ["http://www.jil.org/ns/widgets1.2"]
149564                 },
149565                 "xmlns:its": {
149566                     attributeName: "xmlns:its",
149567                     helpText: "Indicates Text Directionality can be used. According to W3C spec, this feature is at risk, therefore we don't currently validate this.",
149568                     required: false,
149569                     type: "string"
149570                 },
149571                 id: {
149572                     attributeName: "id",
149573                     required: true,
149574                     type: "string"
149575                 },
149576                 version: {
149577                     attributeName: "version",
149578                     helpText: "Version must be in the following format: jil-rec-version-tag = major-version \".\" minor-version [\".\" version-desc]",
149579                     required: true,
149580                     type: "regex",
149581                     regex: /^\d{1,2}\.\d{1,2}(\.[A-Za-z0-9]{1,10})?$/
149582                 },
149583                 height: {
149584                     attributeName: "height",
149585                     required: true,
149586                     type: "integer"
149587                 },
149588                 width: {
149589                     attributeName: "width",
149590                     required: true,
149591                     type: "integer"
149592                 },
149593                 viewmodes: {
149594                     attributeName: "viewmodes",
149595                     required: false,
149596                     type: "list",
149597                     listValues: ["floating", "fullscreen"]
149598                 },
149599                 "xml:lang": {
149600                     attributeName: "xml:lang",
149601                     required: false,
149602                     type: "iso-language"
149603                 }
149604             },
149605             children: {
149606                 preference: {
149607                     nodeName: "preference",
149608                     required: false,
149609                     occurrence: 0,
149610                     attributes: {
149611                         name: {
149612                             attributeName: "name",
149613                             type: "string",
149614                             required: true
149615                         },
149616                         value: {
149617                             type: "string",
149618                             attributeName: "value",
149619                             required: false
149620                         },
149621                         readonly: {
149622                             attributeName: "readonly",
149623                             type: "boolean",
149624                             required: false
149625                         }
149626                     }
149627                 },
149628                 name: {
149629                     nodeName: "name",
149630                     required: false,
149631                     occurrence: 0,
149632                     type: "string",
149633                     attributes: {
149634                         "short": {
149635                             attributeName: "short",
149636                             type: "string",
149637                             required: false
149638                         },
149639                         "xml:lang": {
149640                             attributeName: "xml:lang",
149641                             type: "string",
149642                             required: false,
149643                             unique: true
149644                         }
149645                     }
149646                 },
149647                 description: {
149648                     nodeName: "description",
149649                     required: false,
149650                     occurrence: 0,
149651                     type: "string",
149652                     attributes: {
149653                         "xml:lang": {
149654                             attributeName: "xml:lang",
149655                             type: "string",
149656                             required: false,
149657                             unique: true
149658                         }
149659                     }
149660                 },
149661                 icon: {
149662                     nodeName: "icon",
149663                     required: false,
149664                     occurrence: 0,
149665                     attributes: {
149666                         src: {
149667                             attributeName: "src",
149668                             type: "string",
149669                             required: true
149670                         },
149671                         height: {
149672                             attributeName: "height",
149673                             required: false,
149674                             type: "integer"
149675                         },
149676                         width: {
149677                             attributeName: "width",
149678                             required: false,
149679                             type: "integer"
149680                         },
149681                         "xml:lang": {
149682                             attributeName: "xml:lang",
149683                             type: "string",
149684                             required: false,
149685                             unique: true
149686                         }
149687                     }
149688                 },
149689                 author: {
149690                     nodeName: "author",
149691                     required: false,
149692                     occurrence: 1,
149693                     type: "string",
149694                     attributes: {
149695                         email: {
149696                             attributeName: "email",
149697                             type: "regex",
149698                             required: false,
149699                             regex: constants.REGEX.EMAIL
149700                         },
149701                         href: {
149702                             attributeName: "href",
149703                             type: "regex",
149704                             required: false,
149705                             regex: constants.REGEX.URL
149706                         },
149707                         "xml:lang": {
149708                             attributeName: "xml:lang",
149709                             type: "string",
149710                             required: false,
149711                             unique: true
149712                         }
149713                     }
149714                 },
149715                 license: {
149716                     nodeName: "license",
149717                     required: false,
149718                     occurrence: 1,
149719                     type: "string",
149720                     attributes: {
149721                         href: {
149722                             attributeName: "href",
149723                             type: "regex",
149724                             required: false,
149725                             regex: constants.REGEX.URL
149726                         },
149727                         "xml:lang": {
149728                             attributeName: "xml:lang",
149729                             type: "string",
149730                             required: false,
149731                             unique: true
149732                         }
149733                     }
149734                 },
149735                 content: {
149736                     nodeName: "content",
149737                     required: false,
149738                     occurrence: 1,
149739                     attributes: {
149740                         src: {
149741                             attributeName: "src",
149742                             type: "string",
149743                             required: true
149744                         },
149745                         encoding: {
149746                             attributeName: "encoding",
149747                             type: "string",
149748                             required: false
149749                         },
149750                         type: {
149751                             attributeName: "type",
149752                             type: "string",
149753                             required: false
149754                         }
149755                     }
149756                 },
149757                 feature: {
149758                     nodeName: "feature",
149759                     required: false,
149760                     occurrence: 0,
149761                     attributes: {
149762                         name: {
149763                             attributeName: "name",
149764                             type: "list",
149765                             required: true,
149766                             listValues: ["http://jil.org/jil/api/1.1/widget", "http://jil.org/jil/api/1.1.5/exception",
149767                                             "http://jil.org/jil/api/1.1.5/exceptiontypes", "http://jil.org/jil/api/1.1/device",
149768                                             "http://jil.org/jil/api/1.1/accountinfo", "http://jil.org/jil/api/1.1/deviceinfo",
149769                                             "http://jil.org/jil/api/1.1.1/datanetworkinfo", "http://jil.org/jil/api/1.1/devicestateinfo",
149770                                             "http://jil.org/jil/api/1.1/accelerometerinfo", "http://jil.org/jil/api/1.1/config",
149771                                             "http://jil.org/jil/api/1.1.1/file", "http://jil.org/jil/api/1.1/positioninfo",
149772                                             "http://jil.org/jil/api/1.1/powerinfo", "http://jil.org/jil/api/1.1.1/radioinfo",
149773                                             "http://jil.org/jil/api/1.1.5/radiosignalsourcetypes", "http://jil.org/jil/api/1.1.5/applicationtypes",
149774                                             "http://jil.org/jil/api/1.1/messaging", "http://jil.org/jil/api/1.1/account",
149775                                             "http://jil.org/jil/api/1.1/attachment", "http://jil.org/jil/api/1.1/message",
149776                                             "http://jil.org/jil/api/1.1.4/messagefoldertypes", "http://jil.org/jil/api/1.1/messagequantities",
149777                                             "http://jil.org/jil/api/1.1/messagetypes", "http://jil.org/jil/api/1.1/multimedia",
149778                                             "http://jil.org/jil/api/1.1/audioplayer", "http://jil.org/jil/api/1.1.2/camera",
149779                                             "http://jil.org/jil/api/1.1.2/videoplayer", "http://jil.org/jil/api/1.1.1/pim",
149780                                             "http://jil.org/jil/api/1.1/addressbookitem", "http://jil.org/jil/api/1.1/calendaritem",
149781                                             "http://jil.org/jil/api/1.1/eventrecurrencetypes", "http://jil.org/jil/api/1.1.1/telephony",
149782                                             "http://jil.org/jil/api/1.1/callrecord", "http://jil.org/jil/api/1.1.1/callrecordtypes",
149783                                             "http://jil.org/jil/api/1.1.1/widgetmanager"]
149784                         },
149785                         required: {
149786                             attributeName: "required",
149787                             type: "boolean",
149788                             required: false
149789                         }
149790                     }
149791                 },
149792                 "JIL:maximum_display_mode": {
149793                     nodeName: "JIL:maximum_display_mode",
149794                     required: false,
149795                     occurrence: 1,
149796                     attributes: {
149797                         height: {
149798                             attributeName: "height",
149799                             type: "integer",
149800                             required: false
149801                         },
149802                         width: {
149803                             attributeName: "width",
149804                             type: "integer",
149805                             required: false
149806                         }
149807                     }
149808                 },
149809                 "JIL:update": {
149810                     nodeName: "JIL:update",
149811                     required: false,
149812                     occurrence: 1,
149813                     attributes: {
149814                         href: {
149815                             attributeName: "href",
149816                             type: "regex",
149817                             required: true,
149818                             regex: constants.REGEX.URL
149819                         },
149820                         period: {
149821                             attributeName: "period",
149822                             helpText: "Possible values for the period attribute are: 0, 1, 2, 3 meaning: every time the widget is opened in maximum display mode, every day, every week, every month; respectivly",
149823                             type: "list",
149824                             required: true,
149825                             listValues: ["0", "1", "2", "3"]
149826                         }
149827                     }
149828                 },
149829                 "JIL:access": {
149830                     nodeName: "JIL:access",
149831                     required: false,
149832                     occurrence: 1,
149833                     attributes: {
149834                         network: {
149835                             attributeName: "network",
149836                             type: "boolean",
149837                             required: false
149838                         },
149839                         localfs: {
149840                             attributeName: "localfs",
149841                             type: "boolean",
149842                             required: false
149843                         },
149844                         remote_scripts: {
149845                             attributeName: "remote_scripts",
149846                             type: "boolean",
149847                             required: false
149848                         }
149849                     }
149850                 },
149851                 "JIL:billing": {
149852                     nodeName: "JIL:billing",
149853                     required: false,
149854                     occurrence: 1,
149855                     attributes: {
149856                         required: {
149857                             attributeName: "required",
149858                             type: "boolean",
149859                             required: true
149860                         }
149861                     }
149862                 }
149863             }
149864         }
149865     }
149866 };
149867
149868 });
149869 define('ripple/platform/wac/1.0/spec/device', function (require, exports, module) {
149870 /*
149871  *  Copyright 2011 Research In Motion Limited.
149872  *
149873  * Licensed under the Apache License, Version 2.0 (the "License");
149874  * you may not use this file except in compliance with the License.
149875  * You may obtain a copy of the License at
149876  *
149877  * http://www.apache.org/licenses/LICENSE-2.0
149878  *
149879  * Unless required by applicable law or agreed to in writing, software
149880  * distributed under the License is distributed on an "AS IS" BASIS,
149881  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
149882  * See the License for the specific language governing permissions and
149883  * limitations under the License.
149884  */
149885 var constants = require('ripple/constants'),
149886     event = require('ripple/event');
149887
149888 module.exports = {
149889     "AccountInfo": {
149890         "phoneUserUniqueId": {
149891             "name": "User Unique Id",
149892             "control": {
149893                 "type": "text",
149894                 "value": new Date().getTime().toString()
149895             }
149896         },
149897         "phoneMSISDN":  {
149898             "name": "MSISDN",
149899             "control": {
149900                 "type": "text",
149901                 "value": "15199999999"
149902             }
149903         },
149904         "phoneOperatorName":  {
149905             "name": "Operator Name",
149906             "control": {
149907                 "type": "text",
149908                 "value": ""
149909             }
149910         },
149911         "userAccountBalance":  {
149912             "name": "Account Balance",
149913             "control": {
149914                 "type": "number",
149915                 "value": 0
149916             }
149917         },
149918         "userSubscriptionType":  {
149919             "name": "Subscription Type",
149920             "control": {
149921                 "type": "select",
149922                 "value": "other"
149923             },
149924             "options": {
149925                 "other": "other",
149926                 "prepaid": "prepaid",
149927                 "postpaid": "postpaid"
149928             }
149929         }
149930     },
149931     "RadioInfo": {
149932         "isRoaming": {
149933             "name": "Is Roaming",
149934             "control": {
149935                 "type": "checkbox",
149936                 "value": false
149937             },
149938             "callback": function () {
149939                 event.trigger("RadioSignalSourceChanged");
149940             }
149941         },
149942         "isRadioEnabled":  {
149943             "name": "Is Radio Enabled",
149944             "control": {
149945                 "type": "checkbox",
149946                 "value": true
149947             }
149948         },
149949         "radioSignalSource": {
149950             "name": "Radio Signal Source",
149951             "control": {
149952                 "type": "select",
149953                 "value": "GSM"
149954             },
149955             // TODO: try not to duplicate from RadioSignalSourceTypes
149956             "options": {
149957                 "CDMA": "cdma",
149958                 "GSM": "gsm",
149959                 "LTE": "lte",
149960                 "TDSCDMA": "tdscdma",
149961                 "WCDMA": "wcdma"
149962             },
149963             "callback": function () {
149964                 event.trigger("RadioSignalSourceChanged");
149965             }
149966         },
149967         "radioSignalStrengthPercent": {
149968             "name": "Signal Strength %",
149969             "control": {
149970                 "type": "select",
149971                 "value": 80
149972             },
149973             "options": (function () {
149974                 var i,
149975                     optionList = {};
149976
149977                 for (i = 0; i <= 100; i++) {
149978                     optionList[i] = i;
149979                 }
149980
149981                 return optionList;
149982             }())
149983         }
149984     },
149985     "Config": {
149986         "ringtoneVolume": {
149987             "name": "Ringtone Volume",
149988             "control": {
149989                 "type": "select",
149990                 "value": 10
149991             },
149992             "options": (function () {
149993                 var i,
149994                     optionList = {};
149995
149996                 for (i = 0; i <= 10; i++) {
149997                     optionList[i] = i;
149998                 }
149999
150000                 return optionList;
150001             }())
150002         },
150003         "msgRingtoneVolume":  {
150004             "name": "Msg Ringtone Volume",
150005             "control": {
150006                 "type": "select",
150007                 "value": 10
150008             },
150009             "options": (function () {
150010                 var i,
150011                     optionList = {};
150012
150013                 for (i = 0; i <= 10; i++) {
150014                     optionList[i] = i;
150015                 }
150016
150017                 return optionList;
150018             }())
150019         },
150020         "vibrationSetting":  {
150021             "name": "Vibration",
150022             "control": {
150023                 "type": "select",
150024                 "value": "off"
150025             },
150026             "options": {
150027                 "on": "ON",
150028                 "off": "OFF"
150029             }
150030         }
150031     },
150032     "Account": {
150033         "accountName":  {
150034             "name": "Name",
150035             "control": {
150036                 "type": "text",
150037                 "value": ""
150038             }
150039         },
150040         "accountId":  {
150041             "name": "Id",
150042             "control": {
150043                 "type": "text",
150044                 "value": ""
150045             }
150046         }
150047     },
150048     "DeviceInfo": {
150049         "totalMemory": {
150050             "name": "Total Memory",
150051             "control": {
150052                 "type": "range",
150053                 "value": 262144,
150054                 "min": 0,
150055                 "max": 4096000
150056             }
150057         },
150058         "phoneColorDepthDefault": {
150059             "name": "Color Depth",
150060             "control": {
150061                 "type": "number",
150062                 "value": 24
150063             }
150064         }
150065     },
150066     "DeviceStateInfo": {
150067         "availableMemory": {
150068             "name": "Available Memory",
150069             "control": {
150070                 "type": "range",
150071                 "value": 262144,
150072                 "min": 0,
150073                 "max": 4096000
150074             }
150075         },
150076         "keypadLightOn":   {
150077             "name": "Keypad Light On",
150078             "control": {
150079                 "type": "checkbox",
150080                 "value": false
150081             }
150082         },
150083         "backLightOn": {
150084             "name": "Back Light On",
150085             "control": {
150086                 "type": "checkbox",
150087                 "value": false
150088             }
150089         },
150090         "audioPath":  {
150091             "name": "Audio Path",
150092             "control": {
150093                 "type": "select",
150094                 "value": "receiver"
150095             },
150096             "options": {
150097                 "speaker": "speaker",
150098                 "receiver": "receiver",
150099                 "earphone": "earphone"
150100             }
150101         },
150102         "processorUtilizationPercent":  {
150103             "name": "CPU Utilization %",
150104             "control": {
150105                 "type": "select",
150106                 "value": "5"
150107             },
150108             "options": (function () {
150109                 var i,
150110                     optionList = {};
150111
150112                 for (i = 0; i <= 100; i++) {
150113                     optionList[i] = i;
150114                 }
150115
150116                 return optionList;
150117             }())
150118         },
150119         "language":  {
150120             "name": "Language",
150121             "control": {
150122                 "type": "select",
150123                 "value": "eng"
150124             },
150125             "options": (function () {
150126                 var i,
150127                     optionList = {},
150128                     iterator = constants.LANG.ISO6392_LIST;
150129
150130                 for (i = 0; i <= iterator.length; i++) {
150131                     optionList[iterator[i]] = iterator[i];
150132                 }
150133
150134                 return optionList;
150135             }())
150136         }
150137     },
150138     "DataNetworkInfo": {
150139         "isDataNetworkConnected": {
150140             "name": "Data Network Is Connected",
150141             "control": {
150142                 "type": "checkbox",
150143                 "value": true
150144             }
150145         },
150146         "networkConnectionType": {
150147             "name": "Network Connection Type",
150148             "control": {
150149                 "type": "select",
150150                 "value": ["GPRS"]
150151             },
150152             // TODO: try not to duplicate from DataNetworkConnectionTypes
150153             "options": {
150154                 "BLUETOOTH": "bluetooth",
150155                 "EDGE": "edge",
150156                 "EVDO": "evdo",
150157                 "GPRS": "gprs",
150158                 "IRDA": "irda",
150159                 "LTE": "lte",
150160                 "ONEXRTT": "1xrtt",
150161                 "WIFI": "wifi"
150162             },
150163             "callback": function (setting) {
150164                 event.trigger("DataNetworkConnectionChanged", [setting]);
150165             }
150166         }
150167     },
150168     "PowerInfo": {
150169         "isCharging": {
150170             "name": "Battery Is Charging",
150171             "control": {
150172                 "type": "checkbox",
150173                 "value": true
150174             },
150175             "callback": function (setting) {
150176                 event.trigger("DeviceBatteryStateChanged", [setting]);
150177             }
150178         },
150179         "percentRemaining":  {
150180             "name": "Battery Remaining %",
150181             "control": {
150182                 "type": "select",
150183                 "value": 100
150184             },
150185             "options": (function () {
150186                 var i,
150187                     optionList = {};
150188
150189                 for (i = 0; i <= 100; i++) {
150190                     optionList[i] = i;
150191                 }
150192
150193                 return optionList;
150194             }()),
150195             "callback": function (setting) {
150196                 event.trigger("DeviceBatteryLevelChanged", [setting]);
150197             }
150198         }
150199     }
150200 };
150201
150202 });
150203 define('ripple/platform/wac/1.0/spec/events', function (require, exports, module) {
150204 /*
150205  *  Copyright 2011 Research In Motion Limited.
150206  *
150207  * Licensed under the Apache License, Version 2.0 (the "License");
150208  * you may not use this file except in compliance with the License.
150209  * You may obtain a copy of the License at
150210  *
150211  * http://www.apache.org/licenses/LICENSE-2.0
150212  *
150213  * Unless required by applicable law or agreed to in writing, software
150214  * distributed under the License is distributed on an "AS IS" BASIS,
150215  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
150216  * implied.
150217  * See the License for the specific language governing permissions and
150218  * limitations under the License.
150219  */
150220
150221 var event = require('ripple/event');
150222
150223 module.exports = {
150224     "WidgetWakeup": {
150225         callback: function () {
150226             event.trigger("WidgetWakeup");
150227         }
150228     },
150229     "WidgetMaximize": {
150230         callback: function () {
150231             event.trigger("WidgetMaximize");
150232         }
150233     },
150234     "WidgetFocus": {
150235         callback: function () {
150236             event.trigger("WidgetFocus");
150237         }
150238     },
150239     "WidgetRestore": {
150240         callback: function () {
150241             event.trigger("WidgetRestore");
150242         }
150243     }
150244 };
150245
150246 });
150247 define('ripple/platform/wac/1.0/spec/ui', function (require, exports, module) {
150248 /*
150249  *  Copyright 2011 Research In Motion Limited.
150250  *
150251  * Licensed under the Apache License, Version 2.0 (the "License");
150252  * you may not use this file except in compliance with the License.
150253  * You may obtain a copy of the License at
150254  *
150255  * http://www.apache.org/licenses/LICENSE-2.0
150256  *
150257  * Unless required by applicable law or agreed to in writing, software
150258  * distributed under the License is distributed on an "AS IS" BASIS,
150259  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
150260  * See the License for the specific language governing permissions and
150261  * limitations under the License.
150262  */
150263 module.exports = {
150264     plugins: [
150265         "accelerometer",
150266         //"deviceSettings",
150267         "fileSystem",
150268         "geoView",
150269 /*
150270         "multimedia",
150271         "audioPlayer",
150272         "telephony",
150273 */
150274         "platformEvents",
150275         "storage",
150276         "widgetConfig"
150277     ]
150278 };
150279
150280 });
150281 define('ripple/platform/wac/1.0/RadioInfo', function (require, exports, module) {
150282 /*
150283  *  Copyright 2011 Research In Motion Limited.
150284  *
150285  * Licensed under the Apache License, Version 2.0 (the "License");
150286  * you may not use this file except in compliance with the License.
150287  * You may obtain a copy of the License at
150288  *
150289  * http://www.apache.org/licenses/LICENSE-2.0
150290  *
150291  * Unless required by applicable law or agreed to in writing, software
150292  * distributed under the License is distributed on an "AS IS" BASIS,
150293  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
150294  * See the License for the specific language governing permissions and
150295  * limitations under the License.
150296  */
150297 var _self,
150298     event = require('ripple/event'),
150299     _console = require('ripple/console'),
150300     deviceSettings = require('ripple/deviceSettings');
150301
150302 _self = {
150303     isRoaming: undefined,
150304     radioSignalStrengthPercent: undefined,
150305     isRadioEnabled: undefined,
150306     radioSignalSource: undefined,
150307     onSignalSourceChange: undefined
150308 };
150309
150310 event.on("RadioSignalSourceChanged", function () {
150311     var callback = _self.onSignalSourceChange,
150312         isRoaming = _self.isRoaming,
150313         signalSource = _self.radioSignalSource,
150314         msg = "Fired onSignalSourceChange. signalSource: " + signalSource + ", isRoaming: " + isRoaming;
150315
150316     if (callback && typeof callback === "function") {
150317         callback.apply(null, [signalSource, isRoaming]);
150318     }
150319     else {
150320         msg += " --> BUT there was no registered callback found.";
150321     }
150322
150323     _console.log(msg);
150324 });
150325
150326 _self.__defineGetter__("radioSignalSource", function () {
150327     return deviceSettings.retrieve("RadioInfo.radioSignalSource");
150328 });
150329
150330 _self.__defineGetter__("isRoaming", function () {
150331     return deviceSettings.retrieveAsBoolean("RadioInfo.isRoaming");
150332 });
150333
150334 _self.__defineGetter__("isRadioEnabled", function () {
150335     return deviceSettings.retrieveAsBoolean("RadioInfo.isRadioEnabled");
150336 });
150337
150338 _self.__defineGetter__("radioSignalStrengthPercent", function () {
150339     return deviceSettings.retrieveAsInt("RadioInfo.radioSignalStrengthPercent");
150340 });
150341
150342 module.exports = _self;
150343
150344 });
150345 define('ripple/platform/wac/1.0/EventRecurrenceTypes', function (require, exports, module) {
150346 /*
150347  *  Copyright 2011 Research In Motion Limited.
150348  *
150349  * Licensed under the Apache License, Version 2.0 (the "License");
150350  * you may not use this file except in compliance with the License.
150351  * You may obtain a copy of the License at
150352  *
150353  * http://www.apache.org/licenses/LICENSE-2.0
150354  *
150355  * Unless required by applicable law or agreed to in writing, software
150356  * distributed under the License is distributed on an "AS IS" BASIS,
150357  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
150358  * See the License for the specific language governing permissions and
150359  * limitations under the License.
150360  */
150361 module.exports = {
150362     NOT_REPEAT: "NOT_REPEAT",
150363     DAILY: "DAILY",
150364     EVERY_WEEKDAY: "EVERY_WEEKDAY",
150365     WEEKLY_ON_DAY: "WEEKLY_ON_DAY",
150366     MONTHLY_ON_DAY: "MONTHLY_ON_DAY",
150367     MONTHLY_ON_DAY_COUNT: "MONTHLY_ON_DAY_COUNT",
150368     YEARLY: "YEARLY"
150369 };
150370
150371 });
150372 define('ripple/platform/wac/1.0/DataNetworkConnectionTypes', function (require, exports, module) {
150373 /*
150374  *  Copyright 2011 Research In Motion Limited.
150375  *
150376  * Licensed under the Apache License, Version 2.0 (the "License");
150377  * you may not use this file except in compliance with the License.
150378  * You may obtain a copy of the License at
150379  *
150380  * http://www.apache.org/licenses/LICENSE-2.0
150381  *
150382  * Unless required by applicable law or agreed to in writing, software
150383  * distributed under the License is distributed on an "AS IS" BASIS,
150384  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
150385  * See the License for the specific language governing permissions and
150386  * limitations under the License.
150387  */
150388 var utils = require('ripple/utils'),
150389     _self = {
150390         "BLUETOOTH": undefined,
150391         "EDGE": undefined,
150392         "EVDO": undefined,
150393         "GPRS": undefined,
150394         "IRDA": undefined,
150395         "LTE": undefined,
150396         "ONEXRTT": undefined,
150397         "WIFI": undefined
150398     };
150399
150400 utils.forEach(_self, function (value, property) {
150401     _self.__defineGetter__(property, function () {
150402         return property;
150403     });
150404 });
150405
150406 module.exports = _self;
150407
150408 });
150409 define('ripple/platform/wac/1.0/Message', function (require, exports, module) {
150410 /*
150411  *  Copyright 2011 Research In Motion Limited.
150412  *
150413  * Licensed under the Apache License, Version 2.0 (the "License");
150414  * you may not use this file except in compliance with the License.
150415  * You may obtain a copy of the License at
150416  *
150417  * http://www.apache.org/licenses/LICENSE-2.0
150418  *
150419  * Unless required by applicable law or agreed to in writing, software
150420  * distributed under the License is distributed on an "AS IS" BASIS,
150421  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
150422  * See the License for the specific language governing permissions and
150423  * limitations under the License.
150424  */
150425 var exception = require('ripple/exception'),
150426     Attachment = require('ripple/platform/wac/1.0/Attachment'),
150427     ExceptionTypes = require('ripple/platform/wac/1.0/ExceptionTypes'),
150428     Exception = require('ripple/platform/wac/1.0/Exception');
150429
150430 function _throwUnsupportedException(method) {
150431     exception.raise(ExceptionTypes.UNSUPPORTED, "Method not supported." + (method || ""), new Exception());
150432 }
150433
150434 module.exports = function () {
150435     this.messageId = Math.uuid(undefined, 16);
150436     this.callbackNumber = undefined;
150437     this.destinationAddress = [];
150438     this.isRead = undefined;
150439     this.messagePriority = undefined;
150440     this.messageType = undefined;
150441     this.subject = undefined;
150442     this.body = undefined;
150443     this.sourceAddress = undefined;
150444     this.validityPeriodHours = undefined;
150445     this.time = undefined;
150446     this.ccAddress = [];
150447     this.bccAddress = [];
150448     this.attachments = [];
150449
150450     this.addAttachment = function (fileFullName) {
150451         var attachment = new Attachment();
150452         attachment.fileName = fileFullName;
150453         this.attachments.push(attachment);
150454     };
150455     this.deleteAttachment = function (attachment) {
150456
150457         for (var i = this.attachments.length - 1; i >= 0; i--) {
150458             if (this.attachments[i].fileName === attachment.fileName) {
150459                 this.attachments.splice(i, 1);
150460             }
150461         }
150462     };
150463     this.saveAttachment = function (fileFullName, attachment) {
150464         _throwUnsupportedException("Widget.Messaging.Message.addAddress");
150465     };
150466     this.addAddress = function (type, address) {
150467
150468         var addresses = address.split(";");
150469
150470         switch (type) {
150471         case "destination":
150472             this.destinationAddress = this.destinationAddress.concat(addresses);
150473             break;
150474         case "cc":
150475             this.ccAddress = this.ccAddress.concat(addresses);
150476             break;
150477         case "bcc":
150478             this.bccAddress = this.bccAddress.concat(addresses);
150479             break;
150480         }
150481     };
150482
150483     this.deleteAddress = function (type, address) {
150484         var addresses = address.split(";"),
150485             filter = function (orig) {
150486                 return orig.filter(function (address) {
150487                     return !addresses.some(function (x) {
150488                         return address === x;
150489                     });
150490                 });
150491             };
150492
150493         switch (type) {
150494         case "destination":
150495             this.destinationAddress = filter(this.destinationAddress);
150496             break;
150497         case "cc":
150498             this.ccAddress = filter(this.ccAddress);
150499             break;
150500         case "bcc":
150501             this.bccAddress = filter(this.bccAddress);
150502             break;
150503         }
150504     };
150505
150506 };
150507
150508 });
150509 define('ripple/platform/wac/1.0/Exception', function (require, exports, module) {
150510 /*
150511  *  Copyright 2011 Research In Motion Limited.
150512  *
150513  * Licensed under the Apache License, Version 2.0 (the "License");
150514  * you may not use this file except in compliance with the License.
150515  * You may obtain a copy of the License at
150516  *
150517  * http://www.apache.org/licenses/LICENSE-2.0
150518  *
150519  * Unless required by applicable law or agreed to in writing, software
150520  * distributed under the License is distributed on an "AS IS" BASIS,
150521  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
150522  * See the License for the specific language governing permissions and
150523  * limitations under the License.
150524  */
150525 module.exports = function () {
150526     this.message = "";
150527     this.type =  "";
150528
150529     this.toString = function () {
150530         var result = this.type + ': "' + this.message + '"';
150531
150532         if (this.stack) {
150533             result += "\n" + this.stack;
150534         }
150535         return result;
150536     };
150537 };
150538
150539 });
150540 define('ripple/platform/wac/1.0/MessageQuantities', function (require, exports, module) {
150541 /*
150542  *  Copyright 2011 Research In Motion Limited.
150543  *
150544  * Licensed under the Apache License, Version 2.0 (the "License");
150545  * you may not use this file except in compliance with the License.
150546  * You may obtain a copy of the License at
150547  *
150548  * http://www.apache.org/licenses/LICENSE-2.0
150549  *
150550  * Unless required by applicable law or agreed to in writing, software
150551  * distributed under the License is distributed on an "AS IS" BASIS,
150552  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
150553  * See the License for the specific language governing permissions and
150554  * limitations under the License.
150555  */
150556 module.exports = {
150557     totalMessageCnt: undefined,
150558     totalMessageReadCnt: undefined,
150559     totalMessageUnreadCnt: undefined
150560 };
150561
150562 });
150563 define('ripple/platform/wac/1.0/AccelerometerInfo', function (require, exports, module) {
150564 /*
150565  *  Copyright 2011 Research In Motion Limited.
150566  *
150567  * Licensed under the Apache License, Version 2.0 (the "License");
150568  * you may not use this file except in compliance with the License.
150569  * You may obtain a copy of the License at
150570  *
150571  * http://www.apache.org/licenses/LICENSE-2.0
150572  *
150573  * Unless required by applicable law or agreed to in writing, software
150574  * distributed under the License is distributed on an "AS IS" BASIS,
150575  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
150576  * See the License for the specific language governing permissions and
150577  * limitations under the License.
150578  */
150579 var accelerometer = require('ripple/accelerometer'),
150580     _self = {};
150581
150582 _self.__defineGetter__("xAxis", function () {
150583     return accelerometer.getInfo().accelerationIncludingGravity.x;
150584 });
150585
150586 _self.__defineGetter__("yAxis", function () {
150587     return accelerometer.getInfo(true).accelerationIncludingGravity.y;
150588 });
150589
150590 _self.__defineGetter__("zAxis", function () {
150591     return accelerometer.getInfo(true).accelerationIncludingGravity.z;
150592 });
150593
150594 module.exports = _self;
150595
150596 });
150597 define('ripple/platform/wac/1.0/VideoPlayer', function (require, exports, module) {
150598 /*
150599  *  Copyright 2011 Research In Motion Limited.
150600  *
150601  * Licensed under the Apache License, Version 2.0 (the "License");
150602  * you may not use this file except in compliance with the License.
150603  * You may obtain a copy of the License at
150604  *
150605  * http://www.apache.org/licenses/LICENSE-2.0
150606  *
150607  * Unless required by applicable law or agreed to in writing, software
150608  * distributed under the License is distributed on an "AS IS" BASIS,
150609  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
150610  * See the License for the specific language governing permissions and
150611  * limitations under the License.
150612  */
150613 var _self,
150614     _console = require('ripple/console'),
150615     event = require('ripple/event'),
150616     utils = require('ripple/utils'),
150617     fileSystem = require('ripple/fileSystem'),
150618     ExceptionTypes = require('ripple/platform/wac/1.0/ExceptionTypes'),
150619     Exception = require('ripple/platform/wac/1.0/Exception'),
150620     exception = require('ripple/exception'),
150621     _currentlySet,
150622     _currentVideoFile,
150623     _state = null,
150624     _loopCount, _video,
150625     _STATES = {
150626         "OPENED": "opened",
150627         "STOPPED": "stopped",
150628         "PAUSED": "paused",
150629         "PLAYING": "playing",
150630         "COMPLETED": "completed"
150631     };
150632
150633 function _validateVideoType(fileUrl) {
150634     var matched = fileUrl.match(/\.(\w*)$/),
150635         maps = {
150636             "ogv": "ogg",
150637             "flv": "mp4"
150638         },
150639         type = matched ? matched[1] : "";
150640
150641     if (_video && _video.canPlayType("video/" + (maps[type] || type)) === "") {
150642         _console.warn("Attempting to load a video that might not work in the current browser [" + fileUrl + "]");
150643     }
150644 }
150645
150646 function _validateAndSet(state, validStates, callbackBeforeSuccess) {
150647     var i, valid = false;
150648
150649     for (i = 0; i < validStates.length; i++) {
150650         if (validStates[i] === _state) {
150651             valid = true;
150652         }
150653     }
150654
150655     if (!valid) {
150656         _console.warn("Attempted to initiate VideoPlayer." + state +
150657             " in invalid state. current state: " + _state);
150658     } else {
150659         if (typeof(callbackBeforeSuccess) === "function") {
150660             callbackBeforeSuccess.apply();
150661         }
150662         event.trigger("MultimediaVideoStateChanged", [state], true);
150663     }
150664
150665     return valid;
150666 }
150667
150668 event.on("MultimediaVideoStateChanged", function (state) {
150669     _state = state;
150670     if (typeof _self.onStateChange === "function") {
150671         _self.onStateChange.apply(_self, [state]);
150672     }
150673 });
150674
150675 _self = module.exports = {
150676     onStateChange: undefined,
150677
150678     open: function (fileUrl) {
150679         utils.validateNumberOfArguments(1, 1, arguments.length, ExceptionTypes.INVALID_PARAMETER,
150680            "VideoPlayer.open invalid number of arguments", new Exception());
150681         utils.validateArgumentType(fileUrl, "string", ExceptionTypes.INVALID_PARAMETER,
150682            "VideoPlayer.open expected valid fileUrl but got ->" + fileUrl, new Exception());
150683
150684         if (!_video) {
150685             return;
150686         }
150687
150688         _validateAndSet(_STATES.OPENED, [_STATES.OPENED, _STATES.STOPPED, _STATES.COMPLETED, null], function () {
150689             _validateVideoType(fileUrl);
150690             _currentVideoFile = fileSystem.getURI(fileUrl);
150691             _video.setAttribute("src", _currentVideoFile);
150692             _video.setAttribute("width", "100%");
150693             _video.addEventListener("ended", function () {
150694                 event.trigger("MultimediaVideoStateChanged", [_STATES.COMPLETED], true);
150695                 if (_loopCount > 1) {
150696                     _self.open(_currentVideoFile);
150697                     _self.play(_loopCount--);
150698                 }
150699             }, false);
150700         });
150701     },
150702
150703     setWindow: function (domObject) {
150704         utils.validateNumberOfArguments(0, 1, arguments.length, ExceptionTypes.INVALID_PARAMETER,
150705            "VideoPlayer.setWindow invalid number of arguments", new Exception());
150706
150707         if (_currentlySet) {
150708             _currentlySet.removeChild(_video);
150709             _currentlySet = null;
150710             _video = null;
150711         }
150712
150713         if (domObject !== null) {
150714             _video = utils.createElement("video", {
150715                 "id": "multimedia-video"
150716             });
150717             domObject.appendChild(_video);
150718             _currentlySet = domObject;
150719             event.trigger("MultimediaAppVideoPlayerCreated", [_video], true);
150720         }
150721     },
150722
150723     play: function (repeatTimes) {
150724         utils.validateNumberOfArguments(1, 1, arguments.length,
150725             ExceptionTypes.INVALID_PARAMETER, "invalid number of arguments (expected one)", new Exception());
150726
150727         if (typeof repeatTimes !== "number" || repeatTimes < 0) {
150728             exception.raise(ExceptionTypes.INVALID_PARAMETER, "VideoPlayer.play was passed an invalid number of play times: " + repeatTimes, new Exception());
150729         }
150730         if (repeatTimes !== 0) {
150731             if (!_video) {
150732                 return;
150733             }
150734             _loopCount = repeatTimes;
150735             _validateAndSet(_STATES.PLAYING, [_STATES.OPENED, _STATES.STOPPED, _STATES.COMPLETED], function () {
150736                 _video.play();
150737             });
150738         }
150739     },
150740
150741     pause: function () {
150742         if (!_video) {
150743             return;
150744         }
150745         _validateAndSet(_STATES.PAUSED, [_STATES.PLAYING], function () {
150746             _video.pause();
150747         });
150748     },
150749
150750     resume: function () {
150751         if (!_video) {
150752             return;
150753         }
150754         _validateAndSet(_STATES.PLAYING, [_STATES.PAUSED], function () {
150755             _video.play();
150756         });
150757     },
150758
150759     stop: function () {
150760         if (!_video) {
150761             return;
150762         }
150763         _validateAndSet(_STATES.STOPPED, [_STATES.PAUSED, _STATES.PLAYING], function () {
150764             _video.pause();
150765             _video.setAttribute("src", _currentVideoFile); // hack
150766         });
150767     }
150768
150769 };
150770
150771 });
150772 define('ripple/platform/wac/1.0/CallRecord', function (require, exports, module) {
150773 /*
150774  *  Copyright 2011 Research In Motion Limited.
150775  *
150776  * Licensed under the Apache License, Version 2.0 (the "License");
150777  * you may not use this file except in compliance with the License.
150778  * You may obtain a copy of the License at
150779  *
150780  * http://www.apache.org/licenses/LICENSE-2.0
150781  *
150782  * Unless required by applicable law or agreed to in writing, software
150783  * distributed under the License is distributed on an "AS IS" BASIS,
150784  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
150785  * See the License for the specific language governing permissions and
150786  * limitations under the License.
150787  */
150788 module.exports = function () {
150789     this.callRecordType = undefined;
150790     this.callRecordId = undefined;
150791     this.callRecordAddress = undefined;
150792     this.callRecordName = undefined;
150793     this.durationSeconds = undefined;
150794     this.startTime = undefined;
150795 };
150796
150797 });
150798 define('ripple/platform/wac/1.0/Widget', function (require, exports, module) {
150799 /*
150800  *  Copyright 2011 Research In Motion Limited.
150801  *
150802  * Licensed under the Apache License, Version 2.0 (the "License");
150803  * you may not use this file except in compliance with the License.
150804  * You may obtain a copy of the License at
150805  *
150806  * http://www.apache.org/licenses/LICENSE-2.0
150807  *
150808  * Unless required by applicable law or agreed to in writing, software
150809  * distributed under the License is distributed on an "AS IS" BASIS,
150810  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
150811  * See the License for the specific language governing permissions and
150812  * limitations under the License.
150813  */
150814 var event = require('ripple/event'),
150815     _console = require('ripple/console'),
150816     app = require('ripple/app'),
150817     platform = require('ripple/platform'),
150818     exception = require('ripple/exception'),
150819     ExceptionTypes = require('ripple/platform/wac/1.0/ExceptionTypes'),
150820     Exception = require('ripple/platform/wac/1.0/Exception'),
150821     utils = require('ripple/utils'),
150822     db = require('ripple/db'),
150823     _self;
150824
150825 event.on("ScreenChangeDimensions", function (height, width) {
150826     try {
150827         // TODO: are these per spec to call?
150828         if (typeof app.onMaximize === 'function') {
150829             app.onMaximize();
150830         }
150831         if (typeof app.onRestore === 'function') {
150832             app.onRestore();
150833         }
150834         _console.log("called Widget.onRestore and Widget.onMaximize callback function");
150835     }
150836     catch (e) {
150837         exception.handle(e, false);
150838     }
150839 });
150840
150841 event.on("WidgetWakeup", function () {
150842     if (_self.onWakeup) {
150843         _self.onWakeup();
150844     }
150845 });
150846
150847 event.on("WidgetMaximize", function () {
150848     if (_self.onMaximize) {
150849         _self.onMaximize();
150850     }
150851 });
150852
150853 event.on("WidgetFocus", function () {
150854     if (_self.onFocus) {
150855         _self.onFocus();
150856     }
150857 });
150858
150859 event.on("WidgetRestore", function () {
150860     if (_self.onRestore) {
150861         _self.onRestore();
150862     }
150863 });
150864
150865 _self = {
150866     onWakeup: undefined,
150867     onMaximize: undefined,
150868     onFocus: undefined,
150869     onRestore: undefined,
150870
150871     openURL: function (url) {
150872         window.open(url);
150873     },
150874
150875     setPreferenceForKey: function (value, key) {
150876
150877         utils.validateNumberOfArguments(1, 2, arguments.length, ExceptionTypes.INVALID_PARAMETER, "setPreferenceForKey invalid number of paramters", new Exception());
150878         utils.validateArgumentType(key, "string", ExceptionTypes.INVALID_PARAMETER, "setPreferenceForKey invalid parameter! Key:" +
150879             key + ", Value: " + value, new Exception());
150880
150881         var msg = "",
150882             prefix;
150883         if (app.isPreferenceReadOnly(key)) {
150884             msg += "Cannot modify a read only preference. Preference key: " + key;
150885         }
150886         else {
150887             prefix = platform.getPersistencePrefix();
150888             if (value === null) {
150889                 msg += "deleting preference " + key;
150890                 db.remove(key, prefix);
150891             }
150892             else {
150893                 msg += "setting preference " + key + " == " + value;
150894                 utils.validateArgumentType(value, "string", ExceptionTypes.INVALID_PARAMETER, msg, new Exception());
150895                 db.save(key, value, prefix);
150896             }
150897         }
150898
150899
150900         _console.log(msg);
150901
150902         // Trigger storageUpdatedEvent
150903         event.trigger("StorageUpdatedEvent");
150904
150905     },
150906
150907     // return value or undefined
150908     preferenceForKey: function (key) {
150909
150910         utils.validateNumberOfArguments(1, 1, arguments.length, ExceptionTypes.INVALID_PARAMETER, "preferenceForKey invalid number of parameters", new Exception());
150911         utils.validateArgumentType(key, "string", ExceptionTypes.INVALID_PARAMETER, "preferenceForKey invalid paramters", new Exception());
150912
150913         var prefix = platform.getPersistencePrefix(),
150914             value = db.retrieve(key, prefix);
150915
150916         if (!value && value !== "") {
150917             value = undefined;
150918         }
150919
150920         _console.log("retrieving preference " + key + " == " + value);
150921
150922         return value;
150923
150924     }
150925 };
150926
150927 module.exports = _self;
150928
150929 });
150930 define('ripple/platform/wac/1.0/DeviceInfo', function (require, exports, module) {
150931 /*
150932  *  Copyright 2011 Research In Motion Limited.
150933  *
150934  * Licensed under the Apache License, Version 2.0 (the "License");
150935  * you may not use this file except in compliance with the License.
150936  * You may obtain a copy of the License at
150937  *
150938  * http://www.apache.org/licenses/LICENSE-2.0
150939  *
150940  * Unless required by applicable law or agreed to in writing, software
150941  * distributed under the License is distributed on an "AS IS" BASIS,
150942  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
150943  * See the License for the specific language governing permissions and
150944  * limitations under the License.
150945  */
150946 var utils = require('ripple/utils'),
150947     deviceSettings = require('ripple/deviceSettings'),
150948     platform = require('ripple/platform'),
150949     devices = require('ripple/devices'),
150950     _self;
150951
150952 _self = {
150953     ownerInfo: undefined, // return AddressBookItem
150954     phoneColorDepthDefault: undefined,
150955     phoneFirmware: undefined,
150956     phoneManufacturer: undefined,
150957     phoneModel: undefined,
150958     phoneOS: undefined,
150959     phoneSoftware: undefined,
150960     phoneScreenHeightDefault: undefined,
150961     phoneScreenWidthDefault: undefined,
150962     totalMemory: undefined
150963 };
150964
150965 function _getDeviceAttribute(attr) {
150966     var devicePointer = devices.getCurrentDevice();
150967     utils.forEach(attr.split("."), function (dot) {
150968         devicePointer = devicePointer[dot];
150969     });
150970     return devicePointer;
150971 }
150972
150973 _self.__defineGetter__("phoneColorDepthDefault", function () {
150974     return deviceSettings.retrieveAsInt("DeviceInfo.phoneColorDepthDefault");
150975 });
150976
150977 _self.__defineGetter__("phoneFirmware", function () {
150978     return _getDeviceAttribute("firmware");
150979 });
150980
150981 _self.__defineGetter__("phoneManufacturer", function () {
150982     return _getDeviceAttribute("manufacturer");
150983 });
150984
150985 _self.__defineGetter__("phoneOS", function () {
150986     return _getDeviceAttribute("osName") + " " + _getDeviceAttribute("osVersion");
150987 });
150988
150989 _self.__defineGetter__("phoneModel", function () {
150990     return _getDeviceAttribute("model");
150991 });
150992
150993 _self.__defineGetter__("phoneSoftware", function () {
150994     return _getDeviceAttribute("osVersion");
150995 });
150996
150997 _self.__defineGetter__("phoneScreenHeightDefault", function () {
150998     return _getDeviceAttribute("screen.height");
150999 });
151000
151001 _self.__defineGetter__("phoneScreenWidthDefault", function () {
151002     return _getDeviceAttribute("screen.width");
151003 });
151004
151005 _self.__defineGetter__("totalMemory", function () {
151006     return deviceSettings.retrieveAsInt("DeviceInfo.totalMemory");
151007 });
151008
151009 module.exports = _self;
151010
151011 });
151012 define('ripple/platform/wac/1.0/Camera', function (require, exports, module) {
151013 /*
151014  *  Copyright 2011 Research In Motion Limited.
151015  *
151016  * Licensed under the Apache License, Version 2.0 (the "License");
151017  * you may not use this file except in compliance with the License.
151018  * You may obtain a copy of the License at
151019  *
151020  * http://www.apache.org/licenses/LICENSE-2.0
151021  *
151022  * Unless required by applicable law or agreed to in writing, software
151023  * distributed under the License is distributed on an "AS IS" BASIS,
151024  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
151025  * See the License for the specific language governing permissions and
151026  * limitations under the License.
151027  */
151028 var exception = require('ripple/exception'),
151029     Exception = require('ripple/platform/wac/1.0/Exception'),
151030     ExceptionTypes = require('ripple/platform/wac/1.0/ExceptionTypes'),
151031     constants = require('ripple/constants'),
151032     _console = require('ripple/console'),
151033     utils = require('ripple/utils'),
151034     notifications = require('ripple/notifications'),
151035     _currentlySet,
151036     _img,
151037     _buttons,
151038     _self,
151039     _videoCapture;
151040
151041
151042 function _populateWindow(domObject) {
151043     var record = document.createElement("button"),
151044         pause = document.createElement("button"),
151045         stop = document.createElement("button");
151046
151047     _img = document.createElement("img");
151048     _img.setAttribute("id", "jil-camera-window");
151049     //_img.setAttribute("src", document.querySelector("#extension-url").innerHTML + constants.CAMERA.WINDOW_ANIMATION);
151050     _img.setAttribute("src", document.documentURI.replace(/index\.html$/, "") + constants.CAMERA.WINDOW_ANIMATION);
151051     _img.setAttribute("width", "100%");
151052     _currentlySet = domObject;
151053     domObject.appendChild(_img);
151054
151055     _buttons = document.createElement("div");
151056     _buttons.setAttribute("id", "jil-camera-window-buttons");
151057     _buttons.setAttribute("style", "display: none");
151058
151059     record.setAttribute("id", "jil-camera-window-buttons-record");
151060     record.innerHTML = "Record";
151061     pause.setAttribute("id", "jil-camera-window-buttons-pause");
151062     pause.innerHTML = "Pause";
151063     stop.setAttribute("id", "jil-camera-window-buttons-stop");
151064     stop.innerHTML = "Stop";
151065     stop.addEventListener("click", _self.stopVideoCapture);
151066
151067     _buttons.appendChild(record);
151068     _buttons.appendChild(pause);
151069     _buttons.appendChild(stop);
151070
151071     domObject.appendChild(_buttons);
151072
151073 }
151074
151075 function _verifySetWindow(method) {
151076     if (!_img) {
151077         exception.raise(ExceptionTypes.UNKNOWN, "Camera." +
151078           method + " was (most likely) called before using the setWindow method.", new Exception());
151079     }
151080 }
151081
151082 _self = {
151083     onCameraCaptured: undefined, //function (fileName) { }
151084
151085     captureImage: function (fileName, lowRes) {
151086         utils.validateNumberOfArguments(2, 2, arguments.length, ExceptionTypes.INVALID_PARAMETER, "captureImage invalid number of parameters", new Exception());
151087         utils.validateMultipleArgumentTypes([fileName, lowRes], ['string', 'boolean'], ExceptionTypes.INVALID_PARAMETER, "invalid parameter type", new Exception());
151088
151089         _verifySetWindow("captureImage");
151090         var msg = constants.CAMERA.WARNING_TEXT;
151091         msg = msg.replace("{file}", fileName);
151092         notifications.openNotification("normal", msg);
151093         _console.log("simulated saved image as: " + fileName);
151094         if (_self.onCameraCaptured) {
151095             _self.onCameraCaptured.apply(_self, [fileName]);
151096         }
151097
151098         return fileName;
151099     },
151100     setWindow: function (domObject) {
151101
151102         if (_currentlySet) {
151103             _currentlySet.removeChild(_img);
151104             _currentlySet.removeChild(_buttons);
151105             _currentlySet = null;
151106             _img = null;
151107             _buttons = null;
151108         }
151109         if (domObject !== null) {
151110             _populateWindow(domObject);
151111         }
151112     },
151113     startVideoCapture: function (fileName, lowRes, maxDurationSeconds, showDefaultControls) {
151114         _verifySetWindow("startVideoCapture");
151115         utils.validateNumberOfArguments(1, 4, arguments.length, ExceptionTypes.INVALID_PARAMETER, "startVideoCapture invalid number of parameters", new Exception());
151116         utils.validateMultipleArgumentTypes(
151117             [fileName, lowRes, maxDurationSeconds, showDefaultControls],
151118             ['string', 'boolean', 'integer', 'boolean'],
151119             ExceptionTypes.INVALID_PARAMETER,
151120             "invalid parameter type", new Exception());
151121         _console.log("started recording video");
151122         var interval = window.setTimeout(function () {
151123             _self.stopVideoCapture();
151124         }, maxDurationSeconds * 1000);
151125
151126         if (showDefaultControls) {
151127             _buttons.removeAttribute("style");
151128         }
151129
151130         _videoCapture = {
151131             fileName: fileName,
151132             stop: function () {
151133                 window.clearInterval(interval);
151134                 var msg = constants.CAMERA.WARNING_TEXT;
151135                 msg = msg.replace("{file}", fileName);
151136                 notifications.openNotification("normal", msg);
151137                 if (_self.onCameraCaptured) {
151138                     _self.onCameraCaptured.apply(_self, [fileName]);
151139                 }
151140             }
151141         };
151142
151143         return fileName;
151144     },
151145     stopVideoCapture: function () {
151146         utils.validateNumberOfArguments(0, 0, arguments.length, ExceptionTypes.INVALID_PARAMETER, "stopVideoCapture invalid number of parameters", new Exception());
151147         if (_videoCapture) {
151148             _console.log("simulated saving a video as: " + _videoCapture.fileName);
151149             if (_buttons) {
151150                 _buttons.setAttribute("style", "display: none");
151151             }
151152             _videoCapture.stop();
151153             _videoCapture = null;
151154         }
151155     }
151156
151157 };
151158
151159 module.exports = _self;
151160
151161 });
151162 define('ripple/platform/wac/1.0/RadioSignalSourceTypes', function (require, exports, module) {
151163 /*
151164  *  Copyright 2011 Research In Motion Limited.
151165  *
151166  * Licensed under the Apache License, Version 2.0 (the "License");
151167  * you may not use this file except in compliance with the License.
151168  * You may obtain a copy of the License at
151169  *
151170  * http://www.apache.org/licenses/LICENSE-2.0
151171  *
151172  * Unless required by applicable law or agreed to in writing, software
151173  * distributed under the License is distributed on an "AS IS" BASIS,
151174  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
151175  * See the License for the specific language governing permissions and
151176  * limitations under the License.
151177  */
151178 var _self,
151179     utils = require('ripple/utils');
151180
151181 _self = {
151182     "CDMA": undefined,
151183     "GSM": undefined,
151184     "LTE": undefined,
151185     "TDSCDMA": undefined,
151186     "WCDMA": undefined
151187 };
151188
151189 utils.forEach(_self, function (value, property) {
151190     _self.__defineGetter__(property, function () {
151191         return property;
151192     });
151193 });
151194
151195 module.exports = _self;
151196
151197 });
151198 define('ripple/platform/wac/1.0/File', function (require, exports, module) {
151199 /*
151200  *  Copyright 2011 Research In Motion Limited.
151201  *
151202  * Licensed under the Apache License, Version 2.0 (the "License");
151203  * you may not use this file except in compliance with the License.
151204  * You may obtain a copy of the License at
151205  *
151206  * http://www.apache.org/licenses/LICENSE-2.0
151207  *
151208  * Unless required by applicable law or agreed to in writing, software
151209  * distributed under the License is distributed on an "AS IS" BASIS,
151210  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
151211  * See the License for the specific language governing permissions and
151212  * limitations under the License.
151213  */
151214 module.expots = function () {
151215     this.createDate = undefined;
151216     this.fileName = undefined;
151217     this.filePath = undefined;
151218     this.fileSize = undefined;
151219     this.isDirectory = undefined;
151220     this.lastModifyDate = undefined;
151221 };
151222
151223 });
151224 define('ripple/platform/wac/1.0/AddressBookItem', function (require, exports, module) {
151225 /*
151226  *  Copyright 2011 Research In Motion Limited.
151227  *
151228  * Licensed under the Apache License, Version 2.0 (the "License");
151229  * you may not use this file except in compliance with the License.
151230  * You may obtain a copy of the License at
151231  *
151232  * http://www.apache.org/licenses/LICENSE-2.0
151233  *
151234  * Unless required by applicable law or agreed to in writing, software
151235  * distributed under the License is distributed on an "AS IS" BASIS,
151236  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
151237  * See the License for the specific language governing permissions and
151238  * limitations under the License.
151239  */
151240 var utils = require('ripple/utils'),
151241     exception = require('ripple/exception'),
151242     db = require('ripple/db'),
151243     constants = require('ripple/constants'),
151244     Exception = require('ripple/platform/wac/1.0/Exception'),
151245     ExceptionTypes = require('ripple/platform/wac/1.0/ExceptionTypes');
151246
151247 function _validateArgs(min, max, len) {
151248     utils.validateNumberOfArguments(min, max, len,
151249         ExceptionTypes.INVALID_PARAMETER, "invalid number of parameters", new Exception());
151250 }
151251
151252 function _validateType(arg, argType) {
151253     utils.validateArgumentType(arg, argType,
151254         ExceptionTypes.INVALID_PARAMETER,  "argument of wrong type provided",
151255         new Exception());
151256 }
151257
151258 module.exports = function () {
151259     function _throwUnsupportedException(method) {
151260         exception.raise(ExceptionTypes.UNSUPPORTED, "Method not supported." + (method || ""), new Exception());
151261     }
151262
151263     this.addressBookItemId = undefined;
151264     this.fullName = undefined;
151265     this.mobilePhone = undefined;
151266     this.homePhone = undefined;
151267     this.workPhone = undefined;
151268     this.eMail = undefined;
151269     this.company = undefined;
151270     this.title = undefined;
151271     this.address = undefined;
151272
151273     this.setAttributeValue = function (attribute, value) {
151274         _validateArgs(2, 2, arguments.length);
151275         _validateType(attribute, "string");
151276         this[attribute] = value;
151277     };
151278     this.setAddressGroupNames = function (groups) {
151279         _throwUnsupportedException("PIM.AddressBookItem.setAddressGroupNames");
151280     };
151281     this.getAttributeValue = function (attribute) {
151282         _validateArgs(1, 1, arguments.length);
151283         _validateType(attribute, "string");
151284         return this[attribute];
151285     };
151286     this.getAddressGroupNames = function () {
151287         _throwUnsupportedException("PIM.AddressBookItem.getAddressGroupNames");
151288     };
151289     this.getAvailableAttributes = function () {
151290         return utils.reduce(this, function (attributes, value, key) {
151291             if (typeof(value) !== 'function') {
151292                 attributes.push(key);
151293             }
151294             return attributes;
151295         }, []).sort();
151296     };
151297     this.update = function () {
151298         var items = db.retrieveObject(constants.PIM.ADDRESS_LIST_KEY),
151299             that = this,
151300             itemIndex = items.reduce(function (current, value, i) {
151301                 return value.addressBookItemId === that.addressBookItemId ?
151302                     i : current;
151303             }, -1);
151304
151305         if (itemIndex >= 0) {
151306             items[itemIndex] = this;
151307             db.saveObject(constants.PIM.ADDRESS_LIST_KEY, items);
151308         }
151309         else {
151310             exception.raise(ExceptionTypes.INVALID_PARAMETER, "Address Book Item not found: " + (this.addressBookItemId || ""), new Exception());
151311         }
151312
151313     };
151314 };
151315
151316 });
151317 define('ripple/platform/wac/1.0/DeviceStateInfo', function (require, exports, module) {
151318 /*
151319  *  Copyright 2011 Research In Motion Limited.
151320  *
151321  * Licensed under the Apache License, Version 2.0 (the "License");
151322  * you may not use this file except in compliance with the License.
151323  * You may obtain a copy of the License at
151324  *
151325  * http://www.apache.org/licenses/LICENSE-2.0
151326  *
151327  * Unless required by applicable law or agreed to in writing, software
151328  * distributed under the License is distributed on an "AS IS" BASIS,
151329  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
151330  * See the License for the specific language governing permissions and
151331  * limitations under the License.
151332  */
151333 var utils = require('ripple/utils'),
151334     exception = require('ripple/exception'),
151335     _console = require('ripple/console'),
151336     geo = require('ripple/geo'),
151337     event = require('ripple/event'),
151338     deviceSettings = require('ripple/deviceSettings'),
151339     PositionInfo = require('ripple/platform/wac/1.0/PositionInfo'),
151340     Exception = require('ripple/platform/wac/1.0/Exception'),
151341     ExceptionTypes = require('ripple/platform/wac/1.0/ExceptionTypes'),
151342     _self;
151343
151344 event.on("ScreenChangeDimensions", function (width, height) {
151345     try {
151346         if (typeof _self.onScreenChangeDimensions === 'function') {
151347             _self.onScreenChangeDimensions(width, height);
151348         }
151349         _console.log("called DeviceStateInfo.onScreenChangeDimensions callback function with width = " + width + " and height = " + height);
151350     } catch (e) {
151351         exception.handle(e, false);
151352     }
151353 });
151354
151355 _self = {
151356     availableMemory: undefined,
151357     language: undefined,
151358     keypadLightOn: undefined,
151359     backLightOn: undefined,
151360     processorUtilizationPercent: undefined,
151361     audioPath: undefined,
151362
151363     onPositionRetrieved: undefined,
151364
151365     requestPositionInfo: function (method) {
151366         utils.validateNumberOfArguments(1, 1, arguments.length,
151367             ExceptionTypes.INVALID_PARAMETER, "requestPositionInfo invalid number of parameters", new Exception());
151368         utils.validateArgumentType(method, "string",
151369             ExceptionTypes.INVALID_PARAMETER, "requestPositionInfo invalid parameter", new Exception());
151370
151371         if (!(method.match(/gps|agps|cellid/))) {
151372             exception.raise(ExceptionTypes.INVALID_PARAMETER,
151373                     "Invalid method, expected (gps, agps or cellid)", Exception);
151374         }
151375
151376         if (typeof _self.onPositionRetrieved === "function") {
151377             var delay = geo.delay * 1000,
151378                 timeout = geo.timeout;
151379             setTimeout(function () {
151380                 var pos = PositionInfo,
151381                     errorObj = {};
151382
151383                 if (timeout) {
151384                     //create
151385                     utils.forEach(pos, function (val, key) {
151386                         errorObj[key] = undefined;
151387                     });
151388                     pos = errorObj;
151389                 }
151390                 _self.onPositionRetrieved(pos, method);
151391             }, delay);
151392         }
151393     },
151394
151395     onScreenChangeDimensions: undefined,
151396
151397     onFlipEvent: undefined
151398 };
151399
151400 _self.__defineGetter__("availableMemory", function () {
151401     return deviceSettings.retrieveAsInt("DeviceStateInfo.availableMemory");
151402 });
151403
151404 _self.__defineGetter__("language", function () {
151405     return deviceSettings.retrieve("DeviceStateInfo.language");
151406 });
151407
151408 _self.__defineGetter__("keypadLightOn", function () {
151409     return deviceSettings.retrieveAsBoolean("DeviceStateInfo.keypadLightOn");
151410 });
151411
151412 _self.__defineGetter__("backLightOn", function () {
151413     return deviceSettings.retrieveAsBoolean("DeviceStateInfo.backLightOn");
151414 });
151415
151416 _self.__defineGetter__("audioPath", function () {
151417     return deviceSettings.retrieve("DeviceStateInfo.audioPath");
151418 });
151419
151420 _self.__defineGetter__("processorUtilizationPercent", function () {
151421     return deviceSettings.retrieve("DeviceStateInfo.processorUtilizationPercent");
151422 });
151423
151424 module.exports = _self;
151425
151426
151427 });
151428 define('ripple/platform/wac/1.0/Attachment', function (require, exports, module) {
151429 /*
151430  *  Copyright 2011 Research In Motion Limited.
151431  *
151432  * Licensed under the Apache License, Version 2.0 (the "License");
151433  * you may not use this file except in compliance with the License.
151434  * You may obtain a copy of the License at
151435  *
151436  * http://www.apache.org/licenses/LICENSE-2.0
151437  *
151438  * Unless required by applicable law or agreed to in writing, software
151439  * distributed under the License is distributed on an "AS IS" BASIS,
151440  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
151441  * See the License for the specific language governing permissions and
151442  * limitations under the License.
151443  */
151444 module.exports = function () {
151445     this.fileName = "";
151446     this.MIMEType = "";
151447     this.size = 0;
151448 };
151449
151450 });
151451 define('ripple/platform/wac/1.0/Multimedia', function (require, exports, module) {
151452 /*
151453  *  Copyright 2011 Research In Motion Limited.
151454  *
151455  * Licensed under the Apache License, Version 2.0 (the "License");
151456  * you may not use this file except in compliance with the License.
151457  * You may obtain a copy of the License at
151458  *
151459  * http://www.apache.org/licenses/LICENSE-2.0
151460  *
151461  * Unless required by applicable law or agreed to in writing, software
151462  * distributed under the License is distributed on an "AS IS" BASIS,
151463  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
151464  * See the License for the specific language governing permissions and
151465  * limitations under the License.
151466  */
151467 var event = require('ripple/event'),
151468     VideoPlayer = require('ripple/platform/wac/1.0/VideoPlayer'),
151469     AudioPlayer = require('ripple/platform/wac/1.0/AudioPlayer'),
151470     constants = require('ripple/constants'),
151471     _volume = 5,
151472     _audioState,
151473     _videoState,
151474     _self;
151475
151476 event.on("MultimediaVolumeChanged", function updateVolume(volume) {
151477     _volume = volume;
151478 });
151479
151480 event.on("MultimediaAudioStateChanged", function updateAudioState(state) {
151481     _audioState = state;
151482 });
151483
151484 event.on("MultimediaVideoStateChanged", function updateVideoState(state) {
151485     _videoState = state;
151486 });
151487
151488 _self = {
151489
151490     isAudioPlaying: undefined,
151491     isVideoPlaying: undefined,
151492
151493     getVolume: function () {
151494         return _volume;
151495     },
151496
151497     stopAll: function () {
151498         VideoPlayer.stop();
151499         AudioPlayer.stop();
151500     }
151501 };
151502
151503 _self.__defineGetter__("isAudioPlaying", function () {
151504     return _audioState === constants.MULTIMEDIA.AUDIO_STATES.PLAYING;
151505 });
151506
151507 _self.__defineGetter__("isVideoPlaying", function () {
151508     return _videoState === "playing";
151509 });
151510
151511 module.exports = _self;
151512
151513 });
151514 define('ripple/platform/wac/1.0/CalendarItem', function (require, exports, module) {
151515 /*
151516  *  Copyright 2011 Research In Motion Limited.
151517  *
151518  * Licensed under the Apache License, Version 2.0 (the "License");
151519  * you may not use this file except in compliance with the License.
151520  * You may obtain a copy of the License at
151521  *
151522  * http://www.apache.org/licenses/LICENSE-2.0
151523  *
151524  * Unless required by applicable law or agreed to in writing, software
151525  * distributed under the License is distributed on an "AS IS" BASIS,
151526  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
151527  * See the License for the specific language governing permissions and
151528  * limitations under the License.
151529  */
151530 var constants = require('ripple/constants'),
151531     db = require('ripple/db'),
151532     exception = require('ripple/exception'),
151533     Exception = require('ripple/platform/wac/1.0/Exception'),
151534     ExceptionTypes = require('ripple/platform/wac/1.0/ExceptionTypes');
151535
151536 module.exports = function () {
151537     this.calendarItemId = undefined;
151538     this.alarmDate = undefined;
151539     this.eventStartTime = undefined;
151540     this.eventEndTime = undefined;
151541     this.eventName = undefined;
151542     this.eventNotes = undefined;
151543     this.alarmed = undefined;
151544
151545     this.update = function () {
151546         var events = db.retrieveObject(constants.PIM.CALENDAR_LIST_KEY) || [],
151547             that = this,
151548             eventIndex = events.reduce(function (match, value, i) {
151549                 return value.calendarItemId === that.calendarItemId ?
151550                     i : match;
151551             }, -1);
151552
151553
151554         if (eventIndex >= 0) {
151555             events[eventIndex] = this;
151556             db.saveObject(constants.PIM.CALENDAR_LIST_KEY, events);
151557         }
151558         else {
151559             exception.raise(ExceptionTypes.INVALID_PARAMETER, "Calendar Item not found: " + (this.calendarItemId || ""), new Exception());
151560         }
151561     };
151562 };
151563
151564 });
151565 define('ripple/platform/wac/1.0/Config', function (require, exports, module) {
151566 /*
151567  *  Copyright 2011 Research In Motion Limited.
151568  *
151569  * Licensed under the Apache License, Version 2.0 (the "License");
151570  * you may not use this file except in compliance with the License.
151571  * You may obtain a copy of the License at
151572  *
151573  * http://www.apache.org/licenses/LICENSE-2.0
151574  *
151575  * Unless required by applicable law or agreed to in writing, software
151576  * distributed under the License is distributed on an "AS IS" BASIS,
151577  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
151578  * See the License for the specific language governing permissions and
151579  * limitations under the License.
151580  */
151581 var utils = require('ripple/utils'),
151582     notifications = require('ripple/notifications'),
151583     constants = require('ripple/constants'),
151584     deviceSettings = require('ripple/deviceSettings'),
151585     ExceptionTypes = require('ripple/platform/wac/1.0/ExceptionTypes'),
151586     Exception = require('ripple/platform/wac/1.0/Exception'),
151587     _self = {
151588         ringtoneVolume: undefined,
151589         msgRingtoneVolume: undefined,
151590         vibrationSetting: undefined,
151591
151592         setDefaultRingtone: function (ringtoneUrl) {
151593             utils.validateArgumentType(ringtoneUrl, "string", ExceptionTypes.INVALID_PARAMETER, "ringtoneUrl paramter is not a string", new Exception());
151594             notifications.openNotification("normal", "Setting default ringtone to: " + ringtoneUrl);
151595         },
151596
151597         setAsWallpaper: function (wallpaperUrl) {
151598             utils.validateArgumentType(wallpaperUrl, "string", ExceptionTypes.INVALID_PARAMETER, "wallpaperUrl paramter is not a string", new Exception());
151599             notifications.openNotification("normal", "Setting wallpaper to: " + wallpaperUrl);
151600         }
151601     };
151602
151603 _self.__defineGetter__("ringtoneVolume", function () {
151604     return deviceSettings.retrieve("Config.ringtoneVolume");
151605 });
151606
151607 _self.__defineGetter__("msgRingtoneVolume", function () {
151608     return deviceSettings.retrieve("Config.msgRingtoneVolume");
151609 });
151610
151611 _self.__defineGetter__("vibrationSetting", function () {
151612     return deviceSettings.retrieve("Config.vibrationSetting");
151613 });
151614
151615 module.exports = _self;
151616
151617 });
151618 define('ripple/platform/wac/1.0/WidgetManager', function (require, exports, module) {
151619 /*
151620  *  Copyright 2011 Research In Motion Limited.
151621  *
151622  * Licensed under the Apache License, Version 2.0 (the "License");
151623  * you may not use this file except in compliance with the License.
151624  * You may obtain a copy of the License at
151625  *
151626  * http://www.apache.org/licenses/LICENSE-2.0
151627  *
151628  * Unless required by applicable law or agreed to in writing, software
151629  * distributed under the License is distributed on an "AS IS" BASIS,
151630  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
151631  * See the License for the specific language governing permissions and
151632  * limitations under the License.
151633  */
151634 var exception = require('ripple/exception'),
151635     ExceptionTypes = require('ripple/platform/wac/1.0/ExceptionTypes'),
151636     Exception = require('ripple/platform/wac/1.0/Exception');
151637
151638 module.exports = {
151639     // This method is used to check the installation status of a specific widget.
151640     checkWidgetInstallationStatus: function () {
151641
151642         exception.raise(ExceptionTypes.UNSUPPORTED, "WidgetManager.checkWidgetInstallationStatus not supported", new Exception());
151643     }
151644 };
151645
151646 });
151647 define('ripple/platform/wac/1.0/Telephony', function (require, exports, module) {
151648 /*
151649  *  Copyright 2011 Research In Motion Limited.
151650  *
151651  * Licensed under the Apache License, Version 2.0 (the "License");
151652  * you may not use this file except in compliance with the License.
151653  * You may obtain a copy of the License at
151654  *
151655  * http://www.apache.org/licenses/LICENSE-2.0
151656  *
151657  * Unless required by applicable law or agreed to in writing, software
151658  * distributed under the License is distributed on an "AS IS" BASIS,
151659  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
151660  * See the License for the specific language governing permissions and
151661  * limitations under the License.
151662  */
151663 var _self,
151664     exception = require('ripple/exception'),
151665     utils = require('ripple/utils'),
151666     db = require('ripple/db'),
151667     constants = require('ripple/constants'),
151668     Device = require('ripple/platform/wac/1.0/Device'),
151669     ExceptionTypes = require('ripple/platform/wac/1.0/ExceptionTypes'),
151670     Exception = require('ripple/platform/wac/1.0/Exception');
151671
151672
151673 function _throwUnsupportedException(method) {
151674     exception.raise(ExceptionTypes.UNSUPPORTED, "Method not supported." + (method || ""), new Exception());
151675 }
151676
151677 _self = {
151678
151679     // Public Callbacks
151680     onCallEvent: undefined,// function (callType, phoneNumber) { },
151681     onCallRecordsFound: undefined,// function (callRecords) { };
151682
151683     // Public Methods
151684     initiateVoiceCall: function (phoneNumber) {
151685         utils.validateNumberOfArguments(1, 1, arguments.length, ExceptionTypes.INVALID_PARAMETER, "initiateVoiceCall invalid number of parameters", new Exception());
151686         //HACK: should this be hardcoded?
151687         //I am still not even sure this is the correct behaviour
151688         Device.launchApplication("PHONECALL", phoneNumber);
151689
151690         if (_self.onCallEvent) {
151691             //HACK: shouldn't be hardcoded
151692             //also what should the context be? isn't spec'ed
151693             _self.onCallEvent.apply(_self, ["outgoing", phoneNumber]);
151694         }
151695     },
151696     getCallRecordCnt: function (callRecordType) {
151697         utils.validateNumberOfArguments(1, 1, arguments.length, ExceptionTypes.INVALID_PARAMETER, "getCallRecordCnt invalid number of parameters", new Exception());
151698         var calls = db.retrieveObject(constants.TELEPHONY.CALL_LIST_KEY);
151699
151700         return utils.sum(calls, function (call) {
151701             return call.callRecordType === callRecordType;
151702         });
151703     },
151704     getCallRecord: function (callRecordType, id) {
151705         utils.validateNumberOfArguments(2, 2, arguments.length, ExceptionTypes.INVALID_PARAMETER, "getCallRecord invalid number of parameters", new Exception());
151706         var calls = db.retrieveObject(constants.TELEPHONY.CALL_LIST_KEY);
151707
151708         return utils.map(calls, function (call) {
151709             return call.callRecordType === callRecordType ? call : null;
151710         }).reduce(function (match, call) {
151711             return match || call.callRecordId === id || null;
151712         }, null);
151713     },
151714     deleteCallRecord: function (callRecordType, id) {
151715         utils.validateNumberOfArguments(2, 2, arguments.length, ExceptionTypes.INVALID_PARAMETER, "deleteCallRecord invalid number of parameters", new Exception());
151716         var calls = db.retrieveObject(constants.TELEPHONY.CALL_LIST_KEY),
151717             indexToDelete = calls.reduce(function (result, call, index) {
151718                 return call.callRecordType === callRecordType &&
151719                        call.callRecordId === id ? index : result;
151720             }, -1);
151721
151722         if (indexToDelete >= 0) {
151723             calls.splice(indexToDelete, 1);
151724             db.saveObject(constants.TELEPHONY.CALL_LIST_KEY, calls);
151725         }
151726
151727     },
151728
151729     deleteAllCallRecords: function (callRecordType) {
151730         utils.validateNumberOfArguments(1, 1, arguments.length, ExceptionTypes.INVALID_PARAMETER, "deleteAllCallRecords invalid number of parameters", new Exception());
151731         var calls = db.retrieveObject(constants.TELEPHONY.CALL_LIST_KEY),
151732             indexesToDelete = calls.reduce(function (result, call, index) {
151733                 if (call.callRecordType === callRecordType) {
151734                     result.push(index);
151735                 }
151736                 return result;
151737             }, []);
151738
151739         utils.forEach(indexesToDelete, function (index) {
151740             calls.splice(index, 1);
151741         });
151742
151743         if (indexesToDelete.length > 0) {
151744             db.saveObject(constants.TELEPHONY.CALL_LIST_KEY, calls);
151745         }
151746
151747     },
151748
151749     findCallRecords: function (comparisonRecord, startInx, endInx) {
151750         utils.validateNumberOfArguments(1, 3, arguments.length, ExceptionTypes.INVALID_PARAMETER, "findCallRecords invalid number of parameters", new Exception());
151751         var calls = db.retrieveObject(constants.TELEPHONY.CALL_LIST_KEY);
151752         utils.find(comparisonRecord, calls, startInx, endInx, _self.onCallRecordsFound);
151753
151754     }
151755
151756 };
151757
151758 module.exports = _self;
151759
151760 });
151761 define('ripple/platform/wac/1.0/Messaging', function (require, exports, module) {
151762 /*
151763  *  Copyright 2011 Research In Motion Limited.
151764  *
151765  * Licensed under the Apache License, Version 2.0 (the "License");
151766  * you may not use this file except in compliance with the License.
151767  * You may obtain a copy of the License at
151768  *
151769  * http://www.apache.org/licenses/LICENSE-2.0
151770  *
151771  * Unless required by applicable law or agreed to in writing, software
151772  * distributed under the License is distributed on an "AS IS" BASIS,
151773  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
151774  * See the License for the specific language governing permissions and
151775  * limitations under the License.
151776  */
151777 var exception = require('ripple/exception'),
151778     utils = require('ripple/utils'),
151779     constants = require('ripple/constants'),
151780     notifications = require('ripple/notifications'),
151781     _console = require('ripple/console'),
151782     Message = require('ripple/platform/wac/1.0/Message'),
151783     MessageTypes = require('ripple/platform/wac/1.0/MessageTypes'),
151784     Exception = require('ripple/platform/wac/1.0/Exception'),
151785     ExceptionTypes = require('ripple/platform/wac/1.0/ExceptionTypes');
151786
151787 function _throwUnsupportedException(method) {
151788     exception.raise(ExceptionTypes.UNSUPPORTED, "Method not supported." + (method || ""), new Exception());
151789 }
151790
151791 module.exports = {
151792     onMessageArrived: undefined,
151793     onMessageSendingFailure: undefined,
151794     onMessagesFound: undefined,
151795
151796     createMessage: function (messageType) {
151797         utils.validateNumberOfArguments(1, 1, arguments.length, ExceptionTypes.INVALID_PARAMETER, "createMessage invalid number of arguments", new Exception());
151798         utils.validateArgumentType(messageType, "string", ExceptionTypes.INVALID_PARAMETER, "createMessage invalid arguments", new Exception());
151799
151800         if (!utils.some(MessageTypes, function (value) {
151801                 return value === messageType;
151802             })) {
151803             exception.raise(ExceptionTypes.INVALID_PARAMETER, "createMessage invalid arguments", new Exception());
151804         }
151805
151806         var message = new Message();
151807         message.messageType = messageType;
151808
151809         return message;
151810     },
151811     deleteMessage: function () {
151812         _throwUnsupportedException("Messaging.deleteMessage");
151813     },
151814     getMessage: function () {
151815         _throwUnsupportedException("Messaging.getMessage");
151816     },
151817     getMessageQuantities: function () {
151818         _throwUnsupportedException("Messaging.getMessageQuantities");
151819     },
151820     sendMessage: function (msg) {
151821         utils.validateNumberOfArguments(1, 1, arguments.length, ExceptionTypes.UNSUPPORTED, "sendMessage invalid number of arguments", new Exception());
151822         if (msg instanceof Message === false) {
151823             exception.raise(ExceptionTypes.INVALID_PARAMETER, "expected a valid Message object", new Exception());
151824         }
151825
151826         //TODO: Must be modded to fail and to then call the onMessageSendingFailure callback
151827         var message = "Sent " + msg.messageType + " " + msg.messageId + " to " + msg.destinationAddress;
151828
151829         // insert fail check here
151830         notifications.openNotification("normal", message);
151831         _console.log(message);
151832     },
151833     moveMessageToFolder: function () {
151834         _throwUnsupportedException("Messaging.moveMessageToFolder");
151835     },
151836     copyMessageToFolder: function () {
151837         _throwUnsupportedException("Messaging.copyMessageToFolder");
151838     },
151839     createFolder: function () {
151840         _throwUnsupportedException("Messaging.createFolder");
151841     },
151842     deleteFolder: function () {
151843         _throwUnsupportedException("Messaging.deleteFolder");
151844     },
151845     getFolderNames: function () {
151846         _throwUnsupportedException("Messaging.getFolderNames");
151847     },
151848     findMessages: function () {
151849         _throwUnsupportedException("Messaging.findMessages");
151850     },
151851     getCurrentEmailAccount: function () {
151852         _throwUnsupportedException("Messaging.getCurrentEmailAccount");
151853     },
151854     getEmailAccounts: function () {
151855         _throwUnsupportedException("Messaging.getEmailAccounts");
151856     },
151857     setCurrentEmailAccount: function () {
151858         _throwUnsupportedException("Messaging.setCurrentEmailAccount");
151859     },
151860     deleteEmailAccount: function () {
151861         _throwUnsupportedException("Messaging.deleteEmailAccount");
151862     }
151863
151864 };
151865
151866 });
151867 define('ripple/platform/wac/1.0/ExceptionTypes', function (require, exports, module) {
151868 /*
151869  *  Copyright 2011 Research In Motion Limited.
151870  *
151871  * Licensed under the Apache License, Version 2.0 (the "License");
151872  * you may not use this file except in compliance with the License.
151873  * You may obtain a copy of the License at
151874  *
151875  * http://www.apache.org/licenses/LICENSE-2.0
151876  *
151877  * Unless required by applicable law or agreed to in writing, software
151878  * distributed under the License is distributed on an "AS IS" BASIS,
151879  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
151880  * See the License for the specific language governing permissions and
151881  * limitations under the License.
151882  */
151883 var _self =  {};
151884
151885 _self.__defineGetter__("INVALID_PARAMETER", function () {
151886     return "invalid_parameter";
151887 });
151888
151889 _self.__defineGetter__("SECURITY", function () {
151890     return "security";
151891 });
151892
151893 _self.__defineGetter__("UNKNOWN", function () {
151894     return "unknown";
151895 });
151896
151897 _self.__defineGetter__("UNSUPPORTED", function () {
151898     return "unsupported";
151899 });
151900
151901 module.exports = _self;
151902
151903 });
151904 define('ripple/platform/wac/1.0/PowerInfo', function (require, exports, module) {
151905 /*
151906  *  Copyright 2011 Research In Motion Limited.
151907  *
151908  * Licensed under the Apache License, Version 2.0 (the "License");
151909  * you may not use this file except in compliance with the License.
151910  * You may obtain a copy of the License at
151911  *
151912  * http://www.apache.org/licenses/LICENSE-2.0
151913  *
151914  * Unless required by applicable law or agreed to in writing, software
151915  * distributed under the License is distributed on an "AS IS" BASIS,
151916  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
151917  * See the License for the specific language governing permissions and
151918  * limitations under the License.
151919  */
151920 var _self,
151921     event = require('ripple/event'),
151922     _console = require('ripple/console'),
151923     deviceSettings = require('ripple/deviceSettings'),
151924     _lastPercentRemaining;
151925
151926 _self = {
151927     isCharging: undefined,
151928     percentRemaining: undefined,
151929
151930     onChargeStateChange: undefined,
151931     onLowBattery: undefined,
151932     onChargeLevelChange: undefined
151933 };
151934
151935 function _getCurrentChargeState(percentRemaining, isCharging) {
151936     var batteryState;
151937     if (percentRemaining === 100 && isCharging) {
151938         batteryState = "full";
151939     }
151940     else if (!isCharging) {
151941         batteryState = "discharging";
151942     }
151943     else {
151944         batteryState = "charging";
151945     }
151946     return batteryState;
151947 }
151948
151949 event.on("DeviceBatteryStateChanged", function (isCharging) {
151950     var callback = _self.onChargeStateChange,
151951         msg = "",
151952         batteryLevel = _self.percentRemaining,
151953         batteryState;
151954
151955     batteryState = _getCurrentChargeState(batteryLevel, isCharging);
151956
151957     msg += "Fired onChargeStateChange with batteryState: " + batteryState;
151958
151959     if (callback && typeof callback === "function") {
151960         callback.apply(null, [batteryState]);
151961     }
151962     else {
151963         msg += " --> BUT there was no registered callback found.";
151964     }
151965
151966     _console.log(msg);
151967 });
151968
151969 event.on("DeviceBatteryLevelChanged", function (percentRemaining) {
151970
151971     var callback = _self.onChargeLevelChange,
151972         lowBatteryCallback = _self.onLowBattery,
151973         msg = "Fired onChargeLevelChange with percentRemaining: " + percentRemaining;
151974
151975     // blah, stupid Options returning strings
151976     percentRemaining = parseInt(percentRemaining, 10);
151977
151978     if (callback && typeof callback === "function") {
151979         callback.apply(null, [percentRemaining]);
151980     }
151981     else {
151982         msg += " --> BUT there was no registered callback found.";
151983     }
151984
151985     _console.log(msg);
151986
151987     if (percentRemaining <= 10) {
151988
151989         msg = "Fired onLowBattery with percentRemaining: " + percentRemaining;
151990
151991         if (lowBatteryCallback && typeof lowBatteryCallback === "function") {
151992             lowBatteryCallback.apply(null, [percentRemaining]);
151993         }
151994         else {
151995             msg += " --> BUT there was no registered callback found.";
151996         }
151997
151998         _console.log(msg);
151999     }
152000
152001     if (percentRemaining === 100 || (percentRemaining < 100 && _lastPercentRemaining === 100)) {
152002         event.trigger("DeviceBatteryStateChanged", [_self.isCharging]);
152003     }
152004
152005     _lastPercentRemaining = percentRemaining;
152006
152007 });
152008
152009 _self.__defineGetter__("isCharging", function () {
152010     return deviceSettings.retrieveAsBoolean("PowerInfo.isCharging");
152011 });
152012
152013 _self.__defineGetter__("percentRemaining", function () {
152014     return deviceSettings.retrieveAsInt("PowerInfo.percentRemaining");
152015 });
152016
152017 module.exports = _self;
152018
152019 });
152020 define('ripple/platform/wac/2.0/devicestatus', function (require, exports, module) {
152021 /*
152022  *  Copyright 2011 Intel Corporation.
152023  *
152024  * Licensed under the Apache License, Version 2.0 (the "License");
152025  * you may not use this file except in compliance with the License.
152026  * You may obtain a copy of the License at
152027  *
152028  * http://www.apache.org/licenses/LICENSE-2.0
152029  *
152030  * Unless required by applicable law or agreed to in writing, software
152031  * distributed under the License is distributed on an "AS IS" BASIS,
152032  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
152033  * See the License for the specific language governing permissions and
152034  * limitations under the License.
152035  */
152036
152037 var utils = require('ripple/utils'),
152038     wac2_utils = require('ripple/platform/wac/2.0/wac2_utils'),
152039     errorcode = require('ripple/platform/wac/2.0/errorcode'),
152040     _console = require('ripple/console'),
152041     DeviceApiError = require('ripple/platform/wac/2.0/deviceapierror'),
152042     deviceSettings = require('ripple/deviceSettings'),    
152043     event = require('ripple/event'),    
152044     PendingOperation = require('ripple/platform/wac/2.0/pendingoperation'),
152045     PendingObject = require('ripple/platform/wac/2.0/pendingObject'),
152046     _getDeviceInfoAspect = true,
152047     _getNetworkInfoAspect = true,    
152048     _deviceInfoAspect = ["Battery", "Device", "Display", "MemoryUnit", "OperatingSystem", "WebRuntime"],    
152049     _networkInfoAspect = ["CellularHardware", "CellularNetwork", "WiFiHardware", "WiFiNetwork"],
152050     _aspectArray = [], 
152051     _propertyMap = {},
152052     _watches = {},
152053     _self;
152054
152055 function _asynchErrorCallback(errorCallback, errorCode) {
152056     if (errorCallback) {        
152057         setTimeout(function () {
152058             errorCallback(errorCode);
152059         }, 1);  
152060     }
152061 }
152062
152063 function _initialize() {
152064     var aspectName, index, i;
152065
152066     _aspectArray = _deviceInfoAspect.concat(_networkInfoAspect);
152067     for (index = 0; index < _aspectArray.length; index++) {
152068         aspectName = _aspectArray[index];
152069         _propertyMap[aspectName] = [];
152070         for (i in deviceSettings.retrieve(aspectName)) {
152071             _propertyMap[aspectName].push(i);
152072         }
152073     }     
152074 }
152075
152076 function _isPropertyFound(aspect, property) {
152077     if (_aspectArray.length === 0) {
152078         _initialize();
152079     }
152080
152081     if (_propertyMap[aspect]) {
152082         if (property) {
152083             return _propertyMap[aspect].some(function (prop) {
152084                 return prop === property;
152085             });
152086         }
152087         return true;
152088     }
152089     return false;
152090 }
152091
152092 function _isPropertyAllowed(aspect) {
152093     function hasAspect(asp) {
152094         return asp === aspect;
152095     }
152096
152097     if ((_deviceInfoAspect.some(hasAspect) && _getDeviceInfoAspect === false) ||
152098         (_networkInfoAspect.some(hasAspect) && _getNetworkInfoAspect === false)) {
152099         return false;
152100     }
152101
152102     return true;
152103 }
152104
152105 function _isPropertyValid(prop, errorCallback) {
152106     var _prop = Object(prop);
152107
152108     if (_prop && _prop.aspect && _prop.property) {
152109         if (_isPropertyFound(_prop.aspect, _prop.property) === false) {
152110             _asynchErrorCallback(errorCallback, new DeviceApiError(errorcode.NOT_FOUND_ERR));
152111             return false;
152112         }
152113         else if (_isPropertyAllowed(_prop.aspect) === false) {
152114             _asynchErrorCallback(errorCallback, new DeviceApiError(errorcode.SECURITY_ERR));
152115             return false;
152116         }
152117     } 
152118     else {
152119         _asynchErrorCallback(errorCallback, new DeviceApiError(errorcode.INVALID_VALUES_ERR));
152120         return false;
152121     }
152122     return true;
152123 }
152124
152125 module.exports = function () {
152126     return {  
152127         getComponents: function (aspect) {
152128             if (_isPropertyFound(aspect))
152129                 return ["_default"];
152130             return null;              
152131         },
152132
152133         isSupported: function (aspect, property) {
152134             return _isPropertyFound(aspect, property);
152135         },
152136
152137         getPropertyValue: function (successCallback, errorCallback, prop) {
152138             return wac2_utils.validateTypeMismatch(successCallback, errorCallback, "getPropertyValue", function () {                                  
152139                 if (_isPropertyValid(prop, errorCallback) !== true)
152140                     return undefined;
152141                 
152142                 var value = deviceSettings.retrieve(prop.aspect + "." + prop.property);
152143                 if (value !== undefined) {
152144                     successCallback(value, prop);
152145                 }
152146                 else {
152147                     _asynchErrorCallback(errorCallback, new DeviceApiError(errorcode.NOT_AVAILABLE_ERR)); 
152148                 }
152149                 
152150                 return null;    
152151             });        
152152         },
152153        
152154         watchPropertyChange: function (successCallback, errorCallback, prop, options) {  
152155             return wac2_utils.validateTypeMismatch(successCallback, errorCallback, "watchPropertyChange", function () {
152156                 if (_isPropertyValid(prop, errorCallback) !== true)
152157                     return undefined;
152158
152159                 var _options = Object(options),
152160                     eventType = deviceSettings.retrieve(prop.aspect)[prop.property].event,
152161                     watchObj = {
152162                         eventType: eventType,
152163                         onEvent: function (newValue) {
152164                             if (watchObj.timeStamp && 
152165                                 ((new Date()).getTime() - watchObj.timeStamp < options.minNotificationInterval)) {
152166                                 return undefined;
152167                             }                       
152168                             else if (watchObj.value &&
152169                                      (newValue > watchObj.value * (1 - _options.minChangePercent) && 
152170                                       newValue < watchObj.value * (1 + _options.minChangePercent))) {
152171                                 return undefined;
152172                             }
152173
152174                             if (watchObj.intervalId) {
152175                                 clearInterval(watchObj.intervalId);
152176                                 watchObj.intervalId = setInterval(function () {
152177                                     successCallback(deviceSettings.retrieve(prop.aspect + "." + prop.property), prop);
152178                                 }, _options.maxNotificationInterval);
152179                             }
152180                             successCallback(newValue, prop);
152181                             if (watchObj.timeStamp) {
152182                                 watchObj.timeStamp = (new Date()).getTime();
152183                             }
152184                             if (watchObj.value) {
152185                                 watchObj.value = newValue;
152186                             }
152187                         }                              
152188                     },
152189                     watchId = (new Date()).getTime() | 0;
152190
152191                 if (options && _options.minNotificationInterval && _options.maxNotificationInterval && 
152192                     (_options.minNotificationInterval < 0 || _options.maxNotificationInterval < 0 || 
152193                      _options.minNotificationInterval >= _options.maxNotificationInterval)) {
152194                     _asynchErrorCallback(errorCallback, new DeviceApiError(errorcode.INVALID_VALUES_ERR));
152195                     return undefined;
152196                 }
152197
152198                 if (options && _options.maxNotificationInterval) {
152199                     watchObj.intervalId = setInterval(function () {
152200                         successCallback(deviceSettings.retrieve(prop.aspect + "." + prop.property), prop);
152201                     }, _options.maxNotificationInterval);
152202                 }    
152203
152204                 if (options && _options.minNotificationInterval) {
152205                     watchObj.timeStamp = (new Date()).getTime();
152206                 }                    
152207
152208                 if (options && _options.minChangePercent) {
152209                     if (_options.minNotificationInterval || _options.maxNotificationInterval) {}
152210                     else {                
152211                         watchObj.value = deviceSettings.retrieve(prop.aspect + "." + prop.property);
152212                     }
152213                 }
152214                
152215                 _watches[watchId] = watchObj;
152216                 if (watchObj.eventType) {
152217                     event.on(watchObj.eventType, watchObj.onEvent);
152218                 }
152219
152220                 return watchId;
152221             });             
152222         },
152223
152224         clearPropertyChange: function (watchHandler) {
152225             var _handler = watchHandler | 0;
152226             
152227             if (_watches[_handler]) {
152228                 event.deleteEventHandler(_watches[_handler].eventType, _watches[_handler].onEvent);            
152229                 if (_watches[_handler].intervalId) {
152230                     clearInterval(_watches[_handler].intervalId);
152231                 }
152232                 delete(_watches[_handler]); 
152233             }
152234             return null;
152235         },
152236
152237         handleSubFeatures: function (subFeatures) {
152238             if (wac2_utils.isEmptyObject(subFeatures) ||
152239                 subFeatures["http://wacapps.net/api/devicestatus"] || 
152240                 (subFeatures["http://wacapps.net/api/devicestatus.deviceinfo"] &&
152241                  subFeatures["http://wacapps.net/api/devicestatus.networkinfo"])) {
152242                 return;
152243             }
152244             if (subFeatures["http://wacapps.net/api/devicestatus.deviceinfo"]) {
152245                 _getNetworkInfoAspect = false;
152246                 return;
152247             }
152248             if (subFeatures["http://wacapps.net/api/devicestatus.networkinfo"]) {
152249                 _getDeviceInfoAspect = false;
152250                 return;
152251             }
152252             _console.warn("WAC-2.0-Devicestatus-handleSubFeatures: something wrong");
152253         }
152254     };
152255 };
152256
152257
152258 });
152259 define('ripple/platform/wac/2.0/messagefilter', function (require, exports, module) {
152260 /*
152261  *  Copyright 2011 Intel Corporation.
152262  *
152263  * Licensed under the Apache License, Version 2.0 (the "License");
152264  * you may not use this file except in compliance with the License.
152265  * You may obtain a copy of the License at
152266  *
152267  * http://www.apache.org/licenses/LICENSE-2.0
152268  *
152269  * Unless required by applicable law or agreed to in writing, software
152270  * distributed under the License is distributed on an "AS IS" BASIS,
152271  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
152272  * See the License for the specific language governing permissions and
152273  * limitations under the License.
152274  */
152275
152276 var _self;
152277
152278 _self = function (criteria) {
152279     var pattern,
152280         messageFilter;
152281
152282     messageFilter = {
152283         match: function (target) {
152284             var result = false, index;
152285
152286             if (Object.prototype.toString.call(criteria) === "[object Array]") {
152287                 for (index in criteria) {
152288                     if (_self(criteria[index]).match(target))
152289                         return true;
152290                 }
152291                 return false;
152292             }
152293
152294             switch (Object.prototype.toString.call(target)) {
152295             case "[object Number]":
152296                 result = (criteria === target);
152297                 break;
152298
152299             case "[object String]":
152300                 result = pattern.test(target);
152301                 break;
152302
152303             case "[object Array]":
152304                 for (index in target) {
152305                     if (messageFilter.match(target[index]))
152306                         return true;
152307                 }
152308                 break;
152309             }
152310
152311             return result;
152312         }
152313     };
152314
152315     if (typeof criteria === "string")
152316         pattern = new RegExp(criteria.replace(/(^|[^\\])%+/g, "$1.*").replace(/\\%/g, "%").replace(/.*/, "^$&$"), "i");
152317
152318     return messageFilter;
152319 };
152320
152321 module.exports = _self;
152322
152323 });
152324 define('ripple/platform/wac/2.0/errorcode', function (require, exports, module) {
152325 /*
152326  *  Copyright 2011 Intel Corporation.
152327  *
152328  * Licensed under the Apache License, Version 2.0 (the "License"),
152329  * you may not use this file except in compliance with the License.
152330  * You may obtain a copy of the License at
152331  *
152332  * http://www.apache.org/licenses/LICENSE-2.0
152333  *
152334  * Unless required by applicable law or agreed to in writing, software
152335  * distributed under the License is distributed on an "AS IS" BASIS,
152336  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
152337  * See the License for the specific language governing permissions and
152338  * limitations under the License.
152339  */
152340
152341 var _self = {
152342     message : []
152343 };
152344
152345 _self.__defineGetter__("UNKNOWN_ERR", function () {
152346     return 0;
152347 });
152348
152349 _self.__defineGetter__("INDEX_SIZE_ERR", function () {
152350     return 1;
152351 });
152352
152353 _self.__defineGetter__("DOMSTRING_SIZE_ERR", function () {
152354     return 2;
152355 });
152356
152357 _self.__defineGetter__("HIERARCHY_REQUEST_ERR", function () {
152358     return 3;
152359 });
152360
152361 _self.__defineGetter__("WRONG_DOCUMENT_ERR", function () {
152362     return 4;
152363 });
152364
152365 _self.__defineGetter__("INVALID_CHARACTER_ERR", function () {
152366     return 5;
152367 });
152368
152369 _self.__defineGetter__("NO_DATA_ALLOWED_ERR", function () {
152370     return 6;
152371 });
152372
152373 _self.__defineGetter__("NO_MODIFICATION_ALLOWED_ERR", function () {
152374     return 7;
152375 });
152376
152377 _self.__defineGetter__("NOT_FOUND_ERR", function () {
152378     return 8;
152379 });
152380
152381 _self.__defineGetter__("NOT_SUPPORTED_ERR", function () {
152382     return 9;
152383 });
152384
152385 _self.__defineGetter__("INUSE_ATTRIBUTE_ERR", function () {
152386     return 10;
152387 });
152388
152389 _self.__defineGetter__("INVALID_STATE_ERR", function () {
152390     return 11;
152391 });
152392
152393 _self.__defineGetter__("SYNTAX_ERR", function () {
152394     return 12;
152395 });
152396
152397 _self.__defineGetter__("INVALID_MODIFICATION_ERR", function () {
152398     return 13;
152399 });
152400
152401 _self.__defineGetter__("NAMESPACE_ERR", function () {
152402     return 14;
152403 });
152404
152405 _self.__defineGetter__("INVALID_ACCESS_ERR", function () {
152406     return 15;
152407 });
152408
152409 _self.__defineGetter__("VALIDATION_ERR", function () {
152410     return 16;
152411 });
152412
152413 _self.__defineGetter__("TYPE_MISMATCH_ERR", function () {
152414     return 17;
152415 });
152416
152417 _self.__defineGetter__("SECURITY_ERR", function () {
152418     return 18;
152419 });
152420
152421 _self.__defineGetter__("NETWORK_ERR", function () {
152422     return 19;
152423 });
152424
152425 _self.__defineGetter__("ABORT_ERR", function () {
152426     return 20;
152427 });
152428
152429 _self.__defineGetter__("TIMEOUT_ERR", function () {
152430     return 21;
152431 });
152432
152433 _self.__defineGetter__("INVALID_VALUES_ERR", function () {
152434     return 22;
152435 });
152436
152437 _self.__defineGetter__("IO_ERR", function () {
152438     return 100;
152439 });
152440
152441 _self.__defineGetter__("NOT_AVAILABLE_ERR", function () {
152442     return 101;
152443 });
152444
152445 function _setMessage(_self) {
152446     var c, g;
152447     for (c in _self) {
152448         g = _self.__lookupGetter__(c);
152449         if (g) {
152450             _self.message[g()] = c;
152451         }
152452     }
152453 }
152454
152455 _setMessage(_self);
152456
152457 module.exports = _self;
152458
152459
152460 });
152461 define('ripple/platform/wac/2.0/messaging', function (require, exports, module) {
152462 /*
152463  *  Copyright 2011 Intel Corporation.
152464  *
152465  * Licensed under the Apache License, Version 2.0 (the "License");
152466  * you may not use this file except in compliance with the License.
152467  * You may obtain a copy of the License at
152468  *
152469  * http://www.apache.org/licenses/LICENSE-2.0
152470  *
152471  * Unless required by applicable law or agreed to in writing, software
152472  * distributed under the License is distributed on an "AS IS" BASIS,
152473  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
152474  * See the License for the specific language governing permissions and
152475  * limitations under the License.
152476  */
152477
152478 var utils = require('ripple/utils'),
152479     event = require('ripple/event'),
152480     db = require('ripple/db'),
152481     exception = require('ripple/exception'),
152482     errorcode = require('ripple/platform/wac/2.0/errorcode'),
152483     wac2_utils = require('ripple/platform/wac/2.0/wac2_utils'),
152484     DeviceApiError = require('ripple/platform/wac/2.0/deviceapierror'),
152485     PendingOperation = require('ripple/platform/wac/2.0/pendingoperation'),
152486     PendingObject = require('ripple/platform/wac/2.0/pendingObject'),
152487     TypeCoerce = require('ripple/platform/wac/2.0/typecoerce'),
152488     Filter = require('ripple/platform/wac/2.0/messagefilter'),
152489     FileSystem = require('ripple/platform/wac/2.0/filesystem'),
152490     MessageSendCallback,
152491     Message,
152492     MessageFilter,
152493     Recipients,
152494     _KEY = "wac2-pim-messaging",
152495     _PENDING_TIME = 600,
152496     _messages = {},
152497     _subscriber = {
152498         onSMS: {},
152499         onMMS: {},
152500         onEmail: {}
152501     },
152502     _sentStatus = {},
152503     _security = {
152504         "http://wacapps.net/api/messaging": [],
152505         "http://wacapps.net/api/messaging.send": ["sendMessage"],
152506         "http://wacapps.net/api/messaging.find": ["findMessages"],
152507         "http://wacapps.net/api/messaging.subscribe": ["onSMS", "onMMS", "onEmail"],
152508         "http://wacapps.net/api/messaging.write": ["update"],
152509         all: true
152510     },
152511     _fileSystem,
152512     _initialized = false,
152513     _self;
152514
152515 function _initialize() {
152516     _get();
152517     if (!_fileSystem) {
152518         _fileSystem = new FileSystem();
152519     }
152520     _initialized = true;
152521 }
152522
152523 function _get() {
152524     _messages = db.retrieveObject(_KEY) || {1: [], 2: [], 3: [], 4: []};
152525     utils.forEach(_messages, function (folder) {
152526         utils.forEach(folder, function (messageItem) {
152527             if (messageItem.timestamp)
152528                 messageItem.timestamp = new Date(messageItem.timestamp);
152529         });
152530     });
152531 }
152532
152533 function _save() {
152534     db.saveObject(_KEY, _messages);
152535 }
152536
152537 function _updateDB(message, duplicate) {
152538     _get();
152539     _messages[message.folder].push(message);
152540     if (duplicate)
152541         _messages[duplicate.folder].push(duplicate);
152542     _save();
152543 }
152544
152545 function _processAttachments(message) {
152546     var attachmentsFileName = [],
152547         attachmentsContent = [];
152548
152549     function _generateAttachmentFileName(attachment) {
152550         var lastDot = attachment.filename.lastIndexOf(".");
152551         return attachment.filename.substring(0, lastDot) + "_" + Math.uuid(8, 16) + attachment.filename.substring(lastDot);
152552     }
152553
152554     function _onResolveSuccess(file) {
152555         var fileAttachment = file.createFile(attachmentsFileName[0]);
152556
152557         fileAttachment.openStream(
152558             function (fs) {
152559                 fs.write(attachmentsContent[0]);
152560                 fs.close();
152561             }, null, "w");
152562     }
152563
152564     function _onResolveError() {
152565     }
152566
152567     if (message.attachments.length === 0)
152568         return;
152569
152570     attachmentsFileName.push(_generateAttachmentFileName(message.attachments[0]));
152571     attachmentsContent.push(message.attachments[0].content);
152572
152573     _fileSystem.resolve(_onResolveSuccess, _onResolveError, "attachments", "rw");
152574
152575     message.attachments = utils.copy(attachmentsFileName);
152576 }
152577
152578 function _errorOccurred(onError, code) {
152579     if (!onError)
152580         return;
152581
152582     setTimeout(function () {
152583         onError(new DeviceApiError(code));
152584     }, 1);
152585 }
152586
152587 function _pendingOperate(operate, scope) {
152588     var i, argumentVector = [];
152589
152590     for (i = 0; i < arguments.length - 2; i++)
152591         argumentVector[i] = arguments[i + 2];
152592
152593     return function () {
152594         var pendingObj, pendingOperation;
152595
152596         pendingObj = new PendingObject();
152597         pendingObj.pendingID = window.setTimeout(function () {
152598             pendingObj.setCancelFlag(false);
152599             if (operate)
152600                 operate.apply(scope, argumentVector);
152601         }, _PENDING_TIME);
152602
152603         pendingOperation = new PendingOperation(pendingObj);
152604
152605         return pendingOperation;
152606     };
152607 }
152608
152609 function _onMessage(onMessage, messageHandler) {
152610     if (!messageHandler)
152611         exception.raise(exception.types.Argument,
152612             onMessage + " invalid messageHandler parameter",
152613             new DeviceApiError(errorcode.INVALID_VALUES_ERR));
152614
152615     utils.validateArgumentType(messageHandler, "function", null,
152616         "messageHandler invalid function parameter",
152617         new DeviceApiError(errorcode.TYPE_MISMATCH_ERR));
152618
152619     if (!_security.all && !_security[onMessage])
152620         exception.raise(exception.types.Argument,
152621             onMessage + " access denied", new DeviceApiError(errorcode.SECURITY_ERR));
152622
152623     var idSubscribe = (new Date()).getTime() | 0;
152624     _subscriber[onMessage][idSubscribe] = messageHandler;
152625
152626     return idSubscribe;
152627 }
152628
152629 function _validateRecipients(message) {
152630     var i;
152631
152632     for (i = 0; i < message.to.length;) {
152633         message.to[i] = message.to[i].replace(/^\s*(\S*)\s*$/, '$1');
152634         if (message.to[i] === "")
152635             message.to.splice(i, 1);
152636         else
152637             i++;
152638     }
152639     for (i = 0; i < message.cc.length;) {
152640         message.cc[i] = message.cc[i].replace(/^\s*(\S*)\s*$/, '$1');
152641         if (message.cc[i] === "")
152642             message.cc.splice(i, 1);
152643         else
152644             i++;
152645     }
152646     for (i = 0; i < message.bcc.length;) {
152647         message.bcc[i] = message.bcc[i].replace(/^\s*(\S*)\s*$/, '$1');
152648         if (message.bcc[i] === "")
152649             message.bcc.splice(i, 1);
152650         else
152651             i++;
152652     }
152653     if (message.to.length + message.cc.length + message.bcc.length === 0)
152654         exception.raise(exception.types.Argument,
152655             "sendMessage invalid message.to parameter",
152656             new DeviceApiError(errorcode.INVALID_VALUES_ERR));
152657 }
152658
152659 function _isValid(onSuccess, onError, message) {
152660     if (onSuccess &&
152661         typeof onSuccess !== "function" &&
152662         typeof onSuccess !== "object") {
152663         exception.raise(exception.types.Argument,
152664             "sendMessage invalid successCallback parameter",
152665             new DeviceApiError(errorcode.TYPE_MISMATCH_ERR));
152666     }
152667
152668     if (onError) {
152669         utils.validateArgumentType(onError, "function", null,
152670             "sendMessage invalid errorCallback parameter",
152671             new DeviceApiError(errorcode.TYPE_MISMATCH_ERR));
152672     }
152673
152674     if (!onSuccess) {
152675         _errorOccurred(onError, errorcode.INVALID_VALUES_ERR);
152676         return false;
152677     }
152678
152679     if (message) {
152680         utils.validateArgumentType(message, "object", null,
152681             "sendMessage invalid message parameter",
152682             new DeviceApiError(errorcode.INVALID_VALUES_ERR));
152683     } else {
152684         _errorOccurred(onError, errorcode.INVALID_VALUES_ERR);
152685         return false;
152686     }
152687
152688     if (message.type !== _self().TYPE_SMS &&
152689         message.type !== _self().TYPE_MMS &&
152690         message.type !== _self().TYPE_EMAIL)
152691         exception.raise(exception.types.Argument,
152692             "sendMessage invalid message.type parameter",
152693             new DeviceApiError(errorcode.INVALID_VALUES_ERR));
152694
152695     if (!_security.all && !_security.sendMessage) {
152696         _errorOccurred(onError, errorcode.SECURITY_ERR);
152697         return false;
152698     }
152699
152700     TypeCoerce(Message(0)).cast(message);
152701     _validateRecipients(message);
152702
152703     return true;
152704 }
152705
152706 function _getEachSentStatus(onMessageSentSuccess, onMessageSentError, message,
152707                             sucRecipients, failRecipients, recType) {
152708     utils.forEach(message[recType], function (recipient) {
152709         if (_sentStatus[recipient]) {
152710             sucRecipients[recType].push(recipient);
152711             if (onMessageSentSuccess) {
152712                 onMessageSentSuccess(recipient);
152713             }
152714         } else {
152715             failRecipients[recType].push(recipient);
152716             if (onMessageSentError) {
152717                 onMessageSentError(new DeviceApiError(errorcode.UNKNOWN_ERR), recipient);
152718             }
152719         }
152720     });
152721 }
152722
152723 function _getSentStatus(onSuccess, onError, message, onMessageSentSuccess, onMessageSentError) {
152724     var allSentSuccess,
152725         sucRecipients = new Recipients(),
152726         failRecipients = new Recipients(),
152727         duplicate;
152728
152729     _getEachSentStatus(onMessageSentSuccess, onMessageSentError,
152730         message, sucRecipients, failRecipients, "to");
152731
152732     if (message.type === _self().TYPE_EMAIL) {
152733         _getEachSentStatus(onMessageSentSuccess, onMessageSentError,
152734             message, sucRecipients, failRecipients, "cc");
152735         _getEachSentStatus(onMessageSentSuccess, onMessageSentError,
152736             message, sucRecipients, failRecipients, "bcc");
152737     }
152738
152739     allSentSuccess = (failRecipients.total() === 0);
152740
152741     if (allSentSuccess) {
152742         message.folder = _self().FOLDER_SENTBOX;
152743     } else if (sucRecipients.total() === 0) {
152744         message.folder = _self().FOLDER_DRAFTS;
152745     } else {
152746         duplicate = utils.copy(message);
152747
152748         message.to = sucRecipients.to;
152749         message.cc = sucRecipients.cc;
152750         message.bcc = sucRecipients.bcc;
152751         message.folder = _self().FOLDER_SENTBOX;
152752
152753         duplicate.to = failRecipients.to;
152754         duplicate.cc = failRecipients.cc;
152755         duplicate.bcc = failRecipients.bcc;
152756         duplicate.folder = _self().FOLDER_DRAFTS;
152757     }
152758
152759     _updateDB(message, duplicate);
152760
152761     if (allSentSuccess) {
152762         onSuccess();
152763     } else if (onError) {
152764         onError(new DeviceApiError(errorcode.UNKNOWN_ERR));
152765     }
152766 }
152767
152768 _self = function () {
152769     var messaging = {
152770         createMessage: function (type) {
152771             type = type | 0;
152772
152773             if (type < _self().TYPE_SMS || type > _self().TYPE_EMAIL)
152774                 exception.raise(exception.types.Argument,
152775                 "type invalid value", new DeviceApiError(errorcode.INVALID_VALUES_ERR));
152776
152777             var msg = new Message(type);
152778
152779             return msg;
152780         },
152781
152782         sendMessage: function (successCallback, errorCallback, message) {
152783             var ret;
152784
152785             function _sendMessage() {
152786                 event.trigger("OutsideMessageReceived", [message]);
152787
152788                 return _pendingOperate(_getSentStatus, undefined,
152789                     successCallback, errorCallback, message)();
152790             }
152791
152792             function _sendEachMessage() {
152793                 utils.forEach(successCallback, function (value, key) {
152794                     utils.validateArgumentType(value, "function", null,
152795                         "sendMessage invalid successCallback." + key + " parameter",
152796                         new DeviceApiError(errorcode.TYPE_MISMATCH_ERR));
152797                 });
152798
152799                 event.trigger("OutsideMessageReceived", [message]);
152800
152801                 return _pendingOperate(_getSentStatus, undefined,
152802                     successCallback.onsuccess, errorCallback, message,
152803                     successCallback.onmessagesendsuccess, successCallback.onmessagesenderror)();
152804             }
152805
152806             if (!_isValid(successCallback, errorCallback, message))
152807                 return null;
152808
152809             switch (typeof successCallback) {
152810             case "function":
152811                 ret = _sendMessage();
152812                 break;
152813
152814             case "object":
152815                 ret = _sendEachMessage();
152816                 break;
152817             }
152818
152819             return ret;
152820         },
152821
152822         findMessages: function (successCallback, errorCallback, filter) {
152823             function _findMessages() {
152824                 var message, result = [];
152825
152826                 if (!_security.all && !_security.findMessages)
152827                     return _errorOccurred(errorCallback, errorcode.SECURITY_ERR);
152828
152829                 utils.forEach(_messages, function (folder) {
152830                     utils.forEach(folder, function (messageItem) {
152831                         if ((filter                 === undefined || filter === null) ||
152832                             (filter.id              === undefined || Filter(filter.id).match(messageItem.id)) &&
152833                             (filter.type            === undefined || Filter(filter.type).match(messageItem.type)) &&
152834                             (filter.folder          === undefined || Filter(filter.folder).match(messageItem.folder)) &&
152835                             (filter.startTimestamp  === undefined || (messageItem.timestamp >= filter.startTimestamp)) &&
152836                             (filter.endTimestamp    === undefined || (messageItem.timestamp <= filter.endTimestamp)) &&
152837                             (filter.from            === undefined || Filter(filter.from).match(messageItem.from)) &&
152838                             (filter.to              === undefined || Filter(filter.to).match(messageItem.to)) &&
152839                             (filter.cc              === undefined || Filter(filter.cc).match(messageItem.cc)) &&
152840                             (filter.bcc             === undefined || Filter(filter.bcc).match(messageItem.bcc)) &&
152841                             (filter.body            === undefined || Filter(filter.body).match(messageItem.body)) &&
152842                             (filter.isRead          === undefined || (messageItem.isRead === filter.isRead)) &&
152843                             (filter.messagePriority === undefined || (messageItem.priority === filter.messagePriority)) &&
152844                             (filter.subject         === undefined || Filter(filter.subject).match(messageItem.subject))) {
152845                             message = utils.copy(messageItem);
152846                             result.push(message);
152847                         }
152848                     });
152849                 });
152850                 successCallback(result);
152851             }
152852             return wac2_utils.validateTypeMismatch(successCallback, errorCallback, "findMessages", _pendingOperate(_findMessages));
152853         },
152854
152855         onSMS: function (messageHandler) {
152856             return _onMessage("onSMS", messageHandler);
152857         },
152858
152859         onMMS: function (messageHandler) {
152860             return _onMessage("onMMS", messageHandler);
152861         },
152862
152863         onEmail: function (messageHandler) {
152864             return _onMessage("onEmail", messageHandler);
152865         },
152866
152867         unsubscribe: function (subscriptionHandler) {
152868             var onMessage, idSubscribe;
152869
152870             utils.validateArgumentType(subscriptionHandler, "integer",
152871                 null, "subscriptionHandler invalid function parameter",
152872                 new DeviceApiError(errorcode.TYPE_MISMATCH_ERR));
152873
152874             for (onMessage in _subscriber) {
152875                 for (idSubscribe in _subscriber[onMessage]) {
152876                     if (idSubscribe == subscriptionHandler) {
152877                         delete _subscriber[onMessage][idSubscribe];
152878                         return;
152879                     }
152880                 }
152881             }
152882         },
152883
152884         handleSubFeatures: function (subFeatures) {
152885             for (var subFeature in subFeatures) {
152886                 if (_security[subFeature].length === 0) {
152887                     _security.all = true;
152888                     return;
152889                 }
152890                 _security.all = false;
152891                 utils.forEach(_security[subFeature], function (method) {
152892                     _security[method] = true;
152893                 });
152894             }
152895         }
152896     };
152897
152898     messaging.__defineGetter__("TYPE_SMS", function () {
152899         return 1;
152900     });
152901
152902     messaging.__defineGetter__("TYPE_MMS", function () {
152903         return 2;
152904     });
152905
152906     messaging.__defineGetter__("TYPE_EMAIL", function () {
152907         return 3;
152908     });
152909
152910     messaging.__defineGetter__("FOLDER_INBOX", function () {
152911         return 1;
152912     });
152913
152914     messaging.__defineGetter__("FOLDER_OUTBOX", function () {
152915         return 2;
152916     });
152917
152918     messaging.__defineGetter__("FOLDER_DRAFTS", function () {
152919         return 3;
152920     });
152921
152922     messaging.__defineGetter__("FOLDER_SENTBOX", function () {
152923         return 4;
152924     });
152925
152926     if (!_initialized)
152927         _initialize();
152928
152929     return messaging;
152930 };
152931
152932 MessageSendCallback = {
152933     onsuccess: function () {},
152934     onmessagesendsuccess: function (recipient) {},
152935     onmessagesenderror: function (error, recipient) {}
152936 };
152937
152938 Message = function (type) {
152939     this.id = Math.uuid(null, 16);
152940     this.type = type;
152941     this.folder = 0;
152942     this.timestamp = new Date();
152943     this.from = "";
152944     this.to = [""];
152945     this.cc = [""];
152946     this.bcc = [""];
152947     this.body = "";
152948     this.isRead = false;
152949     this.priority = false;
152950     this.subject = "";
152951     this.attachments = [""];
152952
152953     this.update = function (successCallback, errorCallback) {
152954         function _update() {
152955             var isFound = false;
152956
152957             if (!_security.all && !_security.update)
152958                 return _errorOccurred(errorCallback, errorcode.SECURITY_ERR);
152959
152960             TypeCoerce(new Message(0)).cast(this);
152961             _get();
152962             utils.forEach(_messages[this.folder], function (messageItem) {
152963                 if (messageItem.id === this.id) {
152964                     !this.isRead || (messageItem.isRead = this.isRead);
152965                     if (this.folder === _self().FOLDER_DRAFTS) {
152966                         !this.type        || (messageItem.type        = this.type);
152967                         !this.to          || (messageItem.to          = utils.copy(this.to));
152968                         !this.cc          || (messageItem.cc          = utils.copy(this.cc));
152969                         !this.bcc         || (messageItem.bcc         = utils.copy(this.bcc));
152970                         !this.body        || (messageItem.body        = this.body);
152971                         !this.priority    || (messageItem.priority    = this.priority);
152972                         !this.subject     || (messageItem.subject     = this.subject);
152973                         !this.attachments || (messageItem.attachments = utils.copy(this.attachments));
152974                     }
152975                     isFound = true;
152976                 }
152977             });
152978
152979             if (isFound) {
152980                 _save();
152981                 successCallback();
152982             } else {
152983                 _errorOccurred(errorCallback, errorcode.NOT_FOUND_ERR);
152984             }
152985         }
152986         return wac2_utils.validateTypeMismatch(successCallback, errorCallback, "update", _pendingOperate(_update, this));
152987     };
152988 };
152989
152990 MessageFilter = {
152991     id: "",
152992     type: [0],
152993     folder: [0],
152994     startTimestamp: new Date(),
152995     endTimestamp: new Date(),
152996     from: "",
152997     to: [""],
152998     cc: [""],
152999     bcc: [""],
153000     body: "",
153001     isRead: false,
153002     messagePriority: false,
153003     subject: ""
153004 };
153005
153006 Recipients = function () {
153007     this.to  = [];
153008     this.cc  = [];
153009     this.bcc = [];
153010
153011     this.total = function () {
153012         return (this.to.length + this.cc.length + this.bcc.length);
153013     };
153014 };
153015
153016 event.on("MessageReceived", function (message) {
153017     var onMessage;
153018
153019     switch (message.type) {
153020     case "sms":
153021         message.type = _self().TYPE_SMS;
153022         onMessage = "onSMS";
153023         break;
153024
153025     case "mms":
153026         message.type = _self().TYPE_MMS;
153027         onMessage = "onMMS";
153028         break;
153029
153030     case "email":
153031         message.type = _self().TYPE_EMAIL;
153032         onMessage = "onEmail";
153033         break;
153034
153035     default:
153036         break;
153037     }
153038
153039     message.folder = _self().FOLDER_INBOX;
153040     _processAttachments(message);
153041     _updateDB(message);
153042     utils.forEach(_subscriber[onMessage], function (subscriberCallback) {
153043         subscriberCallback(message);
153044     });
153045 });
153046
153047 event.on("MessageSent", function (sentStatus) {
153048     _sentStatus = sentStatus;
153049 });
153050
153051 module.exports = _self;
153052
153053 });
153054 define('ripple/platform/wac/2.0/spec', function (require, exports, module) {
153055 /*
153056  *  Copyright 2011 Intel Corporation.
153057  *
153058  * Licensed under the Apache License, Version 2.0 (the "License");
153059  * you may not use this file except in compliance with the License.
153060  * You may obtain a copy of the License at
153061  *
153062  * http://www.apache.org/licenses/LICENSE-2.0
153063  *
153064  * Unless required by applicable law or agreed to in writing, software
153065  * distributed under the License is distributed on an "AS IS" BASIS,
153066  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
153067  * See the License for the specific language governing permissions and
153068  * limitations under the License.
153069  */
153070
153071 module.exports = {
153072
153073     id: "wac",
153074     version: "2.0",
153075     name: "WAC",
153076
153077     persistencePrefix: "wac2-",
153078
153079     config: require('ripple/platform/wac/2.0/spec/config'),
153080     ui: require('ripple/platform/wac/2.0/spec/ui'),
153081     device: require('ripple/platform/wac/2.0/spec/device'),
153082
153083     objects: {
153084         Coordinates: {
153085             path: "w3c/1.0/Coordinates"
153086         },
153087         Position: {
153088             path: "w3c/1.0/Position"
153089         },
153090         PositionError: {
153091             path: "w3c/1.0/PositionError"
153092         },
153093         navigator: {
153094             path: "w3c/1.0/navigator",
153095             children: {
153096                 geolocation: {
153097                     path: "wac/2.0/geolocation",
153098                     feature: "http://www.w3.org/TR/geolocation-API/"
153099                 }
153100             }
153101         },
153102         deviceapis: {
153103             path: "wac/2.0/deviceapis",
153104             feature: "http://wacapps.net/api/deviceapis",
153105             /*
153106              * Before we inject those cloned objects into the simulated application
153107              * namespace, we will handle the feature requests from config.xml.
153108              * Especially for:
153109              * - camera.show, camera.capture
153110              * - devicestatus.deviceinfo, devicestatus.networkinfo
153111              * - filesystem.read, filesystem.write
153112              * - messaging.send, messaging.find, messaging.subscribe, messaging.write
153113              * - pim
153114              *  - contact.read, contact.write
153115              *  - calendar.read, calendar.write
153116              *  - task.read, task.write
153117              */
153118             children: {
153119                 accelerometer: {
153120                     path: "wac/2.0/accelerometer",
153121                     feature: "http://wacapps.net/api/accelerometer"
153122                 },
153123                 orientation: {
153124                     path: "wac/2.0/orientation",
153125                     feature: "http://wacapps.net/api/orientation"
153126                 },
153127                 camera: {
153128                     path: "wac/2.0/camera",
153129                     feature: "http://wacapps.net/api/camera|http://wacapps.net/api/camera.show|http://wacapps.net/api/camera.capture",
153130                     handleSubfeatures: true
153131                 },
153132                 devicestatus: {
153133                     path: "wac/2.0/devicestatus",
153134                     feature: "http://wacapps.net/api/devicestatus|http://wacapps.net/api/devicestatus.deviceinfo|http://wacapps.net/api/devicestatus.networkinfo",
153135                     handleSubfeatures: true
153136                 },
153137                 filesystem: {
153138                     path: "wac/2.0/filesystem",
153139                     feature: "http://wacapps.net/api/filesystem|http://wacapps.net/api/filesystem.read|http://wacapps.net/api/filesystem.write",
153140                     handleSubfeatures: true
153141                 },
153142                 messaging: {
153143                     path: "wac/2.0/messaging",
153144                     feature: "http://wacapps.net/api/messaging|http://wacapps.net/api/messaging.send|http://wacapps.net/api/messaging.find|http://wacapps.net/api/messaging.subscribe|http://wacapps.net/api/messaging.write",
153145                     handleSubfeatures: true
153146                 },
153147                 pim: {
153148                     children: {
153149                         contact: {
153150                             path: "wac/2.0/contact",
153151                             feature: "http://wacapps.net/api/pim.contact|http://wacapps.net/api/pim.contact.read|http://wacapps.net/api/pim.contact.write",
153152                             handleSubfeatures: true
153153                         },
153154                         calendar: {
153155                             path: "wac/2.0/calendar",
153156                             feature: "http://wacapps.net/api/pim.calendar.write|http://wacapps.net/api/pim.calendar.read|http://wacapps.net/api/pim.calendar",
153157                             handleSubfeatures: true
153158                         },
153159                         task: {
153160                             path: "wac/2.0/task",
153161                             feature: "http://wacapps.net/api/pim.task|http://wacapps.net/api/pim.task.read|http://wacapps.net/api/pim.task.write",
153162                             handleSubfeatures: true
153163                         }
153164                     }
153165                 },
153166                 deviceinteraction: {
153167                     path: "wac/2.0/deviceinteraction",
153168                     feature: "http://wacapps.net/api/deviceinteraction"
153169                 }
153170             }
153171         }
153172     }
153173 };
153174
153175
153176 });
153177 define('ripple/platform/wac/2.0/task', function (require, exports, module) {
153178 /*
153179  *  Copyright 2011 Intel Corporation.
153180  *
153181  * Licensed under the Apache License, Version 2.0 (the "License");
153182  * you may not use this file except in compliance with the License.
153183  * You may obtain a copy of the License at
153184  *
153185  * http://www.apache.org/licenses/LICENSE-2.0
153186  *
153187  * Unless required by applicable law or agreed to in writing, software
153188  * distributed under the License is distributed on an "AS IS" BASIS,
153189  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
153190  * See the License for the specific language governing permissions and
153191  * limitations under the License.
153192  */
153193
153194 var db = require('ripple/db'),
153195     utils = require('ripple/utils'),
153196     _console = require('ripple/console'),
153197     exception = require('ripple/exception'),
153198     errorcode = require('ripple/platform/wac/2.0/errorcode'),
153199     wac2_utils = require('ripple/platform/wac/2.0/wac2_utils'),
153200     PendingObject = require('ripple/platform/wac/2.0/pendingObject'),
153201     DeviceApiError = require('ripple/platform/wac/2.0/deviceapierror'),
153202     PendingOperation = require('ripple/platform/wac/2.0/pendingoperation'),
153203     Task, TaskList, _get,
153204     _ID_WITHOUT = 0, _ID_GEN_NEW = 1, _ID_FROM_PROP = 2,
153205     _SIM_TASK_LIST = 0, _DEVICE_TASK_LIST = 1,
153206     _HIGH_PRIORITY = 0, _MEDIUM_PRIORITY = 1, _LOW_PRIORITY = 2,
153207     _STATUS_COMPLETED = 0, _STATUS_NEEDS_ACTION = 1, _STATUS_IN_PROCESS = 2, _STATUS_CANCELLED = 3,
153208     _TASK_OBJECTS = "wac2.0-pim-task-objects",
153209     _addTaskAllowed = true, _deleteTaskAllowed = true,
153210     _updateTaskAllowed = true, _findTasksAllowed = true;
153211
153212
153213 module.exports = function () {
153214     var _taskListArray = [],
153215         _PENDING_TIME = 10;
153216
153217     function _pendingOperate(operate) {
153218         var pendingObj, pendingOperation, i, argumentVector = [];
153219
153220         for (i = 0; i < arguments.length - 1; i++)
153221             argumentVector[i] = arguments[i + 1];
153222
153223         pendingObj = new PendingObject();
153224
153225         pendingObj.pendingID = window.setTimeout(function () {
153226             pendingObj.setCancelFlag(false);
153227             operate.apply(this, argumentVector);
153228         }, _PENDING_TIME);
153229
153230         pendingOperation = new PendingOperation(pendingObj);
153231
153232         return pendingOperation;
153233     }
153234
153235     /* taskProperties attribute check & paste */
153236     function _checkAndPasteProperties(p, dst) {
153237
153238         if (p.summary !== null && p.summary !== undefined)
153239             dst.summary = String(p.summary);
153240
153241         if (p.description !== null && p.description !== undefined)
153242             dst.description = String(p.description);
153243
153244         if (p.status !== null && p.status !== undefined) {
153245             if (p.status === _STATUS_COMPLETED ||
153246                 p.status === _STATUS_NEEDS_ACTION ||
153247                 p.status === _STATUS_IN_PROCESS ||
153248                 p.status === _STATUS_CANCELLED) {
153249                 dst.status = p.status;
153250             } else
153251                 return false;
153252         }
153253
153254         if (p.priority !== null && p.priority !== undefined) {
153255             if (p.priority === _HIGH_PRIORITY ||
153256                 p.priority === _MEDIUM_PRIORITY ||
153257                 p.priority === _LOW_PRIORITY) {
153258                 dst.priority = p.priority;
153259             } else
153260                 return false;
153261         }
153262
153263         if (p.dueDate !== null && p.dueDate !== undefined) {
153264             if (!wac2_utils.isValidDate(p.dueDate))
153265                 return false;
153266             dst.dueDate = new Date(p.dueDate);
153267         }
153268
153269         /* dueDate is a option properties.
153270            "The default value is undefined.
153271              If no value is provided, the task has no due date."
153272            If p.dueDate is set its default value 'undefined',
153273            we assign default value to dst.dueDate */
153274         if (p.dueDate === undefined) {
153275             dst.dueDate = undefined;
153276         }
153277
153278         return true;
153279     }
153280
153281     function _taskFilterCheck(filter) {
153282         var i;
153283         if (filter.id !== undefined && filter.id !== null) {
153284             filter.id = String(filter.id);
153285         } else {
153286             filter.id = undefined;
153287         }
153288         if (filter.summary !== undefined && filter.summary !== null) {
153289             filter.summary = String(filter.summary);
153290         } else {
153291             filter.summary = undefined;
153292         }
153293         if (filter.description !== undefined && filter.description !== null) {
153294             filter.description = String(filter.description);
153295         } else {
153296             filter.description = undefined;
153297         }
153298         if (filter.status !== undefined && filter.status !== null) {
153299             if (!wac2_utils.isValidArray(filter.status))  {
153300                 return false;
153301             }
153302             for (i = 0; i < filter.status.length; i++) {
153303                 filter.status[i] = filter.status[i] | 0;
153304                 if (filter.status[i] !== _STATUS_COMPLETED &&
153305                     filter.status[i] !== _STATUS_NEEDS_ACTION &&
153306                     filter.status[i] !== _STATUS_IN_PROCESS &&
153307                     filter.status[i] !== _STATUS_CANCELLED) {
153308                     return false;
153309                 }
153310             }
153311         } else {
153312             filter.status = undefined;
153313         }
153314         if (filter.priority !== undefined && filter.priority !== null) {
153315             if (!wac2_utils.isValidArray(filter.priority))  {
153316                 return false;
153317             }
153318             for (i = 0; i < filter.priority.length; i++) {
153319                 filter.priority[i] = filter.priority[i] | 0;
153320                 if (filter.priority[i] !== _HIGH_PRIORITY &&
153321                     filter.priority[i] !== _MEDIUM_PRIORITY &&
153322                     filter.priority[i] !== _LOW_PRIORITY) {
153323                     return false;
153324                 }
153325             }
153326         } else {
153327             filter.priority = undefined;
153328         }
153329         if (filter.dueDate !== undefined && filter.dueDate !== null) {
153330             if (!wac2_utils.isValidDate(filter.dueDate)) {
153331                 return false;
153332             }
153333             filter.dueDate = new Date(filter.dueDate);
153334         } else {
153335             filter.dueDate = undefined;
153336         }
153337         return true;
153338     }
153339
153340     function TaskProperties(prop) {
153341         var _self;
153342         _self = {
153343             priority : _LOW_PRIORITY,
153344             description : "",
153345             summary : "",
153346             dueDate : undefined,
153347             status : _STATUS_NEEDS_ACTION
153348         };
153349         if (prop) {
153350             if (_checkAndPasteProperties(prop, _self) === false)
153351                 return undefined;
153352         }
153353         return _self;
153354     }
153355
153356     function Task(prop, idChoice) {
153357         var id, _self = new TaskProperties(prop);
153358         /* if error occurs during checking, _self is an empty object.
153359            so i randomly pick description to check if property check fails */
153360         if (_self.description === undefined)
153361             return undefined;
153362
153363         switch (idChoice) {
153364         case _ID_WITHOUT:
153365             // do nothing
153366             break;
153367         case _ID_GEN_NEW:
153368             id = Math.uuid(undefined, 16);
153369             _self.__defineGetter__("id", function () {
153370                 return id;
153371             });
153372             break;
153373         case _ID_FROM_PROP:
153374             id = String(prop.id);
153375             _self.__defineGetter__("id", function () {
153376                 return id;
153377             });
153378             break;
153379         }
153380
153381         return _self;
153382     }
153383
153384     function _get() {
153385         var taskListArray = [],
153386             data = db.retrieveObject(_TASK_OBJECTS);
153387         utils.forEach(data, function (taskList) {
153388             for (var t in taskList._list) {
153389                 if (taskList._list[t].dueDate !== undefined &&
153390                     taskList._list[t].dueDate !== null)
153391                     taskList._list[t].dueDate = new Date(taskList._list[t].dueDate);
153392             }
153393             taskListArray.push(new TaskList(taskList._list, taskList.type, taskList.name));
153394         });
153395
153396         /* add default taskList if taskListArray is empty */
153397         if (taskListArray.length === 0) {
153398             taskListArray = [new TaskList({}, 0, "Office tasks"), new TaskList({}, 1, "Home tasks")];
153399         }
153400
153401         return taskListArray;
153402     }
153403
153404     function _save() {
153405         db.saveObject(_TASK_OBJECTS, _taskListArray);
153406     }
153407
153408     function TaskList(taskList, type, name) {
153409         var task;
153410         this._list = taskList;
153411         this.type = type;
153412         this.name = name;
153413
153414         this.createTask = function (properties) {
153415             task = new Task(properties, _ID_WITHOUT);
153416             /* if error occurs during checking, task is an empty object.
153417                so i randomly pick summary to check if property check fails */
153418             if (task.summary === undefined) {
153419                 exception.raise(exception.types.Argument,
153420                         "EventProperties: input parameter contains invalid values",
153421                         new DeviceApiError(errorcode.INVALID_VALUES_ERR));
153422                 return undefined;
153423             }
153424             return task;
153425         };
153426
153427         this.addTask = function (onSuccess, onError, task) {
153428             var inner = this,
153429                 newTask, _task = Object(task);
153430             function _addTask() {
153431                 var ret;
153432                 if (!_addTaskAllowed) {
153433                     if (onError) {
153434                         setTimeout(function () {
153435                             onError(new DeviceApiError(errorcode.SECURITY_ERR));
153436                         }, 1);
153437                     }
153438                     return undefined;
153439                 }
153440                 newTask = new Task(_task, _ID_GEN_NEW);
153441                 /* if error occurs during checking, newTask is an empty object.
153442                     so i randomly pick id to check if property check fails */
153443                 if (newTask.id === undefined) {
153444                     if (onError) {
153445                         setTimeout(function () {
153446                             onError(new DeviceApiError(errorcode.INVALID_VALUES_ERR));
153447                         }, 1);
153448                     }
153449                     return undefined;
153450                 }
153451                 ret = _pendingOperate(function () {
153452                     inner._list[newTask.id] = newTask;
153453                     _save();
153454                     onSuccess(new Task(newTask, _ID_FROM_PROP));
153455                 });
153456             }
153457
153458             return wac2_utils.validateTypeMismatch(onSuccess, onError, "addTask", _addTask);
153459         };
153460
153461         this.updateTask = function (onSuccess, onError, task) {
153462             var inner = this,
153463                 newTask, _task = Object(task);
153464             function _updateTask() {
153465                 var ret;
153466                 if (!_updateTaskAllowed) {
153467                     if (onError) {
153468                         setTimeout(function () {
153469                             onError(new DeviceApiError(errorcode.SECURITY_ERR));
153470                         }, 1);
153471                     }
153472                     return undefined;
153473                 }
153474
153475                 if (_checkAndPasteProperties(_task, _task) === false) {
153476                     if (onError) {
153477                         setTimeout(function () {
153478                             onError(new DeviceApiError(errorcode.INVALID_VALUES_ERR));
153479                         }, 1);
153480                     }
153481                     return undefined;
153482                 }
153483
153484                 ret = _pendingOperate(function () {
153485                     if (inner._list[_task.id]) {
153486                         newTask = new Task(inner._list[_task.id], _ID_FROM_PROP);
153487                         /* Don't need to double check the return of _checkAndPasteProperties 
153488                            _task has been checked & pasted already */
153489                         _checkAndPasteProperties(_task, newTask);
153490                         inner._list[newTask.id] = newTask;
153491                         _save();
153492                         onSuccess();
153493                     } else {
153494                         if (onError) {
153495                             onError(new DeviceApiError(errorcode.NOT_FOUND_ERR));
153496                         }
153497                     }
153498                 });
153499                 return ret;
153500             }
153501
153502             return wac2_utils.validateTypeMismatch(onSuccess, onError, "updateTask", _updateTask);
153503         };
153504
153505         this.deleteTask = function (onSuccess, onError, id) {
153506             var inner = this;
153507             function _deleteTask() {
153508                 var ret;
153509                 /* according to spec  "If any of the input parameters are not 
153510                    compatible with the expected type for that parameter, 
153511                    a DeviceAPIError with code TYPE_MISMATCH_ERR MUST be 
153512                    synchronously thrown." so an error is raised synchronously */
153513                 utils.validateArgumentType(id, "string", null,
153514                         "Task:deleteTask: " + " invalid id parameter",
153515                         new DeviceApiError(errorcode.TYPE_MISMATCH_ERR));
153516                 if (!_deleteTaskAllowed) {
153517                     if (onError) {
153518                         setTimeout(function () {
153519                             onError(new DeviceApiError(errorcode.SECURITY_ERR));
153520                         }, 1);
153521                     }
153522                     return undefined;
153523                 }
153524                 ret = _pendingOperate(function () {
153525                     if (inner._list[id]) {
153526                         delete inner._list[id];
153527                         _save();
153528                         onSuccess();
153529                     } else {
153530                         if (onError)
153531                             onError(new DeviceApiError(errorcode.NOT_FOUND_ERR));
153532                     }
153533                 });
153534                 return ret;
153535             }
153536
153537             return wac2_utils.validateTypeMismatch(onSuccess, onError, "deleteTask", _deleteTask);
153538         };
153539
153540         this.findTasks = function (onSuccess, onError, filter) {
153541             var inner = this, _filter = Object(filter), tmp = [], rst = [], valid_tmp = false;
153542             function _findTasks() {
153543                 var ret;
153544                 if (!_taskFilterCheck(_filter)) {
153545                     if (onError) {
153546                         setTimeout(function () {
153547                             onError(new DeviceApiError(errorcode.INVALID_VALUES_ERR));
153548                         }, 1);
153549                     }
153550                     return undefined;
153551                 }
153552                 if (!_findTasksAllowed) {
153553                     if (onError) {
153554                         setTimeout(function () {
153555                             onError(new DeviceApiError(errorcode.SECURITY_ERR));
153556                         }, 1);
153557                     }
153558                     return undefined;
153559                 }
153560                 ret = _pendingOperate(function () {
153561                     var i, e;
153562                     if (_filter.id !== undefined) {
153563                         tmp = wac2_utils.matchOptionString(inner._list, "id", _filter.id);
153564                         valid_tmp = true;
153565                     }
153566                     if (_filter.summary !== undefined) {
153567                         if (valid_tmp) {
153568                             tmp = wac2_utils.matchOptionString(tmp, "summary", _filter.summary);
153569                         } else {
153570                             tmp = wac2_utils.matchOptionString(inner._list, "summary", _filter.summary);
153571                             valid_tmp = true;
153572                         }
153573                     }
153574                     if (_filter.description !== undefined) {
153575                         if (valid_tmp) {
153576                             tmp = wac2_utils.matchOptionString(tmp, "description", _filter.description);
153577                         } else {
153578                             tmp = wac2_utils.matchOptionString(inner._list, "description", _filter.description);
153579                             valid_tmp = true;
153580                         }
153581                     }
153582                     if (_filter.status !== undefined) {
153583                         if (valid_tmp) {
153584                             tmp = wac2_utils.matchOptionShortArray(tmp, "status", _filter.status);
153585                         } else {
153586                             tmp = wac2_utils.matchOptionShortArray(inner._list, "status", _filter.status);
153587                             valid_tmp = true;
153588                         }
153589                     }
153590                     if (_filter.priority !== undefined) {
153591                         if (valid_tmp) {
153592                             tmp = wac2_utils.matchOptionShortArray(tmp, "priority", _filter.priority);
153593                         } else {
153594                             tmp = wac2_utils.matchOptionShortArray(inner._list, "priority", _filter.priority);
153595                             valid_tmp = true;
153596                         }
153597                     }
153598                     if (_filter.initialDueDate !== undefined ||
153599                         _filter.endDueDate !== undefined) {
153600                         if (valid_tmp) {
153601                             tmp = wac2_utils.matchOptionDate(tmp, "dueDate", _filter.initialDueDate, _filter.endDueDate);
153602                         } else {
153603                             tmp = wac2_utils.matchOptionDate(inner._list, "dueDate", _filter.initialDueDate, _filter.endDueDate);
153604                             valid_tmp = true;
153605                         }
153606                     }
153607
153608                     if (valid_tmp) {
153609                         for (i = 0; i < tmp.length; i++) {
153610                             rst.push(new Task(tmp[i], _ID_FROM_PROP));
153611                         } 
153612                     } else {
153613                         for (e in inner._list) {
153614                             rst.push(new Task(inner._list[e], _ID_FROM_PROP));
153615                         }
153616                     }
153617                     onSuccess(rst);
153618                 });
153619                 return ret;
153620             }
153621
153622             return wac2_utils.validateTypeMismatch(onSuccess, onError, "findTasks", _findTasks);
153623         };
153624     }
153625
153626     this.getTaskLists = function (onSuccess, onError) {
153627         function _getTaskLists() {
153628             var ret;
153629             ret = _pendingOperate(function () {
153630                 if (_taskListArray.length === 0) {
153631                     _taskListArray = _get();
153632                 }
153633                 onSuccess(_taskListArray);
153634             }, 1);
153635             return ret;
153636         }
153637
153638         return wac2_utils.validateTypeMismatch(onSuccess, onError, "getTaskLists", _getTaskLists);
153639     };
153640
153641     this.__defineGetter__("SIM_TASK_LIST", function () {
153642         return 0;
153643     });
153644     this.__defineGetter__("DEVICE_TASK_LIST", function () {
153645         return 1;
153646     });
153647     this.__defineGetter__("HIGH_PRIORITY", function () {
153648         return 0;
153649     });
153650     this.__defineGetter__("MEDIUM_PRIORITY", function () {
153651         return 1;
153652     });
153653     this.__defineGetter__("LOW_PRIORITY", function () {
153654         return 2;
153655     });
153656     this.__defineGetter__("STATUS_COMPLETED", function () {
153657         return 0;
153658     });
153659     this.__defineGetter__("STATUS_NEEDS_ACTION", function () {
153660         return 1;
153661     });
153662     this.__defineGetter__("STATUS_IN_PROCESS", function () {
153663         return 2;
153664     });
153665     this.__defineGetter__("STATUS_CANCELLED", function () {
153666         return 3;
153667     });
153668
153669     this.handleSubFeatures = function (subFeatures) {
153670         if (wac2_utils.isEmptyObject(subFeatures) ||
153671             subFeatures["http://wacapps.net/api/pim.task"] ||
153672             (subFeatures["http://wacapps.net/api/pim.task.read"] &&
153673             subFeatures["http://wacapps.net/api/pim.task.write"])) {
153674             return;
153675         }
153676         if (subFeatures["http://wacapps.net/api/pim.task.read"] &&
153677            !subFeatures["http://wacapps.net/api/pim.task.write"]) {
153678             _addTaskAllowed = false;
153679             _deleteTaskAllowed = false;
153680             _updateTaskAllowed = false;
153681             return;
153682         }
153683         if (subFeatures["http://wacapps.net/api/pim.task.write"] &&
153684            !subFeatures["http://wacapps.net/api/pim.task.read"]) {
153685             _findTasksAllowed = false;
153686             return;
153687         }
153688         _console.warn("WAC-2.0-Task-handleSubFeatures: something wrong");
153689     };
153690
153691 };
153692
153693
153694 });
153695 define('ripple/platform/wac/2.0/pendingoperation', function (require, exports, module) {
153696 /*
153697  *  Copyright 2011 Intel Corporation.
153698  *
153699  * Licensed under the Apache License, Version 2.0 (the "License");
153700  * you may not use this file except in compliance with the License.
153701  * You may obtain a copy of the License at
153702  *
153703  * http://www.apache.org/licenses/LICENSE-2.0
153704  *
153705  * Unless required by applicable law or agreed to in writing, software
153706  * distributed under the License is distributed on an "AS IS" BASIS,
153707  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
153708  * See the License for the specific language governing permissions and
153709  * limitations under the License.
153710  */
153711
153712 module.exports = function (pendingObj) {
153713     var pending = true;
153714     this.cancel = function () {
153715         if (pending === true) {
153716             if (typeof (pendingObj.getCancelFlag) === "function" && pendingObj.getCancelFlag() === false) {
153717                 pending = false;
153718                 // this clearTimeout is for the case when a 3rd party is invoked to do the task, and it's finished sooner than the intended timeout. therefore, the 3rd party set CancelFlag false, and this cancel is called before timeout
153719                 clearTimeout(pendingObj.pendingID);
153720                 return false;
153721             }
153722             if (typeof (pendingObj.userCancel) === "function") {
153723                 pendingObj.userCancel();
153724             }
153725             clearTimeout(pendingObj.pendingID);
153726             pending = false;
153727             return true;
153728         } else {
153729             return false;
153730         }
153731     };
153732 };
153733
153734
153735 });
153736 define('ripple/platform/wac/2.0/dbfs', function (require, exports, module) {
153737 /*
153738  *  Copyright 2011 Research In Motion Limited.
153739  *  Copyright 2011 Intel Corporation.
153740  *
153741  * Licensed under the Apache License, Version 2.0 (the "License");
153742  * you may not use this file except in compliance with the License.
153743  * You may obtain a copy of the License at
153744  *
153745  * http://www.apache.org/licenses/LICENSE-2.0
153746  *
153747  * Unless required by applicable law or agreed to in writing, software
153748  * distributed under the License is distributed on an "AS IS" BASIS,
153749  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
153750  * See the License for the specific language governing permissions and
153751  * limitations under the License.
153752  */
153753
153754 /* We know the dbfs is not an accurate simulation of WAC 2.0 filesystem.
153755  *
153756  * 1) We have tried W3C File API, as some of WAC filesystem APIs are synchronous, 
153757  * it is impossible to simulate them by using the asynchronous API in the main
153758  * UI thread and although we could use synchronous W3C API in a worker, it is
153759  * not reasonable to limit WAC filesystem API usage in a worker.
153760  *
153761  * 2) The problem is partially solved by using database to simulate the filesystem,
153762  * For the asynchronous aspect, actually all the files are read into memory (cache 
153763  * object in this file) and the cache operation is synchronous. It is not perfect.
153764  * And the database has 5MB limitation when running in Chrome.
153765  *
153766  * In the future, we might use ajax or NPAPI to get a better simulation.
153767  */
153768
153769 /* Note: The entry object is shared between this module and filesystem */
153770
153771 var db = require('ripple/db'),
153772     utils = require('ripple/utils'),
153773     _console = require('ripple/console'),
153774     _cache = {},
153775     _self;
153776
153777 function _get(path) {
153778     return path.replace(/^\//, '').split("/").reduce(function (obj, token) {
153779         return token === "" ? obj : (obj.children ? obj.children[token] || null : null);
153780     }, _cache);
153781 }
153782
153783 function _getInfo(path) {
153784     var parent = ("/" + path.replace(/^\//, '').replace(/\/$/, '')).split("/"),
153785         name = parent.splice(parent.length - 1, 1).join("");
153786
153787     return {
153788         name: name,
153789         parent: parent.join("/") || "/"
153790     };
153791 }
153792
153793 function _set(path, obj) {
153794     var parent = _cache,
153795         tokens = path.replace(/^\//, '').split("/"),
153796         child = tokens.splice(tokens.length - 1, 1).join("");
153797
153798     tokens.forEach(function (token) {
153799         parent = parent.children[token];
153800     });
153801
153802     parent.children = parent.children || {};
153803     parent.children[child] = obj;
153804 }
153805
153806 function _delete(path) {
153807     var parent = _cache,
153808         tokens = path.replace(/^\//, '').split("/"),
153809         child = tokens.splice(tokens.length - 1, 1).join("");
153810
153811     tokens.forEach(function (token) {
153812         parent = parent.children[token];
153813     });
153814
153815     delete parent.children[child];
153816 }
153817
153818 function _save() {
153819     db.saveObject("wac2-db-filesystem", _cache);
153820 }
153821
153822 function _walk(path, parent) { 
153823     _self.ls(path, function (entries) { 
153824         parent.children = parent.children || {}; 
153825
153826         entries.forEach(function (entry) { 
153827             parent.children[entry.name] = entry; 
153828
153829             if (entry.isDirectory) { 
153830                 _walk(entry.fullPath, entry); 
153831             } else { 
153832                 /* after getting Date out of DB, Date will become 
153833                    a string, so need to recast it back to Date */
153834                 if (entry.lastModifiedDate !== null && entry.lastModifiedDate !== undefined)
153835                     entry.lastModifiedDate = new Date(entry.lastModifiedDate);
153836
153837                 _self.read(entry.fullPath, function (data) { 
153838                     parent.children[entry.name].data = data; 
153839                 }, function (e) { 
153840                     _console.error(e); 
153841                 }); 
153842             } 
153843         }); 
153844     }, function (e) { 
153845         _console.error(e); 
153846     }); 
153847
153848  
153849 function _createPath(path) { 
153850     var parts = path.replace(/^\//, '').split("/"), 
153851         workflow = jWorkflow.order(); 
153852  
153853     parts.forEach(function (part, index) { 
153854         var dir = "/" + utils.copy(parts).splice(0, index + 1).join("/"); 
153855  
153856         workflow.andThen(function (prev, baton) { 
153857             baton.take(); 
153858             _self.mkdir(dir, baton.pass, baton.pass); 
153859         }); 
153860     }); 
153861  
153862     workflow.start(); 
153863 }
153864
153865 _self = {
153866     // The order is consistent with _virtualRoots in filesystem.js
153867     roots: ["/opt/documents", "/opt/images", "/opt/music", "/opt/videos", "/opt/downloads", "/home/user/appdata/simulatedapp/wgt-package", "/home/user/appdata/simulatedapp/wgt-private", "/home/user/appdata/simulatedapp/wgt-private-tmp", "/SDCard", "/opt/attachments"],
153868     initialize: function () {
153869         // TODO: Initialize at bootstrap and emulatorBridge.link 
153870         _cache = db.retrieveObject("wac2-db-filesystem") || {};
153871         // create real root paths if empty
153872         _self.roots.every(function (root) {
153873             _createPath(root);
153874             return true;
153875         }); 
153876        // build the file system cache so that we could access information synchronously
153877         _walk("/", _cache);
153878     },
153879     ls: function (path, success, error) {
153880         try {
153881             var dir = _get(path),
153882                 items = [];
153883
153884             if (dir) {
153885                 utils.forEach(dir.children, function (item) {
153886                     items.push(item);
153887                 });
153888             }
153889             else {
153890                 items = {};
153891             }
153892
153893             success(items);
153894         }
153895         catch (e) {
153896             e.code = 1;
153897             error(e);
153898         }
153899     },
153900     rm: function (path, success, error, options) {
153901         _delete(path);
153902         _save();
153903         success();
153904     },
153905     rmdir: function (path, success, error, options) {
153906         _delete(path);
153907         _save();
153908         success();
153909     },
153910     mkdir: function (path, success, error) {
153911         var entry = _get(path),
153912             info = _getInfo(path);
153913
153914         if (!entry) {
153915             _set(path, {
153916                 name: info.name,
153917                 isDirectory: true,
153918                 fullPath: path
153919             });
153920             entry = _get(path);
153921             _save();
153922         }
153923         
153924         if (entry) {
153925             success(entry);
153926         }
153927         else {
153928             error({code: 1});
153929         }
153930     },
153931     mv: function (from, to, success, error) {
153932         try {
153933             var fromEntry = _get(from),
153934                 toInfo = _getInfo(to);
153935
153936             fromEntry.fullPath = to;
153937             fromEntry.name = toInfo.name;
153938
153939             _set(to, fromEntry);
153940             _delete(from);
153941             _save();
153942             success();
153943         }
153944         catch (e) {
153945             e.code = 1;
153946             error(e);
153947         }
153948     },
153949     touch: function (path, success, error) {
153950         var entry = _get(path),
153951             info  = _getInfo(path);
153952
153953         if (!entry) {
153954             _set(path, {
153955                 lastModifiedDate: new Date(),
153956                 name: info.name,
153957                 isDirectory: false,
153958                 fullPath: path,
153959                 data: ""
153960             });
153961             entry = _get(path);
153962         }
153963         _save();
153964         success(entry);
153965     },
153966     cp: function (from, to, success, error) {
153967         try {
153968             var fromEntry = _get(from),
153969                 copied = utils.copy(fromEntry);
153970
153971             copied.name  = _getInfo(to).name;
153972             copied.fullPath = to;
153973             _set(to, copied);
153974             _save();
153975             success();
153976         }
153977         catch (e) {
153978             e.code = 1;
153979             error(e);
153980         }
153981     },
153982     stat: function (path, success, error) {
153983         var entry = _get(path);
153984         
153985         if (entry) {
153986             success(entry);
153987         } else {
153988             error({code: 1});
153989         }
153990     },
153991     write: function (path, contents, success, error, options) {
153992         var entry = _get(path);
153993
153994         if (entry) {
153995             entry.lastModifiedDate = new Date();
153996             entry.data = contents;
153997             _save();
153998             success();
153999         } else {
154000             error({code: 1});
154001         }
154002
154003     },
154004     read: function (path, success, error) {
154005         var entry = _get(path);
154006
154007         if (entry) {
154008             success(utils.copy(entry.data));
154009         }
154010         else {
154011             error({code: 1});
154012         }
154013     }
154014 };
154015
154016 module.exports = _self;
154017
154018
154019 });
154020 define('ripple/platform/wac/2.0/spec/config', function (require, exports, module) {
154021 /*
154022  *  Copyright 2011 Research In Motion Limited.
154023  *
154024  * Licensed under the Apache License, Version 2.0 (the "License");
154025  * you may not use this file except in compliance with the License.
154026  * You may obtain a copy of the License at
154027  *
154028  * http://www.apache.org/licenses/LICENSE-2.0
154029  *
154030  * Unless required by applicable law or agreed to in writing, software
154031  * distributed under the License is distributed on an "AS IS" BASIS,
154032  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
154033  * See the License for the specific language governing permissions and
154034  * limitations under the License.
154035  */
154036 var platform = require('ripple/platform'),
154037     utils = require('ripple/utils'),
154038     db = require('ripple/db'),
154039     constants = require('ripple/constants');
154040
154041 module.exports = {
154042     fileName: "config.xml",
154043     validateVersion: function (configValidationObject) {
154044         var valid = true;
154045         // no xmlns:JIL in wac 2.0 spec
154046         valid = !!configValidationObject.widget.validationResult[0].attributes.xmlns.valid;
154047
154048         return valid;
154049     },
154050     extractInfo: function (configValidationObject) {
154051         if (!configValidationObject) {
154052             return null;
154053         }
154054
154055         var widgetInfo = {},
154056             configFeatures,
154057             configPreferences,
154058             preferenceName,
154059             platform;
154060
154061         widgetInfo.id = configValidationObject.widget.validationResult[0].attributes.id.value || "";
154062         widgetInfo.name = configValidationObject.widget.children.name.validationResult[0].value;
154063         widgetInfo.icon = configValidationObject.widget.children.icon.validationResult[0].attributes.src.value;
154064         widgetInfo.version = configValidationObject.widget.validationResult[0].attributes.version.value;
154065
154066         widgetInfo.features = {};
154067
154068         configFeatures = configValidationObject.widget.children.feature.validationResult;
154069         utils.forEach(configFeatures, function (f) {
154070             if (f.valid === true) {
154071                 var feature = {id: f.attributes.name.value,
154072                          required: f.attributes.required.valid};
154073                 widgetInfo.features[feature.id] = feature;
154074             }
154075         });
154076
154077         widgetInfo.preferences = {};
154078
154079         configPreferences = configValidationObject.widget.children.preference.validationResult;
154080
154081         platform = require('ripple/platform');
154082         utils.forEach(configPreferences, function (preference) {
154083             preferenceName = preference.attributes.name.value;
154084             if (preferenceName) {
154085                 widgetInfo.preferences[preferenceName] = {
154086                     "key": preferenceName,
154087                     "value": preference.attributes.value.value || "",
154088                     "readonly": preference.attributes.readonly.value === "true"
154089                 };
154090
154091                 db.save(preferenceName,
154092                         widgetInfo.preferences[preferenceName].value,
154093                         platform.getPersistencePrefix(widgetInfo.id));
154094             }
154095         });
154096
154097         return widgetInfo;
154098     },
154099     schema: {
154100         rootElement: "widget",
154101         widget: {
154102             nodeName: "widget",
154103             required: true,
154104             occurrence: 1,
154105             helpText: "\"widget\" element describes widget information in configuration documents and serves as a container for other elements. It must be used in configuration document and may have following child elments: name,description,icon,author,license,content,feature and preference. \"widget\" element MAY have following attributes: id,version,height,width, defaultlocale, xml:lang and dir",
154106             attributes: {
154107                 xmlns: {
154108                     attributeName: "xmlns",
154109                     required: true,
154110                     type: "list",
154111                     listValues: ["http://www.w3.org/ns/widgets"]
154112                 },
154113                 "xml:lang": {
154114                     attributeName: "xml:lang",
154115                     required: false,
154116                     type: "iso-language"
154117                 },
154118                 dir: {
154119                     attributeName: "dir",
154120                     required: false,
154121                     type: "list",
154122                     listValues: ["ltr", "rtl", "lro", "rlo"]
154123                 },
154124                 id: {
154125                     attributeName: "id",
154126                     required: false,
154127                     type: "string"
154128                 },
154129                 version: {
154130                     attributeName: "version",
154131                     required: false,
154132                     type: "string"
154133                 },
154134                 height: {
154135                     attributeName: "height",
154136                     required: false,
154137                     type: "integer"
154138                 },
154139                 width: {
154140                     attributeName: "width",
154141                     required: false,
154142                     type: "integer"
154143                 },
154144                 viewmodes: {
154145                     attributeName: "viewmodes",
154146                     required: false,
154147                     type: "list",
154148                     listValues: ["windowed", "floating", "fullscreen", "maximized", "minimized"]
154149                 },
154150                 defaultlocale: {
154151                     attributeName: "defaultlocale",
154152                     required: false,
154153                     type: "iso-language"
154154                 },
154155             },
154156             children: {
154157                 name: {
154158                     nodeName: "name",
154159                     required: false,
154160                     occurrence: 0,
154161                     type: "string",
154162                     attributes: {
154163                         "xml:lang": {
154164                             attributeName: "xml:lang",
154165                             required: false,
154166                             type: "iso-language",
154167                             unique: true
154168                         },
154169                         dir: {
154170                             attributeName: "dir",
154171                             required: false,
154172                             type: "list",
154173                             listValues: ["ltr", "rtl", "lro", "rlo"]
154174                         },
154175                         "short": {
154176                             attributeName: "short",
154177                             required: false,
154178                             type: "string"
154179                         }
154180                     },
154181                     children: {
154182                         span: {
154183                             nodeName: "span",
154184                             required: false,
154185                             type: "string",
154186                             attributes: {
154187                                 "xml:lang": {
154188                                     attributeName: "xml:lang",
154189                                     required: false,
154190                                     type: "iso-language",
154191                                     unique: true
154192                                 },
154193                                 dir: {
154194                                     attributeName: "dir",
154195                                     required: false,
154196                                     type: "list",
154197                                     listValues: ["ltr", "rtl", "lro", "rlo"]
154198                                 }
154199                             }
154200                         }
154201                     }
154202                 },
154203                 description: {
154204                     nodeName: "description",
154205                     required: false,
154206                     occurrence: 0,
154207                     type: "string",
154208                     attributes: {
154209                         "xml:lang": {
154210                             attributeName: "xml:lang",
154211                             required: false,
154212                             type: "iso-language",
154213                             unique: true
154214                         },
154215                         dir: {
154216                             attributeName: "dir",
154217                             required: false,
154218                             type: "list",
154219                             listValues: ["ltr", "rtl", "lro", "rlo"]
154220                         }
154221                     },
154222                     children: {
154223                         span: {
154224                             nodeName: "span",
154225                             required: false,
154226                             type: "string",
154227                             attributes: {
154228                                 "xml:lang": {
154229                                     attributeName: "xml:lang",
154230                                     required: false,
154231                                     type: "iso-language",
154232                                     unique: true
154233                                 },
154234                                 dir: {
154235                                     attributeName: "dir",
154236                                     required: false,
154237                                     type: "list",
154238                                     listValues: ["ltr", "rtl", "lro", "rlo"]
154239                                 }
154240                             }
154241                         }
154242                     }
154243                 },
154244                 author: {
154245                     nodeName: "author",
154246                     required: false,
154247                     occurrence: 0,
154248                     type: "string",
154249                     attributes: {
154250                         "xml:lang": {
154251                             attributeName: "xml:lang",
154252                             required: false,
154253                             type: "iso-language",
154254                         },
154255                         dir: {
154256                             attributeName: "dir",
154257                             required: false,
154258                             type: "list",
154259                             listValues: ["ltr", "rtl", "lro", "rlo"]
154260                         },
154261                         href: {
154262                             attributeName: "href",
154263                             required: false,
154264                             type: "regex",
154265                             regex: constants.REGEX.URL
154266                         },
154267                         email: {
154268                             attributeName: "email",
154269                             required: false,
154270                             type: "regex",
154271                             regex: constants.REGEX.EMAIL
154272                         }
154273                     },
154274                     children: {
154275                         span: {
154276                             nodeName: "span",
154277                             required: false,
154278                             type: "string",
154279                             attributes: {
154280                                 "xml:lang": {
154281                                     attributeName: "xml:lang",
154282                                     required: false,
154283                                     type: "iso-language",
154284                                     unique: true
154285                                 },
154286                                 dir: {
154287                                     attributeName: "dir",
154288                                     required: false,
154289                                     type: "list",
154290                                     listValues: ["ltr", "rtl", "lro", "rlo"]
154291                                 }
154292                             }
154293                         }
154294                     }
154295                 },
154296                 license: {
154297                     nodeName: "license",
154298                     required: false,
154299                     occurrence: 0,
154300                     type: "string",
154301                     attributes: {
154302                         "xml:lang": {
154303                             attributeName: "xml:lang",
154304                             required: false,
154305                             type: "iso-language",
154306                         },
154307                         dir: {
154308                             attributeName: "dir",
154309                             required: false,
154310                             type: "list",
154311                             listValues: ["ltr", "rtl", "lro", "rlo"]
154312                         },
154313                         href: {
154314                             attributeName: "href",
154315                             type: "regex",
154316                             required: false,
154317                             regex: constants.REGEX.URL
154318                         }
154319                     },
154320                     children: {
154321                         span: {
154322                             nodeName: "span",
154323                             required: false,
154324                             type: "string",
154325                             attributes: {
154326                                 "xml:lang": {
154327                                     attributeName: "xml:lang",
154328                                     required: false,
154329                                     type: "iso-language",
154330                                     unique: true
154331                                 },
154332                                 dir: {
154333                                     attributeName: "dir",
154334                                     required: false,
154335                                     type: "list",
154336                                     listValues: ["ltr", "rtl", "lro", "rlo"]
154337                                 }
154338                             }
154339                         }
154340                     }
154341                 },
154342                 icon: {
154343                     nodeName: "icon",
154344                     required: false,
154345                     occurrence: 0,
154346                     attributes: {
154347                         "xml:lang": {
154348                             attributeName: "xml:lang",
154349                             required: false,
154350                             type: "iso-language",
154351                         },
154352                         dir: {
154353                             attributeName: "dir",
154354                             required: false,
154355                             type: "list",
154356                             listValues: ["ltr", "rtl", "lro", "rlo"]
154357                         },
154358                         src: {
154359                             attributeName: "src",
154360                             required: true,
154361                             type: "string"
154362                         },
154363                         width: {
154364                             attributeName: "width",
154365                             required: false,
154366                             type: "integer"
154367                         },
154368                         height: {
154369                             attributeName: "height",
154370                             required: false,
154371                             type: "integer"
154372                         }
154373                     }
154374                 },
154375                 content: {
154376                     nodeName: "content",
154377                     required: false,
154378                     occurrence: 1,
154379                     attributes: {
154380                         "xml:lang": {
154381                             attributeName: "xml:lang",
154382                             required: false,
154383                             type: "iso-language",
154384                             unique: true
154385                         },
154386                         dir: {
154387                             attributeName: "dir",
154388                             required: false,
154389                             type: "list",
154390                             listValues: ["ltr", "rtl", "lro", "rlo"]
154391                         },
154392                         src: {
154393                             attributeName: "src",
154394                             required: true,
154395                             type: "string"
154396                         },
154397                         encoding: {
154398                             attributeName: "encoding",
154399                             required: false,
154400                             type: "string"
154401                         },
154402                         type: {
154403                             attributeName: "type",
154404                             required: false,
154405                             type: "string"
154406                         }
154407                     }
154408                 },
154409                 feature: {
154410                     nodeName: "feature",
154411                     required: false,
154412                     occurrence: 0,
154413                     attributes: {
154414                         "xml:lang": {
154415                             attributeName: "xml:lang",
154416                             required: false,
154417                             type: "iso-language",
154418                         },
154419                         dir: {
154420                             attributeName: "dir",
154421                             required: false,
154422                             type: "list",
154423                             listValues: ["ltr", "rtl", "lro", "rlo"]
154424                         },
154425                         name: {
154426                             attributeName: "name",
154427                             required: true,
154428                             type: "list",
154429                             listValues: ["http://www.w3.org/TR/geolocation-API/",
154430                                             "http://wacapps.net/api/deviceapis", "http://wacapps.net/api/accelerometer",
154431                                             "http://wacapps.net/api/orientation", "http://wacapps.net/api/camera",
154432                                             "http://wacapps.net/api/camera.show", "http://wacapps.net/api/camera.capture",
154433                                             "http://wacapps.net/api/devicestatus", "http://wacapps.net/api/devicestatus.deviceinfo",
154434                                             "http://wacapps.net/api/devicestatus.networkinfo", "http://wacapps.net/api/filesystem",
154435                                             "http://wacapps.net/api/filesystem.read", "http://wacapps.net/api/filesystem.write",
154436                                             "http://wacapps.net/api/messaging", "http://wacapps.net/api/messaging.send", 
154437                                             "http://wacapps.net/api/messaging.find", "http://wacapps.net/api/messaging.subscribe",
154438                                             "http://wacapps.net/api/messaging.write", "http://wacapps.net/api/pim.contact",
154439                                             "http://wacapps.net/api/pim.contact.read", "http://wacapps.net/api/pim.contact.write",
154440                                             "http://wacapps.net/api/pim.calendar", "http://wacapps.net/api/pim.calendar.read",
154441                                             "http://wacapps.net/api/pim.calendar.write", "http://wacapps.net/api/pim.task", 
154442                                             "http://wacapps.net/api/pim.task.read", "http://wacapps.net/api/pim.task.write",
154443                                             "http://wacapps.net/api/deviceinteraction"]
154444                         },
154445                         required: {
154446                             attributeName: "required",
154447                             type: "boolean",
154448                             required: false
154449                         }
154450                     },
154451                     children: {
154452                         param: {
154453                             nodeName: "param",
154454                             required: false,
154455                             occurrence: 0,
154456                             attributes: {
154457                                 "xml:lang": {
154458                                     attributeName: "xml:lang",
154459                                     required: false,
154460                                     type: "iso-language",
154461                                 },
154462                                 dir: {
154463                                     attributeName: "dir",
154464                                     required: false,
154465                                     type: "list",
154466                                     listValues: ["ltr", "rtl", "lro", "rlo"]
154467                                 },
154468                                 name: {
154469                                     attributeName: "name",
154470                                     required: true,
154471                                     type: "string",
154472                                 },
154473                                 value: {
154474                                     attributeName: "value",
154475                                     required: true,
154476                                     type: "string",
154477                                 }
154478                             }
154479                         }
154480                     }
154481                 },
154482                 preference: {
154483                     nodeName: "preference",
154484                     required: false,
154485                     occurrence: 0,
154486                     attributes: {
154487                         "xml:lang": {
154488                             attributeName: "xml:lang",
154489                             required: false,
154490                             type: "iso-language",
154491                         },
154492                         dir: {
154493                             attributeName: "dir",
154494                             required: false,
154495                             type: "list",
154496                             listValues: ["ltr", "rtl", "lro", "rlo"]
154497                         },
154498                         name: {
154499                             attributeName: "name",
154500                             required: true,
154501                             type: "string"
154502                         },
154503                         value: {
154504                             type: "string",
154505                             required: false,
154506                             attributeName: "value"
154507                         },
154508                         readonly: {
154509                             attributeName: "readonly",
154510                             type: "boolean",
154511                             required: false
154512                         }
154513                     }
154514                 }
154515             }
154516         }
154517     }
154518 };
154519
154520 });
154521 define('ripple/platform/wac/2.0/spec/device', function (require, exports, module) {
154522 /*
154523  *  Copyright 2011 Intel Corporation.
154524  *
154525  * Licensed under the Apache License, Version 2.0 (the "License");
154526  * you may not use this file except in compliance with the License.
154527  * You may obtain a copy of the License at
154528  *
154529  * http://www.apache.org/licenses/LICENSE-2.0
154530  *
154531  * Unless required by applicable law or agreed to in writing, software
154532  * distributed under the License is distributed on an "AS IS" BASIS,
154533  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
154534  * See the License for the specific language governing permissions and
154535  * limitations under the License.
154536  */
154537 var event = require('ripple/event');
154538
154539 function deviceStatusEventTrigger(setting) {
154540     event.trigger("DeviceStatusChanged", [setting]);
154541 }
154542
154543 module.exports = {
154544     "Config": {
154545         "vibratingMode": {
154546             "name": "Vibrator",
154547             "control": {
154548                 "type": "checkbox",
154549                 "value": true
154550             },
154551             "callback": function (setting) {
154552                 event.trigger("VibratingModeChanged", [setting]);
154553             }
154554         },
154555         "soundVolume": {
154556             "name": "Sound Volume",
154557             "control": {
154558                 "type": "range",
154559                 "value": 100,
154560                 "min": 0,
154561                 "max": 100
154562             },
154563             "callback": function (setting) {
154564                 event.trigger("VolumeChanged", [setting]);
154565             }
154566         },
154567         "backlight": {
154568             "name": "Backlight",
154569             "control": {
154570                 "type": "checkbox",
154571                 "value": true
154572             },
154573             "callback": function (setting) {
154574                 event.trigger("BacklightChanged", [setting]);
154575             }
154576         }
154577     },
154578     "Battery": {
154579         "batteryLevel": {
154580             "name": "Battery Remaining %",
154581             "control": {
154582                 "type": "select",
154583                 "value": 100
154584             },
154585             "options": (function () {
154586                 var i,
154587                     optionList = {};
154588
154589                 for (i = 0; i <= 100; i += 10) {
154590                     optionList[i] = i;
154591                 }
154592
154593                 return optionList;
154594             }()),
154595             "event": "BatteryLevelChanged",
154596             "callback": function (setting) {
154597                 event.trigger("BatteryLevelChanged", [setting]);
154598             }
154599         },
154600
154601         "batteryBeingCharged": {
154602             "name": "Battery Is Charging",
154603             "control": {
154604                 "type": "checkbox",
154605                 "value": true
154606             },
154607             "event": "BatteryBeingChargedChanged",
154608             "callback": function (setting) {
154609                 event.trigger("BatteryBeingChargedChanged", [setting]);
154610             }
154611         },
154612     },
154613     "CellularHardware": {
154614         "status": {
154615             "name": "status",
154616             "control": {
154617                 "type": "checkbox",
154618                 "value": true
154619             },
154620             "event": "CellularHardwareStatusChanged",
154621             "callback": function (setting) {
154622                 event.trigger("CellularHardwareStatusChanged", [setting]);
154623             }
154624         }
154625     },
154626     "CellularNetwork": {
154627         "isInRoaming": {
154628             "name": "Roaming",
154629             "control": {
154630                 "type": "checkbox",
154631                 "value": true
154632             },
154633             "event": "CellularNetworkIsInRoamingChanged",
154634             "callback": function (setting) {
154635                 event.trigger("CellularNetworkIsInRoamingChanged", [setting]);
154636             }
154637         }, 
154638         "mcc": {
154639             "name": "mcc",
154640             "control": {
154641                 "type": "text",
154642                 "value": "460",
154643                 "readonly": "readonly"
154644             }
154645         }, 
154646         "mnc": {
154647             "name": "mnc",
154648             "control": {
154649                 "type": "text",
154650                 "value": "0",
154651                 "readonly": "readonly"
154652             }
154653         }, 
154654         "signalStrength": {
154655             "name": "Signal Strength",
154656             "control": {
154657                 "type": "select",
154658                 "value": 100
154659             },
154660             "options": (function () {
154661                 var i,
154662                     optionList = {};
154663
154664                 for (i = 0; i <= 100; i += 10) {
154665                     optionList[i] = i;
154666                 }
154667
154668                 return optionList;
154669             }()),
154670             "event": "CellularNetworkSignalStrengthChanged",
154671             "callback": function (setting) {
154672                 event.trigger("CellularNetworkSignalStrengthChanged", [setting]);
154673             }
154674         }, 
154675         "operatorName": {
154676             "name": "Operator Name",
154677             "control": {
154678                 "type": "text",
154679                 "value": "CMCC",
154680                 "readonly": "readonly"
154681             }
154682         }
154683     },
154684     "Device": {
154685         "imei": {
154686             "name": "IMEI",
154687             "control": {
154688                 "type": "text",
154689                 "value": "860398001689659",
154690                 "readonly": "readonly"
154691             }
154692         }, 
154693         "model": {
154694             "name": "Model",
154695             "control": {
154696                 "type": "text",
154697                 "value": "",
154698                 "readonly": "readonly"
154699             }
154700         }, 
154701         "version": {
154702             "name": "Version",
154703             "control": {
154704                 "type": "text",
154705                 "value": "",
154706                 "readonly": "readonly"
154707             }
154708         }, 
154709         "vendor": {
154710             "name": "Vendor.",
154711             "control": {
154712                 "type": "text",
154713                 "value": "",
154714                 "readonly": "readonly"
154715             }
154716         }
154717     },
154718     "Display": {
154719         "resolutionHeight": {
154720             "name": "Resolution Height",
154721             "control": {
154722                 "type": "number",
154723                 "value": 0,
154724                 "readonly": "readonly"
154725             }
154726         }, 
154727         "resolutionWidth": {
154728             "name": "Resolution Width",
154729             "control": {
154730                 "type": "number",
154731                 "value": 0,
154732                 "readonly": "readonly"
154733             }
154734         }, 
154735         "pixelAspectRatio": {
154736             "name": "Pixel Aspectratio",
154737             "control": {
154738                 "type": "number",
154739                 "value": 0,
154740                 "readonly": "readonly"
154741             }
154742         }, 
154743         "dpiY": {
154744             "name": "DPI-Y",
154745             "control": {
154746                 "type": "number",
154747                 "value": 0,
154748                 "readonly": "readonly"
154749             }
154750         },         
154751         "dpiX": {
154752             "name": "DPI-X",
154753             "control": {
154754                 "type": "number",
154755                 "value": 0,
154756                 "readonly": "readonly"
154757             }
154758         }, 
154759         "colorDepth": {
154760             "name": "Color Depth",
154761             "control": {
154762                 "type": "number",
154763                 "value": 32,
154764                 "readonly": "readonly"
154765             }
154766         }
154767     },
154768     "MemoryUnit": {
154769         "removable": {
154770             "name": "Removable",
154771             "control": {
154772                 "type": "checkbox",
154773                 "value": true,
154774                 "readonly": "readonly"
154775             }
154776         },
154777         "size": {
154778             "name": "Total Memory",
154779             "control": {
154780                 "type": "number",
154781                 "value": 262144,
154782                 "readonly": "readonly"
154783             }
154784         },        
154785         "availableSize": {
154786             "name": "Available Size",
154787             "control": {
154788                 "type": "range",
154789                 "value": 16384,
154790                 "min": 0,
154791                 "max": 262144
154792             },
154793             "event": "MemoryUnitAvailableSizeChanged",
154794             "callback": function (setting) {
154795                 event.trigger("MemoryUnitAvailableSizeChanged", [setting]);
154796             }
154797         }
154798     },
154799     "OperatingSystem": {
154800         "language": {
154801             "name": "Language",
154802             "control": {
154803                 "type": "text",
154804                 "value": "English",
154805                 "readonly": "readonly"
154806             }
154807         }, 
154808         "version": {
154809             "name": "Version",
154810             "control": {
154811                 "type": "text",
154812                 "value": "",
154813                 "readonly": "readonly"
154814             }
154815         }, 
154816         "name": {
154817             "name": "Name",
154818             "control": {
154819                 "type": "text",
154820                 "value": "",
154821                 "readonly": "readonly"
154822             }
154823         }, 
154824         "vendor": {
154825             "name": "Vendor",
154826             "control": {
154827                 "type": "text",
154828                 "value": "",
154829                 "readonly": "readonly"
154830             }
154831         }
154832     },
154833     "WebRuntime": {
154834         "wacVersion": {
154835             "name": "WAC Version",
154836             "control": {
154837                 "type": "text",
154838                 "value": "2.0",
154839                 "readonly": "readonly"
154840             }
154841         }, 
154842         "supportedImageFormats": {
154843             "name": "Image Formats",
154844             "control": {
154845                 "type": "text",
154846                 "value": "gif87, gif89, png, jpeg",
154847                 "readonly": "readonly"
154848             },
154849             "event": "WebRuntimeSupportedImageFormatsChanged",
154850             "callback": function (setting) {
154851                 event.trigger("WebRuntimeSupportedImageFormatsChanged", [setting]);
154852             }
154853         }, 
154854         "version": {
154855             "name": "Web Runtime Version",
154856             "control": {
154857                 "type": "text",
154858                 "value": "1.0",
154859                 "readonly": "readonly"
154860             }
154861         }, 
154862         "name": {
154863             "name": "Web Runtime Name",
154864             "control": {
154865                 "type": "text",
154866                 "value": "Tizen Web Simulator",
154867                 "readonly": "readonly"
154868             }
154869         }, 
154870         "vendor": {
154871             "name": "Vendor Name",
154872             "control": {
154873                 "type": "text",
154874                 "value": "Tizen SDK team",
154875                 "readonly": "readonly"
154876             }
154877         }
154878     },
154879     "WiFiHardware": {
154880         "status": {
154881             "name": "Status",
154882             "control": {
154883                 "type": "checkbox",
154884                 "value": true
154885             },
154886             "event": "WiFiHardwareStatusChanged",
154887             "callback": function (setting) {
154888                 event.trigger("WiFiHardwareStatusChanged", [setting]);
154889             }
154890         }
154891     },
154892     "WiFiNetwork": {
154893         "ssid": {
154894             "name": "SSID",
154895             "control": {
154896                 "type": "text",
154897                 "value": "OfficeWLAN"
154898             },
154899             "event": "WiFiHardwareSsidChanged",
154900             "callback": function (setting) {
154901                 event.trigger("WiFiHardwareSsidChanged", [setting]);
154902             }
154903         }, 
154904         "signalStrength": {
154905             "name": "Signal Strength",
154906             "control": {
154907                 "type": "select",
154908                 "value": 10
154909             },
154910             "options": (function () {
154911                 var i,
154912                     optionList = {};
154913
154914                 for (i = 0; i <= 10; i++) {
154915                     optionList[i] = i;
154916                 }
154917
154918                 return optionList;
154919             }()),
154920             "event": "WiFiHardwareSignalStrengthChanged",
154921             "callback": function (setting) {
154922                 event.trigger("WiFiHardwareSignalStrengthChanged", [setting]);
154923             }
154924         }, 
154925         "networkStatus": {
154926             "name": "Network Status",
154927             "control": {
154928                 "type": "checkbox",
154929                 "value": true
154930             },
154931             "event": "WiFiHardwareNetworkStatusChanged",
154932             "callback": function (setting) {
154933                 event.trigger("WiFiHardwareNetworkStatusChanged", [setting]);
154934             }
154935         }
154936     }
154937 };
154938
154939
154940 });
154941 define('ripple/platform/wac/2.0/spec/ui', function (require, exports, module) {
154942 /*
154943  *  Copyright 2011 Intel Corporation.
154944  *
154945  * Licensed under the Apache License, Version 2.0 (the "License");
154946  * you may not use this file except in compliance with the License.
154947  * You may obtain a copy of the License at
154948  *
154949  * http://www.apache.org/licenses/LICENSE-2.0
154950  *
154951  * Unless required by applicable law or agreed to in writing, software
154952  * distributed under the License is distributed on an "AS IS" BASIS,
154953  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
154954  * See the License for the specific language governing permissions and
154955  * limitations under the License.
154956  */
154957 module.exports = {
154958     plugins: [
154959         "accelerometer",
154960         "messaging",
154961         "geoView",
154962         "widgetConfig",
154963         "deviceSettings"
154964     ]
154965 };
154966
154967 });
154968 define('ripple/platform/wac/2.0/pendingObject', function (require, exports, module) {
154969 /*
154970  *  Copyright 2011 Intel Corporation.
154971  *
154972  * Licensed under the Apache License, Version 2.0 (the "License");
154973  * you may not use this file except in compliance with the License.
154974  * You may obtain a copy of the License at
154975  *
154976  * http://www.apache.org/licenses/LICENSE-2.0
154977  *
154978  * Unless required by applicable law or agreed to in writing, software
154979  * distributed under the License is distributed on an "AS IS" BASIS,
154980  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
154981  * See the License for the specific language governing permissions and
154982  * limitations under the License.
154983  */
154984
154985 module.exports = function (pendingObj) {
154986     var cancelFlag = true;
154987     this.setCancelFlag = function (flag) {
154988         cancelFlag = flag;
154989     };
154990     this.getCancelFlag = function () {
154991         return cancelFlag;
154992     };
154993     this.userCancel = null;
154994     this.pendingID = null;
154995 };
154996
154997 });
154998 define('ripple/platform/wac/2.0/deviceinteraction', function (require, exports, module) {
154999 /*
155000  *  Copyright 2011 Intel Corporation.
155001  *
155002  * Licensed under the Apache License, Version 2.0 (the "License");
155003  * you may not use this file except in compliance with the License.
155004  * You may obtain a copy of the License at
155005  *
155006  * http://www.apache.org/licenses/LICENSE-2.0
155007  *
155008  * Unless required by applicable law or agreed to in writing, software
155009  * distributed under the License is distributed on an "AS IS" BASIS,
155010  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
155011  * See the License for the specific language governing permissions and
155012  * limitations under the License.
155013  */
155014
155015 var notifications = require('ripple/notifications'),
155016     constants = require('ripple/constants'),
155017     PendingOperation = require('ripple/platform/wac/2.0/pendingoperation'),
155018     PendingObject = require('ripple/platform/wac/2.0/pendingObject'),
155019     DeviceApiError = require('ripple/platform/wac/2.0/deviceapierror'),
155020     errorcode = require('ripple/platform/wac/2.0/errorcode'),
155021     utils = require('ripple/utils'),
155022     event = require('ripple/event'),
155023     deviceSettings = require('ripple/deviceSettings'),
155024     wac2_utils = require('ripple/platform/wac/2.0/wac2_utils'),
155025     _self,
155026     NOTIFY_DURATION_LIMIT = 5000;
155027
155028 function pendingOperation(f) {
155029     var _FAKEWAITTIME = 0,
155030         pendingObj;
155031     
155032     if (_FAKEWAITTIME === 0) {
155033         f();
155034         return undefined;
155035     }
155036     else {
155037         pendingObj = new PendingObject();
155038         pendingObj.pendingID = setTimeout(function () {
155039             pendingObj.setCancelFlag(false);
155040             f();
155041         }, _FAKEWAITTIME);
155042         return new PendingOperation(pendingObj);
155043     }
155044 }
155045
155046 function checkDuration(duration) {
155047     if (duration) {
155048         duration = duration | 0;  
155049         if (duration <= 0 || duration > NOTIFY_DURATION_LIMIT) {
155050             return NOTIFY_DURATION_LIMIT;
155051         } else {
155052             return duration;
155053         }
155054     } else {
155055         return NOTIFY_DURATION_LIMIT;
155056     }
155057 }
155058
155059 function isMute() {
155060     return deviceSettings.retrieve("Config.soundVolume") <= 0;
155061 }
155062
155063 function isInVibrateMode() {
155064     return deviceSettings.retrieve("Config.vibratingMode");
155065 }
155066
155067 function isBacklightOn() {
155068     return deviceSettings.retrieve("Config.backlight");
155069 }
155070
155071 var vibrator = (function () {
155072     var isVibrating = false,
155073         terminateAfterPattern = false,
155074         pattern = null,
155075         pulseIndex = 0,
155076         vibrateTimeout = null,
155077         terminateTimeout = null,
155078         MILLILSECONDS_OF_ONE_VIBRATION = 100,
155079         node = jQuery("#" + constants.COMMON.DEVICE_CONTAINER),
155080         movementIndex = 0,
155081         movement = [{ left: -10 }, { left: 0 }, { left: 10 }, { left: 0 },
155082              {top: -10 }, { top: 0 }, {top: 10 }, { top: 0 }];
155083
155084     function _clearTimeout() {
155085         if (vibrateTimeout) {
155086             clearInterval(vibrateTimeout);
155087             vibrateTimeout = null;        
155088         }
155089         if (terminateTimeout) {
155090             clearTimeout(terminateTimeout);
155091             terminateTimeout = null;        
155092         }
155093     }  
155094     
155095     function stopVibrate() {
155096         isVibrating = false;
155097         _clearTimeout();
155098         node.css({left: 0, top: 0}, MILLILSECONDS_OF_ONE_VIBRATION);
155099     }
155100     
155101     function vibrate() {
155102         //node.animate(movement[movementIndex], MILLILSECONDS_OF_ONE_VIBRATION);
155103         node.css(movement[movementIndex]);
155104         movementIndex = (movementIndex + 1) % 8;
155105     }
155106     
155107     function changePulse() {
155108         //pattern != null
155109         var pulse = pattern[pulseIndex];
155110         if (pulse === '.') vibrate();
155111         ++pulseIndex;
155112         if (pulseIndex >= pattern.length) {
155113             if (terminateAfterPattern) {
155114                 setTimeout(stopVibrate, 1);
155115                 return;
155116             }
155117             pulseIndex = 0;
155118         }
155119     }
155120     
155121     function terminateVibrate() {
155122         terminateAfterPattern = true;
155123         terminateTimeout = null;
155124         if (pattern === null) {
155125             stopVibrate();        
155126         }
155127     }  
155128   
155129     function startVibrate(duration, _pattern) {
155130         if (!isInVibrateMode()) return;
155131         _clearTimeout();
155132         terminateAfterPattern = false;
155133         movementIndex = 0;
155134         
155135         if (_pattern) {
155136             pattern = _pattern;
155137             pulseIndex = 0;
155138             vibrateTimeout = setInterval(changePulse, MILLILSECONDS_OF_ONE_VIBRATION);
155139             if (duration) 
155140                 terminateAfterPattern = false;
155141             else 
155142                 terminateAfterPattern = true;
155143         } else {
155144             pattern = null;
155145             vibrateTimeout = setInterval(vibrate, MILLILSECONDS_OF_ONE_VIBRATION);
155146         }
155147         terminateTimeout = setTimeout(terminateVibrate, checkDuration(duration));        
155148         isVibrating = true;
155149     }
155150
155151     event.on("VibratingModeChanged", function (value) {
155152         if (value === false) {
155153             stopVibrate();
155154         }
155155     });
155156
155157     return {
155158         startVibrate: startVibrate,
155159         stopVibrate: stopVibrate
155160     };
155161 }()); //jslint style
155162
155163 var backlight = (function () {
155164     var timeout = null,
155165         isNotifying = false,
155166         node = jQuery("#" + constants.COMMON.VIEWPORT_CONTAINER);
155167         
155168     function _clearTimeout() {
155169         if (timeout) {
155170             clearTimeout(timeout); 
155171             timeout = null;
155172         }
155173     }
155174     
155175     function _switch(on) {
155176         node.css('opacity', on ? '':'0.4');
155177     }
155178     
155179     function switchOff() {
155180         if (!isNotifying) return;
155181         _clearTimeout();
155182         _switch(false);
155183         isNotifying = false;
155184     }
155185     
155186     function switchOn(duration) {
155187         if (isBacklightOn()) return;
155188         _clearTimeout();
155189         _switch(true);
155190         timeout = setTimeout(switchOff, checkDuration(duration));
155191         isNotifying = true;
155192     }
155193
155194     _switch(isBacklightOn());
155195     event.on("BacklightChanged", function (value) {
155196         _clearTimeout();
155197         isNotifying = false;
155198         _switch(value);
155199     });
155200
155201     return {
155202         switchOn  : switchOn,
155203         switchOff : switchOff
155204     };
155205 }()); //jslint style
155206
155207 var beeper = (function () {
155208     var isBeeping = false,
155209         timeout = null,
155210         beepFile = "beep.wav", //TODO: license issues
155211         errorHandler = null,
155212         _beeper = utils.createElement("audio", {"id": "notify-beeper"});
155213         
155214     document.getElementById("ui").appendChild(_beeper);
155215     _beeper.setAttribute("src", beepFile);
155216     _beeper.setAttribute("loop", "true");
155217     _beeper.load();
155218     
155219     function _clearTimeout() {
155220         if (timeout) {
155221             clearTimeout(timeout);
155222             timeout = false;
155223         }
155224     }
155225     
155226     function raiseError() {
155227         if (errorHandler) {
155228             setTimeout(function () {
155229                 errorHandler(new DeviceApiError(errorcode.UNKNOWN_ERR));
155230             }, 1);
155231         }
155232     }
155233     
155234     function stopBeep() {
155235         _clearTimeout();
155236         if (isBeeping) {
155237             try {
155238                 _beeper.pause();
155239             } catch (e) {}
155240             isBeeping = false;
155241         }
155242     }
155243     
155244     _beeper.addEventListener('error', function () {
155245         stopBeep();
155246         raiseError();
155247     });
155248    
155249     function startBeep(onSuccess, onError, duration) {
155250         errorHandler = onError;
155251         try {
155252             stopBeep();
155253             _beeper.currentTime = 0;
155254             _beeper.play();
155255             isBeeping = true;
155256             timeout = setTimeout(stopBeep, checkDuration(duration));
155257             setTimeout(function () {
155258                 onSuccess();
155259             }, 1);
155260         }catch (e) {
155261             raiseError();
155262         }
155263     }
155264     
155265     event.on("VolumeChanged", function (value) {
155266         value = value | 0;
155267         if (value < 0) value = 0;
155268         else if (value > 100) value = 100;       
155269         _beeper.volume = value / 100.0;
155270     });
155271     
155272     return {
155273         startBeep : startBeep,
155274         stopBeep  : stopBeep
155275     };
155276 }()); //jslint style
155277
155278 module.exports = _self = {
155279
155280     startNotify : function (onSuccess, onError, duration) {
155281         return wac2_utils.validateTypeMismatch(onSuccess, onError, "startNotify", function () {
155282             if (!isMute()) {
155283                 return pendingOperation(function () {
155284                     beeper.startBeep(onSuccess, onError, duration);
155285                 });
155286             } else if (isInVibrateMode()) {
155287                 return _self.startVibrate(onSuccess, onError, duration);
155288             } else {
155289                 return _self.lightOn(onSuccess, onError, duration);
155290             }
155291         });
155292     },
155293
155294     stopNotify : function () {
155295         beeper.stopBeep();
155296         vibrator.stopVibrate();
155297         backlight.switchOff();
155298     },
155299
155300     startVibrate : function (onSuccess, onError, duration, pattern) {       
155301         return wac2_utils.validateTypeMismatch(onSuccess, onError, "startVibrate", function () {
155302             if (pattern) {
155303                 pattern = String(pattern);
155304                 if (!pattern.match(/[\._]{1,10}/)) {
155305                     if (onError) {
155306                         setTimeout(function () {
155307                             onError(new DeviceApiError(errorcode.INVALID_VALUES_ERR));
155308                         }, 1);
155309                     }
155310                     return undefined;
155311                 }   
155312             }
155313             
155314             if (!isInVibrateMode()) {
155315                 if (onError) {
155316                     setTimeout(function () {
155317                         onError(new DeviceApiError(errorcode.UNKNOWN_ERR));
155318                     }, 1);
155319                 }
155320                 return undefined;          
155321             }
155322   
155323             setTimeout(function () {
155324                 onSuccess();
155325             }, 1);
155326             return pendingOperation(function () {
155327                 vibrator.startVibrate(duration, pattern);
155328             });
155329
155330         });
155331     },
155332     
155333     stopVibrate : function () {
155334         vibrator.stopVibrate();
155335     },
155336
155337     lightOn : function (onSuccess, onError, duration) {
155338         return wac2_utils.validateTypeMismatch(onSuccess, onError, "lightOn", function () {
155339             if (isBacklightOn()) {
155340                 if (onError) {
155341                     setTimeout(function () {
155342                         onError(new DeviceApiError(errorcode.UNKNOWN_ERR));
155343                     }, 1);
155344                 }
155345                 return undefined;               
155346             }
155347         
155348             setTimeout(function () {
155349                 onSuccess();
155350             }, 1);
155351             return pendingOperation(function () {
155352                 backlight.switchOn(duration);
155353             });
155354         });
155355     },
155356
155357     lightOff : function () {
155358         backlight.switchOff();
155359     },
155360
155361     setWallpaper : function (onSuccess, onError, fileName) {
155362         //TODO: file name, existance, extension checking.
155363         return wac2_utils.validateTypeMismatch(onSuccess, onError, "setWallpaper", function () {
155364             return pendingOperation(function () {
155365                 notifications.openNotification("normal", "setWallpaper:" + fileName);
155366                 setTimeout(function () {
155367                     onSuccess();
155368                 }, 1);
155369             });
155370         });
155371     }
155372 };
155373
155374
155375 });
155376 define('ripple/platform/wac/2.0/deviceapierror', function (require, exports, module) {
155377 /*
155378  *  Copyright 2011 Intel Corporation.
155379  *
155380  * Licensed under the Apache License, Version 2.0 (the "License");
155381  * you may not use this file except in compliance with the License.
155382  * You may obtain a copy of the License at
155383  *
155384  * http://www.apache.org/licenses/LICENSE-2.0
155385  *
155386  * Unless required by applicable law or agreed to in writing, software
155387  * distributed under the License is distributed on an "AS IS" BASIS,
155388  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
155389  * See the License for the specific language governing permissions and
155390  * limitations under the License.
155391  */
155392
155393 var errorcode = require('ripple/platform/wac/2.0/errorcode');
155394
155395 module.exports = function (code) {
155396     for (var c in errorcode) {
155397         var g = errorcode.__lookupGetter__(c);
155398         if (g) {
155399             this.__defineGetter__(c, g);
155400         }
155401     }
155402
155403     this.code = code;
155404     this.message = errorcode.message[code];
155405     this.type =  "";
155406
155407     this.toString = function () {
155408         var result = this.type + ': "' + this.message + '"';
155409
155410         if (this.stack) {
155411             result += "\n" + this.stack;
155412         }
155413         return result;
155414     };
155415 };
155416
155417
155418 });
155419 define('ripple/platform/wac/2.0/camera', function (require, exports, module) {
155420 /*
155421  *  Copyright 2011 Intel Corporation.
155422  *
155423  * Licensed under the Apache License, Version 2.0 (the "License");
155424  * you may not use this file except in compliance with the License.
155425  * You may obtain a copy of the License at
155426  *
155427  * http://www.apache.org/licenses/LICENSE-2.0
155428  *
155429  * Unless required by applicable law or agreed to in writing, software
155430  * distributed under the License is distributed on an "AS IS" BASIS,
155431  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
155432  * See the License for the specific language governing permissions and
155433  * limitations under the License.
155434  */
155435
155436 var utils = require('ripple/utils'),
155437     constants = require('ripple/constants'),
155438     _console = require('ripple/console'),
155439     errorcode = require('ripple/platform/wac/2.0/errorcode'),
155440     PendingOperation = require('ripple/platform/wac/2.0/pendingoperation'),
155441     PendingObject = require('ripple/platform/wac/2.0/pendingObject'),
155442     DeviceApiError = require('ripple/platform/wac/2.0/deviceapierror'),
155443     wac2_utils = require('ripple/platform/wac/2.0/wac2_utils');
155444
155445 module.exports = function () {
155446     var _cameraArray, Camera, _videoStatus = {},
155447         _captureImage, _startVideoCapture,
155448         _doCaptureImage, _doStartVideoCapture,
155449         _doGetPreview, _doGetCameras,
155450         _stopVideoCapture, _createPreviewNode,
155451         _FAKEWAITTIME = 5,
155452         _defaultHighRes = true,
155453         _defaultImageFilename = "_capture.jpg",
155454         _defaultVideoFilename = "_capture.avi",
155455         _captureImageAllowed = true,
155456         _startVideoCaptureAllowed = true,
155457         _stopVideoCaptureAllowed = true,
155458         _createPreviewNodeAllowed = true;
155459
155460     _doCaptureImage = function (onSuccess, onError, capFilename, capHighRes, pendingObj) {
155461         pendingObj.pendingID = setTimeout(function () {
155462             var dname = "", fname = "";
155463             //pretend to do sth.
155464             pendingObj.setCancelFlag(false);  // too late to cancel
155465             if (capFilename.indexOf("/") !== -1) {
155466                 dname = capFilename.replace(/(.*\/)[^\/]+$/i, "$1");
155467                 fname = capFilename.replace(/.*\/([^\/]*)$/i, "$1");
155468                 //replace extension with jpg
155469                 fname = fname.replace(/\.[^\/\.]+$/i, ".jpg");
155470             } else {
155471                 dname = "";
155472                 fname = capFilename.replace(/\.[^\/\.]+$/i, ".jpg");
155473             }
155474             if (fname === "") {
155475                 fname = _defaultImageFilename;
155476             }
155477             if (fname.search(/\.jpg$/) === -1) {
155478                 fname = fname + ".jpg";
155479             }
155480             if (capHighRes) {
155481                 onSuccess(dname + "high-" + fname);
155482             } else {
155483                 onSuccess(dname + "low-" + fname);
155484             }
155485         }, _FAKEWAITTIME);
155486     };
155487
155488     _captureImage = function (onSuccess, onError, options) {
155489         var pendingOperation = {}, pendingObj,
155490             filename = this.id + _defaultImageFilename,
155491             highRes = _defaultHighRes, opt;
155492
155493         if (onSuccess) {
155494             utils.validateArgumentType(onSuccess, "function", null, "captureImage: invalid successCallback parameter", new DeviceApiError(errorcode.TYPE_MISMATCH_ERR));
155495         }
155496         if (onError) {
155497             utils.validateArgumentType(onError, "function", null, "captureImage: invalid errorCallback parameter", new DeviceApiError(errorcode.TYPE_MISMATCH_ERR));
155498         }
155499         if (options) {
155500             opt = new Object(options);
155501             /* NOTE: if desktinationFilename or highRes is not provided by
155502                user, i.e. undefined or null, a default value is used.
155503              */
155504             if (opt.destinationFilename !== null && opt.destinationFilename !== undefined) {
155505             // TODO: validate filename via Filesystem.resolve()
155506                 filename = String(opt.destinationFilename);
155507             }
155508             if (opt.highRes !== null && opt.highRes !== undefined) {
155509                 highRes = Boolean(opt.highRes);
155510             }
155511         }
155512         if (!_captureImageAllowed) {
155513             if (onError) {
155514                 setTimeout(function () {
155515                     onError(new DeviceApiError(errorcode.SECURITY_ERR));
155516                 }, 1);
155517             }
155518             return undefined;
155519         }
155520
155521         if (onSuccess) {
155522             pendingObj = new PendingObject();
155523             _doCaptureImage(onSuccess, onError, filename, highRes, pendingObj);
155524             pendingOperation = new PendingOperation(pendingObj);
155525             return pendingOperation;
155526         } else {
155527             if (onError) {
155528                 setTimeout(function () {
155529                     onError(new DeviceApiError(errorcode.INVALID_VALUES_ERR));
155530                 }, 1);
155531             }
155532         }
155533         return undefined;
155534     };
155535
155536     _stopVideoCapture = function () {
155537         var dname = "", fname = "", capFilename = _videoStatus[this.id].capFilename;
155538         if (_videoStatus[this.id]) {
155539             if (capFilename.indexOf("/") !== -1) {
155540                 dname = capFilename.replace(/(.*\/)[^\/]+$/i, "$1");
155541                 fname = capFilename.replace(/.*\/([^\/]*)$/i, "$1");
155542                 //replace extension with avi
155543                 fname = fname.replace(/\.[^\/\.]+$/i, ".avi");
155544             } else {
155545                 dname = "";
155546                 fname = capFilename.replace(/\.[^\/\.]+$/i, ".avi");
155547             }
155548             if (fname === "") {
155549                 fname = _defaultVideoFilename;
155550             }
155551             if (fname.search(/\.avi$/) === -1) {
155552                 fname = fname + ".avi";
155553             }
155554             if (_videoStatus[this.id].capHighRes) {
155555                 _videoStatus[this.id].capSuccess(dname + "high-" + fname);
155556             } else {
155557                 _videoStatus[this.id].capSuccess(dname + "low-" + fname);
155558             }
155559             delete _videoStatus[this.id];
155560         }
155561     };
155562
155563     _doStartVideoCapture = function (camID, onSuccess, onError, filename, highRes, pendingObj) {
155564         var videoStatus = {};
155565         _videoStatus[camID] = videoStatus;
155566         pendingObj.userCancel = function () {
155567             delete _videoStatus[camID];
155568         };
155569         pendingObj.getCancelFlag = function () {
155570             return !!_videoStatus[camID];
155571         };
155572         pendingObj.pendingID = setTimeout(function () {
155573             // waiting to be cancelled
155574             videoStatus = {
155575                 capSuccess: onSuccess,
155576                 capError: onError,
155577                 capFilename: filename,
155578                 capHighRes: highRes
155579             };
155580             _videoStatus[camID] = videoStatus;
155581         }, _FAKEWAITTIME);
155582     };
155583
155584     _startVideoCapture = function (onSuccess, onError, options) {
155585         var pendingOperation = {}, pendingObj,
155586             filename = this.id + _defaultVideoFilename,
155587             highRes = _defaultHighRes, opt;
155588
155589         if (onSuccess) {
155590             utils.validateArgumentType(onSuccess, "function", null, "startVideoCapture: invalid successCallback parameter", new DeviceApiError(errorcode.TYPE_MISMATCH_ERR));
155591         }
155592         if (onError) {
155593             utils.validateArgumentType(onError, "function", null, "startVideoCapture: invalid errorCallback parameter", new DeviceApiError(errorcode.TYPE_MISMATCH_ERR));
155594         }
155595         if (options) {
155596             opt = new Object(options);
155597             /* NOTE: if desktinationFilename or highRes is not provided by
155598                user, i.e. undefined or null, a default value is used.
155599              */
155600             if (opt.destinationFilename !== null && opt.destinationFilename !== undefined) {
155601             // TODO: validate filename via Filesystem.resolve()
155602                 filename = String(opt.destinationFilename);
155603             }
155604             if (opt.highRes !== null && opt.highRes !== undefined) {
155605                 highRes = Boolean(opt.highRes);
155606             }
155607         }
155608         if (!_captureImageAllowed) {
155609             if (onError) {
155610                 setTimeout(function () {
155611                     onError(new DeviceApiError(errorcode.SECURITY_ERR));
155612                 }, 1);
155613             }
155614             return undefined;
155615         }
155616         if (_videoStatus[this.id]) { 
155617             // capture already started
155618             _console.warn("WAC-2.0-startVideoCapture: capture already started");
155619             if (onError) {
155620                 setTimeout(function () {
155621                     onError(new DeviceApiError(errorcode.UNKNOWN_ERR));
155622                 }, 1);
155623             }
155624             return undefined;
155625         }
155626
155627         if (onSuccess) {
155628             pendingObj = new PendingObject();
155629             _doStartVideoCapture(this.id, onSuccess, onError, filename, highRes, pendingObj);
155630             
155631             pendingOperation = new PendingOperation(pendingObj);
155632             return pendingOperation;
155633         } else {
155634             if (onError) {
155635                 setTimeout(function () {
155636                     onError(new DeviceApiError(errorcode.INVALID_VALUES_ERR));
155637                 }, 1);
155638             }
155639         }
155640         return undefined;
155641     };
155642
155643     _doGetPreview = function (camID, onSuccess, onError, pendingObj) {
155644         var container, demoImg, loc, imageSrc;
155645         container = document.createElement("div");
155646         container.setAttribute("id", camID + "-wac-2-0-camera-preview-container");
155647         demoImg = document.createElement("img");
155648         demoImg.setAttribute("id", camID + "-wac-2-0-camera-demo-image");
155649         loc = document.location;
155650         imageSrc = loc.protocol + "//" + loc.hostname + loc.pathname.replace(/index\.html$/, "") + constants.CAMERA.WINDOW_ANIMATION;
155651         demoImg.setAttribute("src", imageSrc);
155652         demoImg.setAttribute("width", "100%");
155653         container.appendChild(demoImg);
155654         
155655         pendingObj.pendingID = setTimeout(function () {
155656             pendingObj.setCancelFlag(false);  // too late to cancel
155657             onSuccess(container);
155658         }, _FAKEWAITTIME);
155659     };
155660
155661     _createPreviewNode = function (onSuccess, onError) {
155662         var pendingOperation, pendingObj = {};
155663         if (onSuccess) {
155664             utils.validateArgumentType(onSuccess, "function", null, "createPreviewNode: invalid successCallback parameter", new DeviceApiError(errorcode.TYPE_MISMATCH_ERR));
155665         }
155666         if (onError) {
155667             utils.validateArgumentType(onError, "function", null, "createPreviewNode: invalid errorCallback parameter", new DeviceApiError(errorcode.TYPE_MISMATCH_ERR));
155668         }
155669         if (!_createPreviewNodeAllowed) {
155670             if (onError) {
155671                 setTimeout(function () {
155672                     onError(new DeviceApiError(errorcode.SECURITY_ERR));
155673                 }, 1);
155674             }
155675             return undefined;
155676         }
155677         if (onSuccess) {
155678             pendingObj = new PendingObject();
155679             _doGetPreview(this.id, onSuccess, onError, pendingObj);
155680             pendingOperation = new PendingOperation(pendingObj);
155681             return pendingOperation;
155682         } else {
155683             if (onError) {
155684                 setTimeout(function () {
155685                     onError(new DeviceApiError(errorcode.INVALID_VALUES_ERR));
155686                 }, 1);
155687             }
155688         }
155689         return undefined;
155690     };
155691
155692     Camera = function (cameraID) {
155693         return {
155694             id: cameraID,
155695             captureImage: _captureImage,
155696             startVideoCapture: _startVideoCapture,
155697             stopVideoCapture: _stopVideoCapture,
155698             createPreviewNode: _createPreviewNode
155699         };
155700     };
155701
155702     _cameraArray = [new Camera("rear"), new Camera("front")];
155703
155704     _doGetCameras = function (onSuccess, onError, pendingObj) {
155705         pendingObj.pendingID = setTimeout(function () {
155706             pendingObj.setCancelFlag(false);  // too late to cancel
155707             if (_cameraArray.length !== 0) {
155708                 onSuccess(utils.copy(_cameraArray));
155709             } else {
155710                 // no camera
155711                 if (onError) {
155712                     setTimeout(function () {
155713                         onError(new DeviceApiError(errorcode.UNKNOWN_ERR));
155714                     }, 1);
155715                 }
155716             }
155717         }, _FAKEWAITTIME);
155718     };
155719
155720     this.getCameras = function (onSuccess, onError) {
155721         var pendingOperation, pendingObj = {};
155722         if (onSuccess) {
155723             utils.validateArgumentType(onSuccess, "function", null, "getCameras: invalid successCallback parameter", new DeviceApiError(errorcode.TYPE_MISMATCH_ERR));
155724         }
155725         if (onError) {
155726             utils.validateArgumentType(onError, "function", null, "getCameras: invalid errorCallback parameter", new DeviceApiError(errorcode.TYPE_MISMATCH_ERR));
155727         }
155728         if (onSuccess) {
155729             pendingObj = new PendingObject();
155730             _doGetCameras(onSuccess, onError, pendingObj);
155731             pendingOperation = new PendingOperation(pendingObj);
155732             return pendingOperation;
155733         } else {
155734             if (onError) {
155735                 setTimeout(function () {
155736                     onError(new DeviceApiError(errorcode.INVALID_VALUES_ERR));
155737                 }, 1);
155738             }
155739         }
155740         return undefined;
155741     };
155742
155743     this.handleSubFeatures = function (subFeatures) {
155744         if (wac2_utils.isEmptyObject(subFeatures) ||
155745             subFeatures["http://wacapps.net/api/camera"] ||
155746             (subFeatures["http://wacapps.net/api/camera.capture"] &&
155747             subFeatures["http://wacapps.net/api/camera.show"])) {
155748             return;
155749         }
155750         if (subFeatures["http://wacapps.net/api/camera.show"] &&
155751            !subFeatures["http://wacapps.net/api/camera.capture"]) {
155752             _captureImageAllowed = false;
155753             _startVideoCaptureAllowed = false;
155754             _stopVideoCaptureAllowed = false;
155755             return;
155756         }
155757         if (subFeatures["http://wacapps.net/api/camera.capture"] &&
155758            !subFeatures["http://wacapps.net/api/camera.show"]) {
155759             _createPreviewNodeAllowed = false;
155760             return;
155761         }
155762         _console.warn("WAC-2.0-Camera-handleSubFeatures: something wrong");
155763     };
155764 };
155765
155766 });
155767 define('ripple/platform/wac/2.0/wac2_utils', function (require, exports, module) {
155768 /*
155769  *  Copyright 2011 Intel Corporation.
155770  *
155771  * Licensed under the Apache License, Version 2.0 (the "License");
155772  * you may not use this file except in compliance with the License.
155773  * You may obtain a copy of the License at
155774  *
155775  * http://www.apache.org/licenses/LICENSE-2.0
155776  *
155777  * Unless required by applicable law or agreed to in writing, software
155778  * distributed under the License is distributed on an "AS IS" BASIS,
155779  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
155780  * See the License for the specific language governing permissions and
155781  * limitations under the License.
155782  */
155783
155784 var utils = require('ripple/utils'),
155785     errorcode = require('ripple/platform/wac/2.0/errorcode'),
155786     DeviceApiError = require('ripple/platform/wac/2.0/deviceapierror');
155787
155788 module.exports = {
155789     _wac2_regexSanitize: function (regexString) {
155790         var escapePattern = /([^\\]|^)(%)/g, percentPattern = /\\%/g;
155791         return regexString.replace("^", "\\^")
155792                 .replace("$", "\\$")
155793                 .replace("(", "\\(")
155794                 .replace(")", "\\)")
155795                 .replace("<", "\\<")
155796                 .replace("[", "\\[")
155797                 .replace("{", "\\{")
155798                 .replace(/\\([^%])/, "\\\\$1")    /* don't replace \\% */
155799                 .replace("|", "\\|")
155800                 .replace(">", "\\>")
155801                 .replace(".", "\\.")
155802                 .replace("*", "\\*")
155803                 .replace("+", "\\+")
155804                 .replace("?", "\\?")
155805                 .replace(escapePattern, "$1.*")  /* replace % with .* */
155806                 .replace(percentPattern, "%");   /* strip excape of % */ 
155807     }, 
155808
155809     isValidDate: function (d) {
155810         if (Object.prototype.toString.call(d) !== "[object Date]")
155811             return false;
155812         return !isNaN(d.getTime());
155813     },
155814
155815     isValidArray: function (a) {
155816         return (Object.prototype.toString.call(a) === "[object Array]");
155817     },
155818     
155819     matchOptionArrayString: function (src, attr, pattern) {
155820         /* src.obj[attr] is a StringArray */
155821         var _pattern, re, _stringMatch;
155822         _pattern = this._wac2_regexSanitize(pattern); 
155823         re = new RegExp("^" + _pattern + "$", "i");
155824
155825         _stringMatch = function (obj, index) {
155826             if (pattern.search(/^%*$/i) === 0) 
155827                 return true;
155828             if (obj[attr] === undefined || obj[attr] === null)
155829                 return false;
155830             return obj[attr].some(function (f) {
155831                 return f.search(re) !== -1;
155832             });
155833         };
155834         return utils.filter(src, _stringMatch);
155835     },
155836
155837     matchOptionString: function (src, attr, pattern) {
155838         /* src.obj[attr] is a string */
155839         var _stringMatch, _pattern, _re;
155840         _pattern = this._wac2_regexSanitize(pattern); 
155841         _re = new RegExp("^" + _pattern + "$", "mi");
155842
155843         _stringMatch = function (obj, index) {
155844             return (obj[attr].search(_re) !== -1);
155845         };
155846         return utils.filter(src, _stringMatch);
155847     },
155848
155849     matchOptionDate: function (src, attr, filterStart, filterEnd) {
155850         var _dateMatch;
155851         _dateMatch = function (obj, index) {
155852             var matched = true, valueDate = obj[attr];
155853     
155854             if (filterStart !== undefined && filterStart !== null) {
155855                 matched = (valueDate.getTime() >= filterStart.getTime());
155856             }
155857             if (matched && (filterEnd !== undefined && filterEnd !== null)) {
155858                 matched = (valueDate.getTime() <= filterEnd.getTime());
155859             }
155860             return matched;
155861         };
155862         return utils.filter(src, _dateMatch);
155863     },
155864
155865     matchOptionShortArray: function (src, attr, filterArray) {
155866         /* src.obj[attr] is a short, filterArray is an array 
155867            i.e. find status is [CONFRIMED or TENTATIVE] */
155868         var arraySome = function (obj, index) {
155869             return filterArray.some(function (f) {
155870                 return f === obj[attr];  
155871             });
155872         };
155873         return utils.filter(src, arraySome);
155874     },
155875
155876     validateTypeMismatch: function (onSuccess, onError, name, callback) {
155877         if (onSuccess) {
155878             utils.validateArgumentType(onSuccess, "function", null,
155879                                        name + " invalid successCallback parameter",
155880                                        new DeviceApiError(errorcode.TYPE_MISMATCH_ERR));
155881         }
155882
155883         if (onError) {
155884             utils.validateArgumentType(onError, "function", null,
155885                                        name + " invalid errorCallback parameter",
155886                                        new DeviceApiError(errorcode.TYPE_MISMATCH_ERR));
155887         }
155888
155889         if (onSuccess) {
155890             return callback && callback();
155891         } else {
155892             if (onError) {
155893                 setTimeout(function () {
155894                     onError(new DeviceApiError(errorcode.INVALID_VALUES_ERR));
155895                 }, 1);
155896             }
155897         }
155898         return undefined;
155899     },
155900
155901     isEmptyObject: function (obj) {
155902         var prop;
155903
155904         for (prop in obj) {
155905             return false;
155906         }
155907         return true;
155908     }
155909 };
155910
155911
155912 });
155913 define('ripple/platform/wac/2.0/contactfilter', function (require, exports, module) {
155914 /*\r
155915  *  Copyright 2011 Intel Corporation.\r
155916  *\r
155917  * Licensed under the Apache License, Version 2.0 (the "License");\r
155918  * you may not use this file except in compliance with the License.\r
155919  * You may obtain a copy of the License at\r
155920  *\r
155921  * http://www.apache.org/licenses/LICENSE-2.0\r
155922  *\r
155923  * Unless required by applicable law or agreed to in writing, software\r
155924  * distributed under the License is distributed on an "AS IS" BASIS,\r
155925  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
155926  * See the License for the specific language governing permissions and\r
155927  * limitations under the License.\r
155928  */\r
155929 \r
155930 var utils = require('ripple/utils'),\r
155931     _self;\r
155932 \r
155933 _self = function (criteria) {\r
155934     var pattern,\r
155935         contactFilter;\r
155936 \r
155937     contactFilter = {\r
155938         match: function (target) {\r
155939             var result = false, key, value, index;\r
155940 \r
155941             switch (Object.prototype.toString.call(target)) {\r
155942             case "[object String]":\r
155943                 result = pattern.test(target);\r
155944                 break;\r
155945 \r
155946             case "[object Object]":\r
155947                 for (key in criteria) {\r
155948                     result = true;\r
155949                     value = criteria[key];\r
155950                     if ((value !== undefined) && (!_self(value).match(target[key])))\r
155951                         return false;\r
155952                 }\r
155953                 break;\r
155954 \r
155955             case "[object Array]":\r
155956                 for (index in target) {\r
155957                     if (contactFilter.match(target[index]))\r
155958                         return true;\r
155959                 }\r
155960                 break;\r
155961             }\r
155962 \r
155963             return result;\r
155964         }\r
155965     };\r
155966 \r
155967     if (typeof criteria === "string")\r
155968         pattern = new RegExp(criteria.replace(/(^|[^\\])%+/g, "$1.*").replace(/\\%/g, "%").replace(/.*/, "^$&$"), "i");\r
155969 \r
155970     return contactFilter;\r
155971 };\r
155972 \r
155973 module.exports = _self;\r
155974
155975 });
155976 define('ripple/platform/wac/2.0/contact', function (require, exports, module) {
155977 /*
155978  *  Copyright 2011 Intel Corporation.
155979  *
155980  * Licensed under the Apache License, Version 2.0 (the "License");
155981  * you may not use this file except in compliance with the License.
155982  * You may obtain a copy of the License at
155983  *
155984  * http://www.apache.org/licenses/LICENSE-2.0
155985  *
155986  * Unless required by applicable law or agreed to in writing, software
155987  * distributed under the License is distributed on an "AS IS" BASIS,
155988  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
155989  * See the License for the specific language governing permissions and
155990  * limitations under the License.
155991  */
155992
155993 var utils = require('ripple/utils'),
155994     db = require('ripple/db'),
155995     constants = require('ripple/constants'),
155996     exception = require('ripple/exception'),
155997     errorcode = require('ripple/platform/wac/2.0/errorcode'),
155998     wac2_utils = require('ripple/platform/wac/2.0/wac2_utils'),
155999     DeviceApiError = require('ripple/platform/wac/2.0/deviceapierror'),
156000     PendingOperation = require('ripple/platform/wac/2.0/pendingoperation'),
156001     PendingObject = require('ripple/platform/wac/2.0/pendingObject'),
156002     TypeCoerce = require('ripple/platform/wac/2.0/typecoerce'),
156003     Filter = require('ripple/platform/wac/2.0/contactfilter'),
156004     AddressBook,
156005     ContactProperties,
156006     Contact,
156007     Address,
156008     ContactAddress,
156009     PhoneNumber,
156010     EmailAddress,
156011     ContactFilter,
156012     _KEY = "wac2-pim-contact",
156013     _PENDING_TIME = 600,
156014     _addressBooks = [],
156015     _contacts = {},
156016     _security = {
156017         "http://wacapps.net/api/pim.contact": [],
156018         "http://wacapps.net/api/pim.contact.read": ["findContacts"],
156019         "http://wacapps.net/api/pim.contact.write": ["addContact", "updateContact", "deleteContact"],
156020         all: true
156021     },
156022     _self;
156023
156024 function _errorOccurred(onError, code) {
156025     if (!onError)
156026         return;
156027
156028     setTimeout(function () {
156029         onError(new DeviceApiError(code));
156030     }, 1);
156031 }
156032
156033 function _pendingOperate(operate, scope) {
156034     var i, argumentVector = [];
156035
156036     for (i = 0; i < arguments.length - 2; i++)
156037         argumentVector[i] = arguments[i + 2];
156038
156039     return function () {
156040         var pendingObj, pendingOperation;
156041
156042         pendingObj = new PendingObject();
156043         pendingObj.pendingID = window.setTimeout(function () {
156044             pendingObj.setCancelFlag(false);
156045             operate.apply(scope, argumentVector);
156046         }, _PENDING_TIME);
156047
156048         pendingOperation = new PendingOperation(pendingObj);
156049
156050         return pendingOperation;
156051     };
156052 }
156053
156054 function _defaultContacts() {
156055     var id1 = Math.uuid(null, 16),
156056         id2 = Math.uuid(null, 16),
156057         id3 = Math.uuid(null, 16),
156058         id4 = Math.uuid(null, 16),
156059         contacts = {};
156060
156061     contacts.PHONE_ADDRESS_BOOK = {
156062         type: _self().PHONE_ADDRESS_BOOK,
156063         items: [{
156064             id: id1,
156065             firstName: "Leonardo",
156066             lastName: "Gates",
156067             nicknames: ["Leo"],
156068             phoneticName: "",
156069             addresses: [{streetAddress: "Gran Via, 32", postalCode: "50013", city: "Zaragoza", country: "ES"}],
156070             photoURI: "",
156071             phoneNumbers: [],
156072             emails: ["leo@underground.com"]
156073         }, {
156074             id: id2,
156075             firstName: "Jordan",
156076             lastName: "",
156077             nicknames: [""],
156078             phoneticName: "",
156079             addresses: [],
156080             photoURI: "",
156081             phoneNumbers: [],
156082             emails: ["jordan@underground.com"]
156083         }]
156084     };
156085
156086     contacts.SIM_ADDRESS_BOOK = {
156087         type: _self().SIM_ADDRESS_BOOK,
156088         items: [{
156089             id: id3,
156090             firstName: "Raphael",
156091             lastName: "",
156092             nicknames: [""],
156093             phoneticName: "",
156094             addresses: [],
156095             photoURI: "",
156096             phoneNumbers: [],
156097             emails: ["raph@underground.com"]
156098         }]
156099     };
156100
156101     contacts.DEVICE_ADDRESS_BOOK = {
156102         type: _self().DEVICE_ADDRESS_BOOK,
156103         items: [{
156104             id: id4,
156105             firstName: "Michelangelo",
156106             lastName: "",
156107             nicknames: [""],
156108             phoneticName: "",
156109             addresses: [],
156110             photoURI: "",
156111             phoneNumbers: [],
156112             emails: ["mike@underground.com"]
156113         }]
156114     };
156115
156116     return contacts;
156117 }
156118
156119 function _get() {
156120     _contacts = db.retrieveObject(_KEY) || _defaultContacts();
156121 }
156122
156123 function _save() {
156124     db.saveObject(_KEY, _contacts);
156125 }
156126
156127 function _initAddressBooks() {
156128     _get();
156129     utils.forEach(_contacts, function (contactObj, name) {
156130         _addressBooks.push(new AddressBook(contactObj.type, name));
156131     });
156132 }
156133
156134 _self = function () {
156135     var contact = {
156136         getAddressBooks: function (successCallback, errorCallback) {
156137             function _getAddressBooks() {
156138                 if (_addressBooks.length === 0) {
156139                     _initAddressBooks();
156140                 }
156141                 successCallback(_addressBooks);
156142             }
156143             return wac2_utils.validateTypeMismatch(successCallback, errorCallback, "getAddressBooks", _getAddressBooks);
156144         },
156145
156146         handleSubFeatures: function (subFeatures) {
156147             for (var subFeature in subFeatures) {
156148                 if (_security[subFeature].length === 0) {
156149                     _security.all = true;
156150                     return;
156151                 }
156152                 _security.all = false;
156153                 utils.forEach(_security[subFeature], function (method) {
156154                     _security[method] = true;
156155                 });
156156             }
156157         }
156158     };
156159
156160     contact.__defineGetter__("SIM_ADDRESS_BOOK", function () {
156161         return 0x0000;
156162     });
156163
156164     contact.__defineGetter__("DEVICE_ADDRESS_BOOK", function () {
156165         return 0x000F;
156166     });
156167
156168     contact.__defineGetter__("PHONE_ADDRESS_BOOK", function () {
156169         return 0x00FF;
156170     });
156171
156172     return contact;
156173 };
156174
156175 AddressBook = function (type, name) {
156176     var addressBook,
156177         contactItems = _contacts[name].items;
156178
156179     addressBook = {
156180         createContact: function (contactProperties) {
156181             var cp, contact = new Contact();
156182
156183             if ((contactProperties !== undefined) &&
156184                 (contactProperties !== null)) {
156185                 cp = TypeCoerce(ContactProperties).cast(contactProperties);
156186                 !cp.firstName    || (contact.firstName    = utils.copy(cp.firstName));
156187                 !cp.lastName     || (contact.lastName     = utils.copy(cp.lastName));
156188                 !cp.nicknames    || (contact.nicknames    = utils.copy(cp.nicknames));
156189                 !cp.phoneticName || (contact.phoneticName = utils.copy(cp.phoneticName));
156190                 !cp.addresses    || (contact.addresses    = utils.copy(cp.addresses));
156191                 !cp.photoURI     || (contact.photoURI     = utils.copy(cp.photoURI));
156192                 !cp.phoneNumbers || (contact.phoneNumbers = utils.copy(cp.phoneNumbers));
156193                 !cp.emails       || (contact.emails       = utils.copy(cp.emails));
156194             }
156195
156196             return contact;
156197         },
156198
156199         addContact: function (successCallback, errorCallback, contact) {
156200             function _addContact() {
156201                 var c;
156202
156203                 if (!contact)
156204                     exception.raise(exception.types.Argument, "addContact invalid message parameter", new DeviceApiError(errorcode.INVALID_VALUES_ERR));
156205
156206                 if (!_security.all && !_security.addContact)
156207                     return _errorOccurred(errorCallback, errorcode.SECURITY_ERR);
156208
156209                 c = TypeCoerce(new Contact()).cast(contact);
156210                 contactItems.push(c);
156211                 _save();
156212                 successCallback(c);
156213             }
156214             return wac2_utils.validateTypeMismatch(successCallback, errorCallback, "addContact", _pendingOperate(_addContact));
156215         },
156216
156217         updateContact: function (successCallback, errorCallback, contact) {
156218             function _updateContact() {
156219                 var c, isFound = false;
156220
156221                 if (!contact)
156222                     exception.raise(exception.types.Argument, "updateContact invalid message parameter", new DeviceApiError(errorcode.INVALID_VALUES_ERR));
156223
156224                 if (!_security.all && !_security.updateContact)
156225                     return _errorOccurred(errorCallback, errorcode.SECURITY_ERR);
156226
156227                 c = TypeCoerce(new Contact()).cast(contact);
156228                 utils.forEach(contactItems, function (contactItem) {
156229                     if (contactItem.id === c.id) {
156230                         !c.firstName    || (contactItem.firstName    = utils.copy(c.firstName));
156231                         !c.lastName     || (contactItem.lastName     = utils.copy(c.lastName));
156232                         !c.nicknames    || (contactItem.nicknames    = utils.copy(c.nicknames));
156233                         !c.phoneticName || (contactItem.phoneticName = utils.copy(c.phoneticName));
156234                         !c.addresses    || (contactItem.addresses    = utils.copy(c.addresses));
156235                         !c.photoURI     || (contactItem.photoURI     = utils.copy(c.photoURI));
156236                         !c.phoneNumbers || (contactItem.phoneNumbers = utils.copy(c.phoneNumbers));
156237                         !c.emails       || (contactItem.emails       = utils.copy(c.emails));
156238
156239                         _save();
156240                         isFound = true;
156241                         successCallback();
156242                     }
156243                 });
156244
156245                 if (!isFound)
156246                     _errorOccurred(errorCallback, errorcode.NOT_FOUND_ERR);
156247             }
156248             return wac2_utils.validateTypeMismatch(successCallback, errorCallback, "updateContact", _pendingOperate(_updateContact));
156249         },
156250
156251         deleteContact: function (successCallback, errorCallback, id) {
156252             function _deleteContact() {
156253                 var isFound = false;
156254
156255                 if (!_security.all && !_security.deleteContact)
156256                     return _errorOccurred(errorCallback, errorcode.SECURITY_ERR);
156257
156258                 utils.forEach(contactItems, function (contactItem, index) {
156259                     if (contactItem.id === id) {
156260                         contactItems.splice(index, 1);
156261                         _save();
156262                         isFound = true;
156263                         successCallback();
156264                     }
156265                 });
156266
156267                 if (!isFound)
156268                     _errorOccurred(errorCallback, errorcode.NOT_FOUND_ERR);
156269             }
156270             return wac2_utils.validateTypeMismatch(successCallback, errorCallback, "deleteContact", _pendingOperate(_deleteContact));
156271         },
156272
156273         findContacts: function (successCallback, errorCallback, filter) {
156274             function _findContacts() {
156275                 var contact, result = [];
156276
156277                 if (!_security.all && !_security.findContacts)
156278                     return _errorOccurred(errorCallback, errorcode.SECURITY_ERR);
156279
156280                 utils.forEach(contactItems, function (contactItem) {
156281                     if ((filter              === undefined || filter === null) ||
156282                         (filter.id           === undefined || Filter(filter.id).match(contactItem.id)) &&
156283                         (filter.firstName    === undefined || Filter(filter.firstName).match(contactItem.firstName)) &&
156284                         (filter.lastName     === undefined || Filter(filter.lastName).match(contactItem.lastName)) &&
156285                         (filter.phoneticName === undefined || Filter(filter.phoneticName).match(contactItem.phoneticName)) &&
156286                         (filter.nickname     === undefined || Filter(filter.nickname).match(contactItem.nicknames)) &&
156287                         (filter.phoneNumber  === undefined || Filter(filter.phoneNumber).match(contactItem.phoneNumbers)) &&
156288                         (filter.email        === undefined || Filter(filter.email).match(contactItem.emails)) &&
156289                         (filter.address      === undefined || Filter(filter.address).match(contactItem.addresses))) {
156290                         contact = new Contact(contactItem.id);
156291
156292                         contact.firstName    = utils.copy(contactItem.firstName);
156293                         contact.lastName     = utils.copy(contactItem.lastName);
156294                         contact.nicknames    = utils.copy(contactItem.nicknames);
156295                         contact.phoneticName = utils.copy(contactItem.phoneticName);
156296                         contact.addresses    = utils.copy(contactItem.addresses);
156297                         contact.photoURI     = utils.copy(contactItem.photoURI);
156298                         contact.phoneNumbers = utils.copy(contactItem.phoneNumbers);
156299                         contact.emails       = utils.copy(contactItem.emails);
156300
156301                         result.push(contact);
156302                     }
156303                 });
156304                 successCallback(result);
156305             }
156306             return wac2_utils.validateTypeMismatch(successCallback, errorCallback, "findContacts", _pendingOperate(_findContacts));
156307         }
156308     };
156309
156310     addressBook.__defineGetter__("type", function () {
156311         return type;
156312     });
156313
156314     addressBook.__defineGetter__("name", function () {
156315         return name;
156316     });
156317
156318     return addressBook;
156319 };
156320
156321 Address = {
156322     country: "",
156323     region: "",
156324     county: "",
156325     city: "",
156326     streetAddress: "",
156327     additionalInformation: "",
156328     postalCode: ""
156329 };
156330
156331 ContactAddress = function () {
156332     this.types = [""]; // "WORK", "PREF", "HOME"
156333 };
156334
156335 ContactAddress.prototype = Address;
156336
156337 PhoneNumber = {
156338     number: "",
156339     types: [""] // "WORK", "PREF", "HOME", "VOICE", "FAX", "MSG", "CELL",
156340                 // "PAGER", "BBS", "MODEM", "CAR", "ISDN", "VIDEO", "PCS"
156341 };
156342
156343 EmailAddress = {
156344     email: "",
156345     types: [""] // "WORK", "PREF", "HOME"
156346 };
156347
156348 ContactProperties = {
156349     firstName: "",
156350     lastName: "",
156351     nicknames: [""],
156352     phoneticName: "",
156353     addresses: [new ContactAddress()],
156354     photoURI: "",
156355     phoneNumbers: [PhoneNumber],
156356     emails: [EmailAddress]
156357 };
156358
156359 Contact = function (id) {
156360     id = id || Math.uuid(null, 16);
156361
156362     this.__defineGetter__("id", function () {
156363         return id;
156364     });
156365 };
156366
156367 Contact.prototype = ContactProperties;
156368
156369 ContactFilter = {
156370     id: "",
156371     firstName: "",
156372     lastName: "",
156373     phoneticName: "",
156374     nickname: "",
156375     phoneNumber: "",
156376     email: "",
156377     address: ""
156378 };
156379
156380 module.exports = _self;
156381
156382 });
156383 define('ripple/platform/wac/2.0/orientation', function (require, exports, module) {
156384 /*
156385  *  Copyright 2011 Intel Corporation.
156386  *
156387  * Licensed under the Apache License, Version 2.0 (the "License");
156388  * you may not use this file except in compliance with the License.
156389  * You may obtain a copy of the License at
156390  *
156391  * http://www.apache.org/licenses/LICENSE-2.0
156392  *
156393  * Unless required by applicable law or agreed to in writing, software
156394  * distributed under the License is distributed on an "AS IS" BASIS,
156395  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
156396  * See the License for the specific language governing permissions and
156397  * limitations under the License.
156398  */
156399
156400 var utils = require('ripple/utils'),
156401     event = require('ripple/event'),
156402     Rotation = function (alpha, beta, gamma) {
156403         return {
156404             alpha: alpha || 0,
156405             beta:  beta  || 0,
156406             gamma: gamma || 0
156407         };
156408     },
156409     wac2_utils = require('ripple/platform/wac/2.0/wac2_utils'),
156410     _rotationInfo = new Rotation(),
156411     _defaultInterval = 100,
156412     _watches = {},
156413     _self;
156414
156415 module.exports = _self = {
156416     getCurrentOrientation: function (onSuccess, onError) {
156417         function _getCurrentOrientation() {
156418             setTimeout(function () {
156419                 onSuccess(utils.copy(_rotationInfo));
156420             }, 1);
156421             return null;
156422         }
156423
156424         return wac2_utils.validateTypeMismatch(onSuccess, onError, "getCurrentOrientation", _getCurrentOrientation);
156425     },
156426
156427     watchOrientation: function (orientationSuccess, orientationError, options) {
156428         function _watchOrientation() {
156429             var watchId = (new Date()).getTime() | 0,
156430                 watchObj = {},
156431                 opt = Object(options),
156432                 minNotificationInterval = opt.minNotificationInterval | 0,
156433                 orientationInterval = _defaultInterval;
156434
156435             if (minNotificationInterval > 0) {
156436                 orientationInterval = minNotificationInterval;
156437             }
156438
156439             watchObj = {
156440                 onSuccess: orientationSuccess,
156441                 onError: orientationError,
156442                 interval: orientationInterval
156443             };
156444
156445             _watches[watchId] = watchObj;
156446
156447             _watches[watchId].intervalId = setInterval(function () {
156448                 _self.getCurrentOrientation(_watches[watchId].onSuccess, _watches[watchId].onError);
156449             }, _watches[watchId].interval);
156450
156451             return watchId;
156452         }
156453
156454         return wac2_utils.validateTypeMismatch(orientationSuccess, orientationError, "watchOrientation", _watchOrientation);
156455     },
156456
156457     clearWatch: function (watchId) {
156458
156459         var id = watchId | 0;
156460         if (_watches[id]) {
156461             clearInterval(_watches[id].intervalId);
156462             delete(_watches[id]);
156463             return null;
156464         }
156465
156466         return undefined;
156467     }
156468 };
156469
156470 event.on("AccelerometerInfoChangedEvent", function (orientationInfo) {
156471     _rotationInfo.alpha = orientationInfo.orientation.alpha;
156472     _rotationInfo.beta  = orientationInfo.orientation.beta;
156473     _rotationInfo.gamma = orientationInfo.orientation.gamma;
156474 });
156475
156476
156477 });
156478 define('ripple/platform/wac/2.0/geolocation', function (require, exports, module) {
156479 /*
156480  *  Copyright 2011 Intel Corporation.
156481  *
156482  * Licensed under the Apache License, Version 2.0 (the "License");
156483  * you may not use this file except in compliance with the License.
156484  * You may obtain a copy of the License at
156485  *
156486  * http://www.apache.org/licenses/LICENSE-2.0
156487  *
156488  * Unless required by applicable law or agreed to in writing, software
156489  * distributed under the License is distributed on an "AS IS" BASIS,
156490  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
156491  * See the License for the specific language governing permissions and
156492  * limitations under the License.
156493  */
156494
156495 var geo = require('ripple/geo'),
156496     Position = require('ripple/platform/w3c/1.0/Position'),
156497     PositionError = require('ripple/platform/w3c/1.0/PositionError'),
156498     _lastPosition = null,
156499     _watches = {},
156500     _defaultInterval = 100,
156501     _defaultDelay = 50,
156502     _self;
156503
156504 function _createPosition() {
156505     var position = new Position(),
156506         positionInfo = geo.getPositionInfo();
156507
156508     position.coords.latitude = positionInfo.latitude;
156509     position.coords.longitude = positionInfo.longitude;
156510     position.coords.altitude = positionInfo.altitude;
156511     position.coords.altitudeAccuracy = positionInfo.altitudeAccuracy;
156512     position.coords.accuracy = positionInfo.accuracy;
156513     position.coords.heading = positionInfo.heading;
156514     position.coords.speed = positionInfo.speed;
156515     position.timestamp = positionInfo.timeStamp.getTime();
156516
156517     return position;
156518 }
156519
156520 function _isValid(onSuccess, onError, options, argLength) {
156521     if (argLength < 1 || argLength > 3)
156522         return false;
156523
156524     if (typeof onSuccess !== "function")   // imply onSuccess == null
156525         return false;
156526
156527     if (onError && (typeof onError !== "function"))
156528         return false;
156529
156530     if ((options !== undefined) &&
156531         ((typeof options !== "object") ||
156532         (options.enableHighAccuracy !== undefined) && (typeof options.enableHighAccuracy !== "boolean") ||
156533         (options.timeout            !== undefined) && (typeof options.timeout            !== "number") ||
156534         (options.maximumAge         !== undefined) && (typeof options.maximumAge         !== "number")))
156535         return false;
156536
156537     return true;
156538 }
156539
156540 function _processOptions(options) {
156541     var validOptions = {
156542         enableHighAccuracy: false,
156543         timeout: 0,
156544         maximumAge: 0
156545     };
156546
156547     if (options !== undefined &&
156548         options.maximumAge !== undefined &&
156549         options.maximumAge === Math.floor(options.maximumAge) &&
156550         options.maximumAge >= 0) {
156551         validOptions.maximumAge = options.maximumAge | 0;
156552     } else {
156553         validOptions.maximumAge = 0;
156554     }
156555
156556     if (options !== undefined &&
156557         options.timeout !== undefined &&
156558         options.timeout === Math.floor(options.timeout)) {
156559         validOptions.timeout = (options.timeout >= 0) ? (options.timeout | 0) : 0;
156560     } else {
156561         validOptions.timeout = Infinity;
156562     }
156563
156564     if (options !== undefined && options.enableHighAccuracy !== undefined) {
156565         validOptions.enableHighAccuracy = options.enableHighAccuracy;
156566     } else {
156567         validOptions.enableHighAccuracy = false;
156568     }
156569
156570     validOptions.delay = geo.delay * 1000 || _defaultDelay;
156571
156572     return validOptions;
156573 }
156574
156575 function _errorOccur(code, onError) {
156576     if (!onError)
156577         return;
156578
156579     var error = new PositionError();
156580
156581     error.code = code;
156582     switch (code) {
156583     case PositionError.POSITION_UNAVAILABLE:
156584         error.message = "Position unavailable";
156585         break;
156586
156587     case PositionError.TIMEOUT:
156588         error.message = "Position timed out";
156589         break;
156590     }
156591
156592     onError(error);
156593 }
156594
156595 function _execute(data) {
156596     return function () {
156597         if (_lastPosition !== null &&
156598             ((new Date()).getTime() - _lastPosition.timestamp <= data.maximumAge)) {
156599             window.setTimeout(function () {
156600                 data.onSuccess(_lastPosition);
156601             }, 1);
156602         } else if (data.timeout === 0) {
156603             _errorOccur(PositionError.TIMEOUT, data.onError);
156604         } else {
156605             window.setTimeout(function () {
156606                 if (data.delay <= data.timeout) {
156607                     _lastPosition = _createPosition();
156608
156609                     if (_lastPosition !== null) {
156610                         data.onSuccess(_lastPosition);
156611                     } else {
156612                         _errorOccur(PositionError.POSITION_UNAVAILABLE, data.onError);
156613                     }
156614                 } else {
156615                     _errorOccur(PositionError.TIMEOUT, data.onError);
156616                 }
156617             }, Math.min(data.delay, data.timeout));
156618         }
156619     };
156620 }
156621
156622 function _interval(k, n) { 
156623     return k * Math.floor((n + k - 1) / k) || k;
156624 }
156625
156626 _self = {
156627     getCurrentPosition: function (onSuccess, onError, options) {
156628         if (!_isValid(onSuccess, onError, options, arguments.length))
156629             return;
156630
156631         var validData = _processOptions(options);
156632
156633         validData.onSuccess = onSuccess;
156634         validData.onError   = onError;
156635
156636         _execute(validData)();
156637     },
156638
156639     watchPosition: function (geolocationSuccess, geolocationError, geolocationOptions) {
156640         if (!_isValid(geolocationSuccess, geolocationError, geolocationOptions, arguments.length))
156641             return undefined;
156642
156643         var validData = _processOptions(geolocationOptions),
156644             watchId = (new Date()).getTime() | 0,
156645             watchObj = {
156646                 onSuccess:          geolocationSuccess,
156647                 onError:            geolocationError,
156648                 enableHighAccuracy: validData.enableHighAccuracy,
156649                 timeout:            validData.timeout,
156650                 maximumAge:         validData.maximumAge,
156651                 delay:              validData.delay,
156652                 interval:           _interval(validData.maximumAge || _defaultInterval,
156653                                         Math.min(validData.delay, validData.timeout)),
156654             };
156655
156656         _watches[watchId] = watchObj;
156657
156658         _watches[watchId].intervalId = window.setInterval(_execute(_watches[watchId]),
156659             _watches[watchId].interval);
156660
156661         return watchId;
156662     },
156663
156664     clearWatch: function (watchId) {
156665         if (arguments.length !== 1)
156666             return undefined;
156667
156668         var id = watchId | 0;
156669
156670         if (_watches[id]) {
156671             window.clearInterval(_watches[id].intervalId);
156672             delete _watches[id];
156673
156674             return null;
156675         }
156676
156677         return undefined;
156678     }
156679 };
156680
156681 module.exports = _self;
156682
156683 });
156684 define('ripple/platform/wac/2.0/deviceapis', function (require, exports, module) {
156685 /*
156686  *  Copyright 2011 Intel Corporation.
156687  *
156688  * Licensed under the Apache License, Version 2.0 (the "License");
156689  * you may not use this file except in compliance with the License.
156690  * You may obtain a copy of the License at
156691  *
156692  * http://www.apache.org/licenses/LICENSE-2.0
156693  *
156694  * Unless required by applicable law or agreed to in writing, software
156695  * distributed under the License is distributed on an "AS IS" BASIS,
156696  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
156697  * See the License for the specific language governing permissions and
156698  * limitations under the License.
156699  */
156700
156701 var platform = require('ripple/platform'),
156702     app = require('ripple/app'),
156703     utils = require('ripple/utils'),
156704     init_done = false,
156705     _activatedSet = {},
156706     _activatedFeatures = [],
156707     _availableSet = {},
156708     _availableFeatures = [],
156709     _features = {},
156710     initFeaturesSet,
156711     populateFeatures;
156712
156713 populateFeatures = function (objects) {
156714     utils.forEach(objects, function (obj, key) {
156715         var objFeatures = {}, rpt, i, j;
156716         if (obj.feature) {
156717             objFeatures = obj.feature.split('|');
156718             utils.forEach(objFeatures, function (feature) {
156719                 var avail = {uri: feature,
156720                              required: false,
156721                              param: null};
156722                 _availableSet[feature] = avail;
156723             });
156724             if (_features) {
156725                 rpt = objFeatures.length;
156726                 j = 0;
156727                 for (i = 0; i < rpt; i++) {
156728                     if (!_features[objFeatures[j]]) {
156729                         objFeatures.splice(j, 1);
156730                     } else {
156731                         j++;
156732                     }
156733                 }
156734             }
156735             utils.forEach(objFeatures, function (feature) {
156736                 var avail = {uri: feature,
156737                              required: true,
156738                              param: null};
156739                 _activatedSet[feature] = avail;
156740             });
156741         }
156742         if (obj.children) {
156743             populateFeatures(obj.children);
156744         }
156745     });
156746 };
156747
156748 initFeaturesSet = function () {
156749     _features = utils.copy(app.getInfo().features);
156750     populateFeatures(platform.current().objects);
156751     utils.forEach(_activatedSet, function (obj, key) {
156752             _activatedFeatures.push(obj);
156753         });
156754     utils.forEach(_availableSet, function (obj, key) {
156755             _availableFeatures.push(obj);
156756         });
156757     init_done = true;
156758 };
156759
156760 module.exports = {
156761     listAvailableFeatures: function () {
156762         if (!init_done)
156763             initFeaturesSet();
156764         return _availableFeatures;
156765     },
156766
156767     listActivatedFeatures: function () {
156768         if (!init_done)
156769             initFeaturesSet();
156770         return _activatedFeatures;
156771     }
156772 };
156773
156774
156775 });
156776 define('ripple/platform/wac/2.0/calendar', function (require, exports, module) {
156777 /*
156778  *  Copyright 2011 Intel Corporation.
156779  *
156780  * Licensed under the Apache License, Version 2.0 (the "License");
156781  * you may not use this file except in compliance with the License.
156782  * You may obtain a copy of the License at
156783  *
156784  * http://www.apache.org/licenses/LICENSE-2.0
156785  *
156786  * Unless required by applicable law or agreed to in writing, software
156787  * distributed under the License is distributed on an "AS IS" BASIS,
156788  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
156789  * See the License for the specific language governing permissions and
156790  * limitations under the License.
156791  */
156792
156793 var db = require('ripple/db'),
156794     utils = require('ripple/utils'),
156795     exception = require('ripple/exception'),
156796     constants = require('ripple/constants'),
156797     errorcode = require('ripple/platform/wac/2.0/errorcode'),
156798     PendingOperation = require('ripple/platform/wac/2.0/pendingoperation'),
156799     PendingObject = require('ripple/platform/wac/2.0/pendingObject'),
156800     wac2_utils = require('ripple/platform/wac/2.0/wac2_utils'),
156801     _console = require('ripple/console'),
156802     DeviceApiError = require('ripple/platform/wac/2.0/deviceapierror'),
156803     _SIM_CALENDAR = 0, _DEVICE_CALENDAR = 1,
156804     _NO_RECURRENCE = 0, _DAILY_RECURRENCE = 1, _WEEKLY_RECURRENCE = 2,
156805     _MONTHLY_RECURRENCE = 3, _YEARLY_RECURRENCE = 4,
156806     _TENTATIVE_STATUS = 0, _CONFIRMED_STATUS = 1, _CANCELLED_STATUS = 2,
156807     _NO_ALARM = 0, _SILENT_ALARM = 1, _SOUND_ALARM = 2,
156808     _calendars = [], _DB_CALENDARS_KEY = "wac2-db-calendars",
156809     _FAKEWAITTIME = 5, _FAKE_LONG_WAITTIME = 10,
156810     _save_calendars, _eventPropCheck, _eventFilterCheck,
156811     _addEventAllowed = true, _deleteEventAllowed = true,
156812     _updateEventAllowed = true, _findEventsAllowed = true,
156813     CalendarEventProperties, Calendar, CalendarEvent;
156814
156815 _save_calendars = function (_name, _type, _events) {
156816     var i;
156817     for (i = 0; i < _calendars.length; i++) {
156818         if (_calendars[i].name === _name && _calendars[i].type === _type) {
156819             _calendars[i].events = _events;
156820             break;
156821         }
156822     }
156823     db.saveObject(_DB_CALENDARS_KEY, _calendars);
156824 };
156825
156826 _eventPropCheck = function (prop, dst) {
156827     var i;
156828     if (prop.description !== null && prop.description !== undefined) {
156829         dst.description = String(prop.description);
156830     }
156831     if (prop.summary !== null && prop.summary !== undefined) {
156832         dst.summary = String(prop.summary);
156833     } 
156834     if (prop.startTime !== null && prop.startTime !== undefined) {
156835         if (!wac2_utils.isValidDate(prop.startTime)) {
156836             return false;
156837         }
156838         dst.startTime = new Date(prop.startTime);
156839     }
156840     dst.duration = prop.duration | 0;
156841     if (prop.location !== null && prop.location !== undefined) {
156842         dst.location = String(prop.location);
156843     }
156844     if (prop.categories !== null && prop.categories !== undefined) {
156845         if (!wac2_utils.isValidArray(prop.categories))  {
156846             return false;
156847         }
156848         dst.categories = [];
156849         for (i = 0; i < prop.categories.length; i++) {
156850             dst.categories.push(String(prop.categories[i]));
156851         }
156852     }
156853     if (prop.recurrence !== null && prop.recurrence !== undefined) {
156854         if (prop.recurrence === _NO_RECURRENCE ||
156855             prop.recurrence === _DAILY_RECURRENCE ||
156856             prop.recurrence === _WEEKLY_RECURRENCE ||
156857             prop.recurrence === _MONTHLY_RECURRENCE ||
156858             prop.recurrence === _YEARLY_RECURRENCE) {
156859             dst.recurrence = prop.recurrence | 0;
156860         } else {
156861             return false;
156862         }
156863     }
156864     if (dst.recurrence === _NO_RECURRENCE) {
156865         dst.expires = null;
156866         dst.interval = null;
156867     } else {
156868         // expires and interval matters when recurrence is not NO_RECURRENCE
156869         if (prop.expires !== null && prop.expires !== undefined) {
156870             if (!wac2_utils.isValidDate(prop.expires)) {
156871                 return false;
156872             }
156873             dst.expires = new Date(prop.expires);
156874         }
156875         // expires === undefined -> to recur indefinitely
156876         // expires === null -> keep dst.expires unchanged, even it's null
156877         if (prop.expires === undefined) {
156878             dst.expires = null;
156879         }
156880         if (prop.interval !== null && prop.interval !== undefined) {
156881             dst.interval = prop.interval | 0;
156882         }
156883     }
156884
156885     if (prop.status !== null && prop.status !== undefined) {
156886         if (prop.status === _TENTATIVE_STATUS ||
156887             prop.status === _CONFIRMED_STATUS ||
156888             prop.status === _CANCELLED_STATUS) {
156889             dst.status = prop.status | 0;
156890         } else {
156891             return false;
156892         }
156893     }
156894
156895     if (prop.alarmType !== null && prop.alarmType !== undefined) {
156896         if (prop.alarmType === _NO_ALARM ||
156897             prop.alarmType === _SILENT_ALARM ||
156898             prop.alarmType === _SOUND_ALARM) {
156899             dst.alarmType = prop.alarmType;
156900         } else {
156901             return false;
156902         }
156903     } 
156904     if (dst.alarmType !== _NO_ALARM && prop.alarmTrigger !== undefined && prop.alarmTrigger !== undefined) {
156905         dst.alarmTrigger = prop.alarmTrigger | 0;
156906     }
156907 };
156908
156909 _eventFilterCheck = function (filter) {
156910     if (filter.id !== undefined && filter.id !== null) {
156911         filter.id = String(filter.id);
156912     } else {
156913         filter.id = undefined;
156914     }
156915     if (filter.summary !== undefined && filter.summary !== null) {
156916         filter.summary = String(filter.summary);
156917     } else {
156918         filter.summary = undefined;
156919     }
156920     if (filter.description !== undefined && filter.description !== null) {
156921         filter.description = String(filter.description);
156922     } else {
156923         filter.description = undefined;
156924     }
156925     if (filter.location !== undefined && filter.location !== null) {
156926         filter.location = String(filter.location);
156927     } else {
156928         filter.location = undefined;
156929     }
156930     if (filter.catetory !== undefined && filter.catetory !== null) {
156931         filter.catetory = String(filter.catetory);
156932     } else {
156933         filter.catetory = undefined;
156934     }
156935     if (filter.status !== undefined && filter.status !== null) {
156936         var i;
156937         if (!wac2_utils.isValidArray(filter.status))  {
156938             return false;
156939         }
156940         for (i = 0; i < filter.status.length; i++) {
156941             filter.status[i] = filter.status[i] | 0;
156942             if (filter.status[i] > _CANCELLED_STATUS || filter.status[i] < _TENTATIVE_STATUS)
156943                 return false;
156944         }
156945     } else {
156946         filter.status = undefined;
156947     }
156948     if (filter.initialStartDate !== undefined && filter.initialStartDate !== null) {
156949         if (!wac2_utils.isValidDate(filter.initialStartDate)) {
156950             return false;
156951         }
156952         filter.initialStartDate = new Date(filter.initialStartDate);
156953     } else {
156954         filter.initialStartDate = undefined;
156955     }
156956     if (filter.endStartDate !== undefined && filter.endStartDate !== null) {
156957         if (!wac2_utils.isValidDate(filter.endStartDate)) {
156958             return false;
156959         }
156960         filter.endStartDate = new Date(filter.endStartDate);
156961     } else {
156962         filter.endStartDate = undefined;
156963     }
156964     return true;
156965 };
156966
156967 CalendarEventProperties = function (prop) {
156968     var _self;
156969     _self = {
156970         description : "",
156971         summary : "",
156972         startTime : new Date(),
156973         duration : 0,
156974         location : "",
156975         categories : undefined,
156976         recurrence : _NO_RECURRENCE,
156977         expires : null,  // ignored if recurrence == NO_RECURRENCE
156978         interval : null, // ignored if recurrence == NO_RECURRENCE
156979         status : _CONFIRMED_STATUS,
156980         alarmTrigger : 0,
156981         alarmType : _NO_ALARM
156982     };
156983     if (prop) {
156984         if (_eventPropCheck(prop, _self) === false) {
156985             return undefined;
156986         }
156987     }
156988     return _self;
156989 };
156990
156991 CalendarEvent = function (prop, genNewID) {
156992     var id, _self = new CalendarEventProperties(prop);
156993
156994     /* if error occurs during checking, _self is an empty object.
156995        so i randomly pick description to check if property check fails */
156996     if (_self.description === undefined) {
156997         return undefined;
156998     }
156999
157000     if (genNewID === true) {
157001         id = Math.uuid(undefined, 16);
157002     } else {
157003         id = prop.id;
157004     }
157005     _self.__defineGetter__("id", function () {
157006         return id;
157007     });
157008     return _self;
157009 };
157010
157011 Calendar = function (type, name, events) {
157012     var _type = type,
157013         _name = name,
157014         _events = events, _self;
157015
157016     _self = {
157017         createEvent: function (evtProp) {
157018             var rst = {};
157019             rst = new CalendarEventProperties(evtProp);
157020             /* if error occurs during checking, rst is an empty object.
157021                so i randomly pick description to check if property check fails */
157022             if (rst.description === undefined) {
157023                 exception.raise(exception.types.Argument, "EventProperties: input parameter contains invalid values", new DeviceApiError(errorcode.INVALID_VALUES_ERR));
157024                 return undefined;
157025             } else {
157026                 return rst;
157027             }
157028         },
157029
157030         addEvent: function (onSuccess, onError, calEvent) {
157031             var pendingOperation, pendingObj = {},
157032                 newEvent = {}, _doAddEvent, _calEvent = Object(calEvent);
157033
157034             _doAddEvent = function () {
157035                 if (!_addEventAllowed) {
157036                     if (onError) {
157037                         setTimeout(function () {
157038                             onError(new DeviceApiError(errorcode.SECURITY_ERR));
157039                         }, 1);
157040                     }
157041                     return undefined;
157042                 }
157043                 newEvent = new CalendarEvent(_calEvent, true);
157044                 /* if newEvent.id === undefined,
157045                    means somthing wrong in calEvent  */
157046                 if (newEvent.id === undefined) {
157047                     if (onError) {
157048                         setTimeout(function () {
157049                             onError(new DeviceApiError(errorcode.INVALID_VALUES_ERR));
157050                         }, 1);
157051                     }
157052                     return undefined;
157053                 }
157054
157055                 pendingObj = new PendingObject();
157056                 pendingObj.pendingID = setTimeout(function () {
157057                     pendingObj.setCancelFlag(false);
157058                     _events[newEvent.id] = newEvent;
157059                     _save_calendars(_name, _type, _events);
157060                     onSuccess(new CalendarEvent(newEvent), false);
157061                 }, _FAKEWAITTIME);
157062                 pendingOperation = new PendingOperation(pendingObj);
157063                 return pendingOperation;
157064             };
157065
157066             return wac2_utils.validateTypeMismatch(onSuccess, onError, "Calendar:addEvent", _doAddEvent);
157067         },
157068
157069         updateEvent: function (onSuccess, onError, calEvent) {
157070             var pendingOperation, pendingObj = {},
157071                 chkEvent, _doUpdateEvent, _calEvent = Object(calEvent);
157072
157073             _doUpdateEvent = function () {
157074                 if (!_updateEventAllowed) {
157075                     if (onError) {
157076                         setTimeout(function () {
157077                             onError(new DeviceApiError(errorcode.SECURITY_ERR));
157078                         }, 1);
157079                     }
157080                     return undefined;
157081                 }
157082                 if (!_events[_calEvent.id]) {
157083                     if (onError) {
157084                         setTimeout(function () {
157085                             onError(new DeviceApiError(errorcode.NOT_FOUND_ERR));
157086                         }, 1);
157087                     }
157088                     return undefined;
157089                 }
157090
157091                 chkEvent = new CalendarEvent(_events[_calEvent.id], false);
157092                 /* _eventPropCheck will also update chkEvent btw */
157093                 if (_eventPropCheck(_calEvent, chkEvent) === false) {
157094                     if (onError) {
157095                         setTimeout(function () {
157096                             onError(new DeviceApiError(errorcode.INVALID_VALUES_ERR));
157097                         }, 1);
157098                     }
157099                     return undefined;
157100                 }
157101                 pendingObj = new PendingObject();
157102                 pendingObj.pendingID = setTimeout(function () {
157103                     pendingObj.setCancelFlag(false);
157104
157105                     _events[chkEvent.id] = chkEvent;
157106                     _save_calendars(_name, _type, _events);
157107                     onSuccess();
157108                 }, _FAKEWAITTIME);
157109                 pendingOperation = new PendingOperation(pendingObj);
157110                 return pendingOperation;
157111             };
157112
157113             return wac2_utils.validateTypeMismatch(onSuccess, onError, "Calendar:updateEvent", _doUpdateEvent);
157114         },
157115
157116         deleteEvent: function (onSuccess, onError, id) {
157117             var pendingOperation, pendingObj = {},
157118                 _doDeleteEvent;
157119
157120             _doDeleteEvent = function () {
157121                 /* according to spec  "If any of the input parameters are not 
157122                    compatible with the expected type for that parameter, 
157123                    a DeviceAPIError with code TYPE_MISMATCH_ERR MUST be 
157124                    synchronously thrown." 
157125                    so an error is raised synchronously */
157126                 utils.validateArgumentType(id, "string", null,
157127                                        "Calendar:deleteEvent: " + " invalid id parameter",
157128                                        new DeviceApiError(errorcode.TYPE_MISMATCH_ERR));
157129
157130                 if (!_deleteEventAllowed) {
157131                     if (onError) {
157132                         setTimeout(function () {
157133                             onError(new DeviceApiError(errorcode.SECURITY_ERR));
157134                         }, 1);
157135                     }
157136                     return undefined;
157137                 }
157138                 if (!_events[id]) {
157139                     if (onError) {
157140                         setTimeout(function () {
157141                             onError(new DeviceApiError(errorcode.NOT_FOUND_ERR));
157142                         }, 1);
157143                     }
157144                     return undefined;
157145                 }
157146
157147                 pendingObj = new PendingObject();
157148                 pendingObj.pendingID = setTimeout(function () {
157149                     pendingObj.setCancelFlag(false);
157150
157151                     delete _events[id];
157152                     _save_calendars(_name, _type, _events);
157153                     onSuccess();
157154                 }, _FAKEWAITTIME);
157155                 pendingOperation = new PendingOperation(pendingObj);
157156                 return pendingOperation;
157157             };
157158
157159             return wac2_utils.validateTypeMismatch(onSuccess, onError, "Calendar:deleteEvent", _doDeleteEvent);
157160         },
157161
157162         findEvents: function (onSuccess, onError, eventFilter) {
157163             var pendingOperation, pendingObj = {}, i,
157164                 tmp = [], valid_tmp = false, rst = [], _doFindEvents,
157165                 _eventFilter = Object(eventFilter);
157166
157167             _doFindEvents = function () {
157168                 if (!_eventFilterCheck(_eventFilter)) {
157169                     if (onError) {
157170                         setTimeout(function () {
157171                             onError(new DeviceApiError(errorcode.INVALID_VALUES_ERR));
157172                         }, 1);
157173                     }
157174                     return undefined;
157175                 }
157176                 if (!_findEventsAllowed) {
157177                     if (onError) {
157178                         setTimeout(function () {
157179                             onError(new DeviceApiError(errorcode.SECURITY_ERR));
157180                         }, 1);
157181                     }
157182                     return undefined;
157183                 }
157184
157185                 pendingObj = new PendingObject();
157186                 pendingObj.pendingID = setTimeout(function () {
157187                     pendingObj.setCancelFlag(false);
157188                     if (_eventFilter.id !== undefined) {
157189                         tmp = wac2_utils.matchOptionString(_events, "id", _eventFilter.id);
157190                         valid_tmp = true;
157191                     }
157192                     if (_eventFilter.summary !== undefined) {
157193                         if (valid_tmp) {
157194                             tmp = wac2_utils.matchOptionString(tmp, "summary", _eventFilter.summary);
157195                         } else {
157196                             tmp = wac2_utils.matchOptionString(_events, "summary", _eventFilter.summary);
157197                             valid_tmp = true;
157198                         }
157199                     }
157200                     if (_eventFilter.description !== undefined) {
157201                         if (valid_tmp) {
157202                             tmp = wac2_utils.matchOptionString(tmp, "description", _eventFilter.description);
157203                         } else {
157204                             tmp = wac2_utils.matchOptionString(_events, "description", _eventFilter.description);
157205                             valid_tmp = true;
157206                         }
157207                     }
157208                     if (_eventFilter.location !== undefined) {
157209                         if (valid_tmp) {
157210                             tmp = wac2_utils.matchOptionString(tmp, "location", _eventFilter.location);
157211                         } else {
157212                             tmp = wac2_utils.matchOptionString(_events, "location", _eventFilter.location);
157213                             valid_tmp = true;
157214                         }
157215                     }
157216                     if (_eventFilter.category !== undefined) {
157217                         if (valid_tmp) {
157218                             tmp = wac2_utils.matchOptionArrayString(tmp, "categories", _eventFilter.category);
157219                         } else {
157220                             tmp = wac2_utils.matchOptionArrayString(_events, "categories", _eventFilter.category);
157221                             valid_tmp = true;
157222                         }
157223                     }
157224                     if (_eventFilter.status !== undefined) {
157225                         if (valid_tmp) {
157226                             tmp = wac2_utils.matchOptionShortArray(tmp, "status", _eventFilter.status);
157227                         } else {
157228                             tmp = wac2_utils.matchOptionShortArray(_events, "status", _eventFilter.status);
157229                             valid_tmp = true;
157230                         }
157231                     }
157232                     if (_eventFilter.initialStartDate !== undefined ||
157233                         _eventFilter.endStartDate !== undefined) {
157234                         if (valid_tmp) {
157235                             tmp = wac2_utils.matchOptionDate(tmp, "startTime", _eventFilter.initialStartDate, _eventFilter.endStartDate);
157236                         } else {
157237                             tmp = wac2_utils.matchOptionDate(_events, "startTime", _eventFilter.initialStartDate, _eventFilter.endStartDate);
157238                             valid_tmp = true;
157239                         }
157240                     }
157241
157242                     // to make id readonly
157243                     if (valid_tmp) {
157244                         for (i = 0; i < tmp.length; i++) {
157245                             rst.push(new CalendarEvent(tmp[i], false));
157246                         }
157247                     } else {
157248                         for (var e in _events) {
157249                             rst.push(new CalendarEvent(_events[e], false));
157250                         }
157251                     }
157252                     onSuccess(rst);
157253                 }, _FAKE_LONG_WAITTIME);
157254                 pendingOperation = new PendingOperation(pendingObj);
157255                 return pendingOperation;
157256             };
157257
157258             return wac2_utils.validateTypeMismatch(onSuccess, onError, "Calendar:findEvent", _doFindEvents);
157259         },
157260     };
157261     _self.__defineGetter__("type", function () {
157262         return _type;
157263     });
157264     _self.__defineGetter__("name", function () {
157265         return name;
157266     });
157267     return _self;
157268 };
157269
157270 module.exports = function () {
157271     this.__defineGetter__("SIM_CALENDAR", function () {
157272         return 0;
157273     });
157274     this.__defineGetter__("DEVICE_CALENDAR", function () {
157275         return 1;
157276     });
157277     this.__defineGetter__("NO_RECURRENCE", function () { 
157278         return 0;
157279     });
157280     this.__defineGetter__("DAILY_RECURRENCE", function () {
157281         return 1;
157282     });
157283     this.__defineGetter__("WEEKLY_RECURRENCE", function () {
157284         return 2;
157285     });
157286     this.__defineGetter__("MONTHLY_RECURRENCE", function () {
157287         return 3;
157288     });
157289     this.__defineGetter__("YEARLY_RECURRENCE", function () {
157290         return 4;
157291     });
157292     this.__defineGetter__("TENTATIVE_STATUS", function () {
157293         return 0;
157294     });
157295     this.__defineGetter__("CONFIRMED_STATUS", function () {
157296         return 1;
157297     });
157298     this.__defineGetter__("CANCELLED_STATUS", function () {
157299         return 2;
157300     });
157301     this.__defineGetter__("NO_ALARM", function () {
157302         return 0;
157303     });
157304     this.__defineGetter__("SILENT_ALARM", function () {
157305         return 1;
157306     });
157307     this.__defineGetter__("SOUND_ALARM", function () {
157308         return 2;
157309     });
157310
157311     this.getCalendars = function (onSuccess, onError) {
157312         var i, pendingOperation, pendingObj = {}, cal, _doGetCalendars;
157313
157314         _doGetCalendars = function () {
157315             pendingObj = new PendingObject();
157316
157317             pendingObj.pendingID = setTimeout(function () {
157318                 pendingObj.setCancelFlag(false);
157319                 cal = db.retrieveObject(_DB_CALENDARS_KEY) || [];
157320                 _calendars = [];
157321                 if (cal.length === 0) {
157322                     _calendars.push(new Calendar(_SIM_CALENDAR, "sim cal", {}));
157323                     _calendars.push(new Calendar(_DEVICE_CALENDAR, "dev cal", {}));
157324                 } else {
157325                     for (i = 0; i < cal.length; i++) {
157326                         /* after getting Date out of DB, Date will become 
157327                            a string, so need to recast it back to Date */
157328                         /* NOTE: id becomes writable, so need to recast it
157329                            before passing to application */
157330                         for (var e in cal[i].events) {
157331                             if ((cal[i].events[e].startTime !== undefined) &&
157332                                 cal[i].events[e].startTime !== null) {
157333                                 cal[i].events[e].startTime = new Date(cal[i].events[e].startTime);
157334                             }
157335                             if ((cal[i].events[e].expires !== undefined) &&
157336                                 cal[i].events[e].expires !== null) {
157337                                 cal[i].events[e].expires = new Date(cal[i].events[e].expires);
157338                             }
157339                         }
157340                         _calendars.push(new Calendar(cal[i].type, cal[i].name, cal[i].events));
157341                     }
157342                 }
157343                 if (_calendars.length !== 0) {
157344                     onSuccess(utils.copy(_calendars));
157345                 } else {
157346                     if (onError) {
157347                         onError(new DeviceApiError(errorcode.UNKNOWN_ERR));
157348                     }
157349                 }
157350             }, _FAKEWAITTIME);
157351             pendingOperation = new PendingOperation(pendingObj);
157352             return pendingOperation;
157353         };
157354     
157355         return wac2_utils.validateTypeMismatch(onSuccess, onError, "getCalendars", _doGetCalendars);
157356     };
157357
157358     this.handleSubFeatures = function (subFeatures) {
157359         if (wac2_utils.isEmptyObject(subFeatures) ||
157360             subFeatures["http://wacapps.net/api/pim.calendar"] ||
157361             (subFeatures["http://wacapps.net/api/pim.calendar.read"] &&
157362             subFeatures["http://wacapps.net/api/pim.calendar.write"])) {
157363             return;
157364         } 
157365         if (subFeatures["http://wacapps.net/api/pim.calendar.read"]) {
157366             _addEventAllowed = false;
157367             _deleteEventAllowed = false;
157368             _updateEventAllowed = false;
157369             return;
157370         } 
157371         if (subFeatures["http://wacapps.net/api/pim.calendar.write"]) {
157372             _findEventsAllowed = false;
157373             return;
157374         } 
157375         _console.warn("WAC-2.0-Calendar-handleSubFeatures: something wrong");
157376     };
157377 };
157378
157379 });
157380 define('ripple/platform/wac/2.0/filesystem', function (require, exports, module) {
157381 /*
157382  *  Copyright 2011 Intel Corporation.
157383  *
157384  * Licensed under the Apache License, Version 2.0 (the "License");
157385  * you may not use this file except in compliance with the License.
157386  * You may obtain a copy of the License at
157387  *
157388  * http://www.apache.org/licenses/LICENSE-2.0
157389  *
157390  * Unless required by applicable law or agreed to in writing, software
157391  * distributed under the License is distributed on an "AS IS" BASIS,
157392  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
157393  * See the License for the specific language governing permissions and
157394  * limitations under the License.
157395  */
157396
157397 var errorcode = require('ripple/platform/wac/2.0/errorcode'),
157398     DeviceApiError = require('ripple/platform/wac/2.0/deviceapierror'),
157399     utils = require('ripple/utils'),
157400     dbfs  = require('ripple/platform/wac/2.0/dbfs'),
157401     wac2_utils = require('ripple/platform/wac/2.0/wac2_utils'),
157402     _console = require('ripple/console'),
157403     _maxPathLength = 256,
157404     _virtualRoots = ["documents", "images", "music", "videos", "downloads", "wgt-package", "wgt-private", "wgt-private-tmp", "removable", "attachments"],
157405     _realRoots = dbfs.roots,
157406     _r2vmap = {},
157407     _v2rmap = {},
157408     _initialized = false,
157409     _readOnly  = false,
157410     _writeOnly = false,
157411     _defaultMode = "rw",
157412     File, 
157413     FileStream;
157414
157415 function _isValidChar(c) {
157416     return  (c >= '0' && c <= '9') || 
157417         (c >= 'a' && c <= 'z') || 
157418         (c >= 'A' && c <= 'Z') || 
157419         (c === ' ') || 
157420         (c === '_') ||
157421         (c === '-') ||
157422         (c === '.');
157423 }
157424
157425 function _isValidFileName(name) {
157426     var _valid = true,
157427         _c;
157428
157429     if (name === '' || name === '.' || name === '..' || (name.length > _maxPathLength)) {
157430         _valid = false;
157431     } else {
157432         for (_c = 0; _c < name.length; _c++) {
157433             if (!_isValidChar(name[_c])) {
157434                 _valid = false;
157435                 break;
157436             }
157437         }
157438     }
157439     
157440     return _valid;
157441 }
157442
157443 function _initialize() {
157444     var _i;
157445
157446     dbfs.initialize();
157447     
157448     // set up the map between real path and virtual path
157449     for (_i = 0; _i < _virtualRoots.length; _i++) {
157450         _r2vmap[_realRoots[_i]] = _virtualRoots[_i];
157451     }
157452
157453     utils.forEach(_r2vmap, function (value, key) {
157454         _v2rmap[value] = key;
157455     });
157456 }
157457
157458 function _resolveSync(srcLocation, onSuccess, onError, accessMode) {
157459     var _parts = srcLocation.replace(/\/$/, '').split("/"),
157460         _header, _fullPath,
157461         _i;
157462
157463     // TODO: Initialize at bootstrap and emulatorBridge.link 
157464     if (!_initialized) {
157465         _initialize();
157466         _initialized = true;
157467     }
157468
157469     for (_i = 0; _i < _parts.length; _i++) {
157470         if (!_isValidFileName(_parts[_i])) {
157471             if (onError) {
157472                 onError(new DeviceApiError(errorcode.INVALID_VALUES_ERR));
157473             }
157474             return;
157475         }
157476     }
157477
157478     _header = _v2rmap[_parts[0]];
157479     if (_header === undefined) {
157480         if (onError) {
157481             onError(new DeviceApiError(errorcode.NOT_FOUND_ERR));
157482         }
157483         return;
157484     }
157485
157486     if (_parts.length === 1) {
157487         _fullPath = _header;
157488     } else {
157489         _fullPath = _header + "/" + _parts.splice(1, _parts.length - 1).join("/");
157490     }
157491
157492     dbfs.stat(_fullPath, 
157493             function (entry) {
157494                 onSuccess(new File(entry, accessMode));
157495             }, 
157496             function () {
157497                 if (onError) {
157498                     onError(new DeviceApiError(errorcode.NOT_FOUND_ERR));
157499                 }    
157500             });
157501 }
157502
157503 function _resolveAsync(onSuccess, onError, srcLocation, accessMode) {
157504     _resolveSync(srcLocation,
157505                 function (file) {
157506                     setTimeout(function () {
157507                         onSuccess(file);
157508                     }, 1);
157509                 },
157510                 function (e) {
157511                     setTimeout(function () {
157512                         onError(e);
157513                     }, 1);
157514                 },
157515                 accessMode);
157516 }
157517
157518 File = function (entry, mode) {
157519     var _entry = entry,
157520         _mode = mode,
157521         _parent,
157522         _self;
157523
157524     function _r2v(rpath) {
157525         var i, v, r, regExp;
157526
157527         for (i = 0; i < _virtualRoots.length; i++) {
157528             v = _virtualRoots[i];
157529             r = _v2rmap[v];
157530             if (rpath.match("^" + r)) {
157531                 regExp = new RegExp("^" + r);
157532                 return rpath.replace(regExp, v);
157533             }
157534         }
157535
157536         return ""; 
157537     }
157538
157539     function _v2r(vpath) {
157540         var i, v, r, regExp;
157541
157542         for (i = 0; i < _virtualRoots.length; i++) {
157543             v = _virtualRoots[i];
157544             r = _v2rmap[v];
157545             if (vpath.match("^" + v)) {
157546                 regExp = new RegExp("^" + v);
157547                 return vpath.replace(regExp, r);
157548             }
157549         }
157550
157551         return ""; 
157552     }
157553
157554     function _copyMoveInternal(onSuccess, onError, src, dst, overwrite, func) {
157555         var _srcName = String(src),
157556             _dstName = String(dst),
157557             _src = null,
157558             _dst = null,
157559             _error = false,
157560             _dstParent = null,
157561             _dstParts  = _dstName.split("/"),
157562             _dstParentName = _dstParts.splice(0, _dstParts.length - 1).join("/");
157563
157564         if (!_entry.isDirectory) {
157565             if (onError) {
157566                 setTimeout(function () {
157567                     onError(new DeviceApiError(errorcode.IO_ERR));
157568                 }, 1);
157569             }
157570             return undefined;
157571         }
157572
157573         _resolveSync(_srcName, 
157574                 function (file) {
157575                     _src = file;
157576                 },
157577                 function (e) {
157578                     setTimeout(function () {
157579                         onError(e);
157580                     }, 1);
157581                 },
157582                 _mode);
157583
157584         if (_src) {
157585             if (_src.parent.fullPath === _self.fullPath) {
157586                 if (!_readOnly && _mode !== "r") {
157587                     _resolveSync(_dstParentName, 
157588                             function (file) {
157589                                 _dstParent = file;
157590                             },
157591                             function (e) {
157592                                 setTimeout(function () {
157593                                     onError(e);
157594                                 }, 1);
157595                             },
157596                             _mode);
157597
157598                     if (_dstParent === null) {
157599                         return undefined;
157600                     }
157601
157602                     _resolveSync(_dstName, 
157603                             function (file) {
157604                                 _dst = file;
157605                             },
157606                             function (e) {
157607                                 if (e.code !== errorcode.NOT_FOUND_ERR) {
157608                                     setTimeout(function () {
157609                                         onError(e);
157610                                     }, 1);
157611                                     _error = true;
157612                                 } 
157613                             },
157614                             _mode);
157615
157616                     if (_error) {
157617                         return undefined;
157618                     }
157619
157620                     if (_src.isFile) {
157621                         if (_dst === null) {
157622                             func(_v2r(_srcName), _v2r(_dstName),
157623                                     function () {
157624                                         setTimeout(function () {
157625                                             onSuccess();
157626                                         }, 1);
157627                                     },
157628                                     function () {});
157629                             return null;
157630                         } else {
157631                             if (_dst.isFile && Boolean(overwrite) && (_srcName !== _dstName)) {
157632                                 func(_v2r(_srcName), _v2r(_dstName),
157633                                         function () {
157634                                             setTimeout(function () {
157635                                                 onSuccess();
157636                                             }, 1);
157637                                         },
157638                                         function () {});
157639                                 return null;
157640                             } else {
157641                                 setTimeout(function () {
157642                                     onError(new DeviceApiError(errorcode.IO_ERR));
157643                                 }, 1);
157644                             }
157645                         }
157646                     } else {
157647                         if (_dst === null) {
157648                             func(_v2r(_srcName), _v2r(_dstName),
157649                                 function () {
157650                                     setTimeout(function () {
157651                                         onSuccess();
157652                                     }, 1);
157653                                 },
157654                                 function () {});
157655                             return null;
157656                         } else {
157657                             setTimeout(function () {
157658                                 onError(new DeviceApiError(errorcode.IO_ERR));
157659                             }, 1);
157660                         } 
157661                     }
157662                 } else {
157663                     if (onError) {
157664                         setTimeout(function () {
157665                             onError(new DeviceApiError(errorcode.SECURITY_ERR));
157666                         }, 1);
157667                     }
157668                 }
157669             } else {
157670                 if (onError) {
157671                     setTimeout(function () {
157672                         onError(new DeviceApiError(errorcode.IO_ERR));
157673                     }, 1);
157674                 }
157675             }
157676         }
157677
157678         return undefined;
157679     }
157680
157681     _self = {
157682         toURI: function () {
157683             return "file://" + _entry.fullPath;
157684         },
157685         listFiles: function (onSuccess, onError, filter) {
157686             var _filter = Object(filter),
157687                 _filterName = _filter.name,
157688                 _startModified = _filter.startModified,
157689                 _endModified   = _filter.endModified;
157690
157691             function _matchName(fileName) {
157692                 var _matched = true, 
157693                     _name1 = String(_filterName).toLowerCase(),
157694                     _name2 = fileName.toLowerCase(),
157695                     _pattern;
157696
157697                 if (_filterName !== undefined && _filterName !== null) {
157698                     if (!_name1.match("\\\\%")) {
157699                         if (_name1.match("%")) {
157700                             _pattern = new RegExp("^" + _name1.replace(/%/g, ".*") + "$");
157701                             _matched = _name2.match(_pattern) ? true : false;
157702                         } else {
157703                             _matched = (_name1 === _name2);
157704                         }
157705                     } else {
157706                         // % is not allowed as a part of file name
157707                         _matched = false;
157708                     }
157709                 }
157710                 
157711                 return _matched;
157712             }
157713
157714             function _matchDate(date) {
157715                 var _matched = true;
157716
157717                 if (_startModified !== undefined && _startModified !== null) {
157718                     _matched = (date.getTime() >= _startModified.getTime());
157719                 }
157720
157721                 if (_matched && (_endModified !== undefined && _endModified !== null)) {
157722                     _matched = (date.getTime() <= _endModified.getTime());
157723                 }
157724
157725                 return _matched;
157726             }
157727
157728             function _matchFilter(entry) {
157729                 return _matchName(entry.name) && _matchDate(entry.lastModifiedDate);
157730             } 
157731
157732             function _listFiles() {
157733                 var _files = [];
157734
157735                 if ((_startModified !== undefined && !wac2_utils.isValidDate(_startModified)) ||
157736                     (_endModified !== undefined && !wac2_utils.isValidDate(_endModified))) {
157737                     if (onError) {
157738                         setTimeout(function () {
157739                             onError(new DeviceApiError(errorcode.INVALID_VALUES_ERR));
157740                         }, 1);
157741                     }
157742                     return undefined;
157743                 }
157744
157745                 if (!_entry.isDirectory) {
157746                     if (onError) {
157747                         setTimeout(function () {
157748                             onError(new DeviceApiError(errorcode.IO_ERR));
157749                         }, 1);
157750                     }
157751                     return undefined;
157752                 }
157753
157754                 utils.forEach(_entry.children, function (child) {
157755                     if (_matchFilter(child)) {
157756                         _files.push(new File(child, _mode));
157757                     }
157758                 });
157759
157760                 setTimeout(function () {
157761                     onSuccess(_files);
157762                 }, 1);
157763
157764                 return null;
157765             }
157766
157767             return wac2_utils.validateTypeMismatch(onSuccess, onError, "listFiles", _listFiles);
157768         },
157769         openStream: function (onSuccess, onError, mode, encoding) {
157770             function _openStream() {
157771                 var  _openMode = String(mode),
157772                     _encoding = encoding ? String(encoding) : "UTF-8";
157773
157774                 if (_openMode !== "r" && _openMode !== "w" && _openMode !== "a") {
157775                     if (onError) {
157776                         setTimeout(function () {
157777                             onError(new DeviceApiError(errorcode.INVALID_VALUES_ERR));
157778                         }, 1);
157779                     }
157780                     return undefined;
157781                 }
157782                 if (_encoding !== "UTF-8" && _encoding !== "ISO-8859-1") {
157783                     if (onError) {
157784                         setTimeout(function () {
157785                             onError(new DeviceApiError(errorcode.INVALID_VALUES_ERR));
157786                         }, 1);
157787                     }
157788                     return undefined;
157789                 }
157790                 
157791                 if (((_readOnly || _mode === "r") && (_openMode === "w" || _openMode === "a")) ||
157792                     (_writeOnly && _openMode === "r")) {
157793                     if (onError) {
157794                         setTimeout(function () {
157795                             onError(new DeviceApiError(errorcode.SECURITY_ERR));
157796                         }, 1);
157797                     }
157798                     return undefined;
157799                 }
157800                  
157801                 setTimeout(function () {
157802                     onSuccess(new FileStream(_entry, _openMode, _encoding));
157803                 }, 1);
157804
157805                 return null;
157806             }
157807
157808             return wac2_utils.validateTypeMismatch(onSuccess, onError, "openStream", _openStream);
157809         },
157810         readAsText: function (onSuccess, onError, encoding) {
157811             function _readAsText() {
157812                 var _encoding = encoding ? String(encoding) : "UTF-8";
157813                 if (_encoding !== "UTF-8" && _encoding !== "ISO-8859-1") {
157814                     if (onError) {
157815                         setTimeout(function () {
157816                             onError(new DeviceApiError(errorcode.INVALID_VALUES_ERR));
157817                         }, 1);
157818                     }
157819                     return undefined;
157820                 }
157821
157822                 if (_writeOnly) {
157823                     if (onError) {
157824                         setTimeout(function () {
157825                             onError(new DeviceApiError(errorcode.SECURITY_ERR));
157826                         }, 1);
157827                     }
157828                     return undefined;
157829                 }
157830
157831                 if (_self.isFile) {
157832                     dbfs.read(_entry.fullPath, 
157833                             function (data) {
157834                                 setTimeout(function () {
157835                                     onSuccess(data);
157836                                 }, 1);
157837                             },
157838                             function () {});
157839                     return null;
157840                 } else {
157841                     if (onError) {
157842                         setTimeout(function () {
157843                             onError(new DeviceApiError(errorcode.IO_ERR));
157844                         }, 1);
157845                     }
157846                 }
157847
157848                 return undefined;
157849             }
157850
157851             return wac2_utils.validateTypeMismatch(onSuccess, onError, "readAsText", _readAsText);
157852         },
157853         copyTo: function (onSuccess, onError, src, dst, overwrite) {
157854             function _copyTo() {
157855                 return _copyMoveInternal(onSuccess, onError, src, dst, overwrite, dbfs.cp);
157856             }
157857             
157858             return wac2_utils.validateTypeMismatch(onSuccess, onError, "copyTo", _copyTo);
157859         },
157860         moveTo: function (onSuccess, onError, src, dst, overwrite) {
157861             function _moveTo() {
157862                 return _copyMoveInternal(onSuccess, onError, src, dst, overwrite, dbfs.mv);
157863             }
157864
157865             return wac2_utils.validateTypeMismatch(onSuccess, onError, "moveTo", _moveTo);
157866         },
157867         createDirectory: function (dirPath) {
157868             var _path  = String(dirPath),
157869                 _parts = _path.replace(/\/$/, "").split("/"),
157870                 _dir   = null,
157871                 _exist = null,
157872                 _current = _entry.fullPath,
157873                 _i;
157874
157875             function onSuccess(entry) {
157876                 _dir = entry;
157877             }
157878
157879             for (_i = 0; _i < _parts.length; _i++) {
157880                 if (!_isValidFileName(_parts[_i])) {
157881                     throw new DeviceApiError(errorcode.INVALID_VALUES_ERR);
157882                 }
157883             }
157884       
157885             if (!entry.isDirectory) {
157886                 throw new DeviceApiError(errorcode.IO_ERR);
157887             }
157888
157889             _exist = _parts.reduce(function (obj, token) {
157890                 return token === "" ? obj : (obj.children ? obj.children[token] || null : null);
157891             }, _entry);
157892
157893             if (_exist) {
157894                 throw new DeviceApiError(errorcode.IO_ERR);
157895             }
157896
157897             if (_readOnly || _mode === "r") {
157898                 throw new DeviceApiError(errorcode.SECURITY_ERR);
157899             }
157900
157901             for (_i = 0; _i < _parts.length; _i++) {
157902                 _current = _current + "/" + _parts[_i];
157903                 dbfs.mkdir(_current, onSuccess);
157904             }
157905             
157906             return new File(_dir, _mode);
157907         },
157908         createFile: function (filePath) {
157909             var _name = String(filePath),
157910                 _file = null;
157911
157912             if (!_isValidFileName(_name)) {
157913                 throw new DeviceApiError(errorcode.INVALID_VALUES_ERR);
157914             }
157915
157916             if (!entry.isDirectory || (_entry.children && _entry.children[_name])) {
157917                 throw new DeviceApiError(errorcode.IO_ERR);
157918             }
157919
157920             if (_readOnly || _mode === "r") {
157921                 throw new DeviceApiError(errorcode.SECURITY_ERR);
157922             }
157923
157924             dbfs.touch(_entry.fullPath + "/" + _name,
157925                         function (entry) {
157926                             _file = new File(entry, _mode);
157927                         },
157928                         function () {});
157929             
157930             return _file;
157931         },
157932         resolve: function (filePath) {
157933             var _fullPath = _self.fullPath + "/" + String(filePath),
157934                 _file = null;
157935  
157936             if (!_entry.isDirectory) {
157937                 throw new DeviceApiError(errorcode.IO_ERR); 
157938             }
157939
157940             _resolveSync(_fullPath,
157941                     function (file) {
157942                         _file = file;
157943                     },
157944                     function (e) {
157945                         throw (e);
157946                     },
157947                     _mode);
157948
157949             return _file;
157950         }, 
157951         deleteDirectory: function (onSuccess, onError, directory, recursive) {
157952             function _deleteDirectory() {
157953                 var _dir = null,
157954                     _dirName = String(directory);
157955                 _resolveSync(_dirName, 
157956                         function (file) {
157957                             _dir = file;
157958                         },
157959                         function (e) {
157960                             setTimeout(function () {
157961                                 onError(e);
157962                             }, 1);
157963                         },
157964                         _mode);
157965
157966                 if (_dir) {
157967                     if (_dir.isDirectory && 
157968                         _dir.parent.fullPath === _self.fullPath &&
157969                         (!recursive && _dir.length === 0)) {
157970                         if (!_readOnly && _mode !== "r") {
157971                             dbfs.rmdir(_v2r(_dirName),
157972                                     function () {
157973                                         setTimeout(function () {
157974                                             onSuccess();
157975                                         }, 1);
157976                                     },
157977                                     function () {});
157978                             return null;
157979                         } else {
157980                             if (onError) {
157981                                 setTimeout(function () {
157982                                     onError(new DeviceApiError(errorcode.SECURITY_ERR));
157983                                 }, 1);
157984                             }
157985                         }
157986                     } else {
157987                         if (onError) {
157988                             setTimeout(function () {
157989                                 onError(new DeviceApiError(errorcode.IO_ERR));
157990                             }, 1);
157991                         }
157992                     }
157993                 }
157994
157995                 return undefined; 
157996             }
157997
157998             return wac2_utils.validateTypeMismatch(onSuccess, onError, "deleteDirectory", _deleteDirectory);
157999         },
158000         deleteFile: function (onSuccess, onError, fileName) {
158001             function _deleteFile() {
158002                 var _file = null;
158003                 _resolveSync(String(fileName),
158004                         function (file) {
158005                             _file = file;
158006                         },
158007                         function (e) {
158008                             if (onError) {
158009                                 setTimeout(function () {
158010                                     onError(e);
158011                                 }, 1);
158012                             }
158013                         },
158014                         _mode);
158015
158016                 if (_file) {
158017                     if (_file.isFile && _file.parent.fullPath === _self.fullPath) {
158018                         if (!_readOnly && _mode !== "r") {
158019                             dbfs.rm(_v2r(fileName),
158020                                     function () {
158021                                         setTimeout(function () {
158022                                             onSuccess();
158023                                         }, 1);
158024                                     },
158025                                     function () {});
158026                             return null;
158027                         } else {
158028                             if (onError) {
158029                                 setTimeout(function () {
158030                                     onError(new DeviceApiError(errorcode.SECURITY_ERR));
158031                                 }, 1);
158032                             }
158033                         }
158034                     } else {
158035                         if (onError) {
158036                             setTimeout(function () {
158037                                 onError(new DeviceApiError(errorcode.IO_ERR));
158038                             }, 1);
158039                         }
158040                     }
158041                 }
158042
158043                 return undefined; 
158044             }
158045
158046             return wac2_utils.validateTypeMismatch(onSuccess, onError, "deleteFile", _deleteFile);
158047         }
158048     };
158049
158050     _self.__defineGetter__("parent", function () {
158051         var _parts = _self.fullPath.split("/");
158052
158053         if (_parent === undefined) {
158054             if (_parts.length === 1) {
158055                 // virtual root's parent is null
158056                 _parent = null;
158057             } else {
158058                 _resolveSync(_parts.splice(0, _parts.length - 1).join("/"), 
158059                         function (file) {
158060                             _parent = file;
158061                         },
158062                         function () {},
158063                         _mode);
158064             }
158065             return _parent;
158066         } else { 
158067             return _parent;
158068         }
158069     });
158070
158071     _self.__defineGetter__("readOnly", function () {
158072         return false;
158073     });
158074
158075     _self.__defineGetter__("isFile", function () {
158076         return !_entry.isDirectory;
158077     });
158078
158079     _self.__defineGetter__("isDirectory", function () {
158080         return _entry.isDirectory;
158081     });
158082
158083     _self.__defineGetter__("created", function () {
158084         return undefined;
158085     });
158086
158087     _self.__defineGetter__("modified", function () {
158088         if (_entry.isDirectory) {
158089             return undefined;
158090         } else {
158091             return _entry.lastModifiedDate;
158092         }
158093     });
158094
158095     _self.__defineGetter__("path", function () {
158096         var _parts = _self.fullPath.split("/");
158097
158098         if (_parts.length === 1) {
158099             // virtual root
158100             return _parts.join("");
158101         } else {
158102             return _parts.splice(0, _parts.length - 1).join("/") + "/";
158103         }
158104     });
158105
158106     _self.__defineGetter__("name", function () {
158107         return _entry.name;
158108     });
158109
158110     _self.__defineGetter__("fullPath", function () {
158111         return _r2v(_entry.fullPath);
158112     });
158113
158114     _self.__defineGetter__("fileSize", function () {
158115         if (_entry.isDirectory) {
158116             return undefined;
158117         } else {
158118             return _entry.data.length;
158119         }
158120     });
158121
158122     _self.__defineGetter__("length", function () {
158123         var _l = 0;
158124         if (_entry.isDirectory) {
158125             utils.forEach(_entry.children, function () {
158126                 _l++;
158127             });
158128             return _l;
158129         } else {
158130             return undefined;
158131         }
158132     });
158133
158134     return _self;
158135 };
158136
158137 FileStream = function (entry, mode, encoding) {
158138     var _entry = entry,
158139         _data = entry.data,
158140         _mode = mode,
158141         _position = (_mode === "a" ? _data.length : 0),
158142         _self;
158143
158144     _self = {
158145         close: function () {
158146             var _element;
158147             if (mode === "a" || mode === "w") {
158148                 dbfs.write(_entry.fullPath, _data, function () {}, function () {});
158149             }
158150             for (_element in _self) {
158151                 delete _self[_element];
158152             }
158153         },
158154         read: function (charCount) {
158155             var _count  = charCount | 0,
158156                 _substr = _data.substring(_position, _position + _count);
158157
158158             if (_position + _count > _data.length) {
158159                 _position = _data.length;
158160             } else {
158161                 _position += _count;
158162             }
158163
158164             return _substr; 
158165         },
158166         readBytes: function (byteCount) {
158167             var _substr = _self.read(byteCount),
158168                 _bytes = [],
158169                 _i;
158170
158171             for (_i = 0; _i < _substr.length; _i++) {
158172                 _bytes.push(_substr.charCodeAt(_i));
158173             }
158174
158175             return _bytes;
158176         },
158177         readBase64: function (byteCount) {
158178             var _substr = _self.read(byteCount);
158179
158180             return window.atob(_substr);
158181         },
158182         write: function (stringData) {
158183             var _stringData = String(stringData),
158184                 _substr = _data.substring(0, _position);
158185
158186             _data = _substr.concat(_stringData);
158187             _position = _data.length;
158188         },
158189         writeBytes: function (byteData) {
158190             _self.write(String.fromCharCode.apply(String, byteData));
158191         },
158192         writeBase64: function (base64Data) {
158193             _self.write(window.btoa(String(base64Data)));
158194         }
158195     };
158196
158197     _self.__defineGetter__("eof", function () {
158198         return _position === _data.length;
158199     });
158200
158201     _self.__defineGetter__("position", function () {
158202         return _position;
158203     });
158204
158205     _self.__defineSetter__("position", function (value) {
158206         var _value = value | 0;
158207
158208         if (_value >= 0 && _value <= _data.length) {
158209             _position = _value;
158210         } else {
158211             throw new DeviceApiError(errorcode.INVALID_VALUES_ERR);
158212         }
158213     });
158214
158215     _self.__defineGetter__("bytesAvailable", function () {
158216         return (_data.length - _position) || -1;
158217     });
158218
158219     return _self;
158220 };
158221
158222 module.exports = function () {
158223     return {
158224         maxPathLength: _maxPathLength,
158225         resolve: function (onSuccess, onError, srcLocation, accessMode) {
158226             function _resolve() {
158227                 var _mode = accessMode ? String(accessMode) : _defaultMode;
158228
158229                 if (_mode === "r" || _mode === "rw") {
158230                     _resolveAsync(onSuccess, onError, String(srcLocation), _mode);
158231                     return null;
158232                 } else {
158233                     if (onError) {
158234                         setTimeout(function () {
158235                             onError(new DeviceApiError(errorcode.INVALID_VALUES_ERR));
158236                         }, 1);
158237                     }
158238                 }
158239                 return undefined;
158240             }
158241
158242             return wac2_utils.validateTypeMismatch(onSuccess, onError, "resolve", _resolve);
158243         },
158244         handleSubFeatures: function (subFeatures) {
158245             if (wac2_utils.isEmptyObject(subFeatures) ||
158246                 subFeatures["http://wacapps.net/api/filesystem"] ||
158247                 (subFeatures["http://wacapps.net/api/filesystem.read"] &&
158248                 subFeatures["http://wacapps.net/api/filesystem.write"])) {
158249                 return;
158250             }
158251             if (subFeatures["http://wacapps.net/api/filesystem.read"]) {
158252                 _readOnly = true;
158253                 return;
158254             }
158255             if (subFeatures["http://wacapps.net/api/filesystem.write"]) {
158256                 _writeOnly = true;
158257                 return;
158258             }
158259             _console.warn("WAC-2.0-Filesystem: something wrong in handleSubFeatures");
158260         }
158261     }; 
158262 };
158263
158264
158265 });
158266 define('ripple/platform/wac/2.0/accelerometer', function (require, exports, module) {
158267 /*
158268  *  Copyright 2011 Intel Corporation.
158269  *
158270  * Licensed under the Apache License, Version 2.0 (the "License");
158271  * you may not use this file except in compliance with the License.
158272  * You may obtain a copy of the License at
158273  *
158274  * http://www.apache.org/licenses/LICENSE-2.0
158275  *
158276  * Unless required by applicable law or agreed to in writing, software
158277  * distributed under the License is distributed on an "AS IS" BASIS,
158278  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
158279  * See the License for the specific language governing permissions and
158280  * limitations under the License.
158281  */
158282
158283 var utils = require('ripple/utils'),
158284     event = require('ripple/event'),
158285     Acceleration = function (x, y, z) {
158286         return {
158287             xAxis: x || 0,
158288             yAxis: y || 0,
158289             zAxis: z || 0
158290         };
158291     },
158292     wac2_utils = require('ripple/platform/wac/2.0/wac2_utils'),
158293     _accelerometerInfo = new Acceleration(),
158294     _defaultInterval = 100,
158295     _watches = {},
158296     _self;
158297
158298 module.exports = _self = {
158299     getCurrentAcceleration: function (onSuccess, onError) {
158300         function _getCurrentAcceleration() {
158301             setTimeout(function () {
158302                 onSuccess(utils.copy(_accelerometerInfo));
158303             }, 1);
158304             return null;
158305         }
158306
158307         return wac2_utils.validateTypeMismatch(onSuccess, onError, "getCurrentAcceleration", _getCurrentAcceleration); 
158308     },
158309
158310     watchAcceleration: function (accelerometerSuccess, accelerometerError, options) {
158311         function _watchAcceleration() {
158312             var watchId = (new Date()).getTime() | 0,
158313                 watchObj = {},
158314                 opt = Object(options),
158315                 minNotificationInterval = opt.minNotificationInterval | 0,
158316                 accelerometerInterval = _defaultInterval;
158317
158318             if (minNotificationInterval > 0) {
158319                 accelerometerInterval = minNotificationInterval;
158320             }
158321
158322             watchObj = {
158323                 onSuccess: accelerometerSuccess,
158324                 onError: accelerometerError,
158325                 interval: accelerometerInterval
158326             };
158327
158328             _watches[watchId] = watchObj;
158329
158330             _watches[watchId].intervalId = setInterval(function () {
158331                 _self.getCurrentAcceleration(_watches[watchId].onSuccess, _watches[watchId].onError);
158332             }, _watches[watchId].interval);
158333
158334             return watchId;
158335         }
158336
158337         return wac2_utils.validateTypeMismatch(accelerometerSuccess, accelerometerError, "watchAcceleration", _watchAcceleration); 
158338     },
158339
158340     clearWatch: function (watchId) {
158341
158342         var id = watchId | 0;
158343
158344         if (_watches[id]) {
158345             clearInterval(_watches[id].intervalId);
158346             delete(_watches[id]);
158347             return null;
158348         }
158349
158350         return undefined;
158351     }
158352 };
158353
158354 event.on("AccelerometerInfoChangedEvent", function (accelerometerInfo) {
158355     _accelerometerInfo.xAxis = accelerometerInfo.accelerationIncludingGravity.x;
158356     _accelerometerInfo.yAxis = accelerometerInfo.accelerationIncludingGravity.y;
158357     _accelerometerInfo.zAxis = accelerometerInfo.accelerationIncludingGravity.z;
158358 });
158359
158360
158361 });
158362 define('ripple/platform/wac/2.0/typecoerce', function (require, exports, module) {
158363 /*\r
158364  *  Copyright 2011 Intel Corporation.\r
158365  *\r
158366  * Licensed under the Apache License, Version 2.0 (the "License");\r
158367  * you may not use this file except in compliance with the License.\r
158368  * You may obtain a copy of the License at\r
158369  *\r
158370  * http://www.apache.org/licenses/LICENSE-2.0\r
158371  *\r
158372  * Unless required by applicable law or agreed to in writing, software\r
158373  * distributed under the License is distributed on an "AS IS" BASIS,\r
158374  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
158375  * See the License for the specific language governing permissions and\r
158376  * limitations under the License.\r
158377  */\r
158378 \r
158379 var utils = require('ripple/utils'),\r
158380     _self;\r
158381 \r
158382 _self = function (pattern) {\r
158383     var typeCoerce,\r
158384         typeOfPattern = Object.prototype.toString.call(pattern);\r
158385 \r
158386     typeCoerce = {\r
158387         cast: function (obj) {\r
158388             var validObj,\r
158389                 validValue,\r
158390                 elementType,\r
158391                 typeOfObj = Object.prototype.toString.call(obj);\r
158392 \r
158393             switch (typeOfPattern) {\r
158394             case "[object String]":\r
158395                 validObj = (typeOfObj !== typeOfPattern) ? String(obj) : obj;\r
158396                 break;\r
158397 \r
158398             case "[object Number]":\r
158399                 validObj = (typeOfObj !== typeOfPattern) ? (Number(obj) | 0) : obj;\r
158400                 break;\r
158401 \r
158402             case "[object Object]":\r
158403                 if (typeOfObj !== typeOfPattern) {\r
158404                     validObj = {};\r
158405                 } else {\r
158406                     validObj = obj;\r
158407                     utils.forEach(validObj, function (value, key) {\r
158408                         if (pattern[key] === undefined) {\r
158409                             delete validObj[key];\r
158410                         } else {\r
158411                             validValue = _self(pattern[key]).cast(value);\r
158412                             if (validObj[key] !== validValue)\r
158413                                 validObj[key] = validValue;\r
158414                         }\r
158415                     });\r
158416                 }\r
158417                 break;\r
158418 \r
158419             case "[object Array]":\r
158420                 if (typeOfObj !== typeOfPattern) {\r
158421                     validObj = [];\r
158422                 } else {\r
158423                     validObj = obj;\r
158424                     elementType = _self(pattern[0]);\r
158425                     utils.forEach(validObj, function (element, index) {\r
158426                         validObj[index] = elementType.cast(element);\r
158427                     });\r
158428                 }\r
158429                 break;\r
158430             }\r
158431 \r
158432             return validObj;\r
158433         }\r
158434     };\r
158435 \r
158436     return typeCoerce;\r
158437 };\r
158438 \r
158439 module.exports = _self;\r
158440
158441 });
158442 define('ripple/platform/cordova/2.0.0/JavaPluginManager', function (require, exports, module) {
158443 module.exports = {
158444     exec: function () {
158445         throw "this really shouldn't be called. like ever!";
158446     },
158447     resume: function () {
158448         throw "this shouldn't be called";
158449     },
158450     pause: function () {
158451         throw "this shouldn't be called";
158452     },
158453     destroy: function () {
158454         throw "this shouldn't be called";
158455     }
158456 };
158457
158458 });
158459 define('ripple/platform/cordova/2.0.0/spec', function (require, exports, module) {
158460 function loadWebworks(win, device) {
158461     var builder = require('ripple/platform/builder'),
158462         platform = device.id === "Playbook" || device.id === "Colt" ? "tablet" : "handset",
158463         webworks = require('ripple/platform/webworks.' + platform + '/2.0.0/spec');
158464
158465     builder.build(webworks.objects).into(win);
158466     builder.build(webworks.objects).into(window);
158467 }
158468
158469 module.exports = {
158470     id: "cordova",
158471     version: "2.0.0",
158472     name: "Apache Cordova",
158473     type: "platform",
158474     nativeMethods: {},
158475
158476     config: require('ripple/platform/cordova/2.0.0/spec/config'),
158477     device: require('ripple/platform/cordova/2.0.0/spec/device'),
158478     ui: require('ripple/platform/cordova/2.0.0/spec/ui'),
158479     events: require('ripple/platform/cordova/2.0.0/spec/events'),
158480
158481     initialize: function (win) {
158482         var honeypot = require('ripple/honeypot'),
158483             devices = require('ripple/devices'),
158484             device = devices.getCurrentDevice(),
158485             bridge = require('ripple/platform/cordova/2.0.0/bridge'),
158486             cordova,
158487             topCordova = window.top.require('ripple/platform/cordova/2.0.0/spec'),
158488             get = function () {
158489                 return cordova;
158490             },
158491             set = function (orig) {
158492                 if (cordova) {
158493                     return;
158494                 }
158495
158496                 cordova = orig;
158497
158498                 cordova.define.remove("cordova/exec");
158499                 cordova.define("cordova/exec", function (require, exports, module) {
158500                     module.exports = bridge.exec;
158501                 });
158502
158503                 cordova.UsePolling = true;
158504
158505                 //do nothing here as we will just call the callbacks ourselves
158506                 cordova.define.remove("cordova/plugin/android/polling");
158507                 cordova.define("cordova/plugin/android/polling", function (require, exports, module) {
158508                     module.exports = function () {};
158509                 });
158510
158511                 var builder = cordova.require('cordova/builder'),
158512                     allTheThings = window,
158513                     base = cordova.require('cordova/common'),
158514                     iosPlugin;
158515
158516                 //HACK: Overwrite all the things, handles when cordova.js executes before we start booting
158517                 builder.build(base.objects).intoAndClobber(allTheThings);
158518                 cordova.require('cordova/channel').onNativeReady.fire();
158519                 //  DIRTY HACK: once cordova is cleaned up, we do not
158520                 //  need this.
158521                 // reference issue: https://issues.apache.org/jira/browse/CB-1013
158522                 try {
158523                     iosPlugin = cordova.require('cordova/plugin/ios/device');
158524                     bridge.exec(function (info) {
158525                         iosPlugin.setInfo(info);
158526                     }, null, 'Device', 'getDeviceInfo', []);
158527                 } catch (e) {
158528                     cordova.require('cordova/channel').onCordovaInfoReady.fire();
158529                 }
158530             };
158531
158532         if (window.FileReader && !topCordova.nativeMethods.FileReader) {
158533             topCordova.nativeMethods.FileReader = window.FileReader;
158534         }
158535
158536         if (device.manufacturer === "Research In Motion") {
158537             loadWebworks(win, device);
158538         }
158539
158540         honeypot.monitor(win, "cordova").andRun(get, set);
158541     },
158542
158543     objects: {
158544         MediaError: {
158545             path: "cordova/2.0.0/MediaError"
158546         },
158547         org: {
158548             children: {
158549                 apache: {
158550                     children: {
158551                         cordova: {
158552                             children: {
158553                                 Logger: {
158554                                     path: "cordova/2.0.0/logger"
158555                                 },
158556                                 JavaPluginManager: {
158557                                     path: "cordova/2.0.0/JavaPluginManager"
158558                                 }
158559                             }
158560                         }
158561                     }
158562                 }
158563             }
158564         }
158565     }
158566 };
158567
158568 });
158569 define('ripple/platform/cordova/2.0.0/logger', function (require, exports, module) {
158570 module.exports = {
158571     log: function (msg) {
158572         console.log(msg);
158573     }
158574 };
158575
158576 });
158577 define('ripple/platform/cordova/2.0.0/spec/config', function (require, exports, module) {
158578 /*
158579  *  Copyright 2011 Research In Motion Limited.
158580  *
158581  * Licensed under the Apache License, Version 2.0 (the "License");
158582  * you may not use this file except in compliance with the License.
158583  * You may obtain a copy of the License at
158584  *
158585  * http://www.apache.org/licenses/LICENSE-2.0
158586  *
158587  * Unless required by applicable law or agreed to in writing, software
158588  * distributed under the License is distributed on an "AS IS" BASIS,
158589  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
158590  * See the License for the specific language governing permissions and
158591  * limitations under the License.
158592  */
158593 var constants = require('ripple/constants');
158594
158595 module.exports = {
158596     fileName: "config.xml",
158597     validateVersion: function (configValidationObject) {
158598         var valid = true;
158599         valid = !((!configValidationObject.widget.validationResult[0].attributes.xmlns.valid) ||
158600             (!configValidationObject.widget.validationResult[0].attributes["xmlns:gap"].valid));
158601
158602         return valid;
158603     },
158604     extractInfo: function (configValidationObject) {
158605         if (!configValidationObject) {
158606             return null;
158607         }
158608
158609         var widgetInfo = {};
158610
158611         widgetInfo.id = configValidationObject.widget.validationResult[0].attributes.id.value || "";
158612         widgetInfo.name = configValidationObject.widget.children.name.validationResult[0].value;
158613         widgetInfo.icon = configValidationObject.widget.children.icon.validationResult[0].attributes.src.value;
158614         widgetInfo.version = configValidationObject.widget.validationResult[0].attributes.version.value;
158615
158616         return widgetInfo;
158617     },
158618     schema: {
158619         rootElement: "widget",
158620         widget: {
158621             nodeName: "widget",
158622             required: true,
158623             occurrence: 1,
158624             attributes: {
158625                 xmlns: {
158626                     attributeName: "xmlns",
158627                     required: true,
158628                     type: "list",
158629                     listValues: ["http://www.w3.org/ns/widgets"]
158630                 },
158631                 "xmlns:gap": {
158632                     attributeName: "xmlns:gap",
158633                     required: true,
158634                     type: "list",
158635                     listValues: ["http://phonegap.com/ns/1.0"]
158636                 },
158637                 "xml:lang": {
158638                     attributeName: "xml:lang",
158639                     required: false,
158640                     type: "iso-language"
158641                 },
158642                 dir: {
158643                     attributeName: "dir",
158644                     required: false,
158645                     type: "list",
158646                     listValues: ["ltr", "rtl", "lro", "rlo"]
158647                 },
158648                 id: {
158649                     attributeName: "id",
158650                     required: false,
158651                     type: "string"
158652                 },
158653                 version: {
158654                     attributeName: "version",
158655                     required: false,
158656                     type: "string"
158657                 },
158658                 height: {
158659                     attributeName: "height",
158660                     required: false,
158661                     type: "integer"
158662                 },
158663                 width: {
158664                     attributeName: "width",
158665                     required: false,
158666                     type: "integer"
158667                 },
158668                 viewmodes: {
158669                     attributeName: "viewmodes",
158670                     required: false,
158671                     type: "list",
158672                     listValues: ["floating", "fullscreen"]
158673                 }
158674             },
158675             children: {
158676                 name: {
158677                     nodeName: "name",
158678                     required: false,
158679                     occurrence: 0,
158680                     type: "string",
158681                     attributes: {
158682                         "short": {
158683                             attributeName: "short",
158684                             type: "string",
158685                             required: false
158686                         },
158687                         "xml:lang": {
158688                             attributeName: "xml:lang",
158689                             type: "string",
158690                             required: false,
158691                             unique: true
158692                         }
158693                     }
158694                 },
158695                 description: {
158696                     nodeName: "description",
158697                     required: false,
158698                     occurrence: 0,
158699                     type: "string",
158700                     attributes: {
158701                         "xml:lang": {
158702                             attributeName: "xml:lang",
158703                             type: "string",
158704                             required: false,
158705                             unique: true
158706                         }
158707                     }
158708                 },
158709                 author: {
158710                     nodeName: "author",
158711                     required: false,
158712                     occurrence: 1,
158713                     type: "string",
158714                     attributes: {
158715                         email: {
158716                             attributeName: "email",
158717                             type: "regex",
158718                             required: false,
158719                             regex: constants.REGEX.EMAIL
158720                         },
158721                         href: {
158722                             attributeName: "href",
158723                             type: "regex",
158724                             required: false,
158725                             regex: constants.REGEX.URL
158726                         }
158727                     }
158728                 },
158729                 license: {
158730                     nodeName: "license",
158731                     required: false,
158732                     occurrence: 1,
158733                     type: "string",
158734                     attributes: {
158735                         href: {
158736                             attributeName: "href",
158737                             type: "regex",
158738                             required: false,
158739                             regex: constants.REGEX.URL
158740                         },
158741                         "xml:lang": {
158742                             attributeName: "xml:lang",
158743                             type: "string",
158744                             required: false,
158745                             unique: true
158746                         }
158747                     }
158748                 },
158749                 icon: {
158750                     nodeName: "icon",
158751                     required: false,
158752                     occurrence: 0,
158753                     attributes: {
158754                         src: {
158755                             attributeName: "src",
158756                             type: "string",
158757                             required: true
158758                         },
158759                         height: {
158760                             attributeName: "height",
158761                             required: false,
158762                             type: "integer"
158763                         },
158764                         width: {
158765                             attributeName: "width",
158766                             required: false,
158767                             type: "integer"
158768                         }
158769                     }
158770                 },
158771                 content: {
158772                     nodeName: "content",
158773                     required: false,
158774                     occurrence: 1,
158775                     attributes: {
158776                         src: {
158777                             attributeName: "src",
158778                             type: "string",
158779                             required: true
158780                         },
158781                         encoding: {
158782                             attributeName: "encoding",
158783                             type: "string",
158784                             required: false
158785                         },
158786                         type: {
158787                             attributeName: "type",
158788                             type: "string",
158789                             required: false
158790                         }
158791                     }
158792                 },
158793                 feature: {
158794                     nodeName: "feature",
158795                     required: false,
158796                     occurrence: 0,
158797                     attributes: {
158798                         name: {
158799                             attributeName: "name",
158800                             type: "list",
158801                             required: true,
158802                             listValues: ["http://api.phonegap.com/1.0/accelerometer", "http://api.phonegap.com/1.0/camera",
158803                                 "http://api.phonegap.com/1.0/compass", "http://api.phonegap.com/1.0/contacts", "http://api.phonegap.com/1.0/device",
158804                                 "http://api.phonegap.com/1.0/events", "http://api.phonegap.com/1.0/file", "http://api.phonegap.com/1.0/geolocation",
158805                                 "http://api.phonegap.com/1.0/media", "http://api.phonegap.com/1.0/network", "http://api.phonegap.com/1.0/notification",
158806                                 "http://api.phonegap.com/1.0/storage"]
158807                         },
158808                         required: {
158809                             attributeName: "required",
158810                             type: "boolean",
158811                             required: false
158812                         }
158813                     }
158814                 },
158815                 preference: {
158816                     nodeName: "preference",
158817                     required: false,
158818                     occurrence: 0,
158819                     attributes: {
158820                         name: {
158821                             attributeName: "name",
158822                             type: "string",
158823                             required: true
158824                         },
158825                         value: {
158826                             type: "string",
158827                             attributeName: "value",
158828                             required: false
158829                         },
158830                         readonly: {
158831                             attributeName: "readonly",
158832                             type: "boolean",
158833                             required: false
158834                         }
158835                     }
158836                 }
158837             }
158838         }
158839     }
158840 };
158841
158842 });
158843 define('ripple/platform/cordova/2.0.0/spec/device', function (require, exports, module) {
158844 /*
158845  *  Copyright 2011 Research In Motion Limited.
158846  *
158847  * Licensed under the Apache License, Version 2.0 (the "License");
158848  * you may not use this file except in compliance with the License.
158849  * You may obtain a copy of the License at
158850  *
158851  * http://www.apache.org/licenses/LICENSE-2.0
158852  *
158853  * Unless required by applicable law or agreed to in writing, software
158854  * distributed under the License is distributed on an "AS IS" BASIS,
158855  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
158856  * See the License for the specific language governing permissions and
158857  * limitations under the License.
158858  */
158859 var event = require('ripple/event');
158860
158861 module.exports = {
158862     "NetworkStatus": {
158863         "connectionType": {
158864             "name": "Connection Type",
158865             "control": {
158866                 "type": "select",
158867                 "value": "ethernet"
158868             },
158869             "options": {
158870                 "unknown": "UNKNOWN",
158871                 "ethernet": "ETHERNET",
158872                 "wifi": "WIFI",
158873                 "2g": "CELL_2G",
158874                 "3g": "CELL_3G",
158875                 "4g": "CELL_4G",
158876                 "none": "none"
158877             },
158878             "callback": function (setting) {
158879                 var connected = setting !== "none";
158880                 require('ripple/bus').send("network", connected);
158881             }
158882         },
158883         "lag": {
158884             "name": "Lag the network",
158885             "control": {
158886                 type: "checkbox",
158887                 value: false
158888             },
158889             "callback": function (setting) {
158890                 require('ripple/bus').send("lag", setting);
158891             }
158892         },
158893     }
158894 };
158895
158896 });
158897 define('ripple/platform/cordova/2.0.0/spec/events', function (require, exports, module) {
158898 /*
158899  *  Copyright 2011 Research In Motion Limited.
158900  *
158901  * Licensed under the Apache License, Version 2.0 (the "License");
158902  * you may not use this file except in compliance with the License.
158903  * You may obtain a copy of the License at
158904  *
158905  * http://www.apache.org/licenses/LICENSE-2.0
158906  *
158907  * Unless required by applicable law or agreed to in writing, software
158908  * distributed under the License is distributed on an "AS IS" BASIS,
158909  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
158910  * See the License for the specific language governing permissions and
158911  * limitations under the License.
158912  */
158913 function _fires(name, data) {
158914     return function () {
158915         cordova.fireDocumentEvent(name, data);
158916     };
158917 }
158918
158919 module.exports = {
158920     "deviceready": {
158921         callback: _fires("deviceready")
158922     },
158923     "backbutton": {
158924         callback: _fires("backbutton")
158925     },
158926     "menubutton": {
158927         callback: _fires("menubutton")
158928     },
158929     "pause": {
158930         callback: _fires("pause")
158931     },
158932     "resume": {
158933         callback: _fires("resume")
158934     },
158935     "searchbutton": {
158936         callback: _fires("searchbutton")
158937     },
158938     "online": {
158939         callback: _fires("online")
158940     },
158941     "offline": {
158942         callback: _fires("offline")
158943     }
158944 };
158945
158946 });
158947 define('ripple/platform/cordova/2.0.0/spec/ui', function (require, exports, module) {
158948 /*
158949  *  Copyright 2011 Research In Motion Limited.
158950  *
158951  * Licensed under the Apache License, Version 2.0 (the "License");
158952  * you may not use this file except in compliance with the License.
158953  * You may obtain a copy of the License at
158954  *
158955  * http://www.apache.org/licenses/LICENSE-2.0
158956  *
158957  * Unless required by applicable law or agreed to in writing, software
158958  * distributed under the License is distributed on an "AS IS" BASIS,
158959  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
158960  * See the License for the specific language governing permissions and
158961  * limitations under the License.
158962  */
158963 module.exports = {
158964     plugins: [
158965         "accelerometer",
158966         "deviceSettings",
158967         "geoView",
158968         "widgetConfig",
158969         "platformEvents"
158970     ]
158971 };
158972
158973 });
158974 define('ripple/platform/cordova/2.0.0/bridge/file', function (require, exports, module) {
158975 // HACK: fs keeps a reference to the last-used FileSystem requested via requestFileSystem
158976 // this is a hack because if you keep switching between TEMPORARY vs. PERSISTENT file systems requested,
158977 // and run Cordova File API methods, no parameter is passed into exec specifying the underlying File System.
158978 // This should be fixed in Cordova!
158979 var fs, 
158980     topCordova = require('ripple/platform/cordova/2.0.0/spec'),
158981     rlfsu;
158982
158983 function cleanPath(path) {
158984     while (path[0] && path[0] === '/') {
158985         path = path.substr(1);
158986     }
158987     return path;
158988 }
158989
158990 module.exports = {
158991     requestFileSystem: function (win, fail, args) {
158992         // HACK: may not be webkit
158993         var rfs = window.webkitRequestFileSystem,
158994             type = args[0],
158995             size = args[1];
158996
158997         // HACK: assume any FS requested over a gig in size will throw an error
158998         if (size > (1024 * 1024 * 1024 /* gigabyte */)) {
158999             if (fail) fail(FileError.QUOTA_EXCEEDED_ERR);
159000         } else {
159001             return rfs(type, size, function (effes) {
159002                 fs = effes;
159003                 win(effes);
159004             }, fail);
159005         }
159006     },
159007     resolveLocalFileSystemURI: function (win, fail, args) {
159008         var uri = args[0],
159009             fulluri = fs.root.toURL();
159010
159011         // HACK: iOS-specific bs right here. See lib/ios/plugin/ios/Entry.js in cordova.js for details
159012         // Cordova badly needs a unified File System abstraction.
159013         if (uri.indexOf("file://localhost") === 0) {
159014             uri = uri.substr(16);
159015         }
159016         uri = cleanPath(uri);
159017
159018         fulluri += uri;
159019
159020         return window.webkitResolveLocalFileSystemURL(fulluri, function (entry) {
159021             if (win) win(entry);
159022         }, function (error) {
159023             if (fail) fail(error.code);
159024         });
159025     },
159026     getFile: function (win, fail, args) {
159027         var path = args[0],
159028             filename = args[1],
159029             options = args[2],
159030             file = '';
159031
159032         path = cleanPath(path);
159033         filename = cleanPath(filename);
159034
159035         if (path) {
159036             file = path + '/';
159037         }
159038         file += filename;
159039
159040         fs.root.getFile(file, options, function (entry) {
159041             if (win) win(entry);
159042         }, function (err) {
159043             if (fail) fail(err.code);
159044         });
159045     },
159046     remove: function (win, fail, args) {
159047         var file = args[0];
159048         window.webkitResolveLocalFileSystemURL(fs.root.toURL() + file, function (entry) {
159049             entry.remove(function () {
159050                 if (win) win();
159051             }, function (err) {
159052                 if (fail) fail(err.code);
159053             });
159054         }, fail);
159055     },
159056     readEntries: function (win, fail, args) {
159057         var root = fs.root.toURL(),
159058             path = args[0],
159059             reader;
159060
159061         path = cleanPath(path);
159062         path = root + path;
159063
159064         window.webkitResolveLocalFileSystemURL(path, function (entry) {
159065             reader = entry.createReader();
159066             reader.readEntries(function (entries) {
159067                 if (win) win(entries);
159068             }, function (err) {
159069                 if (fail) fail(err.code);
159070             });
159071         }, function (err) {
159072             if (fail) fail(err.code);
159073         });
159074     },
159075     getDirectory: function (win, fail, args) {
159076         var path = args[0],
159077             filename = args[1],
159078             options = args[2],
159079             file = '';
159080
159081         path = cleanPath(path);
159082         filename = cleanPath(filename);
159083
159084         if (path) {
159085             file = path + '/';
159086         }
159087         file += filename;
159088
159089         fs.root.getDirectory(file, options, function (entry) {
159090             if (win) win(entry);
159091         }, function (err) {
159092             if (fail) fail(err.code);
159093         });
159094     },
159095     removeRecursively: function (win, fail, args) {
159096         var root = fs.root.toURL(),
159097             path = args[0];
159098
159099         path = cleanPath(path);
159100
159101         window.webkitResolveLocalFileSystemURL(root + path, function (dirEntry) {
159102             dirEntry.removeRecursively(function () {
159103                 if (win) win();
159104             }, function (err) {
159105                 if (fail) fail(err.code);
159106             });
159107         }, function (err) {
159108             if (fail) fail(err.code);
159109         });
159110     },
159111     getFileMetadata: function (win, fail, args) {
159112         var path = args[0],
159113             root = fs.root.toURL();
159114
159115         path = cleanPath(path);
159116
159117         window.webkitResolveLocalFileSystemURL(root + path, function (entry) {
159118             entry.file(function (file) {
159119                 if (win) win(file);
159120             }, function (err) {
159121                 if (fail) fail(err.code);
159122             });
159123         }, function (err) {
159124             if (fail) fail(err.code);
159125         });
159126     },
159127     getMetadata: function (win, fail, args) {
159128         var path = args[0],
159129             root = fs.root.toURL();
159130
159131         path = cleanPath(path);
159132         
159133         window.webkitResolveLocalFileSystemURL(root + path, function (entry) {
159134             entry.getMetadata(function (data) {
159135                 if (win) win(data);
159136             }, function (err) {
159137                 if (fail) fail(err.code);
159138             });
159139         }, function (err) {
159140             if (fail) fail(err.code);
159141         });
159142     },
159143     getParent: function (win, fail, args) {
159144         var path = args[0],
159145             root = fs.root.toURL();
159146
159147         path = cleanPath(path);
159148
159149         window.webkitResolveLocalFileSystemURL(root + path, function (entry) {
159150             entry.getParent(function (dirEntry) {
159151                 if (win) win(dirEntry);
159152             }, function (err) {
159153                 if (fail) fail(err.code);
159154             });
159155         }, function (err) {
159156             if (fail) fail(err.code);
159157         });
159158     },
159159     copyTo: function (win, fail, args) {
159160         var src = args[0],
159161             parent = args[1],
159162             name = args[2],
159163             root = fs.root.toURL();
159164
159165         parent = cleanPath(parent);
159166         src = cleanPath(src);
159167
159168         rlfsu = window.webkitResolveLocalFileSystemURL;
159169         // get the directoryentry that we will copy TO
159170         rlfsu(root + parent, function (parentDirToCopyTo) {
159171             rlfsu(root + src, function (sourceDir) {
159172                 sourceDir.copyTo(parentDirToCopyTo, name, function (newEntry) {
159173                     if (win) win(newEntry);
159174                 }, function (err) {
159175                     if (fail) fail(err.code);
159176                 });
159177             }, function (err) {
159178                 if (fail) fail(err.code);
159179             });
159180         }, function (err) {
159181             if (fail) fail(err.code);
159182         });
159183     },
159184     moveTo: function (win, fail, args) {
159185         var src = args[0],
159186             parent = args[1],
159187             name = args[2],
159188             root = fs.root.toURL();
159189
159190         parent = cleanPath(parent);
159191         src = cleanPath(src);
159192
159193         rlfsu = window.webkitResolveLocalFileSystemURL;
159194         // get the directoryentry that we will move TO
159195         rlfsu(root + parent, function (parentDirToMoveTo) {
159196             rlfsu(root + src, function (sourceDir) {
159197                 sourceDir.moveTo(parentDirToMoveTo, name, function (newEntry) {
159198                     if (win) win(newEntry);
159199                 }, function (err) {
159200                     if (fail) fail(err.code);
159201                 });
159202             }, function (err) {
159203                 if (fail) fail(err.code);
159204             });
159205         }, function (err) {
159206             if (fail) fail(err.code);
159207         });
159208     },
159209     write: function (win, fail, args) {
159210         var file = args[0],
159211             text = args[1],
159212             position = args[2],
159213             sourcepath,
159214             BB = window.BlobBuilder || window.WebKitBlobBuilder,
159215             bb = new BB();
159216
159217         // Format source path
159218         sourcepath = (file.fullPath ? file.fullPath : '') + file.name;
159219         sourcepath = cleanPath(sourcepath);
159220
159221         // Create a blob for the text to be written
159222         bb.append(text);
159223
159224         // Get the FileEntry, create if necessary
159225         fs.root.getFile(sourcepath, {create: true}, function (entry) {
159226             // Create a FileWriter for this entry
159227             entry.createWriter(function (writer) {
159228                 writer.onwriteend = function (progressEvt) {
159229                     if (win) win(progressEvt.total);
159230                 };
159231                 writer.onerror = function (err) {
159232                     if (fail) fail(err.code);
159233                 };
159234
159235                 if (position && position > 0) {
159236                     writer.seek(position);
159237                 }
159238                 writer.write(bb.getBlob('text/plain'));
159239             }, function (err) {
159240                 if (fail) fail(err.code);
159241             });
159242         }, function (err) {
159243             if (fail) fail(err.code);
159244         });
159245     },
159246     readAsText: function (win, fail, args) {
159247         var path = args[0],
159248             encoding = args[1],
159249             FileReader = topCordova.nativeMethods.FileReader,
159250             fr = new window.FileReader();
159251
159252         // Set up FileReader events
159253         fr.onerror = function (err) {
159254             if (fail) fail(err.code);
159255         };
159256         fr.onload = function (evt) {
159257             if (win) win(evt.target.result);
159258         };
159259
159260         path = cleanPath(path);
159261
159262         fs.root.getFile(path, {create: false}, function (entry) {
159263             entry.file(function (blob) {
159264                 fr.readAsText(blob, encoding);
159265             }, function (err) {
159266                 if (fail) fail(err.code);
159267             });
159268         }, function (err) {
159269             if (fail) fail(err.code);
159270         });
159271     },
159272     readAsDataURL: function (win, fail, args) {
159273         var path = args[0],
159274             FileReader = topCordova.nativeMethods.FileReader,
159275             fr = new window.FileReader();
159276
159277         // Set up FileReader events
159278         fr.onerror = function (err) {
159279             if (fail) fail(err.code);
159280         };
159281         fr.onload = function (evt) {
159282             if (win) win(evt.target.result);
159283         };
159284
159285         path = cleanPath(path);
159286
159287         fs.root.getFile(path, {create: false}, function (entry) {
159288             entry.file(function (blob) {
159289                 fr.readAsDataURL(blob);
159290             }, function (err) {
159291                 if (fail) fail(err.code);
159292             });
159293         }, function (err) {
159294             if (fail) fail(err.code);
159295         });
159296     },
159297     truncate: function (win, fail, args) {
159298         var file = args[0],
159299             position = args[1],
159300             sourcepath;
159301
159302         // Format source path
159303         sourcepath = (file.fullPath ? file.fullPath : '') + file.name;
159304         sourcepath = cleanPath(sourcepath);
159305
159306         // Get the FileEntry, create if necessary
159307         fs.root.getFile(sourcepath, {create: false}, function (entry) {
159308             // Create a FileWriter for this entry
159309             entry.createWriter(function (writer) {
159310                 writer.onwriteend = function (progressEvt) {
159311                     if (win) win(progressEvt.target.length);
159312                 };
159313                 writer.onerror = function (err) {
159314                     if (fail) fail(err.code);
159315                 };
159316
159317                 writer.truncate(position);
159318             }, function (err) {
159319                 if (fail) fail(err.code);
159320             });
159321         }, function (err) {
159322             if (fail) fail(err.code);
159323         });
159324     }
159325 };
159326
159327 });
159328 define('ripple/platform/cordova/2.0.0/bridge/media', function (require, exports, module) {
159329 /*
159330  *  Copyright 2011 Research In Motion Limited.
159331  *
159332  * Licensed under the Apache License, Version 2.0 (the "License");
159333  * you may not use this file except in compliance with the License.
159334  * You may obtain a copy of the License at
159335  *
159336  * http://www.apache.org/licenses/LICENSE-2.0
159337  *
159338  * Unless required by applicable law or agreed to in writing, software
159339  * distributed under the License is distributed on an "AS IS" BASIS,
159340  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
159341  * See the License for the specific language governing permissions and
159342  * limitations under the License.
159343  */
159344 var audioObjects = {},
159345     noop = function () {};
159346
159347 function createAudio(id, src, error) {
159348     var a = new Audio();
159349     a.addEventListener("error", function (e) {
159350         error(new window.MediaError(1, e.toString()));
159351     });
159352     a.addEventListener("durationchange", function () {
159353         //HACK: I don't like this but best way for us to update the duration
159354         cordova.require("cordova/plugin/Media").onStatus(id, 2, this.duration);
159355     });
159356     a.src = src;
159357
159358     return a;
159359 }
159360
159361 module.exports = {
159362     create: function (success, error, args) {
159363         if (!args.length) {
159364             error("Media Object id was not sent in arguments");
159365             return;
159366         }
159367
159368         var id = args[0],
159369             src = args[1];
159370
159371         error = error || noop;
159372         success = success || noop;
159373
159374         audioObjects[id] = createAudio(id, src, error);
159375         success();
159376     },
159377     startPlayingAudio: function (success, error, args) {
159378         error = error || noop;
159379         success = success || noop;
159380         if (!args.length) {
159381             error("Media Object id was not sent in arguments");
159382             return;
159383         }
159384
159385         var id = args[0],
159386             audio = audioObjects[id];
159387
159388         if (args.length === 1) {
159389             error("Media source argument not found");
159390             return;
159391         }
159392
159393         if (audio) {
159394             audio.pause();
159395             audioObjects[id] = undefined;
159396         }
159397
159398         audio = audioObjects[id] = createAudio(id, args[1], error);
159399         audio.play();
159400
159401         success();
159402     },
159403     stopPlayingAudio: function (success, error, args) {
159404         error = error || noop;
159405         success = success || noop;
159406         if (!args.length) {
159407             error("Media Object id was not sent in arguments");
159408             return;
159409         }
159410
159411         var id = args[0],
159412             audio = audioObjects[id];
159413
159414         if (!audio) {
159415             error("Audio Object has not been initialized");
159416             return;
159417         }
159418
159419         audio.pause();
159420         audioObjects[id] = undefined;
159421
159422         success();
159423     },
159424     seekToAudio: function (success, error, args) {
159425         error = error || noop;
159426         success = success || noop;
159427         if (!args.length) {
159428             error("Media Object id was not sent in arguments");
159429             return;
159430         }
159431
159432         var id = args[0],
159433             audio = audioObjects[id];
159434
159435         if (!audio) {
159436             error("Audio Object has not been initialized");
159437             return;
159438         } else if (args.length === 1) {
159439             error("Media seek time argument not found");
159440             return;
159441         } else {
159442             try {
159443                 audio.currentTime = args[1];
159444             } catch (e) {
159445                 error("Error seeking audio: " + e);
159446             }
159447         }
159448
159449         success();
159450     },
159451     pausePlayingAudio: function (success, error, args) {
159452         error = error || noop;
159453         success = success || noop;
159454         if (!args.length) {
159455             error("Media Object id was not sent in arguments");
159456             return;
159457         }
159458
159459         var id = args[0],
159460             audio = audioObjects[id];
159461
159462         if (!audio) {
159463             error("Audio Object has not been initialized");
159464             return;
159465         }
159466
159467         audio.pause();
159468         success();
159469     },
159470     getCurrentPositionAudio: function (success, error, args) {
159471         error = error || noop;
159472         success = success || noop;
159473         if (!args.length) {
159474             error("Media Object id was not sent in arguments");
159475             return;
159476         }
159477
159478         var id = args[0],
159479             audio = audioObjects[id];
159480
159481         if (!audio) {
159482             error("Audio Object has not been initialized");
159483             return;
159484         }
159485
159486         success(audio.currentTime);
159487     },
159488     getDuration: function (success, error, args) {
159489         error = error || noop;
159490         success = success || noop;
159491         if (!args.length) {
159492             error("Media Object id was not sent in arguments");
159493             return;
159494         }
159495
159496         var id = args[0],
159497             audio = audioObjects[id];
159498
159499         if (!audio) {
159500             error("Audio Object has not been initialized");
159501             return;
159502         }
159503
159504         success(audio.duration);
159505     },
159506     startRecordingAudio: function (success, error, args) {
159507         error = error || noop;
159508         error("Not supported");
159509     },
159510     stopRecordingAudio: function (success, error, args) {
159511         error = error || noop;
159512         error("Not supported");
159513     },
159514     release: function (success, error, args) {
159515         error = error || noop;
159516         success = success || noop;
159517         if (!args.length) {
159518             error("Media Object id was not sent in arguments");
159519             return;
159520         }
159521
159522         var id = args[0],
159523             audio = audioObjects[id];
159524
159525         if (audio) {
159526             audioObjects[id] = undefined;
159527             audio.src = undefined;
159528             //delete audio;
159529         }
159530
159531         success();
159532     }
159533 };
159534
159535 });
159536 define('ripple/platform/cordova/2.0.0/bridge/device', function (require, exports, module) {
159537 /*
159538  *  Copyright 2011 Research In Motion Limited.
159539  *
159540  * Licensed under the Apache License, Version 2.0 (the "License");
159541  * you may not use this file except in compliance with the License.
159542  * You may obtain a copy of the License at
159543  *
159544  * http://www.apache.org/licenses/LICENSE-2.0
159545  *
159546  * Unless required by applicable law or agreed to in writing, software
159547  * distributed under the License is distributed on an "AS IS" BASIS,
159548  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
159549  * See the License for the specific language governing permissions and
159550  * limitations under the License.
159551  */
159552 var devices = require('ripple/devices');
159553
159554 module.exports = {
159555     getDeviceInfo: function (success, fail, args) {
159556         var device = devices.getCurrentDevice();
159557
159558         success({
159559             available: true,
159560             platform: device.osName,
159561             version: device.osVersion,
159562             name: device.name,
159563             uuid: device.uuid,
159564             cordova: "2.0.0"
159565         });
159566     }
159567 };
159568
159569 });
159570 define('ripple/platform/cordova/2.0.0/bridge/notification', function (require, exports, module) {
159571 /*
159572  *  Copyright 2011 Research In Motion Limited.
159573  *
159574  * Licensed under the Apache License, Version 2.0 (the "License");
159575  * you may not use this file except in compliance with the License.
159576  * You may obtain a copy of the License at
159577  *
159578  * http://www.apache.org/licenses/LICENSE-2.0
159579  *
159580  * Unless required by applicable law or agreed to in writing, software
159581  * distributed under the License is distributed on an "AS IS" BASIS,
159582  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
159583  * See the License for the specific language governing permissions and
159584  * limitations under the License.
159585  */
159586 var notifications = require('ripple/notifications'),
159587     _console = require('ripple/console'),
159588     goodVibrations = require('ripple/ui/plugins/goodVibrations');
159589
159590 module.exports = {
159591     alert: function (success, error, args) {
159592         notifications.openNotification("normal", args[0]);
159593         return success && success();
159594     },
159595
159596     confirm: function (success, error, args) {
159597         throw "Not Implemented";
159598     },
159599
159600     activityStart: function (success, error, args) {
159601     },
159602
159603     activityStop: function (success, error, args) { 
159604     },
159605
159606     progressStart: function (success, error, args) {
159607     },
159608
159609     vibrate: function (success, error, args) {
159610         var ms = args[0] || 500;
159611         goodVibrations.vibrateDevice(ms);
159612     },
159613
159614     beep: function (success, error, args) {
159615         for (var i = args[0]; i > 0; i--) {
159616             _console.log("beep!");
159617         }
159618         notifications.openNotification("normal", "BEEP x " + args[0]);
159619     }
159620 };
159621
159622 });
159623 define('ripple/platform/cordova/2.0.0/bridge/contacts', function (require, exports, module) {
159624 /*
159625  *  Copyright 2011 Research In Motion Limited.
159626  *
159627  * Licensed under the Apache License, Version 2.0 (the "License");
159628  * you may not use this file except in compliance with the License.
159629  * You may obtain a copy of the License at
159630  *
159631  * http://www.apache.org/licenses/LICENSE-2.0
159632  *
159633  * Unless required by applicable law or agreed to in writing, software
159634  * distributed under the License is distributed on an "AS IS" BASIS,
159635  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
159636  * See the License for the specific language governing permissions and
159637  * limitations under the License.
159638  */
159639 var db = require('ripple/db'),
159640     utils = require('ripple/utils'),
159641     _self;
159642
159643 function _default() {
159644     return [{
159645         "name": {formatted: "Brent Lintner"},
159646         "displayName": "Brent Lintner",
159647         "emails": [{type: "work", value: "brent@tinyhippos.com", pref: false}]
159648     }, {
159649         "name": {formatted: "PJ Lowe"},
159650         "displayName": "PJ Lowe",
159651         "emails": [{type: "work", value: "pj@tinyhippos.com", pref: false}]
159652     }, {
159653         "name": {formatted: "Dan Silivestru"},
159654         "displayName": "Dan Silivestru",
159655         "emails": [{type: "work", value: "dan@tinyhippos.com", pref: false}]
159656     }, {
159657         "name": {formatted: "Gord Tanner"},
159658         "displayName": "Gord Tanner",
159659         "emails": [{type: "work", value: "gord@tinyhippos.com", pref: true}]
159660     }, {
159661         "name": {formatted: "Mark McArdle"},
159662         "displayName": "Mark McArdle",
159663         "emails": [{type: "work", value: "mark@tinyhippos.com", pref: false}]
159664     }].map(function (obj) {
159665         obj.id = Math.uuid(undefined, 16);
159666         return navigator.contacts.create(obj);
159667     });
159668 }
159669
159670 function _get() {
159671     return db.retrieveObject("cordova-contacts") || _default();
159672 }
159673
159674 function _save(contacts) {
159675     db.saveObject("cordova-contacts", contacts);
159676 }
159677
159678 function _filtered(compare, options) {
159679     // this could be done a lot better..
159680     var found = false;
159681     if (!options.filter || options.filter === "") {
159682         found = true;
159683     } else if (typeof compare === "string" &&
159684               compare.match(new RegExp(".*" + options.filter + ".*", "i"))) {
159685         found = true;
159686     } else if (typeof compare === "object" || compare instanceof Array) {
159687         utils.forEach(compare, function (value) {
159688             if (!found) {
159689                 found = _filtered(value, options);
159690             }
159691         });
159692     }
159693     return found;
159694 }
159695
159696 _self = {
159697     search: function (success, error, args) {
159698         var fields = args[0],
159699             options = args[1],
159700             foundContacts = [],
159701             tempContact = navigator.contacts.create(),
159702             contacts = _get();
159703
159704         options = options || {};
159705
159706         // handle special case of ["*"] to return all fields
159707         if (fields.length === 1 && fields[0] === "*") {
159708             fields = utils.map(tempContact, function (v, k) {
159709                 return k;
159710             });
159711         }
159712
159713         if (fields.length > 0) {
159714             contacts.forEach(function (contact, index) {
159715                 var newContact = navigator.contacts.create(contact);
159716
159717                 if (options && (!_filtered(contact, options))) {
159718                     return;
159719                 }
159720
159721                 utils.forEach(newContact, function (value, prop) {
159722                     if (typeof newContact[prop] !== "function" && prop !== "id" &&
159723                         !fields.some(function (field) {
159724                             return field === prop;
159725                         })) {
159726                         delete newContact[prop];
159727                     }
159728                 });
159729
159730                 foundContacts.push(newContact);
159731             });
159732         }
159733
159734         // TODO: don't loop over entire db just to slice the array
159735         if (options.multiple === false) {
159736             foundContacts = foundContacts.splice(0, 1);
159737         }
159738         success(foundContacts);
159739     },
159740
159741     save: function (success, error, args) {
159742         var contacts = _get(),
159743             contact = args[0],
159744             index;
159745
159746         if (!contact.id) {
159747             contact.id = Math.uuid(undefined, 16);
159748             contacts.push(contact);
159749         } else {
159750             index = contacts.reduce(function (result, value, index) {
159751                 return value.id === contact.id ? index : result;
159752             }, -1);
159753
159754             if (index >= 0) {
159755                 utils.mixin(contact, contacts[index]);
159756                 contact = contacts[index];
159757             } else {
159758                 contact = null;
159759             }
159760         }
159761
159762         _save(contacts);
159763         if (success) {
159764             success(contact);
159765         }
159766     },
159767
159768     remove: function (success, error, args) {
159769         var contacts = _get(),
159770             id = args[0],
159771             toDelete = contacts.reduce(function (result, current, index) {
159772                 return current.id === id ? index : result;
159773             }, -1);
159774
159775         if (toDelete >= 0) {
159776             contacts.splice(toDelete, 1);
159777             _save(contacts);
159778             if (success) {
159779                 success();
159780             }
159781         } else {
159782             error({code: 3, message: "could not find contact with id (" + id + ")"}); // PENDING_OPERATION_ERROR
159783         }
159784     }
159785 };
159786
159787 module.exports = _self;
159788
159789 });
159790 define('ripple/platform/cordova/2.0.0/bridge/app', function (require, exports, module) {
159791 /*
159792  *  Copyright 2011 Research In Motion Limited.
159793  *
159794  * Licensed under the Apache License, Version 2.0 (the "License");
159795  * you may not use this file except in compliance with the License.
159796  * You may obtain a copy of the License at
159797  *
159798  * http://www.apache.org/licenses/LICENSE-2.0
159799  *
159800  * Unless required by applicable law or agreed to in writing, software
159801  * distributed under the License is distributed on an "AS IS" BASIS,
159802  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
159803  * See the License for the specific language governing permissions and
159804  * limitations under the License.
159805  */
159806 var camera = require('ripple/ui/plugins/camera'),
159807     event = require('ripple/event');
159808
159809 module.exports = {
159810     show: function (success, error, args) {
159811         return success && success();
159812     }
159813 };
159814
159815 });
159816 define('ripple/platform/cordova/2.0.0/bridge/camera', function (require, exports, module) {
159817 /*
159818  *  Copyright 2011 Research In Motion Limited.
159819  *
159820  * Licensed under the Apache License, Version 2.0 (the "License");
159821  * you may not use this file except in compliance with the License.
159822  * You may obtain a copy of the License at
159823  *
159824  * http://www.apache.org/licenses/LICENSE-2.0
159825  *
159826  * Unless required by applicable law or agreed to in writing, software
159827  * distributed under the License is distributed on an "AS IS" BASIS,
159828  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
159829  * See the License for the specific language governing permissions and
159830  * limitations under the License.
159831  */
159832 var camera = require('ripple/ui/plugins/camera'),
159833     event = require('ripple/event');
159834
159835 module.exports = {
159836     takePicture: function (success, error, args) {
159837         event.once("captured-image", function (uri, file) {
159838             success(uri);
159839         });
159840         camera.show();
159841     },
159842     cleanup: function (success, error, args) {
159843         success();
159844     }
159845 };
159846
159847 });
159848 define('ripple/platform/cordova/2.0.0/bridge/network', function (require, exports, module) {
159849 /*
159850  *  Copyright 2011 Research In Motion Limited.
159851  *
159852  * Licensed under the Apache License, Version 2.0 (the "License");
159853  * you may not use this file except in compliance with the License.
159854  * You may obtain a copy of the License at
159855  *
159856  * http://www.apache.org/licenses/LICENSE-2.0
159857  *
159858  * Unless required by applicable law or agreed to in writing, software
159859  * distributed under the License is distributed on an "AS IS" BASIS,
159860  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
159861  * See the License for the specific language governing permissions and
159862  * limitations under the License.
159863  */
159864
159865 var deviceSettings = require('ripple/deviceSettings'),
159866     event = require('ripple/event'),
159867     _success;
159868
159869 event.on("ConnectionChanged", function () {
159870     return _success && _success(deviceSettings.retrieve("NetworkStatus.connectionType"));
159871 });
159872
159873 module.exports = {
159874     getConnectionInfo: function (success, fail, args) {
159875         _success = success;
159876         success(deviceSettings.retrieve("NetworkStatus.connectionType"));
159877     }
159878 };
159879
159880 });
159881 define('ripple/platform/cordova/2.0.0/bridge/compass', function (require, exports, module) {
159882 /*
159883  *  Copyright 2011 Research In Motion Limited.
159884  *
159885  * Licensed under the Apache License, Version 2.0 (the "License");
159886  * you may not use this file except in compliance with the License.
159887  * You may obtain a copy of the License at
159888  *
159889  * http://www.apache.org/licenses/LICENSE-2.0
159890  *
159891  * Unless required by applicable law or agreed to in writing, software
159892  * distributed under the License is distributed on an "AS IS" BASIS,
159893  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
159894  * See the License for the specific language governing permissions and
159895  * limitations under the License.
159896  */
159897 var geo = require('ripple/geo');
159898
159899 module.exports = {
159900     getHeading: function (success, error, args) {
159901         // TODO: build facility to trigger onError() from emulator
159902         // see pivotal item: https://www.pivotaltracker.com/story/show/7040343
159903         success({
159904             magneticHeading: geo.getPositionInfo().heading, 
159905             trueHeading: geo.getPositionInfo().heading, 
159906             headingAccuracy: 100, 
159907             timestamp: new Date().getSeconds()
159908         });
159909     },
159910
159911     stopHeading: function () { 
159912         //do nothing
159913     }
159914 };
159915
159916 });
159917 define('ripple/platform/cordova/2.0.0/bridge/geolocation', function (require, exports, module) {
159918 /*
159919  *  Copyright 2011 Research In Motion Limited.
159920  *
159921  * Licensed under the Apache License, Version 2.0 (the "License");
159922  * you may not use this file except in compliance with the License.
159923  * You may obtain a copy of the License at
159924  *
159925  * http://www.apache.org/licenses/LICENSE-2.0
159926  *
159927  * Unless required by applicable law or agreed to in writing, software
159928  * distributed under the License is distributed on an "AS IS" BASIS,
159929  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
159930  * See the License for the specific language governing permissions and
159931  * limitations under the License.
159932  */
159933 var event = require('ripple/event'),
159934     geo = require('ripple/geo'),
159935     utils = require('ripple/utils'),
159936     PositionError = require('ripple/platform/w3c/1.0/PositionError'),
159937     _watches = {},
159938     _current = {
159939         "latitude": 43.465187,
159940         "longitude": -80.522372,
159941         "altitude": 100,
159942         "accuracy": 150,
159943         "altitudeAccuracy": 80,
159944         "heading": 0,
159945         "velocity": 0,
159946     },
159947     _error;
159948
159949 function _getCurrentPosition(win, fail) {
159950     if (geo.timeout) {
159951         if (fail) {
159952             var positionError = new PositionError();
159953
159954             positionError.code = PositionError.TIMEOUT;
159955             positionError.message = "postion timed out";
159956             fail(positionError);
159957         }
159958     }
159959     else {
159960         win(geo.getPositionInfo());
159961     }
159962 }
159963
159964 event.on("PositionInfoUpdatedEvent", function (pi) {
159965     _current.latitude = pi.latitude;
159966     _current.longitude = pi.longitude;
159967     _current.altitude = pi.altitude;
159968     _current.accuracy = pi.accuracy;
159969     _current.altitudeAccuracy = pi.altitudeAccuracy;
159970     _current.heading = pi.heading;
159971     _current.velocity = pi.speed;
159972
159973     utils.forEach(_watches, function (watch) {
159974         try {
159975             _getCurrentPosition(watch.win, watch.fail);
159976         } catch (e) {
159977             console.log(e);
159978         }
159979     });
159980 });
159981
159982 module.exports = {
159983     getLocation: function (success, error, args) {
159984         _getCurrentPosition(success, error);
159985     },
159986
159987     addWatch: function (success, error, args) {
159988         _watches[args[0]] = {
159989             win: success,
159990             fail: error
159991         };
159992         _getCurrentPosition(success, error);
159993     },
159994
159995     clearWatch: function (id) {
159996         delete _watches[id];
159997     }
159998 };
159999
160000 });
160001 define('ripple/platform/cordova/2.0.0/bridge/console', function (require, exports, module) {
160002 /*
160003  *  Copyright 2011 Research In Motion Limited.
160004  *
160005  * Licensed under the Apache License, Version 2.0 (the "License");
160006  * you may not use this file except in compliance with the License.
160007  * You may obtain a copy of the License at
160008  *
160009  * http://www.apache.org/licenses/LICENSE-2.0
160010  *
160011  * Unless required by applicable law or agreed to in writing, software
160012  * distributed under the License is distributed on an "AS IS" BASIS,
160013  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
160014  * See the License for the specific language governing permissions and
160015  * limitations under the License.
160016  */
160017
160018 module.exports = {
160019     log: function (win, fail, args) {
160020         console.log(args[0]);
160021     }
160022 };
160023
160024 });
160025 define('ripple/platform/cordova/2.0.0/bridge/accelerometer', function (require, exports, module) {
160026 /*
160027  *  Copyright 2011 Research In Motion Limited.
160028  *
160029  * Licensed under the Apache License, Version 2.0 (the "License");
160030  * you may not use this file except in compliance with the License.
160031  * You may obtain a copy of the License at
160032  *
160033  * http://www.apache.org/licenses/LICENSE-2.0
160034  *
160035  * Unless required by applicable law or agreed to in writing, software
160036  * distributed under the License is distributed on an "AS IS" BASIS,
160037  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
160038  * See the License for the specific language governing permissions and
160039  * limitations under the License.
160040  */
160041 var event = require('ripple/event'),
160042     _success,
160043     _error,
160044     _current = {x: 0, y: 0, z: 0, timestamp: (new Date()).getTime()},
160045     _interval;
160046
160047 event.on("AccelerometerInfoChangedEvent", function (accelerometerInfo) {
160048     _current.x = accelerometerInfo.accelerationIncludingGravity.x;
160049     _current.y = accelerometerInfo.accelerationIncludingGravity.y;
160050     _current.z = accelerometerInfo.accelerationIncludingGravity.z;
160051     _current.timestamp = (new Date()).getTime();
160052 });
160053
160054 module.exports = {
160055     start: function (success, error, args) {
160056         _success = success;
160057         _error = error;
160058         // Possible HACK? update the timestamp of the last data to something current
160059         _interval = window.setInterval(function () {
160060             _current.timestamp = (new Date()).getTime();
160061             _success(_current);
160062         }, 50);
160063     },
160064
160065     stop: function () {
160066         _success = null;
160067         _error = null;
160068         window.clearInterval(_interval);
160069     }
160070 };
160071
160072 });
160073 define('ripple/platform/cordova/2.0.0/bridge/capture', function (require, exports, module) {
160074 /*
160075  *  Copyright 2011 Research In Motion Limited.
160076  *
160077  * Licensed under the Apache License, Version 2.0 (the "License");
160078  * you may not use this file except in compliance with the License.
160079  * You may obtain a copy of the License at
160080  *
160081  * http://www.apache.org/licenses/LICENSE-2.0
160082  *
160083  * Unless required by applicable law or agreed to in writing, software
160084  * distributed under the License is distributed on an "AS IS" BASIS,
160085  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
160086  * See the License for the specific language governing permissions and
160087  * limitations under the License.
160088  */
160089
160090 var camera = require('ripple/ui/plugins/camera'),
160091     event = require('ripple/event');
160092
160093 module.exports = {
160094     captureImage: function (success, error, args) {
160095         event.once("captured-image", function (uri, file) {
160096             file.fullPath = uri;
160097             success([file]);
160098         });
160099         camera.show();
160100     }
160101 };
160102
160103 });
160104 define('ripple/platform/cordova/2.0.0/bridge', function (require, exports, module) {
160105 /*
160106  *  Copyright 2011 Research In Motion Limited.
160107  *
160108  * Licensed under the Apache License, Version 2.0 (the "License");
160109  * you may not use this file except in compliance with the License.
160110  * You may obtain a copy of the License at
160111  *
160112  * http://www.apache.org/licenses/LICENSE-2.0
160113  *
160114  * Unless required by applicable law or agreed to in writing, software
160115  * distributed under the License is distributed on an "AS IS" BASIS,
160116  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
160117  * See the License for the specific language governing permissions and
160118  * limitations under the License.
160119  */
160120 var _prompt = require('ripple/ui/plugins/exec-dialog');
160121
160122 module.exports = {
160123     exec: function (success, fail, service, action, args) {
160124         var emulator = {
160125             "App": require('ripple/platform/cordova/2.0.0/bridge/app'),
160126             "Accelerometer": require('ripple/platform/cordova/2.0.0/bridge/accelerometer'),
160127             "Compass": require('ripple/platform/cordova/2.0.0/bridge/compass'),
160128             "Camera": require('ripple/platform/cordova/2.0.0/bridge/camera'),
160129             "Capture": require('ripple/platform/cordova/2.0.0/bridge/capture'),
160130             "Contacts": require('ripple/platform/cordova/2.0.0/bridge/contacts'),
160131             "Debug Console": require('ripple/platform/cordova/2.0.0/bridge/console'),
160132             "Device": require('ripple/platform/cordova/2.0.0/bridge/device'),
160133             "File": require('ripple/platform/cordova/2.0.0/bridge/file'),
160134             "Geolocation": require('ripple/platform/cordova/2.0.0/bridge/geolocation'),
160135             "Media": require('ripple/platform/cordova/2.0.0/bridge/media'),
160136             "Network Status": require('ripple/platform/cordova/2.0.0/bridge/network'),
160137             "NetworkStatus": require('ripple/platform/cordova/2.0.0/bridge/network'),
160138             "Notification": require('ripple/platform/cordova/2.0.0/bridge/notification')
160139         };
160140
160141         try {
160142             emulator[service][action](success, fail, args);
160143         }
160144         catch (e) {
160145             console.log("missing exec:" + service + "." + action);
160146             console.log(args);
160147             console.log(e);
160148             console.log(e.stack);
160149             //TODO: this should really not log the above lines, but they are very nice for development right now
160150             _prompt.show(service, action, success, fail);
160151         }
160152     }
160153 };
160154
160155 });
160156 define('ripple/platform/cordova/2.0.0/MediaError', function (require, exports, module) {
160157 /*
160158  *  Copyright 2011 Research In Motion Limited.
160159  *
160160  * Licensed under the Apache License, Version 2.0 (the "License");
160161  * you may not use this file except in compliance with the License.
160162  * You may obtain a copy of the License at
160163  *
160164  * http://www.apache.org/licenses/LICENSE-2.0
160165  *
160166  * Unless required by applicable law or agreed to in writing, software
160167  * distributed under the License is distributed on an "AS IS" BASIS,
160168  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
160169  * See the License for the specific language governing permissions and
160170  * limitations under the License.
160171  */
160172 var MediaError = function (code, msg) {
160173     this.code = (code !== undefined ? code : null);
160174     this.message = msg || "";
160175 };
160176
160177 MediaError.MEDIA_ERR_NONE_ACTIVE    = 0;
160178 MediaError.MEDIA_ERR_ABORTED        = 1;
160179 MediaError.MEDIA_ERR_NETWORK        = 2;
160180 MediaError.MEDIA_ERR_DECODE         = 3;
160181 MediaError.MEDIA_ERR_NONE_SUPPORTED = 4;
160182
160183 module.exports = MediaError;
160184
160185 });
160186 define('ripple/accelerometer', function (require, exports, module) {
160187 /*
160188  *  Copyright 2011 Research In Motion Limited.
160189  *
160190  * Licensed under the Apache License, Version 2.0 (the "License");
160191  * you may not use this file except in compliance with the License.
160192  * You may obtain a copy of the License at
160193  *
160194  * http://www.apache.org/licenses/LICENSE-2.0
160195  *
160196  * Unless required by applicable law or agreed to in writing, software
160197  * distributed under the License is distributed on an "AS IS" BASIS,
160198  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
160199  * See the License for the specific language governing permissions and
160200  * limitations under the License.
160201  */
160202 var _self,
160203     utils = require('ripple/utils'),
160204     exception = require('ripple/exception'),
160205     event = require('ripple/event'),
160206     Rotation = require('ripple/platform/w3c/1.0/Rotation'),
160207     Acceleration = require('ripple/platform/w3c/1.0/Acceleration'),
160208     _motion = {
160209         acceleration: new Acceleration(0, 0, 0),
160210         accelerationIncludingGravity: new Acceleration(0, 0, -9.81),
160211         rotationRate: new Rotation(0, 0, 0),
160212         orientation: new Rotation(0, 0, 0),
160213         interval: 60000,
160214         timestamp: new Date().getTime()
160215     };
160216
160217 function _validateAccelerometerInfo(x, y, z) {
160218     return !(isNaN(x) || isNaN(y) || isNaN(z));
160219 }
160220
160221 _self = {
160222     getInfo: function () {
160223         return utils.copy(_motion);
160224     },
160225
160226     setInfo: function (e) {
160227         var triggerDeviceMotion = false,
160228             triggerDeviceOrientation = false;
160229
160230         if (e.x !== undefined && e.y !== undefined && e.z !== undefined) {
160231             _motion = {
160232                 acceleration: new Acceleration(e.x, e.y, e.z),
160233                 accelerationIncludingGravity: new Acceleration(e.x, e.y, e.z),
160234                 rotationRate: new Rotation(0, 0, 0),
160235                 orientation: new Rotation(e.alpha, e.beta, e.gamma),
160236                 timestamp: new Date().getTime()
160237             };
160238             triggerDeviceMotion = true;
160239             triggerDeviceOrientation = true;
160240         }
160241         else {
160242             _motion = {
160243                 acceleration: new Acceleration(0, 0, 0),
160244                 accelerationIncludingGravity: new Acceleration(0, 0, -9.81),
160245                 rotationRate: new Rotation(0, 0, 0),
160246                 orientation: new Rotation(0, 0, 0),
160247                 timestamp: new Date().getTime()
160248             };
160249         }
160250
160251         if (triggerDeviceMotion) {
160252             event.trigger("DeviceMotionEvent", [_motion]);
160253         }
160254
160255         if (triggerDeviceOrientation) {
160256             event.trigger("DeviceOrientationEvent", [_motion]);
160257         }
160258
160259         event.trigger("AccelerometerInfoChangedEvent", [_motion]);
160260     },
160261
160262     triggerEvent: function() {
160263         event.trigger("DeviceMotionEvent", [_motion]);
160264         event.trigger("DeviceOrientationEvent", [_motion]);
160265         event.trigger("AccelerometerInfoChangedEvent", [_motion]);
160266     },
160267
160268     shake: function (shakeXtimes) {
160269         var id,
160270             count = 1,
160271             stopCount = shakeXtimes || 17,
160272             oldX = _motion.accelerationIncludingGravity.x;
160273
160274         id = setInterval(function () {
160275             var freq = 1,
160276                 amp = 30,
160277                 value = Math.round(amp * Math.sin(freq * count * (180 / Math.PI)) * 100) / 100;
160278
160279             if (count > stopCount) {
160280                 _motion.acceleration.x = oldX;
160281                 _motion.accelerationIncludingGravity.x = oldX;
160282                 event.trigger("AccelerometerInfoChangedEvent", [_motion]);
160283                 clearInterval(id);
160284                 return;
160285             }
160286
160287             _motion.acceleration.x = value;
160288             _motion.accelerationIncludingGravity.x = value;
160289
160290             event.trigger("AccelerometerInfoChangedEvent", [_motion]);
160291
160292             count++;
160293
160294         }, 80);
160295     },
160296
160297     init: function () {
160298         event.on("DeviceMotionEventAddedEvent", function () {
160299             _self.triggerEvent();
160300         });
160301         event.on("DeviceOrientationEventAddedEvent", function () {
160302             _self.triggerEvent();
160303         });
160304     }
160305 };
160306
160307 module.exports = _self;
160308
160309 });
160310 define('ripple/bus', function (require, exports, module) {
160311 /*
160312  *  Copyright 2011 Research In Motion Limited.
160313  *
160314  * Licensed under the Apache License, Version 2.0 (the "License");
160315  * you may not use this file except in compliance with the License.
160316  * You may obtain a copy of the License at
160317  *
160318  * http://www.apache.org/licenses/LICENSE-2.0
160319  *
160320  * Unless required by applicable law or agreed to in writing, software
160321  * distributed under the License is distributed on an "AS IS" BASIS,
160322  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
160323  * See the License for the specific language governing permissions and
160324  * limitations under the License.
160325  */
160326
160327 var _send = document.getElementById("bus-send"),
160328     _receive = document.getElementById("bus-receive"),
160329     _evt = document.createEvent("Events");
160330
160331 _evt.initEvent('bus-init', true, true);
160332 document.dispatchEvent(_evt);
160333
160334 module.exports = {
160335     send: function (msg, data, callback) {
160336         var m = document.createElement("span");
160337         m.dataset.msg = msg;
160338         m.innerHTML = JSON.stringify(data);
160339
160340         if (callback) {
160341             m.dataset.callback = Math.uuid();
160342             this.receive(m.dataset.callback, callback);
160343         }
160344
160345         _send.appendChild(m);
160346     },
160347
160348     receive: function (msg, handler) {
160349         if (!handler) {
160350             return;
160351         }
160352
160353         _receive.addEventListener("DOMNodeInserted", function (evt) {
160354             if (evt.target.dataset.msg === msg) {
160355                 handler(JSON.parse(evt.target.innerHTML));
160356             }
160357         });
160358     },
160359
160360     ajax: function (method, url, data, success, fail) {
160361         this.send("xhr", {
160362             method: method,
160363             url: url,
160364             data: data
160365         }, function (result) {
160366             if (result.code === 200) {
160367                 success(result.data);
160368             }
160369             else {
160370                 fail(result);
160371             }
160372         });
160373     }
160374 };
160375
160376 });
160377 define('ripple/ui', function (require, exports, module) {
160378 /*
160379  *  Copyright 2011 Research In Motion Limited.
160380  *
160381  * Licensed under the Apache License, Version 2.0 (the "License");
160382  * you may not use this file except in compliance with the License.
160383  * You may obtain a copy of the License at
160384  *
160385  * http://www.apache.org/licenses/LICENSE-2.0
160386  *
160387  * Unless required by applicable law or agreed to in writing, software
160388  * distributed under the License is distributed on an "AS IS" BASIS,
160389  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
160390  * See the License for the specific language governing permissions and
160391  * limitations under the License.
160392  */
160393 var _self,
160394     db = require('ripple/db'),
160395     platform = require('ripple/platform'),
160396     constants = require('ripple/constants'),
160397     utils = require('ripple/utils'),
160398     exception = require('ripple/exception'),
160399     event = require('ripple/event'),
160400     themes = require('ripple/ui/themes'),
160401     _applicationStateId,
160402     _applicationState,
160403     _availablePanels,
160404     _applicationStateTmp,
160405     _systemPlugins = [
160406         "options",
160407         "about-dialog",
160408         "settings-dialog",
160409         "exec-dialog",
160410         "firstRunCheck",
160411         "eulaCheck",
160412         "devices",
160413         "goodVibrations",
160414         "panelCollapse",
160415         "platform",
160416         "information",
160417         "layout",
160418         "themeSwitcher",
160419         "settings-menu",
160420         "configWindow",
160421         "HWKeys"
160422         //"launchingHistory"
160423     ],
160424     _overlay = {
160425         getOrCreate: function (id) {
160426             var _container = document.getElementById(constants.COMMON.HTML_CONTAINER),
160427                 _overlays = document.getElementById("overlay-views"),
160428                 _overlay = _overlays.children[id],
160429                 _hide = function (node) {
160430                     node.setAttribute("style", "display: none");
160431                 },
160432                 _show = function (node) {
160433                     node.setAttribute("style", "display: block");
160434                 },
160435                 _trigger = function (callback) {
160436                     if (callback) {
160437                         callback.apply(null, [_overlay]);
160438                     }
160439                 };
160440
160441
160442             if (!_overlay) {
160443                 _overlay = utils.createElement("section", {id: id, "class": "overlay"});
160444                 _overlays.appendChild(_overlay);
160445             }
160446
160447             return {
160448                 hide: function (callback) {
160449                     _hide(_overlay);
160450                     _show(_container);
160451                     _trigger(callback);
160452                 },
160453                 show: function (callback, showContainer) {
160454                     _show(_overlay);
160455                     if (!showContainer) {
160456                         _hide(_container);
160457                     }
160458                     _trigger(callback);
160459                 }
160460             };
160461         }
160462     };
160463
160464 function _addUIPaneItemsToApplicationState(arrayObj, pane) {
160465     utils.forEach(arrayObj, function (domId) {
160466         var collapsed = jQuery("#" + domId + " .info")[0];
160467         collapsed = (collapsed.style && collapsed.style.display === "none") ? true : false;
160468         utils.forEach(_applicationStateTmp, function (obj) {
160469             if (obj.domId === domId) {
160470                 _applicationState.push({
160471                     "domId": domId,
160472                     "collapsed": collapsed,
160473                     "pane": pane,
160474                     "titleName" : obj.titleName,
160475                     "display" : obj.display
160476                 });
160477                 _applicationStateTmp.splice(_applicationStateTmp.indexOf(obj), 1);
160478                 return;
160479             }
160480         }, this);
160481     }, this);
160482
160483     utils.forEach(_applicationStateTmp, function (obj) {
160484         _applicationState.push({
160485             "domId": obj.domId,
160486             "collapsed": obj.collapsed,
160487             "pane": obj.pane,
160488             "titleName" : obj.titleName,
160489             "display" : obj.display
160490         });
160491     });
160492 }
160493
160494 function _currentlyEnabledTheme() {
160495     var qsSet = utils.queryString().theme,
160496         current = db.retrieve("ui-theme") || themes[0];
160497
160498     function matches(something) {
160499         return function (item) {
160500             return something === item;
160501         };
160502     }
160503
160504     if (qsSet && themes.some(matches(qsSet))) {
160505         current = qsSet;
160506         db.save("ui-theme", qsSet);
160507     }
160508
160509     return current;
160510 }
160511
160512 function _insertStyleSheets() {
160513     var uiTheme = db.retrieve("ui-theme") || require('ripple/ui/themes')[0],
160514         extensionURL = jQuery("#extension-url").text(),
160515         uiThemeURL = extensionURL + "themes/" + uiTheme + "/theme.css",
160516         head = document.getElementsByTagName('head')[0];
160517
160518     function stylesheet(src) {
160519         var scriptElement = document.createElement("link");
160520         scriptElement.setAttribute("href", src);
160521         scriptElement.setAttribute("type", "text/css");
160522         scriptElement.setAttribute("rel", "stylesheet");
160523         return scriptElement;
160524     }
160525
160526     head.appendChild(stylesheet(uiThemeURL));
160527 }
160528
160529 function _collapsePannels(side) {
160530     var collapseNode = [],
160531         event = document.createEvent("UIEvent");
160532
160533     collapseNode = side === "left" ? document.getElementsByClassName("left-panel-collapse") : 
160534                                      document.getElementsByClassName("right-panel-collapse");
160535     
160536     if (collapseNode.length > 0) {
160537         event.initEvent("click", true, true);
160538         collapseNode[0].dispatchEvent(event);    
160539     }
160540 }
160541
160542 function _initializeUI() {
160543     _applicationStateId = constants.COMMON.APPLICATION_STATE + platform.current().id;
160544     _applicationState = db.retrieveObject(_applicationStateId) || [];
160545     _insertStyleSheets();
160546
160547     var leftPanelSection = jQuery(".left"),
160548         uiBoxToggleEngaged = false;
160549
160550     //clean up
160551     db.remove("ui-application-state");
160552     utils.forEach(_availablePanels, function (obj) {
160553         var matchingDomId = function (panel) {
160554             return panel.domId === obj.domId;
160555         };
160556         if (!utils.some(_applicationState, matchingDomId)) {
160557             _applicationState.push({
160558                 "domId": obj.domId,
160559                 "collapsed": obj.collapsed,
160560                 "pane": obj.pane,
160561                 "titleName" : obj.titleName,
160562                 "display" : obj.display
160563             });
160564         }
160565     });
160566
160567     utils.forEach(_applicationState, function (obj) {
160568         var node = jQuery("#" + obj.domId),
160569             imgNode = node.find(".ui-box-TitleImage"),
160570             matchingDomId = function (panel) {
160571                 return panel.domId === obj.domId;
160572             };
160573
160574         if (node.length > 0) {
160575             if (!utils.some(_availablePanels, matchingDomId)) {
160576                 node.parent()[0].removeChild(node[0]);
160577             }
160578             else {
160579                 if (obj.display !== false) {
160580                     leftPanelSection.append(node.parent()[0].removeChild(node[0]));
160581                     if (!obj.collapsed) {
160582                         node.find(".info")
160583                             .css({
160584                             "display": "block"
160585                         })
160586                         .end()
160587                         .addClass("ui-box-open");
160588                         imgNode.addClass("ui-box-TitleImageOpen");
160589                     }
160590                 }
160591             }
160592         }
160593     });
160594
160595     db.saveObject(_applicationStateId, _applicationState);
160596
160597     event.on("ApplicationState", function () {
160598         try {
160599             var leftArray = jQuery(".left").sortable('toArray');
160600             _applicationStateTmp = [];
160601             _applicationStateTmp = utils.copy(_applicationState);
160602             _applicationState = [];
160603             _addUIPaneItemsToApplicationState(leftArray, "left");
160604
160605             if (leftArray.length === 0) {
160606                 _collapsePannels("left");
160607             }
160608
160609             db.saveObject(_applicationStateId, _applicationState);
160610         }
160611         catch (e) {
160612             exception.handle(e);
160613         }
160614     });
160615
160616     jQuery(".left").sortable({
160617         handle: ".drag-handle",
160618         revert: true,
160619         placeholder: 'ui-sortable-highlight ui-corner-all',
160620         connectWith: [".left"],
160621         scroll: true,
160622         update: function (uiEvent, ui) {
160623             event.trigger("ApplicationState");
160624         }
160625     });
160626
160627     jQuery(".left").sortable({ axis: 'y' });
160628
160629     jQuery(".collapse-handle").bind("click", function () {
160630         if (!uiBoxToggleEngaged) {
160631
160632             uiBoxToggleEngaged = true;
160633
160634             var jNode = jQuery(this).parentsUntil(".ui-box"),
160635                     pNode = jNode.parent(),
160636                     isOpen = pNode.hasClass("ui-box-open"),
160637                     imgNode = jQuery(this).find(".ui-box-TitleImage");
160638
160639             if (!isOpen) {
160640                 pNode.addClass("ui-box-open");
160641                 imgNode.removeClass("ui-box-TitleImageClosed");
160642                 imgNode.addClass("ui-box-TitleImageOpen");
160643             }
160644
160645             jQuery(this).parent().next().toggle("blind", {}, 300, function () {
160646                 if (isOpen) {
160647                     pNode.removeClass("ui-box-open");
160648                     imgNode.removeClass("ui-box-TitleImageOpen");
160649                     imgNode.addClass("ui-box-TitleImageClosed");
160650                 }
160651                 event.trigger("ApplicationState", [pNode]);
160652                 uiBoxToggleEngaged = false;
160653             });
160654         }
160655     });
160656 }
160657
160658 function _db_upgrade_for_release() {
160659     var version = db.retrieve(constants.RELEASE_VERSION);
160660
160661     // version: 20121115 is the first release version
160662     if (version === null || version === undefined || Number(version) < 20130722) {
160663         db.remove(constants.COMMON.APPLICATION_STATE + "tizen");
160664         db.remove(constants.COMMON.APPLICATION_STATE + "cordova");
160665         db.remove("tizen1-db-application");
160666         db.remove("tizen-db-package");
160667         version = 20130722;
160668         db.save(constants.RELEASE_VERSION, version);
160669     }
160670 }
160671
160672 _self = module.exports = {
160673     initialize: function () {
160674         var plugins = _systemPlugins.concat(platform.current().ui.plugins || []).map(function (name) {
160675                 return require('ripple/ui/plugins/' + name);
160676             }),
160677             boot = jWorkflow.order(_initializeUI);
160678
160679         _db_upgrade_for_release();
160680         _availablePanels = [];
160681
160682         plugins.forEach(function (plugin) {
160683             if (plugin.initialize) {
160684                 boot.andThen(plugin.initialize);
160685             }
160686
160687             if (plugin.panel) {
160688                 _availablePanels.push(plugin.panel);
160689             }
160690         });
160691
160692         boot.start();
160693     },
160694
160695     getSystemPlugins: function () {
160696         return utils.copy(_systemPlugins);
160697     },
160698
160699     register: function (plugin) {
160700         _systemPlugins.push(plugin);
160701     },
160702
160703     registered: function (plugin) {
160704         return _systemPlugins.indexOf(plugin) >= 0;
160705     },
160706
160707     getExtensionURL: function () {
160708         return jQuery("#" + constants.COMMON.EXTENSION_URL_CONTAINER).text();
160709     },
160710
160711     showOverlay: function (id, callback, showContainer) {
160712         _overlay.getOrCreate(id).show(callback, showContainer);
160713     },
160714
160715     hideOverlay: function (id, callback) {
160716         _overlay.getOrCreate(id).hide(callback);
160717     }
160718 };
160719
160720 });
160721 define('ripple/xhr/helpers', function (require, exports, module) {
160722 /*
160723  *  Copyright 2011 Research In Motion Limited.
160724  *
160725  * Licensed under the Apache License, Version 2.0 (the "License");
160726  * you may not use this file except in compliance with the License.
160727  * You may obtain a copy of the License at
160728  *
160729  * http://www.apache.org/licenses/LICENSE-2.0
160730  *
160731  * Unless required by applicable law or agreed to in writing, software
160732  * distributed under the License is distributed on an "AS IS" BASIS,
160733  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
160734  * See the License for the specific language governing permissions and
160735  * limitations under the License.
160736  */
160737 var constants = require('ripple/constants'),
160738     db = require('ripple/db');
160739
160740 module.exports = {
160741     isLocalRequest: function (url) {
160742         return (!!(url.match(constants.REGEX.LOCAL_URI)) || !url.match(constants.REGEX.EXTERNAL_URI)) || 
160743                 !!(location.host && url.match(location.host));
160744     },
160745
160746     proxyEnabled: function () {
160747         var isDisabled = db.retrieve(constants.XHR.PROXY_DISABLED_BUTTON);
160748         return !isDisabled || isDisabled === "false" ? true : false;
160749     }
160750 };
160751
160752 });
160753 define('ripple/xhr/base', function (require, exports, module) {
160754 /*
160755  *  Copyright 2011 Research In Motion Limited.
160756  *
160757  * Licensed under the Apache License, Version 2.0 (the "License");
160758  * you may not use this file except in compliance with the License.
160759  * You may obtain a copy of the License at
160760  *
160761  * http://www.apache.org/licenses/LICENSE-2.0
160762  *
160763  * Unless required by applicable law or agreed to in writing, software
160764  * distributed under the License is distributed on an "AS IS" BASIS,
160765  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
160766  * See the License for the specific language governing permissions and
160767  * limitations under the License.
160768  */
160769 var XHR = window.XMLHttpRequest;
160770
160771 function _handle(object, key) {
160772     return function () {
160773         return object[key].apply(object, Array.prototype.slice.call(arguments));
160774     };
160775 }
160776
160777 function _getter(object, key) {
160778     return function () {
160779         return object[key];
160780     };
160781 }
160782
160783 function _setter(object, key) {
160784     return function (val) {
160785         object[key] = val;
160786     };
160787 }
160788
160789 function _writeable(obj) {
160790     var newObj = {},
160791         key;
160792
160793     // need prototypes
160794     for (key in obj) {
160795         //HACK: don't even know what to say bout this, resonseBlob can go fly a kite: related to this issue:
160796         //https://github.com/blackberry/Ripple-UI/issues/394
160797         if (key !== "responseBlob" && typeof obj[key] === "function") {
160798             newObj[key] = _handle(obj, key);
160799         } else {
160800             newObj.__defineGetter__(key, _getter(obj, key));
160801             newObj.__defineSetter__(key, _setter(obj, key));
160802         }
160803     }
160804
160805     return newObj;
160806 }
160807
160808 function _XMLHttpRequest() {
160809     var Xhr = require('ripple/emulatorBridge').xhr() || XHR;
160810     return _writeable(new Xhr());
160811 }
160812
160813 module.exports = _XMLHttpRequest;
160814
160815 });
160816 define('ripple/xhr/jsonp', function (require, exports, module) {
160817 /*
160818  *  Copyright 2011 Research In Motion Limited.
160819  *
160820  * Licensed under the Apache License, Version 2.0 (the "License");
160821  * you may not use this file except in compliance with the License.
160822  * You may obtain a copy of the License at
160823  *
160824  * http://www.apache.org/licenses/LICENSE-2.0
160825  *
160826  * Unless required by applicable law or agreed to in writing, software
160827  * distributed under the License is distributed on an "AS IS" BASIS,
160828  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
160829  * See the License for the specific language governing permissions and
160830  * limitations under the License.
160831  */
160832 var constants = require('ripple/constants'),
160833     exception = require('ripple/exception'),
160834     utils = require('ripple/utils'),
160835     helpers = require('ripple/xhr/helpers'),
160836     _console = require('ripple/console'),
160837     XHR = require('ripple/xhr/base');
160838
160839 function _XMLHttpRequest() {
160840     var xhr = new XHR(),
160841         origMethods = {
160842             setRequestHeader: xhr.setRequestHeader,
160843             getResponseHeader: xhr.getResponseHeader,
160844             getAllResponseHeaders: xhr.getAllResponseHeaders,
160845             open: xhr.open,
160846             send: xhr.send,
160847             abort: xhr.abort
160848         },
160849         _jxhr = new window.jXHR(),
160850         _sendFlag = false,
160851         _headers = [],
160852         _errorFlag = false,
160853         _url,
160854         _async;
160855
160856     function _localURI() {
160857         return _url && helpers.isLocalRequest(_url);
160858     }
160859
160860     function _set(prop, value) {
160861         xhr.__defineGetter__(prop, function () {
160862             return value;
160863         });
160864     }
160865
160866     function _reset() {
160867         _set("response", "");
160868         _set("responseText", "");
160869         _set("responseXML", null);
160870     }
160871
160872     xhr.setRequestHeader = function (header, value) {
160873         if (_localURI()) {
160874             origMethods.setRequestHeader.apply(xhr, Array.prototype.slice.call(arguments));
160875         } else {
160876             _console.error("XMLHttpRequest :: setRequestHeader does not work with JSONP.");
160877         }
160878     };
160879
160880     xhr.getResponseHeader = function (header) {
160881         return _localURI() ?
160882                 origMethods.getAllResponseHeaders.apply(xhr, [header]) :
160883                 _headers[header] || null;
160884     };
160885
160886     xhr.getAllResponseHeaders = function () {
160887         return _localURI() ?
160888                 origMethods.getAllResponseHeaders.apply(xhr) :
160889                 utils.reduce(_headers, function (str, value, key) {
160890                     return str + key + ": " + value + '\n';
160891                 }, "").replace(/\n$/, '');
160892     };
160893
160894     xhr.open = function (method, url, async) {
160895         _url = url;
160896         _async = async !== false ? true : false;
160897
160898         if (_localURI()) {
160899             origMethods.open.apply(xhr, Array.prototype.slice.call(arguments));
160900         } else {
160901             _reset();
160902             method = method.toUpperCase();
160903
160904             if (method === "POST") {
160905                 //HACK: Switch the method to get for now to simulate post
160906                 method = "GET";
160907             }
160908
160909             if (method !== "GET") {
160910                 exception.raise(exception.types.MethodNotImplemented, "Method: " + method + " not supported!");
160911             }
160912
160913             _jxhr.onreadystatechange = function (data) {
160914                 var response;
160915
160916                 try {
160917                     _set("readyState", _jxhr.readyState);
160918
160919                     if (xhr.readyState === xhr.DONE) {
160920                         _sendFlag = false;
160921                         _set("status", data.status);
160922                         _set("statusText", data.statusText);
160923                         _headers = data.headers;
160924
160925                         if (data.responseXML) {
160926                             response = new DOMParser().parseFromString(unescape(data.responseXML), "text/xml");
160927                             _set("responseXML", response);
160928                         } else {
160929                             response = unescape(data.responseText);
160930                             _set("responseText", response);
160931                         }
160932
160933                         _set("response", response);
160934                     }
160935
160936                     if (typeof xhr.onreadystatechange === "function") {
160937                         xhr.onreadystatechange.apply(xhr);
160938                     }
160939                 } catch (e) {
160940                     exception.handle(e);
160941                 }
160942             };
160943
160944             _jxhr.onerror = xhr.onerror;
160945             _jxhr.open(method, constants.API_URL + "/jsonp_xhr_proxy?callback=?&tinyhippos_apikey=ABC&tinyhippos_rurl=" + escape(url));
160946         }
160947     };
160948
160949     xhr.send = function (data) {
160950         if (_localURI()) {
160951             origMethods.send(data);
160952             return;
160953         }
160954
160955         if (!_async) {
160956             exception.raise(exception.types.MethodNotImplemented, "Synchronous not supported.");
160957         }
160958
160959         if (xhr.readyState !== xhr.OPENED || _sendFlag === true) {
160960             exception.raise(exception.types.InvalidState, "Ready state should be OPENED (1)");
160961         }
160962
160963         _errorFlag = false;
160964         _sendFlag = true;
160965         data = null;
160966
160967         _jxhr.send();
160968     };
160969
160970     xhr.abort = function () {
160971         if (_localURI()) {
160972             origMethods.abort();
160973             return;
160974         }
160975
160976         _reset();
160977
160978         _errorFlag = true;
160979
160980         if (xhr.readyState === xhr.UNSENT ||
160981                 (xhr.readyState === xhr.OPENED && _sendFlag === false) ||
160982                 xhr.readyState === xhr.DONE) {
160983             _set("readyState", xhr.UNSENT);
160984         } else {
160985             _set("readyState", xhr.DONE);
160986             _sendFlag = false;
160987
160988             if (typeof xhr.onreadystatechange === "function") {
160989                 xhr.onreadystatechange.apply(xhr);
160990             }
160991         }
160992
160993         _jxhr.onreadystatechange = null;
160994
160995         if (xhr.onabort) {
160996             xhr.onabort.apply(xhr, arguments);
160997         }
160998     };
160999
161000     return xhr;
161001 }
161002
161003 module.exports = _XMLHttpRequest;
161004
161005 });
161006 define('ripple/xhr/cors', function (require, exports, module) {
161007 /*
161008  *  Copyright 2011 Research In Motion Limited.
161009  *
161010  * Licensed under the Apache License, Version 2.0 (the "License");
161011  * you may not use this file except in compliance with the License.
161012  * You may obtain a copy of the License at
161013  *
161014  * http://www.apache.org/licenses/LICENSE-2.0
161015  *
161016  * Unless required by applicable law or agreed to in writing, software
161017  * distributed under the License is distributed on an "AS IS" BASIS,
161018  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
161019  * See the License for the specific language governing permissions and
161020  * limitations under the License.
161021  */
161022 var helpers = require('ripple/xhr/helpers'),
161023     constants = require('ripple/constants'),
161024     XHR = require('ripple/xhr/base');
161025
161026 function _XMLHttpRequest() {
161027     var xhr = new XHR(),
161028         origMethods = {
161029             setRequestHeader: xhr.setRequestHeader,
161030             open: xhr.open
161031         };
161032
161033     xhr.setRequestHeader = function (header, value) {
161034         // This is done to get around jQuery 1.3.2 setting a header that it shouldn't
161035         if (header && header.toUpperCase() !== "X-REQUESTED-WITH") {
161036             origMethods.setRequestHeader.apply(xhr, Array.prototype.slice.call(arguments));
161037         }
161038     };
161039
161040     xhr.open = function (method, url, async, user, password) {
161041         if (!helpers.isLocalRequest(url)) {
161042             url = constants.API_URL + "/xhr_proxy?tinyhippos_apikey=ABC&tinyhippos_rurl=" + escape(url);
161043         }
161044
161045         origMethods.open.apply(xhr, Array.prototype.slice.call(arguments));
161046     };
161047
161048     return xhr;
161049 }
161050
161051 module.exports = _XMLHttpRequest;
161052
161053 });
161054 define('ripple/omgwtf', function (require, exports, module) {
161055 /*
161056  *  Copyright 2011 Research In Motion Limited.
161057  *
161058  * Licensed under the Apache License, Version 2.0 (the "License");
161059  * you may not use this file except in compliance with the License.
161060  * You may obtain a copy of the License at
161061  *
161062  * http://www.apache.org/licenses/LICENSE-2.0
161063  *
161064  * Unless required by applicable law or agreed to in writing, software
161065  * distributed under the License is distributed on an "AS IS" BASIS,
161066  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
161067  * See the License for the specific language governing permissions and
161068  * limitations under the License.
161069  */
161070 var event = require('ripple/event'),
161071     db = require('ripple/db'),
161072     _loaded = false,
161073     _self;
161074
161075 function _delay(action) {
161076     window.setTimeout(function () {
161077         if (!_loaded) {
161078             if (jQuery(".first-run-window").is(":visible")) {
161079                 _delay(action);
161080             } else {
161081                 action();
161082             }
161083         }
161084     }, 10000);
161085 }
161086
161087 function _hide() {
161088     jQuery(".error-window").css({display: 'none'});
161089     jQuery(".error-dialog").css({display: 'none'});
161090 }
161091
161092 function _show() {
161093     jQuery(".error-window").css({display: 'block'});
161094
161095     jQuery(".error-dialog").css({
161096         display: 'block',
161097         left: (jQuery(document).width() / 2) - 277 + "px"
161098     });
161099
161100     jQuery("#error-wait").click(function () {
161101         _hide();
161102         _delay(_show);
161103     });
161104
161105     jQuery("#error-panic").click(function () {
161106         db.removeAll(null, function () {
161107             window.tinyHipposReload = true;
161108             localStorage.clear();
161109             location.reload();
161110         });
161111     });
161112 }
161113
161114 _delay(_show);
161115
161116 _self = {
161117     initialize: function (previous, baton) {
161118         event.on("TinyHipposLoaded", function () {
161119             _loaded = true;
161120         });
161121     },
161122     show: _show,
161123     hide: _hide
161124 };
161125
161126 module.exports = _self;
161127
161128 });
161129 define('ripple', function (require, exports, module) {
161130 /*
161131  *  Copyright 2011 Research In Motion Limited.
161132  *
161133  * Licensed under the Apache License, Version 2.0 (the "License");
161134  * you may not use this file except in compliance with the License.
161135  * You may obtain a copy of the License at
161136  *
161137  * http://www.apache.org/licenses/LICENSE-2.0
161138  *
161139  * Unless required by applicable law or agreed to in writing, software
161140  * distributed under the License is distributed on an "AS IS" BASIS,
161141  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
161142  * See the License for the specific language governing permissions and
161143  * limitations under the License.
161144  */
161145 var omgwtf = require('ripple/omgwtf'),
161146     db = require('ripple/db'),
161147     xhr = require('ripple/xhr'),
161148     geo = require('ripple/geo'),
161149     fileSystem = require('ripple/fileSystem'),
161150     fs = require('ripple/dbfs'),
161151     platform = require('ripple/platform'),
161152     emulatorBridge = require('ripple/emulatorBridge'),
161153     devices = require('ripple/devices'),
161154     widgetConfig = require('ripple/widgetConfig'),
161155     deviceSettings = require('ripple/deviceSettings'),
161156     sensorSettings = require('ripple/sensorSettings'),
161157     ui = require('ripple/ui'),
161158     appcache = require('ripple/appcache'),
161159     _self = {
161160         boot: function (booted) {
161161             // techdebt (event registration timing)
161162             // require('ripple/platform/webworks.core/2.0.0/fsCache');
161163
161164             window.addEventListener("keydown", function (event) {
161165                 var hasMetaOrAltPressed = (event.metaKey || event.ctrlKey),
161166                     key = parseInt(event.keyCode, 10);
161167
161168                 if (key === 37 && hasMetaOrAltPressed) { // cmd/ctrl + left arrow
161169                     event.preventDefault();
161170                     emulatorBridge.window().history.back();
161171                 }
161172
161173                 if (key === 39 && hasMetaOrAltPressed) { // cmd/ctrl + right arrow
161174                     event.preventDefault();
161175                     emulatorBridge.window().history.forward();
161176                 }
161177
161178                 if (key === 82 && hasMetaOrAltPressed) { // cmd/ctrl + r
161179                     event.preventDefault();
161180                     window.tinyHipposReload = true;
161181                     emulatorBridge.window().location.reload();
161182                 }
161183
161184                 if (key === 116) { // F5
161185                     event.preventDefault();
161186                     window.tinyHipposReload = true;
161187                     emulatorBridge.window().location.reload();
161188                 }
161189             });
161190
161191             window.onbeforeunload = function () { 
161192                 if (!window.tinyHipposReload) {
161193                     return "Web Simulator";
161194                 }
161195             };
161196
161197             jWorkflow.order(omgwtf.initialize, omgwtf)
161198                  .andThen(appcache.initialize, appcache)
161199                  .andThen(db.initialize, db)
161200                  .andThen(xhr.initialize, xhr)
161201                  .andThen(geo.initialize, geo)
161202                  .andThen(fileSystem.initialize, fileSystem)
161203                  .andThen(fs.initialize, fs)
161204                  .andThen(platform.initialize, platform)
161205                  .andThen(devices.initialize, devices)
161206                  .andThen(widgetConfig.initialize, widgetConfig)
161207                  .andThen(deviceSettings.initialize, deviceSettings)
161208                  .andThen(ui.initialize, ui)
161209                  .start(booted);
161210         }
161211     };
161212
161213 module.exports = _self;
161214
161215 });
161216 require('ripple/ui').register('omnibar');require('ripple/bootstrap').bootstrap();